├── .dockerignore ├── .editorconfig ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .travis.yml ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── bin └── server.js ├── layers └── mathjax-node-layer │ ├── .gitignore │ └── nodejs │ ├── package-lock.json │ └── package.json ├── logo.svg ├── package.json ├── src ├── app.js └── render │ └── index.js ├── templates └── root.yml ├── test ├── app.js └── render │ └── index.js └── yarn.lock /.dockerignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /layers/mathjax-node-layer 3 | /templates 4 | /template.yml 5 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | ; This file is for unifying the coding style for different editors and IDEs. 2 | ; More information at http://editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 4 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | 15 | [*.yml] 16 | indent_size = 2 17 | 18 | [Makefile] 19 | indent_style = tab 20 | tab_width = 8 21 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: math-api CI 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | node: ['12', '14', '16'] 15 | steps: 16 | - name: Checkout source code 17 | uses: actions/checkout@v2 18 | - name: Setup Node ${{ matrix.node }} environment 19 | uses: actions/setup-node@v2 20 | with: 21 | node-version: ${{ matrix.node }} 22 | - name: Install dependencies 23 | run: | 24 | npm install yarn 25 | yarn install 26 | - name: Run tests 27 | run: yarn run test 28 | 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /template.yml 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | stages: 2 | - name: test 3 | - name: deploy 4 | if: repo = chialab/math-api AND branch = master AND type IN (push, api) 5 | 6 | jobs: 7 | include: 8 | - stage: 'test' 9 | sudo: false 10 | language: 'node_js' 11 | node_js: '8.10' 12 | install: 13 | - 'yarn install' 14 | script: 15 | - 'yarn run test' 16 | - stage: 'test' 17 | sudo: false 18 | language: 'python' 19 | python: '3.6' 20 | install: 21 | - 'pip install awscli' 22 | script: 23 | - 'make validate' 24 | 25 | - stage: 'deploy' 26 | sudo: 'required' 27 | language: 'python' 28 | python: '3.6' 29 | services: 30 | - 'docker' 31 | install: 32 | - 'pip install awscli' 33 | - 'docker image pull lambci/lambda:build-nodejs8.10' 34 | script: 'skip' 35 | before_deploy: 36 | - 'make layer' 37 | deploy: 38 | # Deploy templates in `s3://thebucket/org/repo/branch-name`. 39 | skip_cleanup: true 40 | provider: 'script' 41 | script: 'make package S3_BUCKET=$S3_BUCKET S3_PREFIX="$TRAVIS_REPO_SLUG/$TRAVIS_BRANCH"' 42 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | ARG NODE_VERSION=8.10 2 | FROM node:${NODE_VERSION} 3 | 4 | ARG NODE_ENV=production 5 | ENV PORT=3000 NODE_ENV=${NODE_ENV} 6 | 7 | WORKDIR /usr/src/app 8 | COPY package.json yarn.lock /usr/src/app/ 9 | RUN yarn install 10 | COPY . /usr/src/app 11 | 12 | EXPOSE 3000 13 | 14 | CMD [ "yarn", "start" ] 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Chialab 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | ALL: deploy 2 | .PHONY: layers deploy package validate 3 | 4 | PROJECT := Math 5 | ENVIRONMENT ?= Test 6 | STACK_NAME ?= MathApi$(ENVIRONMENT) 7 | PACKAGE_TEMPLATE := template.yml 8 | PACKAGE_BUCKET ?= chialab-cloudformation-templates 9 | PACKAGE_PREFIX ?= chialab/math-api/$(shell git symbolic-ref --short HEAD) 10 | 11 | PACKAGE_PROFILE ?= chialabsrl 12 | DEPLOY_PROFILE ?= chialab 13 | 14 | layers: 15 | docker run --rm \ 16 | -v $(PWD)/layers/mathjax-node-layer/nodejs:/var/task \ 17 | -e NODE_ENV=production \ 18 | lambci/lambda:build-nodejs8.10 \ 19 | npm $(if $(wildcard layers/mathjax-node-layer/nodejs/node_modules/*), rebuild, install) 20 | 21 | ensure-layer-%: 22 | @if ! [[ -d 'layers/$*/nodejs/node_modules' ]]; then \ 23 | printf '\033[31mDependencies for layer \033[1m%s\033[22m are not installed, run \033[1m%s\033[22m first!\033[0m\n' $* 'make layers'; \ 24 | exit 1; \ 25 | fi 26 | 27 | deploy: package 28 | aws cloudformation deploy \ 29 | --template-file $(PACKAGE_TEMPLATE) \ 30 | --stack-name $(STACK_NAME) \ 31 | --tags Project=$(PROJECT) Environment=$(ENVIRONMENT) \ 32 | --capabilities CAPABILITY_IAM \ 33 | --profile $(DEPLOY_PROFILE) 34 | 35 | package: ensure-layer-mathjax-node-layer validate 36 | aws cloudformation package \ 37 | --template-file templates/root.yml \ 38 | --output-template-file $(PACKAGE_TEMPLATE) \ 39 | --s3-bucket $(PACKAGE_BUCKET) \ 40 | --s3-prefix $(PACKAGE_PREFIX) \ 41 | --profile $(PACKAGE_PROFILE) 42 | aws s3 cp $(PACKAGE_TEMPLATE) s3://$(PACKAGE_BUCKET)/$(PACKAGE_PREFIX)/ --profile $(PACKAGE_PROFILE) 43 | @echo "https://$(PACKAGE_BUCKET).s3.amazonaws.com/$(PACKAGE_PREFIX)/$(PACKAGE_TEMPLATE)" 44 | 45 | validate: 46 | aws cloudformation validate-template \ 47 | --template-body file://templates/root.yml \ 48 | --profile $(PACKAGE_PROFILE) 49 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | Math API logo 4 | 5 |

6 | 7 |

8 | Math API • Render LaTeX and MathML formulas as SVG or PNG. 9 |

10 | 11 | --- 12 | 13 | A REST API to do fancy things with formulas, like rendering LaTeX or MathML to 14 | SVG or PNG on the server side using [MathJax for Node](https://github.com/mathjax/MathJax-node), 15 | while leveraging expensive computations on the client. 16 | 17 | ## As a Serverless application 18 | 19 | You can deploy this repository as a serverless application using an AWS CloudFormation 20 | Template to create an AWS API Gateway that invokes Lambda functions to serve requests. 21 | 22 | > [**Launch this stack on AWS**](https://console.aws.amazon.com/cloudformation/home#/stacks/new?stackName=MathApi&templateURL=https://chialab-cloudformation-templates.s3-eu-west-1.amazonaws.com/chialab/math-api/master/template.yml) 23 | 24 | ## As a Docker image 25 | 26 | You can pull and run a Docker container to deploy the API on your local machine, 27 | server, Kubernetes cluster, whatever! 28 | 29 | To start the container (it will bind on ): 30 | 31 | ```sh 32 | docker run --name math-api -d -p 3000:3000 chialab/math-api 33 | ``` 34 | 35 | ## Endpoints 36 | 37 | - [`GET /render`](#get-render) 38 | - [`POST /render`](#post-render) 39 | 40 | ### `GET /render` 41 | 42 | > An endpoint to render LaTeX and MathML formulas to SVG or PNG. 43 | 44 | **Query parameters**: 45 | 46 | - `input` (**required**): the format of math in input. 47 | **Valid values**: `latex`, `mathml` 48 | - `inline` (_optional_): when `input` is `latex`, optionally enable "inline" mode. 49 | **Valid values**: `0`, `1` 50 | - `source` (**required**): the math to be rendered. 51 | **Valid values**: _string, depends on the input type_ 52 | - `output` (**required**): the output format. 53 | **Valid values**: `mathml`, `png`, `svg` 54 | - `width`, `height` (_optional_): when `output` is `png`, specify the dimensions of the image to return. 55 | **Valid values**: _positive integers_ 56 | 57 | **Examples**: 58 | 59 | ```http 60 | GET /render?input=latex&output=svg&source=x^2 HTTP/1.1 61 | Accept: image/svg+xml 62 | ``` 63 | 64 | ```http 65 | GET /render?input=latex&inline=1&output=png&source=x^2&width=512 HTTP/1.1 66 | Accept: image/png 67 | ``` 68 | 69 | ### `POST /render` 70 | 71 | > An endpoint to render LaTeX and MathML formulas to SVG or PNG. 72 | 73 | **Request body (JSON)**: 74 | 75 | - `input` (**required**): the format of math in input. 76 | **Valid values**: `latex`, `mathml` 77 | - `inline` (_optional_): when `input` is `latex`, optionally enable "inline" mode. 78 | **Valid values**: _boolean_ 79 | - `source` (**required**): the math to be rendered. 80 | **Valid values**: _string, depends on the input type_ 81 | - `output` (**required**): the output format. 82 | **Valid values**: `mathml`, `png`, `svg` 83 | - `width`, `height` (_optional_): when `output` is `png`, specify the dimensions of the image to return. 84 | **Valid values**: _positive integers_ 85 | 86 | **Examples**: 87 | 88 | ```http 89 | POST /render 90 | Accept: image/svg+xml 91 | Content-Type: application/json 92 | 93 | { 94 | "input": "latex", 95 | "output": "svg", 96 | "source": "e^{i \\pi} + 1 = 0" 97 | } 98 | ``` 99 | 100 | ```http 101 | POST /render 102 | Accept: image/png 103 | Content-Type: application/json 104 | 105 | { 106 | "input": "latex", 107 | "inline": true, 108 | "output": "png", 109 | "source": "e^{i \\pi} + 1 = 0", 110 | "width": 512 111 | } 112 | ``` 113 | 114 | ## Development 115 | 116 | _All the following instructions assume you have at least [NodeJS](https://nodejs.org/) and [Yarn](https://yarnpkg.com/) installed._ 117 | 118 | **Start the application locally**: 119 | > `yarn start` 120 | 121 | **Run unit tests**: 122 | > `yarn run test` 123 | 124 | **Start a simulated AWS API Gateway** (_provided you have AWS SAM Local and Docker installed_): 125 | > `yarn run api-gateway` 126 | 127 | **Validate CloudFormation template** (_provided you have AWS CLI installed_) 128 | > `make validate` 129 | 130 | **Package CloudFormation template** (_provided you have AWS CLI and Docker installed_) 131 | > `make layers` (_this is needed only the first time, then when updating MathJax version_) 132 | > `make package` 133 | 134 | **Deploy CloudFormation template** (_provided you have AWS CLI and Docker installed_) 135 | > `make deploy` 136 | > `make deploy ENVIRONMENT=Production` 137 | 138 | --- 139 | 140 | ## License 141 | 142 | Math API is released under the [MIT](https://github.com/chialab/math-api/blob/master/LICENSE) license. 143 | -------------------------------------------------------------------------------- /bin/server.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const port = process.env.PORT || 3000; 4 | const app = require('../src/app.js'); 5 | 6 | app.listen(port, () => console.log(`Server running at http://localhost:${port}/`)); 7 | -------------------------------------------------------------------------------- /layers/mathjax-node-layer/.gitignore: -------------------------------------------------------------------------------- 1 | /nodejs/node_modules 2 | -------------------------------------------------------------------------------- /layers/mathjax-node-layer/nodejs/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "requires": true, 3 | "lockfileVersion": 1, 4 | "dependencies": { 5 | "abab": { 6 | "version": "2.0.0", 7 | "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", 8 | "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" 9 | }, 10 | "acorn": { 11 | "version": "5.7.3", 12 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", 13 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==" 14 | }, 15 | "acorn-globals": { 16 | "version": "4.3.2", 17 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.2.tgz", 18 | "integrity": "sha512-BbzvZhVtZP+Bs1J1HcwrQe8ycfO0wStkSGxuul3He3GkHOIZ6eTqOkPuw9IP1X3+IkOo4wiJmwkobzXYz4wewQ==", 19 | "requires": { 20 | "acorn": "^6.0.1", 21 | "acorn-walk": "^6.0.1" 22 | }, 23 | "dependencies": { 24 | "acorn": { 25 | "version": "6.4.1", 26 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", 27 | "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==" 28 | } 29 | } 30 | }, 31 | "acorn-walk": { 32 | "version": "6.1.1", 33 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", 34 | "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==" 35 | }, 36 | "ajv": { 37 | "version": "6.10.0", 38 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 39 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 40 | "requires": { 41 | "fast-deep-equal": "^2.0.1", 42 | "fast-json-stable-stringify": "^2.0.0", 43 | "json-schema-traverse": "^0.4.1", 44 | "uri-js": "^4.2.2" 45 | } 46 | }, 47 | "ansi-regex": { 48 | "version": "2.1.1", 49 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 50 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 51 | }, 52 | "array-equal": { 53 | "version": "1.0.0", 54 | "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", 55 | "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=" 56 | }, 57 | "asn1": { 58 | "version": "0.2.4", 59 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 60 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 61 | "requires": { 62 | "safer-buffer": "~2.1.0" 63 | } 64 | }, 65 | "assert-plus": { 66 | "version": "1.0.0", 67 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 68 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 69 | }, 70 | "async-limiter": { 71 | "version": "1.0.0", 72 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 73 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 74 | }, 75 | "asynckit": { 76 | "version": "0.4.0", 77 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 78 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 79 | }, 80 | "aws-sign2": { 81 | "version": "0.7.0", 82 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 83 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 84 | }, 85 | "aws4": { 86 | "version": "1.8.0", 87 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 88 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 89 | }, 90 | "bcrypt-pbkdf": { 91 | "version": "1.0.2", 92 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 93 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 94 | "requires": { 95 | "tweetnacl": "^0.14.3" 96 | } 97 | }, 98 | "browser-process-hrtime": { 99 | "version": "0.1.3", 100 | "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", 101 | "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" 102 | }, 103 | "buffer-from": { 104 | "version": "1.1.1", 105 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 106 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 107 | }, 108 | "camelcase": { 109 | "version": "3.0.0", 110 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 111 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" 112 | }, 113 | "caseless": { 114 | "version": "0.12.0", 115 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 116 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 117 | }, 118 | "cliui": { 119 | "version": "3.2.0", 120 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 121 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 122 | "requires": { 123 | "string-width": "^1.0.1", 124 | "strip-ansi": "^3.0.1", 125 | "wrap-ansi": "^2.0.0" 126 | } 127 | }, 128 | "code-point-at": { 129 | "version": "1.1.0", 130 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 131 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 132 | }, 133 | "combined-stream": { 134 | "version": "1.0.7", 135 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 136 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 137 | "requires": { 138 | "delayed-stream": "~1.0.0" 139 | } 140 | }, 141 | "concat-stream": { 142 | "version": "1.6.2", 143 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 144 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 145 | "requires": { 146 | "buffer-from": "^1.0.0", 147 | "inherits": "^2.0.3", 148 | "readable-stream": "^2.2.2", 149 | "typedarray": "^0.0.6" 150 | } 151 | }, 152 | "core-util-is": { 153 | "version": "1.0.2", 154 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 155 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 156 | }, 157 | "cssom": { 158 | "version": "0.3.6", 159 | "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", 160 | "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==" 161 | }, 162 | "cssstyle": { 163 | "version": "1.2.2", 164 | "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", 165 | "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", 166 | "requires": { 167 | "cssom": "0.3.x" 168 | } 169 | }, 170 | "dashdash": { 171 | "version": "1.14.1", 172 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 173 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 174 | "requires": { 175 | "assert-plus": "^1.0.0" 176 | } 177 | }, 178 | "data-urls": { 179 | "version": "1.1.0", 180 | "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", 181 | "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", 182 | "requires": { 183 | "abab": "^2.0.0", 184 | "whatwg-mimetype": "^2.2.0", 185 | "whatwg-url": "^7.0.0" 186 | }, 187 | "dependencies": { 188 | "whatwg-url": { 189 | "version": "7.0.0", 190 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", 191 | "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", 192 | "requires": { 193 | "lodash.sortby": "^4.7.0", 194 | "tr46": "^1.0.1", 195 | "webidl-conversions": "^4.0.2" 196 | } 197 | } 198 | } 199 | }, 200 | "debug": { 201 | "version": "2.6.9", 202 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 203 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 204 | "requires": { 205 | "ms": "2.0.0" 206 | } 207 | }, 208 | "decamelize": { 209 | "version": "1.2.0", 210 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 211 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 212 | }, 213 | "deep-is": { 214 | "version": "0.1.3", 215 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 216 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 217 | }, 218 | "delayed-stream": { 219 | "version": "1.0.0", 220 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 221 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 222 | }, 223 | "domexception": { 224 | "version": "1.0.1", 225 | "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", 226 | "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", 227 | "requires": { 228 | "webidl-conversions": "^4.0.2" 229 | } 230 | }, 231 | "ecc-jsbn": { 232 | "version": "0.1.2", 233 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 234 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 235 | "requires": { 236 | "jsbn": "~0.1.0", 237 | "safer-buffer": "^2.1.0" 238 | } 239 | }, 240 | "error-ex": { 241 | "version": "1.3.2", 242 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 243 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 244 | "requires": { 245 | "is-arrayish": "^0.2.1" 246 | } 247 | }, 248 | "es6-promise": { 249 | "version": "4.2.6", 250 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", 251 | "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" 252 | }, 253 | "escodegen": { 254 | "version": "1.11.1", 255 | "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", 256 | "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", 257 | "requires": { 258 | "esprima": "^3.1.3", 259 | "estraverse": "^4.2.0", 260 | "esutils": "^2.0.2", 261 | "optionator": "^0.8.1", 262 | "source-map": "~0.6.1" 263 | } 264 | }, 265 | "esprima": { 266 | "version": "3.1.3", 267 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", 268 | "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" 269 | }, 270 | "estraverse": { 271 | "version": "4.2.0", 272 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 273 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 274 | }, 275 | "esutils": { 276 | "version": "2.0.2", 277 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 278 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 279 | }, 280 | "extend": { 281 | "version": "3.0.2", 282 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 283 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 284 | }, 285 | "extract-zip": { 286 | "version": "1.6.7", 287 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", 288 | "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", 289 | "requires": { 290 | "concat-stream": "1.6.2", 291 | "debug": "2.6.9", 292 | "mkdirp": "0.5.1", 293 | "yauzl": "2.4.1" 294 | } 295 | }, 296 | "extsprintf": { 297 | "version": "1.3.0", 298 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 299 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 300 | }, 301 | "fast-deep-equal": { 302 | "version": "2.0.1", 303 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 304 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 305 | }, 306 | "fast-json-stable-stringify": { 307 | "version": "2.0.0", 308 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 309 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 310 | }, 311 | "fast-levenshtein": { 312 | "version": "2.0.6", 313 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 314 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 315 | }, 316 | "fd-slicer": { 317 | "version": "1.0.1", 318 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 319 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 320 | "requires": { 321 | "pend": "~1.2.0" 322 | } 323 | }, 324 | "file-url": { 325 | "version": "2.0.2", 326 | "resolved": "https://registry.npmjs.org/file-url/-/file-url-2.0.2.tgz", 327 | "integrity": "sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4=" 328 | }, 329 | "find-up": { 330 | "version": "1.1.2", 331 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 332 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 333 | "requires": { 334 | "path-exists": "^2.0.0", 335 | "pinkie-promise": "^2.0.0" 336 | } 337 | }, 338 | "forever-agent": { 339 | "version": "0.6.1", 340 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 341 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 342 | }, 343 | "form-data": { 344 | "version": "2.3.3", 345 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 346 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 347 | "requires": { 348 | "asynckit": "^0.4.0", 349 | "combined-stream": "^1.0.6", 350 | "mime-types": "^2.1.12" 351 | } 352 | }, 353 | "fs-extra": { 354 | "version": "1.0.0", 355 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", 356 | "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", 357 | "requires": { 358 | "graceful-fs": "^4.1.2", 359 | "jsonfile": "^2.1.0", 360 | "klaw": "^1.0.0" 361 | } 362 | }, 363 | "get-caller-file": { 364 | "version": "1.0.3", 365 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 366 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" 367 | }, 368 | "getpass": { 369 | "version": "0.1.7", 370 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 371 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 372 | "requires": { 373 | "assert-plus": "^1.0.0" 374 | } 375 | }, 376 | "graceful-fs": { 377 | "version": "4.1.15", 378 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 379 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 380 | }, 381 | "har-schema": { 382 | "version": "2.0.0", 383 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 384 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 385 | }, 386 | "har-validator": { 387 | "version": "5.1.3", 388 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 389 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 390 | "requires": { 391 | "ajv": "^6.5.5", 392 | "har-schema": "^2.0.0" 393 | } 394 | }, 395 | "hasha": { 396 | "version": "2.2.0", 397 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", 398 | "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", 399 | "requires": { 400 | "is-stream": "^1.0.1", 401 | "pinkie-promise": "^2.0.0" 402 | } 403 | }, 404 | "hosted-git-info": { 405 | "version": "2.7.1", 406 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 407 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" 408 | }, 409 | "html-encoding-sniffer": { 410 | "version": "1.0.2", 411 | "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", 412 | "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", 413 | "requires": { 414 | "whatwg-encoding": "^1.0.1" 415 | } 416 | }, 417 | "http-signature": { 418 | "version": "1.2.0", 419 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 420 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 421 | "requires": { 422 | "assert-plus": "^1.0.0", 423 | "jsprim": "^1.2.2", 424 | "sshpk": "^1.7.0" 425 | } 426 | }, 427 | "iconv-lite": { 428 | "version": "0.4.24", 429 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 430 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 431 | "requires": { 432 | "safer-buffer": ">= 2.1.2 < 3" 433 | } 434 | }, 435 | "inherits": { 436 | "version": "2.0.3", 437 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 438 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 439 | }, 440 | "invert-kv": { 441 | "version": "1.0.0", 442 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 443 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 444 | }, 445 | "is-arrayish": { 446 | "version": "0.2.1", 447 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 448 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 449 | }, 450 | "is-fullwidth-code-point": { 451 | "version": "2.0.0", 452 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 453 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 454 | }, 455 | "is-stream": { 456 | "version": "1.1.0", 457 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 458 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 459 | }, 460 | "is-typedarray": { 461 | "version": "1.0.0", 462 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 463 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 464 | }, 465 | "is-utf8": { 466 | "version": "0.2.1", 467 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 468 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 469 | }, 470 | "isarray": { 471 | "version": "1.0.0", 472 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 473 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 474 | }, 475 | "isexe": { 476 | "version": "2.0.0", 477 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 478 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 479 | }, 480 | "isstream": { 481 | "version": "0.1.2", 482 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 483 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 484 | }, 485 | "jsbn": { 486 | "version": "0.1.1", 487 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 488 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 489 | }, 490 | "jsdom": { 491 | "version": "11.12.0", 492 | "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", 493 | "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", 494 | "requires": { 495 | "abab": "^2.0.0", 496 | "acorn": "^5.5.3", 497 | "acorn-globals": "^4.1.0", 498 | "array-equal": "^1.0.0", 499 | "cssom": ">= 0.3.2 < 0.4.0", 500 | "cssstyle": "^1.0.0", 501 | "data-urls": "^1.0.0", 502 | "domexception": "^1.0.1", 503 | "escodegen": "^1.9.1", 504 | "html-encoding-sniffer": "^1.0.2", 505 | "left-pad": "^1.3.0", 506 | "nwsapi": "^2.0.7", 507 | "parse5": "4.0.0", 508 | "pn": "^1.1.0", 509 | "request": "^2.87.0", 510 | "request-promise-native": "^1.0.5", 511 | "sax": "^1.2.4", 512 | "symbol-tree": "^3.2.2", 513 | "tough-cookie": "^2.3.4", 514 | "w3c-hr-time": "^1.0.1", 515 | "webidl-conversions": "^4.0.2", 516 | "whatwg-encoding": "^1.0.3", 517 | "whatwg-mimetype": "^2.1.0", 518 | "whatwg-url": "^6.4.1", 519 | "ws": "^5.2.0", 520 | "xml-name-validator": "^3.0.0" 521 | } 522 | }, 523 | "json-schema": { 524 | "version": "0.2.3", 525 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 526 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 527 | }, 528 | "json-schema-traverse": { 529 | "version": "0.4.1", 530 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 531 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 532 | }, 533 | "json-stringify-safe": { 534 | "version": "5.0.1", 535 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 536 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 537 | }, 538 | "jsonfile": { 539 | "version": "2.4.0", 540 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 541 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 542 | "requires": { 543 | "graceful-fs": "^4.1.6" 544 | } 545 | }, 546 | "jsprim": { 547 | "version": "1.4.1", 548 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 549 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 550 | "requires": { 551 | "assert-plus": "1.0.0", 552 | "extsprintf": "1.3.0", 553 | "json-schema": "0.2.3", 554 | "verror": "1.10.0" 555 | } 556 | }, 557 | "kew": { 558 | "version": "0.7.0", 559 | "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", 560 | "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" 561 | }, 562 | "klaw": { 563 | "version": "1.3.1", 564 | "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", 565 | "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", 566 | "requires": { 567 | "graceful-fs": "^4.1.9" 568 | } 569 | }, 570 | "lcid": { 571 | "version": "1.0.0", 572 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 573 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 574 | "requires": { 575 | "invert-kv": "^1.0.0" 576 | } 577 | }, 578 | "left-pad": { 579 | "version": "1.3.0", 580 | "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", 581 | "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" 582 | }, 583 | "levn": { 584 | "version": "0.3.0", 585 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 586 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 587 | "requires": { 588 | "prelude-ls": "~1.1.2", 589 | "type-check": "~0.3.2" 590 | } 591 | }, 592 | "load-json-file": { 593 | "version": "1.1.0", 594 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 595 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 596 | "requires": { 597 | "graceful-fs": "^4.1.2", 598 | "parse-json": "^2.2.0", 599 | "pify": "^2.0.0", 600 | "pinkie-promise": "^2.0.0", 601 | "strip-bom": "^2.0.0" 602 | } 603 | }, 604 | "lodash": { 605 | "version": "4.17.15", 606 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 607 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 608 | }, 609 | "lodash.sortby": { 610 | "version": "4.7.0", 611 | "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", 612 | "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" 613 | }, 614 | "mathjax": { 615 | "version": "2.7.5", 616 | "resolved": "https://registry.npmjs.org/mathjax/-/mathjax-2.7.5.tgz", 617 | "integrity": "sha512-OzsJNitEHAJB3y4IIlPCAvS0yoXwYjlo2Y4kmm9KQzyIBZt2d8yKRalby3uTRNN4fZQiGL2iMXjpdP1u2Rq2DQ==" 618 | }, 619 | "mathjax-node": { 620 | "version": "2.1.1", 621 | "resolved": "https://registry.npmjs.org/mathjax-node/-/mathjax-node-2.1.1.tgz", 622 | "integrity": "sha1-JcgPSU91QEGP/Pqcx1bf0hUCAb0=", 623 | "requires": { 624 | "is-fullwidth-code-point": "^2.0.0", 625 | "jsdom": "^11.0.0", 626 | "mathjax": "^2.7.2" 627 | } 628 | }, 629 | "mime-db": { 630 | "version": "1.40.0", 631 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 632 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 633 | }, 634 | "mime-types": { 635 | "version": "2.1.24", 636 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 637 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 638 | "requires": { 639 | "mime-db": "1.40.0" 640 | } 641 | }, 642 | "minimist": { 643 | "version": "0.0.8", 644 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 645 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 646 | }, 647 | "mkdirp": { 648 | "version": "0.5.1", 649 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 650 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 651 | "requires": { 652 | "minimist": "0.0.8" 653 | } 654 | }, 655 | "ms": { 656 | "version": "2.0.0", 657 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 658 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 659 | }, 660 | "normalize-package-data": { 661 | "version": "2.5.0", 662 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 663 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 664 | "requires": { 665 | "hosted-git-info": "^2.1.4", 666 | "resolve": "^1.10.0", 667 | "semver": "2 || 3 || 4 || 5", 668 | "validate-npm-package-license": "^3.0.1" 669 | } 670 | }, 671 | "number-is-nan": { 672 | "version": "1.0.1", 673 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 674 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 675 | }, 676 | "nwsapi": { 677 | "version": "2.1.4", 678 | "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.4.tgz", 679 | "integrity": "sha512-iGfd9Y6SFdTNldEy2L0GUhcarIutFmk+MPWIn9dmj8NMIup03G08uUF2KGbbmv/Ux4RT0VZJoP/sVbWA6d/VIw==" 680 | }, 681 | "oauth-sign": { 682 | "version": "0.9.0", 683 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 684 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 685 | }, 686 | "optionator": { 687 | "version": "0.8.2", 688 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 689 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 690 | "requires": { 691 | "deep-is": "~0.1.3", 692 | "fast-levenshtein": "~2.0.4", 693 | "levn": "~0.3.0", 694 | "prelude-ls": "~1.1.2", 695 | "type-check": "~0.3.2", 696 | "wordwrap": "~1.0.0" 697 | } 698 | }, 699 | "os-locale": { 700 | "version": "1.4.0", 701 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 702 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 703 | "requires": { 704 | "lcid": "^1.0.0" 705 | } 706 | }, 707 | "parse-json": { 708 | "version": "2.2.0", 709 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 710 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 711 | "requires": { 712 | "error-ex": "^1.2.0" 713 | } 714 | }, 715 | "parse5": { 716 | "version": "4.0.0", 717 | "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", 718 | "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" 719 | }, 720 | "path-exists": { 721 | "version": "2.1.0", 722 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 723 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 724 | "requires": { 725 | "pinkie-promise": "^2.0.0" 726 | } 727 | }, 728 | "path-parse": { 729 | "version": "1.0.6", 730 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 731 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 732 | }, 733 | "path-type": { 734 | "version": "1.1.0", 735 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 736 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 737 | "requires": { 738 | "graceful-fs": "^4.1.2", 739 | "pify": "^2.0.0", 740 | "pinkie-promise": "^2.0.0" 741 | } 742 | }, 743 | "pend": { 744 | "version": "1.2.0", 745 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 746 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 747 | }, 748 | "performance-now": { 749 | "version": "2.1.0", 750 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 751 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 752 | }, 753 | "phantomjs-prebuilt": { 754 | "version": "2.1.16", 755 | "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", 756 | "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", 757 | "requires": { 758 | "es6-promise": "^4.0.3", 759 | "extract-zip": "^1.6.5", 760 | "fs-extra": "^1.0.0", 761 | "hasha": "^2.2.0", 762 | "kew": "^0.7.0", 763 | "progress": "^1.1.8", 764 | "request": "^2.81.0", 765 | "request-progress": "^2.0.1", 766 | "which": "^1.2.10" 767 | } 768 | }, 769 | "pify": { 770 | "version": "2.3.0", 771 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 772 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 773 | }, 774 | "pinkie": { 775 | "version": "2.0.4", 776 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 777 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 778 | }, 779 | "pinkie-promise": { 780 | "version": "2.0.1", 781 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 782 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 783 | "requires": { 784 | "pinkie": "^2.0.0" 785 | } 786 | }, 787 | "pn": { 788 | "version": "1.1.0", 789 | "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", 790 | "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" 791 | }, 792 | "prelude-ls": { 793 | "version": "1.1.2", 794 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 795 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 796 | }, 797 | "process-nextick-args": { 798 | "version": "2.0.0", 799 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 800 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 801 | }, 802 | "progress": { 803 | "version": "1.1.8", 804 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 805 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" 806 | }, 807 | "psl": { 808 | "version": "1.1.31", 809 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", 810 | "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" 811 | }, 812 | "punycode": { 813 | "version": "2.1.1", 814 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 815 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 816 | }, 817 | "qs": { 818 | "version": "6.5.2", 819 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 820 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 821 | }, 822 | "read-pkg": { 823 | "version": "1.1.0", 824 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 825 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 826 | "requires": { 827 | "load-json-file": "^1.0.0", 828 | "normalize-package-data": "^2.3.2", 829 | "path-type": "^1.0.0" 830 | } 831 | }, 832 | "read-pkg-up": { 833 | "version": "1.0.1", 834 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 835 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 836 | "requires": { 837 | "find-up": "^1.0.0", 838 | "read-pkg": "^1.0.0" 839 | } 840 | }, 841 | "readable-stream": { 842 | "version": "2.3.6", 843 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 844 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 845 | "requires": { 846 | "core-util-is": "~1.0.0", 847 | "inherits": "~2.0.3", 848 | "isarray": "~1.0.0", 849 | "process-nextick-args": "~2.0.0", 850 | "safe-buffer": "~5.1.1", 851 | "string_decoder": "~1.1.1", 852 | "util-deprecate": "~1.0.1" 853 | } 854 | }, 855 | "request": { 856 | "version": "2.88.0", 857 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 858 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 859 | "requires": { 860 | "aws-sign2": "~0.7.0", 861 | "aws4": "^1.8.0", 862 | "caseless": "~0.12.0", 863 | "combined-stream": "~1.0.6", 864 | "extend": "~3.0.2", 865 | "forever-agent": "~0.6.1", 866 | "form-data": "~2.3.2", 867 | "har-validator": "~5.1.0", 868 | "http-signature": "~1.2.0", 869 | "is-typedarray": "~1.0.0", 870 | "isstream": "~0.1.2", 871 | "json-stringify-safe": "~5.0.1", 872 | "mime-types": "~2.1.19", 873 | "oauth-sign": "~0.9.0", 874 | "performance-now": "^2.1.0", 875 | "qs": "~6.5.2", 876 | "safe-buffer": "^5.1.2", 877 | "tough-cookie": "~2.4.3", 878 | "tunnel-agent": "^0.6.0", 879 | "uuid": "^3.3.2" 880 | }, 881 | "dependencies": { 882 | "punycode": { 883 | "version": "1.4.1", 884 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 885 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 886 | }, 887 | "tough-cookie": { 888 | "version": "2.4.3", 889 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 890 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 891 | "requires": { 892 | "psl": "^1.1.24", 893 | "punycode": "^1.4.1" 894 | } 895 | } 896 | } 897 | }, 898 | "request-progress": { 899 | "version": "2.0.1", 900 | "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", 901 | "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", 902 | "requires": { 903 | "throttleit": "^1.0.0" 904 | } 905 | }, 906 | "request-promise-core": { 907 | "version": "1.1.2", 908 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", 909 | "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", 910 | "requires": { 911 | "lodash": "^4.17.11" 912 | } 913 | }, 914 | "request-promise-native": { 915 | "version": "1.0.7", 916 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", 917 | "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", 918 | "requires": { 919 | "request-promise-core": "1.1.2", 920 | "stealthy-require": "^1.1.1", 921 | "tough-cookie": "^2.3.3" 922 | } 923 | }, 924 | "require-directory": { 925 | "version": "2.1.1", 926 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 927 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 928 | }, 929 | "require-main-filename": { 930 | "version": "1.0.1", 931 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 932 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 933 | }, 934 | "resolve": { 935 | "version": "1.10.1", 936 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", 937 | "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", 938 | "requires": { 939 | "path-parse": "^1.0.6" 940 | } 941 | }, 942 | "safe-buffer": { 943 | "version": "5.1.2", 944 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 945 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 946 | }, 947 | "safer-buffer": { 948 | "version": "2.1.2", 949 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 950 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 951 | }, 952 | "sax": { 953 | "version": "1.2.4", 954 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 955 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 956 | }, 957 | "semver": { 958 | "version": "5.7.0", 959 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 960 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 961 | }, 962 | "set-blocking": { 963 | "version": "2.0.0", 964 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 965 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 966 | }, 967 | "source-map": { 968 | "version": "0.6.1", 969 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 970 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 971 | "optional": true 972 | }, 973 | "spdx-correct": { 974 | "version": "3.1.0", 975 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 976 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 977 | "requires": { 978 | "spdx-expression-parse": "^3.0.0", 979 | "spdx-license-ids": "^3.0.0" 980 | } 981 | }, 982 | "spdx-exceptions": { 983 | "version": "2.2.0", 984 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 985 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 986 | }, 987 | "spdx-expression-parse": { 988 | "version": "3.0.0", 989 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 990 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 991 | "requires": { 992 | "spdx-exceptions": "^2.1.0", 993 | "spdx-license-ids": "^3.0.0" 994 | } 995 | }, 996 | "spdx-license-ids": { 997 | "version": "3.0.4", 998 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", 999 | "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" 1000 | }, 1001 | "sshpk": { 1002 | "version": "1.16.1", 1003 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1004 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1005 | "requires": { 1006 | "asn1": "~0.2.3", 1007 | "assert-plus": "^1.0.0", 1008 | "bcrypt-pbkdf": "^1.0.0", 1009 | "dashdash": "^1.12.0", 1010 | "ecc-jsbn": "~0.1.1", 1011 | "getpass": "^0.1.1", 1012 | "jsbn": "~0.1.0", 1013 | "safer-buffer": "^2.0.2", 1014 | "tweetnacl": "~0.14.0" 1015 | } 1016 | }, 1017 | "stealthy-require": { 1018 | "version": "1.1.1", 1019 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 1020 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 1021 | }, 1022 | "string-width": { 1023 | "version": "1.0.2", 1024 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1025 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1026 | "requires": { 1027 | "code-point-at": "^1.0.0", 1028 | "is-fullwidth-code-point": "^1.0.0", 1029 | "strip-ansi": "^3.0.0" 1030 | }, 1031 | "dependencies": { 1032 | "is-fullwidth-code-point": { 1033 | "version": "1.0.0", 1034 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1035 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1036 | "requires": { 1037 | "number-is-nan": "^1.0.0" 1038 | } 1039 | } 1040 | } 1041 | }, 1042 | "string_decoder": { 1043 | "version": "1.1.1", 1044 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1045 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1046 | "requires": { 1047 | "safe-buffer": "~5.1.0" 1048 | } 1049 | }, 1050 | "strip-ansi": { 1051 | "version": "3.0.1", 1052 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1053 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1054 | "requires": { 1055 | "ansi-regex": "^2.0.0" 1056 | } 1057 | }, 1058 | "strip-bom": { 1059 | "version": "2.0.0", 1060 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 1061 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 1062 | "requires": { 1063 | "is-utf8": "^0.2.0" 1064 | } 1065 | }, 1066 | "svg2png": { 1067 | "version": "4.1.1", 1068 | "resolved": "https://registry.npmjs.org/svg2png/-/svg2png-4.1.1.tgz", 1069 | "integrity": "sha1-a54DmKpBh3i2Q24Sei+38A1JnCg=", 1070 | "requires": { 1071 | "file-url": "^2.0.0", 1072 | "phantomjs-prebuilt": "^2.1.14", 1073 | "pn": "^1.0.0", 1074 | "yargs": "^6.5.0" 1075 | } 1076 | }, 1077 | "symbol-tree": { 1078 | "version": "3.2.2", 1079 | "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", 1080 | "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" 1081 | }, 1082 | "throttleit": { 1083 | "version": "1.0.0", 1084 | "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", 1085 | "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" 1086 | }, 1087 | "tough-cookie": { 1088 | "version": "2.5.0", 1089 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", 1090 | "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", 1091 | "requires": { 1092 | "psl": "^1.1.28", 1093 | "punycode": "^2.1.1" 1094 | } 1095 | }, 1096 | "tr46": { 1097 | "version": "1.0.1", 1098 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", 1099 | "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", 1100 | "requires": { 1101 | "punycode": "^2.1.0" 1102 | } 1103 | }, 1104 | "tunnel-agent": { 1105 | "version": "0.6.0", 1106 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1107 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1108 | "requires": { 1109 | "safe-buffer": "^5.0.1" 1110 | } 1111 | }, 1112 | "tweetnacl": { 1113 | "version": "0.14.5", 1114 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1115 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1116 | }, 1117 | "type-check": { 1118 | "version": "0.3.2", 1119 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1120 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1121 | "requires": { 1122 | "prelude-ls": "~1.1.2" 1123 | } 1124 | }, 1125 | "typedarray": { 1126 | "version": "0.0.6", 1127 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1128 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1129 | }, 1130 | "uri-js": { 1131 | "version": "4.2.2", 1132 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1133 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1134 | "requires": { 1135 | "punycode": "^2.1.0" 1136 | } 1137 | }, 1138 | "util-deprecate": { 1139 | "version": "1.0.2", 1140 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1141 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1142 | }, 1143 | "uuid": { 1144 | "version": "3.3.2", 1145 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1146 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1147 | }, 1148 | "validate-npm-package-license": { 1149 | "version": "3.0.4", 1150 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 1151 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 1152 | "requires": { 1153 | "spdx-correct": "^3.0.0", 1154 | "spdx-expression-parse": "^3.0.0" 1155 | } 1156 | }, 1157 | "verror": { 1158 | "version": "1.10.0", 1159 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1160 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1161 | "requires": { 1162 | "assert-plus": "^1.0.0", 1163 | "core-util-is": "1.0.2", 1164 | "extsprintf": "^1.2.0" 1165 | } 1166 | }, 1167 | "w3c-hr-time": { 1168 | "version": "1.0.1", 1169 | "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", 1170 | "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", 1171 | "requires": { 1172 | "browser-process-hrtime": "^0.1.2" 1173 | } 1174 | }, 1175 | "webidl-conversions": { 1176 | "version": "4.0.2", 1177 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", 1178 | "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" 1179 | }, 1180 | "whatwg-encoding": { 1181 | "version": "1.0.5", 1182 | "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", 1183 | "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", 1184 | "requires": { 1185 | "iconv-lite": "0.4.24" 1186 | } 1187 | }, 1188 | "whatwg-mimetype": { 1189 | "version": "2.3.0", 1190 | "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", 1191 | "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" 1192 | }, 1193 | "whatwg-url": { 1194 | "version": "6.5.0", 1195 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", 1196 | "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", 1197 | "requires": { 1198 | "lodash.sortby": "^4.7.0", 1199 | "tr46": "^1.0.1", 1200 | "webidl-conversions": "^4.0.2" 1201 | } 1202 | }, 1203 | "which": { 1204 | "version": "1.3.1", 1205 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1206 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1207 | "requires": { 1208 | "isexe": "^2.0.0" 1209 | } 1210 | }, 1211 | "which-module": { 1212 | "version": "1.0.0", 1213 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", 1214 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" 1215 | }, 1216 | "wordwrap": { 1217 | "version": "1.0.0", 1218 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1219 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 1220 | }, 1221 | "wrap-ansi": { 1222 | "version": "2.1.0", 1223 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1224 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 1225 | "requires": { 1226 | "string-width": "^1.0.1", 1227 | "strip-ansi": "^3.0.1" 1228 | } 1229 | }, 1230 | "ws": { 1231 | "version": "5.2.2", 1232 | "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", 1233 | "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", 1234 | "requires": { 1235 | "async-limiter": "~1.0.0" 1236 | } 1237 | }, 1238 | "xml-name-validator": { 1239 | "version": "3.0.0", 1240 | "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", 1241 | "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" 1242 | }, 1243 | "y18n": { 1244 | "version": "3.2.1", 1245 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 1246 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 1247 | }, 1248 | "yargs": { 1249 | "version": "6.6.0", 1250 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", 1251 | "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", 1252 | "requires": { 1253 | "camelcase": "^3.0.0", 1254 | "cliui": "^3.2.0", 1255 | "decamelize": "^1.1.1", 1256 | "get-caller-file": "^1.0.1", 1257 | "os-locale": "^1.4.0", 1258 | "read-pkg-up": "^1.0.1", 1259 | "require-directory": "^2.1.1", 1260 | "require-main-filename": "^1.0.1", 1261 | "set-blocking": "^2.0.0", 1262 | "string-width": "^1.0.2", 1263 | "which-module": "^1.0.0", 1264 | "y18n": "^3.2.1", 1265 | "yargs-parser": "^4.2.0" 1266 | } 1267 | }, 1268 | "yargs-parser": { 1269 | "version": "4.2.1", 1270 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", 1271 | "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", 1272 | "requires": { 1273 | "camelcase": "^3.0.0" 1274 | } 1275 | }, 1276 | "yauzl": { 1277 | "version": "2.4.1", 1278 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 1279 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 1280 | "requires": { 1281 | "fd-slicer": "~1.0.1" 1282 | } 1283 | } 1284 | } 1285 | } 1286 | -------------------------------------------------------------------------------- /layers/mathjax-node-layer/nodejs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "mathjax": "^3.2.0", 4 | "svg2png": "^4.1.1" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 11 | 12 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@chialab/math-api", 3 | "version": "0.2.0", 4 | "description": "Render LaTeX and MathML formulas as SVG or PNG.", 5 | "main": "index.js", 6 | "bin": "bin/server.js", 7 | "scripts": { 8 | "start": "node bin/server.js", 9 | "test": "mocha test/*.js test/**/*.js", 10 | "api-gateway": "sam local start-api --template templates/root.yml" 11 | }, 12 | "keywords": [ 13 | "mathjax", 14 | "node", 15 | "docker" 16 | ], 17 | "author": "Chia Lab s.r.l.", 18 | "license": "MIT", 19 | "dependencies": { 20 | "body-parser": "^1.19.0", 21 | "express": "^4.16.4", 22 | "mathjax": "^3.2.0", 23 | "svg2png": "^4.1.1" 24 | }, 25 | "devDependencies": { 26 | "chai": "^4.2.0", 27 | "mocha": "^6.1.4", 28 | "supertest": "^4.0.2" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/app.js: -------------------------------------------------------------------------------- 1 | const { raw } = require('body-parser'); 2 | const express = require('express'); 3 | const { handler } = require('./render/index.js'); 4 | 5 | /** @typedef {{ resource: string, path: string, httpMethod: string, headers: { [x: string]: string }, queryStringParameters: { [x: string]: string }, pathParameters: { [x: string]: string }, body: string, isBase64Encoded: boolean }} LambdaProxyInput */ 6 | /** @typedef {{ statusCode: number, headers: { [x: string]: string }, body: string, isBase64Encoded: boolean }} LambdaProxyOutput */ 7 | 8 | /** 9 | * Convert ExpressJS incoming request to a Lambda proxy input event. 10 | * 11 | * @returns {LambdaProxyInput} 12 | */ 13 | express.request.constructor.prototype.toLambdaEvent = function () { 14 | return { 15 | resource: this.route.path, 16 | path: this.path, 17 | httpMethod: this.method, 18 | headers: Object.assign({}, this.headers || {}), 19 | // multiValueHeaders: { List of strings containing incoming request headers } 20 | queryStringParameters: Object.assign({}, this.query || {}), 21 | // multiValueQueryStringParameters: { List of query string parameters } 22 | pathParameters: Object.assign({}, this.params || {}), 23 | stageVariables: Object.assign({}, this.app.locals || {}), 24 | requestContext: {}, // TODO 25 | body: this.body, 26 | isBase64Encoded: false, 27 | }; 28 | }; 29 | 30 | /** 31 | * Build ExpressJS response from Lambda proxy output. 32 | * 33 | * @param {LambdaProxyOutput} res Lambda proxy response. 34 | * @returns {ThisType} 35 | */ 36 | express.response.constructor.prototype.fromLambdaResponse = function (res) { 37 | this.status(res.statusCode); 38 | if (res.headers) { 39 | this.set(res.headers); 40 | } 41 | if (res.body) { 42 | let buf = Buffer.from(res.body, res.isBase64Encoded ? 'base64' : 'utf8'); 43 | this.set('Content-Length', buf.byteLength); 44 | this.write(buf); 45 | } 46 | this.end(); 47 | 48 | return this; 49 | }; 50 | 51 | const apigw = new express.Router(); 52 | 53 | // Render endpoint. 54 | apigw 55 | .route('/render') 56 | .get(async (req, res, next) => { 57 | try { 58 | res.fromLambdaResponse(await handler(req.toLambdaEvent())); 59 | } catch (err) { 60 | next(err); 61 | } 62 | }) 63 | .post(async (req, res, next) => { 64 | try { 65 | res.fromLambdaResponse(await handler(req.toLambdaEvent())); 66 | } catch (err) { 67 | next(err); 68 | } 69 | }); 70 | 71 | // Assemble app. 72 | module.exports = express() 73 | .use(raw({ type: '*/*' })) 74 | .use(apigw) 75 | .use((err, req, res, next) => { 76 | // Error handling. 77 | console.error('Integration error', err); 78 | 79 | res.status(500) 80 | .set('Content-Type', 'application/json') 81 | .send(JSON.stringify({ message: 'Internal server error' })); 82 | }); 83 | -------------------------------------------------------------------------------- /src/render/index.js: -------------------------------------------------------------------------------- 1 | const svg2png = require('svg2png'); 2 | 3 | /** @typedef {{ input: 'latex', inline?: boolean } | { input: 'mathml' }} InputDefinition */ 4 | /** @typedef {{ output: 'mathml' | 'svg' } | { output: 'png', width?: number, height?: number }} OutputDefinition */ 5 | /** @typedef {InputDefinition & OutputDefinition & { source: string }} Input */ 6 | /** @typedef {'application/mathml+xml' | 'image/png' | 'image/svg+xml'} ContentType */ 7 | /** @typedef {{ contentType: ContentType, isBase64Encoded?: boolean, data: string }} Output */ 8 | 9 | /** @typedef {{ httpMethod: 'GET' | 'POST', headers: { [x: string]: string }, queryStringParameters: { [x: string]: string }, body: string }} ApiGatewayProxyEvent */ 10 | /** @typedef {{ statusCode: number, headers?: { [x: string]: string }, body?: string | Buffer, isBase64Encoded?: boolean }} ApiGatewayProxyResponse */ 11 | 12 | /** 13 | * Response types. 14 | * 15 | * @var {{ [x: OutputType]: ContentType }} 16 | */ 17 | const RESPONSE_TYPES = { 18 | mathml: 'application/mathml+xml', 19 | png: 'image/png', 20 | svg: 'image/svg+xml', 21 | }; 22 | 23 | /** 24 | * MathJax settings. 25 | * 26 | * @var {{}} 27 | */ 28 | const defaultConfiguration = { 29 | loader: { 30 | paths: {mathjax: 'mathjax/es5'}, 31 | require: require, 32 | load: ['adaptors/liteDOM', 'input/mml', 'input/tex-full', 'output/svg'] 33 | }, 34 | options: { 35 | enableAssistiveMml: false 36 | } 37 | } 38 | const MJAX_SETTINGS = process.env.MJAX_SETTINGS ? JSON.parse(process.env.MJAX_SETTINGS) : defaultConfiguration; 39 | MathJax = MJAX_SETTINGS; 40 | 41 | require('mathjax/es5/tex-mml-svg.js'); 42 | 43 | 44 | /** 45 | * Detect format. 46 | * 47 | * @param {InputDefinition} input Input. 48 | * @returns {'TeX' | 'inline-TeX' | 'MathML'} 49 | */ 50 | const getFormat = (input) => { 51 | switch (input.input) { 52 | case 'mathml': 53 | return 'MathML'; 54 | 55 | case 'latex': 56 | if (input.inline) { 57 | return 'inline-TeX'; 58 | } 59 | 60 | return 'TeX'; 61 | 62 | default: 63 | throw new Error(`Invalid input: ${input.input || ''}`); 64 | } 65 | }; 66 | 67 | /** 68 | * Typeset math. 69 | * 70 | * @param {{ math: string, format: 'TeX' | 'inline-TeX' | 'MathML', mml?: boolean, svg?: boolean }} data Data. 71 | * @returns {Promise<{ mml?: string, svg?: string }>} 72 | */ 73 | const typeset = async (data) => { 74 | try { 75 | await MathJax.startup.promise; 76 | switch (data.format) { 77 | case 'TeX': 78 | case 'inline-TeX': 79 | if (data.mml) { 80 | return MathJax.tex2mmlPromise(data.math); 81 | } 82 | if (data.svg) { 83 | return MathJax.tex2svgPromise(data.math); 84 | } 85 | throw new Error(`Supported output formats for ${data.format} input are: MathML, SVG`); 86 | case 'MathML': 87 | if (data.svg) { 88 | return MathJax.mathml2svgPromise(data.math); 89 | } 90 | throw new Error(`Supported output formats for ${data.format} input are: SVG`); 91 | default: 92 | throw new Error(`Unsupported input format: ${data.format}`); 93 | } 94 | } catch (err) { 95 | console.error('MathJax error', err); 96 | 97 | if (err instanceof Error) { 98 | throw err; 99 | } 100 | if (typeof err === 'string') { 101 | throw new Error(`MathJax error: ${err}`); 102 | } 103 | 104 | // Syntax error. 105 | if (Array.isArray(err) && typeof err[0] === 'string') { 106 | throw new Error(`Invalid source: ${err[0].replace(/[\n\r]+/g, ' ')}`); 107 | } 108 | throw new Error('Invalid source'); 109 | } 110 | }; 111 | 112 | /** 113 | * Render math. 114 | * 115 | * @param {Input} event Input event. 116 | * @returns {Promise} 117 | */ 118 | exports.render = async (event) => { 119 | if (event.input === 'mathml' && event.output === 'mathml') { 120 | // No-op conversion MathML-to-MathML. 121 | return { contentType: RESPONSE_TYPES.mathml, data: event.source }; 122 | } 123 | 124 | const format = getFormat(event); 125 | const math = event.source; 126 | switch (event.output) { 127 | case 'mathml': 128 | { 129 | const res = await typeset({ math, format, mml: true }); 130 | 131 | return { contentType: RESPONSE_TYPES.mathml, data: res }; 132 | } 133 | 134 | case 'png': 135 | { 136 | const res = await typeset({ math, format, svg: true }); 137 | 138 | const svg = MathJax.startup.adaptor.innerHTML(res); 139 | const { width, height } = event; 140 | const data = await svg2png(svg, { width, height }); 141 | 142 | return { contentType: RESPONSE_TYPES.png, isBase64Encoded: true, data: data.toString('base64') }; 143 | } 144 | 145 | case 'svg': 146 | { 147 | const res = await typeset({ math, format, svg: true }); 148 | 149 | const svg = MathJax.startup.adaptor.innerHTML(res); 150 | 151 | return { contentType: RESPONSE_TYPES.svg, data: svg }; 152 | } 153 | 154 | default: 155 | throw new Error(`Invalid output: ${event.output || ''}`); 156 | } 157 | }; 158 | 159 | /** 160 | * Render math for AWS API Gateway. 161 | * 162 | * @param {ApiGatewayProxyEvent} event Incoming event. 163 | * @returns {Promise} 164 | */ 165 | exports.handler = async (event) => { 166 | try { 167 | let input; 168 | if (event.httpMethod === 'GET') { 169 | input = event.queryStringParameters; 170 | if (typeof input.inline !== 'undefined') { 171 | input.inline = input.inline === '1'; 172 | } 173 | if (typeof input.width !== 'undefined') { 174 | input.width = parseInt(input.width, 10); 175 | } 176 | if (typeof input.height !== 'undefined') { 177 | input.height = parseInt(input.height, 10); 178 | } 179 | } else { 180 | input = JSON.parse(event.body); 181 | } 182 | 183 | const { contentType, isBase64Encoded = false, data } = await this.render(input); 184 | 185 | return { 186 | statusCode: 200, 187 | headers: { 188 | 'Content-Type': contentType, 189 | }, 190 | body: data, 191 | isBase64Encoded, 192 | }; 193 | } catch (err) { 194 | if (!(err instanceof Error)) { 195 | throw new Error(err); 196 | } 197 | if (!(err instanceof SyntaxError) && !err.message.startsWith('Invalid ')) { 198 | throw err; 199 | } 200 | 201 | return { 202 | statusCode: 400, 203 | headers: { 204 | 'Content-Type': 'application/json', 205 | }, 206 | body: JSON.stringify({ message: err.message }), 207 | }; 208 | } 209 | }; 210 | -------------------------------------------------------------------------------- /templates/root.yml: -------------------------------------------------------------------------------- 1 | --- 2 | AWSTemplateFormatVersion: '2010-09-09' 3 | Transform: 'AWS::Serverless-2016-10-31' 4 | Description: 'Deploy REST API to render LaTeX and MathML formulas as SVG or PNG.' 5 | 6 | Parameters: 7 | CorsAllowedHost: 8 | Type: 'String' 9 | Description: 'Host to be allowed for CORS requests.' 10 | Default: '*' 11 | ApiLoggingLevel: 12 | Type: 'String' 13 | AllowedValues: 14 | - 'OFF' 15 | - 'ERROR' 16 | - 'INFO' 17 | Description: 'Logging level of API Gateway stage.' 18 | Default: 'ERROR' 19 | 20 | Resources: 21 | #################### 22 | ### Lambda layer ### 23 | #################### 24 | MathJaxNodeLayer: 25 | Type: 'AWS::Lambda::LayerVersion' 26 | Properties: 27 | Content: '../layers/mathjax-node-layer' 28 | Description: !Sub 'Layer for Lambda functions requiring MathJax for ${AWS::StackName}.' 29 | CompatibleRuntimes: 30 | - 'nodejs8.10' 31 | 32 | ############################################### 33 | ### Lambda function to render math formulas ### 34 | ############################################### 35 | RenderRole: 36 | Type: 'AWS::IAM::Role' 37 | Properties: 38 | AssumeRolePolicyDocument: 39 | Version: '2012-10-17' 40 | Statement: 41 | - Effect: 'Allow' 42 | Principal: 43 | Service: 'lambda.amazonaws.com' 44 | Action: 'sts:AssumeRole' 45 | ManagedPolicyArns: 46 | - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole' 47 | RenderFunction: 48 | Type: 'AWS::Lambda::Function' 49 | Properties: 50 | Code: '../src/render' 51 | Layers: 52 | - !Ref 'MathJaxNodeLayer' 53 | Description: !Sub 'Render math formulas with MathJax for ${AWS::StackName}.' 54 | Handler: 'index.handler' 55 | Role: !GetAtt 'RenderRole.Arn' 56 | Runtime: 'nodejs8.10' 57 | MemorySize: 256 58 | Timeout: 5 59 | RenderFunctionPermission: 60 | Type: 'AWS::Lambda::Permission' 61 | Properties: 62 | FunctionName: !GetAtt 'RenderFunction.Arn' 63 | Action: 'lambda:InvokeFunction' 64 | Principal: 'apigateway.amazonaws.com' 65 | SourceArn: !Sub 'arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${Api}/*/*/render' 66 | 67 | ################### 68 | ### API Gateway ### 69 | ################### 70 | Api: 71 | Type: 'AWS::Serverless::Api' 72 | Properties: 73 | Name: !Ref 'AWS::StackName' 74 | StageName: 'default' 75 | EndpointConfiguration: 'REGIONAL' 76 | MethodSettings: 77 | - HttpMethod: '*' 78 | ResourcePath: '/*' 79 | LoggingLevel: !Ref 'ApiLoggingLevel' 80 | DefinitionBody: 81 | openapi: '3.0.0' 82 | schemes: 83 | - 'https' 84 | x-amazon-apigateway-request-validators: 85 | all: 86 | validateRequestBody: yes 87 | validateRequestParameters: yes 88 | x-amazon-apigateway-binary-media-types: 89 | - 'image/png' 90 | paths: 91 | /render: 92 | get: 93 | description: 'Render math formula.' 94 | x-amazon-apigateway-request-validator: 'all' 95 | parameters: 96 | - in: 'query' 97 | name: 'input' 98 | schema: 99 | type: 'string' 100 | enum: 101 | - 'latex' 102 | - 'mathml' 103 | description: 'Input format.' 104 | required: yes 105 | - in: 'query' 106 | name: 'inline' 107 | schema: 108 | type: 'string' 109 | enum: 110 | - '0' 111 | - '1' 112 | description: 'For LaTeX input, whether it should be treated as an inline formula.' 113 | - in: 'query' 114 | name: 'source' 115 | schema: 116 | type: 'string' 117 | description: 'Math to be rendered.' 118 | required: yes 119 | - in: 'query' 120 | name: 'output' 121 | schema: 122 | type: 'string' 123 | enum: 124 | - 'mathml' 125 | - 'png' 126 | - 'svg' 127 | description: 'Output format.' 128 | required: yes 129 | - in: 'query' 130 | name: 'width' 131 | schema: 132 | type: 'number' 133 | minValue: 1 134 | description: 'For PNG output, image width in pixels.' 135 | - in: 'query' 136 | name: 'height' 137 | schema: 138 | type: 'number' 139 | minValue: 1 140 | description: 'For PNG output, image height in pixels.' 141 | responses: 142 | '200': 143 | description: 'OK' 144 | headers: 145 | Access-Control-Allow-Origin: 146 | schema: 147 | type: 'string' 148 | content: 149 | application/mathml+xml: 150 | schema: 151 | type: 'object' 152 | image/png: 153 | schema: 154 | type: 'string' 155 | format: 'binary' 156 | image/svg+xml: 157 | schema: 158 | type: 'object' 159 | '400': 160 | description: 'OK' 161 | headers: 162 | Access-Control-Allow-Origin: 163 | schema: 164 | type: 'string' 165 | content: 166 | application/json: 167 | schema: 168 | $ref: '#/components/schemas/ErrorResponse' 169 | security: 170 | - api_key: [] 171 | x-amazon-apigateway-integration: 172 | type: 'aws_proxy' 173 | httpMethod: 'POST' 174 | uri: !Sub 'arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${RenderFunction.Arn}/invocations' 175 | post: 176 | description: 'Render math formula.' 177 | x-amazon-apigateway-request-validator: 'all' 178 | requestBody: 179 | content: 180 | application/json: 181 | schema: 182 | $ref: '#/components/schemas/RenderRequest' 183 | responses: 184 | '200': 185 | description: 'OK' 186 | headers: 187 | Access-Control-Allow-Origin: 188 | schema: 189 | type: 'string' 190 | content: 191 | application/mathml+xml: 192 | schema: 193 | type: 'object' 194 | image/png: 195 | schema: 196 | type: 'string' 197 | format: 'binary' 198 | image/svg+xml: 199 | schema: 200 | type: 'object' 201 | '400': 202 | description: 'OK' 203 | headers: 204 | Access-Control-Allow-Origin: 205 | schema: 206 | type: 'string' 207 | content: 208 | application/json: 209 | schema: 210 | $ref: '#/components/schemas/ErrorResponse' 211 | security: 212 | - api_key: [] 213 | x-amazon-apigateway-integration: 214 | type: 'aws_proxy' 215 | httpMethod: 'POST' 216 | uri: !Sub 'arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${RenderFunction.Arn}/invocations' 217 | options: 218 | description: 'CORS response.' 219 | responses: 220 | '200': 221 | description: 'OK' 222 | headers: 223 | Access-Control-Allow-Origin: 224 | schema: 225 | type: 'string' 226 | Access-Control-Allow-Methods: 227 | schema: 228 | type: 'string' 229 | Access-Control-Allow-Headers: 230 | schema: 231 | type: 'string' 232 | x-amazon-apigateway-integration: 233 | type: 'mock' 234 | requestTemplates: 235 | application/json: '{"statusCode": 200}' 236 | responses: 237 | default: 238 | statusCode: 200 239 | responseParameters: 240 | method.response.header.Access-Control-Allow-Methods: "'GET,OPTIONS,POST'" 241 | method.response.header.Access-Control-Allow-Headers: "''" 242 | method.response.header.Access-Control-Allow-Origin: !Sub "'${CorsAllowedHost}'" 243 | components: 244 | schemas: 245 | ErrorResponse: 246 | type: 'object' 247 | properties: 248 | message: 249 | type: 'string' 250 | required: ['message'] 251 | RenderContentType: 252 | type: 'string' 253 | enum: 254 | - 'application/mathml+xml' 255 | - 'image/png' 256 | - 'image/svg+xml' 257 | RenderRequest: 258 | type: 'object' 259 | properties: 260 | input: 261 | type: 'string' 262 | enum: 263 | - 'latex' 264 | - 'mathml' 265 | inline: 266 | type: 'boolean' 267 | source: 268 | type: 'string' 269 | output: 270 | type: 'string' 271 | enum: 272 | - 'mathml' 273 | - 'png' 274 | - 'svg' 275 | width: 276 | type: 'number' 277 | minValue: 1 278 | height: 279 | type: 'number' 280 | minValue: 1 281 | required: ['input', 'output', 'source'] 282 | additionalProperties: no 283 | -------------------------------------------------------------------------------- /test/app.js: -------------------------------------------------------------------------------- 1 | const querystring = require('querystring'); 2 | const { expect } = require('chai'); 3 | const supertest = require('supertest'); 4 | const app = require('../src/app.js'); 5 | 6 | /** 7 | * PNG file signature (first 8 bytes). 8 | * 9 | * @see http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html#PNG-file-signature 10 | * 11 | * @var {Buffer} 12 | */ 13 | const PNG_SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]); 14 | 15 | const TEST_INPUTS = { 16 | 'TeX': { input: 'latex', source: 'e^{i \\pi} + 1 = 0' }, 17 | 'inline-TeX': { input: 'latex', inline: true, source: 'e^{i \\pi} + 1 = 0' }, 18 | 'MathML': { input: 'mathml', source: 'x2' }, 19 | 'inline-MathML': { input: 'mathml', source: 'x2' }, 20 | }; 21 | 22 | const testApp = supertest(app); 23 | 24 | // First PNG conversion is always slower. Warm up before tests start to avoid first test always being slow. 25 | before('warm up', function () { 26 | this.timeout(5000); 27 | 28 | return testApp.get('/render?input=latex&output=png&source=x') 29 | .catch(console.error); 30 | }); 31 | 32 | describe('GET /render', function () { 33 | this.timeout(5000); 34 | this.slow(200); 35 | 36 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as MathML`, function () { 37 | const search = Object.assign({ output: 'mathml' }, TEST_INPUTS[alias]); 38 | const url = `/render?${querystring.stringify(search)}`; 39 | 40 | return testApp 41 | .get(url) 42 | .expect(200) 43 | .expect('Content-Type', 'application/mathml+xml') 44 | .expect((response) => { 45 | const data = response.text; 46 | 47 | expect(data).to.be.a('string').that.contains(''); 48 | }); 49 | })); 50 | 51 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as PNG`, function () { 52 | this.slow(2000); 53 | 54 | const search = Object.assign({ output: 'png' }, TEST_INPUTS[alias]); 55 | const url = `/render?${querystring.stringify(search)}`; 56 | 57 | return testApp 58 | .get(url) 59 | .expect(200) 60 | .expect('Content-Type', 'image/png') 61 | .expect((response) => { 62 | const data = response.body; 63 | 64 | expect(data.slice(0, PNG_SIGNATURE.byteLength)).to.be.an.instanceOf(Buffer) 65 | .that.deep.equals(PNG_SIGNATURE); 66 | }); 67 | })); 68 | 69 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as SVG`, function () { 70 | const search = Object.assign({ output: 'svg' }, TEST_INPUTS[alias]); 71 | const url = `/render?${querystring.stringify(search)}`; 72 | 73 | return testApp 74 | .get(url) 75 | .expect(200) 76 | .expect('Content-Type', 'image/svg+xml') 77 | .expect((response) => { 78 | const data = response.body.toString(); 79 | 80 | expect(data).to.be.a('string').that.contains(''); 81 | }); 82 | })); 83 | 84 | it('should return "400 Bad Request" with invalid parameters', function () { 85 | const search = { input: 'latex', output: 'INVALID', source: 'x^2' }; 86 | const url = `/render?${querystring.stringify(search)}`; 87 | 88 | return testApp 89 | .get(url) 90 | .expect(400, { message: 'Invalid output: INVALID' }) 91 | .expect('Content-Type', /^application\/json(?:;|$)/); 92 | }); 93 | }); 94 | 95 | describe('POST /render', function () { 96 | this.timeout(5000); 97 | this.slow(200); 98 | 99 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as MathML`, function () { 100 | const body = Object.assign({ output: 'mathml' }, TEST_INPUTS[alias]); 101 | 102 | return testApp 103 | .post('/render') 104 | .set('Content-Type', 'application/json') 105 | .send(body) 106 | .expect(200) 107 | .expect('Content-Type', 'application/mathml+xml') 108 | .expect((response) => { 109 | const data = response.text; 110 | 111 | expect(data).to.be.a('string').that.contains(''); 112 | }); 113 | })); 114 | 115 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as PNG`, function () { 116 | this.slow(2000); 117 | 118 | const body = Object.assign({ output: 'png' }, TEST_INPUTS[alias]); 119 | 120 | return testApp 121 | .post('/render') 122 | .set('Content-Type', 'application/json') 123 | .send(body) 124 | .expect(200) 125 | .expect('Content-Type', 'image/png') 126 | .expect((response) => { 127 | const data = response.body; 128 | 129 | expect(data.slice(0, PNG_SIGNATURE.byteLength)).to.be.an.instanceOf(Buffer) 130 | .that.deep.equals(PNG_SIGNATURE); 131 | }); 132 | })); 133 | 134 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as SVG`, function () { 135 | const body = Object.assign({ output: 'svg' }, TEST_INPUTS[alias]); 136 | 137 | return testApp 138 | .post('/render') 139 | .set('Content-Type', 'application/json') 140 | .send(body) 141 | .expect(200) 142 | .expect('Content-Type', 'image/svg+xml') 143 | .expect((response) => { 144 | const data = response.body.toString(); 145 | 146 | expect(data).to.be.a('string').that.contains(''); 147 | }); 148 | })); 149 | 150 | it('should return "400 Bad Request" with invalid parameters', function () { 151 | const body = { input: 'latex', output: 'INVALID', source: 'x^2' }; 152 | 153 | return testApp 154 | .post('/render') 155 | .set('Content-Type', 'application/json') 156 | .send(body) 157 | .expect(400, { message: 'Invalid output: INVALID' }) 158 | .expect('Content-Type', /^application\/json(?:;|$)/); 159 | }); 160 | }); 161 | -------------------------------------------------------------------------------- /test/render/index.js: -------------------------------------------------------------------------------- 1 | const { expect } = require('chai'); 2 | const { render } = require('../../src/render/index.js'); 3 | 4 | /** 5 | * PNG file signature (first 8 bytes). 6 | * 7 | * @see http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html#PNG-file-signature 8 | * 9 | * @var {Buffer} 10 | */ 11 | const PNG_SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]); 12 | 13 | const TEST_INPUTS = { 14 | 'TeX': { input: 'latex', source: 'e^{i \\pi} + 1 = 0' }, 15 | 'inline-TeX': { input: 'latex', inline: true, source: 'e^{i \\pi} + 1 = 0' }, 16 | 'MathML': { input: 'mathml', source: 'x2' }, 17 | 'inline-MathML': { input: 'mathml', source: 'x2' }, 18 | }; 19 | 20 | // First PNG conversion is always slower. Warm up before tests start to avoid first test always being slow. 21 | before('warm up', function () { 22 | this.timeout(5000); 23 | 24 | return render({ input: 'latex', output: 'png', source: 'x^2' }) 25 | .catch(console.error); 26 | }); 27 | 28 | describe('index#render', function () { 29 | this.timeout(3000); 30 | this.slow(200); 31 | 32 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as MathML`, async function () { 33 | if (TEST_INPUTS[alias].input === 'mathml') { 34 | this.timeout(100); 35 | this.slow(5); 36 | } 37 | 38 | const event = Object.assign({ output: 'mathml' }, TEST_INPUTS[alias]); 39 | const actual = await render(event); 40 | 41 | expect(actual).to.be.an('object').with.keys('contentType', 'data'); 42 | expect(actual.contentType).to.be.a('string').that.equals('application/mathml+xml'); 43 | expect(actual.data).to.be.a('string').that.contains(''); 44 | })); 45 | 46 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as PNG`, async function () { 47 | this.slow(2000); 48 | 49 | const event = Object.assign({ output: 'png', width: 100 }, TEST_INPUTS[alias]); 50 | const actual = await render(event); 51 | 52 | expect(actual).to.be.an('object').with.keys('contentType', 'isBase64Encoded', 'data'); 53 | expect(actual.contentType).to.be.a('string').that.equals('image/png'); 54 | expect(actual.isBase64Encoded).to.be.a('boolean').that.equals(true); 55 | expect(actual.data).to.be.a('string').that.matches(/^[a-zA-Z0-9+/=]+$/); 56 | expect(Buffer.from(actual.data, 'base64').slice(0, PNG_SIGNATURE.byteLength)).to.be.an.instanceOf(Buffer) 57 | .that.deep.equals(PNG_SIGNATURE); 58 | })); 59 | 60 | Object.keys(TEST_INPUTS).forEach((alias) => it(`should render ${alias} as SVG`, async function () { 61 | const event = Object.assign({ output: 'svg' }, TEST_INPUTS[alias]); 62 | const actual = await render(event); 63 | 64 | expect(actual).to.be.an('object').with.keys('contentType', 'data'); 65 | expect(actual.contentType).to.be.a('string').that.equals('image/svg+xml'); 66 | expect(actual.data).to.be.a('string').that.contains(''); 67 | })); 68 | 69 | it('should throw with invalid input type', async function () { 70 | const event = { input: 'INVALID', output: 'svg', source: 'x^2' }; 71 | 72 | try { 73 | await render(event); 74 | expect.fail('Did not throw'); 75 | } catch (err) { 76 | expect(err).to.be.an.instanceOf(Error) 77 | .that.has.property('message', 'Invalid input: INVALID'); 78 | } 79 | }); 80 | 81 | it('should throw with invalid output type', async function () { 82 | const event = { input: 'latex', output: 'INVALID', source: 'x^2' }; 83 | 84 | try { 85 | await render(event); 86 | expect.fail('Did not throw'); 87 | } catch (err) { 88 | expect(err).to.be.an.instanceOf(Error) 89 | .that.has.property('message', 'Invalid output: INVALID'); 90 | } 91 | }); 92 | 93 | it('should throw with invalid source', async function () { 94 | const event = { input: 'mathml', output: 'svg', source: 'x^2' }; 95 | 96 | try { 97 | await render(event); 98 | expect.fail('Did not throw'); 99 | } catch (err) { 100 | expect(err).to.be.an.instanceOf(Error) 101 | .that.has.property('message') 102 | .that.contains('MathML must be formed by a element, not <#text>') 103 | .and.that.does.not.contain('\n'); 104 | } 105 | }); 106 | }); 107 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "accepts@~1.3.7": 6 | "integrity" "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==" 7 | "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz" 8 | "version" "1.3.7" 9 | dependencies: 10 | "mime-types" "~2.1.24" 11 | "negotiator" "0.6.2" 12 | 13 | "ajv@^6.5.5": 14 | "integrity" "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==" 15 | "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz" 16 | "version" "6.12.0" 17 | dependencies: 18 | "fast-deep-equal" "^3.1.1" 19 | "fast-json-stable-stringify" "^2.0.0" 20 | "json-schema-traverse" "^0.4.1" 21 | "uri-js" "^4.2.2" 22 | 23 | "ansi-colors@3.2.3": 24 | "integrity" "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" 25 | "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz" 26 | "version" "3.2.3" 27 | 28 | "ansi-regex@^2.0.0": 29 | "integrity" "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 30 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" 31 | "version" "2.1.1" 32 | 33 | "ansi-regex@^3.0.0": 34 | "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 35 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" 36 | "version" "3.0.0" 37 | 38 | "ansi-regex@^4.1.0": 39 | "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 40 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" 41 | "version" "4.1.0" 42 | 43 | "ansi-styles@^3.2.0", "ansi-styles@^3.2.1": 44 | "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" 45 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 46 | "version" "3.2.1" 47 | dependencies: 48 | "color-convert" "^1.9.0" 49 | 50 | "argparse@^1.0.7": 51 | "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" 52 | "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" 53 | "version" "1.0.10" 54 | dependencies: 55 | "sprintf-js" "~1.0.2" 56 | 57 | "array-flatten@1.1.1": 58 | "integrity" "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 59 | "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" 60 | "version" "1.1.1" 61 | 62 | "asn1@~0.2.3": 63 | "integrity" "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==" 64 | "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" 65 | "version" "0.2.4" 66 | dependencies: 67 | "safer-buffer" "~2.1.0" 68 | 69 | "assert-plus@^1.0.0", "assert-plus@1.0.0": 70 | "integrity" "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 71 | "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" 72 | "version" "1.0.0" 73 | 74 | "assertion-error@^1.1.0": 75 | "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" 76 | "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" 77 | "version" "1.1.0" 78 | 79 | "asynckit@^0.4.0": 80 | "integrity" "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 81 | "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 82 | "version" "0.4.0" 83 | 84 | "aws-sign2@~0.7.0": 85 | "integrity" "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 86 | "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" 87 | "version" "0.7.0" 88 | 89 | "aws4@^1.8.0": 90 | "integrity" "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" 91 | "resolved" "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz" 92 | "version" "1.9.1" 93 | 94 | "balanced-match@^1.0.0": 95 | "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 96 | "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 97 | "version" "1.0.0" 98 | 99 | "bcrypt-pbkdf@^1.0.0": 100 | "integrity" "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=" 101 | "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" 102 | "version" "1.0.2" 103 | dependencies: 104 | "tweetnacl" "^0.14.3" 105 | 106 | "body-parser@^1.19.0", "body-parser@1.19.0": 107 | "integrity" "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==" 108 | "resolved" "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz" 109 | "version" "1.19.0" 110 | dependencies: 111 | "bytes" "3.1.0" 112 | "content-type" "~1.0.4" 113 | "debug" "2.6.9" 114 | "depd" "~1.1.2" 115 | "http-errors" "1.7.2" 116 | "iconv-lite" "0.4.24" 117 | "on-finished" "~2.3.0" 118 | "qs" "6.7.0" 119 | "raw-body" "2.4.0" 120 | "type-is" "~1.6.17" 121 | 122 | "brace-expansion@^1.1.7": 123 | "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" 124 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 125 | "version" "1.1.11" 126 | dependencies: 127 | "balanced-match" "^1.0.0" 128 | "concat-map" "0.0.1" 129 | 130 | "browser-stdout@1.3.1": 131 | "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" 132 | "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" 133 | "version" "1.3.1" 134 | 135 | "buffer-from@^1.0.0": 136 | "integrity" "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 137 | "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" 138 | "version" "1.1.1" 139 | 140 | "bytes@3.1.0": 141 | "integrity" "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 142 | "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz" 143 | "version" "3.1.0" 144 | 145 | "camelcase@^3.0.0": 146 | "integrity" "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" 147 | "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" 148 | "version" "3.0.0" 149 | 150 | "camelcase@^5.0.0": 151 | "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 152 | "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" 153 | "version" "5.3.1" 154 | 155 | "caseless@~0.12.0": 156 | "integrity" "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 157 | "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" 158 | "version" "0.12.0" 159 | 160 | "chai@^4.2.0": 161 | "integrity" "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==" 162 | "resolved" "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz" 163 | "version" "4.2.0" 164 | dependencies: 165 | "assertion-error" "^1.1.0" 166 | "check-error" "^1.0.2" 167 | "deep-eql" "^3.0.1" 168 | "get-func-name" "^2.0.0" 169 | "pathval" "^1.1.0" 170 | "type-detect" "^4.0.5" 171 | 172 | "chalk@^2.0.1": 173 | "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" 174 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 175 | "version" "2.4.2" 176 | dependencies: 177 | "ansi-styles" "^3.2.1" 178 | "escape-string-regexp" "^1.0.5" 179 | "supports-color" "^5.3.0" 180 | 181 | "check-error@^1.0.2": 182 | "integrity" "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" 183 | "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" 184 | "version" "1.0.2" 185 | 186 | "cliui@^3.2.0": 187 | "integrity" "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=" 188 | "resolved" "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" 189 | "version" "3.2.0" 190 | dependencies: 191 | "string-width" "^1.0.1" 192 | "strip-ansi" "^3.0.1" 193 | "wrap-ansi" "^2.0.0" 194 | 195 | "cliui@^5.0.0": 196 | "integrity" "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==" 197 | "resolved" "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" 198 | "version" "5.0.0" 199 | dependencies: 200 | "string-width" "^3.1.0" 201 | "strip-ansi" "^5.2.0" 202 | "wrap-ansi" "^5.1.0" 203 | 204 | "code-point-at@^1.0.0": 205 | "integrity" "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 206 | "resolved" "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" 207 | "version" "1.1.0" 208 | 209 | "color-convert@^1.9.0": 210 | "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" 211 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 212 | "version" "1.9.3" 213 | dependencies: 214 | "color-name" "1.1.3" 215 | 216 | "color-name@1.1.3": 217 | "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 218 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 219 | "version" "1.1.3" 220 | 221 | "combined-stream@^1.0.6", "combined-stream@~1.0.6": 222 | "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" 223 | "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 224 | "version" "1.0.8" 225 | dependencies: 226 | "delayed-stream" "~1.0.0" 227 | 228 | "component-emitter@^1.2.0": 229 | "integrity" "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" 230 | "resolved" "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" 231 | "version" "1.3.0" 232 | 233 | "concat-map@0.0.1": 234 | "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 235 | "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 236 | "version" "0.0.1" 237 | 238 | "concat-stream@1.6.2": 239 | "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" 240 | "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" 241 | "version" "1.6.2" 242 | dependencies: 243 | "buffer-from" "^1.0.0" 244 | "inherits" "^2.0.3" 245 | "readable-stream" "^2.2.2" 246 | "typedarray" "^0.0.6" 247 | 248 | "content-disposition@0.5.3": 249 | "integrity" "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==" 250 | "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" 251 | "version" "0.5.3" 252 | dependencies: 253 | "safe-buffer" "5.1.2" 254 | 255 | "content-type@~1.0.4": 256 | "integrity" "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 257 | "resolved" "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" 258 | "version" "1.0.4" 259 | 260 | "cookie-signature@1.0.6": 261 | "integrity" "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 262 | "resolved" "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" 263 | "version" "1.0.6" 264 | 265 | "cookie@0.4.0": 266 | "integrity" "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 267 | "resolved" "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz" 268 | "version" "0.4.0" 269 | 270 | "cookiejar@^2.1.0": 271 | "integrity" "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" 272 | "resolved" "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz" 273 | "version" "2.1.2" 274 | 275 | "core-util-is@~1.0.0", "core-util-is@1.0.2": 276 | "integrity" "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 277 | "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" 278 | "version" "1.0.2" 279 | 280 | "dashdash@^1.12.0": 281 | "integrity" "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=" 282 | "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" 283 | "version" "1.14.1" 284 | dependencies: 285 | "assert-plus" "^1.0.0" 286 | 287 | "debug@^3.1.0": 288 | "integrity" "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==" 289 | "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" 290 | "version" "3.2.6" 291 | dependencies: 292 | "ms" "^2.1.1" 293 | 294 | "debug@2.6.9": 295 | "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" 296 | "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 297 | "version" "2.6.9" 298 | dependencies: 299 | "ms" "2.0.0" 300 | 301 | "debug@3.2.6": 302 | "integrity" "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==" 303 | "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" 304 | "version" "3.2.6" 305 | dependencies: 306 | "ms" "^2.1.1" 307 | 308 | "decamelize@^1.1.1", "decamelize@^1.2.0": 309 | "integrity" "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 310 | "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" 311 | "version" "1.2.0" 312 | 313 | "deep-eql@^3.0.1": 314 | "integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==" 315 | "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" 316 | "version" "3.0.1" 317 | dependencies: 318 | "type-detect" "^4.0.0" 319 | 320 | "define-properties@^1.1.2", "define-properties@^1.1.3": 321 | "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" 322 | "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" 323 | "version" "1.1.3" 324 | dependencies: 325 | "object-keys" "^1.0.12" 326 | 327 | "delayed-stream@~1.0.0": 328 | "integrity" "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 329 | "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 330 | "version" "1.0.0" 331 | 332 | "depd@~1.1.2": 333 | "integrity" "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 334 | "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" 335 | "version" "1.1.2" 336 | 337 | "destroy@~1.0.4": 338 | "integrity" "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 339 | "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" 340 | "version" "1.0.4" 341 | 342 | "diff@3.5.0": 343 | "integrity" "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" 344 | "resolved" "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" 345 | "version" "3.5.0" 346 | 347 | "ecc-jsbn@~0.1.1": 348 | "integrity" "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=" 349 | "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" 350 | "version" "0.1.2" 351 | dependencies: 352 | "jsbn" "~0.1.0" 353 | "safer-buffer" "^2.1.0" 354 | 355 | "ee-first@1.1.1": 356 | "integrity" "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 357 | "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" 358 | "version" "1.1.1" 359 | 360 | "emoji-regex@^7.0.1": 361 | "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 362 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" 363 | "version" "7.0.3" 364 | 365 | "encodeurl@~1.0.2": 366 | "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 367 | "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" 368 | "version" "1.0.2" 369 | 370 | "error-ex@^1.2.0": 371 | "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" 372 | "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" 373 | "version" "1.3.2" 374 | dependencies: 375 | "is-arrayish" "^0.2.1" 376 | 377 | "es-abstract@^1.17.0-next.1": 378 | "integrity" "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==" 379 | "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz" 380 | "version" "1.17.4" 381 | dependencies: 382 | "es-to-primitive" "^1.2.1" 383 | "function-bind" "^1.1.1" 384 | "has" "^1.0.3" 385 | "has-symbols" "^1.0.1" 386 | "is-callable" "^1.1.5" 387 | "is-regex" "^1.0.5" 388 | "object-inspect" "^1.7.0" 389 | "object-keys" "^1.1.1" 390 | "object.assign" "^4.1.0" 391 | "string.prototype.trimleft" "^2.1.1" 392 | "string.prototype.trimright" "^2.1.1" 393 | 394 | "es-to-primitive@^1.2.1": 395 | "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" 396 | "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" 397 | "version" "1.2.1" 398 | dependencies: 399 | "is-callable" "^1.1.4" 400 | "is-date-object" "^1.0.1" 401 | "is-symbol" "^1.0.2" 402 | 403 | "es6-promise@^4.0.3": 404 | "integrity" "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 405 | "resolved" "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" 406 | "version" "4.2.8" 407 | 408 | "escape-html@~1.0.3": 409 | "integrity" "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 410 | "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" 411 | "version" "1.0.3" 412 | 413 | "escape-string-regexp@^1.0.5", "escape-string-regexp@1.0.5": 414 | "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 415 | "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 416 | "version" "1.0.5" 417 | 418 | "esprima@^4.0.0": 419 | "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 420 | "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" 421 | "version" "4.0.1" 422 | 423 | "etag@~1.8.1": 424 | "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 425 | "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" 426 | "version" "1.8.1" 427 | 428 | "express@^4.16.4": 429 | "integrity" "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==" 430 | "resolved" "https://registry.npmjs.org/express/-/express-4.17.1.tgz" 431 | "version" "4.17.1" 432 | dependencies: 433 | "accepts" "~1.3.7" 434 | "array-flatten" "1.1.1" 435 | "body-parser" "1.19.0" 436 | "content-disposition" "0.5.3" 437 | "content-type" "~1.0.4" 438 | "cookie" "0.4.0" 439 | "cookie-signature" "1.0.6" 440 | "debug" "2.6.9" 441 | "depd" "~1.1.2" 442 | "encodeurl" "~1.0.2" 443 | "escape-html" "~1.0.3" 444 | "etag" "~1.8.1" 445 | "finalhandler" "~1.1.2" 446 | "fresh" "0.5.2" 447 | "merge-descriptors" "1.0.1" 448 | "methods" "~1.1.2" 449 | "on-finished" "~2.3.0" 450 | "parseurl" "~1.3.3" 451 | "path-to-regexp" "0.1.7" 452 | "proxy-addr" "~2.0.5" 453 | "qs" "6.7.0" 454 | "range-parser" "~1.2.1" 455 | "safe-buffer" "5.1.2" 456 | "send" "0.17.1" 457 | "serve-static" "1.14.1" 458 | "setprototypeof" "1.1.1" 459 | "statuses" "~1.5.0" 460 | "type-is" "~1.6.18" 461 | "utils-merge" "1.0.1" 462 | "vary" "~1.1.2" 463 | 464 | "extend@^3.0.0", "extend@~3.0.2": 465 | "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 466 | "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" 467 | "version" "3.0.2" 468 | 469 | "extract-zip@^1.6.5": 470 | "integrity" "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=" 471 | "resolved" "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz" 472 | "version" "1.6.7" 473 | dependencies: 474 | "concat-stream" "1.6.2" 475 | "debug" "2.6.9" 476 | "mkdirp" "0.5.1" 477 | "yauzl" "2.4.1" 478 | 479 | "extsprintf@^1.2.0": 480 | "integrity" "sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=" 481 | "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.0.tgz" 482 | "version" "1.4.0" 483 | 484 | "extsprintf@1.3.0": 485 | "integrity" "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 486 | "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" 487 | "version" "1.3.0" 488 | 489 | "fast-deep-equal@^3.1.1": 490 | "integrity" "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" 491 | "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz" 492 | "version" "3.1.1" 493 | 494 | "fast-json-stable-stringify@^2.0.0": 495 | "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 496 | "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 497 | "version" "2.1.0" 498 | 499 | "fd-slicer@~1.0.1": 500 | "integrity" "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=" 501 | "resolved" "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz" 502 | "version" "1.0.1" 503 | dependencies: 504 | "pend" "~1.2.0" 505 | 506 | "file-url@^2.0.0": 507 | "integrity" "sha1-6VF4TXkJUSfTcTApqwY/QIGMoq4=" 508 | "resolved" "https://registry.npmjs.org/file-url/-/file-url-2.0.2.tgz" 509 | "version" "2.0.2" 510 | 511 | "finalhandler@~1.1.2": 512 | "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==" 513 | "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" 514 | "version" "1.1.2" 515 | dependencies: 516 | "debug" "2.6.9" 517 | "encodeurl" "~1.0.2" 518 | "escape-html" "~1.0.3" 519 | "on-finished" "~2.3.0" 520 | "parseurl" "~1.3.3" 521 | "statuses" "~1.5.0" 522 | "unpipe" "~1.0.0" 523 | 524 | "find-up@^1.0.0": 525 | "integrity" "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=" 526 | "resolved" "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" 527 | "version" "1.1.2" 528 | dependencies: 529 | "path-exists" "^2.0.0" 530 | "pinkie-promise" "^2.0.0" 531 | 532 | "find-up@^3.0.0", "find-up@3.0.0": 533 | "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" 534 | "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" 535 | "version" "3.0.0" 536 | dependencies: 537 | "locate-path" "^3.0.0" 538 | 539 | "flat@^4.1.0": 540 | "integrity" "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==" 541 | "resolved" "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz" 542 | "version" "4.1.0" 543 | dependencies: 544 | "is-buffer" "~2.0.3" 545 | 546 | "forever-agent@~0.6.1": 547 | "integrity" "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 548 | "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" 549 | "version" "0.6.1" 550 | 551 | "form-data@^2.3.1": 552 | "integrity" "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==" 553 | "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz" 554 | "version" "2.5.1" 555 | dependencies: 556 | "asynckit" "^0.4.0" 557 | "combined-stream" "^1.0.6" 558 | "mime-types" "^2.1.12" 559 | 560 | "form-data@~2.3.2": 561 | "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==" 562 | "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" 563 | "version" "2.3.3" 564 | dependencies: 565 | "asynckit" "^0.4.0" 566 | "combined-stream" "^1.0.6" 567 | "mime-types" "^2.1.12" 568 | 569 | "formidable@^1.2.0": 570 | "integrity" "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==" 571 | "resolved" "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz" 572 | "version" "1.2.2" 573 | 574 | "forwarded@~0.1.2": 575 | "integrity" "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 576 | "resolved" "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz" 577 | "version" "0.1.2" 578 | 579 | "fresh@0.5.2": 580 | "integrity" "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 581 | "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" 582 | "version" "0.5.2" 583 | 584 | "fs-extra@^1.0.0": 585 | "integrity" "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=" 586 | "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz" 587 | "version" "1.0.0" 588 | dependencies: 589 | "graceful-fs" "^4.1.2" 590 | "jsonfile" "^2.1.0" 591 | "klaw" "^1.0.0" 592 | 593 | "fs.realpath@^1.0.0": 594 | "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 595 | "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 596 | "version" "1.0.0" 597 | 598 | "function-bind@^1.1.1": 599 | "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 600 | "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 601 | "version" "1.1.1" 602 | 603 | "get-caller-file@^1.0.1": 604 | "integrity" "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" 605 | "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz" 606 | "version" "1.0.3" 607 | 608 | "get-caller-file@^2.0.1": 609 | "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 610 | "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 611 | "version" "2.0.5" 612 | 613 | "get-func-name@^2.0.0": 614 | "integrity" "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" 615 | "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" 616 | "version" "2.0.0" 617 | 618 | "getpass@^0.1.1": 619 | "integrity" "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=" 620 | "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" 621 | "version" "0.1.7" 622 | dependencies: 623 | "assert-plus" "^1.0.0" 624 | 625 | "glob@7.1.3": 626 | "integrity" "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==" 627 | "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz" 628 | "version" "7.1.3" 629 | dependencies: 630 | "fs.realpath" "^1.0.0" 631 | "inflight" "^1.0.4" 632 | "inherits" "2" 633 | "minimatch" "^3.0.4" 634 | "once" "^1.3.0" 635 | "path-is-absolute" "^1.0.0" 636 | 637 | "graceful-fs@^4.1.2", "graceful-fs@^4.1.6", "graceful-fs@^4.1.9": 638 | "integrity" "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" 639 | "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz" 640 | "version" "4.2.3" 641 | 642 | "growl@1.10.5": 643 | "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" 644 | "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" 645 | "version" "1.10.5" 646 | 647 | "har-schema@^2.0.0": 648 | "integrity" "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 649 | "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" 650 | "version" "2.0.0" 651 | 652 | "har-validator@~5.1.3": 653 | "integrity" "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==" 654 | "resolved" "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz" 655 | "version" "5.1.3" 656 | dependencies: 657 | "ajv" "^6.5.5" 658 | "har-schema" "^2.0.0" 659 | 660 | "has-flag@^3.0.0": 661 | "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 662 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 663 | "version" "3.0.0" 664 | 665 | "has-symbols@^1.0.0", "has-symbols@^1.0.1": 666 | "integrity" "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 667 | "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz" 668 | "version" "1.0.1" 669 | 670 | "has@^1.0.3": 671 | "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" 672 | "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 673 | "version" "1.0.3" 674 | dependencies: 675 | "function-bind" "^1.1.1" 676 | 677 | "hasha@^2.2.0": 678 | "integrity" "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=" 679 | "resolved" "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz" 680 | "version" "2.2.0" 681 | dependencies: 682 | "is-stream" "^1.0.1" 683 | "pinkie-promise" "^2.0.0" 684 | 685 | "he@1.2.0": 686 | "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 687 | "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" 688 | "version" "1.2.0" 689 | 690 | "hosted-git-info@^2.1.4": 691 | "integrity" "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" 692 | "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz" 693 | "version" "2.8.8" 694 | 695 | "http-errors@~1.7.2": 696 | "integrity" "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==" 697 | "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz" 698 | "version" "1.7.3" 699 | dependencies: 700 | "depd" "~1.1.2" 701 | "inherits" "2.0.4" 702 | "setprototypeof" "1.1.1" 703 | "statuses" ">= 1.5.0 < 2" 704 | "toidentifier" "1.0.0" 705 | 706 | "http-errors@1.7.2": 707 | "integrity" "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==" 708 | "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz" 709 | "version" "1.7.2" 710 | dependencies: 711 | "depd" "~1.1.2" 712 | "inherits" "2.0.3" 713 | "setprototypeof" "1.1.1" 714 | "statuses" ">= 1.5.0 < 2" 715 | "toidentifier" "1.0.0" 716 | 717 | "http-signature@~1.2.0": 718 | "integrity" "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=" 719 | "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" 720 | "version" "1.2.0" 721 | dependencies: 722 | "assert-plus" "^1.0.0" 723 | "jsprim" "^1.2.2" 724 | "sshpk" "^1.7.0" 725 | 726 | "iconv-lite@0.4.24": 727 | "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" 728 | "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" 729 | "version" "0.4.24" 730 | dependencies: 731 | "safer-buffer" ">= 2.1.2 < 3" 732 | 733 | "inflight@^1.0.4": 734 | "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" 735 | "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 736 | "version" "1.0.6" 737 | dependencies: 738 | "once" "^1.3.0" 739 | "wrappy" "1" 740 | 741 | "inherits@^2.0.3", "inherits@~2.0.3", "inherits@2", "inherits@2.0.4": 742 | "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 743 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 744 | "version" "2.0.4" 745 | 746 | "inherits@2.0.3": 747 | "integrity" "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 748 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 749 | "version" "2.0.3" 750 | 751 | "invert-kv@^1.0.0": 752 | "integrity" "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 753 | "resolved" "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" 754 | "version" "1.0.0" 755 | 756 | "ipaddr.js@1.9.1": 757 | "integrity" "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 758 | "resolved" "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" 759 | "version" "1.9.1" 760 | 761 | "is-arrayish@^0.2.1": 762 | "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 763 | "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" 764 | "version" "0.2.1" 765 | 766 | "is-buffer@~2.0.3": 767 | "integrity" "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" 768 | "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz" 769 | "version" "2.0.4" 770 | 771 | "is-callable@^1.1.4", "is-callable@^1.1.5": 772 | "integrity" "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==" 773 | "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz" 774 | "version" "1.1.5" 775 | 776 | "is-date-object@^1.0.1": 777 | "integrity" "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==" 778 | "resolved" "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz" 779 | "version" "1.0.2" 780 | 781 | "is-fullwidth-code-point@^1.0.0": 782 | "integrity" "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=" 783 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" 784 | "version" "1.0.0" 785 | dependencies: 786 | "number-is-nan" "^1.0.0" 787 | 788 | "is-fullwidth-code-point@^2.0.0": 789 | "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 790 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" 791 | "version" "2.0.0" 792 | 793 | "is-regex@^1.0.5": 794 | "integrity" "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==" 795 | "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz" 796 | "version" "1.0.5" 797 | dependencies: 798 | "has" "^1.0.3" 799 | 800 | "is-stream@^1.0.1": 801 | "integrity" "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 802 | "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" 803 | "version" "1.1.0" 804 | 805 | "is-symbol@^1.0.2": 806 | "integrity" "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==" 807 | "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz" 808 | "version" "1.0.3" 809 | dependencies: 810 | "has-symbols" "^1.0.1" 811 | 812 | "is-typedarray@~1.0.0": 813 | "integrity" "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 814 | "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" 815 | "version" "1.0.0" 816 | 817 | "is-utf8@^0.2.0": 818 | "integrity" "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 819 | "resolved" "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" 820 | "version" "0.2.1" 821 | 822 | "isarray@~1.0.0": 823 | "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 824 | "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" 825 | "version" "1.0.0" 826 | 827 | "isexe@^2.0.0": 828 | "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 829 | "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 830 | "version" "2.0.0" 831 | 832 | "isstream@~0.1.2": 833 | "integrity" "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 834 | "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" 835 | "version" "0.1.2" 836 | 837 | "js-yaml@3.13.1": 838 | "integrity" "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==" 839 | "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz" 840 | "version" "3.13.1" 841 | dependencies: 842 | "argparse" "^1.0.7" 843 | "esprima" "^4.0.0" 844 | 845 | "jsbn@~0.1.0": 846 | "integrity" "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 847 | "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" 848 | "version" "0.1.1" 849 | 850 | "json-schema-traverse@^0.4.1": 851 | "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 852 | "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 853 | "version" "0.4.1" 854 | 855 | "json-schema@0.2.3": 856 | "integrity" "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 857 | "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" 858 | "version" "0.2.3" 859 | 860 | "json-stringify-safe@~5.0.1": 861 | "integrity" "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 862 | "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" 863 | "version" "5.0.1" 864 | 865 | "jsonfile@^2.1.0": 866 | "integrity" "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=" 867 | "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" 868 | "version" "2.4.0" 869 | optionalDependencies: 870 | "graceful-fs" "^4.1.6" 871 | 872 | "jsprim@^1.2.2": 873 | "integrity" "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=" 874 | "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz" 875 | "version" "1.4.1" 876 | dependencies: 877 | "assert-plus" "1.0.0" 878 | "extsprintf" "1.3.0" 879 | "json-schema" "0.2.3" 880 | "verror" "1.10.0" 881 | 882 | "kew@^0.7.0": 883 | "integrity" "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" 884 | "resolved" "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz" 885 | "version" "0.7.0" 886 | 887 | "klaw@^1.0.0": 888 | "integrity" "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=" 889 | "resolved" "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" 890 | "version" "1.3.1" 891 | optionalDependencies: 892 | "graceful-fs" "^4.1.9" 893 | 894 | "lcid@^1.0.0": 895 | "integrity" "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=" 896 | "resolved" "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" 897 | "version" "1.0.0" 898 | dependencies: 899 | "invert-kv" "^1.0.0" 900 | 901 | "load-json-file@^1.0.0": 902 | "integrity" "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=" 903 | "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" 904 | "version" "1.1.0" 905 | dependencies: 906 | "graceful-fs" "^4.1.2" 907 | "parse-json" "^2.2.0" 908 | "pify" "^2.0.0" 909 | "pinkie-promise" "^2.0.0" 910 | "strip-bom" "^2.0.0" 911 | 912 | "locate-path@^3.0.0": 913 | "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" 914 | "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" 915 | "version" "3.0.0" 916 | dependencies: 917 | "p-locate" "^3.0.0" 918 | "path-exists" "^3.0.0" 919 | 920 | "lodash@^4.17.15": 921 | "integrity" "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 922 | "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz" 923 | "version" "4.17.15" 924 | 925 | "log-symbols@2.2.0": 926 | "integrity" "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==" 927 | "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz" 928 | "version" "2.2.0" 929 | dependencies: 930 | "chalk" "^2.0.1" 931 | 932 | "mathjax@^3.2.0": 933 | "integrity" "sha512-PL+rdYRK4Wxif+SQ94zP/L0sv6/oW/1WdQiIx0Jvn9FZaU5W9E6nlIv8liYAXBNPL2Fw/i+o/mZ1212eSzn0Cw==" 934 | "resolved" "https://registry.npmjs.org/mathjax/-/mathjax-3.2.0.tgz" 935 | "version" "3.2.0" 936 | 937 | "media-typer@0.3.0": 938 | "integrity" "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 939 | "resolved" "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" 940 | "version" "0.3.0" 941 | 942 | "merge-descriptors@1.0.1": 943 | "integrity" "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 944 | "resolved" "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" 945 | "version" "1.0.1" 946 | 947 | "methods@^1.1.1", "methods@^1.1.2", "methods@~1.1.2": 948 | "integrity" "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 949 | "resolved" "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" 950 | "version" "1.1.2" 951 | 952 | "mime-db@1.43.0": 953 | "integrity" "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" 954 | "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz" 955 | "version" "1.43.0" 956 | 957 | "mime-types@^2.1.12", "mime-types@~2.1.19", "mime-types@~2.1.24": 958 | "integrity" "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==" 959 | "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz" 960 | "version" "2.1.26" 961 | dependencies: 962 | "mime-db" "1.43.0" 963 | 964 | "mime@^1.4.1", "mime@1.6.0": 965 | "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 966 | "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" 967 | "version" "1.6.0" 968 | 969 | "minimatch@^3.0.4", "minimatch@3.0.4": 970 | "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" 971 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 972 | "version" "3.0.4" 973 | dependencies: 974 | "brace-expansion" "^1.1.7" 975 | 976 | "minimist@0.0.8": 977 | "integrity" "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 978 | "resolved" "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" 979 | "version" "0.0.8" 980 | 981 | "mkdirp@0.5.1": 982 | "integrity" "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=" 983 | "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" 984 | "version" "0.5.1" 985 | dependencies: 986 | "minimist" "0.0.8" 987 | 988 | "mocha@^6.1.4": 989 | "integrity" "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==" 990 | "resolved" "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz" 991 | "version" "6.2.2" 992 | dependencies: 993 | "ansi-colors" "3.2.3" 994 | "browser-stdout" "1.3.1" 995 | "debug" "3.2.6" 996 | "diff" "3.5.0" 997 | "escape-string-regexp" "1.0.5" 998 | "find-up" "3.0.0" 999 | "glob" "7.1.3" 1000 | "growl" "1.10.5" 1001 | "he" "1.2.0" 1002 | "js-yaml" "3.13.1" 1003 | "log-symbols" "2.2.0" 1004 | "minimatch" "3.0.4" 1005 | "mkdirp" "0.5.1" 1006 | "ms" "2.1.1" 1007 | "node-environment-flags" "1.0.5" 1008 | "object.assign" "4.1.0" 1009 | "strip-json-comments" "2.0.1" 1010 | "supports-color" "6.0.0" 1011 | "which" "1.3.1" 1012 | "wide-align" "1.1.3" 1013 | "yargs" "13.3.0" 1014 | "yargs-parser" "13.1.1" 1015 | "yargs-unparser" "1.6.0" 1016 | 1017 | "ms@^2.1.1": 1018 | "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1019 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1020 | "version" "2.1.2" 1021 | 1022 | "ms@2.0.0": 1023 | "integrity" "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1024 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 1025 | "version" "2.0.0" 1026 | 1027 | "ms@2.1.1": 1028 | "integrity" "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1029 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" 1030 | "version" "2.1.1" 1031 | 1032 | "negotiator@0.6.2": 1033 | "integrity" "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 1034 | "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" 1035 | "version" "0.6.2" 1036 | 1037 | "node-environment-flags@1.0.5": 1038 | "integrity" "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==" 1039 | "resolved" "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz" 1040 | "version" "1.0.5" 1041 | dependencies: 1042 | "object.getownpropertydescriptors" "^2.0.3" 1043 | "semver" "^5.7.0" 1044 | 1045 | "normalize-package-data@^2.3.2": 1046 | "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" 1047 | "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" 1048 | "version" "2.5.0" 1049 | dependencies: 1050 | "hosted-git-info" "^2.1.4" 1051 | "resolve" "^1.10.0" 1052 | "semver" "2 || 3 || 4 || 5" 1053 | "validate-npm-package-license" "^3.0.1" 1054 | 1055 | "number-is-nan@^1.0.0": 1056 | "integrity" "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1057 | "resolved" "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" 1058 | "version" "1.0.1" 1059 | 1060 | "oauth-sign@~0.9.0": 1061 | "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 1062 | "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" 1063 | "version" "0.9.0" 1064 | 1065 | "object-inspect@^1.7.0": 1066 | "integrity" "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" 1067 | "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz" 1068 | "version" "1.7.0" 1069 | 1070 | "object-keys@^1.0.11", "object-keys@^1.0.12", "object-keys@^1.1.1": 1071 | "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 1072 | "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" 1073 | "version" "1.1.1" 1074 | 1075 | "object.assign@^4.1.0", "object.assign@4.1.0": 1076 | "integrity" "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==" 1077 | "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz" 1078 | "version" "4.1.0" 1079 | dependencies: 1080 | "define-properties" "^1.1.2" 1081 | "function-bind" "^1.1.1" 1082 | "has-symbols" "^1.0.0" 1083 | "object-keys" "^1.0.11" 1084 | 1085 | "object.getownpropertydescriptors@^2.0.3": 1086 | "integrity" "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==" 1087 | "resolved" "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz" 1088 | "version" "2.1.0" 1089 | dependencies: 1090 | "define-properties" "^1.1.3" 1091 | "es-abstract" "^1.17.0-next.1" 1092 | 1093 | "on-finished@~2.3.0": 1094 | "integrity" "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" 1095 | "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" 1096 | "version" "2.3.0" 1097 | dependencies: 1098 | "ee-first" "1.1.1" 1099 | 1100 | "once@^1.3.0": 1101 | "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 1102 | "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1103 | "version" "1.4.0" 1104 | dependencies: 1105 | "wrappy" "1" 1106 | 1107 | "os-locale@^1.4.0": 1108 | "integrity" "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=" 1109 | "resolved" "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" 1110 | "version" "1.4.0" 1111 | dependencies: 1112 | "lcid" "^1.0.0" 1113 | 1114 | "p-limit@^2.0.0": 1115 | "integrity" "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==" 1116 | "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz" 1117 | "version" "2.2.2" 1118 | dependencies: 1119 | "p-try" "^2.0.0" 1120 | 1121 | "p-locate@^3.0.0": 1122 | "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" 1123 | "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" 1124 | "version" "3.0.0" 1125 | dependencies: 1126 | "p-limit" "^2.0.0" 1127 | 1128 | "p-try@^2.0.0": 1129 | "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 1130 | "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" 1131 | "version" "2.2.0" 1132 | 1133 | "parse-json@^2.2.0": 1134 | "integrity" "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" 1135 | "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" 1136 | "version" "2.2.0" 1137 | dependencies: 1138 | "error-ex" "^1.2.0" 1139 | 1140 | "parseurl@~1.3.3": 1141 | "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1142 | "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" 1143 | "version" "1.3.3" 1144 | 1145 | "path-exists@^2.0.0": 1146 | "integrity" "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=" 1147 | "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" 1148 | "version" "2.1.0" 1149 | dependencies: 1150 | "pinkie-promise" "^2.0.0" 1151 | 1152 | "path-exists@^3.0.0": 1153 | "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1154 | "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" 1155 | "version" "3.0.0" 1156 | 1157 | "path-is-absolute@^1.0.0": 1158 | "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1159 | "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1160 | "version" "1.0.1" 1161 | 1162 | "path-parse@^1.0.6": 1163 | "integrity" "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1164 | "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" 1165 | "version" "1.0.6" 1166 | 1167 | "path-to-regexp@0.1.7": 1168 | "integrity" "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1169 | "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" 1170 | "version" "0.1.7" 1171 | 1172 | "path-type@^1.0.0": 1173 | "integrity" "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=" 1174 | "resolved" "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" 1175 | "version" "1.1.0" 1176 | dependencies: 1177 | "graceful-fs" "^4.1.2" 1178 | "pify" "^2.0.0" 1179 | "pinkie-promise" "^2.0.0" 1180 | 1181 | "pathval@^1.1.0": 1182 | "integrity" "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" 1183 | "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz" 1184 | "version" "1.1.0" 1185 | 1186 | "pend@~1.2.0": 1187 | "integrity" "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 1188 | "resolved" "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" 1189 | "version" "1.2.0" 1190 | 1191 | "performance-now@^2.1.0": 1192 | "integrity" "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1193 | "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" 1194 | "version" "2.1.0" 1195 | 1196 | "phantomjs-prebuilt@^2.1.14": 1197 | "integrity" "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=" 1198 | "resolved" "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz" 1199 | "version" "2.1.16" 1200 | dependencies: 1201 | "es6-promise" "^4.0.3" 1202 | "extract-zip" "^1.6.5" 1203 | "fs-extra" "^1.0.0" 1204 | "hasha" "^2.2.0" 1205 | "kew" "^0.7.0" 1206 | "progress" "^1.1.8" 1207 | "request" "^2.81.0" 1208 | "request-progress" "^2.0.1" 1209 | "which" "^1.2.10" 1210 | 1211 | "pify@^2.0.0": 1212 | "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 1213 | "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" 1214 | "version" "2.3.0" 1215 | 1216 | "pinkie-promise@^2.0.0": 1217 | "integrity" "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" 1218 | "resolved" "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" 1219 | "version" "2.0.1" 1220 | dependencies: 1221 | "pinkie" "^2.0.0" 1222 | 1223 | "pinkie@^2.0.0": 1224 | "integrity" "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1225 | "resolved" "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" 1226 | "version" "2.0.4" 1227 | 1228 | "pn@^1.0.0": 1229 | "integrity" "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" 1230 | "resolved" "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz" 1231 | "version" "1.1.0" 1232 | 1233 | "process-nextick-args@~2.0.0": 1234 | "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1235 | "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" 1236 | "version" "2.0.1" 1237 | 1238 | "progress@^1.1.8": 1239 | "integrity" "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" 1240 | "resolved" "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz" 1241 | "version" "1.1.8" 1242 | 1243 | "proxy-addr@~2.0.5": 1244 | "integrity" "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==" 1245 | "resolved" "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz" 1246 | "version" "2.0.6" 1247 | dependencies: 1248 | "forwarded" "~0.1.2" 1249 | "ipaddr.js" "1.9.1" 1250 | 1251 | "psl@^1.1.28": 1252 | "integrity" "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==" 1253 | "resolved" "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz" 1254 | "version" "1.7.0" 1255 | 1256 | "punycode@^2.1.0", "punycode@^2.1.1": 1257 | "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1258 | "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" 1259 | "version" "2.1.1" 1260 | 1261 | "qs@^6.5.1": 1262 | "integrity" "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA==" 1263 | "resolved" "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz" 1264 | "version" "6.9.1" 1265 | 1266 | "qs@~6.5.2": 1267 | "integrity" "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1268 | "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" 1269 | "version" "6.5.2" 1270 | 1271 | "qs@6.7.0": 1272 | "integrity" "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1273 | "resolved" "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz" 1274 | "version" "6.7.0" 1275 | 1276 | "range-parser@~1.2.1": 1277 | "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1278 | "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" 1279 | "version" "1.2.1" 1280 | 1281 | "raw-body@2.4.0": 1282 | "integrity" "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==" 1283 | "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz" 1284 | "version" "2.4.0" 1285 | dependencies: 1286 | "bytes" "3.1.0" 1287 | "http-errors" "1.7.2" 1288 | "iconv-lite" "0.4.24" 1289 | "unpipe" "1.0.0" 1290 | 1291 | "read-pkg-up@^1.0.1": 1292 | "integrity" "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=" 1293 | "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" 1294 | "version" "1.0.1" 1295 | dependencies: 1296 | "find-up" "^1.0.0" 1297 | "read-pkg" "^1.0.0" 1298 | 1299 | "read-pkg@^1.0.0": 1300 | "integrity" "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=" 1301 | "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" 1302 | "version" "1.1.0" 1303 | dependencies: 1304 | "load-json-file" "^1.0.0" 1305 | "normalize-package-data" "^2.3.2" 1306 | "path-type" "^1.0.0" 1307 | 1308 | "readable-stream@^2.2.2", "readable-stream@^2.3.5": 1309 | "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" 1310 | "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" 1311 | "version" "2.3.7" 1312 | dependencies: 1313 | "core-util-is" "~1.0.0" 1314 | "inherits" "~2.0.3" 1315 | "isarray" "~1.0.0" 1316 | "process-nextick-args" "~2.0.0" 1317 | "safe-buffer" "~5.1.1" 1318 | "string_decoder" "~1.1.1" 1319 | "util-deprecate" "~1.0.1" 1320 | 1321 | "request-progress@^2.0.1": 1322 | "integrity" "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=" 1323 | "resolved" "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz" 1324 | "version" "2.0.1" 1325 | dependencies: 1326 | "throttleit" "^1.0.0" 1327 | 1328 | "request@^2.81.0": 1329 | "integrity" "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==" 1330 | "resolved" "https://registry.npmjs.org/request/-/request-2.88.2.tgz" 1331 | "version" "2.88.2" 1332 | dependencies: 1333 | "aws-sign2" "~0.7.0" 1334 | "aws4" "^1.8.0" 1335 | "caseless" "~0.12.0" 1336 | "combined-stream" "~1.0.6" 1337 | "extend" "~3.0.2" 1338 | "forever-agent" "~0.6.1" 1339 | "form-data" "~2.3.2" 1340 | "har-validator" "~5.1.3" 1341 | "http-signature" "~1.2.0" 1342 | "is-typedarray" "~1.0.0" 1343 | "isstream" "~0.1.2" 1344 | "json-stringify-safe" "~5.0.1" 1345 | "mime-types" "~2.1.19" 1346 | "oauth-sign" "~0.9.0" 1347 | "performance-now" "^2.1.0" 1348 | "qs" "~6.5.2" 1349 | "safe-buffer" "^5.1.2" 1350 | "tough-cookie" "~2.5.0" 1351 | "tunnel-agent" "^0.6.0" 1352 | "uuid" "^3.3.2" 1353 | 1354 | "require-directory@^2.1.1": 1355 | "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1356 | "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 1357 | "version" "2.1.1" 1358 | 1359 | "require-main-filename@^1.0.1": 1360 | "integrity" "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 1361 | "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" 1362 | "version" "1.0.1" 1363 | 1364 | "require-main-filename@^2.0.0": 1365 | "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1366 | "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" 1367 | "version" "2.0.0" 1368 | 1369 | "resolve@^1.10.0": 1370 | "integrity" "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==" 1371 | "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz" 1372 | "version" "1.15.1" 1373 | dependencies: 1374 | "path-parse" "^1.0.6" 1375 | 1376 | "safe-buffer@^5.0.1": 1377 | "integrity" "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 1378 | "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz" 1379 | "version" "5.2.0" 1380 | 1381 | "safe-buffer@^5.1.2": 1382 | "integrity" "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" 1383 | "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz" 1384 | "version" "5.2.0" 1385 | 1386 | "safe-buffer@~5.1.0", "safe-buffer@~5.1.1", "safe-buffer@5.1.2": 1387 | "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1388 | "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" 1389 | "version" "5.1.2" 1390 | 1391 | "safer-buffer@^2.0.2", "safer-buffer@^2.1.0", "safer-buffer@>= 2.1.2 < 3", "safer-buffer@~2.1.0": 1392 | "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1393 | "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 1394 | "version" "2.1.2" 1395 | 1396 | "semver@^5.7.0", "semver@2 || 3 || 4 || 5": 1397 | "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1398 | "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" 1399 | "version" "5.7.1" 1400 | 1401 | "send@0.17.1": 1402 | "integrity" "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==" 1403 | "resolved" "https://registry.npmjs.org/send/-/send-0.17.1.tgz" 1404 | "version" "0.17.1" 1405 | dependencies: 1406 | "debug" "2.6.9" 1407 | "depd" "~1.1.2" 1408 | "destroy" "~1.0.4" 1409 | "encodeurl" "~1.0.2" 1410 | "escape-html" "~1.0.3" 1411 | "etag" "~1.8.1" 1412 | "fresh" "0.5.2" 1413 | "http-errors" "~1.7.2" 1414 | "mime" "1.6.0" 1415 | "ms" "2.1.1" 1416 | "on-finished" "~2.3.0" 1417 | "range-parser" "~1.2.1" 1418 | "statuses" "~1.5.0" 1419 | 1420 | "serve-static@1.14.1": 1421 | "integrity" "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==" 1422 | "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz" 1423 | "version" "1.14.1" 1424 | dependencies: 1425 | "encodeurl" "~1.0.2" 1426 | "escape-html" "~1.0.3" 1427 | "parseurl" "~1.3.3" 1428 | "send" "0.17.1" 1429 | 1430 | "set-blocking@^2.0.0": 1431 | "integrity" "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1432 | "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" 1433 | "version" "2.0.0" 1434 | 1435 | "setprototypeof@1.1.1": 1436 | "integrity" "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1437 | "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz" 1438 | "version" "1.1.1" 1439 | 1440 | "spdx-correct@^3.0.0": 1441 | "integrity" "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==" 1442 | "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz" 1443 | "version" "3.1.0" 1444 | dependencies: 1445 | "spdx-expression-parse" "^3.0.0" 1446 | "spdx-license-ids" "^3.0.0" 1447 | 1448 | "spdx-exceptions@^2.1.0": 1449 | "integrity" "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 1450 | "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz" 1451 | "version" "2.2.0" 1452 | 1453 | "spdx-expression-parse@^3.0.0": 1454 | "integrity" "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==" 1455 | "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz" 1456 | "version" "3.0.0" 1457 | dependencies: 1458 | "spdx-exceptions" "^2.1.0" 1459 | "spdx-license-ids" "^3.0.0" 1460 | 1461 | "spdx-license-ids@^3.0.0": 1462 | "integrity" "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" 1463 | "resolved" "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz" 1464 | "version" "3.0.5" 1465 | 1466 | "sprintf-js@~1.0.2": 1467 | "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1468 | "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 1469 | "version" "1.0.3" 1470 | 1471 | "sshpk@^1.7.0": 1472 | "integrity" "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==" 1473 | "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz" 1474 | "version" "1.16.1" 1475 | dependencies: 1476 | "asn1" "~0.2.3" 1477 | "assert-plus" "^1.0.0" 1478 | "bcrypt-pbkdf" "^1.0.0" 1479 | "dashdash" "^1.12.0" 1480 | "ecc-jsbn" "~0.1.1" 1481 | "getpass" "^0.1.1" 1482 | "jsbn" "~0.1.0" 1483 | "safer-buffer" "^2.0.2" 1484 | "tweetnacl" "~0.14.0" 1485 | 1486 | "statuses@>= 1.5.0 < 2", "statuses@~1.5.0": 1487 | "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1488 | "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" 1489 | "version" "1.5.0" 1490 | 1491 | "string_decoder@~1.1.1": 1492 | "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" 1493 | "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" 1494 | "version" "1.1.1" 1495 | dependencies: 1496 | "safe-buffer" "~5.1.0" 1497 | 1498 | "string-width@^1.0.1", "string-width@^1.0.2": 1499 | "integrity" "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=" 1500 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" 1501 | "version" "1.0.2" 1502 | dependencies: 1503 | "code-point-at" "^1.0.0" 1504 | "is-fullwidth-code-point" "^1.0.0" 1505 | "strip-ansi" "^3.0.0" 1506 | 1507 | "string-width@^1.0.2 || 2": 1508 | "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" 1509 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" 1510 | "version" "2.1.1" 1511 | dependencies: 1512 | "is-fullwidth-code-point" "^2.0.0" 1513 | "strip-ansi" "^4.0.0" 1514 | 1515 | "string-width@^3.0.0", "string-width@^3.1.0": 1516 | "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" 1517 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" 1518 | "version" "3.1.0" 1519 | dependencies: 1520 | "emoji-regex" "^7.0.1" 1521 | "is-fullwidth-code-point" "^2.0.0" 1522 | "strip-ansi" "^5.1.0" 1523 | 1524 | "string.prototype.trimleft@^2.1.1": 1525 | "integrity" "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==" 1526 | "resolved" "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz" 1527 | "version" "2.1.1" 1528 | dependencies: 1529 | "define-properties" "^1.1.3" 1530 | "function-bind" "^1.1.1" 1531 | 1532 | "string.prototype.trimright@^2.1.1": 1533 | "integrity" "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==" 1534 | "resolved" "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz" 1535 | "version" "2.1.1" 1536 | dependencies: 1537 | "define-properties" "^1.1.3" 1538 | "function-bind" "^1.1.1" 1539 | 1540 | "strip-ansi@^3.0.0", "strip-ansi@^3.0.1": 1541 | "integrity" "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" 1542 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" 1543 | "version" "3.0.1" 1544 | dependencies: 1545 | "ansi-regex" "^2.0.0" 1546 | 1547 | "strip-ansi@^4.0.0": 1548 | "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" 1549 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" 1550 | "version" "4.0.0" 1551 | dependencies: 1552 | "ansi-regex" "^3.0.0" 1553 | 1554 | "strip-ansi@^5.0.0": 1555 | "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" 1556 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" 1557 | "version" "5.2.0" 1558 | dependencies: 1559 | "ansi-regex" "^4.1.0" 1560 | 1561 | "strip-ansi@^5.1.0": 1562 | "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" 1563 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" 1564 | "version" "5.2.0" 1565 | dependencies: 1566 | "ansi-regex" "^4.1.0" 1567 | 1568 | "strip-ansi@^5.2.0": 1569 | "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" 1570 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" 1571 | "version" "5.2.0" 1572 | dependencies: 1573 | "ansi-regex" "^4.1.0" 1574 | 1575 | "strip-bom@^2.0.0": 1576 | "integrity" "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=" 1577 | "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" 1578 | "version" "2.0.0" 1579 | dependencies: 1580 | "is-utf8" "^0.2.0" 1581 | 1582 | "strip-json-comments@2.0.1": 1583 | "integrity" "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1584 | "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" 1585 | "version" "2.0.1" 1586 | 1587 | "superagent@^3.8.3": 1588 | "integrity" "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==" 1589 | "resolved" "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz" 1590 | "version" "3.8.3" 1591 | dependencies: 1592 | "component-emitter" "^1.2.0" 1593 | "cookiejar" "^2.1.0" 1594 | "debug" "^3.1.0" 1595 | "extend" "^3.0.0" 1596 | "form-data" "^2.3.1" 1597 | "formidable" "^1.2.0" 1598 | "methods" "^1.1.1" 1599 | "mime" "^1.4.1" 1600 | "qs" "^6.5.1" 1601 | "readable-stream" "^2.3.5" 1602 | 1603 | "supertest@^4.0.2": 1604 | "integrity" "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==" 1605 | "resolved" "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz" 1606 | "version" "4.0.2" 1607 | dependencies: 1608 | "methods" "^1.1.2" 1609 | "superagent" "^3.8.3" 1610 | 1611 | "supports-color@^5.3.0": 1612 | "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" 1613 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1614 | "version" "5.5.0" 1615 | dependencies: 1616 | "has-flag" "^3.0.0" 1617 | 1618 | "supports-color@6.0.0": 1619 | "integrity" "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==" 1620 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz" 1621 | "version" "6.0.0" 1622 | dependencies: 1623 | "has-flag" "^3.0.0" 1624 | 1625 | "svg2png@^4.1.1": 1626 | "integrity" "sha1-a54DmKpBh3i2Q24Sei+38A1JnCg=" 1627 | "resolved" "https://registry.npmjs.org/svg2png/-/svg2png-4.1.1.tgz" 1628 | "version" "4.1.1" 1629 | dependencies: 1630 | "file-url" "^2.0.0" 1631 | "phantomjs-prebuilt" "^2.1.14" 1632 | "pn" "^1.0.0" 1633 | "yargs" "^6.5.0" 1634 | 1635 | "throttleit@^1.0.0": 1636 | "integrity" "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" 1637 | "resolved" "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" 1638 | "version" "1.0.0" 1639 | 1640 | "toidentifier@1.0.0": 1641 | "integrity" "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1642 | "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz" 1643 | "version" "1.0.0" 1644 | 1645 | "tough-cookie@~2.5.0": 1646 | "integrity" "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==" 1647 | "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" 1648 | "version" "2.5.0" 1649 | dependencies: 1650 | "psl" "^1.1.28" 1651 | "punycode" "^2.1.1" 1652 | 1653 | "tunnel-agent@^0.6.0": 1654 | "integrity" "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=" 1655 | "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" 1656 | "version" "0.6.0" 1657 | dependencies: 1658 | "safe-buffer" "^5.0.1" 1659 | 1660 | "tweetnacl@^0.14.3", "tweetnacl@~0.14.0": 1661 | "integrity" "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1662 | "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" 1663 | "version" "0.14.5" 1664 | 1665 | "type-detect@^4.0.0", "type-detect@^4.0.5": 1666 | "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" 1667 | "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" 1668 | "version" "4.0.8" 1669 | 1670 | "type-is@~1.6.17", "type-is@~1.6.18": 1671 | "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" 1672 | "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" 1673 | "version" "1.6.18" 1674 | dependencies: 1675 | "media-typer" "0.3.0" 1676 | "mime-types" "~2.1.24" 1677 | 1678 | "typedarray@^0.0.6": 1679 | "integrity" "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1680 | "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" 1681 | "version" "0.0.6" 1682 | 1683 | "unpipe@~1.0.0", "unpipe@1.0.0": 1684 | "integrity" "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1685 | "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" 1686 | "version" "1.0.0" 1687 | 1688 | "uri-js@^4.2.2": 1689 | "integrity" "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==" 1690 | "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz" 1691 | "version" "4.2.2" 1692 | dependencies: 1693 | "punycode" "^2.1.0" 1694 | 1695 | "util-deprecate@~1.0.1": 1696 | "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1697 | "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" 1698 | "version" "1.0.2" 1699 | 1700 | "utils-merge@1.0.1": 1701 | "integrity" "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1702 | "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" 1703 | "version" "1.0.1" 1704 | 1705 | "uuid@^3.3.2": 1706 | "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 1707 | "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" 1708 | "version" "3.4.0" 1709 | 1710 | "validate-npm-package-license@^3.0.1": 1711 | "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==" 1712 | "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" 1713 | "version" "3.0.4" 1714 | dependencies: 1715 | "spdx-correct" "^3.0.0" 1716 | "spdx-expression-parse" "^3.0.0" 1717 | 1718 | "vary@~1.1.2": 1719 | "integrity" "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1720 | "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" 1721 | "version" "1.1.2" 1722 | 1723 | "verror@1.10.0": 1724 | "integrity" "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=" 1725 | "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" 1726 | "version" "1.10.0" 1727 | dependencies: 1728 | "assert-plus" "^1.0.0" 1729 | "core-util-is" "1.0.2" 1730 | "extsprintf" "^1.2.0" 1731 | 1732 | "which-module@^1.0.0": 1733 | "integrity" "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" 1734 | "resolved" "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" 1735 | "version" "1.0.0" 1736 | 1737 | "which-module@^2.0.0": 1738 | "integrity" "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 1739 | "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" 1740 | "version" "2.0.0" 1741 | 1742 | "which@^1.2.10", "which@1.3.1": 1743 | "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" 1744 | "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" 1745 | "version" "1.3.1" 1746 | dependencies: 1747 | "isexe" "^2.0.0" 1748 | 1749 | "wide-align@1.1.3": 1750 | "integrity" "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==" 1751 | "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" 1752 | "version" "1.1.3" 1753 | dependencies: 1754 | "string-width" "^1.0.2 || 2" 1755 | 1756 | "wrap-ansi@^2.0.0": 1757 | "integrity" "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=" 1758 | "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" 1759 | "version" "2.1.0" 1760 | dependencies: 1761 | "string-width" "^1.0.1" 1762 | "strip-ansi" "^3.0.1" 1763 | 1764 | "wrap-ansi@^5.1.0": 1765 | "integrity" "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==" 1766 | "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" 1767 | "version" "5.1.0" 1768 | dependencies: 1769 | "ansi-styles" "^3.2.0" 1770 | "string-width" "^3.0.0" 1771 | "strip-ansi" "^5.0.0" 1772 | 1773 | "wrappy@1": 1774 | "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1775 | "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1776 | "version" "1.0.2" 1777 | 1778 | "y18n@^3.2.1": 1779 | "integrity" "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 1780 | "resolved" "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz" 1781 | "version" "3.2.1" 1782 | 1783 | "y18n@^4.0.0": 1784 | "integrity" "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 1785 | "resolved" "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz" 1786 | "version" "4.0.0" 1787 | 1788 | "yargs-parser@^13.1.1", "yargs-parser@^13.1.2": 1789 | "integrity" "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==" 1790 | "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" 1791 | "version" "13.1.2" 1792 | dependencies: 1793 | "camelcase" "^5.0.0" 1794 | "decamelize" "^1.2.0" 1795 | 1796 | "yargs-parser@^4.2.0": 1797 | "integrity" "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=" 1798 | "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz" 1799 | "version" "4.2.1" 1800 | dependencies: 1801 | "camelcase" "^3.0.0" 1802 | 1803 | "yargs-parser@13.1.1": 1804 | "integrity" "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==" 1805 | "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz" 1806 | "version" "13.1.1" 1807 | dependencies: 1808 | "camelcase" "^5.0.0" 1809 | "decamelize" "^1.2.0" 1810 | 1811 | "yargs-unparser@1.6.0": 1812 | "integrity" "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==" 1813 | "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz" 1814 | "version" "1.6.0" 1815 | dependencies: 1816 | "flat" "^4.1.0" 1817 | "lodash" "^4.17.15" 1818 | "yargs" "^13.3.0" 1819 | 1820 | "yargs@^13.3.0": 1821 | "integrity" "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==" 1822 | "resolved" "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" 1823 | "version" "13.3.2" 1824 | dependencies: 1825 | "cliui" "^5.0.0" 1826 | "find-up" "^3.0.0" 1827 | "get-caller-file" "^2.0.1" 1828 | "require-directory" "^2.1.1" 1829 | "require-main-filename" "^2.0.0" 1830 | "set-blocking" "^2.0.0" 1831 | "string-width" "^3.0.0" 1832 | "which-module" "^2.0.0" 1833 | "y18n" "^4.0.0" 1834 | "yargs-parser" "^13.1.2" 1835 | 1836 | "yargs@^6.5.0": 1837 | "integrity" "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=" 1838 | "resolved" "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz" 1839 | "version" "6.6.0" 1840 | dependencies: 1841 | "camelcase" "^3.0.0" 1842 | "cliui" "^3.2.0" 1843 | "decamelize" "^1.1.1" 1844 | "get-caller-file" "^1.0.1" 1845 | "os-locale" "^1.4.0" 1846 | "read-pkg-up" "^1.0.1" 1847 | "require-directory" "^2.1.1" 1848 | "require-main-filename" "^1.0.1" 1849 | "set-blocking" "^2.0.0" 1850 | "string-width" "^1.0.2" 1851 | "which-module" "^1.0.0" 1852 | "y18n" "^3.2.1" 1853 | "yargs-parser" "^4.2.0" 1854 | 1855 | "yargs@13.3.0": 1856 | "integrity" "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==" 1857 | "resolved" "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz" 1858 | "version" "13.3.0" 1859 | dependencies: 1860 | "cliui" "^5.0.0" 1861 | "find-up" "^3.0.0" 1862 | "get-caller-file" "^2.0.1" 1863 | "require-directory" "^2.1.1" 1864 | "require-main-filename" "^2.0.0" 1865 | "set-blocking" "^2.0.0" 1866 | "string-width" "^3.0.0" 1867 | "which-module" "^2.0.0" 1868 | "y18n" "^4.0.0" 1869 | "yargs-parser" "^13.1.1" 1870 | 1871 | "yauzl@2.4.1": 1872 | "integrity" "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=" 1873 | "resolved" "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz" 1874 | "version" "2.4.1" 1875 | dependencies: 1876 | "fd-slicer" "~1.0.1" 1877 | --------------------------------------------------------------------------------