diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
index 626203fe..a4848a2b 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.md
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -7,7 +7,14 @@ assignees: ''
---
-**Note: Make sure to check out known issues (https://github.com/sparebankenvest/azure-key-vault-to-kubernetes#known-issues) before submitting**
+**Note: Make sure to check out known issues (https://akv2k8s.io/troubleshooting/known-issues/) before submitting**
+
+**Components and versions**
+Select which component(s) the bug relates to with [X].
+
+[ ] Controller, version: `x.x.x` (docker image tag)
+[ ] Env-Injector (webhook), version: `x.x.x` (docker image tag)
+[ ] Other
**Describe the bug**
A clear and concise description of what the bug is.
@@ -21,5 +28,9 @@ A clear and concise description of what you expected to happen.
**Logs**
If applicable, add logs to help explain your problem.
+```
+paste log here...
+```
+
**Additional context**
Add any other context about the problem here.
diff --git a/.github/actions/build/action.yaml b/.github/actions/build/action.yaml
new file mode 100644
index 00000000..247a31f6
--- /dev/null
+++ b/.github/actions/build/action.yaml
@@ -0,0 +1,17 @@
+name: 'Build'
+description: 'Build Go packages'
+inputs:
+ build-make-action:
+ description: 'Action in makefile to build package'
+ required: true
+
+runs:
+ using: "composite"
+ steps:
+ - name: Test
+ run: make test
+ shell: bash
+
+ - name: Build docker image
+ run: make ${{ inputs.build-make-action }}
+ shell: bash
\ No newline at end of file
diff --git a/.github/actions/push/action.yaml b/.github/actions/push/action.yaml
new file mode 100644
index 00000000..6b1064cf
--- /dev/null
+++ b/.github/actions/push/action.yaml
@@ -0,0 +1,21 @@
+name: 'Push'
+description: 'Push containers to Docker registry'
+inputs:
+ push-make-action:
+ description: 'Action in makefile to push package to docker repo'
+ required: true
+ docker-user:
+ description: 'Username to authenticate with docker repository'
+ required: true
+ docker-passw:
+ description: 'Password to authenticate with docker repository'
+ required: true
+
+runs:
+ using: "composite"
+ steps:
+ - name: Push images to private repo
+ run: |
+ echo "${{ inputs.docker-passw}}" | docker login -u ${{ inputs.docker-user }} --password-stdin dokken.azurecr.io
+ make ${{ inputs.push-make-action }}
+ shell: bash
diff --git a/.github/workflows/build-push.yaml b/.github/workflows/build-push.yaml
deleted file mode 100644
index 939edd32..00000000
--- a/.github/workflows/build-push.yaml
+++ /dev/null
@@ -1,80 +0,0 @@
-name: build
-
-on:
- push:
- branches:
- - master
- paths:
- - '.github/workflows/**'
- - 'Makefile'
- - 'go.mod'
- - 'go.sum'
- - 'cmd/**'
- - 'pkg/**'
- - '!docs/**'
-
-jobs:
- build-deploy:
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@master
-
- - name: Setup Golang
- uses: actions/setup-go@v1
- with:
- go-version: '1.13.4'
-
- - name: Test
- run: make test
-
- - name: Build docker images
- run: make build
-
- # - name: Setup Kind
- # uses: engineerd/setup-kind@v0.3.0
- # with:
- # image: "kindest/node:v1.13.7"
-
- # - name: Load images into Kind
- # run: |
- # kind load docker-image dokken.azurecr.io/azure-keyvault-webhook:${GITHUB_REF##*/}
- # kind load docker-image dokken.azurecr.io/azure-keyvault-env:${GITHUB_REF##*/}
-
- # - name: Deploy to Kubernetes cluster
- # run: |
- # kubectl create ns akv2k8s
- # HELM_V3=3.0.2
- # echo "downloading helm ${HELM_V3}"
- # curl -sSL https://get.helm.sh/helm-v${HELM_V3}-linux-amd64.tar.gz | tar xz
- # ./linux-amd64/helm version
- # ./linux-amd64/helm repo add spv-charts http://charts.spvapi.no
- # ./linux-amd64/helm repo update
- # ./linux-amd64/helm upgrade --install azure-key-vault-env-injector spv-charts/azure-key-vault-env-injector \
- # --namespace akv2k8s \
- # --set keyVault.customAuth.enabled=true \
- # --set env.AZURE_TENANT_ID=${{secrets.AKV_TEST_TENANT_ID}} \
- # --set env.AZURE_CLIENT_ID=${{secrets.AKV_TEST_CLIENT_ID}} \
- # --set env.AZURE_CLIENT_SECRET=${{secrets.AKV_TEST_CLIENT_SECRET}} \
- # --set installCrd=true \
- # --set envImage.repository=dokken.azurecr.io/azure-keyvault-env \
- # --set envImage.tag=${GITHUB_REF##*/} \
- # --set image.repository=dokken.azurecr.io/azure-keyvault-webhook \
- # --set image.tag=${GITHUB_REF##*/} \
- # --version 1.1.0-beta.19 \
- # --wait
-
- # - name: Test env-injection
- # run: |
- # kubectl apply -R -f ./int-tests/
-
-
- - name: Push images to public repo
- run: |
- docker login -u ${{secrets.PUBLIC_REGISTRY_USERNAME}} -p ${{secrets.PUBLIC_REGISTRY_PASSWORD}}
- make release DOCKER_RELEASE_TAG=${GITHUB_REF##*/}
-
- - name: Push images to private repo
- run: |
- docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io
- make push
-
\ No newline at end of file
diff --git a/.github/workflows/controller-build.yaml b/.github/workflows/controller-build.yaml
new file mode 100644
index 00000000..4bb2450d
--- /dev/null
+++ b/.github/workflows/controller-build.yaml
@@ -0,0 +1,46 @@
+name: Build Controller
+
+on:
+ push:
+ branches:
+ - master
+ - '*-patch'
+ paths:
+ - '.github/workflows/controller-build.yaml'
+ - '.github/actions/**'
+ - 'Dockerfile'
+ - 'Makefile'
+ - 'go.mod'
+ - 'go.sum'
+ - 'cmd/azure-keyvault-controller/**'
+ - 'pkg/**'
+ - '!docs/**'
+ - '!crds/**'
+
+jobs:
+ build-deploy:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@master
+
+ - name: Setup Golang
+ uses: actions/setup-go@v1
+ with:
+ go-version: '1.13.4'
+
+ - name: Build
+ uses: ./.github/actions/build
+ env:
+ AKV2K8S_CLIENT_ID: ${{ secrets.INT_TEST_CLIENT_ID }}
+ AKV2K8S_CLIENT_SECRET: ${{ secrets.INT_TEST_CLIENT_SECRET }}
+ AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }}
+ AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }}
+ with:
+ build-make-action: image-controller
+
+ - name: Push
+ uses: ./.github/actions/push
+ with:
+ push-make-action: push-controller
+ docker-user: ${{ secrets.PRIVATE_REGISTRY_USERNAME }}
+ docker-passw: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }}
diff --git a/.github/workflows/controller-release.yaml b/.github/workflows/controller-release.yaml
new file mode 100644
index 00000000..92e88ef1
--- /dev/null
+++ b/.github/workflows/controller-release.yaml
@@ -0,0 +1,26 @@
+name: Release Controller
+
+on:
+ push:
+ tags:
+ - 'controller-[0-9]+.[0-9]+.[0-9]+**'
+
+jobs:
+ build-deploy:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@master
+
+ - name: Version
+ run: make print-v-controller
+
+ - name: Pull images from private repo
+ run: |
+ echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io
+ make pull-controller
+
+ - name: Push images to public repo
+ run: |
+ echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin
+ make release-controller DOCKER_RELEASE_TAG=${GITHUB_REF##*/}
+
\ No newline at end of file
diff --git a/.github/workflows/publish-docs.yaml b/.github/workflows/publish-docs.yaml
deleted file mode 100644
index 484c34b5..00000000
--- a/.github/workflows/publish-docs.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-name: publish docs
-
-on:
- push:
- branches:
- - master
- paths:
- - 'docs/**'
-
-jobs:
- build-deploy-docs:
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@master
-
- - name: Setup Node
- uses: actions/setup-node@v1
- with:
- node-version: '10.x'
-
- - name: Cache dependencies
- uses: actions/cache@v1
- with:
- path: ~/.npm
- key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
- restore-keys: |
- ${{ runner.os }}-node-
-
- - name: Build
- env:
- GATSBY_ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}
- GATSBY_ALGOLIA_SEARCH_KEY: ${{ secrets.ALGOLIA_SEARCH_KEY }}
- ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }}
- run: |
- cd docs
- npm i
- npm run build
-
- - name: Deploy
- uses: peaceiris/actions-gh-pages@v2.5.0
- env:
- ACTIONS_DEPLOY_KEY: ${{ secrets.ACTIONS_DEPLOY_KEY }}
- PUBLISH_BRANCH: gh-pages
- PUBLISH_DIR: ./docs/public
\ No newline at end of file
diff --git a/.github/workflows/pull-request.yaml b/.github/workflows/pull-request.yaml
new file mode 100644
index 00000000..71146ee1
--- /dev/null
+++ b/.github/workflows/pull-request.yaml
@@ -0,0 +1,30 @@
+name: pull request
+
+on:
+ pull_request:
+ paths:
+ - '.github/workflows/**'
+ - 'Makefile'
+ - 'go.mod'
+ - 'go.sum'
+ - 'cmd/**'
+ - 'pkg/**'
+ - '!docs/**'
+ - '!crds/**'
+
+jobs:
+ build-deploy:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@master
+
+ - name: Setup Golang
+ uses: actions/setup-go@v1
+ with:
+ go-version: '1.13.4'
+
+ - name: Test
+ run: make test
+
+ - name: Build docker images
+ run: make build
\ No newline at end of file
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
deleted file mode 100644
index 51a6a5b5..00000000
--- a/.github/workflows/release.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-name: public release
-
-on:
- push:
- tags:
- - '[0-9]+.[0-9]+.[0-9]+**'
-
-jobs:
- build-deploy:
- runs-on: ubuntu-18.04
- steps:
- - uses: actions/checkout@master
-
- - name: Pull images from private repo
- run: |
- docker login -u ${{secrets.PRIVATE_REGISTRY_USERNAME}} -p ${{secrets.PRIVATE_REGISTRY_PASSWORD}} dokken.azurecr.io
- make pull-release
-
- - name: Push images to public repo
- run: |
- docker login -u ${{secrets.PUBLIC_REGISTRY_USERNAME}} -p ${{secrets.PUBLIC_REGISTRY_PASSWORD}}
- make release DOCKER_RELEASE_TAG=${GITHUB_REF##*/}
-
\ No newline at end of file
diff --git a/.github/workflows/vaultenv-build.yaml b/.github/workflows/vaultenv-build.yaml
new file mode 100644
index 00000000..0136cea5
--- /dev/null
+++ b/.github/workflows/vaultenv-build.yaml
@@ -0,0 +1,46 @@
+name: Build Vault Env
+
+on:
+ push:
+ branches:
+ - master
+ - '*-patch'
+ paths:
+ - '.github/workflows/vaultenv-build.yaml'
+ - '.github/actions/**'
+ - 'Dockerfile'
+ - 'Makefile'
+ - 'go.mod'
+ - 'go.sum'
+ - 'cmd/azure-keyvault-env/**'
+ - 'pkg/**'
+ - '!docs/**'
+ - '!crds/**'
+
+jobs:
+ build-deploy:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@master
+
+ - name: Setup Golang
+ uses: actions/setup-go@v1
+ with:
+ go-version: '1.13.4'
+
+ - name: Build
+ uses: ./.github/actions/build
+ env:
+ AKV2K8S_CLIENT_ID: ${{ secrets.INT_TEST_CLIENT_ID }}
+ AKV2K8S_CLIENT_SECRET: ${{ secrets.INT_TEST_CLIENT_SECRET }}
+ AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }}
+ AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }}
+ with:
+ build-make-action: image-vaultenv
+
+ - name: Push
+ uses: ./.github/actions/push
+ with:
+ push-make-action: push-vaultenv
+ docker-user: ${{ secrets.PRIVATE_REGISTRY_USERNAME }}
+ docker-passw: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }}
diff --git a/.github/workflows/vaultenv-release.yaml b/.github/workflows/vaultenv-release.yaml
new file mode 100644
index 00000000..c5c6a00f
--- /dev/null
+++ b/.github/workflows/vaultenv-release.yaml
@@ -0,0 +1,26 @@
+name: Release VaultEnv
+
+on:
+ push:
+ tags:
+ - 'vaultenv-[0-9]+.[0-9]+.[0-9]+**'
+
+jobs:
+ build-deploy:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@master
+
+ - name: Version
+ run: make print-v-vaultenv
+
+ - name: Pull images from private repo
+ run: |
+ echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io
+ make pull-vaultenv
+
+ - name: Push images to public repo
+ run: |
+ echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin
+ make release-vaultenv DOCKER_RELEASE_TAG=${GITHUB_REF##*/}
+
\ No newline at end of file
diff --git a/.github/workflows/webhook-build.yaml b/.github/workflows/webhook-build.yaml
new file mode 100644
index 00000000..a80b2d7b
--- /dev/null
+++ b/.github/workflows/webhook-build.yaml
@@ -0,0 +1,46 @@
+name: Build WebHook
+
+on:
+ push:
+ branches:
+ - master
+ - '*-patch'
+ paths:
+ - '.github/workflows/webhook-build.yaml'
+ - '.github/actions/**'
+ - 'Dockerfile'
+ - 'Makefile'
+ - 'go.mod'
+ - 'go.sum'
+ - 'cmd/azure-keyvault-secrets-webhook/**'
+ - 'pkg/**'
+ - '!docs/**'
+ - '!crds/**'
+
+jobs:
+ build-deploy:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@master
+
+ - name: Setup Golang
+ uses: actions/setup-go@v1
+ with:
+ go-version: '1.13.4'
+
+ - name: Build
+ uses: ./.github/actions/build
+ env:
+ AKV2K8S_CLIENT_ID: ${{ secrets.INT_TEST_CLIENT_ID }}
+ AKV2K8S_CLIENT_SECRET: ${{ secrets.INT_TEST_CLIENT_SECRET }}
+ AKV2K8S_CLIENT_TENANT_ID: ${{ secrets.INT_TEST_TENANT_ID }}
+ AKV2K8S_AZURE_SUBSCRIPTION: ${{ secrets.INT_TEST_SUBSCRIPTION }}
+ with:
+ build-make-action: image-webhook
+
+ - name: Push
+ uses: ./.github/actions/push
+ with:
+ push-make-action: push-webhook
+ docker-user: ${{ secrets.PRIVATE_REGISTRY_USERNAME }}
+ docker-passw: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }}
diff --git a/.github/workflows/webhook-release.yaml b/.github/workflows/webhook-release.yaml
new file mode 100644
index 00000000..7f746c0a
--- /dev/null
+++ b/.github/workflows/webhook-release.yaml
@@ -0,0 +1,26 @@
+name: Release Webhook
+
+on:
+ push:
+ tags:
+ - 'webhook-[0-9]+.[0-9]+.[0-9]+**'
+
+jobs:
+ build-deploy:
+ runs-on: ubuntu-18.04
+ steps:
+ - uses: actions/checkout@master
+
+ - name: Version
+ run: make print-v-webhook
+
+ - name: Pull image from private repo
+ run: |
+ echo "${{ secrets.PRIVATE_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PRIVATE_REGISTRY_USERNAME }} --password-stdin dokken.azurecr.io
+ make pull-webhook
+
+ - name: Push image to public repo
+ run: |
+ echo "${{ secrets.PUBLIC_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.PUBLIC_REGISTRY_USERNAME }} --password-stdin
+ make release-webhook DOCKER_RELEASE_TAG=${GITHUB_REF##*/}
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index c85f3f3c..f37fe8b7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,4 +2,8 @@ bin
debug.test
.vscode
/vendor/
-*.tmp
\ No newline at end of file
+/tmp/
+/.tools/
+*.tmp
+test.yaml
+coverage.txt
\ No newline at end of file
diff --git a/CHANGELOG-1.0.md b/CHANGELOG-1.0.md
new file mode 100644
index 00000000..b4765bff
--- /dev/null
+++ b/CHANGELOG-1.0.md
@@ -0,0 +1,37 @@
+# Changelog for Version 1.0
+
+## Version 1.0.2
+
+Unfortunately we had to patch away the functionality in the env-injector for removing sensitive files. The previous implementation caused issues if a pod crashed after initial startup and was unable to recover (because the filles needed where no longer present). We are currently working on a better and more secure solution, which will be released as soon as we can.
+
+### Chart and Image versions
+
+We have bumped all versions, but only the env-injector has changed.
+
+| Type | Component | Version |
+| ------------ | ---------------------------------- | -----------------------------|
+| Helm Chart | [azure-key-vault-controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller) | 1.0.2 |
+| Helm Chart | [azure-key-vault-env-injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector) | 1.0.2 |
+| Docker Image | spvest/azure-keyvault-controller | 1.0.2 |
+| Docker Image | spvest/azure-keyvault-webhook | 1.0.2 |
+| Docker Image | spvest/azure-keyvault-env | 1.0.2 |
+
+
+## Version 1.0.0
+
+### Added
+
+* [docs] New documentation portal at https://akv2k8s.io
+* [env-injector] Improved logging
+* [env-injector] Prometheus metrics
+* [env-injector] Retry (up to 3 times) if fail to access AzureKeyVaultSecret on first try (ref: #34 )
+* [env-injector] Support getting raw certificate (`?raw`)
+* [controller & env-injector] Support all Azure environments (public, china, german, us-gov) - thanks @mayong43111 ❗️
+
+### Changed
+
+* [env-injector] Custom authentication
+* [env-injector] Delete sensitive files
+* [env-injector] Not map host volume for azure.json when using custom auth
+* [env-injector] Canonical names for Docker images
+* [controller] Use optional param for --cloudconfig (was hardcoded) - thanks @reiniertimmer ❗️
diff --git a/CHANGELOG-1.1.md b/CHANGELOG-1.1.md
new file mode 100644
index 00000000..d7efc3f9
--- /dev/null
+++ b/CHANGELOG-1.1.md
@@ -0,0 +1,67 @@
+# Changelog for Version 1.1
+
+## Version 1.1.1
+
+The most notable changes in this release are:
+
+* a complete rewrite of how Azure Key Vault authentication is handled and secured in Env-Injector
+* a new Helm chart `akv2k8s` containing both the Controller and Env-Injector
+
+### General
+
+#### Features
+* Support for Azure Managed Identities (MSI) when authenticating with Azure Key Vault
+* Support fmt and json log formats - fmt is default
+* Support other cloud types than Public Cloud (`AZURECHINACLOUD`, `AZUREGERMANCLOUD` and `AZUREUSGOVERNMENTCLOUD`)
+
+#### Other
+* AzureKeyVaultSecret CRD version changed from `apiVersion: spv.no/v1alpha1` to `apiVersion: spv.no/v1` - still backward compatible with previous versions
+* Kubernetes >= v0.17.4
+
+### Env-Injector
+
+#### Features
+* Basic support for Prometheus metrics
+* Use remote inspection, instead of docker pull, to find Docker image cmd or entrypoint
+* As part of the Auth service, introduced a ca-bundle-controller that will sync akv2k8s ca-cert to every namespace enabled with env-injection
+* Support for SHA Docker image notation
+
+#### Bug Fixes
+
+* Provide Auth endpoint as a better and more secure alternative to storing credentials in a volume attached to a Pod - fixes issue #25 (and #42 #40 #39 and more) for getting oauth tokens to authenticate with Azure Key Vault
+* Fix #69 - handle containers with no explicit cmd
+
+### Controller
+
+#### Features
+* Add chainOrder option to ensure server certificate is first in chain (thanks to @david.mansson)
+
+#### Bug Fixes
+* #104 - pass on labels and annotations from AzureKeyVaultSecret to Kubernetes Secret
+
+### Docs
+
+* Updated tutorials
+* Show multiple versions (currently 1.0 and 1.1) - where 1.1 is now default
+* Updated authentication docs to reflect changes in 1.1
+
+### Helm Charts
+
+* Introduced a new Helm chart (`akv2k8s`) that contains both the Controller and Env-Injector in one chart AND uses Helm 3
+* Removed CRDs from old charts (`azure-key-vault-controller` and `azure-key-vault-env-injector`)
+* Updated installation instructions for why and how to manually install CRDs
+* Fixed issue #55 where auth with ACR was not working
+* Support log format fmt and json
+* New charts have major changes in values - make sure to check yours match
+
+### Chart and Image versions
+
+| Type | Component | Version |
+| ------- | ---------------------------------- | -----------------------------|
+| Helm Chart | [akv2k8s](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/akv2k8s) | 1.1.24 |
+| Helm Chart | [azure-key-vault-controller](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller) | 1.1.3 |
+| Helm Chart | [azure-key-vault-env-injector](https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector) | 1.1.18 |
+| Docker Image | spvest/azure-keyvault-controller | 1.1.0 |
+| Docker Image | spvest/azure-keyvault-webhook | 1.1.10 |
+| Docker Image | spvest/azure-keyvault-env | 1.1.1 |
+| Docker Image | spvest/ca-bundle-controller | 1.1.0 |
\ No newline at end of file
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 00000000..a45eb1ef
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,2 @@
+# See: https://help.github.com/en/articles/about-code-owners#codeowners-syntax
+* @torresdal @vidarw
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..af833ea2
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,76 @@
+ARG BASEIMAGE=gcr.io/distroless/static:nonroot
+ARG BASE_ALPINE=alpine:3.8
+ARG GO_VERSION=1.15.3
+
+# -------
+# Builder
+# -------
+FROM golang:${GO_VERSION} AS builder
+ARG PACKAGE
+ARG VCS_REF=noref
+ARG BUILD_SUB_TARGET
+
+WORKDIR /go/src/${PACKAGE}
+ADD . .
+RUN go mod download
+RUN GIT_TAG=${VCS_REF} make build${BUILD_SUB_TARGET}
+
+# ------------
+# Env Injector
+# ------------
+FROM $BASE_ALPINE AS webhook
+ARG VCS_REF
+ARG BUILD_DATE
+ARG VCS_URL
+LABEL org.label-schema.schema-version="1.0"
+LABEL org.label-schema.build-date=$BUILD_DATE
+LABEL org.label-schema.vcs-ref=$VCS_REF
+LABEL org.label-schema.vcs-url=$VCS_URL
+LABEL org.label-schema.url=$VCS_URL
+LABEL org.label-schema.description="A Kubernetes Mutating Admission Webhook that adds an init container to a pod that will inject environment variables from Azure Key Vault"
+LABEL org.label-schema.vendor="Sparebanken Vest"
+LABEL org.label-schema.author="Jon Arild Tørresdal"
+
+COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/azure-keyvault-secrets-webhook /usr/local/bin/
+ENV DEBUG false
+ENTRYPOINT ["/usr/local/bin/azure-keyvault-secrets-webhook"]
+
+# ----------
+# Controller
+# ----------
+FROM $BASE_ALPINE AS controller
+ARG VCS_REF
+ARG BUILD_DATE
+ARG VCS_URL
+LABEL org.label-schema.schema-version="1.0"
+LABEL org.label-schema.build-date=$BUILD_DATE
+LABEL org.label-schema.vcs-ref=$VCS_REF
+LABEL org.label-schema.vcs-url=$VCS_URL
+LABEL org.label-schema.url=$VCS_URL
+LABEL org.label-schema.description="A Kubernetes Mutating Admission Webhook that adds an init container to a pod that will inject environment variables from Azure Key Vault"
+LABEL org.label-schema.vendor="Sparebanken Vest"
+LABEL org.label-schema.author="Jon Arild Tørresdal"
+
+COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/azure-keyvault-controller /usr/local/bin/
+ENV DEBUG false
+ENTRYPOINT ["/usr/local/bin/azure-keyvault-controller"]
+
+# --------
+# vaultenv
+# --------
+FROM $BASE_ALPINE AS vaultenv
+ARG VCS_REF
+ARG BUILD_DATE
+ARG VCS_URL
+LABEL org.label-schema.schema-version="1.0"
+LABEL org.label-schema.build-date=$BUILD_DATE
+LABEL org.label-schema.vcs-ref=$VCS_REF
+LABEL org.label-schema.vcs-url=$VCS_URL
+LABEL org.label-schema.url=$VCS_URL
+LABEL org.label-schema.description="A Kubernetes Mutating Admission Webhook that adds an init container to a pod that will inject environment variables from Azure Key Vault"
+LABEL org.label-schema.vendor="Sparebanken Vest"
+LABEL org.label-schema.author="Jon Arild Tørresdal"
+
+COPY --from=builder /go/src/github.com/SparebankenVest/azure-key-vault-to-kubernetes/bin/azure-key-vault-to-kubernetes/azure-keyvault-env /usr/local/bin/
+ENV DEBUG false
+USER 65534
diff --git a/Makefile b/Makefile
index 99b5ceb0..502f4999 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,17 @@
-PACKAGE=github.com/SparebankenVest/azure-key-vault-to-kubernetes
+ORG_PATH=github.com/SparebankenVest
+PROJECT_NAME := azure-key-vault-to-kubernetes
+PACKAGE=$(ORG_PATH)/$(PROJECT_NAME)
+
+COMPONENT_VAR=$(PACKAGE)/pkg/akv2k8s.Component
+GIT_VAR=$(PACKAGE)/pkg/akv2k8s.GitCommit
+BUILD_DATE_VAR := $(PACKAGE)/pkg/akv2k8s.BuildDate
+
+KUBERNETES_VERSION=v1.19.0
+KUBERNETES_DEP_VERSION=v0.19.0
+
+WEBHOOK_BINARY_NAME=azure-keyvault-secrets-webhook
+CONTROLLER_BINARY_NAME=azure-keyvault-controller
+KEYVAULT_ENV_BINARY_NAME=azure-keyvault-env
DOCKER_INTERNAL_REG=dokken.azurecr.io
DOCKER_RELEASE_REG=spvest
@@ -11,105 +24,287 @@ DOCKER_AKV2K8S_TEST_IMAGE=akv2k8s-env-test
DOCKER_INTERNAL_TAG := $(shell git rev-parse --short HEAD)
DOCKER_RELEASE_TAG := $(shell git describe --tags)
+DOCKER_RELEASE_TAG_WEBHOOK := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"webhook-"/""/g)
+DOCKER_RELEASE_TAG_CONTROLLER := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"controller-"/""/g)
+DOCKER_RELEASE_TAG_VAULTENV := $(shell echo $(DOCKER_RELEASE_TAG) | sed s/"vaultenv-"/""/g)
+
+TAG=
+GOOS ?= linux
+TEST_GOOS ?= linux
BUILD_DATE := $(shell date -u +"%Y-%m-%dT%H:%M:%SZ")
VCS_URL := https://$(PACKAGE)
-.PHONY: run-docs-dev build build-controller build-webhook build-auth-service build-vaultenv build-akv2k8s-env-test test push push-controller push-webhook push-auth-service push-vaultenv push-akv2k8s-env-test pull-release release release-controller release-webhook release-auth-service release-vaultenv
-
-run-docs-dev:
- cd ./docs && npm install && GATSBY_ALGOLIA_ENABLED=false npm run start
-
+TOOLS_MOD_DIR := ./tools
+TOOLS_DIR := $(abspath ./.tools)
+
+ifeq ($(OS),Windows_NT)
+ GO_BUILD_MODE = default
+else
+ UNAME_S := $(shell uname -s)
+ ifeq ($(UNAME_S), Linux)
+ GO_BUILD_MODE = pie
+ endif
+ ifeq ($(UNAME_S), Darwin)
+ GO_BUILD_MODE = default
+ endif
+endif
+
+GO_BUILD_OPTIONS := --tags "netgo osusergo" -ldflags "-s -X $(COMPONENT_VAR)=$(COMPONENT) -X $(GIT_VAR)=$(GIT_TAG) -X $(BUILD_DATE_VAR)=$(BUILD_DATE) -extldflags '-static'"
+
+$(TOOLS_DIR)/golangci-lint: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go
+ cd $(TOOLS_MOD_DIR) && \
+ go build -o $(TOOLS_DIR)/golangci-lint github.com/golangci/golangci-lint/cmd/golangci-lint
+
+$(TOOLS_DIR)/misspell: $(TOOLS_MOD_DIR)/go.mod $(TOOLS_MOD_DIR)/go.sum $(TOOLS_MOD_DIR)/tools.go
+ cd $(TOOLS_MOD_DIR) && \
+ go build -o $(TOOLS_DIR)/misspell github.com/client9/misspell/cmd/misspell
+
+.PHONY: precommit
+precommit: build test lint
+
+.PHONY: mod
+mod:
+ @go mod tidy
+
+.PHONY: check-vendor
+check-mod: mod
+ @git diff --exit-code go.mod go.sum
+
+.PHONY: lint
+lint: $(TOOLS_DIR)/golangci-lint $(TOOLS_DIR)/misspell
+ $(TOOLS_DIR)/golangci-lint run --timeout=5m
+ $(TOOLS_DIR)/misspell -w $(ALL_DOCS) && \
+ go mod tidy
+
+.PHONY: print-v-webhook
+print-v-webhook:
+ @echo $(DOCKER_RELEASE_TAG_WEBHOOK)
+
+.PHONY: print-v-controller
+print-v-controller:
+ @echo $(DOCKER_RELEASE_TAG_CONTROLLER)
+
+.PHONY: print-v-vaultenv
+print-v-vaultenv:
+ @echo $(DOCKER_RELEASE_TAG_VAULTENV)
+
+.PHONY: tag-all
+tag-all: tag-webhook tag-controller tag-vaultenv
+
+.PHONY: tag-crd
+tag-crd: check-tag
+ git tag -a crd-$(TAG) -m "CRD version $(TAG)"
+ git push --tags
+
+.PHONY: tag-webhook
+tag-webhook: check-tag
+ git tag -a webhook-$(TAG) -m "Webhook version $(TAG)"
+ git push --tags
+
+.PHONY: tag-controller
+tag-controller: check-tag
+ git tag -a controller-$(TAG) -m "Controller version $(TAG)"
+ git push --tags
+
+.PHONY: tag-vaultenv
+tag-vaultenv: check-tag
+ git tag -a vaultenv-$(TAG) -m "Vaultenv version $(TAG)"
+ git push --tags
+
+.PHONY: check-tag
+check-tag:
+ifndef TAG
+ $(error TAG is undefined)
+endif
+
+.PHONY: fmt
fmt:
@echo "==> Fixing source code with gofmt..."
# This logic should match the search logic in scripts/gofmtcheck.sh
find . -name '*.go' | grep -v /pkg/k8s/ | xargs gofmt -s -w
+.PHONY: fmtcheck
fmtcheck:
$(CURDIR)/scripts/gofmtcheck.sh
-build: build-controller build-webhook build-vaultenv
-
-build-controller:
- docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/controller/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-controller" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL)
-
-build-webhook:
- docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/env-injector/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-secrets-webhook" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL)
-
-build-auth-service:
- docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/auth-service/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-auth-service" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL)
-
-build-vaultenv:
- docker build . -t $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) -f images/vault-env/Dockerfile --build-arg PACKAGE=$(PACKAGE) --build-arg VCS_PROJECT_PATH="./cmd/azure-keyvault-env" --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) --build-arg BUILD_DATE=$(BUILD_DATE) --build-arg VCS_URL=$(VCS_URL)
-
-build-akv2k8s-env-test:
- docker build . -t $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) -f images/akv2k8s-test/Dockerfile
+.PHONY: codegen
+codegen:
+ @echo "Making sure code-generator has correct version of Kubernetes ($(KUBERNETES_DEP_VERSION))"
+ @echo ""
+ rm -rf ${GOPATH}/src/k8s.io/code-generator
+ git clone --depth 1 --branch $(KUBERNETES_DEP_VERSION) git@github.com:kubernetes/code-generator.git ${GOPATH}/src/k8s.io/code-generator
+ ./hack/update-codegen.sh
+.PHONY: test
test: fmtcheck
- CGO_ENABLED=0 go test -v $(shell go list ./... | grep -v /pkg/k8s/)
-
+ GOOS=$(TEST_GOOS) \
+ CGO_ENABLED=0 \
+ AKV2K8S_CLIENT_ID=$(AKV2K8S_CLIENT_ID) \
+ AKV2K8S_CLIENT_SECRET=$(AKV2K8S_CLIENT_SECRET) \
+ AKV2K8S_CLIENT_TENANT_ID=$(AKV2K8S_CLIENT_TENANT_ID) \
+ AKV2K8S_AZURE_SUBSCRIPTION_ID=$(AKV2K8S_AZURE_SUBSCRIPTION_ID) \
+ go test -coverprofile=coverage.txt -covermode=atomic -count=1 -v $(shell go list ./... | grep -v /pkg/k8s/)
+
+.PHONY: init-int-test-local
+init-int-test-local:
+ $(eval AKV2K8S_CLIENT_ID ?= $(shell az keyvault secret show --name int-test-azure-client-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value'))
+ $(eval AKV2K8S_CLIENT_SECRET ?= $(shell az keyvault secret show --name int-test-azure-client-secret --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value'))
+ $(eval AKV2K8S_CLIENT_TENANT_ID ?= $(shell az keyvault secret show --name int-test-azure-tenant-id --vault-name akv2k8s-test --subscription $(AKV2K8S_AZURE_SUBSCRIPTION_ID) --output tsv --query 'value'))
+
+.PHONY: int-test-local
+int-test-local: init-int-test-local test
+
+bin/%:
+ GOOS=$(GOOS) GOARCH=amd64 go build $(GO_BUILD_OPTIONS) -o "$(@)" "$(PKG_NAME)"
+
+.PHONY: clean
+clean:
+ rm -rf bin/$(PROJECT_NAME)
+
+.PHONY: clean-webhook
+clean-webhook:
+ rm -rf bin/$(PROJECT_NAME)/$(WEBHOOK_BINARY_NAME)
+
+.PHONY: clean-controller
+clean-controller:
+ rm -rf bin/$(PROJECT_NAME)/$(CONTROLLER_BINARY_NAME)
+
+.PHONY: clean-vaultenv
+clean-vaultenv:
+ rm -rf bin/$(PROJECT_NAME)/$(KEYVAULT_ENV_BINARY_NAME)
+
+# build: build-controller build-ca-bundle-controller build-webhook build-vaultenv
+.PHONY: build
+build: clean build-webhook build-controller build-vaultenv
+
+.PHONY: build-webhook
+build-webhook: clean-webhook
+ CGO_ENABLED=0 COMPONENT=webhook PKG_NAME=$(PACKAGE)/cmd/$(WEBHOOK_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(WEBHOOK_BINARY_NAME)
+
+.PHONY: build-controller
+build-controller: clean-controller
+ CGO_ENABLED=0 COMPONENT=controller PKG_NAME=$(PACKAGE)/cmd/$(CONTROLLER_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(CONTROLLER_BINARY_NAME)
+
+.PHONY: build-vaultenv
+build-vaultenv: clean-vaultenv
+ CGO_ENABLED=0 COMPONENT=vaultenv PKG_NAME=$(PACKAGE)/cmd/$(KEYVAULT_ENV_BINARY_NAME) $(MAKE) bin/$(PROJECT_NAME)/$(KEYVAULT_ENV_BINARY_NAME)
+
+.PHONY: images
+images: image-webhook image-controller image-ca-bundle-controller image-vaultenv
+
+.PHONY: upload-kind-webhook
+upload-kind-webhook:
+ kind load docker-image $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG)
+
+.PHONY: upload-kind-controller
+upload-kind-controller:
+ kind load docker-image $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG)
+
+.PHONY: upload-kind-vaultenv
+upload-kind-vaultenv:
+ kind load docker-image $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG)
+
+.PHONY: image-webhook
+image-webhook:
+ DOCKER_BUILDKIT=1 docker build \
+ --progress=plain \
+ --target webhook \
+ --build-arg BUILD_SUB_TARGET="-webhook" \
+ --build-arg PACKAGE=$(PACKAGE) \
+ --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \
+ --build-arg BUILD_DATE=$(BUILD_DATE) \
+ --build-arg VCS_URL=$(VCS_URL) \
+ -t $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) .
+
+.PHONY: image-controller
+image-controller:
+ DOCKER_BUILDKIT=1 docker build \
+ --progress=plain \
+ --target controller \
+ --build-arg BUILD_SUB_TARGET="-controller" \
+ --build-arg PACKAGE=$(PACKAGE) \
+ --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \
+ --build-arg BUILD_DATE=$(BUILD_DATE) \
+ --build-arg VCS_URL=$(VCS_URL) \
+ -t $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) .
+
+.PHONY: image-vaultenv
+image-vaultenv:
+ DOCKER_BUILDKIT=1 docker build \
+ --progress=plain \
+ --target vaultenv \
+ --build-arg BUILD_SUB_TARGET="-vaultenv" \
+ --build-arg PACKAGE=$(PACKAGE) \
+ --build-arg VCS_REF=$(DOCKER_INTERNAL_TAG) \
+ --build-arg BUILD_DATE=$(BUILD_DATE) \
+ --build-arg VCS_URL=$(VCS_URL) \
+ -t $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) .
+
+.PHONY: image-akv2k8s-env-test
+image-akv2k8s-env-test:
+ DOCKER_BUILDKIT=1 docker build \
+ --progress=plain \
+ -t $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE) \
+ -f images/akv2k8s-test/Dockerfile .
+
+.PHONY: push
push: push-controller push-webhook push-vaultenv
+.PHONY: push-controller
push-controller:
docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG)
+.PHONY: push-webhook
push-webhook:
docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG)
-push-auth-service:
- docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG)
-
+.PHONY: push-vaultenv
push-vaultenv:
docker push $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG)
+.PHONY: push-akv2k8s-env-test
push-akv2k8s-env-test:
docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AKV2K8S_TEST_IMAGE)
-# release:
-# $(call release_image,$(DOCKER_CONTROLLER_IMAGE))
-# $(call release_image,$(DOCKER_WEBHOOK_IMAGE))
-# $(call release_image,$(DOCKER_VAULTENV_IMAGE))
+.PHONY: pull-all
+pull-all: pull-webhook pull-controller pull-vaultenv
-pull-release:
- docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG)
+.PHONY: pull-webhook
+pull-webhook:
docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG)
- # docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG)
+
+.PHONY: pull-controller
+pull-controller:
+ docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG)
+
+.PHONY: pull-vaultenv
+pull-vaultenv:
docker pull $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG)
+.PHONY: release
release: release-controller release-webhook release-vaultenv
+.PHONY: release-controller
release-controller:
- docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG)
+ docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CONTROLLER)
docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):latest
- docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG)
+ docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):$(DOCKER_RELEASE_TAG_CONTROLLER)
docker push $(DOCKER_RELEASE_REG)/$(DOCKER_CONTROLLER_IMAGE):latest
+.PHONY: release-webhook
release-webhook:
- docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG)
+ docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG_WEBHOOK)
docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):latest
- docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG)
+ docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):$(DOCKER_RELEASE_TAG_WEBHOOK)
docker push $(DOCKER_RELEASE_REG)/$(DOCKER_WEBHOOK_IMAGE):latest
-release-auth-service:
- docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_RELEASE_TAG)
- docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):latest
-
- docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):$(DOCKER_RELEASE_TAG)
- docker push $(DOCKER_RELEASE_REG)/$(DOCKER_AUTH_SERVICE_IMAGE):latest
-
+.PHONY: release-vaultenv
release-vaultenv:
- docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG)
+ docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG_VAULTENV)
docker tag $(DOCKER_INTERNAL_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):latest
- docker push $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG)
+ docker push $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):$(DOCKER_RELEASE_TAG_VAULTENV)
docker push $(DOCKER_RELEASE_REG)/$(DOCKER_VAULTENV_IMAGE):latest
-
-# define release_image
-# docker pull $(DOCKER_INTERNAL_REG)/$(1):$(DOCKER_INTERNAL_TAG)
-# docker tag $(DOCKER_INTERNAL_REG)/$(1):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(1):$(DOCKER_RELEASE_TAG)
-# docker tag $(DOCKER_INTERNAL_REG)/$(1):$(DOCKER_INTERNAL_TAG) $(DOCKER_RELEASE_REG)/$(1):latest
-# docker push $(DOCKER_RELEASE_REG)/$(1):$(DOCKER_RELEASE_TAG)
-# docker push $(DOCKER_RELEASE_REG)/$(1):latest
-# endef
\ No newline at end of file
diff --git a/README.md b/README.md
index 8bad0216..21b54157 100644
--- a/README.md
+++ b/README.md
@@ -30,18 +30,20 @@
Azure Key Vault to Kubernetes (akv2k8s) makes Azure Key Vault secrets, certificates and keys available to your applications in Kubernetes, in a simple and secure way.
-Documentation available at https://akv2k8s.io
+Documentation available at https://akv2k8s.io . Join our Slack Workspace to ask questions to the akv2k8s community.
+
+Please spare one minute to take our survey: https://www.surveymonkey.com/r/HMFZVYR . Why? We have no ide how many are using Akv2k8s, except through user interaction here on GitHub. More importantly - what can we do to make Akv2k8s even better?
## Overview
-Azure Key Vault to Kubernetes (akv2k8s) has two components for handling Azure Key Vault Secrets in Kubernetes:
+Azure Key Vault to Kubernetes (akv2k8s) will make Azure Key Vault objects available to Kubernetes in two ways:
-* Azure Key Vault Controller
-* Azure Key Vault Env Injector
+* As native Kubernetes `Secret`s
+* As environment variables directly injected into your Container application
-The **Azure Key Vault Controller** (Controller for short) is for synchronizing Secrets, Certificates and Keys from Azure Key Vault to native `Secret`'s in Kubernetes.
+The **Azure Key Vault Controller** (Controller for short) is responsible for synchronizing Secrets, Certificates and Keys from Azure Key Vault to native `Secret`'s in Kubernetes.
-The **Azure Key Vault Env Injector** (Env Injector for short) is a Kubernetes Mutating Webhook transparently injecting Azure Key Vault secrets as environment variables into programs running in containers, without touching disk or in any other way expose the actual secret content outside the program.
+The **Azure Key Vault Env Injector** (Env Injector for short) is responsible for transparently injecting Azure Key Vault secrets as environment variables into Container applications, without touching disk or expose the actual secret to Kubernetes.
## Goals
@@ -53,31 +55,9 @@ Goals for this project was:
All of these goals are met.
-## Requirements
-
-* Kubernetes version >= 1.13
-* Enabled admission controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook
-* RBAC enabled
-* Default [authentication](#authentication) requires Kubernetes cluster running in Azure - use custom authentication if running outside Azure
-
## Installation
-It's recommended to use Helm charts for installation:
-
-Controller: https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller
-
-Env Injector: https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector
-
-For more details, see full documentation at https://akv2k8s.io.
-
-
-### Installation without Helm
-
-If Helm is not an option in Kubernetes, use Helm on a local computer to generate the Kubernetes templates like below:
-
-`helm install --debug --dry-run `
-
-See the individual Helm charts above for ``.
+For installation instructions, see documentation at https://akv2k8s.io/installation/
## Credits
@@ -105,5 +85,5 @@ Azure Key Vault to Kubernetes is licensed under Apache License 2.0.
### Contribute to the Documentation
-The documentation is located at [docs/content](docs/content). We're using Gatsby + MDX (Markdown + JSX) to generate static docs for https://akv2k8s.io. See [docs/README.md](docs/README.md) for details.
+The documentation is located in a seperate repository at https://github.com/SparebankenVest/akv2k8s-website. We're using Gatsby + MDX (Markdown + JSX) to generate static docs for https://akv2k8s.io.
diff --git a/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go
new file mode 100644
index 00000000..a30691f3
--- /dev/null
+++ b/cmd/azure-keyvault-controller/controller/azureKeyVaultSecret.go
@@ -0,0 +1,491 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers"
+ akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+
+ corev1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/errors"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ utilruntime "k8s.io/apimachinery/pkg/util/runtime"
+ "k8s.io/client-go/tools/cache"
+ "k8s.io/klog/v2"
+
+ "kmodules.xyz/client-go/tools/queue"
+)
+
+func (c *Controller) initAzureKeyVaultSecret() {
+ c.akvsInformerFactory.Keyvault().V2beta1().AzureKeyVaultSecrets().Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
+ AddFunc: func(obj interface{}) {
+ akvs, err := convertToAzureKeyVaultSecret(obj)
+ if err != nil {
+ klog.ErrorS(err, "failed to convert to azurekeyvaultsecret")
+ return
+ }
+
+ if c.akvsHasOutputDefined(akvs) {
+ klog.V(4).InfoS("adding to queue", "azurekeyvaultsecret", klog.KObj(akvs))
+ queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj)
+ }
+ },
+ UpdateFunc: func(old, new interface{}) {
+ newAkvs, err := convertToAzureKeyVaultSecret(new)
+ if err != nil {
+ klog.ErrorS(err, "failed to convert to azurekeyvaultsecret")
+ return
+ }
+
+ oldAkvs, err := convertToAzureKeyVaultSecret(old)
+ if err != nil {
+ klog.ErrorS(err, "failed to convert to azurekeyvaultsecret")
+ return
+ }
+
+ // If akvs has not changed and has secret output, add to akv queue to check if secret has changed in akv
+ if newAkvs.ResourceVersion == oldAkvs.ResourceVersion && c.akvsHasOutputDefined(newAkvs) {
+ klog.V(4).InfoS("adding to azure key vault queue to check if secret has changed in azure key vault", "azurekeyvaultsecret", klog.KObj(newAkvs))
+ queue.Enqueue(c.azureKeyVaultQueue.GetQueue(), new)
+ return
+ }
+
+ if c.akvsHasOutputDefined(newAkvs) || c.akvsHasOutputDefined(oldAkvs) {
+ klog.V(4).InfoS("azurekeyvaultsecret changed - adding to queue", "azurekeyvaultsecret", klog.KObj(newAkvs))
+ queue.Enqueue(c.akvsCrdQueue.GetQueue(), new)
+ }
+ },
+ DeleteFunc: func(obj interface{}) {
+ akvs, err := convertToAzureKeyVaultSecret(obj)
+ if err != nil {
+ klog.ErrorS(err, "failed to convert to azurekeyvaultsecret")
+ return
+ }
+
+ if c.akvsHasOutputDefined(akvs) {
+ klog.V(4).InfoS("azurekeyvaultsecret deleted - adding to queue", "azurekeyvaultsecret", klog.KObj(akvs))
+ queue.Enqueue(c.akvsCrdQueue.GetQueue(), obj)
+
+ err = c.deleteKubernetesValues(akvs)
+ if err != nil {
+ klog.ErrorS(err, "failed to delete secret data from azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs))
+ }
+
+ // Getting default key to remove from Azure work queue
+ key, err := cache.MetaNamespaceKeyFunc(obj)
+ if err != nil {
+ utilruntime.HandleError(err)
+ return
+ }
+ c.azureKeyVaultQueue.GetQueue().Forget(key)
+ }
+ },
+ })
+}
+
+func (c *Controller) syncDeletedAzureKeyVaultSecret(key string) error {
+ var akvs *akv.AzureKeyVaultSecret
+ var err error
+
+ klog.V(4).InfoS("processing azurekeyvaultsecret", "key", key)
+ if akvs, err = c.getAzureKeyVaultSecret(key); err != nil {
+ if exit := handleKeyVaultError(err, key); exit {
+ return nil
+ }
+ return err
+ }
+
+ var outputObject metav1.Object
+ if c.akvsHasOutputSecret(akvs) {
+ secret, err := c.getOrCreateKubernetesSecret(akvs)
+ if err != nil {
+ return err
+ }
+
+ klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret))
+ c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced)
+ outputObject = secret
+ }
+
+ if c.akvsHasOutputConfigMap(akvs) {
+ cm, err := c.getOrCreateKubernetesConfigMap(akvs)
+ if err != nil {
+ return err
+ }
+
+ klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm))
+ c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced)
+ outputObject = cm
+ }
+
+ if !isOwnedBy(outputObject, akvs) { // checks if the object has a controllerRef set to the given owner
+ msg := fmt.Sprintf(MessageResourceExists, outputObject.GetName())
+ c.recorder.Event(akvs, corev1.EventTypeWarning, ErrResourceExists, msg)
+ return fmt.Errorf(msg)
+ }
+
+ return nil
+}
+
+func (c *Controller) syncAzureKeyVaultSecret(key string) error {
+ var akvs *akv.AzureKeyVaultSecret
+ var err error
+
+ klog.V(4).InfoS("processing azurekeyvaultsecret", "key", key)
+ if akvs, err = c.getAzureKeyVaultSecret(key); err != nil {
+ if exit := handleKeyVaultError(err, key); exit {
+ return nil
+ }
+ return err
+ }
+
+ var outputObject metav1.Object
+ if c.akvsHasOutputSecret(akvs) {
+ secret, err := c.getOrCreateKubernetesSecret(akvs)
+ if err != nil {
+ return err
+ }
+
+ klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret))
+ c.recorder.Event(secret, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced)
+ outputObject = secret
+ }
+
+ if c.akvsHasOutputConfigMap(akvs) {
+ cm, err := c.getOrCreateKubernetesConfigMap(akvs)
+ if err != nil {
+ return err
+ }
+
+ klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm))
+ c.recorder.Event(cm, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSynced)
+ outputObject = cm
+ }
+
+ if !isOwnedBy(outputObject, akvs) { // checks if the object has a controllerRef set to the given owner
+ msg := fmt.Sprintf(MessageResourceExists, outputObject.GetName())
+ c.recorder.Event(akvs, corev1.EventTypeWarning, ErrResourceExists, msg)
+ return fmt.Errorf(msg)
+ }
+
+ return nil
+}
+
+func (c *Controller) syncAzureKeyVault(key string) error {
+ var akvs *akv.AzureKeyVaultSecret
+ var err error
+ var secretName string
+ var cmName string
+ var cmHash string
+ var secretHash string
+
+ klog.V(4).InfoS("checking state of azurekeyvaultsecret in azure key vault", "key", key)
+ if akvs, err = c.getAzureKeyVaultSecret(key); err != nil {
+ if exit := handleKeyVaultError(err, key); exit {
+ return nil
+ }
+ return err
+ }
+
+ if c.akvsHasOutputSecret(akvs) {
+ klog.V(4).InfoS("getting secret value from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs))
+ secretValue, err := c.getSecretFromKeyVault(akvs)
+ if err != nil {
+ msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name)
+ c.recorder.Event(akvs, corev1.EventTypeWarning, ErrAzureVault, msg)
+ return fmt.Errorf(msg)
+ }
+
+ secretHash = getMD5HashOfByteValues(secretValue)
+
+ klog.V(4).InfoS("checking if secret value has changed in azure", "azurekeyvaultsecret", klog.KObj(akvs))
+ if akvs.Status.SecretHash != secretHash {
+ klog.V(4).InfoS("value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs))
+
+ klog.InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KRef(akvs.Namespace, akvs.Spec.Output.Secret.Name))
+ existingSecret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Get(context.TODO(), akvs.Spec.Output.Secret.Name, metav1.GetOptions{})
+ if err != nil {
+ return fmt.Errorf("failed to get existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err)
+ }
+
+ updatedSecret, err := createNewSecretFromExisting(akvs, secretValue, existingSecret)
+ if err != nil {
+ return fmt.Errorf("failed to update existing secret %s, error: %+v", akvs.Spec.Output.Secret.Name, err)
+ }
+
+ secret, err := c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(context.TODO(), updatedSecret, metav1.UpdateOptions{})
+ if err != nil {
+ return fmt.Errorf("failed to update secret, error: %+v", err)
+ }
+
+ secretName = secret.Name
+ klog.InfoS("secret changed - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(secret), "secret", klog.KObj(akvs))
+ }
+ }
+
+ if c.akvsHasOutputConfigMap(akvs) {
+ klog.V(4).InfoS("getting secret value from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs))
+ cmValue, err := c.getConfigMapFromKeyVault(akvs)
+ if err != nil {
+ msg := fmt.Sprintf(FailedAzureKeyVault, akvs.Name, akvs.Spec.Vault.Name)
+ c.recorder.Event(akvs, corev1.EventTypeWarning, ErrAzureVault, msg)
+ return fmt.Errorf(msg)
+ }
+
+ cmHash = getMD5HashOfStringValues(cmValue)
+
+ klog.V(4).InfoS("checking if secret value has changed in azure key vault", "azurekeyvaultsecret", klog.KObj(akvs))
+ if akvs.Status.ConfigMapHash != cmHash {
+ klog.V(4).InfoS("value has changed in azure key vault", "before", akvs.Status.SecretHash, "now", secretHash, "azurekeyvaultsecret", klog.KObj(akvs))
+
+ klog.InfoS("updating with recent changes from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KRef(akvs.Namespace, akvs.Spec.Output.ConfigMap.Name))
+ existingCm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Get(context.TODO(), akvs.Spec.Output.ConfigMap.Name, metav1.GetOptions{})
+ if err != nil {
+ return fmt.Errorf("failed to get existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err)
+ }
+
+ updatedCm, err := createNewConfigMapFromExisting(akvs, cmValue, existingCm)
+ if err != nil {
+ return fmt.Errorf("failed to update existing configmap %s, error: %+v", akvs.Spec.Output.ConfigMap.Name, err)
+ }
+
+ cm, err := c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(context.TODO(), updatedCm, metav1.UpdateOptions{})
+ if err != nil {
+ return fmt.Errorf("failed to update configmap, error: %+v", err)
+ }
+
+ cmName = cm.Name
+ klog.InfoS("configmap changed - any resources (like pods) using this secret must be restarted to pick up the new value - details: https://github.com/kubernetes/kubernetes/issues/22368", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm))
+ }
+ }
+
+ klog.V(4).InfoS("updating status", "azurekeyvaultsecret", klog.KObj(akvs))
+ if err = c.updateAzureKeyVaultSecretStatus(akvs, secretName, cmName, secretHash, cmHash); err != nil {
+ return err
+ }
+
+ klog.V(4).InfoS("sync successful", "azurekeyvaultsecret", klog.KObj(akvs))
+ c.recorder.Event(akvs, corev1.EventTypeNormal, SuccessSynced, MessageAzureKeyVaultSecretSyncedWithAzureKeyVault)
+ return nil
+}
+
+func (c *Controller) deleteKubernetesValues(akvs *akv.AzureKeyVaultSecret) error {
+ if c.akvsHasOutputSecret(akvs) {
+ return c.deleteKubernetesSecretValues(akvs)
+ }
+ if c.akvsHasOutputConfigMap(akvs) {
+ return c.deleteKubernetesConfigMapValues(akvs)
+ }
+ return nil
+}
+
+func convertToAzureKeyVaultSecret(obj interface{}) (*akv.AzureKeyVaultSecret, error) {
+ secret, ok := obj.(*akv.AzureKeyVaultSecret)
+ if !ok {
+ tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
+ if !ok {
+ return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj)
+ }
+ secret, ok = tombstone.Obj.(*akv.AzureKeyVaultSecret)
+ if !ok {
+ return nil, fmt.Errorf("tombstone contained object that is not a AzureKeyVaultSecret %#v", obj)
+ }
+ }
+ return secret, nil
+}
+
+func (c *Controller) akvsHasOutputDefined(secret *akv.AzureKeyVaultSecret) bool {
+ return c.akvsHasOutputSecret(secret) || c.akvsHasOutputConfigMap(secret)
+}
+
+func (c *Controller) akvsHasOutputSecret(secret *akv.AzureKeyVaultSecret) bool {
+ return secret.Spec.Output.Secret.Name != ""
+}
+
+func (c *Controller) akvsHasOutputConfigMap(secret *akv.AzureKeyVaultSecret) bool {
+ return secret.Spec.Output.ConfigMap.Name != ""
+}
+
+func (c *Controller) getAzureKeyVaultSecretFromSecret(secret *corev1.Secret, owner *metav1.OwnerReference) (*akv.AzureKeyVaultSecret, error) {
+ return c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(secret.Namespace).Get(owner.Name)
+}
+
+func (c *Controller) getAzureKeyVaultSecretFromConfigMap(cm *corev1.ConfigMap, owner *metav1.OwnerReference) (*akv.AzureKeyVaultSecret, error) {
+ return c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(cm.Namespace).Get(owner.Name)
+}
+
+func (c *Controller) isOwnedByAzureKeyVaultSecret(obj metav1.Object) bool {
+ if ownerRef := metav1.GetControllerOf(obj); ownerRef != nil {
+ if ownerRef.Kind == "AzureKeyVaultSecret" {
+ return true
+ }
+ }
+ return false
+}
+
+func (c *Controller) getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (map[string][]byte, error) {
+ var secretHandler KubernetesHandler
+
+ switch azureKeyVaultSecret.Spec.Vault.Object.Type {
+ case akv.AzureKeyVaultObjectTypeSecret:
+ transformator, err := transformers.CreateTransformator(&azureKeyVaultSecret.Spec.Output)
+ if err != nil {
+ return nil, err
+ }
+ secretHandler = NewAzureSecretHandler(azureKeyVaultSecret, c.vaultService, *transformator)
+ case akv.AzureKeyVaultObjectTypeCertificate:
+ secretHandler = NewAzureCertificateHandler(azureKeyVaultSecret, c.vaultService)
+ case akv.AzureKeyVaultObjectTypeKey:
+ secretHandler = NewAzureKeyHandler(azureKeyVaultSecret, c.vaultService)
+ case akv.AzureKeyVaultObjectTypeMultiKeyValueSecret:
+ secretHandler = NewAzureMultiKeySecretHandler(azureKeyVaultSecret, c.vaultService)
+ default:
+ return nil, fmt.Errorf("azure key vault object type '%s' not currently supported", azureKeyVaultSecret.Spec.Vault.Object.Type)
+ }
+ return secretHandler.HandleSecret()
+}
+
+func (c *Controller) getConfigMapFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (map[string]string, error) {
+ var cmHandler KubernetesHandler
+
+ switch azureKeyVaultSecret.Spec.Vault.Object.Type {
+ case akv.AzureKeyVaultObjectTypeSecret:
+ transformator, err := transformers.CreateTransformator(&azureKeyVaultSecret.Spec.Output)
+ if err != nil {
+ return nil, err
+ }
+ cmHandler = NewAzureSecretHandler(azureKeyVaultSecret, c.vaultService, *transformator)
+ case akv.AzureKeyVaultObjectTypeCertificate:
+ cmHandler = NewAzureCertificateHandler(azureKeyVaultSecret, c.vaultService)
+ case akv.AzureKeyVaultObjectTypeKey:
+ cmHandler = NewAzureKeyHandler(azureKeyVaultSecret, c.vaultService)
+ case akv.AzureKeyVaultObjectTypeMultiKeyValueSecret:
+ cmHandler = NewAzureMultiKeySecretHandler(azureKeyVaultSecret, c.vaultService)
+ default:
+ return nil, fmt.Errorf("azure key vault object type '%s' not currently supported", azureKeyVaultSecret.Spec.Vault.Object.Type)
+ }
+ return cmHandler.HandleConfigMap()
+}
+
+func (c *Controller) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecret, error) {
+ namespace, name, err := cache.SplitMetaNamespaceKey(key)
+ if err != nil {
+ return nil, fmt.Errorf("invalid resource key: %s", key)
+ }
+
+ azureKeyVaultSecret, err := c.azureKeyVaultSecretLister.AzureKeyVaultSecrets(namespace).Get(name)
+
+ if err != nil {
+ return nil, err
+ }
+ return azureKeyVaultSecret, err
+}
+
+func hasAzureKeyVaultSecretChangedForSecret(akvs *akv.AzureKeyVaultSecret, akvsValues map[string][]byte, secret *corev1.Secret) bool {
+ // check if secret type has changed
+ secretType := determineSecretType(akvs)
+ if secretType != secret.Type {
+ return true
+ }
+
+ // Check if dataKey has changed by trying to lookup key
+ if akvs.Spec.Output.Secret.DataKey != "" {
+ if _, ok := secret.Data[akvs.Spec.Output.Secret.DataKey]; !ok {
+ return true
+ }
+ }
+
+ // Check if data content has changed
+ if akvs.Status.SecretHash != getMD5HashOfSecret(akvsValues, secret) {
+ return true
+ }
+ return false
+}
+
+func hasAzureKeyVaultSecretChangedForConfigMap(akvs *akv.AzureKeyVaultSecret, akvsValues map[string]string, cm *corev1.ConfigMap) bool {
+ // Check if dataKey has changed by trying to lookup key
+ if akvs.Spec.Output.ConfigMap.DataKey != "" {
+ if _, ok := cm.Data[akvs.Spec.Output.ConfigMap.DataKey]; !ok {
+ return true
+ }
+ }
+
+ // Check if data content has changed
+ if akvs.Status.ConfigMapHash != getMD5HashOfConfigMap(akvsValues, cm) {
+ return true
+ }
+ return false
+}
+
+func (c *Controller) updateAzureKeyVaultSecretStatus(akvs *akv.AzureKeyVaultSecret, secretName, cmName, secretHash, cmHash string) error {
+ akvsCopy := akvs.DeepCopy()
+ if secretName != "" {
+ akvsCopy.Status.SecretName = secretName
+ akvsCopy.Status.SecretHash = secretHash
+ }
+ if cmName != "" {
+ akvsCopy.Status.ConfigMapName = cmName
+ akvsCopy.Status.ConfigMapHash = cmHash
+ }
+ akvsCopy.Status.LastAzureUpdate = c.clock.Now()
+
+ _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(context.TODO(), akvsCopy, metav1.UpdateOptions{})
+ return err
+}
+
+func (c *Controller) updateAzureKeyVaultSecretStatusForSecret(akvs *akv.AzureKeyVaultSecret, secretHash string) error {
+ secretName := determineSecretName(akvs)
+ now := c.clock.Now()
+
+ akvsCopy := akvs.DeepCopy()
+ akvsCopy.Status.SecretName = secretName
+ akvsCopy.Status.SecretHash = secretHash
+ akvsCopy.Status.LastAzureUpdate = now
+
+ _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(context.TODO(), akvsCopy, metav1.UpdateOptions{})
+ return err
+}
+
+func (c *Controller) updateAzureKeyVaultSecretStatusForConfigMap(akvs *akv.AzureKeyVaultSecret, cmHash string) error {
+ cmName := determineConfigMapName(akvs)
+
+ akvsCopy := akvs.DeepCopy()
+ akvsCopy.Status.ConfigMapName = cmName
+ akvsCopy.Status.ConfigMapHash = cmHash
+ akvsCopy.Status.LastAzureUpdate = c.clock.Now()
+
+ _, err := c.akvsClient.KeyvaultV2beta1().AzureKeyVaultSecrets(akvs.Namespace).UpdateStatus(context.TODO(), akvsCopy, metav1.UpdateOptions{})
+ return err
+}
+
+func handleKeyVaultError(err error, key string) bool {
+ exit := false
+ if err != nil {
+ // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing.
+ if errors.IsNotFound(err) {
+ klog.InfoS("azurekeyvaultsecret in work queue no longer exists", "key", key)
+ exit = true
+ }
+ }
+ return exit
+}
diff --git a/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go
new file mode 100644
index 00000000..b83ea5a9
--- /dev/null
+++ b/cmd/azure-keyvault-controller/controller/azureeKeyVaultSecret_test.go
@@ -0,0 +1,98 @@
+/*
+Copyright Sparebanken Vest
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "fmt"
+ "testing"
+
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client"
+ akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+)
+
+func TestNullLookup(t *testing.T) {
+ secret := akv.AzureKeyVaultSecret{
+ Spec: akv.AzureKeyVaultSecretSpec{
+ Output: akv.AzureKeyVaultOutput{
+ Secret: akv.AzureKeyVaultOutputSecret{
+ // Name: "laskjdflj",
+ },
+ },
+ },
+ }
+ if secret.Spec.Output.Secret.Name != "" {
+ t.Fail()
+ }
+}
+
+const (
+ fakeSecret = "some secret"
+ fakeJsonSecret = `{
+ "someKey": "someValue",
+ "someOtherKey": "someOtherValue"
+ }`
+ fakeYamlSecret = `
+someKey: someValue
+someOtherKey: someOtherValue`
+)
+
+type fakeAkvsService struct {
+}
+
+func (s *fakeAkvsService) GetSecret(secret *akv.AzureKeyVault) (string, error) {
+ switch secret.Object.Type {
+ case akv.AzureKeyVaultObjectTypeSecret:
+ return fakeSecret, nil
+ case akv.AzureKeyVaultObjectTypeMultiKeyValueSecret:
+ return fakeJsonSecret, nil
+ default:
+ return nil, fmt.Errorf("secret type not supported")
+ }
+}
+
+func (s *fakeAkvsService) GetKey(secret *akv.AzureKeyVault) (string, error) {
+ return "some key", nil
+}
+
+func (s *fakeAkvsService) GetCertificate(secret *akv.AzureKeyVault, options *client.CertificateOptions) (*client.Certificate, error) {
+ return nil, nil
+}
+
+func TestGetAkvs(t *testing.T) {
+ c := &Controller{
+ vaultService: &fakeAkvsService{},
+ }
+
+ akvs := &akv.AzureKeyVaultSecret{
+ Spec: akv.AzureKeyVaultSecretSpec{
+ Vault: akv.AzureKeyVault{
+ Object: akv.AzureKeyVaultObject{
+ Type: akv.AzureKeyVaultObjectTypeMultiKeyValueSecret,
+ ContentType: akv.AzureKeyVaultObjectContentTypeJSON,
+ },
+ },
+ },
+ }
+
+ res, err := c.getSecretFromKeyVault(akvs)
+ if err != nil {
+ t.Error(err)
+ }
+ if len(res) > 0 {
+
+ }
+}
diff --git a/cmd/azure-keyvault-controller/controller/configmap.go b/cmd/azure-keyvault-controller/controller/configmap.go
new file mode 100644
index 00000000..a4461491
--- /dev/null
+++ b/cmd/azure-keyvault-controller/controller/configmap.go
@@ -0,0 +1,341 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "bytes"
+ "context"
+ "crypto/md5"
+ "encoding/hex"
+ "fmt"
+ "sort"
+
+ akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+ "k8s.io/klog/v2"
+
+ corev1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/errors"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/client-go/tools/cache"
+)
+
+func convertToConfigMap(obj interface{}) (*corev1.ConfigMap, error) {
+ cm, ok := obj.(*corev1.ConfigMap)
+ if !ok {
+ tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
+ if !ok {
+ return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj)
+ }
+ cm, ok = tombstone.Obj.(*corev1.ConfigMap)
+ if !ok {
+ return nil, fmt.Errorf("tombstone contained object that is not a ConfigMap %#v", obj)
+ }
+ }
+ return cm, nil
+}
+
+func (c *Controller) getConfigMapByKey(key string) (*corev1.ConfigMap, error) {
+ namespace, name, err := cache.SplitMetaNamespaceKey(key)
+ if err != nil {
+ return nil, fmt.Errorf("invalid resource key: %s", key)
+ }
+ return c.getConfigMap(namespace, name)
+}
+
+func (c *Controller) getConfigMap(ns, name string) (*corev1.ConfigMap, error) {
+ klog.V(4).InfoS("getting configmap", "configmap", klog.KRef(ns, name))
+ cm, err := c.configMapsLister.ConfigMaps(ns).Get(name)
+
+ if err != nil {
+ return nil, err
+ }
+ return cm, err
+}
+
+func (c *Controller) deleteKubernetesConfigMapValues(akvs *akv.AzureKeyVaultSecret) error {
+ cm, err := c.getConfigMap(akvs.Namespace, akvs.Spec.Output.ConfigMap.Name)
+ if errors.IsNotFound(err) {
+ return nil
+ }
+
+ cmData := cm.Data
+
+ data, err := c.getConfigMapFromKeyVault(akvs)
+ if err != nil {
+ return err
+ }
+
+ for key := range data {
+ delete(cmData, key)
+ }
+
+ newCM, err := createNewConfigMapFromExistingWithUpdatedValues(akvs, cmData, cm)
+ if err != nil {
+ return err
+ }
+
+ cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(context.TODO(), newCM, metav1.UpdateOptions{})
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func (c *Controller) getOrCreateKubernetesConfigMap(akvs *akv.AzureKeyVaultSecret) (*corev1.ConfigMap, error) {
+ var cm *corev1.ConfigMap
+ var cmValues map[string]string
+ var err error
+
+ cmName := akvs.Spec.Output.ConfigMap.Name
+ if cmName == "" {
+ return nil, fmt.Errorf("output configmap name must be specified using spec.output.configMap.name")
+ }
+
+ klog.V(4).InfoS("get or create configmap", "configmap", klog.KRef(akvs.Namespace, cmName))
+ if cm, err = c.configMapsLister.ConfigMaps(akvs.Namespace).Get(cmName); err != nil {
+ klog.V(4).ErrorS(err, "failed to get configmap ", "configmap", klog.KRef(akvs.Namespace, cmName))
+ if errors.IsNotFound(err) {
+ klog.V(4).InfoS("configmap was not found", "configmap", klog.KRef(akvs.Namespace, cmName))
+ klog.V(4).InfoS("getting configmap value from azure key vault", "configmap", klog.KRef(akvs.Namespace, cmName))
+ cmValues, err = c.getConfigMapFromKeyVault(akvs)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get configmap from azure key vault for configmap '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err)
+ }
+
+ if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(context.TODO(), createNewConfigMap(akvs, cmValues), metav1.CreateOptions{}); err != nil {
+ return nil, fmt.Errorf("failed to create new configmap, err: %+v", err)
+ }
+
+ klog.InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs))
+ if err = c.updateAzureKeyVaultSecretStatusForConfigMap(akvs, getMD5HashOfStringValues(cmValues)); err != nil {
+ return nil, fmt.Errorf("failed to update status for azurekeyvaultsecret %s, error: %+v", akvs.Name, err)
+ }
+
+ return cm, nil
+ }
+ }
+
+ // get updated secret values from azure key vault
+ klog.V(4).InfoS("getting secret from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs))
+ cmValues, err = c.getConfigMapFromKeyVault(akvs)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err)
+ }
+
+ if cmName != cm.Name {
+ // Name of configmap has changed in AzureKeyVaultSecret, so we need to delete current configmap and recreate
+ // under new name
+
+ // Only delete if this akvs is the only owner
+ if !hasMultipleOwners(cm.GetOwnerReferences()) {
+ // Delete configmap
+ if err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Delete(context.TODO(), cm.Name, metav1.DeleteOptions{}); err != nil {
+ return nil, err
+ }
+ }
+ // Recreate configmap under new Name
+ if cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Create(context.TODO(), createNewConfigMap(akvs, cmValues), metav1.CreateOptions{}); err != nil {
+ return nil, err
+ }
+ return cm, nil
+ }
+
+ if hasAzureKeyVaultSecretChangedForConfigMap(akvs, cmValues, cm) {
+ klog.InfoS("values have changed requiring update to configmap", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm))
+
+ updatedCM, err := createNewConfigMapFromExisting(akvs, cmValues, cm)
+ if err != nil {
+ return nil, err
+ }
+
+ cm, err = c.kubeclientset.CoreV1().ConfigMaps(akvs.Namespace).Update(context.TODO(), updatedCM, metav1.UpdateOptions{})
+ if err == nil {
+ klog.InfoS("configmap updated", "azurekeyvaultsecret", klog.KObj(akvs), "configmap", klog.KObj(cm))
+ }
+ }
+
+ return cm, err
+}
+
+// createNewConfigMap creates a new ConfigMap for a AzureKeyVaultSecret resource. It also sets
+// the appropriate OwnerReferences on the resource so handleObject can discover
+// the AzureKeyVaultSecret resource that 'owns' it.
+func createNewConfigMap(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretValue map[string]string) *corev1.ConfigMap {
+ cmName := determineConfigMapName(azureKeyVaultSecret)
+
+ return &corev1.ConfigMap{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: cmName,
+ Namespace: azureKeyVaultSecret.Namespace,
+ Labels: azureKeyVaultSecret.Labels,
+ Annotations: azureKeyVaultSecret.Annotations,
+ OwnerReferences: []metav1.OwnerReference{
+ *newOwnerRef(azureKeyVaultSecret, schema.GroupVersionKind{
+ Group: akv.SchemeGroupVersion.Group,
+ Version: akv.SchemeGroupVersion.Version,
+ Kind: "AzureKeyVaultSecret",
+ }),
+ },
+ },
+ Data: azureSecretValue,
+ }
+}
+
+func newOwnerRef(owner metav1.Object, gvk schema.GroupVersionKind) *metav1.OwnerReference {
+ blockOwnerDeletion := true
+ isController := false
+ return &metav1.OwnerReference{
+ APIVersion: gvk.GroupVersion().String(),
+ Kind: gvk.Kind,
+ Name: owner.GetName(),
+ UID: owner.GetUID(),
+ BlockOwnerDeletion: &blockOwnerDeletion,
+ Controller: &isController,
+ }
+}
+
+// updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets
+// the appropriate OwnerReferences on the resource so handleObject can discover
+// the AzureKeyVaultSecret resource that 'owns' it.
+func createNewConfigMapFromExisting(akvs *akv.AzureKeyVaultSecret, values map[string]string, existingCM *corev1.ConfigMap) (*corev1.ConfigMap, error) {
+ cmName := determineConfigMapName(akvs)
+ cmClone := existingCM.DeepCopy()
+ ownerRefs := cmClone.GetOwnerReferences()
+
+ if !isOwnedBy(existingCM, akvs) {
+ ownerRefs = append(ownerRefs, *newOwnerRef(akvs, schema.GroupVersionKind{
+ Group: akv.SchemeGroupVersion.Group,
+ Version: akv.SchemeGroupVersion.Version,
+ Kind: "AzureKeyVaultSecret",
+ }))
+ }
+
+ mergedValues := mergeValuesWithExistingConfigMap(values, existingCM)
+
+ return &corev1.ConfigMap{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: cmName,
+ Namespace: akvs.Namespace,
+ Labels: akvs.Labels,
+ Annotations: akvs.Annotations,
+ OwnerReferences: ownerRefs,
+ },
+ Data: mergedValues,
+ }, nil
+}
+
+// updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets
+// the appropriate OwnerReferences on the resource so handleObject can discover
+// the AzureKeyVaultSecret resource that 'owns' it.
+func createNewConfigMapFromExistingWithUpdatedValues(akvs *akv.AzureKeyVaultSecret, values map[string]string, existingCM *corev1.ConfigMap) (*corev1.ConfigMap, error) {
+ cmName := determineConfigMapName(akvs)
+ cmClone := existingCM.DeepCopy()
+ ownerRefs := cmClone.GetOwnerReferences()
+
+ return &corev1.ConfigMap{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: cmName,
+ Namespace: akvs.Namespace,
+ Labels: akvs.Labels,
+ Annotations: akvs.Annotations,
+ OwnerReferences: ownerRefs,
+ },
+ Data: values,
+ }, nil
+}
+
+func mergeValuesWithExistingConfigMap(values map[string]string, cm *corev1.ConfigMap) map[string]string {
+ newValues := make(map[string]string)
+
+ // copy existing values into new map
+ for k, v := range values {
+ newValues[k] = v
+ }
+
+ // copy any values from existing secret that does not exist in akvs values
+ for key, val := range cm.Data {
+ if _, ok := values[key]; !ok {
+ newValues[key] = val
+ }
+ }
+ return newValues
+}
+
+func determineConfigMapName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string {
+ name := azureKeyVaultSecret.Spec.Output.ConfigMap.Name
+ if name == "" {
+ name = azureKeyVaultSecret.Name
+ }
+ return name
+}
+
+func getMD5HashOfStringValues(values map[string]string) string {
+ var mergedValues bytes.Buffer
+
+ // sort keys to make sure hash is consistant
+ keys := sortStringValueKeys(values)
+
+ for _, k := range keys {
+ mergedValues.WriteString(k + values[k])
+ }
+
+ hasher := md5.New()
+ hasher.Write([]byte(mergedValues.String()))
+ return hex.EncodeToString(hasher.Sum(nil))
+}
+
+func getMD5HashOfConfigMap(akvsValues map[string]string, cm *corev1.ConfigMap) string {
+ // filter out only values related to this akvs,
+ // as multiple akvs can write to a single secret
+ values := filterStringValueKeys(akvsValues, cm.Data)
+ return getMD5HashOfStringValues(values)
+}
+
+func filterStringValueKeys(akvsValues, cmValues map[string]string) map[string]string {
+ filtered := make(map[string]string)
+
+ for key := range akvsValues {
+ if cmVal, ok := cmValues[key]; ok {
+ filtered[key] = cmVal
+ }
+ }
+ return filtered
+}
+
+func sortStringValueKeys(values map[string]string) []string {
+ var keys []string
+ for k := range values {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+ return keys
+}
+
+// func handleConfigMapError(err error, key string) bool {
+// if err != nil {
+// // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing.
+// if errors.IsNotFound(err) {
+// klog.InfoS("configmap in work queue no longer exists", "key", key)
+// return true
+// }
+// }
+// return false
+// }
diff --git a/cmd/azure-keyvault-controller/controller/controller.go b/cmd/azure-keyvault-controller/controller/controller.go
index 7f2e7c1c..7f281ee8 100644
--- a/cmd/azure-keyvault-controller/controller/controller.go
+++ b/cmd/azure-keyvault-controller/controller/controller.go
@@ -20,22 +20,26 @@ limitations under the License.
package controller
import (
- "fmt"
"time"
- log "github.com/sirupsen/logrus"
+ "github.com/appscode/go/runtime"
+ "github.com/pkg/errors"
+ "k8s.io/klog/v2"
corev1 "k8s.io/api/core/v1"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
- "k8s.io/apimachinery/pkg/util/wait"
- coreinformers "k8s.io/client-go/informers/core/v1"
+ "k8s.io/client-go/informers"
+ "k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
- "k8s.io/client-go/tools/cache"
- "k8s.io/client-go/util/workqueue"
+ corelisters "k8s.io/client-go/listers/core/v1"
+ "k8s.io/client-go/tools/record"
+ "kmodules.xyz/client-go/tools/queue"
- akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client"
+ akvcs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned"
keyvaultScheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme"
- informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1"
+ akvInformers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions"
+ listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2beta1"
)
const (
@@ -50,6 +54,9 @@ const (
// to sync due to a Secret of the same name already existing.
ErrAzureVault = "ErrAzureVault"
+ // ErrConfigMap is used as part of the Event 'reason' when a Secret sync fails
+ ErrConfigMap = "ErrConfigMap"
+
// FailedAzureKeyVault is the message used for Events when a resource
// fails to get secret from Azure Key Vault
FailedAzureKeyVault = "Failed to get secret for '%s' from Azure Key Vault '%s'"
@@ -58,272 +65,129 @@ const (
// fails to sync due to a Deployment already existing
MessageResourceExists = "Resource '%s' already exists and is not managed by AzureKeyVaultSecret"
- // MessageResourceSynced is the message used for an Event fired when a AzureKeyVaultSecret
+ // MessageAzureKeyVaultSecretSynced is the message used for an Event fired when a AzureKeyVaultSecret
// is synced successfully
- MessageResourceSynced = "AzureKeyVaultSecret synced successfully"
+ MessageAzureKeyVaultSecretSynced = "AzureKeyVaultSecret synced to Kubernetes Secret successfully"
- // MessageResourceSyncedWithAzure is the message used for an Event fired when a AzureKeyVaultSecret
+ // MessageAzureKeyVaultSecretSyncedWithAzureKeyVault is the message used for an Event fired when a AzureKeyVaultSecret
// is synced successfully after getting updated secret from Azure Key Vault
- MessageResourceSyncedWithAzure = "AzureKeyVaultSecret synced successfully with Azure Key Vault"
+ MessageAzureKeyVaultSecretSyncedWithAzureKeyVault = "AzureKeyVaultSecret synced to Kubernetes Secret successfully with change from Azure Key Vault"
+
+ ControllerName = "Akv2k8s controller"
)
+type NamespaceSelectorLabel struct {
+ Name string
+ Value string
+}
+
+type CABundle struct {
+ ConfigMapName string
+ SecretNamespace string
+ SecretName string
+}
+
// Controller is the controller implementation for AzureKeyVaultSecret resources
type Controller struct {
- // Handler process work on workqueues
- handler *Handler
-
- secretsSynced cache.InformerSynced
- azureKeyVaultSecretsSynced cache.InformerSynced
-
- // workqueue is a rate limited work queue. This is used to queue work to be
- // processed instead of performing it as soon as a change happens. This
- // means we can ensure we only process a fixed amount of resources at a
- // time, and makes it easy to ensure we are never processing the same item
- // simultaneously in two different workers.
- workqueue workqueue.RateLimitingInterface
- workqueueAzure workqueue.RateLimitingInterface
+ kubeclientset kubernetes.Interface
+ akvsClient akvcs.Interface
+ vaultService vault.Service
+ recorder record.EventRecorder
+ kubeInformerFactory informers.SharedInformerFactory
+ namespaceAkvsLabel string
+
+ // Secret
+ secretsLister corelisters.SecretLister
+
+ // ConfigMap
+ configMapsLister corelisters.ConfigMapLister
+
+ // AzureKeyVaultSecret
+ azureKeyVaultSecretLister listers.AzureKeyVaultSecretLister
+ akvsInformerFactory akvInformers.SharedInformerFactory
+ akvsCrdQueue *queue.Worker
+ akvsCrdDeletionQueue *queue.Worker
+ azureKeyVaultQueue *queue.Worker
+
+ options *Options
+ clock Timer
+}
+
+// Options contains options for the controller
+type Options struct {
+ NumThreads int
+ MaxNumRequeues int
+ ResyncPeriod time.Duration
+ AkvsRef corev1.ObjectReference
}
// NewController returns a new AzureKeyVaultSecret controller
-func NewController(handler *Handler, secretInformer coreinformers.SecretInformer, azureKeyVaultSecretsInformer informers.AzureKeyVaultSecretInformer, azureFrequency AzurePollFrequency) *Controller {
+func NewController(client kubernetes.Interface, akvsClient akvcs.Interface, akvInformerFactory akvInformers.SharedInformerFactory, kubeInformerFactory informers.SharedInformerFactory, recorder record.EventRecorder, vaultService vault.Service, options *Options) *Controller {
// Create event broadcaster
// Add azure-keyvault-controller types to the default Kubernetes Scheme so Events can be
// logged for azure-keyvault-controller types.
utilruntime.Must(keyvaultScheme.AddToScheme(scheme.Scheme))
controller := &Controller{
- handler: handler,
- secretsSynced: secretInformer.Informer().HasSynced,
- azureKeyVaultSecretsSynced: azureKeyVaultSecretsInformer.Informer().HasSynced,
- workqueue: workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "AzureKeyVaultSecrets"),
- workqueueAzure: workqueue.NewNamedRateLimitingQueue(workqueue.NewItemFastSlowRateLimiter(azureFrequency.Normal, azureFrequency.Slow, azureFrequency.MaxFailuresBeforeSlowingDown), "AzureKeyVault"),
- }
-
- log.Info("Setting up event handlers")
- // Set up an event handler for when AzureKeyVaultSecret resources change
- azureKeyVaultSecretsInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
- AddFunc: func(obj interface{}) {
- secret := obj.(*akv.AzureKeyVaultSecret)
- if secret.Spec.Output.Secret.Name == "" {
- return
- }
- log.Debugf("AzureKeyVaultSecret '%s' added. Adding to queue.", secret.Name)
- controller.enqueueAzureKeyVaultSecret(obj)
- controller.enqueueAzurePoll(obj)
- },
- UpdateFunc: func(old, new interface{}) {
- newSecret := new.(*akv.AzureKeyVaultSecret)
- oldSecret := old.(*akv.AzureKeyVaultSecret)
- if oldSecret.Spec.Output.Secret.Name == "" {
- return
- }
- if newSecret.ResourceVersion == oldSecret.ResourceVersion {
- log.Debugf("AzureKeyVaultSecret '%s' added to Azure queue to check if changed in Azure.", newSecret.Name)
- // Check if secret has changed in Azure
- controller.enqueueAzurePoll(new)
- return
- }
-
- log.Debugf("AzureKeyVaultSecret '%s' changed. Adding to queue.", newSecret.Name)
- controller.enqueueAzureKeyVaultSecret(new)
- },
- DeleteFunc: func(obj interface{}) {
- secret := obj.(*akv.AzureKeyVaultSecret)
- if secret.Spec.Output.Secret.Name == "" {
- return
- }
- log.Debugf("AzureKeyVaultSecret '%s' deleted. Adding to delete queue.", secret.Name)
- controller.enqueueDeleteAzureKeyVaultSecret(obj)
- },
- })
-
- // Set up an event handler for when Secret resources change. This
- // handler will lookup the owner of the given Secret, and if it is
- // owned by a AzureKeyVaultSecret resource will enqueue that Secret resource for
- // processing. This way, we don't need to implement custom logic for
- // handling AzureKeyVaultSecret resources. More info on this pattern:
- // https://github.com/kubernetes/community/blob/8cafef897a22026d42f5e5bb3f104febe7e29830/contributors/devel/controllers.md
- secretInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
- AddFunc: func(obj interface{}) {
- secret := obj.(*corev1.Secret)
- log.Debugf("Secret '%s' added. Handling.", secret.Name)
- controller.enqueueObject(obj)
- },
- UpdateFunc: func(old, new interface{}) {
- newSecret := new.(*corev1.Secret)
- oldSecret := old.(*corev1.Secret)
-
- if newSecret.ResourceVersion == oldSecret.ResourceVersion {
- // Periodic resync will send update events for all known Secrets.
- // Two different versions of the same Secret will always have different RVs.
- return
- }
- secret := new.(*corev1.Secret)
- log.Debugf("Secret '%s' controlled by AzureKeyVaultSecret changed. Handling.", secret.Name)
- controller.enqueueObject(new)
- },
- DeleteFunc: func(obj interface{}) {
- secret := obj.(*corev1.Secret)
- log.Debugf("Secret '%s' deleted. Handling.", secret.Name)
- controller.enqueueObject(obj)
- },
- })
+ kubeclientset: client,
+ akvsClient: akvsClient,
+ recorder: recorder,
+ vaultService: vaultService,
- return controller
-}
+ akvsInformerFactory: akvInformerFactory,
+ kubeInformerFactory: kubeInformerFactory,
-// Run will set up the event handlers for types we are interested in, as well
-// as syncing informer caches and starting workers. It will block until stopCh
-// is closed, at which point it will shutdown the workqueue and wait for
-// workers to finish processing their current work items.
-func (c *Controller) Run(threadiness int, stopCh <-chan struct{}) error {
- defer utilruntime.HandleCrash()
- defer c.workqueue.ShutDown()
- defer c.workqueueAzure.ShutDown()
+ secretsLister: kubeInformerFactory.Core().V1().Secrets().Lister(),
+ configMapsLister: kubeInformerFactory.Core().V1().ConfigMaps().Lister(),
+ azureKeyVaultSecretLister: akvInformerFactory.Keyvault().V2beta1().AzureKeyVaultSecrets().Lister(),
- // Start the informer factories to begin populating the informer caches
- log.Info("Starting AzureKeyVaultSecret controller")
-
- // Wait for the caches to be synced before starting workers
- log.Info("Waiting for informer caches to sync")
- if ok := cache.WaitForCacheSync(stopCh, c.secretsSynced, c.azureKeyVaultSecretsSynced); !ok {
- return fmt.Errorf("failed to wait for caches to sync")
- }
-
- log.Info("Starting workers")
- // Launch two workers to process AzureKeyVaultSecret resources
- for i := 0; i < threadiness; i++ {
- go wait.Until(c.runWorker, time.Second, stopCh)
- go wait.Until(c.runAzureWorker, time.Second, stopCh)
+ options: options,
+ clock: &Clock{},
}
- log.Info("Started workers")
- <-stopCh
- log.Info("Shutting down workers")
-
- return nil
-}
+ controller.akvsCrdQueue = queue.New("AzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVaultSecret)
+ controller.akvsCrdDeletionQueue = queue.New("DeletedAzureKeyVaultSecrets", options.MaxNumRequeues, options.NumThreads, controller.syncDeletedAzureKeyVaultSecret)
+ controller.azureKeyVaultQueue = queue.New("AzureKeyVault", options.MaxNumRequeues, options.NumThreads, controller.syncAzureKeyVault)
-// runWorker is a long-running function that will continually call the
-// processNextWorkItem function in order to read and process a message on the
-// workqueue.
-func (c *Controller) runWorker() {
- for c.processNextWorkItem(c.workqueue, false) {
- }
-}
+ klog.InfoS("setting up event handlers")
+ controller.initAzureKeyVaultSecret()
-func (c *Controller) runAzureWorker() {
- for c.processNextWorkItem(c.workqueueAzure, true) {
- }
+ return controller
}
-// processNextWorkItem will read a single work item off the workqueue and
-// attempt to process it, by calling the syncHandler.
-func (c *Controller) processNextWorkItem(queue workqueue.RateLimitingInterface, syncAzure bool) bool {
- log.Debug("Processing next work item in queue...")
- obj, shutdown := queue.Get()
-
- if shutdown {
- return false
- }
-
- // We wrap this block in a func so we can defer c.workqueue.Done.
- err := func(obj interface{}) error {
- defer queue.Done(obj)
- var key string
- var ok bool
- var successMsg string
-
- if key, ok = obj.(string); !ok {
- queue.Forget(obj)
- utilruntime.HandleError(fmt.Errorf("expected string in workqueue but got %#v", obj))
- return nil
- }
-
- var err error
- if syncAzure {
- log.Debugf("Handling '%s' in Azure queue...", key)
- successMsg = "Successfully synced AzureKeyVaultSecret '%s' with Azure Key Vault"
- err = c.handler.azureSyncHandler(key)
- } else {
- log.Debugf("Handling '%s' in default queue...", key)
- successMsg = "Successfully synced AzureKeyVaultSecret '%s' with Kubernetes Secret"
- err = c.handler.kubernetesSyncHandler(key)
- }
+// Run will start the controller
+func (c *Controller) Run(stopCh <-chan struct{}) {
+ defer utilruntime.HandleCrash()
- if err != nil {
- queue.AddRateLimited(key)
- return fmt.Errorf("error syncing '%s': %s, requeuing", key, err.Error())
+ // Start the informer factories to begin populating the informer caches
+ klog.InfoS("starting azurekeyvaultsecret controller")
+ c.akvsInformerFactory.Start(stopCh)
+ c.kubeInformerFactory.Start(stopCh)
+
+ // Wait for all involved caches to be synced, before processing items from the queue is started
+ for _, v := range c.akvsInformerFactory.WaitForCacheSync(stopCh) {
+ if !v {
+ runtime.HandleError(errors.Errorf("timed out waiting for caches to sync"))
+ return
}
-
- queue.Forget(obj)
- log.Infof(successMsg, key)
- return nil
- }(obj)
-
- if err != nil {
- log.Error(err)
- return true
}
-
- return true
-}
-
-func (c *Controller) enqueueObject(obj interface{}) {
- azureKeyVaultSecret, ignore, err := c.handler.handleObject(obj)
-
- if err != nil {
- utilruntime.HandleError(err)
- }
-
- if !ignore {
- c.enqueueAzureKeyVaultSecret(azureKeyVaultSecret)
- }
-}
-
-// enqueueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name
-// string which is then put onto the work queue. This method should *not* be
-// passed resources of any type other than AzureKeyVaultSecret.
-func (c *Controller) enqueueAzureKeyVaultSecret(obj interface{}) {
- var key string
- var err error
- if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil {
- utilruntime.HandleError(err)
- return
+ for _, v := range c.kubeInformerFactory.WaitForCacheSync(stopCh) {
+ if !v {
+ runtime.HandleError(errors.Errorf("timed out waiting for caches to sync"))
+ return
+ }
}
- c.workqueue.AddRateLimited(key)
-}
-// enqueueAzurePoll takes a AzureKeyVaultSecret resource and converts it into a namespace/name
-// string which is then put onto the work queue. This method should *not* be
-// passed resources of any type other than AzureKeyVaultSecret.
-func (c *Controller) enqueueAzurePoll(obj interface{}) {
- var key string
- var err error
- if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil {
- utilruntime.HandleError(err)
- return
- }
- c.workqueueAzure.AddRateLimited(key)
-}
+ klog.InfoS("starting azure key vault secret queue")
+ c.akvsCrdQueue.Run(stopCh)
-// dequeueAzureKeyVaultSecret takes a AzureKeyVaultSecret resource and converts it into a namespace/name
-// string which is then put onto the work queue for deltion. This method should *not* be
-// passed resources of any type other than AzureKeyVaultSecret.
-func (c *Controller) enqueueDeleteAzureKeyVaultSecret(obj interface{}) {
- var key string
- var err error
+ klog.InfoS("starting azure key vault deleted secret queue")
+ c.akvsCrdDeletionQueue.Run(stopCh)
- if key, err = cache.DeletionHandlingMetaNamespaceKeyFunc(obj); err != nil {
- utilruntime.HandleError(err)
- return
- }
- c.workqueue.AddRateLimited(key)
+ klog.InfoS("starting azure key vault queue")
+ c.azureKeyVaultQueue.Run(stopCh)
- // Getting default key to remove from Azure work queue
- if key, err = cache.MetaNamespaceKeyFunc(obj); err != nil {
- utilruntime.HandleError(err)
- return
- }
- c.workqueueAzure.Forget(key)
+ klog.InfoS("started workers")
+ <-stopCh
+ klog.InfoS("Shutting down workers")
}
diff --git a/cmd/azure-keyvault-controller/controller/handler.go b/cmd/azure-keyvault-controller/controller/handler.go
deleted file mode 100644
index ed31c0a7..00000000
--- a/cmd/azure-keyvault-controller/controller/handler.go
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
-Copyright Sparebanken Vest
-
-Based on the Kubernetes controller example at
-https://github.com/kubernetes/sample-controller
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package controller
-
-import (
- "bytes"
- "crypto/md5"
- "encoding/hex"
- "fmt"
- "sort"
- "time"
-
- log "github.com/sirupsen/logrus"
-
- corev1 "k8s.io/api/core/v1"
- "k8s.io/apimachinery/pkg/api/errors"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/runtime/schema"
- utilruntime "k8s.io/apimachinery/pkg/util/runtime"
- "k8s.io/client-go/kubernetes"
- corelisters "k8s.io/client-go/listers/core/v1"
- "k8s.io/client-go/tools/cache"
- "k8s.io/client-go/tools/record"
-
- "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers"
- vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client"
- akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
- clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned"
- listers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v1"
-)
-
-// Handler process work on workqueues
-type Handler struct {
- // kubeclientset is a standard kubernetes clientset
- kubeclientset kubernetes.Interface
- // azureKeyvaultClientset is a clientset for our own API group
- azureKeyvaultClientset clientset.Interface
-
- secretsLister corelisters.SecretLister
- azureKeyVaultSecretsLister listers.AzureKeyVaultSecretLister
-
- // recorder is an event recorder for recording Event resources to the
- // Kubernetes API.
- recorder record.EventRecorder
-
- vaultService vault.Service
- clock Timer
-}
-
-// AzurePollFrequency controls time durations to wait between polls to Azure Key Vault for changes
-type AzurePollFrequency struct {
- // Normal is the time duration to wait between polls to Azure Key Vault for changes
- Normal time.Duration
-
- // MaxFailuresBeforeSlowingDown controls how many failures are accepted before reducing the frequency to Slow
- MaxFailuresBeforeSlowingDown int
-
- // Slow is the time duration to wait between polls to Azure Key Vault for changes, after MaxFailuresBeforeSlowingDown is reached
- Slow time.Duration
-}
-
-//NewHandler returns a new Handler
-func NewHandler(kubeclientset kubernetes.Interface, azureKeyvaultClientset clientset.Interface, secretLister corelisters.SecretLister, azureKeyVaultSecretsLister listers.AzureKeyVaultSecretLister, recorder record.EventRecorder, vaultService vault.Service, azureFrequency AzurePollFrequency) *Handler {
- return &Handler{
- kubeclientset: kubeclientset,
- azureKeyvaultClientset: azureKeyvaultClientset,
- secretsLister: secretLister,
- azureKeyVaultSecretsLister: azureKeyVaultSecretsLister,
- recorder: recorder,
- vaultService: vaultService,
- clock: &Clock{},
- }
-}
-
-// kubernetesSyncHandler compares the actual state with the desired, and attempts to
-// converge the two. It then updates the Status block of the AzureKeyVaultSecret resource
-// with the current status of the resource.
-func (h *Handler) kubernetesSyncHandler(key string) error {
- var azureKeyVaultSecret *akv.AzureKeyVaultSecret
- var secret *corev1.Secret
- var err error
-
- if azureKeyVaultSecret, err = h.getAzureKeyVaultSecret(key); err != nil {
- if exit := handleKeyVaultError(err, key); exit {
- return nil
- }
- return err
- }
-
- if secret, err = h.getOrCreateKubernetesSecret(azureKeyVaultSecret); err != nil {
- return err
- }
-
- if !metav1.IsControlledBy(secret, azureKeyVaultSecret) { // checks if the object has a controllerRef set to the given owner
- msg := fmt.Sprintf(MessageResourceExists, secret.Name)
- log.Warning(msg)
- h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeWarning, ErrResourceExists, msg)
- return fmt.Errorf(msg)
- }
-
- h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSynced)
- return nil
-}
-
-func (h *Handler) azureSyncHandler(key string) error {
- var azureKeyVaultSecret *akv.AzureKeyVaultSecret
- var secret *corev1.Secret
- var secretValue map[string][]byte
- var err error
-
- log.Debugf("Checking state for %s in Azure", key)
- if azureKeyVaultSecret, err = h.getAzureKeyVaultSecret(key); err != nil {
- if exit := handleKeyVaultError(err, key); exit {
- return nil
- }
- return err
- }
-
- log.Debugf("Getting secret value for %s in Azure", key)
- if secretValue, err = h.getSecretFromKeyVault(azureKeyVaultSecret); err != nil {
- msg := fmt.Sprintf(FailedAzureKeyVault, azureKeyVaultSecret.Name, azureKeyVaultSecret.Spec.Vault.Name)
- log.Errorf("failed to get secret value for '%s' from Azure Key vault '%s' using object name '%s', error: %+v", key, azureKeyVaultSecret.Spec.Vault.Name, azureKeyVaultSecret.Spec.Vault.Object.Name, err)
- h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeWarning, ErrAzureVault, msg)
- return fmt.Errorf(msg)
- }
-
- secretHash := getMD5Hash(secretValue)
-
- log.Debugf("Checking if secret value for %s has changed in Azure", key)
- if azureKeyVaultSecret.Status.SecretHash != secretHash {
- log.Infof("Secret has changed in Azure Key Vault for AzureKeyvVaultSecret %s. Updating Secret now.", azureKeyVaultSecret.Name)
-
- if secret, err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Update(createNewSecret(azureKeyVaultSecret, secretValue)); err != nil {
- log.Warningf("Failed to create Secret, Error: %+v", err)
- return err
- }
-
- log.Warningf("Secret value will now change for Secret '%s'. Any resources (like Pods) using this Secrets must be restarted to pick up the new value. Details: https://github.com/kubernetes/kubernetes/issues/22368", secret.Name)
- h.recorder.Event(azureKeyVaultSecret, corev1.EventTypeNormal, SuccessSynced, MessageResourceSyncedWithAzure)
- }
-
- log.Debugf("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name)
- if err = h.updateAzureKeyVaultSecretStatus(azureKeyVaultSecret, secretHash); err != nil {
- return err
- }
-
- return nil
-}
-
-func (h *Handler) getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (map[string][]byte, error) {
- var secretHandler KubernetesSecretHandler
-
- switch azureKeyVaultSecret.Spec.Vault.Object.Type {
- case akv.AzureKeyVaultObjectTypeSecret:
- transformator, err := transformers.CreateTransformator(&azureKeyVaultSecret.Spec.Output)
- if err != nil {
- return nil, err
- }
- secretHandler = NewAzureSecretHandler(azureKeyVaultSecret, h.vaultService, *transformator)
- case akv.AzureKeyVaultObjectTypeCertificate:
- secretHandler = NewAzureCertificateHandler(azureKeyVaultSecret, h.vaultService)
- case akv.AzureKeyVaultObjectTypeKey:
- secretHandler = NewAzureKeyHandler(azureKeyVaultSecret, h.vaultService)
- case akv.AzureKeyVaultObjectTypeMultiKeyValueSecret:
- secretHandler = NewAzureMultiKeySecretHandler(azureKeyVaultSecret, h.vaultService)
- default:
- return nil, fmt.Errorf("azure key vault object type '%s' not currently supported", azureKeyVaultSecret.Spec.Vault.Object.Type)
- }
- return secretHandler.Handle()
-}
-
-func (h *Handler) getAzureKeyVaultSecret(key string) (*akv.AzureKeyVaultSecret, error) {
- namespace, name, err := cache.SplitMetaNamespaceKey(key)
- if err != nil {
- return nil, fmt.Errorf("invalid resource key: %s", key)
- }
-
- azureKeyVaultSecret, err := h.azureKeyVaultSecretsLister.AzureKeyVaultSecrets(namespace).Get(name)
-
- if err != nil {
- return nil, err
- }
- return azureKeyVaultSecret, err
-}
-
-func (h *Handler) getOrCreateKubernetesSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret) (*corev1.Secret, error) {
- var secret *corev1.Secret
- var secretValues map[string][]byte
- var err error
-
- secretName := azureKeyVaultSecret.Spec.Output.Secret.Name
- if secretName == "" {
- return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name")
- }
-
- if secret, err = h.secretsLister.Secrets(azureKeyVaultSecret.Namespace).Get(secretName); err != nil {
- if errors.IsNotFound(err) {
- secretValues, err = h.getSecretFromKeyVault(azureKeyVaultSecret)
- if err != nil {
- return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, err)
- }
-
- if secret, err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Create(createNewSecret(azureKeyVaultSecret, secretValues)); err != nil {
- return nil, err
- }
-
- log.Infof("Updating status for AzureKeyVaultSecret '%s'", azureKeyVaultSecret.Name)
- if err = h.updateAzureKeyVaultSecretStatus(azureKeyVaultSecret, getMD5Hash(secretValues)); err != nil {
- return nil, err
- }
-
- return secret, nil
- }
- }
-
- if secretName != secret.Name {
- // Name of secret has changed in AzureKeyVaultSecret, so we need to delete current Secret and recreate
- // under new name
-
- // Delete secret
- if err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Delete(secret.Name, nil); err != nil {
- return nil, err
- }
-
- // Recreate secret under new Name
- if secret, err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Create(createNewSecret(azureKeyVaultSecret, secretValues)); err != nil {
- return nil, err
- }
- return secret, nil
- }
-
- if hasAzureKeyVaultSecretChanged(azureKeyVaultSecret, secret) {
- log.Infof("AzureKeyVaultSecret %s/%s output.secret values has changed and requires update to Secret %s", azureKeyVaultSecret.Namespace, azureKeyVaultSecret.Name, secretName)
- secret, err = h.kubeclientset.CoreV1().Secrets(azureKeyVaultSecret.Namespace).Update(createNewSecret(azureKeyVaultSecret, secret.Data))
- }
-
- return secret, err
-}
-
-func hasAzureKeyVaultSecretChanged(vaultSecret *akv.AzureKeyVaultSecret, secret *corev1.Secret) bool {
- secretType := determineSecretType(vaultSecret)
- if secretType != secret.Type {
- return true
- }
-
- // Check if dataKey has changed by trying to lookup key
- if vaultSecret.Spec.Output.Secret.DataKey != "" {
- if _, ok := secret.Data[vaultSecret.Spec.Output.Secret.DataKey]; !ok {
- return true
- }
- }
- return false
-}
-
-func (h *Handler) updateAzureKeyVaultSecretStatus(azureKeyVaultSecret *akv.AzureKeyVaultSecret, secretHash string) error {
- secretName := determineSecretName(azureKeyVaultSecret)
-
- // NEVER modify objects from the store. It's a read-only, local cache.
- // You can use DeepCopy() to make a deep copy of original object and modify this copy
- // Or create a copy manually for better performance
-
- azureKeyVaultSecretCopy := azureKeyVaultSecret.DeepCopy()
- azureKeyVaultSecretCopy.Status.SecretHash = secretHash
- azureKeyVaultSecretCopy.Status.LastAzureUpdate = h.clock.Now()
- azureKeyVaultSecretCopy.Status.SecretName = secretName
-
- // If the CustomResourceSubresources feature gate is not enabled,
- // we must use Update instead of UpdateStatus to update the Status block of the AzureKeyVaultSecret resource.
- // UpdateStatus will not allow changes to the Spec of the resource,
- // which is ideal for ensuring nothing other than resource status has been updated.
- _, err := h.azureKeyvaultClientset.AzurekeyvaultV1().AzureKeyVaultSecrets(azureKeyVaultSecret.Namespace).UpdateStatus(azureKeyVaultSecretCopy)
- return err
-}
-
-func handleKeyVaultError(err error, key string) bool {
- log.Debugf("Handling error for '%s' in AzureKeyVaultSecret: %s", key, err.Error())
- if err != nil {
- // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing.
- if errors.IsNotFound(err) {
- log.Debugf("Error for '%s' was 'Not Found'", key)
-
- utilruntime.HandleError(fmt.Errorf("AzureKeyVaultSecret '%s' in work queue no longer exists", key))
- return true
- }
- }
- return false
-}
-
-// handleObject will take any resource implementing metav1.Object and attempt
-// to find the AzureKeyVaultSecret resource that 'owns' it. It does this by looking at the
-// objects metadata.ownerReferences field for an appropriate OwnerReference.
-// It then enqueues that AzureKeyVaultSecret resource to be processed. If the object does not
-// have an appropriate OwnerReference, it will simply be skipped.
-func (h *Handler) handleObject(obj interface{}) (*akv.AzureKeyVaultSecret, bool, error) {
- var object metav1.Object
- var ok bool
-
- if object, ok = obj.(metav1.Object); !ok {
- tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
- if !ok {
- return nil, false, fmt.Errorf("error decoding object, invalid type")
- }
- object, ok = tombstone.Obj.(metav1.Object)
- if !ok {
- return nil, false, fmt.Errorf("error decoding object tombstone, invalid type")
- }
- log.Infof("Recovered deleted object '%s' from tombstone", object.GetName())
- }
-
- log.Debugf("Processing object: %s", object.GetName())
- if ownerRef := metav1.GetControllerOf(object); ownerRef != nil {
- // If this object is not owned by a AzureKeyVaultSecret, we should not do anything more
- // with it.
- if ownerRef.Kind != "AzureKeyVaultSecret" {
- return nil, true, nil
- }
-
- azureKeyVaultSecret, err := h.azureKeyVaultSecretsLister.AzureKeyVaultSecrets(object.GetNamespace()).Get(ownerRef.Name)
- if err != nil {
- log.Infof("ignoring orphaned object '%s' of azureKeyVaultSecret '%s'", object.GetSelfLink(), ownerRef.Name)
- return nil, true, nil
- }
-
- return azureKeyVaultSecret, false, nil
- }
- return nil, true, nil
-}
-
-// newSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets
-// the appropriate OwnerReferences on the resource so handleObject can discover
-// the AzureKeyVaultSecret resource that 'owns' it.
-func createNewSecret(azureKeyVaultSecret *akv.AzureKeyVaultSecret, azureSecretValue map[string][]byte) *corev1.Secret {
- secretName := determineSecretName(azureKeyVaultSecret)
- secretType := determineSecretType(azureKeyVaultSecret)
-
- return &corev1.Secret{
- ObjectMeta: metav1.ObjectMeta{
- Name: secretName,
- Namespace: azureKeyVaultSecret.Namespace,
- OwnerReferences: []metav1.OwnerReference{
- *metav1.NewControllerRef(azureKeyVaultSecret, schema.GroupVersionKind{
- Group: akv.SchemeGroupVersion.Group,
- Version: akv.SchemeGroupVersion.Version,
- Kind: "AzureKeyVaultSecret",
- }),
- },
- },
- Type: secretType,
- Data: azureSecretValue,
- }
-}
-
-func determineSecretName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string {
- name := azureKeyVaultSecret.Spec.Output.Secret.Name
- if name == "" {
- name = azureKeyVaultSecret.Name
- }
- return name
-}
-
-func determineSecretType(azureKeyVaultSecret *akv.AzureKeyVaultSecret) corev1.SecretType {
- if azureKeyVaultSecret.Spec.Output.Secret.Type == "" {
- return corev1.SecretTypeOpaque
- }
-
- return azureKeyVaultSecret.Spec.Output.Secret.Type
-}
-
-func getMD5Hash(values map[string][]byte) string {
- var mergedValues bytes.Buffer
-
- keys := sortValueKeys(values)
-
- for _, k := range keys {
- mergedValues.WriteString(k + string(values[k]))
- }
-
- hasher := md5.New()
- hasher.Write([]byte(mergedValues.String()))
- return hex.EncodeToString(hasher.Sum(nil))
-}
-
-func sortValueKeys(values map[string][]byte) []string {
- var keys []string
- for k := range values {
- keys = append(keys, k)
- }
- sort.Strings(keys)
- return keys
-}
diff --git a/cmd/azure-keyvault-controller/controller/secret.go b/cmd/azure-keyvault-controller/controller/secret.go
new file mode 100644
index 00000000..27bdeac8
--- /dev/null
+++ b/cmd/azure-keyvault-controller/controller/secret.go
@@ -0,0 +1,377 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "bytes"
+ "context"
+ "crypto/md5"
+ "encoding/hex"
+ "fmt"
+ "sort"
+
+ akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+ "k8s.io/klog/v2"
+
+ corev1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/errors"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+ "k8s.io/client-go/tools/cache"
+)
+
+func convertToSecret(obj interface{}) (*corev1.Secret, error) {
+ secret, ok := obj.(*corev1.Secret)
+ if !ok {
+ tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
+ if !ok {
+ return nil, fmt.Errorf("couldn't get object from tombstone %#v", obj)
+ }
+ secret, ok = tombstone.Obj.(*corev1.Secret)
+ if !ok {
+ return nil, fmt.Errorf("tombstone contained object that is not a Secret %#v", obj)
+ }
+ }
+ return secret, nil
+}
+
+func (c *Controller) getSecretByKey(key string) (*corev1.Secret, error) {
+ namespace, name, err := cache.SplitMetaNamespaceKey(key)
+ if err != nil {
+ return nil, fmt.Errorf("invalid resource key: %s", key)
+ }
+
+ return c.getSecret(namespace, name)
+}
+
+func (c *Controller) getSecret(ns, name string) (*corev1.Secret, error) {
+ klog.V(4).InfoS("getting secret", "secret", klog.KRef(ns, name))
+ secret, err := c.secretsLister.Secrets(ns).Get(name)
+
+ if err != nil {
+ return nil, err
+ }
+ return secret, err
+}
+
+func (c *Controller) deleteKubernetesSecretValues(akvs *akv.AzureKeyVaultSecret) error {
+ secret, err := c.getSecret(akvs.Namespace, akvs.Spec.Output.Secret.Name)
+ if errors.IsNotFound(err) {
+ return nil
+ }
+
+ secretData := secret.Data
+
+ data, err := c.getSecretFromKeyVault(akvs)
+ if err != nil {
+ return err
+ }
+
+ for key := range data {
+ delete(secretData, key)
+ }
+
+ newSecret, err := createNewSecretFromExistingWithUpdatedValues(akvs, secretData, secret)
+ if err != nil {
+ return err
+ }
+
+ secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(context.TODO(), newSecret, metav1.UpdateOptions{})
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+func (c *Controller) getOrCreateKubernetesSecret(akvs *akv.AzureKeyVaultSecret) (*corev1.Secret, error) {
+ var secret *corev1.Secret
+ var secretValues map[string][]byte
+ var err error
+
+ secretName := akvs.Spec.Output.Secret.Name
+ if secretName == "" {
+ return nil, fmt.Errorf("output secret name must be specified using spec.output.secret.name")
+ }
+
+ klog.V(4).InfoS("get or create secret", "secret", klog.KRef(akvs.Namespace, secretName))
+ if secret, err = c.secretsLister.Secrets(akvs.Namespace).Get(secretName); err != nil {
+ if errors.IsNotFound(err) {
+ secretValues, err = c.getSecretFromKeyVault(akvs)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err)
+ }
+
+ if secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Create(context.TODO(), createNewSecret(akvs, secretValues), metav1.CreateOptions{}); err != nil {
+ return nil, err
+ }
+
+ klog.InfoS("updating status for azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs))
+ if err = c.updateAzureKeyVaultSecretStatusForSecret(akvs, getMD5HashOfByteValues(secretValues)); err != nil {
+ return nil, err
+ }
+
+ return secret, nil
+ }
+ }
+
+ // get updated secret values from azure key vault
+ secretValues, err = c.getSecretFromKeyVault(akvs)
+ if err != nil {
+ return nil, fmt.Errorf("failed to get secret from Azure Key Vault for secret '%s'/'%s', error: %+v", akvs.Namespace, akvs.Name, err)
+ }
+
+ if secretName != secret.Name {
+ // Name of secret has changed in AzureKeyVaultSecret, so we need to delete current Secret and recreate
+ // under new name
+
+ // Only delete if this akvs is the only owner
+ if !hasMultipleOwners(secret.GetOwnerReferences()) {
+ // Delete secret
+ if err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Delete(context.TODO(), secret.Name, metav1.DeleteOptions{}); err != nil {
+ return nil, err
+ }
+ }
+
+ // Recreate secret under new Name
+ if secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Create(context.TODO(), createNewSecret(akvs, secretValues), metav1.CreateOptions{}); err != nil {
+ return nil, err
+ }
+ return secret, nil
+ }
+
+ if hasAzureKeyVaultSecretChangedForSecret(akvs, secretValues, secret) {
+ klog.InfoS("values have changed requiring update to secret", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret))
+
+ updatedSecret, err := createNewSecretFromExisting(akvs, secretValues, secret)
+ if err != nil {
+ return nil, err
+ }
+ secret, err = c.kubeclientset.CoreV1().Secrets(akvs.Namespace).Update(context.TODO(), updatedSecret, metav1.UpdateOptions{})
+ if err == nil {
+ klog.InfoS("secret updated", "azurekeyvaultsecret", klog.KObj(akvs), "secret", klog.KObj(secret))
+ }
+ }
+
+ return secret, err
+}
+
+func hasMultipleOwners(refs []metav1.OwnerReference) bool {
+ hits := 0
+ for _, ref := range refs {
+ if ref.Kind == "AzureKeyVaultSecret" {
+ hits = hits + 1
+ }
+ if hits > 1 {
+ return true
+ }
+ }
+ return false
+}
+
+// newSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets
+// the appropriate OwnerReferences on the resource so handleObject can discover
+// the AzureKeyVaultSecret resource that 'owns' it.
+func createNewSecret(akvs *akv.AzureKeyVaultSecret, azureSecretValues map[string][]byte) *corev1.Secret {
+ secretName := determineSecretName(akvs)
+ secretType := determineSecretType(akvs)
+
+ return &corev1.Secret{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: secretName,
+ Namespace: akvs.Namespace,
+ Labels: akvs.Labels,
+ Annotations: akvs.Annotations,
+ OwnerReferences: []metav1.OwnerReference{
+ *newOwnerRef(akvs, schema.GroupVersionKind{
+ Group: akv.SchemeGroupVersion.Group,
+ Version: akv.SchemeGroupVersion.Version,
+ Kind: "AzureKeyVaultSecret",
+ }),
+ },
+ },
+ Type: secretType,
+ Data: azureSecretValues,
+ }
+}
+
+// createNewSecretFromExisting creates a new Secret for a AzureKeyVaultSecret resource. It also sets
+// the appropriate OwnerReferences on the resource so handleObject can discover
+// the AzureKeyVaultSecret resource that 'owns' it.
+func createNewSecretFromExisting(akvs *akv.AzureKeyVaultSecret, values map[string][]byte, existingSecret *corev1.Secret) (*corev1.Secret, error) {
+ secretName := determineSecretName(akvs)
+ secretType := determineSecretType(akvs)
+
+ // if existing secret is not opaque and owned by a different akvs,
+ // we cannot update this secret, as none opaque secrets cannot have multiple owners,
+ // because they would overrite each others keys
+ if existingSecret.Type != corev1.SecretTypeOpaque {
+ if !isOwnedBy(existingSecret, akvs) {
+ controlledBy := metav1.GetControllerOf(existingSecret)
+ return nil, fmt.Errorf("cannot update existing secret %s/%s of type %s controlled by %s, as this azurekeyvalutsecret %s would overwrite keys", existingSecret.Namespace, existingSecret.Name, existingSecret.Type, controlledBy.Name, akvs.Name)
+ }
+ }
+
+ secretClone := existingSecret.DeepCopy()
+ ownerRefs := secretClone.GetOwnerReferences()
+
+ if !isOwnedBy(existingSecret, akvs) {
+ ownerRefs = append(ownerRefs, *newOwnerRef(akvs, schema.GroupVersionKind{
+ Group: akv.SchemeGroupVersion.Group,
+ Version: akv.SchemeGroupVersion.Version,
+ Kind: "AzureKeyVaultSecret",
+ }))
+ }
+
+ mergedValues := mergeValuesWithExistingSecret(values, existingSecret)
+
+ return &corev1.Secret{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: secretName,
+ Namespace: akvs.Namespace,
+ Labels: akvs.Labels,
+ Annotations: akvs.Annotations,
+ OwnerReferences: ownerRefs,
+ },
+ Type: secretType,
+ Data: mergedValues,
+ }, nil
+}
+
+// updateExistingSecret creates a new Secret for a AzureKeyVaultSecret resource. It also sets
+// the appropriate OwnerReferences on the resource so handleObject can discover
+// the AzureKeyVaultSecret resource that 'owns' it.
+func createNewSecretFromExistingWithUpdatedValues(akvs *akv.AzureKeyVaultSecret, values map[string][]byte, existingSecret *corev1.Secret) (*corev1.Secret, error) {
+ secretName := determineSecretName(akvs)
+ secretType := determineSecretType(akvs)
+
+ secretClone := existingSecret.DeepCopy()
+ ownerRefs := secretClone.GetOwnerReferences()
+
+ return &corev1.Secret{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: secretName,
+ Namespace: akvs.Namespace,
+ Labels: akvs.Labels,
+ Annotations: akvs.Annotations,
+ OwnerReferences: ownerRefs,
+ },
+ Type: secretType,
+ Data: values,
+ }, nil
+}
+
+func isOwnedBy(obj metav1.Object, owner metav1.Object) bool {
+ ownerRefs := obj.GetOwnerReferences()
+
+ for _, ref := range ownerRefs {
+ if ref.Kind == "AzureKeyVaultSecret" && ref.Name == owner.GetName() && ref.UID == owner.GetUID() {
+ return true
+ }
+ }
+ return false
+}
+
+func mergeValuesWithExistingSecret(values map[string][]byte, secret *corev1.Secret) map[string][]byte {
+ newValues := make(map[string][]byte)
+
+ // copy existing values into new map
+ for k, v := range values {
+ newValues[k] = v
+ }
+
+ // copy any values from existing secret that does not exist in akvs values
+ for key, val := range secret.Data {
+ if _, ok := values[key]; !ok {
+ newValues[key] = val
+ }
+ }
+ return newValues
+}
+
+func determineSecretName(azureKeyVaultSecret *akv.AzureKeyVaultSecret) string {
+ name := azureKeyVaultSecret.Spec.Output.Secret.Name
+ if name == "" {
+ name = azureKeyVaultSecret.Name
+ }
+ return name
+}
+
+func determineSecretType(azureKeyVaultSecret *akv.AzureKeyVaultSecret) corev1.SecretType {
+ if azureKeyVaultSecret.Spec.Output.Secret.Type == "" {
+ return corev1.SecretTypeOpaque
+ }
+
+ return azureKeyVaultSecret.Spec.Output.Secret.Type
+}
+
+func getMD5HashOfByteValues(values map[string][]byte) string {
+ var mergedValues bytes.Buffer
+
+ // sort keys to make sure hash is consistant
+ keys := sortByteValueKeys(values)
+
+ for _, k := range keys {
+ mergedValues.WriteString(k + string(values[k]))
+ }
+
+ hasher := md5.New()
+ hasher.Write([]byte(mergedValues.String()))
+ return hex.EncodeToString(hasher.Sum(nil))
+}
+
+func getMD5HashOfSecret(akvsValues map[string][]byte, secret *corev1.Secret) string {
+ // filter out only values related to this akvs,
+ // as multiple akvs can write to a single secret
+ values := filterByteValueKeys(akvsValues, secret.Data)
+ return getMD5HashOfByteValues(values)
+}
+
+func filterByteValueKeys(akvsValues, secretValues map[string][]byte) map[string][]byte {
+ filtered := make(map[string][]byte)
+
+ for key := range akvsValues {
+ if secretVal, ok := secretValues[key]; ok {
+ filtered[key] = secretVal
+ }
+ }
+ return filtered
+}
+
+func sortByteValueKeys(values map[string][]byte) []string {
+ var keys []string
+ for k := range values {
+ keys = append(keys, k)
+ }
+ sort.Strings(keys)
+ return keys
+}
+
+// func handleSecretError(err error, key string) bool {
+// if err != nil {
+// // The AzureKeyVaultSecret resource may no longer exist, in which case we stop processing.
+// if errors.IsNotFound(err) {
+// log.Debugf("Error for '%s' was 'Not Found'", key)
+
+// utilruntime.HandleError(fmt.Errorf("Secret '%s' in work queue no longer exists", key))
+// return true
+// }
+// }
+// return false
+// }
diff --git a/cmd/azure-keyvault-controller/controller/secret_handler.go b/cmd/azure-keyvault-controller/controller/secret_handler.go
index 6d53759c..f2aca5fd 100644
--- a/cmd/azure-keyvault-controller/controller/secret_handler.go
+++ b/cmd/azure-keyvault-controller/controller/secret_handler.go
@@ -22,46 +22,47 @@ import (
"strings"
"github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers"
- vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client"
- akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
- log "github.com/sirupsen/logrus"
+ vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client"
+ akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
yaml "gopkg.in/yaml.v2"
corev1 "k8s.io/api/core/v1"
+ "k8s.io/klog/v2"
)
// KubernetesSecretHandler handles getting and formatting secrets from Azure Key Vault to Kubernetes
-type KubernetesSecretHandler interface {
- Handle() (map[string][]byte, error)
+type KubernetesHandler interface {
+ HandleSecret() (map[string][]byte, error)
+ HandleConfigMap() (map[string]string, error)
}
-// AzureSecretHandler handles getting and formatting Azure Key Vault Secret from Azure Key Vault to Kubernetes
-type AzureSecretHandler struct {
+// azureSecretHandler handles getting and formatting Azure Key Vault Secret from Azure Key Vault to Kubernetes
+type azureSecretHandler struct {
secretSpec *akv.AzureKeyVaultSecret
vaultService vault.Service
transformator transformers.Transformator
}
-// AzureCertificateHandler handles getting and formatting Azure Key Vault Certificate from Azure Key Vault to Kubernetes
-type AzureCertificateHandler struct {
+// azureCertificateHandler handles getting and formatting Azure Key Vault Certificate from Azure Key Vault to Kubernetes
+type azureCertificateHandler struct {
secretSpec *akv.AzureKeyVaultSecret
vaultService vault.Service
}
-// AzureKeyHandler handles getting and formatting Azure Key Vault Key from Azure Key Vault to Kubernetes
-type AzureKeyHandler struct {
+// azureKeyHandler handles getting and formatting Azure Key Vault Key from Azure Key Vault to Kubernetes
+type azureKeyHandler struct {
secretSpec *akv.AzureKeyVaultSecret
vaultService vault.Service
}
-// AzureMultiValueSecretHandler handles getting and formatting Azure Key Vault Secret containing multiple values from Azure Key Vault to Kubernetes
-type AzureMultiValueSecretHandler struct {
+// azureMultiValueSecretHandler handles getting and formatting Azure Key Vault Secret containing multiple values from Azure Key Vault to Kubernetes
+type azureMultiValueSecretHandler struct {
secretSpec *akv.AzureKeyVaultSecret
vaultService vault.Service
}
// NewAzureSecretHandler return a new AzureSecretHandler
-func NewAzureSecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service, transformator transformers.Transformator) *AzureSecretHandler {
- return &AzureSecretHandler{
+func NewAzureSecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service, transformator transformers.Transformator) *azureSecretHandler {
+ return &azureSecretHandler{
secretSpec: secretSpec,
vaultService: vaultService,
transformator: transformator,
@@ -69,33 +70,33 @@ func NewAzureSecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vau
}
// NewAzureCertificateHandler return a new AzureCertificateHandler
-func NewAzureCertificateHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *AzureCertificateHandler {
- return &AzureCertificateHandler{
+func NewAzureCertificateHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *azureCertificateHandler {
+ return &azureCertificateHandler{
secretSpec: secretSpec,
vaultService: vaultService,
}
}
// NewAzureKeyHandler returns a new AzureKeyHandler
-func NewAzureKeyHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *AzureKeyHandler {
- return &AzureKeyHandler{
+func NewAzureKeyHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *azureKeyHandler {
+ return &azureKeyHandler{
secretSpec: secretSpec,
vaultService: vaultService,
}
}
// NewAzureMultiKeySecretHandler returns a new AzureMultiKeySecretHandler
-func NewAzureMultiKeySecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *AzureMultiValueSecretHandler {
- return &AzureMultiValueSecretHandler{
+func NewAzureMultiKeySecretHandler(secretSpec *akv.AzureKeyVaultSecret, vaultService vault.Service) *azureMultiValueSecretHandler {
+ return &azureMultiValueSecretHandler{
secretSpec: secretSpec,
vaultService: vaultService,
}
}
// Handle getting and formating Azure Key Vault Secret from Azure Key Vault to Kubernetes
-func (h *AzureSecretHandler) Handle() (map[string][]byte, error) {
+func (h *azureSecretHandler) HandleSecret() (map[string][]byte, error) {
if h.secretSpec.Spec.Vault.Object.Type == akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && h.secretSpec.Spec.Output.Secret.DataKey != "" {
- log.Warnf("output data key for %s/%s ignored, since vault object type is '%s' it will use its own keys", h.secretSpec.Namespace, h.secretSpec.Name, akv.AzureKeyVaultObjectTypeMultiKeyValueSecret)
+ klog.InfoS("output data key ignored - vault object type is multi key and will use its own keys", klog.KObj(h.secretSpec))
}
values := make(map[string][]byte)
@@ -139,26 +140,54 @@ func (h *AzureSecretHandler) Handle() (map[string][]byte, error) {
return values, nil
}
+// Handle getting and formating Azure Key Vault Secret from Azure Key Vault to Kubernetes
+func (h *azureSecretHandler) HandleConfigMap() (map[string]string, error) {
+ if h.secretSpec.Spec.Vault.Object.Type == akv.AzureKeyVaultObjectTypeMultiKeyValueSecret && h.secretSpec.Spec.Output.ConfigMap.DataKey != "" {
+ klog.InfoS("output data key ignored - vault object type is multi key and will use its own keys", klog.KObj(h.secretSpec))
+ }
+
+ values := make(map[string]string)
+
+ secret, err := h.vaultService.GetSecret(&h.secretSpec.Spec.Vault)
+ if err != nil {
+ return nil, err
+ }
+
+ secret, err = h.transformator.Transform(secret)
+ if err != nil {
+ return nil, err
+ }
+
+ if h.secretSpec.Spec.Vault.Object.Type != akv.AzureKeyVaultObjectTypeMultiKeyValueSecret &&
+ h.secretSpec.Spec.Output.ConfigMap.DataKey == "" {
+ return nil, fmt.Errorf("no datakey spesified for output configmap")
+ }
+ values[h.secretSpec.Spec.Output.ConfigMap.DataKey] = secret
+
+ return values, nil
+}
+
// Handle getting and formating Azure Key Vault Certificate from Azure Key Vault to Kubernetes
-func (h *AzureCertificateHandler) Handle() (map[string][]byte, error) {
+func (h *azureCertificateHandler) HandleSecret() (map[string][]byte, error) {
values := make(map[string][]byte)
var err error
-
- exportPrivateKey := h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeTLS || h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeOpaque
- if !exportPrivateKey && h.secretSpec.Spec.Output.Secret.DataKey == "" {
- return nil, fmt.Errorf("no datakey spesified for output secret")
+ options := vault.CertificateOptions{
+ ExportPrivateKey: h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeTLS || h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeOpaque,
+ EnsureServerFirst: h.secretSpec.Spec.Output.Secret.ChainOrder == "ensureserverfirst",
}
- log.Infof("Exporting certificate with private key: %t", exportPrivateKey)
+ if !options.ExportPrivateKey && h.secretSpec.Spec.Output.Secret.DataKey == "" {
+ return nil, fmt.Errorf("no datakey specified for output secret")
+ }
- cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, exportPrivateKey)
+ cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, &options)
if err != nil {
return nil, err
}
if h.secretSpec.Spec.Output.Secret.Type == corev1.SecretTypeOpaque {
values[h.secretSpec.Spec.Output.Secret.DataKey] = cert.ExportRaw()
- } else if exportPrivateKey {
+ } else if options.ExportPrivateKey {
if values[corev1.TLSCertKey], err = cert.ExportPublicKeyAsPem(); err != nil {
return nil, err
}
@@ -175,8 +204,28 @@ func (h *AzureCertificateHandler) Handle() (map[string][]byte, error) {
return values, nil
}
+// Handle getting and formating Azure Key Vault Certificate from Azure Key Vault to Kubernetes
+func (h *azureCertificateHandler) HandleConfigMap() (map[string]string, error) {
+ values := make(map[string]string)
+ var err error
+
+ cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ value, err := cert.ExportPublicKeyAsPem()
+ if err != nil {
+ return nil, err
+ }
+
+ values[h.secretSpec.Spec.Output.ConfigMap.DataKey] = string(value)
+
+ return values, nil
+}
+
// Handle getting and formating Azure Key Vault Key from Azure Key Vault to Kubernetes
-func (h *AzureKeyHandler) Handle() (map[string][]byte, error) {
+func (h *azureKeyHandler) HandleSecret() (map[string][]byte, error) {
key, err := h.vaultService.GetKey(&h.secretSpec.Spec.Vault)
if err != nil {
return nil, err
@@ -187,8 +236,20 @@ func (h *AzureKeyHandler) Handle() (map[string][]byte, error) {
return values, nil
}
+// Handle getting and formating Azure Key Vault Key from Azure Key Vault to Kubernetes
+func (h *azureKeyHandler) HandleConfigMap() (map[string]string, error) {
+ key, err := h.vaultService.GetKey(&h.secretSpec.Spec.Vault)
+ if err != nil {
+ return nil, err
+ }
+
+ values := make(map[string]string)
+ values[h.secretSpec.Spec.Output.ConfigMap.DataKey] = key
+ return values, nil
+}
+
// Handle getting and formating Azure Key Vault Secret containing mulitple values from Azure Key Vault to Kubernetes
-func (h *AzureMultiValueSecretHandler) Handle() (map[string][]byte, error) {
+func (h *azureMultiValueSecretHandler) HandleSecret() (map[string][]byte, error) {
values := make(map[string][]byte)
if h.secretSpec.Spec.Vault.Object.ContentType == "" {
@@ -221,3 +282,38 @@ func (h *AzureMultiValueSecretHandler) Handle() (map[string][]byte, error) {
return values, nil
}
+
+// Handle getting and formating Azure Key Vault Secret containing mulitple values from Azure Key Vault to Kubernetes
+func (h *azureMultiValueSecretHandler) HandleConfigMap() (map[string]string, error) {
+ values := make(map[string]string)
+
+ if h.secretSpec.Spec.Vault.Object.ContentType == "" {
+ return nil, fmt.Errorf("cannot use '%s' without also specifying content type", akv.AzureKeyVaultObjectTypeMultiKeyValueSecret)
+ }
+
+ secret, err := h.vaultService.GetSecret(&h.secretSpec.Spec.Vault)
+ if err != nil {
+ return nil, err
+ }
+
+ var dat map[string]string
+
+ switch h.secretSpec.Spec.Vault.Object.ContentType {
+ case akv.AzureKeyVaultObjectContentTypeJSON:
+ if err := json.Unmarshal([]byte(secret), &dat); err != nil {
+ return nil, err
+ }
+ case akv.AzureKeyVaultObjectContentTypeYaml:
+ if err := yaml.Unmarshal([]byte(secret), &dat); err != nil {
+ return nil, err
+ }
+ default:
+ return nil, fmt.Errorf("content type '%s' not supported", h.secretSpec.Spec.Vault.Object.ContentType)
+ }
+
+ for k, v := range dat {
+ values[k] = v
+ }
+
+ return values, nil
+}
diff --git a/cmd/azure-keyvault-controller/controller/secret_handler_test.go b/cmd/azure-keyvault-controller/controller/secret_handler_test.go
index dcbdd616..39a1d638 100644
--- a/cmd/azure-keyvault-controller/controller/secret_handler_test.go
+++ b/cmd/azure-keyvault-controller/controller/secret_handler_test.go
@@ -21,8 +21,8 @@ import (
"testing"
"github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers"
- vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client"
- akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client"
+ akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
@@ -46,7 +46,7 @@ func (f *fakeVaultService) GetSecret(secret *akv.AzureKeyVault) (string, error)
func (f *fakeVaultService) GetKey(secret *akv.AzureKeyVault) (string, error) {
return "", nil
}
-func (f *fakeVaultService) GetCertificate(secret *akv.AzureKeyVault, exportPrivateKey bool) (*vault.Certificate, error) {
+func (f *fakeVaultService) GetCertificate(secret *akv.AzureKeyVault, options *vault.CertificateOptions) (*vault.Certificate, error) {
if f.fakeCertValue != "" {
return vault.NewCertificateFromPem(f.fakeCertValue)
}
@@ -83,13 +83,21 @@ secondValue: some second value data`,
secret.Spec.Vault.Object.ContentType = "application/x-yaml"
handler := NewAzureMultiKeySecretHandler(secret, fakeVault)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error(err)
}
if len(values) != 2 {
t.Errorf("number of values returned should be 2 but were %d", len(values))
}
+
+ valuesCM, err := handler.HandleConfigMap()
+ if err != nil {
+ t.Error(err)
+ }
+ if len(valuesCM) != 2 {
+ t.Errorf("number of values returned should be 2 but were %d", len(values))
+ }
}
func TestHandleSecretWithNoDataKey(t *testing.T) {
@@ -100,7 +108,24 @@ func TestHandleSecretWithNoDataKey(t *testing.T) {
secret := secret()
transformator, err := transformers.CreateTransformator(&secret.Spec.Output)
handler := NewAzureSecretHandler(secret, fakeVault, *transformator)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
+ if err == nil {
+ t.Error("Should fail when no datakey is spesified")
+ }
+ if values != nil {
+ t.Error("handler should not have returned values")
+ }
+}
+
+func TestHandleConfigMapWithNoDataKey(t *testing.T) {
+ fakeVault := &fakeVaultService{
+ fakeSecretValue: "Some very secret data",
+ }
+
+ secret := secret()
+ transformator, err := transformers.CreateTransformator(&secret.Spec.Output)
+ handler := NewAzureSecretHandler(secret, fakeVault, *transformator)
+ values, err := handler.HandleConfigMap()
if err == nil {
t.Error("Should fail when no datakey is spesified")
}
@@ -119,7 +144,7 @@ func TestHandleCertificateWithTlsOutput(t *testing.T) {
secret.Spec.Output.Secret.Type = corev1.SecretTypeTLS
handler := NewAzureCertificateHandler(secret, fakeVault)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error(err)
}
@@ -147,7 +172,7 @@ func TestHandlePubliKeyCertificateOnlyWithTlsOutput(t *testing.T) {
secret.Spec.Output.Secret.Type = corev1.SecretTypeTLS
handler := NewAzureCertificateHandler(secret, fakeVault)
- _, err := handler.Handle()
+ _, err := handler.HandleSecret()
if err == nil {
t.Error("Handler should fail because there are no private key in certificate")
}
@@ -163,7 +188,7 @@ func TestHandlePubliKeyCertificateWithDataKey(t *testing.T) {
secret.Spec.Output.Secret.DataKey = "mykey"
handler := NewAzureCertificateHandler(secret, fakeVault)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error("Should have returned error because there is no private key")
}
@@ -187,7 +212,7 @@ func TestHandleCertificateFailureWithNoOutputDataKey(t *testing.T) {
secret.Spec.Vault.Object.Type = "certificate"
handler := NewAzureCertificateHandler(secret, fakeVault)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err == nil {
t.Error("Handler should fail because there are no dataKey defined")
}
@@ -206,7 +231,7 @@ func TestHandleCertificateWithOutputDataKey(t *testing.T) {
secret.Spec.Output.Secret.DataKey = "my-key"
handler := NewAzureCertificateHandler(secret, fakeVault)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error(err)
}
@@ -232,7 +257,7 @@ func TestHandleCertificateWithRawOutput(t *testing.T) {
secret.Spec.Output.Secret.Type = corev1.SecretTypeOpaque
handler := NewAzureCertificateHandler(secret, fakeVault)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error(err)
}
@@ -259,7 +284,7 @@ func TestHandleSecretWithBasicAuthOutput(t *testing.T) {
transformator, err := transformers.CreateTransformator(&secret.Spec.Output)
handler := NewAzureSecretHandler(secret, fakeVault, *transformator)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error(err)
}
@@ -288,7 +313,7 @@ func TestHandleSecretWithDockerConfigJsonAsOutput(t *testing.T) {
transformator, err := transformers.CreateTransformator(&secret.Spec.Output)
handler := NewAzureSecretHandler(secret, fakeVault, *transformator)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error(err)
}
@@ -314,7 +339,7 @@ func TestHandleSecretWithDockerConfigAsOutput(t *testing.T) {
transformator, err := transformers.CreateTransformator(&secret.Spec.Output)
handler := NewAzureSecretHandler(secret, fakeVault, *transformator)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error(err)
}
@@ -340,7 +365,7 @@ func TestHandleSecretWithSSHAuthAsOutput(t *testing.T) {
transformator, err := transformers.CreateTransformator(&secret.Spec.Output)
handler := NewAzureSecretHandler(secret, fakeVault, *transformator)
- values, err := handler.Handle()
+ values, err := handler.HandleSecret()
if err != nil {
t.Error(err)
}
diff --git a/cmd/azure-keyvault-controller/main.go b/cmd/azure-keyvault-controller/main.go
index 273eeec1..06b5d9e6 100644
--- a/cmd/azure-keyvault-controller/main.go
+++ b/cmd/azure-keyvault-controller/main.go
@@ -21,11 +21,11 @@ package main
import (
"flag"
+ "fmt"
"os"
- "strconv"
"time"
- log "github.com/sirupsen/logrus"
+ "github.com/spf13/viper"
corev1 "k8s.io/api/core/v1"
kubeinformers "k8s.io/client-go/informers"
@@ -35,181 +35,156 @@ import (
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/tools/record"
+ json "k8s.io/component-base/logs/json"
+ "k8s.io/klog/v2"
+
"github.com/SparebankenVest/azure-key-vault-to-kubernetes/cmd/azure-keyvault-controller/controller"
- vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider"
+ vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client"
clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned"
informers "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions"
"github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/signals"
)
+const controllerAgentName = "azurekeyvaultcontroller"
+
var (
- masterURL string
+ version string
kubeconfig string
+ masterURL string
cloudconfig string
- logLevel string
-
- azureVaultFastRate time.Duration
- azureVaultSlowRate time.Duration
- azureVaultMaxFastAttempts int
- customAuth bool
- namespace string
+ logFormat string
)
-const controllerAgentName = "azurekeyvaultcontroller"
+func initConfig() {
+ viper.SetDefault("auth_type", "azureCloudConfig")
-func main() {
- flag.Parse()
+ viper.AutomaticEnv()
+}
- log.SetFormatter(&log.TextFormatter{
- DisableColors: true,
- FullTimestamp: true,
- })
+func init() {
+ flag.CommandLine = flag.NewFlagSet("akv2k8s controller", flag.ExitOnError)
- // set up signals so we handle the first shutdown signal gracefully
- stopCh := signals.SetupSignalHandler()
- setLogLevel()
+ flag.StringVar(&logFormat, "logging-format", "text", "Log format - text or json.")
+ flag.StringVar(&version, "version", "", "Version of this component.")
+ flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.")
+ flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
+ flag.StringVar(&cloudconfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json")
+}
- var err error
- azureVaultFastRate, err = getEnvDuration("AZURE_VAULT_NORMAL_POLL_INTERVALS", time.Minute*1)
- if err != nil {
- log.Fatalf("Error parsing env var AZURE_VAULT_NORMAL_POLL_INTERVALS: %s", err.Error())
- }
+func main() {
+ klog.InitFlags(nil)
+ defer klog.Flush()
- azureVaultSlowRate, err = getEnvDuration("AZURE_VAULT_EXCEPTION_POLL_INTERVALS", time.Minute*5)
- if err != nil {
- log.Fatalf("Error parsing env var AZURE_VAULT_EXCEPTION_POLL_INTERVALS: %s", err.Error())
- }
+ flag.Parse()
+ initConfig()
- azureVaultMaxFastAttempts, err = getEnvInt("AZURE_VAULT_MAX_FAILURE_ATTEMPTS", 5)
- if err != nil {
- log.Fatalf("Error parsing env var AZURE_VAULT_MAX_FAILURE_ATTEMPTS: %s", err.Error())
+ if logFormat == "json" {
+ klog.SetLogger(json.JSONLogger)
}
+ klog.InfoS("log settings", "format", logFormat, "level", flag.Lookup("v").Value)
- customAuth, err = getEnvBool("CUSTOM_AUTH", false)
- if err != nil {
- log.Fatalf("Error parsing env var AZURE_VAULT_MAX_FAILURE_ATTEMPTS: %s", err.Error())
- }
+ akv2k8s.Version = version
+ akv2k8s.LogVersion()
- namespace, err = getEnvStr("NAMESPACE", "")
- if err != nil {
- log.Fatalf("Error getting env var NAMESPACE: %s", err.Error())
- }
+ authType := viper.GetString("auth_type")
+ namespace := viper.GetString("namespace")
+
+ // set up signals so we handle the first shutdown signal gracefully
+ stopCh := signals.SetupSignalHandler()
cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeconfig)
if err != nil {
- log.Fatalf("Error building kubeconfig: %s", err.Error())
+ klog.ErrorS(err, "failed to build kube config", "master", masterURL, "kubeconfig", kubeconfig)
+ os.Exit(1)
}
kubeClient, err := kubernetes.NewForConfig(cfg)
if err != nil {
- log.Fatalf("Error building kubernetes clientset: %s", err.Error())
+ klog.ErrorS(err, "failed to build kube clientset", "master", masterURL, "kubeconfig", kubeconfig)
+ os.Exit(1)
}
azureKeyVaultSecretClient, err := clientset.NewForConfig(cfg)
if err != nil {
- log.Fatalf("Error building azureKeyVaultSecret clientset: %s", err.Error())
+ klog.ErrorS(err, "failed to build clientset for azurekeyvaultsecret", "master", masterURL, "kubeconfig", kubeconfig)
+ os.Exit(1)
}
var kubeInformerOptions []kubeinformers.SharedInformerOption
- var options []informers.SharedInformerOption
+ var akvInformerOptions []informers.SharedInformerOption
if namespace != "" {
kubeInformerOptions = append(kubeInformerOptions, kubeinformers.WithNamespace(namespace))
- options = append(options, informers.WithNamespace(namespace))
+ akvInformerOptions = append(akvInformerOptions, informers.WithNamespace(namespace))
}
kubeInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClient, time.Second*30, kubeInformerOptions...)
- azureKeyVaultSecretInformerFactory := informers.NewSharedInformerFactoryWithOptions(azureKeyVaultSecretClient, time.Second*30, options...)
- azurePollFrequency := controller.AzurePollFrequency{
- Normal: azureVaultFastRate,
- Slow: azureVaultSlowRate,
- MaxFailuresBeforeSlowingDown: azureVaultMaxFastAttempts,
- }
+ azureKeyVaultSecretInformerFactory := informers.NewSharedInformerFactoryWithOptions(azureKeyVaultSecretClient, time.Second*30, akvInformerOptions...)
- log.Info("Creating event broadcaster")
+ klog.InfoS("Creating event broadcaster")
eventBroadcaster := record.NewBroadcaster()
- eventBroadcaster.StartLogging(log.Tracef)
+ eventBroadcaster.StartLogging(klog.V(6).Infof)
eventBroadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")})
- var vaultAuth vault.AzureKeyVaultCredentials
- if customAuth {
- if vaultAuth, err = vault.NewAzureKeyVaultCredentialsFromEnvironment(); err != nil {
- log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error())
+ var vaultAuth credentialprovider.AzureKeyVaultCredentials
+ switch authType {
+ case "azureCloudConfig":
+ vaultAuth, err = getCredentialsFromCloudConfig(cloudconfig)
+ if err != nil {
+ klog.ErrorS(err, "failed to create cloud config provider for azure key vault", "file", cloudconfig)
+ os.Exit(1)
}
- } else {
- if vaultAuth, err = vault.NewAzureKeyVaultCredentialsFromCloudConfig(cloudconfig); err != nil {
- log.Fatalf("failed to create azure key vault credentials, error: %+v", err.Error())
+ case "environment":
+ vaultAuth, err = getCredentialsFromEnvironment()
+ if err != nil {
+ klog.ErrorS(err, "failed to create credentials provider from environment for azure key vault")
+ os.Exit(1)
}
+ default:
+ klog.ErrorS(nil, "auth type not supported", "type", authType)
+ os.Exit(1)
}
vaultService := vault.NewService(vaultAuth)
recorder := eventBroadcaster.NewRecorder(scheme.Scheme, corev1.EventSource{Component: controllerAgentName})
- handler := controller.NewHandler(kubeClient, azureKeyVaultSecretClient, kubeInformerFactory.Core().V1().Secrets().Lister(), azureKeyVaultSecretInformerFactory.Azurekeyvault().V1().AzureKeyVaultSecrets().Lister(), recorder, vaultService, azurePollFrequency)
-
- controller := controller.NewController(handler,
- kubeInformerFactory.Core().V1().Secrets(),
- azureKeyVaultSecretInformerFactory.Azurekeyvault().V1().AzureKeyVaultSecrets(),
- azurePollFrequency)
- // notice that there is no need to run Start methods in a separate goroutine. (i.e. go kubeInformerFactory.Start(stopCh)
- // Start method is non-blocking and runs all registered informers in a dedicated goroutine.
- kubeInformerFactory.Start(stopCh)
- azureKeyVaultSecretInformerFactory.Start(stopCh)
-
- if err = controller.Run(2, stopCh); err != nil {
- log.Fatalf("Error running controller: %s", err.Error())
+ options := &controller.Options{
+ MaxNumRequeues: 5,
+ NumThreads: 1,
}
-}
-func init() {
- flag.StringVar(&kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.")
- flag.StringVar(&masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
- flag.StringVar(&logLevel, "log-level", "", "log level")
- flag.StringVar(&cloudconfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json")
-}
+ controller := controller.NewController(
+ kubeClient,
+ azureKeyVaultSecretClient,
+ azureKeyVaultSecretInformerFactory,
+ kubeInformerFactory,
+ recorder,
+ vaultService,
+ options)
-func setLogLevel() {
- if logLevel == "" {
- var ok bool
- if logLevel, ok = os.LookupEnv("LOG_LEVEL"); !ok {
- logLevel = log.InfoLevel.String()
- }
- }
+ controller.Run(stopCh)
+}
- logrusLevel, err := log.ParseLevel(logLevel)
+func getCredentialsFromCloudConfig(cloudconfig string) (credentialprovider.AzureKeyVaultCredentials, error) {
+ f, err := os.Open(cloudconfig)
if err != nil {
- log.Fatalf("Error setting log level: %s", err.Error())
+ return nil, fmt.Errorf("failed reading azure config from %s, error: %+v", cloudconfig, err)
}
- log.SetLevel(logrusLevel)
- log.Printf("Log level set to '%s'", logrusLevel.String())
-}
+ defer f.Close()
-func getEnvDuration(key string, fallback time.Duration) (time.Duration, error) {
- if value, ok := os.LookupEnv(key); ok {
- duration, err := time.ParseDuration(value)
- return duration, err
+ cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f)
+ if err != nil {
+ return nil, fmt.Errorf("Failed reading azure config from %s, error: %+v", cloudconfig, err)
}
- return fallback, nil
-}
-func getEnvInt(key string, fallback int) (int, error) {
- if value, ok := os.LookupEnv(key); ok {
- intVal, err := strconv.Atoi(value)
- return intVal, err
- }
- return fallback, nil
+ return cloudCnfProvider.GetAzureKeyVaultCredentials()
}
-func getEnvStr(key string, fallback string) (string, error) {
- if value, ok := os.LookupEnv(key); ok {
- return value, nil
+func getCredentialsFromEnvironment() (credentialprovider.AzureKeyVaultCredentials, error) {
+ provider, err := credentialprovider.NewFromEnvironment()
+ if err != nil {
+ return nil, fmt.Errorf("failed to create azure credentials provider, error: %+v", err)
}
- return fallback, nil
-}
-func getEnvBool(key string, fallback bool) (bool, error) {
- if value, ok := os.LookupEnv(key); ok {
- if booVal, err := strconv.ParseBool(value); ok {
- return booVal, err
- }
- }
- return fallback, nil
+ return provider.GetAzureKeyVaultCredentials()
}
diff --git a/cmd/azure-keyvault-env/authentication.go b/cmd/azure-keyvault-env/authentication.go
new file mode 100644
index 00000000..b3954ba7
--- /dev/null
+++ b/cmd/azure-keyvault-env/authentication.go
@@ -0,0 +1,179 @@
+// Copyright © 2020 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Note: Code is based on bank-vaults from Banzai Cloud
+// (https://github.com/banzaicloud/bank-vaults)
+
+package main
+
+import (
+ "crypto"
+ "crypto/rsa"
+ "crypto/sha256"
+ "crypto/tls"
+ "crypto/x509"
+ "encoding/base64"
+ "encoding/json"
+ "encoding/pem"
+ "fmt"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "path"
+ "time"
+
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider"
+ "k8s.io/klog/v2"
+)
+
+func createHTTPClientWithTrustedCAAndMtls(caCert, clientCert, clientKey []byte) (*http.Client, error) {
+ caCertPool := x509.NewCertPool()
+ caCertPool.AppendCertsFromPEM(caCert)
+
+ clientKeyPair, err := tls.X509KeyPair(clientCert, clientKey)
+ if err != nil {
+ return nil, err
+ }
+
+ tlsConf := &tls.Config{
+ RootCAs: caCertPool,
+ Certificates: []tls.Certificate{clientKeyPair},
+ }
+ tlsConf.BuildNameToCertificate()
+
+ tlsClient := &http.Client{
+ Timeout: time.Second * 10,
+ Transport: &http.Transport{
+ TLSClientConfig: tlsConf,
+ },
+ }
+ return tlsClient, nil
+}
+
+func getCredentials(useAuthService bool, authServiceAddress string, clientCertDir string) (credentialprovider.AzureKeyVaultCredentials, error) {
+ if useAuthService {
+ // caCert, clientCert, clientKey []byte
+ caCert, err := ioutil.ReadFile(path.Join(clientCertDir, "ca.crt"))
+ if err != nil {
+ return nil, err
+ }
+
+ clientCert, err := ioutil.ReadFile(path.Join(clientCertDir, "tls.crt"))
+ if err != nil {
+ return nil, err
+ }
+
+ clientKey, err := ioutil.ReadFile(path.Join(clientCertDir, "tls.key"))
+ if err != nil {
+ return nil, err
+ }
+
+ client, err := createHTTPClientWithTrustedCAAndMtls(caCert, clientCert, clientKey)
+ if err != nil {
+ klog.ErrorS(err, "failed to download ca cert")
+ os.Exit(1)
+ }
+
+ url := fmt.Sprintf("https://%s/auth/%s/%s", authServiceAddress, config.namespace, config.podName)
+ klog.InfoS("requesting azure key vault oauth token", "url", url)
+
+ res, err := client.Get(url)
+ if err != nil {
+ klog.ErrorS(err, "request token failed", "url", url)
+ os.Exit(1)
+ }
+ defer res.Body.Close()
+
+ if res.StatusCode != http.StatusOK {
+ return nil, fmt.Errorf("failed to get credentials, %s", res.Status)
+ }
+
+ var creds *credentialprovider.OAuthCredentials
+ err = json.NewDecoder(res.Body).Decode(&creds)
+
+ if err != nil {
+ return nil, fmt.Errorf("failed to decode body, error %+v", err)
+ }
+
+ klog.InfoS("successfully received oauth token")
+ return creds, nil
+ }
+
+ provider, err := credentialprovider.NewFromEnvironment()
+ if err != nil {
+ return nil, fmt.Errorf("failed to create credentials provider for azure key vault, error %+v", err)
+ }
+
+ creds, err := provider.GetAzureKeyVaultCredentials()
+ if err != nil {
+ return nil, fmt.Errorf("failed to get credentials for azure key vault, error %+v", err)
+ }
+ return creds, nil
+}
+
+func verifyPKCS(signature string, plaintext string, pubkey rsa.PublicKey) bool {
+ sig, _ := base64.StdEncoding.DecodeString(signature)
+ hashed := sha256.Sum256([]byte(plaintext))
+ err := rsa.VerifyPKCS1v15(&pubkey, crypto.SHA256, hashed[:], sig)
+ return err == nil
+}
+
+func parseRsaPublicKey(pubPem string) (*rsa.PublicKey, error) {
+ block, _ := pem.Decode([]byte(pubPem))
+ if block == nil {
+ return nil, fmt.Errorf("failed to parse PEM block containing public signing key")
+ }
+
+ pub, err := x509.ParsePKIXPublicKey(block.Bytes)
+ if err != nil {
+ return nil, err
+ }
+
+ switch pub := pub.(type) {
+ case *rsa.PublicKey:
+ return pub, nil
+ default:
+ break // fall through
+ }
+ return nil, fmt.Errorf("Key type is not RSA")
+}
+
+func validateArgsSignature(origArgs, signatureB64, pubKeyBase64 string) {
+ signatureArray, err := base64.StdEncoding.DecodeString(signatureB64)
+ if err != nil {
+ klog.ErrorS(err, "failed to decode base64 signature string")
+ os.Exit(1)
+ }
+
+ signature := string(signatureArray)
+
+ bPubKey, err := base64.StdEncoding.DecodeString(pubKeyBase64)
+ if err != nil {
+ klog.ErrorS(err, "failed to decode base64 public key string")
+ os.Exit(1)
+ }
+
+ pubKey := string(bPubKey)
+
+ pubRsaKey, err := parseRsaPublicKey(pubKey)
+ if err != nil {
+ klog.ErrorS(err, "failed to parse rsa public key to verify args")
+ os.Exit(1)
+ }
+
+ if !verifyPKCS(signature, origArgs, *pubRsaKey) {
+ klog.ErrorS(fmt.Errorf("pkcs signature verification failed"), "args does not match original args defined by env-injector")
+ os.Exit(1)
+ }
+}
diff --git a/cmd/azure-keyvault-env/main.go b/cmd/azure-keyvault-env/main.go
index 2332baab..06ea0d3c 100644
--- a/cmd/azure-keyvault-env/main.go
+++ b/cmd/azure-keyvault-env/main.go
@@ -1,4 +1,4 @@
-// Copyright © 2019 Sparebanken Vest
+// Copyright © 2020 Sparebanken Vest
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -18,31 +18,23 @@
package main
import (
- "crypto"
- "crypto/rsa"
- "crypto/sha256"
- "crypto/tls"
- "crypto/x509"
- "encoding/base64"
- "encoding/json"
- "encoding/pem"
+ "context"
"fmt"
- "io/ioutil"
- "net/http"
"os"
"os/exec"
"strings"
"syscall"
"time"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s"
"github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers"
- vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client"
- akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client"
+ akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned"
- log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/rest"
+ "k8s.io/klog/v2"
)
const (
@@ -52,30 +44,40 @@ const (
type injectorConfig struct {
namespace string
podName string
+ clientCertDir string
retryTimes int
waitTimeBetweenRetries int
useAuthService bool
skipArgsValidation bool
+ authServiceAddress string
+ signatureB64 string
+ pubKeyBase64 string
}
var config injectorConfig
-var logger *log.Entry
type stop struct {
error
}
-func formatLogger() {
- log.SetFormatter(&log.TextFormatter{
- DisableColors: true,
- FullTimestamp: true,
- })
-
- logger = log.WithFields(log.Fields{
- "component": "akv2k8s",
- "application": "env-injector",
- })
-}
+// func formatLogger(logFormat string) {
+// switch logFormat {
+// case "fmt":
+// log.SetFormatter(&log.TextFormatter{
+// DisableColors: true,
+// FullTimestamp: true,
+// })
+// case "json":
+// log.SetFormatter(&log.JSONFormatter{})
+// default:
+// log.Warnf("Log format %s not supported - using default fmt", logFormat)
+// }
+
+// logger = log.WithFields(log.Fields{
+// "component": "akv2k8s",
+// "application": "env-injector",
+// })
+// }
// Retry will wait for a duration, retry n times, return if succeed or fails
// Thanks to Nick Stogner: https://upgear.io/blog/simple-golang-retry-function/
@@ -117,242 +119,137 @@ func getSecretFromKeyVault(azureKeyVaultSecret *akv.AzureKeyVaultSecret, query s
return secretHandler.Handle()
}
-type oauthToken struct {
- Token string `json:"token"`
-}
-
-func createHTTPClientWithTrustedCA(host string) (*http.Client, error) {
- caURL := fmt.Sprintf("http://%s/ca", host)
- client := &http.Client{
- Timeout: time.Second * 10,
- }
-
- res, err := client.Get(caURL)
- if err != nil {
- return nil, err
- }
-
- defer res.Body.Close()
- caCert, err := ioutil.ReadAll(res.Body)
- if err != nil {
- return nil, err
- }
- caCertPool := x509.NewCertPool()
- caCertPool.AppendCertsFromPEM(caCert)
-
- tlsConf := &tls.Config{
- RootCAs: caCertPool,
- }
- tlsConf.BuildNameToCertificate()
-
- tlsClient := &http.Client{
- Timeout: time.Second * 10,
- Transport: &http.Transport{
- TLSClientConfig: tlsConf,
- },
- }
- return tlsClient, nil
-}
-
-func getCredentials(useAuthService bool) (vault.AzureKeyVaultCredentials, error) {
- if useAuthService {
- authServiceAddress := viper.GetString("env_injector_auth_service")
- if authServiceAddress == "" {
- logger.Fatal(fmt.Errorf("cannot call auth service: env var ENV_INJECTOR_AUTH_SERVICE does not exist"))
- }
-
- caCertAddress := viper.GetString("env_injector_ca_cert")
- if caCertAddress == "" {
- logger.Fatal(fmt.Errorf("cannot get ca cert: env var ENV_INJECTOR_CA_CERT does not exist"))
- }
-
- client, err := createHTTPClientWithTrustedCA(caCertAddress)
- if err != nil {
- logger.Fatalf("failed to download ca cert, error: %+v", err)
- }
-
- url := fmt.Sprintf("https://%s/auth/%s/%s", authServiceAddress, config.namespace, config.podName)
- logger.Infof("requesting azure key vault oauth token from %s", url)
-
- res, err := client.Get(url)
- if err != nil {
- logger.Fatalf("request token failed from %s, error: %+v", url, err)
- }
- defer res.Body.Close()
-
- if res.StatusCode != http.StatusOK {
- return nil, fmt.Errorf("failed to get credentials, %s", res.Status)
- }
-
- var creds vault.AzureKeyVaultOAuthCredentials
- err = json.NewDecoder(res.Body).Decode(&creds)
-
- if err != nil {
- return nil, fmt.Errorf("failed to decode body, error %+v", err)
- }
-
- return creds, nil
- }
-
- creds, err := vault.NewAzureKeyVaultCredentialsFromEnvironment()
- if err != nil {
- return nil, fmt.Errorf("failed to get credentials for azure key vault, error %+v", err)
- }
- return creds, nil
-}
-
-func verifyPKCS(signature string, plaintext string, pubkey rsa.PublicKey) bool {
- sig, _ := base64.StdEncoding.DecodeString(signature)
- hashed := sha256.Sum256([]byte(plaintext))
- err := rsa.VerifyPKCS1v15(&pubkey, crypto.SHA256, hashed[:], sig)
- return err == nil
-}
-
-func parseRsaPublicKey(pubPem string) (*rsa.PublicKey, error) {
- block, _ := pem.Decode([]byte(pubPem))
- if block == nil {
- return nil, fmt.Errorf("failed to parse PEM block containing public signing key")
- }
-
- pub, err := x509.ParsePKIXPublicKey(block.Bytes)
- if err != nil {
- return nil, err
- }
-
- switch pub := pub.(type) {
- case *rsa.PublicKey:
- return pub, nil
- default:
- break // fall through
- }
- return nil, fmt.Errorf("Key type is not RSA")
-}
-
-func validateArgsSignature(origArgs string) {
- signatureB64 := viper.GetString("env_injector_args_signature")
- if signatureB64 == "" {
- logger.Fatalf("failed to get ENV_INJECTOR_ARGS_SIGNATURE")
- }
-
- signatureArray, err := base64.StdEncoding.DecodeString(signatureB64)
- if err != nil {
- logger.Fatalf("failed to decode base64 signature string, error: %+v", err)
- }
-
- signature := string(signatureArray)
-
- pubKeyBase64 := viper.GetString("env_injector_args_key")
- if pubKeyBase64 == "" {
- logger.Fatalf("failed to get ENV_INJECTOR_ARGS_KEY, error: %+v", err)
- }
-
- bPubKey, err := base64.StdEncoding.DecodeString(pubKeyBase64)
- if err != nil {
- logger.Fatalf("failed to decode base64 public key string, error: %+v", err)
- }
-
- pubKey := string(bPubKey)
-
- pubRsaKey, err := parseRsaPublicKey(pubKey)
- if err != nil {
- logger.Fatalf("failed to parse rsa public key to verify args: %+v", err)
- }
-
- if !verifyPKCS(signature, origArgs, *pubRsaKey) {
- logger.Fatal("args does not match original args defined by env-injector")
- }
-}
-
func initConfig() {
viper.SetDefault("env_injector_retries", 3)
viper.SetDefault("env_injector_wait_before_retry", 3)
viper.SetDefault("env_injector_custom_auth", false)
viper.SetDefault("env_injector_use_auth_service", true)
viper.SetDefault("env_injector_skip_args_validation", false)
+ viper.SetDefault("env_injector_log_level", "Info")
+ viper.SetDefault("env_injector_log_format", "fmt")
viper.AutomaticEnv()
}
-func setLogLevel(logLevel string) {
- if logLevel == "" {
- logLevel = log.InfoLevel.String()
- }
-
- logrusLevel, err := log.ParseLevel(logLevel)
- if err != nil {
- log.Errorf("error setting log level: %s", err.Error())
+// func setLogLevel(logLevel string) {
+// if logLevel == "" {
+// logLevel = log.InfoLevel.String()
+// }
+
+// logrusLevel, err := log.ParseLevel(logLevel)
+// if err != nil {
+// log.Errorf("error setting log level: %s", err.Error())
+// }
+// log.SetLevel(logrusLevel)
+// }
+
+func validateConfig(requiredEnvVars map[string]string) error {
+ for key, value := range requiredEnvVars {
+ if value == "" {
+ return fmt.Errorf("environment variable %s not provided or empty", strings.ToUpper(key))
+ }
}
- log.SetLevel(logrusLevel)
+ return nil
}
func main() {
+ klog.InitFlags(nil)
+ defer klog.Flush()
+
initConfig()
+ akv2k8s.Version = viper.GetString("version")
+
var origCommand string
var origArgs []string
var err error
- logLevel := viper.GetString("env_injector_log_level")
- setLogLevel(logLevel)
- formatLogger()
+ // logLevel := viper.GetString("env_injector_log_level")
+ // setLogLevel(logLevel)
+ // logFormat := viper.GetString("env_injector_log_format")
+ // formatLogger(logFormat)
+ akv2k8s.LogVersion()
- logger.Debugf("azure key vault env injector initializing")
+ klog.InfoS("azure key vault env injector initializing")
config = injectorConfig{
namespace: viper.GetString("env_injector_pod_namespace"),
- podName: viper.GetString("HOSTNAME"),
+ podName: viper.GetString("env_injector_pod_name"),
+ clientCertDir: viper.GetString("env_injector_client_cert_dir"),
retryTimes: viper.GetInt("env_injector_retries"),
waitTimeBetweenRetries: viper.GetInt("env_injector_wait_before_retry"),
useAuthService: viper.GetBool("env_injector_use_auth_service"),
skipArgsValidation: viper.GetBool("env_injector_skip_args_validation"),
+ authServiceAddress: viper.GetString("env_injector_auth_service"),
+ signatureB64: viper.GetString("env_injector_args_signature"),
+ pubKeyBase64: viper.GetString("env_injector_args_key"),
}
- if config.namespace == "" {
- logger.Fatalf("current namespace not provided in environment variable ENV_INJECTOR_POD_NAMESPACE")
+ requiredEnvVars := map[string]string{
+ "env_injector_auth_service": config.authServiceAddress,
+ "env_injector_args_signature": config.signatureB64,
+ "env_injector_args_key": config.pubKeyBase64,
}
- logger = logger.WithFields(log.Fields{
- "namespace": config.namespace,
- })
+ err = validateConfig(requiredEnvVars)
+ if err != nil {
+ klog.ErrorS(err, "failed validating config")
+ os.Exit(1)
+ }
if config.useAuthService {
- logger.Info("using sentralized akv2k8s auth service for authentiction with azure key vault")
+ klog.V(4).InfoS("using centralized akv2k8s auth service for authentication with azure key vault")
} else {
- logger.Debug("akv2k8s auth service not enabled - will look for azure key vault credentials locally")
+ klog.InfoS("akv2k8s auth service not enabled - will look for azure key vault credentials locally")
}
if len(os.Args) == 1 {
- logger.Fatal("no command is given, currently vault-env can't determine the entrypoint (command), please specify it explicitly")
+ klog.ErrorS(err, "no command is given")
+ os.Exit(1)
} else {
origCommand, err = exec.LookPath(os.Args[1])
if err != nil {
- logger.Fatalf("binary not found: %+v", err)
+ klog.ErrorS(err, "binary not found")
}
origArgs = os.Args[1:]
if !config.skipArgsValidation {
- validateArgsSignature(strings.Join(origArgs, " "))
+ validateArgsSignature(strings.Join(origArgs, " "), config.signatureB64, config.pubKeyBase64)
}
- logger.Infof("found original container command to be %s %s", origCommand, origArgs)
+ klog.InfoS("found original container command", "cmd", origCommand, "args", origArgs)
}
- creds, err := getCredentials(config.useAuthService)
+ creds, err := getCredentials(config.useAuthService, config.authServiceAddress, config.clientCertDir)
if err != nil {
- log.Fatalf("failed to get credentials, error: %+v", err)
+ klog.V(4).InfoS("failed to get credentials, will retry", "retryTimes", config.retryTimes)
+ err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error {
+ creds, err = getCredentials(config.useAuthService, config.authServiceAddress, config.clientCertDir)
+ if err != nil {
+ return err
+ }
+ klog.Info("succeded getting credentials")
+ return nil
+ })
+ if err != nil {
+ klog.ErrorS(err, "failed to get credentials", "failedTimes", config.retryTimes)
+ os.Exit(1)
+ }
}
vaultService := vault.NewService(creds)
- logger.Debug("reading azurekeyvaultsecret's referenced in env variables")
+ klog.V(4).InfoS("reading azurekeyvaultsecret's referenced in env variables")
cfg, err := rest.InClusterConfig()
if err != nil {
- logger.Fatalf("error building kubeconfig: %s", err.Error())
+ klog.ErrorS(err, "error building kubeconfig")
+ os.Exit(1)
}
azureKeyVaultSecretClient, err := clientset.NewForConfig(cfg)
if err != nil {
- logger.Fatalf("error building azurekeyvaultsecret clientset: %+v", err)
+ klog.ErrorS(err, "error building azurekeyvaultsecret clientset")
+ os.Exit(1)
}
environ := os.Environ()
@@ -365,63 +262,69 @@ func main() {
// e.g. my-akv-secret-name@azurekeyvault?some-sub-key
if strings.Contains(value, envLookupKey) {
// e.g. my-akv-secret-name?some-sub-key
- logger.Debugf("found env var '%s' to get azure key vault secret for", name)
- secretName := strings.Join(strings.Split(value, envLookupKey), "")
+ klog.V(4).InfoS("found env var to get azure key vault secret for", "env", name)
+ akvsName := strings.Join(strings.Split(value, envLookupKey), "")
- if secretName == "" {
- logger.Fatalf("error extracting secret name from env variable '%s' with lookup value '%s' - not properly formatted", name, value)
+ if akvsName == "" {
+ klog.ErrorS(fmt.Errorf("error extracting secret name"), "env variable not properly formatted", "env", name, "value", value)
+ os.Exit(1)
}
var secretQuery string
- if query := strings.Split(secretName, "?"); len(query) > 1 {
+ if query := strings.Split(akvsName, "?"); len(query) > 1 {
if len(query) > 2 {
- logger.Fatalf("error extracting secret query from '%s' - has multiple query elements defined with '?' - only one supported", secretName)
+ klog.ErrorS(fmt.Errorf("error extracting secret query"), "multiple query elements defined with '?' - only one supported", "secret", akvsName)
+ os.Exit(1)
}
- secretName = query[0]
+ akvsName = query[0]
secretQuery = query[1]
- logger.Debugf("found query in env var '%s', '%s'", value, secretQuery)
+ klog.V(4).InfoS("found query in env var", "env", name, "value", value, "query", secretQuery)
}
- logger.Debugf("getting azurekeyvaultsecret resource '%s' from kubernetes", secretName)
- keyVaultSecretSpec, err := azureKeyVaultSecretClient.AzurekeyvaultV1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{})
+ klog.V(4).InfoS("getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName))
+ akvs, err := azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(context.TODO(), akvsName, v1.GetOptions{})
if err != nil {
- logger.Errorf("error getting azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error())
- logger.Infof("will retry getting azurekeyvaultsecret resource up to %d times, waiting %d seconds between retries", config.retryTimes, config.waitTimeBetweenRetries)
+ klog.ErrorS(err, "failed to get azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName))
+ klog.InfoS("will retry getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName), "retryTimes", config.retryTimes, "delay", config.waitTimeBetweenRetries)
err = retry(config.retryTimes, time.Second*time.Duration(config.waitTimeBetweenRetries), func() error {
- keyVaultSecretSpec, err = azureKeyVaultSecretClient.AzurekeyvaultV1().AzureKeyVaultSecrets(config.namespace).Get(secretName, v1.GetOptions{})
+ akvs, err = azureKeyVaultSecretClient.KeyvaultV2beta1().AzureKeyVaultSecrets(config.namespace).Get(context.TODO(), akvsName, v1.GetOptions{})
if err != nil {
- logger.Errorf("error getting azurekeyvaultsecret resource '%s', error: %+v", secretName, err)
+ klog.V(4).ErrorS(err, "error getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName))
return err
}
- logger.Infof("succeded getting azurekeyvaultsecret resource '%s'", secretName)
+ klog.InfoS("succeded getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KObj(akvs))
return nil
})
if err != nil {
- logger.Fatalf("error getting azurekeyvaultsecret resource '%s', error: %s", secretName, err.Error())
+ klog.ErrorS(err, "error getting azurekeyvaultsecret", "azurekeyvaultsecret", klog.KRef(config.namespace, akvsName))
+ os.Exit(1)
}
}
- logger.Debugf("getting secret value for '%s' from azure key vault, to inject into env var %s", keyVaultSecretSpec.Spec.Vault.Object.Name, name)
- secret, err := getSecretFromKeyVault(keyVaultSecretSpec, secretQuery, vaultService)
+ klog.V(4).InfoS("getting secret value for from azure key vault, to inject into env var", "azurekeyvaultsecret", klog.KObj(akvs), "env", name)
+ secret, err := getSecretFromKeyVault(akvs, secretQuery, vaultService)
if err != nil {
- logger.Fatalf("failed to read secret '%s', error %+v", keyVaultSecretSpec.Spec.Vault.Object.Name, err)
+ klog.ErrorS(err, "failed to read secret from azure key vault", "azurekeyvaultsecret", klog.KObj(akvs))
+ os.Exit(1)
}
if secret == "" {
- logger.Fatalf("secret not found in azure key vault: %s", keyVaultSecretSpec.Spec.Vault.Object.Name)
+ klog.ErrorS(fmt.Errorf("secret value empty"), "secret not found in azure key vault", "azurekeyvaultsecret", klog.KObj(akvs))
+ os.Exit(1)
} else {
- logger.Infof("secret %s injected into env var %s for executable %s", keyVaultSecretSpec.Spec.Vault.Object.Name, name, origCommand)
+ klog.InfoS("secret injected into env var", "azurekeyvaultsecret", klog.KObj(akvs), "env", name)
environ[i] = fmt.Sprintf("%s=%s", name, secret)
}
}
}
- logger.Infof("starting process %s %v with secrets in env vars", origCommand, origArgs)
+ klog.InfoS("starting process with secrets in env vars", "cmd", origCommand, "args", origArgs)
err = syscall.Exec(origCommand, origArgs, environ)
if err != nil {
- logger.Fatalf("failed to exec process '%s': %s", origCommand, err.Error())
+ klog.ErrorS(err, "failed to execute process", "process", origCommand)
+ os.Exit(1)
}
- logger.Info("azure key vault env injector successfully injected env variables with secrets")
+ klog.InfoS("azure key vault env injector successfully injected env variables with secrets")
}
diff --git a/cmd/azure-keyvault-env/secret_handler.go b/cmd/azure-keyvault-env/secret_handler.go
index 4879200f..3d581c1a 100644
--- a/cmd/azure-keyvault-env/secret_handler.go
+++ b/cmd/azure-keyvault-env/secret_handler.go
@@ -22,8 +22,8 @@ import (
"strings"
"github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/transformers"
- vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client"
- akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/keyvault/client"
+ akv "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
yaml "gopkg.in/yaml.v2"
corev1 "k8s.io/api/core/v1"
@@ -136,8 +136,12 @@ func (h *AzureKeyVaultSecretHandler) Handle() (string, error) {
// Handle getting and formating Azure Key Vault Certificate from Azure Key Vault to Kubernetes
func (h *AzureKeyVaultCertificateHandler) Handle() (string, error) {
- exportPrivateKey := h.query == corev1.TLSPrivateKeyKey
- cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, exportPrivateKey)
+ options := vault.CertificateOptions{
+ ExportPrivateKey: h.query == corev1.TLSPrivateKeyKey,
+ EnsureServerFirst: h.secretSpec.Spec.Output.Secret.ChainOrder == "ensureserverfirst",
+ }
+
+ cert, err := h.vaultService.GetCertificate(&h.secretSpec.Spec.Vault, &options)
if err != nil {
return "", err
@@ -150,7 +154,7 @@ func (h *AzureKeyVaultCertificateHandler) Handle() (string, error) {
var privKey []byte
var pubKey []byte
- if exportPrivateKey {
+ if options.ExportPrivateKey {
if privKey, err = cert.ExportPrivateKeyAsPem(); err != nil {
return "", err
}
diff --git a/cmd/azure-keyvault-secrets-webhook/authorization.go b/cmd/azure-keyvault-secrets-webhook/authorization.go
index d45ae716..5f431f0a 100644
--- a/cmd/azure-keyvault-secrets-webhook/authorization.go
+++ b/cmd/azure-keyvault-secrets-webhook/authorization.go
@@ -1,21 +1,21 @@
package main
import (
+ "context"
"fmt"
- "strings"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)
type podData struct {
- remoteAddress string
- name string
- namespace string
+ name string
+ namespace string
+ token string
}
-func authorize(clientset *kubernetes.Clientset, podData podData) error {
- ns, err := clientset.CoreV1().Namespaces().Get(podData.namespace, metav1.GetOptions{})
+func authorize(clientset kubernetes.Interface, podData podData) error {
+ ns, err := clientset.CoreV1().Namespaces().Get(context.TODO(), podData.namespace, metav1.GetOptions{})
if err != nil {
return fmt.Errorf("failed to get namespace '%s', error: %+v", podData.namespace, err)
}
@@ -24,19 +24,14 @@ func authorize(clientset *kubernetes.Clientset, podData podData) error {
return fmt.Errorf("env-injection not enabled for namespace,")
}
- pod, err := clientset.CoreV1().Pods(podData.namespace).Get(podData.name, metav1.GetOptions{})
+ pod, err := clientset.CoreV1().Pods(podData.namespace).Get(context.TODO(), podData.name, metav1.GetOptions{})
if err != nil {
return fmt.Errorf("failed to get pod '%s' in namespace '%s', error: %+v", podData.name, podData.namespace, err)
}
- remoteIP := strings.Split(podData.remoteAddress, ":")[0]
- if pod.Status.PodIP != remoteIP {
- return fmt.Errorf("the provided pod data does not correspond with caller ip")
- }
-
containerHasInjectorCmd := false
for _, container := range pod.Spec.Containers {
- if container.Command[0] == "/azure-keyvault/azure-keyvault-env" {
+ if len(container.Command) > 0 && container.Command[0] == "/azure-keyvault/azure-keyvault-env" {
containerHasInjectorCmd = true
break
}
diff --git a/cmd/azure-keyvault-secrets-webhook/authorization_test.go b/cmd/azure-keyvault-secrets-webhook/authorization_test.go
index 793ffc54..d1eabaa5 100644
--- a/cmd/azure-keyvault-secrets-webhook/authorization_test.go
+++ b/cmd/azure-keyvault-secrets-webhook/authorization_test.go
@@ -1,18 +1,60 @@
package main
import (
+ "context"
"os"
"testing"
+ "time"
+ authenticationapi "k8s.io/api/authentication/v1"
+ authorizatonapi "k8s.io/api/authorization/v1"
+
+ corev1 "k8s.io/api/core/v1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ kubeinformers "k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
+ k8sfake "k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/tools/clientcmd"
)
+var (
+ alwaysReady = func() bool { return true }
+ noResyncPeriodFunc = func() time.Duration { return 0 }
+)
+
type kubeConfig struct {
master string
config string
}
+type fixture struct {
+ t *testing.T
+
+ kubeclient *k8sfake.Clientset
+ // Objects from here preloaded into NewSimpleFake.
+ kubeobjects []runtime.Object
+ // objects []runtime.Object
+ namespaceLister []*corev1.Namespace
+}
+
+func (f *fixture) initAuthorization() {
+ f.kubeclient = k8sfake.NewSimpleClientset(f.kubeobjects...)
+ k8sInformerNamespaces := kubeinformers.NewSharedInformerFactory(f.kubeclient, noResyncPeriodFunc())
+
+ for _, d := range f.namespaceLister {
+ k8sInformerNamespaces.Core().V1().Namespaces().Informer().GetIndexer().Add(d)
+ }
+}
+
+func newFixture(t *testing.T) *fixture {
+ f := &fixture{}
+ f.t = t
+ // f.objects = []runtime.Object{}
+ f.kubeobjects = []runtime.Object{}
+ return f
+}
+
func ensureIntegrationEnvironment(t *testing.T) kubeConfig {
if os.Getenv("AKV2K8S_K8S_MASTER_URL") == "" || os.Getenv("AKV2K8S_K8S_CONFIG") == "" {
t.Skip("Skipping integration test - no k8s cluster defined")
@@ -24,32 +66,154 @@ func ensureIntegrationEnvironment(t *testing.T) kubeConfig {
}
}
-func TestAuthorization(t *testing.T) {
- config := ensureIntegrationEnvironment(t)
+func createNewNamespace(name string, addLabel bool) *corev1.Namespace {
+ ns := &corev1.Namespace{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: name,
+ },
+ }
+
+ if addLabel {
+ ns.Labels = map[string]string{
+ "azure-key-vault-env-injection": "enabled",
+ }
+ }
+ return ns
+}
+
+func createPod(name string, namespace string, multipleContainers bool) *corev1.Pod {
+ pod := &corev1.Pod{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: name,
+ Namespace: namespace,
+ },
+ }
+
+ podSpec := corev1.PodSpec{
+ InitContainers: []corev1.Container{
+ corev1.Container{
+ Name: "copy-azurekeyvault-env",
+ },
+ },
+ }
+
+ if multipleContainers {
+ podSpec.Containers = append(podSpec.Containers, corev1.Container{})
+ }
+
+ podSpec.Containers = append(podSpec.Containers, corev1.Container{
+ Command: []string{"/azure-keyvault/azure-keyvault-env"},
+ })
+
+ pod.Spec = podSpec
+ return pod
+}
- podName := os.Getenv("AKV2K8S_K8S_TEST_POD")
- podNamespace := os.Getenv("AKV2K8S_K8S_TEST_NAMESPACE")
- podIP := os.Getenv("AKV2K8S_K8S_TEST_POD_IP")
+func TestMultipleContainersInPod(t *testing.T) {
+ f := newFixture(t)
+
+ ns := createNewNamespace("test", true)
+ pod := createPod("test", ns.Name, true)
+ f.kubeobjects = append(f.kubeobjects, ns)
+ f.kubeobjects = append(f.kubeobjects, pod)
+
+ podData := podData{
+ name: "test",
+ namespace: "test",
+ token: "asfasdasf",
+ }
+
+ f.initAuthorization()
+ err := authorize(f.kubeclient, podData)
- cfg, err := clientcmd.BuildConfigFromFlags(config.master, config.config)
+ if err != nil {
+ t.Error(err)
+ }
+}
+
+func TestTokenReview(t *testing.T) {
+ config := ensureIntegrationEnvironment(t)
+
+ cfg, err := clientcmd.BuildConfigFromFlags("https://127.0.0.1:32770", config.config)
if err != nil {
t.Errorf("Error building kubeconfig: %s", err.Error())
}
- kubeClient, err := kubernetes.NewForConfig(cfg)
+ clientset, err := kubernetes.NewForConfig(cfg)
+ if err != nil {
+ t.Error(err)
+ }
+
+ tr := &authenticationapi.TokenReview{
+ Spec: authenticationapi.TokenReviewSpec{
+ Token: "eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJha3YyazhzLXRlc3QiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiZGVmYXVsdC10b2tlbi1rcWY3NyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMjViYTczYWMtNzA3YS0xMWVhLTg2YzEtMDI0MmFjMTEwMDAyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50OmFrdjJrOHMtdGVzdDpkZWZhdWx0In0.gQu3MuqG3lqtuuQnjY70PHjKfdIfxnc2K2wTTgINoHi7LyG5bTr6iKc15e3wpQy1Tt-AeCz4SyfXxIJVXvXKSNKaE47Lj2nzfcaQa7PR_A3i6wxRBke0klQl8pm5ZYNTP54cKcyBD7MNlLCcqmg5Jqpzpsj5mVHIVDAQza5--7ujietpEhTo6goUZluu4psVm-24BViVUnYWPdRBEEbCj7UdxImcIB7luFqXWwiBGYHcaY0CgfxSPYdy1CnRitbuPBIQU9Gpsg9HtHNXNdNJO9LH17uonIMvg6TyMhCiKTMJIw9lNkUbcu-cf5EFpIo3Xev8lbG_VybHUQoqjeRaMQ",
+ // Audiences: []string{
+ // "",
+ // "",
+ // },
+ },
+ }
+
+ trResult, err := clientset.AuthenticationV1().TokenReviews().Create(context.TODO(), tr, metav1.CreateOptions{})
if err != nil {
- t.Errorf("Error building kubernetes clientset: %s", err.Error())
+ t.Error(err)
}
- pod := podData{
- name: podName,
- namespace: podNamespace,
- remoteAddress: podIP,
+ if trResult == nil {
+ t.Fail()
}
- err = authorize(kubeClient, pod)
+ sar := &authorizatonapi.SubjectAccessReview{
+ Spec: authorizatonapi.SubjectAccessReviewSpec{
+ User: trResult.Status.User.Username,
+ ResourceAttributes: &authorizatonapi.ResourceAttributes{
+ Resource: "AzureKeyVaultSecret",
+ Group: "spv.no",
+ Namespace: "akv2k8s-test",
+ Verb: "get",
+ Name: "test-secret",
+ },
+ },
+ }
+ sarResult, err := clientset.AuthorizationV1().SubjectAccessReviews().Create(context.TODO(), sar, metav1.CreateOptions{})
if err != nil {
- t.Errorf("failed, error: %+v", err)
+ t.Error(err)
}
+ if sarResult == nil {
+ t.Fail()
+ }
+
+ t.Logf("ns: %s", trResult.Namespace)
+
}
+
+// func TestAuthorization(t *testing.T) {
+// config := ensureIntegrationEnvironment(t)
+
+// podName := os.Getenv("AKV2K8S_K8S_TEST_POD")
+// podNamespace := os.Getenv("AKV2K8S_K8S_TEST_NAMESPACE")
+// podIP := os.Getenv("AKV2K8S_K8S_TEST_POD_IP")
+
+// cfg, err := clientcmd.BuildConfigFromFlags(config.master, config.config)
+// if err != nil {
+// t.Errorf("Error building kubeconfig: %s", err.Error())
+// }
+
+// kubeClient, err := kubernetes.NewForConfig(cfg)
+// if err != nil {
+// t.Errorf("Error building kubernetes clientset: %s", err.Error())
+// }
+
+// pod := podData{
+// name: podName,
+// namespace: podNamespace,
+// remoteAddress: podIP,
+// }
+
+// err = authorize(kubeClient, pod)
+// if err != nil {
+// t.Errorf("failed, error: %+v", err)
+// }
+
+// }
diff --git a/cmd/azure-keyvault-secrets-webhook/clientCert.go b/cmd/azure-keyvault-secrets-webhook/clientCert.go
new file mode 100644
index 00000000..099fa926
--- /dev/null
+++ b/cmd/azure-keyvault-secrets-webhook/clientCert.go
@@ -0,0 +1,93 @@
+package main
+
+import (
+ "crypto/rand"
+ "crypto/rsa"
+ "crypto/tls"
+ "crypto/x509"
+ "crypto/x509/pkix"
+ "encoding/pem"
+ "fmt"
+ "math/big"
+ "time"
+
+ "k8s.io/apimachinery/pkg/types"
+)
+
+type ClientCertificate struct {
+ CA []byte
+ Crt []byte
+ Key []byte
+}
+
+func generateClientCert(mutationID types.UID, validMonths int, caCert, caKey []byte) (*ClientCertificate, error) {
+ ca, err := tls.X509KeyPair(caCert, caKey)
+ if err != nil {
+ return nil, err
+ }
+
+ x509Ca, err := x509.ParseCertificate(ca.Certificate[0])
+ if err != nil {
+ return nil, err
+ }
+
+ clientKey, err := rsa.GenerateKey(rand.Reader, 1024)
+ if err != nil {
+ return nil, err
+ }
+
+ // clientKey, err := ecdsa.GenerateKey(elliptic., rand.Reader)
+ // if err != nil {
+ // return nil, err
+ // }
+
+ now := time.Now()
+ serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
+ serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
+ if err != nil {
+ return nil, fmt.Errorf("failed to generate serial number: %s", err)
+ }
+
+ template := x509.Certificate{
+ SerialNumber: serialNumber,
+ Subject: pkix.Name{
+ Organization: []string{"akv2k8s"},
+ CommonName: string(mutationID),
+ },
+ NotBefore: now,
+ NotAfter: now.AddDate(0, validMonths, 0),
+ KeyUsage: x509.KeyUsageDigitalSignature,
+ ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth},
+ BasicConstraintsValid: true,
+ IsCA: false,
+ }
+
+ certByte, err := x509.CreateCertificate(rand.Reader, &template, x509Ca, &clientKey.PublicKey, ca.PrivateKey)
+ if err != nil {
+ return nil, err
+ }
+
+ certBlock := &pem.Block{
+ Type: "CERTIFICATE",
+ Bytes: certByte,
+ }
+ pemCert := pem.EncodeToMemory(certBlock)
+
+ keyBytes, err := x509.MarshalPKCS8PrivateKey(clientKey)
+ if err != nil {
+ return nil, err
+ }
+
+ keyBlock := &pem.Block{
+ Type: "PRIVATE KEY",
+ Bytes: keyBytes,
+ }
+
+ pemKey := pem.EncodeToMemory(keyBlock)
+
+ return &ClientCertificate{
+ CA: caCert,
+ Crt: pemCert,
+ Key: pemKey,
+ }, nil
+}
diff --git a/cmd/azure-keyvault-secrets-webhook/clientCert_test.go b/cmd/azure-keyvault-secrets-webhook/clientCert_test.go
new file mode 100644
index 00000000..e7d2df4a
--- /dev/null
+++ b/cmd/azure-keyvault-secrets-webhook/clientCert_test.go
@@ -0,0 +1,76 @@
+package main
+
+import (
+ "testing"
+
+ "k8s.io/apimachinery/pkg/types"
+)
+
+var caCert = []byte(`-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIRAMVFSUuItvjfIauE8C6Px2EwDQYJKoZIhvcNAQELBQAw
+TzEVMBMGA1UEChMMY2VydC1tYW5hZ2VyMTYwNAYDVQQDEy1jYS5henVyZS1rZXkt
+dmF1bHQtdG8ta3ViZXJuZXRlcy5jZXJ0LW1hbmFnZXIwHhcNMjAxMDEwMDgyNjE3
+WhcNMjUxMDA5MDgyNjE3WjBPMRUwEwYDVQQKEwxjZXJ0LW1hbmFnZXIxNjA0BgNV
+BAMTLWNhLmF6dXJlLWtleS12YXVsdC10by1rdWJlcm5ldGVzLmNlcnQtbWFuYWdl
+cjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKRhWMdyTVekaduaV4zs
+tL3qmF0MJ/kxkGg07NftdSgg0fa31cMGlKmQdKOnsDmH4ZniKl7XX0cRq1R8nHTS
+bJNhukphY2xwwfCHF428EdrvOqqXUE6tiJ0vf0C2hTIDzGYvUR8b3NczCuYReNDy
+RDHw4Z+tTux8wtUB/Lvzrvy6A/Jp6tObAsWxuk6uFneblk+ukV5NCgq6WAtoCQGW
+IMsMverczuTipFrUBruveYIN7shWEv0jaQBetUAojiR9tfUpM4e07svxZOd/uVm/
+YQFBaczVuU4pA7RLWN3KwviR46sG9zSeUTn8wiKOmG94IrZQN0qDrXYnzegNk20H
+W2kCAwEAAaM4MDYwDgYDVR0PAQH/BAQDAgKkMBMGA1UdJQQMMAoGCCsGAQUFBwMB
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBACMFfqNNfOaNYQRA
+nymlHdB5vVMtCR6dLez8E93Nh+rZifzvdHEiom0JK1OrTqTkBboyl3aFleMpJYno
+sNI10sbYZTy+AAkQ3GEuG6CKofltvf/GoaN/WY4BDO2bc9gmlGTNTZCS/bctOO9C
+5OEk9q8BwfBje5QOjgCGFL6QtmxJHrdXHvfed79GhxWKggwdKbR6ZM6di/TG93rK
+OP5m876o9+xuQ2qV+f2TMY4c/B05OMzj01yHs27F13dFdyuEDzib+zcQR84HtjVY
+zQBk+teA64qVmrS1d5geAXlSfNmC/QQm7Yr2Q3OVRUvnFcgW+1fUopbbbfsLQ6TO
+a4UbAEg=
+-----END CERTIFICATE-----`)
+
+var caKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEApGFYx3JNV6Rp25pXjOy0veqYXQwn+TGQaDTs1+11KCDR9rfV
+wwaUqZB0o6ewOYfhmeIqXtdfRxGrVHycdNJsk2G6SmFjbHDB8IcXjbwR2u86qpdQ
+Tq2InS9/QLaFMgPMZi9RHxvc1zMK5hF40PJEMfDhn61O7HzC1QH8u/Ou/LoD8mnq
+05sCxbG6Tq4Wd5uWT66RXk0KCrpYC2gJAZYgywy96tzO5OKkWtQGu695gg3uyFYS
+/SNpAF61QCiOJH219Skzh7Tuy/Fk53+5Wb9hAUFpzNW5TikDtEtY3crC+JHjqwb3
+NJ5ROfzCIo6Yb3gitlA3SoOtdifN6A2TbQdbaQIDAQABAoIBAQCXkX834Eg6cMp/
+B/CEa9o4Z7D30vakyrPZsjtU2oo1ZxXTBS1gd5fqRd2W7U8LrSQzLRxeeP5MXJl6
+/K+S9FfTCcCpRuVTHyFkdFwef3SDSCTzGTSeZ1pZfWs7s1Bbjq8Q5b5KDfnyoAkD
+nMam+0wwNGkGP9pPKrbHi96LO6V1N2GDIJ6XFpCbvejJDM+cXEw8DmD2BiU6Cslq
+q3AOIHfNbqcDQGQVFRjFJwvximKZ0AvvF49UwoQSgZq5+FJXi+Em7ypzGlm9BwZW
+uCWKQFllv269M8Zv/3l9ojuCTQAtYXfsFfh7z9EvwuvDTPQLpoYznIIRmej8Pg8I
+lAGldbIRAoGBAMm+BEuGBUiZSylJYiTUGkWFlUeiwfJy9pOYpEYM3NWppmYZnNl0
+F3iWtjfQNbE4z++N4pP+zDBmtbqmvKrMeGT41yjHKGMmQXvLElA0mr9hPA3lJZJO
+k/28OKUNBVrFi3BX2JLcLge/g8FLCn0yt363tCuAUq4a6j8lVKWvc8+1AoGBANCW
+85Nzb61phEP3JQaXUUXF+4+wvo36QqqFDcJut24FjVmGaZwBI5Fcn151X2Oe2Al1
+ZfNZNi2V5132CXIw1mvCpA+UmgfSgTljIWV1L4dfMUACkekOFn04+tEuCGUTU22r
+1y8KQUjQqUqhUBP3EwwXGe1WmQPWfTquzGxsVGVlAoGAQ5lwRv45dwImtUbpo/2O
+cA064C4hXuQ2y24yXWah+NZH855ReGv2EWou1LTnyOKIinS4n26ZbP59lnWYcoLh
+NLRNJFTXq6F9/8Uj9cwqrkYeoWlPFZ9O547STDv4t1nKR3KoF02//sillXdXpGwC
+IGvd61WsXrqWE2Km4n3QCKECgYEAhVLGs0uIaR3VdZ+lYdYcE23dQdWlppf8PoO2
+7LzZr5AK7dr068rqkgHSt4xsAP/JdBo+pNEzyOVUsgENvpgqpUwOkwrXfQJ2qFiN
+Qw0o6OzWTOSXoI/pnfZqkoNKyFgW7jV039M9MS511obO6UP2P7cQUlwUh5h0CKsr
+bG29b+UCgYAb6tUPKHEQEvWEONNEy66vBtTIJXxjZISoExk40eaV/kAtEchlGXey
+IrepX5pgiugqVP5K+xYTIiQ28X3xstrq4sZHYXuO2yAVaILlVBp5/df/riRbymbQ
+7vphGG+/JeJJ6sb2yw48kYfQBroTO49aaf+A3LjykrkL+qAecX331w==
+-----END RSA PRIVATE KEY-----`)
+
+func TestCreateClientCert(t *testing.T) {
+ uid := types.UID("asdlkfjalsdjflj")
+ clientCert, err := generateClientCert(uid, 24, caCert, caKey)
+ if err != nil {
+ t.Error(err)
+ }
+ if clientCert == nil {
+ t.Fail()
+ }
+
+ if string(clientCert.CA) != string(caCert) {
+ t.Fail()
+ }
+
+ t.Logf("ca: \n%s", clientCert.CA)
+ t.Logf("cert: \n%s", clientCert.Crt)
+ t.Logf("key: \n%s", clientCert.Key)
+}
diff --git a/cmd/azure-keyvault-secrets-webhook/main.go b/cmd/azure-keyvault-secrets-webhook/main.go
index cc11e7a8..66e561e0 100644
--- a/cmd/azure-keyvault-secrets-webhook/main.go
+++ b/cmd/azure-keyvault-secrets-webhook/main.go
@@ -19,77 +19,95 @@ package main
import (
"context"
+ "crypto/tls"
+ "crypto/x509"
"encoding/json"
+ "flag"
"fmt"
"io/ioutil"
"net/http"
"os"
+ "path/filepath"
+ "strconv"
+ "sync"
+ "time"
- vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider"
"github.com/gorilla/mux"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
- log "github.com/sirupsen/logrus"
whhttp "github.com/slok/kubewebhook/pkg/http"
internalLog "github.com/slok/kubewebhook/pkg/log"
"github.com/slok/kubewebhook/pkg/observability/metrics"
whcontext "github.com/slok/kubewebhook/pkg/webhook/context"
"github.com/slok/kubewebhook/pkg/webhook/mutating"
"github.com/spf13/viper"
+ "k8s.io/client-go/tools/clientcmd"
+ jsonlogs "k8s.io/component-base/logs/json"
+ "k8s.io/klog/v2"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
- "k8s.io/client-go/rest"
)
const (
- dockerHubHost = "index.docker.io"
- oldDockerHubHost = "docker.io"
- injectorDir = "/azure-keyvault/"
- injectorExecutable = "azure-keyvault-env"
- clientCertDir = "/client-cert/"
+ dockerHubHost = "index.docker.io"
+ oldDockerHubHost = "docker.io"
+ injectorExecutable = "azure-keyvault-env"
+ clientCertDir = "/var/client-cert/"
+ initContainerVolumeName = "azure-keyvault-env"
)
type azureKeyVaultConfig struct {
- port string
- caPort string
- customAuth bool
- namespace string
- aadPodBindingLabel string
- dockerPullTimeout int
- cloudConfigHostPath string
- serveMetrics bool
- metricsPort string
- certFile string
- keyFile string
- caFile string
- useAuthService bool
- // nameLocallyOverrideAuthService string
- authServiceName string
- authServicePort string
- kubeClient *kubernetes.Clientset
- credentials vault.AzureKeyVaultCredentials
+ port string
+ cloudConfig string
+ serveMetrics bool
+ httpPort string
+ tlsCertFile string
+ tlsKeyFile string
+ caCert []byte
+ caKey []byte
+ authType string
+ useAuthService bool
+ dockerImageInspectionTimeout int
+ useAksCredentialsWithAcr bool
+ authServiceName string
+ authServicePort string
+ authServicePortInternal string
+ kubeClient *kubernetes.Clientset
+ credentials credentialprovider.AzureKeyVaultCredentials
+ versionEnvImage string
+ kubeconfig string
+ masterURL string
+ injectorDir string
+}
+
+type cmdParams struct {
+ version string
+ versionEnvImage string
+ kubeconfig string
+ masterURL string
+ cloudConfig string
+ logFormat string
}
var config azureKeyVaultConfig
+var params cmdParams
var (
podsMutatedCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "akv2k8s_pod_mutations_total",
Help: "The total number of pods mutated",
})
-)
-var (
podsInspectedCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "akv2k8s_pod_inspections_total",
Help: "The total number of pods inspected, including mutated",
})
-)
-var (
podsMutatedFailedCounter = promauto.NewCounter(prometheus.CounterOpts{
Name: "akv2k8s_pod_mutations_failed_total",
Help: "The total number of attempted pod mutations that failed",
@@ -98,62 +116,53 @@ var (
const envVarReplacementKey = "@azurekeyvault"
-func setLogLevel(logLevel string) {
- if logLevel == "" {
- logLevel = log.InfoLevel.String()
- }
-
- logrusLevel, err := log.ParseLevel(logLevel)
- if err != nil {
- log.Fatalf("error setting log level: %s", err.Error())
- }
- log.SetLevel(logrusLevel)
-}
+// func setLogFormat(logFormat string) {
+// switch logFormat {
+// case "fmt":
+// log.SetFormatter(&log.TextFormatter{
+// DisableColors: true,
+// FullTimestamp: true,
+// })
+// case "json":
+// log.SetFormatter(&log.JSONFormatter{})
+// default:
+// log.Warnf("Log format %s not supported - using default fmt", logFormat)
+// }
+// }
func vaultSecretsMutator(ctx context.Context, obj metav1.Object) (bool, error) {
req := whcontext.GetAdmissionRequest(ctx)
- config.namespace = req.Namespace
var pod *corev1.Pod
switch v := obj.(type) {
case *corev1.Pod:
- log.Infof("found pod to mutate in namespace '%s'", config.namespace)
+ klog.InfoS("found pod to mutate", "pod", klog.KRef(req.Namespace, req.Name))
pod = v
default:
return false, nil
}
podsInspectedCounter.Inc()
- err := mutatePodSpec(pod)
+ err := mutatePodSpec(pod, req.Namespace, req.UID)
if err != nil {
+ klog.ErrorS(err, "failed to mutate", "pod", klog.KRef(req.Namespace, req.Name))
podsMutatedFailedCounter.Inc()
}
return false, err
}
-func initConfig() {
- viper.SetDefault("azurekeyvault_env_image", "spvest/azure-keyvault-env:latest")
- viper.SetDefault("custom_docker_pull_timeout", 20)
- viper.SetDefault("use_auth_service", true)
- viper.SetDefault("cloud_config_host_path", "/etc/kubernetes/azure.json")
- viper.SetDefault("metrics_port", "80")
- viper.SetDefault("port", "443")
-
- viper.AutomaticEnv()
-}
-
func handlerFor(config mutating.WebhookConfig, mutator mutating.MutatorFunc, recorder metrics.Recorder, logger internalLog.Logger) http.Handler {
webhook, err := mutating.NewWebhook(config, mutator, nil, nil, logger)
if err != nil {
- log.Errorf("error creating webhook: %s", err)
+ klog.ErrorS(err, "error creating webhook")
os.Exit(1)
}
handler, err := whhttp.HandlerFor(webhook)
if err != nil {
- log.Errorf("error creating webhook: %s", err)
+ klog.ErrorS(err, "error creating webhook")
os.Exit(1)
}
@@ -164,13 +173,12 @@ func authHandler(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
vars := mux.Vars(r)
pod := podData{
- name: vars["pod"],
- namespace: vars["namespace"],
- remoteAddress: r.RemoteAddr,
+ name: vars["pod"],
+ namespace: vars["namespace"],
}
if pod.name == "" || pod.namespace == "" {
- log.Errorf("failed to parse url parameters, pod='%s', namespace='%s'", pod.name, pod.namespace)
+ klog.InfoS("failed to parse url parameters", "pod", pod.name, "namespace", pod.namespace)
http.Error(w, "", http.StatusBadRequest)
return
}
@@ -178,7 +186,7 @@ func authHandler(w http.ResponseWriter, r *http.Request) {
err := authorize(config.kubeClient, pod)
if err != nil {
- log.Errorf("failed to authorize request: %+v", err)
+ klog.ErrorS(err, "failed to authorize request", "pod", pod.name, "namespace", pod.namespace)
http.Error(w, "", http.StatusForbidden)
return
}
@@ -186,14 +194,15 @@ func authHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
- log.Infof("served oauth token to '%s/%s' at address '%s'", pod.namespace, pod.name, r.RemoteAddr)
-
if err := json.NewEncoder(w).Encode(config.credentials); err != nil {
- log.Errorf("failed to json encode token, error: %+v", err)
+ klog.ErrorS(err, "failed to json encode token", "pod", pod.name, "namespace", pod.namespace)
http.Error(w, err.Error(), http.StatusInternalServerError)
+ } else {
+ klog.InfoS("served oauth token", "pod", pod.name, "namespace", pod.namespace)
}
+
} else {
- log.Error("invalid request method")
+ klog.InfoS("invalid request method")
http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
}
}
@@ -206,105 +215,262 @@ func healthHandler(w http.ResponseWriter, r *http.Request) {
}
}
-func handleCACert(w http.ResponseWriter, r *http.Request) {
- if r.Method == "GET" {
- caCert, err := ioutil.ReadFile(config.caFile)
- if err != nil {
- log.Fatal(err)
- }
- w.Write(caCert)
- } else {
- http.Error(w, "Invalid request method", http.StatusMethodNotAllowed)
- }
+func initConfig() {
+ viper.SetDefault("azurekeyvault_env_image", "spvest/azure-keyvault-env:latest")
+ viper.SetDefault("docker_image_inspection_timeout", 20)
+ viper.SetDefault("docker_image_inspection_use_acs_credentials", true)
+ viper.SetDefault("auth_type", "cloudConfig")
+ viper.SetDefault("use_auth_service", true)
+ viper.SetDefault("metrics_enabled", false)
+ viper.SetDefault("port_http", "80")
+ viper.SetDefault("port", "443")
+ viper.SetDefault("webhook_auth_service_port", "8443")
+ viper.SetDefault("webhook_auth_service_port_internal", "8443")
+ viper.SetDefault("env_injector_exec_dir", "/azure-keyvault/")
+ viper.AutomaticEnv()
}
-func serveCA() {
- log.Infof("CA cert at http://%s:", config.metricsPort)
-
- caMux := http.NewServeMux()
- caMux.HandleFunc("/ca", handleCACert)
- err := http.ListenAndServe(fmt.Sprintf(":%s", config.caPort), caMux)
- if err != nil {
- log.Fatalf("error serving ca cert: %s", err)
- }
+func init() {
+ flag.StringVar(¶ms.version, "version", "", "Version of this component.")
+ flag.StringVar(¶ms.versionEnvImage, "versionenvimage", "", "Version of the env image component.")
+ flag.StringVar(¶ms.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.")
+ flag.StringVar(¶ms.masterURL, "master", "", "The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster.")
+ flag.StringVar(¶ms.cloudConfig, "cloudconfig", "/etc/kubernetes/azure.json", "Path to cloud config. Only required if this is not at default location /etc/kubernetes/azure.json")
+ flag.StringVar(¶ms.logFormat, "logging-format", "text", "Log format - text or json.")
}
func main() {
- fmt.Fprintln(os.Stdout, "initializing config...")
+ klog.InitFlags(nil)
+ defer klog.Flush()
+
+ flag.Parse()
+
initConfig()
- fmt.Fprintln(os.Stdout, "config initialized")
- logLevel := viper.GetString("LOG_LEVEL")
- setLogLevel(logLevel)
+ if params.logFormat == "json" {
+ klog.SetLogger(jsonlogs.JSONLogger)
+ }
+
+ akv2k8s.Version = params.version
+
+ // logFormat := viper.GetString("log_format")
+ // setLogFormat(logFormat)
+
+ akv2k8s.LogVersion()
config = azureKeyVaultConfig{
- port: viper.GetString("port"),
- customAuth: viper.GetBool("custom_auth"),
- dockerPullTimeout: viper.GetInt("custom_docker_pull_timeout"),
- serveMetrics: viper.GetBool("metrics_enabled"),
- metricsPort: viper.GetString("metrics_port"),
- certFile: viper.GetString("tls_cert_file"),
- keyFile: viper.GetString("tls_private_key_file"),
- caFile: viper.GetString("tls_ca_file"),
- useAuthService: viper.GetBool("use_auth_service"),
- authServiceName: viper.GetString("webhook_auth_service"),
- authServicePort: viper.GetString("webhook_auth_service_port"),
- cloudConfigHostPath: viper.GetString("cloud_config_host_path"),
+ port: viper.GetString("port"),
+ httpPort: viper.GetString("port_http"),
+ authType: viper.GetString("auth_type"),
+ serveMetrics: viper.GetBool("metrics_enabled"),
+ tlsCertFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.crt"),
+ tlsKeyFile: fmt.Sprintf("%s/%s", viper.GetString("tls_cert_dir"), "tls.key"),
+ useAuthService: viper.GetBool("use_auth_service"),
+ authServiceName: viper.GetString("webhook_auth_service"),
+ authServicePort: viper.GetString("webhook_auth_service_port"),
+ authServicePortInternal: viper.GetString("webhook_auth_service_port_internal"),
+ dockerImageInspectionTimeout: viper.GetInt("docker_image_inspection_timeout"),
+ useAksCredentialsWithAcr: viper.GetBool("docker_image_inspection_use_acs_credentials"),
+ injectorDir: viper.GetString("env_injector_exec_dir"),
+ versionEnvImage: params.versionEnvImage,
+ cloudConfig: params.cloudConfig,
}
+ activeSettings := []interface{}{
+ "webhookPort", config.port,
+ "serveMetrics", config.serveMetrics,
+ "authType", config.authType,
+ "useAuthService", config.useAuthService,
+ "useAksCredsWithAcr", config.useAksCredentialsWithAcr,
+ "dockerInspectionTimeout", config.dockerImageInspectionTimeout,
+ "cloudConfigPath", config.cloudConfig,
+ }
+
+ if config.useAuthService {
+ activeSettings = append(activeSettings,
+ "authServiceName", config.authServiceName,
+ "authServicePort", config.authServicePort,
+ "authServiceInternalPort", config.authServicePortInternal)
+ }
+
+ klog.InfoS("active settings", activeSettings...)
+
mutator := mutating.MutatorFunc(vaultSecretsMutator)
metricsRecorder := metrics.NewPrometheus(prometheus.DefaultRegisterer)
- internalLogger := &internalLog.Std{Debug: logLevel == "debug" || logLevel == "trace"}
+ logLevel := flag.Lookup("v").Value.String()
+ klogLevel, err := strconv.Atoi(logLevel)
+ if err != nil {
+ klog.ErrorS(err, "failed to parse log level")
+ klogLevel = 2
+ }
+
+ internalLogger := &internalLog.Std{Debug: klogLevel >= 4}
podHandler := handlerFor(mutating.WebhookConfig{Name: "azurekeyvault-secrets-pods", Obj: &corev1.Pod{}}, mutator, metricsRecorder, internalLogger)
- var err error
- if config.customAuth {
- config.credentials, err = vault.NewAzureKeyVaultCredentialsFromEnvironment()
+ if config.useAuthService {
+ caCertDir := viper.GetString("ca_cert_dir")
+ if caCertDir == "" {
+ klog.InfoS("missing env var - must exist to use auth service", "env", "CA_CERT_DIR")
+ os.Exit(1)
+ }
+
+ caCertFile := filepath.Join(caCertDir, "tls.crt")
+ caKeyFile := filepath.Join(caCertDir, "tls.key")
+
+ config.caCert, err = ioutil.ReadFile(caCertFile)
+ if err != nil {
+ klog.ErrorS(err, "failed to read pem file for ca cert", "file", caCertFile)
+ os.Exit(1)
+ }
+
+ config.caKey, err = ioutil.ReadFile(caKeyFile)
+ if err != nil {
+ klog.ErrorS(err, "failed to read pem file for ca key", "file", caKeyFile)
+ os.Exit(1)
+ }
+ }
+
+ if config.authType != "cloudConfig" {
+ klog.V(4).InfoS("not using cloudConfig for auth - looking for azure key vault credentials in envrionment")
+ cProvider, err := credentialprovider.NewFromEnvironment()
if err != nil {
- log.Fatal(err)
+ klog.ErrorS(err, "failed to create credentials provider from environment for azure key vault")
+ os.Exit(1)
}
+
+ config.credentials, err = cProvider.GetAzureKeyVaultCredentials()
+ if err != nil {
+ klog.ErrorS(err, "failed to get credentials for azure key vault")
+ os.Exit(1)
+ }
+
} else {
- config.credentials, err = vault.NewAzureKeyVaultCredentialsFromCloudConfig(config.cloudConfigHostPath)
+ klog.V(4).InfoS("using cloudConfig for auth - reading credentials", "file", config.cloudConfig)
+ f, err := os.Open(config.cloudConfig)
if err != nil {
- log.Fatal(err)
+ klog.ErrorS(err, "failed to read azure config", "file", config.cloudConfig)
+ os.Exit(1)
}
+ defer f.Close()
+
+ cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f)
+ if err != nil {
+ klog.ErrorS(err, "failed to create cloud config provider for azure key vault", "file", config.cloudConfig)
+ os.Exit(1)
+ }
+
+ config.credentials, err = cloudCnfProvider.GetAzureKeyVaultCredentials()
+ if err != nil {
+ klog.ErrorS(err, "failed to get azure key vault credentials", "file", config.cloudConfig)
+ os.Exit(1)
+ }
+ }
+
+ klog.V(4).InfoS("checking credentials by getting authorizer from credentials")
+ _, err = config.credentials.Authorizer()
+ if err != nil {
+ klog.ErrorS(err, "failed to get authorizer from azure key vault credentials")
+ os.Exit(1)
}
- cfg, err := rest.InClusterConfig()
+ cfg, err := clientcmd.BuildConfigFromFlags(params.masterURL, params.kubeconfig)
if err != nil {
- log.Fatalf("failed to get kubernetes in cluster config, error: %+v", err)
+ klog.ErrorS(err, "failed to build kube config", "master", params.masterURL, "kubeconfig", params.kubeconfig)
+ os.Exit(1)
}
config.kubeClient, err = kubernetes.NewForConfig(cfg)
if err != nil {
- log.Fatalf("Error building kubernetes clientset: %s", err.Error())
+ klog.ErrorS(err, "failed to build kube clientset", "master", params.masterURL, "kubeconfig", params.kubeconfig)
+ os.Exit(1)
}
- log.Infof("Serving unencrypted traffic at http://:%s", config.metricsPort)
+ wg := new(sync.WaitGroup)
+ wg.Add(2)
httpMux := http.NewServeMux()
+ httpURL := fmt.Sprintf(":%s", config.httpPort)
+
if config.serveMetrics {
httpMux.Handle("/metrics", promhttp.Handler())
+ klog.InfoS("serving metrics endpoint", "path", fmt.Sprintf("%s/metrics", httpURL))
}
- httpMux.HandleFunc("/ca", handleCACert)
httpMux.HandleFunc("/healthz", healthHandler)
+ klog.InfoS("serving health endpoint", "path", fmt.Sprintf("%s/healthz", httpURL))
go func() {
- err := http.ListenAndServe(fmt.Sprintf(":%s", config.metricsPort), httpMux)
+ err := http.ListenAndServe(httpURL, httpMux)
if err != nil {
- log.Fatalf("error serving on port %s: %s", config.metricsPort, err)
+ klog.ErrorS(err, "error serving metrics", "port", httpURL)
+ os.Exit(1)
}
+ wg.Done()
}()
router := mux.NewRouter()
+ tlsURL := fmt.Sprintf(":%s", config.port)
+
router.Handle("/pods", podHandler)
- router.HandleFunc("/auth/{namespace}/{pod}", authHandler)
+ klog.InfoS("serving encrypted webhook endpoint", "path", fmt.Sprintf("%s/pods", tlsURL))
+
router.HandleFunc("/healthz", healthHandler)
+ klog.InfoS("serving encrypted healthz endpoint", "path", fmt.Sprintf("%s/healthz", tlsURL))
+
+ if config.useAuthService {
+ wg.Add(1)
+ authURL := fmt.Sprintf(":%s", config.authServicePortInternal)
+ authRouter := mux.NewRouter()
+
+ authRouter.HandleFunc("/auth/{namespace}/{pod}", authHandler)
+ authServer := createServerWithMTLS(config.caCert, authRouter, authURL)
+ klog.InfoS("serving encrypted auth endpoint", "path", fmt.Sprintf("%s/auth", authURL))
+
+ go func() {
+ err := authServer.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile)
+ if err != nil {
+ klog.ErrorS(err, "error serving auth", "port", authURL)
+ os.Exit(1)
+ }
+ wg.Done()
+ }()
+ }
- log.Infof("Serving TLS encrypted traffic at https://:%s", config.port)
- err = http.ListenAndServeTLS(fmt.Sprintf(":%s", config.port), config.certFile, config.keyFile, router)
- if err != nil {
- log.Fatalf("error serving webhook: %+v", err)
+ go func() {
+ server := createServer(router, tlsURL, nil)
+ err := server.ListenAndServeTLS(config.tlsCertFile, config.tlsKeyFile)
+ if err != nil {
+ klog.ErrorS(err, "error serving endpoint", "port", tlsURL)
+ os.Exit(1)
+ }
+ wg.Done()
+ }()
+
+ wg.Wait()
+}
+
+func createServerWithMTLS(caCert []byte, router http.Handler, url string) *http.Server {
+ clientCertPool := x509.NewCertPool()
+ clientCertPool.AppendCertsFromPEM(caCert)
+
+ tlsConfig := &tls.Config{
+ ClientAuth: tls.RequireAndVerifyClientCert,
+ ClientCAs: clientCertPool,
+ PreferServerCipherSuites: true,
+ MinVersion: tls.VersionTLS12,
+ }
+
+ tlsConfig.BuildNameToCertificate()
+
+ return createServer(router, url, tlsConfig)
+}
+
+func createServer(router http.Handler, url string, tlsConfig *tls.Config) *http.Server {
+ return &http.Server{
+ Addr: url,
+ TLSConfig: tlsConfig,
+ Handler: router,
+ WriteTimeout: 15 * time.Second,
+ ReadTimeout: 15 * time.Second,
}
}
diff --git a/cmd/azure-keyvault-secrets-webhook/pod.go b/cmd/azure-keyvault-secrets-webhook/pod.go
index c0c1c7b7..ae44000d 100644
--- a/cmd/azure-keyvault-secrets-webhook/pod.go
+++ b/cmd/azure-keyvault-secrets-webhook/pod.go
@@ -18,6 +18,7 @@
package main
import (
+ "context"
"encoding/base64"
"fmt"
"io/ioutil"
@@ -26,21 +27,26 @@ import (
"strconv"
"strings"
- "github.com/containers/image/v5/types"
- log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
corev1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/errors"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/types"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
+ "k8s.io/klog/v2"
+)
+
+const (
+ authSecretVolumeName = "akv2k8s-client-cert"
+ keyVaultEnvVolumeName = "azure-keyvault-env"
)
// This init-container copies a program to /azure-keyvault/ and
// if default auth copies a read only version of azure config into
// the /azure-keyvault/ folder to use as auth
func getInitContainers() []corev1.Container {
- fullExecPath := filepath.Join(injectorDir, injectorExecutable)
- cmd := fmt.Sprintf("echo 'Copying %s to %s'", fullExecPath, injectorDir)
- cmd = cmd + fmt.Sprintf(" && cp /usr/local/bin/%s %s", injectorExecutable, injectorDir)
+ cmd := fmt.Sprintf("cp /usr/local/bin/%s %s", injectorExecutable, config.injectorDir)
container := corev1.Container{
Name: "copy-azurekeyvault-env",
@@ -49,8 +55,8 @@ func getInitContainers() []corev1.Container {
Command: []string{"sh", "-c", cmd},
VolumeMounts: []corev1.VolumeMount{
{
- Name: "azure-keyvault-env",
- MountPath: injectorDir,
+ Name: initContainerVolumeName,
+ MountPath: config.injectorDir,
},
},
}
@@ -58,10 +64,10 @@ func getInitContainers() []corev1.Container {
return []corev1.Container{container}
}
-func getVolumes(useAuthService bool) []corev1.Volume {
+func getVolumes(authSecret *corev1.Secret) []corev1.Volume {
volumes := []corev1.Volume{
{
- Name: "azure-keyvault-env",
+ Name: keyVaultEnvVolumeName,
VolumeSource: corev1.VolumeSource{
EmptyDir: &corev1.EmptyDirVolumeSource{
Medium: corev1.StorageMediumMemory,
@@ -70,111 +76,99 @@ func getVolumes(useAuthService bool) []corev1.Volume {
},
}
+ if config.useAuthService {
+ mode := int32(420)
+ volumes = append(volumes, []corev1.Volume{
+ {
+ Name: authSecretVolumeName,
+ VolumeSource: corev1.VolumeSource{
+ Secret: &corev1.SecretVolumeSource{
+ SecretName: authSecret.Name,
+ DefaultMode: &mode,
+ },
+ },
+ },
+ }...)
+ }
+
return volumes
}
-func mutateContainers(containers []corev1.Container, creds map[string]types.DockerAuthConfig) (bool, bool, error) {
-
+func mutateContainers(clientset kubernetes.Interface, containers []corev1.Container, podSpec *corev1.PodSpec, namespace string, authServiceSecret *corev1.Secret) (bool, error) {
mutated := false
- anyUseAuthService := config.useAuthService
for i, container := range containers {
- containerOverrideAuthService := false
- containerUseAuthService := config.useAuthService
-
- log.Infof("found container '%s' to mutate", container.Name)
+ useAuthService := config.useAuthService
+ klog.InfoS("found container to mutate", "container", klog.KRef(namespace, container.Name))
var envVars []corev1.EnvVar
- log.Infof("checking for env vars containing '%s' in container %s", envVarReplacementKey, container.Name)
+ klog.InfoS("checking for env vars to inject", "container", klog.KRef(namespace, container.Name))
for _, env := range container.Env {
if strings.Contains(env.Value, envVarReplacementKey) {
- log.Infof("found env var: %s", env.Value)
+ klog.InfoS("found env var to inject", "env", env.Value, "container", klog.KRef(namespace, container.Name))
envVars = append(envVars, env)
}
- if strings.ToUpper(env.Name) == "ENV_INJECTOR_USE_AUTH_SERVICE" {
- containerOverrideAuthService = true
- containerUseAuthService, err := strconv.ParseBool(env.Value)
+ if strings.ToUpper(env.Name) == "ENV_INJECTOR_DISABLE_AUTH_SERVICE" {
+ containerDisabledAuthService, err := strconv.ParseBool(env.Value)
if err != nil {
- return false, false, fmt.Errorf("failed to parse container env var override for auth service, error: %+v", err)
+ return false, fmt.Errorf("failed to parse container env var override for auth service, error: %+v", err)
}
- if containerUseAuthService {
- anyUseAuthService = true
+ if containerDisabledAuthService {
+ klog.InfoS("container has disabled auth service", "container", klog.KRef(namespace, container.Name))
+ useAuthService = false
}
}
}
if len(envVars) == 0 {
- log.Info("found no env vars in container")
+ klog.Info("found no env vars to inject", "container", klog.KRef(namespace, container.Name))
continue
}
- registryName := ""
- imgParts := strings.Split(container.Image, "/")
- if len(imgParts) >= 2 {
- registryName = imgParts[0]
- }
-
- regCred, ok := creds[registryName]
-
- if ok {
- log.Infof("found credentials to use with registry '%s'", registryName)
- } else {
- log.Infof("did not find credentials to use with registry '%s' - getting default credentials", registryName)
- // todo: acr is azure specific
- regCred, ok = getAcrCredentials(registryName)
- }
-
- if !ok {
- log.Infof("did not find credentials to use with registry '%s' - skipping credentials", registryName)
- }
-
- autoArgs, err := getContainerCmd(container, regCred)
+ autoArgs, err := getContainerCmd(clientset, &container, podSpec, namespace)
if err != nil {
- return false, false, fmt.Errorf("failed to get auto cmd, error: %+v", err)
+ return false, fmt.Errorf("failed to get auto cmd, error: %+v", err)
}
autoArgsStr := strings.Join(autoArgs, " ")
- log.Infof("using '%s' as arguments for env-injector", autoArgsStr)
+ klog.InfoS("found container arguments to use for env-injector", "cmd", autoArgsStr, "container", klog.KRef(namespace, container.Name))
privKey, pubKey, err := newKeyPair()
if err != nil {
- return false, false, fmt.Errorf("failed to create signing key pair, error: %+v", err)
+ return false, fmt.Errorf("failed to create signing key pair, error: %+v", err)
}
signature, err := signPKCS(autoArgsStr, *privKey)
if err != nil {
- return false, false, fmt.Errorf("failed to sign command args, error: %+v", err)
+ return false, fmt.Errorf("failed to sign command args, error: %+v", err)
}
+ klog.V(4).InfoS("signed arguments to prevent override", "container", klog.KRef(namespace, container.Name))
publicSigningKey, err := exportRsaPublicKey(pubKey)
if err != nil {
- return false, false, fmt.Errorf("failed to export public rsa key to pem, error: %+v", err)
+ return false, fmt.Errorf("failed to export public rsa key to pem, error: %+v", err)
}
+ klog.V(4).InfoS("public signing key for argument verification", "key", publicSigningKey, "container", klog.KRef(namespace, container.Name))
+
mutated = true
- fullExecPath := filepath.Join(injectorDir, injectorExecutable)
+ fullExecPath := filepath.Join(config.injectorDir, injectorExecutable)
+ klog.V(4).InfoS("full exec path", "path", fullExecPath, "container", klog.KRef(namespace, container.Name))
container.Command = []string{fullExecPath}
container.Args = autoArgs
container.VolumeMounts = append(container.VolumeMounts, []corev1.VolumeMount{
{
- Name: "azure-keyvault-env",
- MountPath: injectorDir,
+ Name: keyVaultEnvVolumeName,
+ MountPath: config.injectorDir,
ReadOnly: true,
},
}...)
+ klog.V(4).InfoS("mounting volume", "volume", keyVaultEnvVolumeName, "path", config.injectorDir, "container", klog.KRef(namespace, container.Name))
container.Env = append(container.Env, []corev1.EnvVar{
- {
- Name: "ENV_INJECTOR_POD_NAMESPACE",
- ValueFrom: &corev1.EnvVarSource{
- FieldRef: &corev1.ObjectFieldSelector{
- FieldPath: "metadata.namespace",
- },
- },
- },
{
Name: "ENV_INJECTOR_ARGS_SIGNATURE",
Value: base64.StdEncoding.EncodeToString([]byte(signature)),
@@ -183,27 +177,57 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock
Name: "ENV_INJECTOR_ARGS_KEY",
Value: base64.StdEncoding.EncodeToString([]byte(publicSigningKey)),
},
+ {
+ Name: "ENV_INJECTOR_USE_AUTH_SERVICE",
+ Value: strconv.FormatBool(useAuthService),
+ },
}...)
- // Do not add env var for using auth service if already exists
- if config.useAuthService && !containerOverrideAuthService {
- container.Env = append(container.Env, []corev1.EnvVar{
+ if useAuthService {
+ _, err := config.kubeClient.CoreV1().Secrets(namespace).Create(context.TODO(), authServiceSecret, metav1.CreateOptions{})
+ if err != nil {
+ if errors.IsAlreadyExists(err) {
+ _, err = config.kubeClient.CoreV1().Secrets(namespace).Update(context.TODO(), authServiceSecret, metav1.UpdateOptions{})
+ if err != nil {
+ return false, err
+ }
+ } else {
+ return false, err
+ }
+ }
+
+ container.VolumeMounts = append(container.VolumeMounts, []corev1.VolumeMount{
{
- Name: "ENV_INJECTOR_USE_AUTH_SERVICE",
- Value: "true",
+ Name: authSecretVolumeName,
+ MountPath: clientCertDir,
+ ReadOnly: true,
},
}...)
- }
- if containerUseAuthService {
container.Env = append(container.Env, []corev1.EnvVar{
{
- Name: "ENV_INJECTOR_AUTH_SERVICE",
- Value: fmt.Sprintf("%s.%s.svc:%s", config.authServiceName, namespace(), config.authServicePort),
+ Name: "ENV_INJECTOR_CLIENT_CERT_DIR",
+ Value: clientCertDir,
+ },
+ {
+ Name: "ENV_INJECTOR_POD_NAMESPACE",
+ ValueFrom: &corev1.EnvVarSource{
+ FieldRef: &corev1.ObjectFieldSelector{
+ FieldPath: "metadata.namespace",
+ },
+ },
},
{
- Name: "ENV_INJECTOR_CA_CERT",
- Value: fmt.Sprintf("%s.%s.svc:%s", config.authServiceName, namespace(), config.caPort),
+ Name: "ENV_INJECTOR_POD_NAME",
+ ValueFrom: &corev1.EnvVarSource{
+ FieldRef: &corev1.ObjectFieldSelector{
+ FieldPath: "metadata.name",
+ },
+ },
+ },
+ {
+ Name: "ENV_INJECTOR_AUTH_SERVICE",
+ Value: fmt.Sprintf("%s.%s.svc:%s", config.authServiceName, currentNamespace(), config.authServicePort),
},
}...)
}
@@ -211,10 +235,50 @@ func mutateContainers(containers []corev1.Container, creds map[string]types.Dock
containers[i] = container
}
- return mutated, anyUseAuthService, nil
+ return mutated, nil
}
-func mutatePodSpec(pod *corev1.Pod) error {
+func createAuthServicePodSecret(pod *corev1.Pod, namespace string, mutationID types.UID, caCert, caKey []byte) (*corev1.Secret, error) {
+ // Create secret containing CA cert and mTLS credentials
+
+ clientCert, err := generateClientCert(mutationID, 24, caCert, caKey)
+ if err != nil {
+ return nil, err
+ }
+
+ value := map[string][]byte{
+ "ca.crt": clientCert.CA,
+ "tls.crt": clientCert.Crt,
+ "tls.key": clientCert.Key,
+ }
+
+ name := pod.GetName()
+ ownerReferences := pod.GetOwnerReferences()
+ if name == "" {
+ if len(ownerReferences) > 0 {
+ if strings.Contains(ownerReferences[0].Name, "-") {
+ generateNameSlice := strings.Split(ownerReferences[0].Name, "-")
+ name = strings.Join(generateNameSlice[:len(generateNameSlice)-1], "-")
+ } else {
+ name = ownerReferences[0].Name
+ }
+ }
+ }
+
+ secret := &corev1.Secret{
+ ObjectMeta: metav1.ObjectMeta{
+ Name: fmt.Sprintf("akv2k8s-%s", name),
+ Namespace: namespace,
+ OwnerReferences: ownerReferences,
+ },
+ Type: corev1.SecretTypeTLS,
+ Data: value,
+ }
+
+ return secret, nil
+}
+
+func mutatePodSpec(pod *corev1.Pod, namespace string, mutationID types.UID) error {
podSpec := &pod.Spec
kubeConfig, err := rest.InClusterConfig()
@@ -227,37 +291,37 @@ func mutatePodSpec(pod *corev1.Pod) error {
return err
}
- regCred, err := getRegistryCreds(*clientset, podSpec)
- if err != nil {
- return err
+ var authServiceSecret *corev1.Secret
+ if config.useAuthService {
+ authServiceSecret, err = createAuthServicePodSecret(pod, namespace, mutationID, config.caCert, config.caKey)
+ if err != nil {
+ return err
+ }
}
- var initContainersUseAuthService bool
- var containersUseAuthService bool
-
- initContainersMutated, initContainersUseAuthService, err := mutateContainers(podSpec.InitContainers, regCred)
+ initContainersMutated, err := mutateContainers(clientset, podSpec.InitContainers, podSpec, namespace, authServiceSecret)
if err != nil {
return err
}
- containersMutated, containersUseAuthService, err := mutateContainers(podSpec.Containers, regCred)
+ containersMutated, err := mutateContainers(clientset, podSpec.Containers, podSpec, namespace, authServiceSecret)
if err != nil {
return err
}
if initContainersMutated || containersMutated {
podSpec.InitContainers = append(getInitContainers(), podSpec.InitContainers...)
- podSpec.Volumes = append(podSpec.Volumes, getVolumes(initContainersUseAuthService || containersUseAuthService)...)
- log.Info("containers mutated and pod updated with init-container and volumes")
+ podSpec.Volumes = append(podSpec.Volumes, getVolumes(authServiceSecret)...)
+ klog.InfoS("containers mutated and pod updated with init-container and volumes", "pod", klog.KRef(namespace, pod.Name))
podsMutatedCounter.Inc()
} else {
- log.Info("no containers mutated")
+ klog.InfoS("no containers mutated", "pod", klog.KRef(namespace, pod.Name))
}
return nil
}
-func namespace() string {
+func currentNamespace() string {
if ns, ok := os.LookupEnv("POD_NAMESPACE"); ok {
return ns
}
diff --git a/cmd/azure-keyvault-secrets-webhook/registry.go b/cmd/azure-keyvault-secrets-webhook/registry.go
index 35aa348d..55e7610f 100644
--- a/cmd/azure-keyvault-secrets-webhook/registry.go
+++ b/cmd/azure-keyvault-secrets-webhook/registry.go
@@ -18,187 +18,36 @@
package main
import (
- "context"
- "encoding/base64"
- "encoding/json"
- "fmt"
- "strings"
- "time"
-
- "github.com/containers/image/v5/transports/alltransports"
- "github.com/containers/image/v5/types"
- v1 "github.com/opencontainers/image-spec/specs-go/v1"
- log "github.com/sirupsen/logrus"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/docker/registry"
corev1 "k8s.io/api/core/v1"
- metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
- "k8s.io/kubernetes/pkg/credentialprovider/azure"
+ "k8s.io/klog/v2"
)
-func getContainerCmd(container corev1.Container, creds types.DockerAuthConfig) ([]string, error) {
+func getContainerCmd(clientset kubernetes.Interface, container *corev1.Container, podSpec *corev1.PodSpec, namespace string) ([]string, error) {
+ klog.V(4).InfoS("getting container command for container", "container", klog.KRef(namespace, container.Name))
cmd := container.Command
// If container.Command is set it will override both image.Entrypoint AND image.Cmd
// https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes
if len(cmd) == 0 {
- opts := imageOptions{
- image: container.Image,
- credentials: creds,
- }
+ klog.V(4).InfoS("no cmd override in kubernetes for container, checking docker image configuration for entrypoint and cmd", "image", container.Image, "container", klog.KRef(namespace, container.Name))
- config, err := opts.getConfigFromManifest()
+ imgConfig, err := registry.GetImageConfig(clientset, namespace, container, podSpec, config.cloudConfig)
if err != nil {
return nil, err
}
- cmd = append(cmd, config.Config.Entrypoint...)
+ cmd = append(cmd, imgConfig.Entrypoint...)
if len(container.Args) == 0 {
- cmd = append(cmd, config.Config.Cmd...)
+ cmd = append(cmd, imgConfig.Cmd...)
}
+ } else {
+ klog.V(4).InfoS("found cmd override in kubernetes for container, no need to inspect docker image configuration", "image", container.Image, "container", klog.KRef(namespace, container.Name))
}
cmd = append(cmd, container.Args...)
return cmd, nil
}
-
-type imageOptions struct {
- image string
- credentials types.DockerAuthConfig
- architecture string
- osChoice string
-}
-
-func (opts *imageOptions) getConfigFromManifest() (*v1.Image, error) {
- log.Infof("timeout: %v", config.dockerPullTimeout)
- timeout := time.Duration(config.dockerPullTimeout) * time.Second
- ctx, cancel := context.WithTimeout(context.Background(), timeout)
- defer cancel()
-
- // TODO: what about others like OCI, OpenShift and so on?
- if !strings.HasPrefix(opts.image, "docker://") {
- opts.image = "docker://" + opts.image
- }
-
- ref, err := alltransports.ParseImageName(opts.image)
- if err != nil {
- return nil, err
- }
-
- sys := &types.SystemContext{
- OCISharedBlobDirPath: "/tmp",
- DockerAuthConfig: &opts.credentials,
- }
-
- if opts.osChoice != "" {
- sys.OSChoice = opts.osChoice
- }
-
- if opts.architecture != "" {
- sys.ArchitectureChoice = opts.architecture
- }
-
- abc, err := ref.NewImage(ctx, sys)
- if err != nil {
- return nil, fmt.Errorf("error parsing image name %q: %v", opts.image, err)
- }
- config, err := abc.OCIConfig(ctx)
- if err != nil {
- return nil, fmt.Errorf("error reading OCI-formatted configuration data: %v", err)
- }
-
- return config, nil
-}
-
-func getRegistryCreds(clientset kubernetes.Clientset, podSpec *corev1.PodSpec) (map[string]types.DockerAuthConfig, error) {
- creds := make(map[string]types.DockerAuthConfig)
-
- var conf struct {
- Auths map[string]struct {
- Auth string
- }
- }
-
- var decoded []byte
- var ok bool
- if podSpec.ImagePullSecrets != nil {
- for _, secret := range podSpec.ImagePullSecrets {
- secret, err := clientset.CoreV1().Secrets(config.namespace).Get(secret.Name, metav1.GetOptions{})
- if err != nil {
- return creds, err
- }
-
- switch secret.Type {
- case corev1.SecretTypeDockerConfigJson:
- decoded, ok = secret.Data[corev1.DockerConfigJsonKey]
- default:
- return creds, fmt.Errorf("unable to load image pull secret '%s', only type '%s' is supported", secret.Name, secret.Type)
- }
-
- if !ok {
- continue
- }
-
- if err := json.Unmarshal(decoded, &conf); err != nil {
- return creds, err
- }
-
- // If it's in k8s format, it won't have the surrounding "Auth". Try that too.
- if len(conf.Auths) == 0 {
- if err := json.Unmarshal(decoded, &conf.Auths); err != nil {
- return creds, err
- }
- }
-
- for host, entry := range conf.Auths {
- decodedAuth, err := base64.StdEncoding.DecodeString(entry.Auth)
- if err != nil {
- return creds, err
- }
-
- authParts := strings.SplitN(string(decodedAuth), ":", 2)
- if len(authParts) != 2 {
- return creds, fmt.Errorf("decoded credential has wrong number of fields (expected 2, got %d)", len(authParts))
- }
-
- creds[host] = types.DockerAuthConfig{
- Username: authParts[0],
- Password: authParts[1],
- }
- }
- }
- }
- return creds, nil
-}
-
-func getAcrCredentials(host string) (types.DockerAuthConfig, bool) {
- isAcr, wildcardHost := hostIsAzureContainerRegistry(host)
-
- if !isAcr {
- return types.DockerAuthConfig{}, false
- }
-
- conf := azure.NewACRProvider(&config.cloudConfigHostPath)
- if conf.Enabled() {
- dockerConfList := conf.Provide()
- if len(dockerConfList) > 0 {
- dockerConf := dockerConfList[wildcardHost]
- return types.DockerAuthConfig{
- Username: dockerConf.Username,
- Password: dockerConf.Password,
- }, true
- }
- }
-
- return types.DockerAuthConfig{}, false
-}
-
-func hostIsAzureContainerRegistry(host string) (bool, string) {
- for _, v := range []string{".azurecr.io", ".azurecr.cn", ".azurecr.de", ".azurecr.us"} {
- if strings.HasSuffix(host, v) {
- return true, fmt.Sprintf("*%s", v)
- }
- }
- return false, ""
-}
diff --git a/cmd/azure-keyvault-secrets-webhook/registry_test.go b/cmd/azure-keyvault-secrets-webhook/registry_test.go
index 8adc2f26..94c6f0f2 100644
--- a/cmd/azure-keyvault-secrets-webhook/registry_test.go
+++ b/cmd/azure-keyvault-secrets-webhook/registry_test.go
@@ -1,39 +1,59 @@
package main
-import (
- "fmt"
- "testing"
-
- "github.com/containers/image/v5/types"
- "github.com/ghodss/yaml"
- log "github.com/sirupsen/logrus"
-)
-
-func TestDockerPull(t *testing.T) {
- config.dockerPullTimeout = 120
-
- opts := imageOptions{
- image: "openjdk:slim",
- credentials: types.DockerAuthConfig{},
- architecture: "amd64",
- osChoice: "linux",
- }
-
- manifest, err := opts.getConfigFromManifest()
-
- if err != nil {
- t.Errorf("failed somewhere in get manifest %+v", err)
- return
- }
-
- var cmd []string
- cmd = append(cmd, manifest.Config.Entrypoint...)
- cmd = append(cmd, manifest.Config.Cmd...)
-
- if len(cmd) == 0 {
- t.Errorf("no entrypoint nor cmd found there is something wrong.")
- fmt.Print(yaml.Marshal(manifest.Config))
- }
-
- log.Infof("cmd found: %v", cmd)
-}
+// func TestDockerPull(t *testing.T) {
+// config.dockerImageInspectionTimeout = 20
+
+// opts := imageOptions{
+// image: "openjdk:slim",
+// credentials: dockerTypes.AuthConfig{},
+// architecture: "amd64",
+// osChoice: "linux",
+// }
+
+// manifest, err := opts.getConfigFromManifest()
+
+// if err != nil {
+// t.Errorf("failed somewhere in get manifest %+v", err)
+// return
+// }
+
+// var cmd []string
+// cmd = append(cmd, manifest.Config.Entrypoint...)
+// cmd = append(cmd, manifest.Config.Cmd...)
+
+// if len(cmd) == 0 {
+// t.Errorf("no entrypoint nor cmd found there is something wrong.")
+// t.Log(yaml.Marshal(manifest.Config))
+// }
+
+// t.Logf("cmd found: %v", cmd)
+// }
+
+// func TestDockerPullWithShaImageNotation(t *testing.T) {
+// config.dockerImageInspectionTimeout = 20
+
+// opts := imageOptions{
+// image: "spvest/azure-keyvault-webhook@sha256:38a78fde88bd3bf023606ac3a2219b0803457734cb2e7bb80b55d36450cc71f1",
+// credentials: dockerTypes.AuthConfig{},
+// architecture: "amd64",
+// osChoice: "linux",
+// }
+
+// manifest, err := opts.getConfigFromManifest()
+
+// if err != nil {
+// t.Errorf("failed somewhere in get manifest %+v", err)
+// return
+// }
+
+// var cmd []string
+// cmd = append(cmd, manifest.Config.Entrypoint...)
+// cmd = append(cmd, manifest.Config.Cmd...)
+
+// if len(cmd) == 0 {
+// t.Errorf("no entrypoint nor cmd found there is something wrong.")
+// t.Log(yaml.Marshal(manifest.Config))
+// }
+
+// t.Logf("cmd found: %v", cmd)
+// }
diff --git a/cmd/azure-keyvault-secrets-webhook/token_test.go b/cmd/azure-keyvault-secrets-webhook/token_test.go
index 5c45fe15..bb26db8b 100644
--- a/cmd/azure-keyvault-secrets-webhook/token_test.go
+++ b/cmd/azure-keyvault-secrets-webhook/token_test.go
@@ -5,7 +5,7 @@ import (
"os"
"testing"
- vault "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azurekeyvault/client"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider"
)
func TestMarshallToken(t *testing.T) {
@@ -17,7 +17,7 @@ func TestMarshallToken(t *testing.T) {
os.Setenv("AZURE_CLIENT_SECRET", os.Getenv("AKV2K8S_CLIENT_SECRET"))
os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID"))
- creds, err := vault.NewAzureKeyVaultCredentialsFromEnvironment()
+ creds, err := credentialprovider.NewFromEnvironment()
if err != nil {
t.Error(err)
}
@@ -27,7 +27,7 @@ func TestMarshallToken(t *testing.T) {
t.Error(err)
}
- var creds2 vault.AzureKeyVaultOAuthCredentials
+ var creds2 credentialprovider.OAuthCredentials
err = json.Unmarshal(data, &creds2)
if err != nil {
t.Error(err)
diff --git a/crds/AzureKeyVaultIdentity.yaml b/crds/AzureKeyVaultIdentity.yaml
new file mode 100644
index 00000000..d880b1b5
--- /dev/null
+++ b/crds/AzureKeyVaultIdentity.yaml
@@ -0,0 +1,33 @@
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+ name: azurekeyvaultidentities.spv.no
+ labels:
+ app.kubernetes.io/name: akv2k8s
+ annotations:
+ "helm.sh/resource-policy": keep
+spec:
+ group: spv.no
+ names:
+ kind: AzureKeyVaultIdentity
+ listKind: AzureKeyVaultIdentityList
+ plural: azurekeyvaultidentities
+ singular: azurekeyvaultidentity
+ shortNames:
+ - akvi
+ categories:
+ - all
+ scope: Namespaced
+ versions:
+ - name: v1alpha1
+ served: true
+ storage: true
+ validation:
+ openAPIV3Schema:
+ properties:
+ spec:
+ required: ['identity']
+ properties:
+ name:
+ type: string
+ description: Name of the Azure Managed Identity to
diff --git a/crds/AzureKeyVaultSecret.yaml b/crds/AzureKeyVaultSecret.yaml
new file mode 100644
index 00000000..a7b9cc0b
--- /dev/null
+++ b/crds/AzureKeyVaultSecret.yaml
@@ -0,0 +1,294 @@
+apiVersion: apiextensions.k8s.io/v1
+kind: CustomResourceDefinition
+metadata:
+ name: azurekeyvaultsecrets.spv.no
+spec:
+ group: spv.no
+ names:
+ kind: AzureKeyVaultSecret
+ listKind: AzureKeyVaultSecretList
+ plural: azurekeyvaultsecrets
+ singular: azurekeyvaultsecret
+ shortNames:
+ - akvs
+ categories:
+ - all
+ scope: Namespaced
+ versions:
+ - name: v1alpha1
+ served: true
+ storage: false
+ subresources:
+ status: {}
+ schema:
+ openAPIV3Schema:
+ type: object
+ properties:
+ spec:
+ type: object
+ required: ['vault']
+ properties:
+ vault:
+ type: object
+ required: ['name', 'object']
+ properties:
+ name:
+ type: string
+ description: Name of the Azure Key Vault
+ object:
+ type: object
+ required: ['name', 'type']
+ properties:
+ name:
+ type: string
+ description: The object name in Azure Key Vault
+ type:
+ type: string
+ description: The type of object in Azure Key Vault
+ enum:
+ - secret
+ - certificate
+ - key
+ - multi-key-value-secret
+ version:
+ type: string
+ description: The object version in Azure Key Vault
+ contentType:
+ type: string
+ description: Only used when type is multi-key-value-secret.
+ enum:
+ - application/x-json
+ - application/x-yaml
+ output:
+ type: object
+ properties:
+ transform:
+ type: array
+ items:
+ type: string
+ secret:
+ type: object
+ required: ['name']
+ properties:
+ name:
+ type: string
+ description: Name for Kubernetes secret
+ type:
+ type: string
+ description: Type of Secret in Kubernetes
+ dataKey:
+ type: string
+ description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data
+ status:
+ type: object
+ x-kubernetes-preserve-unknown-fields: true
+
+ additionalPrinterColumns:
+ - name: Vault
+ type: string
+ description: Which Azure Key Vault this resource is asosiated with
+ jsonPath: .spec.vault.name
+ - name: Vault Object
+ type: string
+ description: Which Azure Key Vault object this resource is asosiated with
+ jsonPath: .spec.vault.object.name
+ - name: Output Object
+ type: string
+ description: Which Kubernetes Secret or ConfigMap this resource is synched with, if any
+ jsonPath: .status.secretName
+ - name: Synched
+ type: string
+ description: When this resource was last synched with Azure Key Vault
+ jsonPath: .status.lastAzureUpdate
+
+ - name: v1
+ served: true
+ storage: false
+ subresources:
+ status: {}
+ schema:
+ openAPIV3Schema:
+ type: object
+ properties:
+ spec:
+ type: object
+ required: ['vault']
+ properties:
+ vault:
+ type: object
+ required: ['name', 'object']
+ properties:
+ name:
+ type: string
+ description: Name of the Azure Key Vault
+ object:
+ type: object
+ required: ['name', 'type']
+ properties:
+ name:
+ type: string
+ description: The object name in Azure Key Vault
+ type:
+ type: string
+ description: The type of object in Azure Key Vault
+ enum:
+ - secret
+ - certificate
+ - key
+ - multi-key-value-secret
+ version:
+ type: string
+ description: The object version in Azure Key Vault
+ contentType:
+ type: string
+ description: Only used when type is multi-key-value-secret.
+ enum:
+ - application/x-json
+ - application/x-yaml
+ output:
+ type: object
+ properties:
+ transform:
+ type: array
+ items:
+ type: string
+ secret:
+ type: object
+ required: ['name']
+ properties:
+ name:
+ type: string
+ description: Name for Kubernetes secret
+ type:
+ type: string
+ description: Type of Secret in Kubernetes
+ dataKey:
+ type: string
+ description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data
+ status:
+ type: object
+ x-kubernetes-preserve-unknown-fields: true
+
+ additionalPrinterColumns:
+ - name: Vault
+ type: string
+ description: Which Azure Key Vault this resource is asosiated with
+ jsonPath: .spec.vault.name
+ - name: Vault Object
+ type: string
+ description: Which Azure Key Vault object this resource is asosiated with
+ jsonPath: .spec.vault.object.name
+ - name: Secret Name
+ type: string
+ description: Which Kubernetes Secret this resource is synched with, if any
+ jsonPath: .status.secretName
+ - name: Synched
+ type: string
+ description: When this resource was last synched with Azure Key Vault
+ jsonPath: .status.lastAzureUpdate
+
+ - name: v2beta1
+ served: true
+ storage: true
+ subresources:
+ status: {}
+ schema:
+ openAPIV3Schema:
+ type: object
+ properties:
+ spec:
+ type: object
+ required: ['vault']
+ properties:
+ vault:
+ type: object
+ required: ['name', 'object']
+ properties:
+ name:
+ type: string
+ description: Name of the Azure Key Vault
+ object:
+ type: object
+ required: ['name', 'type']
+ properties:
+ name:
+ type: string
+ description: The object name in Azure Key Vault
+ type:
+ type: string
+ description: The type of object in Azure Key Vault
+ enum:
+ - secret
+ - certificate
+ - key
+ - multi-key-value-secret
+ version:
+ type: string
+ description: The object version in Azure Key Vault
+ contentType:
+ type: string
+ description: Only used when type is multi-key-value-secret.
+ enum:
+ - application/x-json
+ - application/x-yaml
+ azureIdentity:
+ type: object
+ properties:
+ name:
+ type: string
+ description: Name of the azureIdentity to use for Azure Key Vault authentication
+ output:
+ type: object
+ properties:
+ transform:
+ type: array
+ items:
+ type: string
+ secret:
+ type: object
+ required: ['name']
+ properties:
+ name:
+ type: string
+ description: Name for Kubernetes secret
+ type:
+ type: string
+ description: Type of Secret in Kubernetes
+ dataKey:
+ type: string
+ description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data
+ configMap:
+ type: object
+ required: ['name', 'dataKey']
+ properties:
+ name:
+ type: string
+ description: Name for Kubernetes ConfigMap
+ dataKey:
+ type: string
+ description: The key to use in Kubernetes ConfigMap when setting the value from Azure Keyv Vault object data
+ status:
+ type: object
+ x-kubernetes-preserve-unknown-fields: true
+
+ additionalPrinterColumns:
+ - name: Vault
+ type: string
+ description: Which Azure Key Vault this resource is asosiated with
+ jsonPath: .spec.vault.name
+ - name: Vault Object
+ type: string
+ description: Which Azure Key Vault object this resource is asosiated with
+ jsonPath: .spec.vault.object.name
+ - name: Secret Name
+ type: string
+ description: Which Kubernetes Secret this resource is synched with, if any
+ jsonPath: .status.secretName
+ - name: ConfigMap Name
+ type: string
+ description: Which Kubernetes ConfigMap this resource is synched with, if any
+ jsonPath: .status.configMapName
+ - name: Last Synched
+ type: date
+ description: When this resource was last synched with Azure Key Vault
+ jsonPath: .status.lastAzureUpdate
diff --git a/crds/AzureManagedIdentity.yaml b/crds/AzureManagedIdentity.yaml
new file mode 100644
index 00000000..0e5842ef
--- /dev/null
+++ b/crds/AzureManagedIdentity.yaml
@@ -0,0 +1,33 @@
+apiVersion: apiextensions.k8s.io/v1beta1
+kind: CustomResourceDefinition
+metadata:
+ name: azuremanagedidentities.spv.no
+ labels:
+ app.kubernetes.io/name: akv2k8s
+ annotations:
+ "helm.sh/resource-policy": keep
+spec:
+ group: spv.no
+ names:
+ kind: AzureManagedIdentity
+ listKind: AzureManagedIdentityList
+ plural: azuremanagedidentities
+ singular: azuremanagedidentity
+ shortNames:
+ - ami
+ categories:
+ - all
+ scope: Namespaced
+ versions:
+ - name: v1alpha1
+ served: true
+ storage: true
+ validation:
+ openAPIV3Schema:
+ properties:
+ spec:
+ required: ['name']
+ properties:
+ name:
+ type: string
+ description: Name of the Azure Managed Identity to
diff --git a/docs/.gitignore b/docs/.gitignore
deleted file mode 100644
index de65ace5..00000000
--- a/docs/.gitignore
+++ /dev/null
@@ -1,10 +0,0 @@
-.DS_Store
-Thumbs.db
-db.json
-*.log
-node_modules/
-public/*
-.deploy*/
-docs.json
-_multiconfig.yml
-.cache
\ No newline at end of file
diff --git a/docs/.nvmrc b/docs/.nvmrc
deleted file mode 100644
index 64f5a0a6..00000000
--- a/docs/.nvmrc
+++ /dev/null
@@ -1 +0,0 @@
-node
diff --git a/docs/CNAME b/docs/CNAME
deleted file mode 100644
index 4b4bd309..00000000
--- a/docs/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-akv2k8s.io
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 51d58f41..00000000
--- a/docs/README.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# Documentation
-
-This is the documentation **source** for this repository.
-
-The **deployed** version of the documentation for this repository is available at:
-
-* https://www.apollographql.com/docs/
-
-## Documentation for the documentation
-
-This `README.md` is intentionally short since the [documentation for the documentation](https://docs-docs.netlify.com/docs/docs/) provides details for the documentation framework _itself_. Additional information should generally be added to that documentation rather than here in this `README.md`, in order to provide a centralized resource that benefits all documentation deployments.
-
-## Running locally
-
-For more information, consult the documentation for the documentation, referenced above.
-
-In general though:
-
-* `npm install` in this directory
-* `npm start` in this directory
-* Open a browser to the link provided in the console.
-
-> **Important note:** Changes to the markdown source does not result in an automatic "hot reload" in the browser; it is necessary to reload the page manually in the browser to see it re-rendered. Additionally, changes to `_config.yml` require stopping the server and restarting with `npm start` again.
-
-## Deploy previews
-
-Documentation repositories should be setup with a "deploy preview" feature which automatically provides "preview" links in the _status checks_ section of pull-requests.
-
-In the event that it's not possible to run the documentation locally, pushing changes to the branch for a pull-request can be a suitable alternative that ensures changes to the documentation are properly rendered.
-
diff --git a/docs/gatsby-config.js b/docs/gatsby-config.js
deleted file mode 100644
index eda99136..00000000
--- a/docs/gatsby-config.js
+++ /dev/null
@@ -1,127 +0,0 @@
-const themeOptions = require('gatsby-theme-apollo-docs/theme-options');
-
-module.exports = {
- pathPrefix: '/',
- plugins: [
- {
- resolve: 'gatsby-plugin-gtag',
- options: {
- // your google analytics tracking id
- trackingId: 'UA-136446489-2',
- // Puts tracking script in the head instead of the body
- head: true,
- // enable ip anonymization
- anonymize: false,
- },
- },
- {
- resolve: `gatsby-source-git`,
- options: {
- name: `default`,
- remote: `https://github.com/SparebankenVest/public-helm-charts.git`,
- // Optionally supply a branch. If none supplied, you'll get the default branch.
- // branch: `develop`,
- // Tailor which files get imported eg. import the docs folder from a codebase.
- patterns: [
- 'stable/azure-key-vault-controller/README.md',
- 'stable/azure-key-vault-env-injector/README.md',
- ]
- }
- },
- // {
- // resolve: "gatsby-source-graphql",
- // options: {
- // // Arbitrary name for the remote schema Query type
- // typeName: "GitHub",
- // // Field under which the remote schema will be accessible. You'll use this in your Gatsby query
- // fieldName: "github",
- // // Url to query from
- // url: "https://api.github.com/graphql",
- // headers: {
- // // Learn about environment variables: https://gatsby.dev/env-vars
- // Authorization: `Bearer ${process.env.GITHUB_TOKEN}`,
- // },
- // },
- // },
- {
- resolve: 'gatsby-theme-apollo-docs',
- options: {
- ...themeOptions,
- root: __dirname,
- baseUrl: 'https://akv2k8s.io',
- baseDir: 'docs',
- logoLink: 'https://akv2k8s.io/',
- contentDir: 'source/content/',
- siteName: '',
- pageTitle: 'akv2k8s docs',
- subtitle: '',
- description: 'How to get Azure Key Vault objects into Kubernetes',
- githubRepo: 'sparebankenvest/azure-key-vault-to-kubernetes',
- segmentApiKey: null,
- algoliaApiKey: '3222f31991b019f454d81f025f0f26d3',
- algoliaIndexName: 'azure-key-vault-to-kubernetes',
- spectrumPath: '',
- spectrumHandle: '',
- twitterHandle: '',
- sidebarCategories: {
- null: ['index', 'why-akv2k8s', 'quick-start', 'how-it-works'],
- 'Installation': [
- 'installation/index',
- 'installation/requirements',
- 'installation/installing-with-helm',
- 'installation/installing-without-helm',
- 'installation/updating-with-helm',
- ],
- Tutorials: [
- 'tutorials/index',
- 'tutorials/prerequisites',
- 'tutorials/sync/1-secret',
- 'tutorials/sync/2-certificate',
- 'tutorials/sync/3-signing-key',
- 'tutorials/sync/4-multi-key-value-secret',
- 'tutorials/env-injection/1-secret',
- 'tutorials/env-injection/2-certificate',
- 'tutorials/env-injection/3-signing-key',
- // 'tutorials/env-injection/4-multi-value-secret',
- 'tutorials/env-injection/5-pfx-certificate',
- ],
- Security: [
- 'security/introduction',
- 'security/authentication',
- 'security/authorization',
- 'security/enable-env-injection',
- ],
- 'Availability': [
- 'getting-started/scaling',
- ],
- Troubleshooting: [
- 'troubleshooting/controller-log',
- 'troubleshooting/env-injector-log-level',
- 'troubleshooting/known-issues',
- ],
- Reference: [
- 'reference/index',
- 'reference/azure-key-vault-secret',
- 'stable/azure-key-vault-controller/README',
- 'stable/azure-key-vault-env-injector/README',
- ],
- },
- navConfig: {},
- // navConfig: {
- // 'Controller Basics': {
- // url: 'https://www.apollographql.com/docs',
- // description: 'Learn how the Controller syncs Azure Key Vault objects to Kubernetes as native Secrets.',
- // },
- // 'Injector Basics': {
- // url: 'https://www.apollographql.com/docs/apollo-server',
- // description: 'Learn how the Injector injects Azure Key Vault objects as environment variabled directly into your application'
- // },
- // 'When to use which': {
- // url: 'https://www.apollographql.com/docs/apollo-server',
- // description: 'Learn when to use the Controller and when to use the Injector'
- // },
- // },
- },
- },
- ],
-};
diff --git a/docs/package-lock.json b/docs/package-lock.json
deleted file mode 100644
index 52b4b65b..00000000
--- a/docs/package-lock.json
+++ /dev/null
@@ -1,20438 +0,0 @@
-{
- "requires": true,
- "lockfileVersion": 1,
- "dependencies": {
- "@algolia/cache-browser-local-storage": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.0.3.tgz",
- "integrity": "sha512-iHzUP7ZP09Cd48aAu58OnERchgdho/5l12YoL70AXLeDmyu/ZTENuGHiSwM2NHFE+nM4naH0N9krxtVf3/5HSg==",
- "requires": {
- "@algolia/cache-common": "4.0.3"
- }
- },
- "@algolia/cache-common": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.0.3.tgz",
- "integrity": "sha512-5XwhDpT3bxbLc/NRJayNN7Yfj9UrqZERKjcwv2D1nl3DFa55St9czspbU9XaDns3NhyPY5XipBYJEafWa8NtVA=="
- },
- "@algolia/cache-in-memory": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.0.3.tgz",
- "integrity": "sha512-2eiyV+2oYbpErHNKzcITblVuw2K0qVyFfWxpSQVg5TUWg+PrEfvxAa3oDpcFvkvw/E4lIdvwt2AG8e5ldI11qQ==",
- "requires": {
- "@algolia/cache-common": "4.0.3"
- }
- },
- "@algolia/client-account": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.0.3.tgz",
- "integrity": "sha512-qMdMD746HjzqGUH+M5yDdinPzDwLK7HSLoyfZqCDaqZD4oxhI0pwvwyTnrSQ+LngWe9wMhu/l+uhipo0libilA==",
- "requires": {
- "@algolia/client-common": "4.0.3",
- "@algolia/client-search": "4.0.3",
- "@algolia/transporter": "4.0.3"
- }
- },
- "@algolia/client-analytics": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.0.3.tgz",
- "integrity": "sha512-y9J6iWowtvc5iKarIYi9FJC7QJJ0y06vvZI8Pa6UC99KyGEosxHiw8vVSlcWdz48nVbDpqvszD/ocpnU1eoGFQ==",
- "requires": {
- "@algolia/client-common": "4.0.3",
- "@algolia/client-search": "4.0.3",
- "@algolia/requester-common": "4.0.3",
- "@algolia/transporter": "4.0.3"
- }
- },
- "@algolia/client-common": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.0.3.tgz",
- "integrity": "sha512-pAuPT0LH/k0HB1ZfNBbfylPApruVenxn1EZWYDJcuEWkXe8yde+rTOA1355C6M2oz8khEYxKHoCckGUlz6WKSw==",
- "requires": {
- "@algolia/requester-common": "4.0.3",
- "@algolia/transporter": "4.0.3"
- }
- },
- "@algolia/client-recommendation": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/client-recommendation/-/client-recommendation-4.0.3.tgz",
- "integrity": "sha512-svki0hByAMPCEJhzU//6qCpEPt2e7HABMmWVybHX+fxElBnJrYkLu5lukRX6xZYyCtqob5EMWUIOVpFUSsfe+A==",
- "requires": {
- "@algolia/client-common": "4.0.3",
- "@algolia/requester-common": "4.0.3",
- "@algolia/transporter": "4.0.3"
- }
- },
- "@algolia/client-search": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.0.3.tgz",
- "integrity": "sha512-Q4XE9SlQuxJQfOxOZA4u1MA9H5xOu2TBjmlCBG4tOsUq79u6uK5w/qfIfzvorIg7PrItIC2eGTkykD8HmBkIEA==",
- "requires": {
- "@algolia/client-common": "4.0.3",
- "@algolia/requester-common": "4.0.3",
- "@algolia/transporter": "4.0.3"
- }
- },
- "@algolia/logger-common": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.0.3.tgz",
- "integrity": "sha512-DC7JiFc6cXQk6Ut5RS8M5ieBHtfUBBFmUXaJtloqcANNmAdFZnOcayIgRYz+fGXEkz2AzhObReN0vZ45BmiVBQ=="
- },
- "@algolia/logger-console": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.0.3.tgz",
- "integrity": "sha512-KXHXpwZ4cNsjC18GpwflBO/v9J/dW7bksnVmjaCCAdYKY2e1XnD5P8hCrYe2QIIwa6+HB9IB/5aYMtE4NNj3sg==",
- "requires": {
- "@algolia/logger-common": "4.0.3"
- }
- },
- "@algolia/requester-browser-xhr": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.0.3.tgz",
- "integrity": "sha512-cj4BBbuX7fLA5EJLkesfENY1Q9pSMpJuzvtvyy18jhPavMY2qL4Y9NFbQo03ENnmD2qnDfdIK17cJLa+QaINwg==",
- "requires": {
- "@algolia/requester-common": "4.0.3"
- }
- },
- "@algolia/requester-common": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.0.3.tgz",
- "integrity": "sha512-6zfTEW17a/S/M/rBtvMO37pHJ3eqXQorCsoCKpcJXE1gV16Yt8pB9HqylnepC+xv9bMgCn72YkfWmhrGjW/hkA=="
- },
- "@algolia/requester-node-http": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.0.3.tgz",
- "integrity": "sha512-TCddXMrfieNWDbQwxikOUZGJoYvN2MFCB+d8Yw3/RhwHasB4B5mWQ/8pvtgihlH13FILSVY1IB9ghC9SZBK6rw==",
- "requires": {
- "@algolia/requester-common": "4.0.3"
- }
- },
- "@algolia/transporter": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.0.3.tgz",
- "integrity": "sha512-ol6mXCL+DAGplpE5erN5Nrcq/aZLVxpQg6V5BK0fK0YDSiCCrucRpuwGW6SkxhlgdyGQbl/4s5hZJ+ucYpK+3w==",
- "requires": {
- "@algolia/cache-common": "4.0.3",
- "@algolia/logger-common": "4.0.3",
- "@algolia/requester-common": "4.0.3"
- }
- },
- "@apollo/space-kit": {
- "version": "2.15.0",
- "resolved": "https://registry.npmjs.org/@apollo/space-kit/-/space-kit-2.15.0.tgz",
- "integrity": "sha512-tAxOosmN8tWmObHuOyO2HI69+m63ZO5w2YQ+BoF/mNB3TmjpkJ3Yn3+r55rqfkQHQVkaTBBIXRIs1tRiGG4XTA==",
- "requires": {
- "@emotion/cache": "^10.0.15",
- "@emotion/core": "^10.0.15",
- "@types/classnames": "^2.2.9",
- "@types/tinycolor2": "^1.4.2",
- "classnames": "^2.2.6",
- "tinycolor2": "^1.4.1"
- }
- },
- "@babel/code-frame": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
- "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
- "requires": {
- "@babel/highlight": "^7.8.3"
- }
- },
- "@babel/compat-data": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.9.0.tgz",
- "integrity": "sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g==",
- "requires": {
- "browserslist": "^4.9.1",
- "invariant": "^2.2.4",
- "semver": "^5.5.0"
- },
- "dependencies": {
- "browserslist": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz",
- "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==",
- "requires": {
- "caniuse-lite": "^1.0.30001038",
- "electron-to-chromium": "^1.3.390",
- "node-releases": "^1.1.53",
- "pkg-up": "^2.0.0"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30001038",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz",
- "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ=="
- },
- "electron-to-chromium": {
- "version": "1.3.395",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz",
- "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw=="
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "node-releases": {
- "version": "1.1.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
- "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ=="
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "requires": {
- "find-up": "^2.1.0"
- }
- }
- }
- },
- "@babel/core": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz",
- "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.8.4",
- "@babel/helpers": "^7.8.4",
- "@babel/parser": "^7.8.4",
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.4",
- "@babel/types": "^7.8.3",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.1",
- "json5": "^2.1.0",
- "lodash": "^4.17.13",
- "resolve": "^1.3.2",
- "semver": "^5.4.1",
- "source-map": "^0.5.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "@babel/generator": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz",
- "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==",
- "requires": {
- "@babel/types": "^7.8.3",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helper-annotate-as-pure": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz",
- "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==",
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz",
- "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==",
- "requires": {
- "@babel/helper-explode-assignable-expression": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-builder-react-jsx": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz",
- "integrity": "sha512-JT8mfnpTkKNCboTqZsQTdGo3l3Ik3l7QIt9hh0O9DYiwVel37VoJpILKM4YFbP2euF32nkQSb+F9cUk9b7DDXQ==",
- "requires": {
- "@babel/types": "^7.8.3",
- "esutils": "^2.0.0"
- }
- },
- "@babel/helper-compilation-targets": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz",
- "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==",
- "requires": {
- "@babel/compat-data": "^7.8.6",
- "browserslist": "^4.9.1",
- "invariant": "^2.2.4",
- "levenary": "^1.1.1",
- "semver": "^5.5.0"
- },
- "dependencies": {
- "browserslist": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz",
- "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==",
- "requires": {
- "caniuse-lite": "^1.0.30001038",
- "electron-to-chromium": "^1.3.390",
- "node-releases": "^1.1.53",
- "pkg-up": "^2.0.0"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30001038",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz",
- "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ=="
- },
- "electron-to-chromium": {
- "version": "1.3.395",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz",
- "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw=="
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "node-releases": {
- "version": "1.1.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
- "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ=="
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "requires": {
- "find-up": "^2.1.0"
- }
- }
- }
- },
- "@babel/helper-create-class-features-plugin": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz",
- "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==",
- "requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3"
- }
- },
- "@babel/helper-create-regexp-features-plugin": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.3.tgz",
- "integrity": "sha512-Gcsm1OHCUr9o9TcJln57xhWHtdXbA2pgQ58S0Lxlks0WMGNXuki4+GLfX0p+L2ZkINUGZvfkz8rzoqJQSthI+Q==",
- "requires": {
- "@babel/helper-regex": "^7.8.3",
- "regexpu-core": "^4.6.0"
- }
- },
- "@babel/helper-define-map": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz",
- "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==",
- "requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/types": "^7.8.3",
- "lodash": "^4.17.13"
- }
- },
- "@babel/helper-explode-assignable-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz",
- "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==",
- "requires": {
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-function-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz",
- "integrity": "sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA==",
- "requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-get-function-arity": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
- "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-hoist-variables": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz",
- "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==",
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-member-expression-to-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
- "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-module-imports": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
- "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-module-transforms": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
- "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
- "requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.6",
- "@babel/helper-simple-access": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/template": "^7.8.6",
- "@babel/types": "^7.9.0",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "@babel/generator": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz",
- "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==",
- "requires": {
- "@babel/types": "^7.9.0",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
- "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.6",
- "@babel/types": "^7.8.6"
- }
- },
- "@babel/parser": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
- "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA=="
- },
- "@babel/template": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
- "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.6",
- "@babel/types": "^7.8.6"
- }
- },
- "@babel/traverse": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz",
- "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.0",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.9.0",
- "@babel/types": "^7.9.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- }
- },
- "@babel/types": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
- "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
- "requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "@babel/helper-optimise-call-expression": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
- "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-plugin-utils": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
- "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ=="
- },
- "@babel/helper-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
- "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
- "requires": {
- "lodash": "^4.17.13"
- }
- },
- "@babel/helper-remap-async-to-generator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
- "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-wrap-function": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz",
- "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==",
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-simple-access": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
- "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
- "requires": {
- "@babel/template": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-split-export-declaration": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
- "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
- "requires": {
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz",
- "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw=="
- },
- "@babel/helper-wrap-function": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
- "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
- "requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/helpers": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz",
- "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==",
- "requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.8.4",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/highlight": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
- "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
- "requires": {
- "chalk": "^2.0.0",
- "esutils": "^2.0.2",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz",
- "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw=="
- },
- "@babel/plugin-proposal-async-generator-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
- "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-remap-async-to-generator": "^7.8.3",
- "@babel/plugin-syntax-async-generators": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-class-properties": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz",
- "integrity": "sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-proposal-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-NyaBbyLFXFLT9FP+zk0kYlUlA8XtCUbehs67F0nnEg7KICgMc2mNkIeu9TYhKzyXMkrapZFwAhXLdnt4IYHy1w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-dynamic-import": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
- "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-json-strings": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-numeric-separator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.8.3.tgz",
- "integrity": "sha512-jWioO1s6R/R+wEHizfaScNsAx+xKgwTLNXSh7tTC4Usj3ItsPEhYkEpU4h+lpnBwq7NBVOJXfO6cRFYcX69JUQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.8.3"
- }
- },
- "@babel/plugin-proposal-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-8qvuPwU/xxUCt78HocNlv0mXXo0wdh9VT1R04WU8HGOfaOob26pF+9P5/lYjN/q7DHOX1bvX60hnhOvuQUJdbA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-optional-chaining": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz",
- "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.3.tgz",
- "integrity": "sha512-1/1/rEZv2XGweRwwSkLpY+s60za9OZ1hJs4YDqFHCw0kYWYwL5IFljVY1MYBL+weT1l9pokDO2uhSTLVxzoHkQ==",
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-jsx": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz",
- "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-numeric-separator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz",
- "integrity": "sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.0"
- }
- },
- "@babel/plugin-syntax-top-level-await": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.8.3.tgz",
- "integrity": "sha512-kwj1j9lL/6Wd0hROD3b/OZZ7MSrZLqqn9RAZ5+cYYsflQ9HZBIKCUkr3+uL1MEJ1NePiUbf98jjiMQSv0NMR9g==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-syntax-typescript": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.8.3.tgz",
- "integrity": "sha512-GO1MQ/SGGGoiEXY0e0bSpHimJvxqB7lktLLIq2pv8xG7WZ8IMEle74jIe1FhprHBWjwjZtXHkycDLZXIWM5Wfg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-arrow-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz",
- "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-async-to-generator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz",
- "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==",
- "requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-remap-async-to-generator": "^7.8.3"
- }
- },
- "@babel/plugin-transform-block-scoped-functions": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz",
- "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-block-scoping": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz",
- "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "lodash": "^4.17.13"
- }
- },
- "@babel/plugin-transform-classes": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz",
- "integrity": "sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-define-map": "^7.8.3",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.6",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "globals": "^11.1.0"
- },
- "dependencies": {
- "@babel/generator": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz",
- "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==",
- "requires": {
- "@babel/types": "^7.9.0",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helper-replace-supers": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
- "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
- "requires": {
- "@babel/helper-member-expression-to-functions": "^7.8.3",
- "@babel/helper-optimise-call-expression": "^7.8.3",
- "@babel/traverse": "^7.8.6",
- "@babel/types": "^7.8.6"
- }
- },
- "@babel/parser": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
- "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA=="
- },
- "@babel/traverse": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz",
- "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.0",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.9.0",
- "@babel/types": "^7.9.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- }
- },
- "@babel/types": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
- "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
- "requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "@babel/plugin-transform-computed-properties": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz",
- "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-destructuring": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.3.tgz",
- "integrity": "sha512-H4X646nCkiEcHZUZaRkhE2XVsoz0J/1x3VVujnn96pSoGCtKPA99ZZA+va+gK+92Zycd6OBKCD8tDb/731bhgQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-dotall-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz",
- "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==",
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-duplicate-keys": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz",
- "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-exponentiation-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz",
- "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==",
- "requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-for-of": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz",
- "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-function-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz",
- "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==",
- "requires": {
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz",
- "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-member-expression-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz",
- "integrity": "sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-modules-amd": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz",
- "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==",
- "requires": {
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helper-plugin-utils": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-commonjs": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz",
- "integrity": "sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g==",
- "requires": {
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-simple-access": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-systemjs": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz",
- "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==",
- "requires": {
- "@babel/helper-hoist-variables": "^7.8.3",
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helper-plugin-utils": "^7.8.3",
- "babel-plugin-dynamic-import-node": "^2.3.0"
- }
- },
- "@babel/plugin-transform-modules-umd": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz",
- "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==",
- "requires": {
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz",
- "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==",
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3"
- }
- },
- "@babel/plugin-transform-new-target": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz",
- "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-object-super": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz",
- "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-replace-supers": "^7.8.3"
- }
- },
- "@babel/plugin-transform-parameters": {
- "version": "7.9.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz",
- "integrity": "sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg==",
- "requires": {
- "@babel/helper-get-function-arity": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-property-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz",
- "integrity": "sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-constant-elements": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.9.0.tgz",
- "integrity": "sha512-wXMXsToAUOxJuBBEHajqKLFWcCkOSLshTI2ChCFFj1zDd7od4IOxiwLCOObNUvOpkxLpjIuaIdBMmNt6ocCPAw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-display-name": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz",
- "integrity": "sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-jsx": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.8.3.tgz",
- "integrity": "sha512-r0h+mUiyL595ikykci+fbwm9YzmuOrUBi0b+FDIKmi3fPQyFokWVEMJnRWHJPPQEjyFJyna9WZC6Viv6UHSv1g==",
- "requires": {
- "@babel/helper-builder-react-jsx": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-jsx": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-jsx-self": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.8.3.tgz",
- "integrity": "sha512-01OT7s5oa0XTLf2I8XGsL8+KqV9lx3EZV+jxn/L2LQ97CGKila2YMroTkCEIE0HV/FF7CMSRsIAybopdN9NTdg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-jsx": "^7.8.3"
- }
- },
- "@babel/plugin-transform-react-jsx-source": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.8.3.tgz",
- "integrity": "sha512-PLMgdMGuVDtRS/SzjNEQYUT8f4z1xb2BAT54vM1X5efkVuYBf5WyGUMbpmARcfq3NaglIwz08UVQK4HHHbC6ag==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-jsx": "^7.8.3"
- }
- },
- "@babel/plugin-transform-regenerator": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz",
- "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==",
- "requires": {
- "regenerator-transform": "^0.14.2"
- }
- },
- "@babel/plugin-transform-reserved-words": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.8.3.tgz",
- "integrity": "sha512-mwMxcycN3omKFDjDQUl+8zyMsBfjRFr0Zn/64I41pmjv4NJuqcYlEtezwYtw9TFd9WR1vN5kiM+O0gMZzO6L0A==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-runtime": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.9.0.tgz",
- "integrity": "sha512-pUu9VSf3kI1OqbWINQ7MaugnitRss1z533436waNXp+0N3ur3zfut37sXiQMxkuCF4VUjwZucen/quskCh7NHw==",
- "requires": {
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "resolve": "^1.8.1",
- "semver": "^5.5.1"
- }
- },
- "@babel/plugin-transform-shorthand-properties": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz",
- "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz",
- "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-sticky-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz",
- "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/helper-regex": "^7.8.3"
- }
- },
- "@babel/plugin-transform-template-literals": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz",
- "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==",
- "requires": {
- "@babel/helper-annotate-as-pure": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-typeof-symbol": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz",
- "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/plugin-transform-typescript": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz",
- "integrity": "sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w==",
- "requires": {
- "@babel/helper-create-class-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-typescript": "^7.8.3"
- }
- },
- "@babel/plugin-transform-unicode-regex": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz",
- "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==",
- "requires": {
- "@babel/helper-create-regexp-features-plugin": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3"
- }
- },
- "@babel/polyfill": {
- "version": "7.8.7",
- "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.8.7.tgz",
- "integrity": "sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w==",
- "requires": {
- "core-js": "^2.6.5",
- "regenerator-runtime": "^0.13.4"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "@babel/preset-env": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.9.0.tgz",
- "integrity": "sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ==",
- "requires": {
- "@babel/compat-data": "^7.9.0",
- "@babel/helper-compilation-targets": "^7.8.7",
- "@babel/helper-module-imports": "^7.8.3",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-proposal-async-generator-functions": "^7.8.3",
- "@babel/plugin-proposal-dynamic-import": "^7.8.3",
- "@babel/plugin-proposal-json-strings": "^7.8.3",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-proposal-numeric-separator": "^7.8.3",
- "@babel/plugin-proposal-object-rest-spread": "^7.9.0",
- "@babel/plugin-proposal-optional-catch-binding": "^7.8.3",
- "@babel/plugin-proposal-optional-chaining": "^7.9.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.8.3",
- "@babel/plugin-syntax-async-generators": "^7.8.0",
- "@babel/plugin-syntax-dynamic-import": "^7.8.0",
- "@babel/plugin-syntax-json-strings": "^7.8.0",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0",
- "@babel/plugin-syntax-numeric-separator": "^7.8.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
- "@babel/plugin-syntax-optional-chaining": "^7.8.0",
- "@babel/plugin-syntax-top-level-await": "^7.8.3",
- "@babel/plugin-transform-arrow-functions": "^7.8.3",
- "@babel/plugin-transform-async-to-generator": "^7.8.3",
- "@babel/plugin-transform-block-scoped-functions": "^7.8.3",
- "@babel/plugin-transform-block-scoping": "^7.8.3",
- "@babel/plugin-transform-classes": "^7.9.0",
- "@babel/plugin-transform-computed-properties": "^7.8.3",
- "@babel/plugin-transform-destructuring": "^7.8.3",
- "@babel/plugin-transform-dotall-regex": "^7.8.3",
- "@babel/plugin-transform-duplicate-keys": "^7.8.3",
- "@babel/plugin-transform-exponentiation-operator": "^7.8.3",
- "@babel/plugin-transform-for-of": "^7.9.0",
- "@babel/plugin-transform-function-name": "^7.8.3",
- "@babel/plugin-transform-literals": "^7.8.3",
- "@babel/plugin-transform-member-expression-literals": "^7.8.3",
- "@babel/plugin-transform-modules-amd": "^7.9.0",
- "@babel/plugin-transform-modules-commonjs": "^7.9.0",
- "@babel/plugin-transform-modules-systemjs": "^7.9.0",
- "@babel/plugin-transform-modules-umd": "^7.9.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3",
- "@babel/plugin-transform-new-target": "^7.8.3",
- "@babel/plugin-transform-object-super": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.8.7",
- "@babel/plugin-transform-property-literals": "^7.8.3",
- "@babel/plugin-transform-regenerator": "^7.8.7",
- "@babel/plugin-transform-reserved-words": "^7.8.3",
- "@babel/plugin-transform-shorthand-properties": "^7.8.3",
- "@babel/plugin-transform-spread": "^7.8.3",
- "@babel/plugin-transform-sticky-regex": "^7.8.3",
- "@babel/plugin-transform-template-literals": "^7.8.3",
- "@babel/plugin-transform-typeof-symbol": "^7.8.4",
- "@babel/plugin-transform-unicode-regex": "^7.8.3",
- "@babel/preset-modules": "^0.1.3",
- "@babel/types": "^7.9.0",
- "browserslist": "^4.9.1",
- "core-js-compat": "^3.6.2",
- "invariant": "^2.2.2",
- "levenary": "^1.1.1",
- "semver": "^5.5.0"
- },
- "dependencies": {
- "@babel/plugin-proposal-object-rest-spread": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz",
- "integrity": "sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.0"
- }
- },
- "@babel/plugin-proposal-optional-chaining": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz",
- "integrity": "sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.0"
- }
- },
- "@babel/types": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
- "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
- "requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "browserslist": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz",
- "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==",
- "requires": {
- "caniuse-lite": "^1.0.30001038",
- "electron-to-chromium": "^1.3.390",
- "node-releases": "^1.1.53",
- "pkg-up": "^2.0.0"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30001038",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz",
- "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ=="
- },
- "electron-to-chromium": {
- "version": "1.3.395",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz",
- "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw=="
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "node-releases": {
- "version": "1.1.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
- "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ=="
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "requires": {
- "find-up": "^2.1.0"
- }
- }
- }
- },
- "@babel/preset-modules": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz",
- "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
- "@babel/plugin-transform-dotall-regex": "^7.4.4",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- }
- },
- "@babel/preset-react": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.8.3.tgz",
- "integrity": "sha512-9hx0CwZg92jGb7iHYQVgi0tOEHP/kM60CtWJQnmbATSPIQQ2xYzfoCI3EdqAhFBeeJwYMdWQuDUHMsuDbH9hyQ==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-transform-react-display-name": "^7.8.3",
- "@babel/plugin-transform-react-jsx": "^7.8.3",
- "@babel/plugin-transform-react-jsx-self": "^7.8.3",
- "@babel/plugin-transform-react-jsx-source": "^7.8.3"
- }
- },
- "@babel/preset-typescript": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.9.0.tgz",
- "integrity": "sha512-S4cueFnGrIbvYJgwsVFKdvOmpiL0XGw9MFW9D0vgRys5g36PBhZRL8NX8Gr2akz8XRtzq6HuDXPD/1nniagNUg==",
- "requires": {
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-transform-typescript": "^7.9.0"
- }
- },
- "@babel/runtime": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz",
- "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==",
- "requires": {
- "regenerator-runtime": "^0.13.2"
- }
- },
- "@babel/runtime-corejs3": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz",
- "integrity": "sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA==",
- "requires": {
- "core-js-pure": "^3.0.0",
- "regenerator-runtime": "^0.13.4"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "@babel/template": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz",
- "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.3",
- "@babel/types": "^7.8.3"
- }
- },
- "@babel/traverse": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz",
- "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.8.4",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.8.4",
- "@babel/types": "^7.8.3",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "@babel/types": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz",
- "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==",
- "requires": {
- "esutils": "^2.0.2",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "@braintree/sanitize-url": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-3.1.0.tgz",
- "integrity": "sha512-GcIY79elgB+azP74j8vqkiXz8xLFfIzbQJdlwOPisgbKT00tviJQuEghOXSMVxJ00HoYJbGswr4kcllUc4xCcg=="
- },
- "@emotion/babel-plugin-jsx-pragmatic": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/@emotion/babel-plugin-jsx-pragmatic/-/babel-plugin-jsx-pragmatic-0.1.5.tgz",
- "integrity": "sha512-y+3AJ0SItMDaAgGPVkQBC/S/BaqaPACkQ6MyCI2CUlrjTxKttTVfD3TMtcs7vLEcLxqzZ1xiG0vzwCXjhopawQ==",
- "requires": {
- "@babel/plugin-syntax-jsx": "^7.2.0"
- }
- },
- "@emotion/babel-preset-css-prop": {
- "version": "10.0.27",
- "resolved": "https://registry.npmjs.org/@emotion/babel-preset-css-prop/-/babel-preset-css-prop-10.0.27.tgz",
- "integrity": "sha512-rducrjTpLGDholp0l2l4pXqpzAqYYGMg/x4IteO0db2smf6zegn6RRZdDnbaoMSs63tfPWgo2WukT1/F1gX/AA==",
- "requires": {
- "@babel/plugin-transform-react-jsx": "^7.3.0",
- "@babel/runtime": "^7.5.5",
- "@emotion/babel-plugin-jsx-pragmatic": "^0.1.5",
- "babel-plugin-emotion": "^10.0.27"
- }
- },
- "@emotion/cache": {
- "version": "10.0.29",
- "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz",
- "integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==",
- "requires": {
- "@emotion/sheet": "0.9.4",
- "@emotion/stylis": "0.8.5",
- "@emotion/utils": "0.11.3",
- "@emotion/weak-memoize": "0.2.5"
- }
- },
- "@emotion/core": {
- "version": "10.0.28",
- "resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.0.28.tgz",
- "integrity": "sha512-pH8UueKYO5jgg0Iq+AmCLxBsvuGtvlmiDCOuv8fGNYn3cowFpLN98L8zO56U0H1PjDIyAlXymgL3Wu7u7v6hbA==",
- "requires": {
- "@babel/runtime": "^7.5.5",
- "@emotion/cache": "^10.0.27",
- "@emotion/css": "^10.0.27",
- "@emotion/serialize": "^0.11.15",
- "@emotion/sheet": "0.9.4",
- "@emotion/utils": "0.11.3"
- }
- },
- "@emotion/css": {
- "version": "10.0.27",
- "resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz",
- "integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==",
- "requires": {
- "@emotion/serialize": "^0.11.15",
- "@emotion/utils": "0.11.3",
- "babel-plugin-emotion": "^10.0.27"
- }
- },
- "@emotion/hash": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
- "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
- },
- "@emotion/is-prop-valid": {
- "version": "0.8.8",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
- "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
- "requires": {
- "@emotion/memoize": "0.7.4"
- }
- },
- "@emotion/memoize": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
- "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
- },
- "@emotion/serialize": {
- "version": "0.11.16",
- "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz",
- "integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==",
- "requires": {
- "@emotion/hash": "0.8.0",
- "@emotion/memoize": "0.7.4",
- "@emotion/unitless": "0.7.5",
- "@emotion/utils": "0.11.3",
- "csstype": "^2.5.7"
- }
- },
- "@emotion/sheet": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz",
- "integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA=="
- },
- "@emotion/styled": {
- "version": "10.0.27",
- "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz",
- "integrity": "sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==",
- "requires": {
- "@emotion/styled-base": "^10.0.27",
- "babel-plugin-emotion": "^10.0.27"
- }
- },
- "@emotion/styled-base": {
- "version": "10.0.31",
- "resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz",
- "integrity": "sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==",
- "requires": {
- "@babel/runtime": "^7.5.5",
- "@emotion/is-prop-valid": "0.8.8",
- "@emotion/serialize": "^0.11.15",
- "@emotion/utils": "0.11.3"
- }
- },
- "@emotion/stylis": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
- "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
- },
- "@emotion/unitless": {
- "version": "0.7.5",
- "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
- "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
- },
- "@emotion/utils": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz",
- "integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw=="
- },
- "@emotion/weak-memoize": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz",
- "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
- },
- "@hapi/address": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
- "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ=="
- },
- "@hapi/bourne": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
- "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA=="
- },
- "@hapi/hoek": {
- "version": "8.5.1",
- "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
- "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow=="
- },
- "@hapi/joi": {
- "version": "15.1.1",
- "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
- "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
- "requires": {
- "@hapi/address": "2.x.x",
- "@hapi/bourne": "1.x.x",
- "@hapi/hoek": "8.x.x",
- "@hapi/topo": "3.x.x"
- }
- },
- "@hapi/topo": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
- "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
- "requires": {
- "@hapi/hoek": "^8.3.0"
- }
- },
- "@mapbox/hast-util-table-cell-style": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/@mapbox/hast-util-table-cell-style/-/hast-util-table-cell-style-0.1.3.tgz",
- "integrity": "sha512-QsEsh5YaDvHoMQ2YHdvZy2iDnU3GgKVBTcHf6cILyoWDZtPSdlG444pL/ioPYO/GpXSfODBb9sefEetfC4v9oA==",
- "requires": {
- "unist-util-visit": "^1.3.0"
- },
- "dependencies": {
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "@mdx-js/mdx": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.5.8.tgz",
- "integrity": "sha512-OzanPTN0p9GZOEVeEuEa8QsjxxGyfFOOnI/+V1oC1su9UIN4KUg1k4n/hWTZC+VZhdW1Lfj6+Ho8nIs6L+pbDA==",
- "requires": {
- "@babel/core": "7.8.4",
- "@babel/plugin-syntax-jsx": "7.8.3",
- "@babel/plugin-syntax-object-rest-spread": "7.8.3",
- "@mdx-js/util": "^1.5.8",
- "babel-plugin-apply-mdx-type-prop": "^1.5.8",
- "babel-plugin-extract-import-names": "^1.5.8",
- "camelcase-css": "2.0.1",
- "detab": "2.0.3",
- "hast-util-raw": "5.0.2",
- "lodash.uniq": "4.5.0",
- "mdast-util-to-hast": "7.0.0",
- "remark-mdx": "^1.5.8",
- "remark-parse": "7.0.2",
- "remark-squeeze-paragraphs": "3.0.4",
- "style-to-object": "0.3.0",
- "unified": "8.4.2",
- "unist-builder": "2.0.3",
- "unist-util-visit": "2.0.2"
- }
- },
- "@mdx-js/react": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.5.8.tgz",
- "integrity": "sha512-L3rehITVxqDHOPJFGBSHKt3Mv/p3MENYlGIwLNYU89/iVqTLMD/vz8hL9RQtKqRoMbKuWpzzLlKIObqJzthNYg=="
- },
- "@mdx-js/util": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.5.8.tgz",
- "integrity": "sha512-a7Gjjw8bfBSertA/pTWBA/9WKEhgaSxvQE2NTSUzaknrzGFOhs4alZSHh3RHmSFdSWv5pUuzAgsWseMLhWEVkQ=="
- },
- "@mikaelkristiansson/domready": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/@mikaelkristiansson/domready/-/domready-1.0.10.tgz",
- "integrity": "sha512-6cDuZeKSCSJ1KvfEQ25Y8OXUjqDJZ+HgUs6dhASWbAX8fxVraTfPsSeRe2bN+4QJDsgUaXaMWBYfRomCr04GGg=="
- },
- "@mrmlnc/readdir-enhanced": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
- "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
- "requires": {
- "call-me-maybe": "^1.0.1",
- "glob-to-regexp": "^0.3.0"
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
- "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
- "requires": {
- "@nodelib/fs.stat": "2.0.3",
- "run-parallel": "^1.1.9"
- },
- "dependencies": {
- "@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
- }
- }
- },
- "@nodelib/fs.stat": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
- "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
- },
- "@nodelib/fs.walk": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
- "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
- "requires": {
- "@nodelib/fs.scandir": "2.1.3",
- "fastq": "^1.6.0"
- }
- },
- "@pieh/friendly-errors-webpack-plugin": {
- "version": "1.7.0-chalk-2",
- "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz",
- "integrity": "sha512-65+vYGuDkHBCWWjqzzR/Ck318+d6yTI00EqII9qe3aPD1J3Olhvw0X38uM5moQb1PK/ksDXwSoPGt/5QhCiotw==",
- "requires": {
- "chalk": "^2.4.2",
- "error-stack-parser": "^2.0.0",
- "string-width": "^2.0.0",
- "strip-ansi": "^3"
- }
- },
- "@pmmmwh/react-refresh-webpack-plugin": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.2.0.tgz",
- "integrity": "sha512-rjdNzcWroULJeD/Y0+eETy9LhM7c5tbPF+wqT5G680rwDkh3iothIPEqGAuEE2WJlXEaAq293aO6ySzsIU518Q==",
- "requires": {
- "ansi-html": "^0.0.7",
- "error-stack-parser": "^2.0.4",
- "html-entities": "^1.2.1",
- "lodash.debounce": "^4.0.8",
- "react-dev-utils": "^9.1.0"
- },
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.5.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
- "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
- "requires": {
- "@babel/highlight": "^7.0.0"
- }
- },
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "browserslist": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.7.0.tgz",
- "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==",
- "requires": {
- "caniuse-lite": "^1.0.30000989",
- "electron-to-chromium": "^1.3.247",
- "node-releases": "^1.1.29"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "detect-port-alt": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
- "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
- "requires": {
- "address": "^1.0.1",
- "debug": "^2.6.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "requires": {
- "find-up": "^2.1.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- }
- }
- },
- "react-dev-utils": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-9.1.0.tgz",
- "integrity": "sha512-X2KYF/lIGyGwP/F/oXgGDF24nxDA2KC4b7AFto+eqzc/t838gpSGiaU8trTqHXOohuLxxc5qi1eDzsl9ucPDpg==",
- "requires": {
- "@babel/code-frame": "7.5.5",
- "address": "1.1.2",
- "browserslist": "4.7.0",
- "chalk": "2.4.2",
- "cross-spawn": "6.0.5",
- "detect-port-alt": "1.1.6",
- "escape-string-regexp": "1.0.5",
- "filesize": "3.6.1",
- "find-up": "3.0.0",
- "fork-ts-checker-webpack-plugin": "1.5.0",
- "global-modules": "2.0.0",
- "globby": "8.0.2",
- "gzip-size": "5.1.1",
- "immer": "1.10.0",
- "inquirer": "6.5.0",
- "is-root": "2.1.0",
- "loader-utils": "1.2.3",
- "open": "^6.3.0",
- "pkg-up": "2.0.0",
- "react-error-overlay": "^6.0.3",
- "recursive-readdir": "2.2.2",
- "shell-quote": "1.7.2",
- "sockjs-client": "1.4.0",
- "strip-ansi": "5.2.0",
- "text-table": "0.2.0"
- }
- },
- "react-error-overlay": {
- "version": "6.0.7",
- "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.7.tgz",
- "integrity": "sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA=="
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "@reach/router": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@reach/router/-/router-1.3.3.tgz",
- "integrity": "sha512-gOIAiFhWdiVGSVjukKeNKkCRBLmnORoTPyBihI/jLunICPgxdP30DroAvPQuf1eVfQbfGJQDJkwhJXsNPMnVWw==",
- "requires": {
- "create-react-context": "0.3.0",
- "invariant": "^2.2.3",
- "prop-types": "^15.6.1",
- "react-lifecycles-compat": "^3.0.4"
- }
- },
- "@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
- },
- "@sindresorhus/slugify": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-0.9.1.tgz",
- "integrity": "sha512-b6heYM9dzZD13t2GOiEQTDE0qX+I1GyOotMwKh9VQqzuNiVdPVT8dM43fe9HNb/3ul+Qwd5oKSEDrDIfhq3bnQ==",
- "requires": {
- "escape-string-regexp": "^1.0.5",
- "lodash.deburr": "^4.1.0"
- }
- },
- "@svgr/babel-plugin-add-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-j7KnilGyZzYr/jhcrSYS3FGWMZVaqyCG0vzMCwzvei0coIkczuYMcniK07nI0aHJINciujjH11T72ICW5eL5Ig=="
- },
- "@svgr/babel-plugin-remove-jsx-attribute": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-4.2.0.tgz",
- "integrity": "sha512-3XHLtJ+HbRCH4n28S7y/yZoEQnRpl0tvTZQsHqvaeNXPra+6vE5tbRliH3ox1yZYPCxrlqaJT/Mg+75GpDKlvQ=="
- },
- "@svgr/babel-plugin-remove-jsx-empty-expression": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-4.2.0.tgz",
- "integrity": "sha512-yTr2iLdf6oEuUE9MsRdvt0NmdpMBAkgK8Bjhl6epb+eQWk6abBaX3d65UZ3E3FWaOwePyUgNyNCMVG61gGCQ7w=="
- },
- "@svgr/babel-plugin-replace-jsx-attribute-value": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-4.2.0.tgz",
- "integrity": "sha512-U9m870Kqm0ko8beHawRXLGLvSi/ZMrl89gJ5BNcT452fAjtF2p4uRzXkdzvGJJJYBgx7BmqlDjBN/eCp5AAX2w=="
- },
- "@svgr/babel-plugin-svg-dynamic-title": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-4.3.3.tgz",
- "integrity": "sha512-w3Be6xUNdwgParsvxkkeZb545VhXEwjGMwExMVBIdPQJeyMQHqm9Msnb2a1teHBqUYL66qtwfhNkbj1iarCG7w=="
- },
- "@svgr/babel-plugin-svg-em-dimensions": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-4.2.0.tgz",
- "integrity": "sha512-C0Uy+BHolCHGOZ8Dnr1zXy/KgpBOkEUYY9kI/HseHVPeMbluaX3CijJr7D4C5uR8zrc1T64nnq/k63ydQuGt4w=="
- },
- "@svgr/babel-plugin-transform-react-native-svg": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-4.2.0.tgz",
- "integrity": "sha512-7YvynOpZDpCOUoIVlaaOUU87J4Z6RdD6spYN4eUb5tfPoKGSF9OG2NuhgYnq4jSkAxcpMaXWPf1cePkzmqTPNw=="
- },
- "@svgr/babel-plugin-transform-svg-component": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-4.2.0.tgz",
- "integrity": "sha512-hYfYuZhQPCBVotABsXKSCfel2slf/yvJY8heTVX1PCTaq/IgASq1IyxPPKJ0chWREEKewIU/JMSsIGBtK1KKxw=="
- },
- "@svgr/babel-preset": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-4.3.3.tgz",
- "integrity": "sha512-6PG80tdz4eAlYUN3g5GZiUjg2FMcp+Wn6rtnz5WJG9ITGEF1pmFdzq02597Hn0OmnQuCVaBYQE1OVFAnwOl+0A==",
- "requires": {
- "@svgr/babel-plugin-add-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-attribute": "^4.2.0",
- "@svgr/babel-plugin-remove-jsx-empty-expression": "^4.2.0",
- "@svgr/babel-plugin-replace-jsx-attribute-value": "^4.2.0",
- "@svgr/babel-plugin-svg-dynamic-title": "^4.3.3",
- "@svgr/babel-plugin-svg-em-dimensions": "^4.2.0",
- "@svgr/babel-plugin-transform-react-native-svg": "^4.2.0",
- "@svgr/babel-plugin-transform-svg-component": "^4.2.0"
- }
- },
- "@svgr/core": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/core/-/core-4.3.3.tgz",
- "integrity": "sha512-qNuGF1QON1626UCaZamWt5yedpgOytvLj5BQZe2j1k1B8DUG4OyugZyfEwBeXozCUwhLEpsrgPrE+eCu4fY17w==",
- "requires": {
- "@svgr/plugin-jsx": "^4.3.3",
- "camelcase": "^5.3.1",
- "cosmiconfig": "^5.2.1"
- },
- "dependencies": {
- "cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- }
- },
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
- }
- }
- },
- "@svgr/hast-util-to-babel-ast": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-4.3.2.tgz",
- "integrity": "sha512-JioXclZGhFIDL3ddn4Kiq8qEqYM2PyDKV0aYno8+IXTLuYt6TOgHUbUAAFvqtb0Xn37NwP0BTHglejFoYr8RZg==",
- "requires": {
- "@babel/types": "^7.4.4"
- }
- },
- "@svgr/plugin-jsx": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-4.3.3.tgz",
- "integrity": "sha512-cLOCSpNWQnDB1/v+SUENHH7a0XY09bfuMKdq9+gYvtuwzC2rU4I0wKGFEp1i24holdQdwodCtDQdFtJiTCWc+w==",
- "requires": {
- "@babel/core": "^7.4.5",
- "@svgr/babel-preset": "^4.3.3",
- "@svgr/hast-util-to-babel-ast": "^4.3.2",
- "svg-parser": "^2.0.0"
- }
- },
- "@svgr/plugin-svgo": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-4.3.1.tgz",
- "integrity": "sha512-PrMtEDUWjX3Ea65JsVCwTIXuSqa3CG9px+DluF1/eo9mlDrgrtFE7NE/DjdhjJgSM9wenlVBzkzneSIUgfUI/w==",
- "requires": {
- "cosmiconfig": "^5.2.1",
- "merge-deep": "^3.0.2",
- "svgo": "^1.2.2"
- },
- "dependencies": {
- "cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- }
- },
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
- }
- }
- },
- "@svgr/webpack": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-4.3.3.tgz",
- "integrity": "sha512-bjnWolZ6KVsHhgyCoYRFmbd26p8XVbulCzSG53BDQqAr+JOAderYK7CuYrB3bDjHJuF6LJ7Wrr42+goLRV9qIg==",
- "requires": {
- "@babel/core": "^7.4.5",
- "@babel/plugin-transform-react-constant-elements": "^7.0.0",
- "@babel/preset-env": "^7.4.5",
- "@babel/preset-react": "^7.0.0",
- "@svgr/core": "^4.3.3",
- "@svgr/plugin-jsx": "^4.3.3",
- "@svgr/plugin-svgo": "^4.3.1",
- "loader-utils": "^1.2.3"
- }
- },
- "@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
- "requires": {
- "defer-to-connect": "^1.0.1"
- }
- },
- "@types/classnames": {
- "version": "2.2.10",
- "resolved": "https://registry.npmjs.org/@types/classnames/-/classnames-2.2.10.tgz",
- "integrity": "sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ=="
- },
- "@types/color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ=="
- },
- "@types/configstore": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@types/configstore/-/configstore-2.1.1.tgz",
- "integrity": "sha1-zR6FU2M60xhcPy8jns/10mQ+krY="
- },
- "@types/debug": {
- "version": "0.0.30",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz",
- "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ=="
- },
- "@types/eslint-visitor-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
- "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag=="
- },
- "@types/estree": {
- "version": "0.0.44",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.44.tgz",
- "integrity": "sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g=="
- },
- "@types/events": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g=="
- },
- "@types/get-port": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/@types/get-port/-/get-port-3.2.0.tgz",
- "integrity": "sha512-TiNg8R1kjDde5Pub9F9vCwZA/BNW9HeXP5b9j7Qucqncy/McfPZ6xze/EyBdXS5FhMIGN6Fx3vg75l5KHy3V1Q=="
- },
- "@types/glob": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
- "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
- "requires": {
- "@types/events": "*",
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "@types/history": {
- "version": "4.7.5",
- "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.5.tgz",
- "integrity": "sha512-wLD/Aq2VggCJXSjxEwrMafIP51Z+13H78nXIX0ABEuIGhmB5sNGbR113MOKo+yfw+RDo1ZU3DM6yfnnRF/+ouw=="
- },
- "@types/json-schema": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz",
- "integrity": "sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA=="
- },
- "@types/lodash": {
- "version": "4.14.149",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.149.tgz",
- "integrity": "sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ=="
- },
- "@types/mdast": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
- "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
- "requires": {
- "@types/unist": "*"
- }
- },
- "@types/minimatch": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
- "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
- },
- "@types/mkdirp": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz",
- "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/node": {
- "version": "13.7.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz",
- "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ=="
- },
- "@types/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
- },
- "@types/prop-types": {
- "version": "15.7.3",
- "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz",
- "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
- },
- "@types/q": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
- "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw=="
- },
- "@types/reach__router": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@types/reach__router/-/reach__router-1.3.3.tgz",
- "integrity": "sha512-HTHMGJLdH3czgPP1nHF82y+TYLV1KSh1qYeezqHNDNuESBy55ij1LCn8jDYFeKCuAxm0gd9J25zyYy7mhOcgOw==",
- "requires": {
- "@types/history": "*",
- "@types/react": "*"
- }
- },
- "@types/react": {
- "version": "16.9.32",
- "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.32.tgz",
- "integrity": "sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ==",
- "requires": {
- "@types/prop-types": "*",
- "csstype": "^2.2.0"
- }
- },
- "@types/resolve": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz",
- "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==",
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/rimraf": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.4.tgz",
- "integrity": "sha512-8gBudvllD2A/c0CcEX/BivIDorHFt5UI5m46TsNj8DjWCCTTZT74kEe4g+QsY7P/B9WdO98d82zZgXO/RQzu2Q==",
- "requires": {
- "@types/glob": "*",
- "@types/node": "*"
- }
- },
- "@types/tinycolor2": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.2.tgz",
- "integrity": "sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw=="
- },
- "@types/tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha1-EHPEvIJHVK49EM+riKsCN7qWTk0="
- },
- "@types/unist": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz",
- "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ=="
- },
- "@types/vfile": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz",
- "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==",
- "requires": {
- "@types/node": "*",
- "@types/unist": "*",
- "@types/vfile-message": "*"
- }
- },
- "@types/vfile-message": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz",
- "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==",
- "requires": {
- "vfile-message": "*"
- }
- },
- "@types/yoga-layout": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.1.tgz",
- "integrity": "sha512-OpfgQXWLZn5Dl7mOd8dBNcV8NywXbYYoHjUpa64vJ/RQABaxMzJ5bVicKLGIvIiMnQPtPgKNgXb5jkv9fkOQtw==",
- "optional": true
- },
- "@typescript-eslint/eslint-plugin": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz",
- "integrity": "sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw==",
- "requires": {
- "@typescript-eslint/experimental-utils": "2.26.0",
- "functional-red-black-tree": "^1.0.1",
- "regexpp": "^3.0.0",
- "tsutils": "^3.17.1"
- }
- },
- "@typescript-eslint/experimental-utils": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz",
- "integrity": "sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ==",
- "requires": {
- "@types/json-schema": "^7.0.3",
- "@typescript-eslint/typescript-estree": "2.26.0",
- "eslint-scope": "^5.0.0",
- "eslint-utils": "^2.0.0"
- }
- },
- "@typescript-eslint/parser": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.26.0.tgz",
- "integrity": "sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ==",
- "requires": {
- "@types/eslint-visitor-keys": "^1.0.0",
- "@typescript-eslint/experimental-utils": "2.26.0",
- "@typescript-eslint/typescript-estree": "2.26.0",
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "@typescript-eslint/typescript-estree": {
- "version": "2.26.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz",
- "integrity": "sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg==",
- "requires": {
- "debug": "^4.1.1",
- "eslint-visitor-keys": "^1.1.0",
- "glob": "^7.1.6",
- "is-glob": "^4.0.1",
- "lodash": "^4.17.15",
- "semver": "^6.3.0",
- "tsutils": "^3.17.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "@webassemblyjs/ast": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz",
- "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==",
- "requires": {
- "@webassemblyjs/helper-module-context": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/wast-parser": "1.8.5"
- }
- },
- "@webassemblyjs/floating-point-hex-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz",
- "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ=="
- },
- "@webassemblyjs/helper-api-error": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz",
- "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA=="
- },
- "@webassemblyjs/helper-buffer": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz",
- "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q=="
- },
- "@webassemblyjs/helper-code-frame": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz",
- "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==",
- "requires": {
- "@webassemblyjs/wast-printer": "1.8.5"
- }
- },
- "@webassemblyjs/helper-fsm": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz",
- "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow=="
- },
- "@webassemblyjs/helper-module-context": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz",
- "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "mamacro": "^0.0.3"
- }
- },
- "@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz",
- "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ=="
- },
- "@webassemblyjs/helper-wasm-section": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz",
- "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5"
- }
- },
- "@webassemblyjs/ieee754": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz",
- "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==",
- "requires": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "@webassemblyjs/leb128": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz",
- "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==",
- "requires": {
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/utf8": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz",
- "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw=="
- },
- "@webassemblyjs/wasm-edit": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz",
- "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/helper-wasm-section": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5",
- "@webassemblyjs/wasm-opt": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5",
- "@webassemblyjs/wast-printer": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-gen": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz",
- "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/ieee754": "1.8.5",
- "@webassemblyjs/leb128": "1.8.5",
- "@webassemblyjs/utf8": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-opt": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz",
- "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-buffer": "1.8.5",
- "@webassemblyjs/wasm-gen": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5"
- }
- },
- "@webassemblyjs/wasm-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz",
- "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-api-error": "1.8.5",
- "@webassemblyjs/helper-wasm-bytecode": "1.8.5",
- "@webassemblyjs/ieee754": "1.8.5",
- "@webassemblyjs/leb128": "1.8.5",
- "@webassemblyjs/utf8": "1.8.5"
- }
- },
- "@webassemblyjs/wast-parser": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz",
- "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/floating-point-hex-parser": "1.8.5",
- "@webassemblyjs/helper-api-error": "1.8.5",
- "@webassemblyjs/helper-code-frame": "1.8.5",
- "@webassemblyjs/helper-fsm": "1.8.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "@webassemblyjs/wast-printer": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz",
- "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/wast-parser": "1.8.5",
- "@xtuc/long": "4.2.2"
- }
- },
- "@wry/equality": {
- "version": "0.1.9",
- "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.9.tgz",
- "integrity": "sha512-mB6ceGjpMGz1ZTza8HYnrPGos2mC6So4NhS1PtZ8s4Qt0K7fBiIGhpSxUbQmhwcSWE3no+bYxmI2OL6KuXYmoQ==",
- "requires": {
- "tslib": "^1.9.3"
- }
- },
- "@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
- },
- "@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
- },
- "abstract-leveldown": {
- "version": "0.12.4",
- "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz",
- "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=",
- "requires": {
- "xtend": "~3.0.0"
- },
- "dependencies": {
- "xtend": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz",
- "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo="
- }
- }
- },
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "acorn": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
- "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg=="
- },
- "acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ=="
- },
- "address": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
- "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA=="
- },
- "after": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
- "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8="
- },
- "agent-base": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
- "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
- "requires": {
- "es6-promisify": "^5.0.0"
- },
- "dependencies": {
- "es6-promisify": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
- "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
- "requires": {
- "es6-promise": "^4.0.3"
- }
- }
- }
- },
- "aggregate-error": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz",
- "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==",
- "requires": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- }
- },
- "ajv": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz",
- "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ajv-errors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
- "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="
- },
- "ajv-keywords": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz",
- "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ=="
- },
- "algoliasearch": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.0.3.tgz",
- "integrity": "sha512-/4aFAPDoFGEDsx3c0ggKfRC1FeEdtM1HyWMwVe/wkHf/GH6CF67NFNIaBgkqt4i/SYAs92WL8B2Y8cDEMQGfGg==",
- "requires": {
- "@algolia/cache-browser-local-storage": "4.0.3",
- "@algolia/cache-common": "4.0.3",
- "@algolia/cache-in-memory": "4.0.3",
- "@algolia/client-account": "4.0.3",
- "@algolia/client-analytics": "4.0.3",
- "@algolia/client-common": "4.0.3",
- "@algolia/client-recommendation": "4.0.3",
- "@algolia/client-search": "4.0.3",
- "@algolia/logger-common": "4.0.3",
- "@algolia/logger-console": "4.0.3",
- "@algolia/requester-browser-xhr": "4.0.3",
- "@algolia/requester-common": "4.0.3",
- "@algolia/requester-node-http": "4.0.3",
- "@algolia/transporter": "4.0.3"
- }
- },
- "algoliasearch-helper": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.1.1.tgz",
- "integrity": "sha512-Jkqlp8jezQRixf7sbQ2zFXHpdaT41g9sHBqT6pztv5nfDmg94K+pwesAy6UbxRY78IL54LIaV1FLttMtT+IzzA==",
- "requires": {
- "events": "^1.1.1"
- },
- "dependencies": {
- "events": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
- "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
- }
- }
- },
- "alphanum-sort": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
- "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
- },
- "ansi-align": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
- "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
- "requires": {
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "ansi-colors": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz",
- "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA=="
- },
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ=="
- },
- "ansi-html": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
- "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
- },
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8="
- },
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
- "requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- }
- },
- "apollo-link": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.13.tgz",
- "integrity": "sha512-+iBMcYeevMm1JpYgwDEIDt/y0BB7VWyvlm/7x+TIPNLHCTCMgcEgDuW5kH86iQZWo0I7mNwQiTOz+/3ShPFmBw==",
- "requires": {
- "apollo-utilities": "^1.3.0",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.9.3",
- "zen-observable-ts": "^0.8.20"
- }
- },
- "apollo-link-http": {
- "version": "1.5.16",
- "resolved": "https://registry.npmjs.org/apollo-link-http/-/apollo-link-http-1.5.16.tgz",
- "integrity": "sha512-IA3xA/OcrOzINRZEECI6IdhRp/Twom5X5L9jMehfzEo2AXdeRwAMlH5LuvTZHgKD8V1MBnXdM6YXawXkTDSmJw==",
- "requires": {
- "apollo-link": "^1.2.13",
- "apollo-link-http-common": "^0.2.15",
- "tslib": "^1.9.3"
- }
- },
- "apollo-link-http-common": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/apollo-link-http-common/-/apollo-link-http-common-0.2.15.tgz",
- "integrity": "sha512-+Heey4S2IPsPyTf8Ag3PugUupASJMW894iVps6hXbvwtg1aHSNMXUYO5VG7iRHkPzqpuzT4HMBanCTXPjtGzxg==",
- "requires": {
- "apollo-link": "^1.2.13",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.9.3"
- }
- },
- "apollo-utilities": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.3.tgz",
- "integrity": "sha512-F14aX2R/fKNYMvhuP2t9GD9fggID7zp5I96MF5QeKYWDWTrkRdHRp4+SVfXUVN+cXOaB/IebfvRtzPf25CM0zw==",
- "requires": {
- "@wry/equality": "^0.1.2",
- "fast-json-stable-stringify": "^2.0.0",
- "ts-invariant": "^0.4.0",
- "tslib": "^1.10.0"
- }
- },
- "application-config-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz",
- "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8="
- },
- "aproba": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
- "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
- },
- "arch": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.1.tgz",
- "integrity": "sha512-BLM56aPo9vLLFVa8+/+pJLnrZ7QGGTVHWsCwieAWT9o9K8UeGaQbzZbGoabWLOo2ksBCztoXdqBZBplqLDDCSg=="
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "aria-query": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz",
- "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=",
- "requires": {
- "ast-types-flow": "0.0.7",
- "commander": "^2.11.0"
- }
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
- },
- "array-filter": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
- "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw="
- },
- "array-find-index": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
- "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E="
- },
- "array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
- },
- "array-includes": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz",
- "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0",
- "is-string": "^1.0.5"
- }
- },
- "array-iterate": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.4.tgz",
- "integrity": "sha512-sNRaPGh9nnmdC8Zf+pT3UqP8rnWj5Hf9wiFGsX3wUQ2yVSIhO2ShFwCoceIPpB41QF6i2OEmrHmCo36xronCVA=="
- },
- "array-map": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
- "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI="
- },
- "array-reduce": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
- "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys="
- },
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
- "requires": {
- "array-uniq": "^1.0.1"
- }
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
- },
- "array.prototype.flat": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz",
- "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "arraybuffer.slice": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
- "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog=="
- },
- "arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
- },
- "asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "asn1.js": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
- "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
- "requires": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "assert": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
- "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
- "requires": {
- "object-assign": "^4.1.1",
- "util": "0.10.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
- },
- "util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
- "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
- "requires": {
- "inherits": "2.0.1"
- }
- }
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
- },
- "ast-types-flow": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
- "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0="
- },
- "astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
- },
- "async": {
- "version": "1.5.2",
- "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
- "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
- },
- "async-each": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
- "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
- },
- "async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
- },
- "auto-bind": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz",
- "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==",
- "optional": true
- },
- "autoprefixer": {
- "version": "9.7.5",
- "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.5.tgz",
- "integrity": "sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg==",
- "requires": {
- "browserslist": "^4.11.0",
- "caniuse-lite": "^1.0.30001036",
- "chalk": "^2.4.2",
- "normalize-range": "^0.1.2",
- "num2fraction": "^1.2.2",
- "postcss": "^7.0.27",
- "postcss-value-parser": "^4.0.3"
- },
- "dependencies": {
- "caniuse-lite": {
- "version": "1.0.30001038",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz",
- "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ=="
- }
- }
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
- },
- "aws4": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
- "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
- },
- "axios": {
- "version": "0.19.2",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
- "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
- "requires": {
- "follow-redirects": "1.5.10"
- }
- },
- "axobject-query": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.1.2.tgz",
- "integrity": "sha512-ICt34ZmrVt8UQnvPl6TVyDTkmhXmAyAT4Jh5ugfGUX4MOrZ+U/ZY6/sdylRw3qGNr9Ub5AJsaHeDMzNLehRdOQ=="
- },
- "babel-code-frame": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
- "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
- "requires": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- },
- "babel-core": {
- "version": "7.0.0-bridge.0",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
- "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg=="
- },
- "babel-eslint": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
- "integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.7.0",
- "@babel/traverse": "^7.7.0",
- "@babel/types": "^7.7.0",
- "eslint-visitor-keys": "^1.0.0",
- "resolve": "^1.12.0"
- }
- },
- "babel-loader": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz",
- "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==",
- "requires": {
- "find-cache-dir": "^2.1.0",
- "loader-utils": "^1.4.0",
- "mkdirp": "^0.5.3",
- "pify": "^4.0.1",
- "schema-utils": "^2.6.5"
- },
- "dependencies": {
- "emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
- },
- "json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "loader-utils": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
- "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "requires": {
- "minimist": "^1.2.5"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- }
- }
- }
- }
- },
- "babel-plugin-add-module-exports": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.3.3.tgz",
- "integrity": "sha512-hC37mm7aAdEb1n8SgggG8a1QuhZapsY/XLCi4ETSH6AVjXBCWEa50CXlOsAMPPWLnSx5Ns6mzz39uvuseh0Xjg==",
- "requires": {
- "chokidar": "^2.0.4"
- },
- "dependencies": {
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "optional": true,
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "optional": true
- }
- }
- },
- "babel-plugin-apply-mdx-type-prop": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.5.8.tgz",
- "integrity": "sha512-xYp5F9mAnZdDRFSd1vF3XQ0GQUbIulCpnuht2jCmK30GAHL8szVL7TgzwhEGamQ6yJmP/gEyYNM9OR5D2n26eA==",
- "requires": {
- "@babel/helper-plugin-utils": "7.8.3",
- "@mdx-js/util": "^1.5.8"
- }
- },
- "babel-plugin-dynamic-import-node": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
- "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
- "requires": {
- "object.assign": "^4.1.0"
- }
- },
- "babel-plugin-emotion": {
- "version": "10.0.33",
- "resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.0.33.tgz",
- "integrity": "sha512-bxZbTTGz0AJQDHm8k6Rf3RQJ8tX2scsfsRyKVgAbiUPUNIRtlK+7JxP+TAd1kRLABFxe0CFm2VdK4ePkoA9FxQ==",
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@emotion/hash": "0.8.0",
- "@emotion/memoize": "0.7.4",
- "@emotion/serialize": "^0.11.16",
- "babel-plugin-macros": "^2.0.0",
- "babel-plugin-syntax-jsx": "^6.18.0",
- "convert-source-map": "^1.5.0",
- "escape-string-regexp": "^1.0.5",
- "find-root": "^1.1.0",
- "source-map": "^0.5.7"
- }
- },
- "babel-plugin-extract-import-names": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.5.8.tgz",
- "integrity": "sha512-LcLfP8ZRBZMdMAXHLugyvvd5PY0gMmLMWFogWAUsG32X6TYW2Eavx+il2bw73KDbW+UdCC1bAJ3NuU25T1MI3g==",
- "requires": {
- "@babel/helper-plugin-utils": "7.8.3"
- }
- },
- "babel-plugin-macros": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz",
- "integrity": "sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==",
- "requires": {
- "@babel/runtime": "^7.7.2",
- "cosmiconfig": "^6.0.0",
- "resolve": "^1.12.0"
- }
- },
- "babel-plugin-preval": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-preval/-/babel-plugin-preval-3.0.1.tgz",
- "integrity": "sha512-s8hmTlRSmzcL7cHSIi0s6WxmpOAxfIlWqSVQwBIt7V5bNBaac+8JMZ6kJXLOazMJ8gCIcb5AJgQUgPHvbSYUzw==",
- "requires": {
- "babel-plugin-macros": "^2.2.2",
- "require-from-string": "^2.0.2"
- }
- },
- "babel-plugin-remove-graphql-queries": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-2.8.1.tgz",
- "integrity": "sha512-c/JNri17WypqZNnMsX2PweMe8e5hsJcYNO/VnUBX9iUIvmKBjd143RaUQq0xYa6bpQF0kzpTFVR0sOp+cQlBOQ=="
- },
- "babel-plugin-syntax-jsx": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
- "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
- },
- "babel-plugin-transform-react-remove-prop-types": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz",
- "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA=="
- },
- "babel-preset-gatsby": {
- "version": "0.2.36",
- "resolved": "https://registry.npmjs.org/babel-preset-gatsby/-/babel-preset-gatsby-0.2.36.tgz",
- "integrity": "sha512-vmqN6ht4B28dHlK7Qsau3JseHwTEkLjf2QkUcUKlYCuVk7skZkbN2B6O8QeJQTQ30V/6uUKiNMU/U0nc0RYMNQ==",
- "requires": {
- "@babel/plugin-proposal-class-properties": "^7.8.3",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-proposal-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-transform-runtime": "^7.8.3",
- "@babel/plugin-transform-spread": "^7.8.3",
- "@babel/preset-env": "^7.8.7",
- "@babel/preset-react": "^7.8.3",
- "@babel/runtime": "^7.8.7",
- "babel-plugin-dynamic-import-node": "^2.3.0",
- "babel-plugin-macros": "^2.8.0",
- "babel-plugin-transform-react-remove-prop-types": "^0.4.24",
- "gatsby-core-utils": "^1.0.34"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "requires": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
- }
- }
- },
- "backo2": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
- "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc="
- },
- "bail": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz",
- "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ=="
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "base64-arraybuffer": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
- "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg="
- },
- "base64-js": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
- "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
- },
- "base64id": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
- "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "better-assert": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
- "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
- "requires": {
- "callsite": "1.0.0"
- }
- },
- "better-opn": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-1.0.0.tgz",
- "integrity": "sha512-q3eO2se4sFbTERB1dFBDdjTiIIpRohMErpwBX21lhPvmgmQNNrcQj0zbWRhMREDesJvyod9kxBS3kOtdAvkB/A==",
- "requires": {
- "open": "^6.4.0"
- }
- },
- "better-queue": {
- "version": "3.8.10",
- "resolved": "https://registry.npmjs.org/better-queue/-/better-queue-3.8.10.tgz",
- "integrity": "sha512-e3gwNZgDCnNWl0An0Tz6sUjKDV9m6aB+K9Xg//vYeo8+KiH8pWhLFxkawcXhm6FpM//GfD9IQv/kmvWCAVVpKA==",
- "requires": {
- "better-queue-memory": "^1.0.1",
- "node-eta": "^0.9.0",
- "uuid": "^3.0.0"
- }
- },
- "better-queue-memory": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/better-queue-memory/-/better-queue-memory-1.0.4.tgz",
- "integrity": "sha512-SWg5wFIShYffEmJpI6LgbL8/3Dqhku7xI1oEiy6FroP9DbcZlG0ZDjxvPdP9t7hTGW40IpIcC6zVoGT1oxjOuA=="
- },
- "big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
- },
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
- },
- "bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
- "optional": true,
- "requires": {
- "file-uri-to-path": "1.0.0"
- }
- },
- "bl": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz",
- "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=",
- "requires": {
- "readable-stream": "~1.0.26"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "blob": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz",
- "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig=="
- },
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
- },
- "bn.js": {
- "version": "4.11.8",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
- "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
- },
- "body-parser": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
- "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
- "requires": {
- "bytes": "3.1.0",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "on-finished": "~2.3.0",
- "qs": "6.7.0",
- "raw-body": "2.4.0",
- "type-is": "~1.6.17"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "bonjour": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
- "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
- "requires": {
- "array-flatten": "^2.1.0",
- "deep-equal": "^1.0.1",
- "dns-equal": "^1.0.0",
- "dns-txt": "^2.0.2",
- "multicast-dns": "^6.0.1",
- "multicast-dns-service-types": "^1.1.0"
- },
- "dependencies": {
- "array-flatten": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz",
- "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
- }
- }
- },
- "boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
- },
- "bowser": {
- "version": "1.9.4",
- "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
- "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ=="
- },
- "boxen": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
- "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
- "requires": {
- "ansi-align": "^3.0.0",
- "camelcase": "^5.3.1",
- "chalk": "^3.0.0",
- "cli-boxes": "^2.2.0",
- "string-width": "^4.1.0",
- "term-size": "^2.1.0",
- "type-fest": "^0.8.1",
- "widest-line": "^3.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
- },
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- }
- }
- },
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
- },
- "browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "requires": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "browserify-cipher": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
- "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
- "requires": {
- "browserify-aes": "^1.0.4",
- "browserify-des": "^1.0.0",
- "evp_bytestokey": "^1.0.0"
- }
- },
- "browserify-des": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
- "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
- "requires": {
- "cipher-base": "^1.0.1",
- "des.js": "^1.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "browserify-fs": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz",
- "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=",
- "requires": {
- "level-filesystem": "^1.0.1",
- "level-js": "^2.1.3",
- "levelup": "^0.18.2"
- }
- },
- "browserify-rsa": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
- "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
- "requires": {
- "bn.js": "^4.1.0",
- "randombytes": "^2.0.1"
- }
- },
- "browserify-sign": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
- "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
- "requires": {
- "bn.js": "^4.1.1",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.2",
- "elliptic": "^6.0.0",
- "inherits": "^2.0.1",
- "parse-asn1": "^5.0.0"
- }
- },
- "browserify-zlib": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
- "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
- "requires": {
- "pako": "~1.0.5"
- }
- },
- "browserslist": {
- "version": "4.11.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.11.1.tgz",
- "integrity": "sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g==",
- "requires": {
- "caniuse-lite": "^1.0.30001038",
- "electron-to-chromium": "^1.3.390",
- "node-releases": "^1.1.53",
- "pkg-up": "^2.0.0"
- },
- "dependencies": {
- "caniuse-lite": {
- "version": "1.0.30001038",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001038.tgz",
- "integrity": "sha512-zii9quPo96XfOiRD4TrfYGs+QsGZpb2cGiMAzPjtf/hpFgB6zCPZgJb7I1+EATeMw/o+lG8FyRAnI+CWStHcaQ=="
- },
- "electron-to-chromium": {
- "version": "1.3.395",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.395.tgz",
- "integrity": "sha512-kdn2cX6hZXDdz/O2Q8tZscITlsSv1a/7bOq/fQs7QAJ9iaRlnhZPccarNhxZv1tXgmgwCnKp/1lJNYLOG8Dxiw=="
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "node-releases": {
- "version": "1.1.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
- "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ=="
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
- "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
- "requires": {
- "find-up": "^2.1.0"
- }
- }
- }
- },
- "buffer": {
- "version": "4.9.2",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
- "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
- }
- },
- "buffer-alloc": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz",
- "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==",
- "requires": {
- "buffer-alloc-unsafe": "^1.1.0",
- "buffer-fill": "^1.0.0"
- }
- },
- "buffer-alloc-unsafe": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz",
- "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg=="
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
- },
- "buffer-es6": {
- "version": "4.9.3",
- "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz",
- "integrity": "sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ="
- },
- "buffer-fill": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz",
- "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw="
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
- },
- "buffer-indexof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
- "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
- },
- "buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
- },
- "builtin-modules": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
- "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw=="
- },
- "builtin-status-codes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
- },
- "bytes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
- "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
- },
- "cacache": {
- "version": "12.0.4",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
- "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
- "requires": {
- "bluebird": "^3.5.5",
- "chownr": "^1.1.1",
- "figgy-pudding": "^3.5.1",
- "glob": "^7.1.4",
- "graceful-fs": "^4.1.15",
- "infer-owner": "^1.0.3",
- "lru-cache": "^5.1.1",
- "mississippi": "^3.0.0",
- "mkdirp": "^0.5.1",
- "move-concurrently": "^1.0.1",
- "promise-inflight": "^1.0.1",
- "rimraf": "^2.6.3",
- "ssri": "^6.0.1",
- "unique-filename": "^1.1.1",
- "y18n": "^4.0.0"
- },
- "dependencies": {
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- }
- }
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- }
- },
- "cache-manager": {
- "version": "2.11.1",
- "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-2.11.1.tgz",
- "integrity": "sha512-XhUuc9eYwkzpK89iNewFwtvcDYMUsvtwzHeyEOPJna/WsVsXcrzsA1ft2M0QqPNunEzLhNCYPo05tEfG+YuNow==",
- "requires": {
- "async": "1.5.2",
- "lodash.clonedeep": "4.5.0",
- "lru-cache": "4.0.0"
- }
- },
- "cache-manager-fs-hash": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/cache-manager-fs-hash/-/cache-manager-fs-hash-0.0.7.tgz",
- "integrity": "sha512-7X+FPItAJf1tKKqJx6ljDJQc0fgSR5B+KPxFQLj+vYSL4q9XdrCbZldgsNb6wueRuIooj01wt0FubB08zaefRg==",
- "requires": {
- "es6-promisify": "^6.0.0",
- "lockfile": "^1.0.4"
- }
- },
- "cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "requires": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^3.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^1.0.2"
- },
- "dependencies": {
- "get-stream": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
- "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
- },
- "normalize-url": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
- "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
- }
- }
- },
- "call-me-maybe": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
- "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
- },
- "caller-callsite": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
- "requires": {
- "callsites": "^2.0.0"
- },
- "dependencies": {
- "callsites": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
- }
- }
- },
- "caller-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
- "requires": {
- "caller-callsite": "^2.0.0"
- }
- },
- "callsite": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
- "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA="
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
- },
- "camel-case": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
- "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
- "requires": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.1"
- }
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
- },
- "camelcase-css": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
- "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
- },
- "caniuse-api": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
- "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
- "requires": {
- "browserslist": "^4.0.0",
- "caniuse-lite": "^1.0.0",
- "lodash.memoize": "^4.1.2",
- "lodash.uniq": "^4.5.0"
- }
- },
- "caniuse-lite": {
- "version": "1.0.30001025",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz",
- "integrity": "sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ=="
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
- },
- "ccount": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
- "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw=="
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "change-case": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz",
- "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==",
- "requires": {
- "camel-case": "^3.0.0",
- "constant-case": "^2.0.0",
- "dot-case": "^2.1.0",
- "header-case": "^1.0.0",
- "is-lower-case": "^1.1.0",
- "is-upper-case": "^1.1.0",
- "lower-case": "^1.1.1",
- "lower-case-first": "^1.0.0",
- "no-case": "^2.3.2",
- "param-case": "^2.1.0",
- "pascal-case": "^2.0.0",
- "path-case": "^2.1.0",
- "sentence-case": "^2.1.0",
- "snake-case": "^2.1.0",
- "swap-case": "^1.1.0",
- "title-case": "^2.1.0",
- "upper-case": "^1.1.1",
- "upper-case-first": "^1.1.0"
- }
- },
- "change-emitter": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/change-emitter/-/change-emitter-0.1.6.tgz",
- "integrity": "sha1-6LL+PX8at9aaMhma/5HqaTFAlRU="
- },
- "character-entities": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
- "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
- },
- "character-entities-html4": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
- "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g=="
- },
- "character-entities-legacy": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
- "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
- },
- "character-reference-invalid": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
- "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
- },
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
- },
- "charenc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
- "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc="
- },
- "cheerio": {
- "version": "0.22.0",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz",
- "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=",
- "requires": {
- "css-select": "~1.2.0",
- "dom-serializer": "~0.1.0",
- "entities": "~1.1.1",
- "htmlparser2": "^3.9.1",
- "lodash.assignin": "^4.0.9",
- "lodash.bind": "^4.1.4",
- "lodash.defaults": "^4.0.1",
- "lodash.filter": "^4.4.0",
- "lodash.flatten": "^4.2.0",
- "lodash.foreach": "^4.3.0",
- "lodash.map": "^4.4.0",
- "lodash.merge": "^4.4.0",
- "lodash.pick": "^4.2.1",
- "lodash.reduce": "^4.4.0",
- "lodash.reject": "^4.4.0",
- "lodash.some": "^4.4.0"
- },
- "dependencies": {
- "dom-serializer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
- "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
- "requires": {
- "domelementtype": "^1.3.0",
- "entities": "^1.1.1"
- }
- },
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
- }
- }
- },
- "chokidar": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
- "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.1.1",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.2.0"
- },
- "dependencies": {
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "binary-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
- "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow=="
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "fsevents": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
- "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
- "optional": true
- },
- "glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- },
- "readdirp": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
- "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
- "requires": {
- "picomatch": "^2.0.4"
- }
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "requires": {
- "is-number": "^7.0.0"
- }
- }
- }
- },
- "chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
- },
- "chrome-trace-event": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
- "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "ci-info": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
- "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
- },
- "cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "classnames": {
- "version": "2.2.6",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
- "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
- },
- "clean-css": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
- "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
- "requires": {
- "source-map": "~0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
- },
- "cli-boxes": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz",
- "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w=="
- },
- "cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
- "requires": {
- "restore-cursor": "^2.0.0"
- }
- },
- "cli-spinners": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
- "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==",
- "optional": true
- },
- "cli-table3": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
- "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
- "requires": {
- "colors": "^1.1.2",
- "object-assign": "^4.1.0",
- "string-width": "^2.1.1"
- }
- },
- "cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "optional": true,
- "requires": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "optional": true
- },
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "optional": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "optional": true
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "optional": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "optional": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "optional": true
- },
- "slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "optional": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- }
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "optional": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "optional": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "cli-width": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
- "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
- },
- "clipboard": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.6.tgz",
- "integrity": "sha512-g5zbiixBRk/wyKakSwCKd7vQXDjFnAMGHoEyBogG/bw9kTD9GvdAvaoRR1ALcEzt3pVKxZR0pViekPMIS0QyGg==",
- "optional": true,
- "requires": {
- "good-listener": "^1.2.2",
- "select": "^1.1.2",
- "tiny-emitter": "^2.0.0"
- }
- },
- "clipboardy": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-2.3.0.tgz",
- "integrity": "sha512-mKhiIL2DrQIsuXMgBgnfEHOZOryC7kY7YO//TN6c63wlEm3NG5tz+YgY5rVi29KCmq/QQjKYvM7a19+MDOTHOQ==",
- "requires": {
- "arch": "^2.1.1",
- "execa": "^1.0.0",
- "is-wsl": "^2.1.1"
- },
- "dependencies": {
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- }
- }
- },
- "cliui": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
- "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
- "requires": {
- "string-width": "^3.1.0",
- "strip-ansi": "^5.2.0",
- "wrap-ansi": "^5.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "clone": {
- "version": "0.1.19",
- "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz",
- "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU="
- },
- "clone-deep": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
- "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=",
- "requires": {
- "for-own": "^0.1.3",
- "is-plain-object": "^2.0.1",
- "kind-of": "^3.0.2",
- "lazy-cache": "^1.0.3",
- "shallow-clone": "^0.1.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "clone-response": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
- "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "requires": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
- },
- "collapse-white-space": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
- "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ=="
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
- "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
- "requires": {
- "color-convert": "^1.9.1",
- "color-string": "^1.5.2"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
- },
- "color-string": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
- "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
- "requires": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "colors": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
- "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
- "optional": true
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "comma-separated-tokens": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
- "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
- },
- "command-exists": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.8.tgz",
- "integrity": "sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw=="
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
- },
- "common-tags": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
- "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw=="
- },
- "commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
- },
- "component-bind": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
- "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E="
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
- },
- "component-inherit": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
- "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM="
- },
- "compressible": {
- "version": "2.0.18",
- "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
- "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
- "requires": {
- "mime-db": ">= 1.43.0 < 2"
- }
- },
- "compression": {
- "version": "1.7.4",
- "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
- "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
- "requires": {
- "accepts": "~1.3.5",
- "bytes": "3.0.0",
- "compressible": "~2.0.16",
- "debug": "2.6.9",
- "on-headers": "~1.0.2",
- "safe-buffer": "5.1.2",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "configstore": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
- "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
- "requires": {
- "dot-prop": "^5.2.0",
- "graceful-fs": "^4.1.2",
- "make-dir": "^3.0.0",
- "unique-string": "^2.0.0",
- "write-file-atomic": "^3.0.0",
- "xdg-basedir": "^4.0.0"
- },
- "dependencies": {
- "make-dir": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
- "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
- "requires": {
- "semver": "^6.0.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "confusing-browser-globals": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz",
- "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw=="
- },
- "connect-history-api-fallback": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
- "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
- },
- "console-browserify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
- "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
- },
- "constant-case": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz",
- "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=",
- "requires": {
- "snake-case": "^2.1.0",
- "upper-case": "^1.1.1"
- }
- },
- "constants-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
- },
- "contains-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
- "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo="
- },
- "content-disposition": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
- "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
- },
- "convert-hrtime": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-3.0.0.tgz",
- "integrity": "sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA=="
- },
- "convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "cookie": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
- "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
- },
- "cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
- },
- "copy-concurrently": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
- "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
- "requires": {
- "aproba": "^1.1.1",
- "fs-write-stream-atomic": "^1.0.8",
- "iferr": "^0.1.5",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.5.4",
- "run-queue": "^1.0.0"
- },
- "dependencies": {
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
- },
- "copy-to-clipboard": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz",
- "integrity": "sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==",
- "requires": {
- "toggle-selection": "^1.0.6"
- }
- },
- "copyfiles": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.2.0.tgz",
- "integrity": "sha512-iJbHJI+8OKqsq+4JF0rqgRkZzo++jqO6Wf4FUU1JM41cJF6JcY5968XyF4tm3Kkm7ZOMrqlljdm8N9oyY5raGw==",
- "requires": {
- "glob": "^7.0.5",
- "minimatch": "^3.0.3",
- "mkdirp": "^0.5.1",
- "noms": "0.0.0",
- "through2": "^2.0.1",
- "yargs": "^13.2.4"
- }
- },
- "core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
- },
- "core-js-compat": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.4.tgz",
- "integrity": "sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA==",
- "requires": {
- "browserslist": "^4.8.3",
- "semver": "7.0.0"
- },
- "dependencies": {
- "browserslist": {
- "version": "4.8.6",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz",
- "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==",
- "requires": {
- "caniuse-lite": "^1.0.30001023",
- "electron-to-chromium": "^1.3.341",
- "node-releases": "^1.1.47"
- }
- },
- "semver": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
- "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
- }
- }
- },
- "core-js-pure": {
- "version": "3.6.4",
- "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.4.tgz",
- "integrity": "sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw=="
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
- },
- "cors": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
- "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
- "requires": {
- "object-assign": "^4",
- "vary": "^1"
- }
- },
- "cosmiconfig": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
- "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
- "requires": {
- "@types/parse-json": "^4.0.0",
- "import-fresh": "^3.1.0",
- "parse-json": "^5.0.0",
- "path-type": "^4.0.0",
- "yaml": "^1.7.2"
- }
- },
- "create-ecdh": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
- "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
- "requires": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.0.0"
- }
- },
- "create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "requires": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "requires": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "create-react-context": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/create-react-context/-/create-react-context-0.3.0.tgz",
- "integrity": "sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==",
- "requires": {
- "gud": "^1.0.0",
- "warning": "^4.0.3"
- }
- },
- "cross-fetch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.2.tgz",
- "integrity": "sha1-pH/09/xxLauo9qaVoRyUhEDUVyM=",
- "requires": {
- "node-fetch": "2.1.2",
- "whatwg-fetch": "2.0.4"
- }
- },
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "crypt": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
- "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs="
- },
- "crypto-browserify": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
- "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
- "requires": {
- "browserify-cipher": "^1.0.0",
- "browserify-sign": "^4.0.0",
- "create-ecdh": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.0",
- "diffie-hellman": "^5.0.0",
- "inherits": "^2.0.1",
- "pbkdf2": "^3.0.3",
- "public-encrypt": "^4.0.0",
- "randombytes": "^2.0.0",
- "randomfill": "^1.0.3"
- }
- },
- "crypto-random-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
- "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
- },
- "css-b64-images": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/css-b64-images/-/css-b64-images-0.2.5.tgz",
- "integrity": "sha1-QgBdgyBLK0pdk7axpWRBM7WSegI="
- },
- "css-color-names": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
- "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
- },
- "css-declaration-sorter": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
- "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
- "requires": {
- "postcss": "^7.0.1",
- "timsort": "^0.3.0"
- }
- },
- "css-in-js-utils": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/css-in-js-utils/-/css-in-js-utils-2.0.1.tgz",
- "integrity": "sha512-PJF0SpJT+WdbVVt0AOYp9C8GnuruRlL/UFW7932nLWmFLQTaWEzTBQEx7/hn4BuV+WON75iAViSUJLiU3PKbpA==",
- "requires": {
- "hyphenate-style-name": "^1.0.2",
- "isobject": "^3.0.1"
- }
- },
- "css-loader": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-1.0.1.tgz",
- "integrity": "sha512-+ZHAZm/yqvJ2kDtPne3uX0C+Vr3Zn5jFn2N4HywtS5ujwvsVkyg0VArEXpl3BgczDA8anieki1FIzhchX4yrDw==",
- "requires": {
- "babel-code-frame": "^6.26.0",
- "css-selector-tokenizer": "^0.7.0",
- "icss-utils": "^2.1.0",
- "loader-utils": "^1.0.2",
- "lodash": "^4.17.11",
- "postcss": "^6.0.23",
- "postcss-modules-extract-imports": "^1.2.0",
- "postcss-modules-local-by-default": "^1.2.0",
- "postcss-modules-scope": "^1.1.0",
- "postcss-modules-values": "^1.3.0",
- "postcss-value-parser": "^3.3.0",
- "source-list-map": "^2.0.0"
- },
- "dependencies": {
- "postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
- "requires": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- }
- },
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "css-select": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
- "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
- "requires": {
- "boolbase": "~1.0.0",
- "css-what": "2.1",
- "domutils": "1.5.1",
- "nth-check": "~1.0.1"
- }
- },
- "css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
- },
- "css-selector-parser": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.3.0.tgz",
- "integrity": "sha1-XxrUPi2O77/cME/NOaUhZklD4+s="
- },
- "css-selector-tokenizer": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz",
- "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==",
- "requires": {
- "cssesc": "^3.0.0",
- "fastparse": "^1.1.2",
- "regexpu-core": "^4.6.0"
- }
- },
- "css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "requires": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "css-what": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
- "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg=="
- },
- "cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
- },
- "cssnano": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
- "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
- "requires": {
- "cosmiconfig": "^5.0.0",
- "cssnano-preset-default": "^4.0.7",
- "is-resolvable": "^1.0.0",
- "postcss": "^7.0.0"
- },
- "dependencies": {
- "cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- }
- },
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
- }
- }
- },
- "cssnano-preset-default": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
- "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
- "requires": {
- "css-declaration-sorter": "^4.0.1",
- "cssnano-util-raw-cache": "^4.0.1",
- "postcss": "^7.0.0",
- "postcss-calc": "^7.0.1",
- "postcss-colormin": "^4.0.3",
- "postcss-convert-values": "^4.0.1",
- "postcss-discard-comments": "^4.0.2",
- "postcss-discard-duplicates": "^4.0.2",
- "postcss-discard-empty": "^4.0.1",
- "postcss-discard-overridden": "^4.0.1",
- "postcss-merge-longhand": "^4.0.11",
- "postcss-merge-rules": "^4.0.3",
- "postcss-minify-font-values": "^4.0.2",
- "postcss-minify-gradients": "^4.0.2",
- "postcss-minify-params": "^4.0.2",
- "postcss-minify-selectors": "^4.0.2",
- "postcss-normalize-charset": "^4.0.1",
- "postcss-normalize-display-values": "^4.0.2",
- "postcss-normalize-positions": "^4.0.2",
- "postcss-normalize-repeat-style": "^4.0.2",
- "postcss-normalize-string": "^4.0.2",
- "postcss-normalize-timing-functions": "^4.0.2",
- "postcss-normalize-unicode": "^4.0.1",
- "postcss-normalize-url": "^4.0.1",
- "postcss-normalize-whitespace": "^4.0.2",
- "postcss-ordered-values": "^4.1.2",
- "postcss-reduce-initial": "^4.0.3",
- "postcss-reduce-transforms": "^4.0.2",
- "postcss-svgo": "^4.0.2",
- "postcss-unique-selectors": "^4.0.1"
- }
- },
- "cssnano-util-get-arguments": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
- "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8="
- },
- "cssnano-util-get-match": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
- "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0="
- },
- "cssnano-util-raw-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
- "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "cssnano-util-same-parent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
- "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q=="
- },
- "csso": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.2.tgz",
- "integrity": "sha512-kS7/oeNVXkHWxby5tHVxlhjizRCSv8QdU7hB2FpdAibDU8FjTAolhNjKNTiLzXtUrKT6HwClE81yXwEk1309wg==",
- "requires": {
- "css-tree": "1.0.0-alpha.37"
- }
- },
- "csstype": {
- "version": "2.6.8",
- "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.8.tgz",
- "integrity": "sha512-msVS9qTuMT5zwAGCVm4mxfrZ18BNc6Csd0oJAtiFMZ1FAx1CCvy2+5MDmYoix63LM/6NDbNtodCiGYGmFgO0dA=="
- },
- "currently-unhandled": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
- "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
- "requires": {
- "array-find-index": "^1.0.1"
- }
- },
- "cyclist": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz",
- "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
- },
- "d3": {
- "version": "5.15.1",
- "resolved": "https://registry.npmjs.org/d3/-/d3-5.15.1.tgz",
- "integrity": "sha512-Xu9gT6Lm0jH3wWJJSRomFwqnGGi3YAfWIfxNFl4++YVgYOjo3F8V2idAG3nJBgpZOkD0/RHPZX6F4k6tzgOvYw==",
- "requires": {
- "d3-array": "1",
- "d3-axis": "1",
- "d3-brush": "1",
- "d3-chord": "1",
- "d3-collection": "1",
- "d3-color": "1",
- "d3-contour": "1",
- "d3-dispatch": "1",
- "d3-drag": "1",
- "d3-dsv": "1",
- "d3-ease": "1",
- "d3-fetch": "1",
- "d3-force": "1",
- "d3-format": "1",
- "d3-geo": "1",
- "d3-hierarchy": "1",
- "d3-interpolate": "1",
- "d3-path": "1",
- "d3-polygon": "1",
- "d3-quadtree": "1",
- "d3-random": "1",
- "d3-scale": "2",
- "d3-scale-chromatic": "1",
- "d3-selection": "1",
- "d3-shape": "1",
- "d3-time": "1",
- "d3-time-format": "2",
- "d3-timer": "1",
- "d3-transition": "1",
- "d3-voronoi": "1",
- "d3-zoom": "1"
- }
- },
- "d3-array": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
- "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
- },
- "d3-axis": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz",
- "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ=="
- },
- "d3-brush": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.5.tgz",
- "integrity": "sha512-rEaJ5gHlgLxXugWjIkolTA0OyMvw8UWU1imYXy1v642XyyswmI1ybKOv05Ft+ewq+TFmdliD3VuK0pRp1VT/5A==",
- "requires": {
- "d3-dispatch": "1",
- "d3-drag": "1",
- "d3-interpolate": "1",
- "d3-selection": "1",
- "d3-transition": "1"
- }
- },
- "d3-chord": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz",
- "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==",
- "requires": {
- "d3-array": "1",
- "d3-path": "1"
- }
- },
- "d3-collection": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
- "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
- },
- "d3-color": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.0.tgz",
- "integrity": "sha512-TzNPeJy2+iEepfiL92LAAB7fvnp/dV2YwANPVHdDWmYMm23qIJBYww3qT8I8C1wXrmrg4UWs7BKc2tKIgyjzHg=="
- },
- "d3-contour": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz",
- "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==",
- "requires": {
- "d3-array": "^1.1.1"
- }
- },
- "d3-dispatch": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
- "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
- },
- "d3-drag": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz",
- "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==",
- "requires": {
- "d3-dispatch": "1",
- "d3-selection": "1"
- }
- },
- "d3-dsv": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz",
- "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==",
- "requires": {
- "commander": "2",
- "iconv-lite": "0.4",
- "rw": "1"
- }
- },
- "d3-ease": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.6.tgz",
- "integrity": "sha512-SZ/lVU7LRXafqp7XtIcBdxnWl8yyLpgOmzAk0mWBI9gXNzLDx5ybZgnRbH9dN/yY5tzVBqCQ9avltSnqVwessQ=="
- },
- "d3-fetch": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.1.2.tgz",
- "integrity": "sha512-S2loaQCV/ZeyTyIF2oP8D1K9Z4QizUzW7cWeAOAS4U88qOt3Ucf6GsmgthuYSdyB2HyEm4CeGvkQxWsmInsIVA==",
- "requires": {
- "d3-dsv": "1"
- }
- },
- "d3-force": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz",
- "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==",
- "requires": {
- "d3-collection": "1",
- "d3-dispatch": "1",
- "d3-quadtree": "1",
- "d3-timer": "1"
- }
- },
- "d3-format": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz",
- "integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw=="
- },
- "d3-geo": {
- "version": "1.11.9",
- "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.11.9.tgz",
- "integrity": "sha512-9edcH6J3s/Aa3KJITWqFJbyB/8q3mMlA9Fi7z6yy+FAYMnRaxmC7jBhUnsINxVWD14GmqX3DK8uk7nV6/Ekt4A==",
- "requires": {
- "d3-array": "1"
- }
- },
- "d3-hierarchy": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
- "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ=="
- },
- "d3-interpolate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
- "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
- "requires": {
- "d3-color": "1"
- }
- },
- "d3-path": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
- "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
- },
- "d3-polygon": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz",
- "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ=="
- },
- "d3-quadtree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
- "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
- },
- "d3-random": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz",
- "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ=="
- },
- "d3-scale": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
- "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
- "requires": {
- "d3-array": "^1.2.0",
- "d3-collection": "1",
- "d3-format": "1",
- "d3-interpolate": "1",
- "d3-time": "1",
- "d3-time-format": "2"
- }
- },
- "d3-scale-chromatic": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz",
- "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==",
- "requires": {
- "d3-color": "1",
- "d3-interpolate": "1"
- }
- },
- "d3-selection": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.1.tgz",
- "integrity": "sha512-BTIbRjv/m5rcVTfBs4AMBLKs4x8XaaLkwm28KWu9S2vKNqXkXt2AH2Qf0sdPZHjFxcWg/YL53zcqAz+3g4/7PA=="
- },
- "d3-shape": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
- "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
- "requires": {
- "d3-path": "1"
- }
- },
- "d3-time": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
- "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
- },
- "d3-time-format": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz",
- "integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==",
- "requires": {
- "d3-time": "1"
- }
- },
- "d3-timer": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
- "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
- },
- "d3-transition": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz",
- "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==",
- "requires": {
- "d3-color": "1",
- "d3-dispatch": "1",
- "d3-ease": "1",
- "d3-interpolate": "1",
- "d3-selection": "^1.1.0",
- "d3-timer": "1"
- }
- },
- "d3-voronoi": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz",
- "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg=="
- },
- "d3-zoom": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz",
- "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==",
- "requires": {
- "d3-dispatch": "1",
- "d3-drag": "1",
- "d3-interpolate": "1",
- "d3-selection": "1",
- "d3-transition": "1"
- }
- },
- "dagre": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz",
- "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==",
- "requires": {
- "graphlib": "^2.1.8",
- "lodash": "^4.17.15"
- }
- },
- "dagre-d3": {
- "version": "0.6.4",
- "resolved": "https://registry.npmjs.org/dagre-d3/-/dagre-d3-0.6.4.tgz",
- "integrity": "sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ==",
- "requires": {
- "d3": "^5.14",
- "dagre": "^0.8.5",
- "graphlib": "^2.1.8",
- "lodash": "^4.17.15"
- }
- },
- "damerau-levenshtein": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz",
- "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug=="
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "dataloader": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz",
- "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw=="
- },
- "date-fns": {
- "version": "2.11.1",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.11.1.tgz",
- "integrity": "sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w=="
- },
- "debug": {
- "version": "3.2.6",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
- "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
- },
- "decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
- "requires": {
- "mimic-response": "^1.0.0"
- }
- },
- "deep-equal": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
- "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
- "requires": {
- "is-arguments": "^1.0.4",
- "is-date-object": "^1.0.1",
- "is-regex": "^1.0.4",
- "object-is": "^1.0.1",
- "object-keys": "^1.1.1",
- "regexp.prototype.flags": "^1.2.0"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
- },
- "deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
- },
- "default-gateway": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz",
- "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
- "requires": {
- "execa": "^1.0.0",
- "ip-regex": "^2.1.0"
- },
- "dependencies": {
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- }
- }
- },
- "defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
- },
- "deferred-leveldown": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz",
- "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=",
- "requires": {
- "abstract-leveldown": "~0.12.1"
- }
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "del": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz",
- "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==",
- "requires": {
- "globby": "^10.0.1",
- "graceful-fs": "^4.2.2",
- "is-glob": "^4.0.1",
- "is-path-cwd": "^2.2.0",
- "is-path-inside": "^3.0.1",
- "p-map": "^3.0.0",
- "rimraf": "^3.0.0",
- "slash": "^3.0.0"
- },
- "dependencies": {
- "@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
- },
- "array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "requires": {
- "path-type": "^4.0.0"
- }
- },
- "fast-glob": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz",
- "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==",
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "globby": {
- "version": "10.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
- "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
- "requires": {
- "@types/glob": "^7.1.1",
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.0.3",
- "glob": "^7.1.3",
- "ignore": "^5.1.1",
- "merge2": "^1.2.3",
- "slash": "^3.0.0"
- }
- },
- "ignore": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz",
- "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A=="
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
- },
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- },
- "slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "requires": {
- "is-number": "^7.0.0"
- }
- }
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
- },
- "delegate": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
- "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
- "optional": true
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
- },
- "deprecated-decorator": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz",
- "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc="
- },
- "des.js": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
- "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
- "requires": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
- },
- "detab": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.3.tgz",
- "integrity": "sha512-Up8P0clUVwq0FnFjDclzZsy9PadzRn5FFxrr47tQQvMHqyiFYVbpH8oXDzWtF0Q7pYy3l+RPmtBl+BsFF6wH0A==",
- "requires": {
- "repeat-string": "^1.5.4"
- }
- },
- "detect-indent": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz",
- "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA=="
- },
- "detect-node": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz",
- "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw=="
- },
- "detect-port": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz",
- "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==",
- "requires": {
- "address": "^1.0.1",
- "debug": "^2.6.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "devcert": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/devcert/-/devcert-1.1.0.tgz",
- "integrity": "sha512-ppyIBJueMMisYvJABaXESY10CwEm1pUXoLOm6TeBO2bbDUQE8ZjJPNADlu31I2InL7hduSgratzRG/dHUDF41w==",
- "requires": {
- "@types/configstore": "^2.1.1",
- "@types/debug": "^0.0.30",
- "@types/get-port": "^3.2.0",
- "@types/glob": "^5.0.34",
- "@types/lodash": "^4.14.92",
- "@types/mkdirp": "^0.5.2",
- "@types/node": "^8.5.7",
- "@types/rimraf": "^2.0.2",
- "@types/tmp": "^0.0.33",
- "application-config-path": "^0.1.0",
- "command-exists": "^1.2.4",
- "configstore": "^3.0.0",
- "debug": "^3.1.0",
- "eol": "^0.9.1",
- "get-port": "^3.2.0",
- "glob": "^7.1.2",
- "lodash": "^4.17.4",
- "mkdirp": "^0.5.1",
- "password-prompt": "^1.0.4",
- "rimraf": "^2.6.2",
- "sudo-prompt": "^8.2.0",
- "tmp": "^0.0.33",
- "tslib": "^1.10.0"
- },
- "dependencies": {
- "@types/glob": {
- "version": "5.0.36",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.36.tgz",
- "integrity": "sha512-KEzSKuP2+3oOjYYjujue6Z3Yqis5HKA1BsIC+jZ1v3lrRNdsqyNNtX0rQf6LSuI4DJJ2z5UV//zBZCcvM0xikg==",
- "requires": {
- "@types/events": "*",
- "@types/minimatch": "*",
- "@types/node": "*"
- }
- },
- "@types/node": {
- "version": "8.10.59",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz",
- "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ=="
- },
- "configstore": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
- "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
- "requires": {
- "dot-prop": "^4.1.0",
- "graceful-fs": "^4.1.2",
- "make-dir": "^1.0.0",
- "unique-string": "^1.0.0",
- "write-file-atomic": "^2.0.0",
- "xdg-basedir": "^3.0.0"
- }
- },
- "crypto-random-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
- "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
- },
- "dot-prop": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
- "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
- "requires": {
- "is-obj": "^1.0.0"
- }
- },
- "is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
- },
- "make-dir": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
- "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "unique-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
- "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
- "requires": {
- "crypto-random-string": "^1.0.0"
- }
- },
- "write-file-atomic": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
- "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
- "requires": {
- "graceful-fs": "^4.1.11",
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
- }
- },
- "xdg-basedir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
- "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
- }
- }
- },
- "diffie-hellman": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
- "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
- "requires": {
- "bn.js": "^4.1.0",
- "miller-rabin": "^4.0.0",
- "randombytes": "^2.0.0"
- }
- },
- "dir-glob": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz",
- "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==",
- "requires": {
- "arrify": "^1.0.1",
- "path-type": "^3.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "dns-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
- "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
- },
- "dns-packet": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz",
- "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
- "requires": {
- "ip": "^1.1.0",
- "safe-buffer": "^5.0.1"
- }
- },
- "dns-txt": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
- "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
- "requires": {
- "buffer-indexof": "^1.0.0"
- }
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "dom-converter": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
- "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
- "requires": {
- "utila": "~0.4"
- }
- },
- "dom-helpers": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
- "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
- "requires": {
- "@babel/runtime": "^7.1.2"
- }
- },
- "dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
- "requires": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
- },
- "dependencies": {
- "domelementtype": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
- "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ=="
- }
- }
- },
- "dom-walk": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
- "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
- },
- "domain-browser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
- "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
- },
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
- },
- "domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
- "requires": {
- "domelementtype": "1"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- },
- "dot-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz",
- "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=",
- "requires": {
- "no-case": "^2.2.0"
- }
- },
- "dot-prop": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
- "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
- "requires": {
- "is-obj": "^2.0.0"
- }
- },
- "dotenv": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
- "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw=="
- },
- "duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E="
- },
- "duplexer3": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
- "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
- },
- "duplexify": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
- "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
- "requires": {
- "end-of-stream": "^1.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0",
- "stream-shift": "^1.0.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
- },
- "electron-to-chromium": {
- "version": "1.3.345",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz",
- "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg=="
- },
- "elliptic": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
- "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==",
- "requires": {
- "bn.js": "^4.4.0",
- "brorand": "^1.0.1",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
- }
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
- },
- "emojis-list": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
- "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
- },
- "encoding": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz",
- "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=",
- "requires": {
- "iconv-lite": "~0.4.13"
- }
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "requires": {
- "once": "^1.4.0"
- }
- },
- "engine.io": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.0.tgz",
- "integrity": "sha512-XCyYVWzcHnK5cMz7G4VTu2W7zJS7SM1QkcelghyIk/FmobWBtXE7fwhBusEKvCSqc3bMh8fNFMlUkCKTFRxH2w==",
- "requires": {
- "accepts": "~1.3.4",
- "base64id": "2.0.0",
- "cookie": "0.3.1",
- "debug": "~4.1.0",
- "engine.io-parser": "~2.2.0",
- "ws": "^7.1.2"
- },
- "dependencies": {
- "cookie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
- "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "engine.io-client": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.0.tgz",
- "integrity": "sha512-a4J5QO2k99CM2a0b12IznnyQndoEvtA4UAldhGzKqnHf42I3Qs2W5SPnDvatZRcMaNZs4IevVicBPayxYt6FwA==",
- "requires": {
- "component-emitter": "1.2.1",
- "component-inherit": "0.0.3",
- "debug": "~4.1.0",
- "engine.io-parser": "~2.2.0",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "ws": "~6.1.0",
- "xmlhttprequest-ssl": "~1.5.4",
- "yeast": "0.1.2"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "ws": {
- "version": "6.1.4",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz",
- "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==",
- "requires": {
- "async-limiter": "~1.0.0"
- }
- }
- }
- },
- "engine.io-parser": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz",
- "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==",
- "requires": {
- "after": "0.8.2",
- "arraybuffer.slice": "~0.0.7",
- "base64-arraybuffer": "0.1.5",
- "blob": "0.0.5",
- "has-binary2": "~1.0.2"
- }
- },
- "enhanced-resolve": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz",
- "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==",
- "requires": {
- "graceful-fs": "^4.1.2",
- "memory-fs": "^0.5.0",
- "tapable": "^1.0.0"
- },
- "dependencies": {
- "memory-fs": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
- "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
- "requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- }
- }
- },
- "entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
- "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw=="
- },
- "envinfo": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.0.tgz",
- "integrity": "sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ=="
- },
- "eol": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/eol/-/eol-0.9.1.tgz",
- "integrity": "sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg=="
- },
- "errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
- "requires": {
- "prr": "~1.0.1"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "error-stack-parser": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz",
- "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==",
- "requires": {
- "stackframe": "^1.1.1"
- }
- },
- "es-abstract": {
- "version": "1.17.4",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
- "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
- "requires": {
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1",
- "is-callable": "^1.1.5",
- "is-regex": "^1.0.5",
- "object-inspect": "^1.7.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.0",
- "string.prototype.trimleft": "^2.1.1",
- "string.prototype.trimright": "^2.1.1"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- }
- },
- "es6-promise": {
- "version": "4.2.8",
- "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
- "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
- },
- "es6-promisify": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.0.tgz",
- "integrity": "sha512-jCsk2fpfEFusVv1MDkF4Uf0hAzIKNDMgR6LyOIw6a3jwkN1sCgWzuwgnsHY9YSQ8n8P31HoncvE0LC44cpWTrw=="
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
- },
- "escaper": {
- "version": "2.5.3",
- "resolved": "https://registry.npmjs.org/escaper/-/escaper-2.5.3.tgz",
- "integrity": "sha512-QGb9sFxBVpbzMggrKTX0ry1oiI4CSDAl9vIL702hzl1jGW8VZs7qfqTRX7WDOjoNDoEVGcEtu1ZOQgReSfT2kQ=="
- },
- "eslint": {
- "version": "6.8.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz",
- "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "ajv": "^6.10.0",
- "chalk": "^2.1.0",
- "cross-spawn": "^6.0.5",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "eslint-scope": "^5.0.0",
- "eslint-utils": "^1.4.3",
- "eslint-visitor-keys": "^1.1.0",
- "espree": "^6.1.2",
- "esquery": "^1.0.1",
- "esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.0.0",
- "globals": "^12.1.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "inquirer": "^7.0.0",
- "is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
- "lodash": "^4.17.14",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "optionator": "^0.8.3",
- "progress": "^2.0.0",
- "regexpp": "^2.0.1",
- "semver": "^6.1.2",
- "strip-ansi": "^5.2.0",
- "strip-json-comments": "^3.0.1",
- "table": "^5.2.3",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "dependencies": {
- "ansi-escapes": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
- "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
- "requires": {
- "type-fest": "^0.11.0"
- },
- "dependencies": {
- "type-fest": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
- "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ=="
- }
- }
- },
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
- },
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "requires": {
- "restore-cursor": "^3.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "eslint-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
- "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "globals": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
- "requires": {
- "type-fest": "^0.8.1"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
- },
- "inquirer": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
- "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
- "requires": {
- "ansi-escapes": "^4.2.1",
- "chalk": "^3.0.0",
- "cli-cursor": "^3.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^3.0.0",
- "lodash": "^4.17.15",
- "mute-stream": "0.0.8",
- "run-async": "^2.4.0",
- "rxjs": "^6.5.3",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0",
- "through": "^2.3.6"
- },
- "dependencies": {
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
- },
- "mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
- },
- "onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
- "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw=="
- },
- "restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- }
- }
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "v8-compile-cache": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
- "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g=="
- }
- }
- },
- "eslint-config-react-app": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-5.2.1.tgz",
- "integrity": "sha512-pGIZ8t0mFLcV+6ZirRgYK6RVqUIKRIi9MmgzUEmrIknsn3AdO0I32asO86dJgloHq+9ZPl8UIg8mYrvgP5u2wQ==",
- "requires": {
- "confusing-browser-globals": "^1.0.9"
- }
- },
- "eslint-import-resolver-node": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz",
- "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==",
- "requires": {
- "debug": "^2.6.9",
- "resolve": "^1.13.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "eslint-loader": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/eslint-loader/-/eslint-loader-2.2.1.tgz",
- "integrity": "sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==",
- "requires": {
- "loader-fs-cache": "^1.0.0",
- "loader-utils": "^1.0.2",
- "object-assign": "^4.0.1",
- "object-hash": "^1.1.4",
- "rimraf": "^2.6.1"
- },
- "dependencies": {
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "eslint-module-utils": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
- "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
- "requires": {
- "debug": "^2.6.9",
- "pkg-dir": "^2.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- },
- "pkg-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
- "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
- "requires": {
- "find-up": "^2.1.0"
- }
- }
- }
- },
- "eslint-plugin-flowtype": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-3.13.0.tgz",
- "integrity": "sha512-bhewp36P+t7cEV0b6OdmoRWJCBYRiHFlqPZAG1oS3SF+Y0LQkeDvFSM4oxoxvczD1OdONCXMlJfQFiWLcV9urw==",
- "requires": {
- "lodash": "^4.17.15"
- }
- },
- "eslint-plugin-graphql": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-graphql/-/eslint-plugin-graphql-3.1.1.tgz",
- "integrity": "sha512-VNu2AipS8P1BAnE/tcJ2EmBWjFlCnG+1jKdUlFNDQjocWZlFiPpMu9xYNXePoEXK+q+jG51M/6PdhOjEgJZEaQ==",
- "requires": {
- "graphql-config": "^2.0.1",
- "lodash": "^4.11.1"
- }
- },
- "eslint-plugin-import": {
- "version": "2.20.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz",
- "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==",
- "requires": {
- "array-includes": "^3.0.3",
- "array.prototype.flat": "^1.2.1",
- "contains-path": "^0.1.0",
- "debug": "^2.6.9",
- "doctrine": "1.5.0",
- "eslint-import-resolver-node": "^0.3.2",
- "eslint-module-utils": "^2.4.1",
- "has": "^1.0.3",
- "minimatch": "^3.0.4",
- "object.values": "^1.1.0",
- "read-pkg-up": "^2.0.0",
- "resolve": "^1.12.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "doctrine": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
- "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
- "requires": {
- "esutils": "^2.0.2",
- "isarray": "^1.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "eslint-plugin-jsx-a11y": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz",
- "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==",
- "requires": {
- "@babel/runtime": "^7.4.5",
- "aria-query": "^3.0.0",
- "array-includes": "^3.0.3",
- "ast-types-flow": "^0.0.7",
- "axobject-query": "^2.0.2",
- "damerau-levenshtein": "^1.0.4",
- "emoji-regex": "^7.0.2",
- "has": "^1.0.3",
- "jsx-ast-utils": "^2.2.1"
- }
- },
- "eslint-plugin-react": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz",
- "integrity": "sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==",
- "requires": {
- "array-includes": "^3.1.1",
- "doctrine": "^2.1.0",
- "has": "^1.0.3",
- "jsx-ast-utils": "^2.2.3",
- "object.entries": "^1.1.1",
- "object.fromentries": "^2.0.2",
- "object.values": "^1.1.1",
- "prop-types": "^15.7.2",
- "resolve": "^1.15.1",
- "semver": "^6.3.0",
- "string.prototype.matchall": "^4.0.2",
- "xregexp": "^4.3.0"
- },
- "dependencies": {
- "doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "eslint-plugin-react-hooks": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
- "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA=="
- },
- "eslint-scope": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz",
- "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==",
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz",
- "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==",
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
- "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A=="
- },
- "espree": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
- "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
- "requires": {
- "acorn": "^7.1.1",
- "acorn-jsx": "^5.2.0",
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
- },
- "esquery": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.2.0.tgz",
- "integrity": "sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q==",
- "requires": {
- "estraverse": "^5.0.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.0.0.tgz",
- "integrity": "sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A=="
- }
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "requires": {
- "estraverse": "^4.1.0"
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
- },
- "estree-walker": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
- "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w=="
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
- },
- "eval": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.4.tgz",
- "integrity": "sha512-npGsebJejyjMRnLdFu+T/97dnigqIU0Ov3IGrZ8ygd1v7RL1vGkEKtvyWZobqUH1AQgKlg0Yqqe2BtMA9/QZLw==",
- "requires": {
- "require-like": ">= 0.1.1"
- }
- },
- "event-source-polyfill": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.12.tgz",
- "integrity": "sha512-WjOTn0LIbaN08z/8gNt3GYAomAdm6cZ2lr/QdvhTTEipr5KR6lds2ziUH+p/Iob4Lk6NClKhwPOmn1NjQEcJCg=="
- },
- "eventemitter3": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz",
- "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg=="
- },
- "events": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
- "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg=="
- },
- "eventsource": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz",
- "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
- "requires": {
- "original": "^1.0.0"
- }
- },
- "evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "requires": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "execa": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz",
- "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==",
- "requires": {
- "cross-spawn": "^7.0.0",
- "get-stream": "^5.0.0",
- "human-signals": "^1.1.1",
- "is-stream": "^2.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^4.0.0",
- "onetime": "^5.1.0",
- "p-finally": "^2.0.0",
- "signal-exit": "^3.0.2",
- "strip-final-newline": "^2.0.0"
- },
- "dependencies": {
- "cross-spawn": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
- "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
- "requires": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- }
- },
- "get-stream": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz",
- "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==",
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "is-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
- "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
- },
- "npm-run-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
- "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
- "requires": {
- "path-key": "^3.0.0"
- }
- },
- "onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "p-finally": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz",
- "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw=="
- },
- "path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
- },
- "shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "requires": {
- "shebang-regex": "^3.0.0"
- }
- },
- "shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
- },
- "which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "requires": {
- "isexe": "^2.0.0"
- }
- }
- }
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "expand-tilde": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
- "requires": {
- "homedir-polyfill": "^1.0.1"
- }
- },
- "express": {
- "version": "4.17.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
- "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
- "requires": {
- "accepts": "~1.3.7",
- "array-flatten": "1.1.1",
- "body-parser": "1.19.0",
- "content-disposition": "0.5.3",
- "content-type": "~1.0.4",
- "cookie": "0.4.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "~1.1.2",
- "fresh": "0.5.2",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.5",
- "qs": "6.7.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.1.2",
- "send": "0.17.1",
- "serve-static": "1.14.1",
- "setprototypeof": "1.1.1",
- "statuses": "~1.5.0",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "express-graphql": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/express-graphql/-/express-graphql-0.9.0.tgz",
- "integrity": "sha512-wccd9Lb6oeJ8yHpUs/8LcnGjFUUQYmOG9A5BNLybRdCzGw0PeUrtBxsIR8bfiur6uSW4OvPkVDoYH06z6/N9+w==",
- "requires": {
- "accepts": "^1.3.7",
- "content-type": "^1.0.4",
- "http-errors": "^1.7.3",
- "raw-body": "^2.4.1"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
- },
- "http-errors": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
- "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- }
- },
- "raw-body": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.1.tgz",
- "integrity": "sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==",
- "requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.3",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- }
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "extract-files": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/extract-files/-/extract-files-7.0.0.tgz",
- "integrity": "sha512-3AUlT7TD+DbQXNe3t70QrgJU6Wgcp7rk1Zm0vqWz8OYnw4vxihgG0TgZ2SIGrVqScc4WfOu7B4a0BezGJ0YqvQ=="
- },
- "extract-zip": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
- "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
- "requires": {
- "concat-stream": "^1.6.2",
- "debug": "^2.6.9",
- "mkdirp": "^0.5.4",
- "yauzl": "^2.10.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
- },
- "fast-deep-equal": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
- "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
- },
- "fast-glob": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
- "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
- "requires": {
- "@mrmlnc/readdir-enhanced": "^2.2.1",
- "@nodelib/fs.stat": "^1.1.2",
- "glob-parent": "^3.1.0",
- "is-glob": "^4.0.0",
- "merge2": "^1.2.3",
- "micromatch": "^3.1.10"
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
- },
- "fastest-stable-stringify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/fastest-stable-stringify/-/fastest-stable-stringify-1.0.1.tgz",
- "integrity": "sha1-kSLUBtTJ2YvqZEpraFPVh0uHsCg="
- },
- "fastparse": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
- "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ=="
- },
- "fastq": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz",
- "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==",
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "faye-websocket": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
- "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- },
- "fbjs": {
- "version": "0.8.17",
- "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz",
- "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=",
- "requires": {
- "core-js": "^1.0.0",
- "isomorphic-fetch": "^2.1.1",
- "loose-envify": "^1.0.0",
- "object-assign": "^4.1.0",
- "promise": "^7.1.1",
- "setimmediate": "^1.0.5",
- "ua-parser-js": "^0.7.18"
- },
- "dependencies": {
- "core-js": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
- "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY="
- }
- }
- },
- "fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
- "requires": {
- "pend": "~1.2.0"
- }
- },
- "figgy-pudding": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
- "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
- },
- "figures": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
- "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
- "requires": {
- "flat-cache": "^2.0.1"
- }
- },
- "file-loader": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
- "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==",
- "requires": {
- "loader-utils": "^1.0.2",
- "schema-utils": "^0.4.5"
- },
- "dependencies": {
- "schema-utils": {
- "version": "0.4.7",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
- "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "file-type": {
- "version": "12.4.2",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz",
- "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg=="
- },
- "file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
- "optional": true
- },
- "filesize": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
- "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg=="
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
- "requires": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
- }
- },
- "find-root": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
- },
- "find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "requires": {
- "locate-path": "^3.0.0"
- }
- },
- "flat": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
- "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
- "requires": {
- "is-buffer": "~2.0.3"
- },
- "dependencies": {
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
- }
- }
- },
- "flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
- "requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
- },
- "dependencies": {
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA=="
- },
- "flush-write-stream": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
- "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
- "requires": {
- "inherits": "^2.0.3",
- "readable-stream": "^2.3.6"
- }
- },
- "follow-redirects": {
- "version": "1.5.10",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
- "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
- "requires": {
- "debug": "=3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
- },
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "requires": {
- "for-in": "^1.0.1"
- }
- },
- "foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
- },
- "fork-ts-checker-webpack-plugin": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-1.5.0.tgz",
- "integrity": "sha512-zEhg7Hz+KhZlBhILYpXy+Beu96gwvkROWJiTXOCyOOMMrdBIRPvsBpBqgTI4jfJGrJXcqGwJR8zsBGDmzY0jsA==",
- "requires": {
- "babel-code-frame": "^6.22.0",
- "chalk": "^2.4.1",
- "chokidar": "^2.0.4",
- "micromatch": "^3.1.10",
- "minimatch": "^3.0.4",
- "semver": "^5.6.0",
- "tapable": "^1.0.0",
- "worker-rpc": "^0.1.0"
- },
- "dependencies": {
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- }
- }
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "forwarded": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
- "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
- },
- "from2": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
- "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0"
- }
- },
- "fs-exists-cached": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-exists-cached/-/fs-exists-cached-1.0.0.tgz",
- "integrity": "sha1-zyVVTKBQ3EmuZla0HeQiWJidy84="
- },
- "fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fs-write-stream-atomic": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
- "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "iferr": "^0.1.5",
- "imurmurhash": "^0.1.4",
- "readable-stream": "1 || 2"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "1.2.12",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz",
- "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==",
- "optional": true,
- "requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1",
- "node-pre-gyp": "*"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "optional": true
- },
- "aproba": {
- "version": "1.2.0",
- "bundled": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "bundled": true,
- "optional": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "chownr": {
- "version": "1.1.4",
- "bundled": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "optional": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "optional": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "debug": {
- "version": "3.2.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "bundled": true,
- "optional": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.3",
- "bundled": true,
- "optional": true
- },
- "fs-minipass": {
- "version": "1.2.7",
- "bundled": true,
- "optional": true,
- "requires": {
- "minipass": "^2.6.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "iconv-lite": {
- "version": "0.4.24",
- "bundled": true,
- "optional": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ignore-walk": {
- "version": "3.0.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "minimatch": "^3.0.4"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "optional": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "bundled": true,
- "optional": true
- },
- "ini": {
- "version": "1.3.5",
- "bundled": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "optional": true
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "optional": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "bundled": true,
- "optional": true
- },
- "minipass": {
- "version": "2.9.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.3.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "minipass": "^2.9.0"
- }
- },
- "mkdirp": {
- "version": "0.5.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "ms": {
- "version": "2.1.2",
- "bundled": true,
- "optional": true
- },
- "needle": {
- "version": "2.3.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "debug": "^3.2.6",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- }
- },
- "node-pre-gyp": {
- "version": "0.14.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4.4.2"
- }
- },
- "nopt": {
- "version": "4.0.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "npm-bundled": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npm-normalize-package-bin": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "npm-packlist": {
- "version": "1.4.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1",
- "npm-normalize-package-bin": "^1.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "optional": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.5",
- "bundled": true,
- "optional": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.8",
- "bundled": true,
- "optional": true,
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "bundled": true,
- "optional": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "bundled": true,
- "optional": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "bundled": true,
- "optional": true
- },
- "sax": {
- "version": "1.2.4",
- "bundled": true,
- "optional": true
- },
- "semver": {
- "version": "5.7.1",
- "bundled": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "optional": true
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "optional": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "optional": true
- },
- "tar": {
- "version": "4.4.13",
- "bundled": true,
- "optional": true,
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.8.6",
- "minizlib": "^1.2.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.3"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "wide-align": {
- "version": "1.1.3",
- "bundled": true,
- "optional": true,
- "requires": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "optional": true
- },
- "yallist": {
- "version": "3.1.1",
- "bundled": true,
- "optional": true
- }
- }
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
- },
- "fwd-stream": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz",
- "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=",
- "requires": {
- "readable-stream": "~1.0.26-4"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "gatsby": {
- "version": "2.19.41",
- "resolved": "https://registry.npmjs.org/gatsby/-/gatsby-2.19.41.tgz",
- "integrity": "sha512-vFEY8wXDafHM21xoDiI6ppktpnCKJSAOsZYj1vjko/mJgTm3Y6E50xlt7GU3UtLN5b8OE3KDHzBnnj2OQ18C4g==",
- "requires": {
- "@babel/code-frame": "^7.5.5",
- "@babel/core": "^7.7.5",
- "@babel/parser": "^7.7.5",
- "@babel/polyfill": "^7.7.0",
- "@babel/runtime": "^7.7.6",
- "@babel/traverse": "^7.7.4",
- "@hapi/joi": "^15.1.1",
- "@mikaelkristiansson/domready": "^1.0.10",
- "@pieh/friendly-errors-webpack-plugin": "1.7.0-chalk-2",
- "@pmmmwh/react-refresh-webpack-plugin": "^0.2.0",
- "@reach/router": "^1.3.1",
- "@typescript-eslint/eslint-plugin": "^2.11.0",
- "@typescript-eslint/parser": "^2.11.0",
- "address": "1.1.2",
- "autoprefixer": "^9.7.3",
- "axios": "^0.19.0",
- "babel-core": "7.0.0-bridge.0",
- "babel-eslint": "^10.0.3",
- "babel-loader": "^8.0.6",
- "babel-plugin-add-module-exports": "^0.3.3",
- "babel-plugin-dynamic-import-node": "^2.3.0",
- "babel-plugin-remove-graphql-queries": "^2.7.24",
- "babel-preset-gatsby": "^0.2.35",
- "better-opn": "1.0.0",
- "better-queue": "^3.8.10",
- "bluebird": "^3.7.2",
- "browserslist": "^4.9.1",
- "cache-manager": "^2.10.1",
- "cache-manager-fs-hash": "^0.0.7",
- "chalk": "^2.4.2",
- "chokidar": "3.3.0",
- "common-tags": "^1.8.0",
- "compression": "^1.7.4",
- "convert-hrtime": "^3.0.0",
- "copyfiles": "^2.1.1",
- "core-js": "^2.6.11",
- "cors": "^2.8.5",
- "css-loader": "^1.0.1",
- "date-fns": "^2.10.0",
- "debug": "^3.2.6",
- "del": "^5.1.0",
- "detect-port": "^1.3.0",
- "devcert": "^1.0.2",
- "dotenv": "^8.2.0",
- "eslint": "^6.7.2",
- "eslint-config-react-app": "^5.1.0",
- "eslint-loader": "^2.2.1",
- "eslint-plugin-flowtype": "^3.13.0",
- "eslint-plugin-graphql": "^3.1.0",
- "eslint-plugin-import": "^2.19.1",
- "eslint-plugin-jsx-a11y": "^6.2.3",
- "eslint-plugin-react": "^7.17.0",
- "eslint-plugin-react-hooks": "^1.7.0",
- "event-source-polyfill": "^1.0.11",
- "express": "^4.17.1",
- "express-graphql": "^0.9.0",
- "fast-levenshtein": "^2.0.6",
- "file-loader": "^1.1.11",
- "flat": "^4.1.0",
- "fs-exists-cached": "1.0.0",
- "fs-extra": "^8.1.0",
- "gatsby-cli": "^2.10.9",
- "gatsby-core-utils": "^1.0.33",
- "gatsby-graphiql-explorer": "^0.2.35",
- "gatsby-link": "^2.2.30",
- "gatsby-plugin-page-creator": "^2.1.45",
- "gatsby-react-router-scroll": "^2.1.23",
- "gatsby-telemetry": "^1.1.55",
- "glob": "^7.1.6",
- "got": "8.3.2",
- "graphql": "^14.5.8",
- "graphql-compose": "^6.3.7",
- "graphql-playground-middleware-express": "^1.7.12",
- "hasha": "^5.1.0",
- "invariant": "^2.2.4",
- "is-relative": "^1.0.0",
- "is-relative-url": "^3.0.0",
- "is-wsl": "^2.1.1",
- "jest-worker": "^24.9.0",
- "json-loader": "^0.5.7",
- "json-stringify-safe": "^5.0.1",
- "latest-version": "5.1.0",
- "lodash": "^4.17.15",
- "lokijs": "^1.5.8",
- "md5": "^2.2.1",
- "md5-file": "^3.2.3",
- "micromatch": "^3.1.10",
- "mime": "^2.4.4",
- "mini-css-extract-plugin": "^0.8.0",
- "mitt": "^1.2.0",
- "mkdirp": "^0.5.1",
- "moment": "^2.24.0",
- "name-all-modules-plugin": "^1.0.1",
- "normalize-path": "^2.1.1",
- "null-loader": "^0.1.1",
- "opentracing": "^0.14.4",
- "optimize-css-assets-webpack-plugin": "^5.0.3",
- "p-defer": "^3.0.0",
- "parseurl": "^1.3.3",
- "physical-cpu-count": "^2.0.0",
- "pnp-webpack-plugin": "^1.5.0",
- "postcss-flexbugs-fixes": "^4.2.0",
- "postcss-loader": "^3.0.0",
- "prompts": "^2.3.0",
- "prop-types": "^15.7.2",
- "raw-loader": "^0.5.1",
- "react-dev-utils": "^4.2.3",
- "react-error-overlay": "^3.0.0",
- "react-hot-loader": "^4.12.18",
- "react-refresh": "^0.7.0",
- "redux": "^4.0.4",
- "redux-thunk": "^2.3.0",
- "semver": "^5.7.1",
- "shallow-compare": "^1.2.2",
- "sift": "^5.1.0",
- "signal-exit": "^3.0.2",
- "slugify": "^1.3.6",
- "socket.io": "^2.3.0",
- "stack-trace": "^0.0.10",
- "string-similarity": "^1.2.2",
- "style-loader": "^0.23.1",
- "terser-webpack-plugin": "^1.4.2",
- "true-case-path": "^2.2.1",
- "type-of": "^2.0.1",
- "url-loader": "^1.1.2",
- "util.promisify": "^1.0.0",
- "uuid": "^3.3.3",
- "v8-compile-cache": "^1.1.2",
- "webpack": "~4.41.2",
- "webpack-dev-middleware": "^3.7.2",
- "webpack-dev-server": "^3.9.0",
- "webpack-hot-middleware": "^2.25.0",
- "webpack-merge": "^4.2.2",
- "webpack-stats-plugin": "^0.3.0",
- "xstate": "^4.7.2",
- "yaml-loader": "^0.5.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "cliui": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
- "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
- "requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "gatsby-cli": {
- "version": "2.11.5",
- "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-2.11.5.tgz",
- "integrity": "sha512-yAvyplWx19dU5gYdWJETEMywbNTtL9HntlR65cHhznKiwrr6Jyao+TsE50CmgZ/8Vv2JMF3UZFd3vFRXb+aK7w==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/runtime": "^7.8.7",
- "@hapi/joi": "^15.1.1",
- "better-opn": "^1.0.0",
- "bluebird": "^3.7.2",
- "chalk": "^2.4.2",
- "clipboardy": "^2.2.0",
- "common-tags": "^1.8.0",
- "configstore": "^5.0.1",
- "convert-hrtime": "^3.0.0",
- "core-js": "^2.6.11",
- "envinfo": "^7.5.0",
- "execa": "^3.4.0",
- "fs-exists-cached": "^1.0.0",
- "fs-extra": "^8.1.0",
- "gatsby-core-utils": "^1.1.1",
- "gatsby-telemetry": "^1.2.3",
- "hosted-git-info": "^3.0.4",
- "ink": "^2.7.1",
- "ink-spinner": "^3.0.1",
- "is-valid-path": "^0.1.1",
- "lodash": "^4.17.15",
- "meant": "^1.0.1",
- "node-fetch": "^2.6.0",
- "object.entries": "^1.1.1",
- "opentracing": "^0.14.4",
- "pretty-error": "^2.1.1",
- "progress": "^2.0.3",
- "prompts": "^2.3.1",
- "react": "^16.8.0",
- "redux": "^4.0.5",
- "resolve-cwd": "^2.0.0",
- "semver": "^6.3.0",
- "signal-exit": "^3.0.2",
- "source-map": "0.7.3",
- "stack-trace": "^0.0.10",
- "strip-ansi": "^5.2.0",
- "update-notifier": "^3.0.1",
- "uuid": "3.4.0",
- "yargs": "^12.0.5",
- "yurnalist": "^1.1.2"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
- },
- "hosted-git-info": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz",
- "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==",
- "requires": {
- "lru-cache": "^5.1.1"
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "node-fetch": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
- "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
- },
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- },
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- }
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
- },
- "yargs": {
- "version": "12.0.5",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
- "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^3.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1 || ^4.0.0",
- "yargs-parser": "^11.1.1"
- }
- },
- "yargs-parser": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
- "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
- "gatsby-core-utils": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz",
- "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==",
- "requires": {
- "ci-info": "2.0.0",
- "configstore": "^5.0.1",
- "node-object-hash": "^2.0.0"
- }
- },
- "gatsby-graphiql-explorer": {
- "version": "0.2.37",
- "resolved": "https://registry.npmjs.org/gatsby-graphiql-explorer/-/gatsby-graphiql-explorer-0.2.37.tgz",
- "integrity": "sha512-dWfNA/CDjKO86DZLgxhYFSmK7DTCxwGvKm0HeMBYxcSyLP/WFAOoJjV2DCE2gMge28Sqmsz8ueOMZXM2YH8rIA==",
- "requires": {
- "@babel/runtime": "^7.8.7"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "gatsby-link": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-2.3.2.tgz",
- "integrity": "sha512-A4aC6EEux/zumpgWnMlqcLhDq80uwzuCVrYfPVBxs/fFifVzzrMIvsPFhqw5w3l5DHC3XkxP4Y3TZq+EhypJhA==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "@types/reach__router": "^1.3.3",
- "prop-types": "^15.7.2"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "gatsby-page-utils": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-0.1.1.tgz",
- "integrity": "sha512-g4ETSZM7wlMycHPKwQ7QqxkqnwbXCgwg2Sqh2DyCsd5qwtPm6RrQht3cnbsKAeuo7gWsbqzv088YGa3krrIREw==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "bluebird": "^3.7.2",
- "chokidar": "3.3.1",
- "fs-exists-cached": "^1.0.0",
- "gatsby-core-utils": "^1.1.1",
- "glob": "^7.1.6",
- "lodash": "^4.17.15",
- "micromatch": "^3.1.10"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "binary-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
- "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow=="
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "chokidar": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
- "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.1.2",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.3.0"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "fsevents": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
- "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
- "optional": true
- },
- "glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- },
- "readdirp": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
- "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
- "requires": {
- "picomatch": "^2.0.7"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "requires": {
- "is-number": "^7.0.0"
- }
- }
- }
- },
- "gatsby-plugin-emotion": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-emotion/-/gatsby-plugin-emotion-4.2.1.tgz",
- "integrity": "sha512-ygXxkpnWJdDOAgb1XA9TbVCRLkaAYTFLTsqVQXMBhnrknb5iPNO+MP0fZ5LRqWgBALyJ629nxs0efUpnT/RSWw==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "@emotion/babel-preset-css-prop": "^10.0.27"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "gatsby-plugin-gtag": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-gtag/-/gatsby-plugin-gtag-1.0.13.tgz",
- "integrity": "sha512-Oul6O67klajrEjkkF1diD228SmyUWsAwTq/1tYq41vBwmyNiPk4dhk8K93rrNQ5d5zesSv+awBeGBa503tQqGw=="
- },
- "gatsby-plugin-less": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-less/-/gatsby-plugin-less-3.1.1.tgz",
- "integrity": "sha512-H0LQXy2DpwD1UW3bEuE8RHk2yNfOcZGFjzYH9URPUAzxuOo6bhPyNxKJ8tLcvarqwYiJIWFFivDMv0IqgBJ16Q==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "less-loader": "^5.0.0"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "gatsby-plugin-mdx": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-mdx/-/gatsby-plugin-mdx-1.1.4.tgz",
- "integrity": "sha512-id2/LALN7eseTGN05v1n16XCYggrl2UTzWOJOQME9rh25jNK+KT5ywaPY6vNYimeAW7wWdad3rl6hORpv4L6yw==",
- "requires": {
- "@babel/core": "^7.8.7",
- "@babel/generator": "^7.8.8",
- "@babel/helper-plugin-utils": "^7.8.3",
- "@babel/plugin-proposal-object-rest-spread": "^7.8.3",
- "@babel/preset-env": "^7.8.7",
- "@babel/preset-react": "^7.8.3",
- "@babel/types": "^7.8.7",
- "camelcase-css": "^2.0.1",
- "change-case": "^3.1.0",
- "core-js": "2",
- "dataloader": "^1.4.0",
- "debug": "^4.1.1",
- "escape-string-regexp": "^1.0.5",
- "eval": "^0.1.4",
- "fs-extra": "^8.1.0",
- "gatsby-core-utils": "^1.1.1",
- "gray-matter": "^4.0.2",
- "json5": "^2.1.2",
- "loader-utils": "^1.4.0",
- "lodash": "^4.17.15",
- "mdast-util-to-string": "^1.1.0",
- "mdast-util-toc": "^3.1.0",
- "mime": "^2.4.4",
- "p-queue": "^5.0.0",
- "pretty-bytes": "^5.3.0",
- "remark": "^10.0.1",
- "remark-retext": "^3.1.3",
- "retext-english": "^3.0.4",
- "static-site-generator-webpack-plugin": "^3.4.2",
- "style-to-object": "^0.3.0",
- "underscore.string": "^3.3.5",
- "unified": "^8.4.2",
- "unist-util-map": "^1.0.5",
- "unist-util-remove": "^1.0.3",
- "unist-util-visit": "^1.4.1"
- },
- "dependencies": {
- "@babel/core": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz",
- "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.0",
- "@babel/helper-module-transforms": "^7.9.0",
- "@babel/helpers": "^7.9.0",
- "@babel/parser": "^7.9.0",
- "@babel/template": "^7.8.6",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.1",
- "json5": "^2.1.2",
- "lodash": "^4.17.13",
- "resolve": "^1.3.2",
- "semver": "^5.4.1",
- "source-map": "^0.5.0"
- }
- },
- "@babel/generator": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz",
- "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==",
- "requires": {
- "@babel/types": "^7.9.0",
- "jsesc": "^2.5.1",
- "lodash": "^4.17.13",
- "source-map": "^0.5.0"
- }
- },
- "@babel/helpers": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
- "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
- "requires": {
- "@babel/template": "^7.8.3",
- "@babel/traverse": "^7.9.0",
- "@babel/types": "^7.9.0"
- }
- },
- "@babel/parser": {
- "version": "7.9.4",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
- "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA=="
- },
- "@babel/template": {
- "version": "7.8.6",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
- "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/parser": "^7.8.6",
- "@babel/types": "^7.8.6"
- }
- },
- "@babel/traverse": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz",
- "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/generator": "^7.9.0",
- "@babel/helper-function-name": "^7.8.3",
- "@babel/helper-split-export-declaration": "^7.8.3",
- "@babel/parser": "^7.9.0",
- "@babel/types": "^7.9.0",
- "debug": "^4.1.0",
- "globals": "^11.1.0",
- "lodash": "^4.17.13"
- }
- },
- "@babel/types": {
- "version": "7.9.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz",
- "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==",
- "requires": {
- "@babel/helper-validator-identifier": "^7.9.0",
- "lodash": "^4.17.13",
- "to-fast-properties": "^2.0.0"
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
- },
- "gatsby-core-utils": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz",
- "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==",
- "requires": {
- "ci-info": "2.0.0",
- "configstore": "^5.0.1",
- "node-object-hash": "^2.0.0"
- }
- },
- "json5": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz",
- "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==",
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "loader-utils": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
- "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
- },
- "dependencies": {
- "json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
- "requires": {
- "minimist": "^1.2.0"
- }
- }
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
- },
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "gatsby-plugin-page-creator": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-2.2.1.tgz",
- "integrity": "sha512-RRlk7FUScyEj1S6PlGpdj/lrJmps+rl7sQNauOBCIGt3Sod5alin0l8aQJa/ldpI6DIPbp4PWIpqkPsWxED/LA==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "bluebird": "^3.7.2",
- "fs-exists-cached": "^1.0.0",
- "gatsby-page-utils": "^0.1.1",
- "glob": "^7.1.6",
- "lodash": "^4.17.15",
- "micromatch": "^3.1.10"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "gatsby-plugin-printer": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-printer/-/gatsby-plugin-printer-1.0.8.tgz",
- "integrity": "sha512-a9V1sFQxIrFx47jQJdMkRmTd6jJj3cs+YT1mfuctkmTjBvKU7+L4b3XVqkr0fyljGsAZg/Ztdgud0ccmux4rgQ==",
- "requires": {
- "@sindresorhus/slugify": "^0.9.1",
- "babel-plugin-preval": "^3.0.1",
- "fs-extra": "^8.1.0",
- "puppeteer": "^1.19.0",
- "rollup": "1.23.1",
- "rollup-plugin-babel": "^4.3.3",
- "rollup-plugin-commonjs": "^10.0.1",
- "rollup-plugin-node-builtins": "^2.1.2",
- "rollup-plugin-node-globals": "^1.4.0",
- "rollup-plugin-node-resolve": "^5.2.0",
- "rollup-plugin-replace": "^2.2.0"
- }
- },
- "gatsby-plugin-react-helmet": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-react-helmet/-/gatsby-plugin-react-helmet-3.2.1.tgz",
- "integrity": "sha512-5oarZdVvp3k3keG26eVFagVHLYw7wCGs/MXRYQg8MEyJewU3X4Uc0eo7qu4TM5EIuZ2ekaL14r86RB6RM5TORA==",
- "requires": {
- "@babel/runtime": "^7.8.7"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- }
- }
- },
- "gatsby-plugin-segment-js": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-segment-js/-/gatsby-plugin-segment-js-3.1.0.tgz",
- "integrity": "sha512-oBcIY+riNehfyQXp8PEGVQTz/VPt/+k2aXCh/bNZSR4HhjEAXafcSCReS2xzs/3IJRa3gH0+NOZvRU8peXDb/w=="
- },
- "gatsby-plugin-svgr": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/gatsby-plugin-svgr/-/gatsby-plugin-svgr-2.0.2.tgz",
- "integrity": "sha512-54REIMe79qFBAwpcnWHBkvEE9CKoEVkefF9rDXai0k642r91SZ4UeWFuAmsegPG+sPVub7tHfHu/2LVXK1I9kg=="
- },
- "gatsby-react-router-scroll": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/gatsby-react-router-scroll/-/gatsby-react-router-scroll-2.2.1.tgz",
- "integrity": "sha512-mkaG6NNIbWPNiU8Wj3aawUQa7AqI42Skrnh0VCLUCSDvUgCjOJOZfxM0FVPA/masNiVsCprq3a6xz7fmW93jgQ==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "scroll-behavior": "^0.9.12",
- "warning": "^3.0.0"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "warning": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
- "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- }
- }
- },
- "gatsby-remark-autolink-headers": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/gatsby-remark-autolink-headers/-/gatsby-remark-autolink-headers-2.2.1.tgz",
- "integrity": "sha512-FqTq9rh9fRxdlX1V3InXSAoZQyBcZ3mI5zNiNagO+DRNZCSve3YVKTDmMZ7a7GXx5Bz7QTPBB993wk2OcRSIFg==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "github-slugger": "^1.3.0",
- "lodash": "^4.17.15",
- "mdast-util-to-string": "^1.1.0",
- "unist-util-visit": "^1.4.1"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "gatsby-remark-check-links": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/gatsby-remark-check-links/-/gatsby-remark-check-links-2.1.0.tgz",
- "integrity": "sha512-TbhT8oVlAgJfxe0WUQWDOb0kLkMUYo1N4AfFstejClPWO4OjRlznt3IMW3weQkwuweiovF5cxVpQcFrkCGVFBw==",
- "requires": {
- "unist-util-visit": "^1.4.1"
- },
- "dependencies": {
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "gatsby-remark-code-titles": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/gatsby-remark-code-titles/-/gatsby-remark-code-titles-1.1.0.tgz",
- "integrity": "sha512-RuNqziXi99eBIj5NJP0TgdzAxzWFL+ArGRb3961Ff9Tto/nCvmyqR1qySaWKXtkOgeqoVUlqAFNUCyEAyNuc8w==",
- "requires": {
- "query-string": "~6.0.0",
- "unist-util-visit": "~1.3.0"
- },
- "dependencies": {
- "query-string": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.0.0.tgz",
- "integrity": "sha1-i485RHtz6CkNb141gXeSGOkXEUI=",
- "requires": {
- "decode-uri-component": "^0.2.0",
- "strict-uri-encode": "^2.0.0"
- }
- },
- "strict-uri-encode": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
- "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY="
- },
- "unist-util-is": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz",
- "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA=="
- },
- "unist-util-visit": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.1.tgz",
- "integrity": "sha512-0fdB9EQJU0tho5tK0VzOJzAQpPv2LyLZ030b10GxuzAWEfvd54mpY7BMjQ1L69k2YNvL+SvxRzH0yUIehOO8aA==",
- "requires": {
- "unist-util-is": "^2.1.1"
- }
- }
- }
- },
- "gatsby-remark-copy-linked-files": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/gatsby-remark-copy-linked-files/-/gatsby-remark-copy-linked-files-2.2.1.tgz",
- "integrity": "sha512-xTy52n0K+fF4aXCNYkpH1HdhYy47GwLG2tE5H+xIisyEQiCr5XA555yQdS0U4MRtDZEyfX4TB+XTwaNhOgTPgw==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "cheerio": "^1.0.0-rc.3",
- "fs-extra": "^8.1.0",
- "is-relative-url": "^3.0.0",
- "lodash": "^4.17.15",
- "path-is-inside": "^1.0.2",
- "probe-image-size": "^4.1.1",
- "unist-util-visit": "^1.4.1"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "cheerio": {
- "version": "1.0.0-rc.3",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
- "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==",
- "requires": {
- "css-select": "~1.2.0",
- "dom-serializer": "~0.1.1",
- "entities": "~1.1.1",
- "htmlparser2": "^3.9.1",
- "lodash": "^4.15.0",
- "parse5": "^3.0.1"
- }
- },
- "dom-serializer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
- "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
- "requires": {
- "domelementtype": "^1.3.0",
- "entities": "^1.1.1"
- }
- },
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
- },
- "parse5": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
- "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
- "requires": {
- "@types/node": "*"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "gatsby-remark-mermaid": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gatsby-remark-mermaid/-/gatsby-remark-mermaid-1.2.0.tgz",
- "integrity": "sha512-Er1Ck802dVP3/XYdRxZs3T6Kwi6fzwzDAKkxayzEhC+BrVWLmEKpANkEcdaKDhG3Cx54sWPrFpchitn/E0K5/Q==",
- "requires": {
- "mermaid": "^8.0.0",
- "puppeteer": "^1.12.2",
- "unist-util-visit": "^1.4.0"
- },
- "dependencies": {
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "gatsby-remark-prismjs": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/gatsby-remark-prismjs/-/gatsby-remark-prismjs-3.4.1.tgz",
- "integrity": "sha512-DPg4PjalrElXXZ3KZRiWiJiHIsXaee51nN2hCoGC2hfaXW8VdSjXhpBSSps9OWuB+QNmdTp/EP3FDiiwImjpUw==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "parse-numeric-range": "^0.0.2",
- "unist-util-visit": "^1.4.1"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "gatsby-remark-rewrite-relative-links": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/gatsby-remark-rewrite-relative-links/-/gatsby-remark-rewrite-relative-links-1.0.8.tgz",
- "integrity": "sha512-7jCyMM+AWdp8mFLUWuJ5RGPQIKFzpLqf253QR6Aq8xrhlV0Bcz2k1+03MxPnGP0R5XetIoRm2W864KrbIZdk9Q==",
- "requires": {
- "unist-util-visit": "^2.0.0"
- }
- },
- "gatsby-source-filesystem": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-2.2.2.tgz",
- "integrity": "sha512-uHHCiTp8/q9JF0Yr14Q5aJZ07jUJSV6HJSnrSVnEIF4PfRQkVJG5FHQULmxJUXWQhIoy17EGuzqVjxMsFY69QA==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "better-queue": "^3.8.10",
- "bluebird": "^3.7.2",
- "chokidar": "3.3.1",
- "file-type": "^12.4.2",
- "fs-extra": "^8.1.0",
- "gatsby-core-utils": "^1.1.1",
- "got": "^9.6.0",
- "md5-file": "^3.2.3",
- "mime": "^2.4.4",
- "pretty-bytes": "^5.3.0",
- "progress": "^2.0.3",
- "read-chunk": "^3.2.0",
- "valid-url": "^1.0.9",
- "xstate": "^4.8.0"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "binary-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
- "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow=="
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "chokidar": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
- "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.1.2",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.3.0"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "fsevents": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
- "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
- "optional": true
- },
- "gatsby-core-utils": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz",
- "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==",
- "requires": {
- "ci-info": "2.0.0",
- "configstore": "^5.0.1",
- "node-object-hash": "^2.0.0"
- }
- },
- "glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "requires": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- }
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- },
- "readdirp": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
- "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
- "requires": {
- "picomatch": "^2.0.7"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "xstate": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.8.0.tgz",
- "integrity": "sha512-xHSYQtCHLkcrFRxa5lK4Lp1rnKt00a80jcKFMQiMBuE+6MvTYv7twwqYpzjsJoKFjGZB3GGEpZAuY1dmlPTh/g=="
- }
- }
- },
- "gatsby-source-git": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/gatsby-source-git/-/gatsby-source-git-1.0.2.tgz",
- "integrity": "sha512-TNCC8PnRK3knrO5Q9qpOWVsYuRuLZ07LGB2kQw4/b4bmbciVFZSNUfuJpokpl3/6DPvcePQtNjARVpdKrRYhog==",
- "requires": {
- "fast-glob": "^2.2.3",
- "fs-extra": "^5.0.0",
- "gatsby-source-filesystem": "^2.1.19",
- "git-url-parse": "^11.1.1",
- "rimraf": "^2.6.2",
- "simple-git": "^1.105.0"
- },
- "dependencies": {
- "@nodelib/fs.stat": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
- "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw=="
- },
- "fast-glob": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
- "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
- "requires": {
- "@mrmlnc/readdir-enhanced": "^2.2.1",
- "@nodelib/fs.stat": "^1.1.2",
- "glob-parent": "^3.1.0",
- "is-glob": "^4.0.0",
- "merge2": "^1.2.3",
- "micromatch": "^3.1.10"
- }
- },
- "fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "gatsby-source-graphql": {
- "version": "2.1.33",
- "resolved": "https://registry.npmjs.org/gatsby-source-graphql/-/gatsby-source-graphql-2.1.33.tgz",
- "integrity": "sha512-xQ8EeTFWjKDQ+7c4R9cUNFzhp1e0DyiFels4XG6IDdwwlJd38pkk2cWe9SBpPP8AUfNnt6ry29koYVO0ztzslw==",
- "requires": {
- "@babel/runtime": "^7.7.6",
- "apollo-link": "1.2.13",
- "apollo-link-http": "^1.5.16",
- "graphql-tools-fork": "^8.0.1",
- "invariant": "^2.2.4",
- "node-fetch": "^1.7.3",
- "uuid": "^3.3.3"
- },
- "dependencies": {
- "node-fetch": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
- "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
- "requires": {
- "encoding": "^0.1.11",
- "is-stream": "^1.0.1"
- }
- }
- }
- },
- "gatsby-telemetry": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/gatsby-telemetry/-/gatsby-telemetry-1.2.3.tgz",
- "integrity": "sha512-butEEIfuGAWZ9cVISrS6XVXMFPweFTDNO2Z5jj+mA1GkHlriahF4BtbVX3b4miQbQW16g2TfzNw/ztwIUfy0RQ==",
- "requires": {
- "@babel/code-frame": "^7.8.3",
- "@babel/runtime": "^7.8.7",
- "bluebird": "^3.7.2",
- "boxen": "^4.2.0",
- "configstore": "^5.0.1",
- "envinfo": "^7.5.0",
- "fs-extra": "^8.1.0",
- "gatsby-core-utils": "^1.1.1",
- "git-up": "4.0.1",
- "is-docker": "2.0.0",
- "lodash": "^4.17.15",
- "node-fetch": "2.6.0",
- "resolve-cwd": "^2.0.0",
- "source-map": "^0.7.3",
- "stack-trace": "^0.0.10",
- "stack-utils": "1.0.2",
- "uuid": "3.4.0"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "node-fetch": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
- "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
- }
- }
- },
- "gatsby-theme-apollo-core": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-core/-/gatsby-theme-apollo-core-3.0.11.tgz",
- "integrity": "sha512-dWpSi35pbNASs6/6flvlAP2qmOhaLrhDv9CqDyEYajG1yvH7qMrKHP8XLKVObyZ2BU3Y6Zzw+OKdoZVtlo/5Ig==",
- "requires": {
- "@apollo/space-kit": "2.15.0",
- "@emotion/core": "^10.0.7",
- "@emotion/styled": "^10.0.7",
- "@svgr/webpack": "^4.2.0",
- "gatsby-plugin-emotion": "^4.0.3",
- "gatsby-plugin-less": "^3.0.1",
- "gatsby-plugin-react-helmet": "^3.0.2",
- "gatsby-plugin-svgr": "^2.0.1",
- "less": "^3.10.1",
- "lodash": "^4.17.14",
- "polished": "^2.3.3",
- "prop-types": "^15.6.2",
- "react-helmet": "^5.2.0",
- "react-use": "^9.11.0"
- }
- },
- "gatsby-theme-apollo-docs": {
- "version": "4.0.14",
- "resolved": "https://registry.npmjs.org/gatsby-theme-apollo-docs/-/gatsby-theme-apollo-docs-4.0.14.tgz",
- "integrity": "sha512-hptn26w5o8MOA5iH6NZ00KrWdUzPRXUiCgJzh1J4+ggqCtypGixU5uXJIwR/ka9WRUJtQWz9uaJ47XlPnhTMUw==",
- "requires": {
- "@mdx-js/mdx": "^1.1.0",
- "@mdx-js/react": "^1.0.27",
- "gatsby-plugin-mdx": "^1.0.23",
- "gatsby-plugin-printer": "1.0.x",
- "gatsby-plugin-segment-js": "^3.0.1",
- "gatsby-remark-autolink-headers": "^2.0.16",
- "gatsby-remark-check-links": "^2.1.0",
- "gatsby-remark-code-titles": "^1.1.0",
- "gatsby-remark-copy-linked-files": "^2.0.12",
- "gatsby-remark-mermaid": "^1.2.0",
- "gatsby-remark-prismjs": "^3.2.8",
- "gatsby-remark-rewrite-relative-links": "^1.0.7",
- "gatsby-source-filesystem": "^2.0.29",
- "gatsby-source-git": "^1.0.1",
- "gatsby-theme-apollo-core": "^3.0.10",
- "gatsby-transformer-remark": "^2.6.30",
- "js-yaml": "^3.13.1",
- "prismjs": "^1.15.0",
- "react-textfit": "^1.1.0",
- "recompose": "^0.30.0",
- "rehype-react": "^3.1.0",
- "remark": "^10.0.1",
- "remark-react": "^5.0.1",
- "remark-typescript": "^0.3.0",
- "source-sans-pro": "^3.6.0",
- "striptags": "^3.1.1"
- }
- },
- "gatsby-transformer-remark": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/gatsby-transformer-remark/-/gatsby-transformer-remark-2.7.1.tgz",
- "integrity": "sha512-9geE8itjePDvaa0uWmyRgi2emPt9ut420YyjaNJ1/4eZw9Yj8zAuCdancw7j1buhL0UAxgQ2YseO6+MWTHEoMw==",
- "requires": {
- "@babel/runtime": "^7.8.7",
- "bluebird": "^3.7.2",
- "gatsby-core-utils": "^1.1.1",
- "gray-matter": "^4.0.2",
- "hast-util-raw": "^4.0.0",
- "hast-util-to-html": "^4.0.1",
- "lodash": "^4.17.15",
- "mdast-util-to-hast": "^3.0.4",
- "mdast-util-to-string": "^1.1.0",
- "mdast-util-toc": "^5.0",
- "remark": "^10.0.1",
- "remark-parse": "^6.0.3",
- "remark-retext": "^3.1.3",
- "remark-stringify": "6.0.4",
- "retext-english": "^3.0.4",
- "sanitize-html": "^1.22.1",
- "underscore.string": "^3.3.5",
- "unified": "^6.2.0",
- "unist-util-remove-position": "^1.1.4",
- "unist-util-select": "^1.5.0",
- "unist-util-visit": "^1.4.1"
- },
- "dependencies": {
- "@babel/runtime": {
- "version": "7.9.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
- "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
- "requires": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "gatsby-core-utils": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-1.1.1.tgz",
- "integrity": "sha512-EboPcBx37YQVUKN9JH753S54nDxjRmOefbR0i08KTmaVgQ1lZnDXJr8JfrImmMqupZlOkPQX1mWlXfp+r1jGhA==",
- "requires": {
- "ci-info": "2.0.0",
- "configstore": "^5.0.1",
- "node-object-hash": "^2.0.0"
- }
- },
- "hast-to-hyperscript": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz",
- "integrity": "sha512-DLl3eYTz8uwwzEubDUdCChsR5t5b2ne+yvHrA2h58Suq/JnN3+Gsb9Tc4iZoCCsykmFUc6UUpwxTmQXs0akSeg==",
- "requires": {
- "comma-separated-tokens": "^1.0.0",
- "property-information": "^4.0.0",
- "space-separated-tokens": "^1.0.0",
- "style-to-object": "^0.2.1",
- "unist-util-is": "^2.0.0",
- "web-namespaces": "^1.1.2"
- }
- },
- "hast-util-from-parse5": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-4.0.2.tgz",
- "integrity": "sha512-I6dtjsGtDqz4fmGSiFClFyiXdKhj5bPceS6intta7k/VDuiKz9P61C6hO6WMiNNmEm1b/EtBH8f+juvz4o0uwQ==",
- "requires": {
- "ccount": "^1.0.3",
- "hastscript": "^4.0.0",
- "property-information": "^4.0.0",
- "web-namespaces": "^1.1.2",
- "xtend": "^4.0.1"
- }
- },
- "hast-util-raw": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-4.0.0.tgz",
- "integrity": "sha512-5xYHyEJMCf8lX/NT4iA5z6N43yoFsrJqXJ5GWwAbLn815URbIz+UNNFEgid33F9paZuDlqVKvB+K3Aqu5+DdSw==",
- "requires": {
- "hast-util-from-parse5": "^4.0.2",
- "hast-util-to-parse5": "^4.0.1",
- "html-void-elements": "^1.0.1",
- "parse5": "^5.0.0",
- "unist-util-position": "^3.0.0",
- "web-namespaces": "^1.0.0",
- "xtend": "^4.0.1",
- "zwitch": "^1.0.0"
- }
- },
- "hast-util-to-parse5": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-4.0.1.tgz",
- "integrity": "sha512-U/61W+fsNfBpCyJBB5Pt3l5ypIfgXqEyW9pyrtxF7XrqDJHzcFrYpnC94d0JDYjvobLpYCzcU9srhMRPEO1YXw==",
- "requires": {
- "hast-to-hyperscript": "^5.0.0",
- "property-information": "^4.0.0",
- "web-namespaces": "^1.0.0",
- "xtend": "^4.0.1",
- "zwitch": "^1.0.0"
- }
- },
- "hastscript": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-4.1.0.tgz",
- "integrity": "sha512-bOTn9hEfzewvHyXdbYGKqOr/LOz+2zYhKbC17U2YAjd16mnjqB1BQ0nooM/RdMy/htVyli0NAznXiBtwDi1cmQ==",
- "requires": {
- "comma-separated-tokens": "^1.0.0",
- "hast-util-parse-selector": "^2.2.0",
- "property-information": "^4.0.0",
- "space-separated-tokens": "^1.0.0"
- }
- },
- "mdast-util-to-hast": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-3.0.4.tgz",
- "integrity": "sha512-/eIbly2YmyVgpJNo+bFLLMCI1XgolO/Ffowhf+pHDq3X4/V6FntC9sGQCDLM147eTS+uSXv5dRzJyFn+o0tazA==",
- "requires": {
- "collapse-white-space": "^1.0.0",
- "detab": "^2.0.0",
- "mdast-util-definitions": "^1.2.0",
- "mdurl": "^1.0.1",
- "trim": "0.0.1",
- "trim-lines": "^1.0.0",
- "unist-builder": "^1.0.1",
- "unist-util-generated": "^1.1.0",
- "unist-util-position": "^3.0.0",
- "unist-util-visit": "^1.1.0",
- "xtend": "^4.0.1"
- }
- },
- "mdast-util-toc": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-5.0.2.tgz",
- "integrity": "sha512-IeihbQLXrnCs/427dVzCp3ffvSPpdx/Mc2WWYAdVaS+MFqdKZHlJylGWAA1cGPewhEVyITsWrlXJ/b2d80Wsnw==",
- "requires": {
- "@types/mdast": "^3.0.3",
- "@types/unist": "^2.0.3",
- "extend": "^3.0.2",
- "github-slugger": "^1.2.1",
- "mdast-util-to-string": "^1.0.5",
- "unist-util-is": "^4.0.0",
- "unist-util-visit": "^2.0.0"
- },
- "dependencies": {
- "unist-util-is": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
- "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ=="
- },
- "unist-util-visit": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
- "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- }
- },
- "unist-util-visit-parents": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
- "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- }
- }
- },
- "property-information": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz",
- "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==",
- "requires": {
- "xtend": "^4.0.1"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
- "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
- },
- "remark-parse": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz",
- "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==",
- "requires": {
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^1.1.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^1.0.0",
- "vfile-location": "^2.0.0",
- "xtend": "^4.0.1"
- }
- },
- "style-to-object": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz",
- "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==",
- "requires": {
- "inline-style-parser": "0.1.1"
- }
- },
- "unified": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
- "integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
- "requires": {
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-plain-obj": "^1.1.0",
- "trough": "^1.0.0",
- "vfile": "^2.0.0",
- "x-is-string": "^0.1.0"
- }
- },
- "unist-builder": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz",
- "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==",
- "requires": {
- "object-assign": "^4.1.0"
- }
- },
- "unist-util-is": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz",
- "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA=="
- },
- "unist-util-stringify-position": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
- "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ=="
- },
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- },
- "vfile": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
- "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
- "requires": {
- "is-buffer": "^1.1.4",
- "replace-ext": "1.0.0",
- "unist-util-stringify-position": "^1.0.0",
- "vfile-message": "^1.0.0"
- }
- },
- "vfile-message": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
- "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
- "requires": {
- "unist-util-stringify-position": "^1.1.1"
- }
- }
- }
- },
- "gensync": {
- "version": "1.0.0-beta.1",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
- "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg=="
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
- },
- "get-port": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
- "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw="
- },
- "get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "requires": {
- "pump": "^3.0.0"
- }
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "git-up": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/git-up/-/git-up-4.0.1.tgz",
- "integrity": "sha512-LFTZZrBlrCrGCG07/dm1aCjjpL1z9L3+5aEeI9SBhAqSc+kiA9Or1bgZhQFNppJX6h/f5McrvJt1mQXTFm6Qrw==",
- "requires": {
- "is-ssh": "^1.3.0",
- "parse-url": "^5.0.0"
- }
- },
- "git-url-parse": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-11.1.2.tgz",
- "integrity": "sha512-gZeLVGY8QVKMIkckncX+iCq2/L8PlwncvDFKiWkBn9EtCfYDbliRTTp6qzyQ1VMdITUfq7293zDzfpjdiGASSQ==",
- "requires": {
- "git-up": "^4.0.0"
- }
- },
- "github-slugger": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.3.0.tgz",
- "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==",
- "requires": {
- "emoji-regex": ">=6.0.0 <=6.1.1"
- },
- "dependencies": {
- "emoji-regex": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-6.1.1.tgz",
- "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4="
- }
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- },
- "dependencies": {
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "requires": {
- "is-extglob": "^2.1.0"
- }
- }
- }
- },
- "glob-to-regexp": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
- "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs="
- },
- "global": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
- "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
- "requires": {
- "min-document": "^2.19.0",
- "process": "^0.11.10"
- }
- },
- "global-dirs": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
- "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
- "requires": {
- "ini": "^1.3.4"
- }
- },
- "global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "requires": {
- "global-prefix": "^3.0.0"
- }
- },
- "global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "requires": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
- },
- "globby": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz",
- "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==",
- "requires": {
- "array-union": "^1.0.1",
- "dir-glob": "2.0.0",
- "fast-glob": "^2.0.2",
- "glob": "^7.1.2",
- "ignore": "^3.3.5",
- "pify": "^3.0.0",
- "slash": "^1.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "good-listener": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
- "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
- "optional": true,
- "requires": {
- "delegate": "^3.1.2"
- }
- },
- "got": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz",
- "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==",
- "requires": {
- "@sindresorhus/is": "^0.7.0",
- "cacheable-request": "^2.1.1",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^3.0.0",
- "into-stream": "^3.1.0",
- "is-retry-allowed": "^1.1.0",
- "isurl": "^1.0.0-alpha5",
- "lowercase-keys": "^1.0.0",
- "mimic-response": "^1.0.0",
- "p-cancelable": "^0.4.0",
- "p-timeout": "^2.0.1",
- "pify": "^3.0.0",
- "safe-buffer": "^5.1.1",
- "timed-out": "^4.0.1",
- "url-parse-lax": "^3.0.0",
- "url-to-options": "^1.0.1"
- },
- "dependencies": {
- "@sindresorhus/is": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz",
- "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow=="
- },
- "cacheable-request": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz",
- "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=",
- "requires": {
- "clone-response": "1.0.2",
- "get-stream": "3.0.0",
- "http-cache-semantics": "3.8.1",
- "keyv": "3.0.0",
- "lowercase-keys": "1.0.0",
- "normalize-url": "2.0.1",
- "responselike": "1.0.2"
- },
- "dependencies": {
- "lowercase-keys": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
- "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY="
- }
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "http-cache-semantics": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz",
- "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w=="
- },
- "keyv": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz",
- "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==",
- "requires": {
- "json-buffer": "3.0.0"
- }
- },
- "normalize-url": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz",
- "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==",
- "requires": {
- "prepend-http": "^2.0.0",
- "query-string": "^5.0.1",
- "sort-keys": "^2.0.0"
- }
- },
- "p-cancelable": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz",
- "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ=="
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- }
- }
- },
- "graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
- },
- "graphlib": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz",
- "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==",
- "requires": {
- "lodash": "^4.17.15"
- }
- },
- "graphql": {
- "version": "14.6.0",
- "resolved": "https://registry.npmjs.org/graphql/-/graphql-14.6.0.tgz",
- "integrity": "sha512-VKzfvHEKybTKjQVpTFrA5yUq2S9ihcZvfJAtsDBBCuV6wauPu1xl/f9ehgVf0FcEJJs4vz6ysb/ZMkGigQZseg==",
- "requires": {
- "iterall": "^1.2.2"
- }
- },
- "graphql-compose": {
- "version": "6.3.8",
- "resolved": "https://registry.npmjs.org/graphql-compose/-/graphql-compose-6.3.8.tgz",
- "integrity": "sha512-o0/jzQEMIpSjryLKwmD1vGrCubiPxD0LxlGTgWDSu38TBepu2GhugC9gYgTEbtiCZAHPtvkZ90SzzABOWZyQLA==",
- "requires": {
- "graphql-type-json": "^0.2.4",
- "object-path": "^0.11.4"
- }
- },
- "graphql-config": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/graphql-config/-/graphql-config-2.2.2.tgz",
- "integrity": "sha512-mtv1ejPyyR2mJUUZNhljggU+B/Xl8tJJWf+h145hB+1Y48acSghFalhNtXfPBcYl2tJzpb+lGxfj3O7OjaiMgw==",
- "requires": {
- "graphql-import": "^0.7.1",
- "graphql-request": "^1.5.0",
- "js-yaml": "^3.10.0",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4"
- }
- },
- "graphql-import": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/graphql-import/-/graphql-import-0.7.1.tgz",
- "integrity": "sha512-YpwpaPjRUVlw2SN3OPljpWbVRWAhMAyfSba5U47qGMOSsPLi2gYeJtngGpymjm9nk57RFWEpjqwh4+dpYuFAPw==",
- "requires": {
- "lodash": "^4.17.4",
- "resolve-from": "^4.0.0"
- }
- },
- "graphql-playground-html": {
- "version": "1.6.12",
- "resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.12.tgz",
- "integrity": "sha512-yOYFwwSMBL0MwufeL8bkrNDgRE7eF/kTHiwrqn9FiR9KLcNIl1xw9l9a+6yIRZM56JReQOHpbQFXTZn1IuSKRg=="
- },
- "graphql-playground-middleware-express": {
- "version": "1.7.12",
- "resolved": "https://registry.npmjs.org/graphql-playground-middleware-express/-/graphql-playground-middleware-express-1.7.12.tgz",
- "integrity": "sha512-17szgonnVSxWVrgblLRHHLjWnMUONfkULIwSunaMvYx8k5oG3yL86cyGCbHuDFUFkyr2swLhdfYl4mDfDXuvOA==",
- "requires": {
- "graphql-playground-html": "1.6.12"
- }
- },
- "graphql-request": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-1.8.2.tgz",
- "integrity": "sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg==",
- "requires": {
- "cross-fetch": "2.2.2"
- }
- },
- "graphql-tools-fork": {
- "version": "8.6.4",
- "resolved": "https://registry.npmjs.org/graphql-tools-fork/-/graphql-tools-fork-8.6.4.tgz",
- "integrity": "sha512-Ik6TdKhQXTy2fJ2zPM9NEEigGWuPAVQZ8eq67wOF3yAdNfhCZ+U64i90OUH5KathDRrnY3w4Gou74sSlk5zY7w==",
- "requires": {
- "apollo-link": "^1.2.13",
- "apollo-link-http-common": "^0.2.15",
- "deprecated-decorator": "^0.1.6",
- "extract-files": "^7.0.0",
- "form-data": "^3.0.0",
- "iterall": "^1.3.0",
- "node-fetch": "^2.6.0",
- "uuid": "^7.0.1"
- },
- "dependencies": {
- "form-data": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
- "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- }
- },
- "node-fetch": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
- "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
- },
- "uuid": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz",
- "integrity": "sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw=="
- }
- }
- },
- "graphql-type-json": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/graphql-type-json/-/graphql-type-json-0.2.4.tgz",
- "integrity": "sha512-/tq02ayMQjrG4oDFDRLLrPk0KvJXue0nVXoItBe7uAdbNXjQUu+HYCBdAmPLQoseVzUKKMzrhq2P/sfI76ON6w=="
- },
- "gray-matter": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.2.tgz",
- "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==",
- "requires": {
- "js-yaml": "^3.11.0",
- "kind-of": "^6.0.2",
- "section-matter": "^1.0.0",
- "strip-bom-string": "^1.0.0"
- }
- },
- "gud": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
- "integrity": "sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw=="
- },
- "gzip-size": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz",
- "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
- "requires": {
- "duplexer": "^0.1.1",
- "pify": "^4.0.1"
- }
- },
- "handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
- },
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
- "requires": {
- "ajv": "^6.5.5",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "requires": {
- "ansi-regex": "^2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- }
- }
- },
- "has-binary2": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
- "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
- "requires": {
- "isarray": "2.0.1"
- },
- "dependencies": {
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- }
- }
- },
- "has-cors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
- "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk="
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
- },
- "has-symbol-support-x": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz",
- "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw=="
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
- },
- "has-to-string-tag-x": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz",
- "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==",
- "requires": {
- "has-symbol-support-x": "^1.4.1"
- }
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "has-yarn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
- "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
- },
- "hash-base": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
- "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "hasha": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz",
- "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==",
- "requires": {
- "is-stream": "^2.0.0",
- "type-fest": "^0.8.0"
- },
- "dependencies": {
- "is-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
- "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
- }
- }
- },
- "hast-to-hyperscript": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-7.0.4.tgz",
- "integrity": "sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA==",
- "requires": {
- "comma-separated-tokens": "^1.0.0",
- "property-information": "^5.3.0",
- "space-separated-tokens": "^1.0.0",
- "style-to-object": "^0.2.1",
- "unist-util-is": "^3.0.0",
- "web-namespaces": "^1.1.2"
- },
- "dependencies": {
- "style-to-object": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz",
- "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==",
- "requires": {
- "inline-style-parser": "0.1.1"
- }
- }
- }
- },
- "hast-util-from-parse5": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz",
- "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==",
- "requires": {
- "ccount": "^1.0.3",
- "hastscript": "^5.0.0",
- "property-information": "^5.0.0",
- "web-namespaces": "^1.1.2",
- "xtend": "^4.0.1"
- }
- },
- "hast-util-is-element": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.0.4.tgz",
- "integrity": "sha512-NFR6ljJRvDcyPP5SbV7MyPBgF47X3BsskLnmw1U34yL+X6YC0MoBx9EyMg8Jtx4FzGH95jw8+c1VPLHaRA0wDQ=="
- },
- "hast-util-parse-selector": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.4.tgz",
- "integrity": "sha512-gW3sxfynIvZApL4L07wryYF4+C9VvH3AUi7LAnVXV4MneGEgwOByXvFo18BgmTWnm7oHAe874jKbIB1YhHSIzA=="
- },
- "hast-util-raw": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-5.0.2.tgz",
- "integrity": "sha512-3ReYQcIHmzSgMq8UrDZHFL0oGlbuVGdLKs8s/Fe8BfHFAyZDrdv1fy/AGn+Fim8ZuvAHcJ61NQhVMtyfHviT/g==",
- "requires": {
- "hast-util-from-parse5": "^5.0.0",
- "hast-util-to-parse5": "^5.0.0",
- "html-void-elements": "^1.0.0",
- "parse5": "^5.0.0",
- "unist-util-position": "^3.0.0",
- "web-namespaces": "^1.0.0",
- "xtend": "^4.0.0",
- "zwitch": "^1.0.0"
- }
- },
- "hast-util-sanitize": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/hast-util-sanitize/-/hast-util-sanitize-1.3.1.tgz",
- "integrity": "sha512-AIeKHuHx0Wk45nSkGVa2/ujQYTksnDl8gmmKo/mwQi7ag7IBZ8cM3nJ2G86SajbjGP/HRpud6kMkPtcM2i0Tlw==",
- "requires": {
- "xtend": "^4.0.1"
- }
- },
- "hast-util-to-html": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-4.0.1.tgz",
- "integrity": "sha512-2emzwyf0xEsc4TBIPmDJmBttIw8R4SXAJiJZoiRR/s47ODYWgOqNoDbf2SJAbMbfNdFWMiCSOrI3OVnX6Qq2Mg==",
- "requires": {
- "ccount": "^1.0.0",
- "comma-separated-tokens": "^1.0.1",
- "hast-util-is-element": "^1.0.0",
- "hast-util-whitespace": "^1.0.0",
- "html-void-elements": "^1.0.0",
- "property-information": "^4.0.0",
- "space-separated-tokens": "^1.0.0",
- "stringify-entities": "^1.0.1",
- "unist-util-is": "^2.0.0",
- "xtend": "^4.0.1"
- },
- "dependencies": {
- "property-information": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz",
- "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==",
- "requires": {
- "xtend": "^4.0.1"
- }
- },
- "unist-util-is": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz",
- "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA=="
- }
- }
- },
- "hast-util-to-parse5": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-5.1.2.tgz",
- "integrity": "sha512-ZgYLJu9lYknMfsBY0rBV4TJn2xiwF1fXFFjbP6EE7S0s5mS8LIKBVWzhA1MeIs1SWW6GnnE4In6c3kPb+CWhog==",
- "requires": {
- "hast-to-hyperscript": "^7.0.0",
- "property-information": "^5.0.0",
- "web-namespaces": "^1.0.0",
- "xtend": "^4.0.0",
- "zwitch": "^1.0.0"
- }
- },
- "hast-util-whitespace": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz",
- "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A=="
- },
- "hastscript": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz",
- "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==",
- "requires": {
- "comma-separated-tokens": "^1.0.0",
- "hast-util-parse-selector": "^2.0.0",
- "property-information": "^5.0.0",
- "space-separated-tokens": "^1.0.0"
- }
- },
- "he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
- },
- "header-case": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz",
- "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=",
- "requires": {
- "no-case": "^2.2.0",
- "upper-case": "^1.1.3"
- }
- },
- "hex-color-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
- "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
- },
- "hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
- "requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "hoist-non-react-statics": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
- "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
- "requires": {
- "react-is": "^16.7.0"
- }
- },
- "homedir-polyfill": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
- "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
- "requires": {
- "parse-passwd": "^1.0.0"
- }
- },
- "hosted-git-info": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
- "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg=="
- },
- "hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
- "requires": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "hsl-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
- "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4="
- },
- "hsla-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
- "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg="
- },
- "html-comment-regex": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
- "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ=="
- },
- "html-entities": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz",
- "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8="
- },
- "html-minifier": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz",
- "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==",
- "requires": {
- "camel-case": "^3.0.0",
- "clean-css": "^4.2.1",
- "commander": "^2.19.0",
- "he": "^1.2.0",
- "param-case": "^2.1.1",
- "relateurl": "^0.2.7",
- "uglify-js": "^3.5.1"
- }
- },
- "html-void-elements": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz",
- "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w=="
- },
- "htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
- "requires": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
- },
- "dependencies": {
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
- },
- "readable-stream": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz",
- "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
- },
- "http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
- },
- "http-errors": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
- "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- }
- }
- },
- "http-parser-js": {
- "version": "0.4.10",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
- "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q="
- },
- "http-proxy": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz",
- "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==",
- "requires": {
- "eventemitter3": "^4.0.0",
- "follow-redirects": "^1.0.0",
- "requires-port": "^1.0.0"
- }
- },
- "http-proxy-middleware": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
- "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
- "requires": {
- "http-proxy": "^1.17.0",
- "is-glob": "^4.0.0",
- "lodash": "^4.17.11",
- "micromatch": "^3.1.10"
- }
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "https-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
- "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
- },
- "https-proxy-agent": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
- "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
- "requires": {
- "agent-base": "^4.3.0",
- "debug": "^3.1.0"
- }
- },
- "human-signals": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
- "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
- },
- "hyphenate-style-name": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz",
- "integrity": "sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ=="
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "icss-replace-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
- "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0="
- },
- "icss-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz",
- "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=",
- "requires": {
- "postcss": "^6.0.1"
- },
- "dependencies": {
- "postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
- "requires": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "idb-wrapper": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz",
- "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg=="
- },
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
- },
- "iferr": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
- "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
- },
- "ignore": {
- "version": "3.3.10",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz",
- "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug=="
- },
- "image-size": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
- "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=",
- "optional": true
- },
- "immer": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/immer/-/immer-1.10.0.tgz",
- "integrity": "sha512-O3sR1/opvCDGLEVcvrGTMtLac8GJ5IwZC4puPrLuRj3l7ICKvkmA0vGuU9OW8mV9WIBRnaxp5GJh9IEAaNOoYg=="
- },
- "import-cwd": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
- "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
- "requires": {
- "import-from": "^2.1.0"
- }
- },
- "import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
- "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "import-from": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
- "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
- "requires": {
- "resolve-from": "^3.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
- }
- }
- },
- "import-lazy": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
- "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
- },
- "import-local": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
- "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
- "requires": {
- "pkg-dir": "^3.0.0",
- "resolve-cwd": "^2.0.0"
- }
- },
- "imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
- },
- "indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
- },
- "indexes-of": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
- "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
- },
- "indexof": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
- "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
- },
- "infer-owner": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
- "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
- },
- "ink": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/ink/-/ink-2.7.1.tgz",
- "integrity": "sha512-s7lJuQDJEdjqtaIWhp3KYHl6WV3J04U9zoQ6wVc+Xoa06XM27SXUY57qC5DO46xkF0CfgXMKkKNcgvSu/SAEpA==",
- "optional": true,
- "requires": {
- "ansi-escapes": "^4.2.1",
- "arrify": "^2.0.1",
- "auto-bind": "^4.0.0",
- "chalk": "^3.0.0",
- "cli-cursor": "^3.1.0",
- "cli-truncate": "^2.1.0",
- "is-ci": "^2.0.0",
- "lodash.throttle": "^4.1.1",
- "log-update": "^3.0.0",
- "prop-types": "^15.6.2",
- "react-reconciler": "^0.24.0",
- "scheduler": "^0.18.0",
- "signal-exit": "^3.0.2",
- "slice-ansi": "^3.0.0",
- "string-length": "^3.1.0",
- "widest-line": "^3.1.0",
- "wrap-ansi": "^6.2.0",
- "yoga-layout-prebuilt": "^1.9.3"
- },
- "dependencies": {
- "ansi-escapes": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
- "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
- "optional": true,
- "requires": {
- "type-fest": "^0.11.0"
- }
- },
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "optional": true
- },
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "optional": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "arrify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
- "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
- "optional": true
- },
- "astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "optional": true
- },
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "optional": true,
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "optional": true,
- "requires": {
- "restore-cursor": "^3.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "optional": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "optional": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "optional": true
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "optional": true
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "optional": true
- },
- "onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "optional": true,
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "optional": true,
- "requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- }
- },
- "slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
- "optional": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- }
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "optional": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "optional": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "optional": true,
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "type-fest": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
- "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
- "optional": true
- },
- "wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "optional": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- }
- }
- }
- },
- "ink-spinner": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-3.0.1.tgz",
- "integrity": "sha512-AVR4Z/NXDQ7dT5ltWcCzFS9Dd4T8eaO//E2UO8VYNiJcZpPCSJ11o5A0UVPcMlZxGbGD6ikUFDR3ZgPUQk5haQ==",
- "optional": true,
- "requires": {
- "cli-spinners": "^1.0.0",
- "prop-types": "^15.5.10"
- }
- },
- "inline-style-parser": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
- "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
- },
- "inline-style-prefixer": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/inline-style-prefixer/-/inline-style-prefixer-4.0.2.tgz",
- "integrity": "sha512-N8nVhwfYga9MiV9jWlwfdj1UDIaZlBFu4cJSJkIr7tZX7sHpHhGR5su1qdpW+7KPL8ISTvCIkcaFi/JdBknvPg==",
- "requires": {
- "bowser": "^1.7.3",
- "css-in-js-utils": "^2.0.0"
- }
- },
- "inquirer": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz",
- "integrity": "sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA==",
- "requires": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.12",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "instantsearch.css": {
- "version": "7.4.2",
- "resolved": "https://registry.npmjs.org/instantsearch.css/-/instantsearch.css-7.4.2.tgz",
- "integrity": "sha512-CaOdFWCpHOWGAkJRpwC4+8ROU3Upp3xrUuc0Mg92UucJ84MWMJWkVZDDyRwubgJe4HXQM2rV6b+bJaDeeZGunw=="
- },
- "internal-ip": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz",
- "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
- "requires": {
- "default-gateway": "^4.2.0",
- "ipaddr.js": "^1.9.0"
- }
- },
- "internal-slot": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.2.tgz",
- "integrity": "sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==",
- "requires": {
- "es-abstract": "^1.17.0-next.1",
- "has": "^1.0.3",
- "side-channel": "^1.0.2"
- }
- },
- "into-stream": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz",
- "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=",
- "requires": {
- "from2": "^2.1.1",
- "p-is-promise": "^1.1.0"
- },
- "dependencies": {
- "p-is-promise": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz",
- "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4="
- }
- }
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "invert-kv": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
- "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA=="
- },
- "ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
- },
- "ip-regex": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz",
- "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
- },
- "ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
- },
- "is": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz",
- "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI="
- },
- "is-absolute-url": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
- "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q=="
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-alphabetical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
- "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
- },
- "is-alphanumeric": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
- "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ="
- },
- "is-alphanumerical": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
- "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
- "requires": {
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0"
- }
- },
- "is-arguments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
- "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA=="
- },
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "requires": {
- "binary-extensions": "^1.0.0"
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
- },
- "is-builtin-module": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.0.0.tgz",
- "integrity": "sha512-/93sDihsAD652hrMEbJGbMAVBf1qc96kyThHQ0CAOONHaE3aROLpTjDe4WQ5aoC5ITHFxEq1z8XqSU7km+8amw==",
- "requires": {
- "builtin-modules": "^3.0.0"
- }
- },
- "is-callable": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q=="
- },
- "is-ci": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
- "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
- "requires": {
- "ci-info": "^2.0.0"
- }
- },
- "is-color-stop": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
- "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
- "requires": {
- "css-color-names": "^0.0.4",
- "hex-color-regex": "^1.1.0",
- "hsl-regex": "^1.0.0",
- "hsla-regex": "^1.0.0",
- "rgb-regex": "^1.0.1",
- "rgba-regex": "^1.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-date-object": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
- "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
- },
- "is-decimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
- "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
- }
- }
- },
- "is-directory": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
- },
- "is-docker": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.0.0.tgz",
- "integrity": "sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ=="
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
- },
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-hexadecimal": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
- "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
- },
- "is-installed-globally": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
- "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
- "requires": {
- "global-dirs": "^0.1.0",
- "is-path-inside": "^1.0.0"
- },
- "dependencies": {
- "is-path-inside": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
- "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
- "requires": {
- "path-is-inside": "^1.0.1"
- }
- }
- }
- },
- "is-invalid-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz",
- "integrity": "sha1-MHqFWzzxqTi0TqcNLGEQYFNxTzQ=",
- "requires": {
- "is-glob": "^2.0.0"
- },
- "dependencies": {
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA="
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "requires": {
- "is-extglob": "^1.0.0"
- }
- }
- }
- },
- "is-lower-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz",
- "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=",
- "requires": {
- "lower-case": "^1.1.0"
- }
- },
- "is-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
- "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE="
- },
- "is-npm": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-3.0.0.tgz",
- "integrity": "sha512-wsigDr1Kkschp2opC4G3yA6r9EgVA6NjRpWzIi9axXqeIaAATPRJc4uLujXe3Nd9uO8KoDyA4MD6aZSeXTADhA=="
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
- },
- "is-object": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz",
- "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA="
- },
- "is-path-cwd": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
- "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
- },
- "is-path-in-cwd": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
- "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
- "requires": {
- "is-path-inside": "^2.1.0"
- },
- "dependencies": {
- "is-path-inside": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
- "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
- "requires": {
- "path-is-inside": "^1.0.2"
- }
- }
- }
- },
- "is-path-inside": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
- "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg=="
- },
- "is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
- "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
- },
- "is-reference": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz",
- "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==",
- "requires": {
- "@types/estree": "0.0.39"
- },
- "dependencies": {
- "@types/estree": {
- "version": "0.0.39",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
- "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw=="
- }
- }
- },
- "is-regex": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
- "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "requires": {
- "has": "^1.0.3"
- }
- },
- "is-regexp": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
- "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
- },
- "is-relative": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
- "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
- "requires": {
- "is-unc-path": "^1.0.0"
- }
- },
- "is-relative-url": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-3.0.0.tgz",
- "integrity": "sha512-U1iSYRlY2GIMGuZx7gezlB5dp1Kheaym7zKzO1PV06mOihiWTXejLwm4poEJysPyXF+HtK/BEd0DVlcCh30pEA==",
- "requires": {
- "is-absolute-url": "^3.0.0"
- }
- },
- "is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
- },
- "is-retry-allowed": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz",
- "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg=="
- },
- "is-root": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz",
- "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg=="
- },
- "is-ssh": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.3.1.tgz",
- "integrity": "sha512-0eRIASHZt1E68/ixClI8bp2YK2wmBPVWEismTs6M+M099jKgrzl/3E976zIbImSIob48N2/XGe9y7ZiYdImSlg==",
- "requires": {
- "protocols": "^1.1.0"
- }
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
- },
- "is-string": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
- "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
- },
- "is-svg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
- "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
- "requires": {
- "html-comment-regex": "^1.1.0"
- }
- },
- "is-symbol": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
- "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
- "requires": {
- "has-symbols": "^1.0.1"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
- },
- "is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
- "requires": {
- "unc-path-regex": "^0.1.2"
- }
- },
- "is-upper-case": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz",
- "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=",
- "requires": {
- "upper-case": "^1.1.0"
- }
- },
- "is-valid-path": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz",
- "integrity": "sha1-EQ+f90w39mPh7HkV60UfLbk6yd8=",
- "requires": {
- "is-invalid-path": "^0.1.0"
- }
- },
- "is-whitespace-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
- "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w=="
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
- },
- "is-word-character": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
- "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA=="
- },
- "is-wsl": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.1.1.tgz",
- "integrity": "sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog=="
- },
- "is-yarn-global": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
- "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isbuffer": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz",
- "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
- },
- "isomorphic-fetch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
- "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=",
- "requires": {
- "node-fetch": "^1.0.1",
- "whatwg-fetch": ">=0.10.0"
- },
- "dependencies": {
- "node-fetch": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
- "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
- "requires": {
- "encoding": "^0.1.11",
- "is-stream": "^1.0.1"
- }
- }
- }
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
- },
- "isurl": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz",
- "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==",
- "requires": {
- "has-to-string-tag-x": "^1.2.0",
- "is-object": "^1.0.1"
- }
- },
- "iterall": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz",
- "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg=="
- },
- "jest-worker": {
- "version": "24.9.0",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz",
- "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==",
- "requires": {
- "merge-stream": "^2.0.0",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "js-yaml": {
- "version": "3.13.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
- "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
- },
- "json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
- },
- "json-loader": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz",
- "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w=="
- },
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
- },
- "json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
- },
- "json3": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz",
- "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
- },
- "json5": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
- "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "jsonify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
- "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "jsx-ast-utils": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-2.2.3.tgz",
- "integrity": "sha512-EdIHFMm+1BPynpKOpdPqiOsvnIrInRGJD7bzPZdPkjitQEqpdpUuFpq4T0npZFKTiB3RhWFdGN+oqOJIdhDhQA==",
- "requires": {
- "array-includes": "^3.0.3",
- "object.assign": "^4.1.0"
- }
- },
- "keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "requires": {
- "json-buffer": "3.0.0"
- }
- },
- "killable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
- "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg=="
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
- },
- "kleur": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
- "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
- },
- "last-call-webpack-plugin": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
- "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
- "requires": {
- "lodash": "^4.17.5",
- "webpack-sources": "^1.1.0"
- }
- },
- "latest-version": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
- "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
- "requires": {
- "package-json": "^6.3.0"
- }
- },
- "lazy-cache": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
- "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
- },
- "lcid": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
- "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
- "requires": {
- "invert-kv": "^2.0.0"
- }
- },
- "less": {
- "version": "3.11.1",
- "resolved": "https://registry.npmjs.org/less/-/less-3.11.1.tgz",
- "integrity": "sha512-tlWX341RECuTOvoDIvtFqXsKj072hm3+9ymRBe76/mD6O5ZZecnlAOVDlWAleF2+aohFrxNidXhv2773f6kY7g==",
- "requires": {
- "clone": "^2.1.2",
- "errno": "^0.1.1",
- "graceful-fs": "^4.1.2",
- "image-size": "~0.5.0",
- "mime": "^1.4.1",
- "mkdirp": "^0.5.0",
- "promise": "^7.1.1",
- "request": "^2.83.0",
- "source-map": "~0.6.0",
- "tslib": "^1.10.0"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "optional": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "optional": true
- }
- }
- },
- "less-loader": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz",
- "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==",
- "requires": {
- "clone": "^2.1.1",
- "loader-utils": "^1.1.0",
- "pify": "^4.0.1"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
- }
- }
- },
- "level-blobs": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz",
- "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=",
- "requires": {
- "level-peek": "1.0.6",
- "once": "^1.3.0",
- "readable-stream": "^1.0.26-4"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "level-filesystem": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz",
- "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=",
- "requires": {
- "concat-stream": "^1.4.4",
- "errno": "^0.1.1",
- "fwd-stream": "^1.0.4",
- "level-blobs": "^0.1.7",
- "level-peek": "^1.0.6",
- "level-sublevel": "^5.2.0",
- "octal": "^1.0.0",
- "once": "^1.3.0",
- "xtend": "^2.2.0"
- },
- "dependencies": {
- "xtend": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
- "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak="
- }
- }
- },
- "level-fix-range": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz",
- "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg="
- },
- "level-hooks": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz",
- "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=",
- "requires": {
- "string-range": "~1.2"
- }
- },
- "level-js": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz",
- "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=",
- "requires": {
- "abstract-leveldown": "~0.12.0",
- "idb-wrapper": "^1.5.0",
- "isbuffer": "~0.0.0",
- "ltgt": "^2.1.2",
- "typedarray-to-buffer": "~1.0.0",
- "xtend": "~2.1.2"
- },
- "dependencies": {
- "object-keys": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
- "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY="
- },
- "typedarray-to-buffer": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz",
- "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw="
- },
- "xtend": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
- "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
- "requires": {
- "object-keys": "~0.4.0"
- }
- }
- }
- },
- "level-peek": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz",
- "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=",
- "requires": {
- "level-fix-range": "~1.0.2"
- }
- },
- "level-sublevel": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz",
- "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=",
- "requires": {
- "level-fix-range": "2.0",
- "level-hooks": ">=4.4.0 <5",
- "string-range": "~1.2.1",
- "xtend": "~2.0.4"
- },
- "dependencies": {
- "is-object": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz",
- "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc="
- },
- "level-fix-range": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz",
- "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=",
- "requires": {
- "clone": "~0.1.9"
- }
- },
- "object-keys": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz",
- "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=",
- "requires": {
- "foreach": "~2.0.1",
- "indexof": "~0.0.1",
- "is": "~0.2.6"
- }
- },
- "xtend": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz",
- "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=",
- "requires": {
- "is-object": "~0.1.2",
- "object-keys": "~0.2.0"
- }
- }
- }
- },
- "levelup": {
- "version": "0.18.6",
- "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz",
- "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=",
- "requires": {
- "bl": "~0.8.1",
- "deferred-leveldown": "~0.2.0",
- "errno": "~0.1.1",
- "prr": "~0.0.0",
- "readable-stream": "~1.0.26",
- "semver": "~2.3.1",
- "xtend": "~3.0.0"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "prr": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz",
- "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "semver": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz",
- "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI="
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- },
- "xtend": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz",
- "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo="
- }
- }
- },
- "leven": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
- "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
- },
- "levenary": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz",
- "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==",
- "requires": {
- "leven": "^3.1.0"
- }
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "lines-and-columns": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
- "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
- },
- "load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
- },
- "dependencies": {
- "parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "requires": {
- "error-ex": "^1.2.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- },
- "loader-fs-cache": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz",
- "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==",
- "requires": {
- "find-cache-dir": "^0.1.1",
- "mkdirp": "^0.5.1"
- },
- "dependencies": {
- "find-cache-dir": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
- "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
- "requires": {
- "commondir": "^1.0.1",
- "mkdirp": "^0.5.1",
- "pkg-dir": "^1.0.0"
- }
- },
- "find-up": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
- "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
- "requires": {
- "path-exists": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
- "requires": {
- "pinkie-promise": "^2.0.0"
- }
- },
- "pkg-dir": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
- "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
- "requires": {
- "find-up": "^1.0.0"
- }
- }
- }
- },
- "loader-runner": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz",
- "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="
- },
- "loader-utils": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
- "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
- "requires": {
- "big.js": "^5.2.2",
- "emojis-list": "^2.0.0",
- "json5": "^1.0.1"
- },
- "dependencies": {
- "json5": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
- "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
- "requires": {
- "minimist": "^1.2.0"
- }
- }
- }
- },
- "locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "requires": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "lockfile": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz",
- "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==",
- "requires": {
- "signal-exit": "^3.0.2"
- }
- },
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
- },
- "lodash.assignin": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz",
- "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI="
- },
- "lodash.bind": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz",
- "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU="
- },
- "lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8="
- },
- "lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
- },
- "lodash.deburr": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz",
- "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s="
- },
- "lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
- },
- "lodash.escaperegexp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
- "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c="
- },
- "lodash.every": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.every/-/lodash.every-4.6.0.tgz",
- "integrity": "sha1-64mYS+vENkJ5uzrvu9HKGb+mxqc="
- },
- "lodash.filter": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz",
- "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4="
- },
- "lodash.flatten": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
- "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
- },
- "lodash.flattendeep": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
- "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI="
- },
- "lodash.foreach": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
- "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM="
- },
- "lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
- },
- "lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
- },
- "lodash.map": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz",
- "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM="
- },
- "lodash.maxby": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.maxby/-/lodash.maxby-4.6.0.tgz",
- "integrity": "sha1-CCJABo88eiJ6oAqDgOTzjPB4bj0="
- },
- "lodash.memoize": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
- },
- "lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- },
- "lodash.mergewith": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
- "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="
- },
- "lodash.pick": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz",
- "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM="
- },
- "lodash.reduce": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
- "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs="
- },
- "lodash.reject": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz",
- "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU="
- },
- "lodash.some": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz",
- "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0="
- },
- "lodash.throttle": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
- "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=",
- "optional": true
- },
- "lodash.toarray": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
- "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE="
- },
- "lodash.uniq": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
- "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
- },
- "log-update": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.4.0.tgz",
- "integrity": "sha512-ILKe88NeMt4gmDvk/eb615U/IVn7K9KWGkoYbdatQ69Z65nj1ZzjM6fHXfcs0Uge+e+EGnMW7DY4T9yko8vWFg==",
- "optional": true,
- "requires": {
- "ansi-escapes": "^3.2.0",
- "cli-cursor": "^2.1.0",
- "wrap-ansi": "^5.0.0"
- }
- },
- "loglevel": {
- "version": "1.6.7",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.7.tgz",
- "integrity": "sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A=="
- },
- "lokijs": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/lokijs/-/lokijs-1.5.8.tgz",
- "integrity": "sha512-D8E3TBrY35o1ELnonp2MF8b3wKu2tVNl2TqRjvS+95oPMMe7OoIAxNY1qr+5BEZwnWn2V4ErAjVt000DonM+FA=="
- },
- "longest-streak": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz",
- "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg=="
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "loud-rejection": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-2.2.0.tgz",
- "integrity": "sha512-S0FayMXku80toa5sZ6Ro4C+s+EtFDCsyJNG/AzFMfX3AxD5Si4dZsgzm/kKnbOxHl5Cv8jBlno8+3XYIh2pNjQ==",
- "requires": {
- "currently-unhandled": "^0.4.1",
- "signal-exit": "^3.0.2"
- }
- },
- "lower-case": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
- "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw="
- },
- "lower-case-first": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz",
- "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=",
- "requires": {
- "lower-case": "^1.1.2"
- }
- },
- "lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
- },
- "lru-cache": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz",
- "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=",
- "requires": {
- "pseudomap": "^1.0.1",
- "yallist": "^2.0.0"
- }
- },
- "ltgt": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz",
- "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU="
- },
- "magic-string": {
- "version": "0.25.7",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
- "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
- "requires": {
- "sourcemap-codec": "^1.4.4"
- }
- },
- "make-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
- "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
- "requires": {
- "pify": "^4.0.1",
- "semver": "^5.6.0"
- }
- },
- "mamacro": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz",
- "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA=="
- },
- "map-age-cleaner": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
- "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
- "requires": {
- "p-defer": "^1.0.0"
- },
- "dependencies": {
- "p-defer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
- "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww="
- }
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "markdown-escapes": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
- "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg=="
- },
- "markdown-table": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz",
- "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q=="
- },
- "md5": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz",
- "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=",
- "requires": {
- "charenc": "~0.0.1",
- "crypt": "~0.0.1",
- "is-buffer": "~1.1.1"
- }
- },
- "md5-file": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/md5-file/-/md5-file-3.2.3.tgz",
- "integrity": "sha512-3Tkp1piAHaworfcCgH0jKbTvj1jWWFgbvh2cXaNCgHwyTCBxxvD1Y04rmfpvdPm1P4oXMOpm6+2H7sr7v9v8Fw==",
- "requires": {
- "buffer-alloc": "^1.1.0"
- }
- },
- "md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "mdast-squeeze-paragraphs": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-3.0.5.tgz",
- "integrity": "sha512-xX6Vbe348Y/rukQlG4W3xH+7v4ZlzUbSY4HUIQCuYrF2DrkcHx584mCaFxkWoDZKNUfyLZItHC9VAqX3kIP7XA==",
- "requires": {
- "unist-util-remove": "^1.0.0"
- }
- },
- "mdast-util-compact": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz",
- "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==",
- "requires": {
- "unist-util-visit": "^1.1.0"
- },
- "dependencies": {
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "mdast-util-definitions": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-1.2.5.tgz",
- "integrity": "sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==",
- "requires": {
- "unist-util-visit": "^1.0.0"
- },
- "dependencies": {
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "mdast-util-to-hast": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-7.0.0.tgz",
- "integrity": "sha512-vxnXKSZgvPG2grZM3kxaF052pxsLtq8TPAkiMkqYj1nFTOazYUPXt3LFYIEB6Ws/IX7Uyvljzk64kD6DwZl/wQ==",
- "requires": {
- "collapse-white-space": "^1.0.0",
- "detab": "^2.0.0",
- "mdast-util-definitions": "^1.2.0",
- "mdurl": "^1.0.1",
- "trim-lines": "^1.0.0",
- "unist-builder": "^2.0.0",
- "unist-util-generated": "^1.0.0",
- "unist-util-position": "^3.0.0",
- "unist-util-visit": "^2.0.0"
- }
- },
- "mdast-util-to-nlcst": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/mdast-util-to-nlcst/-/mdast-util-to-nlcst-3.2.3.tgz",
- "integrity": "sha512-hPIsgEg7zCvdU6/qvjcR6lCmJeRuIEpZGY5xBV+pqzuMOvQajyyF8b6f24f8k3Rw8u40GwkI3aAxUXr3bB2xag==",
- "requires": {
- "nlcst-to-string": "^2.0.0",
- "repeat-string": "^1.5.2",
- "unist-util-position": "^3.0.0",
- "vfile-location": "^2.0.0"
- }
- },
- "mdast-util-to-string": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz",
- "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A=="
- },
- "mdast-util-toc": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mdast-util-toc/-/mdast-util-toc-3.1.0.tgz",
- "integrity": "sha512-Za0hqL1PqWrvxGtA/3NH9D5nhGAUS9grMM4obEAz5+zsk1RIw/vWUchkaoDLNdrwk05A0CSC5eEXng36/1qE5w==",
- "requires": {
- "github-slugger": "^1.2.1",
- "mdast-util-to-string": "^1.0.5",
- "unist-util-is": "^2.1.2",
- "unist-util-visit": "^1.1.0"
- },
- "dependencies": {
- "unist-util-is": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz",
- "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA=="
- },
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
- },
- "mdurl": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
- "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
- },
- "meant": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/meant/-/meant-1.0.1.tgz",
- "integrity": "sha512-UakVLFjKkbbUwNWJ2frVLnnAtbb7D7DsloxRd3s/gDpI8rdv8W5Hp3NaDb+POBI1fQdeussER6NB8vpcRURvlg=="
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
- },
- "mem": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
- "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
- "requires": {
- "map-age-cleaner": "^0.1.1",
- "mimic-fn": "^2.0.0",
- "p-is-promise": "^2.0.0"
- },
- "dependencies": {
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
- }
- }
- },
- "memory-fs": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
- "requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- },
- "merge-deep": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz",
- "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==",
- "requires": {
- "arr-union": "^3.1.0",
- "clone-deep": "^0.2.4",
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
- },
- "merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
- },
- "merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw=="
- },
- "mermaid": {
- "version": "8.4.8",
- "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-8.4.8.tgz",
- "integrity": "sha512-sumTNBFwMX7oMQgogdr3NhgTeQOiwcEsm23rQ4KHGW7tpmvMwER1S+1gjCSSnqlmM/zw7Ga7oesYCYicKboRwQ==",
- "requires": {
- "@braintree/sanitize-url": "^3.1.0",
- "crypto-random-string": "^3.0.1",
- "d3": "^5.7.0",
- "dagre": "^0.8.4",
- "dagre-d3": "^0.6.4",
- "graphlib": "^2.1.7",
- "he": "^1.2.0",
- "lodash": "^4.17.11",
- "minify": "^4.1.1",
- "moment-mini": "^2.22.1",
- "scope-css": "^1.2.1"
- },
- "dependencies": {
- "crypto-random-string": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-3.2.0.tgz",
- "integrity": "sha512-8vPu5bsKaq2uKRy3OL7h1Oo7RayAWB8sYexLKAqvCXVib8SxgbmoF1IN4QMKjBv8uI8mp5gPPMbiRah25GMrVQ==",
- "requires": {
- "type-fest": "^0.8.1"
- }
- }
- }
- },
- "methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
- },
- "microevent.ts": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz",
- "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g=="
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "miller-rabin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
- "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
- "requires": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
- }
- },
- "mime": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
- "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA=="
- },
- "mime-db": {
- "version": "1.43.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
- "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ=="
- },
- "mime-types": {
- "version": "2.1.26",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
- "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
- "requires": {
- "mime-db": "1.43.0"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
- },
- "mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
- },
- "min-document": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
- "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=",
- "requires": {
- "dom-walk": "^0.1.0"
- }
- },
- "mini-css-extract-plugin": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz",
- "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==",
- "requires": {
- "loader-utils": "^1.1.0",
- "normalize-url": "1.9.1",
- "schema-utils": "^1.0.0",
- "webpack-sources": "^1.1.0"
- },
- "dependencies": {
- "normalize-url": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
- "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
- "requires": {
- "object-assign": "^4.0.1",
- "prepend-http": "^1.0.0",
- "query-string": "^4.1.0",
- "sort-keys": "^1.0.0"
- }
- },
- "prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
- },
- "query-string": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
- "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
- "requires": {
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- },
- "sort-keys": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
- "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
- "requires": {
- "is-plain-obj": "^1.0.0"
- }
- }
- }
- },
- "minify": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/minify/-/minify-4.1.3.tgz",
- "integrity": "sha512-ykuscavxivSmVpcCzsXmsVTukWYLUUtPhHj0w2ILvHDGqC+hsuTCihBn9+PJBd58JNvWTNg9132J9nrrI2anzA==",
- "requires": {
- "clean-css": "^4.1.6",
- "css-b64-images": "~0.2.5",
- "debug": "^4.1.0",
- "html-minifier": "^4.0.0",
- "terser": "^4.0.0",
- "try-catch": "^2.0.0",
- "try-to-catch": "^1.0.2"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
- },
- "mississippi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
- "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
- "requires": {
- "concat-stream": "^1.5.0",
- "duplexify": "^3.4.2",
- "end-of-stream": "^1.1.0",
- "flush-write-stream": "^1.0.0",
- "from2": "^2.1.0",
- "parallel-transform": "^1.1.0",
- "pump": "^3.0.0",
- "pumpify": "^1.3.3",
- "stream-each": "^1.1.0",
- "through2": "^2.0.0"
- }
- },
- "mitt": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mitt/-/mitt-1.2.0.tgz",
- "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw=="
- },
- "mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mixin-object": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
- "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=",
- "requires": {
- "for-in": "^0.1.3",
- "is-extendable": "^0.1.1"
- },
- "dependencies": {
- "for-in": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
- "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE="
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
- }
- }
- },
- "moment": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
- "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
- },
- "moment-mini": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.24.0.tgz",
- "integrity": "sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ=="
- },
- "move-concurrently": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
- "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
- "requires": {
- "aproba": "^1.1.1",
- "copy-concurrently": "^1.0.0",
- "fs-write-stream-atomic": "^1.0.8",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.5.4",
- "run-queue": "^1.0.3"
- },
- "dependencies": {
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- }
- }
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "multicast-dns": {
- "version": "6.2.3",
- "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
- "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
- "requires": {
- "dns-packet": "^1.3.1",
- "thunky": "^1.0.2"
- }
- },
- "multicast-dns-service-types": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
- "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
- },
- "mute-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
- "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
- },
- "name-all-modules-plugin": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/name-all-modules-plugin/-/name-all-modules-plugin-1.0.1.tgz",
- "integrity": "sha1-Cr+2rYNXGLn7Te8GdOBmV6lUN1w="
- },
- "nan": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
- "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
- "optional": true
- },
- "nano-css": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/nano-css/-/nano-css-5.3.0.tgz",
- "integrity": "sha512-uM/9NGK9/E9/sTpbIZ/bQ9xOLOIHZwrrb/CRlbDHBU/GFS7Gshl24v/WJhwsVViWkpOXUmiZ66XO7fSB4Wd92Q==",
- "requires": {
- "css-tree": "^1.0.0-alpha.28",
- "csstype": "^2.5.5",
- "fastest-stable-stringify": "^1.0.1",
- "inline-style-prefixer": "^4.0.0",
- "rtl-css-js": "^1.9.0",
- "sourcemap-codec": "^1.4.1",
- "stacktrace-js": "^2.0.0",
- "stylis": "3.5.0"
- }
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- }
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
- },
- "neo-async": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
- "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
- },
- "next-tick": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
- "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ=="
- },
- "nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
- },
- "nlcst-to-string": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/nlcst-to-string/-/nlcst-to-string-2.0.4.tgz",
- "integrity": "sha512-3x3jwTd6UPG7vi5k4GEzvxJ5rDA7hVUIRNHPblKuMVP9Z3xmlsd9cgLcpAMkc5uPOBna82EeshROFhsPkbnTZg=="
- },
- "no-case": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
- "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
- "requires": {
- "lower-case": "^1.1.1"
- }
- },
- "node-emoji": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz",
- "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==",
- "requires": {
- "lodash.toarray": "^4.4.0"
- }
- },
- "node-eta": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/node-eta/-/node-eta-0.9.0.tgz",
- "integrity": "sha1-n7CwmbzSoCGUDmA8ZCVNwAPZp6g="
- },
- "node-fetch": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
- "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U="
- },
- "node-forge": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz",
- "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ=="
- },
- "node-libs-browser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
- "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
- "requires": {
- "assert": "^1.1.1",
- "browserify-zlib": "^0.2.0",
- "buffer": "^4.3.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "^1.0.0",
- "crypto-browserify": "^3.11.0",
- "domain-browser": "^1.1.1",
- "events": "^3.0.0",
- "https-browserify": "^1.0.0",
- "os-browserify": "^0.3.0",
- "path-browserify": "0.0.1",
- "process": "^0.11.10",
- "punycode": "^1.2.4",
- "querystring-es3": "^0.2.0",
- "readable-stream": "^2.3.3",
- "stream-browserify": "^2.0.1",
- "stream-http": "^2.7.2",
- "string_decoder": "^1.0.0",
- "timers-browserify": "^2.0.4",
- "tty-browserify": "0.0.0",
- "url": "^0.11.0",
- "util": "^0.11.0",
- "vm-browserify": "^1.0.1"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
- }
- }
- },
- "node-object-hash": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/node-object-hash/-/node-object-hash-2.0.0.tgz",
- "integrity": "sha512-VZR0zroAusy1ETZMZiGeLkdu50LGjG5U1KHZqTruqtTyQ2wfWhHG2Ow4nsUbfTFGlaREgNHcCWoM/OzEm6p+NQ=="
- },
- "node-releases": {
- "version": "1.1.47",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz",
- "integrity": "sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==",
- "requires": {
- "semver": "^6.3.0"
- },
- "dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "noms": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
- "integrity": "sha1-2o69nzr51nYJGbJ9nNyAkqczKFk=",
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "~1.0.31"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
- }
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- },
- "normalize-range": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
- "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
- },
- "normalize-url": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
- "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
- "requires": {
- "boolbase": "~1.0.0"
- }
- },
- "null-loader": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-0.1.1.tgz",
- "integrity": "sha1-F76av80/8OFRL2/Er8sfUDk3j64="
- },
- "num2fraction": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz",
- "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
- },
- "object-component": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
- "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE="
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "object-hash": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
- "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA=="
- },
- "object-inspect": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
- "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
- },
- "object-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz",
- "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ=="
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
- },
- "object-path": {
- "version": "0.11.4",
- "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz",
- "integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk="
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "requires": {
- "isobject": "^3.0.0"
- }
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "object.entries": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz",
- "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "object.fromentries": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.2.tgz",
- "integrity": "sha512-r3ZiBH7MQppDJVLx6fhD618GKNG40CZYH9wgwdhKxBDDbQgjeWGGd4AtkZad84d291YxvWe7bJGuE65Anh0dxQ==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "object.getownpropertydescriptors": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
- "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "object.values": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
- "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1",
- "function-bind": "^1.1.1",
- "has": "^1.0.3"
- }
- },
- "obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
- },
- "octal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz",
- "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws="
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1"
- }
- },
- "onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "open": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
- "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
- "requires": {
- "is-wsl": "^1.1.0"
- },
- "dependencies": {
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- }
- }
- },
- "opentracing": {
- "version": "0.14.4",
- "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.4.tgz",
- "integrity": "sha512-nNnZDkUNExBwEpb7LZaeMeQgvrlO8l4bgY/LvGNZCR0xG/dGWqHqjKrAmR5GUoYo0FIz38kxasvA1aevxWs2CA=="
- },
- "opn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz",
- "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==",
- "requires": {
- "is-wsl": "^1.1.0"
- },
- "dependencies": {
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- }
- }
- },
- "optimize-css-assets-webpack-plugin": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.3.tgz",
- "integrity": "sha512-q9fbvCRS6EYtUKKSwI87qm2IxlyJK5b4dygW1rKUBT6mMDhdG5e5bZT63v6tnJR9F9FB/H5a0HTmtw+laUBxKA==",
- "requires": {
- "cssnano": "^4.1.10",
- "last-call-webpack-plugin": "^3.0.0"
- }
- },
- "optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- }
- },
- "original": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
- "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
- "requires": {
- "url-parse": "^1.4.3"
- }
- },
- "os-browserify": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
- "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
- },
- "os-locale": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
- "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
- "requires": {
- "execa": "^1.0.0",
- "lcid": "^2.0.0",
- "mem": "^4.0.0"
- },
- "dependencies": {
- "execa": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
- "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
- "requires": {
- "cross-spawn": "^6.0.0",
- "get-stream": "^4.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- }
- }
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
- "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
- },
- "p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
- },
- "p-defer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz",
- "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw=="
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
- },
- "p-is-promise": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
- "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg=="
- },
- "p-limit": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
- "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "requires": {
- "p-limit": "^2.0.0"
- }
- },
- "p-map": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
- "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
- "requires": {
- "aggregate-error": "^3.0.0"
- }
- },
- "p-queue": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-5.0.0.tgz",
- "integrity": "sha512-6QfeouDf236N+MAxHch0CVIy8o/KBnmhttKjxZoOkUlzqU+u9rZgEyXH3OdckhTgawbqf5rpzmyR+07+Lv0+zg==",
- "requires": {
- "eventemitter3": "^3.1.0"
- },
- "dependencies": {
- "eventemitter3": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
- "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="
- }
- }
- },
- "p-retry": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz",
- "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
- "requires": {
- "retry": "^0.12.0"
- }
- },
- "p-timeout": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz",
- "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==",
- "requires": {
- "p-finally": "^1.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
- },
- "package-json": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
- "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
- "requires": {
- "got": "^9.6.0",
- "registry-auth-token": "^4.0.0",
- "registry-url": "^5.0.0",
- "semver": "^6.2.0"
- },
- "dependencies": {
- "got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "requires": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- }
- }
- },
- "pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
- },
- "parallel-transform": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz",
- "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
- "requires": {
- "cyclist": "^1.0.1",
- "inherits": "^2.0.3",
- "readable-stream": "^2.1.5"
- }
- },
- "param-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
- "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
- "requires": {
- "no-case": "^2.2.0"
- }
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-asn1": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
- "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
- "requires": {
- "asn1.js": "^4.0.0",
- "browserify-aes": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
- }
- },
- "parse-english": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/parse-english/-/parse-english-4.1.3.tgz",
- "integrity": "sha512-IQl1v/ik9gw437T8083coohMihae0rozpc7JYC/9h6hi9xKBSxFwh5HWRpzVC2ZhEs2nUlze2aAktpNBJXdJKA==",
- "requires": {
- "nlcst-to-string": "^2.0.0",
- "parse-latin": "^4.0.0",
- "unist-util-modify-children": "^1.0.0",
- "unist-util-visit-children": "^1.0.0"
- }
- },
- "parse-entities": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
- "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
- "requires": {
- "character-entities": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "character-reference-invalid": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- }
- },
- "parse-json": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz",
- "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==",
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1",
- "lines-and-columns": "^1.1.6"
- }
- },
- "parse-latin": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-4.2.1.tgz",
- "integrity": "sha512-7T9g6mIsFFpLlo0Zzb2jLWdCt+H9Qtf/hRmMYFi/Mq6Ovi+YKo+AyDFX3OhFfu0vXX5Nid9FKJGKSSzNcTkWiA==",
- "requires": {
- "nlcst-to-string": "^2.0.0",
- "unist-util-modify-children": "^1.0.0",
- "unist-util-visit-children": "^1.0.0"
- }
- },
- "parse-numeric-range": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-0.0.2.tgz",
- "integrity": "sha1-tPCdQTx6282Yf26SM8e0shDJOOQ="
- },
- "parse-passwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY="
- },
- "parse-path": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz",
- "integrity": "sha512-d7yhga0Oc+PwNXDvQ0Jv1BuWkLVPXcAoQ/WREgd6vNNoKYaW52KI+RdOFjI63wjkmps9yUE8VS4veP+AgpQ/hA==",
- "requires": {
- "is-ssh": "^1.3.0",
- "protocols": "^1.4.0"
- }
- },
- "parse-url": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz",
- "integrity": "sha512-flNUPP27r3vJpROi0/R3/2efgKkyXqnXwyP1KQ2U0SfFRgdizOdWfvrrvJg1LuOoxs7GQhmxJlq23IpQ/BkByg==",
- "requires": {
- "is-ssh": "^1.3.0",
- "normalize-url": "^3.3.0",
- "parse-path": "^4.0.0",
- "protocols": "^1.4.0"
- }
- },
- "parse5": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz",
- "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="
- },
- "parseqs": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
- "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
- "requires": {
- "better-assert": "~1.0.0"
- }
- },
- "parseuri": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
- "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
- "requires": {
- "better-assert": "~1.0.0"
- }
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
- },
- "pascal-case": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz",
- "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=",
- "requires": {
- "camel-case": "^3.0.0",
- "upper-case-first": "^1.1.0"
- }
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
- },
- "password-prompt": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/password-prompt/-/password-prompt-1.1.2.tgz",
- "integrity": "sha512-bpuBhROdrhuN3E7G/koAju0WjVw9/uQOG5Co5mokNj0MiOSBVZS1JTwM4zl55hu0WFmIEFvO9cU9sJQiBIYeIA==",
- "requires": {
- "ansi-escapes": "^3.1.0",
- "cross-spawn": "^6.0.5"
- }
- },
- "path-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
- "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
- },
- "path-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz",
- "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=",
- "requires": {
- "no-case": "^2.2.0"
- }
- },
- "path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
- },
- "path-is-inside": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
- "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
- },
- "path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
- },
- "path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
- },
- "pbkdf2": {
- "version": "3.0.17",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
- "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
- "requires": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
- },
- "physical-cpu-count": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz",
- "integrity": "sha1-GN4vl+S/epVRrXURlCtUlverpmA="
- },
- "picomatch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
- "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA=="
- },
- "pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
- },
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
- },
- "pinkie-promise": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
- "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
- "requires": {
- "pinkie": "^2.0.0"
- }
- },
- "pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
- "requires": {
- "find-up": "^3.0.0"
- }
- },
- "pkg-up": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz",
- "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
- "requires": {
- "find-up": "^3.0.0"
- }
- },
- "pnp-webpack-plugin": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
- "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==",
- "requires": {
- "ts-pnp": "^1.1.6"
- }
- },
- "polished": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/polished/-/polished-2.3.3.tgz",
- "integrity": "sha512-59V4fDbdxtH4I1m9TWxFsoGJbC8nnOpUYo5uFmvMfKp9Qh+6suo4VMUle1TGIIUZIGxfkW+Rs485zPk0wcwR2Q==",
- "requires": {
- "@babel/runtime": "^7.2.0"
- }
- },
- "portfinder": {
- "version": "1.0.25",
- "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz",
- "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==",
- "requires": {
- "async": "^2.6.2",
- "debug": "^3.1.1",
- "mkdirp": "^0.5.1"
- },
- "dependencies": {
- "async": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
- "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
- "requires": {
- "lodash": "^4.17.14"
- }
- }
- }
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
- },
- "postcss": {
- "version": "7.0.27",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
- "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
- "requires": {
- "chalk": "^2.4.2",
- "source-map": "^0.6.1",
- "supports-color": "^6.1.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "postcss-calc": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz",
- "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==",
- "requires": {
- "postcss": "^7.0.27",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.0.2"
- }
- },
- "postcss-colormin": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
- "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
- "requires": {
- "browserslist": "^4.0.0",
- "color": "^3.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-convert-values": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
- "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
- "requires": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-discard-comments": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
- "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-discard-duplicates": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
- "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-discard-empty": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
- "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-discard-overridden": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
- "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-flexbugs-fixes": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.0.tgz",
- "integrity": "sha512-QRE0n3hpkxxS/OGvzOa+PDuy4mh/Jg4o9ui22/ko5iGYOG3M5dfJabjnAZjTdh2G9F85c7Hv8hWcEDEKW/xceQ==",
- "requires": {
- "postcss": "^7.0.26"
- }
- },
- "postcss-load-config": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
- "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==",
- "requires": {
- "cosmiconfig": "^5.0.0",
- "import-cwd": "^2.0.0"
- },
- "dependencies": {
- "cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "requires": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- }
- },
- "import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
- "requires": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- }
- },
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
- }
- }
- },
- "postcss-loader": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz",
- "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==",
- "requires": {
- "loader-utils": "^1.1.0",
- "postcss": "^7.0.0",
- "postcss-load-config": "^2.0.0",
- "schema-utils": "^1.0.0"
- },
- "dependencies": {
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "postcss-merge-longhand": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
- "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
- "requires": {
- "css-color-names": "0.0.4",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "stylehacks": "^4.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-merge-rules": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
- "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
- "requires": {
- "browserslist": "^4.0.0",
- "caniuse-api": "^3.0.0",
- "cssnano-util-same-parent": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0",
- "vendors": "^1.0.0"
- },
- "dependencies": {
- "postcss-selector-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
- "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
- "requires": {
- "dot-prop": "^5.2.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-minify-font-values": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
- "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
- "requires": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-minify-gradients": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
- "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
- "requires": {
- "cssnano-util-get-arguments": "^4.0.0",
- "is-color-stop": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-minify-params": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
- "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
- "requires": {
- "alphanum-sort": "^1.0.0",
- "browserslist": "^4.0.0",
- "cssnano-util-get-arguments": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "uniqs": "^2.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-minify-selectors": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
- "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
- "requires": {
- "alphanum-sort": "^1.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-selector-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
- "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
- "requires": {
- "dot-prop": "^5.2.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "postcss-modules-extract-imports": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz",
- "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==",
- "requires": {
- "postcss": "^6.0.1"
- },
- "dependencies": {
- "postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
- "requires": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "postcss-modules-local-by-default": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
- "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
- "requires": {
- "css-selector-tokenizer": "^0.7.0",
- "postcss": "^6.0.1"
- },
- "dependencies": {
- "postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
- "requires": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "postcss-modules-scope": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
- "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
- "requires": {
- "css-selector-tokenizer": "^0.7.0",
- "postcss": "^6.0.1"
- },
- "dependencies": {
- "postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
- "requires": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "postcss-modules-values": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
- "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
- "requires": {
- "icss-replace-symbols": "^1.1.0",
- "postcss": "^6.0.1"
- },
- "dependencies": {
- "postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
- "requires": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "postcss-normalize-charset": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
- "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
- "requires": {
- "postcss": "^7.0.0"
- }
- },
- "postcss-normalize-display-values": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
- "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
- "requires": {
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-normalize-positions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
- "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
- "requires": {
- "cssnano-util-get-arguments": "^4.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-normalize-repeat-style": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
- "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
- "requires": {
- "cssnano-util-get-arguments": "^4.0.0",
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-normalize-string": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
- "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
- "requires": {
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-normalize-timing-functions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
- "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
- "requires": {
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-normalize-unicode": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
- "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
- "requires": {
- "browserslist": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-normalize-url": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
- "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
- "requires": {
- "is-absolute-url": "^2.0.0",
- "normalize-url": "^3.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "is-absolute-url": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
- "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
- },
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-normalize-whitespace": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
- "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
- "requires": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-ordered-values": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
- "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
- "requires": {
- "cssnano-util-get-arguments": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-reduce-initial": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
- "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
- "requires": {
- "browserslist": "^4.0.0",
- "caniuse-api": "^3.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0"
- }
- },
- "postcss-reduce-transforms": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
- "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
- "requires": {
- "cssnano-util-get-match": "^4.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-selector-parser": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
- "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
- "requires": {
- "cssesc": "^3.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- },
- "postcss-svgo": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
- "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
- "requires": {
- "is-svg": "^3.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "svgo": "^1.0.0"
- },
- "dependencies": {
- "postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
- }
- }
- },
- "postcss-unique-selectors": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
- "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
- "requires": {
- "alphanum-sort": "^1.0.0",
- "postcss": "^7.0.0",
- "uniqs": "^2.0.0"
- }
- },
- "postcss-value-parser": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
- "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg=="
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
- },
- "prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
- },
- "prettier": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
- "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew=="
- },
- "pretty-bytes": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.3.0.tgz",
- "integrity": "sha512-hjGrh+P926p4R4WbaB6OckyRtO0F0/lQBiT+0gnxjV+5kjPBrfVBFCsCLbMqVQeydvIoouYTCmmEURiH3R1Bdg=="
- },
- "pretty-error": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz",
- "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=",
- "requires": {
- "renderkid": "^2.0.1",
- "utila": "~0.4"
- }
- },
- "prismjs": {
- "version": "1.19.0",
- "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.19.0.tgz",
- "integrity": "sha512-IVFtbW9mCWm9eOIaEkNyo2Vl4NnEifis2GQ7/MLRG5TQe6t+4Sj9J5QWI9i3v+SS43uZBlCAOn+zYTVYQcPXJw==",
- "requires": {
- "clipboard": "^2.0.0"
- }
- },
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg=="
- },
- "probe-image-size": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-4.1.1.tgz",
- "integrity": "sha512-42LqKZqTLxH/UvAZ2/cKhAsR4G/Y6B7i7fI2qtQu9hRBK4YjS6gqO+QRtwTjvojUx4+/+JuOMzLoFyRecT9qRw==",
- "requires": {
- "any-promise": "^1.3.0",
- "deepmerge": "^4.0.0",
- "inherits": "^2.0.3",
- "next-tick": "^1.0.0",
- "request": "^2.83.0",
- "stream-parser": "~0.3.1"
- }
- },
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
- },
- "process-es6": {
- "version": "0.11.6",
- "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz",
- "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g="
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
- },
- "promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
- "requires": {
- "asap": "~2.0.3"
- }
- },
- "promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
- },
- "prompts": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz",
- "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==",
- "requires": {
- "kleur": "^3.0.3",
- "sisteransi": "^1.0.4"
- }
- },
- "prop-types": {
- "version": "15.7.2",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
- "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
- "requires": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.8.1"
- }
- },
- "property-information": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.4.0.tgz",
- "integrity": "sha512-nmMWAm/3vKFGmmOWOcdLjgq/Hlxa+hsuR/px1Lp/UGEyc5A22A6l78Shc2C0E71sPmAqglni+HrS7L7VJ7AUCA==",
- "requires": {
- "xtend": "^4.0.0"
- }
- },
- "protocols": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.7.tgz",
- "integrity": "sha512-Fx65lf9/YDn3hUX08XUc0J8rSux36rEsyiv21ZGUC1mOyeM3lTRpZLcrm8aAolzS4itwVfm7TAPyxC2E5zd6xg=="
- },
- "proxy-addr": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
- "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
- "requires": {
- "forwarded": "~0.1.2",
- "ipaddr.js": "1.9.1"
- }
- },
- "proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
- },
- "psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
- },
- "public-encrypt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
- "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
- "requires": {
- "bn.js": "^4.1.0",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "parse-asn1": "^5.0.0",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "pumpify": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
- "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
- "requires": {
- "duplexify": "^3.6.0",
- "inherits": "^2.0.3",
- "pump": "^2.0.0"
- },
- "dependencies": {
- "pump": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
- "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- }
- }
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
- },
- "puppeteer": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.20.0.tgz",
- "integrity": "sha512-bt48RDBy2eIwZPrkgbcwHtb51mj2nKvHOPMaSH2IsWiv7lOG9k9zhaRzpDZafrk05ajMc3cu+lSQYYOfH2DkVQ==",
- "requires": {
- "debug": "^4.1.0",
- "extract-zip": "^1.6.6",
- "https-proxy-agent": "^2.2.1",
- "mime": "^2.0.3",
- "progress": "^2.0.1",
- "proxy-from-env": "^1.0.0",
- "rimraf": "^2.6.1",
- "ws": "^6.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "ws": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
- "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
- "requires": {
- "async-limiter": "~1.0.0"
- }
- }
- }
- },
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
- },
- "qs": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
- "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
- },
- "query-string": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
- "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
- "requires": {
- "decode-uri-component": "^0.2.0",
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- }
- },
- "querystring": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
- "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
- },
- "querystring-es3": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
- },
- "querystringify": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz",
- "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA=="
- },
- "randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "requires": {
- "safe-buffer": "^5.1.0"
- }
- },
- "randomfill": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
- "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
- "requires": {
- "randombytes": "^2.0.5",
- "safe-buffer": "^5.1.0"
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
- },
- "raw-body": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
- "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
- "requires": {
- "bytes": "3.1.0",
- "http-errors": "1.7.2",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "dependencies": {
- "bytes": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
- "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
- }
- }
- },
- "raw-loader": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
- "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao="
- },
- "rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
- "requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
- }
- }
- },
- "react": {
- "version": "16.12.0",
- "resolved": "https://registry.npmjs.org/react/-/react-16.12.0.tgz",
- "integrity": "sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "prop-types": "^15.6.2"
- }
- },
- "react-dev-utils": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-4.2.3.tgz",
- "integrity": "sha512-uvmkwl5uMexCmC0GUv1XGQP0YjfYePJufGg4YYiukhqk2vN1tQxwWJIBERqhOmSi80cppZg8mZnPP/kOMf1sUQ==",
- "requires": {
- "address": "1.0.3",
- "babel-code-frame": "6.26.0",
- "chalk": "1.1.3",
- "cross-spawn": "5.1.0",
- "detect-port-alt": "1.1.3",
- "escape-string-regexp": "1.0.5",
- "filesize": "3.5.11",
- "global-modules": "1.0.0",
- "gzip-size": "3.0.0",
- "inquirer": "3.3.0",
- "is-root": "1.0.0",
- "opn": "5.1.0",
- "react-error-overlay": "^3.0.0",
- "recursive-readdir": "2.2.1",
- "shell-quote": "1.6.1",
- "sockjs-client": "1.1.4",
- "strip-ansi": "3.0.1",
- "text-table": "0.2.0"
- },
- "dependencies": {
- "address": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/address/-/address-1.0.3.tgz",
- "integrity": "sha512-z55ocwKBRLryBs394Sm3ushTtBeg6VAeuku7utSoSnsJKvKcnXFIyC6vh27n3rXyxSgkJBBCAvyOn7gSUcTYjg=="
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "chardet": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz",
- "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I="
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "detect-port-alt": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.3.tgz",
- "integrity": "sha1-pNLwYddXoDTs83xRQmCph1DysTE=",
- "requires": {
- "address": "^1.0.1",
- "debug": "^2.6.0"
- }
- },
- "eventsource": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz",
- "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=",
- "requires": {
- "original": ">=0.0.5"
- }
- },
- "external-editor": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz",
- "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==",
- "requires": {
- "chardet": "^0.4.0",
- "iconv-lite": "^0.4.17",
- "tmp": "^0.0.33"
- }
- },
- "filesize": {
- "version": "3.5.11",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.5.11.tgz",
- "integrity": "sha512-ZH7loueKBoDb7yG9esn1U+fgq7BzlzW6NRi5/rMdxIZ05dj7GFD/Xc5rq2CDt5Yq86CyfSYVyx4242QQNZbx1g=="
- },
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "requires": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- }
- },
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "requires": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
- }
- },
- "gzip-size": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz",
- "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=",
- "requires": {
- "duplexer": "^0.1.1"
- }
- },
- "inquirer": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz",
- "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==",
- "requires": {
- "ansi-escapes": "^3.0.0",
- "chalk": "^2.0.0",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^2.0.4",
- "figures": "^2.0.0",
- "lodash": "^4.3.0",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rx-lite": "^4.0.8",
- "rx-lite-aggregates": "^4.0.8",
- "string-width": "^2.1.0",
- "strip-ansi": "^4.0.0",
- "through": "^2.3.6"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
- }
- },
- "is-root": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz",
- "integrity": "sha1-B7bCM7w5TNnQK6FclmvWZg1jQtU="
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "minimatch": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
- "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
- "requires": {
- "brace-expansion": "^1.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "recursive-readdir": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.1.tgz",
- "integrity": "sha1-kO8jHQd4xc4JPJpI105cVCLROpk=",
- "requires": {
- "minimatch": "3.0.3"
- }
- },
- "shell-quote": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
- "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
- "requires": {
- "array-filter": "~0.0.0",
- "array-map": "~0.0.0",
- "array-reduce": "~0.0.0",
- "jsonify": "~0.0.0"
- }
- },
- "sockjs-client": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz",
- "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=",
- "requires": {
- "debug": "^2.6.6",
- "eventsource": "0.1.6",
- "faye-websocket": "~0.11.0",
- "inherits": "^2.0.1",
- "json3": "^3.3.2",
- "url-parse": "^1.1.8"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
- }
- }
- },
- "react-dom": {
- "version": "16.12.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.12.0.tgz",
- "integrity": "sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "prop-types": "^15.6.2",
- "scheduler": "^0.18.0"
- }
- },
- "react-error-overlay": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-3.0.0.tgz",
- "integrity": "sha512-XzgvowFrwDo6TWcpJ/WTiarb9UI6lhA4PMzS7n1joK3sHfBBBOQHUc0U4u57D6DWO9vHv6lVSWx2Q/Ymfyv4hw=="
- },
- "react-fast-compare": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
- "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
- },
- "react-helmet": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.1.tgz",
- "integrity": "sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA==",
- "requires": {
- "object-assign": "^4.1.1",
- "prop-types": "^15.5.4",
- "react-fast-compare": "^2.0.2",
- "react-side-effect": "^1.1.0"
- }
- },
- "react-hot-loader": {
- "version": "4.12.20",
- "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-4.12.20.tgz",
- "integrity": "sha512-lPlv1HVizi0lsi+UFACBJaydtRYILWkfHAC/lyCs6ZlAxlOZRQIfYHDqiGaRvL/GF7zyti+Qn9XpnDAUvdFA4A==",
- "requires": {
- "fast-levenshtein": "^2.0.6",
- "global": "^4.3.0",
- "hoist-non-react-statics": "^3.3.0",
- "loader-utils": "^1.1.0",
- "prop-types": "^15.6.1",
- "react-lifecycles-compat": "^3.0.4",
- "shallowequal": "^1.1.0",
- "source-map": "^0.7.3"
- },
- "dependencies": {
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
- }
- }
- },
- "react-instantsearch-core": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/react-instantsearch-core/-/react-instantsearch-core-6.3.0.tgz",
- "integrity": "sha512-mBCgloOs4wkuKHRypPiGZYSYSdT9wngXB3SAr+f02VpiJQFzllcB3Qn9pBFy1Zc7ROdlRovTbpFXFJmJjiWBjA==",
- "requires": {
- "@babel/runtime": "^7.1.2",
- "algoliasearch-helper": "^3.1.0",
- "fast-deep-equal": "^2.0.1",
- "prop-types": "^15.5.10"
- },
- "dependencies": {
- "fast-deep-equal": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
- }
- }
- },
- "react-instantsearch-dom": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/react-instantsearch-dom/-/react-instantsearch-dom-6.3.0.tgz",
- "integrity": "sha512-8B0jkwLLXeLZ0zf+YbND0e2Wqgntf+ez/xdOqQ6oLrLRpQqhf4T6IBanuqBkx+ce5/7JW4mLjZCBeMTj9Svd4g==",
- "requires": {
- "@babel/runtime": "^7.1.2",
- "algoliasearch-helper": "^3.1.0",
- "classnames": "^2.2.5",
- "prop-types": "^15.5.10",
- "react-instantsearch-core": "^6.3.0"
- }
- },
- "react-is": {
- "version": "16.12.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz",
- "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q=="
- },
- "react-lifecycles-compat": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
- "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
- },
- "react-reconciler": {
- "version": "0.24.0",
- "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.24.0.tgz",
- "integrity": "sha512-gAGnwWkf+NOTig9oOowqid9O0HjTDC+XVGBCAmJYYJ2A2cN/O4gDdIuuUQjv8A4v6GDwVfJkagpBBLW5OW9HSw==",
- "optional": true,
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1",
- "prop-types": "^15.6.2",
- "scheduler": "^0.18.0"
- }
- },
- "react-refresh": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.7.2.tgz",
- "integrity": "sha512-u5l7fhAJXecWUJzVxzMRU2Zvw8m4QmDNHlTrT5uo3KBlYBhmChd7syAakBoay1yIiVhx/8Fi7a6v6kQZfsw81Q=="
- },
- "react-side-effect": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.2.0.tgz",
- "integrity": "sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w==",
- "requires": {
- "shallowequal": "^1.0.1"
- }
- },
- "react-textfit": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/react-textfit/-/react-textfit-1.1.0.tgz",
- "integrity": "sha512-iznFbj7fCizuo3Xof9iv57I8GZFiYp8vUFj+4qihHJZpzNwxWad7JZu7ALTAnwaiq/H0p60g8G4ifeEJYmfJuw==",
- "requires": {
- "process": "^0.11.9",
- "prop-types": "^15.5.10"
- }
- },
- "react-use": {
- "version": "9.12.0",
- "resolved": "https://registry.npmjs.org/react-use/-/react-use-9.12.0.tgz",
- "integrity": "sha512-aqY+w2nzwZnyJEizW4mhWMUUC0HtCLuxZIN7UW5oTTbNzlinOn3cgQCApGqjtjP7g9TXMroHU9WA0rYwShAVJA==",
- "requires": {
- "copy-to-clipboard": "^3.1.0",
- "nano-css": "^5.1.0",
- "react-fast-compare": "^2.0.4",
- "react-wait": "^0.3.0",
- "screenfull": "^4.1.0",
- "throttle-debounce": "^2.0.1",
- "ts-easing": "^0.2.0"
- }
- },
- "react-wait": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/react-wait/-/react-wait-0.3.0.tgz",
- "integrity": "sha512-kB5x/kMKWcn0uVr9gBdNz21/oGbQwEQnF3P9p6E9yLfJ9DRcKS0fagbgYMFI0YFOoyKDj+2q6Rwax0kTYJF37g=="
- },
- "read": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
- "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
- "requires": {
- "mute-stream": "~0.0.4"
- }
- },
- "read-chunk": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-3.2.0.tgz",
- "integrity": "sha512-CEjy9LCzhmD7nUpJ1oVOE6s/hBkejlcJEgLQHVnQznOSilOPb+kpKktlLfFDK3/WP43+F80xkUTM2VOkYoSYvQ==",
- "requires": {
- "pify": "^4.0.1",
- "with-open-file": "^0.1.6"
- }
- },
- "read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
- "requires": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
- },
- "dependencies": {
- "path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
- "requires": {
- "pify": "^2.0.0"
- }
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- },
- "read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
- },
- "dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M="
- }
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
- "requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- }
- },
- "recompose": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/recompose/-/recompose-0.30.0.tgz",
- "integrity": "sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==",
- "requires": {
- "@babel/runtime": "^7.0.0",
- "change-emitter": "^0.1.2",
- "fbjs": "^0.8.1",
- "hoist-non-react-statics": "^2.3.1",
- "react-lifecycles-compat": "^3.0.2",
- "symbol-observable": "^1.0.4"
- },
- "dependencies": {
- "hoist-non-react-statics": {
- "version": "2.5.5",
- "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
- "integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
- }
- }
- },
- "recursive-readdir": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
- "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
- "requires": {
- "minimatch": "3.0.4"
- }
- },
- "redux": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz",
- "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==",
- "requires": {
- "loose-envify": "^1.4.0",
- "symbol-observable": "^1.2.0"
- }
- },
- "redux-thunk": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.3.0.tgz",
- "integrity": "sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw=="
- },
- "regenerate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
- "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg=="
- },
- "regenerate-unicode-properties": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
- "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
- "requires": {
- "regenerate": "^1.4.0"
- }
- },
- "regenerator-runtime": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
- "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw=="
- },
- "regenerator-transform": {
- "version": "0.14.4",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz",
- "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==",
- "requires": {
- "@babel/runtime": "^7.8.4",
- "private": "^0.1.8"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexp.prototype.flags": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
- "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0-next.1"
- }
- },
- "regexpp": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.0.0.tgz",
- "integrity": "sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g=="
- },
- "regexpu-core": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
- "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
- "requires": {
- "regenerate": "^1.4.0",
- "regenerate-unicode-properties": "^8.1.0",
- "regjsgen": "^0.5.0",
- "regjsparser": "^0.6.0",
- "unicode-match-property-ecmascript": "^1.0.4",
- "unicode-match-property-value-ecmascript": "^1.1.0"
- }
- },
- "registry-auth-token": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz",
- "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==",
- "requires": {
- "rc": "^1.2.8"
- }
- },
- "registry-url": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
- "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
- "requires": {
- "rc": "^1.2.8"
- }
- },
- "regjsgen": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
- "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg=="
- },
- "regjsparser": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.2.tgz",
- "integrity": "sha512-E9ghzUtoLwDekPT0DYCp+c4h+bvuUpe6rRHCTYn6eGoqj1LgKXxT6I0Il4WbjhQkOghzi/V+y03bPKvbllL93Q==",
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
- }
- }
- },
- "rehype-react": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/rehype-react/-/rehype-react-3.1.0.tgz",
- "integrity": "sha512-7SiLiqNudSGkvhrePkdKqdUvngZqzG+PJhdR5EeIFELz2j2ek4aO5DHbxUXYvaZfqUiBDO2Aeq1OROUmxmu+Vg==",
- "requires": {
- "@mapbox/hast-util-table-cell-style": "^0.1.3",
- "has": "^1.0.1",
- "hast-to-hyperscript": "^5.0.0"
- },
- "dependencies": {
- "hast-to-hyperscript": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-5.0.0.tgz",
- "integrity": "sha512-DLl3eYTz8uwwzEubDUdCChsR5t5b2ne+yvHrA2h58Suq/JnN3+Gsb9Tc4iZoCCsykmFUc6UUpwxTmQXs0akSeg==",
- "requires": {
- "comma-separated-tokens": "^1.0.0",
- "property-information": "^4.0.0",
- "space-separated-tokens": "^1.0.0",
- "style-to-object": "^0.2.1",
- "unist-util-is": "^2.0.0",
- "web-namespaces": "^1.1.2"
- }
- },
- "property-information": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/property-information/-/property-information-4.2.0.tgz",
- "integrity": "sha512-TlgDPagHh+eBKOnH2VYvk8qbwsCG/TAJdmTL7f1PROUcSO8qt/KSmShEQ/OKvock8X9tFjtqjCScyOkkkvIKVQ==",
- "requires": {
- "xtend": "^4.0.1"
- }
- },
- "style-to-object": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz",
- "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==",
- "requires": {
- "inline-style-parser": "0.1.1"
- }
- },
- "unist-util-is": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz",
- "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA=="
- }
- }
- },
- "relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
- },
- "remark": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz",
- "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==",
- "requires": {
- "remark-parse": "^6.0.0",
- "remark-stringify": "^6.0.0",
- "unified": "^7.0.0"
- },
- "dependencies": {
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
- },
- "remark-parse": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz",
- "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==",
- "requires": {
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^1.1.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^1.0.0",
- "vfile-location": "^2.0.0",
- "xtend": "^4.0.1"
- }
- },
- "unified": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz",
- "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==",
- "requires": {
- "@types/unist": "^2.0.0",
- "@types/vfile": "^3.0.0",
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-plain-obj": "^1.1.0",
- "trough": "^1.0.0",
- "vfile": "^3.0.0",
- "x-is-string": "^0.1.0"
- }
- },
- "unist-util-stringify-position": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
- "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ=="
- },
- "vfile": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz",
- "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==",
- "requires": {
- "is-buffer": "^2.0.0",
- "replace-ext": "1.0.0",
- "unist-util-stringify-position": "^1.0.0",
- "vfile-message": "^1.0.0"
- }
- },
- "vfile-message": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
- "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
- "requires": {
- "unist-util-stringify-position": "^1.1.1"
- }
- }
- }
- },
- "remark-mdx": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.5.8.tgz",
- "integrity": "sha512-wtqqsDuO/mU/ucEo/CDp0L8SPdS2oOE6PRsMm+lQ9TLmqgep4MBmyH8bLpoc8Wf7yjNmae/5yBzUN1YUvR/SsQ==",
- "requires": {
- "@babel/core": "7.8.4",
- "@babel/helper-plugin-utils": "7.8.3",
- "@babel/plugin-proposal-object-rest-spread": "7.8.3",
- "@babel/plugin-syntax-jsx": "7.8.3",
- "@mdx-js/util": "^1.5.8",
- "is-alphabetical": "1.0.4",
- "remark-parse": "7.0.2",
- "unified": "8.4.2"
- }
- },
- "remark-parse": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-7.0.2.tgz",
- "integrity": "sha512-9+my0lQS80IQkYXsMA8Sg6m9QfXYJBnXjWYN5U+kFc5/n69t+XZVXU/ZBYr3cYH8FheEGf1v87rkFDhJ8bVgMA==",
- "requires": {
- "collapse-white-space": "^1.0.2",
- "is-alphabetical": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "is-word-character": "^1.0.0",
- "markdown-escapes": "^1.0.0",
- "parse-entities": "^1.1.0",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "trim": "0.0.1",
- "trim-trailing-lines": "^1.0.0",
- "unherit": "^1.0.4",
- "unist-util-remove-position": "^1.0.0",
- "vfile-location": "^2.0.0",
- "xtend": "^4.0.1"
- }
- },
- "remark-react": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/remark-react/-/remark-react-5.0.1.tgz",
- "integrity": "sha512-yHv5WIh47srKfdm794UMIHjNLr6EY2YCzsqvdJ/qvN1Tq1jgyg3q8Zo9pJc4L7BwZOMTia6O2JgrJeOsJfowzA==",
- "requires": {
- "@mapbox/hast-util-table-cell-style": "^0.1.3",
- "hast-to-hyperscript": "^6.0.0",
- "hast-util-sanitize": "^1.0.0",
- "mdast-util-to-hast": "^4.0.0"
- },
- "dependencies": {
- "hast-to-hyperscript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-6.0.0.tgz",
- "integrity": "sha512-QnJbXddVGNJ5v3KegK1MY6luTkNDBcJnCQZcekt7AkES2z4tYy85pbFUXx7Mb0iXZBKfwoVdgfxU12GbmlwbbQ==",
- "requires": {
- "comma-separated-tokens": "^1.0.0",
- "property-information": "^5.0.0",
- "space-separated-tokens": "^1.0.0",
- "style-to-object": "^0.2.1",
- "unist-util-is": "^2.0.0",
- "web-namespaces": "^1.1.2"
- }
- },
- "mdast-util-to-hast": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-4.0.0.tgz",
- "integrity": "sha512-yOTZSxR1aPvWRUxVeLaLZ1sCYrK87x2Wusp1bDM/Ao2jETBhYUKITI3nHvgy+HkZW54HuCAhHnS0mTcbECD5Ig==",
- "requires": {
- "collapse-white-space": "^1.0.0",
- "detab": "^2.0.0",
- "mdast-util-definitions": "^1.2.0",
- "mdurl": "^1.0.1",
- "trim": "0.0.1",
- "trim-lines": "^1.0.0",
- "unist-builder": "^1.0.1",
- "unist-util-generated": "^1.1.0",
- "unist-util-position": "^3.0.0",
- "unist-util-visit": "^1.1.0",
- "xtend": "^4.0.1"
- }
- },
- "style-to-object": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.2.3.tgz",
- "integrity": "sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==",
- "requires": {
- "inline-style-parser": "0.1.1"
- }
- },
- "unist-builder": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-1.0.4.tgz",
- "integrity": "sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==",
- "requires": {
- "object-assign": "^4.1.0"
- }
- },
- "unist-util-is": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.3.tgz",
- "integrity": "sha512-4WbQX2iwfr/+PfM4U3zd2VNXY+dWtZsN1fLnWEi2QQXA4qyDYAZcDMfXUX0Cu6XZUHHAO9q4nyxxLT4Awk1qUA=="
- },
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "remark-retext": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/remark-retext/-/remark-retext-3.1.3.tgz",
- "integrity": "sha512-UujXAm28u4lnUvtOZQFYfRIhxX+auKI9PuA2QpQVTT7gYk1OgX6o0OUrSo1KOa6GNrFX+OODOtS5PWIHPxM7qw==",
- "requires": {
- "mdast-util-to-nlcst": "^3.2.0"
- }
- },
- "remark-squeeze-paragraphs": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-3.0.4.tgz",
- "integrity": "sha512-Wmz5Yj9q+W1oryo8BV17JrOXZgUKVcpJ2ApE2pwnoHwhFKSk4Wp2PmFNbmJMgYSqAdFwfkoe+TSYop5Fy8wMgA==",
- "requires": {
- "mdast-squeeze-paragraphs": "^3.0.0"
- }
- },
- "remark-stringify": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz",
- "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==",
- "requires": {
- "ccount": "^1.0.0",
- "is-alphanumeric": "^1.0.0",
- "is-decimal": "^1.0.0",
- "is-whitespace-character": "^1.0.0",
- "longest-streak": "^2.0.1",
- "markdown-escapes": "^1.0.0",
- "markdown-table": "^1.1.0",
- "mdast-util-compact": "^1.0.0",
- "parse-entities": "^1.0.2",
- "repeat-string": "^1.5.4",
- "state-toggle": "^1.0.0",
- "stringify-entities": "^1.0.1",
- "unherit": "^1.0.4",
- "xtend": "^4.0.1"
- }
- },
- "remark-typescript": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/remark-typescript/-/remark-typescript-0.3.1.tgz",
- "integrity": "sha512-UH3VrAD6HB3JBrPrdKDHmhSb2frDT0OfDTE4P8MI807KWNHkhuA+dKjld9+mYbq+PViy86nUZstpGkHWp5Y6gA==",
- "requires": {
- "@babel/core": "^7.5.5",
- "@babel/preset-typescript": "^7.3.3",
- "prettier": "^1.18.2",
- "unist-util-visit": "^1.4.1"
- },
- "dependencies": {
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
- },
- "renderkid": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz",
- "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==",
- "requires": {
- "css-select": "^1.1.0",
- "dom-converter": "^0.2",
- "htmlparser2": "^3.3.0",
- "strip-ansi": "^3.0.0",
- "utila": "^0.4.0"
- }
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
- },
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "dependencies": {
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
- }
- }
- },
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
- },
- "require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="
- },
- "require-like": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz",
- "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o="
- },
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
- },
- "requires-port": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
- "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
- },
- "resolve": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
- "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "resolve-cwd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
- "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
- "requires": {
- "resolve-from": "^3.0.0"
- },
- "dependencies": {
- "resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
- }
- }
- },
- "resolve-dir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
- "requires": {
- "expand-tilde": "^2.0.0",
- "global-modules": "^1.0.0"
- },
- "dependencies": {
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "requires": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- }
- },
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "requires": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
- }
- }
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
- },
- "responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
- "requires": {
- "lowercase-keys": "^1.0.0"
- }
- },
- "restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
- "requires": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- }
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
- },
- "retext-english": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/retext-english/-/retext-english-3.0.4.tgz",
- "integrity": "sha512-yr1PgaBDde+25aJXrnt3p1jvT8FVLVat2Bx8XeAWX13KXo8OT+3nWGU3HWxM4YFJvmfqvJYJZG2d7xxaO774gw==",
- "requires": {
- "parse-english": "^4.0.0",
- "unherit": "^1.0.4"
- }
- },
- "retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
- },
- "rgb-regex": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
- "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE="
- },
- "rgba-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
- "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM="
- },
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
- "requires": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "rollup": {
- "version": "1.23.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.23.1.tgz",
- "integrity": "sha512-95C1GZQpr/NIA0kMUQmSjuMDQ45oZfPgDBcN0yZwBG7Kee//m7H68vgIyg+SPuyrTZ5PrXfyLK80OzXeKG5dAA==",
- "requires": {
- "@types/estree": "*",
- "@types/node": "*",
- "acorn": "^7.1.0"
- }
- },
- "rollup-plugin-babel": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz",
- "integrity": "sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw==",
- "requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "rollup-pluginutils": "^2.8.1"
- }
- },
- "rollup-plugin-commonjs": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz",
- "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==",
- "requires": {
- "estree-walker": "^0.6.1",
- "is-reference": "^1.1.2",
- "magic-string": "^0.25.2",
- "resolve": "^1.11.0",
- "rollup-pluginutils": "^2.8.1"
- }
- },
- "rollup-plugin-node-builtins": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz",
- "integrity": "sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k=",
- "requires": {
- "browserify-fs": "^1.0.0",
- "buffer-es6": "^4.9.2",
- "crypto-browserify": "^3.11.0",
- "process-es6": "^0.11.2"
- }
- },
- "rollup-plugin-node-globals": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.4.0.tgz",
- "integrity": "sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g==",
- "requires": {
- "acorn": "^5.7.3",
- "buffer-es6": "^4.9.3",
- "estree-walker": "^0.5.2",
- "magic-string": "^0.22.5",
- "process-es6": "^0.11.6",
- "rollup-pluginutils": "^2.3.1"
- },
- "dependencies": {
- "acorn": {
- "version": "5.7.4",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz",
- "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg=="
- },
- "estree-walker": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz",
- "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig=="
- },
- "magic-string": {
- "version": "0.22.5",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
- "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
- "requires": {
- "vlq": "^0.2.2"
- }
- }
- }
- },
- "rollup-plugin-node-resolve": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz",
- "integrity": "sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw==",
- "requires": {
- "@types/resolve": "0.0.8",
- "builtin-modules": "^3.1.0",
- "is-module": "^1.0.0",
- "resolve": "^1.11.1",
- "rollup-pluginutils": "^2.8.1"
- }
- },
- "rollup-plugin-replace": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.2.0.tgz",
- "integrity": "sha512-/5bxtUPkDHyBJAKketb4NfaeZjL5yLZdeUihSfbF2PQMz+rSTEb8ARKoOl3UBT4m7/X+QOXJo3sLTcq+yMMYTA==",
- "requires": {
- "magic-string": "^0.25.2",
- "rollup-pluginutils": "^2.6.0"
- }
- },
- "rollup-pluginutils": {
- "version": "2.8.2",
- "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
- "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
- "requires": {
- "estree-walker": "^0.6.1"
- }
- },
- "rtl-css-js": {
- "version": "1.14.0",
- "resolved": "https://registry.npmjs.org/rtl-css-js/-/rtl-css-js-1.14.0.tgz",
- "integrity": "sha512-Dl5xDTeN3e7scU1cWX8c9b6/Nqz3u/HgR4gePc1kWXYiQWVQbKCEyK6+Hxve9LbcJ5EieHy1J9nJCN3grTtGwg==",
- "requires": {
- "@babel/runtime": "^7.1.2"
- }
- },
- "run-async": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz",
- "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==",
- "requires": {
- "is-promise": "^2.1.0"
- }
- },
- "run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
- },
- "run-queue": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
- "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
- "requires": {
- "aproba": "^1.1.1"
- }
- },
- "rw": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
- "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
- },
- "rx-lite": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz",
- "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ="
- },
- "rx-lite-aggregates": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz",
- "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=",
- "requires": {
- "rx-lite": "*"
- }
- },
- "rxjs": {
- "version": "6.5.5",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
- "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
- },
- "sanitize-html": {
- "version": "1.22.1",
- "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.22.1.tgz",
- "integrity": "sha512-++IMC00KfMQc45UWZJlhWOlS9eMrME38sFG9GXfR+k6oBo9JXSYQgTOZCl9j3v/smFTRNT9XNwz5DseFdMY+2Q==",
- "requires": {
- "chalk": "^2.4.1",
- "htmlparser2": "^4.1.0",
- "lodash.clonedeep": "^4.5.0",
- "lodash.escaperegexp": "^4.1.2",
- "lodash.isplainobject": "^4.0.6",
- "lodash.isstring": "^4.0.1",
- "lodash.mergewith": "^4.6.2",
- "postcss": "^7.0.27",
- "srcset": "^2.0.1",
- "xtend": "^4.0.1"
- },
- "dependencies": {
- "domelementtype": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
- "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ=="
- },
- "domhandler": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.0.0.tgz",
- "integrity": "sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==",
- "requires": {
- "domelementtype": "^2.0.1"
- }
- },
- "domutils": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.0.0.tgz",
- "integrity": "sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==",
- "requires": {
- "dom-serializer": "^0.2.1",
- "domelementtype": "^2.0.1",
- "domhandler": "^3.0.0"
- }
- },
- "htmlparser2": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
- "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==",
- "requires": {
- "domelementtype": "^2.0.1",
- "domhandler": "^3.0.0",
- "domutils": "^2.0.0",
- "entities": "^2.0.0"
- }
- }
- }
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
- },
- "scheduler": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.18.0.tgz",
- "integrity": "sha512-agTSHR1Nbfi6ulI0kYNK0203joW2Y5W4po4l+v03tOoiJKpTBbxpNhWDvqc/4IcOw+KLmSiQLTasZ4cab2/UWQ==",
- "requires": {
- "loose-envify": "^1.1.0",
- "object-assign": "^4.1.1"
- }
- },
- "schema-utils": {
- "version": "2.6.5",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz",
- "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==",
- "requires": {
- "ajv": "^6.12.0",
- "ajv-keywords": "^3.4.1"
- },
- "dependencies": {
- "ajv": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
- "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==",
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- }
- }
- },
- "scope-css": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/scope-css/-/scope-css-1.2.1.tgz",
- "integrity": "sha512-UjLRmyEYaDNiOS673xlVkZFlVCtckJR/dKgr434VMm7Lb+AOOqXKdAcY7PpGlJYErjXXJzKN7HWo4uRPiZZG0Q==",
- "requires": {
- "escaper": "^2.5.3",
- "slugify": "^1.3.1",
- "strip-css-comments": "^3.0.0"
- }
- },
- "screenfull": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-4.2.1.tgz",
- "integrity": "sha512-PLSp6f5XdhvjCCCO8OjavRfzkSGL3Qmdm7P82bxyU8HDDDBhDV3UckRaYcRa/NDNTYt8YBpzjoLWHUAejmOjLg=="
- },
- "scroll-behavior": {
- "version": "0.9.12",
- "resolved": "https://registry.npmjs.org/scroll-behavior/-/scroll-behavior-0.9.12.tgz",
- "integrity": "sha512-18sirtyq1P/VsBX6O/vgw20Np+ngduFXEMO4/NDFXabdOKBL2kjPVUpz1y0+jm99EWwFJafxf5/tCyMeXt9Xyg==",
- "requires": {
- "dom-helpers": "^3.4.0",
- "invariant": "^2.2.4"
- }
- },
- "section-matter": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
- "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
- "requires": {
- "extend-shallow": "^2.0.1",
- "kind-of": "^6.0.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "select": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
- "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
- "optional": true
- },
- "select-hose": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
- },
- "selfsigned": {
- "version": "1.10.7",
- "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz",
- "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==",
- "requires": {
- "node-forge": "0.9.0"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
- },
- "semver-diff": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
- "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
- "requires": {
- "semver": "^5.0.3"
- }
- },
- "send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
- "requires": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "~1.7.2",
- "mime": "1.6.0",
- "ms": "2.1.1",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
- }
- }
- },
- "sentence-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz",
- "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=",
- "requires": {
- "no-case": "^2.2.0",
- "upper-case-first": "^1.1.2"
- }
- },
- "serialize-javascript": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz",
- "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ=="
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
- }
- }
- },
- "serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.1"
- }
- },
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
- },
- "set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
- "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
- },
- "sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
- "requires": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "shallow-clone": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
- "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=",
- "requires": {
- "is-extendable": "^0.1.1",
- "kind-of": "^2.0.1",
- "lazy-cache": "^0.2.3",
- "mixin-object": "^2.0.1"
- },
- "dependencies": {
- "kind-of": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
- "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=",
- "requires": {
- "is-buffer": "^1.0.2"
- }
- },
- "lazy-cache": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
- "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U="
- }
- }
- },
- "shallow-compare": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/shallow-compare/-/shallow-compare-1.2.2.tgz",
- "integrity": "sha512-LUMFi+RppPlrHzbqmFnINTrazo0lPNwhcgzuAXVVcfy/mqPDrQmHAyz5bvV0gDAuRFrk804V0HpQ6u9sZ0tBeg=="
- },
- "shallowequal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
- "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
- },
- "shell-quote": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz",
- "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
- },
- "side-channel": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz",
- "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==",
- "requires": {
- "es-abstract": "^1.17.0-next.1",
- "object-inspect": "^1.7.0"
- }
- },
- "sift": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/sift/-/sift-5.1.0.tgz",
- "integrity": "sha1-G78t+w63HlbEzH+1Z/vRNRtlAV4="
- },
- "signal-exit": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
- },
- "simple-git": {
- "version": "1.132.0",
- "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-1.132.0.tgz",
- "integrity": "sha512-xauHm1YqCTom1sC9eOjfq3/9RKiUA9iPnxBbrY2DdL8l4ADMu0jjM5l5lphQP5YWNqAL2aXC/OeuQ76vHtW5fg==",
- "requires": {
- "debug": "^4.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
- "requires": {
- "is-arrayish": "^0.3.1"
- },
- "dependencies": {
- "is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
- }
- }
- },
- "sisteransi": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
- "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
- },
- "slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
- "requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- }
- },
- "slugify": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.3.6.tgz",
- "integrity": "sha512-wA9XS475ZmGNlEnYYLPReSfuz/c3VQsEMoU43mi6OnKMCdbnFXd4/Yg7J0lBv8jkPolacMpOrWEaoYxuE1+hoQ=="
- },
- "snake-case": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz",
- "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=",
- "requires": {
- "no-case": "^2.2.0"
- }
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "requires": {
- "kind-of": "^3.2.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "socket.io": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz",
- "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==",
- "requires": {
- "debug": "~4.1.0",
- "engine.io": "~3.4.0",
- "has-binary2": "~1.0.2",
- "socket.io-adapter": "~1.1.0",
- "socket.io-client": "2.3.0",
- "socket.io-parser": "~3.4.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "socket.io-adapter": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz",
- "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g=="
- },
- "socket.io-client": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz",
- "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==",
- "requires": {
- "backo2": "1.0.2",
- "base64-arraybuffer": "0.1.5",
- "component-bind": "1.0.0",
- "component-emitter": "1.2.1",
- "debug": "~4.1.0",
- "engine.io-client": "~3.4.0",
- "has-binary2": "~1.0.2",
- "has-cors": "1.1.0",
- "indexof": "0.0.1",
- "object-component": "0.0.3",
- "parseqs": "0.0.5",
- "parseuri": "0.0.5",
- "socket.io-parser": "~3.3.0",
- "to-array": "0.1.4"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- },
- "socket.io-parser": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz",
- "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==",
- "requires": {
- "component-emitter": "1.2.1",
- "debug": "~3.1.0",
- "isarray": "2.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- }
- }
- },
- "socket.io-parser": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.0.tgz",
- "integrity": "sha512-/G/VOI+3DBp0+DJKW4KesGnQkQPFmUCbA/oO2QGT6CWxU7hLGWqU3tyuzeSK/dqcyeHsQg1vTe9jiZI8GU9SCQ==",
- "requires": {
- "component-emitter": "1.2.1",
- "debug": "~4.1.0",
- "isarray": "2.0.1"
- },
- "dependencies": {
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "isarray": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
- "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4="
- }
- }
- },
- "sockjs": {
- "version": "0.3.19",
- "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz",
- "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==",
- "requires": {
- "faye-websocket": "^0.10.0",
- "uuid": "^3.0.1"
- },
- "dependencies": {
- "faye-websocket": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz",
- "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=",
- "requires": {
- "websocket-driver": ">=0.5.1"
- }
- }
- }
- },
- "sockjs-client": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz",
- "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==",
- "requires": {
- "debug": "^3.2.5",
- "eventsource": "^1.0.7",
- "faye-websocket": "~0.11.1",
- "inherits": "^2.0.3",
- "json3": "^3.3.2",
- "url-parse": "^1.4.3"
- }
- },
- "sort-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz",
- "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=",
- "requires": {
- "is-plain-obj": "^1.0.0"
- }
- },
- "source-list-map": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
- "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
- },
- "source-map-resolve": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
- "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
- "requires": {
- "atob": "^2.1.2",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-support": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
- "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
- },
- "source-sans-pro": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/source-sans-pro/-/source-sans-pro-3.6.0.tgz",
- "integrity": "sha512-C1RFUGu+YASuqpgDRInTM7Y6OwqeWNOuKn7v0P/4Kh66epTI4PYWwPWP5kdA4l/VqzBAWiqoz5dk0trof73R7w=="
- },
- "sourcemap-codec": {
- "version": "1.4.8",
- "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
- "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
- },
- "space-separated-tokens": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
- "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
- },
- "spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA=="
- },
- "spdx-expression-parse": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
- "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q=="
- },
- "spdy": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz",
- "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==",
- "requires": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- }
- }
- },
- "spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
- "requires": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
- },
- "dependencies": {
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- }
- }
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
- },
- "srcset": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/srcset/-/srcset-2.0.1.tgz",
- "integrity": "sha512-00kZI87TdRKwt+P8jj8UZxbfp7mK2ufxcIMWvhAOZNJTRROimpHeruWrGvCZneiuVDLqdyHefVp748ECTnyUBQ=="
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "ssri": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz",
- "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
- "requires": {
- "figgy-pudding": "^3.5.1"
- }
- },
- "stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
- },
- "stack-generator": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz",
- "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==",
- "requires": {
- "stackframe": "^1.1.1"
- }
- },
- "stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
- },
- "stack-utils": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz",
- "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA=="
- },
- "stackframe": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.1.1.tgz",
- "integrity": "sha512-0PlYhdKh6AfFxRyK/v+6/k+/mMfyiEBbTM5L94D0ZytQnJ166wuwoTYLHFWGbs2dpA8Rgq763KGWmN1EQEYHRQ=="
- },
- "stacktrace-gps": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz",
- "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==",
- "requires": {
- "source-map": "0.5.6",
- "stackframe": "^1.1.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
- "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI="
- }
- }
- },
- "stacktrace-js": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
- "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
- "requires": {
- "error-stack-parser": "^2.0.6",
- "stack-generator": "^2.0.5",
- "stacktrace-gps": "^3.0.4"
- }
- },
- "state-toggle": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
- "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ=="
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "static-site-generator-webpack-plugin": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-3.4.2.tgz",
- "integrity": "sha512-39Kn+fZDVjolLYuX5y1rDvksJIW0QEUaEC/AVO/UewNXxGzoSQI1UYnRsL+ocAcN5Yti6d6rJgEL0qZ5tNXfdw==",
- "requires": {
- "bluebird": "^3.0.5",
- "cheerio": "^0.22.0",
- "eval": "^0.1.0",
- "url": "^0.11.0",
- "webpack-sources": "^0.2.0"
- },
- "dependencies": {
- "source-list-map": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz",
- "integrity": "sha1-mIkBnRAkzOVc3AaUmDN+9hhqEaE="
- },
- "webpack-sources": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz",
- "integrity": "sha1-F8Yr+vE8cH+dAsR54Nzd6DgGl/s=",
- "requires": {
- "source-list-map": "^1.1.1",
- "source-map": "~0.5.3"
- }
- }
- }
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
- },
- "stream-browserify": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
- "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
- "requires": {
- "inherits": "~2.0.1",
- "readable-stream": "^2.0.2"
- }
- },
- "stream-each": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz",
- "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
- "requires": {
- "end-of-stream": "^1.1.0",
- "stream-shift": "^1.0.0"
- }
- },
- "stream-http": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
- "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
- "requires": {
- "builtin-status-codes": "^3.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.3.6",
- "to-arraybuffer": "^1.0.0",
- "xtend": "^4.0.0"
- }
- },
- "stream-parser": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
- "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
- "requires": {
- "debug": "2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "stream-shift": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
- "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
- },
- "strict-uri-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
- "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
- },
- "string-length": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz",
- "integrity": "sha512-Ttp5YvkGm5v9Ijagtaz1BnN+k9ObpvS0eIBblPMp2YWL8FBmi9qblQ9fexc2k/CXFgrTIteU3jAw3payCnwSTA==",
- "optional": true,
- "requires": {
- "astral-regex": "^1.0.0",
- "strip-ansi": "^5.2.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "optional": true
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "optional": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "string-range": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz",
- "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0="
- },
- "string-similarity": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-1.2.2.tgz",
- "integrity": "sha512-IoHUjcw3Srl8nsPlW04U3qwWPk3oG2ffLM0tN853d/E/JlIvcmZmDY2Kz5HzKp4lEi2T7QD7Zuvjq/1rDw+XcQ==",
- "requires": {
- "lodash.every": "^4.6.0",
- "lodash.flattendeep": "^4.4.0",
- "lodash.foreach": "^4.5.0",
- "lodash.map": "^4.6.0",
- "lodash.maxby": "^4.6.0"
- }
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "string.prototype.matchall": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz",
- "integrity": "sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.0",
- "has-symbols": "^1.0.1",
- "internal-slot": "^1.0.2",
- "regexp.prototype.flags": "^1.3.0",
- "side-channel": "^1.0.2"
- }
- },
- "string.prototype.trimleft": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
- "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- },
- "string.prototype.trimright": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
- "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
- "requires": {
- "define-properties": "^1.1.3",
- "function-bind": "^1.1.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "stringify-entities": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz",
- "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==",
- "requires": {
- "character-entities-html4": "^1.0.0",
- "character-entities-legacy": "^1.0.0",
- "is-alphanumerical": "^1.0.0",
- "is-hexadecimal": "^1.0.0"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "requires": {
- "ansi-regex": "^2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
- }
- }
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM="
- },
- "strip-bom-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
- "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI="
- },
- "strip-css-comments": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-css-comments/-/strip-css-comments-3.0.0.tgz",
- "integrity": "sha1-elYl7/iisibPiUehElTaluE9rok=",
- "requires": {
- "is-regexp": "^1.0.0"
- }
- },
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
- },
- "strip-final-newline": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
- "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
- },
- "strip-json-comments": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
- "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw=="
- },
- "striptags": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz",
- "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0="
- },
- "style-loader": {
- "version": "0.23.1",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.23.1.tgz",
- "integrity": "sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==",
- "requires": {
- "loader-utils": "^1.1.0",
- "schema-utils": "^1.0.0"
- },
- "dependencies": {
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "style-to-object": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz",
- "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==",
- "requires": {
- "inline-style-parser": "0.1.1"
- }
- },
- "stylehacks": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
- "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
- "requires": {
- "browserslist": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0"
- },
- "dependencies": {
- "postcss-selector-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
- "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
- "requires": {
- "dot-prop": "^5.2.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- }
- }
- }
- },
- "stylis": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz",
- "integrity": "sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw=="
- },
- "sudo-prompt": {
- "version": "8.2.5",
- "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-8.2.5.tgz",
- "integrity": "sha512-rlBo3HU/1zAJUrkY6jNxDOC9eVYliG6nS4JA8u8KAshITd07tafMc/Br7xQwCSseXwJ2iCcHCE8SNWX3q8Z+kw=="
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "svg-parser": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
- "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
- },
- "svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "requires": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- },
- "dependencies": {
- "css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "requires": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
- }
- },
- "css-what": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz",
- "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw=="
- },
- "domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
- }
- }
- },
- "swap-case": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz",
- "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=",
- "requires": {
- "lower-case": "^1.1.1",
- "upper-case": "^1.1.1"
- }
- },
- "symbol-observable": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
- "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
- },
- "table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
- "requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "tapable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
- "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
- },
- "term-size": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
- "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw=="
- },
- "terser": {
- "version": "4.6.3",
- "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz",
- "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==",
- "requires": {
- "commander": "^2.20.0",
- "source-map": "~0.6.1",
- "source-map-support": "~0.5.12"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "terser-webpack-plugin": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz",
- "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==",
- "requires": {
- "cacache": "^12.0.2",
- "find-cache-dir": "^2.1.0",
- "is-wsl": "^1.1.0",
- "schema-utils": "^1.0.0",
- "serialize-javascript": "^2.1.2",
- "source-map": "^0.6.1",
- "terser": "^4.1.2",
- "webpack-sources": "^1.4.0",
- "worker-farm": "^1.7.0"
- },
- "dependencies": {
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
- },
- "throttle-debounce": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-2.1.0.tgz",
- "integrity": "sha512-AOvyNahXQuU7NN+VVvOOX+uW6FPaWdAOdRP5HfwYxAfCzXTFKRMoIMk+n+po318+ktcChx+F1Dd91G3YHeMKyg=="
- },
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
- },
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "thunky": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
- "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
- },
- "timed-out": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
- "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8="
- },
- "timers-browserify": {
- "version": "2.0.11",
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
- "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
- "requires": {
- "setimmediate": "^1.0.4"
- }
- },
- "timsort": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
- "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
- },
- "tiny-emitter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
- "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
- "optional": true
- },
- "tinycolor2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
- "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g="
- },
- "title-case": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz",
- "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=",
- "requires": {
- "no-case": "^2.2.0",
- "upper-case": "^1.0.3"
- }
- },
- "tmp": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
- "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
- "requires": {
- "os-tmpdir": "~1.0.2"
- }
- },
- "to-array": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
- "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA="
- },
- "to-arraybuffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
- "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
- },
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- },
- "toggle-selection": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
- "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- }
- },
- "trim": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
- "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
- },
- "trim-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-1.1.3.tgz",
- "integrity": "sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA=="
- },
- "trim-trailing-lines": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
- "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA=="
- },
- "trough": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
- "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA=="
- },
- "true-case-path": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-2.2.1.tgz",
- "integrity": "sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q=="
- },
- "try-catch": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/try-catch/-/try-catch-2.0.1.tgz",
- "integrity": "sha512-LsOrmObN/2WdM+y2xG+t16vhYrQsnV8wftXIcIOWZhQcBJvKGYuamJGwnU98A7Jxs2oZNkJztXlphEOoA0DWqg=="
- },
- "try-to-catch": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/try-to-catch/-/try-to-catch-1.1.1.tgz",
- "integrity": "sha512-ikUlS+/BcImLhNYyIgZcEmq4byc31QpC+46/6Jm5ECWkVFhf8SM2Fp/0pMVXPX6vk45SMCwrP4Taxucne8I0VA=="
- },
- "ts-easing": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/ts-easing/-/ts-easing-0.2.0.tgz",
- "integrity": "sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ=="
- },
- "ts-invariant": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz",
- "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==",
- "requires": {
- "tslib": "^1.9.3"
- }
- },
- "ts-pnp": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz",
- "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw=="
- },
- "tslib": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
- "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
- },
- "tsutils": {
- "version": "3.17.1",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
- "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
- "requires": {
- "tslib": "^1.8.1"
- }
- },
- "tty-browserify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
- "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- },
- "type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
- },
- "type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
- }
- },
- "type-of": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/type-of/-/type-of-2.0.1.tgz",
- "integrity": "sha1-5yoXQYllaOn2KDeNgW1pEvfyOXI="
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
- },
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
- "ua-parser-js": {
- "version": "0.7.21",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz",
- "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ=="
- },
- "uglify-js": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.8.1.tgz",
- "integrity": "sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw==",
- "requires": {
- "commander": "~2.20.3",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "unc-path-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo="
- },
- "underscore.string": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz",
- "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==",
- "requires": {
- "sprintf-js": "^1.0.3",
- "util-deprecate": "^1.0.2"
- }
- },
- "unherit": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
- "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
- "requires": {
- "inherits": "^2.0.0",
- "xtend": "^4.0.0"
- }
- },
- "unicode-canonical-property-names-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
- "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
- },
- "unicode-match-property-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
- "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
- "requires": {
- "unicode-canonical-property-names-ecmascript": "^1.0.4",
- "unicode-property-aliases-ecmascript": "^1.0.4"
- }
- },
- "unicode-match-property-value-ecmascript": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
- "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g=="
- },
- "unicode-property-aliases-ecmascript": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
- "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw=="
- },
- "unified": {
- "version": "8.4.2",
- "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz",
- "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==",
- "requires": {
- "bail": "^1.0.0",
- "extend": "^3.0.0",
- "is-plain-obj": "^2.0.0",
- "trough": "^1.0.0",
- "vfile": "^4.0.0"
- },
- "dependencies": {
- "is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
- }
- }
- },
- "union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
- "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- }
- },
- "uniq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
- "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
- },
- "uniqs": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
- "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
- },
- "unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
- "requires": {
- "unique-slug": "^2.0.0"
- }
- },
- "unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
- "requires": {
- "imurmurhash": "^0.1.4"
- }
- },
- "unique-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
- "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
- "requires": {
- "crypto-random-string": "^2.0.0"
- }
- },
- "unist-builder": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz",
- "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw=="
- },
- "unist-util-generated": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.5.tgz",
- "integrity": "sha512-1TC+NxQa4N9pNdayCYA1EGUOCAO0Le3fVp7Jzns6lnua/mYgwHo0tz5WUAfrdpNch1RZLHc61VZ1SDgrtNXLSw=="
- },
- "unist-util-is": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
- "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A=="
- },
- "unist-util-map": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/unist-util-map/-/unist-util-map-1.0.5.tgz",
- "integrity": "sha512-dFil/AN6vqhnQWNCZk0GF/G3+Q5YwsB+PqjnzvpO2wzdRtUJ1E8PN+XRE/PRr/G3FzKjRTJU0haqE0Ekl+O3Ag==",
- "requires": {
- "object-assign": "^4.0.1"
- }
- },
- "unist-util-modify-children": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.6.tgz",
- "integrity": "sha512-TOA6W9QLil+BrHqIZNR4o6IA5QwGOveMbnQxnWYq+7EFORx9vz/CHrtzF36zWrW61E2UKw7sM1KPtIgeceVwXw==",
- "requires": {
- "array-iterate": "^1.0.0"
- }
- },
- "unist-util-position": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz",
- "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA=="
- },
- "unist-util-remove": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-1.0.3.tgz",
- "integrity": "sha512-mB6nCHCQK0pQffUAcCVmKgIWzG/AXs/V8qpS8K72tMPtOSCMSjDeMc5yN+Ye8rB0FhcE+JvW++o1xRNc0R+++g==",
- "requires": {
- "unist-util-is": "^3.0.0"
- }
- },
- "unist-util-remove-position": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
- "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
- "requires": {
- "unist-util-visit": "^1.1.0"
- },
- "dependencies": {
- "unist-util-visit": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
- "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
- "requires": {
- "unist-util-visit-parents": "^2.0.0"
- }
- }
- }
- },
- "unist-util-select": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-1.5.0.tgz",
- "integrity": "sha1-qTwr6MD2U4J4A7gTMa3sKqJM2TM=",
- "requires": {
- "css-selector-parser": "^1.1.0",
- "debug": "^2.2.0",
- "nth-check": "^1.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
- }
- }
- },
- "unist-util-stringify-position": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
- "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
- "requires": {
- "@types/unist": "^2.0.2"
- }
- },
- "unist-util-visit": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.2.tgz",
- "integrity": "sha512-HoHNhGnKj6y+Sq+7ASo2zpVdfdRifhTgX2KTU3B/sO/TTlZchp7E3S4vjRzDJ7L60KmrCPsQkVK3lEF3cz36XQ==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0",
- "unist-util-visit-parents": "^3.0.0"
- },
- "dependencies": {
- "unist-util-is": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
- "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ=="
- },
- "unist-util-visit-parents": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.0.2.tgz",
- "integrity": "sha512-yJEfuZtzFpQmg1OSCyS9M5NJRrln/9FbYosH3iW0MG402QbdbaB8ZESwUv9RO6nRfLAKvWcMxCwdLWOov36x/g==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-is": "^4.0.0"
- }
- }
- }
- },
- "unist-util-visit-children": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/unist-util-visit-children/-/unist-util-visit-children-1.1.4.tgz",
- "integrity": "sha512-sA/nXwYRCQVRwZU2/tQWUqJ9JSFM1X3x7JIOsIgSzrFHcfVt6NkzDtKzyxg2cZWkCwGF9CO8x4QNZRJRMK8FeQ=="
- },
- "unist-util-visit-parents": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
- "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
- "requires": {
- "unist-util-is": "^3.0.0"
- }
- },
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
- },
- "unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
- }
- }
- },
- "upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
- "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
- },
- "update-notifier": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-3.0.1.tgz",
- "integrity": "sha512-grrmrB6Zb8DUiyDIaeRTBCkgISYUgETNe7NglEbVsrLWXeESnlCSP50WfRSj/GmzMPl6Uchj24S/p80nP/ZQrQ==",
- "requires": {
- "boxen": "^3.0.0",
- "chalk": "^2.0.1",
- "configstore": "^4.0.0",
- "has-yarn": "^2.1.0",
- "import-lazy": "^2.1.0",
- "is-ci": "^2.0.0",
- "is-installed-globally": "^0.1.0",
- "is-npm": "^3.0.0",
- "is-yarn-global": "^0.3.0",
- "latest-version": "^5.0.0",
- "semver-diff": "^2.0.0",
- "xdg-basedir": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "boxen": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-3.2.0.tgz",
- "integrity": "sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A==",
- "requires": {
- "ansi-align": "^3.0.0",
- "camelcase": "^5.3.1",
- "chalk": "^2.4.2",
- "cli-boxes": "^2.2.0",
- "string-width": "^3.0.0",
- "term-size": "^1.2.0",
- "type-fest": "^0.3.0",
- "widest-line": "^2.0.0"
- }
- },
- "configstore": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz",
- "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==",
- "requires": {
- "dot-prop": "^4.1.0",
- "graceful-fs": "^4.1.2",
- "make-dir": "^1.0.0",
- "unique-string": "^1.0.0",
- "write-file-atomic": "^2.0.0",
- "xdg-basedir": "^3.0.0"
- }
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "requires": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "crypto-random-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
- "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4="
- },
- "dot-prop": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
- "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
- "requires": {
- "is-obj": "^1.0.0"
- }
- },
- "execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
- "requires": {
- "cross-spawn": "^5.0.1",
- "get-stream": "^3.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ="
- },
- "is-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
- "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "make-dir": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
- "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
- "requires": {
- "pify": "^3.0.0"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- },
- "term-size": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
- "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
- "requires": {
- "execa": "^0.7.0"
- }
- },
- "type-fest": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
- "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ=="
- },
- "unique-string": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
- "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
- "requires": {
- "crypto-random-string": "^1.0.0"
- }
- },
- "widest-line": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
- "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
- "requires": {
- "string-width": "^2.1.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "write-file-atomic": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz",
- "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==",
- "requires": {
- "graceful-fs": "^4.1.11",
- "imurmurhash": "^0.1.4",
- "signal-exit": "^3.0.2"
- }
- },
- "xdg-basedir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
- "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ="
- }
- }
- },
- "upper-case": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
- "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg="
- },
- "upper-case-first": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz",
- "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=",
- "requires": {
- "upper-case": "^1.1.1"
- }
- },
- "uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
- },
- "url": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
- "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
- "requires": {
- "punycode": "1.3.2",
- "querystring": "0.2.0"
- },
- "dependencies": {
- "punycode": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
- "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
- }
- }
- },
- "url-loader": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-1.1.2.tgz",
- "integrity": "sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg==",
- "requires": {
- "loader-utils": "^1.1.0",
- "mime": "^2.0.3",
- "schema-utils": "^1.0.0"
- },
- "dependencies": {
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "url-parse": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz",
- "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==",
- "requires": {
- "querystringify": "^2.1.1",
- "requires-port": "^1.0.0"
- }
- },
- "url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
- "requires": {
- "prepend-http": "^2.0.0"
- }
- },
- "url-to-options": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz",
- "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k="
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
- },
- "util": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
- "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
- "requires": {
- "inherits": "2.0.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- }
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
- },
- "util.promisify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
- "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
- "requires": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.2",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.0"
- }
- },
- "utila": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
- "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
- },
- "v8-compile-cache": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz",
- "integrity": "sha512-ejdrifsIydN1XDH7EuR2hn8ZrkRKUYF7tUcBjBy/lhrCvs2K+zRlbW9UHc0IQ9RsYFZJFqJrieoIHfkCa0DBRA=="
- },
- "valid-url": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz",
- "integrity": "sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA="
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
- },
- "vendors": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
- "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w=="
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "vfile": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.1.0.tgz",
- "integrity": "sha512-BaTPalregj++64xbGK6uIlsurN3BCRNM/P2Pg8HezlGzKd1O9PrwIac6bd9Pdx2uTb0QHoioZ+rXKolbVXEgJg==",
- "requires": {
- "@types/unist": "^2.0.0",
- "is-buffer": "^2.0.0",
- "replace-ext": "1.0.0",
- "unist-util-stringify-position": "^2.0.0",
- "vfile-message": "^2.0.0"
- },
- "dependencies": {
- "is-buffer": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
- "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
- }
- }
- },
- "vfile-location": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
- "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA=="
- },
- "vfile-message": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
- "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
- "requires": {
- "@types/unist": "^2.0.0",
- "unist-util-stringify-position": "^2.0.0"
- }
- },
- "vlq": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
- "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow=="
- },
- "vm-browserify": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
- "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
- },
- "warning": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
- "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "watchpack": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz",
- "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==",
- "requires": {
- "chokidar": "^2.1.8",
- "graceful-fs": "^4.1.2",
- "neo-async": "^2.5.0"
- },
- "dependencies": {
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- }
- }
- },
- "wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
- "requires": {
- "minimalistic-assert": "^1.0.0"
- }
- },
- "web-namespaces": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz",
- "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw=="
- },
- "webpack": {
- "version": "4.41.6",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.41.6.tgz",
- "integrity": "sha512-yxXfV0Zv9WMGRD+QexkZzmGIh54bsvEs+9aRWxnN8erLWEOehAKUTeNBoUbA6HPEZPlRo7KDi2ZcNveoZgK9MA==",
- "requires": {
- "@webassemblyjs/ast": "1.8.5",
- "@webassemblyjs/helper-module-context": "1.8.5",
- "@webassemblyjs/wasm-edit": "1.8.5",
- "@webassemblyjs/wasm-parser": "1.8.5",
- "acorn": "^6.2.1",
- "ajv": "^6.10.2",
- "ajv-keywords": "^3.4.1",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^4.1.0",
- "eslint-scope": "^4.0.3",
- "json-parse-better-errors": "^1.0.2",
- "loader-runner": "^2.4.0",
- "loader-utils": "^1.2.3",
- "memory-fs": "^0.4.1",
- "micromatch": "^3.1.10",
- "mkdirp": "^0.5.1",
- "neo-async": "^2.6.1",
- "node-libs-browser": "^2.2.1",
- "schema-utils": "^1.0.0",
- "tapable": "^1.1.3",
- "terser-webpack-plugin": "^1.4.3",
- "watchpack": "^1.6.0",
- "webpack-sources": "^1.4.1"
- },
- "dependencies": {
- "acorn": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
- "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA=="
- },
- "eslint-scope": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
- "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- }
- }
- },
- "webpack-dev-middleware": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz",
- "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==",
- "requires": {
- "memory-fs": "^0.4.1",
- "mime": "^2.4.4",
- "mkdirp": "^0.5.1",
- "range-parser": "^1.2.1",
- "webpack-log": "^2.0.0"
- }
- },
- "webpack-dev-server": {
- "version": "3.10.3",
- "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz",
- "integrity": "sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==",
- "requires": {
- "ansi-html": "0.0.7",
- "bonjour": "^3.5.0",
- "chokidar": "^2.1.8",
- "compression": "^1.7.4",
- "connect-history-api-fallback": "^1.6.0",
- "debug": "^4.1.1",
- "del": "^4.1.1",
- "express": "^4.17.1",
- "html-entities": "^1.2.1",
- "http-proxy-middleware": "0.19.1",
- "import-local": "^2.0.0",
- "internal-ip": "^4.3.0",
- "ip": "^1.1.5",
- "is-absolute-url": "^3.0.3",
- "killable": "^1.0.1",
- "loglevel": "^1.6.6",
- "opn": "^5.5.0",
- "p-retry": "^3.0.1",
- "portfinder": "^1.0.25",
- "schema-utils": "^1.0.0",
- "selfsigned": "^1.10.7",
- "semver": "^6.3.0",
- "serve-index": "^1.9.1",
- "sockjs": "0.3.19",
- "sockjs-client": "1.4.0",
- "spdy": "^4.0.1",
- "strip-ansi": "^3.0.1",
- "supports-color": "^6.1.0",
- "url": "^0.11.0",
- "webpack-dev-middleware": "^3.7.2",
- "webpack-log": "^2.0.0",
- "ws": "^6.2.1",
- "yargs": "12.0.5"
- },
- "dependencies": {
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- }
- },
- "cliui": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
- "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
- "requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
- }
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "del": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
- "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
- "requires": {
- "@types/glob": "^7.1.1",
- "globby": "^6.1.0",
- "is-path-cwd": "^2.0.0",
- "is-path-in-cwd": "^2.0.0",
- "p-map": "^2.0.0",
- "pify": "^4.0.1",
- "rimraf": "^2.6.3"
- }
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w=="
- },
- "globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
- "requires": {
- "array-union": "^1.0.1",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
- }
- }
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
- },
- "opn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
- "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
- "requires": {
- "is-wsl": "^1.1.0"
- }
- },
- "p-map": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
- "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
- },
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE="
- },
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "requires": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
- },
- "dependencies": {
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- }
- }
- },
- "ws": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
- "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
- "requires": {
- "async-limiter": "~1.0.0"
- }
- },
- "yargs": {
- "version": "12.0.5",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
- "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^3.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1 || ^4.0.0",
- "yargs-parser": "^11.1.1"
- }
- },
- "yargs-parser": {
- "version": "11.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
- "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- }
- }
- },
- "webpack-hot-middleware": {
- "version": "2.25.0",
- "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz",
- "integrity": "sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==",
- "requires": {
- "ansi-html": "0.0.7",
- "html-entities": "^1.2.0",
- "querystring": "^0.2.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "webpack-log": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz",
- "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
- "requires": {
- "ansi-colors": "^3.0.0",
- "uuid": "^3.3.2"
- }
- },
- "webpack-merge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
- "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
- "requires": {
- "lodash": "^4.17.15"
- }
- },
- "webpack-sources": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
- "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
- "requires": {
- "source-list-map": "^2.0.0",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- }
- }
- },
- "webpack-stats-plugin": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/webpack-stats-plugin/-/webpack-stats-plugin-0.3.1.tgz",
- "integrity": "sha512-pxqzFE055NlNTlNyfDG3xlB2QwT1EWdm/CF5dCJI/e+rRHVxrWhWg1rf1lfsWhI1/EePv8gi/A36YxO/+u0FgQ=="
- },
- "websocket-driver": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
- "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
- "requires": {
- "http-parser-js": ">=0.4.0 <0.4.11",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- }
- },
- "websocket-extensions": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
- "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
- },
- "whatwg-fetch": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
- "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng=="
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "requires": {
- "isexe": "^2.0.0"
- }
- },
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
- },
- "widest-line": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
- "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
- "requires": {
- "string-width": "^4.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "with-open-file": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz",
- "integrity": "sha512-ecJS2/oHtESJ1t3ZfMI3B7KIDKyfN0O16miWxdn30zdh66Yd3LsRFebXZXq6GU4xfxLf6nVxp9kIqElb5fqczA==",
- "requires": {
- "p-finally": "^1.0.0",
- "p-try": "^2.1.0",
- "pify": "^4.0.1"
- }
- },
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
- },
- "worker-farm": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz",
- "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
- "requires": {
- "errno": "~0.1.7"
- }
- },
- "worker-rpc": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz",
- "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==",
- "requires": {
- "microevent.ts": "~0.1.1"
- }
- },
- "wrap-ansi": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
- "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
- "requires": {
- "ansi-styles": "^3.2.0",
- "string-width": "^3.0.0",
- "strip-ansi": "^5.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
- },
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
- "write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "requires": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- },
- "ws": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz",
- "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ=="
- },
- "x-is-string": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
- "integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI="
- },
- "xdg-basedir": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
- "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
- },
- "xmlhttprequest-ssl": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
- "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4="
- },
- "xregexp": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz",
- "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==",
- "requires": {
- "@babel/runtime-corejs3": "^7.8.3"
- }
- },
- "xstate": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/xstate/-/xstate-4.8.0.tgz",
- "integrity": "sha512-xHSYQtCHLkcrFRxa5lK4Lp1rnKt00a80jcKFMQiMBuE+6MvTYv7twwqYpzjsJoKFjGZB3GGEpZAuY1dmlPTh/g=="
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w=="
- },
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
- },
- "yaml": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.7.2.tgz",
- "integrity": "sha512-qXROVp90sb83XtAoqE8bP9RwAkTTZbugRUTm5YeFCBfNRPEp2YzTeqWiz7m5OORHzEvrA/qcGS8hp/E+MMROYw==",
- "requires": {
- "@babel/runtime": "^7.6.3"
- }
- },
- "yaml-loader": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/yaml-loader/-/yaml-loader-0.5.0.tgz",
- "integrity": "sha512-p9QIzcFSNm4mCw/m5NdyMfN4RE4aFZJWRRb01ERVNGCym8VNbKtw3OYZXnvUIkim6U/EjqE/2yIh9F/msShH9A==",
- "requires": {
- "js-yaml": "^3.5.2"
- }
- },
- "yargs": {
- "version": "13.3.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
- "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
- "requires": {
- "cliui": "^5.0.0",
- "find-up": "^3.0.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^3.0.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^13.1.2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "yargs-parser": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
- "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- },
- "yauzl": {
- "version": "2.10.0",
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
- "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
- "requires": {
- "buffer-crc32": "~0.2.3",
- "fd-slicer": "~1.1.0"
- }
- },
- "yeast": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
- "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk="
- },
- "yoga-layout-prebuilt": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.9.5.tgz",
- "integrity": "sha512-+G5Ojl4/sG78mk5masCL3SRaZtkKXRBhMGf5c+4C1j32jN9KpS4lxVFdYyBi15EHN4gMeK5sIRf83T33TOaDkA==",
- "optional": true,
- "requires": {
- "@types/yoga-layout": "1.9.1"
- }
- },
- "yurnalist": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/yurnalist/-/yurnalist-1.1.2.tgz",
- "integrity": "sha512-y7bsTXqL+YMJQ2De2CBtSftJNLQnB7gWIzzKm10GDyC8Fg4Dsmd2LG5YhT8pudvUiuotic80WVXt/g1femRVQg==",
- "requires": {
- "babel-runtime": "^6.26.0",
- "chalk": "^2.4.2",
- "cli-table3": "^0.5.1",
- "debug": "^4.1.1",
- "deep-equal": "^1.1.0",
- "detect-indent": "^6.0.0",
- "inquirer": "^7.0.0",
- "invariant": "^2.2.0",
- "is-builtin-module": "^3.0.0",
- "is-ci": "^2.0.0",
- "leven": "^3.1.0",
- "loud-rejection": "^2.2.0",
- "node-emoji": "^1.10.0",
- "object-path": "^0.11.2",
- "read": "^1.0.7",
- "rimraf": "^3.0.0",
- "semver": "^6.3.0",
- "strip-ansi": "^5.2.0",
- "strip-bom": "^4.0.0"
- },
- "dependencies": {
- "ansi-escapes": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
- "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
- "requires": {
- "type-fest": "^0.11.0"
- }
- },
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
- },
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "requires": {
- "restore-cursor": "^3.1.0"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
- },
- "figures": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
- "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
- "requires": {
- "escape-string-regexp": "^1.0.5"
- }
- },
- "has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
- },
- "inquirer": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
- "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
- "requires": {
- "ansi-escapes": "^4.2.1",
- "chalk": "^3.0.0",
- "cli-cursor": "^3.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^3.0.0",
- "lodash": "^4.17.15",
- "mute-stream": "0.0.8",
- "run-async": "^2.4.0",
- "rxjs": "^6.5.3",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0",
- "through": "^2.3.6"
- },
- "dependencies": {
- "chalk": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
- "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
- "requires": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- }
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
- },
- "mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
- },
- "mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="
- },
- "onetime": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
- "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "requires": {
- "mimic-fn": "^2.1.0"
- }
- },
- "restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
- "requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- }
- },
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "requires": {
- "ansi-regex": "^4.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
- }
- }
- },
- "strip-bom": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
- "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="
- },
- "supports-color": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
- "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
- "requires": {
- "has-flag": "^4.0.0"
- }
- },
- "type-fest": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
- "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ=="
- }
- }
- },
- "zen-observable": {
- "version": "0.8.15",
- "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz",
- "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ=="
- },
- "zen-observable-ts": {
- "version": "0.8.20",
- "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.20.tgz",
- "integrity": "sha512-2rkjiPALhOtRaDX6pWyNqK1fnP5KkJJybYebopNSn6wDG1lxBoFs2+nwwXKoA6glHIrtwrfBBy6da0stkKtTAA==",
- "requires": {
- "tslib": "^1.9.3",
- "zen-observable": "^0.8.0"
- }
- },
- "zwitch": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
- "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw=="
- }
- }
-}
diff --git a/docs/package.json b/docs/package.json
deleted file mode 100644
index 5b2d148e..00000000
--- a/docs/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "scripts": {
- "prestart": "gatsby clean",
- "start": "gatsby develop",
- "build": "gatsby build",
- "serve": "gatsby serve"
- },
- "dependencies": {
- "algoliasearch": "^4.0.3",
- "gatsby": "2.19.41",
- "gatsby-plugin-gtag": "^1.0.13",
- "gatsby-source-graphql": "^2.1.33",
- "gatsby-theme-apollo-docs": "4.0.14",
- "instantsearch.css": "^7.4.2",
- "react": "16.12.0",
- "react-dom": "16.12.0",
- "react-instantsearch-dom": "^6.3.0"
- }
-}
diff --git a/docs/shared/disclaimer.mdx b/docs/shared/disclaimer.mdx
deleted file mode 100644
index 19bb556d..00000000
--- a/docs/shared/disclaimer.mdx
+++ /dev/null
@@ -1,5 +0,0 @@
-> **The code blocks below use TypeScript by default.** You can use the dropdown menu above a code block to switch to JavaScript.
->
-> If you're using JavaScript, use `.js` and `.jsx` file extensions wherever `.ts` and `.tsx` are mentioned.
->
-> To generate TypeScript types for your queries and mutations, open another terminal window and run `npm run codegen`. This will watch for changes to your code and generate the client-side typings.
\ No newline at end of file
diff --git a/docs/source/components/docset-menu.js b/docs/source/components/docset-menu.js
deleted file mode 100644
index 62e94052..00000000
--- a/docs/source/components/docset-menu.js
+++ /dev/null
@@ -1,53 +0,0 @@
-import React, { useContext } from 'react';
-import styled from '@emotion/styled';
-import {
- NavItemsContext,
- NavItemTitle,
- NavItemDescription
-} from 'gatsby-theme-apollo-docs';
-import { colors } from 'gatsby-theme-apollo-core';
-
-const Wrapper = styled.div({
- display: 'grid',
- gridTemplateColumns: `repeat(auto-fill, minmax(270px, 1fr))`,
- gridGap: 12,
- paddingTop: 8
-});
-
-const MenuItem = styled.div({
- display: 'flex'
-});
-
-const TextWrapper = styled.div({
- color: colors.text1
-});
-
-const StyledLink = styled.a({
- color: 'inherit',
- textDecoration: 'none',
- ':hover': {
- textDecoration: 'underline'
- }
-});
-
-export default function DocsetMenu() {
- const navItems = useContext(NavItemsContext);
- return (
-
- {navItems.filter((navItem) => {
- return !(navItem.omitLandingPage);
- }).map((navItem, index) => (
-
-
-
-
- {navItem.title}
-
-
- {navItem.description}
-
-
- ))}
-
- );
-}
diff --git a/docs/source/content/assets/akv2k8s_small.svg b/docs/source/content/assets/akv2k8s_small.svg
deleted file mode 100644
index 11c6976f..00000000
--- a/docs/source/content/assets/akv2k8s_small.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/docs/source/content/assets/controller_and_injector.png b/docs/source/content/assets/controller_and_injector.png
deleted file mode 100644
index f5529982..00000000
Binary files a/docs/source/content/assets/controller_and_injector.png and /dev/null differ
diff --git a/docs/source/content/how-it-works.mdx b/docs/source/content/how-it-works.mdx
deleted file mode 100644
index 33f071b5..00000000
--- a/docs/source/content/how-it-works.mdx
+++ /dev/null
@@ -1,125 +0,0 @@
----
-title: "How it Works"
-description: "Learn about the inner workings of akv2k8s."
----
-
-import {
- ExpansionPanel,
- ExpansionPanelList,
- ExpansionPanelListItem
-} from 'gatsby-theme-apollo-docs';
-
-Akv2k8s consist of three main components to integrate with Azure Key Vault:
-
-* a Custom Resource Definition called `AzureKeyVaultSecret`
-* Controller
-* Env Injector
-
-## The AzureKeyVaultSecret CRD
-
-The `AzureKeyVaultSecret` Custom Resource Definition (CRD) contains metadata used by the Controller and Env Injector to access objects in Azure Key Vault. For each secret, certificate or key in AzureKeyVault you want to make available in Kubernetes, you create a `AzureKeyVaultSecret` and provide the following information:
-
-* The Kubernetes namespace where the Azure Key Vault secret should be available
-* The name of the Azure Key Vault
-* The name, type and version (optional) of the Azure Key Vault object
-* Optionally which Kubernetes `Secret` name and data-key to create
-
-An example `AzureKeyVaultSecret` looks like this:
-
-```yaml
-# secret-sync.yaml
-
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: secret-sync
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # name of key vault
- object:
- name: my-secret # name of the akv object
- type: secret # akv object type
- output: # optional - only used to sync to a kubernetes secret
- secret:
- name: my-secret-from-akv # kubernetes secret name
- dataKey: secret-value # key to store object value in kubernetes secret
-```
-
-## The Controller
-
-The Controller is responsible for syncing Azure Key Vault objects into Kubernetes `Secret`'s, for all `AzureKeyVaultSecret`'s having `spec.output.secret` defined (like in the example above).
-
-Periodically the Controller will poll Azure Key Vault for version changes of the secret and apply any changes to the Kubernetes `Secret`.
-
-> **Note-1: Pods in Kubernetes currently do not get notifications when Secret resources change, and Pods will have to be re-created or use something like the Wave controller (https://github.com/pusher/wave) to get the changes**
-
-> **Note-2: By default the Controller auto sync secrets every 10 minutes (configurable) and depending on how many secrets are synchronized can cause extra usage costs of Azure Key Vault.**
-
-## The Env Injector
-
-The Env Injector is a bit more complex than the Controller and consists of:
-
-* a Mutating Admission Webhook (see [Kubernetes docs](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook))
-* a Docker image (spvest/azure-keyvault-env) containing the `azure-keyvault-env` executable
-
-Below is an outline of the steps that gets executed when a Pod is scheduled to start, in a namespace enabled for Env-Injector.
-
-
-
-
-### The Mutating Admission Webhook triggers
-
-The Env Injector webhook gets triggered just before every Pod gets created and inspects the Pod definition for environment variables with values containing `@azurekeyvault` (see example below). If it does not find any, the Pod starts as normal. If it does find environment variables with values containing `@azurekeyvault`, it mutates (changes) the Pod with:
-
-* A init-container (image: spvest/azure-keyvault-env) with these volumes:
- * A in-memory volume at `/azure-keyvault/`
- * A host volume at `/etc/kubernetes/azure.json` (only for default auth)
-* Changes the executable for the Pod container (more on that later)
-
-Example where environment variable has value containing `@azurekeyvault`:
-
-```yaml
-env:
- - name: MY_AKV_SECRET
- value: some-secret@azurekeyvault
-```
-
-As mentioned, the the Pod container gets mutated to use a different executable. It does this by changing either the CMD or the ENTRYPOINT, depending on which was used by the original container, to use the `azure-keyvault-env` executable instead. The "old" command gets passed in as parameter to this new executable.
-
-
-
-
-### The Pod starts the init-container
-
-When the Env Injector webhook is finished, Kubernetes will start the Pod with its new changes. This will trigger the following sequence:
-
-1. The init-container will start
-2. The init-container copies the `azure-keyvault-env` executable into `/azure-keyvault/`
-3. If default authentication is used, the `/etc/kubernetes/azure.json` located on the node, containing Azure AKS default credentials is copied to `/azure-keyvault/`
-
-The volume `/azure-keyvault/` is a shared in-memory volume accessible to both the init-container and the original container. This is how the init-container can "give" the original container access to files.
-
-> Note: All files located in the volume `/azure-keyvault/` will be deleted as soon as the original container starts up. It would be a security issue to have these files available to the container after startup.
-
-
-
-
-### The Pod starts the original container
-
-When the original container starts it will execute the `azure-keyvault-env` command, which will:
-
-1. Connect to Azure Key Vault, using credentials found in `/azure-keyvault/azure.json` (when default auth is used) - or use custom credentials
-2. Download any Azure Key Vault secrets, identified by the environment placeholders
-3. Delete all content from the shared volume `/azure-keyvault/`:
- 1. Delete itself (`azure-keyvault-env`)
- 2. Delete `/azure-keyvault/azure.json` - default credentials
-4. Execute the original command and params, pass on the updated environment variables with real secret values
-
-
-
-
-**✨The end result is that all secrets gets injected transparently in-memory during container startup. It will not reveal any secret content in the container spec, disk or logs. The only component that can read the secrets, are the program running inside the container. ✨**
-
-
-
diff --git a/docs/source/content/index.mdx b/docs/source/content/index.mdx
deleted file mode 100644
index ca317bc6..00000000
--- a/docs/source/content/index.mdx
+++ /dev/null
@@ -1,97 +0,0 @@
----
-title: Overview
-description: Explore Azure Key Vault to Kubernetes
----
-
-import DocsetMenu from '../components/docset-menu';
-import { Button } from '@apollo/space-kit/Button';
-import { Link } from 'gatsby';
-import { colors } from 'gatsby-theme-apollo-core';
-import {
- ExpansionPanel,
- ExpansionPanelList,
- ExpansionPanelListItem
-} from 'gatsby-theme-apollo-docs';
-
-Azure Key Vault to Kubernetes (akv2k8s) makes Azure Key Vault secrets, certificates and keys available in Kubernetes and/or your application - in a simple and secure way.
-
-## The Goals of the Azure Key Vault to Kubernetes project
-
-The Azure Key Vault to Kubernetes project was set out with these goals in mind:
-
-
-
-
-Avoid a direct program dependency on Azure Key Vault for getting secrets, and adhere to the 12 Factor App principle for configuration (https://12factor.net/config)
-
-
-
-
-Make it simple, secure and low risk to transfer Azure Key Vault secrets into Kubernetes as native Kubernetes secrets
-
-
-
-
-Bypass using Kubernetes Secrets entirely and transparently inject Azure Key Vault secrets directly into container applications
-
-
-
-
-All of these goals are met.
-
-
-
-
----
-
-## Components
-
-Akv2k8s contains two main components:
-
-1. The **akv2k8s Controller** syncs Azure Key Vault objects to Kubernetes as native `Secret`'s
-2. The **akv2k8s Injector** injects Azure Key Vault objects as environment variables directly into your application.
-
-The diagram below illustrate the two options:
-
-![Controller and Env-Injector](assets/controller_and_injector.png)
-
-For more information about the inner workings of Azure Key Vault for Kubernetes, see [How it Works](how-it-works).
-
-## Install both
-
-The recommendation is to install both the Controller and the Env Injector, enabling native Kubernetes secrets when needed and transparently injecting environment variables for all other cases.
-
-## When to use the Controller?
-
-Use the Controller if:
-
-* the native `Secret` support in Kubernetes is desired - e.g. you need to use a 3rd party Helm chart that expects a `Secret`
-* the [risks documented with Secrets in Kubernetes](https://kubernetes.io/docs/concepts/configuration/secret/#risks) is acceptable
-* there are no concerns about storing Azure Key Vault secrets as base64 encoded plain text values in Kubernetes `Secret` resources
-* it is OK that anyone with read access to `Secret` resources in the Kubernetes cluster can read the content of the secrets
-
-## When to use the Env Injector?
-
-Use the Env Injector if:
-
-* the application running in the container support getting secrets as environment variables
-* any of the [risks documented with Secrets in Kubernetes](https://kubernetes.io/docs/concepts/configuration/secret/#risks) is not acceptable
-* there are concerns about storing and exposing base64 encoded Azure Key Vault secrets as Kubernetes `Secret` resources
-* preventing Kubernetes users to gain access to Azure Key Vault secret content is important
-* secret environment variable values should not be revealed to Kubernetes resources like Pod specs, stored on disks, visible in logs or exposed in any way other than in-memory for the application
-
-## Not convinced yet?
-
-Go check out [Why use akv2k8s?](how-it-works) to see if that changes your mind.
-
-## Want to get started?
-
-
- }
- >
- Do the Quick Start!
-
-
diff --git a/docs/source/content/installation/index.md b/docs/source/content/installation/index.md
deleted file mode 100644
index 905bf687..00000000
--- a/docs/source/content/installation/index.md
+++ /dev/null
@@ -1,14 +0,0 @@
----
-title: "Overview"
-description: "Different options for installing akv2k8s"
----
-
-Make sure to check the [requirements](installation/requirements) before installing.
-
-## Installation options
-
-It's recommended to use Helm charts for installation.
-
-[Installing with Helm charts](installation/installing-with-helm)
-
-[Installing witouh Helm charts](installation/installing-without-helm)
diff --git a/docs/source/content/installation/installing-with-helm.md b/docs/source/content/installation/installing-with-helm.md
deleted file mode 100644
index d7326730..00000000
--- a/docs/source/content/installation/installing-with-helm.md
+++ /dev/null
@@ -1,89 +0,0 @@
----
-title: "Installation with Helm"
-description: "How to install Azure Key Vault to Kubernetes with Helm"
----
-
-> Make sure to check the [requirements](requirements) before installing.
-
-## Installing with Helm on Azure AKS
-
-Create `akv2k8s` namespace:
-
-```bash
-kubectl create ns akv2k8s
-```
-
-Add Helm repository:
-
-```bash
-helm repo add spv-charts http://charts.spvapi.no
-helm repo update
-```
-
-Install both Controller and Env-Injector:
-
-```bash
-helm install azure-key-vault-controller \
- spv-charts/azure-key-vault-controller \
- --namespace akv2k8s
-
-helm install azure-key-vault-env-injector \
- spv-charts/azure-key-vault-env-injector \
- --set installCrd=false \
- --namespace akv2k8s
-```
-
-For more details about installation options, see the
-individual Helm charts:
-
-* [Controller](../stable/azure-key-vault-controller/README)
-* [Env Injector](../stable/azure-key-vault-env-injector/README)
-
-## Installing with Helm outside Azure AKS
-
-When running inside Azure AKS, akv2k8s can use the AKS cluster credentials for authorizing with Azure Key Vault (default behavior). Outside Azure AKS - credentials (Azure Service Principal) must be provided by setting `keyVault.customAuth=true`. See [Authentication](../security/authentication) for more details.
-
-Create `akv2k8s` namespace:
-
-```bash
-kubectl create ns akv2k8s
-```
-
-Add Helm repository:
-
-```bash
-helm repo add spv-charts http://charts.spvapi.no
-helm repo update
-```
-
-Install both Controller and Env-Injector:
-
-```bash
-helm install azure-key-vault-controller \
- spv-charts/azure-key-vault-controller \
- --namespace akv2k8s \
- --set keyVault.customAuth.enabled=true \
- --set env.AZURE_TENANT_ID= \
- --set env.AZURE_CLIENT_ID= \
- --set env.AZURE_CLIENT_SECRET=
-
-helm install azure-key-vault-env-injector \
- spv-charts/azure-key-vault-env-injector \
- --namespace akv2k8s \
- --set installCrd=false \
- --set keyVault.customAuth.enabled=true \
- --set env.AZURE_TENANT_ID= \
- --set env.AZURE_CLIENT_ID= \
- --set env.AZURE_CLIENT_SECRET=
-```
-
-## Monitoring changes in specific namespace only
-
-akv2k8s Controller can be installed into separate namespace and monitor changes only in this namespace.
-
-```bash
-helm install azure-key-vault-controller \
- spv-charts/azure-key-vault-controller \
- --namespace akv2k8s
- --set env.NAMESPACE=akv2k8s
-```
diff --git a/docs/source/content/installation/installing-without-helm.md b/docs/source/content/installation/installing-without-helm.md
deleted file mode 100644
index 7933b86e..00000000
--- a/docs/source/content/installation/installing-without-helm.md
+++ /dev/null
@@ -1,48 +0,0 @@
----
-title: "Installation without Helm"
-description: "How to setup Azure Key Vault to Kubernetes"
----
-
-Make sure to check the [requirements](requirements) before installing.
-
-If Helm is not an option, use Helm on a local computer to generate the Kubernetes templates like below.
-
-## Helm 2
-
-Add Helm repository:
-
-```bash
-helm repo add spv-charts http://charts.spvapi.no
-helm repo update
-```
-
-Render akv2k8s charts locally:
-
-```bash
-helm install --debug --dry-run akv2k8s spv-charts/azure-key-vault-controller
- --namespace akv2k8s
-helm install --debug --dry-run akv2k8s spv-charts/azure-key-vault-env-injector \
- --set installCrd=false --namespace akv2k8s
-```
-
-## Helm 3
-
-Download the Git repository:
-
-```bash
-git clone git@github.com:SparebankenVest/c.git
-```
-
-Render chart template locally:
-
-```bash
-cd public-helm-charts
-helm template akv2k8s ./stable/azure-key-vault-env-injector/
-```
-
-## Options and more
-
-For more details about installation options, see the individual Helm charts:
-
-* Controller: https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-controller
-* Env Injector: https://github.com/SparebankenVest/public-helm-charts/tree/master/stable/azure-key-vault-env-injector
diff --git a/docs/source/content/installation/requirements.md b/docs/source/content/installation/requirements.md
deleted file mode 100644
index e35f274b..00000000
--- a/docs/source/content/installation/requirements.md
+++ /dev/null
@@ -1,18 +0,0 @@
----
-title: "Requirements"
-description: "Requirements for installing akv2k8s"
----
-
-* Kubernetes version >= 1.13
-* A dedicated kubernetes namespace
-* Enabled admission controllers: MutatingAdmissionWebhook and ValidatingAdmissionWebhook
-* RBAC enabled
-* Default [authentication](../security/authentication) requires Kubernetes cluster running in Azure - use [custom authentication](../security/authentication#custom-authentication) if running outside Azure
-
-## Dedicated namespace for akv2k8s
-
-Akv2k8s should be installed in a dedicated Kubernetes namespace that is **NOT** label with `azure-key-vault-env-injection: enabled`.
-
-**If the namespace where the akv2k8s components is installed has the injector enabled (`azure-key-vault-env-injection: enabled`), the Env Injector will most likely not be able to start.** This is because the Env Injector mutating webhook will trigger for every pod about to start in namespaces where enabled, and in the home namepsace of the Env Injector, it will effectively point to itself, which does not exist yet.
-
-**The simple rule to avoid any issues related to this, is to just install akv2k8s components in its own dedicated namespace.**
\ No newline at end of file
diff --git a/docs/source/content/installation/updating-with-helm.md b/docs/source/content/installation/updating-with-helm.md
deleted file mode 100644
index de80856e..00000000
--- a/docs/source/content/installation/updating-with-helm.md
+++ /dev/null
@@ -1,34 +0,0 @@
----
-title: "Upgrading with Helm"
-description: "How to update Azure Key Vault to Kubernetes with Helm"
----
-
-Update Helm repository:
-
-```bash
-helm repo update
-```
-
-Update both Controller and Env-Injector:
-
-```bash
-helm upgrade azure-key-vault-controller \
- spv-charts/azure-key-vault-controller \
- --namespace akv2k8s
- --set installCrd=false \
-
-
-helm install azure-key-vault-env-injector \
- spv-charts/azure-key-vault-env-injector \
- --namespace akv2k8s
- --set installCrd=false \
-
-```
-
-> **Note: It's important that you set `--set installCrd=false`, because in a existing installation the CRD already exists.**
-
-For more details about installation options, see the
-individual Helm charts:
-
-* [Controller](../stable/azure-key-vault-controller/README/)
-* [Env Injector](../stable/azure-key-vault-env-injector/README/)
diff --git a/docs/source/content/quick-start.mdx b/docs/source/content/quick-start.mdx
deleted file mode 100644
index c03cec7f..00000000
--- a/docs/source/content/quick-start.mdx
+++ /dev/null
@@ -1,81 +0,0 @@
----
-title: Quick Start
-description: Quickly get started using Azure Key Vault to Kubernetes
----
-
-import {
- ExpansionPanel,
- ExpansionPanelList,
- ExpansionPanelListItem
-} from 'gatsby-theme-apollo-docs';
-
-
-
-
-## Installation
-
-See [installation](installation).
-
-
-
-
-## Ensure Kubernetes can access objects in Azure Key Vault
-
-By default akv2k8s use the AKS cluster credentials to authenticate with Azure Key Vault (if you run outside Azure, see using [custom credentials](security/authentication#custom-authentication)). Run the following command to authorize akv2k8s to access `secret`-objects in Azure Key Vault.
-
-```bash
-az keyvault set-policy \
- -n \
- --secret-permissions get \
- --spn \
- --subscription
-```
-
-For more details and options, check out [authentication](security/authentication) and [authorization](security/authorization).
-
-
-
-
-## Sync Azure Key Vault object to Kubernetes `Secret`
-
-Create a `AzureKeyVaultSecret` resource in the namespace you want the Kubernetes `Secret` to be synced. In this example we are using the namespace `akv-test`.
-
-```yaml
-# secret-sync.yaml
-
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: secret-sync
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # 1. name of key vault
- object:
- name: my-secret # 2. name of the akv object
- type: secret # 3. akv object type
- output:
- secret:
- name: my-secret-from-akv # 4. kubernetes secret name
- dataKey: secret-value # 5. key to store object value in kubernetes secret
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f secret-sync.yaml
-azurekeyvaultsecret.spv.no/secret-sync created
-```
-
-
-
-
-## Done
-
-Shortly you should have a Kubernetes `Secret` resource in the namespace `akv-test`, containing the value from Azure Key Vault!
-
-To see how to use the Env-Injector to bypass using Kubernetes Secrets entirely and other options, check out the [tutorials](tutorials).
-
-
-
-
diff --git a/docs/source/content/reference/azure-key-vault-secret.md b/docs/source/content/reference/azure-key-vault-secret.md
deleted file mode 100644
index 52ecc2e1..00000000
--- a/docs/source/content/reference/azure-key-vault-secret.md
+++ /dev/null
@@ -1,87 +0,0 @@
----
-title: "AzureKeyVaultSecret"
-description: "Reference of AzureKeyVaultSecret custom resource definition"
----
-
-The `AzureKeyVaultSecret` is defined using this schema:
-
-```yaml
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: < name for azure key vault secret>
- namespace:
-spec:
- vault:
- name:
- object:
- name:
- type:
- version:
- contentType:
- output: # ignored by env injector, required by controller to output kubernetes secret
- secret:
- name:
- dataKey:
- type:
-```
-
-> **Note - the `output` is only used by the Controller to create the Azure Key Vault secret as a Kubernetes native Secret - it is ignored and not needed by the Env Injector.**
-
-## Kubernetes Secret Types
-
-The default secret type (`spec.output.secret.type`) is `opaque`. Below is a list of supported Kubernetes secret types and which keys each secret type stores.
-
-For a complete list, see [core/v1/types.go](https://github.com/kubernetes/api/blob/49be0e3344fe443eb3d23105225ed2f1ab1e6cab/core/v1/types.go#L4950) in the Kubernetes GitHub repository.
-
-| Secret type | Keys |
-| -------------------------------- | ---- |
-| `opaque` (default) | defined in `spec.output.secret.dataKey` |
-| `kubernetes.io/tls` | `tls.key`, `tls.crt` |
-| `kubernetes.io/dockerconfigjson` | `.dockerconfigjson` |
-| `kubernetes.io/dockercfg` | `.dockercfg` |
-| `kubernetes.io/basic-auth` | `username`, `password` |
-| `kubernetes.io/ssh-auth` | `ssh-privatekey` |
-
-
-With the exception of the `opaque` secret type, the Controller will make a best effort to export the Azure Key Vault object into the secret type defined.
-
-### `kubernetes.io/tls`
-
-By pointing to a **exportable** Certificate object in Azure Key Vault AND setting the Kubernetes output secret type to `kubernetes.io/tls`, the controller will automatically format the Kubernetes secret accordingly both for pem and pfx certificates.
-
-### `kubernetes.io/dockerconfigjson`
-
-Requires a well formatted docker config stored in a Secret object like this:
-
-```json
-{
- "auths": {
- "some.azurecr.io": {
- "username": "someuser",
- "password": "somepassword",
- "email": "someuser@spv.no",
- "auth": "c29tZXVzZXI6c29tZXBhc3N3b3JkCg=="
- }
- }
-}
-```
-
-If the `"auth"` property is not included, the controller will generate it.
-
-### `kubernetes.io/basic-auth`
-
-The controller support two formats. Either `username:password` or pre-encoded with base64: `dXNlcm5hbWU6cGFzc3dvcmQ=` stored in a Secret object.
-
-### `kubernetes.io/ssh-auth`
-
-This must be a properly formatted **Private** SSH Key stored in a Secret object.
-
-## Vault Object Types
-
-| Object type | Description |
-| ------------- | ----------- |
-| `secret` | Azure Key Vault Secret - can contain any secret data |
-| `certificate` | Azure Key Vault Certificate - A TLS certificate with just the public key or both public and private key if exportable |
-| `key` | Azure Key Vault Key - A RSA or EC key used for signing |
-| `multi-key-value-secret` | A special kind of Azure Key Vault Secret only understood by the Controller and the Env Injector. For cases where a secret contains `json` or `yaml` key/value items that will be directly exported as key/value items in the Kubernetes secret, or access with queries in the Env Injector. When `multi-key-value-secret` type is used, the `contentType` property MUST also be set to either `application/x-json` or `application/x-yaml`. |
diff --git a/docs/source/content/reference/index.md b/docs/source/content/reference/index.md
deleted file mode 100644
index 79721183..00000000
--- a/docs/source/content/reference/index.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "Reference"
-description: "Reference of akv2k8s objects"
----
-
-Find detailed reference for all akv2k8s objects, like the Kubernetes Custom Resource Definition (CRD) [`AzureKeyVaultSecret`](reference/azure-key-vault-secret).
\ No newline at end of file
diff --git a/docs/source/content/security/authentication.md b/docs/source/content/security/authentication.md
deleted file mode 100644
index 3b5ee7c4..00000000
--- a/docs/source/content/security/authentication.md
+++ /dev/null
@@ -1,65 +0,0 @@
----
-title: "Authentication"
-description: "Learn about the different options for authenticating with Azure Key Vault."
----
-
-By default both the Controller and the Env Injector will assume it is running on Azure (since Azure Key Vault is most commonly used in Azure) - and use the default AKS service principal for authentication - unless custom authentication is provided (see [Custom Authentication](#custom-authentication) below).
-
-Default authentication is the AKS credentials that are available on all Nodes (hosts) at `/etc/kubernetes/azure.json`. These credentials are the same as the Kubernetes cluster use when interacting with Azure to create VM's, Load Balancers and other cloud infrastructure.
-
-> **Note: The preferred solution would be to use [Azure Managed Identities](https://docs.microsoft.com/en-us/azure/aks/use-managed-identity), but this is still in preview - so for now we rely on the default AKS service principal.**
-
-## Situations where Default Authentication does not Work
-
-Currently only one situations has been identified, where default authentication does not work inside Azure.
-
-**When a [Pod Security Policy](https://kubernetes.io/docs/concepts/policy/pod-security-policy/) is configured in the cluster, preventing containers from reading from the host.**
-
-Two solutions exists:
- 1. Change the Pod Security Policy to list `/etc/kubernetes/azure.json` under [AllowedHostPaths](https://kubernetes.io/docs/concepts/policy/pod-security-policy/#volumes-and-file-systems)
- 2. Or [use custom authentication](#custom-authentication).
-
-## Custom Authentication
-
-It is possible to give the Controller and/or the Env Injector specific credentials to authenticate with Azure Key Vault. The authentication requirements for the Controller and Env Injector are covered below.
-
-## Custom Authentication for the Controller
-
-The Controller will need Azure Key Vault credentials to get Secrets from Azure Key Vault and store them as Kubernetes Secrets. In order to provide custom credentials, pass inn the value `keyVault.customAuth.enabled=true` to the Controller Helm Chart together with one of the [Authentication options](#custom-authentication-options) described below.
-
-Fore more details, see the [Controller Helm Chart](/stable/azure-key-vault-controller/README/#installing-the-chart).
-
-## Custom Authentication for Env Injector
-
-To use custom authentication for the Env Injector there are two options:
-
-1. Use Microsft's [AAD Pod Identity](https://github.com/Azure/aad-pod-identity) (see [Using Custom Authentication with AAD Pod Identity](/stable/azure-key-vault-env-injector/README/#using-custom-authentication-with-aad-pod-identity))
-2. Use custom credentials through credential injection (see [Using Custom Authentication with Credential Injection Enabled](/stable/azure-key-vault-env-injector/README/#using-custom-authentication-with-credential-injection-enabled))
-3. Provide credentials for each Pod using the Env Injector pattern using [Authentication options](#custom-authentication-options) below.
-
-To avoid using option no. 3, support for a more convenient solution (no. 2) is supported where the Azure Key Vault credentials in the Env Injector (using [Authentication options](#custom-authentication-options) below) is "forwarded" to the the Pods. The Env Injector will create a Kubernetes Secret containing the credentials and mutate the Pod's env section to reference the credentials in the Secret.
-
-Fore more details, see the [Env Injector Helm Chart](/stable/azure-key-vault-env-injector/README/#installing-the-chart).
-
-## Custom Authentication Options
-
-The following authentication options are available:
-
-| Authentication type | Environment variable | Description |
-| ------------------- | ---------------------------- | ------------ |
-| Managed identities for Azure resources (used to be MSI) | | No credentials are needed for managed identity authentication. The Kubernetes cluster must be running in Azure and the `aad-pod-identity` controller must be installed. A `AzureIdentity` and `AzureIdentityBinding` must be defined. See https://github.com/Azure/aad-pod-identity for details. |
-| Client credentials | `AZURE_TENANT_ID` | The ID for the Active Directory tenant that the service principal belongs to. |
-| | `AZURE_CLIENT_ID` | The name or ID of the service principal. |
-| | `AZURE_CLIENT_SECRET` | The secret associated with the service principal. |
-| Certificate | `AZURE_TENANT_ID` | The ID for the Active Directory tenant that the certificate is registered with. |
-| | `AZURE_CLIENT_ID` | The application client ID associated with the certificate. |
-| | `AZURE_CERTIFICATE_PATH` | The path to the client certificate file. |
-| | `AZURE_CERTIFICATE_PASSWORD` | The password for the client certificate. |
-| Username/Password | `AZURE_TENANT_ID` | The ID for the Active Directory tenant that the user belongs to. |
-| | `AZURE_CLIENT_ID` | The application client ID. |
-| | `AZURE_USERNAME` | The username to sign in with.
-| | `AZURE_PASSWORD` | The password to sign in with. |
-
-**Note: These env variables are sensitive and should be stored in a Kubernetes `Secret` resource, then referenced by [Using Secrets as Environment Variables](https://kubernetes.io/docs/concepts/configuration/secret/#using-secrets-as-environment-variables).**
-
-See official MS documentation for more details on how environment base authentication works for Azure: https://docs.microsoft.com/en-us/go/azure/azure-sdk-go-authorization#use-environment-based-authentication
diff --git a/docs/source/content/security/authorization.md b/docs/source/content/security/authorization.md
deleted file mode 100644
index be59c2e5..00000000
--- a/docs/source/content/security/authorization.md
+++ /dev/null
@@ -1,40 +0,0 @@
----
-title: "Authorization"
-description: "Learn how to set the proper access rights in Azure Key Vault"
----
-
-No matter which [authentication](authentication) option is used, the authenticated account will need `get` permissions to the different object types in Azure Key Vault.
-
-**Note: It's only possible to control access at the top level of Azure Key Vault, not per object/resource. The recommendation is therefore to have a dedicated Key Vault per cluster.**
-
-Access is controlled through Azure Key Vault policies and can be configured through Azure CLI like this:
-
-Azure Key Vault Secrets:
-
-```bash
-az keyvault set-policy \
- -n \
- --secret-permissions get \
- --spn \
- --subscription
-```
-
-Azure Key Vault Certificates:
-
-```bash
-az keyvault set-policy \
- -n \
- --certificate-permissions get \
- --spn \
- --subscription
-```
-
-Azure Key Vault Keys:
-
-```bash
-az keyvault set-policy \
- -n \
- --key-permissions get \
- --spn \
- --subscription
-```
diff --git a/docs/source/content/security/enable-env-injection.md b/docs/source/content/security/enable-env-injection.md
deleted file mode 100644
index faf0f68e..00000000
--- a/docs/source/content/security/enable-env-injection.md
+++ /dev/null
@@ -1,15 +0,0 @@
----
-title: "Enable Environment Injecton"
-description: "Learn how to enable environment injection per Kubernetes namespace"
----
-
-The Env Injector is developed using a Mutating Admission Webhook that triggers just before every Pod gets created. To allow cluster administrators some control over which Pods this Webhook gets triggered for, it must be enabled per namespace using the `azure-key-vault-env-injection` label, like in the example below:
-
-```yaml
-apiVersion: v1
-kind: Namespace
-metadata:
- name: akv-test
- labels:
- azure-key-vault-env-injection: enabled
-```
\ No newline at end of file
diff --git a/docs/source/content/troubleshooting/controller-log.md b/docs/source/content/troubleshooting/controller-log.md
deleted file mode 100644
index a56ebf0e..00000000
--- a/docs/source/content/troubleshooting/controller-log.md
+++ /dev/null
@@ -1,12 +0,0 @@
----
-title: "Get the akv2k8s Controller Log"
-description: "How to access the Controller log and specify log level"
----
-
-```bash
-kubectl -n akv2k8s logs deployment/azure-key-vault-controller
-```
-
-To set log-level for Controller, pass inn environment variable `LOG_LEVEL` to the container or the `logLevel` parameter for the Helm Chart.
-
-The Controller uses Logrus for logging, supporting seven log levels: https://github.com/Sirupsen/logrus#level-logging - Trace, Debug, Info, Warning, Error, Fatal and Panic. Default log level is `Info`.
\ No newline at end of file
diff --git a/docs/source/content/troubleshooting/env-injector-log-level.md b/docs/source/content/troubleshooting/env-injector-log-level.md
deleted file mode 100644
index 6c0e8806..00000000
--- a/docs/source/content/troubleshooting/env-injector-log-level.md
+++ /dev/null
@@ -1,28 +0,0 @@
----
-title: "Set env-injector log-level"
-description: "How to set the log-level for the env-injector"
----
-
-The Env-Injector logs in three different places:
-
-* The Pod hosting the Webhook
-* The init-container
-* During startup of container where environment variables are injected
-
-## Access Webhook logs
-
-The Webhook logs information about every Pod that attempts to start in a namespace monitored by the Env-Injector. If something goes wrong during the mutation of a Pod, the log will contain information about what happened. If you want more detailed information, you can increase the log level.
-
-Log level is controlled through the environment variable `LOG_LEVEL` on the webhook container or through the `logLevel` parameter for the Env-Injector Helm Chart.
-
-## Access init-container logs
-
-The init-container will only execute shell commands for copying files into the in-memory volume at `/azure-keyvault/` - but if that would fail, the init-container will contain the shell output in its log.
-
-## Access logs in your own container
-
-During startup of a container where environment variables are injected, the `azure-keyvault-env` executable will output any errors that occured during injection and debug messages. To see any debug message, the log level must be set to `debug`.
-
-Debug level is controlled through the environment variable `ENV_INJECTOR_LOG_LEVEL` on your container.
-
-The env-injector uses Logrus for logging, supporting seven log levels: https://github.com/Sirupsen/logrus#level-logging - Trace, Debug, Info, Warning, Error, Fatal and Panic. Default log level is `Info`.
\ No newline at end of file
diff --git a/docs/source/content/troubleshooting/known-issues.md b/docs/source/content/troubleshooting/known-issues.md
deleted file mode 100644
index 17c5147a..00000000
--- a/docs/source/content/troubleshooting/known-issues.md
+++ /dev/null
@@ -1,26 +0,0 @@
----
-title: "Known Issues"
-description: "A list of known issues and available solutions or workarounds"
----
-
-## Env Injector - x509: certificate signed by unknown authority
-
-**Issue:** Trying to inject secrets into a application running on a container without CA certificates will fail with an error like below:
-
-```bash
-level=fatal msg="env-injector: failed to read secret 'test', error azure.BearerAuthorizer#WithAuthorization: Failed to refresh the Token for request to https://my-key-vault.vault.azure.net/secrets/test/?api-version=2016-10-01: StatusCode=0 -- Original Error: adal: Failed to execute the refresh request. Error = 'Post https://login.microsoftonline.com/xxx/oauth2/token?api-version=1.0: x509: certificate signed by unknown authority'"
-```
-
-Doing HTTPS calls without CA certificates will make it impossible for the client to validate if a TLS certificate is signed by a trusted CA.
-
-**Solution:** Make sure CA certificates are installed in the Docker image used by the container you are trying to inject env vars into (eg. `apt-get install -y ca-certificates`)
-
-## Env injector - failed calling webhook
-
-**Issue:** Trying to install the Env Injector in the same namespace as you intend to use it might fail with:
-
-```bash
-Error creating: Internal error occurred: failed calling webhook "pods.azure-key-vault-env-injector.admission.spv.no": Post https://azure-key-vault-env-injector.some-namespace.svc:443/pods?timeout=30s: dial tcp 10.1.1.124:443: connect: connection refused
-```
-
-**Solution:** Make sure to install Env Injector into its own dedicated namespace, and NOT label namespace with `azure-key-vault-env-injection: enabled`. This label is ONLY intended for namespaces where Env Injector is going to inject secrets, not where Env Injector is installed.
\ No newline at end of file
diff --git a/docs/source/content/tutorials/env-injection/1-secret.md b/docs/source/content/tutorials/env-injection/1-secret.md
deleted file mode 100644
index 6350d0d3..00000000
--- a/docs/source/content/tutorials/env-injection/1-secret.md
+++ /dev/null
@@ -1,102 +0,0 @@
----
-title: "Inject Secret"
-description: "Inject an Azure Key Vault secret directly into a container application"
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
-
-We start by creating a definition for the Azure Key Vault secret we want to inject:
-
-```yaml:title=akvs-secret-inject.yaml
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: secret-inject
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # name of key vault
- object:
- name: my-secret # name of the akv object
- type: secret # akv object type
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f akvs-secret-inject.yaml
-azurekeyvaultsecret.spv.no/secret-inject created
-```
-
-List AzureKeyVaultSecret's:
-
-```bash
-$ kubectl -n akv-test get akvs
-NAME VAULT VAULT OBJECT SECRET NAME SYNCHED
-secret-inject akv2k8s-test my-secret
-```
-
-Then we deploy a Pod having a env-variable pointing to the secret above.
-
-```yaml:title=secret-deployment.yaml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: akvs-secret-app
- namespace: akv-test
- labels:
- app: akvs-secret-app
-spec:
- selector:
- matchLabels:
- app: akvs-secret-app
- template:
- metadata:
- labels:
- app: akvs-secret-app
- spec:
- containers:
- - name: akv2k8s-env-test
- image: spvest/akv2k8s-env-test:2.0.1
- args: ["TEST_SECRET"]
- env:
- - name: TEST_SECRET
- value: "secret-inject@azurekeyvault" # ref to akvs
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f secret-deployment.yaml
-deployment.apps/akvs-secret-app created
-```
-
-Things to note from the Deployment yaml above:
-
-```yaml{3,4,6,7}
-containers:
- - name: akv2k8s-env-test
- image: spvest/akv2k8s-env-test:2.0.1 # 1.
- args: ["TEST_SECRET"] # 2.
- env:
- - name: TEST_SECRET # 3.
- value: "secret-inject@azurekeyvault" # 4.
-```
-
-1. We use a custom built Docker image for testing purposes that only outputs the content of the env-variables passed in as args in #2. Feel free to replace this with your own Docker image.
-2. Again, specific for the Docker test image we are using (in #1), we pass in which environment variables we want the container to print values for
-3. Name of the environment variable
-4. By using the special akv2k8s Env Injector convention `@azurekeyvault` to reference the AzureKeyVaultSecret `secret-inject` we created earlier. The env-injector will download this secret from Azure Key Vault and inject into the executable running in your Container.
-
-To see the log output from your Pod, execute the following command:
-
-```
-kubectl -n akv-test logs deployment/akvs-secret-app
-```
-
-### Cleanup
-
-```bash
-kubectl delete -f akvs-secret-inject.yaml
-kubectl delete -f secret-deployment.yaml
-```
\ No newline at end of file
diff --git a/docs/source/content/tutorials/env-injection/2-certificate.md b/docs/source/content/tutorials/env-injection/2-certificate.md
deleted file mode 100644
index 29e1c738..00000000
--- a/docs/source/content/tutorials/env-injection/2-certificate.md
+++ /dev/null
@@ -1,108 +0,0 @@
----
-title: "Inject Certificate"
-description: "Inject an Azure Key Vault certificate key pair directly into a container application"
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
-
-We start by creating a definition for the Azure Key Vault secret pointing to the certificate we want to sync:
-
-```yaml:title=akvs-certificate-inject.yaml
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: certificate-inject
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # name of key vault
- object:
- name: my-certificate # name of the akv object
- type: certificate # akv object type
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f akvs-certificate-inject.yaml
-azurekeyvaultsecret.spv.no/certificate-inject created
-```
-
-To list AzureKeyVaultSecret's and see sync status:
-
-```bash
-$ kubectl -n akv-test get akvs
-NAME VAULT VAULT OBJECT SECRET NAME SYNCHED
-certificate-inject akv2k8s-test my-certificate
-```
-
-Then we deploy a Pod having a env-variable pointing to the secret above.
-
-```yaml:title=certificate-deployment.yaml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: akvs-certificate-app
- namespace: akv-test
- labels:
- app: akvs-certificate-app
-spec:
- selector:
- matchLabels:
- app: akvs-certificate-app
- template:
- metadata:
- labels:
- app: akvs-certificate-app
- spec:
- containers:
- - name: akv2k8s-env-test
- image: spvest/akv2k8s-env-test:2.0.1
- args: ["PUBLIC_KEY", "PRIVATE_KEY"]
- env:
- - name: PUBLIC_KEY
- value: certificate-inject@azurekeyvault?tls.crt
- - name: PRIVATE_KEY
- value: certificate-inject@azurekeyvault?tls.key
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f certificate-deployment.yaml
-deployment.apps/akvs-certificate-app created
-```
-
-Things to note from the Deployment yaml above:
-
-```yaml{3,4,6-9}
-containers:
-- name: akv2k8s-env-test
- image: spvest/akv2k8s-env-test # 1.
- args: ["PUBLIC_KEY", "PRIVATE_KEY"] # 2.
- env:
- - name: PUBLIC_KEY # 3.
- value: certificate-inject@azurekeyvault?tls.crt # 4.
- - name: PRIVATE_KEY # 5.
- value: certificate-inject@azurekeyvault?tls.key # 6.
-```
-
-1. We use a custom built Docker image for testing purposes that only outputs the content of the env-variables passed in as args in #2. Feel free to replace this with your own Docker image.
-2. Again, specific for the Docker test image we are using (in #1), we pass in which environment variables we want the container to print values for
-3. Name of the environment variable containing the certificate public key
-4. By using the special akv2k8s Env Injector convention `@azurekeyvault` to reference the AzureKeyVaultSecret `certificate-inject` we created earlier. The env-injector will download this secret from Azure Key Vault and inject into the executable running in your Container.
-5. Name of the environment variable containing the certificate private key
-6. Same as 4. - only for the certificate private key
-
-To see the log output from your Pod, execute the following command:
-
-```
-kubectl -n akv-test logs deployment/akvs-certificate-app
-```
-
-### Cleanup
-
-```bash
-kubectl delete -f akvs-secret-inject.yaml
-kubectl delete -f secret-deployment.yaml
-```
\ No newline at end of file
diff --git a/docs/source/content/tutorials/env-injection/3-signing-key.md b/docs/source/content/tutorials/env-injection/3-signing-key.md
deleted file mode 100644
index cc1a4ba2..00000000
--- a/docs/source/content/tutorials/env-injection/3-signing-key.md
+++ /dev/null
@@ -1,102 +0,0 @@
----
-title: "Inject Signing Key"
-description: "Inject a signing key from Azure Key Vault as environment variable into an application"
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
-
-We start by creating a definition for the Azure Key Vault signing key we want to inject:
-
-```yaml:title=akvs-signing-key-inject.yaml
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: signing-key-inject
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # name of key vault
- object:
- name: my-key # name of the akv object
- type: key # akv object type
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f akvs-signing-key-inject.yaml
-azurekeyvaultsecret.spv.no/signing-key-inject created
-```
-
-List AzureKeyVaultSecret's:
-
-```bash
-$ kubectl -n akv-test get akvs
-NAME VAULT VAULT OBJECT SECRET NAME SYNCHED
-signing-key-inject akv2k8s-test my-key
-```
-
-Then we deploy a Pod having a env-variable pointing to the secret above.
-
-```yaml:title=signing-key-deployment.yaml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: akvs-signing-key-app
- namespace: akv-test
- labels:
- app: akvs-signing-key-app
-spec:
- selector:
- matchLabels:
- app: akvs-signing-key-app
- template:
- metadata:
- labels:
- app: akvs-signing-key-app
- spec:
- containers:
- - name: akv2k8s-env-test
- image: spvest/akv2k8s-env-test:2.0.1
- args: ["TEST_SIGNING_KEY"]
- env:
- - name: TEST_SIGNING_KEY
- value: "signing-key-inject@azurekeyvault" # ref to akvs
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f signing-key-deployment.yaml
-deployment.apps/akvs-signing-key-app created
-```
-
-Things to note from the Deployment yaml above:
-
-```yaml{3,4,6,7}
-containers:
- - name: akv2k8s-env-test
- image: spvest/akv2k8s-env-test:2.0.1 # 1.
- args: ["TEST_SIGNING_KEY"] # 2.
- env:
- - name: TEST_SIGNING_KEY # 3.
- value: "secret-inject@azurekeyvault" # 4.
-```
-
-1. We use a custom built Docker image for testing purposes that only outputs the content of the env-variables passed in as args in #2. Feel free to replace this with your own Docker image.
-2. Again, specific for the Docker test image we are using (in #1), we pass in which environment variables we want the container to print values for
-3. Name of the environment variable
-4. By using the special akv2k8s Env Injector convention `@azurekeyvault` to reference the AzureKeyVaultSecret `signing-key-inject` we created earlier. The env-injector will download this signing key from Azure Key Vault and inject into the executable running in your Container.
-
-To see the log output from your Pod, execute the following command:
-
-```
-kubectl -n akv-test logs deployment/akvs-signing-key-app
-```
-
-### Cleanup
-
-```bash
-kubectl delete -f akvs-signing-key-inject.yaml
-kubectl delete -f signing-key-deployment.yaml
-```
\ No newline at end of file
diff --git a/docs/source/content/tutorials/env-injection/4-multi-value-secret.md b/docs/source/content/tutorials/env-injection/4-multi-value-secret.md
deleted file mode 100644
index d98733cf..00000000
--- a/docs/source/content/tutorials/env-injection/4-multi-value-secret.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: "Inject Multi Value Secret"
-description: "Inject a multi-value secret from Azure Key Vault as environment variables into an application"
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
diff --git a/docs/source/content/tutorials/env-injection/5-pfx-certificate.md b/docs/source/content/tutorials/env-injection/5-pfx-certificate.md
deleted file mode 100755
index e375937e..00000000
--- a/docs/source/content/tutorials/env-injection/5-pfx-certificate.md
+++ /dev/null
@@ -1,116 +0,0 @@
----
-title: "Inject PFX Certificate"
-description: "Inject a PFX certificate from Azure Key Vault as environment variables into an application"
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
-
-The certificate handling in certain programming languages like Microsoft .NET has a
-preference for certificates in the binary PKCS12 format, commonly known as PFX. To extract the raw
-PKCS12 certificate from Azure Key Vault, you need to **get the Secret object of the Certificate**!
-
-This tutorial is EXACTLY like the [Inject Certificate](2-certificate) tutorial, except the highlighted
-last line below:
-
-```yaml{11}:title=akvs-certificate-inject.yaml
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: certificate-inject
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # name of key vault
- object:
- name: my-certificate # name of the akv object
- type: secret # akv object type
-```
-
-By specifying `type: secret` instead of `certificate`, Azure Key Vault will respond with the PKCS12 certificate
-that can be injected directly into your application.
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f akvs-certificate-inject.yaml
-azurekeyvaultsecret.spv.no/certificate-inject created
-```
-
-To list AzureKeyVaultSecret's and see sync status:
-
-```bash
-$ kubectl -n akv-test get akvs
-NAME VAULT VAULT OBJECT SECRET NAME SYNCHED
-certificate-inject akv2k8s-test my-certificate
-```
-
-Then we deploy a Pod having a env-variable pointing to the secret above.
-
-```yaml:title=certificate-deployment.yaml
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: akvs-certificate-app
- namespace: akv-test
- labels:
- app: akvs-certificate-app
-spec:
- selector:
- matchLabels:
- app: akvs-certificate-app
- template:
- metadata:
- labels:
- app: akvs-certificate-app
- spec:
- containers:
- - name: akv2k8s-env-test
- image: spvest/akv2k8s-env-test:2.0.1
- args: ["PUBLIC_KEY", "PRIVATE_KEY"]
- env:
- - name: PUBLIC_KEY
- value: certificate-inject@azurekeyvault?tls.crt
- - name: PRIVATE_KEY
- value: certificate-inject@azurekeyvault?tls.key
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f certificate-deployment.yaml
-deployment.apps/akvs-certificate-app created
-```
-
-Things to note from the Deployment yaml above:
-
-```yaml{3,4,6-9}
-containers:
-- name: akv2k8s-env-test
- image: spvest/akv2k8s-env-test # 1.
- args: ["PUBLIC_KEY", "PRIVATE_KEY"] # 2.
- env:
- - name: PUBLIC_KEY # 3.
- value: certificate-inject@azurekeyvault?tls.crt # 4.
- - name: PRIVATE_KEY # 5.
- value: certificate-inject@azurekeyvault?tls.key # 6.
-```
-
-1. We use a custom built Docker image for testing purposes that only outputs the content of the env-variables passed in as args in #2. Feel free to replace this with your own Docker image.
-2. Again, specific for the Docker test image we are using (in #1), we pass in which environment variables we want the container to print values for
-3. Name of the environment variable containing the certificate public key
-4. By using the special akv2k8s Env Injector convention `@azurekeyvault` to reference the AzureKeyVaultSecret `certificate-inject` we created earlier. The env-injector will download this secret from Azure Key Vault and inject into the executable running in your Container.
-5. Name of the environment variable containing the certificate private key
-6. Same as 4. - only for the certificate private key
-
-To see the log output from your Pod, execute the following command:
-
-```
-kubectl -n akv-test logs deployment/akvs-certificate-app
-```
-
-### Cleanup
-
-```bash
-kubectl delete -f akvs-secret-inject.yaml
-kubectl delete -f secret-deployment.yaml
-```
\ No newline at end of file
diff --git a/docs/source/content/tutorials/index.md b/docs/source/content/tutorials/index.md
deleted file mode 100644
index 71bd9dd9..00000000
--- a/docs/source/content/tutorials/index.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-title: "Tutorials"
-description: "A quick introduction to the tutorials"
----
-
-These tutorials are designed to walk you through step-by-step how to extract objects from Azure Key Vault - to sync into Kubernetes `Secret`'s or directly injecting into your application.
-
-Before getting started you need to make sure the tutorial [prerequisites](tutorials/prerequisites) are in place, and you are good to go!
\ No newline at end of file
diff --git a/docs/source/content/tutorials/prerequisites.md b/docs/source/content/tutorials/prerequisites.md
deleted file mode 100644
index 3542cd51..00000000
--- a/docs/source/content/tutorials/prerequisites.md
+++ /dev/null
@@ -1,81 +0,0 @@
----
-title: "Prerequisites"
-description: "A quick overview of the prerequisites needed to complete the tutorials"
----
-
-Below are a set of Azure Key Vault and Kubernetes resources that must be in place to walk through the tutorials.
-
-> Note: The resource names used below are optional (like AKV `akv2k8s-test`), but sticking with the suggested names will make it easier and more consistent as you walk through the tutorials
-
-## Azure Resources
-
-Azure Resource Group:
-
-```bash
-az group create -l westeurope -n akv2k8s-test
-```
-
-Azure Key Vault:
-
-```bash
-az keyvault create -n akv2k8s-test -g akv2k8s-test
-```
-
-### Add secret - required for secret-tutorials
-
-Add Secret to Azure Key Vault:
-
-```bash
-az keyvault secret set --vault-name akv2k8s-test --name my-secret --value "My super secret"
-```
-
-Authorize Access to Secrets:
-
-```bash
-az keyvault set-policy --n akv2k8s-test --spn --secret-permissions get
-```
-
-### Add certificate - required for certificate-tutorials
-
-```bash
-az keyvault certificate create --vault-name akv2k8s-test --name my-certificate -p "$(az keyvault certificate get-default-policy)"
-```
-
-Authorize Access to Certificates:
-
-```bash
-az keyvault set-policy --n akv2k8s-test --spn --certificate-permissions get
-```
-
-### Add signing key - required for signing-key-tutorials
-
-```bash
-az keyvault key create --vault-name akv2k8s-test --name my-key
-```
-
-Authorize Access to Keys:
-
-```bash
-az keyvault set-policy --n akv2k8s-test --spn --key-permissions get
-```
-
-## Kubernetes Resources
-
-Create namespace:
-
-```yaml:title=namespace.yaml
-apiVersion: v1
-kind: Namespace
-metadata:
- name: akv-test
- labels:
- azure-key-vault-env-injection: enabled
-```
-
-Apply configuration:
-
-```bash
-kubectl apply -f namespace.yaml
-```
-
-### That's it! You should now be ready to do all or any of the tutorials of akv2k8s!
\ No newline at end of file
diff --git a/docs/source/content/tutorials/sync/1-secret.md b/docs/source/content/tutorials/sync/1-secret.md
deleted file mode 100644
index a9ad5d88..00000000
--- a/docs/source/content/tutorials/sync/1-secret.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-title: "Sync Secret"
-description: "Sync a secret from Azure Key Vault into a Kubernetes Secret"
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
-
-We start by creating a definition for the Azure Key Vault secret
-we want to sync:
-
-```yaml:title=akvs-secret-sync.yaml
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: secret-sync
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # name of key vault
- object:
- name: my-secret # name of the akv object
- type: secret # akv object type
- output:
- secret:
- name: my-secret-from-akv # kubernetes secret name
- dataKey: secret-value # key to store object value in kubernetes secret
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f akvs-secret-sync.yaml
-azurekeyvaultsecret.spv.no/secret-sync created
-```
-
-List AzureKeyVaultSecret's:
-
-```bash
-$ kubectl -n akv-test get akvs
-NAME VAULT VAULT OBJECT SECRET NAME SYNCHED
-secret-sync akv2k8s-test my-secret my-secret-from-akv
-```
-
-Shortly a Kubernetes secret should exist:
-
-```bash
-$ kubectl -n akv-test get secret
-NAME TYPE DATA AGE
-my-secret-from-akv Opaque 1 1m
-```
-
-### Cleanup
-
-```bash
-kubectl delete -f akvs-secret-sync.yaml
-```
\ No newline at end of file
diff --git a/docs/source/content/tutorials/sync/2-certificate.md b/docs/source/content/tutorials/sync/2-certificate.md
deleted file mode 100644
index aa1e7435..00000000
--- a/docs/source/content/tutorials/sync/2-certificate.md
+++ /dev/null
@@ -1,75 +0,0 @@
----
-title: "Sync Certificate"
-description: "Sync a certificate from Azure Key Vault into a Kubernetes Secret."
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
-
-We start by creating a definition for the Azure Key Vault secret pointing to the certificate we want to sync:
-
-```yaml:title=akvs-certificate-sync.yaml
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: certificate-sync
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # name of key vault
- object:
- name: my-certificate
- type: certificate
- output:
- secret:
- name: my-certificate-from-akv # kubernetes secret name
- type: kubernetes.io/tls # kubernetes secret type
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f certificate-sync.yaml
-azurekeyvaultsecret.spv.no/certificate-sync created
-```
-
-To list AzureKeyVaultSecret's and see sync status:
-
-```bash
-$ kubectl -n akv-test get akvs
-NAME VAULT VAULT OBJECT SECRET NAME SYNCHED
-certificate-sync akv2k8s-test my-certificate my-secret-from-akv
-```
-
-Shortly a Kubernetes secret of type `kubernetes.io/tls` should exist:
-
-```bash
-$ kubectl -n akv-test get secret
-NAME TYPE DATA AGE
-my-certificate-from-akv kubernetes.io/tls 3 1m
-```
-
-Inspect the Kubernetes secret:
-
-```bash
-kubectl -n akv-test get secret my-certificate-from-akv -o yaml
-```
-
-The created Kubernetes Secret should look something like this:
-
-```yaml
-apiVersion: v1
-data:
- tls.crt: ...
- tls.key: ...
-kind: Secret
-metadata:
- name: keyvault-certificate
- namespace: default
-type: kubernetes.io/tls
-```
-
-### Cleanup
-
-```bash
-kubectl delete -f certificate-sync.yaml
-```
\ No newline at end of file
diff --git a/docs/source/content/tutorials/sync/3-signing-key.md b/docs/source/content/tutorials/sync/3-signing-key.md
deleted file mode 100644
index 3b150f4b..00000000
--- a/docs/source/content/tutorials/sync/3-signing-key.md
+++ /dev/null
@@ -1,55 +0,0 @@
----
-title: "Sync Signing Key"
-description: "Sync signing key from Azure Key Vault into a Kubernetes Secret"
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
-
-We start by creating a definition for the Azure Key Vault signing-key we want to sync:
-
-```yaml:title=akvs-signing-key-sync.yaml
-apiVersion: spv.no/v1alpha1
-kind: AzureKeyVaultSecret
-metadata:
- name: signing-key-sync
- namespace: akv-test
-spec:
- vault:
- name: akv2k8s-test # name of key vault
- object:
- name: my-key # name of the akv object
- type: key # akv object type
- output:
- secret:
- name: my-signing-key-from-akv # kubernetes secret name
- dataKey: signing-key # key to store object value in kubernetes secret
-```
-
-Apply to Kubernetes:
-
-```bash
-$ kubectl apply -f akvs-signing-key-sync.yaml
-azurekeyvaultsecret.spv.no/signing-key-sync created
-```
-
-List AzureKeyVaultSecret's:
-
-```bash
-$ kubectl -n akv-test get akvs
-NAME VAULT VAULT OBJECT SECRET NAME SYNCHED
-signing-key-sync akv2k8s-test my-key my-signing-key-from-akv
-```
-
-Shortly a Kubernetes secret should exist:
-
-```bash
-$ kubectl -n akv-test get secret
-NAME TYPE DATA AGE
-my-signing-key-from-akv Opaque 1 1m
-```
-
-### Cleanup
-
-```bash
-kubectl delete -f akvs-signing-key-sync.yaml
-```
\ No newline at end of file
diff --git a/docs/source/content/tutorials/sync/4-multi-key-value-secret.md b/docs/source/content/tutorials/sync/4-multi-key-value-secret.md
deleted file mode 100644
index d0842b43..00000000
--- a/docs/source/content/tutorials/sync/4-multi-key-value-secret.md
+++ /dev/null
@@ -1,29 +0,0 @@
----
-title: "Sync Multi Key Value Secret"
-description: "Sync a multi-key-value secret from Azure Key Vault into a Kubernetes Secret"
----
-
-> **Note: The [prerequisites](../prerequisites) are required to complete this tutorial.**
-
-Sometimes its necessary to have Kubernetes `Secret`'s with multiple keys and values. The problem
-is that Secrets in Azure Key Vault has no concept of keys or values. Because of this akv2k8s
-have introduced a new type called `multi-key-value-secret`
-(see [AzureKeyVaultSecret Object Types](/reference/azure-key-vault-secret/#vault-object-types)).
-
-In order to use `multi-key-value-secret`, just format a Azure Key Vault Secret using `yaml` or `json`:
-
-```yaml
-key1: value1
-key2: value2
-key3: value3
-```
-
-or
-
-```json
-{
- "key1": "value1",
- "key2": "value2",
- "key3": "value3"
-}
-```
diff --git a/docs/source/content/tutorials/sync/5-shared-secret.md b/docs/source/content/tutorials/sync/5-shared-secret.md
deleted file mode 100644
index e69de29b..00000000
diff --git a/docs/source/content/why-akv2k8s.mdx b/docs/source/content/why-akv2k8s.mdx
deleted file mode 100644
index 8d027dfd..00000000
--- a/docs/source/content/why-akv2k8s.mdx
+++ /dev/null
@@ -1,33 +0,0 @@
----
-title: Why use akv2k8s?
----
-
-import {
- ExpansionPanel,
- ExpansionPanelList,
- ExpansionPanelListItem
-} from 'gatsby-theme-apollo-docs';
-
-
-
-
-## Avoid tight coupling to Azure Key Vault
-
-By default the only way for your application to access secure objects in Azure Key Vault is to use the Azure Key Vault SDK (or API). That is not a good solution, since it tightly couples your application to Azure Key Vault. It also violates [The Twelve-Factor App](https://12factor.net/) principal for how we should [handle configuration](https://12factor.net/config) in our application, by not passing configuration from the outside-in using environment variables.
-
-
-
-
-## Sync Azure Key Vault secrets to Kubernetes
-
-3rd party containers in Kubernetes commonly depend on Kubernetes `Secret`'s to pass secrets through environment variables. If you are storing these secrets in Azure Key Vault, you have to find a solution to sync your Azure Key Vault secret to Kubernetes, or worse - manually create and keep Kubernetes `Secret`'s updated. Would it not be much easier to store everything securely in Azure Key Vault and just sync the secrets you need into Kubernetes? This is exactly what the **akv2k8s Controller** does.
-
-
-
-
-## Inject Azure Key Vault secrets directly into your application
-
-With the **akv2k8s Env Injector** you can securely and transparently inject Azure Key Vault secrets as environment variables into applications, without having to use native Kubernetes secrets. On top of that, these environment variables will not reveal the actual secret in Kubernetes. For more details about how the akv2k8s Env Injector works, see [How it works](how-it-works).
-
-
-
diff --git a/docs/src/akv2k8s_small.svg b/docs/src/akv2k8s_small.svg
deleted file mode 100644
index 87e7c0ba..00000000
--- a/docs/src/akv2k8s_small.svg
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/docs/src/assets/akv2k8s.png b/docs/src/assets/akv2k8s.png
deleted file mode 100644
index a48e3bb3..00000000
Binary files a/docs/src/assets/akv2k8s.png and /dev/null differ
diff --git a/docs/src/assets/social-bg.jpg b/docs/src/assets/social-bg.jpg
deleted file mode 100644
index 0dda633f..00000000
Binary files a/docs/src/assets/social-bg.jpg and /dev/null differ
diff --git a/docs/src/assets/social-bg.png b/docs/src/assets/social-bg.png
deleted file mode 100644
index 5ca91408..00000000
Binary files a/docs/src/assets/social-bg.png and /dev/null differ
diff --git a/docs/src/gatsby-theme-apollo-core/components/logo.js b/docs/src/gatsby-theme-apollo-core/components/logo.js
deleted file mode 100644
index 0852a309..00000000
--- a/docs/src/gatsby-theme-apollo-core/components/logo.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from 'react';
-import {ReactComponent as Akv2k8s} from '../../akv2k8s_small.svg';
-import {graphql, useStaticQuery} from 'gatsby';
-import styled from '@emotion/styled';
-
-const Wrapper = styled.div({
- display: 'flex',
- alignItems: 'center'
-});
-
-const Title = styled.span({
- fontSize: 24,
- marginLeft: 16
-});
-
-export default function Logo() {
- const data = useStaticQuery(
- graphql`
- {
- site {
- siteMetadata {
- title
- }
- }
- }
- `
- );
-
- return (
-
-
-
- {data.site.siteMetadata.title}
-
-
- );
-}
diff --git a/docs/src/gatsby-theme-apollo-docs/components/custom-seo.js b/docs/src/gatsby-theme-apollo-docs/components/custom-seo.js
deleted file mode 100644
index 05176e7d..00000000
--- a/docs/src/gatsby-theme-apollo-docs/components/custom-seo.js
+++ /dev/null
@@ -1,22 +0,0 @@
-import PropTypes from 'prop-types';
-import React from 'react';
-import {SEO} from 'gatsby-theme-apollo-core';
-import socialCard from '../../assets/akv2k8s.png'
-
-export default function CustomSEO({image, baseUrl, twitterHandle, ...props}) {
- return (
-
-
- {baseUrl && }
- {twitterHandle && (
-
- )}
-
- );
-}
-
-CustomSEO.propTypes = {
- baseUrl: PropTypes.string,
- image: PropTypes.string.isRequired,
- twitterHandle: PropTypes.string
-};
\ No newline at end of file
diff --git a/docs/src/gatsby-theme-apollo-docs/components/header-button.js b/docs/src/gatsby-theme-apollo-docs/components/header-button.js
deleted file mode 100644
index 90123474..00000000
--- a/docs/src/gatsby-theme-apollo-docs/components/header-button.js
+++ /dev/null
@@ -1,3 +0,0 @@
-export default function HeaderButton() {
- return null;
-}
diff --git a/docs/src/gatsby-theme-apollo-docs/components/mobile-logo.js b/docs/src/gatsby-theme-apollo-docs/components/mobile-logo.js
deleted file mode 100644
index ad11768e..00000000
--- a/docs/src/gatsby-theme-apollo-docs/components/mobile-logo.js
+++ /dev/null
@@ -1 +0,0 @@
-export {ReactComponent as MobileLogo} from '../../akv2k8s_small.svg';
\ No newline at end of file
diff --git a/docs/static/CNAME b/docs/static/CNAME
deleted file mode 100644
index 4b4bd309..00000000
--- a/docs/static/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-akv2k8s.io
\ No newline at end of file
diff --git a/docs/static/_redirects b/docs/static/_redirects
deleted file mode 100644
index df6b08a6..00000000
--- a/docs/static/_redirects
+++ /dev/null
@@ -1,38 +0,0 @@
-/ /docs/
-
-# Add Developer Tools category to root docset
-/docs/resources/apollo-config/ /docs/devtools/apollo-config/
-
-# Get rid of "References" category
-/docs/references/apollo-config/ /docs/devtools/apollo-config/
-/docs/references/apollo-config.html /docs/devtools/apollo-config/
-/docs/references/setup-analytics/ /docs/graph-manager/setup-analytics/
-
-# Split "Apollo Engine guide" into two articles
-/docs/references/apollo-engine/ /docs/graph-manager
-
-# Redirect Removed Guides to Platform Features
-/docs/guides/security.html /docs/platform/operation-registry
-/docs/guides/monitoring.html /docs/platform/integrations
-/docs/guides/versioning.html /docs/platform/schema-validation#versioning
-
-# This lived here for a short period of time.
-/docs/resources/apollo-config.html /docs/devtools/apollo-config
-
-# Redirect Removed Guides to Client & Server Docs
-/docs/guides/schema-design.html /docs/apollo-server/essentials/schema
-/docs/guides/testing-react-components.html /docs/react/recipes/testing
-/docs/guides/state-management.html /docs/react/essentials/local-state
-/docs/guides/access-control.html /docs/apollo-server/features/authentication
-
-# File uploads no longer have a home, but the blog post is the same content.
-/docs/guides/file-uploads.html https://blog.apollographql.com/file-uploads-with-apollo-server-2-0-5db2f3f60675
-
-# Move our Apollo config docs to the References section
-/docs/platform/apollo-config.html /docs/devtools/apollo-config
-/docs/platform/setup-analytics.html /docs/references/setup-analytics
-/docs/platform/schema-validation.html /docs/graph-manager/schema-validation
-
-# Move Graph Manager docs to their own website
-/docs/platform/* /docs/graph-manager/:splat
-/docs/references/graph-manager-data-privacy/ /docs/graph-manager/graph-manager-data-privacy/
diff --git a/drone.yaml b/drone.yaml
deleted file mode 100644
index 7bb1b16a..00000000
--- a/drone.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-kind: pipeline
-type: docker
-name: default
-
-steps:
-- name: build
- image: golang:1.13-alpine
- commands:
- - make test
- - make build
\ No newline at end of file
diff --git a/go.mod b/go.mod
index 04b3e2bb..352b5874 100644
--- a/go.mod
+++ b/go.mod
@@ -1,27 +1,32 @@
module github.com/SparebankenVest/azure-key-vault-to-kubernetes
-go 1.13
+go 1.15
require (
+ emperror.dev/errors v0.8.0
+ github.com/Azure/aad-pod-identity v1.6.3
github.com/Azure/azure-sdk-for-go v40.5.0+incompatible
- github.com/Azure/go-autorest/autorest v0.10.0
- github.com/Azure/go-autorest/autorest/adal v0.8.2
+ github.com/Azure/go-autorest/autorest v0.11.4
+ github.com/Azure/go-autorest/autorest/adal v0.9.0
github.com/Azure/go-autorest/autorest/azure/auth v0.4.2
- github.com/Azure/go-autorest/autorest/to v0.3.0 // indirect
- github.com/Azure/go-autorest/autorest/validation v0.2.0 // indirect
- github.com/containers/image/v5 v5.3.0
- github.com/ghodss/yaml v1.0.0
+ github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc
+ github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0
+ github.com/docker/go-connections v0.4.0 // indirect
github.com/gorilla/mux v1.7.4
- github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6
- github.com/prometheus/client_golang v1.1.0
- github.com/sirupsen/logrus v1.4.2
+ github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5
+ github.com/opencontainers/image-spec v1.0.1
+ github.com/pkg/errors v0.9.1
+ github.com/prometheus/client_golang v1.7.1
github.com/slok/kubewebhook v0.4.0
- github.com/spf13/viper v1.4.0
- golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6
- gopkg.in/yaml.v2 v2.2.8
- k8s.io/api v0.0.0-20191004102255-dacd7df5a50b
- k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a
- k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7
- k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe // indirect
- k8s.io/kubernetes v1.13.11
+ github.com/spf13/viper v1.7.1
+ github.com/stretchr/testify v1.6.1
+ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
+ gopkg.in/yaml.v2 v2.3.0
+ k8s.io/api v0.19.3
+ k8s.io/apimachinery v0.19.3
+ k8s.io/client-go v0.19.3
+ k8s.io/component-base v0.19.3
+ k8s.io/klog/v2 v2.3.1-0.20201028104956-52c62e3b70a9
+ kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053
+ sigs.k8s.io/yaml v1.2.0
)
diff --git a/go.sum b/go.sum
index 8e710c2c..c211574f 100644
--- a/go.sum
+++ b/go.sum
@@ -1,90 +1,149 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774 h1:SCbEWT58NSt7d2mcFdvxC9uyrdcTfvBbPLThhkDmXzg=
-github.com/14rcole/gopopulate v0.0.0-20180821133914-b175b219e774/go.mod h1:6/0dYRLLXyJjbkIPeeGyoJ/eKOSI0eU6eTlCBYibgd0=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA=
+contrib.go.opencensus.io/exporter/prometheus v0.1.0 h1:SByaIoWwNgMdPSgl5sMqM2KDE5H/ukPWBRo314xiDvg=
+contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+emperror.dev/errors v0.8.0 h1:4lycVEx0sdJkwDUfQ9pdu6SR0x7rgympt5f4+ok8jDk=
+emperror.dev/errors v0.8.0/go.mod h1:YcRvLPh626Ubn2xqtoprejnA5nFha+TJ+2vew48kWuE=
+github.com/Azure/aad-pod-identity v1.6.3 h1:S9ucEc0Fjlj3nLJhEItjxhHySgYzU5i+mer9fo+Fu4M=
+github.com/Azure/aad-pod-identity v1.6.3/go.mod h1:wFUg5YGthk9OLfwg0vImAf6i4vsw17xMgQ8j3MbyvrM=
+github.com/Azure/azure-sdk-for-go v40.4.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/azure-sdk-for-go v40.5.0+incompatible h1:CVQNKuUepSFBo6BW6gM1J9slPHLRcjn6vaw+j+causw=
github.com/Azure/azure-sdk-for-go v40.5.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
+github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8=
+github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
+github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
+github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
+github.com/Azure/go-autorest/autorest v0.1.0/go.mod h1:AKyIcETwSUFxIcs/Wnq/C+kwCtlEYGUVd7FPNb2slmg=
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest v0.9.3/go.mod h1:GsRuLYvwzLjjjRoWEIyMUaYq8GNUx2nRB378IPt/1p0=
+github.com/Azure/go-autorest/autorest v0.9.6/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
github.com/Azure/go-autorest/autorest v0.10.0 h1:mvdtztBqcL8se7MdrUweNieTNi4kfNG6GOJuurQJpuY=
github.com/Azure/go-autorest/autorest v0.10.0/go.mod h1:/FALq9T/kS7b5J5qsQ+RSTUdAmGFqi0vUdVNNx8q630=
+github.com/Azure/go-autorest/autorest v0.11.4 h1:iWJqGEvip7mjibEqC/srXNdo+4wLEPiwlP/7dZLtoPc=
+github.com/Azure/go-autorest/autorest v0.11.4/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
+github.com/Azure/go-autorest/autorest/adal v0.1.0/go.mod h1:MeS4XhScH55IST095THyTxElntu7WqB7pNbZo8Q5G3E=
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
github.com/Azure/go-autorest/autorest/adal v0.8.1/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
github.com/Azure/go-autorest/autorest/adal v0.8.2 h1:O1X4oexUxnZCaEUGsvMnr8ZGj8HI37tNezwY4npRqA0=
github.com/Azure/go-autorest/autorest/adal v0.8.2/go.mod h1:ZjhuQClTqx435SRJ2iMlOxPYt3d2C/T/7TiQCVZSn3Q=
+github.com/Azure/go-autorest/autorest/adal v0.9.0 h1:SigMbuFNuKgc1xcGhaeapbh+8fgsu+GxgDRFyg7f5lM=
+github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
+github.com/Azure/go-autorest/autorest/azure/auth v0.1.0/go.mod h1:Gf7/i2FUpyb/sGBLIFxTBzrNzBo7aPXXE3ZVeDRwdpM=
github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 h1:iM6UAvjR97ZIeR93qTcwpKNMpV+/FTWjwEbuPD495Tk=
github.com/Azure/go-autorest/autorest/azure/auth v0.4.2/go.mod h1:90gmfKdlmKgfjUpnCEpOJzsUEjrWDSLwHIG73tSXddM=
+github.com/Azure/go-autorest/autorest/azure/cli v0.1.0/go.mod h1:Dk8CUAt/b/PzkfeRsWzVG9Yj3ps8mS8ECztu43rdU8U=
github.com/Azure/go-autorest/autorest/azure/cli v0.3.1 h1:LXl088ZQlP0SBppGFsRZonW6hSvwgL5gRByMbvUbx8U=
github.com/Azure/go-autorest/autorest/azure/cli v0.3.1/go.mod h1:ZG5p860J94/0kI9mNJVoIoLgXcirM2gF5i2kWloofxw=
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
github.com/Azure/go-autorest/autorest/date v0.2.0 h1:yW+Zlqf26583pE43KhfnhFcdmSWlm5Ew6bxipnr/tbM=
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
+github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
+github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.3.0 h1:qJumjCaCudz+OcqE9/XtEPfvtOjOmKaui4EOpFI6zZc=
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
-github.com/Azure/go-autorest/autorest/to v0.3.0 h1:zebkZaadz7+wIQYgC7GXaz3Wb28yKYfVkkBKwc38VF8=
-github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
-github.com/Azure/go-autorest/autorest/validation v0.2.0 h1:15vMO4y76dehZSq7pAaOLQxC6dZYsSrj2GQpflyM/L4=
-github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI=
+github.com/Azure/go-autorest/autorest/mocks v0.4.0 h1:z20OWOSG5aCye0HEkDp6TPmP17ZcfeMxPi6HnSALa8c=
+github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
+github.com/Azure/go-autorest/autorest/to v0.2.0 h1:nQOZzFCudTh+TvquAtCRjM01VEYx85e9qbwt5ncW4L8=
+github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc=
+github.com/Azure/go-autorest/autorest/validation v0.1.0 h1:ISSNzGUh+ZSzizJWOWzs8bwpXIePbGLW4z/AmUFGH5A=
+github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8=
github.com/Azure/go-autorest/logger v0.1.0 h1:ruG4BSDXONFRrZZJ2GUXDiUyVpayPmb1GnWeHDdaNKY=
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
+github.com/Azure/go-autorest/logger v0.2.0 h1:e4RVHVZKC5p6UANLJHkM4OfR1UKZPj8Wt8Pcx+3oqrE=
+github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
+github.com/Azure/go-autorest/tracing v0.1.0/go.mod h1:ROEEAFwXycQw7Sn3DXNtEedEvdeRAgDr0izn4z5Ij88=
github.com/Azure/go-autorest/tracing v0.5.0 h1:TRn4WjSnkcSy5AEG3pnbtFSwNtwzjr4VYyQflFE619k=
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
+github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
+github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5 h1:ygIc8M6trr62pF5DucadTWGdEB4mEyvzi0e2nbcmcyA=
-github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
-github.com/Microsoft/hcsshim v0.8.7 h1:ptnOoufxGSzauVTsdE+wMYnCWA301PdoN4xg5oRdZpg=
-github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/OpenPeeDeeP/depguard v1.0.0 h1:k9QF73nrHT3nPLz3lu6G5s+3Hi8Je36ODr1F5gjAXXM=
+github.com/OpenPeeDeeP/depguard v1.0.0/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
github.com/PuerkitoBio/purell v1.0.0 h1:0GoNN3taZV6QI81IXgCbxMyEaJDXMSIjArYBCYzVVvs=
github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
+github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2 h1:JCHLVE3B+kJde7bIEo5N4J+ZbLhp0J1Fs+ulyRws4gE=
github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
-github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
-github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=
+github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
+github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
+github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc h1:Q5jwbRq/a1Tien+Is8Zn6HMBRgE13+UOQ9mTvrIuvuE=
+github.com/appscode/go v0.0.0-20191119085241-0887d8ec2ecc/go.mod h1:OawnOmAL4ZX3YaPdN+8HTNwBveT1jMsqP74moa9XUbE=
github.com/appscode/jsonpatch v0.0.0-20180911074601-5af499cf01c8 h1:UPvo0sEDBWGIb/nxKyC07j8r3ZH0Qtd0V3aDDM9VpjI=
github.com/appscode/jsonpatch v0.0.0-20180911074601-5af499cf01c8/go.mod h1:4AJxUpXUhv4N+ziTvIcWWXgeorXpxPZOfk9HdEVr96M=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
+github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
+github.com/beevik/ntp v0.2.0/go.mod h1:hIHWr+l3+/clUnF44zdK+CWW7fO8dR5cIylAQ76NRpg=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
-github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
+github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
+github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
+github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
-github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s=
-github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
-github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
-github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
-github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
-github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc h1:TP+534wVlf61smEIq1nwLLAjQVEK2EADoW3CX9AuT+8=
-github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
-github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
-github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
-github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
-github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
-github.com/containers/image/v5 v5.3.0 h1:m16khjCxqo5KnjkpWHnQLxi1Iza+U68sfX7mN3c+6bs=
-github.com/containers/image/v5 v5.3.0/go.mod h1:AUpxRzTM+7DObq2ja8UE1sxtfmMZ1KlW/qOJS0+sQw0=
-github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b h1:Q8ePgVfHDplZ7U33NwHZkrVELsZP5fYj9pM5WBZB2GE=
-github.com/containers/libtrust v0.0.0-20190913040956-14b96171aa3b/go.mod h1:9rfv8iPl1ZP7aqh9YA68wnZv2NUDbXdcdPHVz0pFbPY=
-github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741 h1:8tQkOcednLJtUcZgK7sPglscXtxvMOnFOa6wd09VWLM=
-github.com/containers/ocicrypt v0.0.0-20190930154801-b87a4a69c741/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
-github.com/containers/storage v1.16.5 h1:eHeWEhUEWX3VMIG1Vn1rEjfRoLHUQev3cwtA5zd89wk=
-github.com/containers/storage v1.16.5/go.mod h1:SdysZeLKJOvfHYysUWg9OZUC3gdZWi5b2b7NC18VpPE=
+github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM=
+github.com/codeskyblue/go-sh v0.0.0-20190412065543-76bd3d59ff27/go.mod h1:VQx0hjo2oUeQkQUET7wRwradO6f+fN5jzXgB/zROxxE=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/etcd v3.3.17+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+github.com/coreos/go-iptables v0.3.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
+github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
-github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
+github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -93,369 +152,909 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dimchansky/utfbom v1.1.0 h1:FcM3g+nofKgUteL8dm/UpdRXNC9KmADgTpLKsu0TRo4=
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
-github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65 h1:4zlOyrJUbYnrvlzChJ+jP2J3i77Jbhm336NEuCv7kZo=
-github.com/docker/distribution v0.0.0-20170817175659-5f6282db7d65/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
-github.com/docker/docker v0.0.0-20180522102801-da99009bbb11 h1:p8hSDXZgVhyh/C9bPlG8QMY64VeXtVfjmjIlzaQok5Q=
-github.com/docker/docker v0.0.0-20180522102801-da99009bbb11/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
-github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ=
-github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
-github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969 h1:p2WzwcFof6KwsloLgCiAKkU5DJSVgOKGdevswAmskvY=
-github.com/docker/go-connections v0.0.0-20180212134524-7beb39f0b969/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
-github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
-github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af h1:ujR+JcSHkOZMctuIgvi+a/VHpTn0nSy0W7eV5p34xjg=
+github.com/docker/distribution v0.0.0-20171011171712-7484e51bf6af/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
+github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0 h1:w3NnFcKR5241cfmQU5ZZAsf0xcpId6mWOupTvJlUX2U=
+github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
+github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
+github.com/docker/go-units v0.3.3 h1:Xk8S3Xj5sLGlG5g67hJmYMmUgXv5N4PhkjJHHqrwnTk=
+github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
+github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
+github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
+github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
+github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
+github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
+github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
+github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw=
+github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/evanphx/json-patch v4.0.0+incompatible h1:xregGRMLBeuRcwiOTHRCsPPuzCQlqhxUPbqdw+zNkLc=
github.com/evanphx/json-patch v4.0.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v4.2.0+incompatible h1:fUDGZCv/7iAN7u0puUVhvKCcsR6vRfwrJatElLBEf0I=
+github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v4.5.0+incompatible h1:ouOWdg56aJriqS0huScTkVXPC5IcNrDCXZ6OoTAWu7M=
+github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses=
+github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
+github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
+github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
-github.com/ghodss/yaml v0.0.0-20161207003320-04f313413ffd/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
+github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q=
+github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540 h1:djv/qAomOVj8voCHt0M0OYwR/4vfDq1zNKSPKjJCexs=
+github.com/go-critic/go-critic v0.3.5-0.20190526074819-1df300866540/go.mod h1:+sE8vrLDS2M0pZkBk0wy6+nLdKexVDrl/jBqQOTDThA=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0=
+github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas=
+github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY=
+github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
+github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI=
+github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
+github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik=
+github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk=
+github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
+github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0=
+github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94=
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1 h1:wSt/4CYxs70xbATrGXhokKF1i0tZjENLOo1ioIO13zk=
github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
+github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
+github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
+github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9 h1:tF+augKRWlWx0J0B7ZyyKSiTyV6E1zZe+7b3qQlcEf8=
github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
+github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
+github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
+github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
+github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
+github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
+github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU=
+github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs=
+github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA=
+github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64=
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501 h1:C1JKChikHGpXwT5UQDFaryIpDtyyGL/CR6C2kB7F1oc=
github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
+github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
+github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
+github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY=
+github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
+github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU=
+github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87 h1:zP3nY8Tk2E6RTkqGYrarZXuzh+ffyLDljLxCy1iJw80=
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
+github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
+github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
+github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
+github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4=
+github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
+github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g=
+github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
+github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8=
+github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
+github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ=
+github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg=
+github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k=
+github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
+github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
+github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk=
+github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg=
+github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
+github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
+github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
+github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4=
+github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
+github.com/go-toolsmith/typep v1.0.0 h1:zKymWyA1TRYvqYrYDrfEMZULyrhcnGY3x7LDKU2XQaA=
+github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
+github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
+github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I=
+github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef h1:veQD95Isof8w9/WXiA+pa3tz3fJXkt5B7QaRBrM62gk=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.0.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0=
+github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
+github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM=
+github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
+github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w=
+github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
+github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw=
+github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
+github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c h1:/7detzz5stiXWPzkTlPTzkBEIIE4WGpppBJYjKqBiPI=
+github.com/golangci/go-tools v0.0.0-20190318055746-e32c54105b7c/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM=
+github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8=
+github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
+github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8=
+github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
+github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98 h1:0OkFarm1Zy2CjCiDKfK9XHgmc2wbDlRMD2hD8anAJHU=
+github.com/golangci/gofmt v0.0.0-20181222123516-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
+github.com/golangci/golangci-lint v1.17.2-0.20190909185456-6163a8a79084 h1:Z4/yXcGr9zrQrcvHkC8f3agyK1dwt/t6zC/8gi6X64Q=
+github.com/golangci/golangci-lint v1.17.2-0.20190909185456-6163a8a79084/go.mod h1:jXakAOSd+FMU9dP3D6IfBK7HyD1q/RLHI9NOY8veycY=
+github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547 h1:fUdgm/BdKvwOHxg5AhNbkNRp2mSy8sxTXyBVs/laQHo=
+github.com/golangci/gosec v0.0.0-20190211064107-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU=
+github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI=
+github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
+github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217 h1:En/tZdwhAn0JNwLuXzP3k2RVtMqMmOEK7Yu/g3tmtJE=
+github.com/golangci/lint-1 v0.0.0-20190420132249-ee948d087217/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
+github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
+github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
+github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk=
+github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
+github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us=
+github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
+github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg=
+github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
+github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys=
+github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
+github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI=
github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g=
+github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
+github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d h1:7XGaL1e6bYS1yIonGp9761ExpPPV1ui0SAC59Yube9k=
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
+github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0=
github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
+github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyycI+I=
+github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
+github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8=
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285 h1:pBGAMRKP7Tpv4mOq+RgzKz+jAj+ylo9O8PiNoMmCuu8=
-github.com/gorilla/mux v0.0.0-20170217192616-94e7d24fd285/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
-github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI=
-github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3 h1:JVnpOZS+qxli+rgVl98ILOXVNbW+kb5wcxeGx8ShUIw=
+github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
+github.com/gregjones/httpcache v0.0.0-20170728041850-787624de3eb7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
+github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
+github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw=
+github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
-github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
-github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
+github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5 h1:6ZR6HQ+P9ZUwHlYq+bU7e9wqAImxKUguq8fp2gZSgCo=
+github.com/heroku/docker-registry-client v0.0.0-20190909225348-afc9e1acc3d5/go.mod h1:Yho0S7KhsnHQRCC5lDraYF1SsLMeWtf/tKdufKu3TJA=
+github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs=
+github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/imdario/mergo v0.3.7 h1:Y+UAYTZ7gDEuOfhxKWy+dvb5dRQ6rJjFSdX2HZY1/gI=
github.com/imdario/mergo v0.3.7/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
-github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=
-github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
+github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jpillora/go-ogle-analytics v0.0.0-20161213085824-14b04e0594ef/go.mod h1:PlwhC7q1VSK73InDzdDatVetQrTsQHIbOvcJAZzitY0=
+github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo=
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok=
+github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
+github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM=
+github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/klauspost/compress v1.10.3 h1:OP96hzwJVBIHYU52pVTI6CczrxPvrGfgqF9N5eTO0Q8=
-github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/pgzip v1.2.2 h1:8d4I0LDiieuGngsqlqOih9ker/NS0LX4V0i+EhiFWg0=
-github.com/klauspost/pgzip v1.2.2/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs=
+github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
-github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY=
+github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
+github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
+github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a h1:TpvdAwDAt1K4ANVOfcihouRdvP+MgAfDWwBuct4l6ZY=
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
-github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw=
-github.com/mattn/go-shellwords v1.0.10/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
+github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU=
+github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mistifyio/go-zfs v2.1.1+incompatible h1:gAMO1HM9xBRONLHHYnu5iFsOJUiJdNZo6oqSENd4eW8=
-github.com/mistifyio/go-zfs v2.1.1+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
+github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
-github.com/mtrmac/gpgme v0.1.2/go.mod h1:GYYHnGSuS7HK3zVS2n3y73y0okK/BeKzwnn5jgiVFNI=
+github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ=
+github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw=
+github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
+github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663 h1:Ri1EhipkbhWsffPJ3IPlrb4SkTOPa2PfRXp3jchBczw=
+github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c h1:Hww8mOyEKTeON4bZn7FrlLismspbPc1teNRUVH7wLQ8=
github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
+github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw=
+github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c h1:eSfnfIuwhxZyULg1NNuZycJcYkjYVGYe7FczwQReM6U=
github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
-github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
+github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
+github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ=
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
-github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 h1:yN8BPXVwMBAm3Cuvh1L5XE8XpvYRMdsVLd82ILprhUU=
-github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
-github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
-github.com/opencontainers/runc v1.0.0-rc9 h1:/k06BMULKF5hidyoZymkoDCzdJzltZpz/UU4LguQVtc=
-github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
-github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
-github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
-github.com/opencontainers/selinux v1.4.0 h1:cpiX/2wWIju/6My60T6/z9CxNG7c8xTQyEmA9fChpUo=
-github.com/opencontainers/selinux v1.4.0/go.mod h1:yTcKuYAh6R95iDpefGLQaPaRwJFwyzAJufJyiTt7s0g=
github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU=
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
-github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913 h1:TnbXhKzrTOyuvWrjI8W6pcoI9XPbLHFXCdN2dtUw7Rw=
-github.com/ostreedev/ostree-go v0.0.0-20190702140239-759a8c1ac913/go.mod h1:J6OG6YJVEWopen4avK3VNQSnALmmjvniMmni/YFYAwc=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
-github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9 h1:kyf9snWXHvQc+yxE9imhdI8YAm4oKeZISlaAR+x73zs=
-github.com/pquerna/ffjson v0.0.0-20190813045741-dac163c6c0a9/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
-github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8=
-github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
+github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=
-github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
+github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE=
-github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
-github.com/prometheus/procfs v0.0.5 h1:3+auTFlqw+ZaQYJARz6ArODtkaIwtvBTx3N2NehQlL8=
-github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
+github.com/prometheus/procfs v0.1.3 h1:F0+tqvhOksq22sc6iCHF5WGlWjdwj92p0udFh1VFBS8=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
-github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
+github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
+github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
+github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
+github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
+github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
github.com/slok/kubewebhook v0.4.0 h1:USgcA77rvKMOf688LtY1RDTKwKbnLgXS4jRKzcjLF9Q=
github.com/slok/kubewebhook v0.4.0/go.mod h1:LXfv4ixuCK4UVPvFFag1Sf/ZeidXugVB2fJpc5udPo8=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sourcegraph/go-diff v0.5.1 h1:gO6i5zugwzo1RVTvgvfwCOSVegNuvnNi6bAD1QCmkHs=
+github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE=
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
+github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
+github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s=
+github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
+github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
-github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU=
-github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
+github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
+github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
+github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
-github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
-github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
-github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 h1:b6uOv7YOFK0TYG7HtkIgExQo+2RdLuwRft63jn2HWj8=
-github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
-github.com/tchap/go-patricia v2.3.0+incompatible h1:GkY4dP3cEfEASBPPkWd+AmjYxhmDkqO9/zg7R0lSQRs=
-github.com/tchap/go-patricia v2.3.0+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec h1:AmoEvWAO3nDx1MEcMzPh+GzOOIA5Znpv6++c7bePPY0=
+github.com/timakin/bodyclose v0.0.0-20190721030226-87058b9bfcec/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g=
github.com/uber/jaeger-client-go v2.16.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
github.com/uber/jaeger-lib v2.0.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
-github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
-github.com/ulikunitz/xz v0.5.7 h1:YvTNdFzX6+W5m9msiYg/zpkSURPPtOlzbqYjrFn7Yt4=
-github.com/ulikunitz/xz v0.5.7/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
-github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
-github.com/vbatts/tar-split v0.11.1 h1:0Odu65rhcZ3JZaPHxl7tCI3V/C/Q9Zf82UFravl02dE=
-github.com/vbatts/tar-split v0.11.1/go.mod h1:LEuURwDEiWjRjwu46yU3KVGuUdVv/dcnpcEPSzR8z6g=
-github.com/vbauerster/mpb/v4 v4.12.2/go.mod h1:LVRGvMch8T4HQO3eg2pFPsACH9kO/O6fT/7vhGje3QE=
-github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
-github.com/xeipuuv/gojsonpointer v0.0.0-20190809123943-df4f5c81cb3b/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
-github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
-github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
-github.com/xeipuuv/gojsonschema v0.0.0-20190816131739-be0936907f66/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
+github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/ultraware/funlen v0.0.1 h1:UeC9tpM4wNWzUJfan8z9sFE4QCzjjzlCZmuJN+aOkH0=
+github.com/ultraware/funlen v0.0.1/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
+github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
+github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
+github.com/valyala/quicktemplate v1.1.1/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4=
+github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA=
+github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
+github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M=
+github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
+github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI=
+github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4=
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.uber.org/atomic v0.0.0-20181018215023-8dc6146f7569/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v0.0.0-20180814183419-67bc79d13d15/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM=
go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190422183909-d864b10871cd/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6 h1:Sy5bstxEqwwbYs6n0/pBuxKENqOeZUgD45Gp3Q3pqLg=
-golang.org/x/crypto v0.0.0-20200214034016-1d94cc7ab1c6/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU=
-golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190812203447-cdfb69ac37fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI=
+golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190321052220-f7bb7a8bee54/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0=
-golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20200217220822-9197077df867 h1:JoRuNIf+rpHl+VhScRQQvzbHed86tKkqwPMV34T8myw=
-golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9 h1:L2auWcuQIvxz9xSEqzESnV/QN/gNRXNApHi3fYwl2w0=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4 h1:5/PjkGUjvEU5Gl6BxmvKRPpqo2uNMv4rcHBMwzk/st8=
+golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc h1:NCy3Ohtk6Iny5V/reW2Ktypo4zIpWBdRJ1uFMjBxdg8=
+golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gomodules.xyz/jsonpatch/v2 v2.0.1 h1:xyiBuvkD2g5n7cYzx6u2sxQvsAy4QJsZFCzGVdzOXZ0=
+gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
+gomodules.xyz/version v0.1.0/go.mod h1:Y8xuV02mL/45psyPKG3NCVOwvAOy6T5Kx0l3rCjKSjU=
+gonum.org/v1/gonum v0.0.0-20190331200053-3d26580ed485/go.mod h1:2ltnJ7xHfj0zHS40VVPYEAAMTa3ZGguvHGBSJeRWqE0=
+gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
+gonum.org/v1/netlib v0.0.0-20190331212654-76723241ea4e/go.mod h1:kS+toOQn6AQKjmKJ7gzohV1XkqsFehRA2FbsbkopSuQ=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0 h1:KxkO13IPW4Lslp2bz+KHP2E3gtFlrIGNThxkZQ3g+4c=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873 h1:nfPFGzJkUDX6uBmpN/pSw7MbOAWegH5QDQuoXFHedLg=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a h1:Ob5/580gVHBJZgXnff1cZDbG+xLtMVE5mDRTe+nIsX4=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.19.1/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
-google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=
-google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0 h1:AzbTB6ux+okLTzP8Ru1Xs41C303zdcfEht7MQnYJt5A=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0 h1:UhZDfRO8JRQru4/+LlLE0BRKGF8L+PICnvYZmx/fEGA=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
+gopkg.in/inf.v0 v0.9.0/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
+gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
-gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
+gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
+gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
k8s.io/api v0.0.0-20191004102255-dacd7df5a50b h1:38Nx0U83WjBqn1hUWxlgKc7mvH7WhyHfypxeW3zWwCQ=
k8s.io/api v0.0.0-20191004102255-dacd7df5a50b/go.mod h1:iuAfoD4hCxJ8Onx9kaTIt30j7jUFS00AXQi6QMi99vA=
+k8s.io/api v0.0.0-20191114100352-16d7abae0d2a/go.mod h1:qetVJgs5i8jwdFIdoOZ70ks0ecgU+dYwqZ2uD1srwOU=
+k8s.io/api v0.17.2 h1:NF1UFXcKN7/OOv1uxdRz3qfra8AHsPav5M93hlV9+Dc=
+k8s.io/api v0.17.2/go.mod h1:BS9fjjLc4CMuqfSO8vgbHPKMt5+SF0ET6u/RVDihTo4=
+k8s.io/api v0.19.3 h1:GN6ntFnv44Vptj/b+OnMW7FmzkpDoIDLZRvKX3XH9aU=
+k8s.io/api v0.19.3/go.mod h1:VF+5FT1B74Pw3KxMdKyinLo+zynBaMBiAfGMuldcNDs=
+k8s.io/apiextensions-apiserver v0.0.0-20191114105449-027877536833/go.mod h1:Gb1G2W/kXMizbVTnA9oh2ybQ4cM3COr3r5JDj+DzKGw=
k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a h1:lDydUqHrbL/1l5ZQrqD1RIlabhmX8aiZEtxVUb+30iU=
k8s.io/apimachinery v0.0.0-20191004074956-01f8b7d1121a/go.mod h1:ccL7Eh7zubPUSh9A3USN90/OzHNSVN6zxzde07TDCL0=
-k8s.io/client-go v0.0.0-20170217214107-bcde30fb7eae/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
+k8s.io/apimachinery v0.0.0-20191028221656-72ed19daf4bb/go.mod h1:llRdnznGEAqC3DcNm6yEj472xaFVfLM7hnYofMb12tQ=
+k8s.io/apimachinery v0.17.2 h1:hwDQQFbdRlpnnsR64Asdi55GyCaIP/3WQpMmbNBeWr4=
+k8s.io/apimachinery v0.17.2/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg=
+k8s.io/apimachinery v0.19.3 h1:bpIQXlKjB4cB/oNpnNnV+BybGPR7iP5oYpsOTEJ4hgc=
+k8s.io/apimachinery v0.19.3/go.mod h1:DnPGDnARWFvYa3pMHgSxtbZb7gpzzAZ1pTfaUNDVlmA=
+k8s.io/apiserver v0.0.0-20191114103151-9ca1dc586682/go.mod h1:Idob8Va6/sMX5SmwPLsU0pdvFlkwxuJ5x+fXMG8NbKE=
+k8s.io/cli-runtime v0.0.0-20191114110141-0a35778df828/go.mod h1:r9ARs2FUnSgInbeN4+mo9nFzf7oqUtRZ3tcuEcoelR4=
k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7 h1:WyPHgjjXvF4zVVwKGZKKiJGBUW45AuN44uSOuH8euuE=
k8s.io/client-go v0.0.0-20191004102537-eb5b9a8cfde7/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
+k8s.io/client-go v0.0.0-20191114101535-6c5935290e33/go.mod h1:4L/zQOBkEf4pArQJ+CMk1/5xjA30B5oyWv+Bzb44DOw=
+k8s.io/client-go v0.17.2 h1:ndIfkfXEGrNhLIgkr0+qhRguSD3u6DCmonepn1O6NYc=
+k8s.io/client-go v0.17.2/go.mod h1:QAzRgsa0C2xl4/eVpeVAZMvikCn8Nm81yqVx3Kk9XYI=
+k8s.io/client-go v0.19.3 h1:ctqR1nQ52NUs6LpI0w+a5U+xjYwflFwA13OJKcicMxg=
+k8s.io/client-go v0.19.3/go.mod h1:+eEMktZM+MG0KO+PTkci8xnbCZHvj9TqR6Q1XDUIJOM=
+k8s.io/code-generator v0.0.0-20191004115455-8e001e5d1894/go.mod h1:mJUgkl06XV4kstAnLHAIzJPVCOzVR+ZcfPIv4fUsFCY=
+k8s.io/component-base v0.0.0-20191114102325-35a9586014f7/go.mod h1:9rNMvrwbqPF4MxI+VQYETrWqMKxi8yAd8YZLdSJ9EDw=
+k8s.io/component-base v0.19.3 h1:c+DzDNAQFlaoyX+yv8YuWi8xmlQvvY5DnJGbaz5U74o=
+k8s.io/component-base v0.19.3/go.mod h1:WhLWSIefQn8W8jxSLl5WNiR6z8oyMe/8Zywg7alOkRc=
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk=
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20190822140433-26a664648505/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
+k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
+k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
+k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
-k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe h1:GOfbcWvX5wW2vcfNch83xYp9SDZjRgAJk+t373yaHKk=
-k8s.io/kube-openapi v0.0.0-20200204173128-addea2498afe/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
-k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
-k8s.io/kubernetes v1.13.11 h1:PuVgT0kD6Aah8XnJpcG4ngzJ/pjbJNam15MflwUn5Lc=
-k8s.io/kubernetes v1.13.11/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
-sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
+k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE=
+k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
+k8s.io/klog/v2 v2.3.1-0.20201028104956-52c62e3b70a9 h1:fpr8Tm3rXj1Lz4V27et4ziNtFQJ5qs25+UbRQdHI9Rk=
+k8s.io/klog/v2 v2.3.1-0.20201028104956-52c62e3b70a9/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y=
+k8s.io/kube-aggregator v0.0.0-20191114103820-f023614fb9ea/go.mod h1:LlqyQuTxPHvUzmEgT71Cl/BB86o5+UcbN1LiGgSz94U=
+k8s.io/kube-openapi v0.0.0-20190816220812-743ec37842bf/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
+k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a h1:UcxjrRMyNx/i/y8G7kPvLyy7rfbeuf1PYyBf973pgyU=
+k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E=
+k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6 h1:+WnxoVtG8TMiudHBSEtrVL1egv36TkkJm+bA8AxicmQ=
+k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
+k8s.io/utils v0.0.0-20190801114015-581e00157fb1/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
+k8s.io/utils v0.0.0-20191114184206-e782cd3c129f h1:GiPwtSzdP43eI1hpPCbROQCCIgCuiMMNF8YUVLF3vJo=
+k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
+k8s.io/utils v0.0.0-20200729134348-d5654de09c73 h1:uJmqzgNWG7XyClnU/mLPBWwfKKF1K8Hf8whTseBgJcg=
+k8s.io/utils v0.0.0-20200729134348-d5654de09c73/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
+kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053 h1:Zx4CChonrlcoH6cq3m+pA9OW6j7jyciqLp9dHZnMcXM=
+kmodules.xyz/client-go v0.0.0-20200521013203-6fe0a448d053/go.mod h1:z/AkrES60XR+jeKGg5zJyPd13NdG/Di0BptbG1gnS60=
+modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw=
+modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=
+modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k=
+modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs=
+modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I=
+mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
+mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
+mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo=
+mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
+mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34 h1:duVSyluuJA+u0BnkcLR01smoLrGgDTfWt5c8ODYG8fU=
+mvdan.cc/unparam v0.0.0-20190209190245-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
+sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e h1:4Z09Hglb792X0kfOBBJUPFEyvVfQWrYT/l8h5EKA6JQ=
+sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI=
+sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca h1:6dsH6AYQWbyZmtttJNe8Gq1cXOeS1BdV3eW37zHilAQ=
+sigs.k8s.io/structured-merge-diff v0.0.0-20190817042607-6149e4549fca/go.mod h1:IIgPezJWb76P0hotTxzDbWsMYB8APh18qZnxkomBpxA=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.1 h1:YXTMot5Qz/X1iBRJhAt+vI+HVttY0WkSqqhKxQ0xVbA=
+sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
+sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c=
+sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh
index 4cceca37..eae76f4c 100755
--- a/hack/update-codegen.sh
+++ b/hack/update-codegen.sh
@@ -27,7 +27,7 @@ CODEGEN_PKG=${CODEGEN_PKG:-$(cd ${SCRIPT_ROOT}; ls -d -1 ${GOPATH}/src/k8s.io/co
# instead of the $GOPATH directly. For normal projects this can be dropped.
${CODEGEN_PKG}/generate-groups.sh "deepcopy,client,informer,lister" \
github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis \
- azurekeyvault:v1alpha1,v1 \
+ "azurekeyvault:v1alpha1,v1,v2beta1" \
--go-header-file ${SCRIPT_ROOT}/hack/custom-boilerplate.go.txt
# Generate both v1alpha1 and v1
diff --git a/images/ca-bundle-controller/Dockerfile b/images/ca-bundle-controller/Dockerfile
new file mode 100644
index 00000000..d1279aa0
--- /dev/null
+++ b/images/ca-bundle-controller/Dockerfile
@@ -0,0 +1,26 @@
+FROM spvest/golang-build-stage:1.13.0 as build
+
+FROM alpine:3.8
+
+ARG VCS_REF
+ARG BUILD_DATE
+ARG VCS_URL
+
+LABEL org.label-schema.schema-version="1.0"
+LABEL org.label-schema.build-date=$BUILD_DATE
+LABEL org.label-schema.vcs-ref=$VCS_REF
+LABEL org.label-schema.vcs-url=$VCS_URL
+LABEL org.label-schema.url=$VCS_URL
+LABEL org.label-schema.description="A Kubernetes controller to sync public CA cert from a secret into labelled namespaces as a ConfigMap."
+LABEL org.label-schema.vendor="Sparebanken Vest"
+LABEL org.label-schema.author="Jon Arild Tørresdal"
+
+# install without cache
+RUN apk update && apk add --no-cache \
+ ca-certificates \
+ iptables \
+ && update-ca-certificates
+
+COPY --from=build /go/bin/ca-bundle-controller /usr/local/bin/ca-bundle-controller
+
+ENTRYPOINT ["ca-bundle-controller"]
diff --git a/installation/controller/deployment.yaml b/installation/controller/deployment.yaml
deleted file mode 100644
index f903884c..00000000
--- a/installation/controller/deployment.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-apiVersion: apps/v1
-kind: Deployment
-metadata:
- name: azure-keyvault-controller
- namespace: spv-system
- labels:
- app: azure-keyvault-controller
- aadpodidbinding: azure_key_vault # Binding from AzureIdentityBinding
-spec:
- selector:
- matchLabels:
- app: azure-keyvault-controller
- template:
- metadata:
- labels:
- app: azure-keyvault-controller
- aadpodidbinding: azure_key_vault # Binding from AzureIdentityBinding
- spec:
- serviceAccountName: azure-keyvault-controller
- containers:
- - name: azure-keyvault-controller
- image: spvest/azure-keyvault-controller:0.1.0-alpha.1
- imagePullPolicy: Always
- env:
- - name: AZURE_VAULT_NORMAL_POLL_INTERVALS
- value: 10m
- - name: AZURE_VAULT_EXCEPTION_POLL_INTERVALS
- value: 30m
- - name: AZURE_VAULT_MAX_FAILURE_ATTEMPTS
- value: "5"
- # - name: LOG_LEVEL
- # value: debug
diff --git a/installation/controller/rbac.yaml b/installation/controller/rbac.yaml
deleted file mode 100644
index c7f840a5..00000000
--- a/installation/controller/rbac.yaml
+++ /dev/null
@@ -1,85 +0,0 @@
-apiVersion: v1
-kind: ServiceAccount
-metadata:
- name: azure-key-vault-controller
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRole
-metadata:
- name: azure-key-vault-controller
-rules:
-- apiGroups:
- - spv.no
- resources:
- - azurekeyvaultsecrets
- verbs:
- - get
- - list
- - watch
- - update
-- apiGroups:
- - spv.no
- resources:
- - azurekeyvaultsecrets/status
- verbs:
- - patch
- - update
-- apiGroups:
- - ""
- resources:
- - secrets
- verbs:
- - create
- - update
- - delete
- - get
- - watch
- - list
-- apiGroups:
- - ""
- resources:
- - events
- verbs:
- - create
- - update
- - patch
----
-apiVersion: rbac.authorization.k8s.io/v1beta1
-kind: ClusterRole
-metadata:
- name: azure-key-vault-reader
-rules:
-- apiGroups:
- - spv.no
- resources:
- - azurekeyvaultsecrets
- verbs:
- - get
- - list
- - watch
----
-kind: ClusterRoleBinding
-apiVersion: rbac.authorization.k8s.io/v1beta1
-metadata:
- name: azure-keyvault-controller
-subjects:
-- kind: ServiceAccount
- name: azure-keyvault-controller
- namespace: spv-system
-roleRef:
- kind: ClusterRole
- name: azure-keyvault-controller
- apiGroup: rbac.authorization.k8s.io
----
-kind: ClusterRoleBinding
-apiVersion: rbac.authorization.k8s.io/v1beta1
-metadata:
- name: azure-key-vault-reader
-subjects:
-- kind: Group
- name: system:serviceaccounts
- apiGroup: rbac.authorization.k8s.io
-roleRef:
- kind: ClusterRole
- name: azure-key-vault-reader
- apiGroup: rbac.authorization.k8s.io
diff --git a/installation/crd.yaml b/installation/crd.yaml
deleted file mode 100644
index e10d5577..00000000
--- a/installation/crd.yaml
+++ /dev/null
@@ -1,79 +0,0 @@
-apiVersion: apiextensions.k8s.io/v1beta1
-kind: CustomResourceDefinition
-metadata:
- name: azurekeyvaultsecrets.spv.no
-spec:
- group: spv.no
- names:
- kind: AzureKeyVaultSecret
- listKind: AzureKeyVaultSecretList
- plural: azurekeyvaultsecrets
- singular: azurekeyvaultsecret
- shortNames:
- - akvs
- categories:
- - all
- additionalPrinterColumns:
- - name: Secret Name
- type: string
- description: Which Kubernetes Secret this resource is synched with
- JSONPath: .status.secretName
- - name: Vault
- type: string
- description: Which Azure Key Vault this resource is synched with
- JSONPath: .spec.vault.name
- - name: Vault Object
- type: string
- description: Which Azure Key Vault object this resource is synched with
- JSONPath: .spec.vault.object.name
- - name: Synched
- type: string
- description: When this resource was last synched with Azure Key Vault
- JSONPath: .status.lastAzureUpdate
- scope: Namespaced
- version: v1alpha1
- subresources:
- status: {}
- validation:
- openAPIV3Schema:
- properties:
- spec:
- required: ['vault']
- properties:
- vault:
- required: ['name', 'object']
- properties:
- name:
- type: string
- description: Name of the Azure Key Vault
- object:
- required: ['name', 'type']
- properties:
- name:
- type: string
- description: The object name in Azure Key Vault
- type:
- type: string
- description: The type of object in Azure Key Vault
- enum:
- - secret
- - multi-key-value-secret # not implemented
- - certificate
- - exportable-certificate
- - key # not implemented
- version:
- type: string
- description: The object version in Azure Key Vault
- output:
- properties:
- secret:
- properties:
- name:
- type: string
- description: Name for Kubernetes secret - default is name of this resource (metadata.name)
- type:
- type: string
- description: Type of Secret in Kubernetes
- dataKey:
- type: string
- description: The key to use in Kubernetes secret when setting the value from Azure Keyv Vault object data
diff --git a/int-tests/cluster-role-env-injector-auth.yaml b/int-tests/cluster-role-env-injector-auth.yaml
new file mode 100644
index 00000000..0ad4fd27
--- /dev/null
+++ b/int-tests/cluster-role-env-injector-auth.yaml
@@ -0,0 +1,26 @@
+# apiVersion: rbac.authorization.k8s.io/v1
+# kind: ClusterRole
+# metadata:
+# name: akv2k8s-auth
+# rules:
+# - apiGroups: [""]
+# #
+# # at the HTTP level, the name of the resource for accessing Secret
+# # objects is "secrets"
+# resources: ["secrets"]
+# verbs: ["get", "watch", "list"]
+# ---
+
+apiVersion: rbac.authorization.k8s.io/v1
+# This cluster role binding allows anyone in the "manager" group to read secrets in any namespace.
+kind: ClusterRoleBinding
+metadata:
+ name: akv2k8s-auth-global
+subjects:
+- kind: ServiceAccount
+ name: default
+ namespace: akv2k8s-test
+roleRef:
+ kind: ClusterRole
+ name: system:discovery
+ apiGroup: rbac.authorization.k8s.io
\ No newline at end of file
diff --git a/int-tests/ns.yaml b/int-tests/ns.yaml
new file mode 100644
index 00000000..54c20713
--- /dev/null
+++ b/int-tests/ns.yaml
@@ -0,0 +1,6 @@
+apiVersion: v1
+kind: Namespace
+metadata:
+ name: akv2k8s-test
+ labels:
+ azure-key-vault-env-injection: enabled
diff --git a/int-tests/test-secret/akvs.yaml b/int-tests/test-secret/akvs.yaml
new file mode 100644
index 00000000..23217322
--- /dev/null
+++ b/int-tests/test-secret/akvs.yaml
@@ -0,0 +1,11 @@
+apiVersion: spv.no/v1
+kind: AzureKeyVaultSecret
+metadata:
+ name: test-secret
+ namespace: akv2k8s-test
+spec:
+ vault:
+ name: akv2k8s-test
+ object:
+ type: secret
+ name: my-secret
diff --git a/int-tests/test-secret/deployment.yaml b/int-tests/test-secret/deployment.yaml
new file mode 100644
index 00000000..bb1f65ee
--- /dev/null
+++ b/int-tests/test-secret/deployment.yaml
@@ -0,0 +1,35 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: secret-inject
+ namespace: akv2k8s-test
+ labels:
+ app: secret-inject
+spec:
+ selector:
+ matchLabels:
+ app: secret-inject
+ template:
+ metadata:
+ labels:
+ app: secret-inject
+ spec:
+ containers:
+ - name: my-image
+ image: spvest/akv2k8s-env-test:2.0.1
+ command: ['/bin/sh', '-c']
+ args: ['printenv TEST_SECRET TEST_SECRET2 && sleep 60 && echo "Fail container to check recovery" && exit 1']
+ env:
+ - name: ENV_INJECTOR_LOG_LEVEL
+ value: Debug
+ - name: TEST_SECRET
+ value: test-secret@azurekeyvault
+ - name: TEST_SECRET2
+ value: Just plain env var
+ # livenessProbe:
+ # exec:
+ # command:
+ # - cat
+ # - /tmp/secret.txt
+ # initialDelaySeconds: 5
+ # periodSeconds: 5
diff --git a/kind.yaml b/kind.yaml
new file mode 100644
index 00000000..9f211615
--- /dev/null
+++ b/kind.yaml
@@ -0,0 +1,5 @@
+kind: Cluster
+apiVersion: kind.x-k8s.io/v1alpha4
+nodes:
+- role: control-plane
+ image: kindest/node:v1.17.5@sha256:ab3f9e6ec5ad8840eeb1f76c89bb7948c77bbf76bcebe1a8b59790b8ae9a283a
\ No newline at end of file
diff --git a/pkg/akv2k8s/testing/main.go b/pkg/akv2k8s/testing/main.go
new file mode 100644
index 00000000..d032ffb5
--- /dev/null
+++ b/pkg/akv2k8s/testing/main.go
@@ -0,0 +1,18 @@
+package testing
+
+import (
+ "os"
+ "testing"
+)
+
+// EnsureIntegrationEnvironment will check env vars needed by integration tests
+func EnsureIntegrationEnvironment(t *testing.T) {
+ if os.Getenv("AKV2K8S_CLIENT_ID") == "" {
+ t.Skip("Skipping integration test - no credentials")
+ }
+
+ os.Setenv("AZURE_CLIENT_ID", os.Getenv("AKV2K8S_CLIENT_ID"))
+ os.Setenv("AZURE_CLIENT_SECRET", os.Getenv("AKV2K8S_CLIENT_SECRET"))
+ os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID"))
+ os.Setenv("AZURE_SUBSCRIPTION_ID", os.Getenv("AKV2K8S_AZURE_SUBSCRIPTION_ID"))
+}
diff --git a/pkg/akv2k8s/transformers/handler_test.go b/pkg/akv2k8s/transformers/handler_test.go
index 07290cd8..cfc62672 100644
--- a/pkg/akv2k8s/transformers/handler_test.go
+++ b/pkg/akv2k8s/transformers/handler_test.go
@@ -19,7 +19,7 @@ package transformers
import (
"testing"
- akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ akvsv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
)
const (
diff --git a/pkg/akv2k8s/transformers/transformator.go b/pkg/akv2k8s/transformers/transformator.go
index d86231f6..8b9fd0fa 100644
--- a/pkg/akv2k8s/transformers/transformator.go
+++ b/pkg/akv2k8s/transformers/transformator.go
@@ -19,7 +19,7 @@ package transformers
import (
"fmt"
- akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
)
// CreateTransformator creates a new Transformator ready to run transformation handlers
diff --git a/pkg/akv2k8s/version.go b/pkg/akv2k8s/version.go
new file mode 100644
index 00000000..2b93c9ef
--- /dev/null
+++ b/pkg/akv2k8s/version.go
@@ -0,0 +1,32 @@
+package akv2k8s
+
+import (
+ "fmt"
+
+ "k8s.io/klog/v2"
+)
+
+// Version is the version of the component
+var Version string
+
+// BuildDate is the date when the binary was built
+var BuildDate string
+
+// GitCommit is the commit hash when the binary was built
+var GitCommit string
+
+// Component is the versioned component
+var Component string
+
+// GetUserAgent is used to get the user agent string which is then provided to adal
+// to use as the extended user agent header.
+// The format is: akv2k8s////
+func GetUserAgent() string {
+ return fmt.Sprintf("akv2k8s/%s/%s/%s/%s", Component, Version, GitCommit, BuildDate)
+}
+
+// LogVersion prints the version and exits
+// The format is: - commit: - date:
+func LogVersion() {
+ klog.InfoS("version info", "version", Version, "commit", GitCommit, "buildDate", BuildDate, "component", Component)
+}
diff --git a/pkg/akv2k8s/version_test.go b/pkg/akv2k8s/version_test.go
new file mode 100644
index 00000000..6c0e84de
--- /dev/null
+++ b/pkg/akv2k8s/version_test.go
@@ -0,0 +1,21 @@
+package akv2k8s
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+ "time"
+)
+
+func TestVersion(t *testing.T) {
+ BuildDate = time.Now().UTC().Format(time.RFC3339)
+ GitCommit = "20462a2"
+ Version = "1.1.7"
+ Component = "env-injector"
+ expectedUserAgentStr := fmt.Sprintf("akv2k8s/%s/%s/%s/%s", Component, Version, GitCommit, BuildDate)
+ gotUserAgentStr := GetUserAgent()
+
+ if !strings.EqualFold(expectedUserAgentStr, gotUserAgentStr) {
+ t.Fatalf("got unexpected user agent string: %s. Expected: %s.", gotUserAgentStr, expectedUserAgentStr)
+ }
+}
diff --git a/pkg/azure/credentialprovider/acr.go b/pkg/azure/credentialprovider/acr.go
new file mode 100644
index 00000000..3ad76670
--- /dev/null
+++ b/pkg/azure/credentialprovider/acr.go
@@ -0,0 +1,130 @@
+// Copyright © 2020 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package credentialprovider
+
+import (
+ "context"
+ "fmt"
+ "regexp"
+ "strings"
+
+ "github.com/Azure/go-autorest/autorest/adal"
+ "github.com/Azure/go-autorest/autorest/azure"
+ dockerTypes "github.com/docker/docker/api/types"
+ "k8s.io/klog/v2"
+)
+
+var (
+ containerRegistryUrls = []string{"*.azurecr.io", "*.azurecr.cn", "*.azurecr.de", "*.azurecr.us"}
+ acrRE = regexp.MustCompile(`.*\.azurecr\.io|.*\.azurecr\.cn|.*\.azurecr\.de|.*\.azurecr\.us`)
+)
+
+// GetAcrCredentials will get Docker credentials for Azure Container Registry
+// It will either get a exact match to the login server for the image (eg xxx.azureacr.io) or
+// get credentials for a wildcard match (eg *.azureacr.io* or *.azureacr.cn*)
+func (c CloudConfigCredentialProvider) GetAcrCredentials(image string) (*dockerTypes.AuthConfig, error) {
+ cred := &dockerTypes.AuthConfig{
+ Username: "",
+ Password: "",
+ }
+
+ if c.config.UseManagedIdentityExtension {
+ klog.V(4).InfoS("using managed identity for acr credentials")
+ if loginServer := parseACRLoginServerFromImage(image, c.environment); loginServer == "" {
+ klog.V(4).InfoS("image is not from ACR, skip MSI authentication", "image", image)
+ } else {
+ token, err := getServicePrincipalTokenFromCloudConfig(c.config, c.environment, c.environment.ServiceManagementEndpoint)
+ if err != nil {
+ return nil, err
+ }
+
+ if managedCred, err := getACRDockerEntryFromARMToken(c.config, *c.environment, token, loginServer); err == nil {
+ klog.V(4).InfoS("found acr gredentials", "image", image, "url", loginServer)
+ return managedCred, nil
+ }
+ }
+ } else {
+ return &dockerTypes.AuthConfig{
+ Username: c.config.AADClientID,
+ Password: c.config.AADClientSecret,
+ }, nil
+ }
+
+ return cred, nil
+}
+
+// IsAcrRegistry checks if an image blongs to a ACR registry
+func (c CloudConfigCredentialProvider) IsAcrRegistry(image string) bool {
+ return parseACRLoginServerFromImage(image, c.environment) != ""
+}
+
+func getACRDockerEntryFromARMToken(config *AzureCloudConfig, env azure.Environment, token *adal.ServicePrincipalToken, loginServer string) (*dockerTypes.AuthConfig, error) {
+ // Run EnsureFresh to make sure the token is valid and does not expire
+ // if err := token.EnsureFresh(); err != nil {
+ // return nil, fmt.Errorf("Failed to ensure fresh service principal token: %v", err)
+ // }
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+
+ err := token.RefreshExchangeWithContext(ctx, env.ServiceManagementEndpoint)
+ if err != nil {
+ return nil, fmt.Errorf("failed to refresh token using resource %s, error: %+v", env.ServiceManagementEndpoint, err)
+ }
+
+ armAccessToken := token.OAuthToken()
+
+ klog.V(4).InfoS("discovering auth redirects", "url", loginServer)
+ directive, err := receiveChallengeFromLoginServer(loginServer)
+ if err != nil {
+ return nil, fmt.Errorf("failed to receive challenge: %s", err)
+ }
+
+ klog.V(4).InfoS("exchanging acr refresh_token", "url", loginServer)
+ registryRefreshToken, err := performTokenExchange(loginServer, directive, config.TenantID, armAccessToken)
+ if err != nil {
+ return nil, fmt.Errorf("failed to perform token exchange: %s", err)
+ }
+
+ klog.V(4).InfoS("adding ACR docker config entry", "url", loginServer)
+ return &dockerTypes.AuthConfig{
+ Username: dockerTokenLoginUsernameGUID,
+ Password: registryRefreshToken,
+ }, nil
+}
+
+// parseACRLoginServerFromImage takes image as parameter and returns login server of it.
+// Parameter `image` is expected in following format: foo.azurecr.io/bar/imageName:version
+// If the provided image is not an acr image, this function will return an empty string.
+func parseACRLoginServerFromImage(image string, env *azure.Environment) string {
+ match := acrRE.FindAllString(image, -1)
+ if len(match) == 1 {
+ return match[0]
+ }
+
+ // handle the custom cloud case
+ if env != nil {
+ cloudAcrSuffix := env.ContainerRegistryDNSSuffix
+ cloudAcrSuffixLength := len(cloudAcrSuffix)
+ if cloudAcrSuffixLength > 0 {
+ customAcrSuffixIndex := strings.Index(image, cloudAcrSuffix)
+ if customAcrSuffixIndex != -1 {
+ endIndex := customAcrSuffixIndex + cloudAcrSuffixLength
+ return image[0:endIndex]
+ }
+ }
+ }
+
+ return ""
+}
diff --git a/pkg/azure/credentialprovider/akv.go b/pkg/azure/credentialprovider/akv.go
new file mode 100644
index 00000000..4edbad92
--- /dev/null
+++ b/pkg/azure/credentialprovider/akv.go
@@ -0,0 +1,205 @@
+// Copyright © 2020 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go)
+
+package credentialprovider
+
+import (
+ "encoding/json"
+ "fmt"
+ "strings"
+
+ "github.com/Azure/go-autorest/autorest"
+ "github.com/Azure/go-autorest/autorest/adal"
+)
+
+const (
+ vmTypeVMSS = "vmss"
+ vmTypeStandard = "standard"
+)
+
+type AzureKeyVaultCredentials interface {
+ Authorizer() (autorest.Authorizer, error)
+ Endpoint(keyVaultName string) string
+}
+
+// AzureKeyVaultCredentials has credentials needed to authenticate with azure key vault.
+// These credentials will never expire
+type keyVaultCredentials struct {
+ ClientID string
+ Token *adal.ServicePrincipalToken
+ EndpointPartial string
+}
+
+// Authorizer gets an Authorizer from credentials
+func (c *keyVaultCredentials) Authorizer() (autorest.Authorizer, error) {
+ return createAuthorizerFromServicePrincipalToken(c.Token)
+}
+
+// Endpoint takes the name of the keyvault and creates a correct andpoint url
+func (c *keyVaultCredentials) Endpoint(keyVaultName string) string {
+ return fmt.Sprintf(c.EndpointPartial, keyVaultName)
+}
+
+// MarshalJSON will get a fresh oauth token from the service principal token and serialize.
+// This token will expire after the default oauth token lifetime for the service principal.
+func (c *keyVaultCredentials) MarshalJSON() ([]byte, error) {
+ err := c.Token.Refresh()
+ if err != nil {
+ return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err)
+ }
+
+ return json.Marshal(&OAuthCredentials{
+ OAuthToken: c.Token.OAuthToken(),
+ EndpointPartial: c.EndpointPartial,
+ })
+}
+
+// GetAzureKeyVaultCredentials will get Azure credentials
+func (c *UserAssignedManagedIdentityProvider) GetAzureKeyVaultCredentials(azureIdentity string, hostname string) (AzureKeyVaultCredentials, error) {
+ err := c.aadClient.Init()
+ if err != nil {
+ return nil, err
+ }
+
+ resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2)
+ endpoint := resourceSplit[0] + "%s." + resourceSplit[1]
+ msiExists := false
+
+ msis, err := c.aadClient.GetUserMSIs(hostname, c.config.VMType == vmTypeVMSS)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, msi := range msis {
+ if msi == azureIdentity {
+ msiExists = true
+ break
+ }
+ }
+
+ if !msiExists {
+ ids := []string{azureIdentity}
+ err := c.aadClient.UpdateUserMSI(ids, []string{}, hostname, c.config.VMType == vmTypeVMSS)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ token, err := getServicePrincipalTokenFromMSI(azureIdentity, c.environment.ResourceIdentifiers.KeyVault)
+ if err != nil {
+ return nil, err
+ }
+
+ return &keyVaultCredentials{
+ Token: token,
+ EndpointPartial: endpoint,
+ }, nil
+}
+
+// GetAzureKeyVaultCredentials will get Azure credentials
+func (c CloudConfigCredentialProvider) GetAzureKeyVaultCredentials() (AzureKeyVaultCredentials, error) {
+ resourceSplit := strings.SplitAfterN(c.environment.ResourceIdentifiers.KeyVault, "https://", 2)
+ endpoint := resourceSplit[0] + "%s." + resourceSplit[1]
+
+ token, err := getServicePrincipalTokenFromCloudConfig(c.config, c.environment, c.environment.ResourceIdentifiers.KeyVault)
+ if err != nil {
+ return nil, err
+ }
+
+ return &keyVaultCredentials{
+ Token: token,
+ EndpointPartial: endpoint,
+ }, nil
+}
+
+// GetAzureKeyVaultCredentials will get Azure credentials
+func (c EnvironmentCredentialProvider) GetAzureKeyVaultCredentials() (AzureKeyVaultCredentials, error) {
+ resourceSplit := strings.SplitAfterN(c.envSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2)
+ endpoint := resourceSplit[0] + "%s." + resourceSplit[1]
+
+ akvCreds := &keyVaultCredentials{
+ EndpointPartial: endpoint,
+ }
+
+ // ClientID / Secret
+ if creds, err := c.envSettings.GetClientCredentials(); err == nil {
+ creds.AADEndpoint = c.envSettings.Environment.ActiveDirectoryEndpoint
+ creds.Resource = c.envSettings.Environment.ResourceIdentifiers.KeyVault
+
+ token, err := creds.ServicePrincipalToken()
+ if err != nil {
+ return nil, err
+ }
+
+ akvCreds.ClientID = creds.ClientID
+ akvCreds.Token = token
+ return akvCreds, nil
+ }
+
+ // Certificate
+ if creds, err := c.envSettings.GetClientCertificate(); err == nil {
+ creds.AADEndpoint = c.envSettings.Environment.ActiveDirectoryEndpoint
+ creds.Resource = c.envSettings.Environment.ResourceIdentifiers.KeyVault
+
+ token, err := creds.ServicePrincipalToken()
+ if err != nil {
+ return nil, err
+ }
+ akvCreds.ClientID = creds.ClientID
+ akvCreds.Token = token
+ return akvCreds, nil
+ }
+
+ // Username / Password
+ if creds, err := c.envSettings.GetUsernamePassword(); err == nil {
+ creds.AADEndpoint = c.envSettings.Environment.ActiveDirectoryEndpoint
+ creds.Resource = c.envSettings.Environment.ResourceIdentifiers.KeyVault
+
+ token, err := creds.ServicePrincipalToken()
+ if err != nil {
+ return nil, err
+ }
+ akvCreds.ClientID = creds.ClientID
+ akvCreds.Token = token
+ return akvCreds, nil
+ }
+
+ msi := c.envSettings.GetMSI()
+ msiEndpoint, err := adal.GetMSIVMEndpoint()
+ if err != nil {
+ return nil, err
+ }
+
+ // User-Assigned Managed Identity
+ if msi.ClientID != "" {
+ token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, c.envSettings.Environment.ResourceIdentifiers.KeyVault, msi.ClientID)
+ if err != nil {
+ return nil, err
+ }
+ akvCreds.ClientID = msi.ClientID
+ akvCreds.Token = token
+ return akvCreds, nil
+ }
+
+ // System-Assigned Managed Identity
+ token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, c.envSettings.Environment.ResourceIdentifiers.KeyVault)
+ if err != nil {
+ return nil, err
+ }
+ akvCreds.ClientID = "msi"
+ akvCreds.Token = token
+ return akvCreds, nil
+}
diff --git a/pkg/azure/credentialprovider/arm.go b/pkg/azure/credentialprovider/arm.go
new file mode 100644
index 00000000..cf978de5
--- /dev/null
+++ b/pkg/azure/credentialprovider/arm.go
@@ -0,0 +1,47 @@
+// Copyright © 2020 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go)
+
+package credentialprovider
+
+import (
+ "github.com/Azure/go-autorest/autorest"
+ "github.com/Azure/go-autorest/autorest/adal"
+)
+
+// AzureResourceManagerCredentials has credentials needed to authenticate with azure resource manager.
+// These credentials will never expire
+type AzureResourceManagerCredentials struct {
+ SubscriptionID string
+ ResourceManagerEndpoint string
+ Token *adal.ServicePrincipalToken
+}
+
+// Authorizer gets an Authorizer from credentials
+func (c AzureResourceManagerCredentials) Authorizer() (autorest.Authorizer, error) {
+ return createAuthorizerFromServicePrincipalToken(c.Token)
+}
+
+// GetAzureResourceManagerCredentials will get Azure credentials for Azure Resource Manager (ARM)
+func (c CloudConfigCredentialProvider) GetAzureResourceManagerCredentials() (*AzureResourceManagerCredentials, error) {
+ token, err := getServicePrincipalTokenFromCloudConfig(c.config, c.environment, c.environment.ResourceManagerEndpoint)
+ if err != nil {
+ return nil, err
+ }
+
+ return &AzureResourceManagerCredentials{
+ Token: token,
+ }, nil
+}
diff --git a/pkg/azure/credentialprovider/credential_helper.go b/pkg/azure/credentialprovider/credential_helper.go
new file mode 100644
index 00000000..2838b517
--- /dev/null
+++ b/pkg/azure/credentialprovider/credential_helper.go
@@ -0,0 +1,283 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+/*
+Copyright 2017 Microsoft Corporation
+
+MIT License
+
+Copyright (c) Microsoft Corporation. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE
+*/
+
+// Source: https://github.com/Azure/acr-docker-credential-helper/blob/a79b541f3ee761f6cc4511863ed41fb038c19464/src/docker-credential-acr/acr_login.go
+
+package credentialprovider
+
+import (
+ "bytes"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "net/http"
+ "net/url"
+ "strconv"
+ "strings"
+ "unicode"
+)
+
+type authDirective struct {
+ service string
+ realm string
+}
+
+type acrAuthResponse struct {
+ RefreshToken string `json:"refresh_token"`
+}
+
+// 5 minutes buffer time to allow timeshift between local machine and AAD
+const userAgentHeader = "User-Agent"
+const userAgent = "kubernetes-credentialprovider-acr"
+
+const dockerTokenLoginUsernameGUID = "00000000-0000-0000-0000-000000000000"
+
+var client = &http.Client{}
+
+func receiveChallengeFromLoginServer(serverAddress string) (*authDirective, error) {
+ challengeURL := url.URL{
+ Scheme: "https",
+ Host: serverAddress,
+ Path: "v2/",
+ }
+ var err error
+ var r *http.Request
+ r, err = http.NewRequest("GET", challengeURL.String(), nil)
+ if err != nil {
+ return nil, fmt.Errorf("failed to construct request, got %v", err)
+ }
+ r.Header.Add(userAgentHeader, userAgent)
+
+ var challenge *http.Response
+ if challenge, err = client.Do(r); err != nil {
+ return nil, fmt.Errorf("error reaching registry endpoint %s, error: %s", challengeURL.String(), err)
+ }
+ defer challenge.Body.Close()
+
+ if challenge.StatusCode != 401 {
+ return nil, fmt.Errorf("registry did not issue a valid AAD challenge, status: %d", challenge.StatusCode)
+ }
+
+ var authHeader []string
+ var ok bool
+ if authHeader, ok = challenge.Header["Www-Authenticate"]; !ok {
+ return nil, fmt.Errorf("challenge response does not contain header 'Www-Authenticate'")
+ }
+
+ if len(authHeader) != 1 {
+ return nil, fmt.Errorf("registry did not issue a valid AAD challenge, authenticate header [%s]",
+ strings.Join(authHeader, ", "))
+ }
+
+ authSections := strings.SplitN(authHeader[0], " ", 2)
+ authType := strings.ToLower(authSections[0])
+ var authParams *map[string]string
+ if authParams, err = parseAssignments(authSections[1]); err != nil {
+ return nil, fmt.Errorf("unable to understand the contents of Www-Authenticate header %s", authSections[1])
+ }
+
+ // verify headers
+ if !strings.EqualFold("Bearer", authType) {
+ return nil, fmt.Errorf("Www-Authenticate: expected realm: Bearer, actual: %s", authType)
+ }
+ if len((*authParams)["service"]) == 0 {
+ return nil, fmt.Errorf("Www-Authenticate: missing header \"service\"")
+ }
+ if len((*authParams)["realm"]) == 0 {
+ return nil, fmt.Errorf("Www-Authenticate: missing header \"realm\"")
+ }
+
+ return &authDirective{
+ service: (*authParams)["service"],
+ realm: (*authParams)["realm"],
+ }, nil
+}
+
+func performTokenExchange(
+ serverAddress string,
+ directive *authDirective,
+ tenant string,
+ accessToken string) (string, error) {
+ var err error
+ data := url.Values{
+ "service": []string{directive.service},
+ "grant_type": []string{"access_token_refresh_token"},
+ "access_token": []string{accessToken},
+ "refresh_token": []string{accessToken},
+ "tenant": []string{tenant},
+ }
+
+ var realmURL *url.URL
+ if realmURL, err = url.Parse(directive.realm); err != nil {
+ return "", fmt.Errorf("Www-Authenticate: invalid realm %s", directive.realm)
+ }
+ authEndpoint := fmt.Sprintf("%s://%s/oauth2/exchange", realmURL.Scheme, realmURL.Host)
+
+ datac := data.Encode()
+ var r *http.Request
+ r, err = http.NewRequest("POST", authEndpoint, bytes.NewBufferString(datac))
+ if err != nil {
+ return "", fmt.Errorf("failed to construct request, got %v", err)
+ }
+ r.Header.Add(userAgentHeader, userAgent)
+ r.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+ r.Header.Add("Content-Length", strconv.Itoa(len(datac)))
+
+ var exchange *http.Response
+ if exchange, err = client.Do(r); err != nil {
+ return "", fmt.Errorf("Www-Authenticate: failed to reach auth url %s", authEndpoint)
+ }
+
+ defer exchange.Body.Close()
+ if exchange.StatusCode != 200 {
+ return "", fmt.Errorf("Www-Authenticate: auth url %s responded with status code %d", authEndpoint, exchange.StatusCode)
+ }
+
+ var content []byte
+ limitedReader := &io.LimitedReader{R: exchange.Body, N: maxReadLength}
+ if content, err = ioutil.ReadAll(limitedReader); err != nil {
+ return "", fmt.Errorf("Www-Authenticate: error reading response from %s", authEndpoint)
+ }
+
+ if limitedReader.N <= 0 {
+ return "", errors.New("the read limit is reached")
+ }
+
+ var authResp acrAuthResponse
+ if err = json.Unmarshal(content, &authResp); err != nil {
+ return "", fmt.Errorf("Www-Authenticate: unable to read response %s", content)
+ }
+
+ return authResp.RefreshToken, nil
+}
+
+// Try and parse a string of assignments in the form of:
+// key1 = value1, key2 = "value 2", key3 = ""
+// Note: this method and handle quotes but does not handle escaping of quotes
+func parseAssignments(statements string) (*map[string]string, error) {
+ var cursor int
+ result := make(map[string]string)
+ var errorMsg = fmt.Errorf("malformed header value: %s", statements)
+ for {
+ // parse key
+ equalIndex := nextOccurrence(statements, cursor, "=")
+ if equalIndex == -1 {
+ return nil, errorMsg
+ }
+ key := strings.TrimSpace(statements[cursor:equalIndex])
+
+ // parse value
+ cursor = nextNoneSpace(statements, equalIndex+1)
+ if cursor == -1 {
+ return nil, errorMsg
+ }
+ // case: value is quoted
+ if statements[cursor] == '"' {
+ cursor = cursor + 1
+ // like I said, not handling escapes, but this will skip any comma that's
+ // within the quotes which is somewhat more likely
+ closeQuoteIndex := nextOccurrence(statements, cursor, "\"")
+ if closeQuoteIndex == -1 {
+ return nil, errorMsg
+ }
+ value := statements[cursor:closeQuoteIndex]
+ result[key] = value
+
+ commaIndex := nextNoneSpace(statements, closeQuoteIndex+1)
+ if commaIndex == -1 {
+ // no more comma, done
+ return &result, nil
+ } else if statements[commaIndex] != ',' {
+ // expect comma immediately after close quote
+ return nil, errorMsg
+ } else {
+ cursor = commaIndex + 1
+ }
+ } else {
+ commaIndex := nextOccurrence(statements, cursor, ",")
+ endStatements := commaIndex == -1
+ var untrimmed string
+ if endStatements {
+ untrimmed = statements[cursor:commaIndex]
+ } else {
+ untrimmed = statements[cursor:]
+ }
+ value := strings.TrimSpace(untrimmed)
+
+ if len(value) == 0 {
+ // disallow empty value without quote
+ return nil, errorMsg
+ }
+
+ result[key] = value
+
+ if endStatements {
+ return &result, nil
+ }
+ cursor = commaIndex + 1
+ }
+ }
+}
+
+func nextOccurrence(str string, start int, sep string) int {
+ if start >= len(str) {
+ return -1
+ }
+ offset := strings.Index(str[start:], sep)
+ if offset == -1 {
+ return -1
+ }
+ return offset + start
+}
+
+func nextNoneSpace(str string, start int) int {
+ if start >= len(str) {
+ return -1
+ }
+ offset := strings.IndexFunc(str[start:], func(c rune) bool { return !unicode.IsSpace(c) })
+ if offset == -1 {
+ return -1
+ }
+ return offset + start
+}
diff --git a/pkg/azure/credentialprovider/credential_test.go b/pkg/azure/credentialprovider/credential_test.go
new file mode 100644
index 00000000..fe5e6a77
--- /dev/null
+++ b/pkg/azure/credentialprovider/credential_test.go
@@ -0,0 +1,158 @@
+/*
+Copyright Sparebanken Vest
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package credentialprovider
+
+import (
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+
+ "github.com/Azure/go-autorest/autorest/azure"
+ akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing"
+)
+
+// func TestAuthDefault(t *testing.T) {
+// creds, err := NewAzureKeyVaultCredentialsFromEnvironment()
+// if err != nil {
+// t.Error(err)
+// }
+
+// _, err = creds.
+// if err == nil {
+// t.Fail()
+// }
+// }
+
+// func TestChinaCloud(t *testing.T) {
+// ensureIntegrationEnvironment(t)
+
+// os.Setenv("AZURE_ENVIRONMENT", "AzureChinaCloud")
+
+// creds, err := NewFromEnvironment()
+// if err != nil {
+// t.Error(err)
+// }
+
+// token := creds.(*credentials).Token
+// err = token.Refresh()
+// if err != nil {
+// t.Error(err)
+// }
+
+// if token.Token().Resource != azure.ChinaCloud.ResourceIdentifiers.KeyVault {
+// t.Errorf("Endpoint incorrect. Expected '%s', but got '%s'", azure.ChinaCloud.ResourceIdentifiers.KeyVault, token.Token().Resource)
+// }
+// }
+
+func TestIntegrationAuthFromUserAssignedManagedIdentity(t *testing.T) {
+ akv2k8sTesting.EnsureIntegrationEnvironment(t)
+
+ // provider, err := NewUserAssignedManagedIdentityProvider()
+}
+
+func TestIntegrationAuthFromEnvironmentAudience(t *testing.T) {
+ akv2k8sTesting.EnsureIntegrationEnvironment(t)
+
+ provider, err := NewFromEnvironment()
+ if err != nil {
+ t.Error(err)
+ }
+
+ creds, err := provider.GetAzureKeyVaultCredentials()
+ if err != nil {
+ t.Error(err)
+ }
+
+ token := creds.(*keyVaultCredentials).Token
+ err = token.Refresh()
+ if err != nil {
+ t.Error(err)
+ }
+
+ if token.Token().Resource != azure.PublicCloud.ResourceIdentifiers.KeyVault {
+ t.Errorf("expected resource uri '%s', got '%s'", azure.PublicCloud.ResourceIdentifiers.KeyVault, token.Token().Resource)
+ }
+}
+
+func TestIntegrationAuthFromConfigAudience(t *testing.T) {
+ akv2k8sTesting.EnsureIntegrationEnvironment(t)
+
+ tenantID := os.Getenv("AZURE_TENANT_ID")
+ subscriptionID := os.Getenv("AZURE_SUBSCRIPTION_ID")
+ clientID := os.Getenv("AZURE_CLIENT_ID")
+ clientSecret := os.Getenv("AZURE_CLIENT_SECRET")
+
+ config := fmt.Sprintf(`{
+ "cloud":"AzurePublicCloud",
+ "tenantId": "%s",
+ "subscriptionId": "%s",
+ "aadClientId": "%s",
+ "aadClientSecret": "%s",
+ "resourceGroup": "",
+ "location": "westeurope",
+ "vmType": "vmss",
+ "subnetName": "",
+ "securityGroupName": "",
+ "vnetName": "",
+ "vnetResourceGroup": "",
+ "routeTableName": "",
+ "primaryAvailabilitySetName": "",
+ "primaryScaleSetName": "",
+ "cloudProviderBackoffMode": "v2",
+ "cloudProviderBackoff": true,
+ "cloudProviderBackoffRetries": 6,
+ "cloudProviderBackoffDuration": 5,
+ "cloudProviderRatelimit": true,
+ "cloudProviderRateLimitQPS": 10,
+ "cloudProviderRateLimitBucket": 100,
+ "cloudProviderRatelimitQPSWrite": 10,
+ "cloudProviderRatelimitBucketWrite": 100,
+ "useManagedIdentityExtension": false,
+ "userAssignedIdentityID": "",
+ "useInstanceMetadata": true,
+ "loadBalancerSku": "Standard",
+ "disableOutboundSNAT": false,
+ "excludeMasterFromStandardLB": true,
+ "providerVaultName": "",
+ "maximumLoadBalancerRuleCount": 250,
+ "providerKeyName": "k8s",
+ "providerKeyVersion": ""
+}`, tenantID, subscriptionID, clientID, clientSecret)
+
+ r := strings.NewReader(config)
+
+ conf, err := NewFromCloudConfig(r)
+ if err != nil {
+ t.Error(err)
+ }
+
+ creds, err := conf.GetAzureKeyVaultCredentials()
+ if err != nil {
+ t.Error(err)
+ }
+
+ token := creds.(*keyVaultCredentials).Token
+ err = token.Refresh()
+ if err != nil {
+ t.Error(err)
+ }
+
+ if token.Token().Resource != azure.PublicCloud.ResourceIdentifiers.KeyVault {
+ t.Errorf("expected resource uri '%s', got '%s'", azure.PublicCloud.ResourceIdentifiers.KeyVault, token.Token().Resource)
+ }
+}
diff --git a/pkg/azure/credentialprovider/oauth.go b/pkg/azure/credentialprovider/oauth.go
new file mode 100644
index 00000000..5f1b2d04
--- /dev/null
+++ b/pkg/azure/credentialprovider/oauth.go
@@ -0,0 +1,51 @@
+// Copyright © 2019 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go)
+
+// Todo: Needs refactoring
+
+package credentialprovider
+
+import (
+ "fmt"
+
+ "github.com/Azure/go-autorest/autorest"
+)
+
+// OAuthCredentials has credentials need to authenticate with azure.
+// These credentials expires when the oauth token expire (default one our in Azure). Use the
+// Credentials interface if you want tokens to refresh.
+type OAuthCredentials struct {
+ OAuthToken string `json:"oauth_token"`
+ EndpointPartial string `json:"endpoint_partial"`
+}
+
+type crendentialsToken struct {
+ token string
+}
+
+func (t crendentialsToken) OAuthToken() string {
+ return t.token
+}
+
+// Endpoint takes the name of the keyvault and creates a correct andpoint url
+func (c OAuthCredentials) Endpoint(keyVaultName string) string {
+ return fmt.Sprintf(c.EndpointPartial, keyVaultName)
+}
+
+// Authorizer gets an Authorizer from credentials
+func (c OAuthCredentials) Authorizer() (autorest.Authorizer, error) {
+ return createAuthorizerFromOAuthToken(c.OAuthToken)
+}
diff --git a/pkg/azure/credentialprovider/provider.go b/pkg/azure/credentialprovider/provider.go
new file mode 100644
index 00000000..7d26f3d9
--- /dev/null
+++ b/pkg/azure/credentialprovider/provider.go
@@ -0,0 +1,306 @@
+// Copyright © 2019 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Note: Code is based on azure_credentials.go in Kubernetes (https://github.com/kubernetes/kubernetes/blob/v1.17.9/pkg/credentialprovider/azure/azure_credentials.go)
+
+// Todo: Needs refactoring
+
+package credentialprovider
+
+import (
+ "crypto/rsa"
+ "crypto/x509"
+ "encoding/json"
+ "errors"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "strings"
+ "time"
+
+ "golang.org/x/crypto/pkcs12"
+
+ "github.com/Azure/go-autorest/autorest"
+ "github.com/Azure/go-autorest/autorest/adal"
+ "github.com/Azure/go-autorest/autorest/azure"
+
+ aadProvider "github.com/Azure/aad-pod-identity/pkg/cloudprovider"
+ azureAuth "github.com/Azure/go-autorest/autorest/azure/auth"
+ "k8s.io/klog/v2"
+ "sigs.k8s.io/yaml"
+)
+
+const (
+ maxReadLength = 10 * 1 << 20 // 10MB
+)
+
+// CloudConfigCredentialProvider provides credentials for Azure using the cloud config file
+type UserAssignedManagedIdentityProvider struct {
+ config *AzureCloudConfig
+ environment *azure.Environment
+ aadClient *aadProvider.Client
+}
+
+// CloudConfigCredentialProvider provides credentials for Azure using the cloud config file
+type CloudConfigCredentialProvider struct {
+ config *AzureCloudConfig
+ environment *azure.Environment
+ aadClient *aadProvider.Client
+}
+
+// EnvironmentCredentialProvider provides credentials for Azure using environment vars
+type EnvironmentCredentialProvider struct {
+ envSettings *azureAuth.EnvironmentSettings
+}
+
+// Credentials has credentials needed to authenticate with azure key vault.
+// These credentials will never expire
+type Credentials interface {
+ Authorizer() (autorest.Authorizer, error)
+}
+
+type credentials struct {
+ Token *adal.ServicePrincipalToken
+ EndpointPartial string
+}
+
+func NewUserAssignedManagedIdentityProvider(azureConfigFile string) (*UserAssignedManagedIdentityProvider, error) {
+ aadClient, err := aadProvider.NewCloudProvider(azureConfigFile, 2, time.Second*30)
+ if err != nil {
+ return nil, fmt.Errorf("failed creating aad cloud provider, error: %+v", err)
+ }
+
+ return &UserAssignedManagedIdentityProvider{
+ aadClient: aadClient,
+ }, nil
+}
+
+// NewFromCloudConfig parses the specified configFile and returns a CloudConfigCredentialProvider
+func NewFromCloudConfig(configReader io.Reader) (*CloudConfigCredentialProvider, error) {
+ config, err := ParseConfig(configReader)
+ if err != nil {
+ return nil, fmt.Errorf("failed reading cloud config, error: %+v", err)
+ }
+
+ env, err := parseAzureEnvironment(config.Cloud)
+ if err != nil {
+ return nil, fmt.Errorf("failed to parse environment from cloud config, error: %+v", err)
+ }
+
+ return &CloudConfigCredentialProvider{
+ config: config,
+ environment: env,
+ }, nil
+}
+
+// NewFromEnvironment creates a credentials object based on available environment settings to use with Azure Key Vault
+func NewFromEnvironment() (*EnvironmentCredentialProvider, error) {
+ envSettings, err := azureAuth.GetSettingsFromEnvironment()
+ if err != nil {
+ return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err)
+ }
+
+ return &EnvironmentCredentialProvider{
+ envSettings: &envSettings,
+ }, nil
+}
+
+// NewFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault
+func NewFromServicePrincipalToken(token *adal.ServicePrincipalToken) (Credentials, error) {
+ resourceSplit := strings.SplitAfterN(token.Token().Resource, "https://", 2)
+ endpoint := resourceSplit[0] + "%s." + resourceSplit[1]
+
+ return &credentials{
+ Token: token,
+ EndpointPartial: endpoint,
+ }, nil
+}
+
+// Authorizer gets an Authorizer from credentials
+func (c credentials) Authorizer() (autorest.Authorizer, error) {
+ return createAuthorizerFromServicePrincipalToken(c.Token)
+}
+
+// MarshalJSON will get a fresh oauth token from the service principal token and serialize.
+// This token will expire after the default oauth token lifetime for the service principal.
+func (c credentials) MarshalJSON() ([]byte, error) {
+ err := c.Token.Refresh()
+ if err != nil {
+ return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err)
+ }
+
+ return json.Marshal(&OAuthCredentials{
+ OAuthToken: c.Token.OAuthToken(),
+ EndpointPartial: c.EndpointPartial,
+ })
+}
+
+func getServicePrincipalTokenFromMSI(userAssignedIdentityID string, resource string) (*adal.ServicePrincipalToken, error) {
+ // err := adal.AddToUserAgent(akv2k8s.)
+ // if err != nil {
+ // return fmt.Errorf("failed to add MIC to user agent, error: %+v", err)
+ // }
+
+ klog.V(4).InfoS("azure: using managed identity extension to retrieve access token", "id", userAssignedIdentityID)
+ msiEndpoint, err := adal.GetMSIVMEndpoint()
+ if err != nil {
+ return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err)
+ }
+
+ if len(userAssignedIdentityID) > 0 {
+ klog.V(4).InfoS("azure: using User Assigned MSI ID to retrieve access token", "id", userAssignedIdentityID, "url", msiEndpoint)
+ token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, resource, userAssignedIdentityID)
+ if err != nil {
+ return nil, fmt.Errorf("failed getting user assigned msi token from endpoint '%s': %+v", msiEndpoint, err)
+ }
+ return token, err
+ }
+
+ klog.V(4).InfoS("azure: using System Assigned MSI to retrieve access token", "url", msiEndpoint)
+ token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, resource)
+ if err != nil {
+ return nil, fmt.Errorf("failed getting system assigned msi token from endpoint '%s': %+v", msiEndpoint, err)
+ }
+
+ return token, err
+
+}
+func getServicePrincipalTokenFromCloudConfig(config *AzureCloudConfig, env *azure.Environment, resource string) (*adal.ServicePrincipalToken, error) {
+ if config.UseManagedIdentityExtension {
+ return getServicePrincipalTokenFromMSI(config.UserAssignedIdentityID, resource)
+ }
+
+ oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID)
+ if err != nil {
+ return nil, fmt.Errorf("creating the OAuth config: %v", err)
+ }
+
+ if len(config.AADClientSecret) > 0 {
+ klog.V(4).InfoS("azure: using client_id+client_secret to retrieve access token", "id", config.AADClientID)
+ token, err := adal.NewServicePrincipalToken(
+ *oauthConfig,
+ config.AADClientID,
+ config.AADClientSecret,
+ resource)
+
+ return token, err
+ }
+
+ if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 {
+ klog.V(4).InfoS("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token", "path", config.AADClientCertPath)
+ certData, err := ioutil.ReadFile(config.AADClientCertPath)
+ if err != nil {
+ return nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err)
+ }
+ certificate, privateKey, err := decodePkcs12(certData, config.AADClientCertPassword)
+ if err != nil {
+ return nil, fmt.Errorf("decoding the client certificate: %v", err)
+ }
+ token, err := adal.NewServicePrincipalTokenFromCertificate(
+ *oauthConfig,
+ config.AADClientID,
+ certificate,
+ privateKey,
+ resource)
+ return token, err
+ }
+
+ return nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID)
+}
+
+func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) {
+ err := token.Refresh()
+ if err != nil {
+ return nil, err
+ }
+ return createAuthorizerFromOAuthToken(token.OAuthToken())
+}
+
+func createAuthorizerFromOAuthToken(token string) (autorest.Authorizer, error) {
+ tokenProvider := crendentialsToken{token: token}
+ return autorest.NewBearerAuthorizer(tokenProvider), nil
+}
+
+// AzureCloudConfig holds azure configuration
+type AzureCloudConfig struct {
+ // The cloud environment identifier. Takes values from https://github.com/Azure/go-autorest/blob/ec5f4903f77ed9927ac95b19ab8e44ada64c1356/autorest/azure/environments.go#L13
+ Cloud string `json:"cloud,omitempty" yaml:"cloud,omitempty"`
+ // The AAD Tenant ID for the Subscription that the cluster is deployed in
+ TenantID string `json:"tenantId,omitempty" yaml:"tenantId,omitempty"`
+ // The ClientID for an AAD application with RBAC access to talk to Azure RM APIs
+ AADClientID string `json:"aadClientId,omitempty" yaml:"aadClientId,omitempty"`
+ // The ClientSecret for an AAD application with RBAC access to talk to Azure RM APIs
+ AADClientSecret string `json:"aadClientSecret,omitempty" yaml:"aadClientSecret,omitempty"`
+ // The path of a client certificate for an AAD application with RBAC access to talk to Azure RM APIs
+ AADClientCertPath string `json:"aadClientCertPath,omitempty" yaml:"aadClientCertPath,omitempty"`
+ // The password of the client certificate for an AAD application with RBAC access to talk to Azure RM APIs
+ AADClientCertPassword string `json:"aadClientCertPassword,omitempty" yaml:"aadClientCertPassword,omitempty"`
+ // Use managed service identity for the virtual machine to access Azure ARM APIs
+ UseManagedIdentityExtension bool `json:"useManagedIdentityExtension,omitempty" yaml:"useManagedIdentityExtension,omitempty"`
+ // UserAssignedIdentityID contains the Client ID of the user assigned MSI which is assigned to the underlying VMs. If empty the user assigned identity is not used.
+ // More details of the user assigned identity can be found at: https://docs.microsoft.com/en-us/azure/active-directory/managed-service-identity/overview
+ // For the user assigned identity specified here to be used, the UseManagedIdentityExtension has to be set to true.
+ UserAssignedIdentityID string `json:"userAssignedIdentityID,omitempty" yaml:"userAssignedIdentityID,omitempty"`
+ // The location of the resource group that the cluster is deployed in
+ Location string `json:"location,omitempty" yaml:"location,omitempty"`
+ VMType string `json:"vmType,omitempty" yaml:"vmType,omitempty"`
+}
+
+// ParseConfig returns a parsed configuration for an Azure cloudprovider config file
+func ParseConfig(configReader io.Reader) (*AzureCloudConfig, error) {
+ var config AzureCloudConfig
+
+ if configReader == nil {
+ return &config, nil
+ }
+
+ limitedReader := &io.LimitedReader{R: configReader, N: maxReadLength}
+ configContents, err := ioutil.ReadAll(limitedReader)
+ if err != nil {
+ return nil, err
+ }
+ if limitedReader.N <= 0 {
+ return nil, errors.New("the read limit is reached")
+ }
+ err = yaml.Unmarshal(configContents, &config)
+ if err != nil {
+ return nil, err
+ }
+
+ return &config, nil
+}
+
+func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) {
+ privateKey, certificate, err := pkcs12.Decode(pkcs, password)
+ if err != nil {
+ return nil, nil, fmt.Errorf("decoding the PKCS#12 client certificate: %v", err)
+ }
+ rsaPrivateKey, isRsaKey := privateKey.(*rsa.PrivateKey)
+ if !isRsaKey {
+ return nil, nil, fmt.Errorf("PKCS#12 certificate must contain a RSA private key")
+ }
+
+ return certificate, rsaPrivateKey, nil
+}
+
+func parseAzureEnvironment(cloudName string) (*azure.Environment, error) {
+ var env azure.Environment
+ var err error
+ if cloudName == "" {
+ env = azure.PublicCloud
+ } else {
+ env, err = azure.EnvironmentFromName(cloudName)
+ }
+ return &env, err
+}
diff --git a/pkg/azurekeyvault/client/azure_keyvault_service.go b/pkg/azure/keyvault/client/azure_keyvault_service.go
similarity index 85%
rename from pkg/azurekeyvault/client/azure_keyvault_service.go
rename to pkg/azure/keyvault/client/azure_keyvault_service.go
index 9cf0ec75..bbf81166 100644
--- a/pkg/azurekeyvault/client/azure_keyvault_service.go
+++ b/pkg/azure/keyvault/client/azure_keyvault_service.go
@@ -23,7 +23,8 @@ import (
"time"
"github.com/Azure/azure-sdk-for-go/services/keyvault/2016-10-01/keyvault"
- akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider"
+ akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
)
const (
@@ -35,20 +36,26 @@ const (
type Service interface {
GetSecret(secret *akvs.AzureKeyVault) (string, error)
GetKey(secret *akvs.AzureKeyVault) (string, error)
- GetCertificate(secret *akvs.AzureKeyVault, exportPrivateKey bool) (*Certificate, error)
+ GetCertificate(secret *akvs.AzureKeyVault, options *CertificateOptions) (*Certificate, error)
}
type azureKeyVaultService struct {
- credentials AzureKeyVaultCredentials
+ credentials credentialprovider.AzureKeyVaultCredentials
}
// NewService creates a new AzureKeyVaultService
-func NewService(credentials AzureKeyVaultCredentials) Service {
+func NewService(credentials credentialprovider.AzureKeyVaultCredentials) Service {
return &azureKeyVaultService{
credentials: credentials,
}
}
+// CertificateOptions has options for exporting certificate
+type CertificateOptions struct {
+ ExportPrivateKey bool
+ EnsureServerFirst bool
+}
+
// GetSecret download secrets from Azure Key Vault
func (a *azureKeyVaultService) GetSecret(vaultSpec *akvs.AzureKeyVault) (string, error) {
if vaultSpec.Object.Name == "" {
@@ -98,7 +105,7 @@ func (a *azureKeyVaultService) GetKey(vaultSpec *akvs.AzureKeyVault) (string, er
}
// GetCertificate download public/private certificates from Azure Key Vault
-func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, exportPrivateKey bool) (*Certificate, error) {
+func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, options *CertificateOptions) (*Certificate, error) {
vaultClient, err := a.getClient()
if err != nil {
return nil, err
@@ -114,7 +121,7 @@ func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, exp
return nil, fmt.Errorf("failed to get certificate from azure key vault, error: %+v", err)
}
- if exportPrivateKey {
+ if options != nil && options.ExportPrivateKey {
if !*certBundle.Policy.KeyProperties.Exportable {
return nil, fmt.Errorf("cannot export private key because key is not exportable in azure key vault")
}
@@ -131,7 +138,10 @@ func (a *azureKeyVaultService) GetCertificate(vaultSpec *akvs.AzureKeyVault, exp
if err != nil {
return nil, fmt.Errorf("failed to decode base64 encoded pfx, error: %+v", err)
}
- return NewCertificateFromPfx(pfxRaw)
+ if options.EnsureServerFirst {
+ return NewCertificateFromPfx(pfxRaw, true)
+ }
+ return NewCertificateFromPfx(pfxRaw, false)
default:
return nil, fmt.Errorf("failed to get certificate from azure key vault - unknown content type '%s'", *secretBundle.ContentType)
}
diff --git a/pkg/azure/keyvault/client/azure_keyvault_service_test.go b/pkg/azure/keyvault/client/azure_keyvault_service_test.go
new file mode 100644
index 00000000..3501599a
--- /dev/null
+++ b/pkg/azure/keyvault/client/azure_keyvault_service_test.go
@@ -0,0 +1,130 @@
+package client
+
+import (
+ "fmt"
+ "os"
+ "strings"
+ "testing"
+
+ akv2k8sTesting "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/akv2k8s/testing"
+ auth "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider"
+ akvs "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+func secret(name string, keyVaultName string, secretName string) *akvs.AzureKeyVaultSecret {
+ return &akvs.AzureKeyVaultSecret{
+ TypeMeta: metav1.TypeMeta{APIVersion: akvs.SchemeGroupVersion.String()},
+ ObjectMeta: metav1.ObjectMeta{
+ Name: name,
+ Namespace: metav1.NamespaceDefault,
+ },
+ Spec: akvs.AzureKeyVaultSecretSpec{
+ Vault: akvs.AzureKeyVault{
+ Name: keyVaultName,
+ Object: akvs.AzureKeyVaultObject{
+ Name: secretName,
+ Type: "secret",
+ },
+ },
+ },
+ }
+}
+
+func TestIntegrationGetSecret(t *testing.T) {
+ akv2k8sTesting.EnsureIntegrationEnvironment(t)
+
+ tenantId := os.Getenv("AZURE_TENANT_ID")
+ subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID")
+ clientId := os.Getenv("AZURE_CLIENT_ID")
+ clientSecret := os.Getenv("AZURE_CLIENT_SECRET")
+
+ config := fmt.Sprintf(`{
+ "cloud":"AzurePublicCloud",
+ "tenantId": "%s",
+ "subscriptionId": "%s",
+ "aadClientId": "%s",
+ "aadClientSecret": "%s",
+ "resourceGroup": "",
+ "location": "westeurope",
+ "vmType": "vmss",
+ "subnetName": "",
+ "securityGroupName": "",
+ "vnetName": "",
+ "vnetResourceGroup": "",
+ "routeTableName": "",
+ "primaryAvailabilitySetName": "",
+ "primaryScaleSetName": "",
+ "cloudProviderBackoffMode": "v2",
+ "cloudProviderBackoff": true,
+ "cloudProviderBackoffRetries": 6,
+ "cloudProviderBackoffDuration": 5,
+ "cloudProviderRatelimit": true,
+ "cloudProviderRateLimitQPS": 10,
+ "cloudProviderRateLimitBucket": 100,
+ "cloudProviderRatelimitQPSWrite": 10,
+ "cloudProviderRatelimitBucketWrite": 100,
+ "useManagedIdentityExtension": false,
+ "userAssignedIdentityID": "",
+ "useInstanceMetadata": true,
+ "loadBalancerSku": "Standard",
+ "disableOutboundSNAT": false,
+ "excludeMasterFromStandardLB": true,
+ "providerVaultName": "",
+ "maximumLoadBalancerRuleCount": 250,
+ "providerKeyName": "k8s",
+ "providerKeyVersion": ""
+}`, tenantId, subscriptionId, clientId, clientSecret)
+
+ r := strings.NewReader(config)
+
+ provider, err := auth.NewFromCloudConfig(r)
+ if err != nil {
+ t.Error(err)
+ }
+
+ creds, err := provider.GetAzureKeyVaultCredentials()
+ if err != nil {
+ t.Error(err)
+ }
+
+ srvc := NewService(creds)
+ akvSecret := secret("mySecret", "akv2k8s-test", "my-secret")
+
+ secret, err := srvc.GetSecret(&akvSecret.Spec.Vault)
+ if err != nil {
+ t.Error(err)
+ }
+
+ if secret == "" {
+ t.Fail()
+ }
+
+}
+
+func TestIntegrationEnvironmentGetSecret(t *testing.T) {
+ akv2k8sTesting.EnsureIntegrationEnvironment(t)
+
+ provider, err := auth.NewFromEnvironment()
+ if err != nil {
+ t.Error(err)
+ }
+
+ creds, err := provider.GetAzureKeyVaultCredentials()
+ if err != nil {
+ t.Error(err)
+ }
+
+ srvc := NewService(creds)
+ akvSecret := secret("mySecret", "akv2k8s-test", "my-secret")
+
+ secret, err := srvc.GetSecret(&akvSecret.Spec.Vault)
+ if err != nil {
+ t.Error(err)
+ }
+
+ if secret == "" {
+ t.Fail()
+ }
+
+}
diff --git a/pkg/azurekeyvault/client/certificate.go b/pkg/azure/keyvault/client/certificate.go
similarity index 88%
rename from pkg/azurekeyvault/client/certificate.go
rename to pkg/azure/keyvault/client/certificate.go
index 76753308..7d87a22a 100644
--- a/pkg/azurekeyvault/client/certificate.go
+++ b/pkg/azure/keyvault/client/certificate.go
@@ -62,7 +62,7 @@ func NewCertificateFromPem(pem string) (*Certificate, error) {
// privateDer, rest := pem.Decode([]byte(c.cert))
// publicDer, _ := pem.Decode(rest)
- cert, err := importPem(pem)
+ cert, err := importPem(pem, false)
if err != nil {
return nil, err
}
@@ -73,7 +73,7 @@ func NewCertificateFromPem(pem string) (*Certificate, error) {
}
// NewCertificateFromPfx creates a new Certificate from a PFX certificate
-func NewCertificateFromPfx(pfx []byte) (*Certificate, error) {
+func NewCertificateFromPfx(pfx []byte, ensureServerFirst bool) (*Certificate, error) {
pemList, err := pkcs12.ToPEM(pfx, "")
if err != nil {
@@ -85,7 +85,7 @@ func NewCertificateFromPfx(pfx []byte) (*Certificate, error) {
mergedPems.WriteString(string(pem.EncodeToMemory(pemCert)))
}
- cert, err := importPem(mergedPems.String())
+ cert, err := importPem(mergedPems.String(), ensureServerFirst)
if err != nil {
return nil, err
}
@@ -161,9 +161,10 @@ func (cert *Certificate) ExportRaw() []byte {
return cert.raw
}
-func importPem(pemCert string) (*Certificate, error) {
+func importPem(pemCert string, ensureServerFirst bool) (*Certificate, error) {
var cert Certificate
- var publicDers []byte
+ var publicDers [][]byte
+ var joinedPublicDers []byte
var err error
raw := []byte(pemCert)
@@ -173,7 +174,7 @@ func importPem(pemCert string) (*Certificate, error) {
break
}
if pemBlock.Type == "CERTIFICATE" {
- publicDers = append(publicDers, pemBlock.Bytes...)
+ publicDers = append(publicDers, pemBlock.Bytes)
} else {
err = parsePrivateKey(pemBlock.Bytes, &cert)
if err != nil {
@@ -183,7 +184,18 @@ func importPem(pemCert string) (*Certificate, error) {
raw = rest
}
- cert.Certificates, err = x509.ParseCertificates(publicDers)
+ if ensureServerFirst && len(publicDers) > 1 {
+ publicDers = append(
+ publicDers[len(publicDers)-1:],
+ publicDers[0:len(publicDers)-1]...,
+ )
+ }
+
+ for _, der := range publicDers {
+ joinedPublicDers = append(joinedPublicDers, der...)
+ }
+
+ cert.Certificates, err = x509.ParseCertificates(joinedPublicDers)
if err != nil {
return nil, err
}
diff --git a/pkg/azure/keyvault/client/certificate_test.go b/pkg/azure/keyvault/client/certificate_test.go
new file mode 100644
index 00000000..4554c36c
--- /dev/null
+++ b/pkg/azure/keyvault/client/certificate_test.go
@@ -0,0 +1,152 @@
+/*
+Copyright Sparebanken Vest
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package client
+
+import (
+ "bytes"
+ "encoding/base64"
+ "testing"
+)
+
+var (
+ pemTestCert = "-----BEGIN PRIVATE KEY-----\nMIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCvOy4KydxUOW6K\nmMhq01IAu5Rz47U1oE6ewq0Yi5ea9CrGN7eUWLOogapoKmFFhO2s5SDdPt9HOkDN\nvh75k4B7OFhM+GaOTRubXgPEg8PV7dFFS52+3C0xORdS+wvgI2i9eIMqbr1Y8Znw\n5H3pLG8DsU6Q8FCo14mvW8/ou+xKbSOzWFFaP+dNHFBCARqI+DhQYJFkeg4vPd+n\nFGxfPH/lbbR9WN0tChOTVUJlGkJlht9/0bsVmM8xAdUS/zQ6qK8nKWhLpCtWyo8z\nKDWg5gsdcMoWYgAIXpinc1NcOyGlMv263Zhw7gB+y7JEMK2Ro3e3SmhSpH48Ckej\npIsUOBNnvr514wkLNLet9sXGZvFXs7oiTkUzgu0MFsZPVAkiYhdHdYdg2I9e5t4y\nyxbu+DSr/OvRbUtC9PrO1ncJaO7p9QcXVuRNi2wxLDeaTZgd9S6M2fzR2xcwq3Fx\nk53gDlRTXgqIM/VCPA+3vp5di+MKGK7aLyNRPxeKcsDLEPHF7MeFZJw21xTupEMl\n8w5KaBd5NiKAwxbLyV8YCZFjJG3V2MOxVAA01BAm7w3lz1/iMbKiPGbDA0p3cxva\nLYs0RdcNfZ6+4X7al7vBXj8+Hwf/tADY648eBEjTqctVDirElCmjN8A0ysqldwqC\nr+8F8k8PUfR3yb809m8QURE7mEAPVQIDAQABAoIB/wTTt6Mblq75RXZL/OSX7OsH\nDahsQdS56sZ+fx44JfdmOGyaLIszeF7ZmMtINPTkhgWK/Ayb0aTnYTEO2/gkBSgI\nXRQ7TNKJ3JujeoI7Xm8uSIrYE/h6Rb9WxH7hcofay/LDZWQf8P0vqCw26o+5fckn\nwkVhYc54dcscuPWeXeM8p0IivMpQAFRpFYclDKB9tR3zx5jLj6EwFB2y8Ty06XU5\nfn8krvy+lh9Cn7amuOdFr6UpyEDfjJmB64ryGTg6k1zJd0uN5xmsqrxX0cYYKnUw\nLZftdzTqFQv0FLuQFSV6/g3S9d3CP8axbxcCnzWHMwghOtidgtTy7GZuIudCREe+\nr1OLzGHPErVw3UGSzLIbuL6P9cowF/fRAZPlV/vzR0KEfjYFavq2zmoislWxFa6g\na2oGzADbuDYcYvn/MW0o339z2fUruc+l8UlY8zOuE/Isqt+jQAX9BlPQZeBOgLF9\nTWsxH62hdF7sW8BTINkA58xz+sjuJcH09C77E5PXR8LAD6xfN+1OwKWGtHv5WkR9\n6BU4ZEpltKpX5gtoE9oDoFLc2xVEeV5EjjtvQOFGG7uqvjJhSOGDCalApUlkJqR1\n89NtVQdrwpcZ/xUGFi7HAlbLPyF6xw/sUGCYVcBlUAxvRBHkdpBHZ38JRelCuoa3\nocub+v4WP+YbM3SmnkECggEBAO6ePV02bvgk5eBJ4mLXOCTJsGQDiMLFx0SuTAkC\nt/vdGu/9W+tGp2aKQrzjAZMGbMzYYL6L0Sz+/X5SrOujREEqnxhFeIaB0hOE/CEQ\nZSa36OTRPKaTCv+kgjqpj173hYLMQjllise+uJL6a688FecqTlNw60YSVs/ohc3r\nNIzWXoCdLBztnO6IePJS8cmq9vUwlf1iJVmhtSGookcE0m7YBQA2L7HjYQ+64Rtj\nIjaKUc6XsP0CeEGpRgJWc5a2dWGhqQymnq0rElUSp/iJObNUDDh/ta5RLiEtp3I+\n/XSWjseGLxxHzdLQehGO+RD2zNjJsAJC9OatFGqZd5T9dekCggEBALv+5dF9Ber4\nDqfw6LuJPiMgjS16vUgyk0yS6Kky4jMbKEDk0kC/kAXgXqjM7WDXfNbd5LYg/q1L\nMyDp/xjCvTvYhScxL0JXG6HzHZtS4Oxi1d3wT8+Ws2gUTzdF9vPCJ4DvoKFbYraN\ndQ9iLSM0VzHTIOm4xPn/mX2LvUxOEaASbpc1lw+3ojWeLxO8ejczPtEwKp1lWW+8\nPm/WRov6f5HBZGG1Y7TlEIeyND+NLxJaGgLj86FzGwNbkqFFYI5yR4TZMlTgrjZ2\nYfDskIGYoAr8M3ZFPpZbftc+FHl6Sv3RZEp4EnIEYyJnswv18rRGyYB5FrMM5xHa\n4oysjdacbo0CggEAVnzQbRqvug1VrKfbAExVsy/PWVDWnxIkmcY7FQEBQq7vdpD0\nYiCnyEjQy7nT9kBb6xt6ZVY0KQT7SHAa8QWqVZxnMdrsRoSDakPHRwy0PQZnyZf1\nTcL6N5KfCTgwGRHKOJBkaH1fgeqk59EQeuFiZvk0jpXdEPbQtGbpKKvZzjpc4m0V\nch7FxMd+XwalUJ1BCbnkg4SxWP19s4d12hvrUfXGSj9ZpjZuFc98i/qwieg0opbk\nta/ReqsqDura1oOnpA1+QnGaDdYQvPkYHMNQQKl0DH5tkZMnDyuHB6fBIiL3+WWv\naaa0+XZK6FZT/EwYD3N68jbmoT2WqtSZPU1pEQKCAQAJIW0qCodyDRAxKeszyIuj\nCx6wOcjdq88ppez04srHrqb61+I6UNN+5ZHTYviYfn7KtMY57kpQQlm+XH8ORc8J\nDBATgjkIYNCvwe4LMDBKatZ2TAikTW5zPKFITvaaijB++6RykcyujxpDYAJPNmiR\nu+5aS6YNelOLHHFaNmR2wM5sO6cVlVakggVJURsieTOw10UKlfSND7h8mAyfGdB+\nVMU6VaP9Ei8GWCpfd8z0eDnRMB8SFVQXiqgJeyQgZv6APkhKhQsRDBjfqa2vDamg\nPvWE5gIPLWxwqcw2xjDEORpE36YNsZbbAexZRV2/UbzRp4/prFPAsz/Tk0HkTX61\nAoIBAQC/Ei4aCdAAj6S6+I3nTCI1RbuLN+CiyIMZCdgzkcFeoA8Y0hNLyQXuBi8J\nOz0aQFr+luSTVztsoGvCfdFY3xFs5EHGSTg4AN94H154CE75qPIX7RGk0V5WbJlb\nqg/IvAnxyx/eJKbbNwALoeBlW8kDmwOdLBDiOCmLPORJkkUz91/jxtNZgc+wpjc+\ngkHPGCa1cOMWrUlk2JfWwqwFirjDsw0ONduDH+985a9I3Lqy/3fPSkiO6sTN+knA\ntkjaiXmKTeZpN4YNYejbb2r2a6+saa4wj6QuOMa7shO0k/nge5PjpqrYP5IBSRMz\nk125vXj8DvpA/GTS1kARDjKz8dET\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIFUjCCAzqgAwIBAgIQFwNmpFLpQLWUtRrCdyrn0TANBgkqhkiG9w0BAQsFADAm\nMSQwIgYDVQQDExtjdW11bHVzLXRlc3QtY2VydC5zcHZlc3Qubm8wHhcNMTkwMjAx\nMTUzNjMxWhcNMTkwMzAxMTU0NjMxWjAmMSQwIgYDVQQDExtjdW11bHVzLXRlc3Qt\nY2VydC5zcHZlc3Qubm8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv\nOy4KydxUOW6KmMhq01IAu5Rz47U1oE6ewq0Yi5ea9CrGN7eUWLOogapoKmFFhO2s\n5SDdPt9HOkDNvh75k4B7OFhM+GaOTRubXgPEg8PV7dFFS52+3C0xORdS+wvgI2i9\neIMqbr1Y8Znw5H3pLG8DsU6Q8FCo14mvW8/ou+xKbSOzWFFaP+dNHFBCARqI+DhQ\nYJFkeg4vPd+nFGxfPH/lbbR9WN0tChOTVUJlGkJlht9/0bsVmM8xAdUS/zQ6qK8n\nKWhLpCtWyo8zKDWg5gsdcMoWYgAIXpinc1NcOyGlMv263Zhw7gB+y7JEMK2Ro3e3\nSmhSpH48CkejpIsUOBNnvr514wkLNLet9sXGZvFXs7oiTkUzgu0MFsZPVAkiYhdH\ndYdg2I9e5t4yyxbu+DSr/OvRbUtC9PrO1ncJaO7p9QcXVuRNi2wxLDeaTZgd9S6M\n2fzR2xcwq3Fxk53gDlRTXgqIM/VCPA+3vp5di+MKGK7aLyNRPxeKcsDLEPHF7MeF\nZJw21xTupEMl8w5KaBd5NiKAwxbLyV8YCZFjJG3V2MOxVAA01BAm7w3lz1/iMbKi\nPGbDA0p3cxvaLYs0RdcNfZ6+4X7al7vBXj8+Hwf/tADY648eBEjTqctVDirElCmj\nN8A0ysqldwqCr+8F8k8PUfR3yb809m8QURE7mEAPVQIDAQABo3wwejAOBgNVHQ8B\nAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH\nAwIwHwYDVR0jBBgwFoAUlJOHnXHhHeY+AjaPPmKFVRw3K1MwHQYDVR0OBBYEFJST\nh51x4R3mPgI2jz5ihVUcNytTMA0GCSqGSIb3DQEBCwUAA4ICAQAn/chFtfLEebP5\n5Tmb+H+eEzOXaHRonUsVriV/66htOeffkNX2b2DOIosvSwKukOkVggLFmyMKhxiq\neZkkAYyMMjjtWqbkCwoCyb8iDUQLaEovy4Pzwpm3YMVK9+o6cIf4zs3AgzaSSpbo\npq8HQbmFGrUGNEyGMclvf5VL1vCw+0jLpJ1+9b79DRY7puPG19zwWWcHk2hNV3aD\n6lWar7/pjqA9ESQhDTeUsXaFMGVm0Ez97IDI/ZVO+ia5+rIo5wAcUGKuYLIs57Wl\ndhlzMil3mz2g4STiWI+VhtPnqPot6MaWuKIN4R+kJocN365WJf2wozYgEjNFANK+\n3hO396cieWBTqyoYYZRxDxz7slD5NikixrJd50QshYCzqKiNopKsafqMHqc3JKZu\nz9tBZ25g43vdSuAwxjSab5DyYGF3Z447jdKOLUYReNnoB7nlTuW5LYfOX20F/XtC\n+4iL+IDjtAfwATruKzbLnKL9IoemLs7XMoW2qYBmCAcfHrI2F3alAar2XTA9lkDR\nMPpJf9q3VzxkPhjlvi8RPJfWLD1Kw4gMVfhao/NQv3SlhQ2rBpczP8XQOWdTNWp/\n043EPQis8+56AEHis/5+NKoNcQYZJwu2uwK0fdILcStJXR//EI04zBzWo/ULe5nc\nU0GaEMA+K/ZUHV2BxSMA3Br0IwdNvg==\n-----END CERTIFICATE-----\n"
+ pfxTestCert = "MIIKXAIBAzCCChwGCSqGSIb3DQEHAaCCCg0EggoJMIIKBTCCBhYGCSqGSIb3DQEHAaCCBgcEggYDMIIF/zCCBfsGCyqGSIb3DQEMCgECoIIE/jCCBPowHAYKKoZIhvcNAQwBAzAOBAitiIQWXFmG+AICB9AEggTYkpNC/etn5MKpS1Afffn97rGgijDgBQBT4Lh5mFxQrlm6ElGljqV0z5opIasRH5c4hG2E4k+c4O9RgPNZJ/4Jv3ZU/0Cp66PwBrsmNatAtddOnHp8N4643SYnRVVY2GuUr7ty7a2c5kiPc6htXIIUe8zKWEGt+7Fvh6AsZt9ACEmEsdSiRJaUSJ28HHYcU//t2ZUZiUu90YnMaQH8kO7KezDyBueftEnBploUgiRp3WfQLn+leRkbBuFQL0vENznkTe9d+7+Z8pJMn7TsZ+wOVd0t1kr2mEdJvYeRbcZU0n1vHzYPj4TGy4SuQz8CxQtIqEpy8FD1zSlvokrbEKrYnQinRd205SQXYwZ8Mp9ysDoSbULIkvto8bKAKVJc6J1Tlhdkof14aU57ruIdAFyuwJPeZqB2Z7HXVTsfw0AiJimwrSf86s6J0E5UcVNWZ6cGgW+XuDSuy+k6nVx+oI4MbRn0e/McyB+YgD37OyE8ivSrkv3OQRStV4SiZw8KPwgX613W0v/ZSSnZKfoMZoZ6SbLm1V0TmGUXEtc6KiyaR22SF8OlgWLVQp4FAAyX0VPtYLMuIpuV+rZVcJSLrW8XzxLShJ0HK9FZnSPU93dyorUAWMnsujunS0H/hEar9agJHbFOcGQpQ+aQhtIsCf39Wx6S6h1ttGIyvT3RUEjouQDrLKReTvGL3ZSnAwIPg5naU1Cw4zXOr86o4inZ5RHpiyuv0AmSMkgtQG0lBZLrFORe3cHE3dWDjx8rSy0+SYmhK/qyBpDX1WOOiKf4saW2sr8f1UBizGOJybqHJKd/u4tmZgWg1s5wDISCo0dPBwGCDa6bPJhJaEU8NhCHxMbMrWpw9H7FzMzxNlYh7LDjVYlRI6taUbwSV+K9wNWM3uvzaIShFrUtgF6Q7CbGOjZersfaGqs5KusEX7pTeL3V8oyDlhLcaKTiHUP/9r0ce24wVdiU1hAaobmjaZQKVmhcfCo64mjo/+7YYD77hWc6WwTMlXBbtpzyRjDw/evsjNZl6is8UPV6o1mhSFFh6M6wxp5gdgwgQhBw8ntoz9iteykyVjHHnNJYwCqMtJTOxxAtApQhQuGbPqboNGlIV2jPSWlpkVZHCKlNkgr72ImfGZ3vO1g1x6v+eDIqCQE7VHqhTQAfbc5hBT/NdMt6IVrS9tGBjnZ+jgsB9tIyuc6WrgWCvJJRVsBK1McnMjBrJdpdGqiDInePgiPtjdFCa6sHGlnP+kBrzBndMTKdfBS1kGFS3BR7ouIqD0o5QFgPSoJWPUOGqQRJcgvmZpRzflwJDYITjM6TjhQXKiHXJMGaH8SaVUBD0rIle0z4tMsopDRrM7pzGnySfAe7x3h7hC0qlATMpwTfXXOPgsRTnZYyN9gBc1mUy2oMoQcVRGHPs3PMlamh7slsQTyw7JZhuEKlM0W9LmmuJkoDVEX262yMm3Tv9+Pm18T88wP07/USYr0RRREYlhgCSGlaWlC5Zi1sWpu2XXPDA6zFCeYDFpoCMCpOVhXKBHQ9+JTvRcyp6ajyyRfODRep20Zzvm9infiLJgnLj4gzwq9RCiQyy9s6o28no+v5ru7b4Pfx0WRYhZ0livtO6qW9M25DN3BtBW+WfSD3X36lyNlDS7WE8XcjOuusYh4EG3446DGB6TATBgkqhkiG9w0BCRUxBgQEAQAAADBXBgkqhkiG9w0BCRQxSh5IAGIANgA0AGIAZgBlAGYAZQAtADUAYQBkADgALQA0ADIAYQA5AC0AYQBlAGUANgAtADEAMAAyAGQAMwA0ADkANQBmADYAYQAyMHkGCSsGAQQBgjcRATFsHmoATQBpAGMAcgBvAHMAbwBmAHQAIABFAG4AaABhAG4AYwBlAGQAIABSAFMAQQAgAGEAbgBkACAAQQBFAFMAIABDAHIAeQBwAHQAbwBnAHIAYQBwAGgAaQBjACAAUAByAG8AdgBpAGQAZQByMIID5wYJKoZIhvcNAQcGoIID2DCCA9QCAQAwggPNBgkqhkiG9w0BBwEwHAYKKoZIhvcNAQwBBjAOBAjig8t9WhrDRQICB9CAggOgoWgXYnekRNjecBTVd+DN++3HBAN/YpexIG7GYXoXOZeoC1fy6A81vqqbD/fm21pe/NUXdipc+VQL2dLEIqiO/6/TXugLYDfwxZiv7OHtqoEYKjzWwyDncjLX2lhr83nEfEn8kNfvv2jYbxiJT1VxlJyp8DwkUQeu5/DdqPYSbiDi0jHvwDejnD78hhjb5tCEF5SUFdAZkOnWY8kokCz+iLOH+SKsKCN3mLcsi9rBG4FG9zUrLwJdirKeS/qH8UTtDDv2KEABKNKxQoSBoIqP9mMB7MnCK01gIqdnuiDFrUSSvpV8AsgdMpONckYqO7MtW49GbiJtP9RJRWyvzWM4B9s8jQGyh/ya8PNCq3WHZhocgJsgzLSJ0IhC65o1pgZKWpVIlQAK9E995woFnlgAg7eM1uNUsLVJWmmoUrRHwQ6+cvO+dKcyvBCGzNDL4w/0NlFiXm1ohNYaw+mKKCI80WZfGv/xCA+vsv1215vP0tNguQq0jdTMRFNpfae/ELXVGi6Me2zZMO35M2R69b2EgMcTJm6xFbtC6CvmrJ3Jz0xedd5GqPsx2hoNPJv0ZxdlJ2jJ7qgnXrP8W3kuEeZ+Iebv4o1PllbMA26nFHjzaYgL4aTLhw10B/rzS58GkOpOvNa06YCSGPEFRCDXYpFKO9aukchVDWNJnoQZRm2sIZbmaYupDXiABoXGn8N83KONKFHlHBZDJHz9UYmKEBfQDZJqftPaE6KYk7O3EDsjrZDJ6e5h26N/S6FfHBhg7mimk6ddjIoewuLeIzkNbbBbocZalMN8SfndwPwzqPzTsf/BHqx2vfhjRzTBqlcAyK/iacm6JQrQvmPQ607rf+p0FSnhJ3N4r6uVsDO7eKFApgEkLf+d3pKm0xTkIOS4wR2sPEdfSUqrvHY6vk+vH28cVV5WYy6moTX7+jRjT7V0lRo/xlChK9gL7I3eQ5XEpecGb2kpDCPj03wckF2r0shllccpWhgwIIX7A4Mat/HcMpW3Wo0z7m0JBcyhoiQn1Qbeiprz4NSXaZsZwdFespUZUYpgZ/YcuAIMPrke4gzX0XUyo9oWrgaCn0GwRlLXJe73RalNcqlqnGA9YxUFw6isGRQ1HL3o4V1QvPm8L/1SxFo017POjJPo1iBLh1c+GrGnTQysxGAGsDRqnQ0PGmjdr9R8N0NbXgX8EuX+MQFqpGUG12iE858qyAMbNIG0z4ffb52ZPJiqZlLzAwjlb3NEFDA3MB8wBwYFKw4DAhoEFJkApCbJI2XJPgLExmqMwm8AB+HsBBRGaxl3i7EiC81hxCgO4aBlPKWrKA=="
+ derTestCert = "MIIDPjCCAiagAwIBAgIQJVHUTfH7TVCyXO649HajejANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDExFjdW11bHVzLnNwdmVzdC5ubzAeFw0xOTAyMDQxNDE0NTZaFw0xOTAzMDQxNDI0NTZaMBwxGjAYBgNVBAMTEWN1bXVsdXMuc3B2ZXN0Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsCYvQCbABVTAUx8G8Lg7SiNzRHCxaTPG8qp5La+SfnSPAX80u3EpVZc84vYGE9QlGWth1LmhHXfGneTAq7yMRYiBFNc0Y9O+66eZDuIErQ7RDL7N7TSyMzoXgH1xhI14x0XvkZqJwaNqJBvBzSlADNWuKBvPQ2nChKlnjuY3Zrg9KJ1A5T1KF/UW4ZKSZrwyu0fyAzfpBMWkrHa+mYv1wSL0cVDOFGvZIldCMew0gXGHY4ydM0iTW878/epTNQNgeno9M4jnFUXyoVguSH8ZjsFXBOtenIUJWoJs72zHJn5yNz2Bipu0zVrHBJXLi40FBY913/t1X5iBj7WejzUXmQIDAQABo3wwejAOBgNVHQ8BAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUZptBMgsn6JCzZp4So23dBSdWfcowHQYDVR0OBBYEFGabQTILJ+iQs2aeEqNt3QUnVn3KMA0GCSqGSIb3DQEBCwUAA4IBAQAbvqmrDHz6UXbddj/VYWO/m2m5Hm2cudMfInuwnGuOzO0MtKYthkELTu+CirlQjyMya/iLKb/SZ3hRQwyJP4XBWqUm2uaTHfbrv4gpc/hMQ80n8f6hOBofLrEPogaYNGHhWMjSJXj3nDKrp2cDyusTnQkLQWaix0c2GLIif3UfGJBgptUwMgsx1kaiCzbyBW/Kv8BiQSA82ocXqqxAzHBGfKhLHZZXPdoTgEE+vwwPLM1wzvhDzDAkR96/yCwGBr53dUeXXCUh70IiJbJpGNiVc33QEVYw0+Gua7rj99LK4EljlY1E1xbPadSFYeK9KsDlmb9ota2p7iKg1D1JiydK"
+ pfxTestCertOrderWrong = "MIIJcQIBAzCCCTcGCSqGSIb3DQEHAaCCCSgEggkkMIIJIDCCBh8GCSqGSIb3DQEHBqCCBhAwggYMAgEAMIIGBQYJKoZIhvcNAQcBMBwGCiqGSIb3DQEMAQYwDgQIXeOmh13rG20CAggAgIIF2JuwLowxfGVviE04UdoKxuZDlhxPeeyZMqlf3+pn7UIkn4GquVEMCx2uhcVr7/td8/VTYyBT2smElmunQI8/ucDtGo4dguCKt6WwWMiLxc5DUwqrTyTI3OvBs7s46u0lEjNIStgGSMgHbbzLZezkNpdYdF/DYSoapdxQC1+Llium6/o4Pw+IzJxhpAMW2X3s+vTiTLcr44Kejqex5K45i3jXAA/IhSxHYC4vHbj3rAA1isYBaLM1UETxhmFKcFi/JSAvcUiKjMQvNBZlDlX9Mr0VGfCkONRm77Acx7NZQBpntsgO595LuesNAIAk2YuMiYOn+7BVoboLJIEYWfKqfdvje41MDoTHDnv7vedkjlheVwUjqR/Av8QqwddEU5CXUqzrVM+e4ZqVnNpty79kFxeaogTppPXpcKnfBbiYZIOySvTBvAbGCn5iLr5/xqG4IiYEIs+ykTT8NZb7Gw8lBu7h4sY6vKo1lWuvlkM8v4byW1X0Cum4CNVAQgIldmnR25/0YF7qefvGSinrQX/ZOgtAuvIeHRbVt+ID1JWCTl1FvL/y4p34N+QKibYTmOLkLAc61S9wUqrTvVFpTxeWSDNOlG/etjBYNhqMQAdgDrWlEuAzdI00Pgw515UGWUzLc+4tBGeH54lW4n8MIE0gIbrOPzlDMCIXZLnbooNyfpAl8xUZaotjIFFXic7KVBPsUnjBXpRIKpicVA+sM+3UYYR37kqKa+dzCGunR/5BGrkYHcwGkNxU8wyv+tYgRIjxuGGLglRNySQ0+J5UxcFd+WYId+58jxyn5G4y7ftEIz6DFJTL+nJMcuV3qX31EZ03o+t45GWOcgww2qGrqyQ9Ahwln1SxERD7TzSXWLLZyYZi6ZJTGVsyoO/rILIu17WUl+/hKaioUS8EsU/i8BK567/5FAXGjw5iJaLZxtEHtSO3KVl8Kwd1/fPd6TNjsZQsqZP1rBwf5MbbDwQTNNlGX6ozN9p1OnZCUqC8AEd+tBCOqO9iRiGdI5NemJC5NdLaoZL0T+4pA0B8m2EnslD5G/UgP49gkdOe9eiMLdBOpN1N1CG9t8X2QOMv+SLNqwtf5c7wIZ2OzvW2DN8ywJwIJT1nlpc0NLDzZXaTstKPM6krIdUPSegPEp67K+N0UBLZix12g+PmQmT4keAb552SINAAgTqw46CVFGeedlR7SL4cdsbRGm4/rmnWCrvjN+4gKtjJbfe5k6VRbxP5GMCu14f4wVGXgxuRqWEPochvzOOCpI/nTBhnmOLD/PgAiu49XsM53slQPxv+yQ8+GJZ5Z0o9kSrmPeLaVjVd/VaulKyOB6YlFeLpMCS1Wvt1oG2RZrlqef9Owf5WWIErBPo52SXrVNmwEt2/P2mqBXCwPEpgv1sAaQW8PhlCNVJQ+0jyZ03n33Er+xW7ln+rk/Sa9ogpYFMc7xZCu8IFvHHHbGSzfmj/PcwO214dMovj8dk4jfL/QCU/nx4Kb0wQSeAZ1axNHpRkrXnGqNNArmqY/yCUX15fT1M0l1baCfz6e2KLCrvO5EVME9jZyzxg5X09SSaZtMgku/eWb3mYyxbFi4vw30zkmhvqd1xBPrvKUEWqpZdadJ1xq2zCs+iOFHL1X8RhyOw50v4EKLopNmln/jcCDNoInFMPKC7Yws1dLhLbOktdGtbZy3IbGwJc4W6l9WZbi45yzyo8eWHjwHAN1Mg9ImXAyABZjkXyq66SYX5xZoWh8cgHH7SxaoMSXa9tnQkhrfhBXuvaSg3vR4jX0kO3VakNr/5A4dYcs7KMBr/13v17jY57tkdCvyzjQdDcq4ODu77IzIfO67Hq8HuyLPorzESRCMPhub5zV6RZaPPFjqtRUj7fcB5UfXCbCikwimu9jiYMsTI95kyDJaxfHFRTlEfCKpgdpSiRxVqkOX//DbrxsyQfTdPTAB7NxVmDo6WGay4GIJz2PvjYZeXyYplsdQEzTVTC9iT8hgmj5odIpviZOXpu0FQ1MIIC+QYJKoZIhvcNAQcBoIIC6gSCAuYwggLiMIIC3gYLKoZIhvcNAQwKAQKgggKmMIICojAcBgoqhkiG9w0BDAEDMA4ECLeNnB7dpLi5AgIIAASCAoDNHocKayxwzpVI4tWcaGI89onaOEq+5lliWuz/noz32ZJ5xtHyZ6ccUAO6mGTeKgsW2mU31+vleHCBpD/NM1smISi/WsWkvlBzBjSsmXQ935DYridSlWlTIfAa2BLI76X5vcJ0o8gx6IOD68rBJBASMc/9JfShUGpMLH98zFVvHZCAWErwkmz1gGhCCr4W6cAFUM/mPLlkdYxDjvQ614WGqPO9te6KGt8xSqyVmgCcrj1Cmu3yvejb6tALVmVdJTZa9ZqGJU0R1Dyez+zOxHagSCrwZLrgHGcqk68L4S5YSWd9DX9GXAIUMLPOEWAfzmpPzrmeUJHwknfh+ID/nVjk3MLxzUJGYUyOzb5uYPThNVAd2ERv+uSMl2mMo1brBMJ9/5DJ7aonx1b0+VxmnkxfzwITuoATjckk+yqUi/pfQ2J3HM45zIk3goTUycei71gnsKHCxaMaUJlilXFmo5P5BxoeMmoFZvAFQqJrVrBv35tJRryI5GkPuqz5j0B5KXCeSCT/2B5eLja6WhFx6ZdlafSnJyVw0wm32xdVgq2Gb+g68c8s0J0o2g+tTjEevJYzjRuEHi9kSrPJDaF6X7YBrLhi0xql6MXzXXbrJzeq3LammEPdoN0mGvQaJkReMpWH4TSnN5ci9agzMopwsy0i03zO64+K2Xp671S4xoXs5gSUeQtm5KWRt7Ji6nsk+HQfTxb1ydOuJ0dDdqEnDB+hFI1lkRZz6VNll0qthLRHNydbuJ3+oEvlrALQRUHRPhZd414eR0S2Q6Nzaep99kN5NE58g1ZNFTXEVbj6Wf3KEUktt2caISoNQJ4L6bS29Jh2axb2IdRyMk5vLsRZlVZrMSUwIwYJKoZIhvcNAQkVMRYEFBE0Wp7mRapCkGRPUKseuFcBcgZjMDEwITAJBgUrDgMCGgUABBRDCMIA5gEdJEGHzoR0x4r11LvbUgQIo0YOBhWfPHICAggA"
+ pemTestCertOrderExpected = "-----BEGIN CERTIFICATE-----\nMIIDBzCCAe+gAwIBAgIJAPOREtFE1TsGMA0GCSqGSIb3DQEBBQUAMBoxGDAWBgNV\nBAMMD3d3dy5leGFtcGxlLmNvbTAeFw0yMDAzMjYwODU1MDZaFw0zMDAzMjQwODU1\nMDZaMBoxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBAKl3qkYFwsp43MDcYj23agGuJQPGtZZetTvarWI4xsys\nShHePvb/nzgLiVkSNvZthCdBaHKWa62ZJMS19OqWEWgAj2v89n/1c4fN/LN8QwYa\n75tOZ5k5rB/2V5Zw4pq49WjTDPIkFlsKtvepSjxbG8Ie612R9Dwc+L+8OycyoalK\nYdZtUgcttidAS9Ty6Vhc9BaC3JbIB9STB2iQw+qTjDasHXCZoSNB4Jr3/u3RFkKD\n8t3uqnIwa1RH3UbN8seQRTEhtCo5DFIn+H76kXkQ1wM4LCjW6WHjUyfxwRTzr5Qf\nZ56FiKxlbfivr6Xr6dzRG0pcbAMOSFx45OgAzTWeh0ECAwEAAaNQME4wHQYDVR0O\nBBYEFEwA39G1twh6lTo2og8xnQuwJRN6MB8GA1UdIwQYMBaAFEwA39G1twh6lTo2\nog8xnQuwJRN6MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBACVm4DrM\nmoiQC+tKipYHQft5AzI7l5/jFzICl6HAEhvgZ7+dSiToPKFnCY7Rg6iGGHvEwquw\ng3330OHIwMUDEhUh+ylqTflSN4msKRxdbCy3v84KKp0LN+w4x6wHY1CQiExzvWe8\nD62GGZQBXXdNq7K+/BAotZCh9tpoesw62rUvbWjbRt9gZKhuq2WbqtBRQAuB91Yq\nGyXC/Zpe9Bxm91qPOSzyiE+6yhTEaO2cdBkyCy0aP/JTJIowE/pw2hCrAVY8BlMs\n1FPrKRRC8qH+n6ahR0g7pViCxhQv8cq6LV9C5z70ZKtIWobL2lVjiOBSWt1fVnXn\nL/VUlQqA4z8na6o=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIICQDCCAakCFHNdlFiLlaeRn0se50n3MIm9xkc2MA0GCSqGSIb3DQEBCwUAMF8x\nCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl\ncm5ldCBXaWRnaXRzIFB0eSBMdGQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTAe\nFw0yMDAzMjYwODU5MjhaFw0yMTAzMjYwODU5MjhaMF8xCzAJBgNVBAYTAkFVMRMw\nEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0\neSBMdGQxGDAWBgNVBAMMD3d3dy5leGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEF\nAAOBjQAwgYkCgYEAr6s6nN6RSgvUZ4AUsq9UdbdezdHyAmn1ZhDD5XmteK4Td31P\nYCvED8Liddz7qO156m4TbbH1ghdWjNyLWS8ydzAbA7fE7wGYazj5iGahljCTxnIm\nsvQ8t1NJVk7AUyzgO1Xx4S1v2LVM82DU0chb+VrhWrPc/6JySxfQNRNqbu8CAwEA\nATANBgkqhkiG9w0BAQsFAAOBgQCJNuDeN1hf3lorCykH4l5ebjqI5t4Zichx8k51\nQ9cRoDWgLr8jpGbcnUqPdCQYR7J1YITtcZUxZE+O7q1A0te52hAytohspkpMVILr\nD3rBJmblkfKqOTXY6tj1ZcA4dSphcmSiy1lugnlKcGj3PSiB7QTDjMBKL6XUFmRX\nn0UL+A==\n-----END CERTIFICATE-----\n"
+)
+
+func TestImportPfx(t *testing.T) {
+ pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert)
+ cert, err := NewCertificateFromPfx(pfxRaw, false)
+ if err != nil {
+ t.Error(err)
+ }
+ if !cert.HasPrivateKey {
+ t.Error("Certificate has no private key")
+ }
+ if cert.PrivateKeyType != CertificateKeyTypeRsa {
+ t.Errorf("Certificate type is incorrect. Exprected '%s', but got '%s'", CertificateKeyTypeRsa, cert.PrivateKeyType)
+ }
+ if cert.PrivateKeyRsa == nil {
+ t.Error("Private key for RSA is nil")
+ }
+ if len(cert.Certificates) != 1 {
+ t.Errorf("Expected 1 public certificate, but found %d", len(cert.Certificates))
+ }
+}
+
+func TestImportPem(t *testing.T) {
+ cert, err := NewCertificateFromPem(pemTestCert)
+ if err != nil {
+ t.Error(err)
+ }
+ if !cert.HasPrivateKey {
+ t.Error("Certificate has no private key")
+ }
+ if cert.PrivateKeyType != CertificateKeyTypeRsa {
+ t.Errorf("Certificate type is incorrect. Exprected '%s', but got '%s'", CertificateKeyTypeRsa, cert.PrivateKeyType)
+ }
+ if cert.PrivateKeyRsa == nil {
+ t.Error("Private key for RSA is nil")
+ }
+ if len(cert.Certificates) != 1 {
+ t.Errorf("Expected 1 public certificate, but found %d", len(cert.Certificates))
+ }
+}
+
+func TestImportDer(t *testing.T) {
+ certRaw, _ := base64.StdEncoding.DecodeString(derTestCert)
+ cert, err := NewCertificateFromDer(certRaw)
+ if err != nil {
+ t.Error(err)
+ }
+ if cert.HasPrivateKey {
+ t.Error("Certificate should be public with no private key")
+ }
+ if len(cert.Certificates) != 1 {
+ t.Errorf("Expected 1 public certificate, but found %d", len(cert.Certificates))
+ }
+}
+
+func TestGetPrivateKeyPem(t *testing.T) {
+ pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert)
+ cert, err := NewCertificateFromPfx(pfxRaw, false)
+ if err != nil {
+ t.Error(err)
+ }
+ pemCert, err := cert.ExportPrivateKeyAsPem()
+ if err != nil {
+ t.Error(err)
+ }
+
+ if len(pemCert) == 0 {
+ t.Error("Pem is empty")
+ }
+}
+
+func TestGetPublicKeyPem(t *testing.T) {
+ pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert)
+ cert, err := NewCertificateFromPfx(pfxRaw, false)
+ if err != nil {
+ t.Error(err)
+ }
+ pemCert, err := cert.ExportPublicKeyAsPem()
+ if err != nil {
+ t.Error(err)
+ }
+
+ if len(pemCert) == 0 {
+ t.Error("Pem is empty")
+ }
+}
+
+func TestGetPublicKeyPemChainOrder(t *testing.T) {
+ pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCertOrderWrong)
+ cert, err := NewCertificateFromPfx(pfxRaw, true)
+ if err != nil {
+ t.Error(err)
+ }
+ pemCert, err := cert.ExportPublicKeyAsPem()
+ if err != nil {
+ t.Error(err)
+ }
+
+ if len(pemCert) == 0 {
+ t.Error("Pem is empty")
+ }
+
+ if string(pemCert) != pemTestCertOrderExpected {
+ t.Error("Certificate order wrong")
+ }
+}
+
+func TestGetRawCert(t *testing.T) {
+ pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert)
+ cert, err := NewCertificateFromPfx(pfxRaw, false)
+ if err != nil {
+ t.Error(err)
+ }
+ rawCert := cert.ExportRaw()
+ if err != nil {
+ t.Error(err)
+ }
+
+ if !bytes.Equal(pfxRaw, rawCert) {
+ t.Error("Original cert does not match exported raw cert")
+ }
+}
diff --git a/pkg/azurekeyvault/client/authentication.go b/pkg/azurekeyvault/client/authentication.go
deleted file mode 100644
index db8db884..00000000
--- a/pkg/azurekeyvault/client/authentication.go
+++ /dev/null
@@ -1,286 +0,0 @@
-package client
-
-import (
- "crypto/rsa"
- "crypto/x509"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "strings"
-
- "golang.org/x/crypto/pkcs12"
- "gopkg.in/yaml.v2"
-
- "github.com/Azure/go-autorest/autorest"
- "github.com/Azure/go-autorest/autorest/adal"
- "github.com/Azure/go-autorest/autorest/azure"
- azureAuth "github.com/Azure/go-autorest/autorest/azure/auth"
- cloudAuth "k8s.io/kubernetes/pkg/cloudprovider/providers/azure/auth"
-)
-
-// AzureKeyVaultCredentials has credentials needed to authenticate with azure key vault.
-// These credentials will never expire
-type AzureKeyVaultCredentials interface {
- Endpoint(keyVaultName string) string
- Authorizer() (autorest.Authorizer, error)
-}
-
-type azureKeyVaultCredentials struct {
- Token *adal.ServicePrincipalToken
- EndpointPartial string
-}
-
-type azureKeyVaultToken struct {
- token string
-}
-
-// AzureKeyVaultOAuthCredentials has credentials need to authenticate with azure key vault.
-// These credentials expires when the oauth token expire (default one our in Azure). Use the
-// AzureKeyVaultCredentials interface if you want tokens to refresh.
-type AzureKeyVaultOAuthCredentials struct {
- OAuthToken string `json:"oauth_token"`
- EndpointPartial string `json:"endpoint_partial"`
-}
-
-// Authorizer gets an Authorizer from credentials
-func (c azureKeyVaultCredentials) Authorizer() (autorest.Authorizer, error) {
- return createAuthorizerFromServicePrincipalToken(c.Token)
-}
-
-// Endpoint takes the name of the keyvault and creates a correct andpoint url
-func (c azureKeyVaultCredentials) Endpoint(keyVaultName string) string {
- return fmt.Sprintf(c.EndpointPartial, keyVaultName)
-}
-
-// MarshalJSON will get a fresh oauth token from the service principal token and serialize.
-// This token will expire after the default oauth token lifetime for the service principal.
-func (c azureKeyVaultCredentials) MarshalJSON() ([]byte, error) {
- err := c.Token.Refresh()
- if err != nil {
- return nil, fmt.Errorf("failed to refresh token before marshalling, error: %+v", err)
- }
-
- return json.Marshal(&AzureKeyVaultOAuthCredentials{
- OAuthToken: c.Token.OAuthToken(),
- EndpointPartial: c.EndpointPartial,
- })
-}
-
-func createAuthorizerFromServicePrincipalToken(token *adal.ServicePrincipalToken) (autorest.Authorizer, error) {
- err := token.Refresh()
- if err != nil {
- return nil, err
- }
- return createAuthorizerFromOAuthToken(token.OAuthToken())
-}
-
-func (t azureKeyVaultToken) OAuthToken() string {
- return t.token
-}
-
-func createAuthorizerFromOAuthToken(token string) (autorest.Authorizer, error) {
- tokenProvider := azureKeyVaultToken{token: token}
- return autorest.NewBearerAuthorizer(tokenProvider), nil
-}
-
-// NewAzureKeyVaultCredentialsFromCloudConfig gets a credentials object from cloud config to use with Azure Key Vault
-func NewAzureKeyVaultCredentialsFromCloudConfig(cloudConfigPath string) (AzureKeyVaultCredentials, error) {
- authSettings, err := azureAuth.GetSettingsFromEnvironment()
- if err != nil {
- return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err)
- }
-
- token, err := getServicePrincipalTokenFromCloudConfig(cloudConfigPath, authSettings.Environment)
- if err != nil {
- return nil, fmt.Errorf("failed getting service principal token, err: %+v", err)
- }
-
- resourceSplit := strings.SplitAfterN(authSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2)
- endpoint := resourceSplit[0] + "%s." + resourceSplit[1]
-
- return &azureKeyVaultCredentials{
- Token: token,
- EndpointPartial: endpoint,
- }, nil
-}
-
-// NewAzureKeyVaultCredentialsFromServicePrincipalToken gets a credentials object from a service principal token to use with Azure Key Vault
-func NewAzureKeyVaultCredentialsFromServicePrincipalToken(token *adal.ServicePrincipalToken) (AzureKeyVaultCredentials, error) {
- resourceSplit := strings.SplitAfterN(token.Token().Resource, "https://", 2)
- endpoint := resourceSplit[0] + "%s." + resourceSplit[1]
-
- return &azureKeyVaultCredentials{
- Token: token,
- EndpointPartial: endpoint,
- }, nil
-}
-
-// Authorizer gets an Authorizer from credentials
-func (c AzureKeyVaultOAuthCredentials) Authorizer() (autorest.Authorizer, error) {
- return createAuthorizerFromOAuthToken(c.OAuthToken)
-}
-
-// Endpoint takes the name of the keyvault and creates a correct andpoint url
-func (c AzureKeyVaultOAuthCredentials) Endpoint(keyVaultName string) string {
- return fmt.Sprintf(c.EndpointPartial, keyVaultName)
-}
-
-// NewAzureKeyVaultCredentialsFromEnvironment creates a credentials object based on available environment settings to use with Azure Key Vault
-func NewAzureKeyVaultCredentialsFromEnvironment() (AzureKeyVaultCredentials, error) {
- authSettings, err := azureAuth.GetSettingsFromEnvironment()
- if err != nil {
- return nil, fmt.Errorf("failed getting settings from environment, err: %+v", err)
- }
-
- resourceSplit := strings.SplitAfterN(authSettings.Environment.ResourceIdentifiers.KeyVault, "https://", 2)
- endpoint := resourceSplit[0] + "%s." + resourceSplit[1]
-
- akvCreds := &azureKeyVaultCredentials{
- EndpointPartial: endpoint,
- }
-
- if creds, err := authSettings.GetClientCredentials(); err == nil {
- creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint
- creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault
-
- token, err := creds.ServicePrincipalToken()
- if err != nil {
- return nil, err
- }
-
- akvCreds.Token = token
- return akvCreds, nil
- }
-
- if creds, err := authSettings.GetClientCertificate(); err == nil {
- creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint
- creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault
-
- token, err := creds.ServicePrincipalToken()
- if err != nil {
- return nil, err
- }
- akvCreds.Token = token
- return akvCreds, nil
- }
-
- if creds, err := authSettings.GetUsernamePassword(); err == nil {
- creds.AADEndpoint = authSettings.Environment.ActiveDirectoryEndpoint
- creds.Resource = authSettings.Environment.ResourceIdentifiers.KeyVault
-
- token, err := creds.ServicePrincipalToken()
- if err != nil {
- return nil, err
- }
- akvCreds.Token = token
- return akvCreds, nil
- }
-
- msi := authSettings.GetMSI()
- msiEndpoint, err := adal.GetMSIVMEndpoint()
- if err != nil {
- return nil, err
- }
-
- if msi.ClientID != "" {
- token, err := adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint, msi.Resource, msi.ClientID)
- if err != nil {
- return nil, err
- }
- akvCreds.Token = token
- return akvCreds, nil
- }
-
- token, err := adal.NewServicePrincipalTokenFromMSI(msiEndpoint, msi.Resource)
- if err != nil {
- return nil, err
- }
- akvCreds.Token = token
- return akvCreds, nil
-}
-
-func getServicePrincipalTokenFromCloudConfig(cloudConfigPath string, env azure.Environment) (*adal.ServicePrincipalToken, error) {
- config, err := readCloudConfig(cloudConfigPath)
- if err != nil {
- return nil, fmt.Errorf("failed reading cloud config, error: %+v", err)
- }
-
- if config.UseManagedIdentityExtension {
- // klog.V(2).Infoln("azure: using managed identity extension to retrieve access token")
- msiEndpoint, err := adal.GetMSIVMEndpoint()
- if err != nil {
- return nil, fmt.Errorf("failed getting the managed service identity endpoint: %+v", err)
- }
-
- if len(config.UserAssignedIdentityID) > 0 {
- // klog.V(4).Info("azure: using User Assigned MSI ID to retrieve access token")
- return adal.NewServicePrincipalTokenFromMSIWithUserAssignedID(msiEndpoint,
- env.ResourceIdentifiers.KeyVault,
- config.UserAssignedIdentityID)
- }
- // klog.V(4).Info("azure: using System Assigned MSI to retrieve access token")
- return adal.NewServicePrincipalTokenFromMSI(
- msiEndpoint,
- env.ResourceIdentifiers.KeyVault)
- }
-
- oauthConfig, err := adal.NewOAuthConfig(env.ActiveDirectoryEndpoint, config.TenantID)
- if err != nil {
- return nil, fmt.Errorf("creating the OAuth config: %v", err)
- }
-
- if len(config.AADClientSecret) > 0 {
- // klog.V(2).Infoln("azure: using client_id+client_secret to retrieve access token")
- return adal.NewServicePrincipalToken(
- *oauthConfig,
- config.AADClientID,
- config.AADClientSecret,
- env.ResourceIdentifiers.KeyVault)
- }
-
- if len(config.AADClientCertPath) > 0 && len(config.AADClientCertPassword) > 0 {
- // klog.V(2).Infoln("azure: using jwt client_assertion (client_cert+client_private_key) to retrieve access token")
- certData, err := ioutil.ReadFile(config.AADClientCertPath)
- if err != nil {
- return nil, fmt.Errorf("reading the client certificate from file %s: %v", config.AADClientCertPath, err)
- }
- certificate, privateKey, err := decodePkcs12(certData, config.AADClientCertPassword)
- if err != nil {
- return nil, fmt.Errorf("decoding the client certificate: %v", err)
- }
- return adal.NewServicePrincipalTokenFromCertificate(
- *oauthConfig,
- config.AADClientID,
- certificate,
- privateKey,
- env.ResourceIdentifiers.KeyVault)
- }
-
- return nil, fmt.Errorf("No credentials provided for AAD application %s", config.AADClientID)
-}
-
-func readCloudConfig(path string) (*cloudAuth.AzureAuthConfig, error) {
- bytes, err := ioutil.ReadFile(path)
- if err != nil {
- return nil, fmt.Errorf("failed to read cloud config file in an effort to get credentials for azure key vault, error: %+v", err)
- }
-
- azureConfig := cloudAuth.AzureAuthConfig{}
- if err = yaml.Unmarshal(bytes, &azureConfig); err != nil {
- return nil, fmt.Errorf("Unmarshall error: %v", err)
- }
- return &azureConfig, nil
-}
-
-func decodePkcs12(pkcs []byte, password string) (*x509.Certificate, *rsa.PrivateKey, error) {
- privateKey, certificate, err := pkcs12.Decode(pkcs, password)
- if err != nil {
- return nil, nil, fmt.Errorf("decoding the PKCS#12 client certificate: %v", err)
- }
- rsaPrivateKey, isRsaKey := privateKey.(*rsa.PrivateKey)
- if !isRsaKey {
- return nil, nil, fmt.Errorf("PKCS#12 certificate must contain a RSA private key")
- }
-
- return certificate, rsaPrivateKey, nil
-}
diff --git a/pkg/azurekeyvault/client/authentication_test.go b/pkg/azurekeyvault/client/authentication_test.go
deleted file mode 100644
index 1fd1c743..00000000
--- a/pkg/azurekeyvault/client/authentication_test.go
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
-Copyright Sparebanken Vest
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package client
-
-import (
- "os"
- "testing"
-
- "github.com/Azure/go-autorest/autorest/azure"
-)
-
-// func TestAuthDefault(t *testing.T) {
-// creds, err := NewAzureKeyVaultCredentialsFromEnvironment()
-// if err != nil {
-// t.Error(err)
-// }
-
-// _, err = creds.
-// if err == nil {
-// t.Fail()
-// }
-// }
-
-func ensureIntegrationEnvironment(t *testing.T) {
- if os.Getenv("AKV2K8S_CLIENT_ID") == "" {
- t.Skip("Skipping integration test - no credentials")
- }
-
- os.Setenv("AZURE_CLIENT_ID", os.Getenv("AKV2K8S_CLIENT_ID"))
- os.Setenv("AZURE_CLIENT_SECRET", os.Getenv("AKV2K8S_CLIENT_SECRET"))
- os.Setenv("AZURE_TENANT_ID", os.Getenv("AKV2K8S_CLIENT_TENANT_ID"))
-}
-
-// func TestChinaCloud(t *testing.T) {
-// ensureIntegrationEnvironment(t)
-
-// os.Setenv("AZURE_ENVIRONMENT", "AzureChinaCloud")
-
-// creds, err := NewAzureKeyVaultCredentialsFromEnvironment()
-// if err != nil {
-// t.Error(err)
-// }
-
-// token := creds.(*azureKeyVaultCredentials).Token
-// err = token.Refresh()
-// if err != nil {
-// t.Error(err)
-// }
-
-// if token.Token().Resource != azure.ChinaCloud.ResourceIdentifiers.KeyVault {
-// t.Errorf("Endpoint incorrect. Expected '%s', but got '%s'", azure.ChinaCloud.ResourceIdentifiers.KeyVault, token.Token().Resource)
-// }
-// }
-
-func TestAudience(t *testing.T) {
- ensureIntegrationEnvironment(t)
-
- creds, err := NewAzureKeyVaultCredentialsFromEnvironment()
- if err != nil {
- t.Error(err)
- }
-
- token := creds.(*azureKeyVaultCredentials).Token
- err = token.Refresh()
- if err != nil {
- t.Error(err)
- }
-
- if token.Token().Resource != azure.PublicCloud.ResourceIdentifiers.KeyVault {
- t.Error()
- }
-}
diff --git a/pkg/azurekeyvault/client/certificate_test.go b/pkg/azurekeyvault/client/certificate_test.go
deleted file mode 100644
index 90ca15bd..00000000
--- a/pkg/azurekeyvault/client/certificate_test.go
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
-Copyright Sparebanken Vest
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package client
-
-import (
- "bytes"
- "encoding/base64"
- "testing"
-)
-
-var (
- pemTestCert = "-----BEGIN PRIVATE KEY-----\nMIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCvOy4KydxUOW6K\nmMhq01IAu5Rz47U1oE6ewq0Yi5ea9CrGN7eUWLOogapoKmFFhO2s5SDdPt9HOkDN\nvh75k4B7OFhM+GaOTRubXgPEg8PV7dFFS52+3C0xORdS+wvgI2i9eIMqbr1Y8Znw\n5H3pLG8DsU6Q8FCo14mvW8/ou+xKbSOzWFFaP+dNHFBCARqI+DhQYJFkeg4vPd+n\nFGxfPH/lbbR9WN0tChOTVUJlGkJlht9/0bsVmM8xAdUS/zQ6qK8nKWhLpCtWyo8z\nKDWg5gsdcMoWYgAIXpinc1NcOyGlMv263Zhw7gB+y7JEMK2Ro3e3SmhSpH48Ckej\npIsUOBNnvr514wkLNLet9sXGZvFXs7oiTkUzgu0MFsZPVAkiYhdHdYdg2I9e5t4y\nyxbu+DSr/OvRbUtC9PrO1ncJaO7p9QcXVuRNi2wxLDeaTZgd9S6M2fzR2xcwq3Fx\nk53gDlRTXgqIM/VCPA+3vp5di+MKGK7aLyNRPxeKcsDLEPHF7MeFZJw21xTupEMl\n8w5KaBd5NiKAwxbLyV8YCZFjJG3V2MOxVAA01BAm7w3lz1/iMbKiPGbDA0p3cxva\nLYs0RdcNfZ6+4X7al7vBXj8+Hwf/tADY648eBEjTqctVDirElCmjN8A0ysqldwqC\nr+8F8k8PUfR3yb809m8QURE7mEAPVQIDAQABAoIB/wTTt6Mblq75RXZL/OSX7OsH\nDahsQdS56sZ+fx44JfdmOGyaLIszeF7ZmMtINPTkhgWK/Ayb0aTnYTEO2/gkBSgI\nXRQ7TNKJ3JujeoI7Xm8uSIrYE/h6Rb9WxH7hcofay/LDZWQf8P0vqCw26o+5fckn\nwkVhYc54dcscuPWeXeM8p0IivMpQAFRpFYclDKB9tR3zx5jLj6EwFB2y8Ty06XU5\nfn8krvy+lh9Cn7amuOdFr6UpyEDfjJmB64ryGTg6k1zJd0uN5xmsqrxX0cYYKnUw\nLZftdzTqFQv0FLuQFSV6/g3S9d3CP8axbxcCnzWHMwghOtidgtTy7GZuIudCREe+\nr1OLzGHPErVw3UGSzLIbuL6P9cowF/fRAZPlV/vzR0KEfjYFavq2zmoislWxFa6g\na2oGzADbuDYcYvn/MW0o339z2fUruc+l8UlY8zOuE/Isqt+jQAX9BlPQZeBOgLF9\nTWsxH62hdF7sW8BTINkA58xz+sjuJcH09C77E5PXR8LAD6xfN+1OwKWGtHv5WkR9\n6BU4ZEpltKpX5gtoE9oDoFLc2xVEeV5EjjtvQOFGG7uqvjJhSOGDCalApUlkJqR1\n89NtVQdrwpcZ/xUGFi7HAlbLPyF6xw/sUGCYVcBlUAxvRBHkdpBHZ38JRelCuoa3\nocub+v4WP+YbM3SmnkECggEBAO6ePV02bvgk5eBJ4mLXOCTJsGQDiMLFx0SuTAkC\nt/vdGu/9W+tGp2aKQrzjAZMGbMzYYL6L0Sz+/X5SrOujREEqnxhFeIaB0hOE/CEQ\nZSa36OTRPKaTCv+kgjqpj173hYLMQjllise+uJL6a688FecqTlNw60YSVs/ohc3r\nNIzWXoCdLBztnO6IePJS8cmq9vUwlf1iJVmhtSGookcE0m7YBQA2L7HjYQ+64Rtj\nIjaKUc6XsP0CeEGpRgJWc5a2dWGhqQymnq0rElUSp/iJObNUDDh/ta5RLiEtp3I+\n/XSWjseGLxxHzdLQehGO+RD2zNjJsAJC9OatFGqZd5T9dekCggEBALv+5dF9Ber4\nDqfw6LuJPiMgjS16vUgyk0yS6Kky4jMbKEDk0kC/kAXgXqjM7WDXfNbd5LYg/q1L\nMyDp/xjCvTvYhScxL0JXG6HzHZtS4Oxi1d3wT8+Ws2gUTzdF9vPCJ4DvoKFbYraN\ndQ9iLSM0VzHTIOm4xPn/mX2LvUxOEaASbpc1lw+3ojWeLxO8ejczPtEwKp1lWW+8\nPm/WRov6f5HBZGG1Y7TlEIeyND+NLxJaGgLj86FzGwNbkqFFYI5yR4TZMlTgrjZ2\nYfDskIGYoAr8M3ZFPpZbftc+FHl6Sv3RZEp4EnIEYyJnswv18rRGyYB5FrMM5xHa\n4oysjdacbo0CggEAVnzQbRqvug1VrKfbAExVsy/PWVDWnxIkmcY7FQEBQq7vdpD0\nYiCnyEjQy7nT9kBb6xt6ZVY0KQT7SHAa8QWqVZxnMdrsRoSDakPHRwy0PQZnyZf1\nTcL6N5KfCTgwGRHKOJBkaH1fgeqk59EQeuFiZvk0jpXdEPbQtGbpKKvZzjpc4m0V\nch7FxMd+XwalUJ1BCbnkg4SxWP19s4d12hvrUfXGSj9ZpjZuFc98i/qwieg0opbk\nta/ReqsqDura1oOnpA1+QnGaDdYQvPkYHMNQQKl0DH5tkZMnDyuHB6fBIiL3+WWv\naaa0+XZK6FZT/EwYD3N68jbmoT2WqtSZPU1pEQKCAQAJIW0qCodyDRAxKeszyIuj\nCx6wOcjdq88ppez04srHrqb61+I6UNN+5ZHTYviYfn7KtMY57kpQQlm+XH8ORc8J\nDBATgjkIYNCvwe4LMDBKatZ2TAikTW5zPKFITvaaijB++6RykcyujxpDYAJPNmiR\nu+5aS6YNelOLHHFaNmR2wM5sO6cVlVakggVJURsieTOw10UKlfSND7h8mAyfGdB+\nVMU6VaP9Ei8GWCpfd8z0eDnRMB8SFVQXiqgJeyQgZv6APkhKhQsRDBjfqa2vDamg\nPvWE5gIPLWxwqcw2xjDEORpE36YNsZbbAexZRV2/UbzRp4/prFPAsz/Tk0HkTX61\nAoIBAQC/Ei4aCdAAj6S6+I3nTCI1RbuLN+CiyIMZCdgzkcFeoA8Y0hNLyQXuBi8J\nOz0aQFr+luSTVztsoGvCfdFY3xFs5EHGSTg4AN94H154CE75qPIX7RGk0V5WbJlb\nqg/IvAnxyx/eJKbbNwALoeBlW8kDmwOdLBDiOCmLPORJkkUz91/jxtNZgc+wpjc+\ngkHPGCa1cOMWrUlk2JfWwqwFirjDsw0ONduDH+985a9I3Lqy/3fPSkiO6sTN+knA\ntkjaiXmKTeZpN4YNYejbb2r2a6+saa4wj6QuOMa7shO0k/nge5PjpqrYP5IBSRMz\nk125vXj8DvpA/GTS1kARDjKz8dET\n-----END PRIVATE KEY-----\n-----BEGIN CERTIFICATE-----\nMIIFUjCCAzqgAwIBAgIQFwNmpFLpQLWUtRrCdyrn0TANBgkqhkiG9w0BAQsFADAm\nMSQwIgYDVQQDExtjdW11bHVzLXRlc3QtY2VydC5zcHZlc3Qubm8wHhcNMTkwMjAx\nMTUzNjMxWhcNMTkwMzAxMTU0NjMxWjAmMSQwIgYDVQQDExtjdW11bHVzLXRlc3Qt\nY2VydC5zcHZlc3Qubm8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCv\nOy4KydxUOW6KmMhq01IAu5Rz47U1oE6ewq0Yi5ea9CrGN7eUWLOogapoKmFFhO2s\n5SDdPt9HOkDNvh75k4B7OFhM+GaOTRubXgPEg8PV7dFFS52+3C0xORdS+wvgI2i9\neIMqbr1Y8Znw5H3pLG8DsU6Q8FCo14mvW8/ou+xKbSOzWFFaP+dNHFBCARqI+DhQ\nYJFkeg4vPd+nFGxfPH/lbbR9WN0tChOTVUJlGkJlht9/0bsVmM8xAdUS/zQ6qK8n\nKWhLpCtWyo8zKDWg5gsdcMoWYgAIXpinc1NcOyGlMv263Zhw7gB+y7JEMK2Ro3e3\nSmhSpH48CkejpIsUOBNnvr514wkLNLet9sXGZvFXs7oiTkUzgu0MFsZPVAkiYhdH\ndYdg2I9e5t4yyxbu+DSr/OvRbUtC9PrO1ncJaO7p9QcXVuRNi2wxLDeaTZgd9S6M\n2fzR2xcwq3Fxk53gDlRTXgqIM/VCPA+3vp5di+MKGK7aLyNRPxeKcsDLEPHF7MeF\nZJw21xTupEMl8w5KaBd5NiKAwxbLyV8YCZFjJG3V2MOxVAA01BAm7w3lz1/iMbKi\nPGbDA0p3cxvaLYs0RdcNfZ6+4X7al7vBXj8+Hwf/tADY648eBEjTqctVDirElCmj\nN8A0ysqldwqCr+8F8k8PUfR3yb809m8QURE7mEAPVQIDAQABo3wwejAOBgNVHQ8B\nAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH\nAwIwHwYDVR0jBBgwFoAUlJOHnXHhHeY+AjaPPmKFVRw3K1MwHQYDVR0OBBYEFJST\nh51x4R3mPgI2jz5ihVUcNytTMA0GCSqGSIb3DQEBCwUAA4ICAQAn/chFtfLEebP5\n5Tmb+H+eEzOXaHRonUsVriV/66htOeffkNX2b2DOIosvSwKukOkVggLFmyMKhxiq\neZkkAYyMMjjtWqbkCwoCyb8iDUQLaEovy4Pzwpm3YMVK9+o6cIf4zs3AgzaSSpbo\npq8HQbmFGrUGNEyGMclvf5VL1vCw+0jLpJ1+9b79DRY7puPG19zwWWcHk2hNV3aD\n6lWar7/pjqA9ESQhDTeUsXaFMGVm0Ez97IDI/ZVO+ia5+rIo5wAcUGKuYLIs57Wl\ndhlzMil3mz2g4STiWI+VhtPnqPot6MaWuKIN4R+kJocN365WJf2wozYgEjNFANK+\n3hO396cieWBTqyoYYZRxDxz7slD5NikixrJd50QshYCzqKiNopKsafqMHqc3JKZu\nz9tBZ25g43vdSuAwxjSab5DyYGF3Z447jdKOLUYReNnoB7nlTuW5LYfOX20F/XtC\n+4iL+IDjtAfwATruKzbLnKL9IoemLs7XMoW2qYBmCAcfHrI2F3alAar2XTA9lkDR\nMPpJf9q3VzxkPhjlvi8RPJfWLD1Kw4gMVfhao/NQv3SlhQ2rBpczP8XQOWdTNWp/\n043EPQis8+56AEHis/5+NKoNcQYZJwu2uwK0fdILcStJXR//EI04zBzWo/ULe5nc\nU0GaEMA+K/ZUHV2BxSMA3Br0IwdNvg==\n-----END CERTIFICATE-----\n"
- pfxTestCert = "MIIKXAIBAzCCChwGCSqGSIb3DQEHAaCCCg0EggoJMIIKBTCCBhYGCSqGSIb3DQEHAaCCBgcEggYDMIIF/zCCBfsGCyqGSIb3DQEMCgECoIIE/jCCBPowHAYKKoZIhvcNAQwBAzAOBAitiIQWXFmG+AICB9AEggTYkpNC/etn5MKpS1Afffn97rGgijDgBQBT4Lh5mFxQrlm6ElGljqV0z5opIasRH5c4hG2E4k+c4O9RgPNZJ/4Jv3ZU/0Cp66PwBrsmNatAtddOnHp8N4643SYnRVVY2GuUr7ty7a2c5kiPc6htXIIUe8zKWEGt+7Fvh6AsZt9ACEmEsdSiRJaUSJ28HHYcU//t2ZUZiUu90YnMaQH8kO7KezDyBueftEnBploUgiRp3WfQLn+leRkbBuFQL0vENznkTe9d+7+Z8pJMn7TsZ+wOVd0t1kr2mEdJvYeRbcZU0n1vHzYPj4TGy4SuQz8CxQtIqEpy8FD1zSlvokrbEKrYnQinRd205SQXYwZ8Mp9ysDoSbULIkvto8bKAKVJc6J1Tlhdkof14aU57ruIdAFyuwJPeZqB2Z7HXVTsfw0AiJimwrSf86s6J0E5UcVNWZ6cGgW+XuDSuy+k6nVx+oI4MbRn0e/McyB+YgD37OyE8ivSrkv3OQRStV4SiZw8KPwgX613W0v/ZSSnZKfoMZoZ6SbLm1V0TmGUXEtc6KiyaR22SF8OlgWLVQp4FAAyX0VPtYLMuIpuV+rZVcJSLrW8XzxLShJ0HK9FZnSPU93dyorUAWMnsujunS0H/hEar9agJHbFOcGQpQ+aQhtIsCf39Wx6S6h1ttGIyvT3RUEjouQDrLKReTvGL3ZSnAwIPg5naU1Cw4zXOr86o4inZ5RHpiyuv0AmSMkgtQG0lBZLrFORe3cHE3dWDjx8rSy0+SYmhK/qyBpDX1WOOiKf4saW2sr8f1UBizGOJybqHJKd/u4tmZgWg1s5wDISCo0dPBwGCDa6bPJhJaEU8NhCHxMbMrWpw9H7FzMzxNlYh7LDjVYlRI6taUbwSV+K9wNWM3uvzaIShFrUtgF6Q7CbGOjZersfaGqs5KusEX7pTeL3V8oyDlhLcaKTiHUP/9r0ce24wVdiU1hAaobmjaZQKVmhcfCo64mjo/+7YYD77hWc6WwTMlXBbtpzyRjDw/evsjNZl6is8UPV6o1mhSFFh6M6wxp5gdgwgQhBw8ntoz9iteykyVjHHnNJYwCqMtJTOxxAtApQhQuGbPqboNGlIV2jPSWlpkVZHCKlNkgr72ImfGZ3vO1g1x6v+eDIqCQE7VHqhTQAfbc5hBT/NdMt6IVrS9tGBjnZ+jgsB9tIyuc6WrgWCvJJRVsBK1McnMjBrJdpdGqiDInePgiPtjdFCa6sHGlnP+kBrzBndMTKdfBS1kGFS3BR7ouIqD0o5QFgPSoJWPUOGqQRJcgvmZpRzflwJDYITjM6TjhQXKiHXJMGaH8SaVUBD0rIle0z4tMsopDRrM7pzGnySfAe7x3h7hC0qlATMpwTfXXOPgsRTnZYyN9gBc1mUy2oMoQcVRGHPs3PMlamh7slsQTyw7JZhuEKlM0W9LmmuJkoDVEX262yMm3Tv9+Pm18T88wP07/USYr0RRREYlhgCSGlaWlC5Zi1sWpu2XXPDA6zFCeYDFpoCMCpOVhXKBHQ9+JTvRcyp6ajyyRfODRep20Zzvm9infiLJgnLj4gzwq9RCiQyy9s6o28no+v5ru7b4Pfx0WRYhZ0livtO6qW9M25DN3BtBW+WfSD3X36lyNlDS7WE8XcjOuusYh4EG3446DGB6TATBgkqhkiG9w0BCRUxBgQEAQAAADBXBgkqhkiG9w0BCRQxSh5IAGIANgA0AGIAZgBlAGYAZQAtADUAYQBkADgALQA0ADIAYQA5AC0AYQBlAGUANgAtADEAMAAyAGQAMwA0ADkANQBmADYAYQAyMHkGCSsGAQQBgjcRATFsHmoATQBpAGMAcgBvAHMAbwBmAHQAIABFAG4AaABhAG4AYwBlAGQAIABSAFMAQQAgAGEAbgBkACAAQQBFAFMAIABDAHIAeQBwAHQAbwBnAHIAYQBwAGgAaQBjACAAUAByAG8AdgBpAGQAZQByMIID5wYJKoZIhvcNAQcGoIID2DCCA9QCAQAwggPNBgkqhkiG9w0BBwEwHAYKKoZIhvcNAQwBBjAOBAjig8t9WhrDRQICB9CAggOgoWgXYnekRNjecBTVd+DN++3HBAN/YpexIG7GYXoXOZeoC1fy6A81vqqbD/fm21pe/NUXdipc+VQL2dLEIqiO/6/TXugLYDfwxZiv7OHtqoEYKjzWwyDncjLX2lhr83nEfEn8kNfvv2jYbxiJT1VxlJyp8DwkUQeu5/DdqPYSbiDi0jHvwDejnD78hhjb5tCEF5SUFdAZkOnWY8kokCz+iLOH+SKsKCN3mLcsi9rBG4FG9zUrLwJdirKeS/qH8UTtDDv2KEABKNKxQoSBoIqP9mMB7MnCK01gIqdnuiDFrUSSvpV8AsgdMpONckYqO7MtW49GbiJtP9RJRWyvzWM4B9s8jQGyh/ya8PNCq3WHZhocgJsgzLSJ0IhC65o1pgZKWpVIlQAK9E995woFnlgAg7eM1uNUsLVJWmmoUrRHwQ6+cvO+dKcyvBCGzNDL4w/0NlFiXm1ohNYaw+mKKCI80WZfGv/xCA+vsv1215vP0tNguQq0jdTMRFNpfae/ELXVGi6Me2zZMO35M2R69b2EgMcTJm6xFbtC6CvmrJ3Jz0xedd5GqPsx2hoNPJv0ZxdlJ2jJ7qgnXrP8W3kuEeZ+Iebv4o1PllbMA26nFHjzaYgL4aTLhw10B/rzS58GkOpOvNa06YCSGPEFRCDXYpFKO9aukchVDWNJnoQZRm2sIZbmaYupDXiABoXGn8N83KONKFHlHBZDJHz9UYmKEBfQDZJqftPaE6KYk7O3EDsjrZDJ6e5h26N/S6FfHBhg7mimk6ddjIoewuLeIzkNbbBbocZalMN8SfndwPwzqPzTsf/BHqx2vfhjRzTBqlcAyK/iacm6JQrQvmPQ607rf+p0FSnhJ3N4r6uVsDO7eKFApgEkLf+d3pKm0xTkIOS4wR2sPEdfSUqrvHY6vk+vH28cVV5WYy6moTX7+jRjT7V0lRo/xlChK9gL7I3eQ5XEpecGb2kpDCPj03wckF2r0shllccpWhgwIIX7A4Mat/HcMpW3Wo0z7m0JBcyhoiQn1Qbeiprz4NSXaZsZwdFespUZUYpgZ/YcuAIMPrke4gzX0XUyo9oWrgaCn0GwRlLXJe73RalNcqlqnGA9YxUFw6isGRQ1HL3o4V1QvPm8L/1SxFo017POjJPo1iBLh1c+GrGnTQysxGAGsDRqnQ0PGmjdr9R8N0NbXgX8EuX+MQFqpGUG12iE858qyAMbNIG0z4ffb52ZPJiqZlLzAwjlb3NEFDA3MB8wBwYFKw4DAhoEFJkApCbJI2XJPgLExmqMwm8AB+HsBBRGaxl3i7EiC81hxCgO4aBlPKWrKA=="
- derTestCert = "MIIDPjCCAiagAwIBAgIQJVHUTfH7TVCyXO649HajejANBgkqhkiG9w0BAQsFADAcMRowGAYDVQQDExFjdW11bHVzLnNwdmVzdC5ubzAeFw0xOTAyMDQxNDE0NTZaFw0xOTAzMDQxNDI0NTZaMBwxGjAYBgNVBAMTEWN1bXVsdXMuc3B2ZXN0Lm5vMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsCYvQCbABVTAUx8G8Lg7SiNzRHCxaTPG8qp5La+SfnSPAX80u3EpVZc84vYGE9QlGWth1LmhHXfGneTAq7yMRYiBFNc0Y9O+66eZDuIErQ7RDL7N7TSyMzoXgH1xhI14x0XvkZqJwaNqJBvBzSlADNWuKBvPQ2nChKlnjuY3Zrg9KJ1A5T1KF/UW4ZKSZrwyu0fyAzfpBMWkrHa+mYv1wSL0cVDOFGvZIldCMew0gXGHY4ydM0iTW878/epTNQNgeno9M4jnFUXyoVguSH8ZjsFXBOtenIUJWoJs72zHJn5yNz2Bipu0zVrHBJXLi40FBY913/t1X5iBj7WejzUXmQIDAQABo3wwejAOBgNVHQ8BAf8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHwYDVR0jBBgwFoAUZptBMgsn6JCzZp4So23dBSdWfcowHQYDVR0OBBYEFGabQTILJ+iQs2aeEqNt3QUnVn3KMA0GCSqGSIb3DQEBCwUAA4IBAQAbvqmrDHz6UXbddj/VYWO/m2m5Hm2cudMfInuwnGuOzO0MtKYthkELTu+CirlQjyMya/iLKb/SZ3hRQwyJP4XBWqUm2uaTHfbrv4gpc/hMQ80n8f6hOBofLrEPogaYNGHhWMjSJXj3nDKrp2cDyusTnQkLQWaix0c2GLIif3UfGJBgptUwMgsx1kaiCzbyBW/Kv8BiQSA82ocXqqxAzHBGfKhLHZZXPdoTgEE+vwwPLM1wzvhDzDAkR96/yCwGBr53dUeXXCUh70IiJbJpGNiVc33QEVYw0+Gua7rj99LK4EljlY1E1xbPadSFYeK9KsDlmb9ota2p7iKg1D1JiydK"
-)
-
-func TestImportPfx(t *testing.T) {
- pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert)
- cert, err := NewCertificateFromPfx(pfxRaw)
- if err != nil {
- t.Error(err)
- }
- if !cert.HasPrivateKey {
- t.Error("Certificate has no private key")
- }
- if cert.PrivateKeyType != CertificateKeyTypeRsa {
- t.Errorf("Certificate type is incorrect. Exprected '%s', but got '%s'", CertificateKeyTypeRsa, cert.PrivateKeyType)
- }
- if cert.PrivateKeyRsa == nil {
- t.Error("Private key for RSA is nil")
- }
- if len(cert.Certificates) != 1 {
- t.Errorf("Expected 1 public certificate, but found %d", len(cert.Certificates))
- }
-}
-
-func TestImportPem(t *testing.T) {
- cert, err := NewCertificateFromPem(pemTestCert)
- if err != nil {
- t.Error(err)
- }
- if !cert.HasPrivateKey {
- t.Error("Certificate has no private key")
- }
- if cert.PrivateKeyType != CertificateKeyTypeRsa {
- t.Errorf("Certificate type is incorrect. Exprected '%s', but got '%s'", CertificateKeyTypeRsa, cert.PrivateKeyType)
- }
- if cert.PrivateKeyRsa == nil {
- t.Error("Private key for RSA is nil")
- }
- if len(cert.Certificates) != 1 {
- t.Errorf("Expected 1 public certificate, but found %d", len(cert.Certificates))
- }
-}
-
-func TestImportDer(t *testing.T) {
- certRaw, _ := base64.StdEncoding.DecodeString(derTestCert)
- cert, err := NewCertificateFromDer(certRaw)
- if err != nil {
- t.Error(err)
- }
- if cert.HasPrivateKey {
- t.Error("Certificate should be public with no private key")
- }
- if len(cert.Certificates) != 1 {
- t.Errorf("Expected 1 public certificate, but found %d", len(cert.Certificates))
- }
-}
-
-func TestGetPrivateKeyPem(t *testing.T) {
- pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert)
- cert, err := NewCertificateFromPfx(pfxRaw)
- if err != nil {
- t.Error(err)
- }
- pemCert, err := cert.ExportPrivateKeyAsPem()
- if err != nil {
- t.Error(err)
- }
-
- if len(pemCert) == 0 {
- t.Error("Pem is empty")
- }
-}
-
-func TestGetPublicKeyPem(t *testing.T) {
- pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert)
- cert, err := NewCertificateFromPfx(pfxRaw)
- if err != nil {
- t.Error(err)
- }
- pemCert, err := cert.ExportPublicKeyAsPem()
- if err != nil {
- t.Error(err)
- }
-
- if len(pemCert) == 0 {
- t.Error("Pem is empty")
- }
-}
-
-func TestGetRawCert(t *testing.T) {
- pfxRaw, _ := base64.StdEncoding.DecodeString(pfxTestCert)
- cert, err := NewCertificateFromPfx(pfxRaw)
- if err != nil {
- t.Error(err)
- }
- rawCert := cert.ExportRaw()
- if err != nil {
- t.Error(err)
- }
-
- if !bytes.Equal(pfxRaw, rawCert) {
- t.Error("Original cert does not match exported raw cert")
- }
-}
diff --git a/pkg/docker/registry/container.go b/pkg/docker/registry/container.go
new file mode 100644
index 00000000..971e65b2
--- /dev/null
+++ b/pkg/docker/registry/container.go
@@ -0,0 +1,248 @@
+// Copyright © 2019 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Note: Code is based on bank-vaults from Banzai Cloud
+// (https://github.com/banzaicloud/bank-vaults)
+
+package registry
+
+import (
+ "context"
+ "encoding/base64"
+ "encoding/json"
+ "fmt"
+ "os"
+ "strings"
+
+ "emperror.dev/errors"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/azure/credentialprovider"
+ corev1 "k8s.io/api/core/v1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/client-go/kubernetes"
+ "k8s.io/klog/v2"
+)
+
+// K8s structure keeps information retrieved from POD definition
+type ContainerInfo struct {
+ clientset kubernetes.Interface
+ Namespace string
+ ImagePullSecrets string
+ RegistryAddress string
+ RegistryName string
+ Image string
+ RegistryUsername string
+ RegistryPassword string
+}
+
+// Collect reads information from k8s and load them into the structure
+func (k *ContainerInfo) Collect(container *corev1.Container, podSpec *corev1.PodSpec, cloudConfigPath string) error {
+ k.Image = k.fixDockerHubImage(container.Image)
+
+ var err error
+ found := false
+ // Check for registry credentials in imagePullSecrets attached to the pod
+ // ImagePullSecrets attached to ServiceAccounts do not have to be considered
+ // explicitly as ServiceAccount ImagePullSecrets are automatically attached
+ // to a pod.
+ for _, imagePullSecret := range podSpec.ImagePullSecrets {
+ found, err = k.checkImagePullSecret(k.Namespace, imagePullSecret.Name)
+ if err != nil {
+ return err
+ }
+
+ if found {
+ klog.InfoS("found credentials for registry in imagePullSecrets", "registry", k.RegistryName, "namespace", k.Namespace, "pullSecret", imagePullSecret.Name)
+ break
+ }
+ }
+
+ // In case of other docker registry
+ if k.RegistryName == "" && k.RegistryAddress == "" {
+ registryName := container.Image
+ if strings.HasPrefix(registryName, "https://") {
+ registryName = strings.TrimPrefix(registryName, "https://")
+ }
+
+ registryName = strings.Split(registryName, "/")[0]
+ k.RegistryName = registryName
+ k.RegistryAddress = fmt.Sprintf("https://%s", registryName)
+ }
+
+ // Clean registry from image
+ k.Image = strings.TrimPrefix(k.Image, fmt.Sprintf("%s/", k.RegistryName))
+
+ if !found {
+ // if still no credentials and it is an ACR image, try to get credentials from Azure
+ if found, err = getAcrCredentials(k, cloudConfigPath); err != nil {
+ return err
+ }
+
+ if !found {
+ klog.InfoS("found no credentials for registry, assuming it is public", "registry", k.RegistryAddress)
+ }
+ }
+ return nil
+}
+
+func (k *ContainerInfo) checkImagePullSecret(namespace string, secret string) (bool, error) {
+ data, err := k.readDockerSecret(namespace, secret)
+ if err != nil {
+ return false, errors.Wrapf(err, "cannot read imagePullSecret %s.%s", secret, namespace)
+ }
+
+ var dockercfg []byte
+ keys := []string{corev1.DockerConfigJsonKey, corev1.DockerConfigKey}
+ for _, key := range keys {
+ if dockercfg = data[key]; dockercfg != nil {
+ break
+ }
+ }
+
+ if dockercfg == nil {
+ return false, errors.Errorf("cannot find any dockercfg key %v in imagePullSecret: %s.%s", keys, secret, namespace)
+ }
+
+ var dockerCreds DockerCreds
+ err = json.Unmarshal(dockercfg, &dockerCreds)
+ if err != nil {
+ return false, errors.Wrap(err, "cannot unmarshal docker configuration from imagePullSecret")
+ }
+
+ found, err := k.parseDockerConfig(dockerCreds)
+ return found, err
+}
+
+func getAcrCredentials(k *ContainerInfo, cloudConfigPath string) (bool, error) {
+ //Check if cloud config file exists
+ _, err := os.Stat(cloudConfigPath)
+ if err != nil {
+ return false, nil
+ }
+
+ f, err := os.Open(cloudConfigPath)
+ if err != nil {
+ return false, fmt.Errorf("Failed reading azure config from %s, error: %w", cloudConfigPath, err)
+ }
+ defer f.Close()
+
+ cloudCnfProvider, err := credentialprovider.NewFromCloudConfig(f)
+ if err != nil {
+ return false, fmt.Errorf("Failed reading azure config from %s, error: %w", cloudConfigPath, err)
+ }
+
+ if cloudCnfProvider.IsAcrRegistry(k.RegistryAddress) {
+ cred, err := cloudCnfProvider.GetAcrCredentials(k.Image)
+ if err != nil {
+ return false, fmt.Errorf("failed getting azure acr credentials, error: %w", err)
+ }
+
+ klog.V(4).InfoS("found acr credentials to use in cloud config for docker image", "image", k.Image)
+ k.RegistryUsername = cred.Username
+ k.RegistryPassword = cred.Password
+ return true, nil
+ }
+
+ klog.V(4).InfoS("no acr credentials found", "registry", k.RegistryAddress)
+ return false, nil
+}
+
+func (k *ContainerInfo) readDockerSecret(namespace, secretName string) (map[string][]byte, error) {
+ secret, err := k.clientset.CoreV1().Secrets(namespace).Get(context.TODO(), secretName, metav1.GetOptions{})
+ if err != nil {
+ return nil, err
+ }
+ return secret.Data, nil
+}
+
+func (k *ContainerInfo) parseDockerConfig(dockerCreds DockerCreds) (bool, error) {
+ for registryName, registryAuth := range dockerCreds.Auths {
+ if strings.HasPrefix(registryName, "https://") {
+ registryName = strings.TrimPrefix(registryName, "https://")
+ }
+
+ // kubectl create secret docker-registry for DockerHub creates
+ // registry credentials with API version suffixes, trim it!
+ if strings.HasSuffix(registryName, "/v1/") {
+ registryName = strings.TrimSuffix(registryName, "/v1/")
+ } else if strings.HasSuffix(registryName, "/v2/") {
+ registryName = strings.TrimSuffix(registryName, "/v2/")
+ }
+
+ registryName = strings.TrimSuffix(registryName, "/")
+
+ if strings.HasPrefix(k.Image, registryName) {
+ k.RegistryName = registryName
+ if registryAuth.ServerAddress != "" {
+ k.RegistryAddress = registryAuth.ServerAddress
+ } else {
+ k.RegistryAddress = fmt.Sprintf("https://%s", registryName)
+ }
+ if len(registryAuth.Username) > 0 && len(registryAuth.Password) > 0 {
+ // auths..username and auths..username are present
+ // in the config.json, use them
+ k.RegistryUsername = registryAuth.Username
+ k.RegistryPassword = registryAuth.Password
+ } else if len(registryAuth.Auth) > 0 {
+ // auths..username and auths..username are not present
+ // in the config.json, fall back to the base64 encoded auths..auth field
+ // The registry.Auth field contains a base64 encoded string of the format :
+ decodedAuth, err := base64.StdEncoding.DecodeString(registryAuth.Auth)
+ if err != nil {
+ return false, errors.Wrapf(err, "failed to decode auth field for registry %s", registryName)
+ }
+ auth := strings.Split(string(decodedAuth), ":")
+ if len(auth) != 2 {
+ return false, errors.Errorf("unexpected number of elements in auth field for registry %s: %d (expected 2)", registryName, len(auth))
+ }
+ // decodedAuth is something like ":xxx"
+ if len(auth[0]) <= 0 {
+ return false, errors.Errorf("username element of auth field for registry %s missing", registryName)
+ }
+ // decodedAuth is something like "xxx:"
+ if len(auth[1]) <= 0 {
+ return false, errors.Errorf("password element of auth field for registry %s missing", registryName)
+ }
+ k.RegistryUsername = auth[0]
+ k.RegistryPassword = auth[1]
+ } else {
+ // the auths section has an entry for the registry, but it neither contains
+ // username/password fields nor an auth field, fail
+ return false, errors.Errorf("found %s in imagePullSecrets but it contains no usable credentials; either username/password fields or an auth field are required", registryName)
+ }
+
+ return true, nil
+ }
+ }
+
+ return false, nil
+}
+
+func (k *ContainerInfo) fixDockerHubImage(image string) string {
+ slash := strings.Index(image, "/")
+ if slash == -1 { // Is it a DockerHub library repository?
+ image = "index.docker.io/library/" + image
+ } else if !strings.Contains(image[:slash], ".") { // DockerHub organization names can't contain '.'
+ image = "index.docker.io/" + image
+ } else if strings.HasPrefix(image, "docker.io/") {
+ image = "index." + image
+ } else {
+ return image
+ }
+
+ // if in the end there is no RegistryAddress defined it should be a public DockerHub repository
+ k.RegistryAddress = "https://index.docker.io"
+ k.RegistryName = "index.docker.io"
+
+ return image
+}
diff --git a/pkg/docker/registry/registry.go b/pkg/docker/registry/registry.go
new file mode 100644
index 00000000..8a5149c5
--- /dev/null
+++ b/pkg/docker/registry/registry.go
@@ -0,0 +1,107 @@
+// Copyright © 2019 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Note: Code is based on bank-vaults from Banzai Cloud
+// (https://github.com/banzaicloud/bank-vaults)
+
+package registry
+
+import (
+ "encoding/json"
+ "io/ioutil"
+ "strings"
+
+ "emperror.dev/errors"
+ dockerTypes "github.com/docker/docker/api/types"
+ "github.com/heroku/docker-registry-client/registry"
+ imagev1 "github.com/opencontainers/image-spec/specs-go/v1"
+ corev1 "k8s.io/api/core/v1"
+ "k8s.io/client-go/kubernetes"
+)
+
+type DockerCreds struct {
+ Auths map[string]dockerTypes.AuthConfig `json:"auths"`
+}
+
+// GetImageConfig returns entrypoint and command of container
+func GetImageConfig(clientset kubernetes.Interface, namespace string, container *corev1.Container, podSpec *corev1.PodSpec, cloudConfigPath string) (*imagev1.ImageConfig, error) {
+ containerInfo := ContainerInfo{Namespace: namespace, clientset: clientset}
+
+ err := containerInfo.Collect(container, podSpec, cloudConfigPath)
+ if err != nil {
+ return nil, err
+ }
+
+ imageConfig, err := getImageBlob(containerInfo)
+ return imageConfig, err
+}
+
+// GetImageBlob download image blob from registry
+func getImageBlob(container ContainerInfo) (*imagev1.ImageConfig, error) {
+ imageName, reference := parseContainerImage(container.Image)
+
+ hub, err := registry.New(container.RegistryAddress, container.RegistryUsername, container.RegistryPassword)
+ if err != nil {
+ return nil, errors.Wrap(err, "cannot create client for doker registry")
+ }
+
+ manifest, err := hub.ManifestV2(imageName, reference)
+ if err != nil {
+ return nil, errors.Wrap(err, "cannot download manifest for docker image")
+ }
+
+ reader, err := hub.DownloadBlob(imageName, manifest.Config.Digest)
+ if err != nil {
+ return nil, errors.Wrap(err, "cannot download blob from docker manifest")
+ }
+
+ defer reader.Close()
+
+ b, err := ioutil.ReadAll(reader)
+ if err != nil {
+ return nil, errors.Wrap(err, "cannot read blob from docker manifest")
+ }
+
+ var imageMetadata imagev1.Image
+ err = json.Unmarshal(b, &imageMetadata)
+ if err != nil {
+ return nil, errors.Wrap(err, "cannot unmarshal BlobResponse JSON from docker manifest")
+ }
+
+ return &imageMetadata.Config, nil
+}
+
+// parseContainerImage returns image and reference
+func parseContainerImage(image string) (string, string) {
+ var split []string
+
+ if strings.Contains(image, "@") {
+ split = strings.SplitN(image, "@", 2)
+ subsplit := strings.SplitN(split[0], ":", 2)
+ if len(subsplit) > 1 {
+ split[0] = subsplit[0]
+ }
+ } else {
+ split = strings.SplitN(image, ":", 2)
+ }
+
+ imageName := split[0]
+ reference := "latest"
+
+ if len(split) > 1 {
+ reference = split[1]
+ }
+
+ return imageName, reference
+}
diff --git a/pkg/docker/registry/regitstry_test.go b/pkg/docker/registry/regitstry_test.go
new file mode 100644
index 00000000..6f58b908
--- /dev/null
+++ b/pkg/docker/registry/regitstry_test.go
@@ -0,0 +1,129 @@
+// Copyright © 2019 Sparebanken Vest
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Note: Code is based on bank-vaults from Banzai Cloud
+// (https://github.com/banzaicloud/bank-vaults)
+
+package registry
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ corev1 "k8s.io/api/core/v1"
+)
+
+func TestParsingRegistryAddress(t *testing.T) {
+ tests := []struct {
+ container *corev1.Container
+ podSpec *corev1.PodSpec
+ registryAddress string
+ }{
+ {
+ container: &corev1.Container{
+ Image: "foo:bar",
+ },
+ podSpec: &corev1.PodSpec{},
+ registryAddress: "https://index.docker.io",
+ },
+ {
+ container: &corev1.Container{
+ Image: "foo",
+ },
+ podSpec: &corev1.PodSpec{},
+ registryAddress: "https://index.docker.io",
+ },
+ {
+ container: &corev1.Container{
+ Image: "library/foo:latest",
+ },
+ podSpec: &corev1.PodSpec{},
+ registryAddress: "https://index.docker.io",
+ },
+ {
+ container: &corev1.Container{
+ Image: "index.docker.io/foo:latest",
+ },
+ podSpec: &corev1.PodSpec{},
+ registryAddress: "https://index.docker.io",
+ },
+ {
+ container: &corev1.Container{
+ Image: "foo:bar",
+ },
+ podSpec: &corev1.PodSpec{},
+ registryAddress: "https://index.docker.io",
+ },
+ {
+ container: &corev1.Container{
+ Image: "docker.io/foo:bar",
+ },
+ podSpec: &corev1.PodSpec{},
+ registryAddress: "https://index.docker.io",
+ },
+ {
+ container: &corev1.Container{
+ Image: "docker.pkg.github.com/banzaicloud/bank-vaults/vault-env:0.6.0",
+ },
+ podSpec: &corev1.PodSpec{},
+ registryAddress: "https://docker.pkg.github.com",
+ },
+ }
+
+ for _, test := range tests {
+ containerInfo := ContainerInfo{}
+
+ err := containerInfo.Collect(test.container, test.podSpec, "")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ assert.Equal(t, test.registryAddress, containerInfo.RegistryAddress)
+ }
+}
+
+func TestParseContainerImage(t *testing.T) {
+ tests := []struct {
+ image string
+ repo string
+ tag string
+ }{
+ {
+ image: "docker-repo.banana.xyz/testing/skaffold-python-example:508954f-dirty@sha256:96b77fc06c9cbd5227eb8538020c6e458a259d17ccb2ec1aea5fe8261a61fff7",
+ repo: "docker-repo.banana.xyz/testing/skaffold-python-example",
+ tag: "sha256:96b77fc06c9cbd5227eb8538020c6e458a259d17ccb2ec1aea5fe8261a61fff7",
+ },
+ {
+ image: "docker-repo.banana.xyz/testing/skaffold-python-example@sha256:96b77fc06c9cbd5227eb8538020c6e458a259d17ccb2ec1aea5fe8261a61fff7",
+ repo: "docker-repo.banana.xyz/testing/skaffold-python-example",
+ tag: "sha256:96b77fc06c9cbd5227eb8538020c6e458a259d17ccb2ec1aea5fe8261a61fff7",
+ },
+ {
+ image: "alpine:latest",
+ repo: "alpine",
+ tag: "latest",
+ },
+ {
+ image: "alpine",
+ repo: "alpine",
+ tag: "latest",
+ },
+ }
+
+ for _, test := range tests {
+ repo, tag := parseContainerImage(test.image)
+ assert.Equal(t, test.repo, repo, test.image)
+ assert.Equal(t, test.tag, tag, test.image)
+ }
+}
diff --git a/pkg/k8s/apis/azurekeyvault/v1/doc.go b/pkg/k8s/apis/azurekeyvault/v1/doc.go
index b3b9b514..89d05a88 100644
--- a/pkg/k8s/apis/azurekeyvault/v1/doc.go
+++ b/pkg/k8s/apis/azurekeyvault/v1/doc.go
@@ -15,7 +15,7 @@ limitations under the License.
*/
// +k8s:deepcopy-gen=package
-// +groupName=azurekeyvault.spv.no
+// +groupName=keyvault.azure.spv.no
// Package v1 is the v1 version of the API.
package v1
diff --git a/pkg/k8s/apis/azurekeyvault/v1/types.go b/pkg/k8s/apis/azurekeyvault/v1/types.go
index 72cbbdd1..65ead137 100644
--- a/pkg/k8s/apis/azurekeyvault/v1/types.go
+++ b/pkg/k8s/apis/azurekeyvault/v1/types.go
@@ -96,6 +96,7 @@ type AzureKeyVaultOutputSecret struct {
// +optional
Type corev1.SecretType `json:"type,omitempty"`
DataKey string `json:"dataKey"`
+ ChainOrder string `json:"chainOrder"`
}
// AzureKeyVaultSecretStatus is the status for a AzureKeyVaultSecret resource
diff --git a/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go
index 78d54d89..e3668785 100644
--- a/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go
+++ b/pkg/k8s/apis/azurekeyvault/v1/zz_generated.deepcopy.go
@@ -130,7 +130,7 @@ func (in *AzureKeyVaultSecret) DeepCopyObject() runtime.Object {
func (in *AzureKeyVaultSecretList) DeepCopyInto(out *AzureKeyVaultSecretList) {
*out = *in
out.TypeMeta = in.TypeMeta
- out.ListMeta = in.ListMeta
+ in.ListMeta.DeepCopyInto(&out.ListMeta)
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]AzureKeyVaultSecret, len(*in))
diff --git a/pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go b/pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go
index 5f42e1de..02acd27e 100644
--- a/pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go
+++ b/pkg/k8s/apis/azurekeyvault/v1alpha1/doc.go
@@ -15,7 +15,7 @@ limitations under the License.
*/
// +k8s:deepcopy-gen=package
-// +groupName=azurekeyvault.spv.no
+// +groupName=keyvault.azure.spv.no
// Package v1 is the v1 version of the API.
package v1alpha1
diff --git a/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go
index 7e9e68c7..40bc74b4 100644
--- a/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/k8s/apis/azurekeyvault/v1alpha1/zz_generated.deepcopy.go
@@ -130,7 +130,7 @@ func (in *AzureKeyVaultSecret) DeepCopyObject() runtime.Object {
func (in *AzureKeyVaultSecretList) DeepCopyInto(out *AzureKeyVaultSecretList) {
*out = *in
out.TypeMeta = in.TypeMeta
- out.ListMeta = in.ListMeta
+ in.ListMeta.DeepCopyInto(&out.ListMeta)
if in.Items != nil {
in, out := &in.Items, &out.Items
*out = make([]AzureKeyVaultSecret, len(*in))
diff --git a/pkg/k8s/apis/azurekeyvault/v2beta1/doc.go b/pkg/k8s/apis/azurekeyvault/v2beta1/doc.go
new file mode 100644
index 00000000..db474baa
--- /dev/null
+++ b/pkg/k8s/apis/azurekeyvault/v2beta1/doc.go
@@ -0,0 +1,21 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// +k8s:deepcopy-gen=package
+// +groupName=keyvault.azure.spv.no
+
+// Package v1 is the v1 version of the API.
+package v2beta1
diff --git a/pkg/k8s/apis/azurekeyvault/v2beta1/register.go b/pkg/k8s/apis/azurekeyvault/v2beta1/register.go
new file mode 100644
index 00000000..9ff6fd85
--- /dev/null
+++ b/pkg/k8s/apis/azurekeyvault/v2beta1/register.go
@@ -0,0 +1,52 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v2beta1
+
+import (
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "k8s.io/apimachinery/pkg/runtime/schema"
+)
+
+// SchemeGroupVersion is group version used to register these objects
+var SchemeGroupVersion = schema.GroupVersion{Group: azurekeyvault.GroupName, Version: "v2beta1"}
+
+// Kind takes an unqualified kind and returns back a Group qualified GroupKind
+func Kind(kind string) schema.GroupKind {
+ return SchemeGroupVersion.WithKind(kind).GroupKind()
+}
+
+// Resource takes an unqualified resource and returns a Group qualified GroupResource
+func Resource(resource string) schema.GroupResource {
+ return SchemeGroupVersion.WithResource(resource).GroupResource()
+}
+
+var (
+ SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)
+ AddToScheme = SchemeBuilder.AddToScheme
+)
+
+// Adds the list of known types to Scheme.
+func addKnownTypes(scheme *runtime.Scheme) error {
+ scheme.AddKnownTypes(SchemeGroupVersion,
+ &AzureKeyVaultSecret{},
+ &AzureKeyVaultSecretList{},
+ )
+ metav1.AddToGroupVersion(scheme, SchemeGroupVersion)
+ return nil
+}
diff --git a/pkg/k8s/apis/azurekeyvault/v2beta1/types.go b/pkg/k8s/apis/azurekeyvault/v2beta1/types.go
new file mode 100644
index 00000000..3be0ee3b
--- /dev/null
+++ b/pkg/k8s/apis/azurekeyvault/v2beta1/types.go
@@ -0,0 +1,130 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package v2beta1
+
+import (
+ corev1 "k8s.io/api/core/v1"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+)
+
+// +genclient
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// AzureKeyVaultSecret is a specification for a AzureKeyVaultSecret resource
+type AzureKeyVaultSecret struct {
+ metav1.TypeMeta `json:",inline"`
+ metav1.ObjectMeta `json:"metadata,omitempty"`
+
+ Spec AzureKeyVaultSecretSpec `json:"spec"`
+ Status AzureKeyVaultSecretStatus `json:"status"`
+}
+
+// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object
+
+// AzureKeyVaultSecretList is a list of AzureKeyVaultSecret resources
+type AzureKeyVaultSecretList struct {
+ metav1.TypeMeta `json:",inline"`
+ metav1.ListMeta `json:"metadata"`
+
+ Items []AzureKeyVaultSecret `json:"items"`
+}
+
+// AzureKeyVaultSecretSpec is the spec for a AzureKeyVaultSecret resource
+type AzureKeyVaultSecretSpec struct {
+ Vault AzureKeyVault `json:"vault"`
+ Output AzureKeyVaultOutput `json:"output,omitempty"`
+}
+
+// AzureKeyVault contains information needed to get the
+// Azure Key Vault secret from Azure Key Vault
+type AzureKeyVault struct {
+ Name string `json:"name"`
+ Object AzureKeyVaultObject `json:"object"`
+ AzureIdentity string `json:"azureIdentity"`
+}
+
+// AzureKeyVaultObject has information about the Azure Key Vault
+// object to get from Azure Key Vault
+type AzureKeyVaultObject struct {
+ Name string `json:"name"`
+ Type AzureKeyVaultObjectType `json:"type"`
+ Version string `json:"version"`
+ Poll bool `json:"bool"`
+ ContentType AzureKeyVaultObjectContentType `json:"contentType"`
+}
+
+// AzureKeyVaultObjectType defines which Object type to get from Azure Key Vault
+type AzureKeyVaultObjectType string
+
+// AzureKeyVaultObjectContentType defines what content type a secret contains
+type AzureKeyVaultObjectContentType string
+
+const (
+ // AzureKeyVaultObjectTypeSecret - get Secret object type from Azure Key Vault
+ AzureKeyVaultObjectTypeSecret AzureKeyVaultObjectType = "secret"
+
+ // AzureKeyVaultObjectTypeMultiKeyValueSecret - get Secret object type from Azure Key Vault containing multiple key/values
+ AzureKeyVaultObjectTypeMultiKeyValueSecret = "multi-key-value-secret"
+
+ // AzureKeyVaultObjectTypeCertificate - get Certificate object type from Azure Key Vault
+ AzureKeyVaultObjectTypeCertificate = "certificate"
+
+ // AzureKeyVaultObjectTypeKey - get Key object type from Azure Key Vault
+ AzureKeyVaultObjectTypeKey = "key"
+
+ // AzureKeyVaultObjectContentTypeJSON - object content is of type application/x-json
+ AzureKeyVaultObjectContentTypeJSON AzureKeyVaultObjectContentType = "application/x-json"
+
+ // AzureKeyVaultObjectContentTypeYaml - object content is of type application/x-yaml
+ AzureKeyVaultObjectContentTypeYaml = "application/x-yaml"
+)
+
+// AzureKeyVaultOutput defines output sources, currently only support Secret
+type AzureKeyVaultOutput struct {
+ Secret AzureKeyVaultOutputSecret `json:"secret"`
+ ConfigMap AzureKeyVaultOutputConfigMap `json:"configMap"`
+ // +optional
+ Transforms []string `json:"transforms,omitempty"`
+}
+
+// AzureKeyVaultOutputSecret has information needed to output
+// a secret from Azure Key Vault to Kubertnetes as a Secret resource
+type AzureKeyVaultOutputSecret struct {
+ Name string `json:"name"`
+ // +optional
+ Type corev1.SecretType `json:"type,omitempty"`
+ // +optional
+ DataKey string `json:"dataKey,omitempty"`
+ // +optional
+ ChainOrder string `json:"chainOrder,omitempty"`
+}
+
+// AzureKeyVaultOutputConfigMap has information needed to output
+// a secret from Azure Key Vault to Kubertnetes as a ConfigMap resource
+type AzureKeyVaultOutputConfigMap struct {
+ Name string `json:"name"`
+ DataKey string `json:"dataKey"`
+}
+
+// AzureKeyVaultSecretStatus is the status for a AzureKeyVaultSecret resource
+type AzureKeyVaultSecretStatus struct {
+ SecretHash string `json:"secretHash,omitempty"`
+ SecretName string `json:"secretName,omitempty"`
+ ConfigMapHash string `json:"configMapHash,omitempty"`
+ ConfigMapName string `json:"configMapName,omitempty"`
+ LastAzureUpdate metav1.Time `json:"lastAzureUpdate,omitempty"`
+}
diff --git a/pkg/k8s/apis/azurekeyvault/v2beta1/zz_generated.deepcopy.go b/pkg/k8s/apis/azurekeyvault/v2beta1/zz_generated.deepcopy.go
new file mode 100644
index 00000000..78504042
--- /dev/null
+++ b/pkg/k8s/apis/azurekeyvault/v2beta1/zz_generated.deepcopy.go
@@ -0,0 +1,212 @@
+// +build !ignore_autogenerated
+
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by deepcopy-gen. DO NOT EDIT.
+
+package v2beta1
+
+import (
+ runtime "k8s.io/apimachinery/pkg/runtime"
+)
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVault) DeepCopyInto(out *AzureKeyVault) {
+ *out = *in
+ out.Object = in.Object
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVault.
+func (in *AzureKeyVault) DeepCopy() *AzureKeyVault {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVault)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVaultObject) DeepCopyInto(out *AzureKeyVaultObject) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultObject.
+func (in *AzureKeyVaultObject) DeepCopy() *AzureKeyVaultObject {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVaultObject)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVaultOutput) DeepCopyInto(out *AzureKeyVaultOutput) {
+ *out = *in
+ out.Secret = in.Secret
+ out.ConfigMap = in.ConfigMap
+ if in.Transforms != nil {
+ in, out := &in.Transforms, &out.Transforms
+ *out = make([]string, len(*in))
+ copy(*out, *in)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultOutput.
+func (in *AzureKeyVaultOutput) DeepCopy() *AzureKeyVaultOutput {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVaultOutput)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVaultOutputConfigMap) DeepCopyInto(out *AzureKeyVaultOutputConfigMap) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultOutputConfigMap.
+func (in *AzureKeyVaultOutputConfigMap) DeepCopy() *AzureKeyVaultOutputConfigMap {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVaultOutputConfigMap)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVaultOutputSecret) DeepCopyInto(out *AzureKeyVaultOutputSecret) {
+ *out = *in
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultOutputSecret.
+func (in *AzureKeyVaultOutputSecret) DeepCopy() *AzureKeyVaultOutputSecret {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVaultOutputSecret)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVaultSecret) DeepCopyInto(out *AzureKeyVaultSecret) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
+ in.Spec.DeepCopyInto(&out.Spec)
+ in.Status.DeepCopyInto(&out.Status)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecret.
+func (in *AzureKeyVaultSecret) DeepCopy() *AzureKeyVaultSecret {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVaultSecret)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *AzureKeyVaultSecret) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVaultSecretList) DeepCopyInto(out *AzureKeyVaultSecretList) {
+ *out = *in
+ out.TypeMeta = in.TypeMeta
+ in.ListMeta.DeepCopyInto(&out.ListMeta)
+ if in.Items != nil {
+ in, out := &in.Items, &out.Items
+ *out = make([]AzureKeyVaultSecret, len(*in))
+ for i := range *in {
+ (*in)[i].DeepCopyInto(&(*out)[i])
+ }
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretList.
+func (in *AzureKeyVaultSecretList) DeepCopy() *AzureKeyVaultSecretList {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVaultSecretList)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
+func (in *AzureKeyVaultSecretList) DeepCopyObject() runtime.Object {
+ if c := in.DeepCopy(); c != nil {
+ return c
+ }
+ return nil
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVaultSecretSpec) DeepCopyInto(out *AzureKeyVaultSecretSpec) {
+ *out = *in
+ out.Vault = in.Vault
+ in.Output.DeepCopyInto(&out.Output)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretSpec.
+func (in *AzureKeyVaultSecretSpec) DeepCopy() *AzureKeyVaultSecretSpec {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVaultSecretSpec)
+ in.DeepCopyInto(out)
+ return out
+}
+
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *AzureKeyVaultSecretStatus) DeepCopyInto(out *AzureKeyVaultSecretStatus) {
+ *out = *in
+ in.LastAzureUpdate.DeepCopyInto(&out.LastAzureUpdate)
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new AzureKeyVaultSecretStatus.
+func (in *AzureKeyVaultSecretStatus) DeepCopy() *AzureKeyVaultSecretStatus {
+ if in == nil {
+ return nil
+ }
+ out := new(AzureKeyVaultSecretStatus)
+ in.DeepCopyInto(out)
+ return out
+}
diff --git a/pkg/k8s/client/clientset/versioned/clientset.go b/pkg/k8s/client/clientset/versioned/clientset.go
index d6177856..f4940067 100644
--- a/pkg/k8s/client/clientset/versioned/clientset.go
+++ b/pkg/k8s/client/clientset/versioned/clientset.go
@@ -22,8 +22,11 @@ limitations under the License.
package versioned
import (
- azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1"
- azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1"
+ "fmt"
+
+ keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1"
+ keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1"
+ keyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1"
discovery "k8s.io/client-go/discovery"
rest "k8s.io/client-go/rest"
flowcontrol "k8s.io/client-go/util/flowcontrol"
@@ -31,34 +34,33 @@ import (
type Interface interface {
Discovery() discovery.DiscoveryInterface
- AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface
- AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface
- // Deprecated: please explicitly pick a version if possible.
- Azurekeyvault() azurekeyvaultv1.AzurekeyvaultV1Interface
+ KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface
+ KeyvaultV1() keyvaultv1.KeyvaultV1Interface
+ KeyvaultV2beta1() keyvaultv2beta1.KeyvaultV2beta1Interface
}
// Clientset contains the clients for groups. Each group has exactly one
// version included in a Clientset.
type Clientset struct {
*discovery.DiscoveryClient
- azurekeyvaultV1alpha1 *azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Client
- azurekeyvaultV1 *azurekeyvaultv1.AzurekeyvaultV1Client
+ keyvaultV1alpha1 *keyvaultv1alpha1.KeyvaultV1alpha1Client
+ keyvaultV1 *keyvaultv1.KeyvaultV1Client
+ keyvaultV2beta1 *keyvaultv2beta1.KeyvaultV2beta1Client
}
-// AzurekeyvaultV1alpha1 retrieves the AzurekeyvaultV1alpha1Client
-func (c *Clientset) AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface {
- return c.azurekeyvaultV1alpha1
+// KeyvaultV1alpha1 retrieves the KeyvaultV1alpha1Client
+func (c *Clientset) KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface {
+ return c.keyvaultV1alpha1
}
-// AzurekeyvaultV1 retrieves the AzurekeyvaultV1Client
-func (c *Clientset) AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface {
- return c.azurekeyvaultV1
+// KeyvaultV1 retrieves the KeyvaultV1Client
+func (c *Clientset) KeyvaultV1() keyvaultv1.KeyvaultV1Interface {
+ return c.keyvaultV1
}
-// Deprecated: Azurekeyvault retrieves the default version of AzurekeyvaultClient.
-// Please explicitly pick a version.
-func (c *Clientset) Azurekeyvault() azurekeyvaultv1.AzurekeyvaultV1Interface {
- return c.azurekeyvaultV1
+// KeyvaultV2beta1 retrieves the KeyvaultV2beta1Client
+func (c *Clientset) KeyvaultV2beta1() keyvaultv2beta1.KeyvaultV2beta1Interface {
+ return c.keyvaultV2beta1
}
// Discovery retrieves the DiscoveryClient
@@ -70,18 +72,27 @@ func (c *Clientset) Discovery() discovery.DiscoveryInterface {
}
// NewForConfig creates a new Clientset for the given config.
+// If config's RateLimiter is not set and QPS and Burst are acceptable,
+// NewForConfig will generate a rate-limiter in configShallowCopy.
func NewForConfig(c *rest.Config) (*Clientset, error) {
configShallowCopy := *c
if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 {
+ if configShallowCopy.Burst <= 0 {
+ return nil, fmt.Errorf("burst is required to be greater than 0 when RateLimiter is not set and QPS is set to greater than 0")
+ }
configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst)
}
var cs Clientset
var err error
- cs.azurekeyvaultV1alpha1, err = azurekeyvaultv1alpha1.NewForConfig(&configShallowCopy)
+ cs.keyvaultV1alpha1, err = keyvaultv1alpha1.NewForConfig(&configShallowCopy)
+ if err != nil {
+ return nil, err
+ }
+ cs.keyvaultV1, err = keyvaultv1.NewForConfig(&configShallowCopy)
if err != nil {
return nil, err
}
- cs.azurekeyvaultV1, err = azurekeyvaultv1.NewForConfig(&configShallowCopy)
+ cs.keyvaultV2beta1, err = keyvaultv2beta1.NewForConfig(&configShallowCopy)
if err != nil {
return nil, err
}
@@ -97,8 +108,9 @@ func NewForConfig(c *rest.Config) (*Clientset, error) {
// panics if there is an error in the config.
func NewForConfigOrDie(c *rest.Config) *Clientset {
var cs Clientset
- cs.azurekeyvaultV1alpha1 = azurekeyvaultv1alpha1.NewForConfigOrDie(c)
- cs.azurekeyvaultV1 = azurekeyvaultv1.NewForConfigOrDie(c)
+ cs.keyvaultV1alpha1 = keyvaultv1alpha1.NewForConfigOrDie(c)
+ cs.keyvaultV1 = keyvaultv1.NewForConfigOrDie(c)
+ cs.keyvaultV2beta1 = keyvaultv2beta1.NewForConfigOrDie(c)
cs.DiscoveryClient = discovery.NewDiscoveryClientForConfigOrDie(c)
return &cs
@@ -107,8 +119,9 @@ func NewForConfigOrDie(c *rest.Config) *Clientset {
// New creates a new Clientset for the given RESTClient.
func New(c rest.Interface) *Clientset {
var cs Clientset
- cs.azurekeyvaultV1alpha1 = azurekeyvaultv1alpha1.New(c)
- cs.azurekeyvaultV1 = azurekeyvaultv1.New(c)
+ cs.keyvaultV1alpha1 = keyvaultv1alpha1.New(c)
+ cs.keyvaultV1 = keyvaultv1.New(c)
+ cs.keyvaultV2beta1 = keyvaultv2beta1.New(c)
cs.DiscoveryClient = discovery.NewDiscoveryClient(c)
return &cs
diff --git a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go
index d2d7da3e..b356e51c 100644
--- a/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go
+++ b/pkg/k8s/client/clientset/versioned/fake/clientset_generated.go
@@ -23,10 +23,12 @@ package fake
import (
clientset "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned"
- azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1"
- fakeazurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake"
- azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1"
- fakeazurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake"
+ keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1"
+ fakekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake"
+ keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1"
+ fakekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake"
+ keyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1"
+ fakekeyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/watch"
"k8s.io/client-go/discovery"
@@ -46,7 +48,7 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset {
}
}
- cs := &Clientset{}
+ cs := &Clientset{tracker: o}
cs.discovery = &fakediscovery.FakeDiscovery{Fake: &cs.Fake}
cs.AddReactor("*", "*", testing.ObjectReaction(o))
cs.AddWatchReactor("*", func(action testing.Action) (handled bool, ret watch.Interface, err error) {
@@ -68,25 +70,30 @@ func NewSimpleClientset(objects ...runtime.Object) *Clientset {
type Clientset struct {
testing.Fake
discovery *fakediscovery.FakeDiscovery
+ tracker testing.ObjectTracker
}
func (c *Clientset) Discovery() discovery.DiscoveryInterface {
return c.discovery
}
+func (c *Clientset) Tracker() testing.ObjectTracker {
+ return c.tracker
+}
+
var _ clientset.Interface = &Clientset{}
-// AzurekeyvaultV1alpha1 retrieves the AzurekeyvaultV1alpha1Client
-func (c *Clientset) AzurekeyvaultV1alpha1() azurekeyvaultv1alpha1.AzurekeyvaultV1alpha1Interface {
- return &fakeazurekeyvaultv1alpha1.FakeAzurekeyvaultV1alpha1{Fake: &c.Fake}
+// KeyvaultV1alpha1 retrieves the KeyvaultV1alpha1Client
+func (c *Clientset) KeyvaultV1alpha1() keyvaultv1alpha1.KeyvaultV1alpha1Interface {
+ return &fakekeyvaultv1alpha1.FakeKeyvaultV1alpha1{Fake: &c.Fake}
}
-// AzurekeyvaultV1 retrieves the AzurekeyvaultV1Client
-func (c *Clientset) AzurekeyvaultV1() azurekeyvaultv1.AzurekeyvaultV1Interface {
- return &fakeazurekeyvaultv1.FakeAzurekeyvaultV1{Fake: &c.Fake}
+// KeyvaultV1 retrieves the KeyvaultV1Client
+func (c *Clientset) KeyvaultV1() keyvaultv1.KeyvaultV1Interface {
+ return &fakekeyvaultv1.FakeKeyvaultV1{Fake: &c.Fake}
}
-// Azurekeyvault retrieves the AzurekeyvaultV1Client
-func (c *Clientset) Azurekeyvault() azurekeyvaultv1.AzurekeyvaultV1Interface {
- return &fakeazurekeyvaultv1.FakeAzurekeyvaultV1{Fake: &c.Fake}
+// KeyvaultV2beta1 retrieves the KeyvaultV2beta1Client
+func (c *Clientset) KeyvaultV2beta1() keyvaultv2beta1.KeyvaultV2beta1Interface {
+ return &fakekeyvaultv2beta1.FakeKeyvaultV2beta1{Fake: &c.Fake}
}
diff --git a/pkg/k8s/client/clientset/versioned/fake/register.go b/pkg/k8s/client/clientset/versioned/fake/register.go
index c18f0c8f..d5882b66 100644
--- a/pkg/k8s/client/clientset/versioned/fake/register.go
+++ b/pkg/k8s/client/clientset/versioned/fake/register.go
@@ -22,8 +22,9 @@ limitations under the License.
package fake
import (
- azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
- azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
+ keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
+ keyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
schema "k8s.io/apimachinery/pkg/runtime/schema"
@@ -33,10 +34,11 @@ import (
var scheme = runtime.NewScheme()
var codecs = serializer.NewCodecFactory(scheme)
-var parameterCodec = runtime.NewParameterCodec(scheme)
+
var localSchemeBuilder = runtime.SchemeBuilder{
- azurekeyvaultv1alpha1.AddToScheme,
- azurekeyvaultv1.AddToScheme,
+ keyvaultv1alpha1.AddToScheme,
+ keyvaultv1.AddToScheme,
+ keyvaultv2beta1.AddToScheme,
}
// AddToScheme adds all types of this clientset into the given scheme. This allows composition
diff --git a/pkg/k8s/client/clientset/versioned/scheme/register.go b/pkg/k8s/client/clientset/versioned/scheme/register.go
index ff8a815e..996ac0bd 100644
--- a/pkg/k8s/client/clientset/versioned/scheme/register.go
+++ b/pkg/k8s/client/clientset/versioned/scheme/register.go
@@ -22,8 +22,9 @@ limitations under the License.
package scheme
import (
- azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
- azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
+ keyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
+ keyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
+ keyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
schema "k8s.io/apimachinery/pkg/runtime/schema"
@@ -35,8 +36,9 @@ var Scheme = runtime.NewScheme()
var Codecs = serializer.NewCodecFactory(Scheme)
var ParameterCodec = runtime.NewParameterCodec(Scheme)
var localSchemeBuilder = runtime.SchemeBuilder{
- azurekeyvaultv1alpha1.AddToScheme,
- azurekeyvaultv1.AddToScheme,
+ keyvaultv1alpha1.AddToScheme,
+ keyvaultv1.AddToScheme,
+ keyvaultv2beta1.AddToScheme,
}
// AddToScheme adds all types of this clientset into the given scheme. This allows composition
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go
index 50247754..b64843bc 100644
--- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvault_client.go
@@ -24,26 +24,25 @@ package v1
import (
v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
"github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme"
- serializer "k8s.io/apimachinery/pkg/runtime/serializer"
rest "k8s.io/client-go/rest"
)
-type AzurekeyvaultV1Interface interface {
+type KeyvaultV1Interface interface {
RESTClient() rest.Interface
AzureKeyVaultSecretsGetter
}
-// AzurekeyvaultV1Client is used to interact with features provided by the azurekeyvault.spv.no group.
-type AzurekeyvaultV1Client struct {
+// KeyvaultV1Client is used to interact with features provided by the keyvault.azure.spv.no group.
+type KeyvaultV1Client struct {
restClient rest.Interface
}
-func (c *AzurekeyvaultV1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface {
+func (c *KeyvaultV1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface {
return newAzureKeyVaultSecrets(c, namespace)
}
-// NewForConfig creates a new AzurekeyvaultV1Client for the given config.
-func NewForConfig(c *rest.Config) (*AzurekeyvaultV1Client, error) {
+// NewForConfig creates a new KeyvaultV1Client for the given config.
+func NewForConfig(c *rest.Config) (*KeyvaultV1Client, error) {
config := *c
if err := setConfigDefaults(&config); err != nil {
return nil, err
@@ -52,12 +51,12 @@ func NewForConfig(c *rest.Config) (*AzurekeyvaultV1Client, error) {
if err != nil {
return nil, err
}
- return &AzurekeyvaultV1Client{client}, nil
+ return &KeyvaultV1Client{client}, nil
}
-// NewForConfigOrDie creates a new AzurekeyvaultV1Client for the given config and
+// NewForConfigOrDie creates a new KeyvaultV1Client for the given config and
// panics if there is an error in the config.
-func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV1Client {
+func NewForConfigOrDie(c *rest.Config) *KeyvaultV1Client {
client, err := NewForConfig(c)
if err != nil {
panic(err)
@@ -65,16 +64,16 @@ func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV1Client {
return client
}
-// New creates a new AzurekeyvaultV1Client for the given RESTClient.
-func New(c rest.Interface) *AzurekeyvaultV1Client {
- return &AzurekeyvaultV1Client{c}
+// New creates a new KeyvaultV1Client for the given RESTClient.
+func New(c rest.Interface) *KeyvaultV1Client {
+ return &KeyvaultV1Client{c}
}
func setConfigDefaults(config *rest.Config) error {
gv := v1.SchemeGroupVersion
config.GroupVersion = &gv
config.APIPath = "/apis"
- config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}
+ config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
if config.UserAgent == "" {
config.UserAgent = rest.DefaultKubernetesUserAgent()
@@ -85,7 +84,7 @@ func setConfigDefaults(config *rest.Config) error {
// RESTClient returns a RESTClient that is used to communicate
// with API server by this client implementation.
-func (c *AzurekeyvaultV1Client) RESTClient() rest.Interface {
+func (c *KeyvaultV1Client) RESTClient() rest.Interface {
if c == nil {
return nil
}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go
index 77eec361..f80483a9 100644
--- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/azurekeyvaultsecret.go
@@ -22,6 +22,7 @@ limitations under the License.
package v1
import (
+ "context"
"time"
v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
@@ -40,15 +41,15 @@ type AzureKeyVaultSecretsGetter interface {
// AzureKeyVaultSecretInterface has methods to work with AzureKeyVaultSecret resources.
type AzureKeyVaultSecretInterface interface {
- Create(*v1.AzureKeyVaultSecret) (*v1.AzureKeyVaultSecret, error)
- Update(*v1.AzureKeyVaultSecret) (*v1.AzureKeyVaultSecret, error)
- UpdateStatus(*v1.AzureKeyVaultSecret) (*v1.AzureKeyVaultSecret, error)
- Delete(name string, options *metav1.DeleteOptions) error
- DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error
- Get(name string, options metav1.GetOptions) (*v1.AzureKeyVaultSecret, error)
- List(opts metav1.ListOptions) (*v1.AzureKeyVaultSecretList, error)
- Watch(opts metav1.ListOptions) (watch.Interface, error)
- Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.AzureKeyVaultSecret, err error)
+ Create(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.CreateOptions) (*v1.AzureKeyVaultSecret, error)
+ Update(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.UpdateOptions) (*v1.AzureKeyVaultSecret, error)
+ UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.UpdateOptions) (*v1.AzureKeyVaultSecret, error)
+ Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error
+ DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error
+ Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.AzureKeyVaultSecret, error)
+ List(ctx context.Context, opts metav1.ListOptions) (*v1.AzureKeyVaultSecretList, error)
+ Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error)
+ Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.AzureKeyVaultSecret, err error)
AzureKeyVaultSecretExpansion
}
@@ -59,7 +60,7 @@ type azureKeyVaultSecrets struct {
}
// newAzureKeyVaultSecrets returns a AzureKeyVaultSecrets
-func newAzureKeyVaultSecrets(c *AzurekeyvaultV1Client, namespace string) *azureKeyVaultSecrets {
+func newAzureKeyVaultSecrets(c *KeyvaultV1Client, namespace string) *azureKeyVaultSecrets {
return &azureKeyVaultSecrets{
client: c.RESTClient(),
ns: namespace,
@@ -67,20 +68,20 @@ func newAzureKeyVaultSecrets(c *AzurekeyvaultV1Client, namespace string) *azureK
}
// Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any.
-func (c *azureKeyVaultSecrets) Get(name string, options metav1.GetOptions) (result *v1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) Get(ctx context.Context, name string, options metav1.GetOptions) (result *v1.AzureKeyVaultSecret, err error) {
result = &v1.AzureKeyVaultSecret{}
err = c.client.Get().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
Name(name).
VersionedParams(&options, scheme.ParameterCodec).
- Do().
+ Do(ctx).
Into(result)
return
}
// List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors.
-func (c *azureKeyVaultSecrets) List(opts metav1.ListOptions) (result *v1.AzureKeyVaultSecretList, err error) {
+func (c *azureKeyVaultSecrets) List(ctx context.Context, opts metav1.ListOptions) (result *v1.AzureKeyVaultSecretList, err error) {
var timeout time.Duration
if opts.TimeoutSeconds != nil {
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -91,13 +92,13 @@ func (c *azureKeyVaultSecrets) List(opts metav1.ListOptions) (result *v1.AzureKe
Resource("azurekeyvaultsecrets").
VersionedParams(&opts, scheme.ParameterCodec).
Timeout(timeout).
- Do().
+ Do(ctx).
Into(result)
return
}
// Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets.
-func (c *azureKeyVaultSecrets) Watch(opts metav1.ListOptions) (watch.Interface, error) {
+func (c *azureKeyVaultSecrets) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
var timeout time.Duration
if opts.TimeoutSeconds != nil {
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -108,87 +109,90 @@ func (c *azureKeyVaultSecrets) Watch(opts metav1.ListOptions) (watch.Interface,
Resource("azurekeyvaultsecrets").
VersionedParams(&opts, scheme.ParameterCodec).
Timeout(timeout).
- Watch()
+ Watch(ctx)
}
// Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
-func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v1.AzureKeyVaultSecret) (result *v1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.CreateOptions) (result *v1.AzureKeyVaultSecret, err error) {
result = &v1.AzureKeyVaultSecret{}
err = c.client.Post().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
+ VersionedParams(&opts, scheme.ParameterCodec).
Body(azureKeyVaultSecret).
- Do().
+ Do(ctx).
Into(result)
return
}
// Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
-func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v1.AzureKeyVaultSecret) (result *v1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.UpdateOptions) (result *v1.AzureKeyVaultSecret, err error) {
result = &v1.AzureKeyVaultSecret{}
err = c.client.Put().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
Name(azureKeyVaultSecret.Name).
+ VersionedParams(&opts, scheme.ParameterCodec).
Body(azureKeyVaultSecret).
- Do().
+ Do(ctx).
Into(result)
return
}
// UpdateStatus was generated because the type contains a Status member.
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-
-func (c *azureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v1.AzureKeyVaultSecret) (result *v1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1.AzureKeyVaultSecret, opts metav1.UpdateOptions) (result *v1.AzureKeyVaultSecret, err error) {
result = &v1.AzureKeyVaultSecret{}
err = c.client.Put().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
Name(azureKeyVaultSecret.Name).
SubResource("status").
+ VersionedParams(&opts, scheme.ParameterCodec).
Body(azureKeyVaultSecret).
- Do().
+ Do(ctx).
Into(result)
return
}
// Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs.
-func (c *azureKeyVaultSecrets) Delete(name string, options *metav1.DeleteOptions) error {
+func (c *azureKeyVaultSecrets) Delete(ctx context.Context, name string, opts metav1.DeleteOptions) error {
return c.client.Delete().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
Name(name).
- Body(options).
- Do().
+ Body(&opts).
+ Do(ctx).
Error()
}
// DeleteCollection deletes a collection of objects.
-func (c *azureKeyVaultSecrets) DeleteCollection(options *metav1.DeleteOptions, listOptions metav1.ListOptions) error {
+func (c *azureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts metav1.DeleteOptions, listOpts metav1.ListOptions) error {
var timeout time.Duration
- if listOptions.TimeoutSeconds != nil {
- timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+ if listOpts.TimeoutSeconds != nil {
+ timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
}
return c.client.Delete().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
- VersionedParams(&listOptions, scheme.ParameterCodec).
+ VersionedParams(&listOpts, scheme.ParameterCodec).
Timeout(timeout).
- Body(options).
- Do().
+ Body(&opts).
+ Do(ctx).
Error()
}
// Patch applies the patch and returns the patched azureKeyVaultSecret.
-func (c *azureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (result *v1.AzureKeyVaultSecret, err error) {
result = &v1.AzureKeyVaultSecret{}
err = c.client.Patch(pt).
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
- SubResource(subresources...).
Name(name).
+ SubResource(subresources...).
+ VersionedParams(&opts, scheme.ParameterCodec).
Body(data).
- Do().
+ Do(ctx).
Into(result)
return
}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go
index d605b22d..10caf239 100644
--- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvault_client.go
@@ -27,17 +27,17 @@ import (
testing "k8s.io/client-go/testing"
)
-type FakeAzurekeyvaultV1 struct {
+type FakeKeyvaultV1 struct {
*testing.Fake
}
-func (c *FakeAzurekeyvaultV1) AzureKeyVaultSecrets(namespace string) v1.AzureKeyVaultSecretInterface {
+func (c *FakeKeyvaultV1) AzureKeyVaultSecrets(namespace string) v1.AzureKeyVaultSecretInterface {
return &FakeAzureKeyVaultSecrets{c, namespace}
}
// RESTClient returns a RESTClient that is used to communicate
// with API server by this client implementation.
-func (c *FakeAzurekeyvaultV1) RESTClient() rest.Interface {
+func (c *FakeKeyvaultV1) RESTClient() rest.Interface {
var ret *rest.RESTClient
return ret
}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go
index 22937242..e4123f98 100644
--- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1/fake/fake_azurekeyvaultsecret.go
@@ -22,6 +22,8 @@ limitations under the License.
package fake
import (
+ "context"
+
azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
labels "k8s.io/apimachinery/pkg/labels"
@@ -33,16 +35,16 @@ import (
// FakeAzureKeyVaultSecrets implements AzureKeyVaultSecretInterface
type FakeAzureKeyVaultSecrets struct {
- Fake *FakeAzurekeyvaultV1
+ Fake *FakeKeyvaultV1
ns string
}
-var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "azurekeyvault.spv.no", Version: "v1", Resource: "azurekeyvaultsecrets"}
+var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault.azure.spv.no", Version: "v1", Resource: "azurekeyvaultsecrets"}
-var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "azurekeyvault.spv.no", Version: "v1", Kind: "AzureKeyVaultSecret"}
+var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v1", Kind: "AzureKeyVaultSecret"}
// Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any.
-func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) {
+func (c *FakeAzureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) {
obj, err := c.Fake.
Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &azurekeyvaultv1.AzureKeyVaultSecret{})
@@ -53,7 +55,7 @@ func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (resu
}
// List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors.
-func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *azurekeyvaultv1.AzureKeyVaultSecretList, err error) {
+func (c *FakeAzureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *azurekeyvaultv1.AzureKeyVaultSecretList, err error) {
obj, err := c.Fake.
Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &azurekeyvaultv1.AzureKeyVaultSecretList{})
@@ -75,14 +77,14 @@ func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *azurekeyva
}
// Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets.
-func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *FakeAzureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
return c.Fake.
InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretsResource, c.ns, opts))
}
// Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
-func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) {
+func (c *FakeAzureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) {
obj, err := c.Fake.
Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{})
@@ -93,7 +95,7 @@ func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *azurekeyvaultv1.A
}
// Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
-func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) {
+func (c *FakeAzureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) {
obj, err := c.Fake.
Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{})
@@ -105,7 +107,7 @@ func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *azurekeyvaultv1.A
// UpdateStatus was generated because the type contains a Status member.
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret) (*azurekeyvaultv1.AzureKeyVaultSecret, error) {
+func (c *FakeAzureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *azurekeyvaultv1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*azurekeyvaultv1.AzureKeyVaultSecret, error) {
obj, err := c.Fake.
Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &azurekeyvaultv1.AzureKeyVaultSecret{})
@@ -116,7 +118,7 @@ func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *azurekeyvau
}
// Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs.
-func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error {
+func (c *FakeAzureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
_, err := c.Fake.
Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &azurekeyvaultv1.AzureKeyVaultSecret{})
@@ -124,15 +126,15 @@ func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions
}
// DeleteCollection deletes a collection of objects.
-func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
- action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions)
+func (c *FakeAzureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+ action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOpts)
_, err := c.Fake.Invokes(action, &azurekeyvaultv1.AzureKeyVaultSecretList{})
return err
}
// Patch applies the patch and returns the patched azureKeyVaultSecret.
-func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) {
+func (c *FakeAzureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *azurekeyvaultv1.AzureKeyVaultSecret, err error) {
obj, err := c.Fake.
Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &azurekeyvaultv1.AzureKeyVaultSecret{})
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go
index e41246c3..481349ac 100644
--- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvault_client.go
@@ -24,26 +24,25 @@ package v1alpha1
import (
v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
"github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme"
- serializer "k8s.io/apimachinery/pkg/runtime/serializer"
rest "k8s.io/client-go/rest"
)
-type AzurekeyvaultV1alpha1Interface interface {
+type KeyvaultV1alpha1Interface interface {
RESTClient() rest.Interface
AzureKeyVaultSecretsGetter
}
-// AzurekeyvaultV1alpha1Client is used to interact with features provided by the azurekeyvault.spv.no group.
-type AzurekeyvaultV1alpha1Client struct {
+// KeyvaultV1alpha1Client is used to interact with features provided by the keyvault.azure.spv.no group.
+type KeyvaultV1alpha1Client struct {
restClient rest.Interface
}
-func (c *AzurekeyvaultV1alpha1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface {
+func (c *KeyvaultV1alpha1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface {
return newAzureKeyVaultSecrets(c, namespace)
}
-// NewForConfig creates a new AzurekeyvaultV1alpha1Client for the given config.
-func NewForConfig(c *rest.Config) (*AzurekeyvaultV1alpha1Client, error) {
+// NewForConfig creates a new KeyvaultV1alpha1Client for the given config.
+func NewForConfig(c *rest.Config) (*KeyvaultV1alpha1Client, error) {
config := *c
if err := setConfigDefaults(&config); err != nil {
return nil, err
@@ -52,12 +51,12 @@ func NewForConfig(c *rest.Config) (*AzurekeyvaultV1alpha1Client, error) {
if err != nil {
return nil, err
}
- return &AzurekeyvaultV1alpha1Client{client}, nil
+ return &KeyvaultV1alpha1Client{client}, nil
}
-// NewForConfigOrDie creates a new AzurekeyvaultV1alpha1Client for the given config and
+// NewForConfigOrDie creates a new KeyvaultV1alpha1Client for the given config and
// panics if there is an error in the config.
-func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV1alpha1Client {
+func NewForConfigOrDie(c *rest.Config) *KeyvaultV1alpha1Client {
client, err := NewForConfig(c)
if err != nil {
panic(err)
@@ -65,16 +64,16 @@ func NewForConfigOrDie(c *rest.Config) *AzurekeyvaultV1alpha1Client {
return client
}
-// New creates a new AzurekeyvaultV1alpha1Client for the given RESTClient.
-func New(c rest.Interface) *AzurekeyvaultV1alpha1Client {
- return &AzurekeyvaultV1alpha1Client{c}
+// New creates a new KeyvaultV1alpha1Client for the given RESTClient.
+func New(c rest.Interface) *KeyvaultV1alpha1Client {
+ return &KeyvaultV1alpha1Client{c}
}
func setConfigDefaults(config *rest.Config) error {
gv := v1alpha1.SchemeGroupVersion
config.GroupVersion = &gv
config.APIPath = "/apis"
- config.NegotiatedSerializer = serializer.DirectCodecFactory{CodecFactory: scheme.Codecs}
+ config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
if config.UserAgent == "" {
config.UserAgent = rest.DefaultKubernetesUserAgent()
@@ -85,7 +84,7 @@ func setConfigDefaults(config *rest.Config) error {
// RESTClient returns a RESTClient that is used to communicate
// with API server by this client implementation.
-func (c *AzurekeyvaultV1alpha1Client) RESTClient() rest.Interface {
+func (c *KeyvaultV1alpha1Client) RESTClient() rest.Interface {
if c == nil {
return nil
}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
index 5b0400dc..3477b59c 100644
--- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
@@ -22,6 +22,7 @@ limitations under the License.
package v1alpha1
import (
+ "context"
"time"
v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
@@ -40,15 +41,15 @@ type AzureKeyVaultSecretsGetter interface {
// AzureKeyVaultSecretInterface has methods to work with AzureKeyVaultSecret resources.
type AzureKeyVaultSecretInterface interface {
- Create(*v1alpha1.AzureKeyVaultSecret) (*v1alpha1.AzureKeyVaultSecret, error)
- Update(*v1alpha1.AzureKeyVaultSecret) (*v1alpha1.AzureKeyVaultSecret, error)
- UpdateStatus(*v1alpha1.AzureKeyVaultSecret) (*v1alpha1.AzureKeyVaultSecret, error)
- Delete(name string, options *v1.DeleteOptions) error
- DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error
- Get(name string, options v1.GetOptions) (*v1alpha1.AzureKeyVaultSecret, error)
- List(opts v1.ListOptions) (*v1alpha1.AzureKeyVaultSecretList, error)
- Watch(opts v1.ListOptions) (watch.Interface, error)
- Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error)
+ Create(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.CreateOptions) (*v1alpha1.AzureKeyVaultSecret, error)
+ Update(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v1alpha1.AzureKeyVaultSecret, error)
+ UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v1alpha1.AzureKeyVaultSecret, error)
+ Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+ DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+ Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.AzureKeyVaultSecret, error)
+ List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.AzureKeyVaultSecretList, error)
+ Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+ Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error)
AzureKeyVaultSecretExpansion
}
@@ -59,7 +60,7 @@ type azureKeyVaultSecrets struct {
}
// newAzureKeyVaultSecrets returns a AzureKeyVaultSecrets
-func newAzureKeyVaultSecrets(c *AzurekeyvaultV1alpha1Client, namespace string) *azureKeyVaultSecrets {
+func newAzureKeyVaultSecrets(c *KeyvaultV1alpha1Client, namespace string) *azureKeyVaultSecrets {
return &azureKeyVaultSecrets{
client: c.RESTClient(),
ns: namespace,
@@ -67,20 +68,20 @@ func newAzureKeyVaultSecrets(c *AzurekeyvaultV1alpha1Client, namespace string) *
}
// Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any.
-func (c *azureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
result = &v1alpha1.AzureKeyVaultSecret{}
err = c.client.Get().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
Name(name).
VersionedParams(&options, scheme.ParameterCodec).
- Do().
+ Do(ctx).
Into(result)
return
}
// List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors.
-func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v1alpha1.AzureKeyVaultSecretList, err error) {
+func (c *azureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.AzureKeyVaultSecretList, err error) {
var timeout time.Duration
if opts.TimeoutSeconds != nil {
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -91,13 +92,13 @@ func (c *azureKeyVaultSecrets) List(opts v1.ListOptions) (result *v1alpha1.Azure
Resource("azurekeyvaultsecrets").
VersionedParams(&opts, scheme.ParameterCodec).
Timeout(timeout).
- Do().
+ Do(ctx).
Into(result)
return
}
// Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets.
-func (c *azureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *azureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
var timeout time.Duration
if opts.TimeoutSeconds != nil {
timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
@@ -108,87 +109,90 @@ func (c *azureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, erro
Resource("azurekeyvaultsecrets").
VersionedParams(&opts, scheme.ParameterCodec).
Timeout(timeout).
- Watch()
+ Watch(ctx)
}
// Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
-func (c *azureKeyVaultSecrets) Create(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
result = &v1alpha1.AzureKeyVaultSecret{}
err = c.client.Post().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
+ VersionedParams(&opts, scheme.ParameterCodec).
Body(azureKeyVaultSecret).
- Do().
+ Do(ctx).
Into(result)
return
}
// Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
-func (c *azureKeyVaultSecrets) Update(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
result = &v1alpha1.AzureKeyVaultSecret{}
err = c.client.Put().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
Name(azureKeyVaultSecret.Name).
+ VersionedParams(&opts, scheme.ParameterCodec).
Body(azureKeyVaultSecret).
- Do().
+ Do(ctx).
Into(result)
return
}
// UpdateStatus was generated because the type contains a Status member.
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-
-func (c *azureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
result = &v1alpha1.AzureKeyVaultSecret{}
err = c.client.Put().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
Name(azureKeyVaultSecret.Name).
SubResource("status").
+ VersionedParams(&opts, scheme.ParameterCodec).
Body(azureKeyVaultSecret).
- Do().
+ Do(ctx).
Into(result)
return
}
// Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs.
-func (c *azureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error {
+func (c *azureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
return c.client.Delete().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
Name(name).
- Body(options).
- Do().
+ Body(&opts).
+ Do(ctx).
Error()
}
// DeleteCollection deletes a collection of objects.
-func (c *azureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
+func (c *azureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
var timeout time.Duration
- if listOptions.TimeoutSeconds != nil {
- timeout = time.Duration(*listOptions.TimeoutSeconds) * time.Second
+ if listOpts.TimeoutSeconds != nil {
+ timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
}
return c.client.Delete().
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
- VersionedParams(&listOptions, scheme.ParameterCodec).
+ VersionedParams(&listOpts, scheme.ParameterCodec).
Timeout(timeout).
- Body(options).
- Do().
+ Body(&opts).
+ Do(ctx).
Error()
}
// Patch applies the patch and returns the patched azureKeyVaultSecret.
-func (c *azureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *azureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) {
result = &v1alpha1.AzureKeyVaultSecret{}
err = c.client.Patch(pt).
Namespace(c.ns).
Resource("azurekeyvaultsecrets").
- SubResource(subresources...).
Name(name).
+ SubResource(subresources...).
+ VersionedParams(&opts, scheme.ParameterCodec).
Body(data).
- Do().
+ Do(ctx).
Into(result)
return
}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go
index 25e47028..a0ab7e42 100644
--- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvault_client.go
@@ -27,17 +27,17 @@ import (
testing "k8s.io/client-go/testing"
)
-type FakeAzurekeyvaultV1alpha1 struct {
+type FakeKeyvaultV1alpha1 struct {
*testing.Fake
}
-func (c *FakeAzurekeyvaultV1alpha1) AzureKeyVaultSecrets(namespace string) v1alpha1.AzureKeyVaultSecretInterface {
+func (c *FakeKeyvaultV1alpha1) AzureKeyVaultSecrets(namespace string) v1alpha1.AzureKeyVaultSecretInterface {
return &FakeAzureKeyVaultSecrets{c, namespace}
}
// RESTClient returns a RESTClient that is used to communicate
// with API server by this client implementation.
-func (c *FakeAzurekeyvaultV1alpha1) RESTClient() rest.Interface {
+func (c *FakeKeyvaultV1alpha1) RESTClient() rest.Interface {
var ret *rest.RESTClient
return ret
}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go
index 539b6776..5f25d068 100644
--- a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v1alpha1/fake/fake_azurekeyvaultsecret.go
@@ -22,6 +22,8 @@ limitations under the License.
package fake
import (
+ "context"
+
v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
labels "k8s.io/apimachinery/pkg/labels"
@@ -33,16 +35,16 @@ import (
// FakeAzureKeyVaultSecrets implements AzureKeyVaultSecretInterface
type FakeAzureKeyVaultSecrets struct {
- Fake *FakeAzurekeyvaultV1alpha1
+ Fake *FakeKeyvaultV1alpha1
ns string
}
-var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "azurekeyvault.spv.no", Version: "v1alpha1", Resource: "azurekeyvaultsecrets"}
+var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault.azure.spv.no", Version: "v1alpha1", Resource: "azurekeyvaultsecrets"}
-var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "azurekeyvault.spv.no", Version: "v1alpha1", Kind: "AzureKeyVaultSecret"}
+var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v1alpha1", Kind: "AzureKeyVaultSecret"}
// Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any.
-func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *FakeAzureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
obj, err := c.Fake.
Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &v1alpha1.AzureKeyVaultSecret{})
@@ -53,7 +55,7 @@ func (c *FakeAzureKeyVaultSecrets) Get(name string, options v1.GetOptions) (resu
}
// List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors.
-func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v1alpha1.AzureKeyVaultSecretList, err error) {
+func (c *FakeAzureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.AzureKeyVaultSecretList, err error) {
obj, err := c.Fake.
Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &v1alpha1.AzureKeyVaultSecretList{})
@@ -75,14 +77,14 @@ func (c *FakeAzureKeyVaultSecrets) List(opts v1.ListOptions) (result *v1alpha1.A
}
// Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets.
-func (c *FakeAzureKeyVaultSecrets) Watch(opts v1.ListOptions) (watch.Interface, error) {
+func (c *FakeAzureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
return c.Fake.
InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretsResource, c.ns, opts))
}
// Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
-func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *FakeAzureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
obj, err := c.Fake.
Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v1alpha1.AzureKeyVaultSecret{})
@@ -93,7 +95,7 @@ func (c *FakeAzureKeyVaultSecrets) Create(azureKeyVaultSecret *v1alpha1.AzureKey
}
// Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
-func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *FakeAzureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v1alpha1.AzureKeyVaultSecret, err error) {
obj, err := c.Fake.
Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v1alpha1.AzureKeyVaultSecret{})
@@ -105,7 +107,7 @@ func (c *FakeAzureKeyVaultSecrets) Update(azureKeyVaultSecret *v1alpha1.AzureKey
// UpdateStatus was generated because the type contains a Status member.
// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
-func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret) (*v1alpha1.AzureKeyVaultSecret, error) {
+func (c *FakeAzureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v1alpha1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v1alpha1.AzureKeyVaultSecret, error) {
obj, err := c.Fake.
Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &v1alpha1.AzureKeyVaultSecret{})
@@ -116,7 +118,7 @@ func (c *FakeAzureKeyVaultSecrets) UpdateStatus(azureKeyVaultSecret *v1alpha1.Az
}
// Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs.
-func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions) error {
+func (c *FakeAzureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
_, err := c.Fake.
Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &v1alpha1.AzureKeyVaultSecret{})
@@ -124,15 +126,15 @@ func (c *FakeAzureKeyVaultSecrets) Delete(name string, options *v1.DeleteOptions
}
// DeleteCollection deletes a collection of objects.
-func (c *FakeAzureKeyVaultSecrets) DeleteCollection(options *v1.DeleteOptions, listOptions v1.ListOptions) error {
- action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOptions)
+func (c *FakeAzureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+ action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOpts)
_, err := c.Fake.Invokes(action, &v1alpha1.AzureKeyVaultSecretList{})
return err
}
// Patch applies the patch and returns the patched azureKeyVaultSecret.
-func (c *FakeAzureKeyVaultSecrets) Patch(name string, pt types.PatchType, data []byte, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) {
+func (c *FakeAzureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.AzureKeyVaultSecret, err error) {
obj, err := c.Fake.
Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &v1alpha1.AzureKeyVaultSecret{})
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvault_client.go
new file mode 100644
index 00000000..9ee95de8
--- /dev/null
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvault_client.go
@@ -0,0 +1,92 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v2beta1
+
+import (
+ v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+ "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme"
+ rest "k8s.io/client-go/rest"
+)
+
+type KeyvaultV2beta1Interface interface {
+ RESTClient() rest.Interface
+ AzureKeyVaultSecretsGetter
+}
+
+// KeyvaultV2beta1Client is used to interact with features provided by the keyvault.azure.spv.no group.
+type KeyvaultV2beta1Client struct {
+ restClient rest.Interface
+}
+
+func (c *KeyvaultV2beta1Client) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface {
+ return newAzureKeyVaultSecrets(c, namespace)
+}
+
+// NewForConfig creates a new KeyvaultV2beta1Client for the given config.
+func NewForConfig(c *rest.Config) (*KeyvaultV2beta1Client, error) {
+ config := *c
+ if err := setConfigDefaults(&config); err != nil {
+ return nil, err
+ }
+ client, err := rest.RESTClientFor(&config)
+ if err != nil {
+ return nil, err
+ }
+ return &KeyvaultV2beta1Client{client}, nil
+}
+
+// NewForConfigOrDie creates a new KeyvaultV2beta1Client for the given config and
+// panics if there is an error in the config.
+func NewForConfigOrDie(c *rest.Config) *KeyvaultV2beta1Client {
+ client, err := NewForConfig(c)
+ if err != nil {
+ panic(err)
+ }
+ return client
+}
+
+// New creates a new KeyvaultV2beta1Client for the given RESTClient.
+func New(c rest.Interface) *KeyvaultV2beta1Client {
+ return &KeyvaultV2beta1Client{c}
+}
+
+func setConfigDefaults(config *rest.Config) error {
+ gv := v2beta1.SchemeGroupVersion
+ config.GroupVersion = &gv
+ config.APIPath = "/apis"
+ config.NegotiatedSerializer = scheme.Codecs.WithoutConversion()
+
+ if config.UserAgent == "" {
+ config.UserAgent = rest.DefaultKubernetesUserAgent()
+ }
+
+ return nil
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *KeyvaultV2beta1Client) RESTClient() rest.Interface {
+ if c == nil {
+ return nil
+ }
+ return c.restClient
+}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go
new file mode 100644
index 00000000..1cbb95e8
--- /dev/null
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/azurekeyvaultsecret.go
@@ -0,0 +1,198 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v2beta1
+
+import (
+ "context"
+ "time"
+
+ v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+ scheme "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/scheme"
+ v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ types "k8s.io/apimachinery/pkg/types"
+ watch "k8s.io/apimachinery/pkg/watch"
+ rest "k8s.io/client-go/rest"
+)
+
+// AzureKeyVaultSecretsGetter has a method to return a AzureKeyVaultSecretInterface.
+// A group's client should implement this interface.
+type AzureKeyVaultSecretsGetter interface {
+ AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretInterface
+}
+
+// AzureKeyVaultSecretInterface has methods to work with AzureKeyVaultSecret resources.
+type AzureKeyVaultSecretInterface interface {
+ Create(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.CreateOptions) (*v2beta1.AzureKeyVaultSecret, error)
+ Update(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v2beta1.AzureKeyVaultSecret, error)
+ UpdateStatus(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v2beta1.AzureKeyVaultSecret, error)
+ Delete(ctx context.Context, name string, opts v1.DeleteOptions) error
+ DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error
+ Get(ctx context.Context, name string, opts v1.GetOptions) (*v2beta1.AzureKeyVaultSecret, error)
+ List(ctx context.Context, opts v1.ListOptions) (*v2beta1.AzureKeyVaultSecretList, error)
+ Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error)
+ Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error)
+ AzureKeyVaultSecretExpansion
+}
+
+// azureKeyVaultSecrets implements AzureKeyVaultSecretInterface
+type azureKeyVaultSecrets struct {
+ client rest.Interface
+ ns string
+}
+
+// newAzureKeyVaultSecrets returns a AzureKeyVaultSecrets
+func newAzureKeyVaultSecrets(c *KeyvaultV2beta1Client, namespace string) *azureKeyVaultSecrets {
+ return &azureKeyVaultSecrets{
+ client: c.RESTClient(),
+ ns: namespace,
+ }
+}
+
+// Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any.
+func (c *azureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ result = &v2beta1.AzureKeyVaultSecret{}
+ err = c.client.Get().
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ Name(name).
+ VersionedParams(&options, scheme.ParameterCodec).
+ Do(ctx).
+ Into(result)
+ return
+}
+
+// List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors.
+func (c *azureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *v2beta1.AzureKeyVaultSecretList, err error) {
+ var timeout time.Duration
+ if opts.TimeoutSeconds != nil {
+ timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+ }
+ result = &v2beta1.AzureKeyVaultSecretList{}
+ err = c.client.Get().
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ VersionedParams(&opts, scheme.ParameterCodec).
+ Timeout(timeout).
+ Do(ctx).
+ Into(result)
+ return
+}
+
+// Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets.
+func (c *azureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+ var timeout time.Duration
+ if opts.TimeoutSeconds != nil {
+ timeout = time.Duration(*opts.TimeoutSeconds) * time.Second
+ }
+ opts.Watch = true
+ return c.client.Get().
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ VersionedParams(&opts, scheme.ParameterCodec).
+ Timeout(timeout).
+ Watch(ctx)
+}
+
+// Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
+func (c *azureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ result = &v2beta1.AzureKeyVaultSecret{}
+ err = c.client.Post().
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ VersionedParams(&opts, scheme.ParameterCodec).
+ Body(azureKeyVaultSecret).
+ Do(ctx).
+ Into(result)
+ return
+}
+
+// Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
+func (c *azureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ result = &v2beta1.AzureKeyVaultSecret{}
+ err = c.client.Put().
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ Name(azureKeyVaultSecret.Name).
+ VersionedParams(&opts, scheme.ParameterCodec).
+ Body(azureKeyVaultSecret).
+ Do(ctx).
+ Into(result)
+ return
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *azureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ result = &v2beta1.AzureKeyVaultSecret{}
+ err = c.client.Put().
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ Name(azureKeyVaultSecret.Name).
+ SubResource("status").
+ VersionedParams(&opts, scheme.ParameterCodec).
+ Body(azureKeyVaultSecret).
+ Do(ctx).
+ Into(result)
+ return
+}
+
+// Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs.
+func (c *azureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+ return c.client.Delete().
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ Name(name).
+ Body(&opts).
+ Do(ctx).
+ Error()
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *azureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+ var timeout time.Duration
+ if listOpts.TimeoutSeconds != nil {
+ timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second
+ }
+ return c.client.Delete().
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ VersionedParams(&listOpts, scheme.ParameterCodec).
+ Timeout(timeout).
+ Body(&opts).
+ Do(ctx).
+ Error()
+}
+
+// Patch applies the patch and returns the patched azureKeyVaultSecret.
+func (c *azureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ result = &v2beta1.AzureKeyVaultSecret{}
+ err = c.client.Patch(pt).
+ Namespace(c.ns).
+ Resource("azurekeyvaultsecrets").
+ Name(name).
+ SubResource(subresources...).
+ VersionedParams(&opts, scheme.ParameterCodec).
+ Body(data).
+ Do(ctx).
+ Into(result)
+ return
+}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/doc.go
new file mode 100644
index 00000000..98601438
--- /dev/null
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/doc.go
@@ -0,0 +1,23 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// This package has the automatically generated typed clients.
+package v2beta1
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/doc.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/doc.go
new file mode 100644
index 00000000..d55229c6
--- /dev/null
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/doc.go
@@ -0,0 +1,23 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+// Package fake has the automatically generated clients.
+package fake
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvault_client.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvault_client.go
new file mode 100644
index 00000000..8676cf95
--- /dev/null
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvault_client.go
@@ -0,0 +1,43 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+ v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1"
+ rest "k8s.io/client-go/rest"
+ testing "k8s.io/client-go/testing"
+)
+
+type FakeKeyvaultV2beta1 struct {
+ *testing.Fake
+}
+
+func (c *FakeKeyvaultV2beta1) AzureKeyVaultSecrets(namespace string) v2beta1.AzureKeyVaultSecretInterface {
+ return &FakeAzureKeyVaultSecrets{c, namespace}
+}
+
+// RESTClient returns a RESTClient that is used to communicate
+// with API server by this client implementation.
+func (c *FakeKeyvaultV2beta1) RESTClient() rest.Interface {
+ var ret *rest.RESTClient
+ return ret
+}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go
new file mode 100644
index 00000000..b0c0025f
--- /dev/null
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/fake/fake_azurekeyvaultsecret.go
@@ -0,0 +1,145 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package fake
+
+import (
+ "context"
+
+ v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+ v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ labels "k8s.io/apimachinery/pkg/labels"
+ schema "k8s.io/apimachinery/pkg/runtime/schema"
+ types "k8s.io/apimachinery/pkg/types"
+ watch "k8s.io/apimachinery/pkg/watch"
+ testing "k8s.io/client-go/testing"
+)
+
+// FakeAzureKeyVaultSecrets implements AzureKeyVaultSecretInterface
+type FakeAzureKeyVaultSecrets struct {
+ Fake *FakeKeyvaultV2beta1
+ ns string
+}
+
+var azurekeyvaultsecretsResource = schema.GroupVersionResource{Group: "keyvault.azure.spv.no", Version: "v2beta1", Resource: "azurekeyvaultsecrets"}
+
+var azurekeyvaultsecretsKind = schema.GroupVersionKind{Group: "keyvault.azure.spv.no", Version: "v2beta1", Kind: "AzureKeyVaultSecret"}
+
+// Get takes name of the azureKeyVaultSecret, and returns the corresponding azureKeyVaultSecret object, and an error if there is any.
+func (c *FakeAzureKeyVaultSecrets) Get(ctx context.Context, name string, options v1.GetOptions) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ obj, err := c.Fake.
+ Invokes(testing.NewGetAction(azurekeyvaultsecretsResource, c.ns, name), &v2beta1.AzureKeyVaultSecret{})
+
+ if obj == nil {
+ return nil, err
+ }
+ return obj.(*v2beta1.AzureKeyVaultSecret), err
+}
+
+// List takes label and field selectors, and returns the list of AzureKeyVaultSecrets that match those selectors.
+func (c *FakeAzureKeyVaultSecrets) List(ctx context.Context, opts v1.ListOptions) (result *v2beta1.AzureKeyVaultSecretList, err error) {
+ obj, err := c.Fake.
+ Invokes(testing.NewListAction(azurekeyvaultsecretsResource, azurekeyvaultsecretsKind, c.ns, opts), &v2beta1.AzureKeyVaultSecretList{})
+
+ if obj == nil {
+ return nil, err
+ }
+
+ label, _, _ := testing.ExtractFromListOptions(opts)
+ if label == nil {
+ label = labels.Everything()
+ }
+ list := &v2beta1.AzureKeyVaultSecretList{ListMeta: obj.(*v2beta1.AzureKeyVaultSecretList).ListMeta}
+ for _, item := range obj.(*v2beta1.AzureKeyVaultSecretList).Items {
+ if label.Matches(labels.Set(item.Labels)) {
+ list.Items = append(list.Items, item)
+ }
+ }
+ return list, err
+}
+
+// Watch returns a watch.Interface that watches the requested azureKeyVaultSecrets.
+func (c *FakeAzureKeyVaultSecrets) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) {
+ return c.Fake.
+ InvokesWatch(testing.NewWatchAction(azurekeyvaultsecretsResource, c.ns, opts))
+
+}
+
+// Create takes the representation of a azureKeyVaultSecret and creates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
+func (c *FakeAzureKeyVaultSecrets) Create(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.CreateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ obj, err := c.Fake.
+ Invokes(testing.NewCreateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{})
+
+ if obj == nil {
+ return nil, err
+ }
+ return obj.(*v2beta1.AzureKeyVaultSecret), err
+}
+
+// Update takes the representation of a azureKeyVaultSecret and updates it. Returns the server's representation of the azureKeyVaultSecret, and an error, if there is any.
+func (c *FakeAzureKeyVaultSecrets) Update(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ obj, err := c.Fake.
+ Invokes(testing.NewUpdateAction(azurekeyvaultsecretsResource, c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{})
+
+ if obj == nil {
+ return nil, err
+ }
+ return obj.(*v2beta1.AzureKeyVaultSecret), err
+}
+
+// UpdateStatus was generated because the type contains a Status member.
+// Add a +genclient:noStatus comment above the type to avoid generating UpdateStatus().
+func (c *FakeAzureKeyVaultSecrets) UpdateStatus(ctx context.Context, azureKeyVaultSecret *v2beta1.AzureKeyVaultSecret, opts v1.UpdateOptions) (*v2beta1.AzureKeyVaultSecret, error) {
+ obj, err := c.Fake.
+ Invokes(testing.NewUpdateSubresourceAction(azurekeyvaultsecretsResource, "status", c.ns, azureKeyVaultSecret), &v2beta1.AzureKeyVaultSecret{})
+
+ if obj == nil {
+ return nil, err
+ }
+ return obj.(*v2beta1.AzureKeyVaultSecret), err
+}
+
+// Delete takes name of the azureKeyVaultSecret and deletes it. Returns an error if one occurs.
+func (c *FakeAzureKeyVaultSecrets) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error {
+ _, err := c.Fake.
+ Invokes(testing.NewDeleteAction(azurekeyvaultsecretsResource, c.ns, name), &v2beta1.AzureKeyVaultSecret{})
+
+ return err
+}
+
+// DeleteCollection deletes a collection of objects.
+func (c *FakeAzureKeyVaultSecrets) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error {
+ action := testing.NewDeleteCollectionAction(azurekeyvaultsecretsResource, c.ns, listOpts)
+
+ _, err := c.Fake.Invokes(action, &v2beta1.AzureKeyVaultSecretList{})
+ return err
+}
+
+// Patch applies the patch and returns the patched azureKeyVaultSecret.
+func (c *FakeAzureKeyVaultSecrets) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v2beta1.AzureKeyVaultSecret, err error) {
+ obj, err := c.Fake.
+ Invokes(testing.NewPatchSubresourceAction(azurekeyvaultsecretsResource, c.ns, name, pt, data, subresources...), &v2beta1.AzureKeyVaultSecret{})
+
+ if obj == nil {
+ return nil, err
+ }
+ return obj.(*v2beta1.AzureKeyVaultSecret), err
+}
diff --git a/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/generated_expansion.go b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/generated_expansion.go
new file mode 100644
index 00000000..b8c95bdd
--- /dev/null
+++ b/pkg/k8s/client/clientset/versioned/typed/azurekeyvault/v2beta1/generated_expansion.go
@@ -0,0 +1,24 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by client-gen. DO NOT EDIT.
+
+package v2beta1
+
+type AzureKeyVaultSecretExpansion interface{}
diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go
index 56851e94..d60091ad 100644
--- a/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go
+++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/interface.go
@@ -24,6 +24,7 @@ package azurekeyvault
import (
v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1"
v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1"
+ v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1"
internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces"
)
@@ -33,6 +34,8 @@ type Interface interface {
V1alpha1() v1alpha1.Interface
// V1 provides access to shared informers for resources in V1.
V1() v1.Interface
+ // V2beta1 provides access to shared informers for resources in V2beta1.
+ V2beta1() v2beta1.Interface
}
type group struct {
@@ -55,3 +58,8 @@ func (g *group) V1alpha1() v1alpha1.Interface {
func (g *group) V1() v1.Interface {
return v1.New(g.factory, g.namespace, g.tweakListOptions)
}
+
+// V2beta1 returns a new v2beta1.Interface.
+func (g *group) V2beta1() v2beta1.Interface {
+ return v2beta1.New(g.factory, g.namespace, g.tweakListOptions)
+}
diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go
index 84179292..6088b352 100644
--- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go
+++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1/azurekeyvaultsecret.go
@@ -22,6 +22,7 @@ limitations under the License.
package v1
import (
+ "context"
time "time"
azurekeyvaultv1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
@@ -64,13 +65,13 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac
if tweakListOptions != nil {
tweakListOptions(&options)
}
- return client.AzurekeyvaultV1().AzureKeyVaultSecrets(namespace).List(options)
+ return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).List(context.TODO(), options)
},
WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
tweakListOptions(&options)
}
- return client.AzurekeyvaultV1().AzureKeyVaultSecrets(namespace).Watch(options)
+ return client.KeyvaultV1().AzureKeyVaultSecrets(namespace).Watch(context.TODO(), options)
},
},
&azurekeyvaultv1.AzureKeyVaultSecret{},
diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
index 3c5f5c5a..b0353c58 100644
--- a/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
+++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
@@ -22,6 +22,7 @@ limitations under the License.
package v1alpha1
import (
+ "context"
time "time"
azurekeyvaultv1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
@@ -64,13 +65,13 @@ func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespac
if tweakListOptions != nil {
tweakListOptions(&options)
}
- return client.AzurekeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).List(options)
+ return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).List(context.TODO(), options)
},
WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
if tweakListOptions != nil {
tweakListOptions(&options)
}
- return client.AzurekeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).Watch(options)
+ return client.KeyvaultV1alpha1().AzureKeyVaultSecrets(namespace).Watch(context.TODO(), options)
},
},
&azurekeyvaultv1alpha1.AzureKeyVaultSecret{},
diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go
new file mode 100644
index 00000000..e4a7eafc
--- /dev/null
+++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/azurekeyvaultsecret.go
@@ -0,0 +1,93 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v2beta1
+
+import (
+ "context"
+ time "time"
+
+ azurekeyvaultv2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+ versioned "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/clientset/versioned"
+ internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces"
+ v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/listers/azurekeyvault/v2beta1"
+ v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ runtime "k8s.io/apimachinery/pkg/runtime"
+ watch "k8s.io/apimachinery/pkg/watch"
+ cache "k8s.io/client-go/tools/cache"
+)
+
+// AzureKeyVaultSecretInformer provides access to a shared informer and lister for
+// AzureKeyVaultSecrets.
+type AzureKeyVaultSecretInformer interface {
+ Informer() cache.SharedIndexInformer
+ Lister() v2beta1.AzureKeyVaultSecretLister
+}
+
+type azureKeyVaultSecretInformer struct {
+ factory internalinterfaces.SharedInformerFactory
+ tweakListOptions internalinterfaces.TweakListOptionsFunc
+ namespace string
+}
+
+// NewAzureKeyVaultSecretInformer constructs a new informer for AzureKeyVaultSecret type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewAzureKeyVaultSecretInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer {
+ return NewFilteredAzureKeyVaultSecretInformer(client, namespace, resyncPeriod, indexers, nil)
+}
+
+// NewFilteredAzureKeyVaultSecretInformer constructs a new informer for AzureKeyVaultSecret type.
+// Always prefer using an informer factory to get a shared informer instead of getting an independent
+// one. This reduces memory footprint and number of connections to the server.
+func NewFilteredAzureKeyVaultSecretInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer {
+ return cache.NewSharedIndexInformer(
+ &cache.ListWatch{
+ ListFunc: func(options v1.ListOptions) (runtime.Object, error) {
+ if tweakListOptions != nil {
+ tweakListOptions(&options)
+ }
+ return client.KeyvaultV2beta1().AzureKeyVaultSecrets(namespace).List(context.TODO(), options)
+ },
+ WatchFunc: func(options v1.ListOptions) (watch.Interface, error) {
+ if tweakListOptions != nil {
+ tweakListOptions(&options)
+ }
+ return client.KeyvaultV2beta1().AzureKeyVaultSecrets(namespace).Watch(context.TODO(), options)
+ },
+ },
+ &azurekeyvaultv2beta1.AzureKeyVaultSecret{},
+ resyncPeriod,
+ indexers,
+ )
+}
+
+func (f *azureKeyVaultSecretInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer {
+ return NewFilteredAzureKeyVaultSecretInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions)
+}
+
+func (f *azureKeyVaultSecretInformer) Informer() cache.SharedIndexInformer {
+ return f.factory.InformerFor(&azurekeyvaultv2beta1.AzureKeyVaultSecret{}, f.defaultInformer)
+}
+
+func (f *azureKeyVaultSecretInformer) Lister() v2beta1.AzureKeyVaultSecretLister {
+ return v2beta1.NewAzureKeyVaultSecretLister(f.Informer().GetIndexer())
+}
diff --git a/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/interface.go b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/interface.go
new file mode 100644
index 00000000..fe3869cd
--- /dev/null
+++ b/pkg/k8s/client/informers/externalversions/azurekeyvault/v2beta1/interface.go
@@ -0,0 +1,48 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by informer-gen. DO NOT EDIT.
+
+package v2beta1
+
+import (
+ internalinterfaces "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/client/informers/externalversions/internalinterfaces"
+)
+
+// Interface provides access to all the informers in this group version.
+type Interface interface {
+ // AzureKeyVaultSecrets returns a AzureKeyVaultSecretInformer.
+ AzureKeyVaultSecrets() AzureKeyVaultSecretInformer
+}
+
+type version struct {
+ factory internalinterfaces.SharedInformerFactory
+ namespace string
+ tweakListOptions internalinterfaces.TweakListOptionsFunc
+}
+
+// New returns a new Interface.
+func New(f internalinterfaces.SharedInformerFactory, namespace string, tweakListOptions internalinterfaces.TweakListOptionsFunc) Interface {
+ return &version{factory: f, namespace: namespace, tweakListOptions: tweakListOptions}
+}
+
+// AzureKeyVaultSecrets returns a AzureKeyVaultSecretInformer.
+func (v *version) AzureKeyVaultSecrets() AzureKeyVaultSecretInformer {
+ return &azureKeyVaultSecretInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions}
+}
diff --git a/pkg/k8s/client/informers/externalversions/factory.go b/pkg/k8s/client/informers/externalversions/factory.go
index e2040ac8..9db19d8f 100644
--- a/pkg/k8s/client/informers/externalversions/factory.go
+++ b/pkg/k8s/client/informers/externalversions/factory.go
@@ -175,9 +175,9 @@ type SharedInformerFactory interface {
ForResource(resource schema.GroupVersionResource) (GenericInformer, error)
WaitForCacheSync(stopCh <-chan struct{}) map[reflect.Type]bool
- Azurekeyvault() azurekeyvault.Interface
+ Keyvault() azurekeyvault.Interface
}
-func (f *sharedInformerFactory) Azurekeyvault() azurekeyvault.Interface {
+func (f *sharedInformerFactory) Keyvault() azurekeyvault.Interface {
return azurekeyvault.New(f, f.namespace, f.tweakListOptions)
}
diff --git a/pkg/k8s/client/informers/externalversions/generic.go b/pkg/k8s/client/informers/externalversions/generic.go
index e4cb97f9..84c5005d 100644
--- a/pkg/k8s/client/informers/externalversions/generic.go
+++ b/pkg/k8s/client/informers/externalversions/generic.go
@@ -26,6 +26,7 @@ import (
v1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1"
v1alpha1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v1alpha1"
+ v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
schema "k8s.io/apimachinery/pkg/runtime/schema"
cache "k8s.io/client-go/tools/cache"
)
@@ -56,13 +57,17 @@ func (f *genericInformer) Lister() cache.GenericLister {
// TODO extend this to unknown resources with a client pool
func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource) (GenericInformer, error) {
switch resource {
- // Group=azurekeyvault.spv.no, Version=v1
+ // Group=keyvault.azure.spv.no, Version=v1
case v1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"):
- return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V1().AzureKeyVaultSecrets().Informer()}, nil
+ return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V1().AzureKeyVaultSecrets().Informer()}, nil
- // Group=azurekeyvault.spv.no, Version=v1alpha1
+ // Group=keyvault.azure.spv.no, Version=v1alpha1
case v1alpha1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"):
- return &genericInformer{resource: resource.GroupResource(), informer: f.Azurekeyvault().V1alpha1().AzureKeyVaultSecrets().Informer()}, nil
+ return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V1alpha1().AzureKeyVaultSecrets().Informer()}, nil
+
+ // Group=keyvault.azure.spv.no, Version=v2beta1
+ case v2beta1.SchemeGroupVersion.WithResource("azurekeyvaultsecrets"):
+ return &genericInformer{resource: resource.GroupResource(), informer: f.Keyvault().V2beta1().AzureKeyVaultSecrets().Informer()}, nil
}
diff --git a/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go
index 848565f8..5decd711 100644
--- a/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go
+++ b/pkg/k8s/client/listers/azurekeyvault/v1/azurekeyvaultsecret.go
@@ -29,8 +29,10 @@ import (
)
// AzureKeyVaultSecretLister helps list AzureKeyVaultSecrets.
+// All objects returned here must be treated as read-only.
type AzureKeyVaultSecretLister interface {
// List lists all AzureKeyVaultSecrets in the indexer.
+ // Objects returned here must be treated as read-only.
List(selector labels.Selector) (ret []*v1.AzureKeyVaultSecret, err error)
// AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets.
AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister
@@ -61,10 +63,13 @@ func (s *azureKeyVaultSecretLister) AzureKeyVaultSecrets(namespace string) Azure
}
// AzureKeyVaultSecretNamespaceLister helps list and get AzureKeyVaultSecrets.
+// All objects returned here must be treated as read-only.
type AzureKeyVaultSecretNamespaceLister interface {
// List lists all AzureKeyVaultSecrets in the indexer for a given namespace.
+ // Objects returned here must be treated as read-only.
List(selector labels.Selector) (ret []*v1.AzureKeyVaultSecret, err error)
// Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name.
+ // Objects returned here must be treated as read-only.
Get(name string) (*v1.AzureKeyVaultSecret, error)
AzureKeyVaultSecretNamespaceListerExpansion
}
diff --git a/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
index 7a96f389..07c46eb1 100644
--- a/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
+++ b/pkg/k8s/client/listers/azurekeyvault/v1alpha1/azurekeyvaultsecret.go
@@ -29,8 +29,10 @@ import (
)
// AzureKeyVaultSecretLister helps list AzureKeyVaultSecrets.
+// All objects returned here must be treated as read-only.
type AzureKeyVaultSecretLister interface {
// List lists all AzureKeyVaultSecrets in the indexer.
+ // Objects returned here must be treated as read-only.
List(selector labels.Selector) (ret []*v1alpha1.AzureKeyVaultSecret, err error)
// AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets.
AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister
@@ -61,10 +63,13 @@ func (s *azureKeyVaultSecretLister) AzureKeyVaultSecrets(namespace string) Azure
}
// AzureKeyVaultSecretNamespaceLister helps list and get AzureKeyVaultSecrets.
+// All objects returned here must be treated as read-only.
type AzureKeyVaultSecretNamespaceLister interface {
// List lists all AzureKeyVaultSecrets in the indexer for a given namespace.
+ // Objects returned here must be treated as read-only.
List(selector labels.Selector) (ret []*v1alpha1.AzureKeyVaultSecret, err error)
// Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name.
+ // Objects returned here must be treated as read-only.
Get(name string) (*v1alpha1.AzureKeyVaultSecret, error)
AzureKeyVaultSecretNamespaceListerExpansion
}
diff --git a/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go b/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go
new file mode 100644
index 00000000..5ec6294b
--- /dev/null
+++ b/pkg/k8s/client/listers/azurekeyvault/v2beta1/azurekeyvaultsecret.go
@@ -0,0 +1,102 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v2beta1
+
+import (
+ v2beta1 "github.com/SparebankenVest/azure-key-vault-to-kubernetes/pkg/k8s/apis/azurekeyvault/v2beta1"
+ "k8s.io/apimachinery/pkg/api/errors"
+ "k8s.io/apimachinery/pkg/labels"
+ "k8s.io/client-go/tools/cache"
+)
+
+// AzureKeyVaultSecretLister helps list AzureKeyVaultSecrets.
+// All objects returned here must be treated as read-only.
+type AzureKeyVaultSecretLister interface {
+ // List lists all AzureKeyVaultSecrets in the indexer.
+ // Objects returned here must be treated as read-only.
+ List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error)
+ // AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets.
+ AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister
+ AzureKeyVaultSecretListerExpansion
+}
+
+// azureKeyVaultSecretLister implements the AzureKeyVaultSecretLister interface.
+type azureKeyVaultSecretLister struct {
+ indexer cache.Indexer
+}
+
+// NewAzureKeyVaultSecretLister returns a new AzureKeyVaultSecretLister.
+func NewAzureKeyVaultSecretLister(indexer cache.Indexer) AzureKeyVaultSecretLister {
+ return &azureKeyVaultSecretLister{indexer: indexer}
+}
+
+// List lists all AzureKeyVaultSecrets in the indexer.
+func (s *azureKeyVaultSecretLister) List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error) {
+ err = cache.ListAll(s.indexer, selector, func(m interface{}) {
+ ret = append(ret, m.(*v2beta1.AzureKeyVaultSecret))
+ })
+ return ret, err
+}
+
+// AzureKeyVaultSecrets returns an object that can list and get AzureKeyVaultSecrets.
+func (s *azureKeyVaultSecretLister) AzureKeyVaultSecrets(namespace string) AzureKeyVaultSecretNamespaceLister {
+ return azureKeyVaultSecretNamespaceLister{indexer: s.indexer, namespace: namespace}
+}
+
+// AzureKeyVaultSecretNamespaceLister helps list and get AzureKeyVaultSecrets.
+// All objects returned here must be treated as read-only.
+type AzureKeyVaultSecretNamespaceLister interface {
+ // List lists all AzureKeyVaultSecrets in the indexer for a given namespace.
+ // Objects returned here must be treated as read-only.
+ List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error)
+ // Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name.
+ // Objects returned here must be treated as read-only.
+ Get(name string) (*v2beta1.AzureKeyVaultSecret, error)
+ AzureKeyVaultSecretNamespaceListerExpansion
+}
+
+// azureKeyVaultSecretNamespaceLister implements the AzureKeyVaultSecretNamespaceLister
+// interface.
+type azureKeyVaultSecretNamespaceLister struct {
+ indexer cache.Indexer
+ namespace string
+}
+
+// List lists all AzureKeyVaultSecrets in the indexer for a given namespace.
+func (s azureKeyVaultSecretNamespaceLister) List(selector labels.Selector) (ret []*v2beta1.AzureKeyVaultSecret, err error) {
+ err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
+ ret = append(ret, m.(*v2beta1.AzureKeyVaultSecret))
+ })
+ return ret, err
+}
+
+// Get retrieves the AzureKeyVaultSecret from the indexer for a given namespace and name.
+func (s azureKeyVaultSecretNamespaceLister) Get(name string) (*v2beta1.AzureKeyVaultSecret, error) {
+ obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
+ if err != nil {
+ return nil, err
+ }
+ if !exists {
+ return nil, errors.NewNotFound(v2beta1.Resource("azurekeyvaultsecret"), name)
+ }
+ return obj.(*v2beta1.AzureKeyVaultSecret), nil
+}
diff --git a/pkg/k8s/client/listers/azurekeyvault/v2beta1/expansion_generated.go b/pkg/k8s/client/listers/azurekeyvault/v2beta1/expansion_generated.go
new file mode 100644
index 00000000..7129d527
--- /dev/null
+++ b/pkg/k8s/client/listers/azurekeyvault/v2beta1/expansion_generated.go
@@ -0,0 +1,30 @@
+/*
+Copyright Sparebanken Vest
+
+Based on the Kubernetes controller example at
+https://github.com/kubernetes/sample-controller
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// Code generated by lister-gen. DO NOT EDIT.
+
+package v2beta1
+
+// AzureKeyVaultSecretListerExpansion allows custom methods to be added to
+// AzureKeyVaultSecretLister.
+type AzureKeyVaultSecretListerExpansion interface{}
+
+// AzureKeyVaultSecretNamespaceListerExpansion allows custom methods to be added to
+// AzureKeyVaultSecretNamespaceLister.
+type AzureKeyVaultSecretNamespaceListerExpansion interface{}
diff --git a/tools/go.mod b/tools/go.mod
new file mode 100644
index 00000000..6804956a
--- /dev/null
+++ b/tools/go.mod
@@ -0,0 +1,8 @@
+module github.com/SparebankenVest/azure-key-vault-to-kubernetesl/tools
+
+go 1.14
+
+require (
+ github.com/client9/misspell v0.3.4
+ github.com/golangci/golangci-lint v1.30.0
+)
diff --git a/tools/go.sum b/tools/go.sum
new file mode 100644
index 00000000..0e729143
--- /dev/null
+++ b/tools/go.sum
@@ -0,0 +1,606 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5 h1:XTrzB+F8+SpRmbhAH8HLxhiiG6nYNwaBZjrFps1oWEk=
+github.com/Djarvur/go-err113 v0.0.0-20200511133814-5174e21577d5/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs=
+github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
+github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/OpenPeeDeeP/depguard v1.0.1 h1:VlW4R6jmBIv3/u1JNlawEvJMM4J+dPORPaZasQee8Us=
+github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
+github.com/bombsimon/wsl/v3 v3.1.0 h1:E5SRssoBgtVFPcYWUOFJEcgaySgdtTNYzsSKDOY7ss8=
+github.com/bombsimon/wsl/v3 v3.1.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/daixiang0/gci v0.0.0-20200727065011-66f1df783cb2 h1:3Lhhps85OdA8ezsEKu+IA1hE+DBTjt/fjd7xNCrHbVA=
+github.com/daixiang0/gci v0.0.0-20200727065011-66f1df783cb2/go.mod h1:+AV8KmHTGxxwp/pY84TLQfFKp2vuKXXJVzF3kD/hfR4=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/denis-tingajkin/go-header v0.3.1 h1:ymEpSiFjeItCy1FOP+x0M2KdCELdEAHUsNa8F+hHc6w=
+github.com/denis-tingajkin/go-header v0.3.1/go.mod h1:sq/2IxMhaZX+RRcgHfCRx/m0M5na0fBt4/CRe7Lrji0=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s=
+github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-critic/go-critic v0.5.0 h1:Ic2p5UCl5fX/2WX2w8nroPpPhxRNsNTMlJzsu/uqwnM=
+github.com/go-critic/go-critic v0.5.0/go.mod h1:4jeRh3ZAVnRYhuWdOEvwzVqLUpxMSoAT0xZ74JsTPlo=
+github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g=
+github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
+github.com/go-toolsmith/astcopy v1.0.0 h1:OMgl1b1MEpjFQ1m5ztEO06rz5CUd3oBv9RF7+DyvdG8=
+github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
+github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+github.com/go-toolsmith/astequal v1.0.0 h1:4zxD8j3JRFNyLN46lodQuqz3xdKSrur7U/sr0SDS/gQ=
+github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg=
+github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k=
+github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
+github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
+github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk=
+github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg=
+github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
+github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
+github.com/go-toolsmith/pkgload v1.0.0 h1:4DFWWMXVfbcN5So1sBNW9+yeiMqLFGl1wFLTL5R0Tgg=
+github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
+github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4=
+github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
+github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
+github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk=
+github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
+github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo=
+github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM=
+github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
+github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
+github.com/gofrs/flock v0.7.1 h1:DP+LD/t0njgoPBvT5MJLeliUIVQR03hiKR6vezdwHlc=
+github.com/gofrs/flock v0.7.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0=
+github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
+github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM=
+github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
+github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6 h1:YYWNAGTKWhKpcLLt7aSj/odlKrSrelQwlovBpDuf19w=
+github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
+github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw=
+github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
+github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8=
+github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
+github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d h1:pXTK/gkVNs7Zyy7WKgLXmpQ5bHTrq5GDsp8R9Qs67g0=
+github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
+github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks=
+github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
+github.com/golangci/golangci-lint v1.30.0 h1:UhdK5WbO0GBd7W+k2lOD7BEJH4Wsa7zKfw8m3/aEJGQ=
+github.com/golangci/golangci-lint v1.30.0/go.mod h1:5t0i3wHlqQc9deBBvZsP+a/4xz7cfjV+zhp5U0Mzp14=
+github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc h1:gLLhTLMk2/SutryVJ6D4VZCU3CUqr8YloG7FPIBWFpI=
+github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
+github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA=
+github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
+github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
+github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
+github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk=
+github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
+github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us=
+github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
+github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg=
+github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
+github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys=
+github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0 h1:/QaMHBdZ26BB3SSst0Iwl10Epc+xhTquomWX0oZEB6w=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/gookit/color v1.2.5/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
+github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
+github.com/gostaticanalysis/analysisutil v0.0.3 h1:iwp+5/UAyzQSFgQ4uR2sni99sJ8Eo9DEacKWM5pekIg=
+github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a h1:GmsqmapfzSJkm28dhRoHz2tLRbJmqhU86IPgBtN3mmk=
+github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s=
+github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 h1:jNYPNLe3d8smommaoQlK7LOA5ESyUJJ+Wf79ZtA7Vp4=
+github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
+github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.10.4/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/klauspost/compress v1.10.5/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kyoh86/exportloopref v0.1.7 h1:u+iHuTbkbTS2D/JP7fCuZDo/t3rBVGo3Hf58Rc+lQVY=
+github.com/kyoh86/exportloopref v0.1.7/go.mod h1:h1rDl2Kdj97+Kwh4gdz3ujE7XHmH51Q0lUiZ1z4NLj8=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
+github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/maratori/testpackage v1.0.1 h1:QtJ5ZjqapShm0w5DosRjg0PRlSdAdlx+W6cCKoALdbQ=
+github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU=
+github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb h1:RHba4YImhrUVQDHUCe2BNSOz4tVy2yGyXhvYDvxGgeE=
+github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw=
+github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
+github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mozilla/tls-observatory v0.0.0-20200317151703-4fa42e1c2dee/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nakabonne/nestif v0.3.0 h1:+yOViDGhg8ygGrmII72nV9B/zGxY188TYpfolntsaPw=
+github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c=
+github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d h1:AREM5mwr4u1ORQBMvzfzBgpsctsbQikCVpvC+tX285E=
+github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
+github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
+github.com/nishanths/exhaustive v0.0.0-20200708172631-8866003e3856 h1:W3KBC2LFyfgd+wNudlfgCCsTo4q97MeNWrfz8/wSdSc=
+github.com/nishanths/exhaustive v0.0.0-20200708172631-8866003e3856/go.mod h1:wBEpHwM2OdmeNpdCvRPUlkEbBuaFmcK4Wv8Q7FuGW3c=
+github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78=
+github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
+github.com/onsi/ginkgo v1.13.0 h1:M76yO2HkZASFjXL0HSoZJ1AYEmQxNJmY41Jx1zNUq1Y=
+github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
+github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
+github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
+github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA=
+github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
+github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
+github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8 h1:DvnesvLtRPQOvaUbfXfh0tpMHg29by0H7F2U+QIkSu8=
+github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k=
+github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY=
+github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.6.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryancurrah/gomodguard v1.1.0 h1:DWbye9KyMgytn8uYpuHkwf0RHqAYO6Ay/D0TbCpPtVU=
+github.com/ryancurrah/gomodguard v1.1.0/go.mod h1:4O8tr7hBODaGE6VIhfJDHcwzh5GUccKSJBU0UMXJFVM=
+github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw=
+github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/securego/gosec/v2 v2.4.0 h1:ivAoWcY5DMs9n04Abc1VkqZBO0FL0h4ShTcVsC53lCE=
+github.com/securego/gosec/v2 v2.4.0/go.mod h1:0/Q4cjmlFDfDUj1+Fib61sc+U5IQb2w+Iv9/C3wPVko=
+github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU=
+github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs=
+github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc=
+github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
+github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM=
+github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
+github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc=
+github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY=
+github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI=
+github.com/sourcegraph/go-diff v0.5.3 h1:lhIKJ2nXLZZ+AfbHpYxTn0pXpNTTui0DX7DO3xeb1Zs=
+github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVjBcBGsVmMmak=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8=
+github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
+github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
+github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
+github.com/ssgreg/nlreturn/v2 v2.0.1 h1:+lm6xFjVuNw/9t/Fh5sIwfNWefiD5bddzc6vwJ1TvRI=
+github.com/ssgreg/nlreturn/v2 v2.0.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
+github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2 h1:Xr9gkxfOP0KQWXKNqmwe8vEeSUiUj4Rlee9CMVX2ZUQ=
+github.com/tdakkota/asciicheck v0.0.0-20200416190851-d7f85be797a2/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM=
+github.com/tetafro/godot v0.4.8 h1:h61+hQraWhdI6WYqMwAwZYCE5yxL6a9/Orw4REbabSU=
+github.com/tetafro/godot v0.4.8/go.mod h1:/7NLHhv08H1+8DNj0MElpAACw1ajsCuf3TKNQxA5S+0=
+github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e h1:RumXZ56IrCj4CL+g1b9OL/oH0QnsF976bC8xQFYUD5Q=
+github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa h1:RC4maTWLKKwb7p1cnoygsbKIgNlJqSYBeAFON3Ar8As=
+github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
+github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
+github.com/ultraware/funlen v0.0.2 h1:Av96YVBwwNSe4MLR7iI/BIa3VyI7/djnto/pK3Uxbdo=
+github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
+github.com/ultraware/whitespace v0.0.4 h1:If7Va4cM03mpgrNH9k49/VOicWpGoG70XPBFFODYDsg=
+github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
+github.com/uudashr/gocognit v1.0.1 h1:MoG2fZ0b/Eo7NXoIwCVFLG5JED3qgQz5/NEE+rOsjPs=
+github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
+github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
+github.com/valyala/fasthttp v1.12.0/go.mod h1:229t1eWu9UXTPmoUkbpN/fctKPBY4IJoFXQnxHGXy6E=
+github.com/valyala/quicktemplate v1.5.1/go.mod h1:v7yYWpBEiutDyNfVaph6oC/yKwejzVyTX/2cwwHxyok=
+github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
+golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
+golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344 h1:vGXIOMxbNfDTk/aXCmfdLgkrSV+Z2tcbze+pEc3v5W4=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299 h1:DYfZAGf2WMFjMxbgTjaC+2HC7NkNAQs+6Q8b9WEB/F4=
+golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200117220505-0cba7a3a9ee9/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200321224714-0d839f3cf2ed/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200519015757-0d0afa43d58a/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200701041122-1837592efa10/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305 h1:yaM5S0KcY0lIoZo7Fl+oi91b/DdlU2zuWpfHrpWbCS0=
+golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
+gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno=
+gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f h1:gi7cb8HTDZ6q8VqsUpkdoFi3vxwHMneQ6+Q5Ap5hjPE=
+mvdan.cc/gofumpt v0.0.0-20200709182408-4fd085cb6d5f/go.mod h1:9VQ397fNXEnF84t90W4r4TRCQK+pg9f8ugVfyj+S26w=
+mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
+mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
+mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo=
+mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
+mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4=
+mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c=
+sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
diff --git a/tools/tools.go b/tools/tools.go
new file mode 100644
index 00000000..0e4e2518
--- /dev/null
+++ b/tools/tools.go
@@ -0,0 +1,8 @@
+// +build tools
+
+package tools
+
+import (
+ _ "github.com/client9/misspell/cmd/misspell"
+ _ "github.com/golangci/golangci-lint/cmd/golangci-lint"
+)