From ff08c44510b7ab9dc3479858dd00a4b4b34039da Mon Sep 17 00:00:00 2001 From: Robby Greenfield Date: Thu, 7 Jun 2018 10:09:33 +0200 Subject: [PATCH 01/38] update readme.md add basic detail on what serverless and AWS lambda are, as well as folder structure --- README.md | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 74917d3..4b6d186 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,76 @@ Lambda functions for verifying phone numbers [Diagrams](./diagrams/README.md) -# Description +## Repository Basics + +### Description Nisaba provides user verification for the uPort ecosystem. +### What is [AWS Lambda](https://aws.amazon.com/lambda/)? +AWS Lambda lets you run code without provisioning or managing servers. You pay only for the compute time you consume - there is no charge when your code is not running. + +With Lambda, you can run code for virtually any type of application or backend service - all with zero administration. Just upload your code and Lambda takes care of everything required to run and scale your code with high availability. You can set up your code to automatically trigger from other AWS services or call it directly from any web or mobile app. + +### What is [Serverless](https://serverless.com/learn/)? +Just like wireless internet has wires somewhere, serverless architectures still have servers somewhere. What ‘serverless’ really means is that, as a developer you don’t have to think about those servers. You just focus on code. + +### Serverless Architectures with AWS Lambda +Using AWS Lambda as the logic layer of a serverless application can enable faster development speed and greater experimentation – and innovation — than in a traditional, server-based environment. Many serverless applications can be fully functional with only a few lines of code and little else. + +Examples of fully-serverless-application use cases include: + +- Web or mobile backends – Create fully-serverless, mobile applications or websites by creating user-facing content in a native mobile application or static web content in an S3 bucket. Then have your front-end content integrate with Amazon API Gateway as a backend service API. Lambda functions will then execute the business logic you’ve written for each of the API Gateway methods in your backend API. +- Chatbots and virtual assistants – Build new serverless ways to interact with your customers, like customer support assistants and bots ready to engage customers on your company-run social media pages. The Amazon Alexa Skills Kit (ASK) and Amazon Lex have the ability to apply natural-language understanding to user-voice and freeform-text input so that a Lambda function you write can intelligently respond and engage with them. +- Internet of Things (IoT) backends – AWS IoT has direct-integration for device messages to be routed to and processed by Lambda functions. That means you can implement serverless backends for highly secure, scalable IoT applications for uses like connected consumer appliances and intelligent manufacturing facilities. +Using AWS Lambda as the logic layer of a serverless application can enable faster development speed and greater experimentation – and innovation — than in a traditional, server-based environment. + +To learn more about Serverless Architectures with AWS Lambda, check out [this publication](https://d1.awsstatic.com/whitepapers/serverless-architectures-with-aws-lambda.pdf) that goes through the whole build + +### So How Does this All Come Together w/ lambda-nisaba? +[To Be Continued] + +### How is the Repository Organized? +The following list breakdown the folder architecture within the repository, explaining where everything is at (and what those part of the repository are responsible for). Hopefully, through this explanation, you can localize different parts of the repository that you want to change/fix/enhance: + +1. **Serverless.yml** - Serverless.yml is the configuration the CLI uses to deploy your code to your provider of choice. The file denotes the entire architecture of the server, including the provider, the plugins, and the functions. The file is the outline (or the index) of your entire API and is the best reference to determine how your API will work. Here's a description of what each part of this file means: + +- **service** - The name of your API (or your `service`) + +- **provider** - The `provider` block defines where your service will be deployed. For AWS Lambda we need to be careful of which version of node.js we are running (the repo runs 6.10, but it seems that AWS Lambda can now run v8.10 as of 4/2/18). The repo sets the stage as development (as opposed to production) and sets the location of the server in the western region of the U.S. Every AWS Lambda function needs permission to interact with other AWS infrastructure resources within your account. These permissions are set via an AWS IAM Role. + +You can set permission policy statements within this role via the `provider.iamRoleStatements` property. The permissions we set in this service are allowing the operation of an S3 database instance and the use of `KMS:Decrypt`, which helps us encrypt and decrypt our service secrets (our mnemonic to our funding wallet, etc.). + +The `environment` property allows you to apply an environment variable configuration to all functions in your service. Environment variables configured at the function level are merged with those at the provider level, so your function with specific environment variables will also have access to the environment variables defined at the provider level. If an environment variable with the same key is defined at both the function and provider levels, the function-specific value overrides the provider-level default value. Here, we've set `SECRETS` as our global variable across all functions within the service as an authentication method for accessing the APIs capabilities. The `serverless-kms-secrets` npm resource is what allows us to conveniently encrypt and decrypt our service and pair that value with the `SECRETS` environment variable. + +The `plugins` property includes npm resources we need for the service to function correctly. We use the `serverless-webpack` +and `serverless-kms-secrets` npm resources. + +The `customs` property allows us to account for certain configurations required by our plugin features. + +The `functions` block defines what code to deploy. These are the methods of your API - or your API calls. + +2. **src folder** - all of the logic of the repo is stored here, particularly in the api_handler.js file. We will account for special files/folders in this path below: + +- **api_handler** - central file with all of service's core functions (that result in the development of api calls for different functions) + +- **src/lib folder** - contains all of the needed scripts to enable the 'handler' files to work properly. Many of these scripts take care of interacting with the ethereum blockchain. + +3. **Other Notable Files** + +- **SECRETS.md** - This file provides the kms commands that you need to use to both encrypt (and set) your SECRETS for your service and decrypt those secrets when needed. The structure of the secrets provided in this service is the following: +``` +{ +[To Be Continued] +} +``` + +- **kms-secrets.develop.us-west-2.yml** - A file that is automatically generated once secrets are encrypted by the sls encryption command noted in the SECRETS.md file. This is for the develop stage service. Create a KMS key in AWS IAM service, under Encryption keys. Collect the key id, which is the remaining part of the key ARN. + +- **kms-secrets.master.us-west-2.yml** - A file that is automatically generated once secrets are encrypted by the sls encryption command noted in the SECRETS.md file. This is for the master stage service. Create a KMS key in AWS IAM service, under Encryption keys. Collect the key id, which is the remaining part of the key ARN. + +### How do we start this up? +[To Be Continued] + # API ## Request Fuel Token for New Device Key From b3ce134536e2693b0c2a5ac1c9ab70fd714cd209 Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Thu, 7 Jun 2018 12:21:36 +0200 Subject: [PATCH 02/38] created comments throughout codebase to clarify how everything is connected --- README.md | 69 +-------------------------- serverless.yml | 3 -- src/api_handler.js | 28 ++++++++--- src/handlers/check_verification.js | 16 +++++++ src/handlers/continue_verification.js | 15 ++++++ src/handlers/funcaptcha.js | 19 ++++++++ src/handlers/newDeviceKey.js | 21 +++++++- src/handlers/phone_attestation.js | 18 +++++++ src/handlers/recaptcha.js | 18 +++++++ src/handlers/start_verification.js | 15 ++++++ src/lib/attestationMgr.js | 9 ++++ src/lib/authMgr.js | 10 ++++ src/lib/fuelTokenMgr.js | 16 +++++++ src/lib/funcaptchaMgr.js | 10 ++++ src/lib/phoneVerificationMgr.js | 11 +++++ src/lib/recaptchaMgr.js | 9 ++++ src/lib/uPortMgr.js | 9 ++++ 17 files changed, 217 insertions(+), 79 deletions(-) diff --git a/README.md b/README.md index 4b6d186..74917d3 100644 --- a/README.md +++ b/README.md @@ -13,76 +13,9 @@ Lambda functions for verifying phone numbers [Diagrams](./diagrams/README.md) -## Repository Basics - -### Description +# Description Nisaba provides user verification for the uPort ecosystem. -### What is [AWS Lambda](https://aws.amazon.com/lambda/)? -AWS Lambda lets you run code without provisioning or managing servers. You pay only for the compute time you consume - there is no charge when your code is not running. - -With Lambda, you can run code for virtually any type of application or backend service - all with zero administration. Just upload your code and Lambda takes care of everything required to run and scale your code with high availability. You can set up your code to automatically trigger from other AWS services or call it directly from any web or mobile app. - -### What is [Serverless](https://serverless.com/learn/)? -Just like wireless internet has wires somewhere, serverless architectures still have servers somewhere. What ‘serverless’ really means is that, as a developer you don’t have to think about those servers. You just focus on code. - -### Serverless Architectures with AWS Lambda -Using AWS Lambda as the logic layer of a serverless application can enable faster development speed and greater experimentation – and innovation — than in a traditional, server-based environment. Many serverless applications can be fully functional with only a few lines of code and little else. - -Examples of fully-serverless-application use cases include: - -- Web or mobile backends – Create fully-serverless, mobile applications or websites by creating user-facing content in a native mobile application or static web content in an S3 bucket. Then have your front-end content integrate with Amazon API Gateway as a backend service API. Lambda functions will then execute the business logic you’ve written for each of the API Gateway methods in your backend API. -- Chatbots and virtual assistants – Build new serverless ways to interact with your customers, like customer support assistants and bots ready to engage customers on your company-run social media pages. The Amazon Alexa Skills Kit (ASK) and Amazon Lex have the ability to apply natural-language understanding to user-voice and freeform-text input so that a Lambda function you write can intelligently respond and engage with them. -- Internet of Things (IoT) backends – AWS IoT has direct-integration for device messages to be routed to and processed by Lambda functions. That means you can implement serverless backends for highly secure, scalable IoT applications for uses like connected consumer appliances and intelligent manufacturing facilities. -Using AWS Lambda as the logic layer of a serverless application can enable faster development speed and greater experimentation – and innovation — than in a traditional, server-based environment. - -To learn more about Serverless Architectures with AWS Lambda, check out [this publication](https://d1.awsstatic.com/whitepapers/serverless-architectures-with-aws-lambda.pdf) that goes through the whole build - -### So How Does this All Come Together w/ lambda-nisaba? -[To Be Continued] - -### How is the Repository Organized? -The following list breakdown the folder architecture within the repository, explaining where everything is at (and what those part of the repository are responsible for). Hopefully, through this explanation, you can localize different parts of the repository that you want to change/fix/enhance: - -1. **Serverless.yml** - Serverless.yml is the configuration the CLI uses to deploy your code to your provider of choice. The file denotes the entire architecture of the server, including the provider, the plugins, and the functions. The file is the outline (or the index) of your entire API and is the best reference to determine how your API will work. Here's a description of what each part of this file means: - -- **service** - The name of your API (or your `service`) - -- **provider** - The `provider` block defines where your service will be deployed. For AWS Lambda we need to be careful of which version of node.js we are running (the repo runs 6.10, but it seems that AWS Lambda can now run v8.10 as of 4/2/18). The repo sets the stage as development (as opposed to production) and sets the location of the server in the western region of the U.S. Every AWS Lambda function needs permission to interact with other AWS infrastructure resources within your account. These permissions are set via an AWS IAM Role. - -You can set permission policy statements within this role via the `provider.iamRoleStatements` property. The permissions we set in this service are allowing the operation of an S3 database instance and the use of `KMS:Decrypt`, which helps us encrypt and decrypt our service secrets (our mnemonic to our funding wallet, etc.). - -The `environment` property allows you to apply an environment variable configuration to all functions in your service. Environment variables configured at the function level are merged with those at the provider level, so your function with specific environment variables will also have access to the environment variables defined at the provider level. If an environment variable with the same key is defined at both the function and provider levels, the function-specific value overrides the provider-level default value. Here, we've set `SECRETS` as our global variable across all functions within the service as an authentication method for accessing the APIs capabilities. The `serverless-kms-secrets` npm resource is what allows us to conveniently encrypt and decrypt our service and pair that value with the `SECRETS` environment variable. - -The `plugins` property includes npm resources we need for the service to function correctly. We use the `serverless-webpack` -and `serverless-kms-secrets` npm resources. - -The `customs` property allows us to account for certain configurations required by our plugin features. - -The `functions` block defines what code to deploy. These are the methods of your API - or your API calls. - -2. **src folder** - all of the logic of the repo is stored here, particularly in the api_handler.js file. We will account for special files/folders in this path below: - -- **api_handler** - central file with all of service's core functions (that result in the development of api calls for different functions) - -- **src/lib folder** - contains all of the needed scripts to enable the 'handler' files to work properly. Many of these scripts take care of interacting with the ethereum blockchain. - -3. **Other Notable Files** - -- **SECRETS.md** - This file provides the kms commands that you need to use to both encrypt (and set) your SECRETS for your service and decrypt those secrets when needed. The structure of the secrets provided in this service is the following: -``` -{ -[To Be Continued] -} -``` - -- **kms-secrets.develop.us-west-2.yml** - A file that is automatically generated once secrets are encrypted by the sls encryption command noted in the SECRETS.md file. This is for the develop stage service. Create a KMS key in AWS IAM service, under Encryption keys. Collect the key id, which is the remaining part of the key ARN. - -- **kms-secrets.master.us-west-2.yml** - A file that is automatically generated once secrets are encrypted by the sls encryption command noted in the SECRETS.md file. This is for the master stage service. Create a KMS key in AWS IAM service, under Encryption keys. Collect the key id, which is the remaining part of the key ARN. - -### How do we start this up? -[To Be Continued] - # API ## Request Fuel Token for New Device Key diff --git a/serverless.yml b/serverless.yml index 2dd044f..1b00d8c 100644 --- a/serverless.yml +++ b/serverless.yml @@ -85,6 +85,3 @@ functions: - http: path: check method: post - - - diff --git a/src/api_handler.js b/src/api_handler.js index b1f1e5d..b22bf7e 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -19,13 +19,14 @@ const StartVerificationHandler = require("./handlers/start_verification"); const ContinueVerificationHandler = require("./handlers/continue_verification"); const CheckVerificationHandler = require("./handlers/check_verification"); -let recaptchaMgr = new RecaptchaMgr(); -let funcaptchaMgr = new FuncaptchaMgr(); -let authMgr = new AuthMgr(); -let fuelTokenMgr = new FuelTokenMgr(); -let uPortMgr = new UPortMgr(); -let attestationMgr = new AttestationMgr(); -let phoneVerificationMgr = new PhoneVerificationMgr(); +//instantiate manager services needed for methods +let recaptchaMgr = new RecaptchaMgr(); //setting and verify the captcha token +let funcaptchaMgr = new FuncaptchaMgr(); //interactive captcha service (JWT token generation) +let authMgr = new AuthMgr(); //verifies authorization request to nisaba service +let fuelTokenMgr = new FuelTokenMgr(); //develops new JWT tokens for new users +let uPortMgr = new UPortMgr(); //uport specific JWT token verification +let attestationMgr = new AttestationMgr(); // Create attestation for the subscriber +let phoneVerificationMgr = new PhoneVerificationMgr(); //Verify phone number code sent via text let recaptchaHandler = new RecaptchaHandler(recaptchaMgr, fuelTokenMgr); let funcaptchaHandler = new FuncaptchaHandler(funcaptchaMgr, fuelTokenMgr); @@ -48,24 +49,37 @@ let checkVerificationHandler = new CheckVerificationHandler( phoneVerificationMgr ); +//verifies recaptcha token and provides fuel token module.exports.recaptcha = (event, context, callback) => { postHandler(recaptchaHandler, event, context, callback); }; + +//verifies funcaptcha token and provides fuel token module.exports.funcaptcha = (event, context, callback) => { postHandler(funcaptchaHandler, event, context, callback); }; + +//Get a new fuel token by sending a signed requestToken module.exports.newDeviceKey = (event, context, callback) => { postHandler(newDeviceKeyHandler, event, context, callback); }; + +//Get a an attestation for the verified phone on the fuelToken module.exports.phone_attestation = (event, context, callback) => { postHandler(phoneAttestationHandler, event, context, callback); }; + +//Verify a phone number using Nexmo verification module.exports.start_verification = (event, context, callback) => { postHandler(startVerificationHandler, event, context, callback); }; + +//continues verification started in start_verification module.exports.continue_verification = (event, context, callback) => { postHandler(continueVerificationHandler, event, context, callback); }; + +//Verify device key and provided code & provides request token module.exports.check_verification = (event, context, callback) => { postHandler(checkVerificationHandler, event, context, callback); }; diff --git a/src/handlers/check_verification.js b/src/handlers/check_verification.js index 1e0ba2e..09026d6 100644 --- a/src/handlers/check_verification.js +++ b/src/handlers/check_verification.js @@ -1,3 +1,19 @@ +/* +file - check_verification.js + +Function: +1. Verify device key +2. Provide request token + +inputs +- phoneVerificationMgr: Verify phone number code sent via text + +resources +- N/A + +resource description +- N/A +*/ class CheckVerificationHandler { constructor(phoneVerificationMgr) { this.phoneVerificationMgr = phoneVerificationMgr; diff --git a/src/handlers/continue_verification.js b/src/handlers/continue_verification.js index b28149e..be55a8d 100644 --- a/src/handlers/continue_verification.js +++ b/src/handlers/continue_verification.js @@ -1,3 +1,18 @@ +/* +file - continue_verification.js + +Function: +1. continues verification started in start_verification + +inputs +- phoneVerificationMgr: Verify phone number code sent via text + +resources +- N/A + +resource description +- N/A +*/ class ContinueVerificationHandler { constructor(phoneVerificationMgr) { this.phoneVerificationMgr = phoneVerificationMgr; diff --git a/src/handlers/funcaptcha.js b/src/handlers/funcaptcha.js index efc2f92..224eaba 100644 --- a/src/handlers/funcaptcha.js +++ b/src/handlers/funcaptcha.js @@ -1,3 +1,22 @@ +/* +file - funCaptcha.js + +Function: +1. Verify funCaptchaToken +2. If funCaptchaToken verified, then get new fuel token +3. send callback function with fueltoken back + +inputs +- funcaptchaMgr: interactive captcha service (JWT token generation) +- fuelTokenMgr: develops new JWT tokens for new users + +resources +- N/A + +resource description +- N/A +*/ + class FuncaptchaHandler { constructor(funCaptchaMgr, fuelTokenMgr) { this.funCaptchaMgr = funCaptchaMgr; diff --git a/src/handlers/newDeviceKey.js b/src/handlers/newDeviceKey.js index bc1ec62..2cb7f45 100644 --- a/src/handlers/newDeviceKey.js +++ b/src/handlers/newDeviceKey.js @@ -1,3 +1,22 @@ +/* +file - newDeviceKey.js + +Function: +1. Verify Request Token (based on uport standards) +2. Check if address on fuelToken (authToken) is the same as the one on the requestToken +3. If yes, Issue new fuelToken + +inputs +- authMgr: verifies authorization request to nisaba service +- uPortMgr: uport specific JWT token verification +- fuelTokenMgr: develops new JWT tokens for new users + +resources +- N/A + +resource description +- N/A +*/ import { toEthereumAddress } from "did-jwt/lib/Digest"; class NewDeviceKeyHandler { @@ -78,7 +97,7 @@ class NewDeviceKeyHandler { console.log("REQ TOKEN ADDR : ", address); console.log("FUEL TOKEN ADDR : ", authToken.sub); - //Check if address on fuelToken (authToken) is the same as the one on the requesToken + //Check if address on fuelToken (authToken) is the same as the one on the requestToken if (address != authToken.sub) { console.log("authToken.sub !== decodedRequestToken..address"); cb({ diff --git a/src/handlers/phone_attestation.js b/src/handlers/phone_attestation.js index 5cc4626..ce5c00d 100644 --- a/src/handlers/phone_attestation.js +++ b/src/handlers/phone_attestation.js @@ -1,3 +1,21 @@ +/* +file - phone_attestation.js + +Function: +1. Verify fuel token +2. Verifies that sub has a uPort ID +3. Creates attestation once everything checks out + +inputs +- attestationMgr: Create attestation for the subscriber +- fuelTokenMgr: develops new JWT tokens for new users + +resources +- N/A + +resource description +- N/A +*/ import { Credentials, SimpleSigner } from "uport"; class PhoneAttestationHandler { diff --git a/src/handlers/recaptcha.js b/src/handlers/recaptcha.js index 177517b..1b46e85 100644 --- a/src/handlers/recaptcha.js +++ b/src/handlers/recaptcha.js @@ -1,3 +1,21 @@ +/* +file - recaptcha.js + +Function: +1. Verify reCaptchaToken +2. If reCaptchaToken verified, then get new fuel token +3. send callback function with fueltoken back + +inputs +- recaptchaMgr: setting and verify the captcha token +- fuelTokenMgr: develops new JWT tokens for new users + +resources +- N/A + +resource description +- N/A +*/ class RecaptchaHandler { constructor(recaptchaMgr, fuelTokenMgr) { this.recaptchaMgr = recaptchaMgr; diff --git a/src/handlers/start_verification.js b/src/handlers/start_verification.js index 1c759d0..492d20c 100644 --- a/src/handlers/start_verification.js +++ b/src/handlers/start_verification.js @@ -1,3 +1,18 @@ +/* +file - start_verification.js + +Function: +1. Verify phone number using nexmo api + +inputs +- phoneVerificationMgr: Verify phone number code sent via text + +resources +- N/A + +resource description +- N/A +*/ class StartVerificationHandler { constructor(phoneVerificationMgr) { this.phoneVerificationMgr = phoneVerificationMgr; diff --git a/src/lib/attestationMgr.js b/src/lib/attestationMgr.js index e748752..fa02358 100644 --- a/src/lib/attestationMgr.js +++ b/src/lib/attestationMgr.js @@ -1,3 +1,12 @@ +/* +file - attestationMgr.js - Create attestation for the subscriber + +resources +- N/A + +resource description +- N/A +*/ import { Credentials, SimpleSigner } from "uport"; class AttestationMgr { diff --git a/src/lib/authMgr.js b/src/lib/authMgr.js index 32ab2ac..5bf479c 100644 --- a/src/lib/authMgr.js +++ b/src/lib/authMgr.js @@ -1,3 +1,13 @@ +/* +file - authMgr.js - verifies authorization request to nisaba service + +resources +- https://www.npmjs.com/package/jsontokens + +resource description +- jsontokens - node.js library for signing, decoding, and +verifying JSON Web Tokens (JWTs) +*/ import { decodeToken, TokenVerifier } from "jsontokens"; // import { verifyJWT } from "did-jwt" diff --git a/src/lib/fuelTokenMgr.js b/src/lib/fuelTokenMgr.js index c2f36e3..dc53506 100644 --- a/src/lib/fuelTokenMgr.js +++ b/src/lib/fuelTokenMgr.js @@ -1,3 +1,19 @@ +/* +file - fuelTokenMgr.js - this file manager sets signing secrets from the +funding account and develops new JWT tokens for new users that can be passaed +to sensui (and also check and verified) + +THIS FILE MUST BE CHANGED TO FIT YOUR FORKED API GIVEN THAT UPORT USES +THEIR SPECIFIC API ENDPOINTS + +resources +- did-jwt: https://github.com/uport-project/did-jwt + +resource description +- did-jwt: The did-JWT library allows you to sign and verify +JSON Web Tokens (JWT). Public keys are resolved using the +Decentralized ID (DID) of the iss claim of the JWT. +*/ import { createJWT, verifyJWT, SimpleSigner, decodeJWT } from "did-jwt"; class FuelTokenMgr { diff --git a/src/lib/funcaptchaMgr.js b/src/lib/funcaptchaMgr.js index c1985c5..0fa30a8 100644 --- a/src/lib/funcaptchaMgr.js +++ b/src/lib/funcaptchaMgr.js @@ -1,3 +1,13 @@ +/* +file - funcaptchaMgr.js - leverages the funcaptcha service and verifies +submitted token + +resources +- https://funcaptcha.com/ + +resource descriptions +- funCaptcha: an interactive captcha service +*/ import rp from "request-promise"; class FuncaptchaMgr { diff --git a/src/lib/phoneVerificationMgr.js b/src/lib/phoneVerificationMgr.js index 1812f34..1ff9d58 100644 --- a/src/lib/phoneVerificationMgr.js +++ b/src/lib/phoneVerificationMgr.js @@ -1,3 +1,14 @@ +/* +file - phoneVerificationMgr.js - instantiates Nexmo service to verify +phone number code sent via text + +resources +- Nexmo - https://www.npmjs.com/package/nexmo +- Nexmo - https://developer.nexmo.com/documentation + +resource description +- Nexmo - Text/Voice and Verification API suite +*/ import Nexmo from "nexmo"; import { decodeToken, TokenVerifier } from "jsontokens"; import { Client } from "pg"; diff --git a/src/lib/recaptchaMgr.js b/src/lib/recaptchaMgr.js index a18fca1..5ca2813 100644 --- a/src/lib/recaptchaMgr.js +++ b/src/lib/recaptchaMgr.js @@ -1,3 +1,11 @@ +/* +file - recaptchaMgr.js - setting and verify the captcha token being submited + +resource - https://developers.google.com/recaptcha/intro + +resource description - A user authentication API that leverages captchas to +protect your service against spam and other types of automated abuse +*/ import rp from "request-promise"; class RecaptchaMgr { @@ -9,6 +17,7 @@ class RecaptchaMgr { } setSecrets(secrets) { + //setting the secret environmental variable to RECAPTCHA_SECRET_KEY this.recaptchaSecretKey = secrets.RECAPTCHA_SECRET_KEY; } diff --git a/src/lib/uPortMgr.js b/src/lib/uPortMgr.js index 5bbbe8e..37f93e4 100644 --- a/src/lib/uPortMgr.js +++ b/src/lib/uPortMgr.js @@ -1,3 +1,12 @@ +/* +file - uPortMgr.js - uport specific token verification (may want to take out) + +resources +- https://github.com/uport-project/did-jwt/blob/develop/src/JWT.js + +resource description +- uport specific JWT token verification +*/ import { verifyJWT } from "did-jwt/lib/JWT"; class UportMgr { From 036878b417de2700169a6c691d2228b639b6785f Mon Sep 17 00:00:00 2001 From: Robby Greenfield Date: Thu, 7 Jun 2018 12:28:58 +0200 Subject: [PATCH 03/38] update readme.md added additional documentation clarifying repo set-up --- README.md | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 110 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 74917d3..28e664b 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,116 @@ Lambda functions for verifying phone numbers [Diagrams](./diagrams/README.md) -# Description -Nisaba provides user verification for the uPort ecosystem. +## Repository Basics + +### Description +Nisaba provides user verification to allow users to post requests to the lamba-sensui service, which pays for user transactions when using decentralized applications (based on the Ethereum blockchain). The Nisaba service utilizes the following resources: + +- **[Google Recaptcha]**(https://developers.google.com/recaptcha/intro), a user authentication API that leverages/verifies captchas to protect your service against spam and other types of automated abuse. + +- **[DID-JWT]**(https://github.com/uport-project/did-jwt), a library that allows you to sign and verify JSON Web Tokens (JWT) using ES256K or ES256K-R algorithms. Public keys are resolved using the Decentralized ID (DID) of the signing identity of the claim, which is passed as the iss attribute of the encoded JWT. + +- **[FunCaptcha]**(https://funcaptcha.com/), an interactive captcha service for applications to leverage to better authenticate their users + +- **[Nexmo]**(https://developer.nexmo.com/documentation), a text/Voice and Verification API suite + +### What is [AWS Lambda](https://aws.amazon.com/lambda/)? +AWS Lambda lets you run code without provisioning or managing servers. You pay only for the compute time you consume - there is no charge when your code is not running. + +With Lambda, you can run code for virtually any type of application or backend service - all with zero administration. Just upload your code and Lambda takes care of everything required to run and scale your code with high availability. You can set up your code to automatically trigger from other AWS services or call it directly from any web or mobile app. + +### What is [Serverless](https://serverless.com/learn/)? +Just like wireless internet has wires somewhere, serverless architectures still have servers somewhere. What ‘serverless’ really means is that, as a developer you don’t have to think about those servers. You just focus on code. + +### Serverless Architectures with AWS Lambda +Using AWS Lambda as the logic layer of a serverless application can enable faster development speed and greater experimentation – and innovation — than in a traditional, server-based environment. Many serverless applications can be fully functional with only a few lines of code and little else. + +Examples of fully-serverless-application use cases include: + +- Web or mobile backends – Create fully-serverless, mobile applications or websites by creating user-facing content in a native mobile application or static web content in an S3 bucket. Then have your front-end content integrate with Amazon API Gateway as a backend service API. Lambda functions will then execute the business logic you’ve written for each of the API Gateway methods in your backend API. +- Chatbots and virtual assistants – Build new serverless ways to interact with your customers, like customer support assistants and bots ready to engage customers on your company-run social media pages. The Amazon Alexa Skills Kit (ASK) and Amazon Lex have the ability to apply natural-language understanding to user-voice and freeform-text input so that a Lambda function you write can intelligently respond and engage with them. +- Internet of Things (IoT) backends – AWS IoT has direct-integration for device messages to be routed to and processed by Lambda functions. That means you can implement serverless backends for highly secure, scalable IoT applications for uses like connected consumer appliances and intelligent manufacturing facilities. +Using AWS Lambda as the logic layer of a serverless application can enable faster development speed and greater experimentation – and innovation — than in a traditional, server-based environment. + +To learn more about Serverless Architectures with AWS Lambda, check out [this publication](https://d1.awsstatic.com/whitepapers/serverless-architectures-with-aws-lambda.pdf) that goes through the whole build + +### So How Does this All Come Together w/ lambda-nisaba? +[To Be Continued] + +### How is the Repository Organized? +The following list breakdown the folder architecture within the repository, explaining where everything is at (and what those part of the repository are responsible for). Hopefully, through this explanation, you can localize different parts of the repository that you want to change/fix/enhance: + +1. **Serverless.yml** - Serverless.yml is the configuration the CLI uses to deploy your code to your provider of choice. The file denotes the entire architecture of the server, including the provider, the plugins, and the functions. The file is the outline (or the index) of your entire API and is the best reference to determine how your API will work. Here's a description of what each part of this file means: + +- **service** - The name of your API (or your `service`) + +- **provider** - The `provider` block defines where your service will be deployed. For AWS Lambda we need to be careful of which version of node.js we are running (the repo runs 6.10, but it seems that AWS Lambda can now run v8.10 as of 4/2/18). The repo sets the stage as development (as opposed to production) and sets the location of the server in the western region of the U.S. Every AWS Lambda function needs permission to interact with other AWS infrastructure resources within your account. These permissions are set via an AWS IAM Role. + +You can set permission policy statements within this role via the `provider.iamRoleStatements` property. The permissions we set in this service are allowing the operation of an S3 database instance and the use of `KMS:Decrypt`, which helps us encrypt and decrypt our service secrets (our mnemonic to our funding wallet, etc.). + +The `environment` property allows you to apply an environment variable configuration to all functions in your service. Environment variables configured at the function level are merged with those at the provider level, so your function with specific environment variables will also have access to the environment variables defined at the provider level. If an environment variable with the same key is defined at both the function and provider levels, the function-specific value overrides the provider-level default value. Here, we've set `SECRETS` as our global variable across all functions within the service as an authentication method for accessing the APIs capabilities. The `serverless-kms-secrets` npm resource is what allows us to conveniently encrypt and decrypt our service and pair that value with the `SECRETS` environment variable. + +The `plugins` property includes npm resources we need for the service to function correctly. We use the `serverless-webpack` +and `serverless-kms-secrets` npm resources. + +The `customs` property allows us to account for certain configurations required by our plugin features. + +The `functions` block defines what code to deploy. These are the methods of your API - or your API calls. + +2. **src folder** - all of the logic of the repo is stored here, particularly in the api_handler.js file. We will account for special files/folders in this path below: + +- **api_handler** - central file with all of service's core functions (that result in the development of api calls for different functions) + +- **src/lib folder** - contains all of the needed scripts to enable the 'handler' files to work properly. Many of these scripts take care of interacting with the ethereum blockchain. Take note that you will need to change the API endpoints referenced in the fuelTokenMgr.js to ensure that your token is referencing the correct endpoints (as uPort's API endpoints are currently within the codebase). The latter is inside the ```newToken``` and ```verifyToken``` methods. + +3. **Other Notable Files** + +- **SECRETS.md** - This file provides the kms commands that you need to use to both encrypt (and set) your SECRETS for your service and decrypt those secrets when needed. The structure of the secrets provided in this service is the following: +``` +{ + RECAPTCHA_SECRET_KEY, + FUEL_TOKEN_PRIVATE_KEY, //funder wallet private key + FUEL_TOKEN_PUBLIC_KEY, //funder wallet public key + FUNCAPTCHA_PRIVATE_KEY, //provide by funcaptcha api service + NEXMO_API_KEY, //provide by Nexmo api service + NEXMO_API_SECRET, //provide by Nexmo api service + NEXMO_FROM, //provide by Nexmo api service + PG_URL //database url endpoint +} +``` + +- **kms-secrets.develop.us-west-2.yml** - A file that is automatically generated once secrets are encrypted by the sls encryption command noted in the SECRETS.md file. This is for the develop stage service. Create a KMS key in AWS IAM service, under Encryption keys. Collect the key id, which is the remaining part of the key ARN. + +- **kms-secrets.master.us-west-2.yml** - A file that is automatically generated once secrets are encrypted by the sls encryption command noted in the SECRETS.md file. This is for the master stage service. Create a KMS key in AWS IAM service, under Encryption keys. Collect the key id, which is the remaining part of the key ARN. + +### How do we start this up? +1. Open your terminal and choose a folder path you'd like to store the project in + +2. Use the command 'git clone [github repo url here]' to clone the project in that folder + +3. Make sure that you have serverless on your computer if not, follow these steps: https://serverless.com/learn/quick-start/ + +4. Make sure that you have a AWS IAM account (if not follow the guide in step 3 to completion to get familiar). + +5. Go back to your terminal in the project folder and use `npm install` command make sure that `serverless-webpack` and `serverless-kms-secrets` npm resources are installed. + +6. Create a KMS key in AWS IAM service, under Encryption keys. Collect the key id, which is the remaining part of the key ARN. You need to create a key for each development stage of your service. + +7. Create a Nexmo account and get private key and secret + +8. Create a funcaptcha account and get account credentials + +9. Use the encryption command (on your terminal which should be in the folder path of the project) to set and encrypt you secrets for each of your development stage services via the following: + +``` +sls encrypt -n SECRET_VARIABLE_NAME -v SECRET_VARIABLE_VALUE -s STAGE_YOUR_SETTING_SECRET_FOR +``` + +Since you indicated which stage your encypting the secret for, it will determine which KMS key to use automatically from AWS. + +10. Make sure to re-name your service in the `serverless.yml` file to something relevant that your service does + +11. Create an endpoint that points to where your service lives using the command `sls deploy`. This will generate a url to use for calling the different endpoints indicated in your API. Remember, we indicated what these endpoints were in the `serverless.yml` file in the functions sub-sections called `events`, where we define the mapping of the API functions to the http endpoints # API From 432d2649cc38ba3a2294de1b8f8095f882341b84 Mon Sep 17 00:00:00 2001 From: Robby Greenfield Date: Tue, 12 Jun 2018 15:19:53 +1000 Subject: [PATCH 04/38] update readme.md update data schema in documentation --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 28e664b..4645794 100644 --- a/README.md +++ b/README.md @@ -95,6 +95,15 @@ The `functions` block defines what code to deploy. These are the methods of your - **kms-secrets.master.us-west-2.yml** - A file that is automatically generated once secrets are encrypted by the sls encryption command noted in the SECRETS.md file. This is for the master stage service. Create a KMS key in AWS IAM service, under Encryption keys. Collect the key id, which is the remaining part of the key ARN. +### Datastore Schema +The Nisaba service leverages a centralized, off-chain sotre in order to provide better consistency than querying the blockchain for past transactiond data. The service leverages an [AWS RDS PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.PostgreSQL.html) instance to save transaction and nonce data from transactions being passed through the service. The following are the two tables within the PostgreSQL database (given the initial repository codebase): + +**Table 1: Nexmo_Requests** + +- Column 1: request_id +- Column 2: device_key +- Column 3: request_status + ### How do we start this up? 1. Open your terminal and choose a folder path you'd like to store the project in From 54d49221eea04a04a8a62bb151e356c341bd3cf2 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 17:35:27 -0700 Subject: [PATCH 05/38] add SETUP.md --- SETUP.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 SETUP.md diff --git a/SETUP.md b/SETUP.md new file mode 100644 index 0000000..e69de29 From 6ca77856c9b230b8f22a60c5423303b2732fde16 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 18:35:56 -0700 Subject: [PATCH 06/38] Update SETUP.md --- SETUP.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/SETUP.md b/SETUP.md index e69de29..04b1b7a 100644 --- a/SETUP.md +++ b/SETUP.md @@ -0,0 +1,27 @@ +# Local Setup +1. Check your node version + + ```node -v``` + + Make sure you use node 6 (8 might work too). I recommend using nvm (https://github.com/creationix/nvm) to manage different node.js versions (`nvm use 6`). +2. Install serverless + + ```npm install -g serverless``` +3. Make sure you have an AWS account. Set up AWS credentials: https://serverless.com/framework/docs/providers/aws/guide/credentials/ +4. In IAM management console, create a key for develop: https://console.aws.amazon.com/iam/home#/encryptionKeys/us-west-2 + + If you want to deploy to master too, create another key for master. + Make sure the keys you created are in the correct region (`us-west-2`). If you decide to create keys in another reason, make sure to change region configuration in other places too. +5. Create reCaptcha account: https://www.google.com/recaptcha/admin, get `RECAPTCHA_SECRET_KEY` +6. Create fun captcha account: https://www.funcaptcha.com/setup, get `FUNCAPTCHA_PRIVATE_KEY`. + + (They currently ignore us after we fill in a form, skipp this step for now) +7. Generate Fuel token private & public keys: `FUEL_TOKEN_PRIVATE_KEY`, `FUEL_TOKEN_PUBLIC_KEY`. + + There is nothing special about these keys. They are just `specp256k1` key pair. You can generate them here: https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html +8. Create nextmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` + + + + + From e33f0bd4f168f38557e179ff2fb22398d0f076dd Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 19:00:29 -0700 Subject: [PATCH 07/38] More setup --- SETUP.md | 47 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/SETUP.md b/SETUP.md index 04b1b7a..54b2886 100644 --- a/SETUP.md +++ b/SETUP.md @@ -3,24 +3,57 @@ ```node -v``` - Make sure you use node 6 (8 might work too). I recommend using nvm (https://github.com/creationix/nvm) to manage different node.js versions (`nvm use 6`). + Make sure you use node 8.10 (I tried node 6, `npm test` fails with syntax error). + + I recommend using nvm (https://github.com/creationix/nvm) to manage different node.js versions (`nvm install 8.10; nvm use 8.10`). 2. Install serverless ```npm install -g serverless``` -3. Make sure you have an AWS account. Set up AWS credentials: https://serverless.com/framework/docs/providers/aws/guide/credentials/ -4. In IAM management console, create a key for develop: https://console.aws.amazon.com/iam/home#/encryptionKeys/us-west-2 +3. Install all dependencies + + ```npm install``` + + run `npm test`, the tests should all pass. +4. Make sure you have an AWS account. Set up AWS credentials: https://serverless.com/framework/docs/providers/aws/guide/credentials/ +5. In IAM management console, create a key for develop: https://console.aws.amazon.com/iam/home#/encryptionKeys/us-west-2 If you want to deploy to master too, create another key for master. Make sure the keys you created are in the correct region (`us-west-2`). If you decide to create keys in another reason, make sure to change region configuration in other places too. -5. Create reCaptcha account: https://www.google.com/recaptcha/admin, get `RECAPTCHA_SECRET_KEY` -6. Create fun captcha account: https://www.funcaptcha.com/setup, get `FUNCAPTCHA_PRIVATE_KEY`. +6. Create reCaptcha account: https://www.google.com/recaptcha/admin, get `RECAPTCHA_SECRET_KEY` +7. Create fun captcha account: https://www.funcaptcha.com/setup, get `FUNCAPTCHA_PRIVATE_KEY`. (They currently ignore us after we fill in a form, skipp this step for now) -7. Generate Fuel token private & public keys: `FUEL_TOKEN_PRIVATE_KEY`, `FUEL_TOKEN_PUBLIC_KEY`. +8. Generate Fuel token private & public keys: `FUEL_TOKEN_PRIVATE_KEY`, `FUEL_TOKEN_PUBLIC_KEY`. There is nothing special about these keys. They are just `specp256k1` key pair. You can generate them here: https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html -8. Create nextmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` +9. Create nextmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` +10. Setup postgres +11. Delete the old `kms-secrets.develop.us-west-2.yml` and `kms-secrets.master.us-west-2.yml`. Generate your own using the following command: + + ```sls encrypt -n SECRETS:[variable] -v [value] [-k key_for_stage] [-s stage]``` + + Use the key you generated in step 5 to replace `key_for_stage`, and specify `develop` for `stage`. The first time you run the command, a file `kms-secrets.develop.us-west-2.yml` will be generated. + + If you want to deploy master, use the other key you generated in step 5 to replace `key_for_stage, and specify `master` for `stage`, a file `kms-secrets.master.us-west-2.yml` will be generated. + + You only need to specify `[-k key_for_stage]` the first time you run the command for each stage. + + You should encrypt the following `variables` and its corresponding `values`. If you followed step 6 to 10, you'll know what those values are. + ``` + RECAPTCHA_SECRET_KEY + FUNCAPTCHA_PRIVATE_KEY + FUEL_TOKEN_PRIVATE_KEY + FUEL_TOKEN_PUBLIC_KEY + NEXMO_API_KEY + NEXMO_API_SECRET + NEXMO_FROM + PG_URL + ``` + + Run `sls decrypt` to check the encryption works correctly. +12. Now you can run locally + ```sls invoke local -f [function] -d [data]``` From e342c269e31e904288d982f416c7dd388dcb6a63 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 19:04:34 -0700 Subject: [PATCH 08/38] Fix SETUP.md format --- SETUP.md | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/SETUP.md b/SETUP.md index 54b2886..8dd7666 100644 --- a/SETUP.md +++ b/SETUP.md @@ -28,33 +28,31 @@ There is nothing special about these keys. They are just `specp256k1` key pair. You can generate them here: https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html 9. Create nextmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` 10. Setup postgres -11. Delete the old `kms-secrets.develop.us-west-2.yml` and `kms-secrets.master.us-west-2.yml`. Generate your own using the following command: +11. Delete the old `kms-secrets.develop.us-west-2.yml` and `kms-secrets.master.us-west-2.yml`. - ```sls encrypt -n SECRETS:[variable] -v [value] [-k key_for_stage] [-s stage]``` + Generate your own using the following command: + + ```sls encrypt -n SECRETS:[variable] -v [value] [-k key_for_stage] [-s stage]``` - Use the key you generated in step 5 to replace `key_for_stage`, and specify `develop` for `stage`. The first time you run the command, a file `kms-secrets.develop.us-west-2.yml` will be generated. + Use the key you generated in step 5 to replace `key_for_stage`, and specify `develop` for `stage`. The first time you run the command, a file `kms-secrets.develop.us-west-2.yml` will be generated. - If you want to deploy master, use the other key you generated in step 5 to replace `key_for_stage, and specify `master` for `stage`, a file `kms-secrets.master.us-west-2.yml` will be generated. - - You only need to specify `[-k key_for_stage]` the first time you run the command for each stage. - - You should encrypt the following `variables` and its corresponding `values`. If you followed step 6 to 10, you'll know what those values are. - ``` - RECAPTCHA_SECRET_KEY - FUNCAPTCHA_PRIVATE_KEY - FUEL_TOKEN_PRIVATE_KEY - FUEL_TOKEN_PUBLIC_KEY - NEXMO_API_KEY - NEXMO_API_SECRET - NEXMO_FROM - PG_URL - ``` - - Run `sls decrypt` to check the encryption works correctly. + If you want to deploy master, use the other key you generated in step 5 to replace `key_for_stage`, and specify `master` for `stage`, a file `kms-secrets.master.us-west-2.yml` will be generated. + + You only need to specify `[-k key_for_stage]` the first time you run the command for each stage. + + You should encrypt the following `variables` and its corresponding `values`. If you followed step 6 to 10, you'll know what those values are. + ``` + RECAPTCHA_SECRET_KEY + FUNCAPTCHA_PRIVATE_KEY + FUEL_TOKEN_PRIVATE_KEY + FUEL_TOKEN_PUBLIC_KEY + NEXMO_API_KEY + NEXMO_API_SECRET + NEXMO_FROM + PG_URL + ``` + + Run `sls decrypt` to check the encryption works correctly. 12. Now you can run locally - ```sls invoke local -f [function] -d [data]``` - - - - + ```sls invoke local -f [function] -d [data]``` From 9ecdff99aaac2c67e08ca395d554415d5efaed9b Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 19:18:54 -0700 Subject: [PATCH 09/38] More details in SETUP.md --- SETUP.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/SETUP.md b/SETUP.md index 8dd7666..8e8a646 100644 --- a/SETUP.md +++ b/SETUP.md @@ -15,6 +15,13 @@ run `npm test`, the tests should all pass. 4. Make sure you have an AWS account. Set up AWS credentials: https://serverless.com/framework/docs/providers/aws/guide/credentials/ + + In this step, make sure your `~/.aws/credentials` is setup correctly. And you exported your environment variables: + + ``` + export AWS_ACCESS_KEY=[AWS_ACCESS_KEY] + export AWS_SECRET_ACCESS_KEY=[AWS_SECRET_ACCESS_KEY] + ``` 5. In IAM management console, create a key for develop: https://console.aws.amazon.com/iam/home#/encryptionKeys/us-west-2 If you want to deploy to master too, create another key for master. @@ -27,6 +34,8 @@ There is nothing special about these keys. They are just `specp256k1` key pair. You can generate them here: https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html 9. Create nextmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` + + (I'm not sure where to get `NEXMO_FROM`, I just specified a random phone number) 10. Setup postgres 11. Delete the old `kms-secrets.develop.us-west-2.yml` and `kms-secrets.master.us-west-2.yml`. @@ -36,7 +45,7 @@ Use the key you generated in step 5 to replace `key_for_stage`, and specify `develop` for `stage`. The first time you run the command, a file `kms-secrets.develop.us-west-2.yml` will be generated. - If you want to deploy master, use the other key you generated in step 5 to replace `key_for_stage`, and specify `master` for `stage`, a file `kms-secrets.master.us-west-2.yml` will be generated. + If you want to deploy to master, use the other key you generated in step 5 to replace `key_for_stage`, and specify `master` for `stage`, a file `kms-secrets.master.us-west-2.yml` will be generated. You only need to specify `[-k key_for_stage]` the first time you run the command for each stage. @@ -56,3 +65,6 @@ 12. Now you can run locally ```sls invoke local -f [function] -d [data]``` + + e.g. ```sls invoke local -f start -d '{"deviceKey": "0x123456", "phoneNumber": [your own phone number]}'```. + You'll get a text message. From ec5703f565a4886273bc06744d4cd24d34aac72d Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 19:36:36 -0700 Subject: [PATCH 10/38] Update SETUP.md --- SETUP.md | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/SETUP.md b/SETUP.md index 8e8a646..31da5b1 100644 --- a/SETUP.md +++ b/SETUP.md @@ -29,14 +29,31 @@ 6. Create reCaptcha account: https://www.google.com/recaptcha/admin, get `RECAPTCHA_SECRET_KEY` 7. Create fun captcha account: https://www.funcaptcha.com/setup, get `FUNCAPTCHA_PRIVATE_KEY`. - (They currently ignore us after we fill in a form, skipp this step for now) + (They currently ignore us after we fill in a form, skip this step for now) 8. Generate Fuel token private & public keys: `FUEL_TOKEN_PRIVATE_KEY`, `FUEL_TOKEN_PUBLIC_KEY`. There is nothing special about these keys. They are just `specp256k1` key pair. You can generate them here: https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html 9. Create nextmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` (I'm not sure where to get `NEXMO_FROM`, I just specified a random phone number) -10. Setup postgres +10. Setup PostgreSQL locally + + Start server: `pg_ctl -D /usr/local/var/postgres start &` + (Stop server: `pg_ctl -D /usr/local/var/postgres stop`) + + You need create a table `nextmo_requests`: + ``` + CREATE TABLE public.nexmo_requests + ( + device_key VARCHAR(64), + request_id VARCHAR(32), + request_status VARCHAR(32) + ) + WITH ( + OIDS=FALSE + ); + ``` + In this case `PG_URL=postgresql://localhost` 11. Delete the old `kms-secrets.develop.us-west-2.yml` and `kms-secrets.master.us-west-2.yml`. Generate your own using the following command: @@ -49,7 +66,7 @@ You only need to specify `[-k key_for_stage]` the first time you run the command for each stage. - You should encrypt the following `variables` and its corresponding `values`. If you followed step 6 to 10, you'll know what those values are. + You should encrypt the following `variable` and its corresponding `value`. If you followed step 6 to 10, you'll know what those values are. ``` RECAPTCHA_SECRET_KEY FUNCAPTCHA_PRIVATE_KEY From c5c0c93d723ea5e9283185ba9ec3481714764842 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 19:38:21 -0700 Subject: [PATCH 11/38] Update SETUP.md --- SETUP.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SETUP.md b/SETUP.md index 31da5b1..94e01b2 100644 --- a/SETUP.md +++ b/SETUP.md @@ -42,6 +42,7 @@ (Stop server: `pg_ctl -D /usr/local/var/postgres stop`) You need create a table `nextmo_requests`: + ``` CREATE TABLE public.nexmo_requests ( @@ -52,8 +53,9 @@ WITH ( OIDS=FALSE ); - ``` - In this case `PG_URL=postgresql://localhost` + ``` + + In this case `PG_URL=postgresql://localhost` 11. Delete the old `kms-secrets.develop.us-west-2.yml` and `kms-secrets.master.us-west-2.yml`. Generate your own using the following command: From 070a3cec7eb054e8de2e12336b1f45daf08efdc3 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 21:11:03 -0700 Subject: [PATCH 12/38] the return order should be error, response --- src/lib/phoneVerificationMgr.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/phoneVerificationMgr.js b/src/lib/phoneVerificationMgr.js index 1ff9d58..9c6a3e8 100644 --- a/src/lib/phoneVerificationMgr.js +++ b/src/lib/phoneVerificationMgr.js @@ -146,7 +146,7 @@ class PhoneVerificationMgr { if (resp.status == "0") { this.deleteRequest(deviceKey); - return { data: resp.request_id }, null; + return null, { data: resp.request_id }; } else { return ( null, From 085fd78044aa903db06c7ba1ca7a87239d1b53e7 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 21:41:49 -0700 Subject: [PATCH 13/38] Update SETUP.md --- SETUP.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/SETUP.md b/SETUP.md index 94e01b2..de11762 100644 --- a/SETUP.md +++ b/SETUP.md @@ -35,7 +35,7 @@ There is nothing special about these keys. They are just `specp256k1` key pair. You can generate them here: https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html 9. Create nextmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` - (I'm not sure where to get `NEXMO_FROM`, I just specified a random phone number) + You can find `NEXMO_FROM` in the dashboard, 'Numbers -> Your numbers' section. 10. Setup PostgreSQL locally Start server: `pg_ctl -D /usr/local/var/postgres start &` @@ -85,5 +85,21 @@ ```sls invoke local -f [function] -d [data]``` - e.g. ```sls invoke local -f start -d '{"deviceKey": "0x123456", "phoneNumber": [your own phone number]}'```. - You'll get a text message. + + test the following **Phone Verification Flow** + + You can choose a random string as a deviceKey + + - start verification: + + ```sls invoke local -f start -d '{"deviceKey": "0x123456", "phoneNumber":[your phone number]}'``` + + Send a code through SMS or Call + + - continue verification + + ```sls invoke local -f next -d '{"pathParameters": {"deviceKey": "0x123456"}}'``` + + - verify code and request token + + ```sls invoke local -f check -d '{"deviceKey": "0x123456", "code": [code you received]}'``` From b93a8307414990bdc05671d446b01ad1bd66304c Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 12 Jun 2018 21:52:44 -0700 Subject: [PATCH 14/38] return new fuel token --- src/api_handler.js | 3 ++- src/handlers/check_verification.js | 10 +++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/api_handler.js b/src/api_handler.js index b22bf7e..fafc2c0 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -46,7 +46,8 @@ let continueVerificationHandler = new ContinueVerificationHandler( phoneVerificationMgr ); let checkVerificationHandler = new CheckVerificationHandler( - phoneVerificationMgr + phoneVerificationMgr, + fuelTokenMgr ); //verifies recaptcha token and provides fuel token diff --git a/src/handlers/check_verification.js b/src/handlers/check_verification.js index 09026d6..8fab7e4 100644 --- a/src/handlers/check_verification.js +++ b/src/handlers/check_verification.js @@ -15,8 +15,9 @@ resource description - N/A */ class CheckVerificationHandler { - constructor(phoneVerificationMgr) { + constructor(phoneVerificationMgr, fuelTokenMgr) { this.phoneVerificationMgr = phoneVerificationMgr; + this.fuelTokenMgr = fuelTokenMgr; } debug(l) { @@ -59,14 +60,17 @@ class CheckVerificationHandler { try { //Verify & request token - this.phoneVerificationMgr.check(deviceKey, code).then((resp, err) => { + this.phoneVerificationMgr.check(deviceKey, code).then(async (resp, err) => { if (err) { throw { code: 500, message: err.message }; } - cb(null, { data: resp.data }); + + //Get fuel token + let fuelToken = await this.fuelTokenMgr.newToken(deviceKey); + cb(null, fuelToken); }); } catch (err) { cb({ From 649d5f618c54f0eee5b2e3438c8d43214af3e3ba Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Thu, 14 Jun 2018 19:41:48 -0700 Subject: [PATCH 15/38] Fix typos and add more explanation --- SETUP.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/SETUP.md b/SETUP.md index de11762..d743b8d 100644 --- a/SETUP.md +++ b/SETUP.md @@ -25,15 +25,17 @@ 5. In IAM management console, create a key for develop: https://console.aws.amazon.com/iam/home#/encryptionKeys/us-west-2 If you want to deploy to master too, create another key for master. - Make sure the keys you created are in the correct region (`us-west-2`). If you decide to create keys in another reason, make sure to change region configuration in other places too. + Make sure the keys you created are in the correct region (`us-west-2`). If you decide to create keys in another region, make sure to change region configuration in other places too. 6. Create reCaptcha account: https://www.google.com/recaptcha/admin, get `RECAPTCHA_SECRET_KEY` + + (You only need to set this up if you want to use the reCAPTCHA verification flow, not need for phone verification flow) 7. Create fun captcha account: https://www.funcaptcha.com/setup, get `FUNCAPTCHA_PRIVATE_KEY`. - (They currently ignore us after we fill in a form, skip this step for now) + (They currently ignore us after we fill in a form, skip this step for now; this is also not need for phone verification flow) 8. Generate Fuel token private & public keys: `FUEL_TOKEN_PRIVATE_KEY`, `FUEL_TOKEN_PUBLIC_KEY`. There is nothing special about these keys. They are just `specp256k1` key pair. You can generate them here: https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html -9. Create nextmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` +9. Create nexmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` You can find `NEXMO_FROM` in the dashboard, 'Numbers -> Your numbers' section. 10. Setup PostgreSQL locally @@ -41,7 +43,7 @@ Start server: `pg_ctl -D /usr/local/var/postgres start &` (Stop server: `pg_ctl -D /usr/local/var/postgres stop`) - You need create a table `nextmo_requests`: + You need create a table `nexmo_requests`: ``` CREATE TABLE public.nexmo_requests @@ -97,6 +99,8 @@ Send a code through SMS or Call - continue verification + + (This step is optional, it is for user who has previously indicated they prefer to recieve a code via text-to-speech, you'll receive a phone call.) ```sls invoke local -f next -d '{"pathParameters": {"deviceKey": "0x123456"}}'``` From 7beaac120b59ea4ac8109d34d6851e91ba828743 Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Sun, 17 Jun 2018 15:35:25 -0700 Subject: [PATCH 16/38] added additional documentation --- kms-secrets.develop.us-east-1.yml | 3 + kms-secrets.develop.us-west-2.yml | 3 - kms-secrets.master.us-west-2.yml | 3 - package-lock.json | 3631 +++++++++++++++-------------- package.json | 18 +- serverless.yml | 6 +- src/lib/fuelTokenMgr.js | 2 + src/lib/phoneVerificationMgr.js | 10 + 8 files changed, 1884 insertions(+), 1792 deletions(-) create mode 100644 kms-secrets.develop.us-east-1.yml delete mode 100644 kms-secrets.develop.us-west-2.yml delete mode 100644 kms-secrets.master.us-west-2.yml diff --git a/kms-secrets.develop.us-east-1.yml b/kms-secrets.develop.us-east-1.yml new file mode 100644 index 0000000..91682ed --- /dev/null +++ b/kms-secrets.develop.us-east-1.yml @@ -0,0 +1,3 @@ +secrets: + SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wGaJxNgaHD2ISFqhsAi+9i6AAACDTCCAgkGCSqGSIb3DQEHBqCCAfowggH2AgEAMIIB7wYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAwbcKDW6mhkLPD9N6YCARCAggHAE5BpNH1BxCv4ZJRDM/pyhdGH3YVR3D7Oed8306FKL/Na+ZRBkMthcxS1hFfpFykmj8yxdvApAjyGoZbYoiZQahVI9Ok0DMBs7V9QOn0lMRVKskhZ8KKqxbJIRrqKCGx2nuLpnCeWso2kKM8IU5zKSsFGMniYKUxqv/nzIUcYlZvFZ6tCMZ64kIGwp97L+fYr6wTzRnlndPLWufl12kv8iBWTbIRK8l/dRm5ZAV0LwF20b0d0dAn15RPEzVB/+NbHN1jmhJUN1KoHS2k8lYD5Q9rqw3Xv1kuYoDxViT5NReQXD8aLBs7+1X5cowlezinbvVwP+J4sgRpR3nYs4MDaWcUvJ05Gi3ickEcpuZpjZybhd9GhQOecbqu9zfYMCYNE3euwbSJ69Vi3r2IQX6F5j9vJmG0kpVC1Gpq7nsnn2UbXdqkrmiJm50ilDnUrxjxL8VFtAtETZ2TRjiuBrqPFk4SwSY7QEV/3EdtVREUGC5wSDLmEDI0UAE9MBRG0rOydQtSurRVsuDWNGH8GvfvsjINpMV5zl593tg5CXw7zB/hEKthqqeedND/LV7BJMQl5MMMUwai9+lV7l3bKNUVzNA== +keyArn: 'arn:aws:kms:us-east-1:711302153787:key/056da528-260d-4019-8419-7df6c292710d' diff --git a/kms-secrets.develop.us-west-2.yml b/kms-secrets.develop.us-west-2.yml deleted file mode 100644 index aefb432..0000000 --- a/kms-secrets.develop.us-west-2.yml +++ /dev/null @@ -1,3 +0,0 @@ -secrets: - SECRETS: AQICAHjyi5WE3iUcZqWfrCZYvoKVXy72dRUpvbq82/YMFV/EsAH/EHuXjjUzmfdm6XTocpJmAAACazCCAmcGCSqGSIb3DQEHBqCCAlgwggJUAgEAMIICTQYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxKagoxiefYM7K2m7ICARCAggIewQ0z8rtwS/Mf4o9aWsQKfUiVjS7HPYnGgiyeqY41oQgmX86cBPGd/4mgm2iq4gaLz0eqKd7vYlHuEEqMvbmFY0U+8cr6L5D0WOzgVxGEhja3u8Achl8m1YBb5HzLGGjJK1OGJEwWIdroEC564H5CkTLBGrsbyOH24aBoYA4FTA0jFlb1nsa3C5vaOYSfe3rVEBAC5S8mdfMOk0RRBWR0YKhq47AiizJzsyAdv7o+ZUcp2Lpmjssb/LGB5Y6sow7NLejuB0MsCuMFLBqJ/f5uLMYTfSXVKyyXm6ry51ILYfH04ep79cpmBbm5DfNlhmaQlO9pc4bWQ3yYpd0myi8GYc/eYtDVBl6C62FR0zbzJHawYEAFYVbURtBuVwhZVvBbJKFafWWhIZlQx1ZlGO/1KbeguOMhrJE4blp7Dl54zllsDK8ztNouSLCCbdWLgvm3wFBtrINXTRgm35/it+WhS0un4gLnSbDUubo0zw8XrwjJR3N21rhiohBkkOdWlRdqrxWkKOLj62lKYTDFrDyOASpFJVJRUcgyMawBIHsLRdEUYOaRJHrKi1uACztPC0g3HM8oZcsvGKXj831ARqa/H6rXPEQZVpkiKNesgW4UoeE7CNlSBfEsC1if2YkxSDLNBmsk1Dk8GwrICqhN4+vuhb09nIAnysSRLGttu/DAjTPjDSdxlzKgvPo5AnqD98RSn5VamuXpIFHQExg75dk= -keyArn: 'arn:aws:kms:us-west-2:113196216558:key/edd03ddb-c132-41d7-a82b-5d88e8e920d2' diff --git a/kms-secrets.master.us-west-2.yml b/kms-secrets.master.us-west-2.yml deleted file mode 100644 index 4069d0d..0000000 --- a/kms-secrets.master.us-west-2.yml +++ /dev/null @@ -1,3 +0,0 @@ -secrets: - SECRETS: AQICAHj4TGBrKUwM3m9cE5XTIC4Dy1R3l8f0FOi1DA4vq6VztgHCJKbMzdvYDWwQ7bI/30oKAAACajCCAmYGCSqGSIb3DQEHBqCCAlcwggJTAgEAMIICTAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAwy8wC9rUaiKbPsmZICARCAggIdlafPkko5lhoovMLORFReMq78oUw4uPGgQrmw/TwHKInS9c4N7yOt9Wc2wNprpbGQAqAznQ4IhWENNVVb8C2b+iNlh6Yd5aUx/RGvglAOWjtaMfh+wG7txDFvTyZFI0NhHDf2RAxCquUtpbW1jD0TIQYoBMrA2pgzmoNdgvs8EP4uXNgMBSnQFFaTPiE7ENYeVEE1TxajkpYuwSG6Xvp1bWW7SM7hXOWNBqUToL38MuszjOYWjtit/NdZ2l5JLnyBMZm9IFDEqjln8onukBWLFFZfqPaPVoTwDo45tJF2UPOiAc3q3xs6Cr+WclVN8zayFVF1DITNsLkIoeZyFEuUtT2LGSCRNkYtEO7oX/2XgFdN0Fpvp/cKv56wuhpwRaoL1Q84mtz/H24nsw4+8ZI15XoxrPaBfH+JWsbdAokZ6N26vzXEfpSS4QjL7y7U9ZyqXBUAN/QhYcEUAG2WznZY3MUsj4BeXLNRvDBnJ5EphRKomX14diQ044UQM4TF80lVYwG7xHRpeM9+Y7tjKhITJMq6Sbt1FtNq4JL71HtXy50UpgNILXJ1inrthtK3UUCfE3h//UjUTzvAZO5XEysTu/oN0lapMn6VS/ZUCLwkMCE9yvbrfrzMsrWb3GSgNBr+VKKV2jE3WVjFHHMyAOFkqRUaOPqyzocln4+EHV2QmCezXg/OZ5SFFqpXEH34m6JL6HIEiMdH1qgDpflWKQ== -keyArn: 'arn:aws:kms:us-west-2:113196216558:key/6363a2e8-3fc2-4d5c-b26b-767d1c833e37' diff --git a/package-lock.json b/package-lock.json index b76f55d..e9a498b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { - "name": "lambda-nisaba", - "version": "1.1.1", + "name": "lambda-nisaba-si", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -20,7 +20,7 @@ "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { @@ -36,7 +36,7 @@ "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.4" }, "dependencies": { "acorn": { @@ -52,10 +52,10 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "ajv-keywords": { @@ -68,9 +68,9 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -94,8 +94,9 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", + "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "anymatch": { @@ -103,8 +104,8 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha1-vLJLTzeTTZqnrBe0ra+J58du8us=", "requires": { - "micromatch": "3.1.9", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, "append-transform": { @@ -113,43 +114,46 @@ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "archiver": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", + "dev": true, "requires": { - "archiver-utils": "1.3.0", - "async": "2.6.0", - "buffer-crc32": "0.2.13", - "glob": "7.1.1", - "lodash": "4.17.5", - "readable-stream": "2.3.5", - "tar-stream": "1.5.5", - "zip-stream": "1.2.0" + "archiver-utils": "^1.3.0", + "async": "^2.0.0", + "buffer-crc32": "^0.2.1", + "glob": "^7.0.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0", + "tar-stream": "^1.5.0", + "zip-stream": "^1.2.0" } }, "archiver-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, "requires": { - "glob": "7.1.1", - "graceful-fs": "4.1.11", - "lazystream": "1.0.0", - "lodash": "4.17.5", - "normalize-path": "2.1.1", - "readable-stream": "2.3.5" + "glob": "^7.0.0", + "graceful-fs": "^4.1.0", + "lazystream": "^1.0.0", + "lodash": "^4.8.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", + "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -181,7 +185,8 @@ "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asn1": { "version": "0.2.3", @@ -193,9 +198,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", "integrity": "sha1-ucK/WAXx5kqt7tbfOiv6+1pz9aA=", "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -214,7 +219,8 @@ "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=" + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true }, "assign-symbols": { "version": "1.0.0", @@ -232,7 +238,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", "integrity": "sha1-YaKau2/MAm/qd+VtHG7FOnlZUfQ=", "requires": { - "lodash": "4.17.5" + "lodash": "^4.14.0" } }, "async-each": { @@ -254,9 +260,10 @@ "version": "2.209.0", "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.209.0.tgz", "integrity": "sha1-z+bKI3NvZlkystFMyOTknX6dIMw=", + "dev": true, "requires": { "buffer": "4.9.1", - "events": "1.1.1", + "events": "^1.1.1", "jmespath": "0.15.0", "querystring": "0.2.0", "sax": "1.2.1", @@ -269,7 +276,8 @@ "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" + "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", + "dev": true } } }, @@ -279,9 +287,9 @@ "integrity": "sha1-dpizuoL0k/cf8GCuISPNCAathnY=", "dev": true, "requires": { - "aws-sdk": "2.209.0", - "sinon": "1.17.7", - "traverse": "0.6.6" + "aws-sdk": "^2.3.0", + "sinon": "^1.17.3", + "traverse": "^0.6.6" } }, "aws-sign2": { @@ -300,9 +308,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { "ansi-styles": { @@ -317,11 +325,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "supports-color": { @@ -338,25 +346,25 @@ "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.1", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.8", - "json5": "0.5.1", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.0", + "debug": "^2.6.8", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.7", + "slash": "^1.0.0", + "source-map": "^0.5.6" } }, "babel-generator": { @@ -365,14 +373,14 @@ "integrity": "sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA=", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" }, "dependencies": { "jsesc": { @@ -389,9 +397,9 @@ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-explode-assignable-expression": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-call-delegate": { @@ -400,10 +408,10 @@ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-define-map": { @@ -412,10 +420,10 @@ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-explode-assignable-expression": { @@ -424,9 +432,9 @@ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-function-name": { @@ -435,11 +443,11 @@ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-get-function-arity": { @@ -448,8 +456,8 @@ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-hoist-variables": { @@ -458,8 +466,8 @@ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-optimise-call-expression": { @@ -468,8 +476,8 @@ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-helper-regex": { @@ -478,9 +486,9 @@ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-helper-remap-async-to-generator": { @@ -489,11 +497,11 @@ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helper-replace-supers": { @@ -502,12 +510,12 @@ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", "dev": true, "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-helpers": { @@ -516,8 +524,8 @@ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-jest": { @@ -526,8 +534,8 @@ "integrity": "sha1-LOBZUZqTdKLEbyRVtvvvWtddhj4=", "dev": true, "requires": { - "babel-plugin-istanbul": "4.1.5", - "babel-preset-jest": "21.2.0" + "babel-plugin-istanbul": "^4.0.0", + "babel-preset-jest": "^21.2.0" } }, "babel-loader": { @@ -536,9 +544,9 @@ "integrity": "sha1-40Y5OL1ObVXRwXTFSF1AahiO0BU=", "dev": true, "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1" + "find-cache-dir": "^1.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1" } }, "babel-messages": { @@ -547,7 +555,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-check-es2015-constants": { @@ -556,7 +564,7 @@ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-istanbul": { @@ -565,9 +573,9 @@ "integrity": "sha1-Z2DN2Xf0EdPhdbsGTyvDJ9mbK24=", "dev": true, "requires": { - "find-up": "2.1.0", - "istanbul-lib-instrument": "1.10.1", - "test-exclude": "4.2.1" + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.7.5", + "test-exclude": "^4.1.1" } }, "babel-plugin-jest-hoist": { @@ -581,11 +589,11 @@ "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.1.1.tgz", "integrity": "sha512-1Q77Al4ydp6nYApJ7sQ2fmgz30WuQgJZegIYuyOdbdpxenB/bSezQ3hDPsumIXGlUS4vUIv+EwFjzzXZNWtARw==", "requires": { - "find-babel-config": "1.1.0", - "glob": "7.1.2", - "pkg-up": "2.0.0", - "reselect": "3.0.1", - "resolve": "1.7.1" + "find-babel-config": "^1.1.0", + "glob": "^7.1.2", + "pkg-up": "^2.0.0", + "reselect": "^3.0.1", + "resolve": "^1.4.0" }, "dependencies": { "glob": { @@ -593,12 +601,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "resolve": { @@ -606,7 +614,7 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } } } @@ -641,9 +649,9 @@ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-remap-async-to-generator": "^6.24.1", + "babel-plugin-syntax-async-functions": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-arrow-functions": { @@ -652,7 +660,7 @@ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoped-functions": { @@ -661,7 +669,7 @@ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-block-scoping": { @@ -670,11 +678,11 @@ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "lodash": "^4.17.4" } }, "babel-plugin-transform-es2015-classes": { @@ -683,15 +691,15 @@ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", "dev": true, "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-define-map": "^6.24.1", + "babel-helper-function-name": "^6.24.1", + "babel-helper-optimise-call-expression": "^6.24.1", + "babel-helper-replace-supers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-computed-properties": { @@ -700,8 +708,8 @@ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-destructuring": { @@ -710,7 +718,7 @@ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-duplicate-keys": { @@ -719,8 +727,8 @@ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-for-of": { @@ -729,7 +737,7 @@ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-function-name": { @@ -738,9 +746,9 @@ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-function-name": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-literals": { @@ -749,7 +757,7 @@ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-modules-amd": { @@ -758,9 +766,9 @@ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-commonjs": { @@ -769,10 +777,10 @@ "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", "dev": true, "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" + "babel-plugin-transform-strict-mode": "^6.24.1", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-types": "^6.26.0" } }, "babel-plugin-transform-es2015-modules-systemjs": { @@ -781,9 +789,9 @@ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-helper-hoist-variables": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-modules-umd": { @@ -792,9 +800,9 @@ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", "dev": true, "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "babel-plugin-transform-es2015-modules-amd": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, "babel-plugin-transform-es2015-object-super": { @@ -803,8 +811,8 @@ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", "dev": true, "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "babel-helper-replace-supers": "^6.24.1", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-parameters": { @@ -813,12 +821,12 @@ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-call-delegate": "^6.24.1", + "babel-helper-get-function-arity": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1", + "babel-traverse": "^6.24.1", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-shorthand-properties": { @@ -827,8 +835,8 @@ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-spread": { @@ -837,7 +845,7 @@ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-sticky-regex": { @@ -846,9 +854,9 @@ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-plugin-transform-es2015-template-literals": { @@ -857,7 +865,7 @@ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-typeof-symbol": { @@ -866,7 +874,7 @@ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-es2015-unicode-regex": { @@ -875,9 +883,9 @@ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", "dev": true, "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" + "babel-helper-regex": "^6.24.1", + "babel-runtime": "^6.22.0", + "regexpu-core": "^2.0.0" } }, "babel-plugin-transform-exponentiation-operator": { @@ -886,9 +894,9 @@ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", "dev": true, "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1", + "babel-plugin-syntax-exponentiation-operator": "^6.8.0", + "babel-runtime": "^6.22.0" } }, "babel-plugin-transform-regenerator": { @@ -897,7 +905,7 @@ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", "dev": true, "requires": { - "regenerator-transform": "0.10.1" + "regenerator-transform": "^0.10.0" } }, "babel-plugin-transform-strict-mode": { @@ -906,8 +914,8 @@ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "babel-runtime": "^6.22.0", + "babel-types": "^6.24.1" } }, "babel-preset-env": { @@ -916,36 +924,36 @@ "integrity": "sha1-oYtWTMm5r99KrleuPBsNmRiOb0g=", "dev": true, "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.11.3", - "invariant": "2.2.4", - "semver": "5.5.0" + "babel-plugin-check-es2015-constants": "^6.22.0", + "babel-plugin-syntax-trailing-function-commas": "^6.22.0", + "babel-plugin-transform-async-to-generator": "^6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0", + "babel-plugin-transform-es2015-block-scoping": "^6.23.0", + "babel-plugin-transform-es2015-classes": "^6.23.0", + "babel-plugin-transform-es2015-computed-properties": "^6.22.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0", + "babel-plugin-transform-es2015-for-of": "^6.23.0", + "babel-plugin-transform-es2015-function-name": "^6.22.0", + "babel-plugin-transform-es2015-literals": "^6.22.0", + "babel-plugin-transform-es2015-modules-amd": "^6.22.0", + "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0", + "babel-plugin-transform-es2015-modules-umd": "^6.23.0", + "babel-plugin-transform-es2015-object-super": "^6.22.0", + "babel-plugin-transform-es2015-parameters": "^6.23.0", + "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "^6.22.0", + "babel-plugin-transform-es2015-template-literals": "^6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "^6.22.0", + "babel-plugin-transform-exponentiation-operator": "^6.22.0", + "babel-plugin-transform-regenerator": "^6.22.0", + "browserslist": "^2.1.2", + "invariant": "^2.2.2", + "semver": "^5.3.0" }, "dependencies": { "semver": { @@ -962,8 +970,8 @@ "integrity": "sha1-/50rzgir2Y6KNtmopRibkXO4Vjg=", "dev": true, "requires": { - "babel-plugin-jest-hoist": "21.2.0", - "babel-plugin-syntax-object-rest-spread": "6.13.0" + "babel-plugin-jest-hoist": "^21.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" } }, "babel-register": { @@ -972,13 +980,13 @@ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.3", - "home-or-tmp": "2.0.0", - "lodash": "4.17.5", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" } }, "babel-runtime": { @@ -986,8 +994,8 @@ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -996,11 +1004,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -1009,15 +1017,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.8", - "globals": "9.18.0", - "invariant": "2.2.4", - "lodash": "4.17.5" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -1026,10 +1034,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -1048,13 +1056,13 @@ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -1062,7 +1070,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } } } @@ -1072,7 +1080,7 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.4.tgz", "integrity": "sha1-lMF4hzbaBl7bHWiAiGnjV8l3+nc=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "base64-js": { @@ -1091,7 +1099,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "big.js": { @@ -1105,11 +1113,13 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" }, "bl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", - "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "dev": true, "requires": { - "readable-stream": "2.3.5" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" } }, "bluebird": { @@ -1127,7 +1137,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" }, "dependencies": { "hoek": { @@ -1142,7 +1152,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -1151,18 +1161,18 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "kind-of": "^6.0.2", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -1170,7 +1180,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -1178,7 +1188,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "kind-of": { @@ -1203,21 +1213,22 @@ } }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true }, "browserify-aes": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", "integrity": "sha1-OLerVe24Bv8tzaGn8WIHc6R3xJ8=", "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -1225,9 +1236,9 @@ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -1235,9 +1246,9 @@ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1" } }, "browserify-rsa": { @@ -1245,8 +1256,8 @@ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -1254,13 +1265,13 @@ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1268,7 +1279,7 @@ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha1-KGlFnZqjviRf6P4sofRuLn9U1z8=", "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "browserslist": { @@ -1277,8 +1288,8 @@ "integrity": "sha1-/jYWeu0bvN5IJ+v+cTR6LMcLmbI=", "dev": true, "requires": { - "caniuse-lite": "1.0.30000814", - "electron-to-chromium": "1.3.37" + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" } }, "bser": { @@ -1287,7 +1298,7 @@ "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "dev": true, "requires": { - "node-int64": "0.4.0" + "node-int64": "^0.4.0" } }, "buffer": { @@ -1295,21 +1306,44 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.2.3", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "dev": true + }, "buffer-writer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz", @@ -1335,15 +1369,15 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "callsites": { @@ -1373,44 +1407,48 @@ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chai": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, "requires": { - "assertion-error": "1.1.0", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.8" + "assertion-error": "^1.0.1", + "check-error": "^1.0.1", + "deep-eql": "^3.0.0", + "get-func-name": "^2.0.0", + "pathval": "^1.0.0", + "type-detect": "^4.0.0" } }, "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", + "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true }, "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", + "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1418,25 +1456,26 @@ "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true }, "chokidar": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.2.tgz", "integrity": "sha1-TcZROe6ycUl3c1tqNdBul7SU39c=", "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.1", - "braces": "2.3.1", - "fsevents": "1.1.3", - "glob-parent": "3.1.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "4.0.0", - "normalize-path": "2.1.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0", - "upath": "1.0.4" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.0.0", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.0" } }, "ci-info": { @@ -1450,8 +1489,8 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha1-h2Dk7MJy9MNjUy+SbYdKriwTl94=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "class-utils": { @@ -1459,10 +1498,10 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -1470,7 +1509,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { @@ -1478,7 +1517,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1486,7 +1525,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1496,7 +1535,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -1504,7 +1543,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -1514,9 +1553,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -1531,8 +1570,8 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" } }, @@ -1551,38 +1590,38 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color-convert": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true }, "combined-stream": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": "1.0.1" - } + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true }, "commondir": { "version": "1.0.1", @@ -1605,11 +1644,12 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, "requires": { - "buffer-crc32": "0.2.13", - "crc32-stream": "2.0.0", - "normalize-path": "2.1.1", - "readable-stream": "2.3.5" + "buffer-crc32": "^0.2.1", + "crc32-stream": "^2.0.0", + "normalize-path": "^2.0.0", + "readable-stream": "^2.0.0" } }, "concat-map": { @@ -1622,7 +1662,7 @@ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -1660,15 +1700,17 @@ "crc": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", - "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=" + "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=", + "dev": true }, "crc32-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, "requires": { - "crc": "3.5.0", - "readable-stream": "2.3.5" + "crc": "^3.4.4", + "readable-stream": "^2.0.0" } }, "create-ecdh": { @@ -1676,8 +1718,8 @@ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -1685,10 +1727,10 @@ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.10" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -1696,12 +1738,12 @@ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -1709,9 +1751,9 @@ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cryptiles": { @@ -1719,7 +1761,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", "requires": { - "boom": "5.2.0" + "boom": "5.x.x" }, "dependencies": { "boom": { @@ -1727,7 +1769,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" } }, "hoek": { @@ -1742,17 +1784,17 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha1-OWz58xN/A+S45TLFj2mCVOAPgOw=", "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.6", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "cssom": { @@ -1767,7 +1809,7 @@ "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", "dev": true, "requires": { - "cssom": "0.3.2" + "cssom": "0.3.x" } }, "d": { @@ -1775,7 +1817,7 @@ "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "requires": { - "es5-ext": "0.10.40" + "es5-ext": "^0.10.9" } }, "dashdash": { @@ -1783,7 +1825,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "date-now": { @@ -1819,9 +1861,10 @@ "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, "requires": { - "type-detect": "4.0.8" + "type-detect": "^4.0.0" } }, "deep-is": { @@ -1836,7 +1879,7 @@ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" }, "dependencies": { "strip-bom": { @@ -1845,7 +1888,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -1855,8 +1898,8 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" } }, "delayed-stream": { @@ -1869,8 +1912,8 @@ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "detect-indent": { @@ -1879,7 +1922,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "did-jwt": { @@ -1888,16 +1931,16 @@ "integrity": "sha512-86pGvhXtQ2D4ilNNmuAP1LaWIx9udt82ww/SqFZGJ1xkkQh3evioS6BexlJO+f7vU93j+Rr/ZPfqvp+AadJDqg==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "base64url": "2.0.0", - "buffer": "5.1.0", - "did-resolver": "0.0.4", - "elliptic": "6.4.0", - "js-sha256": "0.9.0", - "js-sha3": "0.7.0", - "mnid": "0.1.1", - "uport-did-resolver": "0.0.2", - "uport-lite": "1.0.2" + "babel-runtime": "^6.26.0", + "base64url": "^2.0.0", + "buffer": "^5.1.0", + "did-resolver": "^0.0.4", + "elliptic": "^6.4.0", + "js-sha256": "^0.9.0", + "js-sha3": "^0.7.0", + "mnid": "^0.1.1", + "uport-did-resolver": "^0.0.2", + "uport-lite": "^1.0.2" }, "dependencies": { "buffer": { @@ -1906,8 +1949,8 @@ "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", "dev": true, "requires": { - "base64-js": "1.2.3", - "ieee754": "1.1.8" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } }, "js-sha3": { @@ -1923,22 +1966,23 @@ "resolved": "https://registry.npmjs.org/did-resolver/-/did-resolver-0.0.4.tgz", "integrity": "sha512-EKjGg3affl0xVowQ/vWRUqQU1E4h4uuCqXXNVKHlPqRN/pu0mkqk66b8Fly1Z5CxhTuc1ImOob2YiBMhCrh4Nw==", "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.26.0" } }, "diff": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true }, "diffie-hellman": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "domain-browser": { @@ -1952,7 +1996,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "ecdsa-sig-formatter": { @@ -1960,8 +2004,8 @@ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", "requires": { - "base64url": "2.0.0", - "safe-buffer": "5.1.1" + "base64url": "^2.0.0", + "safe-buffer": "^5.0.1" } }, "electron-to-chromium": { @@ -1975,13 +2019,13 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -1992,9 +2036,10 @@ "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha1-7SljTRm6ukY7bOa4CjchPqtx7EM=", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { @@ -2002,10 +2047,10 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" } }, "errno": { @@ -2013,7 +2058,7 @@ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -2021,7 +2066,7 @@ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es5-ext": { @@ -2029,8 +2074,8 @@ "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.40.tgz", "integrity": "sha1-qz0heblDAIxenvJBvrJe9BQkx3Q=", "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1" } }, "es6-iterator": { @@ -2038,9 +2083,9 @@ "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -2048,12 +2093,12 @@ "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-set": { @@ -2061,11 +2106,11 @@ "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -2073,8 +2118,8 @@ "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -2082,16 +2127,17 @@ "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "escodegen": { "version": "1.9.1", @@ -2099,11 +2145,11 @@ "integrity": "sha1-264X75bI5L7bE1b0UE+kzC98t+I=", "dev": true, "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.6.1" + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { "esprima": { @@ -2126,10 +2172,10 @@ "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.1", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { @@ -2143,7 +2189,7 @@ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha1-AHo7n9vCs7uH5IeeoZyS/b05Qs8=", "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -2283,15 +2329,15 @@ "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-0.0.8.tgz", "integrity": "sha512-UfjsAX5ZQ1c9Uz71OoYk5yhFaEl4oKU4L7hBJ+NDCzZkfUzkd4NmAq0GP7Oird75/DSNqj9PvCCYNmyCSmMNzA==", "requires": { - "babel-plugin-module-resolver": "3.1.1", - "babel-runtime": "6.26.0", - "buffer": "5.1.0", - "did-resolver": "0.0.4", - "ethjs-abi": "0.2.1", - "ethjs-contract": "0.1.9", - "ethjs-provider-http": "0.1.6", - "ethjs-query": "0.3.6", - "ethr-did-registry": "0.0.2" + "babel-plugin-module-resolver": "^3.1.1", + "babel-runtime": "^6.26.0", + "buffer": "^5.1.0", + "did-resolver": "^0.0.4", + "ethjs-abi": "^0.2.1", + "ethjs-contract": "^0.1.9", + "ethjs-provider-http": "^0.1.6", + "ethjs-query": "^0.3.5", + "ethr-did-registry": "^0.0.2" }, "dependencies": { "buffer": { @@ -2299,8 +2345,8 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", "requires": { - "base64-js": "1.2.3", - "ieee754": "1.1.8" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } } } @@ -2310,8 +2356,8 @@ "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "requires": { - "d": "1.0.0", - "es5-ext": "0.10.40" + "d": "1", + "es5-ext": "~0.10.14" } }, "events": { @@ -2324,8 +2370,8 @@ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", "integrity": "sha1-f8vbGY3HGVlDLv4ThCaE4FJaywI=", "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "exec-sh": { @@ -2334,7 +2380,7 @@ "integrity": "sha1-FjuYpuiea2W0fCoo0hW8H2OYnDg=", "dev": true, "requires": { - "merge": "1.2.0" + "merge": "^1.1.3" } }, "execa": { @@ -2342,13 +2388,13 @@ "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-brackets": { @@ -2356,13 +2402,13 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "requires": { - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -2370,7 +2416,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -2378,7 +2424,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -2386,7 +2432,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -2394,7 +2440,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2404,7 +2450,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -2412,7 +2458,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -2422,9 +2468,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -2440,7 +2486,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" }, "dependencies": { "fill-range": { @@ -2449,11 +2495,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "is-number": { @@ -2462,7 +2508,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "isobject": { @@ -2482,12 +2528,12 @@ "integrity": "sha1-ADrCrHAFw8Kec7OKJy1K+t1tHXs=", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "jest-diff": "21.2.1", - "jest-get-type": "21.2.0", - "jest-matcher-utils": "21.2.1", - "jest-message-util": "21.2.1", - "jest-regex-util": "21.2.0" + "ansi-styles": "^3.2.0", + "jest-diff": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0" } }, "extend": { @@ -2500,8 +2546,8 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2509,7 +2555,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2519,14 +2565,14 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -2534,7 +2580,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -2542,7 +2588,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -2574,7 +2620,7 @@ "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, "requires": { - "bser": "2.0.0" + "bser": "^2.0.0" } }, "filename-regex": { @@ -2589,8 +2635,8 @@ "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "dev": true, "requires": { - "glob": "7.1.1", - "minimatch": "3.0.4" + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, "fill-range": { @@ -2598,10 +2644,10 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -2609,7 +2655,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -2619,8 +2665,8 @@ "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", "requires": { - "json5": "0.5.1", - "path-exists": "3.0.0" + "json5": "^0.5.1", + "path-exists": "^3.0.0" } }, "find-cache-dir": { @@ -2629,9 +2675,9 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.2.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, "find-up": { @@ -2639,7 +2685,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "for-in": { @@ -2653,7 +2699,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "forever-agent": { @@ -2666,9 +2712,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "requires": { - "asynckit": "0.4.0", + "asynckit": "^0.4.0", "combined-stream": "1.0.6", - "mime-types": "2.1.18" + "mime-types": "^2.1.12" } }, "formatio": { @@ -2677,7 +2723,7 @@ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", "dev": true, "requires": { - "samsam": "1.1.2" + "samsam": "~1.1" } }, "fragment-cache": { @@ -2685,17 +2731,24 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", + "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "3.0.1", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" } }, "fs.realpath": { @@ -2709,8 +2762,8 @@ "integrity": "sha1-EfgjGPX+e7LNIpZaEI6TBiCCFtg=", "optional": true, "requires": { - "nan": "2.9.2", - "node-pre-gyp": "0.6.39" + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" }, "dependencies": { "abbrev": { @@ -2725,8 +2778,8 @@ "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { @@ -2746,8 +2799,8 @@ "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -2791,7 +2844,7 @@ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { @@ -2799,7 +2852,7 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { @@ -2807,7 +2860,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { @@ -2815,7 +2868,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" } }, @@ -2846,7 +2899,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { @@ -2869,7 +2922,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { @@ -2878,7 +2931,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2927,7 +2980,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -2953,9 +3006,9 @@ "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "fs.realpath": { @@ -2968,10 +3021,10 @@ "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -2980,9 +3033,9 @@ "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { @@ -2991,14 +3044,14 @@ "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "getpass": { @@ -3007,7 +3060,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -3023,12 +3076,12 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-fs": { @@ -3048,8 +3101,8 @@ "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "has-unicode": { @@ -3063,10 +3116,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { @@ -3080,9 +3133,9 @@ "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { @@ -3090,8 +3143,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3110,7 +3163,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-typedarray": { @@ -3136,7 +3189,7 @@ "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "jsbn": { @@ -3157,7 +3210,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -3202,7 +3255,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "requires": { - "mime-db": "1.27.0" + "mime-db": "~1.27.0" } }, "minimatch": { @@ -3210,7 +3263,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "1.1.7" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3238,17 +3291,17 @@ "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", "optional": true, "requires": { - "detect-libc": "1.0.2", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { @@ -3257,8 +3310,8 @@ "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -3267,10 +3320,10 @@ "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { @@ -3295,7 +3348,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3316,8 +3369,8 @@ "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -3354,10 +3407,10 @@ "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3373,13 +3426,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "request": { @@ -3388,28 +3441,28 @@ "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { @@ -3417,7 +3470,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { @@ -3448,7 +3501,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { @@ -3457,15 +3510,15 @@ "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -3481,9 +3534,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -3491,7 +3544,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "stringstream": { @@ -3505,7 +3558,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3519,9 +3572,9 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -3530,14 +3583,14 @@ "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { @@ -3546,7 +3599,7 @@ "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -3555,7 +3608,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -3596,7 +3649,7 @@ "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { @@ -3614,7 +3667,8 @@ "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true }, "get-stream": { "version": "3.0.0", @@ -3631,20 +3685,21 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" } }, "glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -3653,8 +3708,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "glob-parent": { @@ -3663,7 +3718,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "is-extglob": { @@ -3678,7 +3733,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -3688,8 +3743,8 @@ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -3697,7 +3752,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -3713,15 +3768,11 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, "growl": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", - "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true }, "growly": { "version": "1.3.0", @@ -3735,10 +3786,10 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "async": { @@ -3753,7 +3804,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -3768,8 +3819,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "requires": { - "ajv": "5.5.2", - "har-schema": "2.0.0" + "ajv": "^5.1.0", + "har-schema": "^2.0.0" } }, "has-ansi": { @@ -3778,22 +3829,23 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -3801,8 +3853,8 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -3810,7 +3862,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3820,7 +3872,7 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1" } }, "hash.js": { @@ -3828,8 +3880,8 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha1-NA3tvmKQGHFRweodd3o0SJNd+EY=", "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, "hawk": { @@ -3837,10 +3889,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.1", - "sntp": "2.1.0" + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" }, "dependencies": { "hoek": { @@ -3853,16 +3905,17 @@ "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hoek": { @@ -3876,16 +3929,17 @@ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" } }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, "requires": { - "parse-passwd": "1.0.0" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { @@ -3899,7 +3953,7 @@ "integrity": "sha1-5w2EuU2lOqN14R/jo1G+ZkLKRvg=", "dev": true, "requires": { - "whatwg-encoding": "1.0.3" + "whatwg-encoding": "^1.0.1" } }, "http-signature": { @@ -3907,9 +3961,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "https-browserify": { @@ -3944,8 +3998,8 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3964,7 +4018,7 @@ "integrity": "sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY=", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -3977,7 +4031,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY=", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" }, "dependencies": { "kind-of": { @@ -3997,7 +4051,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -4010,7 +4064,7 @@ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-ci": { @@ -4019,7 +4073,7 @@ "integrity": "sha1-JH5BYueGDOu9rzC3dNawrH3P56U=", "dev": true, "requires": { - "ci-info": "1.1.3" + "ci-info": "^1.0.0" } }, "is-data-descriptor": { @@ -4027,7 +4081,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc=", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" }, "dependencies": { "kind-of": { @@ -4042,9 +4096,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw=", "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -4066,7 +4120,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -4085,7 +4139,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -4093,7 +4147,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -4101,7 +4155,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-hex-prefixed": { @@ -4114,7 +4168,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-odd": { @@ -4122,7 +4176,7 @@ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", "requires": { - "is-number": "4.0.0" + "is-number": "^4.0.0" }, "dependencies": { "is-number": { @@ -4137,7 +4191,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-posix-bracket": { @@ -4204,18 +4258,18 @@ "integrity": "sha1-TDsF0YwAFtECLgebmNyCxA9IiVQ=", "dev": true, "requires": { - "async": "2.6.0", - "compare-versions": "3.1.0", - "fileset": "2.0.3", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.4", - "istanbul-lib-source-maps": "1.2.4", - "istanbul-reports": "1.3.0", - "js-yaml": "3.11.0", - "mkdirp": "0.5.1", - "once": "1.4.0" + "async": "^2.1.4", + "compare-versions": "^3.1.0", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-hook": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-report": "^1.1.4", + "istanbul-lib-source-maps": "^1.2.4", + "istanbul-reports": "^1.3.0", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" }, "dependencies": { "debug": { @@ -4233,11 +4287,11 @@ "integrity": "sha1-zHzK1hYp9O//ji94rbjFIsmXbsc=", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" } }, "ms": { @@ -4260,7 +4314,7 @@ "integrity": "sha1-rlVv1aQabo76CxACseQW3+r5gWw=", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { @@ -4269,13 +4323,13 @@ "integrity": "sha1-cktLbKzrqGktPx+dByfiecQBr3s=", "dev": true, "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.0", + "semver": "^5.3.0" }, "dependencies": { "semver": { @@ -4292,10 +4346,10 @@ "integrity": "sha1-6IbN9QXE672OCZ5DlqkNCijirLU=", "dev": true, "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.1.2" + "istanbul-lib-coverage": "^1.2.0", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" } }, "istanbul-lib-source-maps": { @@ -4304,11 +4358,11 @@ "integrity": "sha1-IPtUsU4Us/tu22rKNXH9IUPbROY=", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -4334,7 +4388,7 @@ "integrity": "sha1-LzIugeHZUgdnWX3KPCCgzOiaNVQ=", "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, "jest": { @@ -4343,7 +4397,7 @@ "integrity": "sha1-yWTgtHODdooUOOPM88PUcDJ2BOE=", "dev": true, "requires": { - "jest-cli": "21.2.1" + "jest-cli": "^21.2.1" }, "dependencies": { "ansi-regex": { @@ -4358,7 +4412,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -4373,9 +4427,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "camelcase": { @@ -4390,9 +4444,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -4407,9 +4461,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "strip-ansi": { @@ -4418,7 +4472,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } } } @@ -4429,7 +4483,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -4438,7 +4492,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "glob": { @@ -4447,12 +4501,12 @@ "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "is-extglob": { @@ -4467,7 +4521,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "jest-cli": { @@ -4476,35 +4530,35 @@ "integrity": "sha1-nFKLZinWUZERONIovbAzwVfsjAA=", "dev": true, "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.2", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "is-ci": "1.1.0", - "istanbul-api": "1.3.1", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-source-maps": "1.2.3", - "jest-changed-files": "21.2.0", - "jest-config": "21.2.1", - "jest-environment-jsdom": "21.2.1", - "jest-haste-map": "21.2.0", - "jest-message-util": "21.2.1", - "jest-regex-util": "21.2.0", - "jest-resolve-dependencies": "21.2.0", - "jest-runner": "21.2.1", - "jest-runtime": "21.2.1", - "jest-snapshot": "21.2.1", - "jest-util": "21.2.1", - "micromatch": "2.3.11", - "node-notifier": "5.2.1", - "pify": "3.0.0", - "slash": "1.0.0", - "string-length": "2.0.0", - "strip-ansi": "4.0.0", - "which": "1.3.0", - "worker-farm": "1.6.0", - "yargs": "9.0.1" + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "istanbul-api": "^1.1.1", + "istanbul-lib-coverage": "^1.0.1", + "istanbul-lib-instrument": "^1.4.2", + "istanbul-lib-source-maps": "^1.1.0", + "jest-changed-files": "^21.2.0", + "jest-config": "^21.2.1", + "jest-environment-jsdom": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-message-util": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve-dependencies": "^21.2.0", + "jest-runner": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-snapshot": "^21.2.1", + "jest-util": "^21.2.1", + "micromatch": "^2.3.11", + "node-notifier": "^5.0.2", + "pify": "^3.0.0", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "worker-farm": "^1.3.1", + "yargs": "^9.0.0" } }, "micromatch": { @@ -4513,19 +4567,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "pify": { @@ -4540,7 +4594,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "yargs": { @@ -4549,19 +4603,19 @@ "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" } } } @@ -4572,7 +4626,7 @@ "integrity": "sha1-Xb7srUL12ItIIzSQLOHLptl5jSk=", "dev": true, "requires": { - "throat": "4.1.0" + "throat": "^4.0.0" } }, "jest-config": { @@ -4581,17 +4635,17 @@ "integrity": "sha1-x1hseerQvMHzjEAeVflk8TvypIA=", "dev": true, "requires": { - "chalk": "2.3.2", - "glob": "7.1.1", - "jest-environment-jsdom": "21.2.1", - "jest-environment-node": "21.2.1", - "jest-get-type": "21.2.0", - "jest-jasmine2": "21.2.1", - "jest-regex-util": "21.2.0", - "jest-resolve": "21.2.0", - "jest-util": "21.2.1", - "jest-validate": "21.2.1", - "pretty-format": "21.2.1" + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^21.2.1", + "jest-environment-node": "^21.2.1", + "jest-get-type": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "jest-validate": "^21.2.1", + "pretty-format": "^21.2.1" } }, "jest-diff": { @@ -4600,10 +4654,10 @@ "integrity": "sha1-RszLbKstAs6YvDFAEXZLuVsGW08=", "dev": true, "requires": { - "chalk": "2.3.2", - "diff": "3.2.0", - "jest-get-type": "21.2.0", - "pretty-format": "21.2.1" + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" } }, "jest-docblock": { @@ -4618,9 +4672,9 @@ "integrity": "sha1-ONmYDIJZsqYI7CMt7uYommDZ1bQ=", "dev": true, "requires": { - "jest-mock": "21.2.0", - "jest-util": "21.2.1", - "jsdom": "9.12.0" + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1", + "jsdom": "^9.12.0" } }, "jest-environment-node": { @@ -4629,8 +4683,8 @@ "integrity": "sha1-mMZ99WY8f74g9ueSrCJyx0DTuMg=", "dev": true, "requires": { - "jest-mock": "21.2.0", - "jest-util": "21.2.1" + "jest-mock": "^21.2.0", + "jest-util": "^21.2.1" } }, "jest-get-type": { @@ -4645,12 +4699,12 @@ "integrity": "sha1-E2PwqLtDOPJPABgGVx7/eksv89g=", "dev": true, "requires": { - "fb-watchman": "2.0.0", - "graceful-fs": "4.1.11", - "jest-docblock": "21.2.0", - "micromatch": "2.3.11", - "sane": "2.4.1", - "worker-farm": "1.6.0" + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-docblock": "^21.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0", + "worker-farm": "^1.3.1" }, "dependencies": { "arr-diff": { @@ -4659,7 +4713,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -4674,9 +4728,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -4685,7 +4739,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -4694,7 +4748,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-extglob": { @@ -4709,7 +4763,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "micromatch": { @@ -4718,19 +4772,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } @@ -4741,14 +4795,14 @@ "integrity": "sha1-nMb8EIrM+pfv684QxDCFSKTqdZI=", "dev": true, "requires": { - "chalk": "2.3.2", - "expect": "21.2.1", - "graceful-fs": "4.1.11", - "jest-diff": "21.2.1", - "jest-matcher-utils": "21.2.1", - "jest-message-util": "21.2.1", - "jest-snapshot": "21.2.1", - "p-cancelable": "0.3.0" + "chalk": "^2.0.1", + "expect": "^21.2.1", + "graceful-fs": "^4.1.11", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-snapshot": "^21.2.1", + "p-cancelable": "^0.3.0" } }, "jest-matcher-utils": { @@ -4757,9 +4811,9 @@ "integrity": "sha1-csgm6rpBoJOsK0Vl+GXrhHXeD2Q=", "dev": true, "requires": { - "chalk": "2.3.2", - "jest-get-type": "21.2.0", - "pretty-format": "21.2.1" + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "pretty-format": "^21.2.1" } }, "jest-message-util": { @@ -4768,9 +4822,9 @@ "integrity": "sha1-v+XUaSyEyCfR3PQYI3lVWPChrL4=", "dev": true, "requires": { - "chalk": "2.3.2", - "micromatch": "2.3.11", - "slash": "1.0.0" + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0" }, "dependencies": { "arr-diff": { @@ -4779,7 +4833,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -4794,9 +4848,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -4805,7 +4859,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -4814,7 +4868,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-extglob": { @@ -4829,7 +4883,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "micromatch": { @@ -4838,19 +4892,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } } } @@ -4873,9 +4927,9 @@ "integrity": "sha1-BokTrSumogIY5f0yRx84dABd46Y=", "dev": true, "requires": { - "browser-resolve": "1.11.2", - "chalk": "2.3.2", - "is-builtin-module": "1.0.0" + "browser-resolve": "^1.11.2", + "chalk": "^2.0.1", + "is-builtin-module": "^1.0.0" } }, "jest-resolve-dependencies": { @@ -4884,7 +4938,7 @@ "integrity": "sha1-niMeNx4ac2oa1OS5qEO8cr/gPQk=", "dev": true, "requires": { - "jest-regex-util": "21.2.0" + "jest-regex-util": "^21.2.0" } }, "jest-runner": { @@ -4893,16 +4947,16 @@ "integrity": "sha1-GUcy4+UYv7PXy/wP1YcSRsfhpGc=", "dev": true, "requires": { - "jest-config": "21.2.1", - "jest-docblock": "21.2.0", - "jest-haste-map": "21.2.0", - "jest-jasmine2": "21.2.1", - "jest-message-util": "21.2.1", - "jest-runtime": "21.2.1", - "jest-util": "21.2.1", - "pify": "3.0.0", - "throat": "4.1.0", - "worker-farm": "1.6.0" + "jest-config": "^21.2.1", + "jest-docblock": "^21.2.0", + "jest-haste-map": "^21.2.0", + "jest-jasmine2": "^21.2.1", + "jest-message-util": "^21.2.1", + "jest-runtime": "^21.2.1", + "jest-util": "^21.2.1", + "pify": "^3.0.0", + "throat": "^4.0.0", + "worker-farm": "^1.3.1" }, "dependencies": { "pify": { @@ -4919,23 +4973,23 @@ "integrity": "sha1-mdzhUwnGcEQu7i6+H/U6PL27tz4=", "dev": true, "requires": { - "babel-core": "6.26.0", - "babel-jest": "21.2.0", - "babel-plugin-istanbul": "4.1.5", - "chalk": "2.3.2", - "convert-source-map": "1.5.1", - "graceful-fs": "4.1.11", - "jest-config": "21.2.1", - "jest-haste-map": "21.2.0", - "jest-regex-util": "21.2.0", - "jest-resolve": "21.2.0", - "jest-util": "21.2.1", - "json-stable-stringify": "1.0.1", - "micromatch": "2.3.11", - "slash": "1.0.0", + "babel-core": "^6.0.0", + "babel-jest": "^21.2.0", + "babel-plugin-istanbul": "^4.0.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "graceful-fs": "^4.1.11", + "jest-config": "^21.2.1", + "jest-haste-map": "^21.2.0", + "jest-regex-util": "^21.2.0", + "jest-resolve": "^21.2.0", + "jest-util": "^21.2.1", + "json-stable-stringify": "^1.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", "strip-bom": "3.0.0", - "write-file-atomic": "2.3.0", - "yargs": "9.0.1" + "write-file-atomic": "^2.1.0", + "yargs": "^9.0.0" }, "dependencies": { "arr-diff": { @@ -4944,7 +4998,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -4959,9 +5013,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "camelcase": { @@ -4976,9 +5030,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -4987,9 +5041,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -5000,7 +5054,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -5009,7 +5063,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-extglob": { @@ -5024,7 +5078,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "micromatch": { @@ -5033,19 +5087,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "yargs": { @@ -5054,19 +5108,19 @@ "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" } } } @@ -5077,12 +5131,12 @@ "integrity": "sha1-KeSfFiAkFuRzQ+dX5e/5SMB/17A=", "dev": true, "requires": { - "chalk": "2.3.2", - "jest-diff": "21.2.1", - "jest-matcher-utils": "21.2.1", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "pretty-format": "21.2.1" + "chalk": "^2.0.1", + "jest-diff": "^21.2.1", + "jest-matcher-utils": "^21.2.1", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^21.2.1" } }, "jest-util": { @@ -5091,13 +5145,13 @@ "integrity": "sha1-onSy9yawiXSU1pSmw9amGrgZu3g=", "dev": true, "requires": { - "callsites": "2.0.0", - "chalk": "2.3.2", - "graceful-fs": "4.1.11", - "jest-message-util": "21.2.1", - "jest-mock": "21.2.0", - "jest-validate": "21.2.1", - "mkdirp": "0.5.1" + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "jest-message-util": "^21.2.1", + "jest-mock": "^21.2.0", + "jest-validate": "^21.2.1", + "mkdirp": "^0.5.1" } }, "jest-validate": { @@ -5106,26 +5160,27 @@ "integrity": "sha1-zAy8plPNVJN7pPKhEXlndFMN08c=", "dev": true, "requires": { - "chalk": "2.3.2", - "jest-get-type": "21.2.0", - "leven": "2.1.0", - "pretty-format": "21.2.1" + "chalk": "^2.0.1", + "jest-get-type": "^21.2.0", + "leven": "^2.1.0", + "pretty-format": "^21.2.1" } }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", + "dev": true }, "joi": { "version": "6.10.1", "resolved": "https://registry.npmjs.org/joi/-/joi-6.10.1.tgz", "integrity": "sha1-TVDDGAeRIgAP5fFq8f+OGRe3fgY=", "requires": { - "hoek": "2.16.3", - "isemail": "1.2.0", - "moment": "2.21.0", - "topo": "1.1.0" + "hoek": "2.x.x", + "isemail": "1.x.x", + "moment": "2.x.x", + "topo": "1.x.x" } }, "js-sha256": { @@ -5155,8 +5210,8 @@ "integrity": "sha1-WXwai9VxUvJtYizkEXhRpR9euu8=", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -5171,25 +5226,25 @@ "integrity": "sha1-6MVG//ywbADUgzyoRBD+1/igl9Q=", "dev": true, "requires": { - "abab": "1.0.4", - "acorn": "4.0.13", - "acorn-globals": "3.1.0", - "array-equal": "1.0.0", - "content-type-parser": "1.0.2", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "escodegen": "1.9.1", - "html-encoding-sniffer": "1.0.2", - "nwmatcher": "1.4.3", - "parse5": "1.5.1", - "request": "2.85.0", - "sax": "1.2.1", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.4", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.3", - "whatwg-url": "4.8.0", - "xml-name-validator": "2.0.1" + "abab": "^1.0.3", + "acorn": "^4.0.4", + "acorn-globals": "^3.1.0", + "array-equal": "^1.0.0", + "content-type-parser": "^1.0.1", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": ">= 0.2.37 < 0.3.0", + "escodegen": "^1.6.1", + "html-encoding-sniffer": "^1.0.1", + "nwmatcher": ">= 1.3.9 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.79.0", + "sax": "^1.2.1", + "symbol-tree": "^3.2.1", + "tough-cookie": "^2.3.2", + "webidl-conversions": "^4.0.0", + "whatwg-encoding": "^1.0.1", + "whatwg-url": "^4.3.0", + "xml-name-validator": "^2.0.1" }, "dependencies": { "acorn": { @@ -5227,7 +5282,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -5235,11 +5290,6 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -5249,8 +5299,9 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "jsonify": { @@ -5264,11 +5315,11 @@ "resolved": "https://registry.npmjs.org/jsontokens/-/jsontokens-0.7.7.tgz", "integrity": "sha1-hBwsAEK/49dEP8CaosLffWYFTzY=", "requires": { - "asn1.js": "4.10.1", - "base64url": "2.0.0", - "elliptic": "6.4.0", - "key-encoder": "1.1.6", - "validator": "7.2.0" + "asn1.js": "^4.9.1", + "base64url": "^2.0.0", + "elliptic": "^6.3.2", + "key-encoder": "^1.1.6", + "validator": "^7.0.0" } }, "jsonwebtoken": { @@ -5276,11 +5327,11 @@ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-7.4.3.tgz", "integrity": "sha1-d/UCHeBYtgWheD+hKD6ZgS5kVjg=", "requires": { - "joi": "6.10.1", - "jws": "3.1.4", - "lodash.once": "4.1.1", - "ms": "2.1.1", - "xtend": "4.0.1" + "joi": "^6.10.1", + "jws": "^3.1.4", + "lodash.once": "^4.0.0", + "ms": "^2.0.0", + "xtend": "^4.0.1" } }, "jsprim": { @@ -5302,7 +5353,7 @@ "base64url": "2.0.0", "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.9", - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "jws": { @@ -5310,9 +5361,9 @@ "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", "requires": { - "base64url": "2.0.0", - "jwa": "1.1.5", - "safe-buffer": "5.1.1" + "base64url": "^2.0.0", + "jwa": "^1.1.4", + "safe-buffer": "^5.0.1" } }, "key-encoder": { @@ -5320,9 +5371,9 @@ "resolved": "https://registry.npmjs.org/key-encoder/-/key-encoder-1.1.6.tgz", "integrity": "sha1-ATVYLNPQp+t5LZTso4e2gejloq0=", "requires": { - "asn1.js": "2.2.1", - "bn.js": "3.3.0", - "elliptic": "5.2.1" + "asn1.js": "^2.2.0", + "bn.js": "^3.1.2", + "elliptic": "^5.1.0" }, "dependencies": { "asn1.js": { @@ -5330,9 +5381,9 @@ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-2.2.1.tgz", "integrity": "sha1-yLpN1o6EQxKIEmIwyyBFvfqfv+E=", "requires": { - "bn.js": "2.2.0", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "bn.js": "^2.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" }, "dependencies": { "bn.js": { @@ -5352,10 +5403,10 @@ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-5.2.1.tgz", "integrity": "sha1-+ilLZWPG3bybo9yFlGh66ECFjxA=", "requires": { - "bn.js": "3.3.0", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "inherits": "2.0.3" + "bn.js": "^3.1.1", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "inherits": "^2.0.1" } } } @@ -5365,7 +5416,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "lazy-cache": { @@ -5377,8 +5428,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, "requires": { - "readable-stream": "2.3.5" + "readable-stream": "^2.0.5" } }, "lcid": { @@ -5386,7 +5438,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "leven": { @@ -5401,8 +5453,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "load-json-file": { @@ -5410,10 +5462,10 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, "loader-runner": { @@ -5426,9 +5478,9 @@ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0" } }, "locate-path": { @@ -5436,8 +5488,8 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -5445,65 +5497,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=" }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" - }, - "lodash._basecreate": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", - "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" - }, - "lodash.create": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", - "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -5526,7 +5519,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lru-cache": { @@ -5534,8 +5527,8 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", "integrity": "sha1-RSNLLm4vKzPaElYkxGZJKaAiTD8=", "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -5544,7 +5537,7 @@ "integrity": "sha1-bWpJ7q1KrilsU7vzoaAIvWyJRps=", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -5558,7 +5551,8 @@ "make-error": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha1-GZeO1XX56VRdL/jBPjO10Ypn1TU=" + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==", + "dev": true }, "makeerror": { "version": "1.0.11", @@ -5566,7 +5560,7 @@ "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "tmpl": "1.0.4" + "tmpl": "1.0.x" } }, "map-cache": { @@ -5579,7 +5573,7 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "md5.js": { @@ -5587,8 +5581,8 @@ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" }, "dependencies": { "hash-base": { @@ -5596,8 +5590,8 @@ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } } } @@ -5607,7 +5601,7 @@ "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "memory-fs": { @@ -5615,8 +5609,8 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.5" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "merge": { @@ -5630,19 +5624,19 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.9.tgz", "integrity": "sha1-FdyTF1rjnlLpMIeEcJbv/HPvz4k=", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "kind-of": { @@ -5657,8 +5651,8 @@ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha1-8IA1HIZbDcViqEYpZtqlNUPHik0=", "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime-db": { @@ -5671,7 +5665,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha1-bzI/YKg9ERRvgx/xH9ZuL+VQO7g=", "requires": { - "mime-db": "1.33.0" + "mime-db": "~1.33.0" } }, "mimic-fn": { @@ -5694,7 +5688,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -5707,8 +5701,8 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", "integrity": "sha1-pJ5yaNzhoNlpjkUybFYm3zVD0P4=", "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -5716,7 +5710,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -5734,9 +5728,9 @@ "resolved": "https://registry.npmjs.org/mnid/-/mnid-0.1.1.tgz", "integrity": "sha1-TjiZtHbwLaKfcbUMevU4Dccrh5o=", "requires": { - "base-x": "3.0.4", - "buffer": "5.1.0", - "js-sha3": "0.5.7" + "base-x": "^3.0.0", + "buffer": "^5.0.5", + "js-sha3": "^0.5.7" }, "dependencies": { "buffer": { @@ -5744,29 +5738,81 @@ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", "integrity": "sha1-yRPkNnjHy3yL0Wr7zdtsVQXo+f4=", "requires": { - "base64-js": "1.2.3", - "ieee754": "1.1.8" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" } } } }, "mocha": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", - "integrity": "sha1-HgSA/jbS2lhY0etqzDhBiybqog0=", - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.9.0", - "debug": "2.6.8", - "diff": "3.2.0", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", - "glob": "7.1.1", - "growl": "1.9.2", + "glob": "7.1.2", + "growl": "1.10.5", "he": "1.1.1", - "json3": "3.3.2", - "lodash.create": "3.1.1", + "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "3.1.2" + "supports-color": "5.4.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "moment": { @@ -5790,18 +5836,18 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-odd": "^2.0.0", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "kind-of": { @@ -5827,9 +5873,9 @@ "resolved": "https://registry.npmjs.org/nexmo/-/nexmo-2.2.0.tgz", "integrity": "sha1-J9IEWAcZFfDjuAkOr01cEq4FpTs=", "requires": { - "jsonwebtoken": "7.4.3", - "request": "2.85.0", - "uuid": "2.0.3" + "jsonwebtoken": "^7.1.9", + "request": "^2.83.0", + "uuid": "^2.0.2" } }, "node-int64": { @@ -5843,28 +5889,28 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", "integrity": "sha1-X5QmPUBPbkR2fXJpAf/wVHjWAN8=", "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^1.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.5", - "stream-browserify": "2.0.1", - "stream-http": "2.8.0", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.6", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", + "url": "^0.11.0", + "util": "^0.10.3", "vm-browserify": "0.0.4" }, "dependencies": { @@ -5897,10 +5943,10 @@ "integrity": "sha1-+jE90I9VF9sOJQLldY1mSsafneo=", "dev": true, "requires": { - "growly": "1.3.0", - "semver": "5.5.0", - "shellwords": "0.1.1", - "which": "1.3.0" + "growly": "^1.3.0", + "semver": "^5.4.1", + "shellwords": "^0.1.1", + "which": "^1.3.0" }, "dependencies": { "semver": { @@ -5916,10 +5962,10 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "4.3.2", - "validate-npm-package-license": "3.0.3" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -5927,7 +5973,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { @@ -5935,7 +5981,7 @@ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -5980,9 +6026,9 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -5990,7 +6036,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { @@ -5998,7 +6044,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-data-descriptor": { @@ -6006,7 +6052,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-descriptor": { @@ -6014,9 +6060,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -6033,7 +6079,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.omit": { @@ -6042,8 +6088,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "object.pick": { @@ -6051,7 +6097,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "once": { @@ -6059,7 +6105,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "optimist": { @@ -6068,8 +6114,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.2" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, "optionator": { @@ -6078,12 +6124,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" }, "dependencies": { "wordwrap": { @@ -6110,9 +6156,9 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "os-tmpdir": { @@ -6137,7 +6183,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -6145,7 +6191,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "p-limit": "1.2.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -6168,11 +6214,11 @@ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, "parse-glob": { @@ -6181,10 +6227,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" }, "dependencies": { "is-extglob": { @@ -6199,7 +6245,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } } } @@ -6209,13 +6255,14 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true }, "parse5": { "version": "1.5.1", @@ -6263,24 +6310,25 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" } }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true }, "pbkdf2": { "version": "3.0.14", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", "integrity": "sha1-o14TxkeZsGzhUyD0WcIw5o5zut4=", "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.10" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "performance-now": { @@ -6297,9 +6345,9 @@ "js-string-escape": "1.0.1", "packet-reader": "0.3.1", "pg-connection-string": "0.1.3", - "pg-pool": "2.0.3", - "pg-types": "1.12.1", - "pgpass": "1.0.2", + "pg-pool": "~2.0.3", + "pg-types": "~1.12.1", + "pgpass": "1.x", "semver": "4.3.2" } }, @@ -6318,10 +6366,10 @@ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.12.1.tgz", "integrity": "sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I=", "requires": { - "postgres-array": "1.0.2", - "postgres-bytea": "1.0.0", - "postgres-date": "1.0.3", - "postgres-interval": "1.1.1" + "postgres-array": "~1.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.0", + "postgres-interval": "^1.1.0" } }, "pgpass": { @@ -6329,7 +6377,7 @@ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz", "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=", "requires": { - "split": "1.0.1" + "split": "^1.0.0" } }, "pify": { @@ -6349,7 +6397,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -6358,7 +6406,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } }, "pkg-up": { @@ -6366,7 +6414,7 @@ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } }, "posix-character-classes": { @@ -6394,7 +6442,7 @@ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.1.tgz", "integrity": "sha1-rNsPiXtLHG5JbZ1OCoU+HEKPBvA=", "requires": { - "xtend": "4.0.1" + "xtend": "^4.0.0" } }, "prelude-ls": { @@ -6415,8 +6463,8 @@ "integrity": "sha1-rlQH888hBmzQEaobpfzntqLt2zY=", "dev": true, "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.1" + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.0" }, "dependencies": { "ansi-regex": { @@ -6453,11 +6501,11 @@ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.6" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1" } }, "punycode": { @@ -6486,8 +6534,8 @@ "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -6496,7 +6544,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6506,7 +6554,7 @@ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", "integrity": "sha1-0wLFIpSFiISKjTAMkytEwkIx2oA=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -6514,8 +6562,8 @@ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha1-ySGW/IarQr6YPxvzF3giSTHWFFg=", "requires": { - "randombytes": "2.0.6", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "read-pkg": { @@ -6523,9 +6571,9 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -6533,8 +6581,8 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "readable-stream": { @@ -6542,13 +6590,13 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz", "integrity": "sha1-tPhQA6k4y7bsvOKhJPsQEr0ag40=", "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" } }, "readdirp": { @@ -6556,10 +6604,10 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.5", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "regenerate": { @@ -6579,9 +6627,9 @@ "integrity": "sha1-HkmWg3Ix2ot/PPQRTXG1aRoGgN0=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "babel-runtime": "^6.18.0", + "babel-types": "^6.19.0", + "private": "^0.1.6" } }, "regex-cache": { @@ -6590,7 +6638,7 @@ "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "regex-not": { @@ -6598,8 +6646,8 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw=", "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -6608,9 +6656,9 @@ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -6625,7 +6673,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } }, "remove-trailing-separator": { @@ -6649,7 +6697,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "request": { @@ -6657,28 +6705,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", "integrity": "sha1-WgNhWkfGFCCz65m326IE+DYD4fo=", "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.6", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.2", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.18", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.4", - "tunnel-agent": "0.6.0", - "uuid": "3.2.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.6.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.1", + "forever-agent": "~0.6.1", + "form-data": "~2.3.1", + "har-validator": "~5.0.3", + "hawk": "~6.0.2", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.17", + "oauth-sign": "~0.8.2", + "performance-now": "^2.1.0", + "qs": "~6.5.1", + "safe-buffer": "^5.1.1", + "stringstream": "~0.0.5", + "tough-cookie": "~2.3.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.1.0" }, "dependencies": { "uuid": { @@ -6693,10 +6741,10 @@ "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.2.tgz", "integrity": "sha1-0epG1lSm7k+O5qT+oQGMIpEZBLQ=", "requires": { - "bluebird": "3.5.1", + "bluebird": "^3.5.0", "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.4" + "stealthy-require": "^1.1.0", + "tough-cookie": ">=2.3.3" } }, "request-promise-core": { @@ -6704,7 +6752,7 @@ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", "requires": { - "lodash": "4.17.5" + "lodash": "^4.13.1" } }, "require-directory": { @@ -6743,7 +6791,7 @@ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -6752,7 +6800,7 @@ "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", "dev": true, "requires": { - "glob": "7.1.1" + "glob": "^7.0.5" } }, "ripemd160": { @@ -6760,8 +6808,8 @@ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "hash-base": "^2.0.0", + "inherits": "^2.0.1" } }, "safe-buffer": { @@ -6774,7 +6822,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "samsam": { @@ -6789,14 +6837,14 @@ "integrity": "sha1-KfmRIIzyhjZyDv3FhCk+f9ZmY6U=", "dev": true, "requires": { - "anymatch": "1.3.2", - "exec-sh": "0.2.1", - "fb-watchman": "2.0.0", - "fsevents": "1.1.3", - "minimatch": "3.0.4", - "minimist": "1.2.0", - "walker": "1.0.7", - "watch": "0.18.0" + "anymatch": "^1.3.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.1.1", + "minimatch": "^3.0.2", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" }, "dependencies": { "anymatch": { @@ -6805,8 +6853,8 @@ "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "arr-diff": { @@ -6815,7 +6863,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "array-unique": { @@ -6830,9 +6878,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "expand-brackets": { @@ -6841,7 +6889,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "extglob": { @@ -6850,7 +6898,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-extglob": { @@ -6865,7 +6913,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "micromatch": { @@ -6874,19 +6922,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "minimist": { @@ -6900,7 +6948,8 @@ "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", + "dev": true }, "semver": { "version": "4.3.2", @@ -6908,69 +6957,75 @@ "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=" }, "serverless-kms-secrets": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/serverless-kms-secrets/-/serverless-kms-secrets-1.0.2.tgz", - "integrity": "sha1-rJMAMKmB0bEX5smiQu3nWZdRSWY=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/serverless-kms-secrets/-/serverless-kms-secrets-1.0.3.tgz", + "integrity": "sha512-I4CTYCfe5e23KpbWo9p6ddB3BgI5115BnVd16IKfUD0l5AlcEoMyw4TxQdzkqcdQw9LL2V96o0mnisl56CY1rA==", + "dev": true, "requires": { - "aws-sdk": "2.209.0", - "bluebird": "3.5.1", - "chai": "4.1.2", - "fs-extra": "3.0.1", - "mocha": "3.5.3", - "yaml-edit": "0.1.3", - "yamljs": "0.2.10" + "aws-sdk": "^2.72.0", + "bluebird": "^3.5.0", + "chai": "^4.0.2", + "fs-extra": "^3.0.1", + "mocha": "^5.1.1", + "yaml-edit": "^0.1.3", + "yamljs": "^0.2.10" } }, "serverless-webpack": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/serverless-webpack/-/serverless-webpack-3.1.2.tgz", - "integrity": "sha1-8e5hZJQU4UGhZZzc4K1ilKQU1HA=", + "integrity": "sha512-Bqwrf56igwm1uXyuBoKtWAKiNSCoa8Ih2PVw6ErDa1DTLLUGJk+fQkBmxE73uZhtZjKIQbuAKVUwHX+WyJow1Q==", + "dev": true, "requires": { - "archiver": "2.1.1", - "bluebird": "3.5.1", - "fs-extra": "4.0.3", - "glob": "7.1.2", - "is-builtin-module": "1.0.0", - "lodash": "4.17.5", - "semver": "5.5.0", - "ts-node": "3.3.0" + "archiver": "^2.0.0", + "bluebird": "^3.5.0", + "fs-extra": "^4.0.2", + "glob": "^7.1.2", + "is-builtin-module": "^1.0.0", + "lodash": "^4.17.4", + "semver": "^5.4.1", + "ts-node": "^3.2.0" }, "dependencies": { "fs-extra": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha1-DYUhIuW8W+tFP7Ao6cDJvzY0DJQ=", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, "requires": { - "graceful-fs": "4.1.11" + "graceful-fs": "^4.1.6" } }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha1-3Eu8emyp2Rbe5dQ1FvAJK1j3uKs=" + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true } } }, @@ -6989,10 +7044,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha1-ca5KiPD+77v1LR6mBPP7MV67YnQ=", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -7000,7 +7055,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -7015,8 +7070,8 @@ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", "integrity": "sha1-sf3lzX0RpWJmOKB8YEq5Cc+jH5s=", "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shebang-command": { @@ -7024,7 +7079,7 @@ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -7052,7 +7107,7 @@ "formatio": "1.1.1", "lolex": "1.3.2", "samsam": "1.1.2", - "util": "0.10.3" + "util": ">=0.10.3 <1" } }, "slash": { @@ -7066,14 +7121,14 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0=", "requires": { - "base": "0.11.2", - "debug": "2.6.8", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -7081,7 +7136,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -7089,7 +7144,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -7097,7 +7152,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -7105,7 +7160,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7115,7 +7170,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -7123,7 +7178,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7133,9 +7188,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -7150,9 +7205,9 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -7160,7 +7215,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } } } @@ -7170,7 +7225,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sntp": { @@ -7178,7 +7233,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", "requires": { - "hoek": "4.2.1" + "hoek": "4.x.x" }, "dependencies": { "hoek": { @@ -7203,19 +7258,20 @@ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", "integrity": "sha1-etD1k/IoFZjoVN+A8ZquS5LXoRo=", "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.0.0", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "source-map-url": { @@ -7228,8 +7284,8 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", "integrity": "sha1-BaW01xU6GVvJLDxCW2nzsqlSTII=", "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -7242,8 +7298,8 @@ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -7256,7 +7312,7 @@ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", "integrity": "sha1-YFvZvjA6pZ+zX5Ip++oN3snqB9k=", "requires": { - "through": "2.3.8" + "through": "2" } }, "split-string": { @@ -7264,27 +7320,28 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true }, "sshpk": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" } }, "static-extend": { @@ -7292,8 +7349,8 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -7301,7 +7358,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "is-accessor-descriptor": { @@ -7309,7 +7366,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -7317,7 +7374,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7327,7 +7384,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -7335,7 +7392,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -7345,9 +7402,9 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" } }, "kind-of": { @@ -7367,8 +7424,8 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.5" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" } }, "stream-http": { @@ -7376,11 +7433,11 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", "integrity": "sha1-/YZUbaybHJGv+PxdKHuY+vtBvBA=", "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.5", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.3", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" } }, "string-length": { @@ -7389,8 +7446,8 @@ "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "dev": true, "requires": { - "astral-regex": "1.0.0", - "strip-ansi": "4.0.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -7405,7 +7462,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -7415,8 +7472,8 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -7434,7 +7491,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -7444,7 +7501,7 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -7457,7 +7514,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -7481,14 +7538,16 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true }, "supports-color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } }, "symbol-tree": { @@ -7503,14 +7562,18 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" }, "tar-stream": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", - "integrity": "sha1-XK2Ed59FyDsfJQjZawnYjHIYr1U=", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.1.tgz", + "integrity": "sha512-IFLM5wp3QrJODQFPm6/to3LJZrONdBY/otxcvDIQzu217zKye6yVR3hhi9lAjrC2Z+m/j5oDxMPb1qcd8cIvpA==", + "dev": true, "requires": { - "bl": "1.2.1", - "end-of-stream": "1.4.1", - "readable-stream": "2.3.5", - "xtend": "4.0.1" + "bl": "^1.0.0", + "buffer-alloc": "^1.1.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.0", + "xtend": "^4.0.0" } }, "test-exclude": { @@ -7519,11 +7582,11 @@ "integrity": "sha1-36Ii8DSAvKaSB8pyizfXS0X3JPo=", "dev": true, "requires": { - "arrify": "1.0.1", - "micromatch": "3.1.9", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" + "arrify": "^1.0.1", + "micromatch": "^3.1.8", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" }, "dependencies": { "find-up": { @@ -7532,8 +7595,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "load-json-file": { @@ -7542,11 +7605,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "path-exists": { @@ -7555,7 +7618,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-type": { @@ -7564,9 +7627,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "read-pkg": { @@ -7575,9 +7638,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -7586,8 +7649,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" } }, "strip-bom": { @@ -7596,7 +7659,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } } } @@ -7617,7 +7680,7 @@ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", "integrity": "sha1-JB52kn2coF9NlZgZAi9bNmS2S64=", "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "tmpl": { @@ -7631,6 +7694,12 @@ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" }, + "to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "dev": true + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -7642,7 +7711,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -7650,10 +7719,10 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4=", "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -7661,8 +7730,8 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "topo": { @@ -7670,7 +7739,7 @@ "resolved": "https://registry.npmjs.org/topo/-/topo-1.1.0.tgz", "integrity": "sha1-6ddRYV0buH3IZdsYL6HKCl71NtU=", "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "tough-cookie": { @@ -7678,7 +7747,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha1-7GDO44rGdQY//JelwYlwV47oNlU=", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tr46": { @@ -7703,23 +7772,25 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.3.0.tgz", "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=", + "dev": true, "requires": { - "arrify": "1.0.1", - "chalk": "2.3.2", - "diff": "3.2.0", - "make-error": "1.3.4", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18", - "tsconfig": "6.0.0", - "v8flags": "3.0.2", - "yn": "2.0.0" + "arrify": "^1.0.0", + "chalk": "^2.0.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.0", + "tsconfig": "^6.0.0", + "v8flags": "^3.0.0", + "yn": "^2.0.0" }, "dependencies": { "minimist": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true } } }, @@ -7727,9 +7798,10 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, "requires": { - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" + "strip-bom": "^3.0.0", + "strip-json-comments": "^2.0.0" } }, "tty-browserify": { @@ -7742,7 +7814,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -7757,22 +7829,23 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=" + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -7780,9 +7853,9 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -7799,9 +7872,9 @@ "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" } }, "union-value": { @@ -7809,10 +7882,10 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" }, "dependencies": { "extend-shallow": { @@ -7820,7 +7893,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "set-value": { @@ -7828,10 +7901,10 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" } } } @@ -7839,15 +7912,16 @@ "universalify": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true }, "unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -7855,9 +7929,9 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -7887,13 +7961,13 @@ "resolved": "https://registry.npmjs.org/uport/-/uport-0.7.0-alpha-2.tgz", "integrity": "sha512-8MOZvJAFxR23Yy//0nxPxxP7zyUN++rqdbujpaOE3skm9wBDLqVIe0kKoVnTtDHNpi83XZOCMzXcNt3ncpRGGw==", "requires": { - "did-jwt": "0.0.7", - "did-resolver": "0.0.4", - "ethjs-util": "0.1.3", - "ethr-did-resolver": "0.0.7", - "mnid": "0.1.1", - "uport-did-resolver": "0.0.2", - "uport-lite": "1.0.2" + "did-jwt": "^0.0.7", + "did-resolver": "^0.0.4", + "ethjs-util": "^0.1.3", + "ethr-did-resolver": "^0.0.7", + "mnid": "^0.1.1", + "uport-did-resolver": "^0.0.2", + "uport-lite": "^1.0.2" }, "dependencies": { "did-jwt": { @@ -7901,15 +7975,15 @@ "resolved": "https://registry.npmjs.org/did-jwt/-/did-jwt-0.0.7.tgz", "integrity": "sha512-5PR39zJoBd+eK0SuS2cKd9J2ctdBtg2Jfqu9wZ3nOvPDNIfFpwZyBZe8mtJruEc2kZNrJCIAuN1iFLs2fctG0A==", "requires": { - "babel-runtime": "6.26.0", - "base64url": "2.0.0", - "did-resolver": "0.0.4", - "elliptic": "6.4.0", - "js-sha256": "0.9.0", - "js-sha3": "0.7.0", - "mnid": "0.1.1", - "uport-did-resolver": "0.0.2", - "uport-lite": "1.0.2" + "babel-runtime": "^6.26.0", + "base64url": "^2.0.0", + "did-resolver": "^0.0.4", + "elliptic": "^6.4.0", + "js-sha256": "^0.9.0", + "js-sha3": "^0.7.0", + "mnid": "^0.1.1", + "uport-did-resolver": "^0.0.2", + "uport-lite": "^1.0.2" } }, "ethr-did-resolver": { @@ -7917,14 +7991,14 @@ "resolved": "https://registry.npmjs.org/ethr-did-resolver/-/ethr-did-resolver-0.0.7.tgz", "integrity": "sha512-qOYDriFxniAmlXXszZSJEb5AqVqc18NXWoMvFRsSp1FvbLFB14d6FuGKNDqS112zHgGfgbSi4uLbNX5pBSn2+A==", "requires": { - "babel-plugin-module-resolver": "3.1.1", - "babel-runtime": "6.26.0", - "did-resolver": "0.0.4", - "ethjs-abi": "0.2.1", - "ethjs-contract": "0.1.9", - "ethjs-provider-http": "0.1.6", - "ethjs-query": "0.3.6", - "ethr-did-registry": "0.0.2" + "babel-plugin-module-resolver": "^3.1.1", + "babel-runtime": "^6.26.0", + "did-resolver": "^0.0.4", + "ethjs-abi": "^0.2.1", + "ethjs-contract": "^0.1.9", + "ethjs-provider-http": "^0.1.6", + "ethjs-query": "^0.3.5", + "ethr-did-registry": "^0.0.2" } }, "js-sha3": { @@ -7939,9 +8013,9 @@ "resolved": "https://registry.npmjs.org/uport-did-resolver/-/uport-did-resolver-0.0.2.tgz", "integrity": "sha512-QiW0340J6/JMQqbtArRqfZBNRQv9sRIaMcHfJigzcQy2G9EFUhhJAHtIe0nrQt4XQ4VGkZ0iwk1CE/P7+jr4FA==", "requires": { - "babel-runtime": "6.26.0", - "did-resolver": "0.0.4", - "uport-lite": "1.0.2" + "babel-runtime": "^6.26.0", + "did-resolver": "^0.0.4", + "uport-lite": "^1.0.2" } }, "uport-lite": { @@ -7949,8 +8023,8 @@ "resolved": "https://registry.npmjs.org/uport-lite/-/uport-lite-1.0.2.tgz", "integrity": "sha1-86ltjfUtVJbixsjsfP03e0MVE9Q=", "requires": { - "base-x": "3.0.4", - "xmlhttprequest": "1.8.0" + "base-x": "^3.0.0", + "xmlhttprequest": "^1.8.0" } }, "urix": { @@ -7962,6 +8036,7 @@ "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "dev": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -7970,7 +8045,8 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true } } }, @@ -7979,7 +8055,7 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", "integrity": "sha1-FHFr8D/f79AwQK71jYtLhfOnxUQ=", "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.2" }, "dependencies": { "kind-of": { @@ -8015,11 +8091,12 @@ "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" }, "v8flags": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", - "integrity": "sha1-rWp4ogprI9A6jevBEhHjzCMUlHc=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.1.tgz", + "integrity": "sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ==", + "dev": true, "requires": { - "homedir-polyfill": "1.0.1" + "homedir-polyfill": "^1.0.1" } }, "validate-npm-package-license": { @@ -8027,8 +8104,8 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", "integrity": "sha1-gWQ7y+8b3+zUYjeT3EZIlIupgzg=", "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "validator": { @@ -8041,9 +8118,9 @@ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "requires": { - "assert-plus": "1.0.0", + "assert-plus": "^1.0.0", "core-util-is": "1.0.2", - "extsprintf": "1.3.0" + "extsprintf": "^1.2.0" } }, "vm-browserify": { @@ -8060,7 +8137,7 @@ "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", "dev": true, "requires": { - "makeerror": "1.0.11" + "makeerror": "1.0.x" } }, "watch": { @@ -8069,8 +8146,8 @@ "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", "dev": true, "requires": { - "exec-sh": "0.2.1", - "minimist": "1.2.0" + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" }, "dependencies": { "minimist": { @@ -8086,9 +8163,9 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.5.0.tgz", "integrity": "sha1-Ix54Ovgwoi+JZvZcTEusyBQHLu0=", "requires": { - "chokidar": "2.0.2", - "graceful-fs": "4.1.11", - "neo-async": "2.5.0" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "webidl-conversions": { @@ -8102,28 +8179,28 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.11.0.tgz", "integrity": "sha1-d9pFGx17SxF62vQaGpO1dC8k2JQ=", "requires": { - "acorn": "5.5.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "6.2.1", - "ajv-keywords": "3.1.0", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.5.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" }, "dependencies": { "ajv": { @@ -8131,9 +8208,9 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.2.1.tgz", "integrity": "sha1-KKarxJOiq+D7TIUHrK7bQ/pVBnE=", "requires": { - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "has-flag": { @@ -8146,7 +8223,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -8161,8 +8238,8 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", "integrity": "sha1-oQHrrlnWUHNU1x2AE5UKOot6WlQ=", "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -8187,8 +8264,8 @@ "integrity": "sha1-0pgaqRSMHgCkHFphMRZqtGg7vMA=", "dev": true, "requires": { - "tr46": "0.0.3", - "webidl-conversions": "3.0.1" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" }, "dependencies": { "webidl-conversions": { @@ -8204,7 +8281,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -8228,7 +8305,7 @@ "integrity": "sha1-rsxAWXb6talVJhgIRvDboojzpKA=", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -8236,8 +8313,8 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "string-width": { @@ -8245,9 +8322,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -8263,9 +8340,9 @@ "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xhr2": { @@ -8283,17 +8360,19 @@ "version": "0.4.17", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", + "dev": true, "requires": { - "sax": "1.2.1", - "xmlbuilder": "4.2.1" + "sax": ">=0.6.0", + "xmlbuilder": "^4.1.0" } }, "xmlbuilder": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", + "dev": true, "requires": { - "lodash": "4.17.5" + "lodash": "^4.0.0" } }, "xmlhttprequest": { @@ -8319,15 +8398,17 @@ "yaml-edit": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/yaml-edit/-/yaml-edit-0.1.3.tgz", - "integrity": "sha1-103V8F78QquRhSbAlPAJhiHOLXM=" + "integrity": "sha1-103V8F78QquRhSbAlPAJhiHOLXM=", + "dev": true }, "yamljs": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.2.10.tgz", "integrity": "sha1-SBzHwlynOvWfWR8MluPOVsdXpA8=", + "dev": true, "requires": { - "argparse": "1.0.10", - "glob": "7.1.1" + "argparse": "^1.0.7", + "glob": "^7.0.5" } }, "yargs": { @@ -8335,19 +8416,19 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" }, "dependencies": { "camelcase": { @@ -8360,9 +8441,9 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -8370,9 +8451,9 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -8384,7 +8465,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { @@ -8397,17 +8478,19 @@ "yn": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true }, "zip-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, "requires": { - "archiver-utils": "1.3.0", - "compress-commons": "1.2.2", - "lodash": "4.17.5", - "readable-stream": "2.3.5" + "archiver-utils": "^1.3.0", + "compress-commons": "^1.2.0", + "lodash": "^4.8.0", + "readable-stream": "^2.0.0" } } } diff --git a/package.json b/package.json index 3dba4e0..b0bba20 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "lambda-nisaba", + "name": "lambda-nisaba-si", "version": "1.2.0", - "description": "uPort anti-sybil & fuel token generator service", + "description": "fuel token generator service", "main": "index.js", "scripts": { "test": "jest --verbose --runInBand", @@ -10,7 +10,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/uport-project/lambda-nisaba.git" + "url": "git+https://github.com/consensys/lambda-nisaba.git" }, "contributors": [ { @@ -28,15 +28,17 @@ ], "license": "MIT", "bugs": { - "url": "https://github.com/uport-project/lambda-nisaba/issues" + "url": "https://github.com/consensys/lambda-nisaba/issues" }, - "homepage": "https://github.com/uport-project/lambda-nisaba#readme", + "homepage": "https://github.com/consensys/lambda-nisaba#readme", "devDependencies": { "aws-sdk-mock": "^1.7.0", "babel-loader": "^7.1.2", "babel-preset-env": "^1.6.0", - "did-jwt": "^0.0.8", - "jest": "^21.2.0" + "did-jwt": "0.0.8", + "jest": "^21.2.0", + "serverless-kms-secrets": "^1.0.3", + "serverless-webpack": "^3.1.2" }, "dependencies": { "ethr-did-resolver": "^0.0.8", @@ -45,8 +47,6 @@ "pg": "^7.4.0", "request": "^2.83.0", "request-promise": "^4.2.2", - "serverless-kms-secrets": "^1.0.2", - "serverless-webpack": "^3.1.0", "uport": "^0.7.0-alpha-2", "uport-did-resolver": "^0.0.2", "webpack": "^3.6.0", diff --git a/serverless.yml b/serverless.yml index 1b00d8c..a7cfff5 100644 --- a/serverless.yml +++ b/serverless.yml @@ -1,10 +1,10 @@ -service: lambda-nisaba +service: lambda-nisaba-csi provider: name: aws - runtime: nodejs6.10 + runtime: nodejs8.10 stage: develop - region: us-west-2 + region: us-east-1 iamRoleStatements: - Effect: Allow Action: diff --git a/src/lib/fuelTokenMgr.js b/src/lib/fuelTokenMgr.js index dc53506..afe42b9 100644 --- a/src/lib/fuelTokenMgr.js +++ b/src/lib/fuelTokenMgr.js @@ -32,6 +32,7 @@ class FuelTokenMgr { this.tokenSigner = SimpleSigner(this.signingKey); } + /* Uport specific - needs to be changed for other builds */ async newToken(deviceKey) { const signer = this.tokenSigner; let now = Math.floor(Date.now() / 1000); @@ -52,6 +53,7 @@ class FuelTokenMgr { }); } + /* Uport specific - needs to be changed for other builds */ async verifyToken(fuelToken) { let aud = [ "api.uport.me/nisaba", diff --git a/src/lib/phoneVerificationMgr.js b/src/lib/phoneVerificationMgr.js index 1ff9d58..f2f5ed5 100644 --- a/src/lib/phoneVerificationMgr.js +++ b/src/lib/phoneVerificationMgr.js @@ -53,6 +53,7 @@ class PhoneVerificationMgr { if (!phoneNumber) throw "no destination phoneNumber"; if (!this.nexmo) throw "client is not initialized"; + //uport specifc [US1] let params = { number: phoneNumber, brand: "uPort", @@ -159,6 +160,15 @@ class PhoneVerificationMgr { }); } + /* + schema information for nexmo requests: + table: nexmo_requests + columns + - request_id + - device_key + - request_status + */ + async getNexmoRequest(deviceKey) { if (!deviceKey) throw "no device key"; if (!this.pgUrl) throw "no pgUrl set"; From 94db62e04536f3d40c0cc7931a25e7d662bd9e54 Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Sun, 17 Jun 2018 16:27:51 -0700 Subject: [PATCH 17/38] added documentation to phoneVerificationMgr --- kms-secrets.develop.us-east-1.yml | 2 +- src/lib/phoneVerificationMgr.js | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/kms-secrets.develop.us-east-1.yml b/kms-secrets.develop.us-east-1.yml index 91682ed..3f32993 100644 --- a/kms-secrets.develop.us-east-1.yml +++ b/kms-secrets.develop.us-east-1.yml @@ -1,3 +1,3 @@ secrets: - SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wGaJxNgaHD2ISFqhsAi+9i6AAACDTCCAgkGCSqGSIb3DQEHBqCCAfowggH2AgEAMIIB7wYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAwbcKDW6mhkLPD9N6YCARCAggHAE5BpNH1BxCv4ZJRDM/pyhdGH3YVR3D7Oed8306FKL/Na+ZRBkMthcxS1hFfpFykmj8yxdvApAjyGoZbYoiZQahVI9Ok0DMBs7V9QOn0lMRVKskhZ8KKqxbJIRrqKCGx2nuLpnCeWso2kKM8IU5zKSsFGMniYKUxqv/nzIUcYlZvFZ6tCMZ64kIGwp97L+fYr6wTzRnlndPLWufl12kv8iBWTbIRK8l/dRm5ZAV0LwF20b0d0dAn15RPEzVB/+NbHN1jmhJUN1KoHS2k8lYD5Q9rqw3Xv1kuYoDxViT5NReQXD8aLBs7+1X5cowlezinbvVwP+J4sgRpR3nYs4MDaWcUvJ05Gi3ickEcpuZpjZybhd9GhQOecbqu9zfYMCYNE3euwbSJ69Vi3r2IQX6F5j9vJmG0kpVC1Gpq7nsnn2UbXdqkrmiJm50ilDnUrxjxL8VFtAtETZ2TRjiuBrqPFk4SwSY7QEV/3EdtVREUGC5wSDLmEDI0UAE9MBRG0rOydQtSurRVsuDWNGH8GvfvsjINpMV5zl593tg5CXw7zB/hEKthqqeedND/LV7BJMQl5MMMUwai9+lV7l3bKNUVzNA== + SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wGANXIJxobnZbiOoPjOfwxsAAACDTCCAgkGCSqGSIb3DQEHBqCCAfowggH2AgEAMIIB7wYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxHW1QWbyZnwyS7fH0CARCAggHAhHv6t8tg4yGZcp91ueJbTfLHetV2vq0/IC2isNfxkLRRao11NKdR/YBTNgJcnWRKCJRrpvhvHaypMz7uJqnjN++oc2fRVA5UuP7r2krGEaS5e1dDEj+Zq8R8yILbSqtj/NHJXqKVVStErPdL/AAIadOgRctqt4rFLgGv0SvJN4150O7pYf/29jtrrKvLtFXVpcQgJDDL+rgaP0AXKNhIRxlJmvfSFcqUNWsNohp8Rr9frey14s8UwtVar3T+AgBbpsnOhKFrq28JW5ub7H/HE2nvurYoo3bgHZ8NqvFeJFLYPvEWT65ozuQWrrXkz8s85TKMBWPV0fwNKpUQ6GiaV9+Kp6+2tW1qqYovYIEvcXVJMZjPlf6PvJnbAlUbMaUReOcuwubMu0HsVhcTX5xmMuZQYkJY+m3XL/CbAoRMu3BU4olhl4xNKrE95vpBeDdkbSGajIShKMX1EL+T5Q42NtIg+ZTCljJkhNmVXA7F+Cf9L1Z0mEuQy5RKwsUBc6XO7WeyccRoF4kmIeTolI/vT1K7gyu83LModP3vJ8AR6PDkkhJjt3RKsdznw3IArAK+8oBOXpuwS9cs9SSj9ZdnlA== keyArn: 'arn:aws:kms:us-east-1:711302153787:key/056da528-260d-4019-8419-7df6c292710d' diff --git a/src/lib/phoneVerificationMgr.js b/src/lib/phoneVerificationMgr.js index 5932d0e..3278507 100644 --- a/src/lib/phoneVerificationMgr.js +++ b/src/lib/phoneVerificationMgr.js @@ -56,10 +56,19 @@ class PhoneVerificationMgr { //uport specifc [US1] let params = { number: phoneNumber, - brand: "uPort", + brand: "NexmoVerifyTest", code_length: 6 }; + /* + resource: https://developer.nexmo.com/api/verify#verify-request + required params + format - json The response format. Either json or xml + brand - The name of the company or App you are using Verify for + number - The mobile or landline phone number to verify + code_length - The length of the PIN. Possible values are 6 or 4 characters. + The default value is 4 + */ this.nexmo.verify.request(params, (err, resp) => { if (err) { console.log("error on nexmo.verify.request", err); From 7119fc2a81ccfa29d8ec28a674a4fc37b074690d Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Sun, 17 Jun 2018 18:26:32 -0700 Subject: [PATCH 18/38] documentation phoneVerificationMgr --- kms-secrets.develop.us-east-1.yml | 2 +- src/lib/phoneVerificationMgr.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/kms-secrets.develop.us-east-1.yml b/kms-secrets.develop.us-east-1.yml index 3f32993..3ebe4ce 100644 --- a/kms-secrets.develop.us-east-1.yml +++ b/kms-secrets.develop.us-east-1.yml @@ -1,3 +1,3 @@ secrets: - SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wGANXIJxobnZbiOoPjOfwxsAAACDTCCAgkGCSqGSIb3DQEHBqCCAfowggH2AgEAMIIB7wYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxHW1QWbyZnwyS7fH0CARCAggHAhHv6t8tg4yGZcp91ueJbTfLHetV2vq0/IC2isNfxkLRRao11NKdR/YBTNgJcnWRKCJRrpvhvHaypMz7uJqnjN++oc2fRVA5UuP7r2krGEaS5e1dDEj+Zq8R8yILbSqtj/NHJXqKVVStErPdL/AAIadOgRctqt4rFLgGv0SvJN4150O7pYf/29jtrrKvLtFXVpcQgJDDL+rgaP0AXKNhIRxlJmvfSFcqUNWsNohp8Rr9frey14s8UwtVar3T+AgBbpsnOhKFrq28JW5ub7H/HE2nvurYoo3bgHZ8NqvFeJFLYPvEWT65ozuQWrrXkz8s85TKMBWPV0fwNKpUQ6GiaV9+Kp6+2tW1qqYovYIEvcXVJMZjPlf6PvJnbAlUbMaUReOcuwubMu0HsVhcTX5xmMuZQYkJY+m3XL/CbAoRMu3BU4olhl4xNKrE95vpBeDdkbSGajIShKMX1EL+T5Q42NtIg+ZTCljJkhNmVXA7F+Cf9L1Z0mEuQy5RKwsUBc6XO7WeyccRoF4kmIeTolI/vT1K7gyu83LModP3vJ8AR6PDkkhJjt3RKsdznw3IArAK+8oBOXpuwS9cs9SSj9ZdnlA== + SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wG4o5xxtcHMQ5Jarlin6SDdAAACbjCCAmoGCSqGSIb3DQEHBqCCAlswggJXAgEAMIICUAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAzPw1F2e0+GzcenbuoCARCAggIhBgnoz9W1sYdFHgvjN/zLH2lAx4CKtUFd4/1sAuAY5KSmcejGXhme4pbxgpU1ByntZvkI/c6zXBELQDBrl7uCFUrCrHpC5m2GM2QGRMDeleYxvC75np9LYFhlJNStDOtGwZtOwnKRhyihM/zR8f2Q8/zIjtXrxpMgXbAlc8YW20cRKeFm52s6U5zgUO7+bBf4im0pfIeGS8aPfPErIcK/3GQ48P2wck4+PmNAFX1z+DQZo/K3iG1+4zCDTLOkF7RvFT+bxQzGLvHwWXz11DD9kovnAkqenx7pQLoAEArx/jMOvAzeHMG/PJgVMV6JIz1VnTM8KP1BW/GBSHv+5JcPmW+YRoJMWnUm7v6oe/Wq8HEAAN/cfIeOz4O2cUCAClUJ5SFxkosyoRv9AdO5F8t2RH+F9P6c0+163q7RBV8dzXnNEGpY/f/zGv6hTDIK4WRPcEUdxCImMDSL9HfQVD+cvcsdU7CsAch6LoIIbW+3qsJEMq6TM6BjmlZCzrsesNuC2eg0Puwe/00hJ0BFZu9f57dOspcWow1GFIFXMkW4e/R9eDrxMh9YsDcayp5+h+ZI6g6rfzIk0ZP9MG1AGRn9+jOs6HvgF8Drov7e6s1YGcje0Yqj7MJ6hn+P22WJ0iuLxgfW91tsDyACfR6bqyOp9884PYasZ5uxSn6T9VpYA0J7ejKcpAk+jRCyz+CP+ytbTNFa5+hlUxW4G/7l6OVh06A= keyArn: 'arn:aws:kms:us-east-1:711302153787:key/056da528-260d-4019-8419-7df6c292710d' diff --git a/src/lib/phoneVerificationMgr.js b/src/lib/phoneVerificationMgr.js index 3278507..eeaabbf 100644 --- a/src/lib/phoneVerificationMgr.js +++ b/src/lib/phoneVerificationMgr.js @@ -43,7 +43,7 @@ class PhoneVerificationMgr { }, { debug: false, - appendToUserAgent: "uPort/nisaba" + appendToUserAgent: "NexmoVerifyTest/nisaba" } ); } @@ -206,6 +206,7 @@ class PhoneVerificationMgr { if (!reqStatus) throw "no nexmo request status"; if (!this.pgUrl) throw "no pgUrl set"; + //you can use a connectionString or a normal connection const pgClient = new Client({ connectionString: this.pgUrl }); From 835674a208ec34aab9d186bd6f2cf5c46a686114 Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Sun, 17 Jun 2018 20:49:28 -0700 Subject: [PATCH 19/38] removed all instances of funcaptcha since it wont be used and the service is far to expensive to be part of the generic solution --- package-lock.json | 28 +++++++++---------------- package.json | 1 + serverless.yml | 10 --------- src/api_handler.js | 10 --------- src/lib/funcaptchaMgr.js | 44 ---------------------------------------- 5 files changed, 11 insertions(+), 82 deletions(-) delete mode 100644 src/lib/funcaptchaMgr.js diff --git a/package-lock.json b/package-lock.json index e9a498b..29863fa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -257,27 +257,25 @@ "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=" }, "aws-sdk": { - "version": "2.209.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.209.0.tgz", - "integrity": "sha1-z+bKI3NvZlkystFMyOTknX6dIMw=", - "dev": true, + "version": "2.259.1", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.259.1.tgz", + "integrity": "sha512-z2/t30caHNadSKeasUTS8trgIoHuWtmOKEhQK72Bqtbbgviqw2++sDG1Gkbj7n7yRihmg+yPNUE6i+JG3vfDrA==", "requires": { "buffer": "4.9.1", - "events": "^1.1.1", + "events": "1.1.1", + "ieee754": "1.1.8", "jmespath": "0.15.0", "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", "uuid": "3.1.0", - "xml2js": "0.4.17", - "xmlbuilder": "4.2.1" + "xml2js": "0.4.17" }, "dependencies": { "uuid": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=", - "dev": true + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" } } }, @@ -5169,8 +5167,7 @@ "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "dev": true + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, "joi": { "version": "6.10.1", @@ -6948,8 +6945,7 @@ "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", - "dev": true + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "semver": { "version": "4.3.2", @@ -8036,7 +8032,6 @@ "version": "0.10.3", "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, "requires": { "punycode": "1.3.2", "querystring": "0.2.0" @@ -8045,8 +8040,7 @@ "punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" } } }, @@ -8360,7 +8354,6 @@ "version": "0.4.17", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", - "dev": true, "requires": { "sax": ">=0.6.0", "xmlbuilder": "^4.1.0" @@ -8370,7 +8363,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", - "dev": true, "requires": { "lodash": "^4.0.0" } diff --git a/package.json b/package.json index b0bba20..d1cf7ba 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "serverless-webpack": "^3.1.2" }, "dependencies": { + "aws-sdk": "^2.259.1", "ethr-did-resolver": "^0.0.8", "jsontokens": "^0.7.6", "nexmo": "^2.2.0", diff --git a/serverless.yml b/serverless.yml index a7cfff5..8524b52 100644 --- a/serverless.yml +++ b/serverless.yml @@ -37,16 +37,6 @@ functions: - http: path: recaptcha method: post - funcaptcha: - handler: src/api_handler.funcaptcha - description: Validate Funcaptcha Code - events: - - http: - path: v3/funcaptcha #Legacy - method: post - - http: - path: funcaptcha - method: post newDeviceKey: handler: src/api_handler.newDeviceKey description: Get a new fuel token by sending a signed requestToken diff --git a/src/api_handler.js b/src/api_handler.js index fafc2c0..bb24f19 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -12,7 +12,6 @@ const AttestationMgr = require("./lib/attestationMgr"); const PhoneVerificationMgr = require("./lib/phoneVerificationMgr"); const RecaptchaHandler = require("./handlers/recaptcha"); -const FuncaptchaHandler = require("./handlers/funcaptcha"); const NewDeviceKeyHandler = require("./handlers/newDeviceKey"); const PhoneAttestationHandler = require("./handlers/phone_attestation"); const StartVerificationHandler = require("./handlers/start_verification"); @@ -21,7 +20,6 @@ const CheckVerificationHandler = require("./handlers/check_verification"); //instantiate manager services needed for methods let recaptchaMgr = new RecaptchaMgr(); //setting and verify the captcha token -let funcaptchaMgr = new FuncaptchaMgr(); //interactive captcha service (JWT token generation) let authMgr = new AuthMgr(); //verifies authorization request to nisaba service let fuelTokenMgr = new FuelTokenMgr(); //develops new JWT tokens for new users let uPortMgr = new UPortMgr(); //uport specific JWT token verification @@ -29,7 +27,6 @@ let attestationMgr = new AttestationMgr(); // Create attestation for the subscri let phoneVerificationMgr = new PhoneVerificationMgr(); //Verify phone number code sent via text let recaptchaHandler = new RecaptchaHandler(recaptchaMgr, fuelTokenMgr); -let funcaptchaHandler = new FuncaptchaHandler(funcaptchaMgr, fuelTokenMgr); let newDeviceKeyHandler = new NewDeviceKeyHandler( authMgr, uPortMgr, @@ -55,11 +52,6 @@ module.exports.recaptcha = (event, context, callback) => { postHandler(recaptchaHandler, event, context, callback); }; -//verifies funcaptcha token and provides fuel token -module.exports.funcaptcha = (event, context, callback) => { - postHandler(funcaptchaHandler, event, context, callback); -}; - //Get a new fuel token by sending a signed requestToken module.exports.newDeviceKey = (event, context, callback) => { postHandler(newDeviceKeyHandler, event, context, callback); @@ -88,7 +80,6 @@ module.exports.check_verification = (event, context, callback) => { const postHandler = (handler, event, context, callback) => { if ( !recaptchaMgr.isSecretsSet() || - !funcaptchaMgr.isSecretsSet() || !authMgr.isSecretsSet() || !fuelTokenMgr.isSecretsSet() || !phoneVerificationMgr.isSecretsSet() @@ -102,7 +93,6 @@ const postHandler = (handler, event, context, callback) => { .then(data => { const decrypted = String(data.Plaintext); recaptchaMgr.setSecrets(JSON.parse(decrypted)); - funcaptchaMgr.setSecrets(JSON.parse(decrypted)); authMgr.setSecrets(JSON.parse(decrypted)); fuelTokenMgr.setSecrets(JSON.parse(decrypted)); phoneVerificationMgr.setSecrets(JSON.parse(decrypted)); diff --git a/src/lib/funcaptchaMgr.js b/src/lib/funcaptchaMgr.js deleted file mode 100644 index 0fa30a8..0000000 --- a/src/lib/funcaptchaMgr.js +++ /dev/null @@ -1,44 +0,0 @@ -/* -file - funcaptchaMgr.js - leverages the funcaptcha service and verifies -submitted token - -resources -- https://funcaptcha.com/ - -resource descriptions -- funCaptcha: an interactive captcha service -*/ -import rp from "request-promise"; - -class FuncaptchaMgr { - constructor() { - this.funcaptchaPrivateKey = null; - } - isSecretsSet() { - return this.funcaptchaPrivateKey !== null; - } - - setSecrets(secrets) { - this.funcaptchaPrivateKey = secrets.FUNCAPTCHA_PRIVATE_KEY; - } - - async verifyToken(funCaptchaToken) { - if (!funCaptchaToken) throw "no funCaptchaToken"; - if (!this.funcaptchaPrivateKey) throw "no funcaptchaPrivateKey set"; - //Verify token: - let verificationUrl = - "https://funcaptcha.com/fc/v/?private_key=" + - this.funcaptchaPrivateKey + - "&session_token=" + - funCaptchaToken; - - let options = { - method: "GET", - uri: verificationUrl - }; - let resp = await rp(options); - return JSON.parse(resp); - } -} - -module.exports = FuncaptchaMgr; From b8db770705278479b6ff625db92f087c8b7b6065 Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Sun, 17 Jun 2018 20:51:59 -0700 Subject: [PATCH 20/38] removed all instances of funcaptcha since it wont be used and the service is far to expensive to be part of the generic solution part II --- src/api_handler.js | 2 +- src/handlers/funcaptcha.js | 96 -------------------------------------- 2 files changed, 1 insertion(+), 97 deletions(-) delete mode 100644 src/handlers/funcaptcha.js diff --git a/src/api_handler.js b/src/api_handler.js index bb24f19..397238c 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -115,7 +115,7 @@ const doHandler = (handler, event, context, callback) => { }) }; } else { - //console.log(err); + console.log(err); let code = 500; if (err.code) code = err.code; let message = err; diff --git a/src/handlers/funcaptcha.js b/src/handlers/funcaptcha.js deleted file mode 100644 index 224eaba..0000000 --- a/src/handlers/funcaptcha.js +++ /dev/null @@ -1,96 +0,0 @@ -/* -file - funCaptcha.js - -Function: -1. Verify funCaptchaToken -2. If funCaptchaToken verified, then get new fuel token -3. send callback function with fueltoken back - -inputs -- funcaptchaMgr: interactive captcha service (JWT token generation) -- fuelTokenMgr: develops new JWT tokens for new users - -resources -- N/A - -resource description -- N/A -*/ - -class FuncaptchaHandler { - constructor(funCaptchaMgr, fuelTokenMgr) { - this.funCaptchaMgr = funCaptchaMgr; - this.fuelTokenMgr = fuelTokenMgr; - } - - async handle(event, context, cb) { - let body; - - if (event && !event.body) { - body = event; - } else if (event && event.body) { - try { - body = JSON.parse(event.body); - } catch (e) { - cb({ - code: 400, - message: "no json body" - }); - return; - } - } else { - cb({ - code: 400, - message: "no json body" - }); - return; - } - - //Check empty deviceKey - if (!body.deviceKey) { - cb({ - code: 400, - message: "no deviceKey" - }); - return; - } - //Check empty funCaptchaToken - if (!body.funCaptchaToken) { - cb({ - code: 400, - message: "no funCaptchaToken" - }); - return; - } - - try { - //Verify funCaptchaToken - let verificationResp = await this.funCaptchaMgr.verifyToken( - body.funCaptchaToken - ); - - if (!verificationResp.solved === true) { - console.error(verificationResp); - let message; - if (verificationResp.solved === false) { - message = "error verifying token: solved:false"; - } else { - message = "error verifying token: " + verificationResp.error; - } - throw { - code: 400, - message: message - }; - } - - //Get fuel token - let fuelToken = await this.fuelTokenMgr.newToken(body.deviceKey); - - cb(null, fuelToken); - } catch (err) { - cb(err); - } - } -} - -module.exports = FuncaptchaHandler; From 0ea96914e8ff539c1e5620bcf4b53b3cba358ef8 Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Sun, 17 Jun 2018 20:52:45 -0700 Subject: [PATCH 21/38] removed all instances of funcaptcha since it wont be used and the service is far to expensive to be part of the generic solution part III --- src/api_handler.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/api_handler.js b/src/api_handler.js index 397238c..4596b7c 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -4,7 +4,6 @@ const querystring = require("querystring"); require('ethr-did-resolver')() require('uport-did-resolver')() const RecaptchaMgr = require("./lib/recaptchaMgr"); -const FuncaptchaMgr = require("./lib/funcaptchaMgr"); const AuthMgr = require("./lib/authMgr"); const FuelTokenMgr = require("./lib/fuelTokenMgr"); const UPortMgr = require("./lib/uPortMgr"); From fcaf4dda6752b73c5331e4b74da4123d7cd274a2 Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Mon, 18 Jun 2018 08:54:34 -0700 Subject: [PATCH 22/38] removed recaptcha and added comments about jwt tokens and dids --- sample_events/funcaptcha.event.json | 6 - src/api_handler.js | 4 - src/handlers/__tests__/funcaptcha.test.js | 137 ---------------------- src/handlers/__tests__/recaptcha.test.js | 103 ---------------- src/handlers/recaptcha.js | 93 --------------- src/lib/__tests__/funcaptchaMgr.test.js | 50 -------- src/lib/__tests__/recaptchaMgr.test.js | 13 -- src/lib/recaptchaMgr.js | 40 ------- src/lib/uPortMgr.js | 32 +++++ 9 files changed, 32 insertions(+), 446 deletions(-) delete mode 100644 sample_events/funcaptcha.event.json delete mode 100644 src/handlers/__tests__/funcaptcha.test.js delete mode 100644 src/handlers/__tests__/recaptcha.test.js delete mode 100644 src/handlers/recaptcha.js delete mode 100644 src/lib/__tests__/funcaptchaMgr.test.js delete mode 100644 src/lib/__tests__/recaptchaMgr.test.js delete mode 100644 src/lib/recaptchaMgr.js diff --git a/sample_events/funcaptcha.event.json b/sample_events/funcaptcha.event.json deleted file mode 100644 index 95c28be..0000000 --- a/sample_events/funcaptcha.event.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "headers": { - "content-type": "application/json" - }, - "body": "{\"deviceKey\":\"0x1234\",\"funCaptchaToken\":\"https://funcaptcha.com/fc/v/?private_key=DF2EA6DC-FDEE-24D9-FA95-3CF9F717DA76&session_token=8205a12d9c3418ea8.83310539%7Cr=us-east-1%7Cmetabgclr=%23edf0f5%7Cguitextcolor=%23000000%7Cmetaiconclr=%23aebad3%7Cmeta=3%7Cpk=87A905BC-830E-6F0F-0202-B64D14CA6675%7Ccdn_url=https://cdn.funcaptcha.com/fc%7Csurl=https://funcaptcha.com\"}" -} \ No newline at end of file diff --git a/src/api_handler.js b/src/api_handler.js index 4596b7c..23904df 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -3,14 +3,12 @@ const AWS = require("aws-sdk"); const querystring = require("querystring"); require('ethr-did-resolver')() require('uport-did-resolver')() -const RecaptchaMgr = require("./lib/recaptchaMgr"); const AuthMgr = require("./lib/authMgr"); const FuelTokenMgr = require("./lib/fuelTokenMgr"); const UPortMgr = require("./lib/uPortMgr"); const AttestationMgr = require("./lib/attestationMgr"); const PhoneVerificationMgr = require("./lib/phoneVerificationMgr"); -const RecaptchaHandler = require("./handlers/recaptcha"); const NewDeviceKeyHandler = require("./handlers/newDeviceKey"); const PhoneAttestationHandler = require("./handlers/phone_attestation"); const StartVerificationHandler = require("./handlers/start_verification"); @@ -18,14 +16,12 @@ const ContinueVerificationHandler = require("./handlers/continue_verification"); const CheckVerificationHandler = require("./handlers/check_verification"); //instantiate manager services needed for methods -let recaptchaMgr = new RecaptchaMgr(); //setting and verify the captcha token let authMgr = new AuthMgr(); //verifies authorization request to nisaba service let fuelTokenMgr = new FuelTokenMgr(); //develops new JWT tokens for new users let uPortMgr = new UPortMgr(); //uport specific JWT token verification let attestationMgr = new AttestationMgr(); // Create attestation for the subscriber let phoneVerificationMgr = new PhoneVerificationMgr(); //Verify phone number code sent via text -let recaptchaHandler = new RecaptchaHandler(recaptchaMgr, fuelTokenMgr); let newDeviceKeyHandler = new NewDeviceKeyHandler( authMgr, uPortMgr, diff --git a/src/handlers/__tests__/funcaptcha.test.js b/src/handlers/__tests__/funcaptcha.test.js deleted file mode 100644 index 7398209..0000000 --- a/src/handlers/__tests__/funcaptcha.test.js +++ /dev/null @@ -1,137 +0,0 @@ -const FuncaptchaHandler = require("../funcaptcha"); - -describe("FuncaptchaHandler", () => { - let sut; - let deviceKey = "0x123456"; - let funCaptchaToken = "12345679"; - let funcaptchaMgrMock = { - verifyToken: jest.fn() - }; - let fuelTokenMgrMock = { - newToken: jest.fn() - }; - - beforeAll(() => { - sut = new FuncaptchaHandler(funcaptchaMgrMock, fuelTokenMgrMock); - }); - - test("empty constructor", () => { - expect(sut).not.toBeUndefined(); - }); - - test("handle null body", done => { - sut.handle(undefined, null, (err, res) => { - expect(err).not.toBeNull(); - expect(err.code).toEqual(400); - expect(err.message).toEqual("no json body"); - done(); - }); - }); - - test("handle empty deviceKey", done => { - sut.handle( - { - funCaptchaToken: funCaptchaToken - }, - {}, - (err, res) => { - expect(err).not.toBeNull(); - expect(err.code).toEqual(400); - expect(err.message).toEqual("no deviceKey"); - done(); - } - ); - }); - - test("handle empty funCaptchaToken", done => { - sut.handle( - { - deviceKey: deviceKey - }, - {}, - (err, res) => { - expect(err).not.toBeNull(); - expect(err.code).toEqual(400); - expect(err.message).toEqual("no funCaptchaToken"); - done(); - } - ); - }); - - test("call funcaptchaMgr.verifyToken()", done => { - sut.handle( - { - deviceKey: deviceKey, - funCaptchaToken: funCaptchaToken - }, - {}, - (err, res) => { - expect(funcaptchaMgrMock.verifyToken).toBeCalled(); - expect(funcaptchaMgrMock.verifyToken).toBeCalledWith(funCaptchaToken); - done(); - } - ); - }); - - test("call fuelTokenMgr.newToken()", done => { - funcaptchaMgrMock.verifyToken.mockImplementation(() => { - return { - solved: true - }; - }); - sut.handle( - { - deviceKey: deviceKey, - funCaptchaToken: funCaptchaToken - }, - {}, - (err, res) => { - expect(fuelTokenMgrMock.newToken).toBeCalled(); - expect(fuelTokenMgrMock.newToken).toBeCalledWith(deviceKey); - done(); - } - ); - }); - - test("catch exception", done => { - funcaptchaMgrMock.verifyToken.mockImplementation(() => { - throw "throwed error"; - }); - sut.handle( - { - deviceKey: deviceKey, - funCaptchaToken: funCaptchaToken - }, - {}, - (err, res) => { - expect(funcaptchaMgrMock.verifyToken).toBeCalled(); - expect(err).not.toBeNull(); - expect(err).toEqual("throwed error"); - done(); - } - ); - }); - - test("catch exception (with message)", done => { - funcaptchaMgrMock.verifyToken.mockImplementation(() => { - throw { - message: "throwed error" - }; - }); - sut.handle( - { - deviceKey: deviceKey, - funCaptchaToken: funCaptchaToken - }, - {}, - (err, res) => { - expect(funcaptchaMgrMock.verifyToken).toBeCalled(); - expect(err).not.toBeNull(); - expect(err).toEqual({ - message: "throwed error" - }); - done(); - } - ); - }); -}); diff --git a/src/handlers/__tests__/recaptcha.test.js b/src/handlers/__tests__/recaptcha.test.js deleted file mode 100644 index 1b482e4..0000000 --- a/src/handlers/__tests__/recaptcha.test.js +++ /dev/null @@ -1,103 +0,0 @@ -const RecaptchaHandler = require("../recaptcha"); - -describe("RecaptchaHandler", () => { - let sut; - let deviceKey = "0x123456"; - let reCaptchaToken = "12345679"; - let recaptchaMgrMock = { verifyToken: jest.fn() }; - let fuelTokenMgrMock = { newToken: jest.fn() }; - - beforeAll(() => { - sut = new RecaptchaHandler(recaptchaMgrMock, fuelTokenMgrMock); - }); - - test("empty constructor", () => { - expect(sut).not.toBeUndefined(); - }); - - test("handle null body", done => { - sut.handle(null, {}, (err, res) => { - expect(err).not.toBeNull(); - expect(err.code).toEqual(400); - expect(err.message).toEqual("no json body"); - done(); - }); - }); - - test("handle empty deviceKey", done => { - sut.handle({ reCaptchaToken: reCaptchaToken }, {}, (err, res) => { - expect(err).not.toBeNull(); - expect(err.code).toEqual(400); - expect(err.message).toEqual("no deviceKey"); - done(); - }); - }); - - test("handle empty reCaptchaToken", done => { - sut.handle({ deviceKey: deviceKey }, {}, (err, res) => { - expect(err).not.toBeNull(); - expect(err.code).toEqual(400); - expect(err.message).toEqual("no reCaptchaToken"); - done(); - }); - }); - - test("call recaptchaMgr.verifyToken()", done => { - sut.handle( - { deviceKey: deviceKey, reCaptchaToken: reCaptchaToken }, - {}, - (err, res) => { - expect(recaptchaMgrMock.verifyToken).toBeCalled(); - expect(recaptchaMgrMock.verifyToken).toBeCalledWith(reCaptchaToken); - done(); - } - ); - }); - - test("call fuelTokenMgr.newToken()", done => { - recaptchaMgrMock.verifyToken.mockImplementation(() => { - return { success: true }; - }); - sut.handle( - { deviceKey: deviceKey, reCaptchaToken: reCaptchaToken }, - {}, - (err, res) => { - expect(fuelTokenMgrMock.newToken).toBeCalled(); - expect(fuelTokenMgrMock.newToken).toBeCalledWith(deviceKey); - done(); - } - ); - }); - - test("catch exception", done => { - recaptchaMgrMock.verifyToken.mockImplementation(() => { - throw "throwed error"; - }); - sut.handle( - { deviceKey: deviceKey, reCaptchaToken: reCaptchaToken }, - {}, - (err, res) => { - expect(recaptchaMgrMock.verifyToken).toBeCalled(); - expect(err).not.toBeNull(); - expect(err).toEqual("throwed error"); - done(); - } - ); - }); - - test("catch exception (with message)", done => { - recaptchaMgrMock.verifyToken.mockImplementation(() => { - throw { message: "throwed error" }; - }); - sut.handle( - { deviceKey: deviceKey, reCaptchaToken: reCaptchaToken }, - {}, - (err, res) => { - expect(recaptchaMgrMock.verifyToken).toBeCalled(); - expect(err).not.toBeNull(); - expect(err).toEqual({ message: "throwed error" }); - done(); - } - ); - }); -}); diff --git a/src/handlers/recaptcha.js b/src/handlers/recaptcha.js deleted file mode 100644 index 1b46e85..0000000 --- a/src/handlers/recaptcha.js +++ /dev/null @@ -1,93 +0,0 @@ -/* -file - recaptcha.js - -Function: -1. Verify reCaptchaToken -2. If reCaptchaToken verified, then get new fuel token -3. send callback function with fueltoken back - -inputs -- recaptchaMgr: setting and verify the captcha token -- fuelTokenMgr: develops new JWT tokens for new users - -resources -- N/A - -resource description -- N/A -*/ -class RecaptchaHandler { - constructor(recaptchaMgr, fuelTokenMgr) { - this.recaptchaMgr = recaptchaMgr; - this.fuelTokenMgr = fuelTokenMgr; - } - - async handle(event, context, cb) { - let body; - - if (event && !event.body) { - body = event; - } else if (event && event.body) { - try { - body = JSON.parse(event.body); - } catch (e) { - cb({ - code: 400, - message: "no json body" - }); - return; - } - } else { - cb({ - code: 400, - message: "no json body" - }); - return; - } - - //Check empty deviceKey - if (!body.deviceKey) { - cb({ - code: 400, - message: "no deviceKey" - }); - return; - } - //Check empty reCaptchaToken - if (!body.reCaptchaToken) { - cb({ - code: 400, - message: "no reCaptchaToken" - }); - return; - } - - //TODO:Check remoteIp - - try { - //Verify reCaptchaToken - let verificationResp = await this.recaptchaMgr.verifyToken( - body.reCaptchaToken - ); - - if (!verificationResp.success === true) { - console.error(verificationResp); - let message = - "error verifying token: " + verificationResp["error-codes"]; - throw { - code: 400, - message: message - }; - } - - //Get fuel token - let fuelToken = await this.fuelTokenMgr.newToken(body.deviceKey); - - cb(null, fuelToken); - } catch (err) { - cb(err); - } - } -} - -module.exports = RecaptchaHandler; diff --git a/src/lib/__tests__/funcaptchaMgr.test.js b/src/lib/__tests__/funcaptchaMgr.test.js deleted file mode 100644 index 0f08495..0000000 --- a/src/lib/__tests__/funcaptchaMgr.test.js +++ /dev/null @@ -1,50 +0,0 @@ -const FuncaptchaMgr = require("../funcaptchaMgr"); - -describe("FuncaptchaMgr", () => { - let sut; - - beforeAll(() => { - sut = new FuncaptchaMgr(); - }); - - test("empty constructor", () => { - expect(sut).not.toBeUndefined(); - }); - - test("is isSecretsSet", () => { - let secretSet = sut.isSecretsSet(); - expect(secretSet).toEqual(false); - }); - - test("verifyToken() no funCaptchaToken", done => { - sut - .verifyToken() - .then(resp => { - fail("shouldn't return"); - done(); - }) - .catch(err => { - expect(err).toEqual("no funCaptchaToken"); - done(); - }); - }); - - test("verifyToken() no funcaptchaPrivateKey set", done => { - sut - .verifyToken("faketoken") - .then(resp => { - fail("shouldn't return"); - done(); - }) - .catch(err => { - expect(err).toEqual("no funcaptchaPrivateKey set"); - done(); - }); - }); - - test("setSecrets", () => { - expect(sut.isSecretsSet()).toEqual(false); - sut.setSecrets({ FUNCAPTCHA_PRIVATE_KEY: "fakekey" }); - expect(sut.isSecretsSet()).toEqual(true); - }); -}); diff --git a/src/lib/__tests__/recaptchaMgr.test.js b/src/lib/__tests__/recaptchaMgr.test.js deleted file mode 100644 index d310c74..0000000 --- a/src/lib/__tests__/recaptchaMgr.test.js +++ /dev/null @@ -1,13 +0,0 @@ -const RecaptchaMgr = require("../recaptchaMgr"); - -describe("RecaptchaMgr", () => { - let sut; - - beforeAll(() => { - sut = new RecaptchaMgr(); - }); - - test("empty constructor", () => { - expect(sut).not.toBeUndefined(); - }); -}); diff --git a/src/lib/recaptchaMgr.js b/src/lib/recaptchaMgr.js deleted file mode 100644 index 5ca2813..0000000 --- a/src/lib/recaptchaMgr.js +++ /dev/null @@ -1,40 +0,0 @@ -/* -file - recaptchaMgr.js - setting and verify the captcha token being submited - -resource - https://developers.google.com/recaptcha/intro - -resource description - A user authentication API that leverages captchas to -protect your service against spam and other types of automated abuse -*/ -import rp from "request-promise"; - -class RecaptchaMgr { - constructor() { - this.recaptchaSecretKey = null; - } - isSecretsSet() { - return this.recaptchaSecretKey !== null; - } - - setSecrets(secrets) { - //setting the secret environmental variable to RECAPTCHA_SECRET_KEY - this.recaptchaSecretKey = secrets.RECAPTCHA_SECRET_KEY; - } - - async verifyToken(reCaptchaToken) { - //Verify token: - let verificationUrl = "https://www.google.com/recaptcha/api/siteverify"; - let options = { - method: "POST", - uri: verificationUrl, - form: { - secret: this.recaptchaSecretKey, - response: reCaptchaToken - } - }; - let resp = await rp(options); - return JSON.parse(resp); - } -} - -module.exports = RecaptchaMgr; diff --git a/src/lib/uPortMgr.js b/src/lib/uPortMgr.js index 37f93e4..77f79c8 100644 --- a/src/lib/uPortMgr.js +++ b/src/lib/uPortMgr.js @@ -13,6 +13,38 @@ class UportMgr { async verifyToken(token) { if (!token) throw "no token"; return verifyJWT(token); + /* + Background Information + - jwt String containing a JSON Web Tokens (JWT) yes + - options.auth Require signer to be listed in the authentication section + of the DID document (for Authentication of a user with DID-AUTH) + - options.audience The DID of the audience of the JWT no + - options.callbackUrl The the URL receiving the JWT no + + The Input Flow + verifyJWT() --> resolveAuthenticator() --> normalizeDID() --> + sees if it has '/^did:/' in it or if it isMNID() --> puts error if no and + continues function if yest + + Additional Information + where mnid stands for Multi Network Identifier (MNID), https://github.com/uport-project/mnid + ex DID: const did = `did:uport:${mnid}` + mnid is a base58 encoded result with various attributes like the following: + - network + - address + + Expectations of the JWT + It needs to have the following: + const did = obj.did // DID of signer + * did DID of signer + * doc DID Document of signer + * signerKeyId ID of key in DID document that signed JWT + * jwt a JSON Web Token to verify + * auth Require signer to be listed in the authentication section of the DID document (for Authentication purposes) + * audience DID of the recipient of the JWT + * callbackUrl callback url in JWT + + */ } } module.exports = UportMgr; From 033fe0acaa91118b5fa377c199935c7b3e1e73bb Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 13:04:38 -0400 Subject: [PATCH 23/38] fix tests --- src/handlers/__tests__/check_verification.test.js | 5 ++++- src/lib/__tests__/phoneVerificationMgr.test.js | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/handlers/__tests__/check_verification.test.js b/src/handlers/__tests__/check_verification.test.js index 722a1df..af0761e 100644 --- a/src/handlers/__tests__/check_verification.test.js +++ b/src/handlers/__tests__/check_verification.test.js @@ -7,9 +7,12 @@ describe("CheckVerificationHandler", () => { return Promise.resolve({ data: "data" }, null); }) }; + let fuelTokenMgrMock = { + newToken: jest.fn() + }; beforeAll(() => { - sut = new CheckVerificationHandler(phoneVerificationMgrMock); + sut = new CheckVerificationHandler(phoneVerificationMgrMock, fuelTokenMgrMock); }); test("empty constructor", () => { diff --git a/src/lib/__tests__/phoneVerificationMgr.test.js b/src/lib/__tests__/phoneVerificationMgr.test.js index a53598d..013fc56 100644 --- a/src/lib/__tests__/phoneVerificationMgr.test.js +++ b/src/lib/__tests__/phoneVerificationMgr.test.js @@ -99,7 +99,7 @@ describe("PhoneVerificationMgr", () => { test("start() happy path", done => { let params = { number: phoneNumber, - brand: "uPort", + brand: "NexmoVerifyTest", code_length: 6 }; From b149666490a3b52c94b7e6231e4d06caf61c7767 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 13:43:30 -0400 Subject: [PATCH 24/38] Update SETUP.md for fuel token and sensui address --- SETUP.md | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/SETUP.md b/SETUP.md index d743b8d..669dcb4 100644 --- a/SETUP.md +++ b/SETUP.md @@ -28,17 +28,18 @@ Make sure the keys you created are in the correct region (`us-west-2`). If you decide to create keys in another region, make sure to change region configuration in other places too. 6. Create reCaptcha account: https://www.google.com/recaptcha/admin, get `RECAPTCHA_SECRET_KEY` - (You only need to set this up if you want to use the reCAPTCHA verification flow, not need for phone verification flow) + (You only need to set this up if you want to use the reCAPTCHA verification flow, not needed for phone verification flow) 7. Create fun captcha account: https://www.funcaptcha.com/setup, get `FUNCAPTCHA_PRIVATE_KEY`. - (They currently ignore us after we fill in a form, skip this step for now; this is also not need for phone verification flow) -8. Generate Fuel token private & public keys: `FUEL_TOKEN_PRIVATE_KEY`, `FUEL_TOKEN_PUBLIC_KEY`. + (They currently ignore us after we fill in a form, skip this step for now; this is also not needed for phone verification flow) +8. Generate Fuel token private & public keys and address: `FUEL_TOKEN_PRIVATE_KEY`, `FUEL_TOKEN_PUBLIC_KEY`, `FUEL_TOKEN_ADDRESS`. - There is nothing special about these keys. They are just `specp256k1` key pair. You can generate them here: https://kjur.github.io/jsrsasign/sample/sample-ecdsa.html -9. Create nexmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` + Create an app e.g. nisaba on uport app manager: https://appmanager.uport.me/, you can see the ```address``` and ```public key``` (remove the `0x`) listed there. Click `click here for app code`, you can get the ```private key``` inside ```SimpleSinger```. +9. If you want the JWT payload aud to include sensui (https://github.com/ConsenSys/lambda-sensui), create an app e.g. sensui on uport app manager: https://appmanager.uport.me/, get the ```address``` for ```SENSUI_ADDRESS```. +10. Create nexmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` You can find `NEXMO_FROM` in the dashboard, 'Numbers -> Your numbers' section. -10. Setup PostgreSQL locally +11. Setup PostgreSQL locally Start server: `pg_ctl -D /usr/local/var/postgres start &` (Stop server: `pg_ctl -D /usr/local/var/postgres stop`) @@ -58,7 +59,7 @@ ``` In this case `PG_URL=postgresql://localhost` -11. Delete the old `kms-secrets.develop.us-west-2.yml` and `kms-secrets.master.us-west-2.yml`. +12. Delete the old `kms-secrets.develop.us-west-2.yml` and `kms-secrets.master.us-west-2.yml`. Generate your own using the following command: @@ -76,6 +77,8 @@ FUNCAPTCHA_PRIVATE_KEY FUEL_TOKEN_PRIVATE_KEY FUEL_TOKEN_PUBLIC_KEY + FUEL_TOKEN_ADDRESS + SENSUI_ADDRESS NEXMO_API_KEY NEXMO_API_SECRET NEXMO_FROM @@ -83,7 +86,7 @@ ``` Run `sls decrypt` to check the encryption works correctly. -12. Now you can run locally +13. Now you can run locally ```sls invoke local -f [function] -d [data]``` From 4cbe3ef31a1d062efab71847f206e7468de758fd Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 15:39:14 -0400 Subject: [PATCH 25/38] use FULE_TOKEN_ADDRESS and SENSUI_ADDRESS for issuer and aud --- src/lib/__tests__/fuelTokenMgr.test.js | 5 ++++- src/lib/fuelTokenMgr.js | 23 +++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/lib/__tests__/fuelTokenMgr.test.js b/src/lib/__tests__/fuelTokenMgr.test.js index a3d83b1..ad45336 100644 --- a/src/lib/__tests__/fuelTokenMgr.test.js +++ b/src/lib/__tests__/fuelTokenMgr.test.js @@ -7,6 +7,8 @@ describe("FuelTokenMgr", () => { "278a5de700e29faae8e40e366ec5012b5ec63d36ec77e8a2417154cc1d25383f"; let ftPubKey = "03fdd57adec3d438ea237fe46b33ee1e016eda6b585c3e27ea66686c2ea5358479"; + let ftAddress = + "4a40d30db3bed8b02cff6666125a7f659ac1f601"; beforeAll(() => { sut = new FuelTokenMgr(); @@ -25,7 +27,8 @@ describe("FuelTokenMgr", () => { expect(sut.isSecretsSet()).toEqual(false); sut.setSecrets({ FUEL_TOKEN_PRIVATE_KEY: ftPrivKey, - FUEL_TOKEN_PUBLIC_KEY: ftPubKey + FUEL_TOKEN_PUBLIC_KEY: ftPubKey, + FUEL_TOKEN_ADDRESS: ftAddress }); expect(sut.isSecretsSet()).toEqual(true); }); diff --git a/src/lib/fuelTokenMgr.js b/src/lib/fuelTokenMgr.js index afe42b9..1525386 100644 --- a/src/lib/fuelTokenMgr.js +++ b/src/lib/fuelTokenMgr.js @@ -20,34 +20,34 @@ class FuelTokenMgr { constructor() { this.signingKey = null; this.publicKey = null; + this.address = null; this.tokenSigner = null; } isSecretsSet() { - return this.signingKey !== null && this.publicKey !== null; + return this.signingKey !== null && this.publicKey !== null && this.address != null; } setSecrets(secrets) { this.signingKey = secrets.FUEL_TOKEN_PRIVATE_KEY; this.publicKey = secrets.FUEL_TOKEN_PUBLIC_KEY; + this.address = secrets.FUEL_TOKEN_ADDRESS; + this.aud = secrets.SENSUI_ADDRESS ? + [secrets.FUEL_TOKEN_ADDRESS, secrets.SENSUI_ADDRESS] : secrets.FUEL_TOKEN_ADDRESS; this.tokenSigner = SimpleSigner(this.signingKey); } /* Uport specific - needs to be changed for other builds */ async newToken(deviceKey) { const signer = this.tokenSigner; - let now = Math.floor(Date.now() / 1000); + const now = Math.floor(Date.now() / 1000); return createJWT( { - aud: [ - "api.uport.me/nisaba", - "api.uport.me/unnu", - "api.uport.me/sensui" - ], + aud: this.aud, exp: now + 300, sub: deviceKey, iat: now }, - { issuer: "api.uport.me/nisaba", signer } + { issuer: this.address, signer } ).then(jwt => { return jwt; }); @@ -55,13 +55,8 @@ class FuelTokenMgr { /* Uport specific - needs to be changed for other builds */ async verifyToken(fuelToken) { - let aud = [ - "api.uport.me/nisaba", - "api.uport.me/unnu", - "api.uport.me/sensui" - ]; verifyJWT(fuelToken, { - audience: aud + audience: this.aud }).then(({ payload, doc, did, signer, jwt }) => { console.log(payload); }); From 620ec07f4016f1433364179b1e637c2b403ed1a7 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 18:27:02 -0400 Subject: [PATCH 26/38] update encrypted variables --- kms-secrets.develop.us-east-1.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kms-secrets.develop.us-east-1.yml b/kms-secrets.develop.us-east-1.yml index 3ebe4ce..0df2715 100644 --- a/kms-secrets.develop.us-east-1.yml +++ b/kms-secrets.develop.us-east-1.yml @@ -1,3 +1,3 @@ secrets: - SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wG4o5xxtcHMQ5Jarlin6SDdAAACbjCCAmoGCSqGSIb3DQEHBqCCAlswggJXAgEAMIICUAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAzPw1F2e0+GzcenbuoCARCAggIhBgnoz9W1sYdFHgvjN/zLH2lAx4CKtUFd4/1sAuAY5KSmcejGXhme4pbxgpU1ByntZvkI/c6zXBELQDBrl7uCFUrCrHpC5m2GM2QGRMDeleYxvC75np9LYFhlJNStDOtGwZtOwnKRhyihM/zR8f2Q8/zIjtXrxpMgXbAlc8YW20cRKeFm52s6U5zgUO7+bBf4im0pfIeGS8aPfPErIcK/3GQ48P2wck4+PmNAFX1z+DQZo/K3iG1+4zCDTLOkF7RvFT+bxQzGLvHwWXz11DD9kovnAkqenx7pQLoAEArx/jMOvAzeHMG/PJgVMV6JIz1VnTM8KP1BW/GBSHv+5JcPmW+YRoJMWnUm7v6oe/Wq8HEAAN/cfIeOz4O2cUCAClUJ5SFxkosyoRv9AdO5F8t2RH+F9P6c0+163q7RBV8dzXnNEGpY/f/zGv6hTDIK4WRPcEUdxCImMDSL9HfQVD+cvcsdU7CsAch6LoIIbW+3qsJEMq6TM6BjmlZCzrsesNuC2eg0Puwe/00hJ0BFZu9f57dOspcWow1GFIFXMkW4e/R9eDrxMh9YsDcayp5+h+ZI6g6rfzIk0ZP9MG1AGRn9+jOs6HvgF8Drov7e6s1YGcje0Yqj7MJ6hn+P22WJ0iuLxgfW91tsDyACfR6bqyOp9884PYasZ5uxSn6T9VpYA0J7ejKcpAk+jRCyz+CP+ytbTNFa5+hlUxW4G/7l6OVh06A= + SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wG88eeKgUO6ZOpadVz8PhN2AAAC4jCCAt4GCSqGSIb3DQEHBqCCAs8wggLLAgEAMIICxAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxfmKY6uNgEiLndZG0CARCAggKVnMS4p3ZPkmj0z8iRL93yD7I6U8X2g/Vy7yPfyEPT0Z7fCTdApr4ZhGXXof549WMWOl+k8kromt9z+r2+QlZgtDrLchhYXyqgHsM2Rn6L8CStpX3c4Lgq+WbIlrOc47hJNGXM+71Tyh1q6KkrIsHM56DoceGiWc6RB9o96rfZE5Mw1uxLzh8sY7CTqHUk8x3pzCwX7pl2iaZnMF4RylxPxDL4+yv/SkVDTzL6wOjfrDUeJxolI/T/TuebGzNhrfMwtJTtvb9Fu6aAzio4ekvgyViZ1ha1KChvo6TmOXXzRGduKPkZ5ICgKhHEza27qhpy7cUqh4Yw08I/csoHhrm67qngbDOuEkCYO2pEAlwd/oR7D3T0H+qBmN0hE+bln/F/ZdbPsvVd9ObWy6zk45BeOpdK3oQ0s5CdJTzWvYfLpOlMh0gGKTpClBtnvk9tre+wx+pTAlTEPGDWFT+RJRZqUSZXkXelT25pf7o1VdxhdyaP74fWeA8Hb+6xZoGldWJLrkgOqBTPErlatCF5jm9KSwro4+br4GiOUMQquddZlbBwtGjNmoXyS0sXqCum4YcC0PQ/CFbRiuiCMu6pwvLANlVoDOPDlnL8+2ZhlzuI7FKlByNf5LqEgmsi1yt1XVQ++MHQxGMJtxckCwta74Er/sDUHUgm5s9IOc3H4AU0sQVB2iHtSqTehayybdXSG6wjEU273thNGvNDtAoqXQVyjFuL0y6uq/19s1aa9yvRxhY1ZaXRf2rmkDSxiFFOo4hVVDrebJdkm8atM75Gdu5eZXN5UtVlpsovRClYqBk0dgYbLciL0R36d93nRqRtx5mGIBy3SjuVLCxamnsu/HGwliWHSNf8IPVvMnigxbiMNQGEh78A4A== keyArn: 'arn:aws:kms:us-east-1:711302153787:key/056da528-260d-4019-8419-7df6c292710d' From 93373095772baf190fd9cabd3924d4ea47cd1fe7 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 18:29:11 -0400 Subject: [PATCH 27/38] fix fuelTokenMgr --- src/lib/fuelTokenMgr.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/lib/fuelTokenMgr.js b/src/lib/fuelTokenMgr.js index 1525386..8a25942 100644 --- a/src/lib/fuelTokenMgr.js +++ b/src/lib/fuelTokenMgr.js @@ -21,6 +21,7 @@ class FuelTokenMgr { this.signingKey = null; this.publicKey = null; this.address = null; + this.aud = null; this.tokenSigner = null; } isSecretsSet() { @@ -31,8 +32,8 @@ class FuelTokenMgr { this.signingKey = secrets.FUEL_TOKEN_PRIVATE_KEY; this.publicKey = secrets.FUEL_TOKEN_PUBLIC_KEY; this.address = secrets.FUEL_TOKEN_ADDRESS; - this.aud = secrets.SENSUI_ADDRESS ? - [secrets.FUEL_TOKEN_ADDRESS, secrets.SENSUI_ADDRESS] : secrets.FUEL_TOKEN_ADDRESS; + // did-jwt doese not support aud to be an array + this.aud = secrets.AUDIENCE_ADDRESS || this.address; this.tokenSigner = SimpleSigner(this.signingKey); } @@ -48,17 +49,13 @@ class FuelTokenMgr { iat: now }, { issuer: this.address, signer } - ).then(jwt => { - return jwt; - }); + ); } /* Uport specific - needs to be changed for other builds */ async verifyToken(fuelToken) { - verifyJWT(fuelToken, { + return verifyJWT(fuelToken, { audience: this.aud - }).then(({ payload, doc, did, signer, jwt }) => { - console.log(payload); }); } From a42c4898c460ee381263131c4c934d058fe1d513 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 18:39:52 -0400 Subject: [PATCH 28/38] remove uPortMgr, add requestTokenMgr --- src/api_handler.js | 6 ++--- ...t.js.snap => requestTokenMgr.test.js.snap} | 2 +- ...ortMgr.test.js => requestTokenMgr.test.js} | 6 ++--- src/lib/requestTokenMgr.js | 25 +++++++++++++++++++ src/lib/uPortMgr.js | 18 ------------- 5 files changed, 32 insertions(+), 25 deletions(-) rename src/lib/__tests__/__snapshots__/{uPortMgr.test.js.snap => requestTokenMgr.test.js.snap} (97%) rename src/lib/__tests__/{uPortMgr.test.js => requestTokenMgr.test.js} (91%) create mode 100644 src/lib/requestTokenMgr.js delete mode 100644 src/lib/uPortMgr.js diff --git a/src/api_handler.js b/src/api_handler.js index fafc2c0..1953130 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -7,7 +7,7 @@ const RecaptchaMgr = require("./lib/recaptchaMgr"); const FuncaptchaMgr = require("./lib/funcaptchaMgr"); const AuthMgr = require("./lib/authMgr"); const FuelTokenMgr = require("./lib/fuelTokenMgr"); -const UPortMgr = require("./lib/uPortMgr"); +const RequestTokenMgr = require("./lib/RequestTokenMgr"); const AttestationMgr = require("./lib/attestationMgr"); const PhoneVerificationMgr = require("./lib/phoneVerificationMgr"); @@ -24,7 +24,7 @@ let recaptchaMgr = new RecaptchaMgr(); //setting and verify the captcha token let funcaptchaMgr = new FuncaptchaMgr(); //interactive captcha service (JWT token generation) let authMgr = new AuthMgr(); //verifies authorization request to nisaba service let fuelTokenMgr = new FuelTokenMgr(); //develops new JWT tokens for new users -let uPortMgr = new UPortMgr(); //uport specific JWT token verification +let requestTokenMgr = new RequestTokenMgr(); // Generate and verify request token let attestationMgr = new AttestationMgr(); // Create attestation for the subscriber let phoneVerificationMgr = new PhoneVerificationMgr(); //Verify phone number code sent via text @@ -32,7 +32,7 @@ let recaptchaHandler = new RecaptchaHandler(recaptchaMgr, fuelTokenMgr); let funcaptchaHandler = new FuncaptchaHandler(funcaptchaMgr, fuelTokenMgr); let newDeviceKeyHandler = new NewDeviceKeyHandler( authMgr, - uPortMgr, + requestTokenMgr, fuelTokenMgr ); let phoneAttestationHandler = new PhoneAttestationHandler( diff --git a/src/lib/__tests__/__snapshots__/uPortMgr.test.js.snap b/src/lib/__tests__/__snapshots__/requestTokenMgr.test.js.snap similarity index 97% rename from src/lib/__tests__/__snapshots__/uPortMgr.test.js.snap rename to src/lib/__tests__/__snapshots__/requestTokenMgr.test.js.snap index 5e84997..62f49a0 100644 --- a/src/lib/__tests__/__snapshots__/uPortMgr.test.js.snap +++ b/src/lib/__tests__/__snapshots__/requestTokenMgr.test.js.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`UportMgr verifyToken() happy path 1`] = ` +exports[`RequestTokenMgr verifyToken() happy path 1`] = ` Object { "doc": Object { "@context": "https://w3id.org/did/v1", diff --git a/src/lib/__tests__/uPortMgr.test.js b/src/lib/__tests__/requestTokenMgr.test.js similarity index 91% rename from src/lib/__tests__/uPortMgr.test.js rename to src/lib/__tests__/requestTokenMgr.test.js index b865ade..84ee16d 100644 --- a/src/lib/__tests__/uPortMgr.test.js +++ b/src/lib/__tests__/requestTokenMgr.test.js @@ -1,13 +1,13 @@ -const UportMgr = require("../uPortMgr"); +const RequestTokenMgr = require("../requestTokenMgr"); -describe("UportMgr", () => { +describe("RequestTokenMgr", () => { let sut; //let eventToken='eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJpc3MiOiIyb3pzRlFXQVU3Q3BIWkxxdTJ3U1liSkZXekROQjI2YW9DRiIsImlhdCI6MTUxMzM1MjgwNiwiZXZlbnQiOnsidHlwZSI6IlNBVkVfRlVFTF9CQUxBTkNFIiwiYWRkcmVzcyI6IjJvenNGUVdBVTdDcEhaTHF1MndTWWJKRld6RE5CMjZhb0NGIiwiYmFsYW5jZSI6IjAifSwiZXhwIjoxNTEzNDM5MjA2fQ.hs0JTSiUe2CzaOm32v80862BFGi2dgvBCHG5yIA7tLKCjnON2e39LddywBpiNlCVVzR_qn-IsZ3xhHWjXVT0Yg' let eventToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NksifQ.eyJpc3MiOiIyb3pzRlFXQVU3Q3BIWkxxdTJ3U1liSkZXekROQjI2YW9DRiIsImlhdCI6MTUxMzM1MjgzNCwiZXZlbnQiOnsidHlwZSI6IlNUT1JFX0NPTk5FQ1RJT04iLCJhZGRyZXNzIjoiMm96c0ZRV0FVN0NwSFpMcXUyd1NZYkpGV3pETkIyNmFvQ0YiLCJjb25uZWN0aW9uVHlwZSI6ImNvbnRyYWN0cyIsImNvbm5lY3Rpb24iOiIweDJjYzMxOTEyYjJiMGYzMDc1YTg3YjM2NDA5MjNkNDVhMjZjZWYzZWUifSwiZXhwIjoxNTEzNDM5MjM0fQ.tqX5eEuaTEyYPUSgatK5zEsj_WpE-dIEHDc4ItpOvAZuBkSyV9_zbb0puNtDrZTVA7MlZ43FSSpf9CGIUxup-w"; beforeAll(() => { - sut = new UportMgr(); + sut = new RequestTokenMgr(); jasmine.DEFAULT_TIMEOUT_INTERVAL = 60000; }); diff --git a/src/lib/requestTokenMgr.js b/src/lib/requestTokenMgr.js new file mode 100644 index 0000000..0797418 --- /dev/null +++ b/src/lib/requestTokenMgr.js @@ -0,0 +1,25 @@ +import { verifyJWT } from "did-jwt/lib/JWT"; + +class RequestTokenMgr { + constructor() { + this.address = null; + this.aud = null; + } + + isSecretsSet() { + return this.address != null; + } + + setSecrets(secrets) { + this.address = secrets.FUEL_TOKEN_ADDRESS; + this.aud = secrets.AUDIENCE_ADDRESS || this.address; + } + + async verifyToken(token) { + if (!token) throw "no token"; + return verifyJWT(token, { + audience: this.aud + }); + } +} +module.exports = RequestTokenMgr; diff --git a/src/lib/uPortMgr.js b/src/lib/uPortMgr.js deleted file mode 100644 index 37f93e4..0000000 --- a/src/lib/uPortMgr.js +++ /dev/null @@ -1,18 +0,0 @@ -/* -file - uPortMgr.js - uport specific token verification (may want to take out) - -resources -- https://github.com/uport-project/did-jwt/blob/develop/src/JWT.js - -resource description -- uport specific JWT token verification -*/ -import { verifyJWT } from "did-jwt/lib/JWT"; - -class UportMgr { - async verifyToken(token) { - if (!token) throw "no token"; - return verifyJWT(token); - } -} -module.exports = UportMgr; From d457f6c30bc12e3e0d935878e84de5ac03a15f21 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 18:43:45 -0400 Subject: [PATCH 29/38] Update SETUP.md --- SETUP.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SETUP.md b/SETUP.md index 669dcb4..da60e9a 100644 --- a/SETUP.md +++ b/SETUP.md @@ -35,7 +35,9 @@ 8. Generate Fuel token private & public keys and address: `FUEL_TOKEN_PRIVATE_KEY`, `FUEL_TOKEN_PUBLIC_KEY`, `FUEL_TOKEN_ADDRESS`. Create an app e.g. nisaba on uport app manager: https://appmanager.uport.me/, you can see the ```address``` and ```public key``` (remove the `0x`) listed there. Click `click here for app code`, you can get the ```private key``` inside ```SimpleSinger```. -9. If you want the JWT payload aud to include sensui (https://github.com/ConsenSys/lambda-sensui), create an app e.g. sensui on uport app manager: https://appmanager.uport.me/, get the ```address``` for ```SENSUI_ADDRESS```. +9. If you want the JWT payload aud to be another app rather than this one, you can create an app e.g. sensui on uport app manager: https://appmanager.uport.me/, get the ```address``` for ```AUDIENCE_ADDRESS```. + + Note: for step 8 and step 9, if in doubt, you can append ```did:uport:``` to ```address``` and test it out in the uport did resolver: http://uportdid.radicalledger.com/. 10. Create nexmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` You can find `NEXMO_FROM` in the dashboard, 'Numbers -> Your numbers' section. @@ -78,7 +80,7 @@ FUEL_TOKEN_PRIVATE_KEY FUEL_TOKEN_PUBLIC_KEY FUEL_TOKEN_ADDRESS - SENSUI_ADDRESS + AUDIENCE_ADDRESS NEXMO_API_KEY NEXMO_API_SECRET NEXMO_FROM From 01ea84c3d8c5ce5cfda11b97a5398fd1c3eaaa1f Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 19:05:33 -0400 Subject: [PATCH 30/38] verify the header jwt to be valid fueltoken --- src/api_handler.js | 2 +- src/handlers/__tests__/newDeviceKey.test.js | 14 +++++++------- src/handlers/newDeviceKey.js | 21 ++++++++++++++++----- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/api_handler.js b/src/api_handler.js index 1953130..53135ce 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -7,7 +7,7 @@ const RecaptchaMgr = require("./lib/recaptchaMgr"); const FuncaptchaMgr = require("./lib/funcaptchaMgr"); const AuthMgr = require("./lib/authMgr"); const FuelTokenMgr = require("./lib/fuelTokenMgr"); -const RequestTokenMgr = require("./lib/RequestTokenMgr"); +const RequestTokenMgr = require("./lib/requestTokenMgr"); const AttestationMgr = require("./lib/attestationMgr"); const PhoneVerificationMgr = require("./lib/phoneVerificationMgr"); diff --git a/src/handlers/__tests__/newDeviceKey.test.js b/src/handlers/__tests__/newDeviceKey.test.js index ecc06f2..b9c2af2 100644 --- a/src/handlers/__tests__/newDeviceKey.test.js +++ b/src/handlers/__tests__/newDeviceKey.test.js @@ -3,11 +3,11 @@ const NewDeviceKeyHandler = require("../newDeviceKey"); describe("NewDeviceKeyHandler", () => { let sut; let authMgr = { verifyNisaba: jest.fn() }; - let uPortMgr = { verifyToken: jest.fn() }; - let fuelTokenMgr = { newToken: jest.fn() }; + let requestTokenMgr = { verifyToken: jest.fn() }; + let fuelTokenMgr = { newToken: jest.fn(), verifyToken: jest.fn() }; beforeAll(() => { - sut = new NewDeviceKeyHandler(authMgr, uPortMgr, fuelTokenMgr); + sut = new NewDeviceKeyHandler(authMgr, requestTokenMgr, fuelTokenMgr); }); test("empty constructor", () => { @@ -47,13 +47,13 @@ describe("NewDeviceKeyHandler", () => { }); }); - test("handle failed uPortMgr.verifyToken", done => { - uPortMgr.verifyToken.mockImplementation(() => { + test("handle failed requestTokenMgr.verifyToken", done => { + requestTokenMgr.verifyToken.mockImplementation(() => { throw { message: "failed" }; }); sut.handle({ requestToken: "request.token.fake" }, {}, (err, res) => { - expect(uPortMgr.verifyToken).toBeCalled(); - expect(uPortMgr.verifyToken).toBeCalledWith("request.token.fake"); + expect(requestTokenMgr.verifyToken).toBeCalled(); + expect(requestTokenMgr.verifyToken).toBeCalledWith("request.token.fake"); expect(err.code).toEqual(500); expect(err.message).toEqual("failed"); done(); diff --git a/src/handlers/newDeviceKey.js b/src/handlers/newDeviceKey.js index 2cb7f45..1aa81f7 100644 --- a/src/handlers/newDeviceKey.js +++ b/src/handlers/newDeviceKey.js @@ -20,9 +20,9 @@ resource description import { toEthereumAddress } from "did-jwt/lib/Digest"; class NewDeviceKeyHandler { - constructor(authMgr, uPortMgr, fuelTokenMgr) { + constructor(authMgr, requestTokenMgr, fuelTokenMgr) { this.authMgr = authMgr; - this.uPortMgr = uPortMgr; + this.requestTokenMgr = requestTokenMgr; this.fuelTokenMgr = fuelTokenMgr; } @@ -40,6 +40,17 @@ class NewDeviceKeyHandler { return; } + try { + await this.fuelTokenMgr.verifyToken(authToken); + } catch (err) { + console.log("Error on this.fuelTokenMgr.verifyToken", err); + cb({ + code: 401, + message: err + }); + return; + } + let body; if (event && !event.body) { @@ -74,9 +85,9 @@ class NewDeviceKeyHandler { //Verify Request Token let dRequestToken; try { - dRequestToken = await this.uPortMgr.verifyToken(body.requestToken); + dRequestToken = await this.requestTokenMgr.verifyToken(body.requestToken); } catch (err) { - console.log("Error on this.uPortMgr.verifyToken"); + console.log("Error on this.requestTokenMgr.verifyToken"); console.log(err); const errMsg = !err.message ? err : err.message; cb({ @@ -99,7 +110,7 @@ class NewDeviceKeyHandler { //Check if address on fuelToken (authToken) is the same as the one on the requestToken if (address != authToken.sub) { - console.log("authToken.sub !== decodedRequestToken..address"); + console.log("authToken.sub !== decodedRequestToken.address"); cb({ code: 403, message: From c338c80bfc6a8d1b74eacbce85aa59b14eeab3c5 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 19:41:27 -0400 Subject: [PATCH 31/38] fix requestTokenMgr --- src/lib/requestTokenMgr.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/lib/requestTokenMgr.js b/src/lib/requestTokenMgr.js index 0797418..10199fd 100644 --- a/src/lib/requestTokenMgr.js +++ b/src/lib/requestTokenMgr.js @@ -2,17 +2,15 @@ import { verifyJWT } from "did-jwt/lib/JWT"; class RequestTokenMgr { constructor() { - this.address = null; this.aud = null; } isSecretsSet() { - return this.address != null; + return this.aud != null; } setSecrets(secrets) { - this.address = secrets.FUEL_TOKEN_ADDRESS; - this.aud = secrets.AUDIENCE_ADDRESS || this.address; + this.aud = secrets.AUDIENCE_ADDRESS || secrets.FUEL_TOKEN_ADDRESS; } async verifyToken(token) { From 1d17b86ae99783896609f6288d857b826b644c8b Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Mon, 25 Jun 2018 23:19:00 -0400 Subject: [PATCH 32/38] update encrypted variabels --- kms-secrets.develop.us-east-1.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kms-secrets.develop.us-east-1.yml b/kms-secrets.develop.us-east-1.yml index 0df2715..44a88be 100644 --- a/kms-secrets.develop.us-east-1.yml +++ b/kms-secrets.develop.us-east-1.yml @@ -1,3 +1,3 @@ secrets: - SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wG88eeKgUO6ZOpadVz8PhN2AAAC4jCCAt4GCSqGSIb3DQEHBqCCAs8wggLLAgEAMIICxAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAxfmKY6uNgEiLndZG0CARCAggKVnMS4p3ZPkmj0z8iRL93yD7I6U8X2g/Vy7yPfyEPT0Z7fCTdApr4ZhGXXof549WMWOl+k8kromt9z+r2+QlZgtDrLchhYXyqgHsM2Rn6L8CStpX3c4Lgq+WbIlrOc47hJNGXM+71Tyh1q6KkrIsHM56DoceGiWc6RB9o96rfZE5Mw1uxLzh8sY7CTqHUk8x3pzCwX7pl2iaZnMF4RylxPxDL4+yv/SkVDTzL6wOjfrDUeJxolI/T/TuebGzNhrfMwtJTtvb9Fu6aAzio4ekvgyViZ1ha1KChvo6TmOXXzRGduKPkZ5ICgKhHEza27qhpy7cUqh4Yw08I/csoHhrm67qngbDOuEkCYO2pEAlwd/oR7D3T0H+qBmN0hE+bln/F/ZdbPsvVd9ObWy6zk45BeOpdK3oQ0s5CdJTzWvYfLpOlMh0gGKTpClBtnvk9tre+wx+pTAlTEPGDWFT+RJRZqUSZXkXelT25pf7o1VdxhdyaP74fWeA8Hb+6xZoGldWJLrkgOqBTPErlatCF5jm9KSwro4+br4GiOUMQquddZlbBwtGjNmoXyS0sXqCum4YcC0PQ/CFbRiuiCMu6pwvLANlVoDOPDlnL8+2ZhlzuI7FKlByNf5LqEgmsi1yt1XVQ++MHQxGMJtxckCwta74Er/sDUHUgm5s9IOc3H4AU0sQVB2iHtSqTehayybdXSG6wjEU273thNGvNDtAoqXQVyjFuL0y6uq/19s1aa9yvRxhY1ZaXRf2rmkDSxiFFOo4hVVDrebJdkm8atM75Gdu5eZXN5UtVlpsovRClYqBk0dgYbLciL0R36d93nRqRtx5mGIBy3SjuVLCxamnsu/HGwliWHSNf8IPVvMnigxbiMNQGEh78A4A== + SECRETS: AQICAHjH8xwFV2lkoMyoePDOVwkG/DlRvAfnFsTNx1V0Gnos6wEIqNUzhkZmN/oHkfuk6W3CAAAC4jCCAt4GCSqGSIb3DQEHBqCCAs8wggLLAgEAMIICxAYJKoZIhvcNAQcBMB4GCWCGSAFlAwQBLjARBAwVCCO0arBpWgrIvNgCARCAggKViHw6aRK+p9htP3Ov1a2Rj+iatDZy0/nCvrkROB/+HfhM2/3TVLwsF6+f26p/XveD37bcipzidRuSSFjm2MLKFrsNYdENA+E+nfa9Gg66GO24XyZAlKNuPPpUDkGlGOvrAmWIAyZwkD0W21PQTIzhvb6p7VA5xcQ3VEBt/94HHVCBmV8euDjOQ4LQosXqcI21TwweW877/xDqMzG3Xef9GaNjl0Y2mdk2FkMjygFW4IriNa/AsqGYva5mmboPi5tcgBj/6EKZBY49jR1GsmLUZK00ql/m3Y9FwwT5NbQ3bbGJimtiE9lHaQsegGarTed9VtelJGEqR4s2va1PmFwMjMLjhsjFM1smo1L32jPRMQ1y+BgviJezqRILr73rQOGRVbPfmZRIDg6qV1YpdZZOhm9HgHJ7H+gJ4NsOYqGaDc3mRqV8BdOhnA4oe8J6t8DYais73cSmMv/q2Jra4iCXd+x+PH3boAVhJbjf/kFDEBopAhMpW9kwDufBekxmPDIxz7mBmiMyYrxBhYQXUixJ8eQhgzATuccG8nwsTxNCPqQyhY0LZUsVPSBlzRvgWn+XNoDj6GlEJ6GtQc4WUO80LaoJaJbHOa00qX6QaSaKhj22QY3jOLVRZpCs9oZxn1TJvjPz/4ZKk2jHWprEUsvB5noKpPphPRvKhFZi/2OkmJ9AjfsgKXBOVBx91iAfx1IF483T7XX7uKVrhtyjXb+LhUbr0ZENzCA0OeIe88TJe4zi+HQlwyKe2N88Q1PJA0FgZtIzYi/2xb5fb/0l/FIrxkoqxuUclf8VD0dcKqvAEjYHSzRP6a5ome/Wm5eEKy4CORqsciCBWMg+lTk8nbCLMoqTBaOOdAq4SuxKD8b9Ow8MvtZCSQ== keyArn: 'arn:aws:kms:us-east-1:711302153787:key/056da528-260d-4019-8419-7df6c292710d' From a6a069561708e380041ed955bc6d336ab6713456 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 26 Jun 2018 00:07:01 -0400 Subject: [PATCH 33/38] fix newDeviceKey --- src/api_handler.js | 1 + src/handlers/newDeviceKey.js | 19 +++++-------------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/api_handler.js b/src/api_handler.js index 53135ce..4e14fe3 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -106,6 +106,7 @@ const postHandler = (handler, event, context, callback) => { authMgr.setSecrets(JSON.parse(decrypted)); fuelTokenMgr.setSecrets(JSON.parse(decrypted)); phoneVerificationMgr.setSecrets(JSON.parse(decrypted)); + requestTokenMgr.setSecrets(JSON.parse(decrypted)); doHandler(handler, event, context, callback); }); } else { diff --git a/src/handlers/newDeviceKey.js b/src/handlers/newDeviceKey.js index 1aa81f7..be86ea9 100644 --- a/src/handlers/newDeviceKey.js +++ b/src/handlers/newDeviceKey.js @@ -40,17 +40,6 @@ class NewDeviceKeyHandler { return; } - try { - await this.fuelTokenMgr.verifyToken(authToken); - } catch (err) { - console.log("Error on this.fuelTokenMgr.verifyToken", err); - cb({ - code: 401, - message: err - }); - return; - } - let body; if (event && !event.body) { @@ -99,9 +88,11 @@ class NewDeviceKeyHandler { console.log(dRequestToken); console.log("dRequestToken publicKey", dRequestToken.doc.publicKey); - const pubKey = dRequestToken.doc.publicKey.find( - pub => pub.type === "Secp256k1VerificationKey2018" - ); + + // const pubKey = dRequestToken.doc.publicKey.find( + // pub => pub.type === "Secp256k1VerificationKey2018" + // ); + const pubKey = dRequestToken.doc.publicKey[0]; const address = pubKey.ethereumAddress || toEthereumAddress(pubKey.publicKeyHex); From a0481d3413e9c7e152a14a9ae5b08ed25a681ce4 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 26 Jun 2018 00:21:00 -0400 Subject: [PATCH 34/38] Update SETUP.md --- SETUP.md | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/SETUP.md b/SETUP.md index da60e9a..bb2345e 100644 --- a/SETUP.md +++ b/SETUP.md @@ -37,7 +37,7 @@ Create an app e.g. nisaba on uport app manager: https://appmanager.uport.me/, you can see the ```address``` and ```public key``` (remove the `0x`) listed there. Click `click here for app code`, you can get the ```private key``` inside ```SimpleSinger```. 9. If you want the JWT payload aud to be another app rather than this one, you can create an app e.g. sensui on uport app manager: https://appmanager.uport.me/, get the ```address``` for ```AUDIENCE_ADDRESS```. - Note: for step 8 and step 9, if in doubt, you can append ```did:uport:``` to ```address``` and test it out in the uport did resolver: http://uportdid.radicalledger.com/. + Note: for step 8 and 9, you can also generate these keys using https://github.com/uport-project/uport-cli-client. If in doubt, you can append ```did:uport:``` to the ```address``` (mnid) and test it out in the uport did resolver: http://uportdid.radicalledger.com/. 10. Create nexmo account: https://dashboard.nexmo.com/getting-started-guide, get `NEXMO_API_KEY`, `NEXMO_API_SECRET`, `NEXMO_FROM` You can find `NEXMO_FROM` in the dashboard, 'Numbers -> Your numbers' section. @@ -94,12 +94,14 @@ test the following **Phone Verification Flow** - - You can choose a random string as a deviceKey - + + Use this to generate keys: https://github.com/uport-project/uport-cli-client + + After `uPort Identity Created!`, the console will print out a `UPortClient` object. Use `UPortClient.deviceKeys.address` as `deviceKey`. (remember `UPortClient.deviceKeys.privateKey` and `UPortClient.mnid`). + - start verification: - ```sls invoke local -f start -d '{"deviceKey": "0x123456", "phoneNumber":[your phone number]}'``` + ```sls invoke local -f start -d '{"deviceKey": [deviceKey], "phoneNumber":[your phone number]}'``` Send a code through SMS or Call @@ -107,8 +109,38 @@ (This step is optional, it is for user who has previously indicated they prefer to recieve a code via text-to-speech, you'll receive a phone call.) - ```sls invoke local -f next -d '{"pathParameters": {"deviceKey": "0x123456"}}'``` + ```sls invoke local -f next -d '{"pathParameters": {"deviceKey": [deviceKey]}}'``` + + - verify code and get fuelToken + + ```sls invoke local -f check -d '{"deviceKey":[deviceKey], "code": [code you received]}'``` + you'll receive a fuelToken + - get new fuelToken with new deviceKey + + Once you already get a fuelToken, if you have a new deviceKey, you don't need to go through the above phone verification flow anymore, you can generate a new fuelToken with the old fuelToken and the new deviceKey. + + You'll need to generate a requestToken as follows: + ``` + const createJWT = require('did-jwt').createJWT; + const SimpleSigner = require('did-jwt').SimpleSigner; + + const signer = new SimpleSigner(UPortClient.deviceKeys.privateKey.slice(2)); + const issuer = UPortClient.mnid; + + const now = Math.floor(Date.now() / 1000); + const aud = secrets.AUDIENCE_ADDRESS; + + const requestToken = await createJWT( + { + aud, + exp: now + 300, + iat: now, + newDeviceKey: newDeviceKey + }, + { issuer, signer } + ); + ``` - - verify code and request token + ```sls invoke local -f newDeviceKey -d '{"headers: {"Authorization": "bearer [old fuelToken]"}, requestToken": [requestToken]}'``` - ```sls invoke local -f check -d '{"deviceKey": "0x123456", "code": [code you received]}'``` + You'll get a new fuelToken. From adb47ba58905d916232c870e229704e8e73b8a44 Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 26 Jun 2018 00:26:56 -0400 Subject: [PATCH 35/38] add comment --- src/handlers/newDeviceKey.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/handlers/newDeviceKey.js b/src/handlers/newDeviceKey.js index be86ea9..b9e4599 100644 --- a/src/handlers/newDeviceKey.js +++ b/src/handlers/newDeviceKey.js @@ -89,6 +89,7 @@ class NewDeviceKeyHandler { console.log("dRequestToken publicKey", dRequestToken.doc.publicKey); + // Don't know why only support "Secp256k1VerificationKey2018"??? // const pubKey = dRequestToken.doc.publicKey.find( // pub => pub.type === "Secp256k1VerificationKey2018" // ); From 1f42f4dae4b21452ea55a915badc72b1231624ea Mon Sep 17 00:00:00 2001 From: Robert Greenfield IV Date: Mon, 25 Jun 2018 23:05:39 -0700 Subject: [PATCH 36/38] corrected changes given pr comments --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index d1cf7ba..b0bba20 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,6 @@ "serverless-webpack": "^3.1.2" }, "dependencies": { - "aws-sdk": "^2.259.1", "ethr-did-resolver": "^0.0.8", "jsontokens": "^0.7.6", "nexmo": "^2.2.0", From e1d9221e86f2737a00c4cee12737c804f93d8bb1 Mon Sep 17 00:00:00 2001 From: Robby Greenfield Date: Mon, 25 Jun 2018 23:15:14 -0700 Subject: [PATCH 37/38] resolve changes in removing captcha files resolve changes in removing captcha files --- src/api_handler.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/api_handler.js b/src/api_handler.js index 23904df..60ce711 100644 --- a/src/api_handler.js +++ b/src/api_handler.js @@ -42,11 +42,6 @@ let checkVerificationHandler = new CheckVerificationHandler( fuelTokenMgr ); -//verifies recaptcha token and provides fuel token -module.exports.recaptcha = (event, context, callback) => { - postHandler(recaptchaHandler, event, context, callback); -}; - //Get a new fuel token by sending a signed requestToken module.exports.newDeviceKey = (event, context, callback) => { postHandler(newDeviceKeyHandler, event, context, callback); @@ -74,7 +69,6 @@ module.exports.check_verification = (event, context, callback) => { const postHandler = (handler, event, context, callback) => { if ( - !recaptchaMgr.isSecretsSet() || !authMgr.isSecretsSet() || !fuelTokenMgr.isSecretsSet() || !phoneVerificationMgr.isSecretsSet() @@ -87,7 +81,6 @@ const postHandler = (handler, event, context, callback) => { .promise() .then(data => { const decrypted = String(data.Plaintext); - recaptchaMgr.setSecrets(JSON.parse(decrypted)); authMgr.setSecrets(JSON.parse(decrypted)); fuelTokenMgr.setSecrets(JSON.parse(decrypted)); phoneVerificationMgr.setSecrets(JSON.parse(decrypted)); From cf214bf8f58df5db06fa96006a68a4e721c2548a Mon Sep 17 00:00:00 2001 From: Veronica Zheng Date: Tue, 26 Jun 2018 12:26:23 -0400 Subject: [PATCH 38/38] remove funcaptcha and recaptcha tests --- src/__tests__/api_handler.test.js | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/__tests__/api_handler.test.js b/src/__tests__/api_handler.test.js index ab0ed3b..d60c35f 100644 --- a/src/__tests__/api_handler.test.js +++ b/src/__tests__/api_handler.test.js @@ -65,22 +65,4 @@ describe("apiHandler", () => { done(); }); }); - - test("funcaptcha()", done => { - apiHandler.funcaptcha({}, {}, (err, res) => { - expect(err).toBeNull(); - expect(res).not.toBeNull(); - - done(); - }); - }); - - test("recaptcha()", done => { - apiHandler.recaptcha({}, {}, (err, res) => { - expect(err).toBeNull(); - expect(res).not.toBeNull(); - - done(); - }); - }); });