diff --git a/.circleci/config.yml b/.circleci/config.yml
index e6d2f89..e0c10b6 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -4,35 +4,35 @@ workflows:
   all:
     jobs:
       - node-latest
-      - node10:
-          requires:
-            - node-latest
-      - node9:
-          requires:
-            - node-latest
-      - node8:
-          requires:
-            - node-latest
-      - node6:
-          requires:
-            - node-latest
+      # - node10:
+      #     requires:
+      #       - node-latest
+      # - node9:
+      #     requires:
+      #       - node-latest
+      # - node8:
+      #     requires:
+      #       - node-latest
+      # - node6:
+      #     requires:
+      #       - node-latest
       - release:
           filters:
             branches:
               only: master
           requires:
             - node-latest
-            - node10
-            - node9
-            - node8
-            - node6
+            # - node10
+            # - node9
+            # - node8
+            # - node6
 jobs:
   local:
     docker:
       - image: circleci/node:11
     steps:
       - checkout
-      - run: npm run verify
+      - run: yarn verify
   node-latest:
     docker:
       - image: circleci/node:11
@@ -45,8 +45,7 @@ jobs:
           name: Install Dependencies
           command: |
             if [ ! -d node_modules ]; then
-              npm ci
-              npm i --no-save jest-junit
+              yarn install
             fi
       - save_cache:
           name: Save node modules cache
@@ -57,8 +56,8 @@ jobs:
           root: '.'
           paths:
             - node_modules
-      - run: npm run verify
-      - run: npx codecov
+      - run: yarn verify
+      - run: yarn codecov
       - store_test_results:
           path: .reports/junit
   node10:
@@ -68,7 +67,7 @@ jobs:
       - checkout
       - attach_workspace:
           at: '.'
-      - run: npm run verify
+      - run: yarn verify
       - store_test_results:
           path: .reports/junit
   node9:
@@ -78,7 +77,7 @@ jobs:
       - checkout
       - attach_workspace:
           at: '.'
-      - run: npm run verify
+      - run: yarn verify
       - store_test_results:
           path: .reports/junit
   node8:
@@ -88,7 +87,7 @@ jobs:
       - checkout
       - attach_workspace:
           at: '.'
-      - run: npm run verify
+      - run: yarn verify
       - store_test_results:
           path: .reports/junit
   node6:
@@ -98,7 +97,7 @@ jobs:
       - checkout
       - attach_workspace:
           at: '.'
-      - run: npm run verify
+      - run: yarn verify
       - store_test_results:
           path: .reports/junit
   release:
@@ -108,5 +107,5 @@ jobs:
       - checkout
       - attach_workspace:
           at: '.'
-      - run: npm run clean && npm run build
+      - run: yarn clean && yarn build
       - run: npx semantic-release
diff --git a/.travis.yml b/.travis.yml
index 784c76e..95e8c4a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,16 +6,15 @@ notifications:
   email: false
 node_js:
   - '11'
-  - '10'
-  - '9'
-  - '8'
-  - '6'
+  # - '10'
+  # - '9'
+  # - '8'
+  # - '6'
 branches:
   only:
     - master
     - /^greenkeeper.*$/
 script:
-  - npm i --no-save jest-junit
-  - npm run verify
+  - yarn verify
   - ./scripts/run-on-node-version.sh 11 "npm install -g codacy-coverage && cat ./coverage/lcov.info | codacy-coverage"
   - ./scripts/run-on-node-version.sh 11 "npm install -g coveralls && cat ./coverage/lcov.info | coveralls"
diff --git a/README.md b/README.md
index acd9f89..3475b92 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,13 @@
 [![Visual Studio Code][vscode-image]][vscode-url]
 [![Wallaby.js][wallaby-image]][wallaby-url]
 
-Manage and generate artifacts to test data across boundaries.
+A purposely loose comparison tool.
+
+## Version 5 breaking changes
+
+- exact check on array
+- no spread on array, use `has()/some()` or `every()`
+- `undefined` now checks against `undefined` instead of a placeholder for anything. Use `anything` for the previous behavior.
 
 ## createSatisfier(expectation)
 
@@ -65,20 +71,16 @@ createSatisfier({ a: /boo/ }).exec({ a: 'foo' })
 createSatisfier({ a: a => a === 1 }).exec({ a: 2 })
 ```
 
-## Meaning of undefined
+## `anything`
 
-If `undefined` is used in expectation, it will match anything.
+If `anything` is used in expectation, it will match anything.
 
 ```ts
-createSatisfier(underfined).test({})
-createSatisfier({ a: undefined }).test({})
-createSatisfier([undefined, 1]).test(['x', 1])
-```
+import { anything } from 'satisfier'
 
-If you want to test for `undefined` explicitly, use predicate function.
-
-```ts
-createSatisfier(x => x === undefined).test(undefined)
+createSatisfier(anything).test({})
+createSatisfier({ a: anything }).test({})
+createSatisfier([anything, 1]).test(['x', 1])
 ```
 
 ## test against array
@@ -90,18 +92,14 @@ There are several ways to test against array:
 When you use an array expectation to test against array,
 each entry in the expectation will be used to test against the corresponding entry in the array.
 
-If the subject array is longer than the expectation array,
-the extra entries are not tested.
-
-You can also skip over entries by putting in `undefined`.
+You can also skip over entries by putting in `anything`.
 
 ```ts
 import { createSatisfier } from 'satisfier'
 
 // all true
-createSatisfier([1]).test([1, 2, 3])
-createSatisfier([undefined, 1]).test(['...anything...', 1])
-createSatisfier([e => e === undefined, 1]).test([undefined, 1])
+createSatisfier([anything, 1]).test(['...anything...', 1])
+createSatisfier([e => e === anything, 1]).test([anything, 1])
 ```
 
 ### using predicate expectation
@@ -160,7 +158,7 @@ results[0].expected.tersify()
 tersify(results[0])
 ```
 
-Examples of predicate: `And`, `AtLeastOnce`, `every`, `has`, `isInInterval`, `isInRange`, `isTypeOf`, `none`, `Or`, `some`
+Examples of predicate:  `every`, `has`, `isInInterval`, `isInRange`, `isTypeOf`, `none`, `some`, `startsWith`
 
 ## Contribute
 
diff --git a/package.json b/package.json
index 987c7d6..26df8d0 100644
--- a/package.json
+++ b/package.json
@@ -21,19 +21,23 @@
   "typings": "lib/index.d.ts",
   "scripts": {
     "build": "tsc -p tsconfig.es5.json && tsc -p tsconfig.esnext.json",
-    "clean": "rimraf lib",
-    "dc": "npm run dependency-check",
+    "clean": "rimraf lib libm",
+    "dc": "yarn dependency-check",
     "dependency-check": "dependency-check . --unused --no-dev && dependency-check . --missing --no-dev",
     "lint": "tslint -p tsconfig.json",
     "test": "jest --reporters=default",
-    "verify": "npm run lint && npm run build && npm run dependency-check && jest --coverage",
-    "watch": "jest --watch"
-  },
-  "devDependencies": {
-    "@unional/devpkg-node": "^1.2.4",
-    "assertron": "^6.1.0"
+    "verify": "yarn lint && yarn build && yarn dependency-check && jest --coverage --reporters=default",
+    "watch": "jest --watch",
+    "watch:type": "tsc --watch"
   },
   "dependencies": {
-    "tersify": "^1.2.6"
+    "tersify": "^2.0.2"
+  },
+  "devDependencies": {
+    "@unional/devpkg-node": "^1.2.5",
+    "assertron": "^6.1.0",
+    "codecov": "^3.2.0",
+    "jest-junit": "^6.3.0",
+    "type-plus": "^1.15.1"
   }
 }
diff --git a/src/And.spec.ts b/src/And.spec.ts
deleted file mode 100644
index 678d683..0000000
--- a/src/And.spec.ts
+++ /dev/null
@@ -1,16 +0,0 @@
-import t from 'assert'
-
-import { createSatisfier } from '.'
-import { And } from './And'
-import { assertExec } from './testUtil'
-
-test('fail when not passing any expectations', () => {
-  const s = createSatisfier([new And({ a: 1 }, { b: 2 })])
-  const actual = s.exec([{ a: 1 }])!
-  assertExec(actual[0], ['[0]', 'b'], 2, undefined)
-})
-
-test('pass when passing all expectations', () => {
-  const s = createSatisfier([new And({ a: 1 }, { b: 2 })])
-  t.strictEqual(s.exec([{ a: 1, b: 2 }]), undefined)
-})
diff --git a/src/And.ts b/src/And.ts
deleted file mode 100644
index 5daad47..0000000
--- a/src/And.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { createSatisfier } from './createSatisfier'
-import { ArrayEntryExpectation } from './ArrayEntryExpectation';
-import { Satisfier, SatisfierExec } from './interfaces';
-
-/**
- * Check if an array has entries satisfy the expectations in order.
- */
-export class And extends ArrayEntryExpectation {
-  satisfiers: Satisfier<any>[]
-  constructor(...expectations: any[]) {
-    super()
-    this.satisfiers = expectations.map(createSatisfier)
-  }
-  exec(actual: any, path: string[]) {
-    let diff: SatisfierExec[] | undefined
-    this.satisfiers.some(s => {
-      diff = s.exec(actual)
-      if (diff) {
-        diff.forEach(d => d.path = [...path, ...d.path])
-      }
-
-      return !!diff
-    })
-    return diff
-  }
-}
diff --git a/src/ArrayEntryExpectation.ts b/src/ArrayEntryExpectation.ts
deleted file mode 100644
index e955a6a..0000000
--- a/src/ArrayEntryExpectation.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { SatisfierExec } from './interfaces'
-
-export abstract class ArrayEntryExpectation {
-  abstract exec(actual: any, path: string[]): SatisfierExec[] | undefined
-}
diff --git a/src/AtLeastOnce.spec.ts b/src/AtLeastOnce.spec.ts
deleted file mode 100644
index 2c264d6..0000000
--- a/src/AtLeastOnce.spec.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import t from 'assert'
-import a from 'assertron'
-
-import { AtLeastOnce, createSatisfier } from '.'
-
-test('fail when subject is not an array', () => {
-  a.false(createSatisfier([new AtLeastOnce(1)]).test(1))
-  a.false(createSatisfier([new AtLeastOnce(1)]).test(true))
-  a.false(createSatisfier([new AtLeastOnce(1)]).test('a'))
-  a.false(createSatisfier([new AtLeastOnce(1)]).test({ a: 1 }))
-})
-
-test('fail when subject does not contain at least one element satisfying the expectation', () => {
-  a.false(createSatisfier([new AtLeastOnce(1)]).test([]))
-  a.false(createSatisfier([new AtLeastOnce(1)]).test([0, 2, 'a', true, { a: 1 }]))
-})
-
-test('pass when subject contains at least one element satisfying the expectation', () => {
-  t(createSatisfier([new AtLeastOnce(1)]).test([1]))
-})
-
-test('match one follow with one miss', () => {
-  const actual = createSatisfier([new AtLeastOnce(1), 3]).exec([1, 2, 3])
-  t.strictEqual(actual, undefined)
-})
-
-test('match one follow with two misses', () => {
-  t(createSatisfier([new AtLeastOnce(1), 4]).test([1, 2, 3, 4]))
-})
diff --git a/src/AtLeastOnce.ts b/src/AtLeastOnce.ts
deleted file mode 100644
index 8853a8d..0000000
--- a/src/AtLeastOnce.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { ArrayEntryExpectation } from './ArrayEntryExpectation'
-import { createSatisfier } from './createSatisfier'
-import { SatisfierExec, Satisfier } from './interfaces'
-
-export class AtLeastOnce extends ArrayEntryExpectation {
-  private pass = false
-  private satisfier: Satisfier<any>
-  constructor(expectation: any) {
-    super()
-    this.satisfier = createSatisfier(expectation)
-  }
-
-  exec(actual: any): SatisfierExec[] {
-    if (this.pass) return []
-
-    const result = this.satisfier.exec(actual)
-    if (!result) {
-      this.pass = true
-      return []
-    }
-
-    return result
-  }
-}
diff --git a/src/Or.spec.ts b/src/Or.spec.ts
deleted file mode 100644
index 03a6de1..0000000
--- a/src/Or.spec.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import t from 'assert'
-
-import { createSatisfier } from '.'
-import { Or } from './Or'
-import { assertExec } from './testUtil'
-
-test('fail when not passing all expectations', () => {
-  const s = createSatisfier([new Or({ a: 1 }, { b: 2 })])
-  const actual = s.exec([{ c: 1 }])!
-  assertExec(actual[0], ['[0]', 'a'], 1, undefined)
-  assertExec(actual[1], ['[0]', 'b'], 2, undefined)
-})
-
-test('pass when passing any expectations', () => {
-  const s = createSatisfier([new Or({ a: 1 }, { b: 2 })])
-  t.strictEqual(s.exec([{ a: 1 }]), undefined)
-  t.strictEqual(s.exec([{ b: 2 }]), undefined)
-})
diff --git a/src/Or.ts b/src/Or.ts
deleted file mode 100644
index 92bb56f..0000000
--- a/src/Or.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { createSatisfier } from './createSatisfier'
-import { ArrayEntryExpectation } from './ArrayEntryExpectation';
-import { Satisfier, SatisfierExec } from './interfaces';
-
-/**
- * Check if an array has entries satisfy the expectations in order.
- */
-export class Or extends ArrayEntryExpectation {
-  satisfiers: Satisfier<any>[]
-  constructor(...expectations: any[]) {
-    super()
-    this.satisfiers = expectations.map(createSatisfier)
-  }
-  exec(actual: any, path: string[]) {
-    let diff: SatisfierExec[] = []
-    for (let i = 0; i < this.satisfiers.length; i++) {
-      const s = this.satisfiers[i]
-      const eachDiff = s.exec(actual)
-      if (!eachDiff) return undefined
-      eachDiff.forEach(d => d.path = [...path, ...d.path])
-      diff.push(...eachDiff)
-    }
-    return diff
-  }
-}
diff --git a/src/anything.ts b/src/anything.ts
new file mode 100644
index 0000000..a321226
--- /dev/null
+++ b/src/anything.ts
@@ -0,0 +1 @@
+export const anything = Symbol('anything')
diff --git a/src/createSatisfier.spec.ts b/src/createSatisfier.spec.ts
index 6acedd2..3faaaf0 100644
--- a/src/createSatisfier.spec.ts
+++ b/src/createSatisfier.spec.ts
@@ -1,312 +1,407 @@
-import t from 'assert';
-import a from 'assertron';
-import { createSatisfier } from './index';
-import { assertExec, assertRegExp } from './testUtil';
-
-test('support generics', () => {
-  const s = createSatisfier<{ a: number }>({ a: 1 })
-  t(s.test({ a: 1 }))
-  a.false(s.test({ a: 2 }))
-})
-
-test('Expecter can be specify partial of the data structure', () => {
-  createSatisfier<{ a: number, b: string }>({ a: 1 })
-  createSatisfier<{ a: number, b: string }>([{ a: 1 }])
-  createSatisfier<{ a: { c: number, d: string }, b: string }>({ a: {} })
-  createSatisfier<{ a: { c: number, d: string }, b: string }>([{ a: {} }, { b: /a/ }, { a: { c: 1 } }])
+import { tryAssign, typeAssert } from 'type-plus';
+import { anything, createSatisfier } from '.';
+
+const testSymbol = Symbol()
+const testArrow = () => true
+const testFn = function () { return true }
+describe('anything', () => {
+  test('matches against anything', () => {
+    const s = createSatisfier(anything)
+    expect(s.exec(undefined)).toBeUndefined()
+    expect(s.exec(null)).toBeUndefined()
+    expect(s.exec(false)).toBeUndefined()
+    expect(s.exec(1)).toBeUndefined()
+    expect(s.exec(1n)).toBeUndefined()
+    expect(s.exec('a')).toBeUndefined()
+    expect(s.exec(Symbol())).toBeUndefined()
+    expect(s.exec({})).toBeUndefined()
+    expect(s.exec([])).toBeUndefined()
+    expect(s.exec(testFn)).toBeUndefined()
+    expect(s.exec(testArrow)).toBeUndefined()
+  })
 })
 
-test('nested {} checks for non undefined', () => {
-  const s = createSatisfier<{ a: { c: number, d: string }, b: string }>({ a: {} })
-  const actual = s.exec({} as any)!
-  t.strictEqual(actual.length, 1)
-  assertExec(actual[0], ['a'], {}, undefined)
+describe('undefined', () => {
+  test('matches only undefined', () => {
+    const s = createSatisfier(undefined)
+    expect(s.exec(undefined)).toBeUndefined()
+
+    expect(s.exec(null)).toEqual([{ path: [], expected: undefined, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected: undefined, actual: true }])
+    expect(s.exec(1)).toEqual([{ path: [], expected: undefined, actual: 1 }])
+    expect(s.exec(1n)).toEqual([{ path: [], expected: undefined, actual: 1n }])
+    expect(s.exec('a')).toEqual([{ path: [], expected: undefined, actual: 'a' }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected: undefined, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected: undefined, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected: undefined, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected: undefined, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected: undefined, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected: undefined, actual: testArrow }])
+  })
 })
 
-test('actual should be a complete struct', () => {
-  const s = createSatisfier<{ a: number, b: string }>({ a: 1, b: 'b' })
-
-  // missing `b`
-  // t.true(s.test({ a: 1 }))
-  t(s.test({ a: 1, b: 'b' }))
+describe('null', () => {
+  test('matches only null', () => {
+    const s = createSatisfier(null)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected: null, actual: undefined }])
+    expect(s.exec(null)).toBeUndefined()
+    expect(s.exec(true)).toEqual([{ path: [], expected: null, actual: true }])
+    expect(s.exec(1)).toEqual([{ path: [], expected: null, actual: 1 }])
+    expect(s.exec(1n)).toEqual([{ path: [], expected: null, actual: 1n }])
+    expect(s.exec('a')).toEqual([{ path: [], expected: null, actual: 'a' }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected: null, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected: null, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected: null, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected: null, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected: null, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected: null, actual: testArrow }])
+  })
 })
 
-test('expect array and test against non-array', () => {
-  const s = createSatisfier([1])
-  a.false(s.test(null))
-  a.false(s.test(1))
-  a.false(s.test('a'))
-  a.false(s.test(true))
-  a.false(s.test(undefined as any))
+describe('boolean', () => {
+  test.each([true, false])('%p matches only itself', (expected: boolean) => {
+    const s = createSatisfier(expected)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }])
+    expect(s.exec(expected)).toBeUndefined()
+    expect(s.exec(!expected)).toEqual([{ path: [], expected, actual: !expected }])
+    expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }])
+    expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }])
+    expect(s.exec('a')).toEqual([{ path: [], expected, actual: 'a' }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }])
+  })
 })
 
-test('array with number', () => {
-  t(createSatisfier([1, 2]).test([1, 2]))
+describe('number', () => {
+  test.each([-1, 0, 1])('%d matches exact number', (expected: number) => {
+    const s = createSatisfier(expected)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }])
+    expect(s.exec(expected)).toBeUndefined()
+    expect(s.exec(expected - 1)).toEqual([{ path: [], expected, actual: expected - 1 }])
+    expect(s.exec(expected + 1)).toEqual([{ path: [], expected, actual: expected + 1 }])
+    expect(s.exec(String(expected))).toEqual([{ path: [], expected, actual: String(expected) }])
+    expect(s.exec(expected)).toBeUndefined()
+    expect(s.exec(String(expected))).toEqual([{ path: [], expected, actual: String(expected) }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }])
+  })
+
+  test('NaN matches only NaN', () => {
+    const s = createSatisfier(NaN)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected: NaN, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected: NaN, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected: NaN, actual: true }])
+    expect(s.exec(NaN)).toBeUndefined()
+    expect(s.exec(1)).toEqual([{ path: [], expected: NaN, actual: 1 }])
+    expect(s.exec(0)).toEqual([{ path: [], expected: NaN, actual: 0 }])
+    expect(s.exec(-1)).toEqual([{ path: [], expected: NaN, actual: -1 }])
+    expect(s.exec(String(NaN))).toEqual([{ path: [], expected: NaN, actual: String(NaN) }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected: NaN, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected: NaN, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected: NaN, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected: NaN, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected: NaN, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected: NaN, actual: testArrow }])
+  })
+
+  test('Infinity only matches Infinity', () => {
+    const s = createSatisfier(Infinity)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected: Infinity, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected: Infinity, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected: Infinity, actual: true }])
+    expect(s.exec(Infinity)).toBeUndefined()
+    expect(s.exec(1)).toEqual([{ path: [], expected: Infinity, actual: 1 }])
+    expect(s.exec(0)).toEqual([{ path: [], expected: Infinity, actual: 0 }])
+    expect(s.exec(-1)).toEqual([{ path: [], expected: Infinity, actual: -1 }])
+    expect(s.exec(String(Infinity))).toEqual([{ path: [], expected: Infinity, actual: String(Infinity) }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected: Infinity, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected: Infinity, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected: Infinity, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected: Infinity, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected: Infinity, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected: Infinity, actual: testArrow }])
+  })
 })
 
-test('array with null', () => {
-  t(createSatisfier([null]).test([null]))
-  a.false(createSatisfier([null]).test([1]))
+describe('bigint', () => {
+  test.each([-1n, 0n, 1n])('%d matches exact bigint', expected => {
+    const s = createSatisfier(expected)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }])
+    expect(s.exec(expected)).toBeUndefined()
+    expect(s.exec(expected - 1n)).toEqual([{ path: [], expected, actual: expected - 1n }])
+    expect(s.exec(expected + 1n)).toEqual([{ path: [], expected, actual: expected + 1n }])
+    expect(s.exec(0)).toEqual([{ path: [], expected, actual: 0 }])
+    expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }])
+    expect(s.exec(-1)).toEqual([{ path: [], expected, actual: -1 }])
+    expect(s.exec(String(expected))).toEqual([{ path: [], expected, actual: String(expected) }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }])
+  })
 })
 
-test('NaN satisfies NaN', () => {
-  t(createSatisfier(NaN).test(NaN))
+describe('string', () => {
+  test('matches only the same string', () => {
+    const expected = 'foo'
+    const s = createSatisfier(expected)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }])
+    expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }])
+    expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }])
+    expect(s.exec(expected)).toBeUndefined()
+    expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }])
+  })
 })
 
-test('NaN not satisfies others', () => {
-  a.false(createSatisfier(NaN).test(`a`))
-  a.false(createSatisfier(NaN).test(true))
-  a.false(createSatisfier(NaN).test(1))
-  a.false(createSatisfier(NaN).test([]))
-  a.false(createSatisfier(NaN).test({}))
+describe('symbol', () => {
+  test('matches only the same symbol', () => {
+    const expected = Symbol()
+    const s = createSatisfier(expected)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }])
+    expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }])
+    expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }])
+    expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }])
+    expect(s.exec(expected)).toBeUndefined()
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }])
+    expect(s.exec(/foo/)).toEqual([{ path: [], expected, actual: /foo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }])
+  })
 })
 
-test('array with NaN', () => {
-  t(createSatisfier([NaN]).test([NaN]))
-  a.false(createSatisfier([NaN]).test([1]))
+describe('regex', () => {
+  test('matches itself and strings that matches it', () => {
+    const expected = /foo/
+    const s = createSatisfier(expected)
+
+    expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }])
+    expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }])
+    expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }])
+    expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }])
+    expect(s.exec(/foo/)).toBeUndefined()
+    expect(s.exec('foo')).toBeUndefined()
+    expect(s.exec(/boo/)).toEqual([{ path: [], expected, actual: /boo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }])
+    expect(s.exec([])).toEqual([{ path: [], expected, actual: [] }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }])
+  })
+
+  test('will not match non string and regex', () => {
+    expect(createSatisfier(/1/).exec(1)).toEqual([{ path: [], expected: /1/, actual: 1 }])
+    expect(createSatisfier(/true/).exec(true)).toEqual([{ path: [], expected: /true/, actual: true }])
+    expect(createSatisfier(/undefined/).exec(undefined)).toEqual([{ path: [], expected: /undefined/, actual: undefined }])
+    expect(createSatisfier(/null/).exec(null)).toEqual([{ path: [], expected: /null/, actual: null }])
+    expect(createSatisfier(/{}/).exec({})).toEqual([{ path: [], expected: /{}/, actual: {} }])
+    expect(createSatisfier(/foo/).exec(['foo'])).toEqual([{ path: [], expected: /foo/, actual: ['foo'] }])
+  })
+
+  test('missing property gets undefined', () => {
+    expect(createSatisfier({ f: /1/ }).exec({})).toEqual([{ path: ['f'], expected: /1/, actual: undefined }])
+  })
 })
 
-describe('exec', () => {
-  test('undefined should match anything', () => {
-    t.strictEqual(createSatisfier(undefined).exec(undefined), undefined)
-    t.strictEqual(createSatisfier(undefined).exec({}), undefined)
-    t.strictEqual(createSatisfier({ a: undefined }).exec({}), undefined)
-    t.strictEqual(createSatisfier([undefined]).exec([]), undefined)
-  })
+describe('object', () => {
+  test('does not match non-object', () => {
+    const expected = {}
+    const s = createSatisfier(expected)
 
-  test('primitive types without specifing generic will work without issue.', () => {
-    t.strictEqual(createSatisfier(1).exec(1), undefined)
-    t.strictEqual(createSatisfier(true).exec(true), undefined)
-    t.strictEqual(createSatisfier('a').exec('a'), undefined)
+    expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }])
+    expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }])
+    expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }])
+    expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }])
+    expect(s.exec(/boo/)).toEqual([{ path: [], expected, actual: /boo/ }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }])
   })
 
-  test('can use generic to specify the data structure', () => {
-    t.strictEqual(createSatisfier<number>(1).exec(1), undefined)
-    t.strictEqual(createSatisfier<{ a: number }>({ a: /1/ }).exec({ a: 1 }), undefined)
-  })
+  test('empty object matches object with any properties', () => {
+    const expected = {}
+    const s = createSatisfier(expected)
 
-  test('empty object expectation passes all objects', () => {
-    t.strictEqual(createSatisfier({}).exec({}), undefined)
-    t.strictEqual(createSatisfier({}).exec({ a: 1 }), undefined)
-    t.strictEqual(createSatisfier({}).exec({ a: { b: 'a' } }), undefined)
-    t.strictEqual(createSatisfier({}).exec({ a: true }), undefined)
-    t.strictEqual(createSatisfier({}).exec({ a: [1] }), undefined)
+    expect(s.exec({})).toBeUndefined()
+    expect(s.exec({ a: 1 })).toBeUndefined()
   })
 
-  test('empty object expectation fails primitive', () => {
-    assertExec(createSatisfier({}).exec(1)![0], [], {}, 1)
-    assertExec(createSatisfier({}).exec(true)![0], [], {}, true)
-    assertExec(createSatisfier({}).exec('a')![0], [], {}, 'a')
+  test('diff mismatched properties with proper path', () => {
+    expect(createSatisfier({ a: 1 }).exec({ a: 2 })).toEqual([{ actual: 2, expected: 1, path: ['a'] }])
+    expect(createSatisfier({ a: undefined }).exec({ a: 2 })).toEqual([{ actual: 2, expected: undefined, path: ['a'] }])
+    expect(createSatisfier({ a: { b: 1 } }).exec({ a: 2 })).toEqual([{ actual: 2, expected: { b: 1 }, path: ['a'] }])
+    expect(createSatisfier({ a: { b: 1 } }).exec({ a: { b: 3 } })).toEqual([{ actual: 3, expected: 1, path: ['a', 'b'] }])
   })
 
-  test('mismatch value gets path, expected, and actual', () => {
-    const actual = createSatisfier({ a: 1 }).exec({ a: 2 })!
-    t.strictEqual(actual.length, 1)
-    assertExec(actual[0], ['a'], 1, 2)
+  test('missing property is detected', () => {
+    expect(createSatisfier({ a: {} }).exec({})).toEqual([{ actual: undefined, expected: {}, path: ['a'] }])
   })
 
-  test('missing property get actual as undefined', () => {
-    const actual = createSatisfier({ a: 1 }).exec({})!
-    t.strictEqual(actual.length, 1)
-    assertExec(actual[0], ['a'], 1, undefined)
+  test('will not match array', () => {
+    expect(createSatisfier({ a: 1 }).exec([{ a: 1 }, { b: 1, a: 1 }])).toEqual([{ 'actual': [{ 'a': 1 }, { 'a': 1, 'b': 1 }], 'expected': { 'a': 1 }, 'path': [] }])
   })
 
-  test('missing property get deeper level', () => {
-    const actual = createSatisfier({ a: { b: 1 } }).exec({ a: {} })!
-    t.strictEqual(actual.length, 1)
-    assertExec(actual[0], ['a', 'b'], 1, undefined)
-  })
 
-  test('passing regex gets undefined', () => {
-    t.strictEqual(createSatisfier({ foo: /foo/ }).exec({ foo: 'foo' }), undefined)
+  test('drill down and compare each property', () => {
+    expect(createSatisfier({ a: { b: { c: /foo/ } } }).exec({ a: { b: { c: 'boo' } } }))
+      .toEqual([{ actual: 'boo', expected: /foo/, path: ['a', 'b', 'c'] }])
   })
 
-  test('failed regex will be in expected property', () => {
-    const actual = createSatisfier({ foo: /foo/ }).exec({ foo: 'boo' })!
-    assertRegExp(actual, ['foo'], /foo/, 'boo')
+  test('check against property in parent class', () => {
+    class Foo {
+      foo = 'foo'
+    }
+    class Boo extends Foo {
+      boo = 'boo'
+    }
+    const boo = new Boo()
+    expect(createSatisfier({ foo: 'foo' }).exec(boo)).toBeUndefined()
   })
 
-  test('regex on missing property gets actual as undefined', () => {
-    const actual = createSatisfier({ foo: /foo/ }).exec({})!
-    assertRegExp(actual, ['foo'], /foo/, undefined)
+  test('check exactly on property array', () => {
+    const s = createSatisfier({ a: [1, true, 'a'] })
+    expect(s.exec({ a: [1, true, 'a'] })).toBeUndefined()
+    expect(s.exec({ a: [1, true, 'b'] })).toEqual([{ actual: 'b', expected: 'a', path: ['a', 2] }])
   })
 
-  test('regex on non-string will fail as normal', () => {
-    let actual = createSatisfier({ foo: /foo/ }).exec({ foo: 1 })!
-    assertRegExp(actual, ['foo'], /foo/, 1)
+  test('property predicate receives the whole array in that property', () => {
+    const predicate = (e: any) => e && e.every((x: any) => x.login)
+    const s = createSatisfier({
+      data: predicate
+    });
 
-    actual = createSatisfier({ foo: /foo/ }).exec({ foo: true })!
-    assertRegExp(actual, ['foo'], /foo/, true)
+    expect(s.exec({ data: [{ login: 'a' }] })).toBeUndefined()
+    expect(s.exec({ data: [{ login: 'a' }, { login: 'b' }] })).toBeUndefined()
+    expect(s.exec({ data: [{ login: 'a' }, {}] })).toEqual([{ actual: [{ login: 'a' }, {}], expected: predicate, path: ['data'] }])
+  })
+})
 
-    actual = createSatisfier({ foo: /foo/ }).exec({ foo: [1, true, 'a'] })!
-    assertRegExp(actual, ['foo'], /foo/, [1, true, 'a'])
+describe('array', () => {
+  test('does not match non-array', () => {
+    const expected: any[] = []
+    const s = createSatisfier(expected)
 
-    actual = createSatisfier({ foo: /foo/ }).exec({ foo: { a: 1 } })!
-    assertRegExp(actual, ['foo'], /foo/, { a: 1 })
+    expect(s.exec(undefined)).toEqual([{ path: [], expected, actual: undefined }])
+    expect(s.exec(null)).toEqual([{ path: [], expected, actual: null }])
+    expect(s.exec(true)).toEqual([{ path: [], expected, actual: true }])
+    expect(s.exec(1)).toEqual([{ path: [], expected, actual: 1 }])
+    expect(s.exec(1n)).toEqual([{ path: [], expected, actual: 1n }])
+    expect(s.exec('boo')).toEqual([{ path: [], expected, actual: 'boo' }])
+    expect(s.exec(testSymbol)).toEqual([{ path: [], expected, actual: testSymbol }])
+    expect(s.exec(/boo/)).toEqual([{ path: [], expected, actual: /boo/ }])
+    expect(s.exec({})).toEqual([{ path: [], expected, actual: {} }])
+    expect(s.exec(testFn)).toEqual([{ path: [], expected, actual: testFn }])
+    expect(s.exec(testArrow)).toEqual([{ path: [], expected, actual: testArrow }])
   })
 
-  test('predicate receives actual value', () => {
-    t.strictEqual(createSatisfier({ a: (a: any) => a === 1 }).exec({ a: 1 }), undefined)
+  test('empty array matches only empty array', () => {
+    const expected: any[] = []
+    const s = createSatisfier(expected)
+    expect(s.exec([])).toBeUndefined()
+    expect(s.exec([1])).toEqual([{ path: [0], expected: undefined, actual: 1 }])
   })
 
-  test('passing predicate gets undefined', () => {
-    t.strictEqual(createSatisfier({ a: () => true }).exec({}), undefined)
-    t.strictEqual(createSatisfier({ a: () => true }).exec({ a: 1 }), undefined)
+  test('not match different length', () => {
+    expect(createSatisfier([1]).exec([1, 2])).toEqual([{ path: [1], expected: undefined, actual: 2 }])
   })
 
-  test('failing predicate', () => {
-    const actual = createSatisfier({ a: /*istanbul ignore next*/function () { return false } }).exec({ a: 1 })!
-    t.strictEqual(actual.length, 1)
-    assertExec(actual[0], ['a'], /*istanbul ignore next*/function () { return false; }, 1)
+  test('match each entry', () => {
+    expect(createSatisfier([{ a: 1 }, { b: 2 }]).exec([{ a: 2 }, {}])).toEqual([
+      { path: [0, 'a'], expected: 1, actual: 2 },
+      { path: [1, 'b'], expected: 2, actual: undefined }
+    ])
   })
+})
 
-  test('against each element in array', () => {
-    t.strictEqual(createSatisfier({ a: 1 }).exec([{ a: 1 }, { b: 1, a: 1 }]), undefined)
-  })
+describe('predicate function', () => {
+  test('consider match when predicate returns true', () => {
+    const s = createSatisfier(v => v === 1)
 
-  test('against each element in array in deep level', () => {
-    const actual = createSatisfier({ a: { b: { c: /foo/ } } }).exec([{ a: {} }, { a: { b: {} } }, { a: { b: { c: 'boo' } } }])!
-    t.strictEqual(actual.length, 3)
-    assertExec(actual[0], ['[0]', 'a', 'b'], { c: /foo/ }, undefined)
-    assertExec(actual[1], ['[1]', 'a', 'b', 'c'], /foo/, undefined)
-    assertExec(actual[2], ['[2]', 'a', 'b', 'c'], /foo/, 'boo')
+    expect(s.exec(1)).toBeUndefined()
   })
 
-  test('when apply against array, will have indices in the path', () => {
-    const actual = createSatisfier({ a: 1 }).exec([{ a: 1 }, {}])!
-    t.strictEqual(actual.length, 1)
-    assertExec(actual[0], ['[1]', 'a'], 1, undefined)
-  })
+  test('consider not match when predicate returns false', () => {
+    const s = createSatisfier(v => v === 1)
 
-  test('when expectation is an array, apply to each entry in the actual array', () => {
-    t.strictEqual(createSatisfier([{ a: 1 }, { b: 2 }]).exec([{ a: 1 }, { b: 2 }, { c: 3 }]), undefined)
-    const actual = createSatisfier([{ a: 1 }, { b: 2 }]).exec([{ a: true }, { b: 'b' }, { c: 3 }])!
-    t.strictEqual(actual.length, 2)
-    assertExec(actual[0], ['[0]', 'a'], 1, true)
-    assertExec(actual[1], ['[1]', 'b'], 2, 'b')
+    expect(s.exec(2)).toEqual([{ path: [], expected: s.expected, actual: 2 }])
   })
 
-  test.skip('when expectation is an array and actual is not, the behavior is not defined yet', () => {
-    const actual = createSatisfier([{ a: 1 }, { b: 2 }]).exec({ a: 1 })!
-    t.strictEqual(actual.length, 1)
+  test('returns diff result from predicate', () => {
+    expect(createSatisfier(v => ([{ path: [], expected: 1, actual: 2 }])).exec(9))
+      .toEqual([{ path: [], expected: 1, actual: 2 }])
   })
 
-  test('deep object checking', () => {
-    const actual = createSatisfier({ a: { b: 1 } }).exec({ a: { b: 2 } })!
-    t.strictEqual(actual.length, 1)
-    assertExec(actual[0], ['a', 'b'], 1, 2)
+  test('receives path in the second parameter', () => {
+    expect(createSatisfier({ a: (v, path) => ([{ path, expected: 1, actual: 2 }]) }).exec({ a: 3 }))
+      .toEqual([{ path: ['a'], expected: 1, actual: 2 }])
   })
 
-  test('can check parent property', () => {
-    class Foo {
-      foo = 'foo'
-    }
-    class Boo extends Foo {
-      boo = 'boo'
-    }
-    const boo = new Boo()
-    t.strictEqual(createSatisfier({ foo: 'foo' }).exec(boo), undefined)
-  })
+  test('apply property predicate', () => {
+    const s = createSatisfier({ data: v => v === 1 });
 
-  test('actual of type any should not have type checking error', () => {
-    let actual: any = { a: 1 }
-    t.strictEqual(createSatisfier({ a: 1 }).exec(actual), undefined)
+    expect(s.exec({ data: 1 })).toBeUndefined()
+    expect(s.exec({ data: 2 })).toEqual([{ path: ['data'], expected: s.expected.data, actual: 2 }])
+    expect(s.exec({ foo: 'b' })).toEqual([{ path: ['data'], expected: s.expected.data, actual: undefined }])
   })
+})
 
-  test('expect array in hash', () => {
-    t.strictEqual(createSatisfier({ a: [1, true, 'a'] }).exec({ a: [1, true, 'a'] }), undefined)
-  })
+test('use generic to lock in the type of the input', () => {
+  const s = createSatisfier<{ a: number }>(undefined)
+  let y: Parameters<typeof s.exec> = {} as any
 
-  test('failing array in hash', () => {
-    const actual = createSatisfier({ a: [1, true, 'a'] }).exec({ a: [1, true, 'b'] })!
-    t.strictEqual(actual.length, 1)
-    assertExec(actual[0], ['a', '[2]'], 'a', 'b')
-  })
+  typeAssert.isNever(tryAssign(undefined, y[0]))
+})
 
-  test('apply property predicate to array', () => {
-    const satisfier = createSatisfier({
-      data: (e: any) => e && e.every((x: any) => x.login)
-    });
+describe('test()', () => {
+  test('return true if exec() returns undefined', () => {
+    const s = createSatisfier(anything)
+    s.exec = () => undefined
 
-    t.strictEqual(satisfier.exec({ data: [{ login: 'a' }] }), undefined)
-    t.notStrictEqual(satisfier.exec([{ data: [{ foo: 'a' }] }]), undefined)
-    t.notStrictEqual(satisfier.exec([{ foo: 'b' }]), undefined)
+    expect(s.test(undefined)).toBe(true)
   })
-})
 
-describe('test', () => {
-  test('empty expecter passes everything but not null or undefined', () => {
-    t(createSatisfier({}).test({}))
-    t(createSatisfier({}).test({ a: 1 }))
-    t(createSatisfier({}).test({ a: true }))
-    t(createSatisfier({}).test({ a: 'a' }))
-    t(createSatisfier({}).test({ a: [1, true, 'a'] }))
-    t(createSatisfier({}).test({ a: { b: 'a' } }))
-    t(createSatisfier({}).test([{}, { a: 1 }]))
-    a.false(createSatisfier({}).test(null))
-    a.false(createSatisfier({}).test(undefined as any))
-  })
-
-  test('expect null to pass only null', () => {
-    t(createSatisfier(null).test(null))
-    a.false(createSatisfier(null).test(undefined as any))
-    a.false(createSatisfier(null).test(0))
-    a.false(createSatisfier(null).test(false))
-    a.false(createSatisfier(null).test(''))
-  })
-
-  test('mismatch value fails', () => {
-    a.false(createSatisfier({ a: 1 }).test({ a: 2 }))
-    a.false(createSatisfier({ a: true }).test({ a: false }))
-    a.false(createSatisfier({ a: 'a' }).test({ a: 'b' }))
-    a.false(createSatisfier({ a: /foo/ }).test({ a: 'b' }))
-    a.false(createSatisfier({ a: () => false }).test({ a: 'b' }))
-    a.false(createSatisfier([{ a: 1 }, { b: 2 }]).test([{ a: true }, { b: 'b' }, { c: 3 }]))
-    a.false(createSatisfier({ a: [1, true, 'a'] }).test({ a: [1, true, 'b'] }))
-    a.false(createSatisfier({ a: { b: 1 } }).test({ a: { b: 2 } }))
-  })
-
-  test('undefined expectation are ignored', () => {
-    const s = createSatisfier([undefined, 1])
-    t(s.test([undefined, 1]))
-    t(s.test([null, 1]))
-    t(s.test([1, 1]))
-    t(s.test(['a', 1]))
-    t(s.test([true, 1]))
-    t(s.test([{ a: 1 }, 1]))
-    t(s.test([[1, 2], 1]))
-  })
-
-  test('undefined expectation are ignored', () => {
-    const s = createSatisfier({ a: [undefined, 1] })
-    t(s.test({ a: [undefined, 1] }))
-    t(s.test({ a: [null, 1] }))
-    t(s.test({ a: [1, 1] }))
-    t(s.test({ a: ['a', 1] }))
-    t(s.test({ a: [true, 1] }))
-    t(s.test({ a: [{ a: 1 }, 1] }))
-    t(s.test({ a: [[1, 2], 1] }))
-  })
-
-  test('predicate receives array', () => {
-    t(createSatisfier((e: any) => {
-      return e[0] === 'a' && e[1] === 'b'
-    }).test(['a', 'b']))
-  })
-
-  test('primitive predicate will check against element in array', () => {
-    t(createSatisfier(1).test([1, 1]))
-    a.false(createSatisfier(1).test([1, 2]))
-    t(createSatisfier(false).test([false, false]))
-    a.false(createSatisfier(false).test([false, true]))
-    t(createSatisfier('a').test(['a', 'a']))
-    a.false(createSatisfier('a').test(['a', 'b']))
-  })
-
-
-  test('object predicate will check against element in array', () => {
-    t(createSatisfier({ a: 1 }).test([{ a: 1 }, { a: 1 }]))
-    t(createSatisfier({ a: (e: any) => typeof e === 'string' })
-      .test([{ a: 'a' }, { a: 'b' }]))
+  test('returns false if exec() returns diffs', () => {
+    const s = createSatisfier(anything)
+    s.exec = () => []
+
+    expect(s.test(undefined)).toBe(false)
   })
 })
diff --git a/src/createSatisfier.ts b/src/createSatisfier.ts
index 43cb736..7deba79 100644
--- a/src/createSatisfier.ts
+++ b/src/createSatisfier.ts
@@ -1,146 +1,164 @@
-import { SatisfierExec, Satisfier } from './interfaces'
-import { ArrayEntryExpectation } from './ArrayEntryExpectation'
-import { Or } from './Or'
+import { anything } from './anything';
+import { Diff, Predicate, Satisfier } from './interfaces';
 
-/**
- * creates a satisfier
- * @param expectation All properties can be a value which will be compared to the same property in `actual`, RegExp, or a predicate function that will be used to check against the property.
- */
-export function createSatisfier<T = any>(expectation: any): Satisfier<T> {
-  function test(actual: T) {
-    return exec(actual) === undefined
-  }
-  /**
-   * Check if `actual` satisfies the expected criteria.
-   */
-  function exec(actual: T) {
-    if (Array.isArray(actual)) {
-      const diff: SatisfierExec[] = []
-      if (Array.isArray(expectation)) {
-        const arrayEntryExps: ArrayEntryExpectation[] = []
-        const exp = expectation.map(e => {
-          if (arrayEntryExps.length >= 1) {
-            return new Or(...arrayEntryExps, e)
-          }
+// Workaround for https://github.com/Microsoft/TypeScript/issues/6230
+export interface ExpectationObject { [key: string]: Expectation }
 
-          if (e instanceof ArrayEntryExpectation) {
-            arrayEntryExps.push(e)
-          }
-          return e
-        })
-        let a = 0
-        exp.forEach((e: any) => {
-          if (e === undefined) {
-            a = a + 1
-            return
-          }
-          diff.push(...detectDiff(actual[a], e, [`[${a}]`], a))
-          a = a + 1
-        })
-        // if (actual.length > exp.length) {
-        //   for (let i = exp.length; i < actual.length; i++) {
-        //     diff.push({ path: [`[${i}]`], expected: undefined, actual: actual[i] })
-        //   }
-        // }
-      }
-      else if (typeof expectation === 'function') {
-        diff.push(...detectDiff(actual, expectation))
-      }
-      else if (actual.length === 0) {
-        diff.push({ path: [], expected: expectation, actual })
-      }
-      else {
-        actual.forEach((a, i) => {
-          diff.push(...detectDiff(a, expectation, [`[${i}]`], i))
-        })
-      }
-      return diff.length === 0 ? undefined : diff
-    }
-    const diff = detectDiff(actual, expectation)
-    return diff.length === 0 ? undefined : diff
-  }
+export interface ExpectionArray extends Array<Expectation> { }
+
+export type Expectation = symbol | undefined | null | boolean | number | bigint |
+  string | RegExp | ExpectionArray | ExpectationObject | Predicate
+
+export function createSatisfier<T = any>(expected: Expectation): Satisfier<T> {
   return {
-    test,
-    exec
+    expected,
+    test(actual: T) {
+      return this.exec(actual) === undefined
+    },
+    exec(actual: T) {
+      const d = diff(expected, actual)
+      return d.length ? d : undefined
+    }
   }
 }
 
-function detectDiff(actual: any, expected: any, path: string[] = [], index?: number) {
-  const diff: SatisfierExec[] = []
+const nodiff: Diff[] = []
+function diff(expected: any, actual: any, path: Diff['path'] = [], index?: number): Diff[] {
+  if (expected === anything) {
+    return nodiff
+  }
+
+  if (expected === undefined || expected === null) {
+    return actual === expected ? nodiff : [{
+      path,
+      expected,
+      actual
+    }]
+  }
+
+  // tslint:disable-next-line: strict-type-predicates valid-typeof
+  if (typeof expected === 'bigint') {
+    return actual === expected ? nodiff : [{
+      path,
+      expected,
+      actual
+    }]
+  }
+
   const expectedType = typeof expected
-  if (expectedType === 'function') {
-    if (!(expected as Function)(actual, index)) {
-      diff.push({
+
+  if (expectedType === 'number') {
+    if (isNaN(expected)) {
+      return typeof actual === 'number' && isNaN(actual) ? nodiff : [{
         path,
         expected,
         actual
-      })
+      }]
     }
-  }
-  else if (expected === undefined) {
-    return diff
-  }
-  else if (expected === null) {
-    if (expected !== actual)
-      diff.push({
+    else {
+      return actual === expected ? nodiff : [{
         path,
         expected,
         actual
-      })
-  }
-  else if (expectedType === 'number' && typeof actual === 'number') {
-    if (isNaN(expected) && isNaN(actual)) return diff
-    if (expected !== actual)
-      diff.push({ path, expected, actual })
-  }
-  else if (expectedType === 'boolean' || expectedType === 'number' || expectedType === 'string' || actual === undefined) {
-    if (expected !== actual)
-      diff.push({ path, expected, actual })
+      }]
+    }
   }
-  else if (expected instanceof ArrayEntryExpectation) {
-    const d = expected.exec(actual, path)
-    if (d) diff.push(...d)
+
+  if (expectedType === 'boolean' || expectedType === 'string' || expectedType === 'symbol') {
+    return actual === expected ? nodiff : [{
+      path,
+      expected,
+      actual
+    }]
   }
-  else if (expected instanceof RegExp) {
-    if (!expected.test(actual)) {
-      diff.push({
+
+  if (expected instanceof RegExp) {
+    if (actual instanceof RegExp) {
+      return expected.test(String(actual)) ? nodiff : [{
         path,
         expected,
         actual
-      })
+      }]
+    }
+    else {
+      return (typeof actual === 'string') && expected.test(actual) ?
+        nodiff :
+        [{
+          path,
+          expected,
+          actual
+        }]
     }
   }
-  else if (Array.isArray(expected)) {
+
+  if (Array.isArray(expected)) {
     if (!Array.isArray(actual)) {
-      diff.push({
+      return [{
         path,
         expected,
         actual
-      })
+      }]
     }
     else {
-      expected.forEach((e: any, i) => {
-        if (e === undefined)
-          return
-        const actualValue = actual[i]
-        diff.push(...detectDiff(actualValue, e, path.concat([`[${i}]`]), i))
-      })
+      const max = Math.max(expected.length, actual.length)
+      const diffs: Diff[] = []
+      for (let i = 0; i < max; i++) {
+        const e = expected[i]
+        const a = actual[i]
+        diffs.push(...diff(e, a, path.concat([i])))
+      }
+
+      return diffs
     }
   }
+
+  if (expectedType === 'function') {
+    const r = (expected as Predicate)(actual, path)
+    if (r === true) return nodiff
+    return r ? r : [{
+      path,
+      expected,
+      actual
+    }]
+  }
+
+  // expected is an object
+  if (actual === undefined || actual === null) {
+    return [{
+      path,
+      expected,
+      actual
+    }]
+  }
+  const actualType = typeof actual
+  if (actualType === 'boolean' ||
+    actualType === 'string' ||
+    actualType === 'number' ||
+    actualType === 'bigint' ||
+    actualType === 'symbol' ||
+    actualType === 'function' ||
+    actual instanceof RegExp) {
+    return [{
+      path,
+      expected,
+      actual
+    }]
+  }
+  else if (Array.isArray(actual)) {
+    return [{
+      path,
+      expected,
+      actual
+    }]
+    // return actual.reduce((p, v, i) => {
+    //   p.push(...diff(expected, v, path.concat([i])))
+    //   return p
+    // }, [] as Diff[])
+  }
   else {
-    // expected is object. If actual is not, then it is diff.
-    const actualType = typeof actual
-    if (actualType === 'boolean' || actualType === 'string' || actualType === 'number' || actual === undefined || actual === null)
-      diff.push({
-        path,
-        expected,
-        actual
-      })
-    else {
-      Object.keys(expected).forEach(k => {
-        diff.push(...detectDiff(actual[k], expected[k], path.concat([k])))
-      })
-    }
+    return Object.keys(expected).reduce((p, key: string) => {
+      p.push(...diff(expected[key], actual[key], path.concat([key])))
+      return p
+    }, [] as Diff[])
   }
-  return diff
 }
diff --git a/src/every.spec.ts b/src/every.spec.ts
index 805b095..21430c1 100644
--- a/src/every.spec.ts
+++ b/src/every.spec.ts
@@ -1,7 +1,7 @@
 import t from 'assert'
 import a from 'assertron'
 
-import { createSatisfier, every } from './index'
+import { createSatisfier, every } from '.'
 
 test('non array returns false', () => {
   a.false(createSatisfier(every({ a: 1 })).test(true))
@@ -25,6 +25,16 @@ test('array with all match returns true', () => {
   a.false(createSatisfier(every({ a: 1 })).test([{ b: 1 }, { a: 1 }, { a: 1 }, 'x']))
 })
 
+test('against each element in array in deep level', () => {
+  const actual = createSatisfier(every({ a: { b: { c: /foo/ } } })).exec([{ a: {} }, { a: { b: {} } }, { a: { b: { c: 'boo' } } }])
+  expect(actual)
+    .toEqual([
+      { actual: undefined, expected: { c: /foo/ }, path: [0, 'a', 'b'] },
+      { actual: undefined, expected: /foo/, path: [1, 'a', 'b', 'c'] },
+      { actual: 'boo', expected: /foo/, path: [2, 'a', 'b', 'c'] }
+    ])
+})
+
 test('tersify()', () => {
   t.strictEqual(every({ a: 1 }).tersify(), 'every({ a: 1 })')
 })
diff --git a/src/every.ts b/src/every.ts
index c27493a..171600d 100644
--- a/src/every.ts
+++ b/src/every.ts
@@ -13,5 +13,12 @@ import { createSatisfier } from './createSatisfier'
  */
 export function every(expectation: any) {
   const s = createSatisfier(expectation)
-  return tersible((e: any) => e && Array.isArray(e) && e.every(v => s.test(v)), () => `every(${tersify(expectation)})`)
+  return tersible((e: any) => e && Array.isArray(e) && e.reduce((p, v, i) => {
+    const d = s.exec(v)
+    if (d) p.push(...d.map(d => {
+      d.path.unshift(i)
+      return d
+    }))
+    return p
+  }, []), () => `every(${tersify(expectation)})`)
 }
diff --git a/src/formatDiffs.spec.ts b/src/formatDiffs.spec.ts
new file mode 100644
index 0000000..0cc301c
--- /dev/null
+++ b/src/formatDiffs.spec.ts
@@ -0,0 +1,17 @@
+import { createSatisfier, every, formatDiffs, has } from '.';
+
+test('index is wrapped with []', () => {
+  const diffs = createSatisfier(every({ a: { b: { c: /foo/ } } })).exec([{ a: {} }, { a: { b: {} } }, { a: { b: { c: 'boo' } } }])
+  const actual = formatDiffs(diffs)
+  expect(actual).toEqual(
+`expect '[0].a.b' to satisfy { c: /foo/ }, but received undefined
+expect '[1].a.b.c' to satisfy /foo/, but received undefined
+expect '[2].a.b.c' to satisfy /foo/, but received 'boo'`
+  )
+})
+
+test('uses tersify function when available', () => {
+  const diffs = createSatisfier(has(1)).exec([2, 3])
+  const actual = formatDiffs(diffs)
+  expect(actual).toEqual(`expect subject to satisfy has(1), but received [2, 3]`)
+})
diff --git a/src/formatDiffs.ts b/src/formatDiffs.ts
new file mode 100644
index 0000000..9c0762d
--- /dev/null
+++ b/src/formatDiffs.ts
@@ -0,0 +1,10 @@
+import { tersify } from 'tersify';
+import { Diff } from './interfaces';
+
+export function formatDiffs(diffs: Diff[] | undefined) {
+  if (!diffs) return ''
+  return diffs.map(d => {
+    const path = d.path.length === 0 ? 'subject' : `'${d.path.map(p => typeof p === 'number' ? `[${p}]` : p).join('.')}'`
+    return `expect ${path} to satisfy ${tersify(d.expected)}, but received ${tersify(d.actual)}`
+  }).join('\n')
+}
diff --git a/src/has.spec.ts b/src/has.spec.ts
index 4573abc..7804696 100644
--- a/src/has.spec.ts
+++ b/src/has.spec.ts
@@ -1,7 +1,6 @@
-import t from 'assert'
-import a from 'assertron'
-
-import { createSatisfier, has } from './index'
+import t from 'assert';
+import a from 'assertron';
+import { createSatisfier, has } from '.';
 
 test('non array returns false', () => {
   a.false(createSatisfier(has(1)).test(undefined))
@@ -49,6 +48,10 @@ test('pass when there are unmatched entry between matched one', () => {
   t(createSatisfier(has(1, 3)).test([1, 2, 3]))
 })
 
+test('fails when not all entries are matched', () => {
+  t(!createSatisfier(has(1, 4)).test([1, 2, 3]))
+})
+
 test('tersify()', () => {
   t.strictEqual(has({ a: 1 }, { b: 2 }).tersify(), 'has({ a: 1 }, { b: 2 })')
 })
diff --git a/src/has.ts b/src/has.ts
index 9ec76d7..ea8eda6 100644
--- a/src/has.ts
+++ b/src/has.ts
@@ -14,7 +14,7 @@ export function has(...expectations: any[]) {
   return tersible((arr: any) => {
     if (!Array.isArray(arr)) return false
     let index = 0
-    return expectations.some(e => {
+    return expectations.every(e => {
       const s = createSatisfier(e)
       let actual = arr[index]
       while (index < arr.length && !s.test(actual)) {
diff --git a/src/index.ts b/src/index.ts
index 95b6f94..9c80167 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,7 +1,7 @@
-export * from './ArrayEntryExpectation';
-export * from './AtLeastOnce';
+export * from './anything';
 export * from './createSatisfier';
 export * from './every';
+export * from './formatDiffs';
 export * from './has';
 export * from './interfaces';
 export * from './isInInterval';
@@ -9,3 +9,4 @@ export * from './isInRange';
 export * from './isTypeOf';
 export * from './none';
 export * from './some';
+export * from './startsWith';
diff --git a/src/interfaces.ts b/src/interfaces.ts
index 0a5563b..5671cda 100644
--- a/src/interfaces.ts
+++ b/src/interfaces.ts
@@ -1,16 +1,17 @@
 import { Tersible } from 'tersify'
 
-export type Predicate = (value: any) => boolean
+export type Predicate = (value: any, path: (string | number)[]) => boolean | Diff[]
 
 export type TersiblePredicate = Tersible<Predicate>
 
 export interface Satisfier<T = any> {
+  expected: any,
   test: (actual: T) => boolean;
-  exec: (actual: T) => SatisfierExec[] | undefined;
+  exec: (actual: T) => Diff[] | undefined;
 }
 
-export interface SatisfierExec {
-  path: string[],
+export interface Diff {
+  path: (string | number)[],
   expected: any,
   actual: any
 }
diff --git a/src/isInInterval.spec.ts b/src/isInInterval.spec.ts
index 5abe684..7c75e30 100644
--- a/src/isInInterval.spec.ts
+++ b/src/isInInterval.spec.ts
@@ -1,14 +1,6 @@
-import t from 'assert'
-import a from 'assertron'
-
-import {
-  createSatisfier,
-  isInClosedInterval,
-  isInLeftClosedInterval,
-  isInOpenInterval,
-  isInRightClosedInterval
-} from './index'
-
+import t from 'assert';
+import a from 'assertron';
+import { createSatisfier, isInClosedInterval, isInLeftClosedInterval, isInOpenInterval, isInRightClosedInterval } from '.';
 
 test('open interval', () => {
   a.false(createSatisfier(isInOpenInterval(1, 3)).test(1))
diff --git a/src/none.spec.ts b/src/none.spec.ts
index 469afa8..7c0eee6 100644
--- a/src/none.spec.ts
+++ b/src/none.spec.ts
@@ -1,7 +1,6 @@
-import t from 'assert'
-import a from 'assertron'
-
-import { createSatisfier, none } from './index'
+import t from 'assert';
+import a from 'assertron';
+import { createSatisfier, none } from '.';
 
 test('non array returns false', () => {
   a.false(createSatisfier(none({ a: 1 })).test(true))
diff --git a/src/some.spec.ts b/src/some.spec.ts
index 08d2761..8ce31c9 100644
--- a/src/some.spec.ts
+++ b/src/some.spec.ts
@@ -1,7 +1,7 @@
 import t from 'assert'
 import a from 'assertron'
 
-import { createSatisfier, some } from './index'
+import { createSatisfier, some } from '.'
 
 test('non array returns false', () => {
   a.false(createSatisfier(some({ a: 1 })).test(true))
diff --git a/src/startsWith.spec.ts b/src/startsWith.spec.ts
new file mode 100644
index 0000000..cd7b365
--- /dev/null
+++ b/src/startsWith.spec.ts
@@ -0,0 +1,39 @@
+import { createSatisfier } from 'satisfier';
+import { startsWith } from '.';
+
+test('non array returns false', () => {
+  expect(createSatisfier(startsWith([{ a: 1 }])).test(undefined)).toBe(false)
+  expect(createSatisfier(startsWith([{ a: 1 }])).test(null)).toBe(false)
+  expect(createSatisfier(startsWith([{ a: 1 }])).test(1)).toBe(false)
+  expect(createSatisfier(startsWith([{ a: 1 }])).test(true)).toBe(false)
+  expect(createSatisfier(startsWith([{ a: 1 }])).test('a')).toBe(false)
+  expect(createSatisfier(startsWith([{ a: 1 }])).test({ a: 1 })).toBe(false)
+})
+
+test('empty array will pass any array', () => {
+  expect(createSatisfier(startsWith([])).test([])).toBe(true)
+  expect(createSatisfier(startsWith([])).test([1])).toBe(true)
+})
+
+test('test against shorter array returns false', () => {
+  expect(createSatisfier(startsWith([{ a: 1 }])).test([])).toBe(false)
+  expect(createSatisfier(startsWith([{ a: 1 }, { b: 1 }])).test([{ a: 1 }])).toBe(false)
+})
+
+test('test against longer array returns true', () => {
+  expect(createSatisfier(startsWith([{ a: 1 }])).test([{ a: 1 }, { b: 1 }])).toBe(true)
+})
+
+test('each entry are checked', () => {
+  expect(createSatisfier(startsWith([{ a: 1 }])).test([{ a: 1, b: 1 }])).toBe(true)
+})
+
+test('array property inside entry is tested with exact logic', () => {
+  const satisfier = createSatisfier(startsWith([{ a: [1, 2] }]))
+  expect(satisfier.test([{ a: [1, 2] }, 2])).toBe(true)
+  expect(satisfier.test([{ a: [1, 2, 3] }, 2])).toBe(false)
+})
+
+test('tersify()', () => {
+  expect(startsWith([{ a: 1 }, { b: 2 }]).tersify()).toBe('startsWith([{ a: 1 }, { b: 2 }])')
+})
diff --git a/src/startsWith.ts b/src/startsWith.ts
index 451b91f..dd1a044 100644
--- a/src/startsWith.ts
+++ b/src/startsWith.ts
@@ -1,26 +1,17 @@
-import {
-  tersible,
-  tersify,
-  // @ts-ignore
-  Tersify
-} from 'tersify'
+import { tersible, tersify } from 'tersify';
+import { createSatisfier } from './createSatisfier';
 
-import { createSatisfier } from './createSatisfier'
 
 /**
  * Check if an array has the first n entries satisfying the specifiec expectations.
  */
-export function startsWith(...expectations: any[]) {
-  return tersible((arr: any) => {
-    if (!Array.isArray(arr)) return false
-    let index = 0
-    return expectations.some(e => {
-      const s = createSatisfier(e)
-      let actual = arr[index]
-      while (index < arr.length && !s.test(actual)) {
-        actual = arr[++index]
-      }
-      return index !== arr.length
+export function startsWith(expectations: any[]) {
+  return tersible((value: any) => {
+    if (!Array.isArray(value)) return false
+    if (expectations.length === 0) return true
+    return expectations.every((e, i) => {
+      const a = value[i]
+      return createSatisfier(e).test(a)
     })
-  }, () => `startsWith(${expectations.map(e => tersify(e)).join(', ')})`)
+  }, () => `startsWith([${expectations.map(e => tersify(e)).join(', ')}])`)
 }
diff --git a/src/testUtil.ts b/src/testUtil.ts
deleted file mode 100644
index 7e03ff3..0000000
--- a/src/testUtil.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import t from 'assert'
-
-import { tersify } from 'tersify'
-
-export function assertRegExp(actual: any, path: string[], regex: any, actualValue: any) {
-  t.strictEqual(actual.length, 1)
-  t.deepStrictEqual(actual[0].path, path)
-  t.strictEqual(actual[0].expected.source, regex.source)
-  t.deepStrictEqual(actual[0].actual, actualValue)
-}
-
-export function assertExec(entry: any, path: string[], expected: any, actual: any) {
-  t.deepStrictEqual(entry.path, path)
-  if (typeof entry.expected === 'function')
-    t.strictEqual(tersify(entry.expected), tersify(expected))
-  else
-    t.deepStrictEqual(entry.expected, expected)
-  t.deepStrictEqual(entry.actual, actual)
-}
diff --git a/tsconfig.esnext.json b/tsconfig.esnext.json
index 064c508..df00a13 100755
--- a/tsconfig.esnext.json
+++ b/tsconfig.esnext.json
@@ -3,6 +3,9 @@
   "compilerOptions": {
     "module": "esnext",
     "outDir": "libm",
-    "target": "esnext"
+    "target": "esnext",
+    "lib": [
+      "esnext"
+    ]
   }
 }
diff --git a/yarn.lock b/yarn.lock
index 968d42f..3792282 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -10,17 +10,17 @@
     "@babel/highlight" "^7.0.0"
 
 "@babel/core@^7.1.0":
-  version "7.3.3"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.3.tgz#d090d157b7c5060d05a05acaebc048bd2b037947"
-  integrity sha512-w445QGI2qd0E0GlSnq6huRZWPMmQGCp5gd5ZWS4hagn0EiwzxD5QMFkpchyusAyVC1n27OKXzQ0/88aVU9n4xQ==
+  version "7.3.4"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b"
+  integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.3.3"
+    "@babel/generator" "^7.3.4"
     "@babel/helpers" "^7.2.0"
-    "@babel/parser" "^7.3.3"
+    "@babel/parser" "^7.3.4"
     "@babel/template" "^7.2.2"
-    "@babel/traverse" "^7.2.2"
-    "@babel/types" "^7.3.3"
+    "@babel/traverse" "^7.3.4"
+    "@babel/types" "^7.3.4"
     convert-source-map "^1.1.0"
     debug "^4.1.0"
     json5 "^2.1.0"
@@ -29,12 +29,12 @@
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.0.0", "@babel/generator@^7.2.2", "@babel/generator@^7.3.3":
-  version "7.3.3"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.3.tgz#185962ade59a52e00ca2bdfcfd1d58e528d4e39e"
-  integrity sha512-aEADYwRRZjJyMnKN7llGIlircxTCofm3dtV5pmY6ob18MSIuipHpA2yZWkPlycwu5HJcx/pADS3zssd8eY7/6A==
+"@babel/generator@^7.0.0", "@babel/generator@^7.3.4":
+  version "7.3.4"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e"
+  integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==
   dependencies:
-    "@babel/types" "^7.3.3"
+    "@babel/types" "^7.3.4"
     jsesc "^2.5.1"
     lodash "^4.17.11"
     source-map "^0.5.0"
@@ -86,10 +86,10 @@
     esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3", "@babel/parser@^7.3.3":
-  version "7.3.3"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.3.tgz#092d450db02bdb6ccb1ca8ffd47d8774a91aef87"
-  integrity sha512-xsH1CJoln2r74hR+y7cg2B5JCPaTh+Hd+EbBRk9nWGSNspuo6krjhX0Om6RnRQuIvFq8wVXCLKH3kwKDYhanSg==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4":
+  version "7.3.4"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c"
+  integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==
 
 "@babel/plugin-syntax-object-rest-spread@^7.0.0":
   version "7.2.0"
@@ -107,30 +107,175 @@
     "@babel/parser" "^7.2.2"
     "@babel/types" "^7.2.2"
 
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.2.2":
-  version "7.2.3"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8"
-  integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.3.4":
+  version "7.3.4"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06"
+  integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.2.2"
+    "@babel/generator" "^7.3.4"
     "@babel/helper-function-name" "^7.1.0"
     "@babel/helper-split-export-declaration" "^7.0.0"
-    "@babel/parser" "^7.2.3"
-    "@babel/types" "^7.2.2"
+    "@babel/parser" "^7.3.4"
+    "@babel/types" "^7.3.4"
     debug "^4.1.0"
     globals "^11.1.0"
-    lodash "^4.17.10"
+    lodash "^4.17.11"
 
-"@babel/types@^7.0.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
-  version "7.3.3"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.3.tgz#6c44d1cdac2a7625b624216657d5bc6c107ab436"
-  integrity sha512-2tACZ80Wg09UnPg5uGAOUvvInaqLk3l/IAhQzlxLQOIXacr6bMsra5SH6AWw/hIDRCSbCdHP2KzSOD+cT7TzMQ==
+"@babel/types@^7.0.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4":
+  version "7.3.4"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed"
+  integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==
   dependencies:
     esutils "^2.0.2"
     lodash "^4.17.11"
     to-fast-properties "^2.0.0"
 
+"@cnakazawa/watch@^1.0.3":
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
+  integrity sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==
+  dependencies:
+    exec-sh "^0.3.2"
+    minimist "^1.2.0"
+
+"@jest/console@^24.3.0":
+  version "24.3.0"
+  resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.3.0.tgz#7bd920d250988ba0bf1352c4493a48e1cb97671e"
+  integrity sha512-NaCty/OOei6rSDcbPdMiCbYCI0KGFGPgGO6B09lwWt5QTxnkuhKYET9El5u5z1GAcSxkQmSMtM63e24YabCWqA==
+  dependencies:
+    "@jest/source-map" "^24.3.0"
+    "@types/node" "*"
+    chalk "^2.0.1"
+    slash "^2.0.0"
+
+"@jest/core@^24.5.0":
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.5.0.tgz#2cefc6a69e9ebcae1da8f7c75f8a257152ba1ec0"
+  integrity sha512-RDZArRzAs51YS7dXG1pbXbWGxK53rvUu8mCDYsgqqqQ6uSOaTjcVyBl2Jce0exT2rSLk38ca7az7t2f3b0/oYQ==
+  dependencies:
+    "@jest/console" "^24.3.0"
+    "@jest/reporters" "^24.5.0"
+    "@jest/test-result" "^24.5.0"
+    "@jest/transform" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    ansi-escapes "^3.0.0"
+    chalk "^2.0.1"
+    exit "^0.1.2"
+    graceful-fs "^4.1.15"
+    jest-changed-files "^24.5.0"
+    jest-config "^24.5.0"
+    jest-haste-map "^24.5.0"
+    jest-message-util "^24.5.0"
+    jest-regex-util "^24.3.0"
+    jest-resolve-dependencies "^24.5.0"
+    jest-runner "^24.5.0"
+    jest-runtime "^24.5.0"
+    jest-snapshot "^24.5.0"
+    jest-util "^24.5.0"
+    jest-validate "^24.5.0"
+    jest-watcher "^24.5.0"
+    micromatch "^3.1.10"
+    p-each-series "^1.0.0"
+    pirates "^4.0.1"
+    realpath-native "^1.1.0"
+    rimraf "^2.5.4"
+    strip-ansi "^5.0.0"
+
+"@jest/environment@^24.5.0":
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.5.0.tgz#a2557f7808767abea3f9e4cc43a172122a63aca8"
+  integrity sha512-tzUHR9SHjMXwM8QmfHb/EJNbF0fjbH4ieefJBvtwO8YErLTrecc1ROj0uo2VnIT6SlpEGZnvdCK6VgKYBo8LsA==
+  dependencies:
+    "@jest/fake-timers" "^24.5.0"
+    "@jest/transform" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    "@types/node" "*"
+    jest-mock "^24.5.0"
+
+"@jest/fake-timers@^24.5.0":
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.5.0.tgz#4a29678b91fd0876144a58f8d46e6c62de0266f0"
+  integrity sha512-i59KVt3QBz9d+4Qr4QxsKgsIg+NjfuCjSOWj3RQhjF5JNy+eVJDhANQ4WzulzNCHd72srMAykwtRn5NYDGVraw==
+  dependencies:
+    "@jest/types" "^24.5.0"
+    "@types/node" "*"
+    jest-message-util "^24.5.0"
+    jest-mock "^24.5.0"
+
+"@jest/reporters@^24.5.0":
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.5.0.tgz#9363a210d0daa74696886d9cb294eb8b3ad9b4d9"
+  integrity sha512-vfpceiaKtGgnuC3ss5czWOihKOUSyjJA4M4udm6nH8xgqsuQYcyDCi4nMMcBKsHXWgz9/V5G7iisnZGfOh1w6Q==
+  dependencies:
+    "@jest/environment" "^24.5.0"
+    "@jest/test-result" "^24.5.0"
+    "@jest/transform" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    chalk "^2.0.1"
+    exit "^0.1.2"
+    glob "^7.1.2"
+    istanbul-api "^2.1.1"
+    istanbul-lib-coverage "^2.0.2"
+    istanbul-lib-instrument "^3.0.1"
+    istanbul-lib-source-maps "^3.0.1"
+    jest-haste-map "^24.5.0"
+    jest-resolve "^24.5.0"
+    jest-runtime "^24.5.0"
+    jest-util "^24.5.0"
+    jest-worker "^24.4.0"
+    node-notifier "^5.2.1"
+    slash "^2.0.0"
+    source-map "^0.6.0"
+    string-length "^2.0.0"
+
+"@jest/source-map@^24.3.0":
+  version "24.3.0"
+  resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.3.0.tgz#563be3aa4d224caf65ff77edc95cd1ca4da67f28"
+  integrity sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==
+  dependencies:
+    callsites "^3.0.0"
+    graceful-fs "^4.1.15"
+    source-map "^0.6.0"
+
+"@jest/test-result@^24.5.0":
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.5.0.tgz#ab66fb7741a04af3363443084e72ea84861a53f2"
+  integrity sha512-u66j2vBfa8Bli1+o3rCaVnVYa9O8CAFZeqiqLVhnarXtreSXG33YQ6vNYBogT7+nYiFNOohTU21BKiHlgmxD5A==
+  dependencies:
+    "@jest/console" "^24.3.0"
+    "@jest/types" "^24.5.0"
+    "@types/istanbul-lib-coverage" "^1.1.0"
+
+"@jest/transform@^24.5.0":
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.5.0.tgz#6709fc26db918e6af63a985f2cc3c464b4cf99d9"
+  integrity sha512-XSsDz1gdR/QMmB8UCKlweAReQsZrD/DK7FuDlNo/pE8EcKMrfi2kqLRk8h8Gy/PDzgqJj64jNEzOce9pR8oj1w==
+  dependencies:
+    "@babel/core" "^7.1.0"
+    "@jest/types" "^24.5.0"
+    babel-plugin-istanbul "^5.1.0"
+    chalk "^2.0.1"
+    convert-source-map "^1.4.0"
+    fast-json-stable-stringify "^2.0.0"
+    graceful-fs "^4.1.15"
+    jest-haste-map "^24.5.0"
+    jest-regex-util "^24.3.0"
+    jest-util "^24.5.0"
+    micromatch "^3.1.10"
+    realpath-native "^1.1.0"
+    slash "^2.0.0"
+    source-map "^0.6.1"
+    write-file-atomic "2.4.1"
+
+"@jest/types@^24.5.0":
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.5.0.tgz#feee214a4d0167b0ca447284e95a57aa10b3ee95"
+  integrity sha512-kN7RFzNMf2R8UDadPOl6ReyI+MT8xfqRuAnuVL+i4gwjv/zubdDK+EDeLHYwq1j0CSSR2W/MmgaRlMZJzXdmVA==
+  dependencies:
+    "@types/istanbul-lib-coverage" "^1.1.0"
+    "@types/yargs" "^12.0.9"
+
 "@mrmlnc/readdir-enhanced@^2.2.1":
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@@ -144,47 +289,95 @@
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
   integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
 
+"@types/babel__core@^7.1.0":
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.0.tgz#710f2487dda4dcfd010ca6abb2b4dc7394365c51"
+  integrity sha512-wJTeJRt7BToFx3USrCDs2BhEi4ijBInTQjOIukj6a/5tEkwpFMVZ+1ppgmE+Q/FQyc5P/VWUbx7I9NELrKruHA==
+  dependencies:
+    "@babel/parser" "^7.1.0"
+    "@babel/types" "^7.0.0"
+    "@types/babel__generator" "*"
+    "@types/babel__template" "*"
+    "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.0.2.tgz#d2112a6b21fad600d7674274293c85dce0cb47fc"
+  integrity sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==
+  dependencies:
+    "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+  version "7.0.2"
+  resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307"
+  integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==
+  dependencies:
+    "@babel/parser" "^7.1.0"
+    "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
+  version "7.0.6"
+  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.6.tgz#328dd1a8fc4cfe3c8458be9477b219ea158fd7b2"
+  integrity sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==
+  dependencies:
+    "@babel/types" "^7.3.0"
+
+"@types/istanbul-lib-coverage@^1.1.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#2cc2ca41051498382b43157c8227fea60363f94a"
+  integrity sha512-ohkhb9LehJy+PA40rDtGAji61NCgdtKLAlFoYp4cnuuQEswwdK3vz9SOIkkyc3wrk8dzjphQApNs56yyXLStaQ==
+
 "@types/jest-diff@*":
   version "20.0.1"
   resolved "https://registry.yarnpkg.com/@types/jest-diff/-/jest-diff-20.0.1.tgz#35cc15b9c4f30a18ef21852e255fdb02f6d59b89"
   integrity sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==
 
-"@types/jest@^24.0.5":
-  version "24.0.5"
-  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.5.tgz#a4f9e255f460ce24896cfec89aacf1151a2131ee"
-  integrity sha512-Xj6xJ0bzP7a78ZSEY6P0Q4ZIb/YbdPiFsEUOTki6wZOE3lpANJoyjQpCe3DgUvUZGw56IMqTjFEmMaqzbteLmw==
+"@types/jest@^24.0.9":
+  version "24.0.11"
+  resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.11.tgz#1f099bea332c228ea6505a88159bfa86a5858340"
+  integrity sha512-2kLuPC5FDnWIDvaJBzsGTBQaBbnDweznicvK7UGYzlIJP4RJR2a4A/ByLUXEyEgag6jz8eHdlWExGDtH3EYUXQ==
   dependencies:
     "@types/jest-diff" "*"
 
-"@types/node@^10.12.26":
-  version "10.12.26"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.26.tgz#2dec19f1f7981c95cb54bab8f618ecb5dc983d0e"
-  integrity sha512-nMRqS+mL1TOnIJrL6LKJcNZPB8V3eTfRo9FQA2b5gDvrHurC8XbSA86KNe0dShlEL7ReWJv/OU9NL7Z0dnqWTg==
+"@types/node@*", "@types/node@^11.9.5":
+  version "11.11.3"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.3.tgz#7c6b0f8eaf16ae530795de2ad1b85d34bf2f5c58"
+  integrity sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg==
 
-"@unional/devpkg-node@^1.2.4":
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/@unional/devpkg-node/-/devpkg-node-1.2.4.tgz#30b8be541e355d1457c36763ab645ac37d31a922"
-  integrity sha512-e1K530iRVMVc8jH0Usvg9SLFodtNmb4Z4uPEp6cHmFRIhaRv3RyzaBKdIwF9xEElqLVDOg76gQ/x1L9ip9BwrA==
+"@types/stack-utils@^1.0.1":
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
+  integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
+
+"@types/yargs@^12.0.2", "@types/yargs@^12.0.9":
+  version "12.0.9"
+  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-12.0.9.tgz#693e76a52f61a2f1e7fb48c0eef167b95ea4ffd0"
+  integrity sha512-sCZy4SxP9rN2w30Hlmg5dtdRwgYQfYRiLo9usw8X9cxlf+H4FqM1xX7+sNH7NNKVdbXMJWqva7iyy+fxh/V7fA==
+
+"@unional/devpkg-node@^1.2.5":
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/@unional/devpkg-node/-/devpkg-node-1.2.5.tgz#2a292b2cf1cb27162adf9eaabfc1ccf45f28426d"
+  integrity sha512-YXTrBX+uR8CFU5Gl++kxcudiP902L2Wwu7cjlzG066YDILtx+zgV4/gVIplk1uMIVpc0kobbiNLezoUcP7sw1w==
   dependencies:
-    "@types/jest" "^24.0.5"
-    "@types/node" "^10.12.26"
+    "@types/jest" "^24.0.9"
+    "@types/node" "^11.9.5"
     dependency-check "^3.3.0"
-    eslint "^5.14.0"
+    eslint "^5.14.1"
     eslint-plugin-harmony "^1.0.4"
     is-ci "^2.0.0"
     jest "^24.1.0"
     jest-audio-reporter "^2.2.1"
     jest-progress-tracker "^2.0.1"
     jest-validate "^24.0.0"
-    jest-watch-repeat "^1.0.0"
+    jest-watch-repeat "^1.0.1"
     jest-watch-suspend "^1.1.1"
     jest-watch-toggle-config "^1.0.2"
     power-assert "^1.6.1"
     rimraf "^2.6.3"
-    ts-jest "^23.10.5"
-    tslint "^5.12.1"
+    ts-jest "^24.0.0"
+    tslint "^5.13.0"
     tslint-config-unional "^0.10.0"
-    typescript "^3.3.3"
+    typescript "^3.3.3333"
 
 abab@^2.0.0:
   version "2.0.0"
@@ -196,6 +389,11 @@ abbrev@1:
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
   integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
 
+acorn-bigint@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/acorn-bigint/-/acorn-bigint-0.3.1.tgz#edb40a414dcaf5a09c2933db6bed79454b3ff46a"
+  integrity sha512-WT9LheDC4/d/sD/jgC6L5UMq4U9X3KNMy0JrXp/MdJL83ZqcuPQuMkj50beOX0dMub8IoZUYycfN7bIVZuU5zg==
+
 acorn-dynamic-import@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948"
@@ -239,15 +437,22 @@ acorn@^5.0.0, acorn@^5.5.3:
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
   integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
 
-acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818"
-  integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==
+acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.7, acorn@^6.1.1:
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f"
+  integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==
+
+agent-base@^4.1.0:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
+  integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
+  dependencies:
+    es6-promisify "^5.0.0"
 
 ajv@^6.5.5, ajv@^6.9.1:
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1"
-  integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==
+  version "6.10.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1"
+  integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==
   dependencies:
     fast-deep-equal "^2.0.1"
     fast-json-stable-stringify "^2.0.0"
@@ -269,10 +474,10 @@ ansi-regex@^3.0.0:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
   integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
 
-ansi-regex@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9"
-  integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==
+ansi-regex@^4.0.0, ansi-regex@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+  integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
 
 ansi-styles@^2.2.1:
   version "2.2.1"
@@ -321,6 +526,11 @@ argparse@^1.0.7:
   dependencies:
     sprintf-js "~1.0.2"
 
+argv@^0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.2.tgz#ecbd16f8949b157183711b1bda334f37840185ab"
+  integrity sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=
+
 arr-diff@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@@ -453,37 +663,42 @@ babel-code-frame@^6.22.0:
     esutils "^2.0.2"
     js-tokens "^3.0.2"
 
-babel-jest@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.1.0.tgz#441e23ef75ded3bd547e300ac3194cef87b55190"
-  integrity sha512-MLcagnVrO9ybQGLEfZUqnOzv36iQzU7Bj4elm39vCukumLVSfoX+tRy3/jW7lUKc7XdpRmB/jech6L/UCsSZjw==
+babel-jest@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.5.0.tgz#0ea042789810c2bec9065f7c8ab4dc18e1d28559"
+  integrity sha512-0fKCXyRwxFTJL0UXDJiT2xYxO9Lu2vBd9n+cC+eDjESzcVG3s2DRGAxbzJX21fceB1WYoBjAh8pQ83dKcl003g==
   dependencies:
+    "@jest/transform" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    "@types/babel__core" "^7.1.0"
     babel-plugin-istanbul "^5.1.0"
-    babel-preset-jest "^24.1.0"
+    babel-preset-jest "^24.3.0"
     chalk "^2.4.2"
     slash "^2.0.0"
 
 babel-plugin-istanbul@^5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.0.tgz#6892f529eff65a3e2d33d87dc5888ffa2ecd4a30"
-  integrity sha512-CLoXPRSUWiR8yao8bShqZUIC6qLfZVVY3X1wj+QPNXu0wfmrRRfarh1LYy+dYMVI+bDj0ghy3tuqFFRFZmL1Nw==
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.1.tgz#7981590f1956d75d67630ba46f0c22493588c893"
+  integrity sha512-RNNVv2lsHAXJQsEJ5jonQwrJVWK8AcZpG1oxhnjCUaAjL7xahYLANhPUZbzEQHjKy1NMYUwn+0NPKQc8iSY4xQ==
   dependencies:
     find-up "^3.0.0"
     istanbul-lib-instrument "^3.0.0"
     test-exclude "^5.0.0"
 
-babel-plugin-jest-hoist@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.1.0.tgz#dfecc491fb15e2668abbd690a697a8fd1411a7f8"
-  integrity sha512-gljYrZz8w1b6fJzKcsfKsipSru2DU2DmQ39aB6nV3xQ0DDv3zpIzKGortA5gknrhNnPN8DweaEgrnZdmbGmhnw==
+babel-plugin-jest-hoist@^24.3.0:
+  version "24.3.0"
+  resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.3.0.tgz#f2e82952946f6e40bb0a75d266a3790d854c8b5b"
+  integrity sha512-nWh4N1mVH55Tzhx2isvUN5ebM5CDUvIpXPZYMRazQughie/EqGnbR+czzoQlhUmJG9pPJmYDRhvocotb2THl1w==
+  dependencies:
+    "@types/babel__traverse" "^7.0.6"
 
-babel-preset-jest@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.1.0.tgz#83bc564fdcd4903641af65ec63f2f5de6b04132e"
-  integrity sha512-FfNLDxFWsNX9lUmtwY7NheGlANnagvxq8LZdl5PKnVG3umP+S/g0XbVBfwtA4Ai3Ri/IMkWabBz3Tyk9wdspcw==
+babel-preset-jest@^24.3.0:
+  version "24.3.0"
+  resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.3.0.tgz#db88497e18869f15b24d9c0e547d8e0ab950796d"
+  integrity sha512-VGTV2QYBa/Kn3WCOKdfS31j9qomaXSgJqi65B6o05/1GsJyj9LVhSljM9ro4S+IBGj/ENhNBuH9bpqzztKAQSw==
   dependencies:
     "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
-    babel-plugin-jest-hoist "^24.1.0"
+    babel-plugin-jest-hoist "^24.3.0"
 
 balanced-match@^1.0.0:
   version "1.0.0"
@@ -618,9 +833,9 @@ camelcase@^4.1.0:
   integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
 
 camelcase@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
-  integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45"
+  integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ==
 
 capture-exit@^1.2.0:
   version "1.2.0"
@@ -660,9 +875,9 @@ chardet@^0.7.0:
   integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
 
 chokidar@^2.0.4:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.1.tgz#adc39ad55a2adf26548bd2afa048f611091f9184"
-  integrity sha512-gfw3p2oQV2wEt+8VuMlNsPjCxDxvvgnm/kz+uATu805mWVF8IJN7uz9DN7iBz+RMJISmiVbCOBFs9qBGMjtPfQ==
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058"
+  integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==
   dependencies:
     anymatch "^2.0.0"
     async-each "^1.0.1"
@@ -729,6 +944,17 @@ code-point-at@^1.0.0:
   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
   integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
 
+codecov@^3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/codecov/-/codecov-3.2.0.tgz#4465ee19884528092d8c313e1f9e4bdc7d3065cd"
+  integrity sha512-3NJvNARXxilqnqVfgzDHyVrF4oeVgaYW1c1O6Oi5mn93exE7HTSSFNiYdwojWW6IwrCZABJ8crpNbKoo9aUHQw==
+  dependencies:
+    argv "^0.0.2"
+    ignore-walk "^3.0.1"
+    js-yaml "^3.12.0"
+    teeny-request "^3.7.0"
+    urlgrey "^0.4.4"
+
 collection-visit@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
@@ -825,9 +1051,9 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
   integrity sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==
 
 cssstyle@^1.0.0:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb"
-  integrity sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495"
+  integrity sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==
   dependencies:
     cssom "0.3.x"
 
@@ -854,6 +1080,13 @@ debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
   dependencies:
     ms "2.0.0"
 
+debug@^3.1.0:
+  version "3.2.6"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
+  integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
+  dependencies:
+    ms "^2.1.1"
+
 debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
@@ -970,10 +1203,10 @@ diff-match-patch@^1.0.0:
   resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.4.tgz#6ac4b55237463761c4daf0dc603eb869124744b1"
   integrity sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==
 
-diff-sequences@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.0.0.tgz#cdf8e27ed20d8b8d3caccb4e0c0d8fe31a173013"
-  integrity sha512-46OkIuVGBBnrC0soO/4LHu5LHGHx0uhP65OVz8XOrAJpqiCB2aVIuESvjI1F9oqebuvY8lekS1pt6TN7vt7qsw==
+diff-sequences@^24.3.0:
+  version "24.3.0"
+  resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.3.0.tgz#0f20e8a1df1abddaf4d9c226680952e64118b975"
+  integrity sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==
 
 diff@^3.2.0:
   version "3.5.0"
@@ -1079,15 +1312,27 @@ es-to-primitive@^1.2.0:
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
+es6-promise@^4.0.3:
+  version "4.2.6"
+  resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f"
+  integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==
+
+es6-promisify@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
+  integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
+  dependencies:
+    es6-promise "^4.0.3"
+
 escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
   integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
 escodegen@^1.9.1:
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
-  integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==
+  version "1.11.1"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.1.tgz#c485ff8d6b4cdb89e27f4a856e91f118401ca510"
+  integrity sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==
   dependencies:
     esprima "^3.1.3"
     estraverse "^4.2.0"
@@ -1101,10 +1346,10 @@ eslint-plugin-harmony@^1.0.4:
   resolved "https://registry.yarnpkg.com/eslint-plugin-harmony/-/eslint-plugin-harmony-1.0.4.tgz#de124047e4837572d96a90380ade19f4c4fe4f4b"
   integrity sha512-fc6oOzLyPRm02U/evWxqFOvowh/g568llbC22p9h5Eq5U//kNjk5GyyoK0VZ8tGkrMAsqkdGnHae/r1nKXqxuQ==
 
-eslint-scope@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172"
-  integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==
+eslint-scope@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.2.tgz#5f10cd6cabb1965bf479fa65745673439e21cb0e"
+  integrity sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg==
   dependencies:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
@@ -1119,10 +1364,10 @@ eslint-visitor-keys@^1.0.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
   integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==
 
-eslint@^5.14.0:
-  version "5.14.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.14.0.tgz#380739df2489dd846baea008638b036c1e987974"
-  integrity sha512-jrOhiYyENRrRnWlMYANlGZTqb89r2FuRT+615AabBoajhNjeh9ywDNlh2LU9vTqf0WYN+L3xdXuIi7xuj/tK9w==
+eslint@^5.14.1:
+  version "5.15.1"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.15.1.tgz#8266b089fd5391e0009a047050795b1d73664524"
+  integrity sha512-NTcm6vQ+PTgN3UBsALw5BMhgO6i5EpIjQF/Xb5tIh3sk9QhrFafujUOczGz4J24JBlzWclSB9Vmx8d+9Z6bFCg==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     ajv "^6.9.1"
@@ -1130,7 +1375,7 @@ eslint@^5.14.0:
     cross-spawn "^6.0.5"
     debug "^4.0.1"
     doctrine "^3.0.0"
-    eslint-scope "^4.0.0"
+    eslint-scope "^4.0.2"
     eslint-utils "^1.3.1"
     eslint-visitor-keys "^1.0.0"
     espree "^5.0.1"
@@ -1216,12 +1461,10 @@ esutils@^2.0.2:
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
   integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=
 
-exec-sh@^0.2.0:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
-  integrity sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==
-  dependencies:
-    merge "^1.2.0"
+exec-sh@^0.3.2:
+  version "0.3.2"
+  resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b"
+  integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==
 
 execa@^1.0.0:
   version "1.0.0"
@@ -1254,16 +1497,17 @@ expand-brackets@^2.1.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
-expect@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/expect/-/expect-24.1.0.tgz#88e73301c4c785cde5f16da130ab407bdaf8c0f2"
-  integrity sha512-lVcAPhaYkQcIyMS+F8RVwzbm1jro20IG8OkvxQ6f1JfqhVZyyudCwYogQ7wnktlf14iF3ii7ArIUO/mqvrW9Gw==
+expect@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/expect/-/expect-24.5.0.tgz#492fb0df8378d8474cc84b827776b069f46294ed"
+  integrity sha512-p2Gmc0CLxOgkyA93ySWmHFYHUPFIHG6XZ06l7WArWAsrqYVaVEkOU5NtT5i68KUyGKbkQgDCkiT65bWmdoL6Bw==
   dependencies:
+    "@jest/types" "^24.5.0"
     ansi-styles "^3.2.0"
-    jest-get-type "^24.0.0"
-    jest-matcher-utils "^24.0.0"
-    jest-message-util "^24.0.0"
-    jest-regex-util "^24.0.0"
+    jest-get-type "^24.3.0"
+    jest-matcher-utils "^24.5.0"
+    jest-message-util "^24.5.0"
+    jest-regex-util "^24.3.0"
 
 extend-shallow@^2.0.1:
   version "2.0.1"
@@ -1448,7 +1692,7 @@ fs.realpath@^1.0.0:
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
   integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 
-fsevents@^1.2.3, fsevents@^1.2.7:
+fsevents@^1.2.7:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4"
   integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==
@@ -1667,6 +1911,14 @@ http-signature@~1.2.0:
     jsprim "^1.2.2"
     sshpk "^1.7.0"
 
+https-proxy-agent@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0"
+  integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==
+  dependencies:
+    agent-base "^4.1.0"
+    debug "^3.1.0"
+
 iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4:
   version "0.4.24"
   resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -1998,7 +2250,7 @@ isstream@~0.1.2:
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
   integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
 
-istanbul-api@^2.0.8:
+istanbul-api@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.1.tgz#194b773f6d9cbc99a9258446848b0f988951c4d0"
   integrity sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw==
@@ -2077,192 +2329,201 @@ jest-audio-reporter@^2.2.1:
     play-sound "^1.1.3"
     rc "^1.2.8"
 
-jest-changed-files@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.0.0.tgz#c02c09a8cc9ca93f513166bc773741bd39898ff7"
-  integrity sha512-nnuU510R9U+UX0WNb5XFEcsrMqriSiRLeO9KWDFgPrpToaQm60prfQYpxsXigdClpvNot5bekDY440x9dNGnsQ==
+jest-changed-files@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.5.0.tgz#4075269ee115d87194fd5822e642af22133cf705"
+  integrity sha512-Ikl29dosYnTsH9pYa1Tv9POkILBhN/TLZ37xbzgNsZ1D2+2n+8oEZS2yP1BrHn/T4Rs4Ggwwbp/x8CKOS5YJOg==
   dependencies:
+    "@jest/types" "^24.5.0"
     execa "^1.0.0"
     throat "^4.0.0"
 
-jest-cli@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.1.0.tgz#f7cc98995f36e7210cce3cbb12974cbf60940843"
-  integrity sha512-U/iyWPwOI0T1CIxVLtk/2uviOTJ/OiSWJSe8qt6X1VkbbgP+nrtLJlmT9lPBe4lK78VNFJtrJ7pttcNv/s7yCw==
+jest-cli@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.5.0.tgz#598139d3446d1942fb7dc93944b9ba766d756d4b"
+  integrity sha512-P+Jp0SLO4KWN0cGlNtC7JV0dW1eSFR7eRpoOucP2UM0sqlzp/bVHeo71Omonvigrj9AvCKy7NtQANtqJ7FXz8g==
   dependencies:
-    ansi-escapes "^3.0.0"
+    "@jest/core" "^24.5.0"
+    "@jest/test-result" "^24.5.0"
+    "@jest/types" "^24.5.0"
     chalk "^2.0.1"
     exit "^0.1.2"
-    glob "^7.1.2"
-    graceful-fs "^4.1.15"
     import-local "^2.0.0"
     is-ci "^2.0.0"
-    istanbul-api "^2.0.8"
-    istanbul-lib-coverage "^2.0.2"
-    istanbul-lib-instrument "^3.0.1"
-    istanbul-lib-source-maps "^3.0.1"
-    jest-changed-files "^24.0.0"
-    jest-config "^24.1.0"
-    jest-environment-jsdom "^24.0.0"
-    jest-get-type "^24.0.0"
-    jest-haste-map "^24.0.0"
-    jest-message-util "^24.0.0"
-    jest-regex-util "^24.0.0"
-    jest-resolve-dependencies "^24.1.0"
-    jest-runner "^24.1.0"
-    jest-runtime "^24.1.0"
-    jest-snapshot "^24.1.0"
-    jest-util "^24.0.0"
-    jest-validate "^24.0.0"
-    jest-watcher "^24.0.0"
-    jest-worker "^24.0.0"
-    micromatch "^3.1.10"
-    node-notifier "^5.2.1"
-    p-each-series "^1.0.0"
-    pirates "^4.0.0"
+    jest-config "^24.5.0"
+    jest-util "^24.5.0"
+    jest-validate "^24.5.0"
     prompts "^2.0.1"
-    realpath-native "^1.0.0"
-    rimraf "^2.5.4"
-    slash "^2.0.0"
-    string-length "^2.0.0"
-    strip-ansi "^5.0.0"
-    which "^1.2.12"
+    realpath-native "^1.1.0"
     yargs "^12.0.2"
 
-jest-config@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.1.0.tgz#6ea6881cfdd299bc86cc144ee36d937c97c3850c"
-  integrity sha512-FbbRzRqtFC6eGjG5VwsbW4E5dW3zqJKLWYiZWhB0/4E5fgsMw8GODLbGSrY5t17kKOtCWb/Z7nsIThRoDpuVyg==
+jest-config@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.5.0.tgz#404d1bc6bb81aed6bd1890d07e2dca9fbba2e121"
+  integrity sha512-t2UTh0Z2uZhGBNVseF8wA2DS2SuBiLOL6qpLq18+OZGfFUxTM7BzUVKyHFN/vuN+s/aslY1COW95j1Rw81huOQ==
   dependencies:
     "@babel/core" "^7.1.0"
-    babel-jest "^24.1.0"
+    "@jest/types" "^24.5.0"
+    babel-jest "^24.5.0"
     chalk "^2.0.1"
     glob "^7.1.1"
-    jest-environment-jsdom "^24.0.0"
-    jest-environment-node "^24.0.0"
-    jest-get-type "^24.0.0"
-    jest-jasmine2 "^24.1.0"
-    jest-regex-util "^24.0.0"
-    jest-resolve "^24.1.0"
-    jest-util "^24.0.0"
-    jest-validate "^24.0.0"
+    jest-environment-jsdom "^24.5.0"
+    jest-environment-node "^24.5.0"
+    jest-get-type "^24.3.0"
+    jest-jasmine2 "^24.5.0"
+    jest-regex-util "^24.3.0"
+    jest-resolve "^24.5.0"
+    jest-util "^24.5.0"
+    jest-validate "^24.5.0"
     micromatch "^3.1.10"
-    pretty-format "^24.0.0"
-    realpath-native "^1.0.2"
+    pretty-format "^24.5.0"
+    realpath-native "^1.1.0"
 
-jest-diff@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.0.0.tgz#a3e5f573dbac482f7d9513ac9cfa21644d3d6b34"
-  integrity sha512-XY5wMpRaTsuMoU+1/B2zQSKQ9RdE9gsLkGydx3nvApeyPijLA8GtEvIcPwISRCer+VDf9W1mStTYYq6fPt8ryA==
+jest-diff@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.5.0.tgz#a2d8627964bb06a91893c0fbcb28ab228c257652"
+  integrity sha512-mCILZd9r7zqL9Uh6yNoXjwGQx0/J43OD2vvWVKwOEOLZliQOsojXwqboubAQ+Tszrb6DHGmNU7m4whGeB9YOqw==
   dependencies:
     chalk "^2.0.1"
-    diff-sequences "^24.0.0"
-    jest-get-type "^24.0.0"
-    pretty-format "^24.0.0"
+    diff-sequences "^24.3.0"
+    jest-get-type "^24.3.0"
+    pretty-format "^24.5.0"
 
-jest-docblock@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.0.0.tgz#54d77a188743e37f62181a91a01eb9222289f94e"
-  integrity sha512-KfAKZ4SN7CFOZpWg4i7g7MSlY0M+mq7K0aMqENaG2vHuhC9fc3vkpU/iNN9sOus7v3h3Y48uEjqz3+Gdn2iptA==
+jest-docblock@^24.3.0:
+  version "24.3.0"
+  resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.3.0.tgz#b9c32dac70f72e4464520d2ba4aec02ab14db5dd"
+  integrity sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==
   dependencies:
     detect-newline "^2.1.0"
 
-jest-each@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.0.0.tgz#10987a06b21c7ffbfb7706c89d24c52ed864be55"
-  integrity sha512-gFcbY4Cu55yxExXMkjrnLXov3bWO3dbPAW7HXb31h/DNWdNc/6X8MtxGff8nh3/MjkF9DpVqnj0KsPKuPK0cpA==
+jest-each@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.5.0.tgz#da14d017a1b7d0f01fb458d338314cafe7f72318"
+  integrity sha512-6gy3Kh37PwIT5sNvNY2VchtIFOOBh8UCYnBlxXMb5sr5wpJUDPTUATX2Axq1Vfk+HWTMpsYPeVYp4TXx5uqUBw==
   dependencies:
+    "@jest/types" "^24.5.0"
     chalk "^2.0.1"
-    jest-get-type "^24.0.0"
-    jest-util "^24.0.0"
-    pretty-format "^24.0.0"
-
-jest-environment-jsdom@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.0.0.tgz#5affa0654d6e44cd798003daa1a8701dbd6e4d11"
-  integrity sha512-1YNp7xtxajTRaxbylDc2pWvFnfDTH5BJJGyVzyGAKNt/lEULohwEV9zFqTgG4bXRcq7xzdd+sGFws+LxThXXOw==
-  dependencies:
-    jest-mock "^24.0.0"
-    jest-util "^24.0.0"
+    jest-get-type "^24.3.0"
+    jest-util "^24.5.0"
+    pretty-format "^24.5.0"
+
+jest-environment-jsdom@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.5.0.tgz#1c3143063e1374100f8c2723a8b6aad23b6db7eb"
+  integrity sha512-62Ih5HbdAWcsqBx2ktUnor/mABBo1U111AvZWcLKeWN/n/gc5ZvDBKe4Og44fQdHKiXClrNGC6G0mBo6wrPeGQ==
+  dependencies:
+    "@jest/environment" "^24.5.0"
+    "@jest/fake-timers" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    jest-mock "^24.5.0"
+    jest-util "^24.5.0"
     jsdom "^11.5.1"
 
-jest-environment-node@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.0.0.tgz#330948980656ed8773ce2e04eb597ed91e3c7190"
-  integrity sha512-62fOFcaEdU0VLaq8JL90TqwI7hLn0cOKOl8vY2n477vRkCJRojiRRtJVRzzCcgFvs6gqU97DNqX5R0BrBP6Rxg==
+jest-environment-node@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.5.0.tgz#763eebdf529f75b60aa600c6cf8cb09873caa6ab"
+  integrity sha512-du6FuyWr/GbKLsmAbzNF9mpr2Iu2zWSaq/BNHzX+vgOcts9f2ayXBweS7RAhr+6bLp6qRpMB6utAMF5Ygktxnw==
   dependencies:
-    jest-mock "^24.0.0"
-    jest-util "^24.0.0"
+    "@jest/environment" "^24.5.0"
+    "@jest/fake-timers" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    jest-mock "^24.5.0"
+    jest-util "^24.5.0"
 
-jest-get-type@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.0.0.tgz#36e72930b78e33da59a4f63d44d332188278940b"
-  integrity sha512-z6/Eyf6s9ZDGz7eOvl+fzpuJmN9i0KyTt1no37/dHu8galssxz5ZEgnc1KaV8R31q1khxyhB4ui/X5ZjjPk77w==
+jest-get-type@^24.3.0:
+  version "24.3.0"
+  resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.3.0.tgz#582cfd1a4f91b5cdad1d43d2932f816d543c65da"
+  integrity sha512-HYF6pry72YUlVcvUx3sEpMRwXEWGEPlJ0bSPVnB3b3n++j4phUEoSPcS6GC0pPJ9rpyPSe4cb5muFo6D39cXow==
 
-jest-haste-map@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.0.0.tgz#e9ef51b2c9257384b4d6beb83bd48c65b37b5e6e"
-  integrity sha512-CcViJyUo41IQqttLxXVdI41YErkzBKbE6cS6dRAploCeutePYfUimWd3C9rQEWhX0YBOQzvNsC0O9nYxK2nnxQ==
+jest-haste-map@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.5.0.tgz#3f17d0c548b99c0c96ed2893f9c0ccecb2eb9066"
+  integrity sha512-mb4Yrcjw9vBgSvobDwH8QUovxApdimGcOkp+V1ucGGw4Uvr3VzZQBJhNm1UY3dXYm4XXyTW2G7IBEZ9pM2ggRQ==
   dependencies:
+    "@jest/types" "^24.5.0"
     fb-watchman "^2.0.0"
     graceful-fs "^4.1.15"
     invariant "^2.2.4"
-    jest-serializer "^24.0.0"
-    jest-util "^24.0.0"
-    jest-worker "^24.0.0"
+    jest-serializer "^24.4.0"
+    jest-util "^24.5.0"
+    jest-worker "^24.4.0"
     micromatch "^3.1.10"
-    sane "^3.0.0"
+    sane "^4.0.3"
 
-jest-jasmine2@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.1.0.tgz#8377324b967037c440f0a549ee0bbd9912055db6"
-  integrity sha512-H+o76SdSNyCh9fM5K8upK45YTo/DiFx5w2YAzblQebSQmukDcoVBVeXynyr7DDnxh+0NTHYRCLwJVf3tC518wg==
+jest-jasmine2@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.5.0.tgz#e6af4d7f73dc527d007cca5a5b177c0bcc29d111"
+  integrity sha512-sfVrxVcx1rNUbBeyIyhkqZ4q+seNKyAG6iM0S2TYBdQsXjoFDdqWFfsUxb6uXSsbimbXX/NMkJIwUZ1uT9+/Aw==
   dependencies:
     "@babel/traverse" "^7.1.0"
+    "@jest/environment" "^24.5.0"
+    "@jest/test-result" "^24.5.0"
+    "@jest/types" "^24.5.0"
     chalk "^2.0.1"
     co "^4.6.0"
-    expect "^24.1.0"
+    expect "^24.5.0"
     is-generator-fn "^2.0.0"
-    jest-each "^24.0.0"
-    jest-matcher-utils "^24.0.0"
-    jest-message-util "^24.0.0"
-    jest-snapshot "^24.1.0"
-    jest-util "^24.0.0"
-    pretty-format "^24.0.0"
+    jest-each "^24.5.0"
+    jest-matcher-utils "^24.5.0"
+    jest-message-util "^24.5.0"
+    jest-runtime "^24.5.0"
+    jest-snapshot "^24.5.0"
+    jest-util "^24.5.0"
+    pretty-format "^24.5.0"
     throat "^4.0.0"
 
-jest-leak-detector@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.0.0.tgz#78280119fd05ee98317daee62cddb3aa537a31c6"
-  integrity sha512-ZYHJYFeibxfsDSKowjDP332pStuiFT2xfc5R67Rjm/l+HFJWJgNIOCOlQGeXLCtyUn3A23+VVDdiCcnB6dTTrg==
+jest-junit@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-6.3.0.tgz#99e64ebc54eddcb21238f0cc49f5820c89a8c785"
+  integrity sha512-3PH9UkpaomX6CUzqjlnk0m4yBCW/eroxV6v61OM6LkCQFO848P3YUhfIzu8ypZSBKB3vvCbB4WaLTKT0BrIf8A==
   dependencies:
-    pretty-format "^24.0.0"
+    jest-validate "^24.0.0"
+    mkdirp "^0.5.1"
+    strip-ansi "^4.0.0"
+    xml "^1.0.1"
 
-jest-matcher-utils@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.0.0.tgz#fc9c41cfc49b2c3ec14e576f53d519c37729d579"
-  integrity sha512-LQTDmO+aWRz1Tf9HJg+HlPHhDh1E1c65kVwRFo5mwCVp5aQDzlkz4+vCvXhOKFjitV2f0kMdHxnODrXVoi+rlA==
+jest-leak-detector@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.5.0.tgz#21ae2b3b0da252c1171cd494f75696d65fb6fa89"
+  integrity sha512-LZKBjGovFRx3cRBkqmIg+BZnxbrLqhQl09IziMk3oeh1OV81Hg30RUIx885mq8qBv1PA0comB9bjKcuyNO1bCQ==
+  dependencies:
+    pretty-format "^24.5.0"
+
+jest-matcher-utils@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.5.0.tgz#5995549dcf09fa94406e89526e877b094dad8770"
+  integrity sha512-QM1nmLROjLj8GMGzg5VBra3I9hLpjMPtF1YqzQS3rvWn2ltGZLrGAO1KQ9zUCVi5aCvrkbS5Ndm2evIP9yZg1Q==
   dependencies:
     chalk "^2.0.1"
-    jest-diff "^24.0.0"
-    jest-get-type "^24.0.0"
-    pretty-format "^24.0.0"
+    jest-diff "^24.5.0"
+    jest-get-type "^24.3.0"
+    pretty-format "^24.5.0"
 
-jest-message-util@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.0.0.tgz#a07a141433b2c992dbaec68d4cbfe470ba289619"
-  integrity sha512-J9ROJIwz/IeC+eV1XSwnRK4oAwPuhmxEyYx1+K5UI+pIYwFZDSrfZaiWTdq0d2xYFw4Xiu+0KQWsdsQpgJMf3Q==
+jest-message-util@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.5.0.tgz#181420a65a7ef2e8b5c2f8e14882c453c6d41d07"
+  integrity sha512-6ZYgdOojowCGiV0D8WdgctZEAe+EcFU+KrVds+0ZjvpZurUW2/oKJGltJ6FWY2joZwYXN5VL36GPV6pNVRqRnQ==
   dependencies:
     "@babel/code-frame" "^7.0.0"
+    "@jest/test-result" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    "@types/stack-utils" "^1.0.1"
     chalk "^2.0.1"
     micromatch "^3.1.10"
     slash "^2.0.0"
     stack-utils "^1.0.1"
 
-jest-mock@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.0.0.tgz#9a4b53e01d66a0e780f7d857462d063e024c617d"
-  integrity sha512-sQp0Hu5fcf5NZEh1U9eIW2qD0BwJZjb63Yqd98PQJFvf/zzUTBoUAwv/Dc/HFeNHIw1f3hl/48vNn+j3STaI7A==
+jest-mock@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.5.0.tgz#976912c99a93f2a1c67497a9414aa4d9da4c7b76"
+  integrity sha512-ZnAtkWrKf48eERgAOiUxVoFavVBziO2pAi2MfZ1+bGXVkDfxWLxU0//oJBkgwbsv6OAmuLBz4XFFqvCFMqnGUw==
+  dependencies:
+    "@jest/types" "^24.5.0"
+
+jest-pnp-resolver@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a"
+  integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==
 
 jest-progress-tracker@^2.0.1:
   version "2.0.1"
@@ -2271,131 +2532,148 @@ jest-progress-tracker@^2.0.1:
   dependencies:
     test-progress-tracker "^2.0.2"
 
-jest-regex-util@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.0.0.tgz#4feee8ec4a358f5bee0a654e94eb26163cb9089a"
-  integrity sha512-Jv/uOTCuC+PY7WpJl2mpoI+WbY2ut73qwwO9ByJJNwOCwr1qWhEW2Lyi2S9ZewUdJqeVpEBisdEVZSI+Zxo58Q==
+jest-regex-util@^24.3.0:
+  version "24.3.0"
+  resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.3.0.tgz#d5a65f60be1ae3e310d5214a0307581995227b36"
+  integrity sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==
 
-jest-resolve-dependencies@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.1.0.tgz#78f738a2ec59ff4d00751d9da56f176e3f589f6c"
-  integrity sha512-2VwPsjd3kRPu7qe2cpytAgowCObk5AKeizfXuuiwgm1a9sijJDZe8Kh1sFj6FKvSaNEfCPlBVkZEJa2482m/Uw==
+jest-resolve-dependencies@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.5.0.tgz#1a0dae9cdd41349ca4a84148b3e78da2ba33fd4b"
+  integrity sha512-dRVM1D+gWrFfrq2vlL5P9P/i8kB4BOYqYf3S7xczZ+A6PC3SgXYSErX/ScW/469pWMboM1uAhgLF+39nXlirCQ==
   dependencies:
-    jest-regex-util "^24.0.0"
-    jest-snapshot "^24.1.0"
+    "@jest/types" "^24.5.0"
+    jest-regex-util "^24.3.0"
+    jest-snapshot "^24.5.0"
 
-jest-resolve@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.1.0.tgz#42ff0169b0ea47bfdbd0c52a0067ca7d022c7688"
-  integrity sha512-TPiAIVp3TG6zAxH28u/6eogbwrvZjBMWroSLBDkwkHKrqxB/RIdwkWDye4uqPlZIXWIaHtifY3L0/eO5Z0f2wg==
+jest-resolve@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.5.0.tgz#8c16ba08f60a1616c3b1cd7afb24574f50a24d04"
+  integrity sha512-ZIfGqLX1Rg8xJpQqNjdoO8MuxHV1q/i2OO1hLXjgCWFWs5bsedS8UrOdgjUqqNae6DXA+pCyRmdcB7lQEEbXew==
   dependencies:
+    "@jest/types" "^24.5.0"
     browser-resolve "^1.11.3"
     chalk "^2.0.1"
-    realpath-native "^1.0.0"
-
-jest-runner@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.1.0.tgz#3686a2bb89ce62800da23d7fdc3da2c32792943b"
-  integrity sha512-CDGOkT3AIFl16BLL/OdbtYgYvbAprwJ+ExKuLZmGSCSldwsuU2dEGauqkpvd9nphVdAnJUcP12e/EIlnTX0QXg==
-  dependencies:
+    jest-pnp-resolver "^1.2.1"
+    realpath-native "^1.1.0"
+
+jest-runner@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.5.0.tgz#9be26ece4fd4ab3dfb528b887523144b7c5ffca8"
+  integrity sha512-oqsiS9TkIZV5dVkD+GmbNfWBRPIvxqmlTQ+AQUJUQ07n+4xTSDc40r+aKBynHw9/tLzafC00DIbJjB2cOZdvMA==
+  dependencies:
+    "@jest/console" "^24.3.0"
+    "@jest/environment" "^24.5.0"
+    "@jest/test-result" "^24.5.0"
+    "@jest/types" "^24.5.0"
     chalk "^2.4.2"
     exit "^0.1.2"
     graceful-fs "^4.1.15"
-    jest-config "^24.1.0"
-    jest-docblock "^24.0.0"
-    jest-haste-map "^24.0.0"
-    jest-jasmine2 "^24.1.0"
-    jest-leak-detector "^24.0.0"
-    jest-message-util "^24.0.0"
-    jest-runtime "^24.1.0"
-    jest-util "^24.0.0"
-    jest-worker "^24.0.0"
+    jest-config "^24.5.0"
+    jest-docblock "^24.3.0"
+    jest-haste-map "^24.5.0"
+    jest-jasmine2 "^24.5.0"
+    jest-leak-detector "^24.5.0"
+    jest-message-util "^24.5.0"
+    jest-resolve "^24.5.0"
+    jest-runtime "^24.5.0"
+    jest-util "^24.5.0"
+    jest-worker "^24.4.0"
     source-map-support "^0.5.6"
     throat "^4.0.0"
 
-jest-runtime@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.1.0.tgz#7c157a2e776609e8cf552f956a5a19ec9c985214"
-  integrity sha512-59/BY6OCuTXxGeDhEMU7+N33dpMQyXq7MLK07cNSIY/QYt2QZgJ7Tjx+rykBI0skAoigFl0A5tmT8UdwX92YuQ==
-  dependencies:
-    "@babel/core" "^7.1.0"
-    babel-plugin-istanbul "^5.1.0"
+jest-runtime@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.5.0.tgz#3a76e0bfef4db3896d5116e9e518be47ba771aa2"
+  integrity sha512-GTFHzfLdwpaeoDPilNpBrorlPoNZuZrwKKzKJs09vWwHo+9TOsIIuszK8cWOuKC7ss07aN1922Ge8fsGdsqCuw==
+  dependencies:
+    "@jest/console" "^24.3.0"
+    "@jest/environment" "^24.5.0"
+    "@jest/source-map" "^24.3.0"
+    "@jest/transform" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    "@types/yargs" "^12.0.2"
     chalk "^2.0.1"
-    convert-source-map "^1.4.0"
     exit "^0.1.2"
-    fast-json-stable-stringify "^2.0.0"
     glob "^7.1.3"
     graceful-fs "^4.1.15"
-    jest-config "^24.1.0"
-    jest-haste-map "^24.0.0"
-    jest-message-util "^24.0.0"
-    jest-regex-util "^24.0.0"
-    jest-resolve "^24.1.0"
-    jest-snapshot "^24.1.0"
-    jest-util "^24.0.0"
-    jest-validate "^24.0.0"
-    micromatch "^3.1.10"
-    realpath-native "^1.0.0"
+    jest-config "^24.5.0"
+    jest-haste-map "^24.5.0"
+    jest-message-util "^24.5.0"
+    jest-mock "^24.5.0"
+    jest-regex-util "^24.3.0"
+    jest-resolve "^24.5.0"
+    jest-snapshot "^24.5.0"
+    jest-util "^24.5.0"
+    jest-validate "^24.5.0"
+    realpath-native "^1.1.0"
     slash "^2.0.0"
     strip-bom "^3.0.0"
-    write-file-atomic "2.4.1"
     yargs "^12.0.2"
 
-jest-serializer@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.0.0.tgz#522c44a332cdd194d8c0531eb06a1ee5afb4256b"
-  integrity sha512-9FKxQyrFgHtx3ozU+1a8v938ILBE7S8Ko3uiAVjT8Yfi2o91j/fj81jacCQZ/Ihjiff/VsUCXVgQ+iF1XdImOw==
+jest-serializer@^24.4.0:
+  version "24.4.0"
+  resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.4.0.tgz#f70c5918c8ea9235ccb1276d232e459080588db3"
+  integrity sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==
 
-jest-snapshot@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.1.0.tgz#85e22f810357aa5994ab61f236617dc2205f2f5b"
-  integrity sha512-th6TDfFqEmXvuViacU1ikD7xFb7lQsPn2rJl7OEmnfIVpnrx3QNY2t3PE88meeg0u/mQ0nkyvmC05PBqO4USFA==
+jest-snapshot@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.5.0.tgz#e5d224468a759fd19e36f01217aac912f500f779"
+  integrity sha512-eBEeJb5ROk0NcpodmSKnCVgMOo+Qsu5z9EDl3tGffwPzK1yV37mjGWF2YeIz1NkntgTzP+fUL4s09a0+0dpVWA==
   dependencies:
     "@babel/types" "^7.0.0"
+    "@jest/types" "^24.5.0"
     chalk "^2.0.1"
-    jest-diff "^24.0.0"
-    jest-matcher-utils "^24.0.0"
-    jest-message-util "^24.0.0"
-    jest-resolve "^24.1.0"
+    expect "^24.5.0"
+    jest-diff "^24.5.0"
+    jest-matcher-utils "^24.5.0"
+    jest-message-util "^24.5.0"
+    jest-resolve "^24.5.0"
     mkdirp "^0.5.1"
     natural-compare "^1.4.0"
-    pretty-format "^24.0.0"
+    pretty-format "^24.5.0"
     semver "^5.5.0"
 
-jest-util@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.0.0.tgz#fd38fcafd6dedbd0af2944d7a227c0d91b68f7d6"
-  integrity sha512-QxsALc4wguYS7cfjdQSOr5HTkmjzkHgmZvIDkcmPfl1ib8PNV8QUWLwbKefCudWS0PRKioV+VbQ0oCUPC691fQ==
-  dependencies:
+jest-util@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.5.0.tgz#9d9cb06d9dcccc8e7cc76df91b1635025d7baa84"
+  integrity sha512-Xy8JsD0jvBz85K7VsTIQDuY44s+hYJyppAhcsHsOsGisVtdhar6fajf2UOf2mEVEgh15ZSdA0zkCuheN8cbr1Q==
+  dependencies:
+    "@jest/console" "^24.3.0"
+    "@jest/fake-timers" "^24.5.0"
+    "@jest/source-map" "^24.3.0"
+    "@jest/test-result" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    "@types/node" "*"
     callsites "^3.0.0"
     chalk "^2.0.1"
     graceful-fs "^4.1.15"
     is-ci "^2.0.0"
-    jest-message-util "^24.0.0"
     mkdirp "^0.5.1"
     slash "^2.0.0"
     source-map "^0.6.0"
 
-jest-validate@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.0.0.tgz#aa8571a46983a6538328fef20406b4a496b6c020"
-  integrity sha512-vMrKrTOP4BBFIeOWsjpsDgVXATxCspC9S1gqvbJ3Tnn/b9ACsJmteYeVx9830UMV28Cob1RX55x96Qq3Tfad4g==
+jest-validate@^24.0.0, jest-validate@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.5.0.tgz#62fd93d81214c070bb2d7a55f329a79d8057c7de"
+  integrity sha512-gg0dYszxjgK2o11unSIJhkOFZqNRQbWOAB2/LOUdsd2LfD9oXiMeuee8XsT0iRy5EvSccBgB4h/9HRbIo3MHgQ==
   dependencies:
+    "@jest/types" "^24.5.0"
     camelcase "^5.0.0"
     chalk "^2.0.1"
-    jest-get-type "^24.0.0"
+    jest-get-type "^24.3.0"
     leven "^2.1.0"
-    pretty-format "^24.0.0"
+    pretty-format "^24.5.0"
 
-jest-watch-repeat@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/jest-watch-repeat/-/jest-watch-repeat-1.0.0.tgz#e6c5ba103d7aedfe3253167bbbe621a495014e7f"
-  integrity sha512-THLC6dmbgrROOJqmnPq7grNvdS6inG0LHc7lmnGLRiOljO0tU89wAsIbhozcNitmZYaAon+L2BVOeUnvRbb5Aw==
+jest-watch-repeat@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/jest-watch-repeat/-/jest-watch-repeat-1.0.1.tgz#59fe93dd0f3d280faf1dfd3bf66d8a501e7da254"
+  integrity sha512-pYbYmYcrrfzcVXiQ0Q3QvPQ2bWTjZnwz1AqpredvZIkM+7IzmeuBa3dAbikT3s6anVkTqt0Kjg34jgoX73O04A==
   dependencies:
     ansi-escapes "^3.1.0"
     chalk "^2.4.1"
     jest-watcher "^23.4.0"
-    unpartial "^0.4.1"
+    unpartial "^0.5.0"
 
 jest-watch-suspend@^1.1.1:
   version "1.1.1"
@@ -2421,31 +2699,36 @@ jest-watcher@^23.4.0:
     chalk "^2.0.1"
     string-length "^2.0.0"
 
-jest-watcher@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.0.0.tgz#20d44244d10b0b7312410aefd256c1c1eef68890"
-  integrity sha512-GxkW2QrZ4YxmW1GUWER05McjVDunBlKMFfExu+VsGmXJmpej1saTEKvONdx5RJBlVdpPI5x6E3+EDQSIGgl53g==
+jest-watcher@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.5.0.tgz#da7bd9cb5967e274889b42078c8f501ae1c47761"
+  integrity sha512-/hCpgR6bg0nKvD3nv4KasdTxuhwfViVMHUATJlnGCD0r1QrmIssimPbmc5KfAQblAVxkD8xrzuij9vfPUk1/rA==
   dependencies:
+    "@jest/test-result" "^24.5.0"
+    "@jest/types" "^24.5.0"
+    "@types/node" "*"
+    "@types/yargs" "^12.0.9"
     ansi-escapes "^3.0.0"
     chalk "^2.0.1"
-    jest-util "^24.0.0"
+    jest-util "^24.5.0"
     string-length "^2.0.0"
 
-jest-worker@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.0.0.tgz#3d3483b077bf04f412f47654a27bba7e947f8b6d"
-  integrity sha512-s64/OThpfQvoCeHG963MiEZOAAxu8kHsaL/rCMF7lpdzo7vgF0CtPml9hfguOMgykgH/eOm4jFP4ibfHLruytg==
+jest-worker@^24.4.0:
+  version "24.4.0"
+  resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.4.0.tgz#fbc452b0120bb5c2a70cdc88fa132b48eeb11dd0"
+  integrity sha512-BH9X/klG9vxwoO99ZBUbZFfV8qO0XNZ5SIiCyYK2zOuJBl6YJVAeNIQjcoOVNu4HGEHeYEKsUWws8kSlSbZ9YQ==
   dependencies:
+    "@types/node" "*"
     merge-stream "^1.0.1"
     supports-color "^6.1.0"
 
 jest@^24.1.0:
-  version "24.1.0"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-24.1.0.tgz#b1e1135caefcf2397950ecf7f90e395fde866fd2"
-  integrity sha512-+q91L65kypqklvlRFfXfdzUKyngQLOcwGhXQaLmVHv+d09LkNXuBuGxlofTFW42XMzu3giIcChchTsCNUjQ78A==
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-24.5.0.tgz#38f11ae2c2baa2f86c2bc4d8a91d2b51612cd19a"
+  integrity sha512-lxL+Fq5/RH7inxxmfS2aZLCf8MsS+YCUBfeiNO6BWz/MmjhDGaIEA/2bzEf9q4Q0X+mtFHiinHFvQ0u+RvW/qQ==
   dependencies:
     import-local "^2.0.0"
-    jest-cli "^24.1.0"
+    jest-cli "^24.5.0"
 
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
@@ -2458,9 +2741,9 @@ js-tokens@^3.0.2:
   integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
 
 js-yaml@^3.12.0, js-yaml@^3.7.0:
-  version "3.12.1"
-  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600"
-  integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==
+  version "3.12.2"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc"
+  integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==
   dependencies:
     argparse "^1.0.7"
     esprima "^4.0.0"
@@ -2621,7 +2904,7 @@ locate-path@^3.0.0:
     p-locate "^3.0.0"
     path-exists "^3.0.0"
 
-lodash.merge@^4.6.0:
+lodash.merge@^4.6.0, lodash.merge@^4.6.1:
   version "4.6.1"
   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54"
   integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==
@@ -2631,7 +2914,7 @@ lodash.sortby@^4.7.0:
   resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
   integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
 
-lodash@^4.17.10, lodash@^4.17.11:
+lodash@^4.17.11:
   version "4.17.11"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
   integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
@@ -2682,12 +2965,12 @@ map-visit@^1.0.0:
     object-visit "^1.0.0"
 
 mem@^4.0.0:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/mem/-/mem-4.1.0.tgz#aeb9be2d21f47e78af29e4ac5978e8afa2ca5b8a"
-  integrity sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/mem/-/mem-4.2.0.tgz#5ee057680ed9cb8dad8a78d820f9a8897a102025"
+  integrity sha512-5fJxa68urlY0Ir8ijatKa3eRz5lwXnRCTvo9+TbTGAuTFJOwpGcY0X05moBd0nW45965Njt4CDI2GFQoG8DvqA==
   dependencies:
     map-age-cleaner "^0.1.1"
-    mimic-fn "^1.0.0"
+    mimic-fn "^2.0.0"
     p-is-promise "^2.0.0"
 
 merge-stream@^1.0.1:
@@ -2702,11 +2985,6 @@ merge2@^1.2.3:
   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5"
   integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==
 
-merge@^1.2.0:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145"
-  integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==
-
 micromatch@^3.1.10, micromatch@^3.1.4:
   version "3.1.10"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -2743,6 +3021,11 @@ mimic-fn@^1.0.0:
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
   integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
 
+mimic-fn@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.0.0.tgz#0913ff0b121db44ef5848242c38bbb35d44cabde"
+  integrity sha512-jbex9Yd/3lmICXwYT6gA/j2mNQGU48wCh/VzRd+/Y/PjYQtlg1gLMdZqvu9s/xH7qKvngxRObl56XZR609IMbA==
+
 minimatch@^3.0.3, minimatch@^3.0.4:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
@@ -2851,6 +3134,11 @@ nice-try@^1.0.4:
   resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
   integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
 
+node-fetch@^2.2.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5"
+  integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==
+
 node-int64@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
@@ -2924,9 +3212,9 @@ npm-bundled@^1.0.1:
   integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==
 
 npm-packlist@^1.1.6:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.3.0.tgz#7f01e8e44408341379ca98cfd756e7b29bd2626c"
-  integrity sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA==
+  version "1.4.1"
+  resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc"
+  integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==
   dependencies:
     ignore-walk "^3.0.1"
     npm-bundled "^1.0.1"
@@ -2954,9 +3242,9 @@ number-is-nan@^1.0.0:
   integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
 
 nwsapi@^2.0.7:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.0.tgz#781065940aed90d9bb01ca5d0ce0fcf81c32712f"
-  integrity sha512-ZG3bLAvdHmhIjaQ/Db1qvBxsGvFMLIRpQszyqbg31VJ53UP++uZX1/gf3Ut96pdwN9AuDwlMqIYLm0UPCdUeHg==
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.1.1.tgz#08d6d75e69fd791bdea31507ffafe8c843b67e9c"
+  integrity sha512-T5GaA1J/d34AC8mkrFD2O0DR17kwJ702ZOtJOsS8RpbsQZVOC2/xYFb1i/cw+xdM54JIlMuojjDOYct8GIWtwg==
 
 oauth-sign@~0.9.0:
   version "0.9.0"
@@ -3088,9 +3376,9 @@ p-is-promise@^2.0.0:
   integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==
 
 p-limit@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.1.0.tgz#1d5a0d20fb12707c758a655f6bbc4386b5930d68"
-  integrity sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2"
+  integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==
   dependencies:
     p-try "^2.0.0"
 
@@ -3188,10 +3476,10 @@ pify@^3.0.0:
   resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
   integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
 
-pirates@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd"
-  integrity sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==
+pirates@^4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
+  integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
   dependencies:
     node-modules-regexp "^1.0.0"
 
@@ -3323,13 +3611,15 @@ prelude-ls@~1.1.2:
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
   integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
 
-pretty-format@^24.0.0:
-  version "24.0.0"
-  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.0.0.tgz#cb6599fd73ac088e37ed682f61291e4678f48591"
-  integrity sha512-LszZaKG665djUcqg5ZQq+XzezHLKrxsA86ZABTozp+oNhkdqa+tG2dX4qa6ERl5c/sRDrAa3lHmwnvKoP+OG/g==
+pretty-format@^24.5.0:
+  version "24.5.0"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.5.0.tgz#cc69a0281a62cd7242633fc135d6930cd889822d"
+  integrity sha512-/3RuSghukCf8Riu5Ncve0iI+BzVkbRU5EeUoArKARZobREycuH5O4waxvaNIloEXdb0qwgmEAed5vTpX1HNROQ==
   dependencies:
+    "@jest/types" "^24.5.0"
     ansi-regex "^4.0.0"
     ansi-styles "^3.2.0"
+    react-is "^16.8.4"
 
 process-nextick-args@~2.0.0:
   version "2.0.0"
@@ -3342,9 +3632,9 @@ progress@^2.0.0:
   integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
 prompts@^2.0.1:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.2.tgz#094119b0b0a553ec652908b583205b9867630154"
-  integrity sha512-Pc/c53d2WZHJWZr78/BhZ5eHsdQtltbyBjHoA4T0cs/4yKJqCcoOHrq2SNKwtspVE0C+ebqAR5u0/mXwrHaADQ==
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.0.3.tgz#c5ccb324010b2e8f74752aadceeb57134c1d2522"
+  integrity sha512-H8oWEoRZpybm6NV4to9/1limhttEo13xK62pNvn2JzY0MA03p7s0OjtmhXyon3uJmxiJJVSuUwEJFFssI3eBiQ==
   dependencies:
     kleur "^3.0.2"
     sisteransi "^1.0.0"
@@ -3387,6 +3677,11 @@ rc@^1.2.7, rc@^1.2.8:
     minimist "^1.2.0"
     strip-json-comments "~2.0.1"
 
+react-is@^16.8.4:
+  version "16.8.4"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.4.tgz#90f336a68c3a29a096a3d648ab80e87ec61482a2"
+  integrity sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==
+
 read-package-json@^2.0.10:
   version "2.0.13"
   resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.13.tgz#2e82ebd9f613baa6d2ebe3aa72cefe3f68e41f4a"
@@ -3438,7 +3733,7 @@ readdirp@^2.2.1:
     micromatch "^3.1.10"
     readable-stream "^2.0.2"
 
-realpath-native@^1.0.0, realpath-native@^1.0.2:
+realpath-native@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
   integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==
@@ -3615,22 +3910,20 @@ safe-regex@^1.1.0:
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
-sane@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/sane/-/sane-3.1.0.tgz#995193b7dc1445ef1fe41ddfca2faf9f111854c6"
-  integrity sha512-G5GClRRxT1cELXfdAq7UKtUsv8q/ZC5k8lQGmjEm4HcAl3HzBy68iglyNCmw4+0tiXPCBZntslHlRhbnsSws+Q==
+sane@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/sane/-/sane-4.0.3.tgz#e878c3f19e25cc57fbb734602f48f8a97818b181"
+  integrity sha512-hSLkC+cPHiBQs7LSyXkotC3UUtyn8C4FMn50TNaacRyvBlI+3ebcxMpqckmTdtXVtel87YS7GXN3UIOj7NiGVQ==
   dependencies:
+    "@cnakazawa/watch" "^1.0.3"
     anymatch "^2.0.0"
     capture-exit "^1.2.0"
-    exec-sh "^0.2.0"
+    exec-sh "^0.3.2"
     execa "^1.0.0"
     fb-watchman "^2.0.0"
     micromatch "^3.1.4"
     minimist "^1.1.1"
     walker "~1.0.5"
-    watch "~0.18.0"
-  optionalDependencies:
-    fsevents "^1.2.3"
 
 satisfier@^4.5.1:
   version "4.5.1"
@@ -3762,9 +4055,9 @@ source-map-resolve@^0.5.0:
     urix "^0.1.0"
 
 source-map-support@^0.5.6:
-  version "0.5.10"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c"
-  integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==
+  version "0.5.11"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.11.tgz#efac2ce0800355d026326a0ca23e162aeac9a4e2"
+  integrity sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==
   dependencies:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
@@ -3881,13 +4174,13 @@ string-width@^1.0.1:
     strip-ansi "^4.0.0"
 
 string-width@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.0.0.tgz#5a1690a57cc78211fffd9bf24bbe24d090604eb1"
-  integrity sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew==
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+  integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
   dependencies:
     emoji-regex "^7.0.1"
     is-fullwidth-code-point "^2.0.0"
-    strip-ansi "^5.0.0"
+    strip-ansi "^5.1.0"
 
 string_decoder@~1.1.1:
   version "1.1.1"
@@ -3919,12 +4212,12 @@ strip-ansi@^4.0.0:
   dependencies:
     ansi-regex "^3.0.0"
 
-strip-ansi@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f"
-  integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==
+strip-ansi@^5.0.0, strip-ansi@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.1.0.tgz#55aaa54e33b4c0649a7338a43437b1887d153ec4"
+  integrity sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==
   dependencies:
-    ansi-regex "^4.0.0"
+    ansi-regex "^4.1.0"
 
 strip-bom@^3.0.0:
   version "3.0.0"
@@ -3988,6 +4281,15 @@ tar@^4:
     safe-buffer "^5.1.2"
     yallist "^3.0.2"
 
+teeny-request@^3.7.0:
+  version "3.11.3"
+  resolved "https://registry.yarnpkg.com/teeny-request/-/teeny-request-3.11.3.tgz#335c629f7645e5d6599362df2f3230c4cbc23a55"
+  integrity sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw==
+  dependencies:
+    https-proxy-agent "^2.2.1"
+    node-fetch "^2.2.0"
+    uuid "^3.3.2"
+
 tersify@^1.2.6:
   version "1.2.6"
   resolved "https://registry.yarnpkg.com/tersify/-/tersify-1.2.6.tgz#05788b03504b78198a329119cbb14d02fd248f80"
@@ -3995,6 +4297,15 @@ tersify@^1.2.6:
   dependencies:
     unpartial "^0.4.1"
 
+tersify@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/tersify/-/tersify-2.0.2.tgz#2f644deffc3ca040443881325f2fb84306f16b8a"
+  integrity sha512-XKEDtyDG4JhHsWuV1PUed6XZ1R/0jrN95fPv+fvh3cB9kQJCS3ApcrGgbZ55lC5Vxh4+tVWmydyJ4X8af46/kQ==
+  dependencies:
+    acorn "^6.1.1"
+    acorn-bigint "^0.3.1"
+    unpartial "^0.5.0"
+
 test-exclude@^5.0.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.1.0.tgz#6ba6b25179d2d38724824661323b73e03c0c1de1"
@@ -4106,10 +4417,10 @@ trim-right@^1.0.1:
   resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
   integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
 
-ts-jest@^23.10.5:
-  version "23.10.5"
-  resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.5.tgz#cdb550df4466a30489bf70ba867615799f388dd5"
-  integrity sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A==
+ts-jest@^24.0.0:
+  version "24.0.0"
+  resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-24.0.0.tgz#3f26bf2ec1fa584863a5a9c29bd8717d549efbf6"
+  integrity sha512-o8BO3TkMREpAATaFTrXkovMsCpBl2z4NDBoLJuWZcJJj1ijI49UnvDMfVpj+iogn/Jl8Pbhuei5nc/Ti+frEHw==
   dependencies:
     bs-logger "0.x"
     buffer-from "1.x"
@@ -4156,10 +4467,10 @@ tslint-eslint-rules@^5.3.1, tslint-eslint-rules@^5.4.0:
     tslib "1.9.0"
     tsutils "^3.0.0"
 
-tslint@^5.12.1:
-  version "5.12.1"
-  resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.12.1.tgz#8cec9d454cf8a1de9b0a26d7bdbad6de362e52c1"
-  integrity sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==
+tslint@^5.13.0:
+  version "5.14.0"
+  resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.14.0.tgz#be62637135ac244fc9b37ed6ea5252c9eba1616e"
+  integrity sha512-IUla/ieHVnB8Le7LdQFRGlVJid2T/gaJe5VkjzRVSRR6pA2ODYrnfR1hmxi+5+au9l50jBwpbBL34txgv4NnTQ==
   dependencies:
     babel-code-frame "^6.22.0"
     builtin-modules "^1.1.1"
@@ -4169,12 +4480,13 @@ tslint@^5.12.1:
     glob "^7.1.1"
     js-yaml "^3.7.0"
     minimatch "^3.0.4"
+    mkdirp "^0.5.1"
     resolve "^1.3.2"
     semver "^5.3.0"
     tslib "^1.8.0"
-    tsutils "^2.27.2"
+    tsutils "^2.29.0"
 
-tsutils@^2.27.2:
+tsutils@^2.29.0:
   version "2.29.0"
   resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
   integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
@@ -4182,9 +4494,9 @@ tsutils@^2.27.2:
     tslib "^1.8.1"
 
 tsutils@^3.0.0:
-  version "3.8.0"
-  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.8.0.tgz#7a3dbadc88e465596440622b65c04edc8e187ae5"
-  integrity sha512-XQdPhgcoTbCD8baXC38PQ0vpTZ8T3YrE+vR66YIj/xvDt1//8iAhafpIT/4DmvzzC1QFapEImERu48Pa01dIUA==
+  version "3.9.1"
+  resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.9.1.tgz#2a40dc742943c71eca6d5c1994fcf999956be387"
+  integrity sha512-hrxVtLtPqQr//p8/msPT1X1UYXUjizqSit5d9AQ5k38TcV38NyecL5xODNxa73cLe/5sdiJ+w1FqzDhRBA/anA==
   dependencies:
     tslib "^1.8.1"
 
@@ -4212,10 +4524,15 @@ type-name@^2.0.1:
   resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4"
   integrity sha1-7+fUEj2KxSr/9/QMfk3sUmYAj7Q=
 
-typescript@^3.3.3:
-  version "3.3.3"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3.tgz#f1657fc7daa27e1a8930758ace9ae8da31403221"
-  integrity sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==
+type-plus@^1.15.1:
+  version "1.15.1"
+  resolved "https://registry.yarnpkg.com/type-plus/-/type-plus-1.15.1.tgz#d8f785931b2a15d7a5fcde960af3f003a357e77c"
+  integrity sha512-8hqd44R5HmvOPwJvRjkA8ySTdbzKvrXWxkmMswtIGykXjKlz1pVG+VshVlVpm4tPUdteb0hgGbt8cq+Rbn/juw==
+
+typescript@^3.3.3333:
+  version "3.3.3333"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6"
+  integrity sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw==
 
 uglify-js@^3.1.4:
   version "3.4.9"
@@ -4256,6 +4573,13 @@ unpartial@^0.4.1:
   dependencies:
     lodash.merge "^4.6.0"
 
+unpartial@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/unpartial/-/unpartial-0.5.0.tgz#cac838d3046ee4ea06fe24d4f5d4b9244d2145e8"
+  integrity sha512-tJ/eRbNpm00VlQdMi344Q9tM30BACC203HFRT8yksdx+MIXTVS5m9JpAJUOhFWqOU2c/iZzOS3CcEmdc2zh/1Q==
+  dependencies:
+    lodash.merge "^4.6.1"
+
 unset-value@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
@@ -4265,9 +4589,9 @@ unset-value@^1.0.0:
     isobject "^3.0.0"
 
 upath@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
-  integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
+  integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==
 
 uri-js@^4.2.2:
   version "4.2.2"
@@ -4281,6 +4605,11 @@ urix@^0.1.0:
   resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
   integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
 
+urlgrey@^0.4.4:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.4.tgz#892fe95960805e85519f1cd4389f2cb4cbb7652f"
+  integrity sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=
+
 use@^3.1.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
@@ -4335,14 +4664,6 @@ walker@~1.0.5:
   dependencies:
     makeerror "1.0.x"
 
-watch@~0.18.0:
-  version "0.18.0"
-  resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986"
-  integrity sha1-KAlUdsbffJDJYxOJkMClQj60uYY=
-  dependencies:
-    exec-sh "^0.2.0"
-    minimist "^1.2.0"
-
 webidl-conversions@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
@@ -4383,7 +4704,7 @@ which-module@^2.0.0:
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
   integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
 
-which@^1.2.12, which@^1.2.9, which@^1.3.0:
+which@^1.2.9, which@^1.3.0:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
   integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -4448,6 +4769,11 @@ xml-name-validator@^3.0.0:
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
   integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
 
+xml@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5"
+  integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=
+
 xtend@^4.0.0, xtend@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"