diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e398907d3b..b482691e32 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -17,7 +17,15 @@ updates: prefix: chore include: scope - package-ecosystem: "docker" - directory: "/build/" + directory: "/build" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 + commit-message: + prefix: chore + include: scope +- package-ecosystem: "docker" + directory: "/build/operator" schedule: interval: "weekly" open-pull-requests-limit: 10 diff --git a/.github/workflows/codecov.yml b/.github/workflows/codecov.yml index e969fc7362..51d6029fe4 100644 --- a/.github/workflows/codecov.yml +++ b/.github/workflows/codecov.yml @@ -19,6 +19,13 @@ jobs: key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- + - name: Cache Docker layers + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache-op + key: ${{ runner.os }}-buildx-op-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx-op- - name: Set up QEMU uses: docker/setup-qemu-action@v1 - name: Set up Docker Buildx @@ -32,8 +39,18 @@ jobs: push: false cache-from: type=local,src=/tmp/.buildx-cache target: go-codecov - outputs: type=local,dest=. + outputs: type=local,dest=/tmp/zitadel + - uses: docker/build-push-action@v2 + with: + context: . + file: ./build/operator/Dockerfile + platforms: linux/amd64 + tags: ${{ env.REGISTRY }}/${{ github.repository }}:coverage + push: false + cache-from: type=local,src=/tmp/.buildx-cache-op + target: go-codecov + outputs: type=local,dest=/tmp/operator - uses: codecov/codecov-action@v1 with: - file: ./profile.cov + files: /tmp/zitadel/profile.cov,/tmp/operator/profile.cov name: codecov-go \ No newline at end of file diff --git a/.github/workflows/operator.yml b/.github/workflows/operator.yml new file mode 100644 index 0000000000..99bbe1ba50 --- /dev/null +++ b/.github/workflows/operator.yml @@ -0,0 +1,165 @@ +name: Operator Release +on: push + +env: + GITHUB_TOKEN: ${{ secrets.CR_PAT }} + REGISTRY: ghcr.io + GO_VERSION: '1.15' + DOCKER_IMAGE_NAME: ${{ github.repository }}-operator + BACKUP_IMAGE_NAME: ${{ github.repository }}-crbackup + +jobs: + container: + runs-on: ubuntu-18.04 + name: Build ${{ matrix.goos }}-${{ matrix.goarch }} + strategy: + matrix: + goos: [ 'linux', 'darwin', 'windows' ] + goarch: [ 'amd64' ] + steps: + - name: Source checkout + uses: actions/checkout@v2 + - name: Set output + id: branch + run: echo ::set-output name=short_ref::${GITHUB_REF#refs/*/} + - name: Semantic Release + id: semantic + uses: cycjimmy/semantic-release-action@v2 + with: + dry_run: true + semantic_version: 17.0.4 + - name: Set version + id: version + run: | + if ${{ steps.semantic.outputs.new_release_published == 'true' }}; then + echo ::set-output name=version::${{ steps.semantic.outputs.new_release_version }} + else + echo ::set-output name=version::${{ steps.branch.outputs.short_ref }} + fi + - name: Check outputs + run: | + echo ${{ steps.branch.outputs.short_ref }} + echo ${{ steps.version.outputs.version }} + - name: Generate Short SHA Container Tag + id: vars + run: echo "::set-output name=sha_short::SHA-$(git rev-parse --short=12 HEAD)" + - name: Cache Docker layers + uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-op-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx-op- + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + - name: Login to DockerHub + uses: docker/login-action@v1 + with: + username: ${{ github.actor }} + password: ${{ secrets.CR_PAT }} + registry: ${{ env.REGISTRY }} + - uses: docker/build-push-action@v2 + name: onlybuild + with: + context: . + file: ./build/operator/Dockerfile + platforms: linux/amd64 + tags: ${{ env.REGISTRY }}/${{ env.DOCKER_IMAGE_NAME }}:${{ steps.vars.outputs.sha_short }},${{ env.REGISTRY }}/${{ env.DOCKER_IMAGE_NAME }}:${{ steps.branch.outputs.short_ref }} + push: false + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,mode=max,dest=/tmp/.buildx-cache + outputs: type=local,dest=/tmp/operator + build-args: | + OS=${{ matrix.goos }} + ARCH=${{ matrix.goarch }} + VERSION=${{ steps.version.outputs.version }} + - uses: actions/upload-artifact@v2 + with: + name: zitadelctl-${{ matrix.goos }}-${{ matrix.goarch }} + path: /tmp/operator/zitadelctl + - uses: docker/build-push-action@v2 + if: ${{ matrix.goos == 'linux' && matrix.goarch == 'amd64' }} + name: buildandpush + with: + context: . + file: ./build/operator/Dockerfile + platforms: linux/amd64 + tags: ${{ env.REGISTRY }}/${{ env.DOCKER_IMAGE_NAME }}:${{ steps.vars.outputs.sha_short }},${{ env.REGISTRY }}/${{ env.DOCKER_IMAGE_NAME }}:${{ steps.branch.outputs.short_ref }} + push: true + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,mode=max,dest=/tmp/.buildx-cache + build-args: | + OS=${{ matrix.goos }} + ARCH=${{ matrix.goarch }} + VERSION=${{ steps.version.outputs.version }} + - uses: docker/build-push-action@v2 + if: ${{ matrix.goos == 'linux' && matrix.goarch == 'amd64' }} + name: buildandpushcrbackup + with: + context: . + file: ./build/cr-backup/Dockerfile + platforms: linux/amd64 + tags: ${{ env.REGISTRY }}/${{ env.BACKUP_IMAGE_NAME }}:${{ steps.vars.outputs.sha_short }},${{ env.REGISTRY }}/${{ env.BACKUP_IMAGE_NAME }}:${{ steps.branch.outputs.short_ref }} + push: true + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,mode=max,dest=/tmp/.buildx-cache + + release: + runs-on: ubuntu-18.04 + needs: [ container ] + env: + DOCKER_USERNAME: ${{ github.actor }} + DOCKER_PASSWORD: ${{ secrets.CR_PAT }} + steps: + - name: Source checkout + uses: actions/checkout@v2 + - name: Generate Short SHA Container Tag + id: vars + run: echo "::set-output name=sha_short::SHA-$(git rev-parse --short=12 HEAD)" + - name: Check output + run: echo ${{ steps.vars.outputs.sha_short }} + - name: Docker Login + run: docker login $REGISTRY -u $GITHUB_ACTOR -p $GITHUB_TOKEN + - name: Docker Pull short-sha + run: docker pull $REGISTRY/$DOCKER_IMAGE_NAME:${{ steps.vars.outputs.sha_short }} + - name: Docker Pull short-sha + run: docker pull $REGISTRY/$BACKUP_IMAGE_NAME:${{ steps.vars.outputs.sha_short }} + - name: Download binaries + uses: actions/download-artifact@v2 + with: + path: .artifacts + - name: Semantic Release + id: semantic + uses: cycjimmy/semantic-release-action@v2 + with: + dry_run: false + semantic_version: 17.0.4 + - name: Do something when a new release published + if: steps.semantic.outputs.new_release_published == 'true' + run: | + echo ${{ steps.semantic.outputs.new_release_version }} + echo ${{ steps.semantic.outputs.new_release_major_version }} + echo ${{ steps.semantic.outputs.new_release_minor_version }} + echo ${{ steps.semantic.outputs.new_release_patch_version }} + - name: Docker Tag Version + run: | + docker tag $REGISTRY/$DOCKER_IMAGE_NAME:${{ steps.vars.outputs.sha_short }} $REGISTRY/$DOCKER_IMAGE_NAME:${{ steps.semantic.outputs.new_release_version }} + docker tag $REGISTRY/$BACKUP_IMAGE_NAME:${{ steps.vars.outputs.sha_short }} $REGISTRY/$BACKUP_IMAGE_NAME:${{ steps.semantic.outputs.new_release_version }} + if: steps.semantic.outputs.new_release_published == 'true' + - name: Docker Tag Latest + run: | + docker tag $REGISTRY/$DOCKER_IMAGE_NAME:${{ steps.vars.outputs.sha_short }} $REGISTRY/$DOCKER_IMAGE_NAME:latest + docker tag $REGISTRY/$BACKUP_IMAGE_NAME:${{ steps.vars.outputs.sha_short }} $REGISTRY/$BACKUP_IMAGE_NAME:latest + if: steps.semantic.outputs.new_release_published == 'true' + - name: Docker Push Version + run: | + docker push $REGISTRY/$DOCKER_IMAGE_NAME:${{ steps.semantic.outputs.new_release_version }} + docker push $REGISTRY/$BACKUP_IMAGE_NAME:${{ steps.semantic.outputs.new_release_version }} + if: steps.semantic.outputs.new_release_published == 'true' + - name: Docker Push Latest + run: | + docker push $REGISTRY/$DOCKER_IMAGE_NAME:latest + docker push $REGISTRY/$BACKUP_IMAGE_NAME:latest + if: steps.semantic.outputs.new_release_published == 'true' diff --git a/.github/workflows/release.yml b/.github/workflows/zitadel.yml similarity index 97% rename from .github/workflows/release.yml rename to .github/workflows/zitadel.yml index 9dee765357..ff30ce0443 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/zitadel.yml @@ -1,4 +1,4 @@ -name: Release +name: Zitadel Release on: push env: @@ -20,7 +20,7 @@ jobs: run: echo ${{ steps.branch.outputs.short_ref }} - name: Generate Short SHA Container Tag id: vars - run: echo "::set-output name=sha_short::SHA-$(git rev-parse --short HEAD)" + run: echo "::set-output name=sha_short::SHA-$(git rev-parse --short=12 HEAD)" - name: Cache Docker layers uses: actions/cache@v2 with: @@ -33,7 +33,7 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - name: Login to DockerHub - uses: docker/login-action@v1 + uses: docker/login-action@v1 with: username: ${{ github.actor }} password: ${{ secrets.CR_PAT }} @@ -59,7 +59,7 @@ jobs: uses: actions/checkout@v2 - name: Generate Short SHA Container Tag id: vars - run: echo "::set-output name=sha_short::SHA-$(git rev-parse --short HEAD)" + run: echo "::set-output name=sha_short::SHA-$(git rev-parse --short=12 HEAD)" - name: Docker Login run: docker login $REGISTRY -u $GITHUB_ACTOR -p $GITHUB_TOKEN - name: Docker Pull short-sha diff --git a/.gitignore b/.gitignore index 1fe6ace8cc..47249c59eb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ *.dll *.so *.dylib +zitadelctl # Test binary, build with `go test -c` *.test @@ -17,6 +18,7 @@ coverage.txt #Debug __debug_bin debug +sandbox.go # IDE .idea @@ -38,11 +40,12 @@ cockroach-data/* #binaries cmd/zitadel/zitadel **/statik/statik.go +zitadelctl # buildfolders and generated js tmp/ console/src/app/proto/generated/ pkg/grpc/*/*.pb.* +pkg/grpc/*/*.swagger.json pkg/grpc/*/mock/*.mock.go -pkg/grpc/*/*.swagger.json \ No newline at end of file diff --git a/.releaserc.js b/.releaserc.js index e1e3a2d036..4e06dce043 100644 --- a/.releaserc.js +++ b/.releaserc.js @@ -3,6 +3,21 @@ module.exports = { plugins: [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", - "@semantic-release/github" + ["@semantic-release/github", { + "assets": [ + { + "path": ".artifacts/zitadel-darwin-amd64/zitadelctl", + "label": "Zitadelctl Darwin x86_64" + }, + { + "path": ".artifacts/zitadel-linux-amd64/zitadelctl", + "label": "Zitadelctl Linux x86_64" + }, + { + "path": ".artifacts/zitadel-windows-amd64/zitadelctl", + "label": "Zitadelctl Windows x86_64" + } + ] + }], ] }; diff --git a/build/console/package-lock.json b/build/console/package-lock.json new file mode 100644 index 0000000000..48e341a095 --- /dev/null +++ b/build/console/package-lock.json @@ -0,0 +1,3 @@ +{ + "lockfileVersion": 1 +} diff --git a/build/cr-backup/Dockerfile b/build/cr-backup/Dockerfile new file mode 100644 index 0000000000..6ff695f1ab --- /dev/null +++ b/build/cr-backup/Dockerfile @@ -0,0 +1,22 @@ +FROM cockroachdb/cockroach:v20.2.3 + +RUN microdnf install curl wget tar gzip + +RUN wget https://storage.googleapis.com/oauth2l/latest/linux_amd64.tgz +RUN tar zxvf linux_amd64.tgz +RUN mv linux_amd64/oauth2l /usr/local/bin/oauth2l && rm -rf linux_amd64 + +COPY build/cr-backup/scripts/backup-cockroach.sh /scripts/backup.sh +RUN chmod +x /scripts/backup.sh + +COPY build/cr-backup/scripts/restore-cockroach.sh /scripts/restore.sh +RUN chmod +x /scripts/restore.sh + +COPY build/cr-backup/scripts/clean-db-cockroach.sh /scripts/clean-db.sh +RUN chmod +x /scripts/clean-db.sh +COPY build/cr-backup/scripts/clean-migration-cockroach.sh /scripts/clean-migration.sh +RUN chmod +x /scripts/clean-migration.sh +COPY build/cr-backup/scripts/clean-user-cockroach.sh /scripts/clean-user.sh +RUN chmod +x /scripts/clean-user.sh + +ENTRYPOINT [ "/cockroach" ] diff --git a/build/cr-backup/scripts/backup-cockroach.sh b/build/cr-backup/scripts/backup-cockroach.sh new file mode 100644 index 0000000000..7f15c7ba1d --- /dev/null +++ b/build/cr-backup/scripts/backup-cockroach.sh @@ -0,0 +1,17 @@ +env=$1 +bucket=$2 +db=$3 +folder=$4 +safile=$5 +certs=$6 +name=$7 + +filenamelocal=zitadel-${db}.sql +filenamebucket=zitadel-${db}-${name}.sql + +/cockroach/cockroach.sh dump --dump-mode=data --certs-dir=${certs} --host=cockroachdb-public:26257 ${db} > ${folder}/${filenamelocal} +curl -X POST \ + -H "$(oauth2l header --json ${safile} cloud-platform)" \ + -H "Content-Type: application/json" \ + --data-binary @${folder}/${filenamelocal} \ + "https://storage.googleapis.com/upload/storage/v1/b/${bucket}/o?uploadType=media&name=${env}/${name}/${filenamebucket}" \ No newline at end of file diff --git a/build/cr-backup/scripts/clean-db-cockroach.sh b/build/cr-backup/scripts/clean-db-cockroach.sh new file mode 100644 index 0000000000..c263004db9 --- /dev/null +++ b/build/cr-backup/scripts/clean-db-cockroach.sh @@ -0,0 +1,4 @@ +certs=$1 +db=$2 + +/cockroach/cockroach.sh sql --certs-dir=${certs} --host=cockroachdb-public:26257 -e "DROP DATABASE IF EXISTS ${db} CASCADE;" diff --git a/build/cr-backup/scripts/clean-migration-cockroach.sh b/build/cr-backup/scripts/clean-migration-cockroach.sh new file mode 100644 index 0000000000..0bce3645b4 --- /dev/null +++ b/build/cr-backup/scripts/clean-migration-cockroach.sh @@ -0,0 +1,3 @@ +certs=$1 + +/cockroach/cockroach.sh sql --certs-dir=${certs} --host=cockroachdb-public:26257 -e "TRUNCATE defaultdb.flyway_schema_history;" \ No newline at end of file diff --git a/build/cr-backup/scripts/clean-user-cockroach.sh b/build/cr-backup/scripts/clean-user-cockroach.sh new file mode 100644 index 0000000000..de00b8fc2f --- /dev/null +++ b/build/cr-backup/scripts/clean-user-cockroach.sh @@ -0,0 +1,4 @@ +certs=$1 +db=$2 + +/cockroach/cockroach.sh sql --certs-dir=${certs} --host=cockroachdb-public:26257 -e "DROP USER IF EXISTS ${db};" \ No newline at end of file diff --git a/build/cr-backup/scripts/restore-cockroach.sh b/build/cr-backup/scripts/restore-cockroach.sh new file mode 100644 index 0000000000..e5d1ec8818 --- /dev/null +++ b/build/cr-backup/scripts/restore-cockroach.sh @@ -0,0 +1,33 @@ +bucket=$1 +env=$2 +name=$3 +db=$4 +safile=$5 +certs=$6 + +urlencode() { + # urlencode + old_lc_collate=$LC_COLLATE + LC_COLLATE=C + + local length="${#1}" + for (( i = 0; i < length; i++ )); do + local c="${1:i:1}" + case $c in + [a-zA-Z0-9.~_-]) printf "$c" ;; + *) printf '%%%02X' "'$c" ;; + esac + done + + LC_COLLATE=$old_lc_collate +} + +filenamelocal=zitadel-${db}.sql +filenamebucket=zitadel-${db}-${name}.sql + +curl -X GET \ + -H "$(oauth2l header --json ${safile} cloud-platform)" \ + -o "${filenamelocal}" \ + "https://storage.googleapis.com/storage/v1/b/${bucket}/o/$(urlencode ${env}/${name}/${filenamebucket})?alt=media" + +/cockroach/cockroach.sh sql --certs-dir=${certs} --host=cockroachdb-public:26257 --database=${db} < ${filenamelocal} diff --git a/build/docker-compose-debug.yml b/build/docker-compose-debug.yml index e212cf4deb..fa29fdcc0e 100644 --- a/build/docker-compose-debug.yml +++ b/build/docker-compose-debug.yml @@ -4,7 +4,7 @@ services: angular: build: context: .. - dockerfile: build/dockerfile + dockerfile: dockerfile target: dev-angular-build args: ENV: dev @@ -14,7 +14,7 @@ services: go: build: context: .. - dockerfile: build/dockerfile + dockerfile: dockerfile target: dev-go-build args: ENV: dev diff --git a/build/docker-compose-dev.yml b/build/docker-compose-dev.yml index da0ec42061..f99a3c2a0a 100644 --- a/build/docker-compose-dev.yml +++ b/build/docker-compose-dev.yml @@ -4,7 +4,7 @@ services: angular: build: context: .. - dockerfile: build/dockerfile + dockerfile: dockerfile target: dev-angular-build args: ENV: dev @@ -14,7 +14,7 @@ services: go: build: context: .. - dockerfile: build/dockerfile + dockerfile: dockerfile target: dev-go-build args: ENV: dev diff --git a/build/dockerfile b/build/dockerfile index 5128278580..038b6e0450 100644 --- a/build/dockerfile +++ b/build/dockerfile @@ -89,7 +89,11 @@ COPY --from=go-base /go/src/github.com/caos/zitadel/pkg/ . ## Go test FROM go-base as go-test COPY . . -RUN go test -race -v -coverprofile=profile.cov ./... +#Migrations for cockroach-secure +RUN go install github.com/rakyll/statik +RUN ./build/operator/prebuild.sh ./migrations + +RUN go test -race -v -coverprofile=profile.cov $(go list ./... | grep -v /operator/) ## Go test FROM scratch as go-codecov @@ -114,16 +118,16 @@ RUN go get github.com/go-delve/delve/cmd/dlv ####################### FROM alpine:latest as artifact RUN adduser -D zitadel -COPY cmd/zitadel/*.yaml / -COPY --from=prod-go-build /go/src/github.com/caos/zitadel/zitadel-linux-amd64 /zitadel -RUN chmod a+x zitadel +COPY cmd/zitadel/*.yaml /app/ +COPY --from=prod-go-build /go/src/github.com/caos/zitadel/zitadel-linux-amd64 /app/zitadel +RUN chmod a+x /app/zitadel RUN ls -la / ## Scratch Image FROM scratch as final COPY --from=artifact /etc/passwd /etc/passwd -## TODO copy should be removed once the operator branch is merged -COPY --from=artifact / / +COPY --from=artifact /etc/ssl/certs /etc/ssl/certs +COPY --from=artifact /app / USER zitadel HEALTHCHECK NONE -ENTRYPOINT ["/zitadel"] \ No newline at end of file +ENTRYPOINT ["/zitadel"] diff --git a/build/operator/.dockerignore b/build/operator/.dockerignore new file mode 100644 index 0000000000..cf9284709f --- /dev/null +++ b/build/operator/.dockerignore @@ -0,0 +1 @@ +**/statik/statik.go \ No newline at end of file diff --git a/build/operator/Dockerfile b/build/operator/Dockerfile new file mode 100644 index 0000000000..cff7f3a223 --- /dev/null +++ b/build/operator/Dockerfile @@ -0,0 +1,59 @@ +####################### +## By default we build the prod enviroment +ARG ENV=prod + +####################### +## Go base build +## Speed up this step by mounting your local go mod pkg directory +####################### +FROM golang:1.15 as go-base + +WORKDIR src/github.com/caos/zitadel/ +COPY go.mod go.sum ./ +RUN go mod download + + +## Go test +FROM go-base as go-test +COPY . . +#Migrations for cockroach-secure +RUN go install github.com/rakyll/statik +RUN ./build/operator/prebuild.sh ./migrations + +RUN go test -race -v -coverprofile=profile.cov ./operator/... + +## Go test +FROM scratch as go-codecov +COPY --from=go-test /go/src/github.com/caos/zitadel/profile.cov profile.cov + +## Go prod build +FROM go-test as prod-go-build + + +ARG ARCH=amd64 +ARG OS=linux +ARG VERSION=none +RUN CGO_ENABLED=0 GOOS=${OS} GOARCH=${ARCH} go build -a -installsuffix cgo -ldflags "-extldflags '-static' -X main.Version=${VERSION}" -o zitadelctl cmd/zitadelctl/main.go + +## Go dev build +FROM go-base as dev-go-build +RUN go get github.com/go-delve/delve/cmd/dlv + +####################### +## Final Production Image +####################### +FROM alpine:latest as artifact +RUN adduser -D zitadel + +ARG ARCH=amd64 +ARG OS=linux +COPY --from=prod-go-build /go/src/github.com/caos/zitadel/zitadelctl /app/zitadelctl +RUN chmod a+x /app/zitadelctl + +## Scratch Image +FROM scratch as final +COPY --from=artifact /etc/passwd /etc/passwd +COPY --from=artifact /app / +USER zitadel +HEALTHCHECK NONE +ENTRYPOINT ["/zitadelctl"] diff --git a/build/operator/prebuild.sh b/build/operator/prebuild.sh new file mode 100755 index 0000000000..b9cb991522 --- /dev/null +++ b/build/operator/prebuild.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e + +statik -src=$1 \ No newline at end of file diff --git a/changelog.config.js b/changelog.config.js new file mode 100644 index 0000000000..e2f2b78884 --- /dev/null +++ b/changelog.config.js @@ -0,0 +1,3 @@ +module.exports = { + "disableEmoji": true +}; diff --git a/cmd/database-debug/main.go b/cmd/database-debug/main.go new file mode 100644 index 0000000000..40cfb3c8c1 --- /dev/null +++ b/cmd/database-debug/main.go @@ -0,0 +1,50 @@ +package main + +import ( + "flag" + "io/ioutil" + + "github.com/caos/orbos/pkg/kubernetes" + + "github.com/caos/zitadel/operator/start" + + "github.com/caos/orbos/mntr" + "github.com/caos/zitadel/operator/helpers" +) + +func main() { + + orbconfig := flag.String("orbconfig", "~/.orb/config", "The orbconfig file to use") + kubeconfig := flag.String("kubeconfig", "~/.kube/config", "The kubeconfig file to use") + verbose := flag.Bool("verbose", false, "Print debug levelled logs") + + flag.Parse() + + monitor := mntr.Monitor{ + OnInfo: mntr.LogMessage, + OnChange: mntr.LogMessage, + OnError: mntr.LogError, + } + + if *verbose { + monitor = monitor.Verbose() + } + + kc, err := ioutil.ReadFile(helpers.PruneHome(*kubeconfig)) + if err != nil { + panic(err) + } + + if err := start.Database( + monitor, + helpers.PruneHome(*orbconfig), + kubernetes.NewK8sClient(monitor, strPtr(string(kc))), + strPtr("database-development"), + ); err != nil { + panic(err) + } +} + +func strPtr(str string) *string { + return &str +} diff --git a/cmd/operator-debug/main.go b/cmd/operator-debug/main.go new file mode 100644 index 0000000000..8a1fb005f6 --- /dev/null +++ b/cmd/operator-debug/main.go @@ -0,0 +1,47 @@ +package main + +import ( + "flag" + "io/ioutil" + + "github.com/caos/orbos/mntr" + "github.com/caos/orbos/pkg/kubernetes" + "github.com/caos/zitadel/operator/helpers" + "github.com/caos/zitadel/operator/start" +) + +func main() { + orbconfig := flag.String("orbconfig", "~/.orb/config", "The orbconfig file to use") + kubeconfig := flag.String("kubeconfig", "~/.kube/config", "The kubeconfig file to use") + verbose := flag.Bool("verbose", false, "Print debug levelled logs") + + flag.Parse() + + monitor := mntr.Monitor{ + OnInfo: mntr.LogMessage, + OnChange: mntr.LogMessage, + OnError: mntr.LogError, + } + + if *verbose { + monitor = monitor.Verbose() + } + + kc, err := ioutil.ReadFile(helpers.PruneHome(*kubeconfig)) + if err != nil { + panic(err) + } + + if err := start.Operator( + monitor, + helpers.PruneHome(*orbconfig), + kubernetes.NewK8sClient(monitor, strPtr(string(kc))), + strPtr("local-debugging"), + ); err != nil { + panic(err) + } +} + +func strPtr(str string) *string { + return &str +} diff --git a/cmd/zitadel/setup.yaml b/cmd/zitadel/setup.yaml index afc1e547c2..8d143838e4 100644 --- a/cmd/zitadel/setup.yaml +++ b/cmd/zitadel/setup.yaml @@ -88,10 +88,94 @@ SetUp: Step6: DefaultLabelPolicy: PrimaryColor: '#222324' - SecondaryColor: '#ffffff' + SecondaryColor: '#ffffff' Step7: OTP: true Step8: U2F: true Step9: - Passwordless: true \ No newline at end of file + Passwordless: true + Step10: + DefaultMailTemplate: + Template: PCFkb2N0eXBlIGh0bWw+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp2PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOnZtbCIgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIj4KCjxoZWFkPgogICAgPHRpdGxlPiA8L3RpdGxlPgogICAgPCEtLVtpZiAhbXNvXT48IS0tIC0tPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlIj4KICAgIDwhLS08IVtlbmRpZl0tLT4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAgICNvdXRsb29rIGEgewogICAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIH0KCiAgICAgICAgYm9keSB7CiAgICAgICAgICAgIG1hcmdpbjogMDsKICAgICAgICAgICAgcGFkZGluZzogMDsKICAgICAgICAgICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogICAgICAgICAgICAtbXMtdGV4dC1zaXplLWFkanVzdDogMTAwJTsKICAgICAgICB9CgogICAgICAgIHRhYmxlLAogICAgICAgIHRkIHsKICAgICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgICAgICAgbXNvLXRhYmxlLWxzcGFjZTogMHB0OwogICAgICAgICAgICBtc28tdGFibGUtcnNwYWNlOiAwcHQ7CiAgICAgICAgfQoKICAgICAgICBpbWcgewogICAgICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDEwMCU7CiAgICAgICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICAgICAgLW1zLWludGVycG9sYXRpb24tbW9kZTogYmljdWJpYzsKICAgICAgICB9CgogICAgICAgIHAgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgbWFyZ2luOiAxM3B4IDA7CiAgICAgICAgfQogICAgPC9zdHlsZT4KICAgIDwhLS1baWYgbXNvXT4KICAgICAgICAgIDx4bWw+CiAgICAgICAgICA8bzpPZmZpY2VEb2N1bWVudFNldHRpbmdzPgogICAgICAgICAgICA8bzpBbGxvd1BORy8+CiAgICAgICAgICAgIDxvOlBpeGVsc1BlckluY2g+OTY8L286UGl4ZWxzUGVySW5jaD4KICAgICAgICAgIDwvbzpPZmZpY2VEb2N1bWVudFNldHRpbmdzPgogICAgICAgICAgPC94bWw+CiAgICAgICAgICA8IVtlbmRpZl0tLT4KICAgIDwhLS1baWYgbHRlIG1zbyAxMV0+CiAgICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAgICAgICAubWotb3V0bG9vay1ncm91cC1maXggeyB3aWR0aDoxMDAlICFpbXBvcnRhbnQ7IH0KICAgICAgICAgIDwvc3R5bGU+CiAgICAgICAgICA8IVtlbmRpZl0tLT4KICAgIDwhLS1baWYgIW1zb10+PCEtLT4KICAgIDxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1MYXRvOjMwMCw0MDAsNTAwLDcwMCIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+CiAgICA8bGluayBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9VWJ1bnR1OjMwMCw0MDAsNTAwLDcwMCIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAgIEBpbXBvcnQgdXJsKGh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1MYXRvOjMwMCw0MDAsNTAwLDcwMCk7CiAgICAgICAgQGltcG9ydCB1cmwoaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVVidW50dTozMDAsNDAwLDUwMCw3MDApOwogICAgPC9zdHlsZT4KICAgIDwhLS08IVtlbmRpZl0tLT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOjQ4MHB4KSB7CiAgICAgICAgICAgIC5tai1jb2x1bW4tcGVyLTEwMCB7CiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50OwogICAgICAgICAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5tai1jb2x1bW4tcGVyLTIwIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAyMCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIG1heC13aWR0aDogMjAlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC5tai1jb2x1bW4tcGVyLTYwIHsKICAgICAgICAgICAgICAgIHdpZHRoOiA2MCUgIWltcG9ydGFudDsKICAgICAgICAgICAgICAgIG1heC13aWR0aDogNjAlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWF4LXdpZHRoOjQ4MHB4KSB7CiAgICAgICAgICAgIHRhYmxlLm1qLWZ1bGwtd2lkdGgtbW9iaWxlIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGQubWotZnVsbC13aWR0aC1tb2JpbGUgewogICAgICAgICAgICAgICAgd2lkdGg6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAgIEBtZWRpYSAobWF4LXdpZHRoOjQ4MHB4KSB7CiAgICAgICAgICAgIC5tb2JpbGVfaGlkZGVuIHsKICAgICAgICAgICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIDwvc3R5bGU+CjwvaGVhZD4KCjxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOnt7LlByaW1hcnlDb2xvcn19OyI+CjxkaXYgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6e3suUHJpbWFyeUNvbG9yfX07Ij4KICAgIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBiYWNrZ3JvdW5kPSJodHRwczovL3N0YXRpYy56aXRhZGVsLmNoL3ppdGFkZWwtbG9nby1vdXRsaW5lLWxpZ2h0LnBuZyIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiIgc3R5bGU9ImJhY2tncm91bmQ6dXJsKGh0dHBzOi8vc3RhdGljLnppdGFkZWwuY2gveml0YWRlbC1sb2dvLW91dGxpbmUtbGlnaHQucG5nKSBjZW50ZXIgdG9wIC8gYXV0byBuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjpjZW50ZXIgdG9wO2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdDtiYWNrZ3JvdW5kLXNpemU6YXV0bzt3aWR0aDoxMDAlOyI+CiAgICAgICAgPHRib2R5PgogICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPCEtLVtpZiBtc28gfCBJRV0+CiAgICAgICAgICAgIDx2OnJlY3QgIHN0eWxlPSJtc28td2lkdGgtcGVyY2VudDoxMDAwOyIgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIGZpbGw9InRydWUiIHN0cm9rZT0iZmFsc2UiPgogICAgICAgICAgICA8djpmaWxsICBvcmlnaW49IjAuNSwgMCIgcG9zaXRpb249IjAuNSwgMCIgc3JjPSJodHRwczovL3N0YXRpYy56aXRhZGVsLmNoL3ppdGFkZWwtbG9nby1vdXRsaW5lLWxpZ2h0LnBuZyIgdHlwZT0idGlsZSIgLz4KICAgICAgICAgICAgPHY6dGV4dGJveCBzdHlsZT0ibXNvLWZpdC1zaGFwZS10by10ZXh0OnRydWUiIGluc2V0PSIwLDAsMCwwIj4KICAgICAgICAgIDx0YWJsZQogICAgICAgICAgICAgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSIiIHN0eWxlPSJ3aWR0aDo4MDBweDsiIHdpZHRoPSI4MDAiCiAgICAgICAgICA+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQgc3R5bGU9ImxpbmUtaGVpZ2h0OjBweDtmb250LXNpemU6MHB4O21zby1saW5lLWhlaWdodC1ydWxlOmV4YWN0bHk7Ij4KICAgICAgICAgIDwhW2VuZGlmXS0tPgogICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOjBweCBhdXRvO21heC13aWR0aDo4MDBweDsiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImxpbmUtaGVpZ2h0OjA7Zm9udC1zaXplOjA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHN0eWxlPSJ3aWR0aDoxMDAlOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJib3JkZXI6MDtkaXJlY3Rpb246bHRyO2ZvbnQtc2l6ZTowcHg7cGFkZGluZzoyMHB4IDA7cGFkZGluZy1sZWZ0OjA7dGV4dC1hbGlnbjpjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVtpZiBtc28gfCBJRV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSByb2xlPSJwcmVzZW50YXRpb24iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSIiIHdpZHRoPSI4MDBweCIKICAgICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICA8IVtlbmRpZl0tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHN0eWxlPSJ3aWR0aDoxMDAlOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tW2lmIG1zbyB8IElFXT4KICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSIiIHN0eWxlPSJ3aWR0aDo4MDBweDsiIHdpZHRoPSI4MDAiCiAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9ImxpbmUtaGVpZ2h0OjBweDtmb250LXNpemU6MHB4O21zby1saW5lLWhlaWdodC1ydWxlOmV4YWN0bHk7Ij4KICAgICAgICAgICAgICAgICAgICAgIDwhW2VuZGlmXS0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW46MHB4IGF1dG87bWF4LXdpZHRoOjgwMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiIgc3R5bGU9IndpZHRoOjEwMCU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9ImRpcmVjdGlvbjpsdHI7Zm9udC1zaXplOjBweDtwYWRkaW5nOjA7dGV4dC1hbGlnbjpjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHJvbGU9InByZXNlbnRhdGlvbiIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSIiIHN0eWxlPSJ3aWR0aDo4MDBweDsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtai1jb2x1bW4tcGVyLTEwMCBtai1vdXRsb29rLWdyb3VwLWZpeCIgc3R5bGU9ImZvbnQtc2l6ZTowO2xpbmUtaGVpZ2h0OjA7dGV4dC1hbGlnbjpsZWZ0O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjEwMCU7ZGlyZWN0aW9uOmx0cjsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7d2lkdGg6ODAwcHg7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtlbmRpZl0tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtai1jb2x1bW4tcGVyLTEwMCBtai1vdXRsb29rLWdyb3VwLWZpeCIgc3R5bGU9ImZvbnQtc2l6ZTowcHg7dGV4dC1hbGlnbjpsZWZ0O2RpcmVjdGlvbjpsdHI7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246dG9wO3dpZHRoOjEwMCU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOnRvcDtwYWRkaW5nOjA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHN0eWxlPSIiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHN0eWxlPSJmb250LXNpemU6MHB4O3BhZGRpbmc6MjBweCAwIDUwcHggMjBweDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHN0eWxlPSJib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyLXNwYWNpbmc6MHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ3aWR0aDoxNTBweDsiPiA8aW1nIGhlaWdodD0iYXV0byIgc3JjPSJodHRwczovL3N0YXRpYy56aXRhZGVsLmNoL3ppdGFkZWwtbG9nby1saWdodC5wbmciIHN0eWxlPSJib3JkZXI6MDtkaXNwbGF5OmJsb2NrO291dGxpbmU6bm9uZTt0ZXh0LWRlY29yYXRpb246bm9uZTtoZWlnaHQ6YXV0bzt3aWR0aDoxMDAlO2ZvbnQtc2l6ZToxM3B4OyIgd2lkdGg9IjE1MCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz4gPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tW2lmIG1zbyB8IElFXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tW2lmIG1zbyB8IElFXT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9IiIgd2lkdGg9IjgwMHB4IgogICAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIDwhW2VuZGlmXS0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYWxpZ249ImNlbnRlciIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiIgc3R5bGU9IndpZHRoOjEwMCU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgPHRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9IiIgc3R5bGU9IndpZHRoOjgwMHB4OyIgd2lkdGg9IjgwMCIKICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0ibGluZS1oZWlnaHQ6MHB4O2ZvbnQtc2l6ZTowcHg7bXNvLWxpbmUtaGVpZ2h0LXJ1bGU6ZXhhY3RseTsiPgogICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbjowcHggYXV0bzttYXgtd2lkdGg6ODAwcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIiBzdHlsZT0id2lkdGg6MTAwJTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0iZGlyZWN0aW9uOmx0cjtmb250LXNpemU6MHB4O3BhZGRpbmc6MDt0ZXh0LWFsaWduOmNlbnRlcjsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVtpZiBtc28gfCBJRV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgcm9sZT0icHJlc2VudGF0aW9uIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im1vYmlsZV9oaWRkZW4tb3V0bG9vayIgc3R5bGU9InZlcnRpY2FsLWFsaWduOnRvcDt3aWR0aDoxNjBweDsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtai1jb2x1bW4tcGVyLTIwIG1qLW91dGxvb2stZ3JvdXAtZml4IG1vYmlsZV9oaWRkZW4iIHN0eWxlPSJmb250LXNpemU6MHB4O3RleHQtYWxpZ246bGVmdDtkaXJlY3Rpb246bHRyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOnRvcDt3aWR0aDoxMDAlOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9InZlcnRpY2FsLWFsaWduOnRvcDtwYWRkaW5nOjA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiIgc3R5bGU9IiIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImxlZnQiIHN0eWxlPSJmb250LXNpemU6MHB4O3BhZGRpbmc6MDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9IndpZHRoOjgwcHg7Ij4gPGltZyBoZWlnaHQ9IjEwMCIgc3JjPSJodHRwczovL3N0YXRpYy56aXRhZGVsLmNoL2ZsYXZvci1zcGlrZXMtc21hbGwtb3BhY2l0eTQwLnBuZyIgc3R5bGU9ImJvcmRlcjowO2Rpc3BsYXk6YmxvY2s7b3V0bGluZTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lO2hlaWdodDoxMDAlO3dpZHRoOjEwMCU7Zm9udC1zaXplOjEzcHg7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9IjgwIiAvPiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9IiIgc3R5bGU9InZlcnRpY2FsLWFsaWduOnRvcDt3aWR0aDo0ODBweDsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtai1jb2x1bW4tcGVyLTYwIG1qLW91dGxvb2stZ3JvdXAtZml4IiBzdHlsZT0iZm9udC1zaXplOjBweDt0ZXh0LWFsaWduOmxlZnQ7ZGlyZWN0aW9uOmx0cjtkaXNwbGF5OmlubGluZS1ibG9jazt2ZXJ0aWNhbC1hbGlnbjp0b3A7d2lkdGg6MTAwJTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7cGFkZGluZzowOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHN0eWxlPSIiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJmb250LXNpemU6MHB4O3BhZGRpbmc6MTBweCAyNXB4O3dvcmQtYnJlYWs6YnJlYWstd29yZDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OkxhdG8sIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjJyZW07Zm9udC13ZWlnaHQ6MjAwO2xpbmUtaGVpZ2h0OjE7dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6e3suU2Vjb25kYXJ5Q29sb3J9fTsiPnt7LkdyZWV0aW5nfX08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiBzdHlsZT0iZm9udC1zaXplOjBweDtwYWRkaW5nOjEwcHggMjVweDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LWZhbWlseTpMYXRvLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxcmVtO2ZvbnQtd2VpZ2h0OmxpZ2h0O2xpbmUtaGVpZ2h0OjEuNTt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjp7ey5TZWNvbmRhcnlDb2xvcn19OyI+e3suVGV4dH19PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgdmVydGljYWwtYWxpZ249Im1pZGRsZSIgc3R5bGU9ImZvbnQtc2l6ZTowcHg7cGFkZGluZzoxMHB4IDI1cHg7d29yZC1icmVhazpicmVhay13b3JkOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHN0eWxlPSJib3JkZXItY29sbGFwc2U6c2VwYXJhdGU7bGluZS1oZWlnaHQ6MTAwJTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgYmdjb2xvcj0iIzUyODJDMSIgcm9sZT0icHJlc2VudGF0aW9uIiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXJhZGl1czozcHg7Y3Vyc29yOmF1dG87bXNvLXBhZGRpbmctYWx0OjEwcHggMjVweDtiYWNrZ3JvdW5kOiM1MjgyQzE7IiB2YWxpZ249Im1pZGRsZSI+IDxhIGhyZWY9Int7LlVSTH19IiBzdHlsZT0iZGlzcGxheTppbmxpbmUtYmxvY2s7YmFja2dyb3VuZDojNTI4MkMxO2NvbG9yOiNmZmZmZmY7Zm9udC1mYW1pbHk6VWJ1bnR1LCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O2ZvbnQtd2VpZ2h0Om5vcm1hbDtsaW5lLWhlaWdodDoxMjAlO21hcmdpbjowO3RleHQtZGVjb3JhdGlvbjpub25lO3RleHQtdHJhbnNmb3JtOm5vbmU7cGFkZGluZzoxMHB4IDI1cHg7bXNvLXBhZGRpbmctYWx0OjBweDtib3JkZXItcmFkaXVzOjNweDsiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3suQnV0dG9uVGV4dH19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgYWxpZ249ImNlbnRlciIgc3R5bGU9ImZvbnQtc2l6ZTowcHg7cGFkZGluZzozMHB4IDA7d29yZC1icmVhazpicmVhay13b3JkOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6TGF0bywgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtmb250LXNpemU6MTNweDtsaW5lLWhlaWdodDoxO3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOnt7LlNlY29uZGFyeUNvbG9yfX07Ij48YSBocmVmPSJodHRwOi8vd3d3LmNhb3MuY2giIHN0eWxlPSJjb2xvcjojZTkxZTYzOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IiB0YXJnZXQ9Il9ibGFuayI+IENBT1MgQUcgPC9hPiB8IFRldWZlbmVyIFN0cmFzc2UgMTkgfCBDSC05MDAwIFN0LiBHYWxsZW48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVtpZiBtc28gfCBJRV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ibW9iaWxlX2hpZGRlbi1vdXRsb29rIiBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wO3dpZHRoOjE2MHB4OyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtlbmRpZl0tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1qLWNvbHVtbi1wZXItMjAgbWotb3V0bG9vay1ncm91cC1maXggbW9iaWxlX2hpZGRlbiIgc3R5bGU9ImZvbnQtc2l6ZTowcHg7dGV4dC1hbGlnbjpsZWZ0O2RpcmVjdGlvbjpsdHI7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246dG9wO3dpZHRoOjEwMCU7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wO3BhZGRpbmc6MDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIiBzdHlsZT0iIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiIHN0eWxlPSJmb250LXNpemU6MHB4O3BhZGRpbmc6MDt3b3JkLWJyZWFrOmJyZWFrLXdvcmQ7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9IndpZHRoOjE2MHB4OyI+IDxpbWcgaGVpZ2h0PSJhdXRvIiBzcmM9Imh0dHBzOi8vc3RhdGljLnppdGFkZWwuY2gvZmxhdm9yLXNwaWtlcy1iaWctb3BhY2l0eTQwLnBuZyIgc3R5bGU9ImJvcmRlcjowO2Rpc3BsYXk6YmxvY2s7b3V0bGluZTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lO2hlaWdodDphdXRvO3dpZHRoOjEwMCU7Zm9udC1zaXplOjEzcHg7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPSIxNjAiIC8+IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVtpZiBtc28gfCBJRV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IVtlbmRpZl0tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVtpZiBtc28gfCBJRV0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICA8IVtlbmRpZl0tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iIiB3aWR0aD0iODAwcHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBhbGlnbj0iY2VudGVyIiBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIiBzdHlsZT0id2lkdGg6MTAwJTsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVtpZiBtc28gfCBJRV0+CiAgICAgICAgICAgICAgICAgICAgICA8dGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0iIiBzdHlsZT0id2lkdGg6ODAwcHg7IiB3aWR0aD0iODAwIgogICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJsaW5lLWhlaWdodDowcHg7Zm9udC1zaXplOjBweDttc28tbGluZS1oZWlnaHQtcnVsZTpleGFjdGx5OyI+CiAgICAgICAgICAgICAgICAgICAgICA8IVtlbmRpZl0tLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOjBweCBhdXRvO21heC13aWR0aDo4MDBweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGFsaWduPSJjZW50ZXIiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiByb2xlPSJwcmVzZW50YXRpb24iIHN0eWxlPSJ3aWR0aDoxMDAlOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJkaXJlY3Rpb246bHRyO2ZvbnQtc2l6ZTowcHg7cGFkZGluZzowO3RleHQtYWxpZ246Y2VudGVyOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tW2lmIG1zbyB8IElFXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSByb2xlPSJwcmVzZW50YXRpb24iIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0iIiBzdHlsZT0id2lkdGg6ODAwcHg7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhW2VuZGlmXS0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWotY29sdW1uLXBlci0xMDAgbWotb3V0bG9vay1ncm91cC1maXgiIHN0eWxlPSJmb250LXNpemU6MDtsaW5lLWhlaWdodDowO3RleHQtYWxpZ246bGVmdDtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO2RpcmVjdGlvbjpsdHI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tW2lmIG1zbyB8IElFXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0idmVydGljYWwtYWxpZ246dG9wO3dpZHRoOjgwMHB4OyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWotY29sdW1uLXBlci0xMDAgbWotb3V0bG9vay1ncm91cC1maXgiIHN0eWxlPSJmb250LXNpemU6MHB4O3RleHQtYWxpZ246bGVmdDtkaXJlY3Rpb246bHRyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3ZlcnRpY2FsLWFsaWduOnRvcDt3aWR0aDoxMDAlOyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ2ZXJ0aWNhbC1hbGlnbjp0b3A7cGFkZGluZzoyMHB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgcm9sZT0icHJlc2VudGF0aW9uIiBzdHlsZT0iIiB3aWR0aD0iMTAwJSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCIgc3R5bGU9ImZvbnQtc2l6ZTowcHg7cGFkZGluZzowO3dvcmQtYnJlYWs6YnJlYWstd29yZDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIHJvbGU9InByZXNlbnRhdGlvbiIgc3R5bGU9ImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTtib3JkZXItc3BhY2luZzowcHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9IndpZHRoOjY1cHg7Ij4gPGltZyBoZWlnaHQ9ImF1dG8iIHNyYz0iaHR0cHM6Ly9zdGF0aWMueml0YWRlbC5jaC9sb2dvX3doaXRlZm9udF90cmFuc3BhcmVudGJnLnBuZyIgc3R5bGU9ImJvcmRlcjowO2Rpc3BsYXk6YmxvY2s7b3V0bGluZTpub25lO3RleHQtZGVjb3JhdGlvbjpub25lO2hlaWdodDphdXRvO3dpZHRoOjEwMCU7Zm9udC1zaXplOjEzcHg7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPSI2NSIgLz4gPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tW2lmIG1zbyB8IElFXT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1baWYgbXNvIHwgSUVdPgogICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tW2lmIG1zbyB8IElFXT4KICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbZW5kaWZdLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8IS0tW2lmIG1zbyB8IElFXT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC92OnRleHRib3g+CiAgICAgICAgICA8L3Y6cmVjdD4KICAgICAgICA8IVtlbmRpZl0tLT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDwvdGJvZHk+CiAgICA8L3RhYmxlPgo8L2Rpdj4KPC9ib2R5PgoKPC9odG1sPg== + DefaultMailTexts: + - MailTextType: InitCode + Language: DE + Title: Zitadel - User initialisieren + PreHeader: User initialisieren + Subject: User initialisieren + Greeting: Hallo {{.FirstName}} {{.LastName}}, + Text: Dieser Benutzer wurde soeben im Zitadel erstellt. Mit dem Benutzernamen <br><strong>{{.PreferredLoginName}}</strong><br> kannst du dich anmelden. Nutze den untenstehenden Button, um die Initialisierung abzuschliessen <br>(Code <strong>{{.Code}}</strong>).<br> Falls du dieses Mail nicht angefordert hast, kannst du es einfach ignorieren. + ButtonText: Initialisierung abschliessen + - MailTextType: PasswordReset + Language: DE + Title: Zitadel - Passwort zurücksetzen + PreHeader: Passwort zurücksetzen + Subject: Passwort zurücksetzen + Greeting: Hallo {{.FirstName}} {{.LastName}}, + Text: Wir haben eine Anfrage für das Zurücksetzen deines Passwortes bekommen. Du kannst den untenstehenden Button verwenden, um dein Passwort zurückzusetzen <br>(Code <strong>{{.Code}}</strong>).<br> Falls du dieses Mail nicht angefordert hast, kannst du es ignorieren. + ButtonText: Passwort zurücksetzen + - MailTextType: VerifyEmail + Language: DE + Title: Zitadel - Email verifizieren + PreHeader: Email verifizieren + Subject: Email verifizieren + Greeting: Hallo {{.FirstName}} {{.LastName}}, + Text: Eine neue E-Mail Adresse wurde hinzugefügt. Bitte verwende den untenstehenden Button um diese zu verifizieren <br>(Code <strong>{{.Code}}</strong>).<br> Falls du deine E-Mail Adresse nicht selber hinzugefügt hast, kannst du dieses E-Mail ignorieren. + ButtonText: Email verifizieren + - MailTextType: VerifyPhone + Language: DE + Title: Zitadel - Telefonnummer verifizieren + PreHeader: Telefonnummer verifizieren + Subject: Telefonnummer verifizieren + Greeting: Hallo {{.FirstName}} {{.LastName}}, + Text: Eine Telefonnummer wurde hinzugefügt. Bitte verifiziere diese in dem du folgenden Code eingibst<br>(Code <strong>{{.Code}}</strong>).<br> + ButtonText: Telefon verifizieren + - MailTextType: DomainClaimed + Language: DE + Title: Zitadel - Domain wurde beansprucht + PreHeader: Email / Username ändern + Subject: Domain wurde beansprucht + Greeting: Hallo {{.FirstName}} {{.LastName}}, + Text: Die Domain {{.Domain}} wurde von einer Organisation beansprucht. Dein derzeitiger User {{.Username}} ist nicht Teil dieser Organisation. Daher musst du beim nächsten Login eine neue Email hinterlegen. Für diesen Login haben wir dir einen temporären Usernamen ({{.TempUsername}}) erstellt. + ButtonText: Login + - MailTextType: InitCode + Language: EN + Title: Zitadel - Initialize User + PreHeader: Initialize User + Subject: Initialize User + Greeting: Hello {{.FirstName}} {{.LastName}}, + Text: This user was created in Zitadel. Use the username {{.PreferredLoginName}} to login. Please click the button below to finish the initialization process. (Code {{.Code}}) If you didn't ask for this mail, please ignore it. + ButtonText: Finish initialization + - MailTextType: PasswordReset + Language: EN + Title: Zitadel - Reset password + PreHeader: Reset password + Subject: Reset password + Greeting: Hello {{.FirstName}} {{.LastName}}, + Text: We received a password reset request. Please use the button below to reset your password. (Code {{.Code}}) If you didn't ask for this mail, please ignore it. + ButtonText: Reset password + - MailTextType: VerifyEmail + Language: EN + Title: Zitadel - Verify email + PreHeader: Verify email + Subject: Verify email + Greeting: Hello {{.FirstName}} {{.LastName}}, + Text: A new email has been added. Please use the button below to verify your mail. (Code {{.Code}}) If you din't add a new email, please ignore this email. + ButtonText: Verify email + - MailTextType: VerifyPhone + Language: EN + Title: Zitadel - Verify phone + PreHeader: Verify phone + Subject: Verify phone + Greeting: Hello {{.FirstName}} {{.LastName}}, + Text: A new phonenumber has been added. Please use the following code to verify it {{.Code}}. + ButtonText: Verify phone + - MailTextType: DomainClaimed + Language: EN + Title: Zitadel - Domain has been claimed + PreHeader: Change email / username + Subject: Domain has been claimed + Greeting: Hello {{.FirstName}} {{.LastName}}, + Text: The domain {{.Domain}} has been claimed by an organisation. Your current user {{.Username}} is not part of this organisation. Therefore you'll have to change your email when you login. We have created a temporary username ({{.TempUsername}}) for this login. + ButtonText: Login diff --git a/cmd/zitadel/system-defaults.yaml b/cmd/zitadel/system-defaults.yaml index 1f22bf6185..cd84668dce 100644 --- a/cmd/zitadel/system-defaults.yaml +++ b/cmd/zitadel/system-defaults.yaml @@ -1,5 +1,5 @@ SystemDefaults: - DefaultLanguage: 'de' + DefaultLanguage: 'en' Domain: $ZITADEL_DEFAULT_DOMAIN ZitadelDocs: Issuer: $ZITADEL_ISSUER diff --git a/cmd/zitadelctl/cmds/backup.go b/cmd/zitadelctl/cmds/backup.go new file mode 100644 index 0000000000..d00ec60046 --- /dev/null +++ b/cmd/zitadelctl/cmds/backup.go @@ -0,0 +1,73 @@ +package cmds + +import ( + "github.com/caos/orbos/pkg/kubernetes" + "github.com/caos/zitadel/operator/api" + "github.com/caos/zitadel/operator/start" + "github.com/spf13/cobra" + "io/ioutil" +) + +func BackupCommand(rv RootValues) *cobra.Command { + var ( + kubeconfig string + backup string + cmd = &cobra.Command{ + Use: "backup", + Short: "Instant backup", + Long: "Instant backup", + } + ) + + flags := cmd.Flags() + flags.StringVar(&kubeconfig, "kubeconfig", "~/.kube/config", "Kubeconfig of cluster where the backup should be done") + flags.StringVar(&backup, "backup", "", "Name used for backup folder") + + cmd.RunE = func(cmd *cobra.Command, args []string) (err error) { + _, monitor, orbConfig, gitClient, version, errFunc, err := rv() + if err != nil { + return err + } + defer func() { + err = errFunc(err) + }() + + if err := gitClient.Configure(orbConfig.URL, []byte(orbConfig.Repokey)); err != nil { + return err + } + + if err := gitClient.Clone(); err != nil { + return err + } + + found, err := api.ExistsDatabaseYml(gitClient) + if err != nil { + return err + } + if found { + + value, err := ioutil.ReadFile(kubeconfig) + if err != nil { + monitor.Error(err) + return nil + } + kubeconfigStr := string(value) + + k8sClient := kubernetes.NewK8sClient(monitor, &kubeconfigStr) + if k8sClient.Available() { + if err := start.Backup( + monitor, + orbConfig.Path, + k8sClient, + backup, + &version, + ); err != nil { + return err + } + } + + } + return nil + } + return cmd +} diff --git a/cmd/zitadelctl/cmds/backuplist.go b/cmd/zitadelctl/cmds/backuplist.go new file mode 100644 index 0000000000..dbf356a352 --- /dev/null +++ b/cmd/zitadelctl/cmds/backuplist.go @@ -0,0 +1,54 @@ +package cmds + +import ( + "fmt" + "sort" + + "github.com/caos/zitadel/pkg/databases" + "github.com/spf13/cobra" +) + +func BackupListCommand(rv RootValues) *cobra.Command { + var ( + cmd = &cobra.Command{ + Use: "backuplist", + Short: "Get a list of all backups", + Long: "Get a list of all backups", + } + ) + + cmd.RunE = func(cmd *cobra.Command, args []string) error { + _, monitor, orbConfig, gitClient, _, errFunc, err := rv() + if err != nil { + return err + } + defer func() { + err = errFunc(err) + }() + + if err := gitClient.Configure(orbConfig.URL, []byte(orbConfig.Repokey)); err != nil { + monitor.Error(err) + return nil + } + + if err := gitClient.Clone(); err != nil { + monitor.Error(err) + return nil + } + + backups, err := databases.ListBackups(monitor, gitClient) + if err != nil { + monitor.Error(err) + return nil + } + + sort.Slice(backups, func(i, j int) bool { + return backups[i] > backups[j] + }) + for _, backup := range backups { + fmt.Println(backup) + } + return nil + } + return cmd +} diff --git a/cmd/zitadelctl/cmds/readsecret.go b/cmd/zitadelctl/cmds/readsecret.go new file mode 100644 index 0000000000..3a0d9937cb --- /dev/null +++ b/cmd/zitadelctl/cmds/readsecret.go @@ -0,0 +1,57 @@ +package cmds + +import ( + "os" + + "github.com/caos/orbos/pkg/secret" + "github.com/caos/zitadel/operator/secrets" + "github.com/spf13/cobra" +) + +func ReadSecretCommand(rv RootValues) *cobra.Command { + return &cobra.Command{ + Use: "readsecret [path]", + Short: "Print a secrets decrypted value to stdout", + Long: "Print a secrets decrypted value to stdout.\nIf no path is provided, a secret can interactively be chosen from a list of all possible secrets", + Args: cobra.MaximumNArgs(1), + Example: `zitadelctl readsecret zitadel.emailappkey > ~/emailappkey`, + RunE: func(cmd *cobra.Command, args []string) error { + + _, monitor, orbConfig, gitClient, _, errFunc, err := rv() + if err != nil { + return err + } + defer func() { + err = errFunc(err) + }() + if err := gitClient.Configure(orbConfig.URL, []byte(orbConfig.Repokey)); err != nil { + return err + } + + if err := gitClient.Clone(); err != nil { + return err + } + + path := "" + if len(args) > 0 { + path = args[0] + } + + value, err := secret.Read( + monitor, + gitClient, + path, + secrets.GetAllSecretsFunc(orbConfig)) + if err != nil { + monitor.Error(err) + return nil + } + + if _, err := os.Stdout.Write([]byte(value)); err != nil { + monitor.Error(err) + return nil + } + return nil + }, + } +} diff --git a/cmd/zitadelctl/cmds/restore.go b/cmd/zitadelctl/cmds/restore.go new file mode 100644 index 0000000000..a9230d6202 --- /dev/null +++ b/cmd/zitadelctl/cmds/restore.go @@ -0,0 +1,100 @@ +package cmds + +import ( + "errors" + "io/ioutil" + + "github.com/caos/zitadel/operator/helpers" + + "github.com/caos/orbos/pkg/kubernetes" + "github.com/caos/zitadel/operator/start" + "github.com/caos/zitadel/pkg/databases" + "github.com/manifoldco/promptui" + "github.com/spf13/cobra" +) + +func RestoreCommand(rv RootValues) *cobra.Command { + var ( + backup string + kubeconfig string + cmd = &cobra.Command{ + Use: "restore", + Short: "Restore from backup", + Long: "Restore from backup", + } + ) + + flags := cmd.Flags() + flags.StringVar(&backup, "backup", "", "Backup used for db restore") + flags.StringVar(&kubeconfig, "kubeconfig", "~/.kube/config", "Kubeconfig for ZITADEL operator deployment") + + cmd.RunE = func(cmd *cobra.Command, args []string) error { + _, monitor, orbConfig, gitClient, version, errFunc, err := rv() + if err != nil { + return err + } + defer func() { + err = errFunc(err) + }() + + kubeconfig = helpers.PruneHome(kubeconfig) + + if err := gitClient.Configure(orbConfig.URL, []byte(orbConfig.Repokey)); err != nil { + monitor.Error(err) + return nil + } + + if err := gitClient.Clone(); err != nil { + monitor.Error(err) + return nil + } + + value, err := ioutil.ReadFile(kubeconfig) + if err != nil { + monitor.Error(err) + return nil + } + kubeconfigStr := string(value) + + k8sClient := kubernetes.NewK8sClient(monitor, &kubeconfigStr) + if k8sClient.Available() { + list, err := databases.ListBackups(monitor, gitClient) + if err != nil { + monitor.Error(err) + return nil + } + + if backup == "" { + prompt := promptui.Select{ + Label: "Select backup to restore", + Items: list, + } + + _, result, err := prompt.Run() + if err != nil { + monitor.Error(err) + return nil + } + backup = result + } + existing := false + for _, listedBackup := range list { + if listedBackup == backup { + existing = true + } + } + + if !existing { + monitor.Error(errors.New("chosen backup is not existing")) + return nil + } + + if err := start.Restore(monitor, gitClient, orbConfig, k8sClient, backup, &version); err != nil { + monitor.Error(err) + } + return nil + } + return nil + } + return cmd +} diff --git a/cmd/zitadelctl/cmds/root.go b/cmd/zitadelctl/cmds/root.go new file mode 100644 index 0000000000..1568d40ca9 --- /dev/null +++ b/cmd/zitadelctl/cmds/root.go @@ -0,0 +1,72 @@ +package cmds + +import ( + "context" + "github.com/caos/orbos/mntr" + "github.com/caos/orbos/pkg/git" + "github.com/caos/orbos/pkg/orb" + "github.com/caos/zitadel/operator/helpers" + "github.com/spf13/cobra" +) + +type RootValues func() (context.Context, mntr.Monitor, *orb.Orb, *git.Client, string, errFunc, error) + +type errFunc func(err error) error + +func RootCommand(version string) (*cobra.Command, RootValues) { + + var ( + verbose bool + orbConfigPath string + ) + + cmd := &cobra.Command{ + Use: "zitadelctl [flags]", + Short: "Interact with your IAM orbs", + Long: `zitadelctl launches zitadel and simplifies common tasks such as updating your kubeconfig. +Participate in our community on https://github.com/caos/orbos +and visit our website at https://caos.ch`, + Example: `$ mkdir -p ~/.orb +$ cat > ~/.orb/myorb << EOF +> url: git@github.com:me/my-orb.git +> masterkey: "$(gopass my-secrets/orbs/myorb/masterkey)" +> repokey: | +> $(cat ~/.ssh/myorbrepo | sed s/^/\ \ /g) +> EOF +$ orbctl -f ~/.orb/myorb [command] +`, + } + + flags := cmd.PersistentFlags() + flags.StringVarP(&orbConfigPath, "orbconfig", "f", "~/.orb/config", "Path to the file containing the orbs git repo URL, deploy key and the master key for encrypting and decrypting secrets") + flags.BoolVar(&verbose, "verbose", false, "Print debug levelled logs") + + return cmd, func() (context.Context, mntr.Monitor, *orb.Orb, *git.Client, string, errFunc, error) { + + monitor := mntr.Monitor{ + OnInfo: mntr.LogMessage, + OnChange: mntr.LogMessage, + OnError: mntr.LogError, + } + + if verbose { + monitor = monitor.Verbose() + } + + prunedPath := helpers.PruneHome(orbConfigPath) + orbConfig, err := orb.ParseOrbConfig(prunedPath) + if err != nil { + orbConfig = &orb.Orb{Path: prunedPath} + return nil, mntr.Monitor{}, nil, nil, "", nil, err + } + + ctx := context.Background() + + return ctx, monitor, orbConfig, git.New(ctx, monitor, "orbos", "orbos@caos.ch"), version, func(err error) error { + if err != nil { + monitor.Error(err) + } + return nil + }, nil + } +} diff --git a/cmd/zitadelctl/cmds/start.go b/cmd/zitadelctl/cmds/start.go new file mode 100644 index 0000000000..3bbd9bd91c --- /dev/null +++ b/cmd/zitadelctl/cmds/start.go @@ -0,0 +1,82 @@ +package cmds + +import ( + "github.com/caos/orbos/pkg/kubernetes" + "github.com/caos/zitadel/operator/helpers" + "github.com/caos/zitadel/operator/start" + "github.com/spf13/cobra" +) + +func StartOperator(rv RootValues) *cobra.Command { + var ( + kubeconfig string + cmd = &cobra.Command{ + Use: "operator", + Short: "Launch a ZITADEL operator", + Long: "Ensures a desired state of ZITADEL", + } + ) + flags := cmd.Flags() + flags.StringVar(&kubeconfig, "kubeconfig", "", "Kubeconfig for ZITADEL operator deployment") + + cmd.RunE = func(cmd *cobra.Command, args []string) error { + _, monitor, orbConfig, _, version, errFunc, err := rv() + if err != nil { + return err + } + defer func() { + err = errFunc(err) + }() + + kubeconfig = helpers.PruneHome(kubeconfig) + + k8sClient, err := kubernetes.NewK8sClientWithPath(monitor, kubeconfig) + if err != nil { + monitor.Error(err) + return nil + } + + if k8sClient.Available() { + if err := start.Operator(monitor, orbConfig.Path, k8sClient, &version); err != nil { + monitor.Error(err) + return nil + } + } + return nil + } + return cmd +} + +func StartDatabase(rv RootValues) *cobra.Command { + var ( + kubeconfig string + cmd = &cobra.Command{ + Use: "database", + Short: "Launch a database operator", + Long: "Ensures a desired state of the database", + } + ) + flags := cmd.Flags() + flags.StringVar(&kubeconfig, "kubeconfig", "", "kubeconfig used by zitadel operator") + + cmd.RunE = func(cmd *cobra.Command, args []string) (err error) { + _, monitor, orbConfig, _, version, errFunc, err := rv() + if err != nil { + return err + } + defer func() { + err = errFunc(err) + }() + + k8sClient, err := kubernetes.NewK8sClientWithPath(monitor, kubeconfig) + if err != nil { + return err + } + + if k8sClient.Available() { + return start.Database(monitor, orbConfig.Path, k8sClient, &version) + } + return nil + } + return cmd +} diff --git a/cmd/zitadelctl/cmds/takeoff.go b/cmd/zitadelctl/cmds/takeoff.go new file mode 100644 index 0000000000..9352f43fe2 --- /dev/null +++ b/cmd/zitadelctl/cmds/takeoff.go @@ -0,0 +1,127 @@ +package cmds + +import ( + orbdb "github.com/caos/zitadel/operator/database/kinds/orb" + "io/ioutil" + + "github.com/caos/zitadel/operator/helpers" + + "github.com/caos/orbos/mntr" + "github.com/caos/orbos/pkg/git" + "github.com/caos/orbos/pkg/kubernetes" + "github.com/caos/zitadel/operator/api" + "github.com/caos/zitadel/operator/zitadel/kinds/orb" + "github.com/spf13/cobra" +) + +func TakeoffCommand(rv RootValues) *cobra.Command { + var ( + kubeconfig string + cmd = &cobra.Command{ + Use: "takeoff", + Short: "Launch a ZITADEL operator on the orb", + Long: "Ensures a desired state of the resources on the orb", + } + ) + + flags := cmd.Flags() + flags.StringVar(&kubeconfig, "kubeconfig", "~/.kube/config", "Kubeconfig for ZITADEL operator deployment") + + cmd.RunE = func(cmd *cobra.Command, args []string) error { + _, monitor, orbConfig, gitClient, _, errFunc, err := rv() + if err != nil { + return err + } + defer func() { + err = errFunc(err) + }() + kubeconfig = helpers.PruneHome(kubeconfig) + + if err := gitClient.Configure(orbConfig.URL, []byte(orbConfig.Repokey)); err != nil { + monitor.Error(err) + return nil + } + + if err := gitClient.Clone(); err != nil { + monitor.Error(err) + return nil + } + + value, err := ioutil.ReadFile(kubeconfig) + if err != nil { + monitor.Error(err) + return nil + } + kubeconfigStr := string(value) + + if err := deployOperator( + monitor, + gitClient, + &kubeconfigStr, + ); err != nil { + monitor.Error(err) + } + + if err := deployDatabase( + monitor, + gitClient, + &kubeconfigStr, + ); err != nil { + monitor.Error(err) + } + return nil + } + return cmd +} + +func deployOperator(monitor mntr.Monitor, gitClient *git.Client, kubeconfig *string) error { + found, err := api.ExistsZitadelYml(gitClient) + if err != nil { + return err + } + if !found { + monitor.Info("No ZITADEL operator deployed as no zitadel.yml present") + return nil + } + + if found { + k8sClient := kubernetes.NewK8sClient(monitor, kubeconfig) + + if k8sClient.Available() { + desiredTree, err := api.ReadZitadelYml(gitClient) + if err != nil { + return err + } + if err := orb.Reconcile(monitor, desiredTree, true)(k8sClient); err != nil { + return err + } + } + } + return nil +} + +func deployDatabase(monitor mntr.Monitor, gitClient *git.Client, kubeconfig *string) error { + found, err := api.ExistsDatabaseYml(gitClient) + if err != nil { + return err + } + if found { + k8sClient := kubernetes.NewK8sClient(monitor, kubeconfig) + + if k8sClient.Available() { + tree, err := api.ReadDatabaseYml(gitClient) + if err != nil { + return err + } + + if err := orbdb.Reconcile( + monitor, + tree)(k8sClient); err != nil { + return err + } + } else { + monitor.Info("Failed to connect to k8s") + } + } + return nil +} diff --git a/cmd/zitadelctl/cmds/writesecret.go b/cmd/zitadelctl/cmds/writesecret.go new file mode 100644 index 0000000000..d49568d23d --- /dev/null +++ b/cmd/zitadelctl/cmds/writesecret.go @@ -0,0 +1,115 @@ +package cmds + +import ( + "errors" + "io/ioutil" + "os" + + "github.com/caos/orbos/pkg/secret" + "github.com/caos/zitadel/operator/secrets" + "github.com/spf13/cobra" +) + +func WriteSecretCommand(rv RootValues) *cobra.Command { + + var ( + value string + file string + stdin bool + cmd = &cobra.Command{ + Use: "writesecret [path]", + Short: "Encrypt a secret and push it to the repository", + Long: "Encrypt a secret and push it to the repository.\nIf no path is provided, a secret can interactively be chosen from a list of all possible secrets", + Args: cobra.MaximumNArgs(1), + Example: `orbctl writesecret mystaticprovider.bootstrapkey --file ~/.ssh/my-orb-bootstrap +orbctl writesecret mygceprovider.google_application_credentials_value --value "$(cat $GOOGLE_APPLICATION_CREDENTIALS)" `, + } + ) + + flags := cmd.Flags() + flags.StringVar(&value, "value", "", "Secret value to encrypt") + flags.StringVarP(&file, "file", "s", "", "File containing the value to encrypt") + flags.BoolVar(&stdin, "stdin", false, "Value to encrypt is read from standard input") + + cmd.RunE = func(cmd *cobra.Command, args []string) error { + + _, monitor, orbConfig, gitClient, _, errFunc, err := rv() + if err != nil { + return err + } + defer func() { + err = errFunc(err) + }() + + s, err := key(value, file, stdin) + if err != nil { + monitor.Error(err) + return nil + } + + if err := gitClient.Configure(orbConfig.URL, []byte(orbConfig.Repokey)); err != nil { + monitor.Error(err) + return nil + } + + if err := gitClient.Clone(); err != nil { + monitor.Error(err) + return nil + } + + path := "" + if len(args) > 0 { + path = args[0] + } + + if err := secret.Write( + monitor, + gitClient, + path, + s, + secrets.GetAllSecretsFunc(orbConfig), + secrets.PushFunc(), + ); err != nil { + monitor.Error(err) + } + return nil + } + return cmd +} + +func key(value string, file string, stdin bool) (string, error) { + + channels := 0 + if value != "" { + channels++ + } + if file != "" { + channels++ + } + if stdin { + channels++ + } + + if channels != 1 { + return "", errors.New("Key must be provided eighter by value or by file path or by standard input") + } + + if value != "" { + return value, nil + } + + readFunc := func() ([]byte, error) { + return ioutil.ReadFile(file) + } + if stdin { + readFunc = func() ([]byte, error) { + return ioutil.ReadAll(os.Stdin) + } + } + + key, err := readFunc() + if err != nil { + panic(err) + } + return string(key), err +} diff --git a/cmd/zitadelctl/main.go b/cmd/zitadelctl/main.go new file mode 100644 index 0000000000..01cf68e2de --- /dev/null +++ b/cmd/zitadelctl/main.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "github.com/caos/zitadel/cmd/zitadelctl/cmds" + "os" +) + +var ( + Version = "unknown" +) + +func main() { + rootCmd, rootValues := cmds.RootCommand(Version) + rootCmd.Version = fmt.Sprintf("%s\n", Version) + + rootCmd.AddCommand( + cmds.StartOperator(rootValues), + cmds.TakeoffCommand(rootValues), + cmds.BackupListCommand(rootValues), + cmds.RestoreCommand(rootValues), + cmds.ReadSecretCommand(rootValues), + cmds.WriteSecretCommand(rootValues), + cmds.BackupCommand(rootValues), + cmds.StartDatabase(rootValues), + ) + + if err := rootCmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/console/package-lock.json b/console/package-lock.json index dcef7a1c80..a60b752e27 100644 --- a/console/package-lock.json +++ b/console/package-lock.json @@ -4,135 +4,123 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@angular-devkit/build-angular": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1100.4.tgz", - "integrity": "sha512-qVkMbtOwlo+k8fvOBOwwfKWMx06k4I1qrdjpRYAoZCt3cdje4EBepSciLrHnTB+ouIqWxpEDfEXTYBS98tXbBg==", + "@angular-devkit/architect": { + "version": "0.1101.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1101.2.tgz", + "integrity": "sha512-MLmBfHiiyPhbFSSAX4oMecPjEuBauOui5uBpI6BKNnk/7783fznbkbAKjXlOco7M81gkNeEoHMR8c+mOfcvv7g==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/build-optimizer": "0.1100.4", - "@angular-devkit/build-webpack": "0.1100.4", - "@angular-devkit/core": "11.0.4", - "@babel/core": "7.12.3", - "@babel/generator": "7.12.1", - "@babel/plugin-transform-runtime": "7.12.1", - "@babel/preset-env": "7.12.1", - "@babel/runtime": "7.12.1", - "@babel/template": "7.10.4", + "@angular-devkit/core": "11.1.2", + "rxjs": "6.6.3" + } + }, + "@angular-devkit/build-angular": { + "version": "0.1101.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.1101.2.tgz", + "integrity": "sha512-EVJ7kAgy+sMnliCmHwN1niVeM7YaAvTMkF+ahImNfQRSQOW+QJ4F8vjiLtuARC6R02Yc5QPzELTHVPxC4Qll/A==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1101.2", + "@angular-devkit/build-optimizer": "0.1101.2", + "@angular-devkit/build-webpack": "0.1101.2", + "@angular-devkit/core": "11.1.2", + "@babel/core": "7.12.10", + "@babel/generator": "7.12.11", + "@babel/plugin-transform-runtime": "7.12.10", + "@babel/preset-env": "7.12.11", + "@babel/runtime": "7.12.5", + "@babel/template": "7.12.7", "@jsdevtools/coverage-istanbul-loader": "3.0.5", - "@ngtools/webpack": "11.0.4", + "@ngtools/webpack": "11.1.2", "ansi-colors": "4.1.1", - "autoprefixer": "9.8.6", - "babel-loader": "8.1.0", + "autoprefixer": "10.2.1", + "babel-loader": "8.2.2", "browserslist": "^4.9.1", "cacache": "15.0.5", "caniuse-lite": "^1.0.30001032", - "circular-dependency-plugin": "5.2.0", - "copy-webpack-plugin": "6.2.1", - "core-js": "3.6.5", - "css-loader": "4.3.0", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "6.3.2", + "core-js": "3.8.2", + "critters": "0.0.6", + "css-loader": "5.0.1", "cssnano": "4.1.10", - "file-loader": "6.1.1", + "file-loader": "6.2.0", "find-cache-dir": "3.3.1", "glob": "7.1.6", + "https-proxy-agent": "5.0.0", "inquirer": "7.3.3", - "jest-worker": "26.5.0", + "jest-worker": "26.6.2", "karma-source-map-support": "1.4.0", - "less": "3.12.2", - "less-loader": "7.0.2", - "license-webpack-plugin": "2.3.1", + "less": "4.1.0", + "less-loader": "7.3.0", + "license-webpack-plugin": "2.3.11", "loader-utils": "2.0.0", - "mini-css-extract-plugin": "1.2.1", + "mini-css-extract-plugin": "1.3.3", "minimatch": "3.0.4", - "open": "7.3.0", - "ora": "5.1.0", + "open": "7.3.1", + "ora": "5.2.0", "parse5-html-rewriting-stream": "6.0.1", "pnp-webpack-plugin": "1.6.4", - "postcss": "7.0.32", - "postcss-import": "12.0.1", - "postcss-loader": "4.0.4", + "postcss": "8.2.4", + "postcss-import": "14.0.0", + "postcss-loader": "4.2.0", "raw-loader": "4.0.2", "regenerator-runtime": "0.13.7", "resolve-url-loader": "3.1.2", "rimraf": "3.0.2", - "rollup": "2.32.1", + "rollup": "2.36.1", "rxjs": "6.6.3", - "sass": "1.27.0", - "sass-loader": "10.0.5", - "semver": "7.3.2", + "sass": "1.32.4", + "sass-loader": "10.1.1", + "semver": "7.3.4", "source-map": "0.7.3", - "source-map-loader": "1.1.2", + "source-map-loader": "1.1.3", "source-map-support": "0.5.19", "speed-measure-webpack-plugin": "1.3.3", "style-loader": "2.0.0", "stylus": "0.54.8", - "stylus-loader": "4.3.1", - "terser": "5.3.7", + "stylus-loader": "4.3.2", + "terser": "5.5.1", "terser-webpack-plugin": "4.2.3", "text-table": "0.2.0", "tree-kill": "1.2.2", "webpack": "4.44.2", "webpack-dev-middleware": "3.7.2", - "webpack-dev-server": "3.11.0", - "webpack-merge": "5.2.0", - "webpack-sources": "2.0.1", - "webpack-subresource-integrity": "1.5.1", + "webpack-dev-server": "3.11.1", + "webpack-merge": "5.7.3", + "webpack-sources": "2.2.0", + "webpack-subresource-integrity": "1.5.2", "worker-plugin": "5.0.0" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1100.4.tgz", - "integrity": "sha512-hzTfcSUwM0jsSt9HvvSFyaoAhX9k73L7y4kmkghzIFhKhIKOp/7o3n7hAFwN/jWKKmVQpPKnYmqzm9H9OveaCQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.0.4", - "rxjs": "6.6.3" - } - }, - "@angular-devkit/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", - "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/core": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", - "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", + "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.1", + "@babel/generator": "^7.12.10", "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.1", - "@babel/parser": "^7.12.3", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", "json5": "^2.1.2", "lodash": "^4.17.19", - "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, @@ -152,12 +140,12 @@ } }, "@babel/generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz", - "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.1", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -170,6 +158,26 @@ } } }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", @@ -205,16 +213,25 @@ "lodash": "^4.17.19" } }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { @@ -227,12 +244,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, "@babel/helpers": { @@ -258,79 +275,100 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" }, "dependencies": { - "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", - "dev": true, - "requires": { - "@babel/types": "^7.12.10", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true } } }, - "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" + "debug": "4" } }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "autoprefixer": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.1.tgz", + "integrity": "sha512-dwP0UjyYvROUvtU+boBx8ff5pPWami1NGTrJs9YUsS/oZVbRAcdNHOOuXSA1fc46tgKqe072cVaKD69rvCc3QQ==", "dev": true, "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" + "browserslist": "^4.16.1", + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "fraction.js": "^4.0.13", + "normalize-range": "^0.1.2", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "caniuse-lite": { + "version": "1.0.30001181", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001181.tgz", + "integrity": "sha512-m5ul/ARCX50JB8BSNM+oiPmQrR5UmngaQ3QThTTp5HcIIQGP/nPBs82BYLE+tigzm3VW+F4BJIhUyaVtEweelQ==", + "dev": true + } } }, "debug": { @@ -342,6 +380,53 @@ "ms": "2.1.2" } }, + "electron-to-chromium": { + "version": "1.3.649", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.649.tgz", + "integrity": "sha512-ojGDupQ3UMkvPWcTICe4JYe17+o9OLiFMPoduoR72Zp2ILt1mRVeqnxBEd6s/ptekrnsFU+0A4lStfBe/wyG/A==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "dev": true + }, + "postcss": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.4.tgz", + "integrity": "sha512-kRFftRoExRVXZlwUuay9iC824qmXPcQQVzAjbCCgjpXnkdMCJYBu2gTwAaFBzv8ewND6O8xFb3aELmEkh9zTzg==", + "dev": true, + "requires": { + "colorette": "^1.2.1", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -352,10 +437,13 @@ } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "source-map": { "version": "0.7.3", @@ -366,16 +454,16 @@ } }, "@angular-devkit/build-optimizer": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1100.4.tgz", - "integrity": "sha512-C05y4qMb05PWR7l1gZwRQKiB6KIDq+p72r8Yr6jm0UO6raOtMM72R8nHnioMnGJcFtZDEAYXEF+X7soI3MMlfw==", + "version": "0.1101.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.1101.2.tgz", + "integrity": "sha512-ARcUcEwaAR3n0gUq2hCx4eXONdnKKXTYSaw2GUHtraBDp+m/vFcE6Ufxyki453eHbHtaQ9yjXOcBqu86u1u8hA==", "dev": true, "requires": { "loader-utils": "2.0.0", "source-map": "0.7.3", - "tslib": "2.0.3", - "typescript": "4.0.5", - "webpack-sources": "2.0.1" + "tslib": "2.1.0", + "typescript": "4.1.3", + "webpack-sources": "2.2.0" }, "dependencies": { "source-map": { @@ -383,43 +471,45 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "typescript": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.3.tgz", + "integrity": "sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==", + "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1100.4.tgz", - "integrity": "sha512-uxe8gNSej3KF1FgqNtJmuRDbbINh3yLtXanXhRxFQLUj8IiNR8IciIVvy6RfXC5gqxcWwy1cOefJLLnuN9AOxQ==", + "version": "0.1101.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1101.2.tgz", + "integrity": "sha512-T8+LjKdxk1faQA4Dh3PYkRbIBLE6Tjv5SNZmdDXpvGoyxS9FmLgLDXQZqXkYgiAHwH6PxhoQX4iVxkHHFkkHog==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/core": "11.0.4", + "@angular-devkit/architect": "0.1101.2", + "@angular-devkit/core": "11.1.2", "rxjs": "6.6.3" + } + }, + "@angular-devkit/core": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.1.2.tgz", + "integrity": "sha512-V7zOMqL2l56JcwXVyswkG+7+t67r9XtkrVzRcG2Z5ZYwafU+iKWMwg5kBFZr1SX7fM1M9E4MpskxqtagQeUKng==", + "dev": true, + "requires": { + "ajv": "6.12.6", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.3", + "source-map": "0.7.3" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1100.4.tgz", - "integrity": "sha512-hzTfcSUwM0jsSt9HvvSFyaoAhX9k73L7y4kmkghzIFhKhIKOp/7o3n7hAFwN/jWKKmVQpPKnYmqzm9H9OveaCQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.0.4", - "rxjs": "6.6.3" - } - }, - "@angular-devkit/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", - "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -440,6 +530,17 @@ } } }, + "@angular-devkit/schematics": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.1.2.tgz", + "integrity": "sha512-wIWI4+EPsjbN+23Rs0zE4GarKrUm8gMR3MpGAtlEmGG2ZsXEVdfiKUebBdWGrx0sEfgLN9JfePbZQFvqN5ifyw==", + "dev": true, + "requires": { + "@angular-devkit/core": "11.1.2", + "ora": "5.2.0", + "rxjs": "6.6.3" + } + }, "@angular/animations": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-11.0.0.tgz", @@ -458,95 +559,56 @@ } }, "@angular/cli": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-11.0.4.tgz", - "integrity": "sha512-VkE/gx6P80EJHg13fG+gkZfd2DJmRaDAtnamcCGM4AThzoUN9XBdxc24uMLEzBb0/mJ4vpMK9+WTNIdMmzl+Tg==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-11.1.2.tgz", + "integrity": "sha512-qOAkxCzBPm+QdXpSHxLERw1Vag8S0JHMY0zCwtG63XFvwHZCIihHRkOR3xHDWlVnGTmnUixg4Mt5s/4GGPuDJg==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1100.4", - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", - "@schematics/angular": "11.0.4", - "@schematics/update": "0.1100.4", + "@angular-devkit/architect": "0.1101.2", + "@angular-devkit/core": "11.1.2", + "@angular-devkit/schematics": "11.1.2", + "@schematics/angular": "11.1.2", + "@schematics/update": "0.1101.2", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", - "debug": "4.2.0", - "ini": "1.3.5", + "debug": "4.3.1", + "ini": "2.0.0", "inquirer": "7.3.3", + "jsonc-parser": "3.0.0", "npm-package-arg": "8.1.0", "npm-pick-manifest": "6.1.0", - "open": "7.3.0", - "pacote": "9.5.12", - "resolve": "1.18.1", + "open": "7.3.1", + "pacote": "11.1.14", + "resolve": "1.19.0", "rimraf": "3.0.2", - "semver": "7.3.2", - "symbol-observable": "2.0.3", + "semver": "7.3.4", + "symbol-observable": "3.0.0", "universal-analytics": "0.4.23", - "uuid": "8.3.1" + "uuid": "8.3.2" }, "dependencies": { - "@angular-devkit/architect": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1100.4.tgz", - "integrity": "sha512-hzTfcSUwM0jsSt9HvvSFyaoAhX9k73L7y4kmkghzIFhKhIKOp/7o3n7hAFwN/jWKKmVQpPKnYmqzm9H9OveaCQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.0.4", - "rxjs": "6.6.3" - } - }, - "@angular-devkit/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", - "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.4.tgz", - "integrity": "sha512-fFC7qW9A1bFAZgpCfkezBA4WCRzfVFgOzwPpyt65rgSrzw0+EeHjcrUIcXlhyOXAFrTHtA9oLCfEeSjSx5HBEA==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.0.4", - "ora": "5.1.0", - "rxjs": "6.6.3" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "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" - } - }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" } }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, "resolve": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz", - "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "requires": { - "is-core-module": "^2.0.0", + "is-core-module": "^2.1.0", "path-parse": "^1.0.6" } }, @@ -560,22 +622,13 @@ } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - }, - "uuid": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", - "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -778,9 +831,9 @@ } }, "@angular/language-service": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-11.0.4.tgz", - "integrity": "sha512-KtQxVSlZi3SwZEN4E56KHkNTFEYa3FPZfLJFm6WD1dSobFyMwJgvztO08GWSaT4S0ht0NNRD2IRt0XzBYuZkag==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-11.1.1.tgz", + "integrity": "sha512-87PYlTBBaMr0DYMYxkyeFas1qXIRYM0soNYkXC8yE+hxkGWTN15Zjk19+lx5z43++uNOiZw1mqnKTJoO46kE6A==", "dev": true }, "@angular/material": { @@ -916,13 +969,19 @@ "@babel/types": "^7.12.10" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -952,28 +1011,28 @@ }, "dependencies": { "browserslist": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", - "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001165", + "caniuse-lite": "^1.0.30001181", "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.621", + "electron-to-chromium": "^1.3.649", "escalade": "^3.1.1", - "node-releases": "^1.1.67" + "node-releases": "^1.1.70" } }, "caniuse-lite": { - "version": "1.0.30001165", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", - "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", + "version": "1.0.30001181", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001181.tgz", + "integrity": "sha512-m5ul/ARCX50JB8BSNM+oiPmQrR5UmngaQ3QThTTp5HcIIQGP/nPBs82BYLE+tigzm3VW+F4BJIhUyaVtEweelQ==", "dev": true }, "electron-to-chromium": { - "version": "1.3.625", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.625.tgz", - "integrity": "sha512-CsLk/r0C9dAzVPa9QF74HIXduxaucsaRfqiOYvIv2PRhvyC6EOqc/KbpgToQuDVgPf3sNAFZi3iBu4vpGOwGag==", + "version": "1.3.649", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.649.tgz", + "integrity": "sha512-ojGDupQ3UMkvPWcTICe4JYe17+o9OLiFMPoduoR72Zp2ILt1mRVeqnxBEd6s/ptekrnsFU+0A4lStfBe/wyG/A==", "dev": true }, "escalade": { @@ -983,9 +1042,9 @@ "dev": true }, "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", "dev": true } } @@ -1004,25 +1063,34 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", @@ -1033,17 +1101,34 @@ } }, "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" + }, + "dependencies": { + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + } } }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -1056,46 +1141,68 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, - "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" }, "dependencies": { - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11" } } } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1147,13 +1254,19 @@ "@babel/types": "^7.12.1" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1314,13 +1427,19 @@ "@babel/types": "^7.12.1" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1391,13 +1510,19 @@ "@babel/types": "^7.12.1" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1420,9 +1545,9 @@ "dev": true }, "@babel/helper-validator-option": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz", - "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", + "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", "dev": true }, "@babel/helper-wrap-function": { @@ -1438,9 +1563,9 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" @@ -1458,9 +1583,9 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/template": { @@ -1474,13 +1599,19 @@ "@babel/types": "^7.12.7" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1551,9 +1682,9 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz", - "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", + "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4", @@ -1820,13 +1951,19 @@ "@babel/types": "^7.12.5" } }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -1843,9 +1980,9 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz", - "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", + "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" @@ -1868,25 +2005,34 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", @@ -1897,17 +2043,34 @@ } }, "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" + }, + "dependencies": { + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + } } }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -1920,46 +2083,68 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, - "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" }, "dependencies": { - "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11" } } } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -2077,25 +2262,45 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", @@ -2131,16 +2336,25 @@ "lodash": "^4.17.19" } }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { @@ -2153,12 +2367,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, "@babel/highlight": { @@ -2173,9 +2387,9 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/template": { @@ -2190,31 +2404,39 @@ } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + } } }, "debug": { @@ -2247,25 +2469,45 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", @@ -2301,16 +2543,25 @@ "lodash": "^4.17.19" } }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { @@ -2323,12 +2574,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, "@babel/highlight": { @@ -2343,9 +2594,9 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/template": { @@ -2360,31 +2611,39 @@ } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + } } }, "debug": { @@ -2418,25 +2677,45 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", @@ -2472,16 +2751,25 @@ "lodash": "^4.17.19" } }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { @@ -2494,12 +2782,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, "@babel/highlight": { @@ -2514,9 +2802,9 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/template": { @@ -2531,31 +2819,39 @@ } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + } } }, "debug": { @@ -2586,25 +2882,45 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", @@ -2640,16 +2956,25 @@ "lodash": "^4.17.19" } }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-simple-access": { @@ -2662,12 +2987,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, "@babel/highlight": { @@ -2682,9 +3007,9 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, "@babel/template": { @@ -2699,31 +3024,39 @@ } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + } } }, "debug": { @@ -2772,25 +3105,45 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.11", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.7", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", @@ -2800,27 +3153,42 @@ "@babel/types": "^7.12.7" } }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" } }, "@babel/helper-split-export-declaration": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", - "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", "dev": true, "requires": { - "@babel/types": "^7.11.0" + "@babel/types": "^7.12.11" } }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/highlight": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", @@ -2833,35 +3201,46 @@ } }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", "dev": true }, - "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -2920,14 +3299,13 @@ } }, "@babel/plugin-transform-runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.1.tgz", - "integrity": "sha512-Ac/H6G9FEIkS2tXsZjL4RAdS3L3WHxci0usAnz7laPWUmFiGtj7tIASChqKZMHTSQTQY6xDbOq+V1/vIq3QrWg==", + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.12.10.tgz", + "integrity": "sha512-xOrUfzPxw7+WDm9igMgQCbO3cJKymX7dFdsgRr1eu9n3KjjyU4pptIXbXPseQDquw+W+RuJEJMHKHNsPNNm3CA==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-module-imports": "^7.12.5", "@babel/helper-plugin-utils": "^7.10.4", - "resolve": "^1.8.1", "semver": "^5.5.1" }, "dependencies": { @@ -2940,13 +3318,19 @@ "@babel/types": "^7.12.5" } }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -3019,16 +3403,16 @@ } }, "@babel/preset-env": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz", - "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", + "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.1", - "@babel/helper-compilation-targets": "^7.12.1", - "@babel/helper-module-imports": "^7.12.1", + "@babel/compat-data": "^7.12.7", + "@babel/helper-compilation-targets": "^7.12.5", + "@babel/helper-module-imports": "^7.12.5", "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-option": "^7.12.1", + "@babel/helper-validator-option": "^7.12.11", "@babel/plugin-proposal-async-generator-functions": "^7.12.1", "@babel/plugin-proposal-class-properties": "^7.12.1", "@babel/plugin-proposal-dynamic-import": "^7.12.1", @@ -3036,10 +3420,10 @@ "@babel/plugin-proposal-json-strings": "^7.12.1", "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.1", + "@babel/plugin-proposal-numeric-separator": "^7.12.7", "@babel/plugin-proposal-object-rest-spread": "^7.12.1", "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.1", + "@babel/plugin-proposal-optional-chaining": "^7.12.7", "@babel/plugin-proposal-private-methods": "^7.12.1", "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", "@babel/plugin-syntax-async-generators": "^7.8.0", @@ -3057,7 +3441,7 @@ "@babel/plugin-transform-arrow-functions": "^7.12.1", "@babel/plugin-transform-async-to-generator": "^7.12.1", "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.1", + "@babel/plugin-transform-block-scoping": "^7.12.11", "@babel/plugin-transform-classes": "^7.12.1", "@babel/plugin-transform-computed-properties": "^7.12.1", "@babel/plugin-transform-destructuring": "^7.12.1", @@ -3081,14 +3465,14 @@ "@babel/plugin-transform-reserved-words": "^7.12.1", "@babel/plugin-transform-shorthand-properties": "^7.12.1", "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.1", + "@babel/plugin-transform-sticky-regex": "^7.12.7", "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.1", + "@babel/plugin-transform-typeof-symbol": "^7.12.10", "@babel/plugin-transform-unicode-escapes": "^7.12.1", "@babel/plugin-transform-unicode-regex": "^7.12.1", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.1", - "core-js-compat": "^3.6.2", + "@babel/types": "^7.12.11", + "core-js-compat": "^3.8.0", "semver": "^5.5.0" }, "dependencies": { @@ -3101,13 +3485,19 @@ "@babel/types": "^7.12.5" } }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -3128,9 +3518,9 @@ } }, "@babel/runtime": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.1.tgz", - "integrity": "sha512-J5AIf3vPj3UwXaAzb5j1xM4WAQDX3EMgemF8rjCP3SoW09LfRKAXQKt6CoVYl230P6iWdRcBbnLDDdnqWxZSCA==", + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -3243,47 +3633,14 @@ } }, "@ngtools/webpack": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.0.4.tgz", - "integrity": "sha512-MAV7inQmsMISTnDcXwyRX5oJZx8F7K/tZRLJciQwkM0DqZyq8fI9KDRwBcmYeQ+J0mSJV9LUVdExmpulpkywqw==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-11.1.2.tgz", + "integrity": "sha512-x/HVx4doKu4gAwGGk+C89JCFe5GF8Te7I7uvwMTqEXr+Ua9YHYvN/q2IwLdhIXPB4ilBSIjrb9zm05yBvBTAeg==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "enhanced-resolve": "5.3.1", - "webpack-sources": "2.0.1" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", - "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "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" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "@angular-devkit/core": "11.1.2", + "enhanced-resolve": "5.6.0", + "webpack-sources": "2.2.0" } }, "@ngx-translate/core": { @@ -3328,13 +3685,27 @@ "fastq": "^1.6.0" } }, - "@npmcli/move-file": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", - "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "@npmcli/ci-detect": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.3.0.tgz", + "integrity": "sha512-oN3y7FAROHhrAt7Rr7PnTSwrHrZVRTS2ZbyxeQwSSYD0ifwM3YNgQqbaRmjcWoPyq77MjchusjJDspbzMmip1Q==", + "dev": true + }, + "@npmcli/git": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.4.tgz", + "integrity": "sha512-OJZCmJ9DNn1cz9HPXXsPmUBnqaArot3CGYo63CyajHQk+g87rPXVOJByGsskQJhPsUUEXJcsZ2Q6bWd2jSwnBA==", "dev": true, "requires": { - "mkdirp": "^1.0.4" + "@npmcli/promise-spawn": "^1.1.0", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.3", + "npm-pick-manifest": "^6.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "semver": "^7.3.2", + "unique-filename": "^1.1.1", + "which": "^2.0.2" }, "dependencies": { "mkdirp": { @@ -3342,9 +3713,95 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@npmcli/move-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.0.tgz", + "integrity": "sha512-Iv2iq0JuyYjKeFkSR4LPaCdDZwlGK9X2cP/01nJcp3yMJ1FjNd9vpiEYvLUgzBxKPg2SFmaOhizoQsPc0LWeOQ==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^2.7.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "@npmcli/node-gyp": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.1.tgz", + "integrity": "sha512-pBqoKPWmuk9iaEcXlLBVRIA6I1kG9JiICU+sG0NuD6NAR461F+02elHJS4WkQxHW2W5rnsfvP/ClKwmsZ9RaaA==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.1.tgz", + "integrity": "sha512-G8c86g9cQHyRINosIcpovzv0BkXQc3urhL1ORf3KTe4TS4UBsg2O4Z2feca/W3pfzdHEJzc83ETBW4aKbb3SaA==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.0", + "@npmcli/promise-spawn": "^1.3.0", + "infer-owner": "^1.0.4", + "node-gyp": "^7.1.0", + "puka": "^1.0.1", + "read-package-json-fast": "^1.1.3" + } + }, "@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -3400,123 +3857,46 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@schematics/angular": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.0.4.tgz", - "integrity": "sha512-LwBD9TIoLy9XqqInJvlN4BHtPyJExyeorNiOp6rXb/wafuDbvZ+9kY9GWZTY1auVo5PNKqErfxr74ydA3FFb9g==", + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-11.1.2.tgz", + "integrity": "sha512-ZhaB/QBwfWsvZYJplLH8VK/7vnFpUbk1nptjC106K/I38xlmWdB4pStLJK94eyJk0KlItnsPvE0a9KuLPKA/Ow==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", - "jsonc-parser": "2.3.1" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", - "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.4.tgz", - "integrity": "sha512-fFC7qW9A1bFAZgpCfkezBA4WCRzfVFgOzwPpyt65rgSrzw0+EeHjcrUIcXlhyOXAFrTHtA9oLCfEeSjSx5HBEA==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.0.4", - "ora": "5.1.0", - "rxjs": "6.6.3" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "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" - } - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } + "@angular-devkit/core": "11.1.2", + "@angular-devkit/schematics": "11.1.2", + "jsonc-parser": "3.0.0" } }, "@schematics/update": { - "version": "0.1100.4", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1100.4.tgz", - "integrity": "sha512-YwFtgxCQQkYC89IC7dfshyGr0roE6bpp5HgpQLdS/AOjHeZKo7/SPdM0W4ddB+Fml1Fo6v4eFG/Ia9oR7qNv1A==", + "version": "0.1101.2", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.1101.2.tgz", + "integrity": "sha512-WwMsIkhR3hq7gvfB5HsuTK2Sz9iZmpz0/AiFYRJbX+mXL/KgONcridyorW45Dg1Q2sRXVGiAUxWsQYzjmeLO7g==", "dev": true, "requires": { - "@angular-devkit/core": "11.0.4", - "@angular-devkit/schematics": "11.0.4", + "@angular-devkit/core": "11.1.2", + "@angular-devkit/schematics": "11.1.2", "@yarnpkg/lockfile": "1.1.0", - "ini": "1.3.5", + "ini": "2.0.0", "npm-package-arg": "^8.0.0", - "pacote": "9.5.12", - "semver": "7.3.2", + "pacote": "11.1.14", + "semver": "7.3.4", "semver-intersect": "1.4.0" }, "dependencies": { - "@angular-devkit/core": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-11.0.4.tgz", - "integrity": "sha512-LgTvhZ3Ycz0QvNAH/zO1rpQQDn2JN8u9/Awy1gW/XeCC3FYmxeOj/2JCFzlKah3wJv16nMqro5WTppHt8Y++PA==", - "dev": true, - "requires": { - "ajv": "6.12.6", - "fast-json-stable-stringify": "2.1.0", - "magic-string": "0.25.7", - "rxjs": "6.6.3", - "source-map": "0.7.3" - } - }, - "@angular-devkit/schematics": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-11.0.4.tgz", - "integrity": "sha512-fFC7qW9A1bFAZgpCfkezBA4WCRzfVFgOzwPpyt65rgSrzw0+EeHjcrUIcXlhyOXAFrTHtA9oLCfEeSjSx5HBEA==", - "dev": true, - "requires": { - "@angular-devkit/core": "11.0.4", - "ora": "5.1.0", - "rxjs": "6.6.3" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "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" - } + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, @@ -3539,6 +3919,12 @@ "unist-util-find-all-after": "^3.0.2" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@types/bytebuffer": { "version": "5.0.41", "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.41.tgz", @@ -3554,6 +3940,24 @@ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "dev": true + }, + "@types/cors": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.9.tgz", + "integrity": "sha512-zurD1ibz21BRlAOIKP8yhrxlqKx6L9VCwkB5kMiP6nZAhoF5MvC7qS1qPA7nRcr1GJolfkQC7/EAL4hdYejLtg==", + "dev": true + }, "@types/file-saver": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.1.tgz", @@ -3575,9 +3979,9 @@ "integrity": "sha512-6PjMFKl13cgB4kRdYtvyjKl8VVa0PXS2IdVxHhQ8GEKbxBkyJtSbaIeK1eZGjDKN7dvUh4vkOvU9FMwYNv4GQQ==" }, "@types/jasmine": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.2.tgz", - "integrity": "sha512-AzfesNFLvOs6Q1mHzIsVJXSeUnqVh4ZHG8ngygKJfbkcSLwzrBVm/LKa+mR8KrOfnWtUL47112gde1MC0IXqpQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.3.tgz", + "integrity": "sha512-5QKAG8WfC9XrOgYLXPrxv1G2IIUE6zDyzTWamhNWJO0LqPRUbZ0q0zGHDhDJ7MpFloUuyME/jpBIdPjq3/P3jA==", "dev": true }, "@types/jasminewd2": { @@ -3590,9 +3994,9 @@ } }, "@types/json-schema": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", - "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz", + "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==", "dev": true }, "@types/long": { @@ -3622,9 +4026,9 @@ "dev": true }, "@types/node": { - "version": "14.14.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.13.tgz", - "integrity": "sha512-vbxr0VZ8exFMMAjCW8rJwaya0dMCDyYW2ZRdTyjtrCvJoENMpdUHOT/eTzvgyA5ZnqRZ/sI0NwqAxNHKYokLJQ==" + "version": "14.14.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz", + "integrity": "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -3871,16 +4275,6 @@ "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -3924,12 +4318,6 @@ "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==", "dev": true }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", - "dev": true - }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -3940,12 +4328,25 @@ } }, "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.3.tgz", + "integrity": "sha512-wn8fw19xKZwdGPO47jivonaHRTd+nGOMP1z11sgGeQzDy2xd5FG0R67dIMcKHDE2cJ5y+YXV30XVGUBPRSY7Hg==", "dev": true, "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", "humanize-ms": "^1.2.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "aggregate-error": { @@ -3997,9 +4398,9 @@ } }, "angularx-qrcode": { - "version": "10.0.11", - "resolved": "https://registry.npmjs.org/angularx-qrcode/-/angularx-qrcode-10.0.11.tgz", - "integrity": "sha512-sbtqdqAboEFNoyxgG4FQYPZDzwX9TlICT2mLpsC/Se3OuT+HntW56q8E/i1BL1fJhx7zt0JJR7bc7LfofUeAlQ==", + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/angularx-qrcode/-/angularx-qrcode-11.0.0.tgz", + "integrity": "sha512-qg6g288LO9daqBP5GCHewy9W0IMW7jDMEaAiklA1za0UhjCj6VH1Agydr4JVp7RMkw1LsLapFhWsVSYqrWaERA==", "requires": { "qrcode": "1.4.2", "tslib": "^2.0.0" @@ -4182,18 +4583,18 @@ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", "dev": true }, - "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==", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, "ascli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", @@ -4353,29 +4754,17 @@ } }, "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==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", "dev": true, "requires": { - "find-cache-dir": "^2.1.0", + "find-cache-dir": "^3.3.1", "loader-utils": "^1.4.0", - "mkdirp": "^0.5.3", - "pify": "^4.0.1", + "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { - "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==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, "json5": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", @@ -4407,12 +4796,6 @@ "object.assign": "^4.1.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", @@ -4480,9 +4863,9 @@ } }, "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", "dev": true }, "base64-js": { @@ -4512,15 +4895,6 @@ "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=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -4543,11 +4917,16 @@ "file-uri-to-path": "1.0.0" } }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true + "bl": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } }, "blocking-proxy": { "version": "1.0.1", @@ -4777,14 +5156,13 @@ } }, "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "buffer-from": { @@ -4910,13 +5288,13 @@ } }, "call-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz", - "integrity": "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.0" + "get-intrinsic": "^1.0.2" } }, "caller-callsite": { @@ -4937,12 +5315,6 @@ "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=", - "dev": true - }, "callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", @@ -5087,9 +5459,9 @@ } }, "circular-dependency-plugin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", - "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", "dev": true }, "class-utils": { @@ -5335,24 +5707,12 @@ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "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==", "dev": true }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true - }, "compose-function": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz", @@ -5562,6 +5922,15 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, + "copy-anything": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.1.tgz", + "integrity": "sha512-lA57e7viQHOdPQcrytv5jFeudZZOXuyk47lZym279FiDQ8jeZomXiGuVf6ffMKkJ+3TIai3J1J3yi6M+/4U35g==", + "dev": true, + "requires": { + "is-what": "^3.7.1" + } + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -5583,9 +5952,9 @@ "dev": true }, "copy-webpack-plugin": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.2.1.tgz", - "integrity": "sha512-VH2ZTMIBsx4p++Lmpg77adZ0KUyM5gFR/9cuTrbneNnJlcQXUFvsNariPqq2dq2kV3F2skHiDGPQCyKWy1+U0Q==", + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.3.2.tgz", + "integrity": "sha512-MgJ1uouLIbDg4ST1GzqrGQyKoXY5iPqi6fghFqarijam7FQcBa/r6Rg0VkoIuzx75Xq8iAMghyOueMkWUQ5OaA==", "dev": true, "requires": { "cacache": "^15.0.5", @@ -5646,44 +6015,44 @@ } }, "core-js": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", - "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.2.tgz", + "integrity": "sha512-FfApuSRgrR6G5s58casCBd9M2k+4ikuu4wbW6pJyYU7bd9zvFc9qf7vr5xmrZOhT9nn+8uwlH1oRR9jTnFoA3A==", "dev": true }, "core-js-compat": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", - "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", + "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", "dev": true, "requires": { - "browserslist": "^4.15.0", + "browserslist": "^4.16.1", "semver": "7.0.0" }, "dependencies": { "browserslist": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.0.tgz", - "integrity": "sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ==", + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001165", + "caniuse-lite": "^1.0.30001181", "colorette": "^1.2.1", - "electron-to-chromium": "^1.3.621", + "electron-to-chromium": "^1.3.649", "escalade": "^3.1.1", - "node-releases": "^1.1.67" + "node-releases": "^1.1.70" } }, "caniuse-lite": { - "version": "1.0.30001165", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz", - "integrity": "sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA==", + "version": "1.0.30001181", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001181.tgz", + "integrity": "sha512-m5ul/ARCX50JB8BSNM+oiPmQrR5UmngaQ3QThTTp5HcIIQGP/nPBs82BYLE+tigzm3VW+F4BJIhUyaVtEweelQ==", "dev": true }, "electron-to-chromium": { - "version": "1.3.625", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.625.tgz", - "integrity": "sha512-CsLk/r0C9dAzVPa9QF74HIXduxaucsaRfqiOYvIv2PRhvyC6EOqc/KbpgToQuDVgPf3sNAFZi3iBu4vpGOwGag==", + "version": "1.3.649", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.649.tgz", + "integrity": "sha512-ojGDupQ3UMkvPWcTICe4JYe17+o9OLiFMPoduoR72Zp2ILt1mRVeqnxBEd6s/ptekrnsFU+0A4lStfBe/wyG/A==", "dev": true }, "escalade": { @@ -5693,9 +6062,9 @@ "dev": true }, "node-releases": { - "version": "1.1.67", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.67.tgz", - "integrity": "sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg==", + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", "dev": true }, "semver": { @@ -5802,6 +6171,76 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "critters": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.6.tgz", + "integrity": "sha512-NUB3Om7tkf+XWi9+2kJ2A3l4/tHORDI1UT+nHxUqay2B/tJvMpiXcklDDLBH3fPn9Pe23uu0we/08Ukjy4cLCQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css": "^3.0.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -5835,15 +6274,14 @@ } }, "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", "dev": true, "requires": { - "inherits": "^2.0.3", + "inherits": "^2.0.4", "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" + "source-map-resolve": "^0.6.0" } }, "css-color-names": { @@ -5863,31 +6301,65 @@ } }, "css-loader": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-4.3.0.tgz", - "integrity": "sha512-rdezjCjScIrsL8BSYszgT4s476IcNKt6yX69t0pHjJVnPUTDpn4WfIpDQTN3wCJvUvfsz/mFjuGOekf3PY3NUg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.0.1.tgz", + "integrity": "sha512-cXc2ti9V234cq7rJzFKhirb2L2iPy8ZjALeVJAozXYz9te3r4eqLSixNAbMDJSgJEQywqXzs8gonxaboeKqwiw==", "dev": true, "requires": { - "camelcase": "^6.0.0", + "camelcase": "^6.2.0", "cssesc": "^3.0.0", - "icss-utils": "^4.1.1", + "icss-utils": "^5.0.0", "loader-utils": "^2.0.0", - "postcss": "^7.0.32", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^3.0.3", - "postcss-modules-scope": "^2.2.0", - "postcss-modules-values": "^3.0.0", + "postcss": "^8.1.4", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.1.0", - "schema-utils": "^2.7.1", + "schema-utils": "^3.0.0", "semver": "^7.3.2" }, "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "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" + } + }, "camelcase": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", "dev": true }, + "postcss": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.4.tgz", + "integrity": "sha512-kRFftRoExRVXZlwUuay9iC824qmXPcQQVzAjbCCgjpXnkdMCJYBu2gTwAaFBzv8ewND6O8xFb3aELmEkh9zTzg==", + "dev": true, + "requires": { + "colorette": "^1.2.1", + "nanoid": "^3.1.20", + "source-map": "^0.6.1" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, "semver": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", @@ -5906,6 +6378,33 @@ "dev": true, "requires": { "css": "^2.0.0" + }, + "dependencies": { + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + } } }, "css-select": { @@ -6146,6 +6645,12 @@ "ms": "^2.1.1" } }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -6357,6 +6862,16 @@ "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "di": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", @@ -6623,6 +7138,7 @@ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, + "optional": true, "requires": { "iconv-lite": "^0.6.2" }, @@ -6632,6 +7148,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", "dev": true, + "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -6648,102 +7165,60 @@ } }, "engine.io": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.2.tgz", - "integrity": "sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.0.tgz", + "integrity": "sha512-vW7EAtn0HDQ4MtT5QbmCHF17TaYLONv2/JwdYsq9USPRZVM4zG7WB3k0Nc321z8EuSOlhGokrYlYx4176QhD0A==", "dev": true, "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" + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" }, "dependencies": { "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", "dev": true } } }, - "engine.io-client": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.3.tgz", - "integrity": "sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==", - "dev": true, - "requires": { - "component-emitter": "~1.3.0", - "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": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "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==", - "dev": true, - "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", "dev": true, "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "base64-arraybuffer": "0.1.4" } }, "enhanced-resolve": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz", - "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.6.0.tgz", + "integrity": "sha512-C3GGDfFZmqUa21o10YRKbZN60DPl0HyXKXxoEnQMWso9u7KMU23L7CBHfr/rVxORddY/8YQZaU2MZ1ewTS8Pcw==", "dev": true, "requires": { "graceful-fs": "^4.2.4", - "tapable": "^2.0.0" + "tapable": "^2.2.0" }, "dependencies": { "graceful-fs": { @@ -6766,6 +7241,12 @@ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, "err-code": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", @@ -6773,9 +7254,9 @@ "dev": true }, "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", "dev": true, "requires": { "prr": "~1.0.1" @@ -6791,23 +7272,25 @@ } }, "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", "has": "^1.0.3", "has-symbols": "^1.0.1", "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", + "is-negative-zero": "^2.0.1", "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", + "object-inspect": "^1.9.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" } }, "es-to-primitive": { @@ -7254,9 +7737,9 @@ "dev": true }, "fast-glob": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", - "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -7265,60 +7748,6 @@ "merge2": "^1.3.0", "micromatch": "^4.0.2", "picomatch": "^2.2.1" - }, - "dependencies": { - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.0.5" - } - } } }, "fast-json-stable-stringify": { @@ -7349,9 +7778,9 @@ } }, "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { "websocket-driver": ">=0.5.1" @@ -7382,9 +7811,9 @@ } }, "file-loader": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.1.1.tgz", - "integrity": "sha512-Klt8C4BjWSXYQAfhpYYkG4qHNTna4toMHEbWrI5IuVoxbU6uiDKeKAP99R8mmbJi3lvewn/jQBOgU4+NS3tDQw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", "dev": true, "requires": { "loader-utils": "^2.0.0", @@ -7478,48 +7907,6 @@ "commondir": "^1.0.1", "make-dir": "^3.0.2", "pkg-dir": "^4.1.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "find-up": { @@ -7560,9 +7947,9 @@ }, "dependencies": { "flatted": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", - "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "rimraf": { @@ -7662,6 +8049,12 @@ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, + "fraction.js": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz", + "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==", + "dev": true + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -7816,12 +8209,6 @@ "wide-align": "^1.1.0" } }, - "genfun": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", - "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", - "dev": true - }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -7834,9 +8221,9 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz", - "integrity": "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.0.tgz", + "integrity": "sha512-M11rgtQp5GZMZzDL7jLTNxbDfurpzuau5uqRWDPvlHjfvg3TdScAZo96GLvhMjImrmR8uAt0FS2RLoMrfWGKlg==", "dev": true, "requires": { "function-bind": "^1.1.1", @@ -7923,9 +8310,9 @@ "dev": true }, "globby": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", - "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", "dev": true, "requires": { "array-union": "^2.1.0", @@ -7960,9 +8347,9 @@ } }, "google-proto-files": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-2.3.0.tgz", - "integrity": "sha512-A2UMuWes/9dgEWV8jr+KBM95LyyJQpHMlGbBV0wFIuJs1VRlgpPWR1m39fat1J2nKLYPyfhi42TTnEOnGWopWg==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-2.4.0.tgz", + "integrity": "sha512-M5u56EsADOnplBUHTBzqBcCtPNPoGtBBXefjtA7mt3KDsOnlRM75fwrW2rsPS3Am2vrf9I0/NlI0E3nKWo/Ipg==", "requires": { "protobufjs": "^6.8.0", "walkdir": "^0.4.0" @@ -8056,29 +8443,6 @@ "ansi-regex": "^2.0.0" } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "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=", - "dev": true - } - } - }, - "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=", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -8248,9 +8612,9 @@ "dev": true }, "html-entities": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.3.tgz", - "integrity": "sha512-/VulV3SYni1taM7a4RMdceqzJWR39gpZHjBwUnsCFKWV/GJkD14CJ5F7eWcZozmHJK0/f/H5U3b3SiPkuvxMgg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", "dev": true }, "html-escaper": { @@ -8280,9 +8644,9 @@ } }, "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==", + "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==", "dev": true }, "http-deceiver": { @@ -8312,6 +8676,12 @@ } } }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -8324,29 +8694,33 @@ } }, "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "agent-base": "4", - "debug": "3.1.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "debug": "4" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } } } }, @@ -8492,13 +8866,10 @@ } }, "icss-utils": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", - "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true }, "ieee754": { "version": "1.2.1", @@ -8571,6 +8942,17 @@ "requires": { "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } } }, "imurmurhash": { @@ -8591,12 +8973,6 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", @@ -8618,9 +8994,9 @@ "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==" + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inquirer": { "version": "7.3.3", @@ -8832,9 +9208,9 @@ "dev": true }, "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", "dev": true }, "is-color-stop": { @@ -8964,6 +9340,12 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, "is-negative-zero": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", @@ -9097,6 +9479,12 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, + "is-what": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.12.0.tgz", + "integrity": "sha512-2ilQz5/f/o9V7WRWJQmpFYNmQFZ9iM+OXRonZKcYgTkCzjb949Vi4h282PD1UfmgHk666rcWonbRJ++KI41VGw==", + "dev": true + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -9307,9 +9695,9 @@ "dev": true }, "jest-worker": { - "version": "26.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.5.0.tgz", - "integrity": "sha512-kTw66Dn4ZX7WpjZ7T/SUDgRhapFRKWmisVAF0Rv4Fu8SLFD7eLbqpLvbxVqYhSgaWa7I+bW7pHnbyfNsH6stug==", + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", "dev": true, "requires": { "@types/node": "*", @@ -9408,9 +9796,9 @@ } }, "jsonc-parser": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz", - "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", "dev": true }, "jsonfile": { @@ -9485,9 +9873,9 @@ } }, "karma": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", - "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.0.3.tgz", + "integrity": "sha512-dmiLQdsNAvnbV1G6VvUK7Cl5xpwiMisZNT8MjBtOo49jKlnZSWLxQIemuLT8sGSzvx5IGgMfMQEtf/CALiUEVQ==", "dev": true, "requires": { "body-parser": "^1.19.0", @@ -9508,11 +9896,11 @@ "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^2.3.0", + "socket.io": "^3.0.4", "source-map": "^0.6.1", "tmp": "0.2.1", - "ua-parser-js": "0.7.22", - "yargs": "^15.3.1" + "ua-parser-js": "^0.7.23", + "yargs": "^16.1.1" }, "dependencies": { "ansi-regex": { @@ -9522,46 +9910,23 @@ "dev": 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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" } }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", - "dev": true, - "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.4.0" - } - }, "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "wrap-ansi": "^7.0.0" } }, "color-convert": { @@ -9579,15 +9944,11 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true }, "graceful-fs": { "version": "4.2.4", @@ -9602,26 +9963,11 @@ "dev": true }, "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", "dev": true }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -9661,9 +10007,9 @@ } }, "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==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -9672,39 +10018,31 @@ } }, "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==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz", + "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==", "dev": true }, "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true } } }, @@ -9787,21 +10125,46 @@ } }, "less": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/less/-/less-3.12.2.tgz", - "integrity": "sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.0.tgz", + "integrity": "sha512-w1Ag/f34g7LwtQ/sMVSGWIyZx+gG9ZOAEtyxeX1fG75is6BMyC2lD5kG+1RueX7PkAvlQBm2Lf2aN2j0JbVr2A==", "dev": true, "requires": { + "copy-anything": "^2.0.1", "errno": "^0.1.1", "graceful-fs": "^4.1.2", "image-size": "~0.5.0", "make-dir": "^2.1.0", "mime": "^1.4.1", - "native-request": "^1.0.5", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", "source-map": "~0.6.0", "tslib": "^1.10.0" }, "dependencies": { + "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==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -9811,9 +10174,9 @@ } }, "less-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.0.2.tgz", - "integrity": "sha512-7MKlgjnkCf63E3Lv6w2FvAEgLMx3d/tNBExITcanAq7ys5U8VPWT3F6xcRjYmdNfkoQ9udoVFb1r2azSiTnD6w==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-7.3.0.tgz", + "integrity": "sha512-Mi8915g7NMaLlgi77mgTTQvK022xKRQBIVDSyfl3ErTuBhmZBQab0mjeJjNNqGbdR+qrfTleKXqbGI4uEFavxg==", "dev": true, "requires": { "klona": "^2.0.4", @@ -9847,9 +10210,9 @@ } }, "license-webpack-plugin": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.1.tgz", - "integrity": "sha512-yhqTmlYIEpZWA122lf6E0G8+rkn0AzoQ1OpzUKKs/lXUqG1plmGnwmkuuPlfggzJR5y6DLOdot/Tv00CC51CeQ==", + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.3.11.tgz", + "integrity": "sha512-0iVGoX5vx0WDy8dmwTTpOOMYiGqILyUbDeVMFH52AjgBlS58lHwOlFMSoqg5nY8Kxl6+FRKyUZY/UdlQaOyqDw==", "dev": true, "requires": { "@types/webpack-sources": "^0.1.5", @@ -10012,9 +10375,9 @@ }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -10058,13 +10421,20 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "make-error": { @@ -10074,76 +10444,55 @@ "dev": true }, "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.13.tgz", + "integrity": "sha512-rQ5NijwwdU8tIaBrpTtSVrNCcAJfyDRcKBC76vOQlyJX588/88+TE+UpjWl4BgG7gCkp29wER7xcRqkeg+x64Q==", "dev": true, "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", + "agentkeepalive": "^4.1.3", + "cacache": "^15.0.5", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "debug": "4" } }, - "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==", + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "yallist": "^3.0.2" + "ms": "2.1.2" } }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "agent-base": "6", + "debug": "4" } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } }, @@ -10186,35 +10535,36 @@ } }, "mdast-util-from-markdown": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.1.tgz", - "integrity": "sha512-qJXNcFcuCSPqUF0Tb0uYcFDIq67qwB3sxo9RPdf9vG8T90ViKnksFqdB/Coq2a7sTnxL/Ify2y7aIQXDkQFH0w==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.4.tgz", + "integrity": "sha512-jj891B5pV2r63n2kBTFh8cRI2uR9LQHsXG1zSDqfhXkIlDzrTcIlbB5+5aaYEkl8vOPIOPLf8VT7Ere1wWTMdw==", "dev": true, "requires": { "@types/mdast": "^3.0.0", - "mdast-util-to-string": "^1.0.0", - "micromark": "~2.10.0", - "parse-entities": "^2.0.0" + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" } }, "mdast-util-to-markdown": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.5.3.tgz", - "integrity": "sha512-sr8q7fQJ1xoCqZSXW6dO/MYu2Md+a4Hfk9uO+XHCfiBhVM0EgWtfAV7BuN+ff6otUeu2xDyt1o7vhZGwOG3+BA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.2.tgz", + "integrity": "sha512-iRczns6WMvu0hUw02LXsPDJshBIwtUPbvHBWo19IQeU0YqmzlA8Pd30U8V7uiI0VPkxzS7A/NXBXH6u+HS87Zg==", "dev": true, "requires": { "@types/unist": "^2.0.0", "longest-streak": "^2.0.0", - "mdast-util-to-string": "^1.0.0", + "mdast-util-to-string": "^2.0.0", "parse-entities": "^2.0.0", "repeat-string": "^1.0.0", "zwitch": "^1.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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", "dev": true }, "mdn-data": { @@ -10272,13 +10622,14 @@ } }, "meow": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", - "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, "requires": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", "minimist-options": "4.1.0", @@ -10322,10 +10673,13 @@ } }, "semver": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", - "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "type-fest": { "version": "0.18.1", @@ -10375,9 +10729,9 @@ "dev": true }, "micromark": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.10.1.tgz", - "integrity": "sha512-fUuVF8sC1X7wsCS29SYQ2ZfIZYbTymp0EYr6sab3idFjigFFjGa5UwoniPlV9tAgntjuapW1t9U+S0yDYeGKHQ==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.2.tgz", + "integrity": "sha512-IXuP76p2uj8uMg4FQc1cRE7lPCLsfAXuEfdjtdO55VRiFO1asrCSQ5g43NmPqFtRwzEnEhafRVzn2jg0UiKArQ==", "dev": true, "requires": { "debug": "^4.0.0", @@ -10457,9 +10811,9 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.2.1.tgz", - "integrity": "sha512-G3yw7/TQaPfkuiR73MDcyiqhyP8SnbmLhUbpC76H+wtQxA6wfKhMCQOCb6wnPK0dQbjORAeOILQqEesg4/wF7A==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.3.tgz", + "integrity": "sha512-7lvliDSMiuZc81kI+5/qxvn47SCM7BehXex3f2c6l/pR3Goj58IQxZh9nuPQ3AkGQgoETyXuIqLDaO5Oa0TyBw==", "dev": true, "requires": { "loader-utils": "^2.0.0", @@ -10564,6 +10918,18 @@ "minipass": "^3.0.0" } }, + "minipass-fetch": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.3.3.tgz", + "integrity": "sha512-akCrLDWfbdAWkMLBxJEeWTdNsjML+dt5YgOI4gJ53vuO0vrmYQkUPxa6j6V65s9CcePIr2SSWqjT2EcrNseryQ==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, "minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -10573,6 +10939,16 @@ "minipass": "^3.0.0" } }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, "minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -10582,6 +10958,15 @@ "minipass": "^3.0.0" } }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -10690,6 +11075,12 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, + "nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "dev": true + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -10709,13 +11100,6 @@ "to-regex": "^3.0.1" } }, - "native-request": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz", - "integrity": "sha512-vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==", - "dev": true, - "optional": true - }, "needle": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.0.tgz", @@ -10758,23 +11142,112 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, "node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", "dev": true }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "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" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -10806,6 +11279,17 @@ "vm-browserify": "^1.0.1" }, "dependencies": { + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -11015,9 +11499,9 @@ }, "dependencies": { "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -11035,13 +11519,14 @@ } }, "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.4.tgz", + "integrity": "sha512-Qzg2pvXC9U4I4fLnUrBmcIT4x0woLtUgxUi9eC+Zrcv1Xx5eamytGAfbDWQ67j7xOcQ2VW1I3su9smVTIdu7Hw==", "dev": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" } }, @@ -11068,47 +11553,19 @@ } }, "npm-registry-fetch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", - "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-9.0.0.tgz", + "integrity": "sha512-PuFYYtnQ8IyVl6ib9d3PepeehcUeHN9IO5N/iCRhyg9tStQcqGQBRVHmfmMWPDERU3KwZoHFvbJ4FPXPspvzbA==", "dev": true, "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.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==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.9", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" } }, "npm-run-path": { @@ -11162,12 +11619,6 @@ "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=", - "dev": true - }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -11313,9 +11764,9 @@ } }, "open": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz", - "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/open/-/open-7.3.1.tgz", + "integrity": "sha512-f2wt9DCBKKjlFbjzGb8MOAW8LH8F0mrs1zc7KTjAJ9PZNQbfenzWbNP1VZJvw6ICMG9r14Ah6yfwPn7T7i646A==", "dev": true, "requires": { "is-docker": "^2.0.0", @@ -11345,17 +11796,17 @@ "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" }, "ora": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.1.0.tgz", - "integrity": "sha512-9tXIMPvjZ7hPTbk8DFq1f7Kow/HU/pQYB60JbNq+QnGwcyhWVZaQ4hM9zQDEsPxw/muLpgiHSaumUZxCAmod/w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.2.0.tgz", + "integrity": "sha512-+wG2v8TUU8EgzPHun1k/n45pXquQ9fHnbXVetl9rRgO6kjZszGGbraF3XPTIdgeA+s1lbRjSEftAnyT0w8ZMvQ==", "dev": true, "requires": { + "bl": "^4.0.3", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", - "cli-spinners": "^2.4.0", + "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "log-symbols": "^4.0.0", - "mute-stream": "0.0.8", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, @@ -11515,161 +11966,52 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pacote": { - "version": "9.5.12", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.12.tgz", - "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", + "version": "11.1.14", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.14.tgz", + "integrity": "sha512-6c5OhQelaJFDfiw/Zd8MfGCvvFHurSdeGzufZMPvRFImdbNOYFciOINf3DtUNUaU3h98eCb749UyHDsgvL19+A==", "dev": true, "requires": { - "bluebird": "^3.5.3", - "cacache": "^12.0.2", - "chownr": "^1.1.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.3.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", "infer-owner": "^1.0.4", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-normalize-package-bin": "^1.0.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^3.0.0", - "npm-registry-fetch": "^4.0.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.4", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^9.0.0", "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.10", - "unique-filename": "^1.1.1", - "which": "^1.3.1" + "read-package-json-fast": "^1.1.3", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.1.0" }, "dependencies": { - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - } + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true }, - "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dev": true, - "requires": { - "minipass": "^2.6.0" - } + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true }, - "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==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dev": true, - "requires": { - "minipass": "^2.9.0" - } - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "dev": true, - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-pick-manifest": { + "rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", - "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { - "figgy-pudding": "^3.5.1", - "npm-package-arg": "^6.0.0", - "semver": "^5.4.1" + "glob": "^7.1.3" } - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "dev": 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" - } - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true } } }, @@ -11778,6 +12120,12 @@ "lines-and-columns": "^1.1.6" } }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, "parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -11802,6 +12150,23 @@ } } }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "parse5-sax-parser": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", @@ -11819,24 +12184,6 @@ } } }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true, - "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=", - "dev": true, - "requires": { - "better-assert": "~1.0.0" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -11948,12 +12295,30 @@ } }, "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==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + } } }, "pngjs": { @@ -12105,23 +12470,14 @@ } }, "postcss-import": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", - "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.0.tgz", + "integrity": "sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg==", "dev": true, "requires": { - "postcss": "^7.0.1", - "postcss-value-parser": "^3.2.3", + "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" - }, - "dependencies": { - "postcss-value-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", - "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", - "dev": true - } } }, "postcss-less": { @@ -12134,16 +12490,16 @@ } }, "postcss-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.0.4.tgz", - "integrity": "sha512-pntA9zIR14drQo84yGTjQJg1m7T0DkXR4vXYHBngiRZdJtEeCrojL6lOpqUanMzG375lIJbT4Yug85zC/AJWGw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz", + "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==", "dev": true, "requires": { "cosmiconfig": "^7.0.0", "klona": "^2.0.4", "loader-utils": "^2.0.0", "schema-utils": "^3.0.0", - "semver": "^7.3.2" + "semver": "^7.3.4" }, "dependencies": { "ajv": { @@ -12319,44 +12675,38 @@ } }, "postcss-modules-extract-imports": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", - "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true }, "postcss-modules-local-by-default": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz", - "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", "dev": true, "requires": { - "icss-utils": "^4.1.1", - "postcss": "^7.0.32", + "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", "postcss-value-parser": "^4.1.0" } }, "postcss-modules-scope": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", - "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", "dev": true, "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" + "postcss-selector-parser": "^6.0.4" } }, "postcss-modules-values": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", - "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", "dev": true, "requires": { - "icss-utils": "^4.0.0", - "postcss": "^7.0.6" + "icss-utils": "^5.0.0" } }, "postcss-normalize-charset": { @@ -12668,6 +13018,12 @@ "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", "dev": true }, + "pretty-bytes": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.5.0.tgz", + "integrity": "sha512-p+T744ZyjjiaFlMUZZv6YPC5JrkNj8maRmPaQCWFJFplUAzpIUTRaTcS+7wmZtUoFXHtESJb23ISliaWyz3SHA==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -12724,21 +13080,12 @@ }, "dependencies": { "@types/node": { - "version": "13.13.32", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.32.tgz", - "integrity": "sha512-sPBvDnrwZE1uePhkCEyI/qQlgZM5kePPAhHIFDWNsOrWBFRBOk3LKJYmVCLeLZlL9Ub/FzMJb31OTWCg2F+06g==" + "version": "13.13.40", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.40.tgz", + "integrity": "sha512-eKaRo87lu1yAXrzEJl0zcJxfUMDT5/mZalFyOkT44rnQps41eS2pfWzbaulSPpQLFNy29bFqn+Y5lOTL8ATlEQ==" } } }, - "protoduck": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", - "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", - "dev": true, - "requires": { - "genfun": "^5.0.0" - } - }, "protractor": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/protractor/-/protractor-7.0.0.tgz", @@ -13122,6 +13469,12 @@ } } }, + "puka": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/puka/-/puka-1.0.1.tgz", + "integrity": "sha512-ssjRZxBd7BT3dte1RR3VoeT2cT/ODH8x+h0rUF1rMqB0srHYf48stSDWfiYakTp5UBZMxroZhB2+ExLDHm7W3g==", + "dev": true + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -13243,9 +13596,9 @@ } }, "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==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" }, "yargs": { "version": "13.3.2", @@ -13404,6 +13757,16 @@ } } }, + "read-package-json-fast": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.2.1.tgz", + "integrity": "sha512-OFbpwnHcv74Oa5YN5WvbOBfLw6yPmPcwvyJJw/tj9cWFBF7juQUDLDSZiOjEcgzfweWeeROOmbPpNN1qm4hcRg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -13470,6 +13833,18 @@ "util-deprecate": "^1.0.1" } }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, "readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -13542,34 +13917,13 @@ "dev": true }, "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==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", - "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "regexpu-core": { @@ -13593,9 +13947,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", + "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -13630,12 +13984,12 @@ } }, "remark-stringify": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.0.tgz", - "integrity": "sha512-8x29DpTbVzEc6Dwb90qhxCtbZ6hmj3BxWWDpMhA+1WM4dOEGH5U5/GFe3Be5Hns5MvPSFAr1e2KSVtKZkK5nUw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", "dev": true, "requires": { - "mdast-util-to-markdown": "^0.5.0" + "mdast-util-to-markdown": "^0.6.0" } }, "remove-trailing-separator": { @@ -13656,12 +14010,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -13703,6 +14051,12 @@ "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==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", @@ -13867,6 +14221,31 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz", "integrity": "sha1-8dgClQr33SYxof6+BZZVDIarMZA=", "dev": true + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } } } }, @@ -13877,9 +14256,9 @@ "dev": true }, "rfdc": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", - "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.2.0.tgz", + "integrity": "sha512-ijLyszTMmUrXvjSooucVQwimGUk84eRcmCuLV8Xghe3UO85mjUtRAHRyoMM6XtyqbECaXuBWx18La3523sXINA==", "dev": true }, "rgb-regex": { @@ -13913,9 +14292,9 @@ } }, "rollup": { - "version": "2.32.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.1.tgz", - "integrity": "sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw==", + "version": "2.36.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.36.1.tgz", + "integrity": "sha512-eAfqho8dyzuVvrGqpR0ITgEdq0zG2QJeWYh+HeuTbpcaXk8vNFc48B7bJa1xYosTCKx0CuW+447oQOW8HgBIZQ==", "dev": true, "requires": { "fsevents": "~2.1.2" @@ -13977,18 +14356,18 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sass": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.27.0.tgz", - "integrity": "sha512-0gcrER56OkzotK/GGwgg4fPrKuiFlPNitO7eUJ18Bs+/NBlofJfMxmxqpqJxjae9vu0Wq8TZzrSyxZal00WDig==", + "version": "1.32.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.4.tgz", + "integrity": "sha512-N0BT0PI/t3+gD8jKa83zJJUb7ssfQnRRfqN+GIErokW6U4guBpfYl8qYB+OFLEho+QvnV5ZH1R9qhUC/Z2Ch9w==", "dev": true, "requires": { "chokidar": ">=2.0.0 <4.0.0" } }, "sass-loader": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.0.5.tgz", - "integrity": "sha512-2LqoNPtKkZq/XbXNQ4C64GFEleSEHKv6NPSI+bMC/l+jpEXGJhiRYkAQToO24MR7NU4JRY2RpLpJ/gjo2Uf13w==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz", + "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==", "dev": true, "requires": { "klona": "^2.0.4", @@ -14466,6 +14845,19 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } } } }, @@ -14541,152 +14933,70 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.0.tgz", + "integrity": "sha512-Aqg2dlRh6xSJvRYK31ksG65q4kmBOqU4g+1ukhPcoT6wNGYoIwSYPlCPuRwOO9pgLUajojGFztl6+V2opmKcww==", "dev": true, "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" + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.8", + "@types/node": "^14.14.10", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~4.1.0", + "socket.io-adapter": "~2.1.0", + "socket.io-parser": "~4.0.3" }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } } } }, "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==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", + "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==", "dev": true }, - "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==", - "dev": true, - "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=", - "dev": true - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "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=", - "dev": true - }, - "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==", - "dev": true, - "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==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - } - } - }, "socket.io-parser": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", - "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", "dev": true, "requires": { - "component-emitter": "1.2.1", - "debug": "~4.1.0", - "isarray": "2.0.1" + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.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=", - "dev": true - }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } - }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true } } }, "sockjs": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", - "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", "dev": true, "requires": { - "faye-websocket": "^0.10.0", + "faye-websocket": "^0.11.3", "uuid": "^3.4.0", - "websocket-driver": "0.6.5" + "websocket-driver": "^0.7.4" }, "dependencies": { "uuid": { @@ -14698,57 +15008,56 @@ } }, "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==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", + "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", "dev": true, "requires": { - "debug": "^3.2.5", + "debug": "^3.2.6", "eventsource": "^1.0.7", - "faye-websocket": "~0.11.1", - "inherits": "^2.0.3", - "json3": "^3.3.2", - "url-parse": "^1.4.3" - }, - "dependencies": { - "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==", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - } + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.4.7" } }, "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.5.1.tgz", + "integrity": "sha512-oZCsJJxapULAYJaEYBSzMcz8m3jqgGrHaGhkmU/o/PQfFWYWxkAaA0UMGImb6s6tEXfKi959X6VJjMMQ3P6TTQ==", "dev": true, "requires": { - "ip": "1.1.5", + "ip": "^1.1.5", "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", "dev": true, "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" }, "dependencies": { "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "debug": "4" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" } } } @@ -14766,9 +15075,9 @@ "dev": true }, "source-map-loader": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.2.tgz", - "integrity": "sha512-bjf6eSENOYBX4JZDfl9vVLNsGAQ6Uz90fLmOazcmMcyDYOBFsGxPNn83jXezWLY9bJsVAo1ObztxPcV8HAbjVA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-1.1.3.tgz", + "integrity": "sha512-6YHeF+XzDOrT/ycFJNI53cgEsp/tHTMl37hi7uVyqFAlTXW109JazaQCkbc+jjoL2637qkH1amLi+JzrIpt5lA==", "dev": true, "requires": { "abab": "^2.0.5", @@ -14814,16 +15123,13 @@ } }, "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==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", "dev": true, "requires": { "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "decode-uri-component": "^0.2.0" } }, "source-map-support": { @@ -15139,9 +15445,9 @@ "dev": true }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -15293,9 +15599,9 @@ } }, "stylelint": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.8.0.tgz", - "integrity": "sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==", + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.9.0.tgz", + "integrity": "sha512-VVWH2oixOAxpWL1vH+V42ReCzBjW2AeqskSAbi8+3OjV1Xg3VZkmTcAqBZfRRvJeF4BvYuDLXebW3tIHxgZDEg==", "dev": true, "requires": { "@stylelint/postcss-css-in-js": "^0.37.2", @@ -15304,14 +15610,14 @@ "balanced-match": "^1.0.0", "chalk": "^4.1.0", "cosmiconfig": "^7.0.0", - "debug": "^4.2.0", + "debug": "^4.3.1", "execall": "^2.0.0", - "fast-glob": "^3.2.4", + "fast-glob": "^3.2.5", "fastest-levenshtein": "^1.0.12", "file-entry-cache": "^6.0.0", "get-stdin": "^8.0.0", "global-modules": "^2.0.0", - "globby": "^11.0.1", + "globby": "^11.0.2", "globjoin": "^0.1.4", "html-tags": "^3.1.0", "ignore": "^5.1.8", @@ -15321,7 +15627,7 @@ "lodash": "^4.17.20", "log-symbols": "^4.0.0", "mathml-tag-names": "^2.1.3", - "meow": "^8.0.0", + "meow": "^9.0.0", "micromatch": "^4.0.2", "normalize-selector": "^0.2.0", "postcss": "^7.0.35", @@ -15343,7 +15649,7 @@ "style-search": "^0.1.0", "sugarss": "^2.0.0", "svg-tags": "^1.0.0", - "table": "^6.0.3", + "table": "^6.0.7", "v8-compile-cache": "^2.2.0", "write-file-atomic": "^3.0.3" }, @@ -15363,6 +15669,12 @@ "color-convert": "^2.0.1" } }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -15397,6 +15709,34 @@ "ms": "2.1.2" } }, + "fast-glob": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", + "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -15489,18 +15829,6 @@ } } }, - "postcss-selector-parser": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz", - "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1", - "util-deprecate": "^1.0.2" - } - }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -15631,9 +15959,9 @@ } }, "stylus-loader": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-4.3.1.tgz", - "integrity": "sha512-apDYJEM5ZpOAWbWInWcsbtI8gHNr/XYVcSY/tWqOUPt7M5tqhtwXVsAkgyiVjhuvw2Yrjq474a9H+g4d047Ebw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-4.3.2.tgz", + "integrity": "sha512-xXVKHY+J7GBlOmqjCL1VvQfc+pFkBdWGtcpJSvBGE49nWWHaukox7KCjRdLTEzjrmHODm4+rLpqkYWzfJteMXQ==", "dev": true, "requires": { "fast-glob": "^3.2.4", @@ -15714,32 +16042,32 @@ } }, "symbol-observable": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-2.0.3.tgz", - "integrity": "sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-3.0.0.tgz", + "integrity": "sha512-6tDOXSHiVjuCaasQSWTmHUWn4PuG7qa3+1WT031yTc/swT7+rLiw3GOrFxaH1E3lLP09dH3bVuVDf2gK5rxG3Q==", "dev": true }, "table": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/table/-/table-6.0.4.tgz", - "integrity": "sha512-sBT4xRLdALd+NFBvwOz8bw4b15htyythha+q+DVZqy2RS08PPC8O2sZFgJYEY7bJvbCFKccs+WIZ/cd+xxTWCw==", + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz", + "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==", "dev": true, "requires": { - "ajv": "^6.12.4", + "ajv": "^7.0.2", "lodash": "^4.17.20", "slice-ansi": "^4.0.0", "string-width": "^4.2.0" }, "dependencies": { "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", + "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, @@ -15755,6 +16083,12 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", @@ -15790,9 +16124,9 @@ "dev": true }, "tar": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", - "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -15818,9 +16152,9 @@ } }, "terser": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.7.tgz", - "integrity": "sha512-lJbKdfxWvjpV330U4PBZStCT9h3N9A4zZVA5Y4k9sCWXknrpdyxi1oMsRKLmQ/YDMDxSBKIh88v0SkdhdqX06w==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.5.1.tgz", + "integrity": "sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ==", "dev": true, "requires": { "commander": "^2.20.0", @@ -15981,12 +16315,6 @@ "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=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -16111,9 +16439,9 @@ "dev": true }, "ts-protoc-gen": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.13.0.tgz", - "integrity": "sha512-j18X4rkDBbG/ZHUJy88WFeZP6mStGow5uREaohowlHXTu3/N7WcpyPhb7Vh6wN38ERmc/AkT9gqT98+vtlRhJA==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.14.0.tgz", + "integrity": "sha512-2z6w2HioMCMVNcgNHBcEvudmQfzrn+3BjAlz+xgYZ9L0o8n8UG8WUiTJcbXHFiEg2SU8IltwH2pm1otLoMSKwg==", "requires": { "google-protobuf": "^3.6.1" } @@ -16234,9 +16562,9 @@ "dev": true }, "ua-parser-js": { - "version": "0.7.22", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", - "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", + "version": "0.7.23", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.23.tgz", + "integrity": "sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -16341,9 +16669,9 @@ } }, "unist-util-is": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.3.tgz", - "integrity": "sha512-bTofCFVx0iQM8Jqb1TBDVRIQW03YkD3p66JOd/aCWuqzlLyUtx1ZAGw/u+Zw+SttKvSVcvTiKYbfrtLoLefykw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.4.tgz", + "integrity": "sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA==", "dev": true }, "unist-util-stringify-position": { @@ -16648,14 +16976,13 @@ } }, "vfile": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz", - "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", "dev": true, "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" }, @@ -17060,9 +17387,9 @@ } }, "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -17151,6 +17478,16 @@ "yallist": "^3.0.2" } }, + "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==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -17172,6 +17509,15 @@ "to-regex": "^3.0.2" } }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -17313,17 +17659,17 @@ }, "dependencies": { "mime": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", - "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.0.tgz", + "integrity": "sha512-ft3WayFSFUVBuJj7BMLKAQcSlItKtfjsKDDsii3rqFDAZ7t11zRe8ASw/GlmivGwVUYtwkQrxiGGpL6gFvB0ag==", "dev": true } } }, "webpack-dev-server": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", - "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.1.tgz", + "integrity": "sha512-u4R3mRzZkbxQVa+MBWi2uVpB5W59H3ekZAJsQlKUTdl7Elcah2EhygTPLmeFXybQkf9i2+L0kn7ik9SnXa6ihQ==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -17346,11 +17692,11 @@ "p-retry": "^3.0.1", "portfinder": "^1.0.26", "schema-utils": "^1.0.0", - "selfsigned": "^1.10.7", + "selfsigned": "^1.10.8", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.20", - "sockjs-client": "1.4.0", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", @@ -17749,9 +18095,9 @@ } }, "webpack-merge": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.2.0.tgz", - "integrity": "sha512-QBglJBg5+lItm3/Lopv8KDDK01+hjdg2azEwi/4vKJ8ZmGPdtJsTpjtNNOW3a4WiqzXdCATtTudOZJngE7RKkA==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", + "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -17759,9 +18105,9 @@ } }, "webpack-sources": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.0.1.tgz", - "integrity": "sha512-A9oYz7ANQBK5EN19rUXbvNgfdfZf5U2gP0769OXsj9CvYkCR6OHOsd6OKyEy4H38GGxpsQPKIL83NC64QY6Xmw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz", + "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==", "dev": true, "requires": { "source-list-map": "^2.0.1", @@ -17769,9 +18115,9 @@ } }, "webpack-subresource-integrity": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.1.tgz", - "integrity": "sha512-uekbQ93PZ9e7BFB8Hl9cFIVYQyQqiXp2ExKk9Zv+qZfH/zHXHrCFAfw1VW0+NqWbTWrs/HnuDrto3+tiPXh//Q==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.5.2.tgz", + "integrity": "sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==", "dev": true, "requires": { "webpack-sources": "^1.3.0" @@ -17790,11 +18136,13 @@ } }, "websocket-driver": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", - "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -17934,12 +18282,6 @@ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -17993,12 +18335,6 @@ } } }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true - }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/console/package.json b/console/package.json index a53f385b39..042903a453 100644 --- a/console/package.json +++ b/console/package.json @@ -28,40 +28,40 @@ "@types/google-protobuf": "^3.7.4", "@types/uuid": "^8.3.0", "angular-oauth2-oidc": "^10.0.3", - "angularx-qrcode": "^10.0.11", + "angularx-qrcode": "^11.0.0", "cors": "^2.8.5", "file-saver": "^2.0.5", - "google-proto-files": "^2.3.0", + "google-proto-files": "^2.4.0", "google-protobuf": "^3.13.0", "grpc": "^1.24.3", "grpc-web": "^1.2.1", "moment": "^2.29.1", "ngx-quicklink": "^0.2.6", "rxjs": "~6.6.3", - "ts-protoc-gen": "^0.13.0", + "ts-protoc-gen": "^0.14.0", "tslib": "^2.0.0", "uuid": "^8.3.2", "zone.js": "~0.11.3" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.1100.4", - "@angular/cli": "~11.0.4", + "@angular/cli": "~11.1.2", + "@angular-devkit/build-angular": "~0.1101.2", "@angular/compiler-cli": "~11.0.0", - "@types/jasmine": "~3.6.2", - "@angular/language-service": "~11.0.4", + "@types/jasmine": "~3.6.3", + "@angular/language-service": "~11.1.1", "@types/jasminewd2": "~2.0.3", - "@types/node": "^14.14.13", + "@types/node": "^14.14.22", "codelyzer": "^6.0.0", "jasmine-core": "~3.6.0", "jasmine-spec-reporter": "~6.0.0", - "karma": "~5.2.3", + "karma": "~6.0.3", "karma-chrome-launcher": "~3.1.0", "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.5.0", "prettier": "^2.2.1", "protractor": "~7.0.0", - "stylelint": "^13.8.0", + "stylelint": "^13.9.0", "stylelint-config-standard": "^20.0.0", "stylelint-scss": "^3.18.0", "ts-node": "~9.1.1", diff --git a/console/src/app/favicon-96x96.ico b/console/src/app/favicon-96x96.ico new file mode 100644 index 0000000000..0b13cbabf6 Binary files /dev/null and b/console/src/app/favicon-96x96.ico differ diff --git a/console/src/app/services/interceptors/auth.interceptor.ts b/console/src/app/services/interceptors/auth.interceptor.ts index f609398421..37b1371dc0 100644 --- a/console/src/app/services/interceptors/auth.interceptor.ts +++ b/console/src/app/services/interceptors/auth.interceptor.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { Request, UnaryInterceptor, UnaryResponse } from 'grpc-web'; -import { filter, first, take } from 'rxjs/operators'; +import { Subject } from 'rxjs'; +import { debounceTime, filter, first, take } from 'rxjs/operators'; import { WarnDialogComponent } from 'src/app/modules/warn-dialog/warn-dialog.component'; import { AuthenticationService } from '../authentication.service'; @@ -16,11 +17,16 @@ const accessTokenStorageKey = 'access_token'; * Set the authentication token */ export class AuthInterceptor implements UnaryInterceptor { + public triggerDialog: Subject = new Subject(); constructor( private authenticationService: AuthenticationService, private storageService: StorageService, private dialog: MatDialog, - ) { } + ) { + this.triggerDialog.pipe(debounceTime(1000)).subscribe(() => { + this.openDialog(); + }); + } public async intercept(request: Request, invoker: any): Promise> { await this.authenticationService.authenticationChanged.pipe( @@ -36,22 +42,26 @@ export class AuthInterceptor implements UnaryIn return response; }).catch((error: any) => { if (error.code === 16) { - const dialogRef = this.dialog.open(WarnDialogComponent, { - data: { - confirmKey: 'ACTIONS.LOGIN', - titleKey: 'ERRORS.TOKENINVALID.TITLE', - descriptionKey: 'ERRORS.TOKENINVALID.DESCRIPTION', - }, - width: '400px', - }); - - dialogRef.afterClosed().pipe(take(1)).subscribe(resp => { - if (resp) { - this.authenticationService.authenticate(undefined, true, true); - } - }); + this.triggerDialog.next(true); } return Promise.reject(error); }); } + + openDialog() { + const dialogRef = this.dialog.open(WarnDialogComponent, { + data: { + confirmKey: 'ACTIONS.LOGIN', + titleKey: 'ERRORS.TOKENINVALID.TITLE', + descriptionKey: 'ERRORS.TOKENINVALID.DESCRIPTION', + }, + width: '400px', + }); + + dialogRef.afterClosed().pipe(take(1)).subscribe(resp => { + if (resp) { + this.authenticationService.authenticate(undefined, true, true); + } + }); + } } diff --git a/console/src/assets/icons/android-chrome-512x512.png b/console/src/assets/icons/android-chrome-512x512.png index 0112bc8bce..6987ed11b4 100644 Binary files a/console/src/assets/icons/android-chrome-512x512.png and b/console/src/assets/icons/android-chrome-512x512.png differ diff --git a/console/src/favicon.ico b/console/src/favicon.ico index 6084cca103..de1ff1f956 100644 Binary files a/console/src/favicon.ico and b/console/src/favicon.ico differ diff --git a/go.mod b/go.mod index 5e829050b7..f1a3c5e377 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.15 require ( cloud.google.com/go v0.71.0 // indirect + cloud.google.com/go/storage v1.10.0 github.com/BurntSushi/toml v0.3.1 github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v0.13.0 @@ -16,9 +17,10 @@ require ( github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc github.com/caos/logging v0.0.2 github.com/caos/oidc v0.13.2 + github.com/caos/orbos v1.5.14-0.20210205131708-6dc812182dc0 github.com/cockroachdb/cockroach-go/v2 v2.1.0 github.com/duo-labs/webauthn v0.0.0-20200714211715-1daaee874e43 - github.com/envoyproxy/protoc-gen-validate v0.4.1 + github.com/envoyproxy/protoc-gen-validate v0.1.0 github.com/ghodss/yaml v1.0.0 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b github.com/golang/mock v1.4.4 @@ -41,16 +43,19 @@ require ( github.com/kevinburke/twilio-go v0.0.0-20200810163702-320748330fac github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.9.0 - github.com/mattn/go-colorable v0.1.8 // indirect + github.com/manifoldco/promptui v0.7.0 + github.com/mattn/go-colorable v0.1.8 // indirect; indirect github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/copystructure v1.0.0 // indirect github.com/mitchellh/reflectwalk v1.0.1 // indirect github.com/nicksnyder/go-i18n/v2 v2.1.1 + github.com/pkg/errors v0.9.1 github.com/pquerna/otp v1.2.0 github.com/prometheus/client_golang v1.8.0 // indirect github.com/prometheus/common v0.15.0 // indirect github.com/rakyll/statik v0.1.7 github.com/rs/cors v1.7.0 github.com/sony/sonyflake v1.0.0 + github.com/spf13/cobra v0.0.7 github.com/stretchr/testify v1.6.1 github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 // indirect github.com/ttacon/libphonenumber v1.1.0 @@ -66,10 +71,15 @@ require ( golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect golang.org/x/text v0.3.4 golang.org/x/tools v0.0.0-20201103235415-b653051172e4 + google.golang.org/api v0.34.0 google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20201103154000-415bd0cd5df6 google.golang.org/grpc v1.34.0 google.golang.org/protobuf v1.25.0 gopkg.in/square/go-jose.v2 v2.5.1 - gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 // indirect + gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c + gotest.tools v2.2.0+incompatible + k8s.io/api v0.18.5 + k8s.io/apiextensions-apiserver v0.18.5 + k8s.io/apimachinery v0.18.5 ) diff --git a/go.sum b/go.sum index cfe27d1e96..7e54c9f28f 100644 --- a/go.sum +++ b/go.sum @@ -44,6 +44,18 @@ cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AlecAivazis/survey/v2 v2.0.8 h1:zVjWKN+JIAfmrq6nGWG3DfLS8ypEBhxYy0p7FM+riFk= +github.com/AlecAivazis/survey/v2 v2.0.8/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= +github.com/AppsFlyer/go-sundheit v0.2.0 h1:FArqX+HbqZ6U32RC3giEAWRUpkggqxHj91KIvxNgwjU= +github.com/AppsFlyer/go-sundheit v0.2.0/go.mod h1:rCRkVTMQo7/krF7xQ9X0XEF1an68viFR6/Gy02q+4ds= +github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +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/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -58,22 +70,34 @@ github.com/DataDog/sketches-go v0.0.1/go.mod h1:Q5DbzQ+3AkgGwymQO7aZFNP7ns2lZKGt github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v0.13.0 h1:fjKUtfldCPIF4nIzAAj3LzP8Lrd3DuRIMiFdOsj4fLc= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v0.13.0/go.mod h1:q/paYxLXKVhwfC3lzLfhtL54fAx14wzMN9DundQOBMc= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E= github.com/Masterminds/goutils v1.1.0 h1:zukEsf/1JZwCMgHiK3GZftabmxiCw4apj3a28RPBiVg= github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/PuerkitoBio/goquery v1.5.1 h1:PSPBGne8NIUWw+/7vFBV+kG2J/5MOjbzc7154OaKCSE= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= +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/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +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/VictoriaMetrics/fastcache v1.5.7 h1:4y6y0G8PRzszQUYIQHHssv/jgPHAb5qQuuDNdCbyAgw= github.com/VictoriaMetrics/fastcache v1.5.7/go.mod h1:ptDBkNMQI4RtmVo8VS/XwRY6RoTu1dAWCbrk+6WsEM8= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/ajstarks/svgo v0.0.0-20200725142600-7a3c8b57fecb h1:EVl3FJLQCzSbgBezKo/1A4ADnJ4mtJZ0RvnNzDJ44nY= github.com/ajstarks/svgo v0.0.0-20200725142600-7a3c8b57fecb/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= 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= @@ -82,146 +106,211 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/allegro/bigcache v1.2.1 h1:hg1sY1raCwic3Vnsvje6TT7/pnZba83LeFck5NrFKSc= github.com/allegro/bigcache v1.2.1/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= 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/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +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/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go v1.31.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= 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/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= +github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc h1:biVzkmvwrH8WK8raXaxBx6fRVTlJILwEwQGL1I/ByEI= github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= -github.com/caos/logging v0.0.2 h1:ebg5C/HN0ludYR+WkvnFjwSExF4wvyiWPyWGcKMYsoo= +github.com/caos/logging v0.0.0-20191210002624-b3260f690a6a/go.mod h1:9LKiDE2ChuGv6CHYif/kiugrfEXu9AwDiFWSreX7Wp0= github.com/caos/logging v0.0.2 h1:ebg5C/HN0ludYR+WkvnFjwSExF4wvyiWPyWGcKMYsoo= github.com/caos/logging v0.0.2/go.mod h1:9LKiDE2ChuGv6CHYif/kiugrfEXu9AwDiFWSreX7Wp0= -github.com/caos/logging v0.0.2/go.mod h1:9LKiDE2ChuGv6CHYif/kiugrfEXu9AwDiFWSreX7Wp0= +github.com/caos/oidc v0.6.2/go.mod h1:ozoi3b+aY33gzdvjz4w90VZShIHGsmDa0goruuV0arQ= github.com/caos/oidc v0.13.2 h1:52oP3KB1UrZuwraBTLuwM9ItRIhJQMYOm1J5uQ0sYXw= github.com/caos/oidc v0.13.2/go.mod h1:dLvfYUiAt9ORfl77L/KkcWuR/N0ll8Ry1nD2ERsamDY= +github.com/caos/orbos v1.5.14-0.20210128140136-842933949472 h1:iti4tAKxBknjJkQcDKWaxlj9Jbng5kz5TpQzzyda49o= +github.com/caos/orbos v1.5.14-0.20210128140136-842933949472/go.mod h1:ZLxNgPuYIlSvr80trezGGUIXng9gY2hHEdky/m0B/P0= +github.com/caos/orbos v1.5.14-0.20210202122121-ad32524ffc73 h1:usYmCT11HvwxBCk1+DSCmEU6CVYhzY8jHaQHSJMrxlg= +github.com/caos/orbos v1.5.14-0.20210202122121-ad32524ffc73/go.mod h1:ZLxNgPuYIlSvr80trezGGUIXng9gY2hHEdky/m0B/P0= +github.com/caos/orbos v1.5.14-0.20210205131708-6dc812182dc0 h1:N+KYBwuQO3QPr/nTUaNwjAetjp3NU4MP8Nv9Iue53UE= +github.com/caos/orbos v1.5.14-0.20210205131708-6dc812182dc0/go.mod h1:ZLxNgPuYIlSvr80trezGGUIXng9gY2hHEdky/m0B/P0= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= -github.com/census-instrumentation/opencensus-proto v0.2.1/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 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= +github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= -github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7 h1:Puu1hUwfps3+1CUzYdAZXijuvLuRMirgiXdf3zsM2Ig= github.com/cloudflare/cfssl v0.0.0-20190726000631-633726f6bcb7/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f h1:WBZRG4aNOuI15bLRrCgN8fCq8E5Xuty6jGbmSNEvSsU= +github.com/cloudflare/cloudflare-go v0.12.1/go.mod h1:gmzHQPAyHh8N8UgX0Z+3rSMRbNj47JDEbzXDICHVXys= +github.com/cloudscale-ch/cloudscale-go-sdk v1.6.0/go.mod h1:FhOTOCgKAVvRRMQc1mC0D7xK/3zYnmcZBWFXNkacvMc= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go/v2 v2.1.0 h1:zicZlBhWZu6wfK7Ezg4Owdc3HamLpRdBllPTT9tb+2k= github.com/cockroachdb/cockroach-go/v2 v2.1.0/go.mod h1:ilhrLnPDDwGHL+iK2UxQhp1UzUhst8sfItSAgCYwAyg= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +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/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +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/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +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 v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7 h1:6pwm8kMQKCmgUg0ZHTm5+/YvRK0s3THD/28+T6/kk4A= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= +github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd h1:83Wprp6ROGeiHFAP8WJdI2RoxALQYgdllERc3N5N2DM= github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= 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/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= +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/duo-labs/webauthn v0.0.0-20200714211715-1daaee874e43 h1:eEEfwrmEwl0LVuWz/VkAefdgtPbX174Huu5dxxceihI= github.com/duo-labs/webauthn v0.0.0-20200714211715-1daaee874e43/go.mod h1:/X2OJiJxjQ7alqWZqX9EtBTmZc+4qQ0LvZ1k5wP67RM= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= 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/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +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/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4 h1:rEvIZUSZ3fx39WIi3JkQqQBitGwpELBIYWeBVh6wn+E= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.4.1 h1:7dLaJvASGRD7X49jSCSXXHwKPm0ZN9r9kJD+p+vS7dM= -github.com/envoyproxy/protoc-gen-validate v0.4.1/go.mod h1:E+IEazqdaWv3FrnGtZIu3b9fPFMK8AzeTTrk9SfVwWs= -github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5 h1:Yzb9+7DPaBjB8zlTR87/ElzFsnQfuHnVUVqpZZIcV5Y= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= +github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fxamacker/cbor/v2 v2.2.0 h1:6eXqdDDe588rSYAi1HfZKbx6YYQO4mxQ9eC6xYpU/JQ= github.com/fxamacker/cbor/v2 v2.2.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= +github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/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/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +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-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-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/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 h1:wDJmvq38kDhkVxi50ni9ykkdUr1PKgqKOoi01fa0Mdk= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +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/analysis v0.19.5/go.mod h1:hkEAkxagaIvIP7VTn8ygJNkd4kAYON2rCu0v0ObL0AU= +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/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/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +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/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +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/loads v0.19.4/go.mod h1:zZVHonKd8DXyxyw4yfnVjPzBjIQcLt0CCsn0N0ZrQsk= +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/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= +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/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +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/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +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/swag v0.19.5/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-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= -github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= -github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= 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.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= -github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= -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-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/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= @@ -231,10 +320,10 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +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/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -245,49 +334,38 @@ github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi 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 h1:oOuy+ugB+P/kBdUnG5QaMXSIyJ1q38wWSojYCb3z5VQ= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1 h1:ZFgWrT+bLgsYPirOnRfKLYJLvssAegOj/hgyMFdJZe0= 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/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.2 h1:aeE13tS0IiQgFjYdoL8qN3K1N2bXXtI6Vi51/y7BpMw= github.com/golang/snappy v0.0.2/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= +github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= +github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= 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/certificate-transparency-go v1.0.21 h1:Yf1aXowfZ2nuboBsg7iYGLmwsOARdV86pfH3g95wXmE= github.com/google/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= 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 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= github.com/google/go-cmp v0.4.1/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/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github/v31 v31.0.0 h1:JJUxlP9lFK+ziXKimTCprajMApV1ecWD4NB6CCb0plo= github.com/google/go-github/v31 v31.0.0/go.mod h1:NQPZol8/1sMoWYGN2yaALIBytu17gAWfhbweiEed3pM= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 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 h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0 h1:pMen7vLs8nvgEYhywH3KDWJIJTeEr2ULsVWHWYHQyBs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -296,41 +374,48 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99 h1:Ak8CrdlwwXwAZxzS66vgPt4U8yUZX7JwLvVR58FN5jM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= 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/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/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.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3 h1:eHv/jVY/JNop1xg2J9cBb4EzyMpWZoNCP1BslSAIkOI= +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.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= +github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3/go.mod h1:h/KNeRx7oYU4SpA4SoY7W2/NxDKEEVuwA6j9A27L4OI= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/csrf v1.7.0 h1:mMPjV5/3Zd460xCavIkppUdvnl5fPXMpv2uz2Zyg7/Y= github.com/gorilla/csrf v1.7.0/go.mod h1:+a/4tCmqhG6/w4oafeAZ9pEa3/NZOWYVbD9fV0FwIQA= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= 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.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/gorilla/schema v1.1.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/schema v1.2.0 h1:YufUaxZYCKGFuAq3c96BOhjgd5nmXiOY9NGzF247Tsc= github.com/gorilla/schema v1.2.0/go.mod h1:kgLaKoK1FELgZqMAVxx/5cbj0kT+57qxUrAlIO2eleU= github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2 h1:FlFbCRLd5Jr4iYXZufAvgWN6Ao0JrI5chLINnUXDDr0= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= 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/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -349,59 +434,48 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= 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 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/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7 h1:ux/56T2xqZO/3cP1I2F86qpeoYPCOzk+KF/UH/Ar+lk= -github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6 h1:UDMh68UUwekSh5iP2OMhRRZJiiBccgV7axzUG8vi56c= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/log15 v0.0.0-20200109203555-b30bc20e4fd1 h1:KUDFlmBg2buRWNzIcwLlKvfcnujcHQRQ1As1LoaCLAM= github.com/inconshreveable/log15 v0.0.0-20200109203555-b30bc20e4fd1/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= github.com/jackc/pgconn v1.4.0/go.mod h1:Y2O3ZDF0q4mMacyWV3AstPJpeHXWGEetiFttmq5lahk= -github.com/jackc/pgconn v1.5.0 h1:oFSOilzIZkyg787M1fEmyMfOUUvwj0daqYMfaWwNL4o= github.com/jackc/pgconn v1.5.0/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= github.com/jackc/pgconn v1.5.1-0.20200601181101-fa742c524853/go.mod h1:QeD3lBfpTFe8WUnPZWN5KY/mB8FGMIYRdd8P8Jr0fAI= github.com/jackc/pgconn v1.7.0/go.mod h1:sF/lPpNEMEOp+IYhyQGdAvrG20gWf6A1tKlr0v7JMeA= github.com/jackc/pgconn v1.7.2/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2 h1:JVX6jT/XfzNqIjye4717ITLaNwV9mWbJx0dLCpcRzdA= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.1 h1:Rdjp4NFjwHnEslx2b66FfCI2S0LhO4itac3hXz6WX9M= github.com/jackc/pgproto3/v2 v2.0.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.0.5/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8 h1:Q3tB+ExeflWUW7AFcAhXqk40s9mnNYLk1nOkKNZ5GnU= github.com/jackc/pgservicefile v0.0.0-20200307190119-3430c5407db8/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= @@ -422,61 +496,63 @@ github.com/jackc/pgx/v4 v4.9.0/go.mod h1:MNGWmViCgqbZck9ujOOBN63gK9XVGILXWCvKLGK github.com/jackc/pgx/v4 v4.9.2/go.mod h1:Jt/xJDqjUDUOMSv8VMWPQlCObVgF2XOgqKsW8S4ROYA= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.0 h1:musOWczZC/rSbqut475Vfcczg7jJsdUQf0D6oKPLgNU= github.com/jackc/puddle v1.1.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.1/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.2/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/gorm v1.9.16 h1:+IyIjPEABKRpsu/F8OvDPy9fyQlgsg2luMV2ZIH5i5o= github.com/jinzhu/gorm v1.9.16/go.mod h1:G3LB3wezTOWM2ITLzPxEXgSkOXAntiLHS7UdBefADcs= github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= -github.com/jinzhu/now v1.0.1 h1:HjfetcXq097iXP0uoPCdnM4Efp5/9MsM0/M+XOTeR3M= github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jinzhu/now v1.1.1 h1:g39TucaRWyV3dwDO++eEc6qf8TVIQ/Da48WmqjZ3i7E= github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmoiron/sqlx v1.2.0 h1:41Ip0zITnmWNR/vHV+S4m+VoUivnWY5E4OJfLZjCJMA= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9/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 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/kataras/tablewriter v0.0.0-20180708051242-e063d29b7c23/go.mod h1:kBSna6b0/RzsOcOZf515vAXwSsXYusl2U7SA0XP09yI= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/go-types v0.0.0-20200309064045-f2d4aea18a7a h1:Z7+SSApKiwPjNic+NF9+j7h657Uyvdp/jA3iTKhpj4E= github.com/kevinburke/go-types v0.0.0-20200309064045-f2d4aea18a7a/go.mod h1:/Pk5i/SqYdYv1cie5wGwoZ4P6TpgMi+Yf58mtJSHdOw= github.com/kevinburke/go.uuid v1.2.0 h1:+1qP8NdkJfgOSTrrrUuA7h0djr1VY77HFXYjR+zUcUo= github.com/kevinburke/go.uuid v1.2.0/go.mod h1:9gVngk1Hq1FjwewVAjsWEUT+xc6jP+p62CASaGmQ0NQ= github.com/kevinburke/rest v0.0.0-20200429221318-0d2892b400f8 h1:KpuDJTaTPQAyWqETt70dHX3pMz65/XYTAZymrKKNvh8= github.com/kevinburke/rest v0.0.0-20200429221318-0d2892b400f8/go.mod h1:pD+iEcdAGVXld5foVN4e24zb/6fnb60tgZPZ3P/3T/I= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/twilio-go v0.0.0-20200810163702-320748330fac h1:qQ7NAZEHpTyDfmZBH79KEiH3OK47Z+KvYVSR4sS3650= github.com/kevinburke/twilio-go v0.0.0-20200810163702-320748330fac/go.mod h1:Fm9alkN1/LPVY1eqD/psyMwPWE4VWl4P01/nTYZKzBk= -github.com/kisielk/errcheck v1.1.0 h1:ZqfnKyx9KGpRcW04j5nnPDgRgoXUeLh2YFBeFzphcA0= 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 v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 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/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= 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/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= +github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -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/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/landoop/tableprinter v0.0.0-20200805134727-ea32388e35c1/go.mod h1:f0X1c0za3TbET/rl5ThtCSel0+G3/yZ8iuU9BxnyVK0= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= @@ -485,13 +561,24 @@ github.com/lib/pq v1.3.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.4.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.9.0 h1:L8nSXQQzAYByakOFMTwpjRoHsMJklur4Gi59b6VivR8= github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/lyft/protoc-gen-star v0.5.1/go.mod h1:9toiA3cC7z5uVbODF7kEQ91Xn7XNFkVUl+SrEe+ZORU= +github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= +github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +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/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/manifoldco/promptui v0.7.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -501,36 +588,45 @@ github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hd github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +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-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= -github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= 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/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= +github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= 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/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= 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-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= 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/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= 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-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/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= @@ -540,19 +636,24 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nicksnyder/go-i18n/v2 v2.1.1 h1:ATCOanRDlrfKVB4WHAdJnLEqZtDmKYsweqsOUYflnBU= github.com/nicksnyder/go-i18n/v2 v2.1.1/go.mod h1:d++QJC9ZVf7pa48qrsRWhMJ5pSHIPmS3OLqK1niyLxs= -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/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +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.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -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/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= @@ -561,79 +662,87 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= 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-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pires/go-proxyproto v0.3.0 h1:++BY4zWOpWha50IDjdnp7+NRTLuOHqMQC5PkgS7I4u4= +github.com/pires/go-proxyproto v0.3.0/go.mod h1:Odh9VFOZJCf9G8cLW5o435Xf1J95Jw9Gw5rnCjcwzAY= 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/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= 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/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/otp v1.2.0 h1:/A3+Jn+cagqayeR3iHs/L62m5ue7710D35zl1zJ1kok= github.com/pquerna/otp v1.2.0/go.mod h1:dkJfzwRKNiegxyNb54X/3fLwhCynbMspSyWKnvi1AEg= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 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.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.8.0 h1:zvJNkoCFAnYFNC24FV8nW4JdRJ3GIFcLbg65lL/JDcw= github.com/prometheus/client_golang v1.8.0/go.mod h1:O9VU6huf47PktckDQfMTX0Y8tY0/7TSWwj+ITvv0TnM= 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/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/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.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.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/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.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rakyll/statik v0.1.7 h1:OF3QCZUuyPxuGEP7B4ypUa7sB/iHtqOTDYZXGM8KOdQ= github.com/rakyll/statik v0.1.7/go.mod h1:AlZONWzMtEnMs7W4e/1LURLiI49pIMmp6V9Unghqrcc= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0 h1:RR9dF3JtopPvtkroDZuVD7qquD0bnHlKSqaQhgwt8yk= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= 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/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200227202807-02e2044944cc/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/shopspring/decimal v0.0.0-20200419222939-1884f454f8ea h1:jaXWVFZ98/ihXniiDzqNXQgMSgklX4kjfDWZTE3ZtdU= github.com/shopspring/decimal v0.0.0-20200419222939-1884f454f8ea/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= 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.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/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= @@ -644,55 +753,75 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4= -github.com/spf13/afero v1.3.3 h1:p5gZEKLYoL7wh8VrJesMaYeNxdEd1v3cb4irOk9zB54= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.3.4 h1:8q6vk3hthlpb2SouZcnBVKboxWQWMDNF38bwholZrJc= -github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.7/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +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/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.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= 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 v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= 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/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= 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/ttacon/builder v0.0.0-20170518171403-c099f663e1c2 h1:5u+EJUQiosu3JFX0XS0qTf5FznsMOzTjGqavBGuCbo0= github.com/ttacon/builder v0.0.0-20170518171403-c099f663e1c2/go.mod h1:4kyMkleCiLkgY6z8gK5BkI01ChBtxR0ro3I1ZDcGM3w= github.com/ttacon/libphonenumber v1.1.0 h1:tC6kE4t8UI4OqQVQjW5q8gSWhG2wnY5moEpSEORdYm4= github.com/ttacon/libphonenumber v1.1.0/go.mod h1:E0TpmdVMq5dyVlQ7oenAkhsLu86OkUl+yR4OAxyEg/M= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= +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 h1:5tjfNdR2ki3yYQ842+eX2sQHeiwpKJ0RnHO4IYOc4V8= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zenazn/goji v0.9.0 h1:RSQQAbXGArQ0dIDEq+PI6WqN6if+5KHu6x2Cx/GXLTQ= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +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.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= 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/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.1/go.mod h1:Ap50jQcDJrx6rB6VgeeFPtuPIf3wMRvRfrfYDO6+BmA= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= @@ -713,36 +842,38 @@ go.opentelemetry.io/otel/exporters/stdout v0.13.0/go.mod h1:JJt8RpNY6K+ft9ir3iKp go.opentelemetry.io/otel/sdk v0.13.0 h1:4VCfpKamZ8GtnepXxMRurSpHpMKkcxhtO33z1S4rGDQ= go.opentelemetry.io/otel/sdk v0.13.0/go.mod h1:dKvLH8Uu8LcEPlSAUsfW7kMGaJBhk/1NYvpPZ6wIMbU= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/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= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= 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-20190219172222-a4c6cb3142f2/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-20190320223903-b7391e95e576/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/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-20190530122614-20be4c3c3ed5/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-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191128160524-b544559bb6d1/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/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/crypto v0.0.0-20201016220609-9e8e0b390897 h1:pLI5jrR7OSLijeIDcmRxNmw2api+jEfxLoykJVice/E= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -755,11 +886,9 @@ golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= 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= @@ -769,25 +898,22 @@ golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHl 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/lint v0.0.0-20200130185559-910be7a94367 h1:0IiAsCRByjO2QjX7ZPkw5oU9x+n1YqRL802rjC0c3Aw= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= 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.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= 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-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/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-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= @@ -796,38 +922,37 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r 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-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-20190613194153-d28f0bde5980/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-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/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-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/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-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200602114024-627f9648deb9/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/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/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201026091529-146b70c837a4/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -835,9 +960,10 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102 h1:42cLlJJdEh+ySyeUUbEQ5bsTi golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 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-20190517181255-950ef44c6e07/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191122200657-5d9234df094c/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= @@ -846,14 +972,12 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ 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 h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/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-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= @@ -862,24 +986,29 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h 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-20190221075227-b4e8571b14e0/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-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-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/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-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab h1:FvshnhkKW+LO3HWHodML8kuVX8rnJTxKm9dFPuI68UM= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -891,44 +1020,42 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/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 h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d h1:nc5K6ox/4lTFbMVSL9WRR81ixkcwXThoiF6yf+R9scA= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/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-20170915032832-14c0d48ead0c/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/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 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/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/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= +golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/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-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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/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/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -937,14 +1064,17 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 h1:5Beo0mZN8dRzgrMMkDp0jc8YXQKx9DiJ2k1dkvGsn5A= 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-20190617190820-da514acc4774/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-20190729092621-ff9f1409240a/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-20190823170909-c4a336ef6a2f/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-20190920225731-5eefd052ad72/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -961,36 +1091,29 @@ golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56 h1:DFtSed2q3HtNuVazwVDZ4nSRS/JrZEig0gz2BY4VNrg= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4 h1:kDtqNkeBrZb8B+atrj50B5XLHpzXXqcCdZPP/ApQ5NY= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200701151220-7cb253f4c4f8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d h1:W07d4xkoAUSNOkOzdzXCdFGxT7o2rW4q8M34tB2i//k= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201030143252-cf7a54d06671/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201103235415-b653051172e4 h1:Qe0EMgvVYb6tmJhJHljCj3gS96hvSTkGNaIzp/ivq10= golang.org/x/tools v0.0.0-20201103235415-b653051172e4/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= @@ -1003,17 +1126,12 @@ google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0 h1:jz2KixHX7EcCPiQrySzPdnYT7DbINAypCqKZ1Z7GM40= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0 h1:J1Pl9P2lnmYFSJvgs70DKELqHNh8CNWXPbud4njEE2s= google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0 h1:cG03eaksBzhfSIk7JRGctfp3lanklcOM/mTGvow7BbQ= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0 h1:jMF5hhVfMkTZwHW1SDpKq5CkgWLXOb31Foaca9Zr3oM= +google.golang.org/api v0.26.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0 h1:BaiDisFir8O4IJxvAabCGGkQ6yCJegNQqSVoYUNAnbk= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/api v0.34.0 h1:k40adF3uR+6x/+hO5Dh4ZFUqFp67vxvbpafFiJxl10A= google.golang.org/api v0.34.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= @@ -1022,11 +1140,8 @@ google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 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/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/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= @@ -1049,14 +1164,12 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940 h1:MRHtG0U6SnaUb+s+LhNE1qt1FQ1wlhqr5E4usBKC0uA= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -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/genproto v0.0.0-20200605102947-12044bf5ea91/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1064,7 +1177,6 @@ google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200715011427-11fb19a81f2c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987 h1:PDIOdWxZ8eRizhKa1AAvY53xsvLB1cWorMjslvY3VA8= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201030142918-24207fddd1c3/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1083,18 +1195,12 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0 h1:bO/TA4OxCOummhSf10siHuG7vJOiwh7SpRpFZDkOgl4= google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1 h1:EC2SB8S04d2r73uptxphDSUG+kTKVgjRPF+N3xpxRB4= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0 h1:zWTV+LMdc3kaiJMSTOFz2UgSBgx8RNQoTGiZu3fR9S0= google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1 h1:DGeFlSan2f+WEtCERJ4J9GJWk15TxUi8QGagfI87Xyc= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= @@ -1102,34 +1208,37 @@ google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLY 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 h1:qdOKuR/EIArgaWNjetjgTzgVTAZ+S/WXVrq9HW9zimw= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0 h1:cJv5/xdbk1NnMPR1VP9+HU6gupuG9MLBoH1r6RHZ2MY= 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= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 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/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= 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/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +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.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.5.1 h1:7odma5RETjNHWJnR32wx8t+Io4djHE1PqxCFx3iiZ2w= gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= 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= @@ -1137,32 +1246,64 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/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.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= gopkg.in/yaml.v2 v2.2.7/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= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c h1:grhR+C34yXImVGp7EzNk+DTIk+323eIUWOmEevy6bDo= +gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gorm.io/driver/postgres v1.0.5/go.mod h1:qrD92UurYzNctBMVCJ8C3VQEjffEuphycXtxOudXNCA= gorm.io/gorm v1.20.4/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= gorm.io/gorm v1.20.6/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= +gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= 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 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -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= -rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +k8s.io/api v0.18.3/go.mod h1:UOaMwERbqJMfeeeHc8XJKawj4P9TgDRnViIqqBeH2QA= +k8s.io/api v0.18.5 h1:fKbCxr+U3fu7k6jB+QeYPD/c6xKYeSJ2KVWmyUypuWM= +k8s.io/api v0.18.5/go.mod h1:tN+e/2nbdGKOAH55NMV8oGrMG+3uRlA9GaRfvnCCSNk= +k8s.io/apiextensions-apiserver v0.18.5 h1:pvbXjB/BRXZiO+/Erp5Pxr+lnhDCv5uxNxHh3FLGZ/g= +k8s.io/apiextensions-apiserver v0.18.5/go.mod h1:woZ7PkEIMHjhHIyApvOwkGOkBLUYKuet0VWVkPTQ/Fs= +k8s.io/apimachinery v0.18.3/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apimachinery v0.18.5 h1:Lh6tgsM9FMkC12K5T5QjRm7rDs6aQN5JHkA0JomULDM= +k8s.io/apimachinery v0.18.5/go.mod h1:OaXp26zu/5J7p0f92ASynJa1pZo06YlV9fG7BoWbCko= +k8s.io/apiserver v0.18.5/go.mod h1:+1XgOMq7YJ3OyqPNSJ54EveHwCoBWcJT9CaPycYI5ps= +k8s.io/cli-runtime v0.18.3/go.mod h1:pqbbi4nqRIQhUWAVzen8uE8DD/zcZLwf+8sQYO4lwLk= +k8s.io/client-go v0.18.3/go.mod h1:4a/dpQEvzAhT1BbuWW09qvIaGw6Gbu1gZYiQZIi1DMw= +k8s.io/client-go v0.18.5 h1:cLhGZdOmyPhwtt20Lrb7uAqxxB1uvY+NTmNJvno1oKA= +k8s.io/client-go v0.18.5/go.mod h1:EsiD+7Fx+bRckKWZXnAXRKKetm1WuzPagH4iOSC8x58= +k8s.io/code-generator v0.18.3/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/code-generator v0.18.5/go.mod h1:TgNEVx9hCyPGpdtCWA34olQYLkh3ok9ar7XfSsr8b6c= +k8s.io/component-base v0.18.3/go.mod h1:bp5GzGR0aGkYEfTj+eTY0AN/vXTgkJdQXjNTTVUaa3k= +k8s.io/component-base v0.18.5/go.mod h1:RSbcboNk4B+S8Acs2JaBOVW3XNz1+A637s2jL+QQrlU= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/gengo v0.0.0-20200114144118-36b2048a9120/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 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-20200410145947-61e04a5be9a6/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E= +k8s.io/kubectl v0.18.3/go.mod h1:k/EpvXBDgEsHBzWr0A44l9+ArvYi3txBBnzXBjQasUQ= +k8s.io/metrics v0.18.3/go.mod h1:TkuJE3ezDZ1ym8pYkZoEzJB7HDiFE7qxl+EmExEBoPA= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89 h1:d4vVOjXm687F1iLSP2q3lyPPuyvTUt3aVoBpi2DqRsU= +k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= +sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0 h1:dOmIZBMfhcHS09XZkMyUgkq5trg3/jRyJYFZUiaOp8E= +sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw= 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/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +vbom.ml/util v0.0.0-20160121211510-db5cfe13f5cc/go.mod h1:so/NYdZXCz+E3ZpW0uAoCj6uzU2+8OWDFv/HxUSs7kI= diff --git a/internal/admin/repository/eventsourcing/eventstore/administrator.go b/internal/admin/repository/eventsourcing/eventstore/administrator.go index b36717481e..a80b42574d 100644 --- a/internal/admin/repository/eventsourcing/eventstore/administrator.go +++ b/internal/admin/repository/eventsourcing/eventstore/administrator.go @@ -48,7 +48,7 @@ func (repo *AdministratorRepo) GetViews() ([]*view_model.View, error) { } func (repo *AdministratorRepo) GetSpoolerDiv(database, view string) int64 { - sequence, err := repo.View.GetCurrentSequence(database, view, "") + sequence, err := repo.View.GetCurrentSequence(database, view) if err != nil { return 0 diff --git a/internal/admin/repository/eventsourcing/eventstore/iam.go b/internal/admin/repository/eventsourcing/eventstore/iam.go index 515e752024..98878b6099 100644 --- a/internal/admin/repository/eventsourcing/eventstore/iam.go +++ b/internal/admin/repository/eventsourcing/eventstore/iam.go @@ -40,7 +40,7 @@ func (repo *IAMRepository) IAMMemberByID(ctx context.Context, iamID, userID stri func (repo *IAMRepository) SearchIAMMembers(ctx context.Context, request *iam_model.IAMMemberSearchRequest) (*iam_model.IAMMemberSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, err := repo.View.GetLatestIAMMemberSequence("") + sequence, err := repo.View.GetLatestIAMMemberSequence() logging.Log("EVENT-Slkci").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Warn("could not read latest iam sequence") members, count, err := repo.View.SearchIAMMembers(request) if err != nil { @@ -70,9 +70,7 @@ func (repo *IAMRepository) GetIAMMemberRoles() []string { } func (repo *IAMRepository) RemoveIDPConfig(ctx context.Context, idpConfigID string) error { - // if repo.IAMV2Command != nil { - // return repo.IAMV2Command. - // } + aggregates := make([]*es_models.Aggregate, 0) idp := iam_model.NewIDPConfig(repo.SystemDefaults.IamID, idpConfigID) _, agg, err := repo.IAMEventstore.PrepareRemoveIDPConfig(ctx, idp) @@ -115,7 +113,7 @@ func (repo *IAMRepository) RemoveIDPConfig(ctx context.Context, idpConfigID stri func (repo *IAMRepository) SearchIDPConfigs(ctx context.Context, request *iam_model.IDPConfigSearchRequest) (*iam_model.IDPConfigSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, err := repo.View.GetLatestIDPConfigSequence("") + sequence, err := repo.View.GetLatestIDPConfigSequence() logging.Log("EVENT-Dk8si").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Warn("could not read latest idp config sequence") idps, count, err := repo.View.SearchIDPConfigs(request) if err != nil { @@ -134,31 +132,6 @@ func (repo *IAMRepository) SearchIDPConfigs(ctx context.Context, request *iam_mo return result, nil } -func (repo *IAMRepository) GetDefaultLabelPolicy(ctx context.Context) (*iam_model.LabelPolicyView, error) { - policy, viewErr := repo.View.LabelPolicyByAggregateID(repo.SystemDefaults.IamID) - if viewErr != nil && !caos_errs.IsNotFound(viewErr) { - return nil, viewErr - } - if caos_errs.IsNotFound(viewErr) { - policy = new(iam_es_model.LabelPolicyView) - } - events, esErr := repo.IAMEventstore.IAMEventsByID(ctx, repo.SystemDefaults.IamID, policy.Sequence) - if caos_errs.IsNotFound(viewErr) && len(events) == 0 { - return nil, caos_errs.ThrowNotFound(nil, "EVENT-4bM0s", "Errors.IAM.LabelPolicy.NotFound") - } - if esErr != nil { - logging.Log("EVENT-3M0xs").WithError(esErr).Debug("error retrieving new events") - return iam_es_model.LabelPolicyViewToModel(policy), nil - } - policyCopy := *policy - for _, event := range events { - if err := policyCopy.AppendEvent(event); err != nil { - return iam_es_model.LabelPolicyViewToModel(policy), nil - } - } - return iam_es_model.LabelPolicyViewToModel(policy), nil -} - func (repo *IAMRepository) GetDefaultLoginPolicy(ctx context.Context) (*iam_model.LoginPolicyView, error) { policy, viewErr := repo.View.LoginPolicyByAggregateID(repo.SystemDefaults.IamID) if viewErr != nil && !caos_errs.IsNotFound(viewErr) { @@ -187,7 +160,7 @@ func (repo *IAMRepository) GetDefaultLoginPolicy(ctx context.Context) (*iam_mode func (repo *IAMRepository) SearchDefaultIDPProviders(ctx context.Context, request *iam_model.IDPProviderSearchRequest) (*iam_model.IDPProviderSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) request.AppendAggregateIDQuery(repo.SystemDefaults.IamID) - sequence, err := repo.View.GetLatestIDPProviderSequence("") + sequence, err := repo.View.GetLatestIDPProviderSequence() logging.Log("EVENT-Tuiks").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Warn("could not read latest iam sequence") providers, count, err := repo.View.SearchIDPProviders(request) if err != nil { @@ -352,3 +325,97 @@ func (repo *IAMRepository) GetOrgIAMPolicy(ctx context.Context) (*iam_model.OrgI } return iam_es_model.OrgIAMViewToModel(policy), nil } + +func (repo *IAMRepository) AddDefaultOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddOrgIAMPolicy(ctx, policy) +} + +func (repo *IAMRepository) ChangeDefaultOrgIAMPolicy(ctx context.Context, policy *iam_model.OrgIAMPolicy) (*iam_model.OrgIAMPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangeOrgIAMPolicy(ctx, policy) +} + +func (repo *IAMRepository) GetDefaultLabelPolicy(ctx context.Context) (*iam_model.LabelPolicyView, error) { + policy, err := repo.View.LabelPolicyByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.LabelPolicyViewToModel(policy), err +} + +func (repo *IAMRepository) AddDefaultLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddLabelPolicy(ctx, policy) +} + +func (repo *IAMRepository) ChangeDefaultLabelPolicy(ctx context.Context, policy *iam_model.LabelPolicy) (*iam_model.LabelPolicy, error) { + policy.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangeLabelPolicy(ctx, policy) +} + +func (repo *IAMRepository) GetDefaultMailTemplate(ctx context.Context) (*iam_model.MailTemplateView, error) { + template, err := repo.View.MailTemplateByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.MailTemplateViewToModel(template), err +} + +func (repo *IAMRepository) AddDefaultMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) { + template.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddMailTemplate(ctx, template) +} + +func (repo *IAMRepository) ChangeDefaultMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) { + template.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangeMailTemplate(ctx, template) +} + +func (repo *IAMRepository) SearchIAMMembersx(ctx context.Context, request *iam_model.IAMMemberSearchRequest) (*iam_model.IAMMemberSearchResponse, error) { + request.EnsureLimit(repo.SearchLimit) + sequence, err := repo.View.GetLatestIAMMemberSequence() + logging.Log("EVENT-Slkci").OnError(err).Warn("could not read latest iam sequence") + members, count, err := repo.View.SearchIAMMembers(request) + if err != nil { + return nil, err + } + result := &iam_model.IAMMemberSearchResponse{ + Offset: request.Offset, + Limit: request.Limit, + TotalResult: count, + Result: iam_es_model.IAMMembersToModel(members), + } + if err == nil { + result.Sequence = sequence.CurrentSequence + result.Timestamp = result.Timestamp + } + return result, nil +} + +func (repo *IAMRepository) GetDefaultMailTexts(ctx context.Context) (*iam_model.MailTextsView, error) { + text, err := repo.View.MailTexts(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.MailTextsViewToModel(text, true), err +} + +func (repo *IAMRepository) GetDefaultMailText(ctx context.Context, textType string, language string) (*iam_model.MailTextView, error) { + text, err := repo.View.MailTextByIDs(repo.SystemDefaults.IamID, textType, language) + if err != nil { + return nil, err + } + text.Default = true + return iam_es_model.MailTextViewToModel(text), err +} + +func (repo *IAMRepository) AddDefaultMailText(ctx context.Context, text *iam_model.MailText) (*iam_model.MailText, error) { + text.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.AddMailText(ctx, text) +} + +func (repo *IAMRepository) ChangeDefaultMailText(ctx context.Context, text *iam_model.MailText) (*iam_model.MailText, error) { + text.AggregateID = repo.SystemDefaults.IamID + return repo.IAMEventstore.ChangeMailText(ctx, text) +} diff --git a/internal/admin/repository/eventsourcing/eventstore/org.go b/internal/admin/repository/eventsourcing/eventstore/org.go index 59718f45be..78400eae29 100644 --- a/internal/admin/repository/eventsourcing/eventstore/org.go +++ b/internal/admin/repository/eventsourcing/eventstore/org.go @@ -87,7 +87,7 @@ func (repo *OrgRepo) OrgByID(ctx context.Context, id string) (*org_model.Org, er func (repo *OrgRepo) SearchOrgs(ctx context.Context, query *org_model.OrgSearchRequest) (*org_model.OrgSearchResult, error) { query.EnsureLimit(repo.SearchLimit) - sequence, err := repo.View.GetLatestOrgSequence("") + sequence, err := repo.View.GetLatestOrgSequence() logging.Log("EVENT-LXo9w").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Warn("could not read latest iam sequence") orgs, count, err := repo.View.SearchOrgs(query) if err != nil { diff --git a/internal/admin/repository/eventsourcing/handler/handler.go b/internal/admin/repository/eventsourcing/handler/handler.go index ed0e60f6ed..041c1a7720 100644 --- a/internal/admin/repository/eventsourcing/handler/handler.go +++ b/internal/admin/repository/eventsourcing/handler/handler.go @@ -74,6 +74,10 @@ func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, es defaults, repos.IamEvents, repos.OrgEvents), + newMailTemplate( + handler{view, bulkLimit, configs.cycleDuration("MailTemplate"), errorCount, es}), + newMailText( + handler{view, bulkLimit, configs.cycleDuration("MailText"), errorCount, es}), } } diff --git a/internal/admin/repository/eventsourcing/handler/iam_member.go b/internal/admin/repository/eventsourcing/handler/iam_member.go index 79aafcf055..438fd0263b 100644 --- a/internal/admin/repository/eventsourcing/handler/iam_member.go +++ b/internal/admin/repository/eventsourcing/handler/iam_member.go @@ -45,8 +45,8 @@ func (m *IAMMember) subscribe() { }() } -func (m *IAMMember) CurrentSequence(event *es_models.Event) (uint64, error) { - sequence, err := m.view.GetLatestIAMMemberSequence(string(event.AggregateType)) +func (m *IAMMember) CurrentSequence() (uint64, error) { + sequence, err := m.view.GetLatestIAMMemberSequence() if err != nil { return 0, err } @@ -62,7 +62,7 @@ func (m *IAMMember) AggregateTypes() []es_models.AggregateType { } func (m *IAMMember) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := m.view.GetLatestIAMMemberSequence("") + sequence, err := m.view.GetLatestIAMMemberSequence() if err != nil { return nil, err } diff --git a/internal/admin/repository/eventsourcing/handler/idp_config.go b/internal/admin/repository/eventsourcing/handler/idp_config.go index bf0dc97104..7368b5f4ce 100644 --- a/internal/admin/repository/eventsourcing/handler/idp_config.go +++ b/internal/admin/repository/eventsourcing/handler/idp_config.go @@ -47,8 +47,8 @@ func (i *IDPConfig) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.IAMAggregate} } -func (i *IDPConfig) CurrentSequence(event *es_models.Event) (uint64, error) { - sequence, err := i.view.GetLatestIDPConfigSequence(string(event.AggregateType)) +func (i *IDPConfig) CurrentSequence() (uint64, error) { + sequence, err := i.view.GetLatestIDPConfigSequence() if err != nil { return 0, err } @@ -56,7 +56,7 @@ func (i *IDPConfig) CurrentSequence(event *es_models.Event) (uint64, error) { } func (i *IDPConfig) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := i.view.GetLatestIDPConfigSequence("") + sequence, err := i.view.GetLatestIDPConfigSequence() if err != nil { return nil, err } diff --git a/internal/admin/repository/eventsourcing/handler/idp_providers.go b/internal/admin/repository/eventsourcing/handler/idp_providers.go index 06c44c4c0a..59956f6f76 100644 --- a/internal/admin/repository/eventsourcing/handler/idp_providers.go +++ b/internal/admin/repository/eventsourcing/handler/idp_providers.go @@ -64,8 +64,8 @@ func (i *IDPProvider) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.IAMAggregate, org_es_model.OrgAggregate} } -func (i *IDPProvider) CurrentSequence(event *es_models.Event) (uint64, error) { - sequence, err := i.view.GetLatestIDPProviderSequence(string(event.AggregateType)) +func (i *IDPProvider) CurrentSequence() (uint64, error) { + sequence, err := i.view.GetLatestIDPProviderSequence() if err != nil { return 0, err } @@ -73,7 +73,7 @@ func (i *IDPProvider) CurrentSequence(event *es_models.Event) (uint64, error) { } func (i *IDPProvider) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := i.view.GetLatestIDPProviderSequence("") + sequence, err := i.view.GetLatestIDPProviderSequence() if err != nil { return nil, err } diff --git a/internal/admin/repository/eventsourcing/handler/label_policy.go b/internal/admin/repository/eventsourcing/handler/label_policy.go index c1604fba69..50bf98a2d2 100644 --- a/internal/admin/repository/eventsourcing/handler/label_policy.go +++ b/internal/admin/repository/eventsourcing/handler/label_policy.go @@ -47,7 +47,7 @@ func (p *LabelPolicy) AggregateTypes() []es_models.AggregateType { } func (p *LabelPolicy) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := p.view.GetLatestLabelPolicySequence("") + sequence, err := p.view.GetLatestLabelPolicySequence() if err != nil { return nil, err } @@ -56,8 +56,8 @@ func (p *LabelPolicy) EventQuery() (*es_models.SearchQuery, error) { LatestSequenceFilter(sequence.CurrentSequence), nil } -func (p *LabelPolicy) CurrentSequence(event *es_models.Event) (uint64, error) { - sequence, err := p.view.GetLatestLabelPolicySequence(string(event.AggregateType)) +func (p *LabelPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestLabelPolicySequence() if err != nil { return 0, err } diff --git a/internal/admin/repository/eventsourcing/handler/login_policy.go b/internal/admin/repository/eventsourcing/handler/login_policy.go index 032f2a4349..aaf1f5b197 100644 --- a/internal/admin/repository/eventsourcing/handler/login_policy.go +++ b/internal/admin/repository/eventsourcing/handler/login_policy.go @@ -48,7 +48,7 @@ func (p *LoginPolicy) AggregateTypes() []models.AggregateType { } func (p *LoginPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestLoginPolicySequence("") + sequence, err := p.view.GetLatestLoginPolicySequence() if err != nil { return nil, err } @@ -57,8 +57,8 @@ func (p *LoginPolicy) EventQuery() (*models.SearchQuery, error) { LatestSequenceFilter(sequence.CurrentSequence), nil } -func (p *LoginPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestLoginPolicySequence(string(event.AggregateType)) +func (p *LoginPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestLoginPolicySequence() if err != nil { return 0, err } diff --git a/internal/admin/repository/eventsourcing/handler/mail_template.go b/internal/admin/repository/eventsourcing/handler/mail_template.go new file mode 100644 index 0000000000..c140ba1022 --- /dev/null +++ b/internal/admin/repository/eventsourcing/handler/mail_template.go @@ -0,0 +1,105 @@ +package handler + +import ( + "github.com/caos/logging" + + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/query" + "github.com/caos/zitadel/internal/eventstore/spooler" + "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" +) + +type MailTemplate struct { + handler + subscription *eventstore.Subscription +} + +func newMailTemplate(handler handler) *MailTemplate { + h := &MailTemplate{ + handler: handler, + } + + h.subscribe() + + return h +} + +func (m *MailTemplate) subscribe() { + m.subscription = m.es.Subscribe(m.AggregateTypes()...) + go func() { + for event := range m.subscription.Events { + query.ReduceEvent(m, event) + } + }() +} + +const ( + mailTemplateTable = "adminapi.mail_templates" +) + +func (m *MailTemplate) ViewModel() string { + return mailTemplateTable +} + +func (_ *MailTemplate) AggregateTypes() []es_models.AggregateType { + return []es_models.AggregateType{iam_es_model.IAMAggregate} +} + +func (p *MailTemplate) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestMailTemplateSequence() + if err != nil { + return 0, err + } + return sequence.CurrentSequence, nil +} + +func (m *MailTemplate) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestMailTemplateSequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(m.AggregateTypes()...). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *MailTemplate) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.IAMAggregate: + err = m.processMailTemplate(event) + } + return err +} + +func (m *MailTemplate) processMailTemplate(event *models.Event) (err error) { + template := new(iam_model.MailTemplateView) + switch event.Type { + case model.MailTemplateAdded: + err = template.AppendEvent(event) + case model.MailTemplateChanged: + template, err = m.view.MailTemplateByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = template.AppendEvent(event) + default: + return m.view.ProcessedMailTemplateSequence(event) + } + if err != nil { + return err + } + return m.view.PutMailTemplate(template, event) +} + +func (m *MailTemplate) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-Wj8sf", "id", event.AggregateID).WithError(err).Warn("something went wrong in label template handler") + return spooler.HandleError(event, err, m.view.GetLatestMailTemplateFailedEvent, m.view.ProcessedMailTemplateFailedEvent, m.view.ProcessedMailTemplateSequence, m.errorCountUntilSkip) +} + +func (o *MailTemplate) OnSuccess() error { + return spooler.HandleSuccess(o.view.UpdateMailTemplateSpoolerRunTimestamp) +} diff --git a/internal/admin/repository/eventsourcing/handler/mail_text.go b/internal/admin/repository/eventsourcing/handler/mail_text.go new file mode 100644 index 0000000000..6462bd54db --- /dev/null +++ b/internal/admin/repository/eventsourcing/handler/mail_text.go @@ -0,0 +1,109 @@ +package handler + +import ( + "github.com/caos/logging" + + "github.com/caos/zitadel/internal/eventstore" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/query" + "github.com/caos/zitadel/internal/eventstore/spooler" + "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" +) + +type MailText struct { + handler + subscription *eventstore.Subscription +} + +func newMailText(handler handler) *MailText { + h := &MailText{ + handler: handler, + } + + h.subscribe() + + return h +} + +func (m *MailText) subscribe() { + m.subscription = m.es.Subscribe(m.AggregateTypes()...) + go func() { + for event := range m.subscription.Events { + query.ReduceEvent(m, event) + } + }() +} + +const ( + mailTextTable = "adminapi.mail_texts" +) + +func (m *MailText) ViewModel() string { + return mailTextTable +} + +func (_ *MailText) AggregateTypes() []es_models.AggregateType { + return []es_models.AggregateType{iam_es_model.IAMAggregate} +} + +func (p *MailText) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestMailTextSequence() + if err != nil { + return 0, err + } + return sequence.CurrentSequence, nil +} + +func (m *MailText) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestMailTextSequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(m.AggregateTypes()...). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *MailText) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.IAMAggregate: + err = m.processMailText(event) + } + return err +} + +func (m *MailText) processMailText(event *models.Event) (err error) { + mailText := new(iam_model.MailTextView) + switch event.Type { + case model.MailTextAdded: + err = mailText.AppendEvent(event) + case model.MailTextChanged: + err = mailText.SetData(event) + if err != nil { + return err + } + mailText, err = m.view.MailTextByIDs(event.AggregateID, mailText.MailTextType, mailText.Language) + if err != nil { + return err + } + err = mailText.AppendEvent(event) + default: + return m.view.ProcessedMailTextSequence(event) + } + if err != nil { + return err + } + return m.view.PutMailText(mailText, event) +} + +func (m *MailText) OnError(event *models.Event, err error) error { + logging.LogWithFields("HANDL-5jk84", "id", event.AggregateID).WithError(err).Warn("something went wrong in label mailText handler") + return spooler.HandleError(event, err, m.view.GetLatestMailTextFailedEvent, m.view.ProcessedMailTextFailedEvent, m.view.ProcessedMailTextSequence, m.errorCountUntilSkip) +} + +func (o *MailText) OnSuccess() error { + return spooler.HandleSuccess(o.view.UpdateMailTextSpoolerRunTimestamp) +} diff --git a/internal/admin/repository/eventsourcing/handler/org.go b/internal/admin/repository/eventsourcing/handler/org.go index 02ace32943..128eab554a 100644 --- a/internal/admin/repository/eventsourcing/handler/org.go +++ b/internal/admin/repository/eventsourcing/handler/org.go @@ -49,15 +49,15 @@ func (o *Org) AggregateTypes() []es_models.AggregateType { } func (o *Org) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := o.view.GetLatestOrgSequence("") + sequence, err := o.view.GetLatestOrgSequence() if err != nil { return nil, err } return eventsourcing.OrgQuery(sequence.CurrentSequence), nil } -func (o *Org) CurrentSequence(event *es_models.Event) (uint64, error) { - sequence, err := o.view.GetLatestOrgSequence(string(event.AggregateType)) +func (o *Org) CurrentSequence() (uint64, error) { + sequence, err := o.view.GetLatestOrgSequence() if err != nil { return 0, err } diff --git a/internal/admin/repository/eventsourcing/handler/org_iam_policy.go b/internal/admin/repository/eventsourcing/handler/org_iam_policy.go index a98db79c09..660a0a25a3 100644 --- a/internal/admin/repository/eventsourcing/handler/org_iam_policy.go +++ b/internal/admin/repository/eventsourcing/handler/org_iam_policy.go @@ -48,7 +48,7 @@ func (p *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType { } func (p *OrgIAMPolicy) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := p.view.GetLatestOrgIAMPolicySequence("") + sequence, err := p.view.GetLatestOrgIAMPolicySequence() if err != nil { return nil, err } @@ -57,8 +57,8 @@ func (p *OrgIAMPolicy) EventQuery() (*es_models.SearchQuery, error) { LatestSequenceFilter(sequence.CurrentSequence), nil } -func (p *OrgIAMPolicy) CurrentSequence(event *es_models.Event) (uint64, error) { - sequence, err := p.view.GetLatestOrgIAMPolicySequence(string(event.AggregateType)) +func (p *OrgIAMPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestOrgIAMPolicySequence() if err != nil { return 0, err } diff --git a/internal/admin/repository/eventsourcing/handler/password_age_policy.go b/internal/admin/repository/eventsourcing/handler/password_age_policy.go index 7cfa1b2bb2..692d5a578c 100644 --- a/internal/admin/repository/eventsourcing/handler/password_age_policy.go +++ b/internal/admin/repository/eventsourcing/handler/password_age_policy.go @@ -49,8 +49,8 @@ func (p *PasswordAgePolicy) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *PasswordAgePolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestPasswordAgePolicySequence(string(event.AggregateType)) +func (p *PasswordAgePolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestPasswordAgePolicySequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (p *PasswordAgePolicy) CurrentSequence(event *models.Event) (uint64, error) } func (p *PasswordAgePolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestPasswordAgePolicySequence("") + sequence, err := p.view.GetLatestPasswordAgePolicySequence() if err != nil { return nil, err } diff --git a/internal/admin/repository/eventsourcing/handler/password_complexity_policy.go b/internal/admin/repository/eventsourcing/handler/password_complexity_policy.go index edab685d23..2408af543f 100644 --- a/internal/admin/repository/eventsourcing/handler/password_complexity_policy.go +++ b/internal/admin/repository/eventsourcing/handler/password_complexity_policy.go @@ -49,8 +49,8 @@ func (p *PasswordComplexityPolicy) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *PasswordComplexityPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestPasswordComplexityPolicySequence(string(event.AggregateType)) +func (p *PasswordComplexityPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestPasswordComplexityPolicySequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (p *PasswordComplexityPolicy) CurrentSequence(event *models.Event) (uint64, } func (p *PasswordComplexityPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestPasswordComplexityPolicySequence("") + sequence, err := p.view.GetLatestPasswordComplexityPolicySequence() if err != nil { return nil, err } diff --git a/internal/admin/repository/eventsourcing/handler/password_lockout_policy.go b/internal/admin/repository/eventsourcing/handler/password_lockout_policy.go index 99a8393cb8..979dba7b89 100644 --- a/internal/admin/repository/eventsourcing/handler/password_lockout_policy.go +++ b/internal/admin/repository/eventsourcing/handler/password_lockout_policy.go @@ -49,8 +49,8 @@ func (p *PasswordLockoutPolicy) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *PasswordLockoutPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestPasswordLockoutPolicySequence(string(event.AggregateType)) +func (p *PasswordLockoutPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestPasswordLockoutPolicySequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (p *PasswordLockoutPolicy) CurrentSequence(event *models.Event) (uint64, er } func (p *PasswordLockoutPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestPasswordLockoutPolicySequence("") + sequence, err := p.view.GetLatestPasswordLockoutPolicySequence() if err != nil { return nil, err } diff --git a/internal/admin/repository/eventsourcing/handler/user.go b/internal/admin/repository/eventsourcing/handler/user.go index eb3a4bd83f..0c568128b3 100644 --- a/internal/admin/repository/eventsourcing/handler/user.go +++ b/internal/admin/repository/eventsourcing/handler/user.go @@ -68,8 +68,8 @@ func (u *User) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate} } -func (u *User) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := u.view.GetLatestUserSequence(string(event.AggregateType)) +func (u *User) CurrentSequence() (uint64, error) { + sequence, err := u.view.GetLatestUserSequence() if err != nil { return 0, err } @@ -77,7 +77,7 @@ func (u *User) CurrentSequence(event *models.Event) (uint64, error) { } func (u *User) EventQuery() (*models.SearchQuery, error) { - sequence, err := u.view.GetLatestUserSequence("") + sequence, err := u.view.GetLatestUserSequence() if err != nil { return nil, err } diff --git a/internal/admin/repository/eventsourcing/handler/user_external_idps.go b/internal/admin/repository/eventsourcing/handler/user_external_idps.go index f7719e601b..1368fa1bc8 100644 --- a/internal/admin/repository/eventsourcing/handler/user_external_idps.go +++ b/internal/admin/repository/eventsourcing/handler/user_external_idps.go @@ -69,8 +69,8 @@ func (i *ExternalIDP) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate} } -func (i *ExternalIDP) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := i.view.GetLatestExternalIDPSequence(string(event.AggregateType)) +func (i *ExternalIDP) CurrentSequence() (uint64, error) { + sequence, err := i.view.GetLatestExternalIDPSequence() if err != nil { return 0, err } @@ -78,7 +78,7 @@ func (i *ExternalIDP) CurrentSequence(event *models.Event) (uint64, error) { } func (i *ExternalIDP) EventQuery() (*models.SearchQuery, error) { - sequence, err := i.view.GetLatestExternalIDPSequence("") + sequence, err := i.view.GetLatestExternalIDPSequence() if err != nil { return nil, err } diff --git a/internal/admin/repository/eventsourcing/view/external_idps.go b/internal/admin/repository/eventsourcing/view/external_idps.go index 384c1d81d0..6b9a239b23 100644 --- a/internal/admin/repository/eventsourcing/view/external_idps.go +++ b/internal/admin/repository/eventsourcing/view/external_idps.go @@ -65,8 +65,8 @@ func (v *View) DeleteExternalIDPsByUserID(userID string, event *models.Event) er return v.ProcessedExternalIDPSequence(event) } -func (v *View) GetLatestExternalIDPSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(externalIDPTable, aggregateType) +func (v *View) GetLatestExternalIDPSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(externalIDPTable) } func (v *View) ProcessedExternalIDPSequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/iam_member.go b/internal/admin/repository/eventsourcing/view/iam_member.go index d215ca0b5b..21cc782b6d 100644 --- a/internal/admin/repository/eventsourcing/view/iam_member.go +++ b/internal/admin/repository/eventsourcing/view/iam_member.go @@ -57,8 +57,8 @@ func (v *View) DeleteIAMMembersByUserID(userID string, event *models.Event) erro return v.ProcessedIAMMemberSequence(event) } -func (v *View) GetLatestIAMMemberSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(iamMemberTable, aggregateType) +func (v *View) GetLatestIAMMemberSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(iamMemberTable) } func (v *View) ProcessedIAMMemberSequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/idp_configs.go b/internal/admin/repository/eventsourcing/view/idp_configs.go index 5a120de265..deb4e688cc 100644 --- a/internal/admin/repository/eventsourcing/view/idp_configs.go +++ b/internal/admin/repository/eventsourcing/view/idp_configs.go @@ -37,8 +37,8 @@ func (v *View) DeleteIDPConfig(idpID string, event *models.Event) error { return v.ProcessedIDPConfigSequence(event) } -func (v *View) GetLatestIDPConfigSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(idpConfigTable, aggregateType) +func (v *View) GetLatestIDPConfigSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(idpConfigTable) } func (v *View) ProcessedIDPConfigSequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/idp_providers.go b/internal/admin/repository/eventsourcing/view/idp_providers.go index 26a682379d..7d0ef141fb 100644 --- a/internal/admin/repository/eventsourcing/view/idp_providers.go +++ b/internal/admin/repository/eventsourcing/view/idp_providers.go @@ -49,8 +49,8 @@ func (v *View) DeleteIDPProvider(aggregateID, idpConfigID string, event *models. return v.ProcessedIDPProviderSequence(event) } -func (v *View) GetLatestIDPProviderSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(idpProviderTable, aggregateType) +func (v *View) GetLatestIDPProviderSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(idpProviderTable) } func (v *View) ProcessedIDPProviderSequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/label_policies.go b/internal/admin/repository/eventsourcing/view/label_policies.go index 9b1a46cee1..761fc2c62f 100644 --- a/internal/admin/repository/eventsourcing/view/label_policies.go +++ b/internal/admin/repository/eventsourcing/view/label_policies.go @@ -23,8 +23,8 @@ func (v *View) PutLabelPolicy(policy *model.LabelPolicyView, event *models.Event return v.ProcessedLabelPolicySequence(event) } -func (v *View) GetLatestLabelPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(labelPolicyTable, aggregateType) +func (v *View) GetLatestLabelPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(labelPolicyTable) } func (v *View) ProcessedLabelPolicySequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/login_policies.go b/internal/admin/repository/eventsourcing/view/login_policies.go index 7e71983724..8785e8df24 100644 --- a/internal/admin/repository/eventsourcing/view/login_policies.go +++ b/internal/admin/repository/eventsourcing/view/login_policies.go @@ -32,8 +32,8 @@ func (v *View) DeleteLoginPolicy(aggregateID string, event *models.Event) error return v.ProcessedLoginPolicySequence(event) } -func (v *View) GetLatestLoginPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(loginPolicyTable, aggregateType) +func (v *View) GetLatestLoginPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(loginPolicyTable) } func (v *View) ProcessedLoginPolicySequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/mail_templates.go b/internal/admin/repository/eventsourcing/view/mail_templates.go new file mode 100644 index 0000000000..a6ec850ab8 --- /dev/null +++ b/internal/admin/repository/eventsourcing/view/mail_templates.go @@ -0,0 +1,44 @@ +package view + +import ( + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + mailTemplateTable = "adminapi.mail_templates" +) + +func (v *View) MailTemplateByAggregateID(aggregateID string) (*model.MailTemplateView, error) { + return view.GetMailTemplateByAggregateID(v.Db, mailTemplateTable, aggregateID) +} + +func (v *View) PutMailTemplate(template *model.MailTemplateView, event *models.Event) error { + err := view.PutMailTemplate(v.Db, mailTemplateTable, template) + if err != nil { + return err + } + return v.ProcessedMailTemplateSequence(event) +} + +func (v *View) GetLatestMailTemplateSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(mailTemplateTable) +} + +func (v *View) ProcessedMailTemplateSequence(event *models.Event) error { + return v.saveCurrentSequence(mailTemplateTable, event) +} + +func (v *View) UpdateMailTemplateSpoolerRunTimestamp() error { + return v.updateSpoolerRunSequence(mailTemplateTable) +} + +func (v *View) GetLatestMailTemplateFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(mailTemplateTable, sequence) +} + +func (v *View) ProcessedMailTemplateFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/admin/repository/eventsourcing/view/mail_texts.go b/internal/admin/repository/eventsourcing/view/mail_texts.go new file mode 100644 index 0000000000..89d67fea6d --- /dev/null +++ b/internal/admin/repository/eventsourcing/view/mail_texts.go @@ -0,0 +1,48 @@ +package view + +import ( + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + mailTextTable = "adminapi.mail_texts" +) + +func (v *View) MailTexts(aggregateID string) ([]*model.MailTextView, error) { + return view.GetMailTexts(v.Db, mailTextTable, aggregateID) +} + +func (v *View) MailTextByIDs(aggregateID string, textType string, language string) (*model.MailTextView, error) { + return view.GetMailTextByIDs(v.Db, mailTextTable, aggregateID, textType, language) +} + +func (v *View) PutMailText(template *model.MailTextView, event *models.Event) error { + err := view.PutMailText(v.Db, mailTextTable, template) + if err != nil { + return err + } + return v.ProcessedMailTextSequence(event) +} + +func (v *View) GetLatestMailTextSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(mailTextTable) +} + +func (v *View) ProcessedMailTextSequence(event *models.Event) error { + return v.saveCurrentSequence(mailTextTable, event) +} + +func (v *View) UpdateMailTextSpoolerRunTimestamp() error { + return v.updateSpoolerRunSequence(mailTextTable) +} + +func (v *View) GetLatestMailTextFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(mailTextTable, sequence) +} + +func (v *View) ProcessedMailTextFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/admin/repository/eventsourcing/view/org.go b/internal/admin/repository/eventsourcing/view/org.go index b5d104a7ed..a5d2d45ab2 100644 --- a/internal/admin/repository/eventsourcing/view/org.go +++ b/internal/admin/repository/eventsourcing/view/org.go @@ -40,8 +40,8 @@ func (v *View) UpdateOrgSpoolerRunTimestamp() error { return v.updateSpoolerRunSequence(orgTable) } -func (v *View) GetLatestOrgSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(orgTable, aggregateType) +func (v *View) GetLatestOrgSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(orgTable) } func (v *View) ProcessedOrgSequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/org_iam_policy.go b/internal/admin/repository/eventsourcing/view/org_iam_policy.go index 5d13779e48..5e77383407 100644 --- a/internal/admin/repository/eventsourcing/view/org_iam_policy.go +++ b/internal/admin/repository/eventsourcing/view/org_iam_policy.go @@ -32,8 +32,8 @@ func (v *View) DeleteOrgIAMPolicy(aggregateID string, event *models.Event) error return v.ProcessedOrgIAMPolicySequence(event) } -func (v *View) GetLatestOrgIAMPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(orgIAMPolicyTable, aggregateType) +func (v *View) GetLatestOrgIAMPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(orgIAMPolicyTable) } func (v *View) ProcessedOrgIAMPolicySequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/password_age_policy.go b/internal/admin/repository/eventsourcing/view/password_age_policy.go index b1cbe535c4..02fe19db3c 100644 --- a/internal/admin/repository/eventsourcing/view/password_age_policy.go +++ b/internal/admin/repository/eventsourcing/view/password_age_policy.go @@ -32,8 +32,8 @@ func (v *View) DeletePasswordAgePolicy(aggregateID string, event *models.Event) return v.ProcessedPasswordAgePolicySequence(event) } -func (v *View) GetLatestPasswordAgePolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(passwordAgePolicyTable, aggregateType) +func (v *View) GetLatestPasswordAgePolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordAgePolicyTable) } func (v *View) ProcessedPasswordAgePolicySequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/password_complexity_policy.go b/internal/admin/repository/eventsourcing/view/password_complexity_policy.go index 44315b9666..9d7e315e04 100644 --- a/internal/admin/repository/eventsourcing/view/password_complexity_policy.go +++ b/internal/admin/repository/eventsourcing/view/password_complexity_policy.go @@ -32,8 +32,8 @@ func (v *View) DeletePasswordComplexityPolicy(aggregateID string, event *models. return v.ProcessedPasswordComplexityPolicySequence(event) } -func (v *View) GetLatestPasswordComplexityPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(passwordComplexityPolicyTable, aggregateType) +func (v *View) GetLatestPasswordComplexityPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordComplexityPolicyTable) } func (v *View) ProcessedPasswordComplexityPolicySequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/password_lockout_policy.go b/internal/admin/repository/eventsourcing/view/password_lockout_policy.go index 805aab3fc3..6076320aea 100644 --- a/internal/admin/repository/eventsourcing/view/password_lockout_policy.go +++ b/internal/admin/repository/eventsourcing/view/password_lockout_policy.go @@ -32,8 +32,8 @@ func (v *View) DeletePasswordLockoutPolicy(aggregateID string, event *models.Eve return v.ProcessedPasswordLockoutPolicySequence(event) } -func (v *View) GetLatestPasswordLockoutPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(passwordLockoutPolicyTable, aggregateType) +func (v *View) GetLatestPasswordLockoutPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordLockoutPolicyTable) } func (v *View) ProcessedPasswordLockoutPolicySequence(event *models.Event) error { diff --git a/internal/admin/repository/eventsourcing/view/sequence.go b/internal/admin/repository/eventsourcing/view/sequence.go index 5915da9b56..358e2daf61 100644 --- a/internal/admin/repository/eventsourcing/view/sequence.go +++ b/internal/admin/repository/eventsourcing/view/sequence.go @@ -12,11 +12,11 @@ const ( ) func (v *View) saveCurrentSequence(viewName string, event *models.Event) error { - return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, string(event.AggregateType), event.Sequence, event.CreationDate) + return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, event.Sequence, event.CreationDate) } -func (v *View) latestSequence(viewName, aggregateType string) (*repository.CurrentSequence, error) { - return repository.LatestSequence(v.Db, sequencesTable, viewName, aggregateType) +func (v *View) latestSequence(viewName string) (*repository.CurrentSequence, error) { + return repository.LatestSequence(v.Db, sequencesTable, viewName) } func (v *View) AllCurrentSequences(db string) ([]*repository.CurrentSequence, error) { @@ -24,7 +24,7 @@ func (v *View) AllCurrentSequences(db string) ([]*repository.CurrentSequence, er } func (v *View) updateSpoolerRunSequence(viewName string) error { - currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName, "") + currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName) if err != nil { return err } @@ -38,10 +38,10 @@ func (v *View) updateSpoolerRunSequence(viewName string) error { return repository.UpdateCurrentSequence(v.Db, sequencesTable, currentSequence) } -func (v *View) GetCurrentSequence(db, viewName, aggregateType string) (*repository.CurrentSequence, error) { +func (v *View) GetCurrentSequence(db, viewName string) (*repository.CurrentSequence, error) { sequenceTable := db + ".current_sequences" fullView := db + "." + viewName - return repository.LatestSequence(v.Db, sequenceTable, fullView, aggregateType) + return repository.LatestSequence(v.Db, sequenceTable, fullView) } func (v *View) ClearView(db, viewName string) error { diff --git a/internal/admin/repository/eventsourcing/view/user.go b/internal/admin/repository/eventsourcing/view/user.go index 9694b41f78..3a5c8d064c 100644 --- a/internal/admin/repository/eventsourcing/view/user.go +++ b/internal/admin/repository/eventsourcing/view/user.go @@ -65,8 +65,8 @@ func (v *View) DeleteUser(userID string, event *models.Event) error { return v.ProcessedUserSequence(event) } -func (v *View) GetLatestUserSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userTable, aggregateType) +func (v *View) GetLatestUserSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userTable) } func (v *View) ProcessedUserSequence(event *models.Event) error { diff --git a/internal/admin/repository/iam.go b/internal/admin/repository/iam.go index 4c045ab935..b2ca0c6fa6 100644 --- a/internal/admin/repository/iam.go +++ b/internal/admin/repository/iam.go @@ -20,6 +20,15 @@ type IAMRepository interface { GetDefaultLabelPolicy(ctx context.Context) (*iam_model.LabelPolicyView, error) + GetDefaultMailTemplate(ctx context.Context) (*iam_model.MailTemplateView, error) + AddDefaultMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) + ChangeDefaultMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) + + GetDefaultMailTexts(ctx context.Context) (*iam_model.MailTextsView, error) + GetDefaultMailText(ctx context.Context, textType string, language string) (*iam_model.MailTextView, error) + AddDefaultMailText(ctx context.Context, mailText *iam_model.MailText) (*iam_model.MailText, error) + ChangeDefaultMailText(ctx context.Context, policy *iam_model.MailText) (*iam_model.MailText, error) + GetDefaultPasswordComplexityPolicy(ctx context.Context) (*iam_model.PasswordComplexityPolicyView, error) GetDefaultPasswordAgePolicy(ctx context.Context) (*iam_model.PasswordAgePolicyView, error) diff --git a/internal/api/grpc/admin/template.go b/internal/api/grpc/admin/template.go new file mode 100644 index 0000000000..8e4d4b25d4 --- /dev/null +++ b/internal/api/grpc/admin/template.go @@ -0,0 +1,24 @@ +package admin + +import ( + "context" + + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetDefaultMailTemplate(ctx context.Context, _ *empty.Empty) (*admin.DefaultMailTemplateView, error) { + result, err := s.iam.GetDefaultMailTemplate(ctx) + if err != nil { + return nil, err + } + return templateViewFromModel(result), nil +} + +func (s *Server) UpdateDefaultMailTemplate(ctx context.Context, policy *admin.DefaultMailTemplateUpdate) (*admin.DefaultMailTemplate, error) { + result, err := s.iam.ChangeDefaultMailTemplate(ctx, templateToModel(policy)) + if err != nil { + return nil, err + } + return templateFromModel(result), nil +} diff --git a/internal/api/grpc/admin/template_converter.go b/internal/api/grpc/admin/template_converter.go new file mode 100644 index 0000000000..c4c8b65967 --- /dev/null +++ b/internal/api/grpc/admin/template_converter.go @@ -0,0 +1,42 @@ +package admin + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes" +) + +func templateToModel(policy *admin.DefaultMailTemplateUpdate) *iam_model.MailTemplate { + return &iam_model.MailTemplate{ + Template: policy.Template, + } +} + +func templateFromModel(policy *iam_model.MailTemplate) *admin.DefaultMailTemplate { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("ADMIN-CAA7T").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("ADMIN-H52Zx").OnError(err).Debug("date parse failed") + + return &admin.DefaultMailTemplate{ + Template: policy.Template, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func templateViewFromModel(policy *iam_model.MailTemplateView) *admin.DefaultMailTemplateView { + creationDate, err := ptypes.TimestampProto(policy.CreationDate) + logging.Log("ADMIN-yWFs5").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(policy.ChangeDate) + logging.Log("ADMIN-JRpIO").OnError(err).Debug("date parse failed") + + return &admin.DefaultMailTemplateView{ + Template: policy.Template, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} diff --git a/internal/api/grpc/admin/text.go b/internal/api/grpc/admin/text.go new file mode 100644 index 0000000000..5f053de0e9 --- /dev/null +++ b/internal/api/grpc/admin/text.go @@ -0,0 +1,32 @@ +package admin + +import ( + "context" + + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetDefaultMailTexts(ctx context.Context, _ *empty.Empty) (*admin.DefaultMailTextsView, error) { + result, err := s.iam.GetDefaultMailTexts(ctx) + if err != nil { + return nil, err + } + return textsViewFromModel(result), nil +} + +func (s *Server) GetDefaultMailText(ctx context.Context, textType string, language string) (*admin.DefaultMailTextView, error) { + result, err := s.iam.GetDefaultMailText(ctx, textType, language) + if err != nil { + return nil, err + } + return textViewFromModel(result), nil +} + +func (s *Server) UpdateDefaultMailText(ctx context.Context, text *admin.DefaultMailTextUpdate) (*admin.DefaultMailText, error) { + result, err := s.iam.ChangeDefaultMailText(ctx, textToModel(text)) + if err != nil { + return nil, err + } + return textFromModel(result), nil +} diff --git a/internal/api/grpc/admin/text_converter.go b/internal/api/grpc/admin/text_converter.go new file mode 100644 index 0000000000..20b4052b29 --- /dev/null +++ b/internal/api/grpc/admin/text_converter.go @@ -0,0 +1,78 @@ +package admin + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/admin" + "github.com/golang/protobuf/ptypes" +) + +func textToModel(text *admin.DefaultMailTextUpdate) *iam_model.MailText { + return &iam_model.MailText{ + MailTextType: text.MailTextType, + Language: text.Language, + Title: text.Title, + PreHeader: text.PreHeader, + Subject: text.Subject, + Greeting: text.Greeting, + Text: text.Text, + ButtonText: text.ButtonText, + } +} + +func textFromModel(text *iam_model.MailText) *admin.DefaultMailText { + creationDate, err := ptypes.TimestampProto(text.CreationDate) + logging.Log("ADMIN-Jlzsj").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(text.ChangeDate) + logging.Log("ADMIN-mw5b8").OnError(err).Debug("date parse failed") + + return &admin.DefaultMailText{ + MailTextType: text.MailTextType, + Language: text.Language, + Title: text.Title, + PreHeader: text.PreHeader, + Subject: text.Subject, + Greeting: text.Greeting, + Text: text.Text, + ButtonText: text.ButtonText, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func textsViewFromModel(textsin *iam_model.MailTextsView) *admin.DefaultMailTextsView { + return &admin.DefaultMailTextsView{ + Texts: textsViewToModel(textsin.Texts), + } +} + +func textsViewToModel(queries []*iam_model.MailTextView) []*admin.DefaultMailTextView { + modelQueries := make([]*admin.DefaultMailTextView, len(queries)) + for i, query := range queries { + modelQueries[i] = textViewFromModel(query) + } + + return modelQueries +} + +func textViewFromModel(text *iam_model.MailTextView) *admin.DefaultMailTextView { + creationDate, err := ptypes.TimestampProto(text.CreationDate) + logging.Log("ADMIN-7RyJc").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(text.ChangeDate) + logging.Log("ADMIN-fTFgY").OnError(err).Debug("date parse failed") + + return &admin.DefaultMailTextView{ + MailTextType: text.MailTextType, + Language: text.Language, + Title: text.Title, + PreHeader: text.PreHeader, + Subject: text.Subject, + Greeting: text.Greeting, + Text: text.Text, + ButtonText: text.ButtonText, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} diff --git a/internal/api/grpc/management/mail_template.go b/internal/api/grpc/management/mail_template.go new file mode 100644 index 0000000000..290b1534ab --- /dev/null +++ b/internal/api/grpc/management/mail_template.go @@ -0,0 +1,45 @@ +package management + +import ( + "context" + + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetMailTemplate(ctx context.Context, _ *empty.Empty) (*management.MailTemplateView, error) { + result, err := s.org.GetMailTemplate(ctx) + if err != nil { + return nil, err + } + return mailTemplateViewFromModel(result), nil +} + +func (s *Server) GetDefaultMailTemplate(ctx context.Context, _ *empty.Empty) (*management.MailTemplateView, error) { + result, err := s.org.GetDefaultMailTemplate(ctx) + if err != nil { + return nil, err + } + return mailTemplateViewFromModel(result), nil +} + +func (s *Server) CreateMailTemplate(ctx context.Context, template *management.MailTemplateUpdate) (*management.MailTemplate, error) { + result, err := s.org.AddMailTemplate(ctx, mailTemplateRequestToModel(template)) + if err != nil { + return nil, err + } + return mailTemplateFromModel(result), nil +} + +func (s *Server) UpdateMailTemplate(ctx context.Context, template *management.MailTemplateUpdate) (*management.MailTemplate, error) { + result, err := s.org.ChangeMailTemplate(ctx, mailTemplateRequestToModel(template)) + if err != nil { + return nil, err + } + return mailTemplateFromModel(result), nil +} + +func (s *Server) RemoveMailTemplate(ctx context.Context, _ *empty.Empty) (*empty.Empty, error) { + err := s.org.RemoveMailTemplate(ctx) + return &empty.Empty{}, err +} diff --git a/internal/api/grpc/management/mail_template_converter.go b/internal/api/grpc/management/mail_template_converter.go new file mode 100644 index 0000000000..a4e9dffa70 --- /dev/null +++ b/internal/api/grpc/management/mail_template_converter.go @@ -0,0 +1,42 @@ +package management + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes" +) + +func mailTemplateRequestToModel(mailTemplate *management.MailTemplateUpdate) *iam_model.MailTemplate { + return &iam_model.MailTemplate{ + Template: mailTemplate.Template, + } +} + +func mailTemplateFromModel(mailTemplate *iam_model.MailTemplate) *management.MailTemplate { + creationDate, err := ptypes.TimestampProto(mailTemplate.CreationDate) + logging.Log("MANAG-ULKZ6").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(mailTemplate.ChangeDate) + logging.Log("MANAG-451rI").OnError(err).Debug("date parse failed") + return &management.MailTemplate{ + Template: mailTemplate.Template, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func mailTemplateViewFromModel(mailTemplate *iam_model.MailTemplateView) *management.MailTemplateView { + creationDate, err := ptypes.TimestampProto(mailTemplate.CreationDate) + logging.Log("MANAG-koQnB").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(mailTemplate.ChangeDate) + logging.Log("MANAG-ToDhD").OnError(err).Debug("date parse failed") + + return &management.MailTemplateView{ + Default: mailTemplate.Default, + Template: mailTemplate.Template, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} diff --git a/internal/api/grpc/management/mail_text.go b/internal/api/grpc/management/mail_text.go new file mode 100644 index 0000000000..1d9928a1cd --- /dev/null +++ b/internal/api/grpc/management/mail_text.go @@ -0,0 +1,45 @@ +package management + +import ( + "context" + + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes/empty" +) + +func (s *Server) GetMailTexts(ctx context.Context, _ *empty.Empty) (*management.MailTextsView, error) { + result, err := s.org.GetMailTexts(ctx) + if err != nil { + return nil, err + } + return mailTextsViewFromModel(result.Texts), nil +} + +func (s *Server) GetDefaultMailTexts(ctx context.Context, _ *empty.Empty) (*management.MailTextsView, error) { + result, err := s.org.GetDefaultMailTexts(ctx) + if err != nil { + return nil, err + } + return mailTextsViewFromModel(result.Texts), nil +} + +func (s *Server) CreateMailText(ctx context.Context, mailText *management.MailTextUpdate) (*management.MailText, error) { + result, err := s.org.AddMailText(ctx, mailTextRequestToModel(mailText)) + if err != nil { + return nil, err + } + return mailTextFromModel(result), nil +} + +func (s *Server) UpdateMailText(ctx context.Context, mailText *management.MailTextUpdate) (*management.MailText, error) { + result, err := s.org.ChangeMailText(ctx, mailTextRequestToModel(mailText)) + if err != nil { + return nil, err + } + return mailTextFromModel(result), nil +} + +func (s *Server) RemoveMailText(ctx context.Context, mailText *management.MailTextRemove) (*empty.Empty, error) { + err := s.org.RemoveMailText(ctx, mailTextRemoveToModel(mailText)) + return &empty.Empty{}, err +} diff --git a/internal/api/grpc/management/mail_text_converter.go b/internal/api/grpc/management/mail_text_converter.go new file mode 100644 index 0000000000..8b4e580e01 --- /dev/null +++ b/internal/api/grpc/management/mail_text_converter.go @@ -0,0 +1,82 @@ +package management + +import ( + "github.com/caos/logging" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/pkg/grpc/management" + "github.com/golang/protobuf/ptypes" +) + +func mailTextRequestToModel(mailText *management.MailTextUpdate) *iam_model.MailText { + return &iam_model.MailText{ + MailTextType: mailText.MailTextType, + Language: mailText.Language, + Title: mailText.Title, + PreHeader: mailText.PreHeader, + Subject: mailText.Subject, + Greeting: mailText.Greeting, + Text: mailText.Text, + ButtonText: mailText.ButtonText, + } +} + +func mailTextRemoveToModel(mailText *management.MailTextRemove) *iam_model.MailText { + return &iam_model.MailText{ + MailTextType: mailText.MailTextType, + Language: mailText.Language, + } +} + +func mailTextFromModel(mailText *iam_model.MailText) *management.MailText { + creationDate, err := ptypes.TimestampProto(mailText.CreationDate) + logging.Log("MANAG-ULKZ6").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(mailText.ChangeDate) + logging.Log("MANAG-451rI").OnError(err).Debug("date parse failed") + + return &management.MailText{ + MailTextType: mailText.MailTextType, + Language: mailText.Language, + Title: mailText.Title, + PreHeader: mailText.PreHeader, + Subject: mailText.Subject, + Greeting: mailText.Greeting, + Text: mailText.Text, + ButtonText: mailText.ButtonText, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} + +func mailTextsViewFromModel(queries []*iam_model.MailTextView) *management.MailTextsView { + modelQueries := make([]*management.MailTextView, len(queries)) + for i, query := range queries { + modelQueries[i] = mailTextViewFromModel(query) + } + + return &management.MailTextsView{ + Texts: modelQueries, + } +} + +func mailTextViewFromModel(mailText *iam_model.MailTextView) *management.MailTextView { + creationDate, err := ptypes.TimestampProto(mailText.CreationDate) + logging.Log("MANAG-koQnB").OnError(err).Debug("date parse failed") + + changeDate, err := ptypes.TimestampProto(mailText.ChangeDate) + logging.Log("MANAG-ToDhD").OnError(err).Debug("date parse failed") + + return &management.MailTextView{ + Default: mailText.Default, + MailTextType: mailText.MailTextType, + Language: mailText.Language, + Title: mailText.Title, + PreHeader: mailText.PreHeader, + Subject: mailText.Subject, + Greeting: mailText.Greeting, + Text: mailText.Text, + ButtonText: mailText.ButtonText, + CreationDate: creationDate, + ChangeDate: changeDate, + } +} diff --git a/internal/api/grpc/management/project_converter.go b/internal/api/grpc/management/project_converter.go index 9b3f1e6fe6..9dbfcce553 100644 --- a/internal/api/grpc/management/project_converter.go +++ b/internal/api/grpc/management/project_converter.go @@ -94,10 +94,13 @@ func projectRoleViewsFromModel(roles []*proj_model.ProjectRoleView) []*managemen func projectRoleViewFromModel(role *proj_model.ProjectRoleView) *management.ProjectRoleView { creationDate, err := ptypes.TimestampProto(role.CreationDate) logging.Log("GRPC-dlso3").OnError(err).Debug("unable to parse timestamp") + changeDate, err := ptypes.TimestampProto(role.ChangeDate) + logging.Log("MANAG-BRr8Y").OnError(err).Debug("unable to parse timestamp") return &management.ProjectRoleView{ ProjectId: role.ProjectID, CreationDate: creationDate, + ChangeDate: changeDate, Key: role.Key, Group: role.Group, DisplayName: role.DisplayName, diff --git a/internal/auth/repository/eventsourcing/eventstore/org.go b/internal/auth/repository/eventsourcing/eventstore/org.go index 9339b1be70..c5f3ecced0 100644 --- a/internal/auth/repository/eventsourcing/eventstore/org.go +++ b/internal/auth/repository/eventsourcing/eventstore/org.go @@ -36,7 +36,7 @@ type OrgRepository struct { func (repo *OrgRepository) SearchOrgs(ctx context.Context, request *org_model.OrgSearchRequest) (*org_model.OrgSearchResult, error) { request.EnsureLimit(repo.SearchLimit) - sequence, err := repo.View.GetLatestOrgSequence("") + sequence, err := repo.View.GetLatestOrgSequence() logging.Log("EVENT-7Udhz").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Warn("could not read latest org sequence") members, count, err := repo.View.SearchOrgs(request) if err != nil { diff --git a/internal/auth/repository/eventsourcing/eventstore/user.go b/internal/auth/repository/eventsourcing/eventstore/user.go index b831f81865..66248090fa 100644 --- a/internal/auth/repository/eventsourcing/eventstore/user.go +++ b/internal/auth/repository/eventsourcing/eventstore/user.go @@ -94,7 +94,7 @@ func (repo *UserRepo) MyProfile(ctx context.Context) (*model.Profile, error) { func (repo *UserRepo) SearchMyExternalIDPs(ctx context.Context, request *model.ExternalIDPSearchRequest) (*model.ExternalIDPSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, seqErr := repo.View.GetLatestExternalIDPSequence("") + sequence, seqErr := repo.View.GetLatestExternalIDPSequence() logging.Log("EVENT-5Jsi8").OnError(seqErr).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Warn("could not read latest user sequence") request.AppendUserQuery(authz.GetCtxData(ctx).UserID) externalIDPS, count, err := repo.View.SearchExternalIDPs(request) diff --git a/internal/auth/repository/eventsourcing/eventstore/user_grant.go b/internal/auth/repository/eventsourcing/eventstore/user_grant.go index d9ba6bc842..cba39e4314 100644 --- a/internal/auth/repository/eventsourcing/eventstore/user_grant.go +++ b/internal/auth/repository/eventsourcing/eventstore/user_grant.go @@ -29,7 +29,7 @@ type UserGrantRepo struct { func (repo *UserGrantRepo) SearchMyUserGrants(ctx context.Context, request *grant_model.UserGrantSearchRequest) (*grant_model.UserGrantSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, err := repo.View.GetLatestUserGrantSequence("") + sequence, err := repo.View.GetLatestUserGrantSequence() logging.Log("EVENT-Hd7s3").OnError(err).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Warn("could not read latest user grant sequence") request.Queries = append(request.Queries, &grant_model.UserGrantSearchQuery{Key: grant_model.UserGrantSearchKeyUserID, Method: global_model.SearchMethodEquals, Value: authz.GetCtxData(ctx).UserID}) grants, count, err := repo.View.SearchUserGrants(request) diff --git a/internal/auth/repository/eventsourcing/handler/application.go b/internal/auth/repository/eventsourcing/handler/application.go index 5a8d5d41ff..f8bd45d33a 100644 --- a/internal/auth/repository/eventsourcing/handler/application.go +++ b/internal/auth/repository/eventsourcing/handler/application.go @@ -53,7 +53,7 @@ func (_ *Application) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.ProjectAggregate} } -func (a *Application) CurrentSequence(event *models.Event) (uint64, error) { +func (a *Application) CurrentSequence() (uint64, error) { sequence, err := a.view.GetLatestApplicationSequence() if err != nil { return 0, err diff --git a/internal/auth/repository/eventsourcing/handler/idp_config.go b/internal/auth/repository/eventsourcing/handler/idp_config.go index b070d89c8a..d11ee66219 100644 --- a/internal/auth/repository/eventsourcing/handler/idp_config.go +++ b/internal/auth/repository/eventsourcing/handler/idp_config.go @@ -49,8 +49,8 @@ func (_ *IDPConfig) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (i *IDPConfig) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := i.view.GetLatestIDPConfigSequence(string(event.AggregateType)) +func (i *IDPConfig) CurrentSequence() (uint64, error) { + sequence, err := i.view.GetLatestIDPConfigSequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (i *IDPConfig) CurrentSequence(event *models.Event) (uint64, error) { } func (i *IDPConfig) EventQuery() (*models.SearchQuery, error) { - sequence, err := i.view.GetLatestIDPConfigSequence("") + sequence, err := i.view.GetLatestIDPConfigSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/idp_providers.go b/internal/auth/repository/eventsourcing/handler/idp_providers.go index 8622fc57b1..77e372cd41 100644 --- a/internal/auth/repository/eventsourcing/handler/idp_providers.go +++ b/internal/auth/repository/eventsourcing/handler/idp_providers.go @@ -66,8 +66,8 @@ func (_ *IDPProvider) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.IAMAggregate, org_es_model.OrgAggregate} } -func (i *IDPProvider) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := i.view.GetLatestIDPProviderSequence(string(event.AggregateType)) +func (i *IDPProvider) CurrentSequence() (uint64, error) { + sequence, err := i.view.GetLatestIDPProviderSequence() if err != nil { return 0, err } @@ -75,7 +75,7 @@ func (i *IDPProvider) CurrentSequence(event *models.Event) (uint64, error) { } func (i *IDPProvider) EventQuery() (*models.SearchQuery, error) { - sequence, err := i.view.GetLatestIDPProviderSequence("") + sequence, err := i.view.GetLatestIDPProviderSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/key.go b/internal/auth/repository/eventsourcing/handler/key.go index 54703a2509..ded3ce7685 100644 --- a/internal/auth/repository/eventsourcing/handler/key.go +++ b/internal/auth/repository/eventsourcing/handler/key.go @@ -49,8 +49,8 @@ func (_ *Key) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.KeyPairAggregate} } -func (k *Key) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := k.view.GetLatestKeySequence(string(event.AggregateType)) +func (k *Key) CurrentSequence() (uint64, error) { + sequence, err := k.view.GetLatestKeySequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (k *Key) CurrentSequence(event *models.Event) (uint64, error) { } func (k *Key) EventQuery() (*models.SearchQuery, error) { - sequence, err := k.view.GetLatestKeySequence("") + sequence, err := k.view.GetLatestKeySequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/login_policy.go b/internal/auth/repository/eventsourcing/handler/login_policy.go index 35700d80c7..be964781c3 100644 --- a/internal/auth/repository/eventsourcing/handler/login_policy.go +++ b/internal/auth/repository/eventsourcing/handler/login_policy.go @@ -49,8 +49,8 @@ func (_ *LoginPolicy) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *LoginPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestLoginPolicySequence(string(event.AggregateType)) +func (p *LoginPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestLoginPolicySequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (p *LoginPolicy) CurrentSequence(event *models.Event) (uint64, error) { } func (p *LoginPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestLoginPolicySequence("") + sequence, err := p.view.GetLatestLoginPolicySequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/machine_keys.go b/internal/auth/repository/eventsourcing/handler/machine_keys.go index 0ca0532c26..bf877564af 100644 --- a/internal/auth/repository/eventsourcing/handler/machine_keys.go +++ b/internal/auth/repository/eventsourcing/handler/machine_keys.go @@ -6,7 +6,6 @@ import ( "github.com/caos/logging" "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -50,8 +49,8 @@ func (_ *MachineKeys) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.UserAggregate} } -func (k *MachineKeys) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := k.view.GetLatestMachineKeySequence(string(event.AggregateType)) +func (k *MachineKeys) CurrentSequence() (uint64, error) { + sequence, err := k.view.GetLatestMachineKeySequence() if err != nil { return 0, err } @@ -59,7 +58,7 @@ func (k *MachineKeys) CurrentSequence(event *models.Event) (uint64, error) { } func (k *MachineKeys) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := k.view.GetLatestMachineKeySequence("") + sequence, err := k.view.GetLatestMachineKeySequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/org.go b/internal/auth/repository/eventsourcing/handler/org.go index ea87eed2f2..5a92125004 100644 --- a/internal/auth/repository/eventsourcing/handler/org.go +++ b/internal/auth/repository/eventsourcing/handler/org.go @@ -4,7 +4,6 @@ import ( "github.com/caos/logging" "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -49,8 +48,8 @@ func (_ *Org) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate} } -func (o *Org) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := o.view.GetLatestOrgSequence(string(event.AggregateType)) +func (o *Org) CurrentSequence() (uint64, error) { + sequence, err := o.view.GetLatestOrgSequence() if err != nil { return 0, err } @@ -58,7 +57,7 @@ func (o *Org) CurrentSequence(event *models.Event) (uint64, error) { } func (o *Org) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := o.view.GetLatestOrgSequence("") + sequence, err := o.view.GetLatestOrgSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/org_iam_policy.go b/internal/auth/repository/eventsourcing/handler/org_iam_policy.go index 9d9d230a96..cfeae902f0 100644 --- a/internal/auth/repository/eventsourcing/handler/org_iam_policy.go +++ b/internal/auth/repository/eventsourcing/handler/org_iam_policy.go @@ -2,8 +2,8 @@ package handler import ( "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -48,8 +48,8 @@ func (_ *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{org_es_model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *OrgIAMPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestOrgIAMPolicySequence(string(event.AggregateType)) +func (p *OrgIAMPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestOrgIAMPolicySequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (p *OrgIAMPolicy) CurrentSequence(event *models.Event) (uint64, error) { } func (p *OrgIAMPolicy) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := p.view.GetLatestOrgIAMPolicySequence("") + sequence, err := p.view.GetLatestOrgIAMPolicySequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/password_complexity_policy.go b/internal/auth/repository/eventsourcing/handler/password_complexity_policy.go index 65a86676a8..5cb9a5267b 100644 --- a/internal/auth/repository/eventsourcing/handler/password_complexity_policy.go +++ b/internal/auth/repository/eventsourcing/handler/password_complexity_policy.go @@ -2,8 +2,8 @@ package handler import ( "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -48,8 +48,8 @@ func (_ *PasswordComplexityPolicy) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{org_es_model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *PasswordComplexityPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestPasswordComplexityPolicySequence(string(event.AggregateType)) +func (p *PasswordComplexityPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestPasswordComplexityPolicySequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (p *PasswordComplexityPolicy) CurrentSequence(event *models.Event) (uint64, } func (p *PasswordComplexityPolicy) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := p.view.GetLatestPasswordComplexityPolicySequence("") + sequence, err := p.view.GetLatestPasswordComplexityPolicySequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/project_role.go b/internal/auth/repository/eventsourcing/handler/project_role.go index 5ee8722bdc..518516e7bb 100644 --- a/internal/auth/repository/eventsourcing/handler/project_role.go +++ b/internal/auth/repository/eventsourcing/handler/project_role.go @@ -2,8 +2,8 @@ package handler import ( "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -54,8 +54,8 @@ func (_ *ProjectRole) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.ProjectAggregate} } -func (p *ProjectRole) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestProjectRoleSequence(string(event.AggregateType)) +func (p *ProjectRole) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestProjectRoleSequence() if err != nil { return 0, err } @@ -63,7 +63,7 @@ func (p *ProjectRole) CurrentSequence(event *models.Event) (uint64, error) { } func (p *ProjectRole) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := p.view.GetLatestProjectRoleSequence("") + sequence, err := p.view.GetLatestProjectRoleSequence() if err != nil { return nil, err } @@ -84,6 +84,7 @@ func (p *ProjectRole) Reduce(event *es_models.Event) (err error) { if err != nil { return err } + role.ChangeDate = event.CreationDate err = role.AppendEvent(event) case model.ProjectRoleRemoved: err = role.SetData(event) diff --git a/internal/auth/repository/eventsourcing/handler/token.go b/internal/auth/repository/eventsourcing/handler/token.go index b98e811bda..6a365580ac 100644 --- a/internal/auth/repository/eventsourcing/handler/token.go +++ b/internal/auth/repository/eventsourcing/handler/token.go @@ -58,8 +58,8 @@ func (_ *Token) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{user_es_model.UserAggregate, project_es_model.ProjectAggregate} } -func (p *Token) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestTokenSequence(string(event.AggregateType)) +func (p *Token) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestTokenSequence() if err != nil { return 0, err } @@ -67,7 +67,7 @@ func (p *Token) CurrentSequence(event *models.Event) (uint64, error) { } func (t *Token) EventQuery() (*models.SearchQuery, error) { - sequence, err := t.view.GetLatestTokenSequence("") + sequence, err := t.view.GetLatestTokenSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/user.go b/internal/auth/repository/eventsourcing/handler/user.go index f960ab720d..d87f8c3a2b 100644 --- a/internal/auth/repository/eventsourcing/handler/user.go +++ b/internal/auth/repository/eventsourcing/handler/user.go @@ -64,8 +64,8 @@ func (_ *User) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate} } -func (u *User) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := u.view.GetLatestUserSequence(string(event.AggregateType)) +func (u *User) CurrentSequence() (uint64, error) { + sequence, err := u.view.GetLatestUserSequence() if err != nil { return 0, err } @@ -73,7 +73,7 @@ func (u *User) CurrentSequence(event *models.Event) (uint64, error) { } func (u *User) EventQuery() (*models.SearchQuery, error) { - sequence, err := u.view.GetLatestUserSequence("") + sequence, err := u.view.GetLatestUserSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/user_external_idps.go b/internal/auth/repository/eventsourcing/handler/user_external_idps.go index 8dcaebe3cb..2744137a79 100644 --- a/internal/auth/repository/eventsourcing/handler/user_external_idps.go +++ b/internal/auth/repository/eventsourcing/handler/user_external_idps.go @@ -68,8 +68,8 @@ func (_ *ExternalIDP) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate} } -func (i *ExternalIDP) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := i.view.GetLatestExternalIDPSequence(string(event.AggregateType)) +func (i *ExternalIDP) CurrentSequence() (uint64, error) { + sequence, err := i.view.GetLatestExternalIDPSequence() if err != nil { return 0, err } @@ -77,7 +77,7 @@ func (i *ExternalIDP) CurrentSequence(event *models.Event) (uint64, error) { } func (i *ExternalIDP) EventQuery() (*models.SearchQuery, error) { - sequence, err := i.view.GetLatestExternalIDPSequence("") + sequence, err := i.view.GetLatestExternalIDPSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/user_grant.go b/internal/auth/repository/eventsourcing/handler/user_grant.go index 4244d0ac34..cc1fd98b16 100644 --- a/internal/auth/repository/eventsourcing/handler/user_grant.go +++ b/internal/auth/repository/eventsourcing/handler/user_grant.go @@ -83,8 +83,8 @@ func (_ *UserGrant) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{grant_es_model.UserGrantAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate, usr_es_model.UserAggregate, proj_es_model.ProjectAggregate} } -func (u *UserGrant) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := u.view.GetLatestUserGrantSequence(string(event.AggregateType)) +func (u *UserGrant) CurrentSequence() (uint64, error) { + sequence, err := u.view.GetLatestUserGrantSequence() if err != nil { return 0, err } @@ -98,7 +98,7 @@ func (u *UserGrant) EventQuery() (*models.SearchQuery, error) { return nil, err } } - sequence, err := u.view.GetLatestUserGrantSequence("") + sequence, err := u.view.GetLatestUserGrantSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/user_membership.go b/internal/auth/repository/eventsourcing/handler/user_membership.go index e1a41eccf5..ef76e28955 100644 --- a/internal/auth/repository/eventsourcing/handler/user_membership.go +++ b/internal/auth/repository/eventsourcing/handler/user_membership.go @@ -64,8 +64,8 @@ func (_ *UserMembership) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate} } -func (m *UserMembership) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := m.view.GetLatestUserMembershipSequence(string(event.AggregateType)) +func (m *UserMembership) CurrentSequence() (uint64, error) { + sequence, err := m.view.GetLatestUserMembershipSequence() if err != nil { return 0, err } @@ -73,7 +73,7 @@ func (m *UserMembership) CurrentSequence(event *models.Event) (uint64, error) { } func (m *UserMembership) EventQuery() (*models.SearchQuery, error) { - sequence, err := m.view.GetLatestUserMembershipSequence("") + sequence, err := m.view.GetLatestUserMembershipSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/handler/user_session.go b/internal/auth/repository/eventsourcing/handler/user_session.go index 7ef182f6ae..ac099cf4bd 100644 --- a/internal/auth/repository/eventsourcing/handler/user_session.go +++ b/internal/auth/repository/eventsourcing/handler/user_session.go @@ -55,8 +55,8 @@ func (_ *UserSession) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.UserAggregate} } -func (u *UserSession) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := u.view.GetLatestUserSessionSequence(string(event.AggregateType)) +func (u *UserSession) CurrentSequence() (uint64, error) { + sequence, err := u.view.GetLatestUserSessionSequence() if err != nil { return 0, err } @@ -64,7 +64,7 @@ func (u *UserSession) CurrentSequence(event *models.Event) (uint64, error) { } func (u *UserSession) EventQuery() (*models.SearchQuery, error) { - sequence, err := u.view.GetLatestUserSessionSequence("") + sequence, err := u.view.GetLatestUserSessionSequence() if err != nil { return nil, err } diff --git a/internal/auth/repository/eventsourcing/view/application.go b/internal/auth/repository/eventsourcing/view/application.go index 5a7f2c6f1b..e0e6315dfb 100644 --- a/internal/auth/repository/eventsourcing/view/application.go +++ b/internal/auth/repository/eventsourcing/view/application.go @@ -57,7 +57,7 @@ func (v *View) DeleteApplicationsByProjectID(projectID string) error { } func (v *View) GetLatestApplicationSequence() (*repository.CurrentSequence, error) { - return v.latestSequence(applicationTable, "") + return v.latestSequence(applicationTable) } func (v *View) ProcessedApplicationSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/external_idps.go b/internal/auth/repository/eventsourcing/view/external_idps.go index 2928421cdc..05734c7d88 100644 --- a/internal/auth/repository/eventsourcing/view/external_idps.go +++ b/internal/auth/repository/eventsourcing/view/external_idps.go @@ -65,8 +65,8 @@ func (v *View) DeleteExternalIDPsByUserID(userID string, event *models.Event) er return v.ProcessedExternalIDPSequence(event) } -func (v *View) GetLatestExternalIDPSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(externalIDPTable, aggregateType) +func (v *View) GetLatestExternalIDPSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(externalIDPTable) } func (v *View) ProcessedExternalIDPSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/idp_configs.go b/internal/auth/repository/eventsourcing/view/idp_configs.go index 65a932b2d1..6a7b8a3910 100644 --- a/internal/auth/repository/eventsourcing/view/idp_configs.go +++ b/internal/auth/repository/eventsourcing/view/idp_configs.go @@ -41,8 +41,8 @@ func (v *View) DeleteIDPConfig(idpID string, event *models.Event) error { return v.ProcessedIDPConfigSequence(event) } -func (v *View) GetLatestIDPConfigSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(idpConfigTable, aggregateType) +func (v *View) GetLatestIDPConfigSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(idpConfigTable) } func (v *View) ProcessedIDPConfigSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/idp_providers.go b/internal/auth/repository/eventsourcing/view/idp_providers.go index afd25c15f8..2b17531533 100644 --- a/internal/auth/repository/eventsourcing/view/idp_providers.go +++ b/internal/auth/repository/eventsourcing/view/idp_providers.go @@ -61,8 +61,8 @@ func (v *View) DeleteIDPProvidersByAggregateID(aggregateID string, event *models return v.ProcessedIDPProviderSequence(event) } -func (v *View) GetLatestIDPProviderSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(idpProviderTable, aggregateType) +func (v *View) GetLatestIDPProviderSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(idpProviderTable) } func (v *View) ProcessedIDPProviderSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/key.go b/internal/auth/repository/eventsourcing/view/key.go index f8fca89445..574ff84337 100644 --- a/internal/auth/repository/eventsourcing/view/key.go +++ b/internal/auth/repository/eventsourcing/view/key.go @@ -57,8 +57,8 @@ func (v *View) DeleteKeyPair(keyID string, event *models.Event) error { return v.ProcessedKeySequence(event) } -func (v *View) GetLatestKeySequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(keyTable, aggregateType) +func (v *View) GetLatestKeySequence() (*repository.CurrentSequence, error) { + return v.latestSequence(keyTable) } func (v *View) ProcessedKeySequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/login_policies.go b/internal/auth/repository/eventsourcing/view/login_policies.go index 2687cd8b6d..73bf483582 100644 --- a/internal/auth/repository/eventsourcing/view/login_policies.go +++ b/internal/auth/repository/eventsourcing/view/login_policies.go @@ -32,8 +32,8 @@ func (v *View) DeleteLoginPolicy(aggregateID string, event *models.Event) error return v.ProcessedLoginPolicySequence(event) } -func (v *View) GetLatestLoginPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(loginPolicyTable, aggregateType) +func (v *View) GetLatestLoginPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(loginPolicyTable) } func (v *View) ProcessedLoginPolicySequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/machine_keys.go b/internal/auth/repository/eventsourcing/view/machine_keys.go index b5412d7240..908dc54d8c 100644 --- a/internal/auth/repository/eventsourcing/view/machine_keys.go +++ b/internal/auth/repository/eventsourcing/view/machine_keys.go @@ -53,8 +53,8 @@ func (v *View) DeleteMachineKeysByUserID(userID string, event *models.Event) err return v.ProcessedMachineKeySequence(event) } -func (v *View) GetLatestMachineKeySequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(machineKeyTable, aggregateType) +func (v *View) GetLatestMachineKeySequence() (*repository.CurrentSequence, error) { + return v.latestSequence(machineKeyTable) } func (v *View) ProcessedMachineKeySequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/org.go b/internal/auth/repository/eventsourcing/view/org.go index 1b9a7c1b4c..e8407deb72 100644 --- a/internal/auth/repository/eventsourcing/view/org.go +++ b/internal/auth/repository/eventsourcing/view/org.go @@ -44,8 +44,8 @@ func (v *View) UpdateOrgSpoolerRunTimestamp() error { return v.updateSpoolerRunSequence(orgTable) } -func (v *View) GetLatestOrgSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(orgTable, aggregateType) +func (v *View) GetLatestOrgSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(orgTable) } func (v *View) ProcessedOrgSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/org_iam_policy.go b/internal/auth/repository/eventsourcing/view/org_iam_policy.go index a05592dae3..3dba05807d 100644 --- a/internal/auth/repository/eventsourcing/view/org_iam_policy.go +++ b/internal/auth/repository/eventsourcing/view/org_iam_policy.go @@ -32,8 +32,8 @@ func (v *View) DeleteOrgIAMPolicy(aggregateID string, event *models.Event) error return v.ProcessedOrgIAMPolicySequence(event) } -func (v *View) GetLatestOrgIAMPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(orgIAMPolicyTable, aggregateType) +func (v *View) GetLatestOrgIAMPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(orgIAMPolicyTable) } func (v *View) ProcessedOrgIAMPolicySequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/password_complexity_policy.go b/internal/auth/repository/eventsourcing/view/password_complexity_policy.go index 43ce74f8c1..9c054fd8e5 100644 --- a/internal/auth/repository/eventsourcing/view/password_complexity_policy.go +++ b/internal/auth/repository/eventsourcing/view/password_complexity_policy.go @@ -32,8 +32,8 @@ func (v *View) DeletePasswordComplexityPolicy(aggregateID string, event *models. return v.ProcessedPasswordComplexityPolicySequence(event) } -func (v *View) GetLatestPasswordComplexityPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(passwordComplexityPolicyTable, aggregateType) +func (v *View) GetLatestPasswordComplexityPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordComplexityPolicyTable) } func (v *View) ProcessedPasswordComplexityPolicySequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/project_role.go b/internal/auth/repository/eventsourcing/view/project_role.go index c5a99bfe4a..a27672319c 100644 --- a/internal/auth/repository/eventsourcing/view/project_role.go +++ b/internal/auth/repository/eventsourcing/view/project_role.go @@ -53,8 +53,8 @@ func (v *View) DeleteProjectRolesByProjectID(projectID string) error { return view.DeleteProjectRolesByProjectID(v.Db, projectRoleTable, projectID) } -func (v *View) GetLatestProjectRoleSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(projectRoleTable, aggregateType) +func (v *View) GetLatestProjectRoleSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(projectRoleTable) } func (v *View) ProcessedProjectRoleSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/sequence.go b/internal/auth/repository/eventsourcing/view/sequence.go index d9eb6c7a64..cf75ab7606 100644 --- a/internal/auth/repository/eventsourcing/view/sequence.go +++ b/internal/auth/repository/eventsourcing/view/sequence.go @@ -12,15 +12,15 @@ const ( ) func (v *View) saveCurrentSequence(viewName string, event *models.Event) error { - return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, string(event.AggregateType), event.Sequence, event.CreationDate) + return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, event.Sequence, event.CreationDate) } -func (v *View) latestSequence(viewName, aggregateType string) (*repository.CurrentSequence, error) { - return repository.LatestSequence(v.Db, sequencesTable, viewName, aggregateType) +func (v *View) latestSequence(viewName string) (*repository.CurrentSequence, error) { + return repository.LatestSequence(v.Db, sequencesTable, viewName) } func (v *View) updateSpoolerRunSequence(viewName string) error { - currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName, "") + currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName) if err != nil { return err } diff --git a/internal/auth/repository/eventsourcing/view/token.go b/internal/auth/repository/eventsourcing/view/token.go index 105034a364..032953d529 100644 --- a/internal/auth/repository/eventsourcing/view/token.go +++ b/internal/auth/repository/eventsourcing/view/token.go @@ -68,8 +68,8 @@ func (v *View) DeleteApplicationTokens(event *models.Event, ids ...string) error return v.ProcessedTokenSequence(event) } -func (v *View) GetLatestTokenSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(tokenTable, aggregateType) +func (v *View) GetLatestTokenSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(tokenTable) } func (v *View) ProcessedTokenSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/user.go b/internal/auth/repository/eventsourcing/view/user.go index 21de8cef8d..a93a92c982 100644 --- a/internal/auth/repository/eventsourcing/view/user.go +++ b/internal/auth/repository/eventsourcing/view/user.go @@ -77,8 +77,8 @@ func (v *View) DeleteUser(userID string, event *models.Event) error { return v.ProcessedUserSequence(event) } -func (v *View) GetLatestUserSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userTable, aggregateType) +func (v *View) GetLatestUserSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userTable) } func (v *View) ProcessedUserSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/user_grant.go b/internal/auth/repository/eventsourcing/view/user_grant.go index d9a52a586e..4d713fd073 100644 --- a/internal/auth/repository/eventsourcing/view/user_grant.go +++ b/internal/auth/repository/eventsourcing/view/user_grant.go @@ -61,8 +61,8 @@ func (v *View) DeleteUserGrant(grantID string, event *models.Event) error { return v.ProcessedUserGrantSequence(event) } -func (v *View) GetLatestUserGrantSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userGrantTable, aggregateType) +func (v *View) GetLatestUserGrantSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userGrantTable) } func (v *View) ProcessedUserGrantSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/user_membership.go b/internal/auth/repository/eventsourcing/view/user_membership.go index f3d9fae70e..1574a668ef 100644 --- a/internal/auth/repository/eventsourcing/view/user_membership.go +++ b/internal/auth/repository/eventsourcing/view/user_membership.go @@ -77,8 +77,8 @@ func (v *View) DeleteUserMembershipsByAggregateIDAndObjectID(aggregateID, object return v.ProcessedUserMembershipSequence(event) } -func (v *View) GetLatestUserMembershipSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userMembershipTable, aggregateType) +func (v *View) GetLatestUserMembershipSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userMembershipTable) } func (v *View) ProcessedUserMembershipSequence(event *models.Event) error { diff --git a/internal/auth/repository/eventsourcing/view/user_session.go b/internal/auth/repository/eventsourcing/view/user_session.go index 16ce4c7986..01ec5360df 100644 --- a/internal/auth/repository/eventsourcing/view/user_session.go +++ b/internal/auth/repository/eventsourcing/view/user_session.go @@ -52,8 +52,8 @@ func (v *View) DeleteUserSessions(userID string, event *models.Event) error { return v.ProcessedUserSessionSequence(event) } -func (v *View) GetLatestUserSessionSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userSessionTable, aggregateType) +func (v *View) GetLatestUserSessionSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userSessionTable) } func (v *View) ProcessedUserSessionSequence(event *models.Event) error { diff --git a/internal/authz/repository/eventsourcing/handler/application.go b/internal/authz/repository/eventsourcing/handler/application.go index fcb84ee675..bb7bda0585 100644 --- a/internal/authz/repository/eventsourcing/handler/application.go +++ b/internal/authz/repository/eventsourcing/handler/application.go @@ -48,8 +48,8 @@ func (a *Application) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.ProjectAggregate} } -func (a *Application) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := a.view.GetLatestApplicationSequence(string(event.AggregateType)) +func (a *Application) CurrentSequence() (uint64, error) { + sequence, err := a.view.GetLatestApplicationSequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (a *Application) CurrentSequence(event *models.Event) (uint64, error) { } func (a *Application) EventQuery() (*models.SearchQuery, error) { - sequence, err := a.view.GetLatestApplicationSequence("") + sequence, err := a.view.GetLatestApplicationSequence() if err != nil { return nil, err } diff --git a/internal/authz/repository/eventsourcing/handler/org.go b/internal/authz/repository/eventsourcing/handler/org.go index 34cc1a69e7..184316eec9 100644 --- a/internal/authz/repository/eventsourcing/handler/org.go +++ b/internal/authz/repository/eventsourcing/handler/org.go @@ -4,7 +4,6 @@ import ( "github.com/caos/logging" "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -49,8 +48,8 @@ func (_ *Org) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate} } -func (o *Org) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := o.view.GetLatestOrgSequence(string(event.AggregateType)) +func (o *Org) CurrentSequence() (uint64, error) { + sequence, err := o.view.GetLatestOrgSequence() if err != nil { return 0, err } @@ -58,7 +57,7 @@ func (o *Org) CurrentSequence(event *models.Event) (uint64, error) { } func (o *Org) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := o.view.GetLatestOrgSequence("") + sequence, err := o.view.GetLatestOrgSequence() if err != nil { return nil, err } diff --git a/internal/authz/repository/eventsourcing/handler/user_grant.go b/internal/authz/repository/eventsourcing/handler/user_grant.go index acdc5fde9e..78c894ea75 100644 --- a/internal/authz/repository/eventsourcing/handler/user_grant.go +++ b/internal/authz/repository/eventsourcing/handler/user_grant.go @@ -66,8 +66,8 @@ func (_ *UserGrant) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate} } -func (u *UserGrant) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := u.view.GetLatestUserGrantSequence(string(event.AggregateType)) +func (u *UserGrant) CurrentSequence() (uint64, error) { + sequence, err := u.view.GetLatestUserGrantSequence() if err != nil { return 0, err } @@ -81,7 +81,7 @@ func (u *UserGrant) EventQuery() (*models.SearchQuery, error) { return nil, err } } - sequence, err := u.view.GetLatestUserGrantSequence("") + sequence, err := u.view.GetLatestUserGrantSequence() if err != nil { return nil, err } diff --git a/internal/authz/repository/eventsourcing/view/application.go b/internal/authz/repository/eventsourcing/view/application.go index 84ae564981..9757a663fb 100644 --- a/internal/authz/repository/eventsourcing/view/application.go +++ b/internal/authz/repository/eventsourcing/view/application.go @@ -51,8 +51,8 @@ func (v *View) DeleteApplication(appID string, event *models.Event) error { return v.ProcessedApplicationSequence(event) } -func (v *View) GetLatestApplicationSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(applicationTable, aggregateType) +func (v *View) GetLatestApplicationSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(applicationTable) } func (v *View) ProcessedApplicationSequence(event *models.Event) error { diff --git a/internal/authz/repository/eventsourcing/view/org.go b/internal/authz/repository/eventsourcing/view/org.go index 6d27b5b071..aa99489968 100644 --- a/internal/authz/repository/eventsourcing/view/org.go +++ b/internal/authz/repository/eventsourcing/view/org.go @@ -36,8 +36,8 @@ func (v *View) ProcessedOrgFailedEvent(failedEvent *repository.FailedEvent) erro return v.saveFailedEvent(failedEvent) } -func (v *View) GetLatestOrgSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(orgTable, aggregateType) +func (v *View) GetLatestOrgSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(orgTable) } func (v *View) ProcessedOrgSequence(event *models.Event) error { diff --git a/internal/authz/repository/eventsourcing/view/sequence.go b/internal/authz/repository/eventsourcing/view/sequence.go index 42e6e20bfd..056c2a0399 100644 --- a/internal/authz/repository/eventsourcing/view/sequence.go +++ b/internal/authz/repository/eventsourcing/view/sequence.go @@ -12,15 +12,15 @@ const ( ) func (v *View) saveCurrentSequence(viewName string, event *models.Event) error { - return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, string(event.AggregateType), event.Sequence, event.CreationDate) + return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, event.Sequence, event.CreationDate) } -func (v *View) latestSequence(viewName, aggregateType string) (*repository.CurrentSequence, error) { - return repository.LatestSequence(v.Db, sequencesTable, viewName, aggregateType) +func (v *View) latestSequence(viewName string) (*repository.CurrentSequence, error) { + return repository.LatestSequence(v.Db, sequencesTable, viewName) } func (v *View) updateSpoolerRunSequence(viewName string) error { - currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName, "") + currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName) if err != nil { return err } diff --git a/internal/authz/repository/eventsourcing/view/token.go b/internal/authz/repository/eventsourcing/view/token.go index d2987a8194..8cd63fd8d1 100644 --- a/internal/authz/repository/eventsourcing/view/token.go +++ b/internal/authz/repository/eventsourcing/view/token.go @@ -40,8 +40,8 @@ func (v *View) DeleteSessionTokens(agentID, userID string, event *models.Event) return v.ProcessedTokenSequence(event) } -func (v *View) GetLatestTokenSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(tokenTable, aggregateType) +func (v *View) GetLatestTokenSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(tokenTable) } func (v *View) ProcessedTokenSequence(event *models.Event) error { diff --git a/internal/authz/repository/eventsourcing/view/user_grant.go b/internal/authz/repository/eventsourcing/view/user_grant.go index 84de9319ea..210d08dcb4 100644 --- a/internal/authz/repository/eventsourcing/view/user_grant.go +++ b/internal/authz/repository/eventsourcing/view/user_grant.go @@ -49,8 +49,8 @@ func (v *View) DeleteUserGrant(grantID string, event *models.Event) error { return v.ProcessedUserGrantSequence(event) } -func (v *View) GetLatestUserGrantSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userGrantTable, aggregateType) +func (v *View) GetLatestUserGrantSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userGrantTable) } func (v *View) ProcessedUserGrantSequence(event *models.Event) error { diff --git a/internal/eventstore/query/handler.go b/internal/eventstore/query/handler.go index 622a69156e..52ab1771be 100755 --- a/internal/eventstore/query/handler.go +++ b/internal/eventstore/query/handler.go @@ -5,6 +5,7 @@ import ( "time" "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/models" ) @@ -24,12 +25,12 @@ type Handler interface { QueryLimit() uint64 AggregateTypes() []models.AggregateType - CurrentSequence(*models.Event) (uint64, error) + CurrentSequence() (uint64, error) Eventstore() eventstore.Eventstore } func ReduceEvent(handler Handler, event *models.Event) { - currentSequence, err := handler.CurrentSequence(event) + currentSequence, err := handler.CurrentSequence() if err != nil { logging.Log("HANDL-BmpkC").WithError(err).Warn("unable to get current sequence") return @@ -46,32 +47,23 @@ func ReduceEvent(handler Handler, event *models.Event) { return } - processedSequences := map[models.AggregateType]uint64{} - for _, unprocessedEvent := range unprocessedEvents { - currentSequence, err := handler.CurrentSequence(unprocessedEvent) + currentSequence, err := handler.CurrentSequence() if err != nil { logging.Log("HANDL-BmpkC").WithError(err).Warn("unable to get current sequence") return } - _, ok := processedSequences[unprocessedEvent.AggregateType] - if !ok { - processedSequences[unprocessedEvent.AggregateType] = currentSequence - } - if processedSequences[unprocessedEvent.AggregateType] != currentSequence { - if currentSequence < processedSequences[unprocessedEvent.AggregateType] { - logging.LogWithFields("QUERY-DOYVN", - "processed", processedSequences[unprocessedEvent.AggregateType], - "current", currentSequence, - "view", handler.ViewModel()). - Warn("sequence not matching") - } + if unprocessedEvent.Sequence < currentSequence { + logging.LogWithFields("QUERY-DOYVN", + "unprocessed", unprocessedEvent.Sequence, + "current", currentSequence, + "view", handler.ViewModel()). + Warn("sequence not matching") return } err = handler.Reduce(unprocessedEvent) logging.LogWithFields("HANDL-V42TI", "seq", unprocessedEvent.Sequence).OnError(err).Warn("reduce failed") - processedSequences[unprocessedEvent.AggregateType] = unprocessedEvent.Sequence } if len(unprocessedEvents) == eventLimit { logging.LogWithFields("QUERY-BSqe9", "seq", event.Sequence).Warn("didnt process event") diff --git a/internal/eventstore/spooler/spooler_test.go b/internal/eventstore/spooler/spooler_test.go index 5b02977ea1..b685af2675 100644 --- a/internal/eventstore/spooler/spooler_test.go +++ b/internal/eventstore/spooler/spooler_test.go @@ -29,7 +29,7 @@ func (h *testHandler) AggregateTypes() []models.AggregateType { return nil } -func (h *testHandler) CurrentSequence(event *models.Event) (uint64, error) { +func (h *testHandler) CurrentSequence() (uint64, error) { return 0, nil } diff --git a/internal/iam/model/iam.go b/internal/iam/model/iam.go index ce88ed38c5..febe8f1422 100644 --- a/internal/iam/model/iam.go +++ b/internal/iam/model/iam.go @@ -17,6 +17,7 @@ const ( Step7 Step8 Step9 + Step10 //StepCount marks the the length of possible steps (StepCount-1 == last possible step) StepCount ) @@ -35,6 +36,8 @@ type IAM struct { DefaultPasswordComplexityPolicy *PasswordComplexityPolicy DefaultPasswordAgePolicy *PasswordAgePolicy DefaultPasswordLockoutPolicy *PasswordLockoutPolicy + DefaultMailTemplate *MailTemplate + DefaultMailTexts []*MailText } func (iam *IAM) GetMember(userID string) (int, *IAMMember) { @@ -54,3 +57,12 @@ func (iam *IAM) GetIDP(idpID string) (int, *IDPConfig) { } return -1, nil } + +func (iam *IAM) GetDefaultMailText(mailTextType string, language string) (int, *MailText) { + for i, m := range iam.DefaultMailTexts { + if m.MailTextType == mailTextType && m.Language == language { + return i, m + } + } + return -1, nil +} diff --git a/internal/iam/model/mail_template.go b/internal/iam/model/mail_template.go new file mode 100644 index 0000000000..8efeeff61b --- /dev/null +++ b/internal/iam/model/mail_template.go @@ -0,0 +1,17 @@ +package model + +import ( + "github.com/caos/zitadel/internal/eventstore/models" +) + +type MailTemplate struct { + models.ObjectRoot + + State PolicyState + Default bool + Template []byte +} + +func (p *MailTemplate) IsValid() bool { + return p.ObjectRoot.AggregateID != "" +} diff --git a/internal/iam/model/mail_template_view.go b/internal/iam/model/mail_template_view.go new file mode 100644 index 0000000000..40e04ce413 --- /dev/null +++ b/internal/iam/model/mail_template_view.go @@ -0,0 +1,47 @@ +package model + +import ( + "time" + + "github.com/caos/zitadel/internal/model" +) + +type MailTemplateView struct { + AggregateID string + Template []byte + Default bool + + CreationDate time.Time + ChangeDate time.Time + Sequence uint64 +} + +type MailTemplateSearchRequest struct { + Offset uint64 + Limit uint64 + SortingColumn MailTemplateSearchKey + Asc bool + Queries []*MailTemplateSearchQuery +} + +type MailTemplateSearchKey int32 + +const ( + MailTemplateSearchKeyUnspecified MailTemplateSearchKey = iota + MailTemplateSearchKeyAggregateID +) + +type MailTemplateSearchQuery struct { + Key MailTemplateSearchKey + Method model.SearchMethod + Value interface{} +} + +type MailTemplateSearchResponse struct { + Offset uint64 + Limit uint64 + TotalResult uint64 + Result []*MailTemplateView + Sequence uint64 + Timestamp time.Time +} diff --git a/internal/iam/model/mail_text.go b/internal/iam/model/mail_text.go new file mode 100644 index 0000000000..b0dd60b00a --- /dev/null +++ b/internal/iam/model/mail_text.go @@ -0,0 +1,28 @@ +package model + +import ( + "github.com/caos/zitadel/internal/eventstore/models" +) + +type MailTexts struct { + Texts []*MailText + Default bool +} +type MailText struct { + models.ObjectRoot + + State PolicyState + Default bool + MailTextType string + Language string + Title string + PreHeader string + Subject string + Greeting string + Text string + ButtonText string +} + +func (p *MailText) IsValid() bool { + return p.ObjectRoot.AggregateID != "" +} diff --git a/internal/iam/model/mail_text_view.go b/internal/iam/model/mail_text_view.go new file mode 100644 index 0000000000..425c58eca6 --- /dev/null +++ b/internal/iam/model/mail_text_view.go @@ -0,0 +1,60 @@ +package model + +import ( + "time" + + "github.com/caos/zitadel/internal/model" +) + +type MailTextsView struct { + Texts []*MailTextView + Default bool +} +type MailTextView struct { + AggregateID string + MailTextType string + Language string + Title string + PreHeader string + Subject string + Greeting string + Text string + ButtonText string + Default bool + + CreationDate time.Time + ChangeDate time.Time + Sequence uint64 +} + +type MailTextSearchRequest struct { + Offset uint64 + Limit uint64 + SortingColumn MailTextSearchKey + Asc bool + Queries []*MailTextSearchQuery +} + +type MailTextSearchKey int32 + +const ( + MailTextSearchKeyUnspecified MailTextSearchKey = iota + MailTextSearchKeyAggregateID + MailTextSearchKeyMailTextType + MailTextSearchKeyLanguage +) + +type MailTextSearchQuery struct { + Key MailTextSearchKey + Method model.SearchMethod + Value interface{} +} + +type MailTextSearchResponse struct { + Offset uint64 + Limit uint64 + TotalResult uint64 + Result []*MailTextView + Sequence uint64 + Timestamp time.Time +} diff --git a/internal/iam/repository/eventsourcing/eventstore.go b/internal/iam/repository/eventsourcing/eventstore.go index a484a5d573..4184336421 100644 --- a/internal/iam/repository/eventsourcing/eventstore.go +++ b/internal/iam/repository/eventsourcing/eventstore.go @@ -964,3 +964,118 @@ func (es *IAMEventstore) ChangeOrgIAMPolicy(ctx context.Context, policy *iam_mod es.iamCache.cacheIAM(repoIam) return model.OrgIAMPolicyToModel(repoIam.DefaultOrgIAMPolicy), nil } + +func (es *IAMEventstore) PrepareAddMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*model.IAM, *models.Aggregate, error) { + if template == nil || !template.IsValid() { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-j9l18", "Errors.IAM.MailTemplate.Empty") + } + iam, err := es.IAMByID(ctx, template.AggregateID) + if err != nil { + return nil, nil, err + } + + repoIam := model.IAMFromModel(iam) + mailTemplate := model.MailTemplateFromModel(template) + + addAggregate := MailTemplateAddedAggregate(es.Eventstore.AggregateCreator(), repoIam, mailTemplate) + aggregate, err := addAggregate(ctx) + if err != nil { + return nil, nil, err + } + return repoIam, aggregate, nil +} + +func (es *IAMEventstore) AddMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) { + repoIam, addAggregate, err := es.PrepareAddMailTemplate(ctx, template) + if err != nil { + return nil, err + } + err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.MailTemplateToModel(repoIam.DefaultMailTemplate), nil +} + +func (es *IAMEventstore) ChangeMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) { + if template == nil || !template.IsValid() { + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-gCnCs", "Errors.IAM.MailTemplateInvalid") + } + iam, err := es.IAMByID(ctx, template.AggregateID) + if err != nil { + return nil, err + } + + repoIam := model.IAMFromModel(iam) + repoMailTemplate := model.MailTemplateFromModel(template) + + addAggregate := MailTemplateChangedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoMailTemplate) + err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + return model.MailTemplateToModel(repoIam.DefaultMailTemplate), nil +} + +func (es *IAMEventstore) PrepareAddMailText(ctx context.Context, text *iam_model.MailText) (*model.IAM, *models.Aggregate, error) { + if text == nil || !text.IsValid() { + return nil, nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-j9l18", "Errors.IAM.MailText.Empty") + } + iam, err := es.IAMByID(ctx, text.AggregateID) + if err != nil { + return nil, nil, err + } + + repoIam := model.IAMFromModel(iam) + mailText := model.MailTextFromModel(text) + + addAggregate := MailTextAddedAggregate(es.Eventstore.AggregateCreator(), repoIam, mailText) + aggregate, err := addAggregate(ctx) + if err != nil { + return nil, nil, err + } + return repoIam, aggregate, nil +} + +func (es *IAMEventstore) AddMailText(ctx context.Context, text *iam_model.MailText) (*iam_model.MailText, error) { + repoIam, addAggregate, err := es.PrepareAddMailText(ctx, text) + if err != nil { + return nil, err + } + err = es_sdk.PushAggregates(ctx, es.PushAggregates, repoIam.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + es.iamCache.cacheIAM(repoIam) + + if _, m := model.GetMailText(repoIam.DefaultMailTexts, text.MailTextType, text.Language); m != nil { + return model.MailTextToModel(m), nil + } + return nil, caos_errs.ThrowInternal(nil, "EVENT-9AwUm", "Errors.Internal") +} + +func (es *IAMEventstore) ChangeMailText(ctx context.Context, text *iam_model.MailText) (*iam_model.MailText, error) { + if !text.IsValid() { + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-J5xbB", "Errors.IAM.MailTextInvalid") + } + existing, err := es.IAMByID(ctx, text.AggregateID) + if err != nil { + return nil, err + } + if _, m := existing.GetDefaultMailText(text.MailTextType, text.Language); m == nil { + return nil, caos_errs.ThrowPreconditionFailed(nil, "EVENT-0CTV3", "Errors.IAM.MailTextNotExisting") + } + repoIam := model.IAMFromModel(existing) + repoMember := model.MailTextFromModel(text) + + projectAggregate := MailTextChangedAggregate(es.Eventstore.AggregateCreator(), repoIam, repoMember) + err = es_sdk.Push(ctx, es.PushAggregates, repoIam.AppendEvents, projectAggregate) + es.iamCache.cacheIAM(repoIam) + + if _, m := model.GetMailText(repoIam.DefaultMailTexts, text.MailTextType, text.Language); m != nil { + return model.MailTextToModel(m), nil + } + return nil, caos_errs.ThrowInternal(nil, "EVENT-HawVx", "Errors.Internal") +} diff --git a/internal/iam/repository/eventsourcing/eventstore_mock_test.go b/internal/iam/repository/eventsourcing/eventstore_mock_test.go index e41a323014..18aff306bc 100644 --- a/internal/iam/repository/eventsourcing/eventstore_mock_test.go +++ b/internal/iam/repository/eventsourcing/eventstore_mock_test.go @@ -216,3 +216,29 @@ func GetMockManipulateIAMWithLabelPolicy(ctrl *gomock.Controller) *IAMEventstore mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) return GetMockedEventstore(ctrl, mockEs) } + +func GetMockManipulateIAMWithMailTemplate(ctrl *gomock.Controller) *IAMEventstore { + mailTemplate, _ := json.Marshal(model.MailTemplate{Template: []byte("")}) + events := []*es_models.Event{ + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.MailTemplateAdded, Data: mailTemplate}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockManipulateIAMWithMailText(ctrl *gomock.Controller) *IAMEventstore { + mailText, _ := json.Marshal(model.MailText{MailTextType: "Type", Language: "DE"}) + events := []*es_models.Event{ + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.IAMSetupStarted}, + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.MailTextAdded, Data: mailText}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} diff --git a/internal/iam/repository/eventsourcing/eventstore_test.go b/internal/iam/repository/eventsourcing/eventstore_test.go index 5db2bfcc9a..3054044ac0 100644 --- a/internal/iam/repository/eventsourcing/eventstore_test.go +++ b/internal/iam/repository/eventsourcing/eventstore_test.go @@ -2816,3 +2816,321 @@ func TestChangeOrgIAMPolicy(t *testing.T) { }) } } +func TestAddMailTemplate(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.MailTemplate + } + type res struct { + result *iam_model.MailTemplate + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add mailtemplate, ok", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + Template: []byte(""), + }, + }, + res: res{ + result: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + Template: []byte(""), + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddMailTemplate(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if string(result.Template) != string(tt.res.result.Template) { + t.Errorf("got wrong result Template: expected: %v, actual: %v ", tt.res.result.Template, result.Template) + } + }) + } +} + +func TestChangeMailTemplate(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + template *iam_model.MailTemplate + } + type res struct { + result *iam_model.MailTemplate + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add mail template, ok", + args: args{ + es: GetMockManipulateIAMWithMailTemplate(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + Template: []byte(""), + }, + }, + res: res{ + result: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + Template: []byte(""), + }, + }, + }, + { + name: "invalid mail template", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangeMailTemplate(tt.args.ctx, tt.args.template) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if string(result.Template) != string(tt.res.result.Template) { + t.Errorf("got wrong result Template: expected: %v, actual: %v ", tt.res.result.Template, result.Template) + } + }) + } +} +func TestAddMailText(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.MailText + } + type res struct { + result *iam_model.MailText + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add mailtemplate, ok", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MailTextType: "Type", Language: "DE", + }, + }, + res: res{ + result: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MailTextType: "Type", Language: "DE", + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddMailText(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if string(result.MailTextType) != string(tt.res.result.MailTextType) { + t.Errorf("got wrong result MailTextType: expected: %v, actual: %v ", tt.res.result.MailTextType, result.MailTextType) + } + }) + } +} + +func TestChangeMailText(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *IAMEventstore + ctx context.Context + policy *iam_model.MailText + } + type res struct { + result *iam_model.MailText + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change mailtemplate, ok", + args: args{ + es: GetMockManipulateIAMWithMailText(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MailTextType: "Type", Language: "DE", + }, + }, + res: res{ + result: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MailTextType: "Type", Language: "DE", + }, + }, + }, + { + name: "invalid policy", + args: args{ + es: GetMockManipulateIAM(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockManipulateIAMNotExisting(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + policy: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangeMailText(tt.args.ctx, tt.args.policy) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if string(result.MailTextType) != string(tt.res.result.MailTextType) { + t.Errorf("got wrong result MailTextType: expected: %v, actual: %v ", tt.res.result.MailTextType, result.MailTextType) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/iam.go b/internal/iam/repository/eventsourcing/iam.go index 0b5a128ca9..39803be9b5 100644 --- a/internal/iam/repository/eventsourcing/iam.go +++ b/internal/iam/repository/eventsourcing/iam.go @@ -232,6 +232,7 @@ func OIDCIDPConfigChangedAggregate(aggCreator *es_models.AggregateCreator, exist return agg.AppendEvent(model.OIDCIDPConfigChanged, changes) } } + func LabelPolicyAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, policy *model.LabelPolicy) func(ctx context.Context) (*es_models.Aggregate, error) { return func(ctx context.Context) (*es_models.Aggregate, error) { if policy == nil { @@ -678,6 +679,101 @@ func checkExistingLoginPolicyIDPProviderValidation(idpConfigID string) func(...* } } +func MailTemplateAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, template *model.MailTemplate) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if template == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-ZCfDS", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.IAMAggregate). + EventTypesFilter(model.MailTemplateAdded). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingMailTemplateValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.MailTemplateAdded, template) + } +} + +func checkExistingMailTemplateValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + for _, event := range events { + switch event.Type { + case model.MailTemplateAdded: + return errors.ThrowPreconditionFailed(nil, "EVENT-uKPiJ", "Errors.IAM.MailTemplate.AlreadyExists") + } + } + return nil + } +} + +func MailTemplateChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, template *model.MailTemplate) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if template == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-s4PVD", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + changes := existing.DefaultMailTemplate.Changes(template) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-hxxSm", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.MailTemplateChanged, changes) + } +} + +func MailTextAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.IAM, text *model.MailText) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if text == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-ZCfDS", "Errors.Internal") + } + agg, err := IAMAggregate(ctx, aggCreator, existing) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.IAMAggregate). + EventTypesFilter(model.MailTextAdded). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingMailTextValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.MailTextAdded, text) + } +} + +func checkExistingMailTextValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + for _, event := range events { + switch event.Type { + case model.MailTextAdded: + return errors.ThrowPreconditionFailed(nil, "EVENT-ijzeq", "Errors.IAM.MailText.AlreadyExists") + } + } + return nil + } +} + +func MailTextChangedAggregate(aggCreator *es_models.AggregateCreator, existingIAM *model.IAM, text *model.MailText) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if text == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-mgYpV", "Errors.Internal") + } + + agg, err := IAMAggregate(ctx, aggCreator, existingIAM) + if err != nil { + return nil, err + } + return agg.AppendEvent(model.MailTextChanged, text) + } +} + func checkExistingLoginPolicySecondFactorValidation(mfaType int32) func(...*es_models.Event) error { return func(events ...*es_models.Event) error { mfas := make([]int32, 0) diff --git a/internal/iam/repository/eventsourcing/model/iam.go b/internal/iam/repository/eventsourcing/model/iam.go index 464fa28f64..23478dfdbc 100644 --- a/internal/iam/repository/eventsourcing/model/iam.go +++ b/internal/iam/repository/eventsourcing/model/iam.go @@ -32,6 +32,8 @@ type IAM struct { IDPs []*IDPConfig `json:"-"` DefaultLoginPolicy *LoginPolicy `json:"-"` DefaultLabelPolicy *LabelPolicy `json:"-"` + DefaultMailTemplate *MailTemplate `json:"-"` + DefaultMailTexts []*MailText `json:"-"` DefaultOrgIAMPolicy *OrgIAMPolicy `json:"-"` DefaultPasswordComplexityPolicy *PasswordComplexityPolicy `json:"-"` DefaultPasswordAgePolicy *PasswordAgePolicy `json:"-"` @@ -41,14 +43,16 @@ type IAM struct { func IAMFromModel(iam *model.IAM) *IAM { members := IAMMembersFromModel(iam.Members) idps := IDPConfigsFromModel(iam.IDPs) + mailTexts := MailTextsFromModel(iam.DefaultMailTexts) converted := &IAM{ - ObjectRoot: iam.ObjectRoot, - SetUpStarted: Step(iam.SetUpStarted), - SetUpDone: Step(iam.SetUpDone), - GlobalOrgID: iam.GlobalOrgID, - IAMProjectID: iam.IAMProjectID, - Members: members, - IDPs: idps, + ObjectRoot: iam.ObjectRoot, + SetUpStarted: Step(iam.SetUpStarted), + SetUpDone: Step(iam.SetUpDone), + GlobalOrgID: iam.GlobalOrgID, + IAMProjectID: iam.IAMProjectID, + Members: members, + IDPs: idps, + DefaultMailTexts: mailTexts, } if iam.DefaultLoginPolicy != nil { converted.DefaultLoginPolicy = LoginPolicyFromModel(iam.DefaultLoginPolicy) @@ -56,6 +60,9 @@ func IAMFromModel(iam *model.IAM) *IAM { if iam.DefaultLabelPolicy != nil { converted.DefaultLabelPolicy = LabelPolicyFromModel(iam.DefaultLabelPolicy) } + if iam.DefaultMailTemplate != nil { + converted.DefaultMailTemplate = MailTemplateFromModel(iam.DefaultMailTemplate) + } if iam.DefaultPasswordComplexityPolicy != nil { converted.DefaultPasswordComplexityPolicy = PasswordComplexityPolicyFromModel(iam.DefaultPasswordComplexityPolicy) } @@ -74,6 +81,7 @@ func IAMFromModel(iam *model.IAM) *IAM { func IAMToModel(iam *IAM) *model.IAM { members := IAMMembersToModel(iam.Members) idps := IDPConfigsToModel(iam.IDPs) + mailTexts := MailTextsToModel(iam.DefaultMailTexts) converted := &model.IAM{ ObjectRoot: iam.ObjectRoot, SetUpStarted: domain.Step(iam.SetUpStarted), @@ -82,6 +90,7 @@ func IAMToModel(iam *IAM) *model.IAM { IAMProjectID: iam.IAMProjectID, Members: members, IDPs: idps, + DefaultMailTexts: mailTexts, } if iam.DefaultLoginPolicy != nil { converted.DefaultLoginPolicy = LoginPolicyToModel(iam.DefaultLoginPolicy) @@ -89,6 +98,9 @@ func IAMToModel(iam *IAM) *model.IAM { if iam.DefaultLabelPolicy != nil { converted.DefaultLabelPolicy = LabelPolicyToModel(iam.DefaultLabelPolicy) } + if iam.DefaultMailTemplate != nil { + converted.DefaultMailTemplate = MailTemplateToModel(iam.DefaultMailTemplate) + } if iam.DefaultPasswordComplexityPolicy != nil { converted.DefaultPasswordComplexityPolicy = PasswordComplexityPolicyToModel(iam.DefaultPasswordComplexityPolicy) } @@ -181,6 +193,14 @@ func (i *IAM) AppendEvent(event *es_models.Event) (err error) { return i.appendAddLabelPolicyEvent(event) case LabelPolicyChanged: return i.appendChangeLabelPolicyEvent(event) + case MailTemplateAdded: + return i.appendAddMailTemplateEvent(event) + case MailTemplateChanged: + return i.appendChangeMailTemplateEvent(event) + case MailTextAdded: + return i.appendAddMailTextEvent(event) + case MailTextChanged: + return i.appendChangeMailTextEvent(event) case PasswordComplexityPolicyAdded: return i.appendAddPasswordComplexityPolicyEvent(event) case PasswordComplexityPolicyChanged: diff --git a/internal/iam/repository/eventsourcing/model/mail_template.go b/internal/iam/repository/eventsourcing/model/mail_template.go new file mode 100644 index 0000000000..b328089abd --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/mail_template.go @@ -0,0 +1,64 @@ +package model + +import ( + b64 "encoding/base64" + "encoding/json" + + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_model "github.com/caos/zitadel/internal/iam/model" +) + +type MailTemplate struct { + models.ObjectRoot + State int32 `json:"-"` + Template []byte +} + +func MailTemplateToModel(template *MailTemplate) *iam_model.MailTemplate { + return &iam_model.MailTemplate{ + ObjectRoot: template.ObjectRoot, + State: iam_model.PolicyState(template.State), + Template: template.Template, + } +} + +func MailTemplateFromModel(template *iam_model.MailTemplate) *MailTemplate { + return &MailTemplate{ + ObjectRoot: template.ObjectRoot, + State: int32(template.State), + Template: template.Template, + } +} + +func (p *MailTemplate) Changes(changed *MailTemplate) map[string]interface{} { + changes := make(map[string]interface{}, 1) + if b64.StdEncoding.EncodeToString(changed.Template) != b64.StdEncoding.EncodeToString(p.Template) { + changes["template"] = b64.StdEncoding.EncodeToString(changed.Template) + } + + return changes +} + +func (i *IAM) appendAddMailTemplateEvent(event *es_models.Event) error { + i.DefaultMailTemplate = new(MailTemplate) + err := i.DefaultMailTemplate.SetDataLabel(event) + if err != nil { + return err + } + i.DefaultMailTemplate.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (i *IAM) appendChangeMailTemplateEvent(event *es_models.Event) error { + return i.DefaultMailTemplate.SetDataLabel(event) +} + +func (p *MailTemplate) SetDataLabel(event *es_models.Event) error { + err := json.Unmarshal(event.Data, p) + if err != nil { + return errors.ThrowInternal(err, "MODEL-ikjhf", "unable to unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/eventsourcing/model/mail_template_test.go b/internal/iam/repository/eventsourcing/model/mail_template_test.go new file mode 100644 index 0000000000..279a059865 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/mail_template_test.go @@ -0,0 +1,126 @@ +package model + +import ( + "encoding/json" + "testing" + + es_models "github.com/caos/zitadel/internal/eventstore/models" +) + +func TestMailTemplateChanges(t *testing.T) { + type args struct { + existing *MailTemplate + new *MailTemplate + } + type res struct { + changesLen int + } + tests := []struct { + name string + args args + res res + }{ + { + name: "mailtemplate all attributes change", + args: args{ + existing: &MailTemplate{Template: []byte("")}, + new: &MailTemplate{Template: []byte("")}, + }, + res: res{ + changesLen: 1, + }, + }, + { + name: "no changes", + args: args{ + existing: &MailTemplate{Template: []byte("")}, + new: &MailTemplate{Template: []byte("")}, + }, + res: res{ + changesLen: 0, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + changes := tt.args.existing.Changes(tt.args.new) + if len(changes) != tt.res.changesLen { + t.Errorf("got wrong changes len: expected: %v, actual: %v ", tt.res.changesLen, len(changes)) + } + }) + } +} + +func TestAppendAddMailTemplateEvent(t *testing.T) { + type args struct { + iam *IAM + policy *MailTemplate + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append add label policy event", + args: args{ + iam: new(IAM), + policy: &MailTemplate{Template: []byte("")}, + event: new(es_models.Event), + }, + result: &IAM{DefaultMailTemplate: &MailTemplate{Template: []byte("")}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendAddMailTemplateEvent(tt.args.event) + if string(tt.result.DefaultMailTemplate.Template) != string(tt.args.iam.DefaultMailTemplate.Template) { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultMailTemplate.Template, tt.args.iam.DefaultMailTemplate.Template) + } + }) + } +} + +func TestAppendChangeMailTemplateEvent(t *testing.T) { + type args struct { + iam *IAM + policy *MailTemplate + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append change label policy event", + args: args{ + iam: &IAM{DefaultMailTemplate: &MailTemplate{ + Template: []byte(""), + }}, + policy: &MailTemplate{Template: []byte("")}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultMailTemplate: &MailTemplate{ + Template: []byte(""), + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.iam.appendChangeMailTemplateEvent(tt.args.event) + if string(tt.result.DefaultMailTemplate.Template) != string(tt.args.iam.DefaultMailTemplate.Template) { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultMailTemplate.Template, tt.args.iam.DefaultMailTemplate.Template) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/model/mail_text.go b/internal/iam/repository/eventsourcing/model/mail_text.go new file mode 100644 index 0000000000..912be7a7a0 --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/mail_text.go @@ -0,0 +1,157 @@ +package model + +import ( + "encoding/json" + + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_model "github.com/caos/zitadel/internal/iam/model" +) + +type MailText struct { + models.ObjectRoot + State int32 `json:"-"` + MailTextType string + Language string + Title string + PreHeader string + Subject string + Greeting string + Text string + ButtonText string +} + +func GetMailText(mailTexts []*MailText, mailTextType string, language string) (int, *MailText) { + for i, m := range mailTexts { + if m.MailTextType == mailTextType && m.Language == language { + return i, m + } + } + return -1, nil +} + +func MailTextsToModel(mailTexts []*MailText) []*iam_model.MailText { + convertedMailTexts := make([]*iam_model.MailText, len(mailTexts)) + for i, m := range mailTexts { + convertedMailTexts[i] = MailTextToModel(m) + } + return convertedMailTexts +} + +func MailTextToModel(mailText *MailText) *iam_model.MailText { + return &iam_model.MailText{ + ObjectRoot: mailText.ObjectRoot, + State: iam_model.PolicyState(mailText.State), + MailTextType: mailText.MailTextType, + Language: mailText.Language, + Title: mailText.Title, + PreHeader: mailText.PreHeader, + Subject: mailText.Subject, + Greeting: mailText.Greeting, + Text: mailText.Text, + ButtonText: mailText.ButtonText, + } +} + +func MailTextsFromModel(mailTexts []*iam_model.MailText) []*MailText { + convertedMailTexts := make([]*MailText, len(mailTexts)) + for i, m := range mailTexts { + convertedMailTexts[i] = MailTextFromModel(m) + } + return convertedMailTexts +} + +func MailTextFromModel(mailText *iam_model.MailText) *MailText { + return &MailText{ + ObjectRoot: mailText.ObjectRoot, + State: int32(mailText.State), + MailTextType: mailText.MailTextType, + Language: mailText.Language, + Title: mailText.Title, + PreHeader: mailText.PreHeader, + Subject: mailText.Subject, + Greeting: mailText.Greeting, + Text: mailText.Text, + ButtonText: mailText.ButtonText, + } +} + +func (p *MailText) Changes(changed *MailText) map[string]interface{} { + changes := make(map[string]interface{}, 8) + + changes["mailTextType"] = changed.MailTextType + + changes["language"] = changed.Language + + if changed.Title != p.Title { + changes["title"] = changed.Title + } + + if changed.PreHeader != p.PreHeader { + changes["preHeader"] = changed.PreHeader + } + + if changed.Subject != p.Subject { + changes["subject"] = changed.Subject + } + + if changed.Greeting != p.Greeting { + changes["greeting"] = changed.Greeting + } + + if changed.Text != p.Text { + changes["text"] = changed.Text + } + + if changed.ButtonText != p.ButtonText { + changes["buttonText"] = changed.ButtonText + } + + return changes +} + +func (i *IAM) appendAddMailTextEvent(event *es_models.Event) error { + mailText := &MailText{} + err := mailText.SetDataLabel(event) + if err != nil { + return err + } + mailText.ObjectRoot.CreationDate = event.CreationDate + i.DefaultMailTexts = append(i.DefaultMailTexts, mailText) + return nil +} + +func (i *IAM) appendChangeMailTextEvent(event *es_models.Event) error { + mailText := &MailText{} + err := mailText.SetDataLabel(event) + if err != nil { + return err + } + if n, m := GetMailText(i.DefaultMailTexts, mailText.MailTextType, mailText.Language); m != nil { + i.DefaultMailTexts[n] = mailText + } + return nil +} + +func (i *IAM) appendRemoveMailTextEvent(event *es_models.Event) error { + mailText := &MailText{} + err := mailText.SetDataLabel(event) + if err != nil { + return err + } + if n, m := GetMailText(i.DefaultMailTexts, mailText.MailTextType, mailText.Language); m != nil { + i.DefaultMailTexts[n] = i.DefaultMailTexts[len(i.DefaultMailTexts)-1] + i.DefaultMailTexts[len(i.DefaultMailTexts)-1] = nil + i.DefaultMailTexts = i.DefaultMailTexts[:len(i.DefaultMailTexts)-1] + } + return nil +} + +func (p *MailText) SetDataLabel(event *es_models.Event) error { + err := json.Unmarshal(event.Data, p) + if err != nil { + return errors.ThrowInternal(err, "MODEL-3FUV5", "unable to unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/eventsourcing/model/mail_text_test.go b/internal/iam/repository/eventsourcing/model/mail_text_test.go new file mode 100644 index 0000000000..84f5d1189e --- /dev/null +++ b/internal/iam/repository/eventsourcing/model/mail_text_test.go @@ -0,0 +1,134 @@ +package model + +import ( + "encoding/json" + "testing" + + es_models "github.com/caos/zitadel/internal/eventstore/models" +) + +func TestAppendAddMailTextEvent(t *testing.T) { + type args struct { + iam *IAM + mailText *MailText + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append add mailText event", + args: args{ + iam: &IAM{}, + mailText: &MailText{ + MailTextType: "PasswordReset", + Language: "DE"}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultMailTexts: []*MailText{&MailText{ + MailTextType: "PasswordReset", + Language: "DE"}}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.mailText != nil { + data, _ := json.Marshal(tt.args.mailText) + tt.args.event.Data = data + } + tt.args.iam.appendAddMailTextEvent(tt.args.event) + if len(tt.args.iam.DefaultMailTexts) != 1 { + t.Errorf("got wrong result should have one mailText actual: %v ", len(tt.args.iam.DefaultMailTexts)) + } + if tt.args.iam.DefaultMailTexts[0] == tt.result.DefaultMailTexts[0] { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultMailTexts[0], tt.args.iam.DefaultMailTexts[0]) + } + }) + } +} + +func TestAppendChangeMailTextEvent(t *testing.T) { + type args struct { + iam *IAM + mailText *MailText + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append change mailText event", + args: args{ + iam: &IAM{DefaultMailTexts: []*MailText{&MailText{ + MailTextType: "PasswordReset", + Language: "DE"}}}, + mailText: &MailText{ + MailTextType: "ChangedPasswordReset", + Language: "DE"}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultMailTexts: []*MailText{&MailText{ + MailTextType: "PasswordReset", + Language: "ChangedDE"}}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.mailText != nil { + data, _ := json.Marshal(tt.args.mailText) + tt.args.event.Data = data + } + tt.args.iam.appendChangeMailTextEvent(tt.args.event) + if len(tt.args.iam.DefaultMailTexts) != 1 { + t.Errorf("got wrong result should have one mailText actual: %v ", len(tt.args.iam.DefaultMailTexts)) + } + if tt.args.iam.DefaultMailTexts[0] == tt.result.DefaultMailTexts[0] { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.DefaultMailTexts[0], tt.args.iam.DefaultMailTexts[0]) + } + }) + } +} + +func TestAppendRemoveMailTextEvent(t *testing.T) { + type args struct { + iam *IAM + mailText *MailText + event *es_models.Event + } + tests := []struct { + name string + args args + result *IAM + }{ + { + name: "append remove mailText event", + args: args{ + iam: &IAM{DefaultMailTexts: []*MailText{&MailText{ + MailTextType: "PasswordReset", + Language: "DE", + Subject: "Subject"}}}, + mailText: &MailText{ + MailTextType: "PasswordReset", + Language: "DE"}, + event: &es_models.Event{}, + }, + result: &IAM{DefaultMailTexts: []*MailText{}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.mailText != nil { + data, _ := json.Marshal(tt.args.mailText) + tt.args.event.Data = data + } + tt.args.iam.appendRemoveMailTextEvent(tt.args.event) + if len(tt.args.iam.DefaultMailTexts) != 0 { + t.Errorf("got wrong result should have no mailText actual: %v ", len(tt.args.iam.DefaultMailTexts)) + } + }) + } +} diff --git a/internal/iam/repository/eventsourcing/model/types.go b/internal/iam/repository/eventsourcing/model/types.go index fa2b1eb643..c558db062c 100644 --- a/internal/iam/repository/eventsourcing/model/types.go +++ b/internal/iam/repository/eventsourcing/model/types.go @@ -38,6 +38,11 @@ const ( LabelPolicyAdded models.EventType = "iam.policy.label.added" LabelPolicyChanged models.EventType = "iam.policy.label.changed" + MailTemplateAdded models.EventType = "iam.mail.template.added" + MailTemplateChanged models.EventType = "iam.mail.template.changed" + MailTextAdded models.EventType = "iam.mail.text.added" + MailTextChanged models.EventType = "iam.mail.text.changed" + PasswordComplexityPolicyAdded models.EventType = "iam.policy.password.complexity.added" PasswordComplexityPolicyChanged models.EventType = "iam.policy.password.complexity.changed" diff --git a/internal/iam/repository/view/idp_view.go b/internal/iam/repository/view/idp_view.go index 44fcd93edf..d6505a2180 100644 --- a/internal/iam/repository/view/idp_view.go +++ b/internal/iam/repository/view/idp_view.go @@ -11,8 +11,8 @@ import ( func IDPByID(db *gorm.DB, table, idpID string) (*model.IDPConfigView, error) { idp := new(model.IDPConfigView) - userIDQuery := &model.IDPConfigSearchQuery{Key: iam_model.IDPConfigSearchKeyIdpConfigID, Value: idpID, Method: global_model.SearchMethodEquals} - query := repository.PrepareGetByQuery(table, userIDQuery) + idpIDQuery := &model.IDPConfigSearchQuery{Key: iam_model.IDPConfigSearchKeyIdpConfigID, Value: idpID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, idpIDQuery) err := query(db, idp) if caos_errs.IsNotFound(err) { return nil, caos_errs.ThrowNotFound(nil, "VIEW-Ahq2s", "Errors.IAM.IdpNotExisting") diff --git a/internal/iam/repository/view/label_policy_view.go b/internal/iam/repository/view/label_policy_view.go index e77f3b1dc9..b294f44d42 100644 --- a/internal/iam/repository/view/label_policy_view.go +++ b/internal/iam/repository/view/label_policy_view.go @@ -11,8 +11,8 @@ import ( func GetLabelPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.LabelPolicyView, error) { policy := new(model.LabelPolicyView) - userIDQuery := &model.LabelPolicySearchQuery{Key: iam_model.LabelPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} - query := repository.PrepareGetByQuery(table, userIDQuery) + aggregateIDQuery := &model.LabelPolicySearchQuery{Key: iam_model.LabelPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, aggregateIDQuery) err := query(db, policy) if caos_errs.IsNotFound(err) { return nil, caos_errs.ThrowNotFound(nil, "VIEW-68G11", "Errors.IAM.LabelPolicy.NotExisting") diff --git a/internal/iam/repository/view/login_policy_view.go b/internal/iam/repository/view/login_policy_view.go index cbcd3beacf..dbcb30afea 100644 --- a/internal/iam/repository/view/login_policy_view.go +++ b/internal/iam/repository/view/login_policy_view.go @@ -11,8 +11,8 @@ import ( func GetLoginPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.LoginPolicyView, error) { policy := new(model.LoginPolicyView) - userIDQuery := &model.LoginPolicySearchQuery{Key: iam_model.LoginPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} - query := repository.PrepareGetByQuery(table, userIDQuery) + aggregateIDQuery := &model.LoginPolicySearchQuery{Key: iam_model.LoginPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, aggregateIDQuery) err := query(db, policy) if caos_errs.IsNotFound(err) { return nil, caos_errs.ThrowNotFound(nil, "VIEW-Lso0cs", "Errors.IAM.LoginPolicy.NotExisting") diff --git a/internal/iam/repository/view/mail_template_view.go b/internal/iam/repository/view/mail_template_view.go new file mode 100644 index 0000000000..dab453cb3b --- /dev/null +++ b/internal/iam/repository/view/mail_template_view.go @@ -0,0 +1,32 @@ +package view + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" +) + +func GetMailTemplateByAggregateID(db *gorm.DB, table, aggregateID string) (*model.MailTemplateView, error) { + template := new(model.MailTemplateView) + aggregateIDQuery := &model.MailTemplateSearchQuery{Key: iam_model.MailTemplateSearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, aggregateIDQuery) + err := query(db, template) + if caos_errs.IsNotFound(err) { + return nil, caos_errs.ThrowNotFound(nil, "VIEW-iPnmU", "Errors.IAM.MailTemplate.NotExisting") + } + return template, err +} + +func PutMailTemplate(db *gorm.DB, table string, template *model.MailTemplateView) error { + save := repository.PrepareSave(table) + return save(db, template) +} + +func DeleteMailTemplate(db *gorm.DB, table, aggregateID string) error { + delete := repository.PrepareDeleteByKey(table, model.MailTemplateSearchKey(iam_model.MailTemplateSearchKeyAggregateID), aggregateID) + + return delete(db) +} diff --git a/internal/iam/repository/view/mail_text_view.go b/internal/iam/repository/view/mail_text_view.go new file mode 100644 index 0000000000..31f440293a --- /dev/null +++ b/internal/iam/repository/view/mail_text_view.go @@ -0,0 +1,54 @@ +package view + +import ( + caos_errs "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" + "github.com/jinzhu/gorm" + "strings" +) + +func GetMailTexts(db *gorm.DB, table string, aggregateID string) ([]*model.MailTextView, error) { + texts := make([]*model.MailTextView, 0) + queries := []*iam_model.MailTextSearchQuery{ + { + Key: iam_model.MailTextSearchKeyAggregateID, + Value: aggregateID, + Method: global_model.SearchMethodEquals, + }, + } + query := repository.PrepareSearchQuery(table, model.MailTextSearchRequest{Queries: queries}) + _, err := query(db, &texts) + if err != nil { + return nil, err + } + return texts, nil +} + +func GetMailTextByIDs(db *gorm.DB, table, aggregateID string, textType string, language string) (*model.MailTextView, error) { + mailText := new(model.MailTextView) + aggregateIDQuery := &model.MailTextSearchQuery{Key: iam_model.MailTextSearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + textTypeQuery := &model.MailTextSearchQuery{Key: iam_model.MailTextSearchKeyMailTextType, Value: textType, Method: global_model.SearchMethodEquals} + languageQuery := &model.MailTextSearchQuery{Key: iam_model.MailTextSearchKeyLanguage, Value: strings.ToUpper(language), Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, aggregateIDQuery, textTypeQuery, languageQuery) + err := query(db, mailText) + if caos_errs.IsNotFound(err) { + return nil, caos_errs.ThrowNotFound(nil, "VIEW-IiJjm", "Errors.IAM.MailText.NotExisting") + } + return mailText, err +} + +func PutMailText(db *gorm.DB, table string, mailText *model.MailTextView) error { + save := repository.PrepareSave(table) + return save(db, mailText) +} + +func DeleteMailText(db *gorm.DB, table, aggregateID string, textType string, language string) error { + aggregateIDSearch := repository.Key{Key: model.MailTextSearchKey(iam_model.MailTextSearchKeyAggregateID), Value: aggregateID} + textTypeSearch := repository.Key{Key: model.MailTextSearchKey(iam_model.MailTextSearchKeyMailTextType), Value: textType} + languageSearch := repository.Key{Key: model.MailTextSearchKey(iam_model.MailTextSearchKeyLanguage), Value: language} + delete := repository.PrepareDeleteByKeys(table, aggregateIDSearch, textTypeSearch, languageSearch) + return delete(db) +} diff --git a/internal/iam/repository/view/model/mail_template.go b/internal/iam/repository/view/model/mail_template.go new file mode 100644 index 0000000000..29ab111d43 --- /dev/null +++ b/internal/iam/repository/view/model/mail_template.go @@ -0,0 +1,80 @@ +package model + +import ( + "encoding/json" + "time" + + org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + + es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/model" +) + +const ( + MailTemplateKeyAggregateID = "aggregate_id" +) + +type MailTemplateView struct { + AggregateID string `json:"-" gorm:"column:aggregate_id;primary_key"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:mail_template_state"` + + Template []byte `json:"template" gorm:"column:template"` + Default bool `json:"-" gorm:"-"` + + Sequence uint64 `json:"-" gorm:"column:sequence"` +} + +func MailTemplateViewFromModel(template *model.MailTemplateView) *MailTemplateView { + return &MailTemplateView{ + AggregateID: template.AggregateID, + Sequence: template.Sequence, + CreationDate: template.CreationDate, + ChangeDate: template.ChangeDate, + Template: template.Template, + Default: template.Default, + } +} + +func MailTemplateViewToModel(template *MailTemplateView) *model.MailTemplateView { + return &model.MailTemplateView{ + AggregateID: template.AggregateID, + Sequence: template.Sequence, + CreationDate: template.CreationDate, + ChangeDate: template.ChangeDate, + Template: template.Template, + Default: template.Default, + } +} + +func (i *MailTemplateView) AppendEvent(event *models.Event) (err error) { + i.Sequence = event.Sequence + i.ChangeDate = event.CreationDate + switch event.Type { + case es_model.MailTemplateAdded, org_es_model.MailTemplateAdded: + i.setRootData(event) + i.CreationDate = event.CreationDate + err = i.SetData(event) + case es_model.MailTemplateChanged, org_es_model.MailTemplateChanged: + i.ChangeDate = event.CreationDate + err = i.SetData(event) + } + return err +} + +func (r *MailTemplateView) setRootData(event *models.Event) { + r.AggregateID = event.AggregateID +} + +func (r *MailTemplateView) SetData(event *models.Event) error { + if err := json.Unmarshal(event.Data, r); err != nil { + logging.Log("MODEL-YDZmZ").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-sKWwO", "Could not unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/view/model/mail_template_query.go b/internal/iam/repository/view/model/mail_template_query.go new file mode 100644 index 0000000000..60eb11049e --- /dev/null +++ b/internal/iam/repository/view/model/mail_template_query.go @@ -0,0 +1,59 @@ +package model + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" +) + +type MailTemplateSearchRequest iam_model.MailTemplateSearchRequest +type MailTemplateSearchQuery iam_model.MailTemplateSearchQuery +type MailTemplateSearchKey iam_model.MailTemplateSearchKey + +func (req MailTemplateSearchRequest) GetLimit() uint64 { + return req.Limit +} + +func (req MailTemplateSearchRequest) GetOffset() uint64 { + return req.Offset +} + +func (req MailTemplateSearchRequest) GetSortingColumn() repository.ColumnKey { + if req.SortingColumn == iam_model.MailTemplateSearchKeyUnspecified { + return nil + } + return MailTemplateSearchKey(req.SortingColumn) +} + +func (req MailTemplateSearchRequest) GetAsc() bool { + return req.Asc +} + +func (req MailTemplateSearchRequest) GetQueries() []repository.SearchQuery { + result := make([]repository.SearchQuery, len(req.Queries)) + for i, q := range req.Queries { + result[i] = MailTemplateSearchQuery{Key: q.Key, Value: q.Value, Method: q.Method} + } + return result +} + +func (req MailTemplateSearchQuery) GetKey() repository.ColumnKey { + return MailTemplateSearchKey(req.Key) +} + +func (req MailTemplateSearchQuery) GetMethod() global_model.SearchMethod { + return req.Method +} + +func (req MailTemplateSearchQuery) GetValue() interface{} { + return req.Value +} + +func (key MailTemplateSearchKey) ToColumnName() string { + switch iam_model.MailTemplateSearchKey(key) { + case iam_model.MailTemplateSearchKeyAggregateID: + return MailTemplateKeyAggregateID + default: + return "" + } +} diff --git a/internal/iam/repository/view/model/mail_text.go b/internal/iam/repository/view/model/mail_text.go new file mode 100644 index 0000000000..959f9d3fce --- /dev/null +++ b/internal/iam/repository/view/model/mail_text.go @@ -0,0 +1,117 @@ +package model + +import ( + "encoding/json" + "time" + + org_es_model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" + + es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/logging" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/model" +) + +const ( + MailTextKeyAggregateID = "aggregate_id" + MailTextKeyMailTextType = "mail_text_type" + MailTextKeyLanguage = "language" +) + +type MailTextView struct { + AggregateID string `json:"-" gorm:"column:aggregate_id;primary_key"` + CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` + State int32 `json:"-" gorm:"column:mail_text_state"` + + MailTextType string `json:"mailTextType" gorm:"column:mail_text_type;primary_key"` + Language string `json:"language" gorm:"column:language;primary_key"` + Title string `json:"title" gorm:"column:title"` + PreHeader string `json:"preHeader" gorm:"column:pre_header"` + Subject string `json:"subject" gorm:"column:subject"` + Greeting string `json:"greeting" gorm:"column:greeting"` + Text string `json:"text" gorm:"column:text"` + ButtonText string `json:"buttonText" gorm:"column:button_text"` + Default bool `json:"-" gorm:"-"` + + Sequence uint64 `json:"-" gorm:"column:sequence"` +} + +func MailTextViewFromModel(template *model.MailTextView) *MailTextView { + return &MailTextView{ + AggregateID: template.AggregateID, + Sequence: template.Sequence, + CreationDate: template.CreationDate, + ChangeDate: template.ChangeDate, + MailTextType: template.MailTextType, + Language: template.Language, + Title: template.Title, + PreHeader: template.PreHeader, + Subject: template.Subject, + Greeting: template.Greeting, + Text: template.Text, + ButtonText: template.ButtonText, + Default: template.Default, + } +} + +func MailTextsViewToModel(textsIn []*MailTextView, defaultIn bool) *model.MailTextsView { + return &model.MailTextsView{ + Texts: mailTextsViewToModelArr(textsIn, defaultIn), + } +} + +func mailTextsViewToModelArr(texts []*MailTextView, defaultIn bool) []*model.MailTextView { + result := make([]*model.MailTextView, len(texts)) + for i, r := range texts { + r.Default = defaultIn + result[i] = MailTextViewToModel(r) + } + return result +} + +func MailTextViewToModel(template *MailTextView) *model.MailTextView { + return &model.MailTextView{ + AggregateID: template.AggregateID, + Sequence: template.Sequence, + CreationDate: template.CreationDate, + ChangeDate: template.ChangeDate, + MailTextType: template.MailTextType, + Language: template.Language, + Title: template.Title, + PreHeader: template.PreHeader, + Subject: template.Subject, + Greeting: template.Greeting, + Text: template.Text, + ButtonText: template.ButtonText, + Default: template.Default, + } +} + +func (i *MailTextView) AppendEvent(event *models.Event) (err error) { + i.Sequence = event.Sequence + switch event.Type { + case es_model.MailTextAdded, org_es_model.MailTextAdded: + i.setRootData(event) + i.CreationDate = event.CreationDate + err = i.SetData(event) + case es_model.MailTextChanged, org_es_model.MailTextChanged: + i.ChangeDate = event.CreationDate + err = i.SetData(event) + } + return err +} + +func (r *MailTextView) setRootData(event *models.Event) { + r.AggregateID = event.AggregateID +} + +func (r *MailTextView) SetData(event *models.Event) error { + if err := json.Unmarshal(event.Data, r); err != nil { + logging.Log("MODEL-UFqAG").WithError(err).Error("could not unmarshal event data") + return caos_errs.ThrowInternal(err, "MODEL-5CVaR", "Could not unmarshal data") + } + return nil +} diff --git a/internal/iam/repository/view/model/mail_text_query.go b/internal/iam/repository/view/model/mail_text_query.go new file mode 100644 index 0000000000..ed1d1a24aa --- /dev/null +++ b/internal/iam/repository/view/model/mail_text_query.go @@ -0,0 +1,63 @@ +package model + +import ( + iam_model "github.com/caos/zitadel/internal/iam/model" + global_model "github.com/caos/zitadel/internal/model" + "github.com/caos/zitadel/internal/view/repository" +) + +type MailTextSearchRequest iam_model.MailTextSearchRequest +type MailTextSearchQuery iam_model.MailTextSearchQuery +type MailTextSearchKey iam_model.MailTextSearchKey + +func (req MailTextSearchRequest) GetLimit() uint64 { + return req.Limit +} + +func (req MailTextSearchRequest) GetOffset() uint64 { + return req.Offset +} + +func (req MailTextSearchRequest) GetSortingColumn() repository.ColumnKey { + if req.SortingColumn == iam_model.MailTextSearchKeyUnspecified { + return nil + } + return MailTextSearchKey(req.SortingColumn) +} + +func (req MailTextSearchRequest) GetAsc() bool { + return req.Asc +} + +func (req MailTextSearchRequest) GetQueries() []repository.SearchQuery { + result := make([]repository.SearchQuery, len(req.Queries)) + for i, q := range req.Queries { + result[i] = MailTextSearchQuery{Key: q.Key, Value: q.Value, Method: q.Method} + } + return result +} + +func (req MailTextSearchQuery) GetKey() repository.ColumnKey { + return MailTextSearchKey(req.Key) +} + +func (req MailTextSearchQuery) GetMethod() global_model.SearchMethod { + return req.Method +} + +func (req MailTextSearchQuery) GetValue() interface{} { + return req.Value +} + +func (key MailTextSearchKey) ToColumnName() string { + switch iam_model.MailTextSearchKey(key) { + case iam_model.MailTextSearchKeyAggregateID: + return MailTextKeyAggregateID + case iam_model.MailTextSearchKeyMailTextType: + return MailTextKeyMailTextType + case iam_model.MailTextSearchKeyLanguage: + return MailTextKeyLanguage + default: + return "" + } +} diff --git a/internal/iam/repository/view/org_iam_policy_view.go b/internal/iam/repository/view/org_iam_policy_view.go index 322697ec2f..574081bc40 100644 --- a/internal/iam/repository/view/org_iam_policy_view.go +++ b/internal/iam/repository/view/org_iam_policy_view.go @@ -11,8 +11,8 @@ import ( func GetOrgIAMPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.OrgIAMPolicyView, error) { policy := new(model.OrgIAMPolicyView) - userIDQuery := &model.OrgIAMPolicySearchQuery{Key: iam_model.OrgIAMPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} - query := repository.PrepareGetByQuery(table, userIDQuery) + aggregateIDQuery := &model.OrgIAMPolicySearchQuery{Key: iam_model.OrgIAMPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, aggregateIDQuery) err := query(db, policy) if caos_errs.IsNotFound(err) { return nil, caos_errs.ThrowNotFound(nil, "VIEW-5fi9s", "Errors.IAM.OrgIAMPolicy.NotExisting") diff --git a/internal/iam/repository/view/password_age_policy_view.go b/internal/iam/repository/view/password_age_policy_view.go index 1fbd8c0ca1..eb85938edc 100644 --- a/internal/iam/repository/view/password_age_policy_view.go +++ b/internal/iam/repository/view/password_age_policy_view.go @@ -11,8 +11,8 @@ import ( func GetPasswordAgePolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.PasswordAgePolicyView, error) { policy := new(model.PasswordAgePolicyView) - userIDQuery := &model.PasswordAgePolicySearchQuery{Key: iam_model.PasswordAgePolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} - query := repository.PrepareGetByQuery(table, userIDQuery) + aggregateIDQuery := &model.PasswordAgePolicySearchQuery{Key: iam_model.PasswordAgePolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, aggregateIDQuery) err := query(db, policy) if caos_errs.IsNotFound(err) { return nil, caos_errs.ThrowNotFound(nil, "VIEW-Lso0cs", "Errors.IAM.PasswordAgePolicy.NotExisting") diff --git a/internal/iam/repository/view/password_complexity_policy_view.go b/internal/iam/repository/view/password_complexity_policy_view.go index 938c73ff75..75713cead9 100644 --- a/internal/iam/repository/view/password_complexity_policy_view.go +++ b/internal/iam/repository/view/password_complexity_policy_view.go @@ -11,8 +11,8 @@ import ( func GetPasswordComplexityPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.PasswordComplexityPolicyView, error) { policy := new(model.PasswordComplexityPolicyView) - userIDQuery := &model.PasswordComplexityPolicySearchQuery{Key: iam_model.PasswordComplexityPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} - query := repository.PrepareGetByQuery(table, userIDQuery) + aggregateIDQuery := &model.PasswordComplexityPolicySearchQuery{Key: iam_model.PasswordComplexityPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, aggregateIDQuery) err := query(db, policy) if caos_errs.IsNotFound(err) { return nil, caos_errs.ThrowNotFound(nil, "VIEW-Lso0cs", "Errors.IAM.PasswordComplexityPolicy.NotExisting") diff --git a/internal/iam/repository/view/password_lockout_policy_view.go b/internal/iam/repository/view/password_lockout_policy_view.go index 74f95204c8..e5bdc9922e 100644 --- a/internal/iam/repository/view/password_lockout_policy_view.go +++ b/internal/iam/repository/view/password_lockout_policy_view.go @@ -11,8 +11,8 @@ import ( func GetPasswordLockoutPolicyByAggregateID(db *gorm.DB, table, aggregateID string) (*model.PasswordLockoutPolicyView, error) { policy := new(model.PasswordLockoutPolicyView) - userIDQuery := &model.PasswordLockoutPolicySearchQuery{Key: iam_model.PasswordLockoutPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} - query := repository.PrepareGetByQuery(table, userIDQuery) + aggregateIDQuery := &model.PasswordLockoutPolicySearchQuery{Key: iam_model.PasswordLockoutPolicySearchKeyAggregateID, Value: aggregateID, Method: global_model.SearchMethodEquals} + query := repository.PrepareGetByQuery(table, aggregateIDQuery) err := query(db, policy) if caos_errs.IsNotFound(err) { return nil, caos_errs.ThrowNotFound(nil, "VIEW-Lso0cs", "Errors.IAM.PasswordLockoutPolicy.NotExisting") diff --git a/internal/management/repository/eventsourcing/eventstore/org.go b/internal/management/repository/eventsourcing/eventstore/org.go index 4cd80676aa..c236e55358 100644 --- a/internal/management/repository/eventsourcing/eventstore/org.go +++ b/internal/management/repository/eventsourcing/eventstore/org.go @@ -108,7 +108,7 @@ func (repo *OrgRepository) GetMyOrgIamPolicy(ctx context.Context) (*iam_model.Or func (repo *OrgRepository) SearchMyOrgDomains(ctx context.Context, request *org_model.OrgDomainSearchRequest) (*org_model.OrgDomainSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) request.Queries = append(request.Queries, &org_model.OrgDomainSearchQuery{Key: org_model.OrgDomainSearchKeyOrgID, Method: global_model.SearchMethodEquals, Value: authz.GetCtxData(ctx).OrgID}) - sequence, sequenceErr := repo.View.GetLatestOrgDomainSequence("") + sequence, sequenceErr := repo.View.GetLatestOrgDomainSequence() logging.Log("EVENT-SLowp").OnError(sequenceErr).WithField("traceID", tracing.TraceIDFromCtx(ctx)).Warn("could not read latest org domain sequence") domains, count, err := repo.View.SearchOrgDomains(request) if err != nil { @@ -205,7 +205,7 @@ func (repo *OrgRepository) RemoveMyOrgMember(ctx context.Context, userID string) func (repo *OrgRepository) SearchMyOrgMembers(ctx context.Context, request *org_model.OrgMemberSearchRequest) (*org_model.OrgMemberSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) request.Queries[len(request.Queries)-1] = &org_model.OrgMemberSearchQuery{Key: org_model.OrgMemberSearchKeyOrgID, Method: global_model.SearchMethodEquals, Value: authz.GetCtxData(ctx).OrgID} - sequence, sequenceErr := repo.View.GetLatestOrgMemberSequence("") + sequence, sequenceErr := repo.View.GetLatestOrgMemberSequence() logging.Log("EVENT-Smu3d").OnError(sequenceErr).Warn("could not read latest org member sequence") members, count, err := repo.View.SearchOrgMembers(request) if err != nil { @@ -292,7 +292,7 @@ func (repo *OrgRepository) SearchIDPConfigs(ctx context.Context, request *iam_mo request.EnsureLimit(repo.SearchLimit) request.AppendMyOrgQuery(authz.GetCtxData(ctx).OrgID, repo.SystemDefaults.IamID) - sequence, sequenceErr := repo.View.GetLatestIDPConfigSequence("") + sequence, sequenceErr := repo.View.GetLatestIDPConfigSequence() logging.Log("EVENT-Dk8si").OnError(sequenceErr).Warn("could not read latest idp config sequence") idps, count, err := repo.View.SearchIDPConfigs(request) if err != nil { @@ -414,7 +414,7 @@ func (repo *OrgRepository) SearchIDPProviders(ctx context.Context, request *iam_ request.AppendAggregateIDQuery(authz.GetCtxData(ctx).OrgID) } request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestIDPProviderSequence("") + sequence, sequenceErr := repo.View.GetLatestIDPProviderSequence() logging.Log("EVENT-Tuiks").OnError(sequenceErr).Warn("could not read latest iam sequence") providers, count, err := repo.View.SearchIDPProviders(request) if err != nil { @@ -703,3 +703,83 @@ func (repo *OrgRepository) RemovePasswordLockoutPolicy(ctx context.Context) erro }} return repo.OrgEventstore.RemovePasswordLockoutPolicy(ctx, policy) } + +func (repo *OrgRepository) GetDefaultMailTemplate(ctx context.Context) (*iam_model.MailTemplateView, error) { + template, err := repo.View.MailTemplateByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + template.Default = true + return iam_es_model.MailTemplateViewToModel(template), err +} + +func (repo *OrgRepository) GetMailTemplate(ctx context.Context) (*iam_model.MailTemplateView, error) { + template, err := repo.View.MailTemplateByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) { + template, err = repo.View.MailTemplateByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + template.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.MailTemplateViewToModel(template), err +} + +func (repo *OrgRepository) AddMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) { + template.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.AddMailTemplate(ctx, template) +} + +func (repo *OrgRepository) ChangeMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) { + template.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.ChangeMailTemplate(ctx, template) +} + +func (repo *OrgRepository) RemoveMailTemplate(ctx context.Context) error { + template := &iam_model.MailTemplate{ObjectRoot: models.ObjectRoot{ + AggregateID: authz.GetCtxData(ctx).OrgID, + }} + return repo.OrgEventstore.RemoveMailTemplate(ctx, template) +} + +func (repo *OrgRepository) GetDefaultMailTexts(ctx context.Context) (*iam_model.MailTextsView, error) { + texts, err := repo.View.MailTextsByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + return iam_es_model.MailTextsViewToModel(texts, true), err +} + +func (repo *OrgRepository) GetMailTexts(ctx context.Context) (*iam_model.MailTextsView, error) { + defaultIn := false + texts, err := repo.View.MailTextsByAggregateID(authz.GetCtxData(ctx).OrgID) + if errors.IsNotFound(err) || len(texts) == 0 { + texts, err = repo.View.MailTextsByAggregateID(repo.SystemDefaults.IamID) + if err != nil { + return nil, err + } + defaultIn = true + } + if err != nil { + return nil, err + } + return iam_es_model.MailTextsViewToModel(texts, defaultIn), err +} + +func (repo *OrgRepository) AddMailText(ctx context.Context, text *iam_model.MailText) (*iam_model.MailText, error) { + text.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.AddMailText(ctx, text) +} + +func (repo *OrgRepository) ChangeMailText(ctx context.Context, text *iam_model.MailText) (*iam_model.MailText, error) { + text.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.ChangeMailText(ctx, text) +} + +func (repo *OrgRepository) RemoveMailText(ctx context.Context, text *iam_model.MailText) error { + text.AggregateID = authz.GetCtxData(ctx).OrgID + return repo.OrgEventstore.RemoveMailText(ctx, text) +} diff --git a/internal/management/repository/eventsourcing/eventstore/project.go b/internal/management/repository/eventsourcing/eventstore/project.go index 25c980366d..a014a8e7ec 100644 --- a/internal/management/repository/eventsourcing/eventstore/project.go +++ b/internal/management/repository/eventsourcing/eventstore/project.go @@ -65,7 +65,7 @@ func (repo *ProjectRepo) ProjectByID(ctx context.Context, id string) (*proj_mode func (repo *ProjectRepo) SearchProjects(ctx context.Context, request *proj_model.ProjectViewSearchRequest) (*proj_model.ProjectViewSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestProjectSequence("") + sequence, sequenceErr := repo.View.GetLatestProjectSequence() logging.Log("EVENT-Edc56").OnError(sequenceErr).Warn("could not read latest project sequence") permissions := authz.GetRequestPermissionsFromCtx(ctx) @@ -132,7 +132,7 @@ func (repo *ProjectRepo) ProjectMemberByID(ctx context.Context, projectID, userI func (repo *ProjectRepo) SearchProjectMembers(ctx context.Context, request *proj_model.ProjectMemberSearchRequest) (*proj_model.ProjectMemberSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestProjectMemberSequence("") + sequence, sequenceErr := repo.View.GetLatestProjectMemberSequence() logging.Log("EVENT-3dgt6").OnError(sequenceErr).Warn("could not read latest project member sequence") members, count, err := repo.View.SearchProjectMembers(request) if err != nil { @@ -154,7 +154,7 @@ func (repo *ProjectRepo) SearchProjectMembers(ctx context.Context, request *proj func (repo *ProjectRepo) SearchProjectRoles(ctx context.Context, projectID string, request *proj_model.ProjectRoleSearchRequest) (*proj_model.ProjectRoleSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) request.AppendProjectQuery(projectID) - sequence, sequenceErr := repo.View.GetLatestProjectRoleSequence("") + sequence, sequenceErr := repo.View.GetLatestProjectRoleSequence() logging.Log("LSp0d-47suf").OnError(sequenceErr).Warn("could not read latest project role sequence") roles, count, err := repo.View.SearchProjectRoles(request) if err != nil { @@ -229,7 +229,7 @@ func (repo *ProjectRepo) ApplicationByID(ctx context.Context, projectID, appID s func (repo *ProjectRepo) SearchApplications(ctx context.Context, request *proj_model.ApplicationSearchRequest) (*proj_model.ApplicationSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestApplicationSequence("") + sequence, sequenceErr := repo.View.GetLatestApplicationSequence() logging.Log("EVENT-SKe8s").OnError(sequenceErr).Warn("could not read latest application sequence") apps, count, err := repo.View.SearchApplications(request) if err != nil { @@ -282,7 +282,7 @@ func (repo *ProjectRepo) ProjectGrantByID(ctx context.Context, grantID string) ( func (repo *ProjectRepo) SearchProjectGrants(ctx context.Context, request *proj_model.ProjectGrantViewSearchRequest) (*proj_model.ProjectGrantViewSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestProjectGrantSequence("") + sequence, sequenceErr := repo.View.GetLatestProjectGrantSequence() logging.Log("EVENT-Skw9f").OnError(sequenceErr).Warn("could not read latest project grant sequence") projects, count, err := repo.View.SearchProjectGrants(request) if err != nil { @@ -303,7 +303,7 @@ func (repo *ProjectRepo) SearchProjectGrants(ctx context.Context, request *proj_ func (repo *ProjectRepo) SearchGrantedProjects(ctx context.Context, request *proj_model.ProjectGrantViewSearchRequest) (*proj_model.ProjectGrantViewSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestProjectGrantSequence("") + sequence, sequenceErr := repo.View.GetLatestProjectGrantSequence() logging.Log("EVENT-Skw9f").OnError(sequenceErr).Warn("could not read latest project grant sequence") permissions := authz.GetRequestPermissionsFromCtx(ctx) @@ -362,7 +362,7 @@ func (repo *ProjectRepo) ProjectGrantMemberByID(ctx context.Context, projectID, func (repo *ProjectRepo) SearchProjectGrantMembers(ctx context.Context, request *proj_model.ProjectGrantMemberSearchRequest) (*proj_model.ProjectGrantMemberSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestProjectGrantMemberSequence("") + sequence, sequenceErr := repo.View.GetLatestProjectGrantMemberSequence() logging.Log("EVENT-Du8sk").OnError(sequenceErr).Warn("could not read latest project grant sequence") members, count, err := repo.View.SearchProjectGrantMembers(request) if err != nil { diff --git a/internal/management/repository/eventsourcing/eventstore/user.go b/internal/management/repository/eventsourcing/eventstore/user.go index b586d87504..9368470587 100644 --- a/internal/management/repository/eventsourcing/eventstore/user.go +++ b/internal/management/repository/eventsourcing/eventstore/user.go @@ -59,7 +59,7 @@ func (repo *UserRepo) UserByID(ctx context.Context, id string) (*usr_model.UserV func (repo *UserRepo) SearchUsers(ctx context.Context, request *usr_model.UserSearchRequest) (*usr_model.UserSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestUserSequence("") + sequence, sequenceErr := repo.View.GetLatestUserSequence() logging.Log("EVENT-Lcn7d").OnError(sequenceErr).Warn("could not read latest user sequence") users, count, err := repo.View.SearchUsers(request) if err != nil { @@ -145,7 +145,7 @@ func (repo *UserRepo) ProfileByID(ctx context.Context, userID string) (*usr_mode func (repo *UserRepo) SearchExternalIDPs(ctx context.Context, request *usr_model.ExternalIDPSearchRequest) (*usr_model.ExternalIDPSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, seqErr := repo.View.GetLatestExternalIDPSequence("") + sequence, seqErr := repo.View.GetLatestExternalIDPSequence() logging.Log("EVENT-Qs7uf").OnError(seqErr).Warn("could not read latest external idp sequence") externalIDPS, count, err := repo.View.SearchExternalIDPs(request) if err != nil { @@ -174,7 +174,7 @@ func (repo *UserRepo) GetMachineKey(ctx context.Context, userID, keyID string) ( func (repo *UserRepo) SearchMachineKeys(ctx context.Context, request *usr_model.MachineKeySearchRequest) (*usr_model.MachineKeySearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, seqErr := repo.View.GetLatestMachineKeySequence("") + sequence, seqErr := repo.View.GetLatestMachineKeySequence() logging.Log("EVENT-Sk8fs").OnError(seqErr).Warn("could not read latest user sequence") keys, count, err := repo.View.SearchMachineKeys(request) if err != nil { @@ -228,7 +228,7 @@ func (repo *UserRepo) AddressByID(ctx context.Context, userID string) (*usr_mode func (repo *UserRepo) SearchUserMemberships(ctx context.Context, request *usr_model.UserMembershipSearchRequest) (*usr_model.UserMembershipSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestUserMembershipSequence("") + sequence, sequenceErr := repo.View.GetLatestUserMembershipSequence() logging.Log("EVENT-Dn7sf").OnError(sequenceErr).Warn("could not read latest user sequence") result := handleSearchUserMembershipsPermissions(ctx, request, sequence) diff --git a/internal/management/repository/eventsourcing/eventstore/user_grant.go b/internal/management/repository/eventsourcing/eventstore/user_grant.go index e79e325e6a..878385be54 100644 --- a/internal/management/repository/eventsourcing/eventstore/user_grant.go +++ b/internal/management/repository/eventsourcing/eventstore/user_grant.go @@ -45,7 +45,7 @@ func (repo *UserGrantRepo) UserGrantsByUserID(ctx context.Context, userID string func (repo *UserGrantRepo) SearchUserGrants(ctx context.Context, request *grant_model.UserGrantSearchRequest) (*grant_model.UserGrantSearchResponse, error) { request.EnsureLimit(repo.SearchLimit) - sequence, sequenceErr := repo.View.GetLatestUserGrantSequence("") + sequence, sequenceErr := repo.View.GetLatestUserGrantSequence() logging.Log("EVENT-5Viwf").OnError(sequenceErr).Warn("could not read latest user grant sequence") result := handleSearchUserGrantPermissions(ctx, request, sequence) diff --git a/internal/management/repository/eventsourcing/handler/application.go b/internal/management/repository/eventsourcing/handler/application.go index 442eae59b3..c18a055728 100644 --- a/internal/management/repository/eventsourcing/handler/application.go +++ b/internal/management/repository/eventsourcing/handler/application.go @@ -56,8 +56,8 @@ func (_ *Application) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.ProjectAggregate} } -func (a *Application) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := a.view.GetLatestApplicationSequence(string(event.AggregateType)) +func (a *Application) CurrentSequence() (uint64, error) { + sequence, err := a.view.GetLatestApplicationSequence() if err != nil { return 0, err } @@ -65,7 +65,7 @@ func (a *Application) CurrentSequence(event *models.Event) (uint64, error) { } func (a *Application) EventQuery() (*models.SearchQuery, error) { - sequence, err := a.view.GetLatestApplicationSequence("") + sequence, err := a.view.GetLatestApplicationSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/handler.go b/internal/management/repository/eventsourcing/handler/handler.go index addd360caf..adf3ec26fd 100644 --- a/internal/management/repository/eventsourcing/handler/handler.go +++ b/internal/management/repository/eventsourcing/handler/handler.go @@ -103,6 +103,10 @@ func Register(configs Configs, bulkLimit, errorCount uint64, view *view.View, es handler{view, bulkLimit, configs.cycleDuration("PasswordLockoutPolicy"), errorCount, es}), newOrgIAMPolicy( handler{view, bulkLimit, configs.cycleDuration("OrgIAMPolicy"), errorCount, es}), + newMailTemplate( + handler{view, bulkLimit, configs.cycleDuration("MailTemplate"), errorCount, es}), + newMailText( + handler{view, bulkLimit, configs.cycleDuration("MailText"), errorCount, es}), } } diff --git a/internal/management/repository/eventsourcing/handler/idp_config.go b/internal/management/repository/eventsourcing/handler/idp_config.go index 5fa73038e5..5f86992807 100644 --- a/internal/management/repository/eventsourcing/handler/idp_config.go +++ b/internal/management/repository/eventsourcing/handler/idp_config.go @@ -2,8 +2,8 @@ package handler import ( "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -49,8 +49,8 @@ func (_ *IDPConfig) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (m *IDPConfig) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := m.view.GetLatestIDPConfigSequence(string(event.AggregateType)) +func (m *IDPConfig) CurrentSequence() (uint64, error) { + sequence, err := m.view.GetLatestIDPConfigSequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (m *IDPConfig) CurrentSequence(event *models.Event) (uint64, error) { } func (m *IDPConfig) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := m.view.GetLatestIDPConfigSequence("") + sequence, err := m.view.GetLatestIDPConfigSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/idp_providers.go b/internal/management/repository/eventsourcing/handler/idp_providers.go index 1b5933917b..89d82a1d47 100644 --- a/internal/management/repository/eventsourcing/handler/idp_providers.go +++ b/internal/management/repository/eventsourcing/handler/idp_providers.go @@ -64,8 +64,8 @@ func (_ *IDPProvider) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.IAMAggregate, org_es_model.OrgAggregate} } -func (m *IDPProvider) CurrentSequence(event *es_models.Event) (uint64, error) { - sequence, err := m.view.GetLatestIDPProviderSequence(string(event.AggregateType)) +func (m *IDPProvider) CurrentSequence() (uint64, error) { + sequence, err := m.view.GetLatestIDPProviderSequence() if err != nil { return 0, err } @@ -73,7 +73,7 @@ func (m *IDPProvider) CurrentSequence(event *es_models.Event) (uint64, error) { } func (m *IDPProvider) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := m.view.GetLatestIDPProviderSequence("") + sequence, err := m.view.GetLatestIDPProviderSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/label_policy.go b/internal/management/repository/eventsourcing/handler/label_policy.go index 2cc3ba833e..b56cadbd8a 100644 --- a/internal/management/repository/eventsourcing/handler/label_policy.go +++ b/internal/management/repository/eventsourcing/handler/label_policy.go @@ -48,8 +48,8 @@ func (_ *LabelPolicy) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (m *LabelPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := m.view.GetLatestLabelPolicySequence(string(event.AggregateType)) +func (m *LabelPolicy) CurrentSequence() (uint64, error) { + sequence, err := m.view.GetLatestLabelPolicySequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (m *LabelPolicy) CurrentSequence(event *models.Event) (uint64, error) { } func (m *LabelPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := m.view.GetLatestLabelPolicySequence("") + sequence, err := m.view.GetLatestLabelPolicySequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/login_policy.go b/internal/management/repository/eventsourcing/handler/login_policy.go index cf8994ff1e..c5a1eae408 100644 --- a/internal/management/repository/eventsourcing/handler/login_policy.go +++ b/internal/management/repository/eventsourcing/handler/login_policy.go @@ -48,8 +48,8 @@ func (_ *LoginPolicy) AggregateTypes() []models.AggregateType { return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (m *LoginPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := m.view.GetLatestLoginPolicySequence(string(event.AggregateType)) +func (m *LoginPolicy) CurrentSequence() (uint64, error) { + sequence, err := m.view.GetLatestLoginPolicySequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (m *LoginPolicy) CurrentSequence(event *models.Event) (uint64, error) { } func (m *LoginPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := m.view.GetLatestLoginPolicySequence("") + sequence, err := m.view.GetLatestLoginPolicySequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/machine_keys.go b/internal/management/repository/eventsourcing/handler/machine_keys.go index 6758c4f173..cabe5f0cdf 100644 --- a/internal/management/repository/eventsourcing/handler/machine_keys.go +++ b/internal/management/repository/eventsourcing/handler/machine_keys.go @@ -49,8 +49,8 @@ func (_ *MachineKeys) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.UserAggregate} } -func (k *MachineKeys) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := k.view.GetLatestMachineKeySequence(string(event.AggregateType)) +func (k *MachineKeys) CurrentSequence() (uint64, error) { + sequence, err := k.view.GetLatestMachineKeySequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (k *MachineKeys) CurrentSequence(event *models.Event) (uint64, error) { } func (d *MachineKeys) EventQuery() (*models.SearchQuery, error) { - sequence, err := d.view.GetLatestMachineKeySequence("") + sequence, err := d.view.GetLatestMachineKeySequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/mail_template.go b/internal/management/repository/eventsourcing/handler/mail_template.go new file mode 100644 index 0000000000..14b529193c --- /dev/null +++ b/internal/management/repository/eventsourcing/handler/mail_template.go @@ -0,0 +1,107 @@ +package handler + +import ( + "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/query" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type MailTemplate struct { + handler + subscription *eventstore.Subscription +} + +func newMailTemplate(handler handler) *MailTemplate { + h := &MailTemplate{ + handler: handler, + } + + h.subscribe() + + return h +} + +func (m *MailTemplate) subscribe() { + m.subscription = m.es.Subscribe(m.AggregateTypes()...) + go func() { + for event := range m.subscription.Events { + query.ReduceEvent(m, event) + } + }() +} + +const ( + mailTemplateTable = "management.mail_templates" +) + +func (m *MailTemplate) ViewModel() string { + return mailTemplateTable +} + +func (_ *MailTemplate) AggregateTypes() []es_models.AggregateType { + return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} +} + +func (p *MailTemplate) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestMailTemplateSequence() + if err != nil { + return 0, err + } + return sequence.CurrentSequence, nil +} + +func (m *MailTemplate) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestMailTemplateSequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(m.AggregateTypes()...). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *MailTemplate) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processMailTemplate(event) + } + return err +} + +func (m *MailTemplate) processMailTemplate(event *models.Event) (err error) { + template := new(iam_model.MailTemplateView) + switch event.Type { + case iam_es_model.MailTemplateAdded, model.MailTemplateAdded: + err = template.AppendEvent(event) + case iam_es_model.MailTemplateChanged, model.MailTemplateChanged: + template, err = m.view.MailTemplateByAggregateID(event.AggregateID) + if err != nil { + return err + } + err = template.AppendEvent(event) + case model.MailTemplateRemoved: + return m.view.DeleteMailTemplate(event.AggregateID, event) + default: + return m.view.ProcessedMailTemplateSequence(event) + } + if err != nil { + return err + } + return m.view.PutMailTemplate(template, event) +} + +func (m *MailTemplate) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-4Djo9", "id", event.AggregateID).WithError(err).Warn("something went wrong in label template handler") + return spooler.HandleError(event, err, m.view.GetLatestMailTemplateFailedEvent, m.view.ProcessedMailTemplateFailedEvent, m.view.ProcessedMailTemplateSequence, m.errorCountUntilSkip) +} + +func (o *MailTemplate) OnSuccess() error { + return spooler.HandleSuccess(o.view.UpdateMailTemplateSpoolerRunTimestamp) +} diff --git a/internal/management/repository/eventsourcing/handler/mail_text.go b/internal/management/repository/eventsourcing/handler/mail_text.go new file mode 100644 index 0000000000..9cf65a2e28 --- /dev/null +++ b/internal/management/repository/eventsourcing/handler/mail_text.go @@ -0,0 +1,113 @@ +package handler + +import ( + "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + + "github.com/caos/zitadel/internal/eventstore/models" + es_models "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/eventstore/query" + "github.com/caos/zitadel/internal/eventstore/spooler" + iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +type MailText struct { + handler + subscription *eventstore.Subscription +} + +func newMailText(handler handler) *MailText { + h := &MailText{ + handler: handler, + } + + h.subscribe() + + return h +} + +func (m *MailText) subscribe() { + m.subscription = m.es.Subscribe(m.AggregateTypes()...) + go func() { + for event := range m.subscription.Events { + query.ReduceEvent(m, event) + } + }() +} + +const ( + mailTextTable = "management.mail_texts" +) + +func (m *MailText) ViewModel() string { + return mailTextTable +} + +func (_ *MailText) AggregateTypes() []es_models.AggregateType { + return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} +} + +func (p *MailText) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestMailTextSequence() + if err != nil { + return 0, err + } + return sequence.CurrentSequence, nil +} + +func (m *MailText) EventQuery() (*models.SearchQuery, error) { + sequence, err := m.view.GetLatestMailTextSequence() + if err != nil { + return nil, err + } + return es_models.NewSearchQuery(). + AggregateTypeFilter(m.AggregateTypes()...). + LatestSequenceFilter(sequence.CurrentSequence), nil +} + +func (m *MailText) Reduce(event *models.Event) (err error) { + switch event.AggregateType { + case model.OrgAggregate, iam_es_model.IAMAggregate: + err = m.processMailText(event) + } + return err +} + +func (m *MailText) processMailText(event *models.Event) (err error) { + text := new(iam_model.MailTextView) + switch event.Type { + case iam_es_model.MailTextAdded, model.MailTextAdded: + err = text.AppendEvent(event) + case iam_es_model.MailTextChanged, model.MailTextChanged: + err = text.SetData(event) + if err != nil { + return err + } + text, err = m.view.MailTextByIDs(event.AggregateID, text.MailTextType, text.Language) + if err != nil { + return err + } + text.ChangeDate = event.CreationDate + err = text.AppendEvent(event) + case model.MailTextRemoved: + err = text.SetData(event) + return m.view.DeleteMailText(event.AggregateID, text.MailTextType, text.Language, event) + default: + return m.view.ProcessedMailTextSequence(event) + } + if err != nil { + return err + } + return m.view.PutMailText(text, event) +} + +func (m *MailText) OnError(event *models.Event, err error) error { + logging.LogWithFields("SPOOL-4Djo9", "id", event.AggregateID).WithError(err).Warn("something went wrong in label text handler") + return spooler.HandleError(event, err, m.view.GetLatestMailTextFailedEvent, m.view.ProcessedMailTextFailedEvent, m.view.ProcessedMailTextSequence, m.errorCountUntilSkip) +} + +func (o *MailText) OnSuccess() error { + return spooler.HandleSuccess(o.view.UpdateMailTextSpoolerRunTimestamp) +} diff --git a/internal/management/repository/eventsourcing/handler/org.go b/internal/management/repository/eventsourcing/handler/org.go index a4f6eb211d..af950ffa8c 100644 --- a/internal/management/repository/eventsourcing/handler/org.go +++ b/internal/management/repository/eventsourcing/handler/org.go @@ -2,8 +2,8 @@ package handler import ( "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -48,8 +48,8 @@ func (_ *Org) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate} } -func (o *Org) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := o.view.GetLatestOrgSequence(string(event.AggregateType)) +func (o *Org) CurrentSequence() (uint64, error) { + sequence, err := o.view.GetLatestOrgSequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (o *Org) CurrentSequence(event *models.Event) (uint64, error) { } func (o *Org) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := o.view.GetLatestOrgSequence("") + sequence, err := o.view.GetLatestOrgSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/org_domain.go b/internal/management/repository/eventsourcing/handler/org_domain.go index 9a7dedb5ee..963f518592 100644 --- a/internal/management/repository/eventsourcing/handler/org_domain.go +++ b/internal/management/repository/eventsourcing/handler/org_domain.go @@ -47,8 +47,8 @@ func (_ *OrgDomain) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate} } -func (p *OrgDomain) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestOrgDomainSequence(string(event.AggregateType)) +func (p *OrgDomain) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestOrgDomainSequence() if err != nil { return 0, err } @@ -56,7 +56,7 @@ func (p *OrgDomain) CurrentSequence(event *models.Event) (uint64, error) { } func (d *OrgDomain) EventQuery() (*models.SearchQuery, error) { - sequence, err := d.view.GetLatestOrgDomainSequence("") + sequence, err := d.view.GetLatestOrgDomainSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/org_iam_policy.go b/internal/management/repository/eventsourcing/handler/org_iam_policy.go index 796652bbb4..636b37ff6f 100644 --- a/internal/management/repository/eventsourcing/handler/org_iam_policy.go +++ b/internal/management/repository/eventsourcing/handler/org_iam_policy.go @@ -48,8 +48,8 @@ func (_ *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *OrgIAMPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestOrgIAMPolicySequence(string(event.AggregateType)) +func (p *OrgIAMPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestOrgIAMPolicySequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (p *OrgIAMPolicy) CurrentSequence(event *models.Event) (uint64, error) { } func (m *OrgIAMPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := m.view.GetLatestOrgIAMPolicySequence("") + sequence, err := m.view.GetLatestOrgIAMPolicySequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/org_member.go b/internal/management/repository/eventsourcing/handler/org_member.go index cf3e1b6499..f4e8743b6d 100644 --- a/internal/management/repository/eventsourcing/handler/org_member.go +++ b/internal/management/repository/eventsourcing/handler/org_member.go @@ -57,8 +57,8 @@ func (_ *OrgMember) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate, usr_es_model.UserAggregate} } -func (p *OrgMember) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestOrgMemberSequence(string(event.AggregateType)) +func (p *OrgMember) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestOrgMemberSequence() if err != nil { return 0, err } @@ -66,7 +66,7 @@ func (p *OrgMember) CurrentSequence(event *models.Event) (uint64, error) { } func (m *OrgMember) EventQuery() (*models.SearchQuery, error) { - sequence, err := m.view.GetLatestOrgMemberSequence("") + sequence, err := m.view.GetLatestOrgMemberSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/password_age_policy.go b/internal/management/repository/eventsourcing/handler/password_age_policy.go index eee2e2711c..1e5bc2ba75 100644 --- a/internal/management/repository/eventsourcing/handler/password_age_policy.go +++ b/internal/management/repository/eventsourcing/handler/password_age_policy.go @@ -48,8 +48,8 @@ func (_ *PasswordAgePolicy) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (o *PasswordAgePolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := o.view.GetLatestPasswordAgePolicySequence(string(event.AggregateType)) +func (o *PasswordAgePolicy) CurrentSequence() (uint64, error) { + sequence, err := o.view.GetLatestPasswordAgePolicySequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (o *PasswordAgePolicy) CurrentSequence(event *models.Event) (uint64, error) } func (p *PasswordAgePolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestPasswordAgePolicySequence("") + sequence, err := p.view.GetLatestPasswordAgePolicySequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/password_complexity_policy.go b/internal/management/repository/eventsourcing/handler/password_complexity_policy.go index d2d14c885d..d4935e88c5 100644 --- a/internal/management/repository/eventsourcing/handler/password_complexity_policy.go +++ b/internal/management/repository/eventsourcing/handler/password_complexity_policy.go @@ -48,8 +48,8 @@ func (_ *PasswordComplexityPolicy) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *PasswordComplexityPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestPasswordComplexityPolicySequence(string(event.AggregateType)) +func (p *PasswordComplexityPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestPasswordComplexityPolicySequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (p *PasswordComplexityPolicy) CurrentSequence(event *models.Event) (uint64, } func (p *PasswordComplexityPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestPasswordComplexityPolicySequence("") + sequence, err := p.view.GetLatestPasswordComplexityPolicySequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/password_lockout_policy.go b/internal/management/repository/eventsourcing/handler/password_lockout_policy.go index 19e7c9c0b6..89103d6b84 100644 --- a/internal/management/repository/eventsourcing/handler/password_lockout_policy.go +++ b/internal/management/repository/eventsourcing/handler/password_lockout_policy.go @@ -49,8 +49,8 @@ func (_ *PasswordLockoutPolicy) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} } -func (p *PasswordLockoutPolicy) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestPasswordLockoutPolicySequence(string(event.AggregateType)) +func (p *PasswordLockoutPolicy) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestPasswordLockoutPolicySequence() if err != nil { return 0, err } @@ -58,7 +58,7 @@ func (p *PasswordLockoutPolicy) CurrentSequence(event *models.Event) (uint64, er } func (p *PasswordLockoutPolicy) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestPasswordLockoutPolicySequence("") + sequence, err := p.view.GetLatestPasswordLockoutPolicySequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/project.go b/internal/management/repository/eventsourcing/handler/project.go index 51331d44ee..d123b62091 100644 --- a/internal/management/repository/eventsourcing/handler/project.go +++ b/internal/management/repository/eventsourcing/handler/project.go @@ -48,8 +48,8 @@ func (_ *Project) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.ProjectAggregate} } -func (p *Project) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestProjectSequence(string(event.AggregateType)) +func (p *Project) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestProjectSequence() if err != nil { return 0, err } @@ -57,7 +57,7 @@ func (p *Project) CurrentSequence(event *models.Event) (uint64, error) { } func (p *Project) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestProjectSequence("") + sequence, err := p.view.GetLatestProjectSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/project_grant.go b/internal/management/repository/eventsourcing/handler/project_grant.go index 918eb54f56..1c96a8a80b 100644 --- a/internal/management/repository/eventsourcing/handler/project_grant.go +++ b/internal/management/repository/eventsourcing/handler/project_grant.go @@ -61,8 +61,8 @@ func (_ *ProjectGrant) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.ProjectAggregate} } -func (p *ProjectGrant) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestProjectGrantSequence(string(event.AggregateType)) +func (p *ProjectGrant) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestProjectGrantSequence() if err != nil { return 0, err } @@ -70,7 +70,7 @@ func (p *ProjectGrant) CurrentSequence(event *models.Event) (uint64, error) { } func (p *ProjectGrant) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestProjectGrantSequence("") + sequence, err := p.view.GetLatestProjectGrantSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/project_grant_member.go b/internal/management/repository/eventsourcing/handler/project_grant_member.go index 159be6d870..6897568ea8 100644 --- a/internal/management/repository/eventsourcing/handler/project_grant_member.go +++ b/internal/management/repository/eventsourcing/handler/project_grant_member.go @@ -58,8 +58,8 @@ func (_ *ProjectGrantMember) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{proj_es_model.ProjectAggregate, usr_es_model.UserAggregate} } -func (p *ProjectGrantMember) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestProjectGrantMemberSequence(string(event.AggregateType)) +func (p *ProjectGrantMember) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestProjectGrantMemberSequence() if err != nil { return 0, err } @@ -67,7 +67,7 @@ func (p *ProjectGrantMember) CurrentSequence(event *models.Event) (uint64, error } func (p *ProjectGrantMember) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestProjectGrantMemberSequence("") + sequence, err := p.view.GetLatestProjectGrantMemberSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/project_member.go b/internal/management/repository/eventsourcing/handler/project_member.go index 721f42e9d8..0e8bf87f1a 100644 --- a/internal/management/repository/eventsourcing/handler/project_member.go +++ b/internal/management/repository/eventsourcing/handler/project_member.go @@ -58,8 +58,8 @@ func (_ *ProjectMember) AggregateTypes() []models.AggregateType { return []models.AggregateType{proj_es_model.ProjectAggregate, usr_es_model.UserAggregate} } -func (p *ProjectMember) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestProjectMemberSequence(string(event.AggregateType)) +func (p *ProjectMember) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestProjectMemberSequence() if err != nil { return 0, err } @@ -67,7 +67,7 @@ func (p *ProjectMember) CurrentSequence(event *models.Event) (uint64, error) { } func (p *ProjectMember) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestProjectMemberSequence("") + sequence, err := p.view.GetLatestProjectMemberSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/project_role.go b/internal/management/repository/eventsourcing/handler/project_role.go index 3d89ba4a9f..b6f64f075a 100644 --- a/internal/management/repository/eventsourcing/handler/project_role.go +++ b/internal/management/repository/eventsourcing/handler/project_role.go @@ -54,8 +54,8 @@ func (_ *ProjectRole) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.ProjectAggregate} } -func (p *ProjectRole) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := p.view.GetLatestProjectRoleSequence(string(event.AggregateType)) +func (p *ProjectRole) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestProjectRoleSequence() if err != nil { return 0, err } @@ -63,7 +63,7 @@ func (p *ProjectRole) CurrentSequence(event *models.Event) (uint64, error) { } func (p *ProjectRole) EventQuery() (*models.SearchQuery, error) { - sequence, err := p.view.GetLatestProjectRoleSequence("") + sequence, err := p.view.GetLatestProjectRoleSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/user.go b/internal/management/repository/eventsourcing/handler/user.go index bf415d1602..fdfe7f44af 100644 --- a/internal/management/repository/eventsourcing/handler/user.go +++ b/internal/management/repository/eventsourcing/handler/user.go @@ -64,8 +64,8 @@ func (_ *User) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate} } -func (u *User) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := u.view.GetLatestUserSequence(string(event.AggregateType)) +func (u *User) CurrentSequence() (uint64, error) { + sequence, err := u.view.GetLatestUserSequence() if err != nil { return 0, err } @@ -73,7 +73,7 @@ func (u *User) CurrentSequence(event *models.Event) (uint64, error) { } func (u *User) EventQuery() (*models.SearchQuery, error) { - sequence, err := u.view.GetLatestUserSequence("") + sequence, err := u.view.GetLatestUserSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/user_external_idps.go b/internal/management/repository/eventsourcing/handler/user_external_idps.go index 059a15c9bd..b25c32d803 100644 --- a/internal/management/repository/eventsourcing/handler/user_external_idps.go +++ b/internal/management/repository/eventsourcing/handler/user_external_idps.go @@ -4,10 +4,10 @@ import ( "context" "github.com/caos/logging" + "github.com/caos/zitadel/internal/config/systemdefaults" caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -68,8 +68,8 @@ func (_ *ExternalIDP) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate} } -func (i *ExternalIDP) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := i.view.GetLatestExternalIDPSequence(string(event.AggregateType)) +func (i *ExternalIDP) CurrentSequence() (uint64, error) { + sequence, err := i.view.GetLatestExternalIDPSequence() if err != nil { return 0, err } @@ -77,7 +77,7 @@ func (i *ExternalIDP) CurrentSequence(event *models.Event) (uint64, error) { } func (i *ExternalIDP) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := i.view.GetLatestExternalIDPSequence("") + sequence, err := i.view.GetLatestExternalIDPSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/user_grant.go b/internal/management/repository/eventsourcing/handler/user_grant.go index a4f0869783..c9fc00e3c6 100644 --- a/internal/management/repository/eventsourcing/handler/user_grant.go +++ b/internal/management/repository/eventsourcing/handler/user_grant.go @@ -4,8 +4,8 @@ import ( "context" "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -68,8 +68,8 @@ func (_ *UserGrant) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{grant_es_model.UserGrantAggregate, usr_es_model.UserAggregate, proj_es_model.ProjectAggregate} } -func (u *UserGrant) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := u.view.GetLatestUserGrantSequence(string(event.AggregateType)) +func (u *UserGrant) CurrentSequence() (uint64, error) { + sequence, err := u.view.GetLatestUserGrantSequence() if err != nil { return 0, err } @@ -77,7 +77,7 @@ func (u *UserGrant) CurrentSequence(event *models.Event) (uint64, error) { } func (u *UserGrant) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := u.view.GetLatestUserGrantSequence("") + sequence, err := u.view.GetLatestUserGrantSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/handler/user_membership.go b/internal/management/repository/eventsourcing/handler/user_membership.go index 9358acc4e2..520479f665 100644 --- a/internal/management/repository/eventsourcing/handler/user_membership.go +++ b/internal/management/repository/eventsourcing/handler/user_membership.go @@ -4,8 +4,8 @@ import ( "context" "github.com/caos/logging" + "github.com/caos/zitadel/internal/eventstore" - "github.com/caos/zitadel/internal/eventstore/models" es_models "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/eventstore/query" "github.com/caos/zitadel/internal/eventstore/spooler" @@ -64,8 +64,8 @@ func (_ *UserMembership) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate} } -func (u *UserMembership) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := u.view.GetLatestUserMembershipSequence(string(event.AggregateType)) +func (u *UserMembership) CurrentSequence() (uint64, error) { + sequence, err := u.view.GetLatestUserMembershipSequence() if err != nil { return 0, err } @@ -73,7 +73,7 @@ func (u *UserMembership) CurrentSequence(event *models.Event) (uint64, error) { } func (m *UserMembership) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := m.view.GetLatestUserMembershipSequence("") + sequence, err := m.view.GetLatestUserMembershipSequence() if err != nil { return nil, err } diff --git a/internal/management/repository/eventsourcing/view/application.go b/internal/management/repository/eventsourcing/view/application.go index c9b4a6fbd0..45a5f344ac 100644 --- a/internal/management/repository/eventsourcing/view/application.go +++ b/internal/management/repository/eventsourcing/view/application.go @@ -53,8 +53,8 @@ func (v *View) DeleteApplicationsByProjectID(projectID string) error { return view.DeleteApplicationsByProjectID(v.Db, applicationTable, projectID) } -func (v *View) GetLatestApplicationSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(applicationTable, aggregateType) +func (v *View) GetLatestApplicationSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(applicationTable) } func (v *View) ProcessedApplicationSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/external_idps.go b/internal/management/repository/eventsourcing/view/external_idps.go index 0b8eb3648e..24fe60c26e 100644 --- a/internal/management/repository/eventsourcing/view/external_idps.go +++ b/internal/management/repository/eventsourcing/view/external_idps.go @@ -64,8 +64,8 @@ func (v *View) DeleteExternalIDPsByUserID(userID string, event *models.Event) er } return v.ProcessedExternalIDPSequence(event) } -func (v *View) GetLatestExternalIDPSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(externalIDPTable, aggregateType) +func (v *View) GetLatestExternalIDPSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(externalIDPTable) } func (v *View) ProcessedExternalIDPSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/idp_configs.go b/internal/management/repository/eventsourcing/view/idp_configs.go index 5770f36b38..ca759c6f38 100644 --- a/internal/management/repository/eventsourcing/view/idp_configs.go +++ b/internal/management/repository/eventsourcing/view/idp_configs.go @@ -37,8 +37,8 @@ func (v *View) DeleteIDPConfig(idpID string, event *models.Event) error { return v.ProcessedIDPConfigSequence(event) } -func (v *View) GetLatestIDPConfigSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(idpConfigTable, aggregateType) +func (v *View) GetLatestIDPConfigSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(idpConfigTable) } func (v *View) ProcessedIDPConfigSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/idp_providers.go b/internal/management/repository/eventsourcing/view/idp_providers.go index a293ec1637..f73a4720f8 100644 --- a/internal/management/repository/eventsourcing/view/idp_providers.go +++ b/internal/management/repository/eventsourcing/view/idp_providers.go @@ -57,8 +57,8 @@ func (v *View) DeleteIDPProvidersByAggregateID(aggregateID string, event *models return v.ProcessedIDPProviderSequence(event) } -func (v *View) GetLatestIDPProviderSequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(idpProviderTable, aggregateType) +func (v *View) GetLatestIDPProviderSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(idpProviderTable) } func (v *View) ProcessedIDPProviderSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/label_policies.go b/internal/management/repository/eventsourcing/view/label_policies.go index 05bb9550a4..17cb603d25 100644 --- a/internal/management/repository/eventsourcing/view/label_policies.go +++ b/internal/management/repository/eventsourcing/view/label_policies.go @@ -32,8 +32,8 @@ func (v *View) DeleteLabelPolicy(aggregateID string, event *models.Event) error return v.ProcessedLabelPolicySequence(event) } -func (v *View) GetLatestLabelPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(labelPolicyTable, aggregateType) +func (v *View) GetLatestLabelPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(labelPolicyTable) } func (v *View) ProcessedLabelPolicySequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/login_policies.go b/internal/management/repository/eventsourcing/view/login_policies.go index 56e6e80f8f..1788a622b3 100644 --- a/internal/management/repository/eventsourcing/view/login_policies.go +++ b/internal/management/repository/eventsourcing/view/login_policies.go @@ -32,8 +32,8 @@ func (v *View) DeleteLoginPolicy(aggregateID string, event *models.Event) error return v.ProcessedLoginPolicySequence(event) } -func (v *View) GetLatestLoginPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(loginPolicyTable, aggregateType) +func (v *View) GetLatestLoginPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(loginPolicyTable) } func (v *View) ProcessedLoginPolicySequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/machine_keys.go b/internal/management/repository/eventsourcing/view/machine_keys.go index c861cfd58c..075e15fe8e 100644 --- a/internal/management/repository/eventsourcing/view/machine_keys.go +++ b/internal/management/repository/eventsourcing/view/machine_keys.go @@ -49,8 +49,8 @@ func (v *View) DeleteMachineKeysByUserID(userID string, event *models.Event) err return v.ProcessedMachineKeySequence(event) } -func (v *View) GetLatestMachineKeySequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(machineKeyTable, aggregateType) +func (v *View) GetLatestMachineKeySequence() (*repository.CurrentSequence, error) { + return v.latestSequence(machineKeyTable) } func (v *View) ProcessedMachineKeySequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/mail_templates.go b/internal/management/repository/eventsourcing/view/mail_templates.go new file mode 100644 index 0000000000..34c3ab2249 --- /dev/null +++ b/internal/management/repository/eventsourcing/view/mail_templates.go @@ -0,0 +1,53 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + mailTemplateTable = "management.mail_templates" +) + +func (v *View) MailTemplateByAggregateID(aggregateID string) (*model.MailTemplateView, error) { + return view.GetMailTemplateByAggregateID(v.Db, mailTemplateTable, aggregateID) +} + +func (v *View) PutMailTemplate(template *model.MailTemplateView, event *models.Event) error { + err := view.PutMailTemplate(v.Db, mailTemplateTable, template) + if err != nil { + return err + } + return v.ProcessedMailTemplateSequence(event) +} + +func (v *View) DeleteMailTemplate(aggregateID string, event *models.Event) error { + err := view.DeleteMailTemplate(v.Db, mailTemplateTable, aggregateID) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedMailTemplateSequence(event) +} + +func (v *View) GetLatestMailTemplateSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(mailTemplateTable) +} + +func (v *View) ProcessedMailTemplateSequence(event *models.Event) error { + return v.saveCurrentSequence(mailTemplateTable, event) +} + +func (v *View) UpdateMailTemplateSpoolerRunTimestamp() error { + return v.updateSpoolerRunSequence(mailTemplateTable) +} + +func (v *View) GetLatestMailTemplateFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(mailTemplateTable, sequence) +} + +func (v *View) ProcessedMailTemplateFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/management/repository/eventsourcing/view/mail_texts.go b/internal/management/repository/eventsourcing/view/mail_texts.go new file mode 100644 index 0000000000..c9ab7cd443 --- /dev/null +++ b/internal/management/repository/eventsourcing/view/mail_texts.go @@ -0,0 +1,57 @@ +package view + +import ( + "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" + global_view "github.com/caos/zitadel/internal/view/repository" +) + +const ( + mailTextTable = "management.mail_texts" +) + +func (v *View) MailTextsByAggregateID(aggregateID string) ([]*model.MailTextView, error) { + return view.GetMailTexts(v.Db, mailTextTable, aggregateID) +} + +func (v *View) MailTextByIDs(aggregateID string, textType string, language string) (*model.MailTextView, error) { + return view.GetMailTextByIDs(v.Db, mailTextTable, aggregateID, textType, language) +} + +func (v *View) PutMailText(template *model.MailTextView, event *models.Event) error { + err := view.PutMailText(v.Db, mailTextTable, template) + if err != nil { + return err + } + return v.ProcessedMailTextSequence(event) +} + +func (v *View) DeleteMailText(aggregateID string, textType string, language string, event *models.Event) error { + err := view.DeleteMailText(v.Db, mailTextTable, aggregateID, textType, language) + if err != nil && !errors.IsNotFound(err) { + return err + } + return v.ProcessedMailTextSequence(event) +} + +func (v *View) GetLatestMailTextSequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(mailTextTable) +} + +func (v *View) ProcessedMailTextSequence(event *models.Event) error { + return v.saveCurrentSequence(mailTextTable, event) +} + +func (v *View) UpdateMailTextSpoolerRunTimestamp() error { + return v.updateSpoolerRunSequence(mailTextTable) +} + +func (v *View) GetLatestMailTextFailedEvent(sequence uint64) (*global_view.FailedEvent, error) { + return v.latestFailedEvent(mailTextTable, sequence) +} + +func (v *View) ProcessedMailTextFailedEvent(failedEvent *global_view.FailedEvent) error { + return v.saveFailedEvent(failedEvent) +} diff --git a/internal/management/repository/eventsourcing/view/org.go b/internal/management/repository/eventsourcing/view/org.go index 3a53b92031..72323eeb07 100644 --- a/internal/management/repository/eventsourcing/view/org.go +++ b/internal/management/repository/eventsourcing/view/org.go @@ -35,8 +35,8 @@ func (v *View) UpdateOrgSpoolerRunTimestamp() error { return v.updateSpoolerRunSequence(orgTable) } -func (v *View) GetLatestOrgSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(orgTable, aggregateType) +func (v *View) GetLatestOrgSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(orgTable) } func (v *View) ProcessedOrgSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/org_domain.go b/internal/management/repository/eventsourcing/view/org_domain.go index 45ee4ad912..6819980dea 100644 --- a/internal/management/repository/eventsourcing/view/org_domain.go +++ b/internal/management/repository/eventsourcing/view/org_domain.go @@ -53,8 +53,8 @@ func (v *View) DeleteOrgDomain(orgID, domain string, event *models.Event) error return v.ProcessedOrgDomainSequence(event) } -func (v *View) GetLatestOrgDomainSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(orgDomainTable, aggregateType) +func (v *View) GetLatestOrgDomainSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(orgDomainTable) } func (v *View) ProcessedOrgDomainSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/org_iam_policy.go b/internal/management/repository/eventsourcing/view/org_iam_policy.go index 90d3de2b9c..266c2e0371 100644 --- a/internal/management/repository/eventsourcing/view/org_iam_policy.go +++ b/internal/management/repository/eventsourcing/view/org_iam_policy.go @@ -32,8 +32,8 @@ func (v *View) DeleteOrgIAMPolicy(aggregateID string, event *models.Event) error return v.ProcessedOrgIAMPolicySequence(event) } -func (v *View) GetLatestOrgIAMPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(orgIAMPolicyTable, aggregateType) +func (v *View) GetLatestOrgIAMPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(orgIAMPolicyTable) } func (v *View) ProcessedOrgIAMPolicySequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/org_member.go b/internal/management/repository/eventsourcing/view/org_member.go index ee6deac739..0f69399786 100644 --- a/internal/management/repository/eventsourcing/view/org_member.go +++ b/internal/management/repository/eventsourcing/view/org_member.go @@ -57,8 +57,8 @@ func (v *View) DeleteOrgMembersByUserID(userID string, event *models.Event) erro return v.ProcessedOrgMemberSequence(event) } -func (v *View) GetLatestOrgMemberSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(orgMemberTable, aggregateType) +func (v *View) GetLatestOrgMemberSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(orgMemberTable) } func (v *View) ProcessedOrgMemberSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/password_age_policy.go b/internal/management/repository/eventsourcing/view/password_age_policy.go index e1bd56a596..5fc99367cf 100644 --- a/internal/management/repository/eventsourcing/view/password_age_policy.go +++ b/internal/management/repository/eventsourcing/view/password_age_policy.go @@ -32,8 +32,8 @@ func (v *View) DeletePasswordAgePolicy(aggregateID string, event *models.Event) return v.ProcessedPasswordAgePolicySequence(event) } -func (v *View) GetLatestPasswordAgePolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(passwordAgePolicyTable, aggregateType) +func (v *View) GetLatestPasswordAgePolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordAgePolicyTable) } func (v *View) ProcessedPasswordAgePolicySequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/password_complexity_policy.go b/internal/management/repository/eventsourcing/view/password_complexity_policy.go index 80d9e2d90d..db24d4ab2a 100644 --- a/internal/management/repository/eventsourcing/view/password_complexity_policy.go +++ b/internal/management/repository/eventsourcing/view/password_complexity_policy.go @@ -32,8 +32,8 @@ func (v *View) DeletePasswordComplexityPolicy(aggregateID string, event *models. return v.ProcessedPasswordComplexityPolicySequence(event) } -func (v *View) GetLatestPasswordComplexityPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(passwordComplexityPolicyTable, aggregateType) +func (v *View) GetLatestPasswordComplexityPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordComplexityPolicyTable) } func (v *View) ProcessedPasswordComplexityPolicySequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/password_lockout_policy.go b/internal/management/repository/eventsourcing/view/password_lockout_policy.go index 549f704c75..d3e0ea0e16 100644 --- a/internal/management/repository/eventsourcing/view/password_lockout_policy.go +++ b/internal/management/repository/eventsourcing/view/password_lockout_policy.go @@ -32,8 +32,8 @@ func (v *View) DeletePasswordLockoutPolicy(aggregateID string, event *models.Eve return v.ProcessedPasswordLockoutPolicySequence(event) } -func (v *View) GetLatestPasswordLockoutPolicySequence(aggregateType string) (*global_view.CurrentSequence, error) { - return v.latestSequence(passwordLockoutPolicyTable, aggregateType) +func (v *View) GetLatestPasswordLockoutPolicySequence() (*global_view.CurrentSequence, error) { + return v.latestSequence(passwordLockoutPolicyTable) } func (v *View) ProcessedPasswordLockoutPolicySequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/project.go b/internal/management/repository/eventsourcing/view/project.go index f5ac609ddc..d32f7c577d 100644 --- a/internal/management/repository/eventsourcing/view/project.go +++ b/internal/management/repository/eventsourcing/view/project.go @@ -37,8 +37,8 @@ func (v *View) DeleteProject(projectID string, event *models.Event) error { return v.ProcessedProjectSequence(event) } -func (v *View) GetLatestProjectSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(projectTable, aggregateType) +func (v *View) GetLatestProjectSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(projectTable) } func (v *View) ProcessedProjectSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/project_grant.go b/internal/management/repository/eventsourcing/view/project_grant.go index ab54927a30..08eb4bf444 100644 --- a/internal/management/repository/eventsourcing/view/project_grant.go +++ b/internal/management/repository/eventsourcing/view/project_grant.go @@ -60,8 +60,8 @@ func (v *View) DeleteProjectGrantsByProjectID(projectID string) error { return view.DeleteProjectGrantsByProjectID(v.Db, grantedProjectTable, projectID) } -func (v *View) GetLatestProjectGrantSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(grantedProjectTable, aggregateType) +func (v *View) GetLatestProjectGrantSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(grantedProjectTable) } func (v *View) ProcessedProjectGrantSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/project_grant_member.go b/internal/management/repository/eventsourcing/view/project_grant_member.go index 7634cefbf5..e682ef25da 100644 --- a/internal/management/repository/eventsourcing/view/project_grant_member.go +++ b/internal/management/repository/eventsourcing/view/project_grant_member.go @@ -57,8 +57,8 @@ func (v *View) DeleteProjectGrantMembersByProjectID(projectID string) error { return view.DeleteProjectGrantMembersByProjectID(v.Db, projectGrantMemberTable, projectID) } -func (v *View) GetLatestProjectGrantMemberSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(projectGrantMemberTable, aggregateType) +func (v *View) GetLatestProjectGrantMemberSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(projectGrantMemberTable) } func (v *View) ProcessedProjectGrantMemberSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/project_member.go b/internal/management/repository/eventsourcing/view/project_member.go index 09f3b31518..327632c789 100644 --- a/internal/management/repository/eventsourcing/view/project_member.go +++ b/internal/management/repository/eventsourcing/view/project_member.go @@ -57,8 +57,8 @@ func (v *View) DeleteProjectMembersByProjectID(projectID string) error { return view.DeleteProjectMembersByProjectID(v.Db, projectMemberTable, projectID) } -func (v *View) GetLatestProjectMemberSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(projectMemberTable, aggregateType) +func (v *View) GetLatestProjectMemberSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(projectMemberTable) } func (v *View) ProcessedProjectMemberSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/project_role.go b/internal/management/repository/eventsourcing/view/project_role.go index 5b251fa24b..68da7611fd 100644 --- a/internal/management/repository/eventsourcing/view/project_role.go +++ b/internal/management/repository/eventsourcing/view/project_role.go @@ -53,8 +53,8 @@ func (v *View) DeleteProjectRolesByProjectID(projectID string) error { return view.DeleteProjectRolesByProjectID(v.Db, projectRoleTable, projectID) } -func (v *View) GetLatestProjectRoleSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(projectRoleTable, aggregateType) +func (v *View) GetLatestProjectRoleSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(projectRoleTable) } func (v *View) ProcessedProjectRoleSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/sequence.go b/internal/management/repository/eventsourcing/view/sequence.go index 808ff58216..4cff5fc9eb 100644 --- a/internal/management/repository/eventsourcing/view/sequence.go +++ b/internal/management/repository/eventsourcing/view/sequence.go @@ -12,15 +12,15 @@ const ( ) func (v *View) saveCurrentSequence(viewName string, event *models.Event) error { - return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, string(event.AggregateType), event.Sequence, event.CreationDate) + return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, event.Sequence, event.CreationDate) } -func (v *View) latestSequence(viewName, aggregateType string) (*repository.CurrentSequence, error) { - return repository.LatestSequence(v.Db, sequencesTable, viewName, aggregateType) +func (v *View) latestSequence(viewName string) (*repository.CurrentSequence, error) { + return repository.LatestSequence(v.Db, sequencesTable, viewName) } func (v *View) updateSpoolerRunSequence(viewName string) error { - currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName, "") + currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName) if err != nil { return err } diff --git a/internal/management/repository/eventsourcing/view/user.go b/internal/management/repository/eventsourcing/view/user.go index d589b546f7..8622d7a381 100644 --- a/internal/management/repository/eventsourcing/view/user.go +++ b/internal/management/repository/eventsourcing/view/user.go @@ -65,8 +65,8 @@ func (v *View) DeleteUser(userID string, event *models.Event) error { return v.ProcessedUserSequence(event) } -func (v *View) GetLatestUserSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userTable, aggregateType) +func (v *View) GetLatestUserSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userTable) } func (v *View) ProcessedUserSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/user_grant.go b/internal/management/repository/eventsourcing/view/user_grant.go index 15dd3220d2..1e2f6d587f 100644 --- a/internal/management/repository/eventsourcing/view/user_grant.go +++ b/internal/management/repository/eventsourcing/view/user_grant.go @@ -65,8 +65,8 @@ func (v *View) DeleteUserGrant(grantID string, event *models.Event) error { return v.ProcessedUserGrantSequence(event) } -func (v *View) GetLatestUserGrantSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userGrantTable, aggregateType) +func (v *View) GetLatestUserGrantSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userGrantTable) } func (v *View) ProcessedUserGrantSequence(event *models.Event) error { diff --git a/internal/management/repository/eventsourcing/view/user_membership.go b/internal/management/repository/eventsourcing/view/user_membership.go index 90f64906a7..0187cd62bc 100644 --- a/internal/management/repository/eventsourcing/view/user_membership.go +++ b/internal/management/repository/eventsourcing/view/user_membership.go @@ -73,8 +73,8 @@ func (v *View) DeleteUserMembershipsByAggregateIDAndObjectID(aggregateID, object return v.ProcessedUserMembershipSequence(event) } -func (v *View) GetLatestUserMembershipSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(userMembershipTable, aggregateType) +func (v *View) GetLatestUserMembershipSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(userMembershipTable) } func (v *View) ProcessedUserMembershipSequence(event *models.Event) error { diff --git a/internal/management/repository/org.go b/internal/management/repository/org.go index 1538bc7737..1292eed15a 100644 --- a/internal/management/repository/org.go +++ b/internal/management/repository/org.go @@ -38,4 +38,16 @@ type OrgRepository interface { GetPasswordLockoutPolicy(ctx context.Context) (*iam_model.PasswordLockoutPolicyView, error) GetDefaultPasswordLockoutPolicy(ctx context.Context) (*iam_model.PasswordLockoutPolicyView, error) + + GetDefaultMailTemplate(ctx context.Context) (*iam_model.MailTemplateView, error) + GetMailTemplate(ctx context.Context) (*iam_model.MailTemplateView, error) + AddMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) + ChangeMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) + RemoveMailTemplate(ctx context.Context) error + + GetDefaultMailTexts(ctx context.Context) (*iam_model.MailTextsView, error) + GetMailTexts(ctx context.Context) (*iam_model.MailTextsView, error) + AddMailText(ctx context.Context, mailText *iam_model.MailText) (*iam_model.MailText, error) + ChangeMailText(ctx context.Context, mailText *iam_model.MailText) (*iam_model.MailText, error) + RemoveMailText(ctx context.Context, mailText *iam_model.MailText) error } diff --git a/internal/notification/repository/eventsourcing/handler/notification.go b/internal/notification/repository/eventsourcing/handler/notification.go index ac22f914cf..7d2b3534bd 100644 --- a/internal/notification/repository/eventsourcing/handler/notification.go +++ b/internal/notification/repository/eventsourcing/handler/notification.go @@ -4,7 +4,9 @@ import ( "context" "encoding/json" "github.com/caos/zitadel/internal/user/repository/view/model" + view_model "github.com/caos/zitadel/internal/user/repository/view/model" "github.com/caos/zitadel/internal/v2/command" + "golang.org/x/text/language" "net/http" "time" @@ -12,6 +14,7 @@ import ( "github.com/caos/zitadel/internal/api/authz" sd "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" + "github.com/caos/zitadel/internal/errors" caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore" "github.com/caos/zitadel/internal/eventstore/models" @@ -26,10 +29,19 @@ import ( ) const ( - notificationTable = "notification.notifications" - NotifyUserID = "NOTIFICATION" - labelPolicyTableOrg = "management.label_policies" - labelPolicyTableDef = "adminapi.label_policies" + notificationTable = "notification.notifications" + NotifyUserID = "NOTIFICATION" + labelPolicyTableOrg = "management.label_policies" + labelPolicyTableDef = "adminapi.label_policies" + mailTemplateTableOrg = "management.mail_templates" + mailTemplateTableDef = "adminapi.mail_templates" + mailTextTableOrg = "management.mail_texts" + mailTextTableDef = "adminapi.mail_texts" + mailTextTypeDomainClaimed = "DomainClaimed" + mailTextTypeInitCode = "InitCode" + mailTextTypePasswordReset = "PasswordReset" + mailTextTypeVerifyEmail = "VerifyEmail" + mailTextTypeVerifyPhone = "VerifyPhone" ) type Notification struct { @@ -84,8 +96,8 @@ func (_ *Notification) AggregateTypes() []models.AggregateType { return []models.AggregateType{es_model.UserAggregate} } -func (n *Notification) CurrentSequence(event *models.Event) (uint64, error) { - sequence, err := n.view.GetLatestNotificationSequence(string(event.AggregateType)) +func (n *Notification) CurrentSequence() (uint64, error) { + sequence, err := n.view.GetLatestNotificationSequence() if err != nil { return 0, err } @@ -93,7 +105,7 @@ func (n *Notification) CurrentSequence(event *models.Event) (uint64, error) { } func (n *Notification) EventQuery() (*models.SearchQuery, error) { - sequence, err := n.view.GetLatestNotificationSequence("") + sequence, err := n.view.GetLatestNotificationSequence() if err != nil { return nil, err } @@ -140,11 +152,22 @@ func (n *Notification) handleInitUserCode(event *models.Event) (err error) { return err } + template, err := n.getMailTemplate(context.Background()) + if err != nil { + return err + } + user, err := n.getUserByID(event.AggregateID) if err != nil { return err } - err = types.SendUserInitCode(n.statikDir, n.i18n, user, initCode, n.systemDefaults, n.AesCrypto, colors) + + text, err := n.getMailText(context.Background(), mailTextTypeInitCode, user.PreferredLanguage) + if err != nil { + return err + } + + err = types.SendUserInitCode(string(template.Template), text, user, initCode, n.systemDefaults, n.AesCrypto, colors) if err != nil { return err } @@ -168,11 +191,21 @@ func (n *Notification) handlePasswordCode(event *models.Event) (err error) { return err } + template, err := n.getMailTemplate(context.Background()) + if err != nil { + return err + } + user, err := n.getUserByID(event.AggregateID) if err != nil { return err } - err = types.SendPasswordCode(n.statikDir, n.i18n, user, pwCode, n.systemDefaults, n.AesCrypto, colors) + + text, err := n.getMailText(context.Background(), mailTextTypePasswordReset, user.PreferredLanguage) + if err != nil { + return err + } + err = types.SendPasswordCode(string(template.Template), text, user, pwCode, n.systemDefaults, n.AesCrypto, colors) if err != nil { return err } @@ -196,11 +229,22 @@ func (n *Notification) handleEmailVerificationCode(event *models.Event) (err err return err } + template, err := n.getMailTemplate(context.Background()) + if err != nil { + return err + } + user, err := n.getUserByID(event.AggregateID) if err != nil { return err } - err = types.SendEmailVerificationCode(n.statikDir, n.i18n, user, emailCode, n.systemDefaults, n.AesCrypto, colors) + + text, err := n.getMailText(context.Background(), mailTextTypeVerifyEmail, user.PreferredLanguage) + if err != nil { + return err + } + + err = types.SendEmailVerificationCode(string(template.Template), text, user, emailCode, n.systemDefaults, n.AesCrypto, colors) if err != nil { return err } @@ -243,7 +287,21 @@ func (n *Notification) handleDomainClaimed(event *models.Event) (err error) { if err != nil { return err } - err = types.SendDomainClaimed(n.statikDir, n.i18n, user, data["userName"], n.systemDefaults) + colors, err := n.getLabelPolicy(context.Background()) + if err != nil { + return err + } + + template, err := n.getMailTemplate(context.Background()) + if err != nil { + return err + } + + text, err := n.getMailText(context.Background(), mailTextTypeDomainClaimed, user.PreferredLanguage) + if err != nil { + return err + } + err = types.SendDomainClaimed(string(template.Template), text, user, data["userName"], n.systemDefaults, colors) if err != nil { return err } @@ -312,13 +370,54 @@ func (n *Notification) getLabelPolicy(ctx context.Context) (*iam_model.LabelPoli return iam_es_model.LabelPolicyViewToModel(policy), err } -func (n *Notification) getUserByID(userID string) (*model.NotifyUser, error) { +// Read organization specific template +func (n *Notification) getMailTemplate(ctx context.Context) (*iam_model.MailTemplateView, error) { + // read from Org + template, err := n.view.MailTemplateByAggregateID(authz.GetCtxData(ctx).OrgID, mailTemplateTableOrg) + if errors.IsNotFound(err) { + // read from default + template, err = n.view.MailTemplateByAggregateID(n.systemDefaults.IamID, mailTemplateTableDef) + if err != nil { + return nil, err + } + template.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.MailTemplateViewToModel(template), err +} + +// Read organization specific texts +func (n *Notification) getMailText(ctx context.Context, textType string, lang string) (*iam_model.MailTextView, error) { + langTag := language.Make(lang) + if langTag == language.Und { + langTag = n.systemDefaults.DefaultLanguage + } + base, _ := langTag.Base() + // read from Org + mailText, err := n.view.MailTextByIDs(authz.GetCtxData(ctx).OrgID, textType, base.String(), mailTextTableOrg) + if errors.IsNotFound(err) { + // read from default + mailText, err = n.view.MailTextByIDs(n.systemDefaults.IamID, textType, base.String(), mailTextTableDef) + if err != nil { + return nil, err + } + mailText.Default = true + } + if err != nil { + return nil, err + } + return iam_es_model.MailTextViewToModel(mailText), err +} + +func (n *Notification) getUserByID(userID string) (*view_model.NotifyUser, error) { user, usrErr := n.view.NotifyUserByID(userID) if usrErr != nil && !caos_errs.IsNotFound(usrErr) { return nil, usrErr } if user == nil { - user = &model.NotifyUser{} + user = &view_model.NotifyUser{} } events, err := n.getUserEvents(userID, user.Sequence) if err != nil { @@ -331,7 +430,7 @@ func (n *Notification) getUserByID(userID string) (*model.NotifyUser, error) { } } if userCopy.State == int32(model.UserStateDeleted) { - return nil, caos_errs.ThrowNotFound(nil, "EVENT-3n8fs", "Errors.User.NotFound") + return nil, caos_errs.ThrowNotFound(nil, "HANDLER-3n8fs", "Errors.User.NotFound") } return &userCopy, nil } diff --git a/internal/notification/repository/eventsourcing/handler/notify_user.go b/internal/notification/repository/eventsourcing/handler/notify_user.go index 4b82a16c0c..7d774d19ea 100644 --- a/internal/notification/repository/eventsourcing/handler/notify_user.go +++ b/internal/notification/repository/eventsourcing/handler/notify_user.go @@ -63,8 +63,8 @@ func (_ *NotifyUser) AggregateTypes() []es_models.AggregateType { return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate} } -func (p *NotifyUser) CurrentSequence(event *es_models.Event) (uint64, error) { - sequence, err := p.view.GetLatestNotifyUserSequence(string(event.AggregateType)) +func (p *NotifyUser) CurrentSequence() (uint64, error) { + sequence, err := p.view.GetLatestNotifyUserSequence() if err != nil { return 0, err } @@ -72,7 +72,7 @@ func (p *NotifyUser) CurrentSequence(event *es_models.Event) (uint64, error) { } func (p *NotifyUser) EventQuery() (*es_models.SearchQuery, error) { - sequence, err := p.view.GetLatestNotifyUserSequence("") + sequence, err := p.view.GetLatestNotifyUserSequence() if err != nil { return nil, err } diff --git a/internal/notification/repository/eventsourcing/view/mail_template.go b/internal/notification/repository/eventsourcing/view/mail_template.go new file mode 100644 index 0000000000..0e1ddf8941 --- /dev/null +++ b/internal/notification/repository/eventsourcing/view/mail_template.go @@ -0,0 +1,10 @@ +package view + +import ( + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" +) + +func (v *View) MailTemplateByAggregateID(aggregateID string, mailTemplateTableVar string) (*model.MailTemplateView, error) { + return view.GetMailTemplateByAggregateID(v.Db, mailTemplateTableVar, aggregateID) +} diff --git a/internal/notification/repository/eventsourcing/view/mail_text.go b/internal/notification/repository/eventsourcing/view/mail_text.go new file mode 100644 index 0000000000..3413b73455 --- /dev/null +++ b/internal/notification/repository/eventsourcing/view/mail_text.go @@ -0,0 +1,10 @@ +package view + +import ( + "github.com/caos/zitadel/internal/iam/repository/view" + "github.com/caos/zitadel/internal/iam/repository/view/model" +) + +func (v *View) MailTextByIDs(aggregateID string, textType string, language string, mailTextTableVar string) (*model.MailTextView, error) { + return view.GetMailTextByIDs(v.Db, mailTextTableVar, aggregateID, textType, language) +} diff --git a/internal/notification/repository/eventsourcing/view/notification.go b/internal/notification/repository/eventsourcing/view/notification.go index b14242f47e..fc7041bbab 100644 --- a/internal/notification/repository/eventsourcing/view/notification.go +++ b/internal/notification/repository/eventsourcing/view/notification.go @@ -9,8 +9,8 @@ const ( notificationTable = "notification.notifications" ) -func (v *View) GetLatestNotificationSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(notificationTable, aggregateType) +func (v *View) GetLatestNotificationSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(notificationTable) } func (v *View) ProcessedNotificationSequence(event *models.Event) error { diff --git a/internal/notification/repository/eventsourcing/view/notify_user.go b/internal/notification/repository/eventsourcing/view/notify_user.go index f81c986d0a..b3b3397f77 100644 --- a/internal/notification/repository/eventsourcing/view/notify_user.go +++ b/internal/notification/repository/eventsourcing/view/notify_user.go @@ -36,8 +36,8 @@ func (v *View) DeleteNotifyUser(userID string, event *models.Event) error { return v.ProcessedNotifyUserSequence(event) } -func (v *View) GetLatestNotifyUserSequence(aggregateType string) (*repository.CurrentSequence, error) { - return v.latestSequence(notifyUserTable, aggregateType) +func (v *View) GetLatestNotifyUserSequence() (*repository.CurrentSequence, error) { + return v.latestSequence(notifyUserTable) } func (v *View) ProcessedNotifyUserSequence(event *models.Event) error { diff --git a/internal/notification/repository/eventsourcing/view/sequence.go b/internal/notification/repository/eventsourcing/view/sequence.go index 8d56cc19b9..d7155c6292 100644 --- a/internal/notification/repository/eventsourcing/view/sequence.go +++ b/internal/notification/repository/eventsourcing/view/sequence.go @@ -12,15 +12,15 @@ const ( ) func (v *View) saveCurrentSequence(viewName string, event *models.Event) error { - return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, string(event.AggregateType), event.Sequence, event.CreationDate) + return repository.SaveCurrentSequence(v.Db, sequencesTable, viewName, event.Sequence, event.CreationDate) } -func (v *View) latestSequence(viewName, aggregateType string) (*repository.CurrentSequence, error) { - return repository.LatestSequence(v.Db, sequencesTable, viewName, aggregateType) +func (v *View) latestSequence(viewName string) (*repository.CurrentSequence, error) { + return repository.LatestSequence(v.Db, sequencesTable, viewName) } func (v *View) updateSpoolerRunSequence(viewName string) error { - currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName, "") + currentSequence, err := repository.LatestSequence(v.Db, sequencesTable, viewName) if err != nil { return err } diff --git a/internal/notification/templates/template.go b/internal/notification/templates/template.go index ae0dd70c38..98209366c2 100644 --- a/internal/notification/templates/template.go +++ b/internal/notification/templates/template.go @@ -12,23 +12,21 @@ const ( templateFileName = "template.html" ) -func GetParsedTemplate(dir http.FileSystem, contentData interface{}) (string, error) { - template, err := ParseTemplateFile(dir, "", contentData) +func GetParsedTemplate(mailhtml string, contentData interface{}) (string, error) { + template, err := ParseTemplateFile(mailhtml, contentData) if err != nil { return "", err } return ParseTemplateText(template, contentData) } -func ParseTemplateFile(dir http.FileSystem, fileName string, data interface{}) (string, error) { - if fileName == "" { - fileName = templateFileName - } - template, err := readFile(dir, fileName) +func ParseTemplateFile(mailhtml string, data interface{}) (string, error) { + tmpl, err := template.New("tmpl").Parse(mailhtml) if err != nil { return "", err } - return parseTemplate(template, data) + + return parseTemplate(tmpl, data) } func ParseTemplateText(text string, data interface{}) (string, error) { @@ -63,3 +61,20 @@ func readFile(dir http.FileSystem, fileName string) (*template.Template, error) } return tmpl, nil } + +func readFileFromDatabase(dir http.FileSystem, fileName string) (*template.Template, error) { + f, err := dir.Open(templatesPath + "/" + fileName) + if err != nil { + return nil, err + } + defer f.Close() + content, err := ioutil.ReadAll(f) + if err != nil { + return nil, err + } + tmpl, err := template.New(fileName).Parse(string(content)) + if err != nil { + return nil, err + } + return tmpl, nil +} diff --git a/internal/notification/types/domain_claimed.go b/internal/notification/types/domain_claimed.go index d89dbcc0fd..5af796f735 100644 --- a/internal/notification/types/domain_claimed.go +++ b/internal/notification/types/domain_claimed.go @@ -1,11 +1,11 @@ package types import ( - "net/http" + "html" "strings" "github.com/caos/zitadel/internal/config/systemdefaults" - "github.com/caos/zitadel/internal/i18n" + iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/internal/notification/templates" view_model "github.com/caos/zitadel/internal/user/repository/view/model" ) @@ -15,7 +15,7 @@ type DomainClaimedData struct { URL string } -func SendDomainClaimed(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, username string, systemDefaults systemdefaults.SystemDefaults) error { +func SendDomainClaimed(mailhtml string, text *iam_model.MailTextView, user *view_model.NotifyUser, username string, systemDefaults systemdefaults.SystemDefaults, colors *iam_model.LabelPolicyView) error { url, err := templates.ParseTemplateText(systemDefaults.Notifications.Endpoints.DomainClaimed, &UrlData{UserID: user.ID}) if err != nil { return err @@ -27,11 +27,28 @@ func SendDomainClaimed(dir http.FileSystem, i18n *i18n.Translator, user *view_mo "TempUsername": username, "Domain": strings.Split(user.LastEmail, "@")[1], } - systemDefaults.Notifications.TemplateData.DomainClaimed.Translate(i18n, args, user.PreferredLanguage) - data := &DomainClaimedData{TemplateData: systemDefaults.Notifications.TemplateData.DomainClaimed, URL: url} - template, err := templates.GetParsedTemplate(dir, data) + + text.Greeting, err = templates.ParseTemplateText(text.Greeting, args) + text.Text, err = templates.ParseTemplateText(text.Text, args) + text.Text = html.UnescapeString(text.Text) + + emailCodeData := &DomainClaimedData{ + TemplateData: templates.TemplateData{ + Title: text.Title, + PreHeader: text.PreHeader, + Subject: text.Subject, + Greeting: text.Greeting, + Text: html.UnescapeString(text.Text), + Href: url, + ButtonText: text.ButtonText, + PrimaryColor: colors.PrimaryColor, + SecondaryColor: colors.SecondaryColor, + }, + URL: url, + } + template, err := templates.GetParsedTemplate(mailhtml, emailCodeData) if err != nil { return err } - return generateEmail(user, systemDefaults.Notifications.TemplateData.DomainClaimed.Subject, template, systemDefaults.Notifications, true) + return generateEmail(user, text.Subject, template, systemDefaults.Notifications, true) } diff --git a/internal/notification/types/email_verification_code.go b/internal/notification/types/email_verification_code.go index 77f5750e48..8c97af995b 100644 --- a/internal/notification/types/email_verification_code.go +++ b/internal/notification/types/email_verification_code.go @@ -1,11 +1,10 @@ package types import ( - "net/http" + "html" "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" - "github.com/caos/zitadel/internal/i18n" iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/internal/notification/templates" es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" @@ -17,7 +16,7 @@ type EmailVerificationCodeData struct { URL string } -func SendEmailVerificationCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.EmailCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { +func SendEmailVerificationCode(mailhtml string, text *iam_model.MailTextView, user *view_model.NotifyUser, code *es_model.EmailCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -31,15 +30,29 @@ func SendEmailVerificationCode(dir http.FileSystem, i18n *i18n.Translator, user "LastName": user.LastName, "Code": codeString, } - systemDefaults.Notifications.TemplateData.VerifyEmail.Translate(i18n, args, user.PreferredLanguage) - emailCodeData := &EmailVerificationCodeData{TemplateData: systemDefaults.Notifications.TemplateData.VerifyEmail, URL: url} - // Set the color in initCodeData - emailCodeData.PrimaryColor = colors.PrimaryColor - emailCodeData.SecondaryColor = colors.SecondaryColor - template, err := templates.GetParsedTemplate(dir, emailCodeData) + text.Greeting, err = templates.ParseTemplateText(text.Greeting, args) + text.Text, err = templates.ParseTemplateText(text.Text, args) + text.Text = html.UnescapeString(text.Text) + + emailCodeData := &EmailVerificationCodeData{ + TemplateData: templates.TemplateData{ + Title: text.Title, + PreHeader: text.PreHeader, + Subject: text.Subject, + Greeting: text.Greeting, + Text: html.UnescapeString(text.Text), + Href: url, + ButtonText: text.ButtonText, + PrimaryColor: colors.PrimaryColor, + SecondaryColor: colors.SecondaryColor, + }, + URL: url, + } + + template, err := templates.GetParsedTemplate(mailhtml, emailCodeData) if err != nil { return err } - return generateEmail(user, systemDefaults.Notifications.TemplateData.VerifyEmail.Subject, template, systemDefaults.Notifications, true) + return generateEmail(user, text.Subject, template, systemDefaults.Notifications, true) } diff --git a/internal/notification/types/init_code.go b/internal/notification/types/init_code.go index 86da8d3ccd..c403e1bdb4 100644 --- a/internal/notification/types/init_code.go +++ b/internal/notification/types/init_code.go @@ -1,11 +1,10 @@ package types import ( - "net/http" + "html" "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" - "github.com/caos/zitadel/internal/i18n" iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/internal/notification/templates" es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" @@ -23,7 +22,7 @@ type UrlData struct { PasswordSet bool } -func SendUserInitCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.InitUserCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { +func SendUserInitCode(mailhtml string, text *iam_model.MailTextView, user *view_model.NotifyUser, code *es_model.InitUserCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -38,15 +37,28 @@ func SendUserInitCode(dir http.FileSystem, i18n *i18n.Translator, user *view_mod "Code": codeString, "PreferredLoginName": user.PreferredLoginName, } - systemDefaults.Notifications.TemplateData.InitCode.Translate(i18n, args, user.PreferredLanguage) - initCodeData := &InitCodeEmailData{TemplateData: systemDefaults.Notifications.TemplateData.InitCode, URL: url} - // Set the color in initCodeData - initCodeData.PrimaryColor = colors.PrimaryColor - initCodeData.SecondaryColor = colors.SecondaryColor - template, err := templates.GetParsedTemplate(dir, initCodeData) + text.Greeting, err = templates.ParseTemplateText(text.Greeting, args) + text.Text, err = templates.ParseTemplateText(text.Text, args) + text.Text = html.UnescapeString(text.Text) + + emailCodeData := &InitCodeEmailData{ + TemplateData: templates.TemplateData{ + Title: text.Title, + PreHeader: text.PreHeader, + Subject: text.Subject, + Greeting: text.Greeting, + Text: html.UnescapeString(text.Text), + Href: url, + ButtonText: text.ButtonText, + PrimaryColor: colors.PrimaryColor, + SecondaryColor: colors.SecondaryColor, + }, + URL: url, + } + template, err := templates.GetParsedTemplate(mailhtml, emailCodeData) if err != nil { return err } - return generateEmail(user, systemDefaults.Notifications.TemplateData.InitCode.Subject, template, systemDefaults.Notifications, true) + return generateEmail(user, text.Subject, template, systemDefaults.Notifications, true) } diff --git a/internal/notification/types/password_code.go b/internal/notification/types/password_code.go index 41f6a21dc6..7f072d5c03 100644 --- a/internal/notification/types/password_code.go +++ b/internal/notification/types/password_code.go @@ -1,11 +1,10 @@ package types import ( - "net/http" + "html" "github.com/caos/zitadel/internal/config/systemdefaults" "github.com/caos/zitadel/internal/crypto" - "github.com/caos/zitadel/internal/i18n" iam_model "github.com/caos/zitadel/internal/iam/model" "github.com/caos/zitadel/internal/notification/templates" es_model "github.com/caos/zitadel/internal/user/repository/eventsourcing/model" @@ -19,7 +18,7 @@ type PasswordCodeData struct { URL string } -func SendPasswordCode(dir http.FileSystem, i18n *i18n.Translator, user *view_model.NotifyUser, code *es_model.PasswordCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { +func SendPasswordCode(mailhtml string, text *iam_model.MailTextView, user *view_model.NotifyUser, code *es_model.PasswordCode, systemDefaults systemdefaults.SystemDefaults, alg crypto.EncryptionAlgorithm, colors *iam_model.LabelPolicyView) error { codeString, err := crypto.DecryptString(code.Code, alg) if err != nil { return err @@ -33,15 +32,30 @@ func SendPasswordCode(dir http.FileSystem, i18n *i18n.Translator, user *view_mod "LastName": user.LastName, "Code": codeString, } - systemDefaults.Notifications.TemplateData.PasswordReset.Translate(i18n, args, user.PreferredLanguage) - passwordCodeData := &PasswordCodeData{TemplateData: systemDefaults.Notifications.TemplateData.PasswordReset, FirstName: user.FirstName, LastName: user.LastName, URL: url} - // Set the color in initCodeData - passwordCodeData.PrimaryColor = colors.PrimaryColor - passwordCodeData.SecondaryColor = colors.SecondaryColor - template, err := templates.GetParsedTemplate(dir, passwordCodeData) + text.Greeting, err = templates.ParseTemplateText(text.Greeting, args) + text.Text, err = templates.ParseTemplateText(text.Text, args) + text.Text = html.UnescapeString(text.Text) + + emailCodeData := &PasswordCodeData{ + TemplateData: templates.TemplateData{ + Title: text.Title, + PreHeader: text.PreHeader, + Subject: text.Subject, + Greeting: text.Greeting, + Text: html.UnescapeString(text.Text), + Href: url, + ButtonText: text.ButtonText, + PrimaryColor: colors.PrimaryColor, + SecondaryColor: colors.SecondaryColor, + }, + FirstName: user.FirstName, + LastName: user.LastName, + URL: url, + } + template, err := templates.GetParsedTemplate(mailhtml, emailCodeData) if err != nil { return err } - return generateEmail(user, systemDefaults.Notifications.TemplateData.PasswordReset.Subject, template, systemDefaults.Notifications, false) + return generateEmail(user, text.Subject, template, systemDefaults.Notifications, true) } diff --git a/internal/org/model/org.go b/internal/org/model/org.go index 3a0bdec40e..6ae649acd4 100644 --- a/internal/org/model/org.go +++ b/internal/org/model/org.go @@ -19,6 +19,8 @@ type Org struct { OrgIamPolicy *iam_model.OrgIAMPolicy LoginPolicy *iam_model.LoginPolicy LabelPolicy *iam_model.LabelPolicy + MailTemplate *iam_model.MailTemplate + MailTexts []*iam_model.MailText PasswordComplexityPolicy *iam_model.PasswordComplexityPolicy PasswordAgePolicy *iam_model.PasswordAgePolicy PasswordLockoutPolicy *iam_model.PasswordLockoutPolicy diff --git a/internal/org/repository/eventsourcing/eventstore.go b/internal/org/repository/eventsourcing/eventstore.go index dff8a95b22..8266c27a0b 100644 --- a/internal/org/repository/eventsourcing/eventstore.go +++ b/internal/org/repository/eventsourcing/eventstore.go @@ -1153,3 +1153,121 @@ func (es *OrgEventstore) RemovePasswordLockoutPolicy(ctx context.Context, policy addAggregate := PasswordLockoutPolicyRemovedAggregate(es.Eventstore.AggregateCreator(), repoOrg) return es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) } + +func (es *OrgEventstore) AddMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) { + if template == nil || !template.IsValid() { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-nb66d", "Errors.Org.MailTemplateInvalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(template.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) + repoMailTemplate := iam_es_model.MailTemplateFromModel(template) + + addAggregate := MailTemplateAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoMailTemplate) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + return iam_es_model.MailTemplateToModel(repoOrg.MailTemplate), nil +} + +func (es *OrgEventstore) ChangeMailTemplate(ctx context.Context, template *iam_model.MailTemplate) (*iam_model.MailTemplate, error) { + if template == nil || !template.IsValid() { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-FV2qE", "Errors.Org.MailTemplateInvalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(template.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) + repoMailTemplate := iam_es_model.MailTemplateFromModel(template) + + addAggregate := MailTemplateChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoMailTemplate) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + repoOrg.MailTemplate.Template = repoMailTemplate.Template + return iam_es_model.MailTemplateToModel(repoOrg.MailTemplate), nil +} + +func (es *OrgEventstore) RemoveMailTemplate(ctx context.Context, template *iam_model.MailTemplate) error { + if template == nil || !template.IsValid() { + return errors.ThrowPreconditionFailed(nil, "EVENT-LulaW", "Errors.Org.MailTemplate.Invalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(template.AggregateID)) + if err != nil { + return err + } + repoOrg := model.OrgFromModel(org) + + addAggregate := MailTemplateRemovedAggregate(es.Eventstore.AggregateCreator(), repoOrg) + return es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) +} + +func (es *OrgEventstore) AddMailText(ctx context.Context, mailtext *iam_model.MailText) (*iam_model.MailText, error) { + if mailtext == nil || !mailtext.IsValid() { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-108Iz", "Errors.Org.MailTextInvalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(mailtext.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) + repoMailText := iam_es_model.MailTextFromModel(mailtext) + + addAggregate := MailTextAddedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoMailText) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + + if _, r := iam_es_model.GetMailText(repoOrg.MailTexts, repoMailText.MailTextType, repoMailText.Language); r != nil { + return iam_es_model.MailTextToModel(r), nil + } + return nil, errors.ThrowInternal(nil, "EVENT-oc1GN", "Errors.Internal") +} + +func (es *OrgEventstore) ChangeMailText(ctx context.Context, mailtext *iam_model.MailText) (*iam_model.MailText, error) { + if mailtext == nil || !mailtext.IsValid() { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-fdbqE", "Errors.Org.MailTextInvalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(mailtext.AggregateID)) + if err != nil { + return nil, err + } + + repoOrg := model.OrgFromModel(org) + repoMailText := iam_es_model.MailTextFromModel(mailtext) + + addAggregate := MailTextChangedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoMailText) + err = es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) + if err != nil { + return nil, err + } + + if _, r := iam_es_model.GetMailText(repoOrg.MailTexts, mailtext.MailTextType, mailtext.Language); r != nil { + return iam_es_model.MailTextToModel(r), nil + } + return nil, errors.ThrowInternal(nil, "EVENT-F2whI", "Errors.Internal") +} + +func (es *OrgEventstore) RemoveMailText(ctx context.Context, mailtext *iam_model.MailText) error { + if mailtext == nil || !mailtext.IsValid() { + return errors.ThrowPreconditionFailed(nil, "EVENT-LulaW", "Errors.Org.MailText.Invalid") + } + org, err := es.OrgByID(ctx, org_model.NewOrg(mailtext.AggregateID)) + if err != nil { + return err + } + repoOrg := model.OrgFromModel(org) + repoMailText := iam_es_model.MailTextFromModel(mailtext) + + addAggregate := MailTextRemovedAggregate(es.Eventstore.AggregateCreator(), repoOrg, repoMailText) + return es_sdk.Push(ctx, es.PushAggregates, repoOrg.AppendEvents, addAggregate) +} diff --git a/internal/org/repository/eventsourcing/eventstore_mock_test.go b/internal/org/repository/eventsourcing/eventstore_mock_test.go index f36f48d7f9..8ca15230c1 100644 --- a/internal/org/repository/eventsourcing/eventstore_mock_test.go +++ b/internal/org/repository/eventsourcing/eventstore_mock_test.go @@ -192,3 +192,31 @@ func GetMockChangesOrgWithLabelPolicy(ctrl *gomock.Controller) *OrgEventstore { mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) return GetMockedEventstore(ctrl, mockEs) } + +func GetMockChangesOrgWithMailTemplate(ctrl *gomock.Controller) *OrgEventstore { + orgData, _ := json.Marshal(model.Org{Name: "MusterOrg"}) + mailTemplate, _ := json.Marshal(iam_es_model.MailTemplate{Template: []byte("")}) + events := []*es_models.Event{ + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.MailTemplateAdded, Data: mailTemplate}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} + +func GetMockChangesOrgWithMailText(ctrl *gomock.Controller) *OrgEventstore { + orgData, _ := json.Marshal(model.Org{Name: "MusterOrg"}) + mailText, _ := json.Marshal(iam_es_model.MailText{MailTextType: "Type", Language: "DE"}) + events := []*es_models.Event{ + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.OrgAdded, Data: orgData}, + &es_models.Event{AggregateID: "AggregateID", Sequence: 1, Type: model.MailTextAdded, Data: mailText}, + } + mockEs := mock.NewMockEventstore(ctrl) + mockEs.EXPECT().FilterEvents(gomock.Any(), gomock.Any()).Return(events, nil) + mockEs.EXPECT().AggregateCreator().Return(es_models.NewAggregateCreator("TEST")) + mockEs.EXPECT().PushAggregates(gomock.Any(), gomock.Any()).Return(nil) + return GetMockedEventstore(ctrl, mockEs) +} diff --git a/internal/org/repository/eventsourcing/eventstore_test.go b/internal/org/repository/eventsourcing/eventstore_test.go index b1b0a75aa3..4db2c10943 100644 --- a/internal/org/repository/eventsourcing/eventstore_test.go +++ b/internal/org/repository/eventsourcing/eventstore_test.go @@ -3996,3 +3996,327 @@ func TestRemovePasswordLockoutPolicy(t *testing.T) { }) } } + +func TestAddMailTemplate(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + template *iam_model.MailTemplate + } + type res struct { + result *iam_model.MailTemplate + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add label template, ok", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + Template: []byte(""), + }, + }, + res: res{ + result: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + Template: []byte(""), + }, + }, + }, + { + name: "invalid template", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing org not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddMailTemplate(tt.args.ctx, tt.args.template) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if string(result.Template) != string(tt.res.result.Template) { + t.Errorf("got wrong result Template: expected: %v, actual: %v ", tt.res.result.Template, result.Template) + } + }) + } +} + +func TestChangeMailTemplate(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + template *iam_model.MailTemplate + } + type res struct { + result *iam_model.MailTemplate + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add mail template, ok", + args: args{ + es: GetMockChangesOrgWithMailTemplate(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + Template: []byte(""), + }, + }, + res: res{ + result: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + Template: []byte(""), + }, + }, + }, + { + name: "invalid template", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + template: &iam_model.MailTemplate{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangeMailTemplate(tt.args.ctx, tt.args.template) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if string(result.Template) != string(tt.res.result.Template) { + t.Errorf("got wrong result Template: expected: %v, actual: %v ", tt.res.result.Template, result.Template) + } + }) + } +} + +func TestAddMailText(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + mailtext *iam_model.MailText + } + type res struct { + result *iam_model.MailText + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add label mailtext, ok", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + mailtext: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MailTextType: "Type", + Language: "DE", + }, + }, + res: res{ + result: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MailTextType: "Type", + Language: "DE", + }, + }, + }, + { + name: "invalid mailtext", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + mailtext: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing org not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + mailtext: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.AddMailText(tt.args.ctx, tt.args.mailtext) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if result.MailTextType != tt.res.result.MailTextType { + t.Errorf("got wrong result MailTextType: expected: %v, actual: %v ", tt.res.result.MailTextType, result.MailTextType) + } + }) + } +} + +func TestChangeMailText(t *testing.T) { + ctrl := gomock.NewController(t) + type args struct { + es *OrgEventstore + ctx context.Context + mailtext *iam_model.MailText + } + type res struct { + result *iam_model.MailText + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add label mailtext, ok", + args: args{ + es: GetMockChangesOrgWithMailText(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + mailtext: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MailTextType: "Type", + Language: "DE", + }, + }, + res: res{ + result: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + MailTextType: "Type", + Language: "DE", + }, + }, + }, + { + name: "invalid mailtext", + args: args{ + es: GetMockChangesOrgOK(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + mailtext: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "existing iam not found", + args: args{ + es: GetMockChangesOrgNoEvents(ctrl), + ctx: authz.NewMockContext("orgID", "userID"), + mailtext: &iam_model.MailText{ + ObjectRoot: es_models.ObjectRoot{AggregateID: "AggregateID", Sequence: 0}, + }, + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsNotFound, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result, err := tt.args.es.ChangeMailText(tt.args.ctx, tt.args.mailtext) + if (tt.res.wantErr && !tt.res.errFunc(err)) || (err != nil && !tt.res.wantErr) { + t.Errorf("got wrong err: %v ", err) + return + } + if tt.res.wantErr && tt.res.errFunc(err) { + return + } + if string(result.MailTextType) != string(tt.res.result.MailTextType) { + t.Errorf("got wrong result MailTextType: expected: %v, actual: %v ", tt.res.result.MailTextType, result.MailTextType) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/label_policy_test.go b/internal/org/repository/eventsourcing/label_policy_test.go index ccd0c2a6ec..9be177f664 100644 --- a/internal/org/repository/eventsourcing/label_policy_test.go +++ b/internal/org/repository/eventsourcing/label_policy_test.go @@ -30,7 +30,7 @@ func TestLabelPolicyAddedAggregate(t *testing.T) { res res }{ { - name: "add label polciy", + name: "add label policy", args: args{ ctx: authz.NewMockContext("orgID", "userID"), existing: &model.Org{ diff --git a/internal/org/repository/eventsourcing/mail_template.go b/internal/org/repository/eventsourcing/mail_template.go new file mode 100644 index 0000000000..f185b1c07d --- /dev/null +++ b/internal/org/repository/eventsourcing/mail_template.go @@ -0,0 +1,77 @@ +package eventsourcing + +import ( + "context" + + "github.com/caos/zitadel/internal/errors" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func MailTemplateAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, policy *iam_es_model.MailTemplate) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if policy == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-4BeRi", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingMailTemplateValidation() + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.MailTemplateAdded, policy) + } +} + +func MailTemplateChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, template *iam_es_model.MailTemplate) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if template == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-yzXO0", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + changes := existing.MailTemplate.Changes(template) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-erTCI", "Errors.NoChangesFound") + } + return agg.AppendEvent(model.MailTemplateChanged, changes) + } +} + +func MailTemplateRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if existing == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-2jVit", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + return agg.AppendEvent(model.MailTemplateRemoved, nil) + } +} + +func checkExistingMailTemplateValidation() func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + existing := false + for _, event := range events { + switch event.Type { + case model.MailTemplateAdded: + existing = true + case model.MailTemplateRemoved: + existing = false + } + } + if existing { + return errors.ThrowPreconditionFailed(nil, "EVENT-aUH4D", "Errors.Org.MailTemplate.AlreadyExists") + } + return nil + } +} diff --git a/internal/org/repository/eventsourcing/mail_template_test.go b/internal/org/repository/eventsourcing/mail_template_test.go new file mode 100644 index 0000000000..bd2b10ce06 --- /dev/null +++ b/internal/org/repository/eventsourcing/mail_template_test.go @@ -0,0 +1,185 @@ +package eventsourcing + +import ( + "context" + "testing" + + "github.com/caos/zitadel/internal/api/authz" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func TestMailTemplateAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.MailTemplate + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add mailtemplate", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + new: &iam_es_model.MailTemplate{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + Template: []byte(""), + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.MailTemplateAdded}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "mailtemplate config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := MailTemplateAddedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestMailTemplateChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.MailTemplate + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change mailtemplate", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MailTemplate: &iam_es_model.MailTemplate{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + }, + new: &iam_es_model.MailTemplate{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + Template: []byte(""), + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.MailTemplateChanged}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "mailtemplate config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := MailTemplateChangedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/mail_text.go b/internal/org/repository/eventsourcing/mail_text.go new file mode 100644 index 0000000000..2f6ea08b13 --- /dev/null +++ b/internal/org/repository/eventsourcing/mail_text.go @@ -0,0 +1,94 @@ +package eventsourcing + +import ( + "context" + + "github.com/caos/zitadel/internal/errors" + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func MailTextAddedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, mailText *iam_es_model.MailText) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if mailText == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Gk3Cn", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + validationQuery := es_models.NewSearchQuery(). + AggregateTypeFilter(model.OrgAggregate). + AggregateIDFilter(existing.AggregateID) + + validation := checkExistingMailTextValidation(mailText, existing.MailTexts) + agg.SetPrecondition(validationQuery, validation) + return agg.AppendEvent(model.MailTextAdded, mailText) + } +} + +func MailTextChangedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, mailText *iam_es_model.MailText) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if mailText == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-Hog8a", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + changes := make(map[string]interface{}, 2) + for _, exMailText := range existing.MailTexts { + if exMailText.MailTextType == mailText.MailTextType && exMailText.Language == mailText.Language { + changes = exMailText.Changes(mailText) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-DuRxA", "Errors.NoChangesFound") + } + } + } + return agg.AppendEvent(model.MailTextChanged, changes) + } +} + +func MailTextRemovedAggregate(aggCreator *es_models.AggregateCreator, existing *model.Org, mailText *iam_es_model.MailText) func(ctx context.Context) (*es_models.Aggregate, error) { + return func(ctx context.Context) (*es_models.Aggregate, error) { + if existing == nil { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-cJ5Wp", "Errors.Internal") + } + agg, err := OrgAggregate(ctx, aggCreator, existing.AggregateID, existing.Sequence) + if err != nil { + return nil, err + } + changes := make(map[string]interface{}, 2) + for _, exMailText := range existing.MailTexts { + if exMailText.MailTextType == mailText.MailTextType && exMailText.Language == mailText.Language { + mailText.ButtonText = exMailText.ButtonText + mailText.Greeting = exMailText.Greeting + mailText.Text = exMailText.Text + mailText.Title = exMailText.Title + mailText.Subject = exMailText.Subject + mailText.PreHeader = exMailText.PreHeader + changes = exMailText.Changes(mailText) + if len(changes) == 0 { + return nil, errors.ThrowPreconditionFailed(nil, "EVENT-DuRxA", "Errors.NoChangesFound") + } + } + } + return agg.AppendEvent(model.MailTextRemoved, changes) + } +} + +func checkExistingMailTextValidation(mailText *iam_es_model.MailText, existingMailTexts []*iam_es_model.MailText) func(...*es_models.Event) error { + return func(events ...*es_models.Event) error { + existing := false + for _, text := range existingMailTexts { + if text.MailTextType == mailText.MailTextType && text.Language == mailText.Language { + existing = true + } + } + if existing { + return errors.ThrowPreconditionFailed(nil, "EVENT-zEZh7", "Errors.Org.MailText.AlreadyExists") + } + return nil + } +} diff --git a/internal/org/repository/eventsourcing/mail_text_test.go b/internal/org/repository/eventsourcing/mail_text_test.go new file mode 100644 index 0000000000..f6b1879ead --- /dev/null +++ b/internal/org/repository/eventsourcing/mail_text_test.go @@ -0,0 +1,188 @@ +package eventsourcing + +import ( + "context" + "testing" + + "github.com/caos/zitadel/internal/api/authz" + caos_errs "github.com/caos/zitadel/internal/errors" + "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" + "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" +) + +func TestMailTextAddedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.MailText + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "add mailtext", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + }, + new: &iam_es_model.MailText{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MailTextType: "Type", + Language: "DE", + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.MailTextAdded}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "mailtext config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := MailTextAddedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} + +func TestMailTextChangedAggregate(t *testing.T) { + type args struct { + ctx context.Context + existing *model.Org + new *iam_es_model.MailText + aggCreator *models.AggregateCreator + } + type res struct { + eventLen int + eventTypes []models.EventType + wantErr bool + errFunc func(err error) bool + } + tests := []struct { + name string + args args + res res + }{ + { + name: "change mailtext", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MailTexts: []*iam_es_model.MailText{&iam_es_model.MailText{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + }, + }, + new: &iam_es_model.MailText{ + ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}, + MailTextType: "Type", + Language: "DE", + Subject: "Subject", + }, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + eventLen: 1, + eventTypes: []models.EventType{model.MailTextChanged}, + }, + }, + { + name: "existing org nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + { + name: "mailtext config nil", + args: args{ + ctx: authz.NewMockContext("orgID", "userID"), + existing: &model.Org{ObjectRoot: models.ObjectRoot{AggregateID: "AggregateID"}}, + new: nil, + aggCreator: models.NewAggregateCreator("Test"), + }, + res: res{ + wantErr: true, + errFunc: caos_errs.IsPreconditionFailed, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + agg, err := MailTextChangedAggregate(tt.args.aggCreator, tt.args.existing, tt.args.new)(tt.args.ctx) + + if !tt.res.wantErr && len(agg.Events) != tt.res.eventLen { + t.Errorf("got wrong event len: expected: %v, actual: %v ", tt.res.eventLen, len(agg.Events)) + } + for i := 0; i < tt.res.eventLen; i++ { + if !tt.res.wantErr && agg.Events[i].Type != tt.res.eventTypes[i] { + t.Errorf("got wrong event type: expected: %v, actual: %v ", tt.res.eventTypes[i], agg.Events[i].Type.String()) + } + if !tt.res.wantErr && agg.Events[i].Data == nil { + t.Errorf("should have data in event") + } + } + + if tt.res.wantErr && !tt.res.errFunc(err) { + t.Errorf("got wrong err: %v ", err) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/model/mail_template.go b/internal/org/repository/eventsourcing/model/mail_template.go new file mode 100644 index 0000000000..4a0f4aff5d --- /dev/null +++ b/internal/org/repository/eventsourcing/model/mail_template.go @@ -0,0 +1,31 @@ +package model + +import ( + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func (o *Org) appendAddMailTemplateEvent(event *es_models.Event) error { + o.MailTemplate = new(iam_es_model.MailTemplate) + err := o.MailTemplate.SetDataLabel(event) + if err != nil { + return err + } + o.MailTemplate.ObjectRoot.CreationDate = event.CreationDate + return nil +} + +func (o *Org) appendChangeMailTemplateEvent(event *es_models.Event) error { + mailTemplate := &iam_es_model.MailTemplate{} + err := mailTemplate.SetDataLabel(event) + if err != nil { + return err + } + mailTemplate.ObjectRoot.ChangeDate = event.CreationDate + o.MailTemplate = mailTemplate + return nil +} + +func (o *Org) appendRemoveMailTemplateEvent(event *es_models.Event) { + o.MailTemplate = nil +} diff --git a/internal/org/repository/eventsourcing/model/mail_template_test.go b/internal/org/repository/eventsourcing/model/mail_template_test.go new file mode 100644 index 0000000000..2ec769de01 --- /dev/null +++ b/internal/org/repository/eventsourcing/model/mail_template_test.go @@ -0,0 +1,83 @@ +package model + +import ( + "encoding/json" + "testing" + + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func TestAppendAddMailTemplateEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.MailTemplate + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append add label policy event", + args: args{ + org: &Org{}, + policy: &iam_es_model.MailTemplate{Template: []byte("")}, + event: &es_models.Event{}, + }, + result: &Org{MailTemplate: &iam_es_model.MailTemplate{Template: []byte("")}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendAddMailTemplateEvent(tt.args.event) + if string(tt.result.MailTemplate.Template) != string(tt.args.org.MailTemplate.Template) { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.MailTemplate.Template, tt.args.org.MailTemplate.Template) + } + }) + } +} + +func TestAppendChangeMailTemplateEvent(t *testing.T) { + type args struct { + org *Org + policy *iam_es_model.MailTemplate + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append change label policy event", + args: args{ + org: &Org{MailTemplate: &iam_es_model.MailTemplate{ + Template: []byte(""), + }}, + policy: &iam_es_model.MailTemplate{Template: []byte("")}, + event: &es_models.Event{}, + }, + result: &Org{MailTemplate: &iam_es_model.MailTemplate{ + Template: []byte(""), + }}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.policy != nil { + data, _ := json.Marshal(tt.args.policy) + tt.args.event.Data = data + } + tt.args.org.appendChangeMailTemplateEvent(tt.args.event) + if string(tt.result.MailTemplate.Template) != string(tt.args.org.MailTemplate.Template) { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.MailTemplate.Template, tt.args.org.MailTemplate.Template) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/model/mail_text.go b/internal/org/repository/eventsourcing/model/mail_text.go new file mode 100644 index 0000000000..964cb2dea9 --- /dev/null +++ b/internal/org/repository/eventsourcing/model/mail_text.go @@ -0,0 +1,44 @@ +package model + +import ( + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func (o *Org) appendAddMailTextEvent(event *es_models.Event) error { + mailText := &iam_es_model.MailText{} + err := mailText.SetDataLabel(event) + if err != nil { + return err + } + mailText.ObjectRoot.CreationDate = event.CreationDate + o.MailTexts = append(o.MailTexts, mailText) + return nil +} + +func (o *Org) appendChangeMailTextEvent(event *es_models.Event) error { + mailText := &iam_es_model.MailText{} + err := mailText.SetDataLabel(event) + if err != nil { + return err + } + mailText.ObjectRoot.ChangeDate = event.CreationDate + if n, m := iam_es_model.GetMailText(o.MailTexts, mailText.MailTextType, mailText.Language); m != nil { + o.MailTexts[n] = mailText + } + return nil +} + +func (o *Org) appendRemoveMailTextEvent(event *es_models.Event) error { + mailText := &iam_es_model.MailText{} + err := mailText.SetDataLabel(event) + if err != nil { + return err + } + if n, m := iam_es_model.GetMailText(o.MailTexts, mailText.MailTextType, mailText.Language); m != nil { + o.MailTexts[n] = o.MailTexts[len(o.MailTexts)-1] + o.MailTexts[len(o.MailTexts)-1] = nil + o.MailTexts = o.MailTexts[:len(o.MailTexts)-1] + } + return nil +} diff --git a/internal/org/repository/eventsourcing/model/mail_text_test.go b/internal/org/repository/eventsourcing/model/mail_text_test.go new file mode 100644 index 0000000000..640914ad82 --- /dev/null +++ b/internal/org/repository/eventsourcing/model/mail_text_test.go @@ -0,0 +1,91 @@ +package model + +import ( + "encoding/json" + "testing" + + es_models "github.com/caos/zitadel/internal/eventstore/models" + iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" +) + +func TestAppendAddMailTextEvent(t *testing.T) { + type args struct { + org *Org + mailText *iam_es_model.MailText + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append add mail text event", + args: args{ + org: &Org{}, + mailText: &iam_es_model.MailText{MailTextType: "Type", Language: "DE"}, + event: &es_models.Event{}, + }, + result: &Org{MailTexts: []*iam_es_model.MailText{&iam_es_model.MailText{MailTextType: "Type", Language: "DE"}}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.mailText != nil { + data, _ := json.Marshal(tt.args.mailText) + tt.args.event.Data = data + } + tt.args.org.appendAddMailTextEvent(tt.args.event) + if len(tt.args.org.MailTexts) != 1 { + t.Errorf("got wrong result should have one mailtext actual: %v ", len(tt.args.org.MailTexts)) + } + if tt.result.MailTexts[0].Language != tt.args.org.MailTexts[0].Language { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.MailTexts[0].Language, tt.args.org.MailTexts[0].Language) + } + }) + } +} + +func TestAppendChangeMailTextEvent(t *testing.T) { + type args struct { + org *Org + mailText *iam_es_model.MailText + event *es_models.Event + } + tests := []struct { + name string + args args + result *Org + }{ + { + name: "append change mail text event", + args: args{ + org: &Org{MailTexts: []*iam_es_model.MailText{&iam_es_model.MailText{ + Language: "DE", + MailTextType: "TypeX", + }}}, + mailText: &iam_es_model.MailText{MailTextType: "Type", Language: "DE"}, + event: &es_models.Event{}, + }, + result: &Org{MailTexts: []*iam_es_model.MailText{&iam_es_model.MailText{ + Language: "DE", + MailTextType: "Type", + }}}, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if tt.args.mailText != nil { + data, _ := json.Marshal(tt.args.mailText) + tt.args.event.Data = data + } + tt.args.org.appendChangeMailTextEvent(tt.args.event) + if len(tt.args.org.MailTexts) != 1 { + t.Errorf("got wrong result should have one mailtext actual: %v ", len(tt.args.org.MailTexts)) + } + if tt.result.MailTexts[0].Language != tt.args.org.MailTexts[0].Language { + t.Errorf("got wrong result: expected: %v, actual: %v ", tt.result.MailTexts[0].Language, tt.args.org.MailTexts[0].Language) + } + }) + } +} diff --git a/internal/org/repository/eventsourcing/model/org.go b/internal/org/repository/eventsourcing/model/org.go index c4be52ccb1..1998292639 100644 --- a/internal/org/repository/eventsourcing/model/org.go +++ b/internal/org/repository/eventsourcing/model/org.go @@ -25,6 +25,8 @@ type Org struct { Members []*OrgMember `json:"-"` OrgIAMPolicy *iam_es_model.OrgIAMPolicy `json:"-"` LabelPolicy *iam_es_model.LabelPolicy `json:"-"` + MailTemplate *iam_es_model.MailTemplate `json:"-"` + MailTexts []*iam_es_model.MailText `json:"-"` IDPs []*iam_es_model.IDPConfig `json:"-"` LoginPolicy *iam_es_model.LoginPolicy `json:"-"` PasswordComplexityPolicy *iam_es_model.PasswordComplexityPolicy `json:"-"` @@ -36,11 +38,13 @@ func OrgFromModel(org *org_model.Org) *Org { members := OrgMembersFromModel(org.Members) domains := OrgDomainsFromModel(org.Domains) idps := iam_es_model.IDPConfigsFromModel(org.IDPs) + mailTexts := iam_es_model.MailTextsFromModel(org.MailTexts) converted := &Org{ ObjectRoot: org.ObjectRoot, Name: org.Name, State: int32(org.State), Domains: domains, + MailTexts: mailTexts, Members: members, IDPs: idps, } @@ -53,6 +57,9 @@ func OrgFromModel(org *org_model.Org) *Org { if org.LabelPolicy != nil { converted.LabelPolicy = iam_es_model.LabelPolicyFromModel(org.LabelPolicy) } + if org.MailTemplate != nil { + converted.MailTemplate = iam_es_model.MailTemplateFromModel(org.MailTemplate) + } if org.PasswordComplexityPolicy != nil { converted.PasswordComplexityPolicy = iam_es_model.PasswordComplexityPolicyFromModel(org.PasswordComplexityPolicy) } @@ -72,6 +79,7 @@ func OrgToModel(org *Org) *org_model.Org { State: org_model.OrgState(org.State), Domains: OrgDomainsToModel(org.Domains), Members: OrgMembersToModel(org.Members), + MailTexts: iam_es_model.MailTextsToModel(org.MailTexts), IDPs: iam_es_model.IDPConfigsToModel(org.IDPs), } if org.OrgIAMPolicy != nil { @@ -83,6 +91,9 @@ func OrgToModel(org *Org) *org_model.Org { if org.LabelPolicy != nil { converted.LabelPolicy = iam_es_model.LabelPolicyToModel(org.LabelPolicy) } + if org.MailTemplate != nil { + converted.MailTemplate = iam_es_model.MailTemplateToModel(org.MailTemplate) + } if org.PasswordComplexityPolicy != nil { converted.PasswordComplexityPolicy = iam_es_model.PasswordComplexityPolicyToModel(org.PasswordComplexityPolicy) } @@ -199,6 +210,18 @@ func (o *Org) AppendEvent(event *es_models.Event) (err error) { err = o.appendAddIdpProviderToLoginPolicyEvent(event) case LoginPolicyIDPProviderRemoved: err = o.appendRemoveIdpProviderFromLoginPolicyEvent(event) + case MailTemplateAdded: + err = o.appendAddMailTemplateEvent(event) + case MailTemplateChanged: + err = o.appendChangeMailTemplateEvent(event) + case MailTemplateRemoved: + o.appendRemoveMailTemplateEvent(event) + case MailTextAdded: + err = o.appendAddMailTextEvent(event) + case MailTextChanged: + err = o.appendChangeMailTextEvent(event) + case MailTextRemoved: + o.appendRemoveMailTextEvent(event) case LoginPolicySecondFactorAdded: err = o.appendAddSecondFactorToLoginPolicyEvent(event) case LoginPolicySecondFactorRemoved: diff --git a/internal/org/repository/eventsourcing/model/types.go b/internal/org/repository/eventsourcing/model/types.go index 1c40083149..0f21da6749 100644 --- a/internal/org/repository/eventsourcing/model/types.go +++ b/internal/org/repository/eventsourcing/model/types.go @@ -60,6 +60,13 @@ const ( LabelPolicyChanged models.EventType = "org.policy.label.changed" LabelPolicyRemoved models.EventType = "org.policy.label.removed" + MailTemplateAdded models.EventType = "org.mail.template.added" + MailTemplateChanged models.EventType = "org.mail.template.changed" + MailTemplateRemoved models.EventType = "org.mail.template.removed" + MailTextAdded models.EventType = "org.mail.text.added" + MailTextChanged models.EventType = "org.mail.text.changed" + MailTextRemoved models.EventType = "org.mail.text.removed" + PasswordComplexityPolicyAdded models.EventType = "org.policy.password.complexity.added" PasswordComplexityPolicyChanged models.EventType = "org.policy.password.complexity.changed" PasswordComplexityPolicyRemoved models.EventType = "org.policy.password.complexity.removed" diff --git a/internal/project/model/project_role_view.go b/internal/project/model/project_role_view.go index d49540cb8e..0f358b36ce 100644 --- a/internal/project/model/project_role_view.go +++ b/internal/project/model/project_role_view.go @@ -1,8 +1,9 @@ package model import ( - "github.com/caos/zitadel/internal/model" "time" + + "github.com/caos/zitadel/internal/model" ) type ProjectRoleView struct { @@ -13,6 +14,7 @@ type ProjectRoleView struct { DisplayName string Group string CreationDate time.Time + ChangeDate time.Time Sequence uint64 } diff --git a/internal/project/repository/view/model/project_role.go b/internal/project/repository/view/model/project_role.go index 986b1375b1..b7adcb3d0f 100644 --- a/internal/project/repository/view/model/project_role.go +++ b/internal/project/repository/view/model/project_role.go @@ -2,12 +2,13 @@ package model import ( "encoding/json" + "time" + "github.com/caos/logging" caos_errs "github.com/caos/zitadel/internal/errors" "github.com/caos/zitadel/internal/eventstore/models" "github.com/caos/zitadel/internal/project/model" es_model "github.com/caos/zitadel/internal/project/repository/eventsourcing/model" - "time" ) const ( @@ -27,6 +28,7 @@ type ProjectRoleView struct { ResourceOwner string `json:"-" gorm:"resource_owner"` CreationDate time.Time `json:"-" gorm:"column:creation_date"` + ChangeDate time.Time `json:"-" gorm:"column:change_date"` } func ProjectRoleViewFromModel(role *model.ProjectRoleView) *ProjectRoleView { @@ -39,6 +41,7 @@ func ProjectRoleViewFromModel(role *model.ProjectRoleView) *ProjectRoleView { Group: role.Group, Sequence: role.Sequence, CreationDate: role.CreationDate, + ChangeDate: role.ChangeDate, } } @@ -52,6 +55,7 @@ func ProjectRoleToModel(role *ProjectRoleView) *model.ProjectRoleView { Group: role.Group, Sequence: role.Sequence, CreationDate: role.CreationDate, + ChangeDate: role.ChangeDate, } } @@ -71,6 +75,7 @@ func (r *ProjectRoleView) AppendEvent(event *models.Event) (err error) { r.CreationDate = event.CreationDate err = r.SetData(event) case es_model.ProjectRoleChanged: + r.ChangeDate = event.CreationDate err = r.SetData(event) } return err diff --git a/internal/setup/config.go b/internal/setup/config.go index c0f19fb6d9..e5ce1e4487 100644 --- a/internal/setup/config.go +++ b/internal/setup/config.go @@ -15,6 +15,7 @@ type IAMSetUp struct { Step7 *command.Step7 Step8 *command.Step8 Step9 *command.Step9 + Step10 *command.Step10 } func (setup *IAMSetUp) Steps(currentDone domain.Step) ([]command.Step, error) { @@ -30,6 +31,7 @@ func (setup *IAMSetUp) Steps(currentDone domain.Step) ([]command.Step, error) { setup.Step7, setup.Step8, setup.Step9, + setup.Step10, } { if step.Step() <= currentDone { continue diff --git a/internal/setup/step10.go b/internal/setup/step10.go new file mode 100644 index 0000000000..4316f87776 --- /dev/null +++ b/internal/setup/step10.go @@ -0,0 +1,98 @@ +package setup + +// +//type Step10 struct { +// DefaultMailTemplate iam_model.MailTemplate +// DefaultMailTexts []iam_model.MailText +// +// setup *Setup +//} +// +//func (s *Step10) isNil() bool { +// return s == nil +//} +// +//func (step *Step10) step() iam_model.Step { +// return iam_model.Step10 +//} +// +//func (step *Step10) init(setup *Setup) { +// step.setup = setup +//} +// +//func (step *Step10) execute(ctx context.Context) (*iam_model.IAM, error) { +// iam, agg, err := step.mailTemplate(ctx, &step.DefaultMailTemplate) +// if err != nil { +// logging.Log("SETUP-1UYCt").WithField("step", step.step()).WithError(err).Error("unable to finish setup (Mail template)") +// return nil, err +// } +// iam, agg, push, err := step.setup.IamEvents.PrepareSetupDone(ctx, iam, agg, step.step()) +// if err != nil { +// logging.Log("SETUP-fMLsb").WithField("step", step.step()).WithError(err).Error("unable to finish setup (prepare setup done)") +// return nil, err +// } +// err = es_sdk.PushAggregates(ctx, push, iam.AppendEvents, agg) +// if err != nil { +// logging.Log("SETUP-GuS3f").WithField("step", step.step()).WithError(err).Error("unable to finish setup") +// return nil, err +// } +// +// iam, agg, err = step.defaultMailTexts(ctx, &step.DefaultMailTexts) +// if err != nil { +// logging.Log("SETUP-p4oWq").WithError(err).Error("unable to set up defaultMailTexts") +// return nil, err +// } +// iam, agg, push, err = step.setup.IamEvents.PrepareSetupDone(ctx, iam, agg, step.step()) +// if err != nil { +// logging.Log("SETUP-fMLsb").WithField("step", step.step()).WithError(err).Error("unable to finish setup (prepare setup done)") +// return nil, err +// } +// err = es_sdk.PushAggregates(ctx, push, iam.AppendEvents, agg) +// if err != nil { +// logging.Log("SETUP-GuS3f").WithField("step", step.step()).WithError(err).Error("unable to finish setup") +// return nil, err +// } +// +// return iam_es_model.IAMToModel(iam), nil +//} +// +//func (step *Step10) mailTemplate(ctx context.Context, mailTemplate *iam_model.MailTemplate) (*iam_es_model.IAM, *models.Aggregate, error) { +// logging.Log("SETUP-cNrF3").Info("setting up mail template") +// mailTemplate.AggregateID = step.setup.iamID +// iam, aggregate, err := step.setup.IamEvents.PrepareAddMailTemplate(ctx, mailTemplate) +// if err != nil { +// return nil, nil, err +// } +// return iam, aggregate, nil +//} +// +//func (step *Step10) defaultMailTexts(ctx context.Context, defaultMailTexts *[]iam_model.MailText) (*iam_es_model.IAM, *models.Aggregate, error) { +// logging.Log("SETUP-dsTh3").Info("setting up defaultMailTexts") +// iam := &iam_es_model.IAM{} +// var aggregate *models.Aggregate +// for index, iamDefaultMailText := range *defaultMailTexts { +// iaml, aggregatel, err := step.defaultMailText(ctx, &iamDefaultMailText) +// if err != nil { +// logging.LogWithFields("SETUP-IlLif", "DefaultMailText", iamDefaultMailText.MailTextType).WithError(err).Error("unable to create defaultMailText") +// return nil, nil, err +// } +// if index == 0 { +// aggregate = aggregatel +// } else { +// aggregate.Events = append(aggregate.Events, aggregatel.Events...) +// } +// iam = iaml +// } +// logging.Log("SETUP-dgjT4").Info("defaultMailTexts set up") +// return iam, aggregate, nil +//} +// +//func (step *Step10) defaultMailText(ctx context.Context, mailText *iam_model.MailText) (*iam_es_model.IAM, *models.Aggregate, error) { +// logging.Log("SETUP-cNrF3").Info("setting up mail text") +// mailText.AggregateID = step.setup.iamID +// iam, aggregate, err := step.setup.IamEvents.PrepareAddMailText(ctx, mailText) +// if err != nil { +// return nil, nil, err +// } +// return iam, aggregate, nil +//} diff --git a/internal/ui/login/handler/password_complexity_policy_handler.go b/internal/ui/login/handler/password_complexity_policy_handler.go index e1d35d66a8..34781be6d7 100644 --- a/internal/ui/login/handler/password_complexity_policy_handler.go +++ b/internal/ui/login/handler/password_complexity_policy_handler.go @@ -1,12 +1,13 @@ package handler import ( - "github.com/caos/zitadel/internal/auth_request/model" - "github.com/caos/zitadel/internal/errors" - iam_model "github.com/caos/zitadel/internal/iam/model" "net/http" "regexp" "strconv" + + "github.com/caos/zitadel/internal/auth_request/model" + "github.com/caos/zitadel/internal/errors" + iam_model "github.com/caos/zitadel/internal/iam/model" ) const ( @@ -46,24 +47,24 @@ func (l *Login) getPasswordComplexityPolicyByUserID(r *http.Request, userID stri } func (l *Login) generatePolicyDescription(r *http.Request, policy *iam_model.PasswordComplexityPolicyView) (string, error) { - description := "
    " + description := "
      " minLength := l.renderer.LocalizeFromRequest(r, "Password.MinLength", nil) - description += "
    • clear" + minLength + " " + strconv.Itoa(int(policy.MinLength)) + "
    • " + description += "
    • " + minLength + " " + strconv.Itoa(int(policy.MinLength)) + "
    • " if policy.HasUppercase { uppercase := l.renderer.LocalizeFromRequest(r, "Password.HasUppercase", nil) - description += "
    • clear" + uppercase + "
    • " + description += "
    • " + uppercase + "
    • " } if policy.HasLowercase { lowercase := l.renderer.LocalizeFromRequest(r, "Password.HasLowercase", nil) - description += "
    • clear" + lowercase + "
    • " + description += "
    • " + lowercase + "
    • " } if policy.HasNumber { hasnumber := l.renderer.LocalizeFromRequest(r, "Password.HasNumber", nil) - description += "
    • clear" + hasnumber + "
    • " + description += "
    • " + hasnumber + "
    • " } if policy.HasSymbol { hassymbol := l.renderer.LocalizeFromRequest(r, "Password.HasSymbol", nil) - description += "
    • clear" + hassymbol + "
    • " + description += "
    • " + hassymbol + "
    • " } description += "
    " diff --git a/internal/ui/login/handler/renderer.go b/internal/ui/login/handler/renderer.go index 486d858a1d..e80ea1304c 100644 --- a/internal/ui/login/handler/renderer.go +++ b/internal/ui/login/handler/renderer.go @@ -306,7 +306,7 @@ func (l *Login) getTheme(r *http.Request) string { } func (l *Login) getThemeMode(r *http.Request) string { - return "" //TODO: impl + return "lgn-dark-theme" //TODO: impl } func (l *Login) getOrgID(authReq *domain.AuthRequest) string { diff --git a/internal/ui/login/static/i18n/de.yaml b/internal/ui/login/static/i18n/de.yaml index fc86aaa0ad..a16ce6acde 100644 --- a/internal/ui/login/static/i18n/de.yaml +++ b/internal/ui/login/static/i18n/de.yaml @@ -1,5 +1,5 @@ Password: - Title: Passwort + Title: Willkommen zurück! Description: Gib deine Benutzerdaten ein. Password: Passwort MinLength: Mindestlänge @@ -10,7 +10,7 @@ Password: Login: Title: Anmeldung - Description: Gib deine Benutzerdaten ein. + Description: Mit ZITADEL-Konto anmelden. TitleLinking: Anmeldung für Benutzer Linking DescriptionLinking: Gib deine Benutzerdaten ein um den externen Benutzer mit einem ZITADEL Benutzer zu linken. Loginname: Loginname @@ -157,11 +157,12 @@ Registration: TosConfirm: Ich akzeptiere die TosLinkText: AGBs TosLink: https://zitadel.ch/pdf/agb.pdf + ExternalLogin: oder registriere dich mit einem externen Benutzer RegistrationOrg: Title: Organisations Registration Description: Gib deinen Organisationsnamen und deine Benutzerangaben an. - FreeTillEndOfYear: Wir bieten den premium Tier FORTRESS während der Einführungsphase bis zum Ende des Jahres 2020 gratis an. + FreeTillEndOfYear: Wir bieten den premium Tier FORTRESS während der Einführungsphase bis zum Ende des ersten Quartals 2021 gratis an. OrgName: Organisationsname OrgDomain: Domäne Email: E-Mail @@ -211,6 +212,11 @@ Actions: Recreate: erneut erstellen PasswordLogin: Mit Passwort anmelden +Footer: + TosPrivacyPolicy: Datenschutz und AGB + TosLink: https://zitadel.ch/pdf/agb.pdf + Help: Hilfe + Errors: Internal: Es ist ein interner Fehler aufgetreten AuthRequest: diff --git a/internal/ui/login/static/i18n/en.yaml b/internal/ui/login/static/i18n/en.yaml index 73ae3d217a..18a759d17b 100644 --- a/internal/ui/login/static/i18n/en.yaml +++ b/internal/ui/login/static/i18n/en.yaml @@ -1,5 +1,5 @@ Login: - Title: Login + Title: Welcome back! Description: Enter your logindata. TitleLinking: Login for userlinking DescriptionLinking: Enter your login data to link your external user with a ZITADEL user. @@ -10,7 +10,7 @@ Login: UserSelection: Title: Select account - Description: Select your account. + Description: Use your ZITADEL-Account TitleLinking: Select account for userlinking DescriptionLinking: Select your account to link with your external user. OtherUser: Other User @@ -133,7 +133,7 @@ EmailVerificationDone: Title: E-Mail Verification Description: Your email address has been successfully verified. -RegistrationOption: +RegisterOption: Title: Registration Options Description: Choose how you'd like to register RegisterUsernamePassword: With username password @@ -157,11 +157,12 @@ Registration: TosConfirm: I agree the TosLinkText: TOS TosLink: https://zitadel.ch/pdf/tos.pdf + ExternalLogin: or register with an external user RegistrationOrg: Title: Organisation Registration Description: Enter your organisationname and userdata. - FreeTillEndOfYear: We are offering the premium tier FORTRESS free of charge during the introductory phase until the end of 2020. + FreeTillEndOfYear: We are offering the premium tier FORTRESS free of charge during the introductory phase until the end of the first quarter 2021. OrgName: Organisationname OrgDomain: Domäne Email: E-Mail @@ -211,6 +212,11 @@ Actions: Recreate: recreate PasswordLogin: Login with password +Footer: + TosPrivacyPolicy: ToS and Privacy Policy + TosLink: https://zitadel.ch/pdf/agb.pdf + Help: Help + Errors: Internal: An internal error occured AuthRequest: diff --git a/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Bold.ttf b/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Bold.ttf new file mode 100644 index 0000000000..7f2bddb59f Binary files /dev/null and b/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Bold.ttf differ diff --git a/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-BoldItalic.ttf b/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-BoldItalic.ttf new file mode 100644 index 0000000000..c4b6a52103 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-BoldItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Italic.ttf b/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Italic.ttf new file mode 100644 index 0000000000..130fa71044 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Italic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Regular.ttf b/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Regular.ttf new file mode 100644 index 0000000000..5222968fb5 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/PT_Sans/PTSans-Regular.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Black.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Black.ttf new file mode 100644 index 0000000000..03e4d80c78 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Black.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-BlackItalic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-BlackItalic.ttf new file mode 100644 index 0000000000..130434e413 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-BlackItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Bold.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Bold.ttf new file mode 100644 index 0000000000..8763231494 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Bold.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-BoldItalic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-BoldItalic.ttf new file mode 100644 index 0000000000..9c16440f02 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-BoldItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBold.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBold.ttf new file mode 100644 index 0000000000..64928cdf7c Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBold.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBoldItalic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBoldItalic.ttf new file mode 100644 index 0000000000..3728328072 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraBoldItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLight.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLight.ttf new file mode 100644 index 0000000000..99a3abbe49 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLight.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLightItalic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLightItalic.ttf new file mode 100644 index 0000000000..1931863a1d Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ExtraLightItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Italic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Italic.ttf new file mode 100644 index 0000000000..7bca5ad545 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Italic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Light.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Light.ttf new file mode 100644 index 0000000000..43aa156f26 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Light.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-LightItalic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-LightItalic.ttf new file mode 100644 index 0000000000..d88c549e83 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-LightItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Medium.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Medium.ttf new file mode 100644 index 0000000000..5428c9c6dd Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Medium.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-MediumItalic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-MediumItalic.ttf new file mode 100644 index 0000000000..ba0598a9eb Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-MediumItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Regular.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Regular.ttf new file mode 100644 index 0000000000..acb571564a Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Regular.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBold.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBold.ttf new file mode 100644 index 0000000000..6de54f7ff7 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBold.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBoldItalic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBoldItalic.ttf new file mode 100644 index 0000000000..9555af6ff6 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-SemiBoldItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-Thin.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Thin.ttf new file mode 100644 index 0000000000..b8e542a711 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-Thin.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Raleway/Raleway-ThinItalic.ttf b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ThinItalic.ttf new file mode 100644 index 0000000000..7f0c0e91e8 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Raleway/Raleway-ThinItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Black.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Black.ttf new file mode 100644 index 0000000000..2d45238365 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Black.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-BlackItalic.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-BlackItalic.ttf new file mode 100644 index 0000000000..29a4359ed0 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-BlackItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Bold.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Bold.ttf new file mode 100644 index 0000000000..d998cf5b46 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Bold.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-BoldItalic.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-BoldItalic.ttf new file mode 100644 index 0000000000..b4e2210393 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-BoldItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Italic.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Italic.ttf new file mode 100644 index 0000000000..5b390ff950 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Italic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Light.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Light.ttf new file mode 100644 index 0000000000..35267989de Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Light.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-LightItalic.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-LightItalic.ttf new file mode 100644 index 0000000000..46e9bf7c95 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-LightItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Medium.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Medium.ttf new file mode 100644 index 0000000000..f714a514d9 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Medium.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-MediumItalic.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-MediumItalic.ttf new file mode 100644 index 0000000000..5dc6a2dc6c Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-MediumItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Regular.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Regular.ttf new file mode 100644 index 0000000000..2b6392ffe8 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Regular.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-Thin.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Thin.ttf new file mode 100644 index 0000000000..4e797cf7ef Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-Thin.ttf differ diff --git a/internal/ui/login/static/resources/fonts/Roboto/Roboto-ThinItalic.ttf b/internal/ui/login/static/resources/fonts/Roboto/Roboto-ThinItalic.ttf new file mode 100644 index 0000000000..eea836f4a3 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/Roboto/Roboto-ThinItalic.ttf differ diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/css/lgn-icon-font.css b/internal/ui/login/static/resources/fonts/lgn-icons/css/lgn-icon-font.css new file mode 100644 index 0000000000..4648ceef82 --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/css/lgn-icon-font.css @@ -0,0 +1,57 @@ +@font-face { + font-family: 'lgn-icons'; + src: url('../fonts/lgn-icons.eot?p68sys'); + src: url('../fonts/lgn-icons.eot?p68sys#iefix') format('embedded-opentype'), + url('../fonts/lgn-icons.ttf?p68sys') format('truetype'), + url('../fonts/lgn-icons.woff?p68sys') format('woff'), + url('../fonts/lgn-icons.svg?p68sys#icomoon') format('svg'); + font-weight: normal; + font-style: normal; + font-display: block; + } + + [class^="lgn-icon-"], [class*=" lgn-icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'lgn-icons' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + +.lgn-icon-check-solid:before { + content: "\e909"; +} +.lgn-icon-times-solid:before { + content: "\e900"; +} +.lgn-icon-user-plus-solid:before { + content: "\e901"; +} +.lgn-icon-angle-left-solid:before { + content: "\e902"; +} +.lgn-icon-angle-right-solid:before { + content: "\e903"; +} +.lgn-icon-arrow-left-solid:before { + content: "\e904"; +} +.lgn-icon-arrow-right-solid:before { + content: "\e905"; +} +.lgn-icon-clipboard-check-solid:before { + content: "\e906"; +} +.lgn-icon-clipboard:before { + content: "\e907"; +} +.lgn-icon-exclamation-circle-solid:before { + content: "\e908"; +} diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.eot b/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.eot new file mode 100644 index 0000000000..60aeb39754 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.eot differ diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.svg b/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.svg new file mode 100644 index 0000000000..37f44a6d3c --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.svg @@ -0,0 +1,20 @@ + + + +Generated by IcoMoon + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.ttf b/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.ttf new file mode 100644 index 0000000000..18df6981c5 Binary files /dev/null and b/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.ttf differ diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.woff b/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.woff new file mode 100644 index 0000000000..e3c698a7cb Binary files /dev/null and b/internal/ui/login/static/resources/fonts/lgn-icons/fonts/lgn-icons.woff differ diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-left-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-left-solid.svg new file mode 100755 index 0000000000..67bad049e7 --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-left-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-right-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-right-solid.svg new file mode 100755 index 0000000000..2e6375f681 --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/angle-right-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-left-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-left-solid.svg new file mode 100755 index 0000000000..c5c59870bc --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-left-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-right-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-right-solid.svg new file mode 100755 index 0000000000..442d9eff8a --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/arrow-right-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/check-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/check-solid.svg new file mode 100755 index 0000000000..fa3b17b306 --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/check-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-check-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-check-solid.svg new file mode 100755 index 0000000000..c7cf91dfcd --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-check-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-solid.svg new file mode 100755 index 0000000000..7edc3eda1e --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/clipboard-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/exclamation-circle-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/exclamation-circle-solid.svg new file mode 100755 index 0000000000..9d4a667fa3 --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/exclamation-circle-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/times-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/times-solid.svg new file mode 100755 index 0000000000..3605fbf3e9 --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/times-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/lgn-icons/svg/user-plus-solid.svg b/internal/ui/login/static/resources/fonts/lgn-icons/svg/user-plus-solid.svg new file mode 100755 index 0000000000..840278b3e1 --- /dev/null +++ b/internal/ui/login/static/resources/fonts/lgn-icons/svg/user-plus-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.eot b/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.eot deleted file mode 100644 index 70508ebabc..0000000000 Binary files a/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.eot and /dev/null differ diff --git a/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.ttf b/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.ttf deleted file mode 100644 index 7015564ad1..0000000000 Binary files a/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.ttf and /dev/null differ diff --git a/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.woff b/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.woff deleted file mode 100644 index b648a3eea2..0000000000 Binary files a/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.woff and /dev/null differ diff --git a/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.woff2 b/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.woff2 deleted file mode 100644 index 9fa2112520..0000000000 Binary files a/internal/ui/login/static/resources/fonts/material/MaterialIcons-Regular.woff2 and /dev/null differ diff --git a/internal/ui/login/static/resources/generate.go b/internal/ui/login/static/resources/generate.go index 95cb7ff036..ed4e6fc385 100644 --- a/internal/ui/login/static/resources/generate.go +++ b/internal/ui/login/static/resources/generate.go @@ -1,7 +1,8 @@ package resources +// TODO whitelabeling go:generate sass themes/scss/zitadel-alternative.scss themes/zitadel/css/zitadel.css // scss -//go:generate sass themes/scss/zitadel/dark.scss themes/zitadel/css/dark.css -//go:generate sass themes/scss/zitadel/light.scss themes/zitadel/css/light.css -//go:generate sass themes/scss/caos/dark.scss themes/caos/css/dark.css -//go:generate sass themes/scss/caos/light.scss themes/caos/css/light.css + +//go:generate sass themes/scss/main.scss themes/zitadel/css/main.css +//go:generate sass themes/scss/bundle.scss themes/zitadel/css/bundle.css +//go:generate sass themes/scss/zitadel.scss themes/zitadel/css/zitadel.css diff --git a/internal/ui/login/static/resources/images/icon-newuser-dark-hover.png b/internal/ui/login/static/resources/images/icon-newuser-dark-hover.png deleted file mode 100644 index 1738947d20..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-newuser-dark-hover.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-newuser-dark-hover@2x.png b/internal/ui/login/static/resources/images/icon-newuser-dark-hover@2x.png deleted file mode 100644 index 826a64ea9e..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-newuser-dark-hover@2x.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-newuser-dark.png b/internal/ui/login/static/resources/images/icon-newuser-dark.png deleted file mode 100644 index aa2d0784f7..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-newuser-dark.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-newuser-dark@2x.png b/internal/ui/login/static/resources/images/icon-newuser-dark@2x.png deleted file mode 100644 index e4516cac6e..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-newuser-dark@2x.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-newuser-light-hover.png b/internal/ui/login/static/resources/images/icon-newuser-light-hover.png deleted file mode 100644 index 19370a7fff..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-newuser-light-hover.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-newuser-light-hover@2x.png b/internal/ui/login/static/resources/images/icon-newuser-light-hover@2x.png deleted file mode 100644 index c6b0ba1d4c..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-newuser-light-hover@2x.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-newuser-light.png b/internal/ui/login/static/resources/images/icon-newuser-light.png deleted file mode 100644 index 24fabb7156..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-newuser-light.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-newuser-light@2x.png b/internal/ui/login/static/resources/images/icon-newuser-light@2x.png deleted file mode 100644 index 5352b17aae..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-newuser-light@2x.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-user-dark-hover.png b/internal/ui/login/static/resources/images/icon-user-dark-hover.png deleted file mode 100644 index 844510d8ae..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-user-dark-hover.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-user-dark-hover@2x.png b/internal/ui/login/static/resources/images/icon-user-dark-hover@2x.png deleted file mode 100644 index c3c536d385..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-user-dark-hover@2x.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-user-dark.png b/internal/ui/login/static/resources/images/icon-user-dark.png deleted file mode 100644 index 4052cc7200..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-user-dark.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-user-dark@2x.png b/internal/ui/login/static/resources/images/icon-user-dark@2x.png deleted file mode 100644 index 2b81e88b57..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-user-dark@2x.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-user-light-hover.png b/internal/ui/login/static/resources/images/icon-user-light-hover.png deleted file mode 100644 index 1f2b629ab7..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-user-light-hover.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-user-light-hover@2x.png b/internal/ui/login/static/resources/images/icon-user-light-hover@2x.png deleted file mode 100644 index c81cd34827..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-user-light-hover@2x.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-user-light.png b/internal/ui/login/static/resources/images/icon-user-light.png deleted file mode 100644 index a2649290db..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-user-light.png and /dev/null differ diff --git a/internal/ui/login/static/resources/images/icon-user-light@2x.png b/internal/ui/login/static/resources/images/icon-user-light@2x.png deleted file mode 100644 index f07f5aa250..0000000000 Binary files a/internal/ui/login/static/resources/images/icon-user-light@2x.png and /dev/null differ diff --git a/internal/ui/login/static/resources/scripts/avatar.js b/internal/ui/login/static/resources/scripts/avatar.js new file mode 100644 index 0000000000..921906d4a4 --- /dev/null +++ b/internal/ui/login/static/resources/scripts/avatar.js @@ -0,0 +1,50 @@ +const avatars = document.getElementsByClassName('lgn-avatar'); +for (let i = 0; i < avatars.length; i++) { + const displayName = avatars[i].getAttribute('displayname'); + if (displayName) { + const split = displayName.split(' '); + if (split) { + const initials = split[0].charAt(0) + (split[1] ? split[1].charAt(0) : ''); + if (initials) { + avatars[i].getElementsByClassName('initials')[0].innerHTML = initials; + } + } + + const color = this.getColor(displayName); + avatars[i].style.background = color; + // set default white text instead of contrast text mode + avatars[i].style.color = '#ffffff'; + } +} + +function getColor(userName) { + const colors = [ + 'linear-gradient(40deg, #B44D51 30%, rgb(241,138,138))', + 'linear-gradient(40deg, #B75073 30%, rgb(234,96,143))', + 'linear-gradient(40deg, #84498E 30%, rgb(214,116,230))', + 'linear-gradient(40deg, #705998 30%, rgb(163,131,220))', + 'linear-gradient(40deg, #5C6598 30%, rgb(135,148,222))', + 'linear-gradient(40deg, #7F90D3 30%, rgb(181,196,247))', + 'linear-gradient(40deg, #3E93B9 30%, rgb(150,215,245))', + 'linear-gradient(40deg, #3494A0 30%, rgb(71,205,222))', + 'linear-gradient(40deg, #25716A 30%, rgb(58,185,173))', + 'linear-gradient(40deg, #427E41 30%, rgb(97,185,96))', + 'linear-gradient(40deg, #89A568 30%, rgb(176,212,133))', + 'linear-gradient(40deg, #90924D 30%, rgb(187,189,98))', + 'linear-gradient(40deg, #E2B032 30%, rgb(245,203,99))', + 'linear-gradient(40deg, #C97358 30%, rgb(245,148,118))', + 'linear-gradient(40deg, #6D5B54 30%, rgb(152,121,108))', + 'linear-gradient(40deg, #6B7980 30%, rgb(134,163,177))', + ]; + + let hash = 0; + if (userName.length === 0) { + return colors[hash]; + } + for (let i = 0; i < userName.length; i++) { + hash = userName.charCodeAt(i) + ((hash << 5) - hash); + hash = hash & hash; + } + hash = ((hash % colors.length) + colors.length) % colors.length; + return colors[hash]; +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/scripts/change_password_check.js b/internal/ui/login/static/resources/scripts/change_password_check.js index 18d8e5b002..418dba8920 100644 --- a/internal/ui/login/static/resources/scripts/change_password_check.js +++ b/internal/ui/login/static/resources/scripts/change_password_check.js @@ -1,10 +1,13 @@ function CheckChangePwPolicy() { - let policyElement = document.getElementById("change-new-password") + let policyElement = document.getElementById("change-new-password"); let pwNew = policyElement.value; let pwNewConfirmation = document.getElementById("change-password-confirmation").value; if (ComplexityPolicyCheck(policyElement, pwNew) === false) { + policyElement.setAttribute("color", "warn"); return false; + } else { + policyElement.setAttribute("color", "primary"); } return pwNew == pwNewConfirmation; diff --git a/internal/ui/login/static/resources/scripts/copy_to_clipboard.js b/internal/ui/login/static/resources/scripts/copy_to_clipboard.js index bbc879a204..97359cdde5 100644 --- a/internal/ui/login/static/resources/scripts/copy_to_clipboard.js +++ b/internal/ui/login/static/resources/scripts/copy_to_clipboard.js @@ -1,6 +1,6 @@ const copyToClipboard = str => { navigator.clipboard.writeText(str); -} +}; -let copyButton = document.getElementsByClassName("copy")[0]; +let copyButton = document.getElementById("copy"); copyButton.addEventListener("click", copyToClipboard(copyButton.getAttribute("data-copy"))); diff --git a/internal/ui/login/static/resources/scripts/form_submit.js b/internal/ui/login/static/resources/scripts/form_submit.js index 1911ed75a7..ddf94f0b1d 100644 --- a/internal/ui/login/static/resources/scripts/form_submit.js +++ b/internal/ui/login/static/resources/scripts/form_submit.js @@ -1,7 +1,9 @@ function disableSubmit(checks, button) { let form = document.getElementsByTagName('form')[0]; let inputs = form.getElementsByTagName('input'); - button.disabled = true; + if (button) { + button.disabled = true; + } addRequiredEventListener(inputs, checks, form, button); disableDoubleSubmit(form, button); } @@ -22,30 +24,31 @@ function addRequiredEventListener(inputs, checks, form, button) { } function disableDoubleSubmit(form, button) { - form.addEventListener('submit', function() { + form.addEventListener('submit', function () { document.body.classList.add('waiting'); button.disabled = true; - }) + }); } function toggleButton(checks, form, inputs, button) { if (checks !== undefined) { if (checks() === false) { button.disabled = true; - return + return; } } - button.disabled = !allRequiredDone(form, inputs); + const targetValue = !allRequiredDone(form, inputs); + button.disabled = targetValue; } function allRequiredDone(form, inputs) { for (i = 0; i < inputs.length; i++) { if (inputs[i].required) { if (inputs[i].type === 'checkbox' && !inputs[i].checked) { - return false + return false; } if (inputs[i].value === '') { - return false + return false; } } } diff --git a/internal/ui/login/static/resources/scripts/input_suffix_offset.js b/internal/ui/login/static/resources/scripts/input_suffix_offset.js new file mode 100644 index 0000000000..ab8556b55b --- /dev/null +++ b/internal/ui/login/static/resources/scripts/input_suffix_offset.js @@ -0,0 +1,12 @@ +const suffix = document.getElementById('default-login-suffix'); +const suffixInput = document.getElementsByClassName('lgn-suffix-input')[0]; + +calculateOffset(); +suffix.addEventListener("DOMCharacterDataModified", calculateOffset); + +function calculateOffset() { + // add suffix width to inner right padding of the input field + if (suffix && suffixInput) { + suffixInput.style.paddingRight = `${(suffix.offsetWidth ?? 0) + 10}px`; + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/scripts/password_policy_check.js b/internal/ui/login/static/resources/scripts/password_policy_check.js index ca2cb66a6c..79785e8d8c 100644 --- a/internal/ui/login/static/resources/scripts/password_policy_check.js +++ b/internal/ui/login/static/resources/scripts/password_policy_check.js @@ -7,7 +7,7 @@ function ComplexityPolicyCheck(policyElement, pwNew) { let valid = true; - let minlengthelem = document.getElementById('minlength') + let minlengthelem = document.getElementById('minlength'); if (pwNew.length >= minLength) { ValidPolicy(minlengthelem); valid = true; @@ -15,7 +15,7 @@ function ComplexityPolicyCheck(policyElement, pwNew) { InvalidPolicy(minlengthelem); valid = false; } - let upper = document.getElementById('uppercase') + let upper = document.getElementById('uppercase'); if (upperRegex !== "") { if (RegExp(upperRegex).test(pwNew)) { ValidPolicy(upper); @@ -25,7 +25,7 @@ function ComplexityPolicyCheck(policyElement, pwNew) { valid = false; } } - let lower = document.getElementById('lowercase') + let lower = document.getElementById('lowercase'); if (lowerRegex !== "") { if (RegExp(lowerRegex).test(pwNew)) { ValidPolicy(lower); @@ -35,20 +35,20 @@ function ComplexityPolicyCheck(policyElement, pwNew) { valid = false; } } - let number = document.getElementById('number') + let number = document.getElementById('number'); if (numberRegex != "") { - if (RegExp(numberRegex).test(pwNew)) { - ValidPolicy(number); - valid = true; + if (RegExp(numberRegex).test(pwNew)) { + ValidPolicy(number); + valid = true; } else { - InvalidPolicy(number); - valid = false; + InvalidPolicy(number); + valid = false; } } - let symbol = document.getElementById('symbol') + let symbol = document.getElementById('symbol'); if (symbolRegex != "") { if (RegExp(symbolRegex).test(pwNew)) { - ValidPolicy(symbol) + ValidPolicy(symbol); valid = true; } else { InvalidPolicy(symbol); @@ -57,12 +57,19 @@ function ComplexityPolicyCheck(policyElement, pwNew) { } return valid; } + function ValidPolicy(element) { - element.classList.remove('invalid') - element.getElementsByTagName('i')[0].innerText = 'check'; + element.classList.remove('invalid'); + element.getElementsByTagName('i')[0].classList.remove('lgn-icon-times-solid'); + element.getElementsByTagName('i')[0].classList.remove('lgn-warn'); + element.getElementsByTagName('i')[0].classList.add('lgn-icon-check-solid'); + element.getElementsByTagName('i')[0].classList.add('lgn-valid'); } function InvalidPolicy(element) { - element.classList.add('invalid') - element.getElementsByTagName('i')[0].innerText = 'clear'; + element.classList.add('invalid'); + element.getElementsByTagName('i')[0].classList.remove('lgn-valid'); + element.getElementsByTagName('i')[0].classList.remove('lgn-icon-check-solid'); + element.getElementsByTagName('i')[0].classList.add('lgn-warn'); + element.getElementsByTagName('i')[0].classList.add('lgn-icon-times-solid'); } diff --git a/internal/ui/login/static/resources/scripts/register_check.js b/internal/ui/login/static/resources/scripts/register_check.js index d30208d660..c6ad5055b1 100644 --- a/internal/ui/login/static/resources/scripts/register_check.js +++ b/internal/ui/login/static/resources/scripts/register_check.js @@ -4,7 +4,10 @@ function CheckRegisterPwPolicy() { let pwNewConfirmation = document.getElementById("register-password-confirmation").value; if (ComplexityPolicyCheck(policyElement, pwNew) === false) { + policyElement.setAttribute("color", "warn"); return false; + } else { + policyElement.setAttribute("color", "primary"); } return pwNew == pwNewConfirmation; diff --git a/internal/ui/login/static/resources/scripts/theme.js b/internal/ui/login/static/resources/scripts/theme.js new file mode 100644 index 0000000000..9c0004e470 --- /dev/null +++ b/internal/ui/login/static/resources/scripts/theme.js @@ -0,0 +1,6 @@ +const usesDarkTheme = window.matchMedia('(prefers-color-scheme: dark)').matches; +if (usesDarkTheme) { + document.documentElement.classList.replace('lgn-light-theme', 'lgn-dark-theme'); +} else { + document.documentElement.classList.replace('lgn-dark-theme', 'lgn-light-theme'); +} diff --git a/internal/ui/login/static/resources/scripts/webauthn.js b/internal/ui/login/static/resources/scripts/webauthn.js index 74c54c4db5..716c61f8dc 100644 --- a/internal/ui/login/static/resources/scripts/webauthn.js +++ b/internal/ui/login/static/resources/scripts/webauthn.js @@ -8,7 +8,7 @@ function checkWebauthnSupported(button, func) { for (let item of support) { item.classList.add('hidden'); } - return + return; } document.getElementById(button).addEventListener('click', func); } diff --git a/internal/ui/login/static/resources/themes/caos/css/dark.css b/internal/ui/login/static/resources/themes/caos/css/dark.css deleted file mode 100644 index 7506180196..0000000000 --- a/internal/ui/login/static/resources/themes/caos/css/dark.css +++ /dev/null @@ -1,513 +0,0 @@ -@font-face { - font-family: Aileron; - src: url(../../../fonts/ailerons/ailerons.otf) format("opentype"); -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Thin.ttf) format("truetype"); - font-style: normal; - font-weight: 100; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-ThinItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 100; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Light.ttf) format("truetype"); - font-style: normal; - font-weight: 200; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-LightItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 200; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Regular.ttf) format("truetype"); - font-style: normal; - font-weight: 400; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Italic.ttf) format("truetype"); - font-style: italic; - font-weight: 400; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Bold.ttf) format("truetype"); - font-style: normal; - font-weight: 700; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-BoldItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 700; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Black.ttf) format("truetype"); - font-style: normal; - font-weight: 800; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-BlackItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 800; -} -@font-face { - font-family: "Material Icons"; - font-style: normal; - font-weight: 400; - src: url(../../../fonts/material/MaterialIcons-Regular.eot); - /* For IE6-8 */ - src: local("Material Icons"), local("MaterialIcons-Regular"), url(../../../fonts/material/MaterialIcons-Regular.woff2) format("woff2"), url(../../../fonts/material/MaterialIcons-Regular.woff) format("woff"), url(../../../fonts/material/MaterialIcons-Regular.ttf) format("truetype"); -} -*, *::before, *::after { - box-sizing: border-box; - font-family: Lato; - font-size: 16px; - font-weight: 400; -} - -body { - margin: 0 0 100px 0; -} -body.waiting * { - cursor: wait !important; -} - -html { - width: 100%; - min-height: 100%; - font-weight: 300; - background-color: #282828; - color: white; - background-repeat: no-repeat; - background-position: bottom right; - background-size: contain; -} - -h1 { - color: white; - font-family: Aileron; - font-weight: 300; - font-size: 40px; - text-align: center; -} - -h2 { - color: white; - font-family: Aileron; - font-weight: 300; - font-size: 30px; -} - -p { - font-weight: 300; - text-align: center; -} - -header { - padding: 8px; -} -header .logo { - background-image: url("../logo-dark.png"); - background-repeat: no-repeat; - background-size: contain; - height: 80px; - margin: 30px; -} - -.head { - width: 100%; - max-width: 1000px; - margin: auto; -} - -.content form { - margin: auto; - padding: 20px; - width: 100%; - max-width: 500px; -} - -a { - color: #760038; - text-decoration: none; - font-weight: 400; -} -a:hover { - color: #f60075; -} -a.tos-link { - font-size: 14px; -} - -button, .button { - background-color: #282828; - color: #760038; - border: 1px solid #760038; - border-radius: 5px; - width: 100%; - max-width: 600px; - height: 50px; - transition: all 0.3s ease 0s; - cursor: pointer; - outline: none; - display: inline-block; - text-align: center; - line-height: 44px; - padding: 1px 6px; -} -button:hover, .button:hover { - background-color: #f60075; - color: #282828; - border: 1px solid #f60075; -} -button.primary, .button.primary { - background-color: #760038; - color: white; - border: none; -} -button.primary:hover, .button.primary:hover { - background-color: #f60075; -} -button:disabled, .button:disabled { - background-color: #999999; - border: 1px solid #999999; -} -button:disabled:hover, .button:disabled:hover { - background-color: #999999; - border: 1px solid #999999; -} -button.google, .button.google { - display: flex; - align-items: center; - position: relative; - padding: 0 1px; - color: #FFFFFF; - background-color: #4285F4; -} -button.google span.logo, .button.google span.logo { - height: 46px; - width: 46px; - background-color: #FFFFFF; - background-image: url("../../../images/idp/google.png"); - background-size: 25px; - background-position: center; - background-repeat: no-repeat; - border-radius: 5px; -} -button.google span.provider-name, .button.google span.provider-name { - position: absolute; - left: 50%; - transform: translateX(-50%); -} - -input:not([type=radio]), select { - background-color: #252525; - color: white; - height: 50px; - border: 1px solid #999999; - border-radius: 5px; - padding-left: 8px; -} - -form button.user-selection .profile-image, .login-profile .profile-image { - height: 80px; - width: 80px; - background-position: center; - background-repeat: no-repeat; - background-size: contain; - background-image: url("../../../images/icon-user-dark.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.user-selection .profile-image, .login-profile .profile-image { - background-image: url("../../../images/icon-user-dark@2x.png"); - background-size: 80px 80px; - } -} -form button.user-selection:hover .profile-image, .login-profile:hover .profile-image { - background-image: url("../../../images/icon-user-dark-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.user-selection:hover .profile-image, .login-profile:hover .profile-image { - background-image: url("../../../images/icon-user-dark-hover@2x.png"); - background-size: 80px 80px; - } -} - -.login-profile .profile-image { - margin-left: auto; - margin-right: auto; -} -.login-profile .names { - padding: 10px 0; - text-align: center; -} -.login-profile .names div:first-of-type { - font-size: 26px; - font-weight: 300; -} -.login-profile .names div:nth-of-type(2) { - font-weight: 300; - font-size: 0.9rem; - font-style: italic; - color: #898989; -} - -form .field { - display: grid; - padding: 10px 0; -} -form .field.radio-button { - display: flex; -} -form .field.radio-button input[type=radio] { - height: 20px; - vertical-align: middle; -} -form .field.radio-button label { - height: 20px; - display: inline-block; - padding: 3px 0 0 15px; - width: 100%; -} -form .field.check-box { - display: flex; -} -form .field.check-box input[type=checkbox] { - height: 16px; - vertical-align: middle; -} -form .field.check-box label { - height: 16px; - text-transform: inherit; - display: inline-block; - padding: 2px 0 0 15px; - width: 100%; - color: white; -} -form label { - color: #898989; - text-transform: uppercase; - font-size: 0.8rem; - margin-bottom: 3px; -} -form label span.optional { - font-style: italic; - text-transform: none; -} -form .actions { - padding: 20px 0; -} -form .actions .right { - float: right; -} -form .actions button, form .actions a { - margin: 10px 0; -} -form button.clean { - border: none; - height: auto; - color: white; - text-align: left; - text-transform: unset; - display: flex; - padding: 15px; -} -form button.clean:hover { - border: none; - background-color: #252525; -} -form button.clean * { - font-weight: 300; -} -form .user-selection-list { - margin-bottom: 40px; -} -form button.user-selection .sessionstate { - display: inline-block; - height: 20px; - width: 20px; - border-radius: 20px; - border-color: #999999; - border-style: solid; - border-width: 1px; - position: absolute; - bottom: 0px; - right: 10px; -} -form button.user-selection .sessionstate.sessionstate-0 { - background-color: #138D00; -} -form button.user-selection .sessionstate.sessionstate-1 { - background-color: #BC372E; -} -form button.user-selection > div { - position: relative; -} -form button.user-selection > div.names { - margin: 0 15px; -} -form button.user-selection > div.names .displayname { - font-size: 1.4rem; -} -form button.user-selection > div.names .loginname { - color: #898989; -} -form button.user-selection:disabled { - background: transparent; - border: none; - cursor: not-allowed; -} -form button.user-selection:disabled .profile-image { - opacity: 0.3; -} -form button.user-selection:disabled .sessionstate { - background-color: #282828; -} -form button.user-selection:disabled .names .displayname, form button.user-selection:disabled .names .loginname { - font-style: italic; - color: #444444; -} -.user-selection + form button.other-user { - margin-top: 80px; -} -form button.other-user .other-user-image { - width: 80px; - height: 60px; - background-repeat: no-repeat; - background-position: center; - background-image: url("../../../images/icon-newuser-dark.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.other-user .other-user-image { - background-image: url("../../../images/icon-newuser-dark@2x.png"); - background-size: 80px 60px; - } -} -form button.other-user:hover .other-user-image { - background-repeat: no-repeat; - background-position: center; - background-image: url("../../../images/icon-newuser-dark-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.other-user:hover .other-user-image { - background-image: url("../../../images/icon-newuser-dark-hover@2x.png"); - background-size: 80px 60px; - } -} -form button.other-user > div:nth-of-type(2) { - margin: 15px; - font-size: 1.4rem; -} -form ul#passwordcomplexity { - display: flex; - flex-wrap: wrap; - padding: 0; - list-style: none; - margin-bottom: 0; -} -form ul#passwordcomplexity li { - flex: 1 0 50%; - display: block; - font-weight: 300; - font-size: 12px; - line-height: 12px; -} -form ul#passwordcomplexity li i { - height: 26px; - padding-right: 10px; - vertical-align: middle; - color: #0DF279; -} -form ul#passwordcomplexity li.invalid i { - color: #F20D6B; -} -form #loginname { - display: flex; -} -form #loginname .loginname-suffix { - padding-left: 5px; - line-height: 50px; -} - -#copy-secret { - visibility: hidden; - position: absolute; -} - -#qrcode { - text-align: center; -} -#qrcode svg rect.color { - fill: white; -} -#qrcode svg rect.bg-color { - fill: #282828; -} - -#secret .copy { - float: right; - cursor: pointer; -} - -footer { - background-image: url("../gradientdeco-full.svg"); - width: 100%; - background-size: cover; - bottom: 0; - z-index: -1; -} - -.material-icons { - font-family: "Material Icons"; - font-weight: normal; - font-style: normal; - font-size: 24px; - /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - /* Support for IE. */ - font-feature-settings: "liga"; -} - -.free-tier { - border: 2px solid #F20D6B; - border-radius: 5px; - padding: 10px; -} - -.error { - color: #F20D6B; -} - -.hidden { - display: none; -} - -#wa-error { - margin-top: 20px; -} - -/*# sourceMappingURL=dark.css.map */ diff --git a/internal/ui/login/static/resources/themes/caos/css/dark.css.map b/internal/ui/login/static/resources/themes/caos/css/dark.css.map deleted file mode 100644 index 5c2f220cfe..0000000000 --- a/internal/ui/login/static/resources/themes/caos/css/dark.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA,kBCLc;EDMd,OCLQ;EDMR;EACA;EACA;;;AAMJ;EACI,OCfQ;EDgBR,aCtBS;EDuBT;EACA,WE7BS;EF8BT;;;AAGJ;EACI,OCvBQ;EDwBR,aC9BS;ED+BT;EACA,WEpCU;;;AFuCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OC3DW;ED4DX;EACA;;AAEA;EACI,OC/DY;;ADkEhB;EACI;;;AAIR;EACI,kBC3Ec;ED4Ed,OC1EW;ED2EX;EACA;EACA;EACA;EACA,QE5FU;EF6FV;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBCxFY;EDyFZ,OC5FU;ED6FV;;AAGJ;EACI,kBC/FO;EDgGP,OCjGI;EDkGJ;;AACA;EACI,kBClGQ;;ADsGhB;EACI,kBE5FW;EF6FX;;AAEA;EACI,kBEhGO;EFiGP;;AAIR;EACI;EACA;EACA;EACA;EACA,OEpGa;EFqGb,kBEpGmB;;AFsGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAOZ;EACI,kBElImB;EFmInB,OCjJQ;EDkJR,QE9JU;EF+JV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EACA;EE9JN;;AACA;EFwJE;IEvJA;IACA;;;AF+JA;EElKF;;AACA;EFiKE;IEhKA;IACA;;;;AFsKA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WE5LE;EF6LF;;AAGJ;EACI;EACA;EACA;EACA,OE/KC;;;AFqLT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OCpOA;;ADwOR;EACI,OE7NK;EF8NL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCnQI;EDoQJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBE7PW;;AFgQf;EACI;;AAIR;EACI;;AAMA;EACI;EACA;EACA;EACA;EACA,cElRO;EFmRP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OE9SP;;AFmTL;EACI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI,kBC1UE;;AD8UF;EACI;EACA;;AAOZ;EACI;;AAEJ;EACI;EACA;EACA;EACA;EE7VV;;AACA;EFwVM;IEvVJ;IACA;;;AF+VQ;EACI;EACA;EEpWd;;AACA;EFiWU;IEhWR;IACA;;;AFsWI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OE3WN;;AFgXE;EACI,OElXL;;AFuXP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MC9ZI;;ADiaR;EACI,MCnaU;;;ADwad;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OElcO;;;AFqcX;EACI;;;AAGJ;EACI","file":"dark.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/caos/css/light.css b/internal/ui/login/static/resources/themes/caos/css/light.css deleted file mode 100644 index 1d905b2969..0000000000 --- a/internal/ui/login/static/resources/themes/caos/css/light.css +++ /dev/null @@ -1,654 +0,0 @@ -@font-face { - font-family: Aileron; - src: url(../../../fonts/ailerons/ailerons.otf) format("opentype"); -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Thin.ttf) format("truetype"); - font-style: normal; - font-weight: 100; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-ThinItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 100; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Light.ttf) format("truetype"); - font-style: normal; - font-weight: 200; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-LightItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 200; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Regular.ttf) format("truetype"); - font-style: normal; - font-weight: 400; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Italic.ttf) format("truetype"); - font-style: italic; - font-weight: 400; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Bold.ttf) format("truetype"); - font-style: normal; - font-weight: 700; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-BoldItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 700; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Black.ttf) format("truetype"); - font-style: normal; - font-weight: 800; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-BlackItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 800; -} -@font-face { - font-family: "Material Icons"; - font-style: normal; - font-weight: 400; - src: url(../../../fonts/material/MaterialIcons-Regular.eot); - /* For IE6-8 */ - src: local("Material Icons"), local("MaterialIcons-Regular"), url(../../../fonts/material/MaterialIcons-Regular.woff2) format("woff2"), url(../../../fonts/material/MaterialIcons-Regular.woff) format("woff"), url(../../../fonts/material/MaterialIcons-Regular.ttf) format("truetype"); -} -*, *::before, *::after { - box-sizing: border-box; - font-family: Lato; - font-size: 16px; - font-weight: 400; -} - -body { - margin: 0 0 100px 0; -} -body.waiting * { - cursor: wait !important; -} - -html { - width: 100%; - min-height: 100%; - font-weight: 300; - background-color: #282828; - color: white; - background-repeat: no-repeat; - background-position: bottom right; - background-size: contain; -} - -h1 { - color: white; - font-family: Aileron; - font-weight: 300; - font-size: 40px; - text-align: center; -} - -h2 { - color: white; - font-family: Aileron; - font-weight: 300; - font-size: 30px; -} - -p { - font-weight: 300; - text-align: center; -} - -header { - padding: 8px; -} -header .logo { - background-image: url("../logo-dark.png"); - background-repeat: no-repeat; - background-size: contain; - height: 80px; - margin: 30px; -} - -.head { - width: 100%; - max-width: 1000px; - margin: auto; -} - -.content form { - margin: auto; - padding: 20px; - width: 100%; - max-width: 500px; -} - -a { - color: #760038; - text-decoration: none; - font-weight: 400; -} -a:hover { - color: #f60075; -} -a.tos-link { - font-size: 14px; -} - -button, .button { - background-color: #282828; - color: #760038; - border: 1px solid #760038; - border-radius: 5px; - width: 100%; - max-width: 600px; - height: 50px; - transition: all 0.3s ease 0s; - cursor: pointer; - outline: none; - display: inline-block; - text-align: center; - line-height: 44px; - padding: 1px 6px; -} -button:hover, .button:hover { - background-color: #f60075; - color: #282828; - border: 1px solid #f60075; -} -button.primary, .button.primary { - background-color: #760038; - color: white; - border: none; -} -button.primary:hover, .button.primary:hover { - background-color: #f60075; -} -button:disabled, .button:disabled { - background-color: #999999; - border: 1px solid #999999; -} -button:disabled:hover, .button:disabled:hover { - background-color: #999999; - border: 1px solid #999999; -} -button.google, .button.google { - display: flex; - align-items: center; - position: relative; - padding: 0 1px; - color: #FFFFFF; - background-color: #4285F4; -} -button.google span.logo, .button.google span.logo { - height: 46px; - width: 46px; - background-color: #FFFFFF; - background-image: url("../../../images/idp/google.png"); - background-size: 25px; - background-position: center; - background-repeat: no-repeat; - border-radius: 5px; -} -button.google span.provider-name, .button.google span.provider-name { - position: absolute; - left: 50%; - transform: translateX(-50%); -} - -input:not([type=radio]), select { - background-color: #252525; - color: white; - height: 50px; - border: 1px solid #999999; - border-radius: 5px; - padding-left: 8px; -} - -form button.user-selection .profile-image, .login-profile .profile-image { - height: 80px; - width: 80px; - background-position: center; - background-repeat: no-repeat; - background-size: contain; - background-image: url("../../../images/icon-user-dark.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.user-selection .profile-image, .login-profile .profile-image { - background-image: url("../../../images/icon-user-dark@2x.png"); - background-size: 80px 80px; - } -} -form button.user-selection:hover .profile-image, .login-profile:hover .profile-image { - background-image: url("../../../images/icon-user-dark-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.user-selection:hover .profile-image, .login-profile:hover .profile-image { - background-image: url("../../../images/icon-user-dark-hover@2x.png"); - background-size: 80px 80px; - } -} - -.login-profile .profile-image { - margin-left: auto; - margin-right: auto; -} -.login-profile .names { - padding: 10px 0; - text-align: center; -} -.login-profile .names div:first-of-type { - font-size: 26px; - font-weight: 300; -} -.login-profile .names div:nth-of-type(2) { - font-weight: 300; - font-size: 0.9rem; - font-style: italic; - color: #898989; -} - -form .field { - display: grid; - padding: 10px 0; -} -form .field.radio-button { - display: flex; -} -form .field.radio-button input[type=radio] { - height: 20px; - vertical-align: middle; -} -form .field.radio-button label { - height: 20px; - display: inline-block; - padding: 3px 0 0 15px; - width: 100%; -} -form .field.check-box { - display: flex; -} -form .field.check-box input[type=checkbox] { - height: 16px; - vertical-align: middle; -} -form .field.check-box label { - height: 16px; - text-transform: inherit; - display: inline-block; - padding: 2px 0 0 15px; - width: 100%; - color: white; -} -form label { - color: #898989; - text-transform: uppercase; - font-size: 0.8rem; - margin-bottom: 3px; -} -form label span.optional { - font-style: italic; - text-transform: none; -} -form .actions { - padding: 20px 0; -} -form .actions .right { - float: right; -} -form .actions button, form .actions a { - margin: 10px 0; -} -form button.clean { - border: none; - height: auto; - color: white; - text-align: left; - text-transform: unset; - display: flex; - padding: 15px; -} -form button.clean:hover { - border: none; - background-color: #252525; -} -form button.clean * { - font-weight: 300; -} -form .user-selection-list { - margin-bottom: 40px; -} -form button.user-selection .sessionstate { - display: inline-block; - height: 20px; - width: 20px; - border-radius: 20px; - border-color: #999999; - border-style: solid; - border-width: 1px; - position: absolute; - bottom: 0px; - right: 10px; -} -form button.user-selection .sessionstate.sessionstate-0 { - background-color: #138D00; -} -form button.user-selection .sessionstate.sessionstate-1 { - background-color: #BC372E; -} -form button.user-selection > div { - position: relative; -} -form button.user-selection > div.names { - margin: 0 15px; -} -form button.user-selection > div.names .displayname { - font-size: 1.4rem; -} -form button.user-selection > div.names .loginname { - color: #898989; -} -form button.user-selection:disabled { - background: transparent; - border: none; - cursor: not-allowed; -} -form button.user-selection:disabled .profile-image { - opacity: 0.3; -} -form button.user-selection:disabled .sessionstate { - background-color: #282828; -} -form button.user-selection:disabled .names .displayname, form button.user-selection:disabled .names .loginname { - font-style: italic; - color: #444444; -} -.user-selection + form button.other-user { - margin-top: 80px; -} -form button.other-user .other-user-image { - width: 80px; - height: 60px; - background-repeat: no-repeat; - background-position: center; - background-image: url("../../../images/icon-newuser-dark.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.other-user .other-user-image { - background-image: url("../../../images/icon-newuser-dark@2x.png"); - background-size: 80px 60px; - } -} -form button.other-user:hover .other-user-image { - background-repeat: no-repeat; - background-position: center; - background-image: url("../../../images/icon-newuser-dark-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.other-user:hover .other-user-image { - background-image: url("../../../images/icon-newuser-dark-hover@2x.png"); - background-size: 80px 60px; - } -} -form button.other-user > div:nth-of-type(2) { - margin: 15px; - font-size: 1.4rem; -} -form ul#passwordcomplexity { - display: flex; - flex-wrap: wrap; - padding: 0; - list-style: none; - margin-bottom: 0; -} -form ul#passwordcomplexity li { - flex: 1 0 50%; - display: block; - font-weight: 300; - font-size: 12px; - line-height: 12px; -} -form ul#passwordcomplexity li i { - height: 26px; - padding-right: 10px; - vertical-align: middle; - color: #0DF279; -} -form ul#passwordcomplexity li.invalid i { - color: #F20D6B; -} -form #loginname { - display: flex; -} -form #loginname .loginname-suffix { - padding-left: 5px; - line-height: 50px; -} - -#copy-secret { - visibility: hidden; - position: absolute; -} - -#qrcode { - text-align: center; -} -#qrcode svg rect.color { - fill: white; -} -#qrcode svg rect.bg-color { - fill: #282828; -} - -#secret .copy { - float: right; - cursor: pointer; -} - -footer { - background-image: url("../gradientdeco-full.svg"); - width: 100%; - background-size: cover; - bottom: 0; - z-index: -1; -} - -.material-icons { - font-family: "Material Icons"; - font-weight: normal; - font-style: normal; - font-size: 24px; - /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - /* Support for IE. */ - font-feature-settings: "liga"; -} - -.free-tier { - border: 2px solid #F20D6B; - border-radius: 5px; - padding: 10px; -} - -.error { - color: #F20D6B; -} - -.hidden { - display: none; -} - -#wa-error { - margin-top: 20px; -} - -html { - background-color: white; - color: #282828; -} -html header .logo { - background-image: url("../logo-light.png"); -} -html h1, html h2 { - color: #282828; -} -html button, html .button { - background-color: white; - color: #760038; - border: 1px solid #760038; -} -html button:hover, html .button:hover { - background-color: #f60075; - border: 1px solid #f60075; - color: #FFFFFF; -} -html button.primary, html .button.primary { - background-color: #760038; - color: #FFFFFF; - border: none; - box-shadow: 0px 10px 30px #760038; -} -html button.primary:hover, html .button.primary:hover { - background-color: #f60075; -} -html button:disabled, html .button:disabled { - background-color: #999999; - border: 1px solid #999999; -} -html button:disabled:hover, html .button:disabled:hover { - background-color: #999999; - border: 1px solid #999999; -} -html button.clean, html .button.clean { - color: #282828; -} -html button.clean:hover, html .button.clean:hover { - border: none; - background-color: #FFFFFF; -} -html button.user-selection .profile-image, html .button.user-selection .profile-image { - background-image: url("../../../images/icon-user-light.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - html button.user-selection .profile-image, html .button.user-selection .profile-image { - background-image: url("../../../images/icon-user-light@2x.png"); - background-size: 80px 80px; - } -} -html button.user-selection:hover, html .button.user-selection:hover { - background-color: #FFFFFF; -} -html button.user-selection:hover .profile-image, html .button.user-selection:hover .profile-image { - background-image: url("../../../images/icon-user-light-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - html button.user-selection:hover .profile-image, html .button.user-selection:hover .profile-image { - background-image: url("../../../images/icon-user-light-hover@2x.png"); - background-size: 80px 80px; - } -} -html button.other-user .other-user-image, html .button.other-user .other-user-image { - background-image: url("../../../images/icon-newuser-light.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - html button.other-user .other-user-image, html .button.other-user .other-user-image { - background-image: url("../../../images/icon-newuser-light@2x.png"); - background-size: 80px 60px; - } -} -html button.other-user:hover .other-user-image, html .button.other-user:hover .other-user-image { - background-image: url("../../../images/icon-newuser-light-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - html button.other-user:hover .other-user-image, html .button.other-user:hover .other-user-image { - background-image: url("../../../images/icon-newuser-light-hover@2x.png"); - background-size: 80px 60px; - } -} -html button.google, html .button.google { - color: #8b8d8d; - background-color: #FFFFFF; -} -html button.google span.logo, html .button.google span.logo { - background-image: url("../../../images/idp/google.png"); -} -html input:not([type=radio]), html select { - background-color: #FFFFFF; - color: #282828; -} -html #qrcode svg rect.color { - fill: #282828; -} -html #qrcode svg rect.bg-color { - fill: white; -} -html footer { - background-image: url("../gradientdeco-full.svg"); -} - -form .field.check-box label { - color: #282828; -} -form ul#passwordcomplexity li i { - color: #50CA3D; -} -form ul#passwordcomplexity li.invalid i { - color: #F20D6B; -} - -.login-profile .profile-image, form button.user-selection .profile-image { - background-image: url("../../../images/icon-user-light.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - .login-profile .profile-image, form button.user-selection .profile-image { - background-image: url("../../../images/icon-user-light@2x.png"); - background-size: 80px 80px; - } -} -.login-profile:hover .profile-image, form button.user-selection:hover .profile-image { - background-image: url("../../../images/icon-user-light-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - .login-profile:hover .profile-image, form button.user-selection:hover .profile-image { - background-image: url("../../../images/icon-user-light-hover@2x.png"); - background-size: 80px 80px; - } -} - -.free-tier { - border: 2px solid #F20D6B; -} - -.error { - color: #F20D6B; -} - -/*# sourceMappingURL=light.css.map */ diff --git a/internal/ui/login/static/resources/themes/caos/css/light.css.map b/internal/ui/login/static/resources/themes/caos/css/light.css.map deleted file mode 100644 index 18d1ec38a3..0000000000 --- a/internal/ui/login/static/resources/themes/caos/css/light.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/caos/variables.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCMW;EDLX;EACA;;;AAGJ;EACI;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA,kBCLc;EDMd,OCLQ;EDMR;EACA;EACA;;;AAMJ;EACI,OCfQ;EDgBR,aCtBS;EDuBT;EACA,WE7BS;EF8BT;;;AAGJ;EACI,OCvBQ;EDwBR,aC9BS;ED+BT;EACA,WEpCU;;;AFuCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OC3DW;ED4DX;EACA;;AAEA;EACI,OC/DY;;ADkEhB;EACI;;;AAIR;EACI,kBC3Ec;ED4Ed,OC1EW;ED2EX;EACA;EACA;EACA;EACA,QE5FU;EF6FV;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBCxFY;EDyFZ,OC5FU;ED6FV;;AAGJ;EACI,kBC/FO;EDgGP,OCjGI;EDkGJ;;AACA;EACI,kBClGQ;;ADsGhB;EACI,kBE5FW;EF6FX;;AAEA;EACI,kBEhGO;EFiGP;;AAIR;EACI;EACA;EACA;EACA;EACA,OEpGa;EFqGb,kBEpGmB;;AFsGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAOZ;EACI,kBElImB;EFmInB,OCjJQ;EDkJR,QE9JU;EF+JV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EACA;EE9JN;;AACA;EFwJE;IEvJA;IACA;;;AF+JA;EElKF;;AACA;EFiKE;IEhKA;IACA;;;;AFsKA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WE5LE;EF6LF;;AAGJ;EACI;EACA;EACA;EACA,OE/KC;;;AFqLT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OCpOA;;ADwOR;EACI,OE7NK;EF8NL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OCnQI;EDoQJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBE7PW;;AFgQf;EACI;;AAIR;EACI;;AAMA;EACI;EACA;EACA;EACA;EACA,cElRO;EFmRP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OE9SP;;AFmTL;EACI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI,kBC1UE;;AD8UF;EACI;EACA;;AAOZ;EACI;;AAEJ;EACI;EACA;EACA;EACA;EE7VV;;AACA;EFwVM;IEvVJ;IACA;;;AF+VQ;EACI;EACA;EEpWd;;AACA;EFiWU;IEhWR;IACA;;;AFsWI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OE3WN;;AFgXE;EACI,OElXL;;AFuXP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MC9ZI;;ADiaR;EACI,MCnaU;;;ADwad;EACI;EACA;;;AAIR;EAEQ;EAEJ;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OElcO;;;AFqcX;EACI;;;AAGJ;EACI;;;AG/eJ;EACI,kBFeQ;EEdR,OFac;;AERd;EACI;;AAGJ;EACI,OFGU;;AEAd;EACI;EACA;EACA;;AAEA;EACI,kBFIa;EEHb;EACA,ODyBgB;;ACtBpB;EACI,kBFVG;EEWH,ODoBgB;ECnBhB;EACA;;AACA;EACI,kBFdI;;AEkBZ;EACI,kBDRO;ECSP;;AAEA;EACI,kBDZG;ECaH;;AAIR;EACI,OFhCM;;AEkCN;EACI;EACA,kBDHY;;ACQhB;EDxCV;;AACA;ECuCU;IDtCR;IACA;;;ACyCQ;EACI,kBDbY;;ACeZ;ED/Cd;;AACA;EC8Cc;ID7CZ;IACA;;;ACmDQ;EDtDV;;AACA;ECqDU;IDpDR;IACA;;;ACwDY;ED3Dd;;AACA;EC0Dc;IDzDZ;IACA;;;AC8DI;EACI,OD7Bc;EC8Bd,kBD7BoB;;AC+BpB;EACI;;AAKZ;EACI,kBD5CoB;EC6CpB,OF9EU;;AEkFV;EACI,MFnFM;;AEsFV;EACI,MFtFA;;AE0FR;EAEQ;;;AAMR;EACI,OFpGU;;AEwGb;EACI,ODhEM;;ACoEN;EACI,ODtEG;;;AC8EZ;EDrHF;;AACA;ECoHE;IDnHA;IACA;;;ACsHA;EDzHF;;AACA;ECwHE;IDvHA;IACA;;;;AC2HJ;EACI;;;AAGJ;EACI,OD5FY","file":"light.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/caos/favicon.ico b/internal/ui/login/static/resources/themes/caos/favicon.ico deleted file mode 100644 index fcc06db395..0000000000 Binary files a/internal/ui/login/static/resources/themes/caos/favicon.ico and /dev/null differ diff --git a/internal/ui/login/static/resources/themes/caos/gradientdeco-full.svg b/internal/ui/login/static/resources/themes/caos/gradientdeco-full.svg deleted file mode 100644 index bd2418a23b..0000000000 --- a/internal/ui/login/static/resources/themes/caos/gradientdeco-full.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/internal/ui/login/static/resources/themes/caos/logo-dark.png b/internal/ui/login/static/resources/themes/caos/logo-dark.png deleted file mode 100644 index 48d5a9da16..0000000000 Binary files a/internal/ui/login/static/resources/themes/caos/logo-dark.png and /dev/null differ diff --git a/internal/ui/login/static/resources/themes/caos/logo-light.png b/internal/ui/login/static/resources/themes/caos/logo-light.png deleted file mode 100644 index 39008bbc8a..0000000000 Binary files a/internal/ui/login/static/resources/themes/caos/logo-light.png and /dev/null differ diff --git a/internal/ui/login/static/resources/themes/scss/bundle.scss b/internal/ui/login/static/resources/themes/scss/bundle.scss new file mode 100644 index 0000000000..3222ef976e --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/bundle.scss @@ -0,0 +1,12 @@ +// themes and colors +@import './styles/theming/all.scss'; +@import './styles/color/all_color.scss'; +@import './styles/typography/typography.scss'; + +// layouts +@import './styles/container/container.scss'; +@import './styles/register/register.scss'; +@import './styles/header/header.scss'; + +// animations +@import './styles/animations.scss'; diff --git a/internal/ui/login/static/resources/themes/scss/caos/dark.scss b/internal/ui/login/static/resources/themes/scss/caos/dark.scss deleted file mode 100644 index dd95159e7d..0000000000 --- a/internal/ui/login/static/resources/themes/scss/caos/dark.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import "../variables"; -@import "variables"; -@import "../main"; diff --git a/internal/ui/login/static/resources/themes/scss/caos/light.scss b/internal/ui/login/static/resources/themes/scss/caos/light.scss deleted file mode 100644 index 3a32c19485..0000000000 --- a/internal/ui/login/static/resources/themes/scss/caos/light.scss +++ /dev/null @@ -1,4 +0,0 @@ -@import "../variables"; -@import "variables"; -@import "../main"; -@import "../light"; diff --git a/internal/ui/login/static/resources/themes/scss/caos/variables.scss b/internal/ui/login/static/resources/themes/scss/caos/variables.scss deleted file mode 100644 index 351434fad6..0000000000 --- a/internal/ui/login/static/resources/themes/scss/caos/variables.scss +++ /dev/null @@ -1,27 +0,0 @@ -$logoImgDark: "../logo-dark.png"; -$logoImgLight: "../logo-light.png"; - -$footerimgDark: "../gradientdeco-full.svg"; -$footerimgLight: "../gradientdeco-full.svg"; - -$bodyImgDark: ""; -$bodyImgLight: ""; - -// ----- FONTS ------------ -$standardFont: Lato; -$headerFont: Aileron; - -// ----- COLORS ------------ - -// ------ DARK-THEME ------- -$backgroundColor: #282828; -$fontColor: white; -$primaryColor: #760038; -$primaryColorHover: lighten($primaryColor, 25%); - - -// ------ LIGHT-THEME ------- -$backgroundColorLight: $fontColor; -$fontColorLight: $backgroundColor; -$primaryColorLight: $primaryColor; -$primaryColorHoverLight: lighten($primaryColorLight, 25%); \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/light.scss b/internal/ui/login/static/resources/themes/scss/light.scss deleted file mode 100644 index 1c5b0c6b7f..0000000000 --- a/internal/ui/login/static/resources/themes/scss/light.scss +++ /dev/null @@ -1,150 +0,0 @@ -// ---- LIGHT-THEME------- -html { - background-color: $backgroundColorLight; - color: $fontColorLight; - @if($bodyImgLight != "") { - background-image: url($bodyImgLight); - } - - header .logo { - background-image: url($logoImgLight); - } - - h1, h2 { - color: $fontColorLight; - } - - button, .button { - background-color: $backgroundColorLight; - color: $primaryColorLight; - border: 1px solid $primaryColorLight; - - &:hover { - background-color: $primaryColorHoverLight; - border: 1px solid $primaryColorHoverLight; - color: $buttonBackgroundColorHoverLight - } - - &.primary { - background-color: $primaryColor; - color: $buttonBackgroundColorHoverLight; - border: none; - box-shadow: 0px 10px 30px $primaryColor; - &:hover { - background-color: $primaryColorHover; - } - } - - &:disabled { - background-color: $inputBorderColor; - border: 1px solid $inputBorderColor; - - &:hover { - background-color: $inputBorderColor; - border: 1px solid $inputBorderColor; - } - } - - &.clean { - color: $fontColorLight; - - &:hover { - border: none; - background-color: $buttonBackgroundColorHoverLight; - } - } - - &.user-selection { - .profile-image { - @include retina-background-image($profileImgLight, "png", false, 80px, 80px); - } - - &:hover { - background-color: $buttonBackgroundColorHoverLight; - - .profile-image { - @include retina-background-image($profileImgLight, "png", true, 80px, 80px); - } - } - } - - &.other-user { - .other-user-image { - @include retina-background-image($otherUserImgLight, "png", false, 80px, 60px); - } - - &:hover { - .other-user-image { - @include retina-background-image($otherUserImgLight, "png", true, 80px, 60px); - } - } - } - - &.google { - color: $idpGoogleFontColorLight; - background-color: $idpGoogleBackgroundColorLight; - - span.logo { - background-image: url($idpGoogleImg + '.png'); - } - } - } - - input:not([type='radio']), select { - background-color: $inputBackgroundColorLight; - color: $fontColorLight; - } - - #qrcode { - svg rect.color { - fill: $fontColorLight; - } - - svg rect.bg-color { - fill: $backgroundColorLight; - } - } - - footer { - @if($footerimgLight != "") { - background-image: url($footerimgLight); - } - } -} - -form { - .field.check-box label { - color: $fontColorLight; - } - - ul#passwordcomplexity li { - i { - color: $okColorLight; - } - - &.invalid { - i { - color: $nokColorLight; - } - } - } -} - - -%profile-image { - .profile-image { - @include retina-background-image($profileImgLight, "png", false, 80px, 80px); - } - - &:hover .profile-image { - @include retina-background-image($profileImgLight, "png", true, 80px, 80px); - } -} - -.free-tier { - border: 2px solid $nokColorLight; -} - -.error { - color: $nokColorLight; -} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/main.scss b/internal/ui/login/static/resources/themes/scss/main.scss index 30296adb94..3b0ddc0da2 100644 --- a/internal/ui/login/static/resources/themes/scss/main.scss +++ b/internal/ui/login/static/resources/themes/scss/main.scss @@ -1,498 +1,22 @@ -@import "fonts"; - -*, *::before, *::after { - box-sizing: border-box; - font-family: $standardFont; - font-size: 16px; - font-weight: 400; -} - body { - margin: 0 0 100px 0; + margin: 0 auto; + display: flex; + flex-direction: column; + height: 100vh; + + .lgn-grow { + flex: 1; + } &.waiting * { cursor: wait !important; } } -html { - width: 100%; - min-height: 100%; - font-weight: 300; - background-color: $backgroundColor; - color: $fontColor; - background-repeat: no-repeat; - background-position: bottom right; - background-size: contain; - @if($bodyImgDark != "") { - background-image: url($bodyImgDark); - } -} - -h1 { - color: $fontColor; - font-family: $headerFont; - font-weight: 300; - font-size: $headerSize; - text-align: center; -} - -h2 { - color: $fontColor; - font-family: $headerFont; - font-weight: 300; - font-size: $header2Size; -} - -p { - font-weight: 300; - text-align: center; -} - -header { - padding: 8px; - - .logo { - background-image: url($logoImgDark); - background-repeat: no-repeat; - background-size: contain; - height: 80px; - margin: 30px; - } -} - -.head { - width: 100%; - max-width: 1000px; - margin: auto; -} - -.content form { - margin: auto; - padding: 20px; - width: 100%; - max-width: 500px; -} - -a { - color: $primaryColor; - text-decoration: none; - font-weight: 400; - - &:hover { - color: $primaryColorHover; - } - - &.tos-link { - font-size: 14px; - } -} - -button, .button { - background-color: $backgroundColor; - color: $primaryColor; - border: 1px solid $primaryColor; - border-radius: 5px; - width: 100%; - max-width: 600px; - height: $inputHeight; - transition: all 0.3s ease 0s; - cursor: pointer; - outline: none; - display: inline-block; - text-align: center; - line-height: 44px; - padding: 1px 6px; - - &:hover { - background-color: $primaryColorHover; - color: $backgroundColor; - border: 1px solid $primaryColorHover; - } - - &.primary { - background-color: $primaryColor; - color: $fontColor; - border: none; - &:hover { - background-color: $primaryColorHover; - } - } - - &:disabled { - background-color: $inputBorderColor; - border: 1px solid $inputBorderColor; - - &:hover { - background-color: $inputBorderColor; - border: 1px solid $inputBorderColor; - } - } - - &.google { - display: flex; - align-items: center; - position: relative; - padding: 0 1px; - color: $idpGoogleFontColor; - background-color: $idpGoogleBackgroundColor; - - span.logo { - height: 46px; - width: 46px; - background-color: #FFFFFF; - background-image: url($idpGoogleImg + '.png'); - background-size: 25px; - background-position: center; - background-repeat: no-repeat; - border-radius: 5px; - } - - span.provider-name { - position: absolute; - left: 50%; - transform: translateX(-50%); - } - } -} - - - -input:not([type='radio']), select { - background-color: $inputBackgroundColor; - color: $fontColor; - height: $inputHeight; - border: 1px solid $inputBorderColor; - border-radius: 5px; - padding-left: 8px; -} - -%profile-image { - .profile-image { - height: 80px; - width: 80px; - background-position: center; - background-repeat: no-repeat; - background-size: contain; - @include retina-background-image($profileImgDark, "png", false, 80px, 80px); - } - - &:hover .profile-image { - @include retina-background-image($profileImgDark, "png", true, 80px, 80px); - } -} - -.login-profile { - @extend %profile-image; - .profile-image { - margin-left: auto; - margin-right: auto; - } - - .names { - padding: 10px 0; - text-align: center; - - div:first-of-type { - font-size: $header3Size; - font-weight: 300; - } - - div:nth-of-type(2) { - font-weight: 300; - font-size: 0.9rem; - font-style: italic; - color: $labelColor; - } - } -} - -form { - .field { - display: grid; - padding: 10px 0; - } - - .field.radio-button { - display: flex; - - input[type='radio'] { - height: 20px; - vertical-align: middle; - } - - & label { - height: 20px; - display: inline-block; - padding: 3px 0 0 15px; - width: 100%; - } - } - - .field.check-box { - display: flex; - - input[type='checkbox'] { - height: 16px; - vertical-align: middle; - } - - & label { - height: 16px; - text-transform: inherit; - display: inline-block; - padding: 2px 0 0 15px; - width: 100%; - color: $fontColor; - } - } - - label { - color: $labelColor; - text-transform: uppercase; - font-size: 0.8rem; - margin-bottom: 3px; - - span.optional { - font-style: italic; - text-transform: none; - } - } - - .actions { - padding: 20px 0; - - .right { - float: right; - } - - button, a { - margin: 10px 0; - } - } - - button.clean { - border: none; - height: auto; - color: $fontColor; - text-align: left; - text-transform: unset; - display: flex; - padding: 15px; - - &:hover { - border: none; - background-color: $buttonBackgroundColorHover; - } - - * { - font-weight: 300; - } - } - - .user-selection-list { - margin-bottom: 40px; - } - - button.user-selection { - @extend %profile-image; - - .sessionstate { - display: inline-block; - height: 20px; - width: 20px; - border-radius: 20px; - border-color: $inputBorderColor; - border-style: solid; - border-width: 1px; - position: absolute; - bottom: 0px; - right: 10px; - - &.sessionstate-0 { - background-color: #138D00; - } - - &.sessionstate-1 { - background-color: #BC372E; - } - } - - - & > div { - position: relative; - - &.names { - margin: 0 15px; - - .displayname { - font-size: 1.4rem; - } - .loginname { - color: $labelColor; - } - } - } - - &:disabled { - background: transparent; - border: none; - cursor: not-allowed; - - .profile-image { - opacity: 0.3; - } - - .sessionstate { - background-color: $backgroundColor; - } - - .names { - .displayname, .loginname { - font-style: italic; - color: #444444; - } - } - } - } - - button.other-user { - .user-selection+&{ - margin-top: 80px; - } - .other-user-image { - width: 80px; - height: 60px; - background-repeat: no-repeat; - background-position: center; - @include retina-background-image($otherUserImgDark, "png", false, 80px, 60px); - } - - &:hover { - .other-user-image { - background-repeat: no-repeat; - background-position: center; - @include retina-background-image($otherUserImgDark, "png", true, 80px, 60px); - } - } - - & > div:nth-of-type(2) { - margin: 15px; - font-size: 1.4rem; - } - } - - ul#passwordcomplexity { - display: flex; - flex-wrap: wrap; - padding: 0; - list-style: none; - margin-bottom: 0; - - li { - flex: 1 0 50%; - display: block; - font-weight: 300; - font-size: 12px; - line-height: 12px; - - i { - height: 26px; - padding-right: 10px; - vertical-align: middle; - color: $okColor; - } - } - - li.invalid { - i { - color: $nokColor; - } - } - } - - #loginname { - display: flex; - .loginname-suffix { - padding-left: 5px; - line-height: 50px; - } - } -} - -#copy-secret { - visibility: hidden; - position: absolute; -} - -#qrcode { - text-align: center; - - svg rect.color { - fill: $fontColor; - } - - svg rect.bg-color { - fill: $backgroundColor; - } -} - -#secret { - .copy { - float: right; - cursor: pointer; - } -} - -footer { - @if($footerimgDark != "") { - background-image: url($footerimgDark); - } - width: 100%; - background-size: cover; - bottom: 0; - z-index: -1; -} - -.material-icons { - font-family: 'Material Icons'; - font-weight: normal; - font-style: normal; - font-size: 24px; /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - - /* Support for IE. */ - font-feature-settings: 'liga'; -} - -.free-tier { - border: 2px solid $nokColor; - border-radius: 5px; - padding: 10px; -} - -.error { - color: $nokColor; -} - .hidden { - display: none; + display: none !important; } -#wa-error { - margin-top: 20px; +.text-align-center { + text-align: center; } diff --git a/internal/ui/login/static/resources/themes/scss/styles/a/a.scss b/internal/ui/login/static/resources/themes/scss/styles/a/a.scss new file mode 100644 index 0000000000..91943f36b5 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/a/a.scss @@ -0,0 +1,10 @@ +a { + text-decoration: none; + outline: none; + cursor: pointer; + margin: 2px 0; + + &.block { + display: block; + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/a/a_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/a/a_theme.scss new file mode 100644 index 0000000000..b44c5a2e8f --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/a/a_theme.scss @@ -0,0 +1,24 @@ +@import './a.scss'; + +@mixin lgn-a-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-a-color($color); + } +} + +@mixin lgn-a-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + + a { + color: lgn-color($primary, default); + + &:hover, + &:active { + color: lgn-color($primary, 400); + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection.scss b/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection.scss new file mode 100644 index 0000000000..c090205d7d --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection.scss @@ -0,0 +1,51 @@ +$lgn-container-max-width: 380px; +$lgn-container-padding: 20px; +$lgn-container-margin: 0px auto 50px auto; + +.lgn-account-selection{ + display: flex; + flex-direction: column; + width: 100%; + + .lgn-account { + display: flex; + align-items: center; + border: none; + outline: none; + + .left { + padding: .5rem 1rem; + } + + .lgn-names { + display: block; + margin: .5rem; + text-align: start; + + .lgn-displayname{ + font-size: 16px; + margin: .5rem 0; + margin-bottom: 0; + } + + .lgn-loginname{ + font-size: 14px; + margin: 0; + } + + .lgn-session-state { + margin: 0; + font-size: 14px; + margin-bottom: .5rem; + } + } + + .fill-space { + flex: 1; + } + + i { + font-size: 1.2rem; + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss new file mode 100644 index 0000000000..cc65154c85 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/account_selection/account_selection_theme.scss @@ -0,0 +1,62 @@ +@import './account_selection.scss'; + +@mixin lgn-account-selection-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-account-selection-color($color); + } +} + +@mixin lgn-account-selection-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $warn: map-get($config, warn); + $primary: map-get($config, primary); + $foreground: map-get($config, foreground); + $background: map-get($config, background); + + .lgn-account-selection{ + display: flex; + flex-direction: column; + width: 100%; + + .lgn-account { + color: inherit; + background: transparent; + box-shadow: inset 0 -1px lgn-color($foreground, footer-line); + cursor: pointer; + + &:hover { + $primary: map-get($config, primary); + background-color: lgn-color($background, account-selector-hover); + } + + &:focus { + background-color: lgn-color($background, account-selector-active); + } + + &:active { + background-color: lgn-color($background, account-selector-active); + } + + .lgn-loginname{ + font-size: 14px; + color: lgn-color($foreground, label); + } + + .lgn-session-state { + color: lgn-color($foreground, label); + + &.i0 { + color: #85d996; + } + + &.i1 { + $warn: map-get($config, warn); + color: lgn-color($warn, default); + } + } + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/animations.scss b/internal/ui/login/static/resources/themes/scss/styles/animations.scss new file mode 100644 index 0000000000..c1d0ed2047 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/animations.scss @@ -0,0 +1,22 @@ +@keyframes shake { + 10%, 90% { + transform: translate3d(-1px, 0, 0); + } + + 20%, 80% { + transform: translate3d(2px, 0, 0); + } + + 30%, 50%, 70% { + transform: translate3d(-4px, 0, 0); + } + + 40%, 60% { + transform: translate3d(4px, 0, 0); + } +} + +[shake] { + animation: shake .8s cubic-bezier(.36,.07,.19,.97) both; + transform: translate3d(0, 0, 0); +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar.scss b/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar.scss new file mode 100644 index 0000000000..9d7e3d81b8 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar.scss @@ -0,0 +1,18 @@ +$lgn-container-max-width: 380px; +$lgn-container-padding: 20px; +$lgn-avatar-size: 32px; + +.lgn-avatar { + height: $lgn-avatar-size; + width: $lgn-avatar-size; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + text-transform: uppercase; + box-sizing: border-box; + letter-spacing: .05em; + font-size: 14px; + outline: none; + font-weight: bold; +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss new file mode 100644 index 0000000000..8c14a69694 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/avatar/avatar_theme.scss @@ -0,0 +1,66 @@ +@import './avatar.scss'; +@import "../elevation/elevation.scss"; + +@mixin lgn-avatar-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-avatar-color($color); + } +} + +@mixin lgn-avatar-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $warn: map-get($config, warn); + $primary: map-get($config, primary); + + .lgn-avatar:not(.transparent) { + @include _lgn-avatar-theme-property($config, "background-color", default); + @include lgn-button-elevation(2, $config); + } + + .lgn-avatar .initials{ + @include _lgn-avatar-theme-property($config, "color", default-contrast); + } +} + +@mixin _lgn-avatar-theme-property($theme, $property, $hue) { + $primary: map-get($theme, primary); + $accent: map-get($theme, accent); + $warn: map-get($theme, warn); + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + &.lgn-primary { + #{$property}: lgn-color($primary, $hue); + } + &.lgn-accent { + #{$property}: lgn-color($accent, $hue); + } + &.lgn-warn { + #{$property}: lgn-color($warn, $hue); + } + + &.lgn-primary, + &.lgn-accent, + &.lgn-warn, + &[disabled] { + &[disabled] { + $palette: if($property == "color", $foreground, $background); + #{$property}: lgn-color($palette, disabled-button); + } + } +} + +@mixin lgn-avatar-elevation($zValue, $config, $opacity: $lgn-elevation-opacity) { + $foreground: map-get($config, foreground); + $elevation-color: map-get($foreground, elevation); + $elevation-color-or-default: if( + $elevation-color == null, + $lgn-elevation-color, + $elevation-color + ); + + @include lgn-elevation($zValue, $elevation-color-or-default, $opacity); + } \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/button/button.scss b/internal/ui/login/static/resources/themes/scss/styles/button/button.scss new file mode 100644 index 0000000000..c3659aeaac --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/button/button.scss @@ -0,0 +1,40 @@ +@import './button_base.scss'; + +.lgn-button, .lgn-stroked-button, .lgn-icon-button { + @include lgn-button-base; +} + +.lgn-raised-button { + @include lgn-raised-button; +} + +.lgn-icon-button { + padding: 0; + min-width: 0; + width: $lgn-icon-button-size; + height: $lgn-icon-button-size; + flex-shrink: 0; + line-height: $lgn-icon-button-size; + border-radius: $lgn-icon-button-border-radius; + + i, .mat-icon { + line-height: $lgn-icon-button-line-height; + } +} + +.lgn-stroked-button { + border: $lgn-stroked-button-border-width solid currentColor; + padding: $lgn-stroked-button-padding; + line-height: $lgn-stroked-button-line-height; +} + +.lgn-button:focus { + pointer-events: none; + transition: $lgn-button-focus-transition; +} + +.lgn-button, .lgn-stroked-button, .lgn-raised-button { + * { + vertical-align: middle; + } +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/button/button_base.scss b/internal/ui/login/static/resources/themes/scss/styles/button/button_base.scss new file mode 100644 index 0000000000..b102dac308 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/button/button_base.scss @@ -0,0 +1,59 @@ +$lgn-button-padding: 0 16px !default; +$lgn-button-min-width: 64px !default; +$lgn-button-margin: 0 !default; +$lgn-button-line-height: 36px !default; +$lgn-button-border-radius: 6px !default; +$lgn-button-focus-transition: opacity 200ms cubic-bezier(0.35, 0, 0.25, 1), + background-color 200ms cubic-bezier(0.35, 0, 0.25, 1) !default; + +// Stroked button padding is 1px less horizontally than default or raised lgn button +// button's padding. +$lgn-stroked-button-line-height: $lgn-button-line-height - 2; +$lgn-stroked-button-padding: 0 15px; +$lgn-stroked-button-border-width: 1px; + +$lgn-icon-button-size: 40px !default; +$lgn-icon-button-border-radius: 50% !default; +$lgn-icon-button-line-height: 24px !default; + +// adds base styles to all button types. +@mixin lgn-button-base { + box-sizing: border-box; + position: relative; + cursor: pointer; + outline: none; + border: none; + -webkit-tap-highlight-color: transparent; + + // Make anchors (a href) render like buttons. + display: inline-block; + white-space: nowrap; + text-decoration: none; + vertical-align: baseline; + text-align: center; + + // Sizing. + margin: $lgn-button-margin; + min-width: $lgn-button-min-width; + line-height: $lgn-button-line-height; + padding: $lgn-button-padding; + border-radius: $lgn-button-border-radius; + + overflow: visible; + + &[disabled] { + cursor: default; + } + + &::-moz-focus-inner { + border: 0; + } +} + +// Applies styles to buttons with backgrounds: raised +@mixin lgn-raised-button { + @include lgn-button-base; + + // Force hardware acceleration. + transform: translate3d(0, 0, 0); +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/button/button_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/button/button_theme.scss new file mode 100644 index 0000000000..3cd42b3ccc --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/button/button_theme.scss @@ -0,0 +1,160 @@ +@import "../theming/theming.scss"; +@import "./button.scss"; +@import "../elevation/elevation.scss"; + +@mixin lgn-button-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-button-color($color); + } +} + +@mixin lgn-button-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + $accent: map-get($config, accent); + $warn: map-get($config, warn); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + .lgn-button, + .lgn-stroked-button, + .lgn-icon-button { + color: inherit; + background: transparent; + + @include _lgn-button-theme-property($config, "color", text); + } + + .lgn-button:focus, + .lgn-stroked-button:focus, + .lgn-raised-button:focus { + @include lgn-button-elevation(8, $config); + background: map-get($background, base); + } + + .lgn-stroked-button:not([disabled]) { + border-color: lgn-color($foreground, divider); + } + + .lgn-button { + @include _lgn-button-theme-property($config, "color", text); + &:hover { + $primary: map-get($config, primary); + background-color: rgba(lgn-color($primary, 500), 0.1); + } + + &:focus { + background-color: rgba(lgn-color($primary, 500), 0.2); + } + + &:active { + background-color: rgba(lgn-color($primary, 500), 0.25); + } + } + + .lgn-raised-button { + color: lgn-color($foreground, text); + background-color: lgn-color($background, raised-button); + + @include _lgn-button-theme-property($config, "color", default-contrast); + @include _lgn-button-theme-property($config, "background-color", default); + + &:active { + background-color: rgba(lgn-color($primary, 500), 0.8); + } + } + + .lgn-button, + .lgn-stroked-button { + @include lgn-button-elevation(0, $config); + } + + .lgn-raised-button { + @include lgn-button-elevation(2, $config); + + &:not([disabled]):active { + @include lgn-button-elevation(8, $config); + } + + // &:focus { + // @include lgn-b-elevation(8, $config); + // } + + &[disabled] { + @include lgn-button-elevation(0, $config); + } + } +} + +@mixin _lgn-button-theme-property($theme, $property, $hue) { + $primary: map-get($theme, primary); + $accent: map-get($theme, accent); + $warn: map-get($theme, warn); + $background: map-get($theme, background); + $foreground: map-get($theme, foreground); + + &.lgn-primary { + #{$property}: lgn-color($primary, $hue); + } + &.lgn-accent { + #{$property}: lgn-color($accent, $hue); + } + &.lgn-warn { + #{$property}: lgn-color($warn, $hue); + } + + &.lgn-primary, + &.lgn-accent, + &.lgn-warn, + &[disabled] { + &[disabled] { + $palette: if($property == "color", $foreground, $background); + #{$property}: lgn-color($palette, disabled-button); + } + } +} + +@mixin _lgn-button-focus-overlay-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + $accent: map-get($config, accent); + $warn: map-get($config, warn); + + &.lgn-primary:focus { + background-color: lgn-color($primary); + } + + &.lgn-accent:focus { + background-color: lgn-color($accent); + } + + &.lgn-warn:focus { + background-color: lgn-color($warn); + } +} + +@mixin lgn-button-elevation($zValue, $config, $opacity: $lgn-elevation-opacity) { + $foreground: map-get($config, foreground); + $elevation-color: map-get($foreground, elevation); + $elevation-color-or-default: if( + $elevation-color == null, + $lgn-elevation-color, + $elevation-color + ); + + @include lgn-elevation($zValue, $elevation-color-or-default, $opacity); +} + +@mixin lgn-button-typography($config-or-theme) { + $config: lgn-get-typography-config($config-or-theme); + .lgn-button, .lgn-raised-button, .lgn-icon-button, .lgn-stroked-button { + font: { + family: lgn-font-family($config, button); + size: lgn-font-size($config, button); + weight: lgn-font-weight($config, button); + } + } + } diff --git a/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss b/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss new file mode 100644 index 0000000000..6be01feef1 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox.scss @@ -0,0 +1,5 @@ +@import './checkbox_base.scss'; + +.lgn-checkbox { + @include lgn-checkbox-base; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_base.scss b/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_base.scss new file mode 100644 index 0000000000..8d33d54c84 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_base.scss @@ -0,0 +1,54 @@ +$lgn-checkbox-font-size: 14px !default; + +@mixin lgn-checkbox-base { + display: inline-block; + position: relative; + margin: 0 0 10px; + font-size: $lgn-checkbox-font-size; + line-height: 24px; + box-sizing: inherit; + + input[type='checkbox'] { + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + opacity: 0; + z-index: 0; + box-sizing: inherit; + } + + // Unchecked + label { + display: block; + padding: 0 0 0 30px; + cursor: pointer; + box-sizing: inherit; + font-size: $lgn-checkbox-font-size; + line-height: 28px; + + &:before { + content: ''; + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + border-radius: 2px; + transition: all .28s cubic-bezier(.4, 0, .2, 1); + transition-property: background-color, border-color; + } + + &:after { + content: ''; + position: absolute; + top: 5px; + left: 5px; + width: 6px; + height: 12px; + transform: rotate(45deg); + transition: border-color .28s cubic-bezier(.4, 0, .2, 1); + } + } +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss new file mode 100644 index 0000000000..90784e1595 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/checkbox/checkbox_theme.scss @@ -0,0 +1,55 @@ +@import '../theming/theming.scss'; +@import './checkbox.scss'; + +@mixin lgn-checkbox-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-checkbox-color($color); + } +} + +@mixin lgn-checkbox-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + $warn: map-get($config, warn); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + input[type='checkbox'] { + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + opacity: 0; + z-index: 0; + } + + // Unchecked + .lgn-checkbox label { + &:before { + background-color: transparent; + border: 2px solid lgn-color($foreground, input-border); + } + + &:after { + border-bottom: 2px solid transparent; + border-right: 2px solid transparent; + background: transparent; + } + } + + // Checked + input[type='checkbox']:checked + label { + &:before { + background-color: lgn-color($primary, default); + border-color: lgn-color($primary, default); + } + + &:after { + border-color: #fff; + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/color/all_color.scss b/internal/ui/login/static/resources/themes/scss/styles/color/all_color.scss new file mode 100644 index 0000000000..eb5ef8a3c5 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/color/all_color.scss @@ -0,0 +1,19 @@ +@import '../theming/all.scss'; +@import '../theming/theming.scss'; + +// Includes all of the color styles. +@mixin zitadel-lgn-color($config-or-theme) { + // In case a theme object has been passed instead of a configuration for + // the color system, extract the color config from the theme object. + $config: if(lgn-private-is-theme-object($config-or-theme), + lgn-get-color-config($config-or-theme), $config-or-theme); + + @if $config == null { + @error 'No color configuration specified.'; + } + + // includes all themes with given color + @include zitadel-lgn-theme(( + color: $config, + )); +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/container/container.scss b/internal/ui/login/static/resources/themes/scss/styles/container/container.scss new file mode 100644 index 0000000000..c6c0fed862 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/container/container.scss @@ -0,0 +1,124 @@ +$lgn-container-max-width: 400px; +$lgn-container-padding: 20px; +$lgn-container-margin: 0 auto 0 auto; +$lgn-container-top-offset: 100px; +$lgn-container-bottom-margin: 50px; + +.lgn-max-width-wrapper { + max-width: $lgn-container-max-width; + margin: auto; + margin-top: 50px; + margin-bottom: $lgn-container-bottom-margin; + display: block; + + @media only screen and (min-width: 600px) { + margin-top: $lgn-container-top-offset; + } +} + +.content-container { + position: relative; // used to position a button element relative to the left upper corner of the content wrapper + display: block; + margin: $lgn-container-margin; + padding: $lgn-container-padding; + width: 100%; + box-sizing: border-box; + + .lgn-head { + h1 { + text-align: center; + } + + p { + text-align: center; + } + } + + .lgn-actions { + display: flex; + align-items: center; + padding: .5rem 0; + margin-top: 1rem; + + // this is used to reverse the submit button order. + //The form submits the htmls first element thus for displaying the desired button on the right side, items have to be reversed. + &.lgn-reverse-order { + flex-direction: row-reverse; + } + + .fill-space { + flex: 1; + } + } + + .lgn-row { + display: flex; + align-items: center; + padding: 0; + + // this is used to reverse the submit button order. + //The form submits the htmls first element thus for displaying the desired button on the right side, items have to be reversed. + &.lgn-reverse-order { + flex-direction: row-reverse; + } + + .fill-space { + flex: 1; + } + } + + .lgn-login-profile { + margin-bottom: .5rem; + + .lgn-profile-image { + display: block; + margin: .5rem; + } + .lgn-names { + border-width: 1px; + border-style: solid; + border-radius: 50vw; + display: flex; + align-items: center; + + .inline-block { + display: inline-block; + margin: 0 2px; + } + + .lgn-displayname{ + margin: .5rem 1rem; + } + .lgn-loginname{ + p { + margin: .5rem 1rem; + } + } + } + } + + .lgn-left-action { + position: absolute; + left: 1rem; + top: -40px; + } + + .lgn-register-options { + display: flex; + flex-direction: column; + } + + .lgn-mfa-other { + display: flex; + flex-direction: column; + + button { + width: 100%; + margin: .5rem 0; + } + } +} + +i { + font-size: 1.2rem; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/container/container_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/container/container_theme.scss new file mode 100644 index 0000000000..b077324f4b --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/container/container_theme.scss @@ -0,0 +1,29 @@ +@import './container.scss'; + +@mixin lgn-container-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-container-color($color); + } +} + +@mixin lgn-container-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $warn: map-get($config, warn); + $primary: map-get($config, primary); + + .lgn-error { + .lgn-error-message { + color: lgn-color($warn, default); + } + } + + .lgn-login-profile { + .lgn-names { + $foreground: map-get($config, foreground); + border-color: lgn-color($foreground, divider); + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/core/core.scss b/internal/ui/login/static/resources/themes/scss/styles/core/core.scss new file mode 100644 index 0000000000..7b55f57da0 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/core/core.scss @@ -0,0 +1,33 @@ + + @mixin lgn-core($typography-config: null) { + @include zitadel-lgn-typography($typography-config); + } + + @mixin lgn-core-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + + // Wrapper element that provides the theme background + .lgn-app-background#{if(&, ', &.lgn-app-background', '')} { + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + background-color: lgn-color($background, background); + color: lgn-color($foreground, text); + } + + // Marker that is used to determine whether the user has added a theme to their page. + @at-root { + .lgn-theme-loaded-marker { + display: none; + } + } + } + + // Mixin that renders all of the core styles that depend on the theme. + @mixin lgn-core-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + @if $color != null { + @include lgn-core-color($color); + } + } \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/elevation/elevation.scss b/internal/ui/login/static/resources/themes/scss/styles/elevation/elevation.scss new file mode 100644 index 0000000000..6670027d14 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/elevation/elevation.scss @@ -0,0 +1,165 @@ +@function _get-umbra-map($color, $opacity) { + $shadow-color: if( + type-of($color) == color, + rgba($color, $opacity * 0.2), + $color + ); + + @return ( + 0: "0px 0px 0px 0px #{$shadow-color}", + 1: "0px 2px 1px -1px #{$shadow-color}", + 2: "0px 3px 1px -2px #{$shadow-color}", + 3: "0px 3px 3px -2px #{$shadow-color}", + 4: "0px 2px 4px -1px #{$shadow-color}", + 5: "0px 3px 5px -1px #{$shadow-color}", + 6: "0px 3px 5px -1px #{$shadow-color}", + 7: "0px 4px 5px -2px #{$shadow-color}", + 8: "0px 5px 5px -3px #{$shadow-color}", + 9: "0px 5px 6px -3px #{$shadow-color}", + 10: "0px 6px 6px -3px #{$shadow-color}", + 11: "0px 6px 7px -4px #{$shadow-color}", + 12: "0px 7px 8px -4px #{$shadow-color}", + 13: "0px 7px 8px -4px #{$shadow-color}", + 14: "0px 7px 9px -4px #{$shadow-color}", + 15: "0px 8px 9px -5px #{$shadow-color}", + 16: "0px 8px 10px -5px #{$shadow-color}", + 17: "0px 8px 11px -5px #{$shadow-color}", + 18: "0px 9px 11px -5px #{$shadow-color}", + 19: "0px 9px 12px -6px #{$shadow-color}", + 20: "0px 10px 13px -6px #{$shadow-color}", + 21: "0px 10px 13px -6px #{$shadow-color}", + 22: "0px 10px 14px -6px #{$shadow-color}", + 23: "0px 11px 14px -7px #{$shadow-color}", + 24: "0px 11px 15px -7px #{$shadow-color}" + ); +} + +@function _get-penumbra-map($color, $opacity) { + $shadow-color: if( + type-of($color) == color, + rgba($color, $opacity * 0.14), + $color + ); + + @return ( + 0: "0px 0px 0px 0px #{$shadow-color}", + 1: "0px 1px 1px 0px #{$shadow-color}", + 2: "0px 2px 2px 0px #{$shadow-color}", + 3: "0px 3px 4px 0px #{$shadow-color}", + 4: "0px 4px 5px 0px #{$shadow-color}", + 5: "0px 5px 8px 0px #{$shadow-color}", + 6: "0px 6px 10px 0px #{$shadow-color}", + 7: "0px 7px 10px 1px #{$shadow-color}", + 8: "0px 8px 10px 1px #{$shadow-color}", + 9: "0px 9px 12px 1px #{$shadow-color}", + 10: "0px 10px 14px 1px #{$shadow-color}", + 11: "0px 11px 15px 1px #{$shadow-color}", + 12: "0px 12px 17px 2px #{$shadow-color}", + 13: "0px 13px 19px 2px #{$shadow-color}", + 14: "0px 14px 21px 2px #{$shadow-color}", + 15: "0px 15px 22px 2px #{$shadow-color}", + 16: "0px 16px 24px 2px #{$shadow-color}", + 17: "0px 17px 26px 2px #{$shadow-color}", + 18: "0px 18px 28px 2px #{$shadow-color}", + 19: "0px 19px 29px 2px #{$shadow-color}", + 20: "0px 20px 31px 3px #{$shadow-color}", + 21: "0px 21px 33px 3px #{$shadow-color}", + 22: "0px 22px 35px 3px #{$shadow-color}", + 23: "0px 23px 36px 3px #{$shadow-color}", + 24: "0px 24px 38px 3px #{$shadow-color}" + ); +} + +@function _get-ambient-map($color, $opacity) { + $shadow-color: if( + type-of($color) == color, + rgba($color, $opacity * 0.12), + $color + ); + + @return ( + 0: "0px 0px 0px 0px #{$shadow-color}", + 1: "0px 1px 3px 0px #{$shadow-color}", + 2: "0px 1px 5px 0px #{$shadow-color}", + 3: "0px 1px 8px 0px #{$shadow-color}", + 4: "0px 1px 10px 0px #{$shadow-color}", + 5: "0px 1px 14px 0px #{$shadow-color}", + 6: "0px 1px 18px 0px #{$shadow-color}", + 7: "0px 2px 16px 1px #{$shadow-color}", + 8: "0px 3px 14px 2px #{$shadow-color}", + 9: "0px 3px 16px 2px #{$shadow-color}", + 10: "0px 4px 18px 3px #{$shadow-color}", + 11: "0px 4px 20px 3px #{$shadow-color}", + 12: "0px 5px 22px 4px #{$shadow-color}", + 13: "0px 5px 24px 4px #{$shadow-color}", + 14: "0px 5px 26px 4px #{$shadow-color}", + 15: "0px 6px 28px 5px #{$shadow-color}", + 16: "0px 6px 30px 5px #{$shadow-color}", + 17: "0px 6px 32px 5px #{$shadow-color}", + 18: "0px 7px 34px 6px #{$shadow-color}", + 19: "0px 7px 36px 6px #{$shadow-color}", + 20: "0px 8px 38px 7px #{$shadow-color}", + 21: "0px 8px 40px 7px #{$shadow-color}", + 22: "0px 8px 42px 7px #{$shadow-color}", + 23: "0px 9px 44px 8px #{$shadow-color}", + 24: "0px 9px 46px 8px #{$shadow-color}" + ); +} + +$lgn-elevation-transition-duration: 280ms !default; +$lgn-elevation-transition-timing-function: cubic-bezier( + 0.4, + 0, + 0.2, + 1 +) !default; +$lgn-elevation-color: black !default; + +// scaling value for elevation shadows. +$lgn-elevation-opacity: 1 !default; + +// Applies the correct css rules to an element to give it the elevation specified by $zValue. +// The $zValue must be between 0 and 24. +@mixin lgn-elevation( + $zValue, + $color: $lgn-elevation-color, + $opacity: $lgn-elevation-opacity +) { + @if type-of($zValue) != number or not unitless($zValue) { + @error '$zValue must be a unitless number'; + } + @if $zValue < 0 or $zValue > 24 { + @error '$zValue must be between 0 and 24'; + } + + box-shadow: #{map-get(_get-umbra-map($color, $opacity), $zValue)}, + #{map-get(_get-penumbra-map($color, $opacity), $zValue)}, + #{map-get(_get-ambient-map($color, $opacity), $zValue)}; +} + +// Returns a string that can be used as the value for a transition property for elevation. +// Calling this function directly is useful in situations where a component needs to transition +// more than one property. +// +// .foo { +// transition: lgn-elevation-transition-property-value(), opacity 100ms ease; +// } +@function lgn-elevation-transition-property-value( + $duration: $lgn-elevation-transition-duration, + $easing: $lgn-elevation-transition-timing-function +) { + @return box-shadow #{$duration} #{$easing}; +} + +// Applies the correct css rules needed to have an element transition between elevations. +// This mixin should be applied to elements whose elevation values will change depending on their +// context (e.g. when active or disabled). +// +// NOTE(traviskaufman): Both this mixin and the above function use default parameters so they can +// be used in the same way by clients. +@mixin lgn-elevation-transition( + $duration: $lgn-elevation-transition-duration, + $easing: $lgn-elevation-transition-timing-function +) { + transition: lgn-elevation-transition-property-value($duration, $easing); +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/error/error.scss b/internal/ui/login/static/resources/themes/scss/styles/error/error.scss new file mode 100644 index 0000000000..7e1aed425c --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/error/error.scss @@ -0,0 +1,9 @@ +.lgn-error { + display: flex; + align-items: center; + outline: none; + i { + margin-right: .5rem; + font-size: 1.5rem; + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/error/error_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/error/error_theme.scss new file mode 100644 index 0000000000..36b07c975b --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/error/error_theme.scss @@ -0,0 +1,19 @@ +@import './error.scss'; + +@mixin lgn-error-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-error-color($color); + } +} + +@mixin lgn-error-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $warn: map-get($config, warn); + + .lgn-error { + color: lgn-color($warn, default); + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/footer/footer.scss b/internal/ui/login/static/resources/themes/scss/styles/footer/footer.scss new file mode 100644 index 0000000000..59cb5fa75b --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/footer/footer.scss @@ -0,0 +1,29 @@ +$container-max-width: 350px; +$footer-height: 50px; +$footer-padding: 0 1rem; + +footer { + width: 100%; + box-sizing: border-box; + background: #00000020; + min-height: $footer-height; + display: flex; + align-items: center; + padding: $footer-padding; + + .fill-space { + flex: 1; + } + + a { + font-size: 12px; + margin-left: 1rem; + } + + @media only screen and (min-width: 600px) { + position: fixed; + bottom: 0; + left: 0; + right: 0; + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss new file mode 100644 index 0000000000..d1d137448a --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/footer/footer_theme.scss @@ -0,0 +1,27 @@ +@import './footer.scss'; + +@mixin lgn-footer-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + // @include lgn-private-check-duplicate-theme-styles($theme, 'mat-button') { + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-footer-color($color); + } + // } +} + +@mixin lgn-footer-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + footer { + background-color: lgn-color($background, footer); + border-top: 1px solid lgn-color($foreground, footer-line); + + a { + color: lgn-color($background, footer-links); + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/header/header.scss b/internal/ui/login/static/resources/themes/scss/styles/header/header.scss new file mode 100644 index 0000000000..1c2f9f2f51 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/header/header.scss @@ -0,0 +1,16 @@ +$lgn-header-padding: 0; +$lgn-header-margin: 1rem auto .5rem auto; + +.lgn-header { + display: block; + position: relative; + margin: $lgn-header-margin; + padding: $lgn-header-padding; + width: 100%; + + .lgn-logo { + height: 43px; + width: 160px; + margin: 0 auto; + } +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/header/header_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/header/header_theme.scss new file mode 100644 index 0000000000..f367449ccd --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/header/header_theme.scss @@ -0,0 +1,27 @@ +@import './header.scss'; + +@mixin lgn-header-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-header-color($color); + } +} + +@mixin lgn-header-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + + .lgn-logo { + background: _lgn-get-logo-src($config); + background-position: auto; + background-size: contain; + } +} + + +@function _lgn-get-logo-src($config) { + $is-dark-theme: map-get($config, is-dark); + @return if($is-dark-theme, url('../logo-light.svg') no-repeat, url('../logo-dark.svg') no-repeat); + // @return if($is-dark-theme, url('../'+attr(sourcelight))/*url('../logo-light.svg')*/ no-repeat, url('../'+attr(sourcedark))/*url('../logo-dark.svg')*/ no-repeat); +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss b/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss new file mode 100644 index 0000000000..f38c908605 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider.scss @@ -0,0 +1,5 @@ +@import './identity_provider_base.scss'; + +.lgn-idp { + @include lgn-idp-base; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_base.scss b/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_base.scss new file mode 100644 index 0000000000..fb1185e671 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_base.scss @@ -0,0 +1,42 @@ +$lgn-idp-margin: .5rem 0; +$lgn-idp-padding: 0 1px; +$lgn-idp-provider-name-line-height: 36px; +$lgn-idp-border-radius: .5rem; +$googlelogosource: '../../../images/idp/google'; + +@mixin lgn-idp-base { + display: block; + margin: $lgn-idp-margin; + box-sizing: border-box; + display: flex; + align-items: center; + position: relative; + padding: $lgn-idp-padding; + border-radius: $lgn-idp-border-radius; + border-width: 1px; + border-style: solid; + + span.logo { + height: 46px; + width: 46px; + } + + span.provider-name { + line-height: $lgn-idp-provider-name-line-height; + position: absolute; + left: 50%; + transform: translateX(-50%); + } + + &.google { + span.logo { + height: 46px; + width: 46px; + background-image: url($googlelogosource + '.png'); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; + } + } +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss new file mode 100644 index 0000000000..b55757a143 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/identity_provider/identity_provider_theme.scss @@ -0,0 +1,43 @@ +@import './identity_provider.scss'; + +@mixin lgn-idp-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-idp-color($color); + } +} + +@mixin lgn-idp-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + .lgn-idp { + border-color: lgn-color($foreground, divider); + + @include lgn-idp-elevation(1, $config); + + &:not([disabled]):active { + @include lgn-idp-elevation(8, $config); + } + + &.google { + color: lgn-color($foreground, google-text); + background-color: lgn-color($background, google); + } + } +} + +@mixin lgn-idp-elevation($zValue, $config, $opacity: $lgn-elevation-opacity) { + $foreground: map-get($config, foreground); + $elevation-color: map-get($foreground, elevation); + $elevation-color-or-default: if( + $elevation-color == null, + $lgn-elevation-color, + $elevation-color + ); + + @include lgn-elevation($zValue, $elevation-color-or-default, $opacity); + } \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/input/input.scss b/internal/ui/login/static/resources/themes/scss/styles/input/input.scss new file mode 100644 index 0000000000..dcdd6ba741 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/input/input.scss @@ -0,0 +1,23 @@ +@import './input_base.scss'; + +input:not([type=radio]):not([type=checkbox]), +.lgn-input { + @include lgn-input-base; +} + +// use seme base styling for select as input +select, .lgn-select { + @include lgn-input-base; +} + +.lgn-suffix-wrapper { + position: relative; + + [lgnSuffix] { + position: absolute; + right: .5rem; + top: 9px; + height: inherit; + vertical-align: middle; + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/input/input_base.scss b/internal/ui/login/static/resources/themes/scss/styles/input/input_base.scss new file mode 100644 index 0000000000..02cd12e8ed --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/input/input_base.scss @@ -0,0 +1,32 @@ +$lgn-input-padding-start: 10px !default; +$lgn-input-padding: 10px !default; +$lgn-input-margin: 0 0 2px 0 !default; +$lgn-input-line-height: 40px !default; +$lgn-input-border-radius: 4px !default; +$lgn-input-border-width: 1px !default; +$lgn-input-placeholder-font-size: 14px !default; + +@mixin lgn-input-base { + display: block; + box-sizing: border-box; + padding-inline-start: $lgn-input-padding-start; + outline: none; + display: inline-block; + text-align: start; + cursor: text; + border-radius: $lgn-input-border-radius; + transform: all .2 linear; + font-size: 1rem; + border-style: solid; + border-width: $lgn-input-border-width; + height: $lgn-input-line-height; + padding: $lgn-input-padding; + transition: border-color .2s ease-in-out; + width: 100%; + margin: $lgn-input-margin; + + &::placeholder { + font-size: $lgn-input-placeholder-font-size; + font-style: italic; + } +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/input/input_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/input/input_theme.scss new file mode 100644 index 0000000000..d864e27b91 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/input/input_theme.scss @@ -0,0 +1,58 @@ +@import '../theming/theming.scss'; +@import './input.scss'; + +@mixin lgn-input-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-input-color($color); + } +} + +@mixin lgn-input-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + $warn: map-get($config, warn); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + .lgn-input:not([disabled]), + select:not([disabled]), .lgn-select:not([disabled]) { + border-color: lgn-color($foreground, input-border); + } + + .lgn-input, + select, .lgn-select { + color: lgn-color($foreground, text); + background-color: lgn-color($background, input); + + &:hover { + border-color: lgn-color($foreground, input-border-hover); + } + + &:active { + @include _lgn-input-theme-property($config, 'border-color', default); + } + + &:focus { + @include _lgn-input-theme-property($config, 'border-color', default); + } + + // overwrite if state is warn + &[color='warn'] { + border-color: lgn-color($warn, default); + } + } + + .lgn-input::placeholder, + select::placeholder, + .lgn-select::placeholder { + color: lgn-color($foreground, input-placeholder); + } + } + + @mixin _lgn-input-theme-property($theme, $property, $hue) { + $primary: map-get($theme, primary); + #{$property}: lgn-color($primary, $hue); + } diff --git a/internal/ui/login/static/resources/themes/scss/styles/label/label.scss b/internal/ui/login/static/resources/themes/scss/styles/label/label.scss new file mode 100644 index 0000000000..84fea51e03 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/label/label.scss @@ -0,0 +1,5 @@ +@import './label_base.scss'; + +.lgn-label { + @include lgn-label-base; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/label/label_base.scss b/internal/ui/login/static/resources/themes/scss/styles/label/label_base.scss new file mode 100644 index 0000000000..8b295b6133 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/label/label_base.scss @@ -0,0 +1,11 @@ +$lgn-label-font-size: 12px !default; +$lgn-label-margin: 0 0 2px 0; +$lgn-label-font-weight: 400; + +@mixin lgn-label-base { + display: block; + font-size: $lgn-label-font-size; + transition: color .2s ease; + margin: $lgn-label-margin; + font-weight: $lgn-label-font-weight; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/label/label_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/label/label_theme.scss new file mode 100644 index 0000000000..9be432aeca --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/label/label_theme.scss @@ -0,0 +1,25 @@ +@import '../theming/theming.scss'; +@import './label.scss'; + +@mixin lgn-label-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + // @include lgn-private-check-duplicate-theme-styles($theme, 'lgn-label') { + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-label-color($color); + } + // } +} + +@mixin lgn-label-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + $warn: map-get($config, warn); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + .lgn-label { + color: lgn-color($foreground, label); + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/list/list.scss b/internal/ui/login/static/resources/themes/scss/styles/list/list.scss new file mode 100644 index 0000000000..b1c82737df --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/list/list.scss @@ -0,0 +1,5 @@ +@import './list_base.scss'; + +.lgn-list, ul { + @include lgn-list-base; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/list/list_base.scss b/internal/ui/login/static/resources/themes/scss/styles/list/list_base.scss new file mode 100644 index 0000000000..056b8aadb2 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/list/list_base.scss @@ -0,0 +1,39 @@ +@mixin lgn-list-base { + &.lgn-policy { + display: flex; + flex-wrap: wrap; + + li { + flex: 1 0 50%; + } + } + + li { + display: flex; + align-items: center; + list-style: none; + margin: 4px 0; + font-style: italic; + + i { + margin: 0 .5rem; + font-size: 20px; + } + } + + &:not(.lgn-no-dots) { + li::before { + content: "\2022"; + font-weight: bold; + display: inline-block; + width: 20px; + margin-left: -20px; + font-style: normal; + } + } + + &.lgn-no-dots { + list-style-type: none; + padding-inline-start: 0; + } +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/list/list_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/list/list_theme.scss new file mode 100644 index 0000000000..bbf95201c0 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/list/list_theme.scss @@ -0,0 +1,34 @@ +@import '../theming/theming.scss'; +@import './list.scss'; + +@mixin lgn-list-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-list-color($color); + } +} + +@mixin lgn-list-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + $warn: map-get($config, warn); + + $is-dark-theme: map-get($config, is-dark); + .lgn-list, ul { + li::before { + color: lgn-color($primary, default); + } + + li i { + &.lgn-warn { + color: lgn-color($warn, default); + } + + &.lgn-valid { + color: #85d996; + } + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss b/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss new file mode 100644 index 0000000000..20f32bc962 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar.scss @@ -0,0 +1,6 @@ +@import './progress_bar_base.scss'; + +.lgn-progress-bar { + @include lgn-progress-bar-base; +} + \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_base.scss b/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_base.scss new file mode 100644 index 0000000000..b8caf9116c --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_base.scss @@ -0,0 +1,3 @@ +@mixin lgn-progress-bar-base { + display: block; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss new file mode 100644 index 0000000000..c0fd59f4e5 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/progress_bar/progress_bar_theme.scss @@ -0,0 +1,23 @@ +@import '../theming/theming.scss'; +@import './progress_bar.scss'; + +@mixin lgn-progress-bar-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-progress-bar-color($color); + } +} + +@mixin lgn-progress-bar-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + $warn: map-get($config, warn); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + .lgn-progress-bar { + border-color: lgn-color($foreground, input-border); + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode.scss b/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode.scss new file mode 100644 index 0000000000..b0a81b065e --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode.scss @@ -0,0 +1,12 @@ +.lgn-qrcode { + display: block; + margin: auto; + margin: 1rem 0; + margin-bottom: 1.5rem; + + svg { + margin: auto; + display: block; + border-radius: .5rem; + } +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss new file mode 100644 index 0000000000..d0df30fd6d --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/qrcode/qrcode_theme.scss @@ -0,0 +1,30 @@ +@import './qrcode.scss'; + +@mixin lgn-qrcode-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-qrcode-color($color); + } +} + +@mixin lgn-qrcode-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + .lgn-qrcode { + svg { + background: lgn-color($background, qrcode); + } + + svg rect.color { + fill: lgn-color($foreground, qrcode); + } + + svg rect.bg-color { + fill: lgn-color($background, qrcode); + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/radio/radio.scss b/internal/ui/login/static/resources/themes/scss/styles/radio/radio.scss new file mode 100644 index 0000000000..13ad2452e6 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/radio/radio.scss @@ -0,0 +1,5 @@ +@import './radio_base.scss'; + +.lgn-radio { + @include lgn-radio-base; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/radio/radio_base.scss b/internal/ui/login/static/resources/themes/scss/styles/radio/radio_base.scss new file mode 100644 index 0000000000..1419287cf5 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/radio/radio_base.scss @@ -0,0 +1,111 @@ +$lgn-radio-font-size: 14px !default; +$lgn-radio-margin: 0 0 10px; +$lgn-radio-font-weight: 400; +$lgn-radio-size: 20px; +$lgn-radio-checked-size: 10px; +$lgn-radio-ripple-size: 15px; +$lgn-radio-label-padding: 0 0 0 ($lgn-radio-size + 10px); + +@keyframes ripple { + 0% { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0); + } + + 50% { + box-shadow: 0 0 0 15px rgba(0, 0, 0, .1); + } + + 100% { + box-shadow: 0 0 0 15px rgba(0, 0, 0, 0); + } +} + +@mixin lgn-radio-base { + outline: none; + margin: 16px 0; + display: inline-block; + + &.block { + display: block; + } + + label { + display: inline-block; + height: $lgn-radio-size; + position: relative; + padding: $lgn-radio-label-padding; + margin-bottom: 0; + cursor: pointer; + vertical-align: middle; + padding-top: 2px; + outline: none; + font-size: $lgn-radio-font-size; + line-height: 16px; + + &::before, + &::after { + position: absolute; + content: ''; + border-radius: 50%; + transition: all .3s ease; + transition-property: transform, border-color; + } + + &::before { + left: 0; + top: 0; + width: $lgn-radio-size; + height: $lgn-radio-size; + border-width: 2px; + border-style: solid; + } + + &::after { + top: $lgn-radio-size / 2 - $lgn-radio-checked-size / 2; + left: $lgn-radio-size / 2 - $lgn-radio-checked-size / 2; + width: $lgn-radio-checked-size; + height: $lgn-radio-checked-size; + transform: scale(0); + } + } + + input[type='radio'] { + opacity: 0; + margin: 0; + width: 0; + height: 0; + outline: none; + + &:checked + label::before { + animation: ripple .2s linear forwards; + } + + &:checked + label::after { + transform: scale(1); + } + + &:focus + label { + opacity: 1; + // outline-width: 2px; + // outline-style: solid; + // outline-offset: 2px; + } + + &:disabled { + + label { + cursor: not-allowed; + font-style: italic; + } + + &:focus { + opacity: 0; + } + } + } + + *, + *::before, + *::after { + box-sizing: border-box; + } +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss new file mode 100644 index 0000000000..e7b50c4813 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/radio/radio_theme.scss @@ -0,0 +1,62 @@ +@import '../theming/theming.scss'; +@import './radio.scss'; + +@mixin lgn-radio-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-radio-color($color); + } +} + +@mixin lgn-radio-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + $warn: map-get($config, warn); + $background: map-get($config, background); + $foreground: map-get($config, foreground); + + label { + &::before { + border-color: lgn-color($foreground, radio-border); + } + + &::after { + background: lgn-color($primary, default); + } + } + + input[type='radio'] { + opacity: 0; + + &:checked + label::before { + border-color: lgn-color($primary, default); + } + + &:focus + label { + opacity: 1; + outline: none; + } + + &:disabled { + + label::before { + border-color: lgn-color($background, disabled-button); + } + + &:checked { + + label::before { + color: lgn-color($background, disabled-selected-button);; + } + + + label::after { + background: lgn-color($background, disabled-selected-button);; + } + } + + &:focus { + opacity: 0; + } + } + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/register/register.scss b/internal/ui/login/static/resources/themes/scss/styles/register/register.scss new file mode 100644 index 0000000000..f0856d3043 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/register/register.scss @@ -0,0 +1,20 @@ +$column-gap: .5rem; + +.lgn-register { + .double-col { + display: flex; + flex-wrap: wrap; + margin: 0 -.5rem; + + .lgn-field { + margin: 0 $column-gap; + flex: 1; + box-sizing: border-box; + margin-bottom: .5rem; + } + } + + .lgn-field { + margin-bottom: .5rem; + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/select/select.scss b/internal/ui/login/static/resources/themes/scss/styles/select/select.scss new file mode 100644 index 0000000000..d187c3ce8b --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/select/select.scss @@ -0,0 +1,5 @@ +@import './select_base.scss'; + +.lgn-select, select { + @include lgn-select-base; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/select/select_base.scss b/internal/ui/login/static/resources/themes/scss/styles/select/select_base.scss new file mode 100644 index 0000000000..d656197605 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/select/select_base.scss @@ -0,0 +1,14 @@ +@mixin lgn-select-base { + // background-image: url(select_arrow.svg); + // background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20256%20448%22%20enable-background%3D%22new%200%200%20256%20448%22%3E%3Cpath%20class%3D%22arrow%22%20d%3D%22M255.9%20168c0-4.2-1.6-7.9-4.8-11.2-3.2-3.2-6.9-4.8-11.2-4.8H16c-4.2%200-7.9%201.6-11.2%204.8S0%20163.8%200%20168c0%204.4%201.6%208.2%204.8%2011.4l112%20112c3.1%203.1%206.8%204.6%2011.2%204.6%204.4%200%208.2-1.5%2011.4-4.6l112-112c3-3.2%204.5-7%204.5-11.4z%22%2F%3E%3C%2Fsvg%3E%0A"); + background-position: right 10px center; + background-repeat: no-repeat; + background-size: auto 50%; + color: white; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + &::-ms-expand { + display: none; + }; +} diff --git a/internal/ui/login/static/resources/themes/scss/styles/select/select_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/select/select_theme.scss new file mode 100644 index 0000000000..04c2d8057d --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/select/select_theme.scss @@ -0,0 +1,27 @@ +@import '../theming/theming.scss'; +@import './select.scss'; + +@mixin lgn-select-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-select-color($color); + } +} + +@mixin lgn-select-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $primary: map-get($config, primary); + + $is-dark-theme: map-get($config, is-dark); + .lgn-select, select { + background-image: svg-icon($is-dark-theme); + } +} + +@function svg-icon($darktheme) { + // @return url('../select_arrow_dark.svg'); + @return if($darktheme, url('../select_arrow_dark.svg'),url('../select_arrow_light.svg')); + // @return url('data:image/svg+xml;charset=UTF-8,'); +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss b/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss new file mode 100644 index 0000000000..dcd3d9f155 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label.scss @@ -0,0 +1,8 @@ +@import './success_label_base.scss'; + +.lgn-success-label { + color: #0e6245; + background: #cbf4c9; + border-radius: .5rem; + padding: .5rem; +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_base.scss b/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_base.scss new file mode 100644 index 0000000000..6e9be9051e --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_base.scss @@ -0,0 +1,8 @@ +$lgn-success-label-padding: .5rem; +$lgn-success-label-border-radius: .5rem; + + +@mixin lgn-success-label-base { + border-radius: $lgn-success-label-border-radius; + padding: $lgn-success-label-padding; +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss b/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss new file mode 100644 index 0000000000..b8e3cde7b8 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/success_label/success_label_theme.scss @@ -0,0 +1,21 @@ +@import '../theming/theming.scss'; +@import './success_label.scss'; + +@mixin lgn-success-label-theme($theme-or-color-config) { + $theme: lgn-private-legacy-get-theme($theme-or-color-config); + $color: lgn-get-color-config($theme); + + @if $color != null { + @include lgn-success-label-color($color); + } +} + +@mixin lgn-success-label-color($config-or-theme) { + $config: lgn-get-color-config($config-or-theme); + $is-dark-theme: map-get($config, is-dark); + + .lgn-success-label { + color: if($is-dark-theme, #cbf4c9, #0e6245); + background-color: if($is-dark-theme, #4f566b, #cbf4c9); + } +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/theming/all.scss b/internal/ui/login/static/resources/themes/scss/styles/theming/all.scss new file mode 100644 index 0000000000..c14f5e64ab --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/theming/all.scss @@ -0,0 +1,41 @@ +@import '../core/core.scss'; +@import '../footer/footer_theme.scss'; +@import '../header/header_theme.scss'; +@import '../button/button_theme.scss'; +@import '../input/input_theme.scss'; +@import '../label/label_theme.scss'; +@import '../radio/radio_theme.scss'; +@import '../a/a_theme.scss'; +@import '../identity_provider/identity_provider_theme.scss'; +@import '../error/error_theme.scss'; +@import '../qrcode/qrcode_theme.scss'; +@import '../container/container_theme.scss'; +@import '../account_selection/account_selection_theme.scss'; +@import '../avatar/avatar_theme.scss'; +@import '../checkbox/checkbox_theme.scss'; +@import '../select/select_theme.scss'; +@import '../list/list_theme.scss'; +@import '../typography/typography.scss'; +@import '../success_label/success_label_theme.scss'; +@import './theming'; + +@mixin zitadel-lgn-theme($theme-or-color-config) { + @include lgn-core-theme($theme-or-color-config); + @include lgn-header-theme($theme-or-color-config); + @include lgn-button-theme($theme-or-color-config); + @include lgn-input-theme($theme-or-color-config); + @include lgn-radio-theme($theme-or-color-config); + @include lgn-checkbox-theme($theme-or-color-config); + @include lgn-label-theme($theme-or-color-config); + @include lgn-footer-theme($theme-or-color-config); + @include lgn-a-theme($theme-or-color-config); + @include lgn-error-theme($theme-or-color-config); + @include lgn-qrcode-theme($theme-or-color-config); + @include lgn-container-theme($theme-or-color-config); + @include lgn-account-selection-theme($theme-or-color-config); + @include lgn-avatar-theme($theme-or-color-config); + @include lgn-select-theme($theme-or-color-config); + @include lgn-list-theme($theme-or-color-config); + @include lgn-idp-theme($theme-or-color-config); + @include lgn-success-label-theme($theme-or-color-config); +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/theming/palette.scss b/internal/ui/login/static/resources/themes/scss/styles/theming/palette.scss new file mode 100644 index 0000000000..19ba7309f5 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/theming/palette.scss @@ -0,0 +1,265 @@ +$dark-primary-text: rgba(black, 0.87); +$dark-secondary-text: rgba(black, 0.54); +$dark-disabled-text: rgba(black, 0.38); +$dark-dividers: rgba(black, 0.12); +$dark-focused: rgba(black, 0.12); +$dark-input-border: #403e3e; +$dark-input-border-hover: #aeafb1; + +$light-primary-text: white; +$light-secondary-text: rgba(white, 0.7); +$light-disabled-text: rgba(white, 0.5); +$light-dividers: rgba(white, 0.12); +$light-focused: rgba(white, 0.12); +$light-input-border: #00000040; +$light-input-border-hover: #1a1b1b; + +$lgn-dark-brand: ( + 50: #fff, + 100: #dde6f3, + 200: #b4c9e4, + 300: #7fa3d1, + 400: #6992c9, + 500: #5282c1, + 600: #4072b4, + 700: #38649d, + 800: #305687, + 900: #284770, + A100: #fff, + A200: #dde6f3, + A300: #6992c9, + A400: #38649d, + A500: #666, + A600: #fff, + A700: #8795a1, + A800: #2d2e30, + A900: #212224, + contrast: ( + 50: $dark-primary-text, + 100: $dark-primary-text, + 200: $dark-primary-text, + 300: $dark-primary-text, + 400: $dark-primary-text, + 500: $light-primary-text, + 600: $light-primary-text, + 700: $light-primary-text, + 800: $light-primary-text, + 900: $light-primary-text, + A100: $dark-primary-text, + A200: $light-primary-text, + A400: $light-primary-text, + A700: $light-primary-text, + ) +); + +$lgn-light-brand: ( + 50: #eaedfa, + 100: #ccd2f2, + 200: #aab4ea, + 300: #8796e1, + 400: #6e80da, + 500: #5469d4, + 600: #4d61cf, + 700: #4356c9, + 800: #3a4cc3, + 900: #293bb9, + A100: #f9faff, + A200: #c6ccff, + A300: #939fff, + A400: #7a88ff, + A500: #333, + A600: #000, + A700: #8795a1, + A800: white, + A900: #fafafa, + contrast: ( + 50: $dark-primary-text, + 100: $dark-primary-text, + 200: $dark-primary-text, + 300: $dark-primary-text, + 400: $dark-primary-text, + 500: $light-primary-text, + 600: $light-primary-text, + 700: $light-primary-text, + 800: $light-primary-text, + 900: $light-primary-text, + A100: $dark-primary-text, + A200: $light-primary-text, + A400: $light-primary-text, + A700: $light-primary-text, + ) +); + +// skip accent color for first gen theming +// $lgn-accent-color: ( +// 50: #ebf4f2, +// 100: #cce3de, +// 200: #abd1c9, +// 300: #89bfb3, +// 400: #6fb1a2, +// 500: #56a392, +// 600: #4f9b8a, +// 700: #45917f, +// 800: #3c8875, +// 900: #2b7763, +// A100: #beffed, +// A200: #8bffde, +// A400: #58ffd0, +// A700: #3effc9, +// contrast: ( +// 50: $dark-primary-text, +// 100: $dark-primary-text, +// 200: $dark-primary-text, +// 300: $dark-primary-text, +// 400: $dark-primary-text, +// 500: $light-primary-text, +// 600: $light-primary-text, +// 700: $light-primary-text, +// 800: $light-primary-text, +// 900: $light-primary-text, +// A100: $dark-primary-text, +// A200: $light-primary-text, +// A400: $light-primary-text, +// A700: $light-primary-text, +// ) +// ); + +$lgn-warn: ( + 50: #ffebee, + 100: #ffcdd2, + 200: #ef9a9a, + 300: #e57373, + 400: #ef5350, + 500: #f44336, + 600: #e53935, + 700: #d32f2f, + 800: #c62828, + 900: #b71c1c, + A100: #ff8a80, + A200: #ff5252, + A400: #ff1744, + A700: #d50000, + contrast: ( + 50: $dark-primary-text, + 100: $dark-primary-text, + 200: $dark-primary-text, + 300: $dark-primary-text, + 400: $dark-primary-text, + 500: $light-primary-text, + 600: $light-primary-text, + 700: $light-primary-text, + 800: $light-primary-text, + 900: $light-primary-text, + A100: $dark-primary-text, + A200: $light-primary-text, + A400: $light-primary-text, + A700: $light-primary-text, + ) +); + +$lgn-grey: ( + 50: #fafafa, + 100: #f5f5f5, + 200: #eeeeee, + 300: #e0e0e0, + 400: #bdbdbd, + 500: #9e9e9e, + 600: #757575, + 700: #616161, + 800: #424242, + 900: #212121, + A100: #ffffff, + A200: #eeeeee, + A400: #bdbdbd, + A700: #616161, + contrast: ( + 50: $dark-primary-text, + 100: $dark-primary-text, + 200: $dark-primary-text, + 300: $dark-primary-text, + 400: $dark-primary-text, + 500: $dark-primary-text, + 600: $light-primary-text, + 700: $light-primary-text, + 800: $light-primary-text, + 900: $light-primary-text, + A100: $dark-primary-text, + A200: $dark-primary-text, + A400: $dark-primary-text, + A700: $light-primary-text, + ) +); + +$lgn-light-theme-background: ( + background: map-get($lgn-grey, 50), + hover: rgba(black, 0.04), + disabled-button: rgba(black, 0.12), + raised-button: white, + focused-button: $dark-focused, + selected-button: map-get($lgn-grey, 300), + selected-disabled-button: map-get($lgn-grey, 400), + tooltip: map-get($lgn-grey, 700), + input: #fafafa50, + footer: #fafafa, + qrcode: #fafafa, // use black ground on white background because inverted qrcode colors are not allowed + account-selector-hover: rgba(black, 0.02), + account-selector-active: rgba(black, 0.05), + google: #ffffff, +); + +$lgn-dark-theme-background: ( + background: #212224, + hover: rgba(white, 0.04), // TODO(kara): check style with Material Design UX + disabled-button: rgba(white, 0.12), + raised-button: map-get($lgn-grey, 800), + focused-button: $light-focused, + selected-button: map-get($lgn-grey, 900), + selected-disabled-button: map-get($lgn-grey, 800), + tooltip: map-get($lgn-grey, 700), + input: rgba(black, .2), + footer: #212224, + qrcode: white, // needs white background to recognize borders, + account-selector-hover: rgba(white, 0.02), + account-selector-active: rgba(white, 0.05), + google: #ffffff, +); + +$lgn-light-theme-foreground: ( + footer-links: map-get($lgn-light-brand, 500), + footer-line: #e3e8ee, + base: black, + input-border: $light-input-border, + radio-border: $light-input-border, + input-border-hover: $light-input-border-hover, + input-placeholder: map-get($lgn-grey, 600), + label: map-get($lgn-grey, 600),//#697386 + divider: $dark-dividers, + disabled: $dark-disabled-text, + disabled-button: rgba(black, 0.26), + elevation: black, + secondary-text: $dark-secondary-text, + icon: rgba(black, 0.54), + text: rgba(black, 0.87), + qrcode: black, + google-text: #8b8d8d, +); + +$lgn-dark-theme-foreground: ( + footer-links: map-get($lgn-grey, 500), + footer-line: #303131, + base: white, + input-border: $dark-input-border, + radio-border: $dark-input-border, + input-border-hover: $dark-input-border-hover, + input-placeholder: map-get($lgn-grey, 600), + label: map-get($lgn-grey, 600),// #8795a1, + divider: $light-dividers, + disabled: $light-disabled-text, + disabled-button: rgba(white, 0.3), + elevation: black, + secondary-text: $light-secondary-text, + icon: white, + text: white, + qrcode: black, + google-text: #8b8d8d, +); \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/theming/theming.scss b/internal/ui/login/static/resources/themes/scss/styles/theming/theming.scss new file mode 100644 index 0000000000..2791124869 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/theming/theming.scss @@ -0,0 +1,217 @@ +@import 'palette'; + +// For a given hue in a palette, return the contrast color from the map of contrast palettes. +// @param $color-map +// @param $hue +@function lgn-contrast($palette, $hue) { + @return map-get(map-get($palette, contrast), $hue); +} + +// add contrast colors to the palette to display text on buttons or the user avatar +@function lgn-palette($base-palette, $default: 500, $lighter: 100, $darker: 700, $text: $default) { + $result: map-merge($base-palette, ( + default: map-get($base-palette, $default), + lighter: map-get($base-palette, $lighter), + darker: map-get($base-palette, $darker), + text: map-get($base-palette, $text), + + default-contrast: lgn-contrast($base-palette, $default), + lighter-contrast: lgn-contrast($base-palette, $lighter), + darker-contrast: lgn-contrast($base-palette, $darker) + )); + + // For each hue in the palette, add a "-contrast" color to the map. + @each $hue, $color in $base-palette { + $result: map-merge($result, ( + '#{$hue}-contrast': lgn-contrast($base-palette, $hue) + )); + } + + @return $result; + } + +@function _lgn-create-light-color-config($primary, $accent, $warn: null) { + @return ( + primary: $primary, + accent: $accent, + warn: if($warn != null, $warn, lgn-palette($lgn-warn)), + is-dark: false, + foreground: $lgn-light-theme-foreground, + background: $lgn-light-theme-background, + ); +} + +@function _lgn-create-dark-color-config($primary, $accent, $warn: null) { + @return ( + primary: $primary, + accent: $accent, + warn: if($warn != null, $warn, lgn-palette($lgn-warn)), + is-dark: true, + foreground: $lgn-dark-theme-foreground, + background: $lgn-dark-theme-background, + ); + } + +@function lgn-light-theme($primary, $accent: null, $warn: lgn-palette($lgn-warn)) { + @if $accent != null { + @return lgn-private-create-backwards-compatibility-theme(_lgn-validate-theme(( + _is-legacy-theme: true, + color: _lgn-create-light-color-config($primary, $accent, $warn), + ))); + } + + $result: $primary; + @if map-get($primary, color) { + $color-settings: map-get($primary, color); + $primary: map-get($color-settings, primary); + $accent: map-get($color-settings, accent); + $warn: map-get($color-settings, warn); + $result: map-merge($result, (color: _lgn-create-light-color-config($primary, $accent, $warn))); + } + @return lgn-private-create-backwards-compatibility-theme(_lgn-validate-theme($result)); + } + +@function lgn-dark-theme($primary, $accent: null, $warn: lgn-palette($lgn-warn)) { + @if $accent != null { + @return lgn-private-create-backwards-compatibility-theme(_lgn-validate-theme(( + _is-legacy-theme: true, + color: _lgn-create-dark-color-config($primary, $accent, $warn), + ))); + } + + $result: $primary; + @if map-get($primary, color) { + $color-settings: map-get($primary, color); + $primary: map-get($color-settings, primary); + $accent: map-get($color-settings, accent); + $warn: map-get($color-settings, warn); + $result: map-merge($result, (color: _lgn-create-dark-color-config($primary, $accent, $warn))); + } + @return lgn-private-create-backwards-compatibility-theme(_lgn-validate-theme($result)); +} + +/// Gets the color configuration from the given theme or configuration. +@function lgn-get-color-config($theme, $default: null) { + // If a configuration has been passed, return the config directly. + @if not lgn-private-is-theme-object($theme) { + @return $theme; + } + @if lgn-private-is-legacy-constructed-theme($theme) { + @return $theme; + } + @if map-has-key($theme, color) { + @return map-get($theme, color); + } + @return $default; + } + +@function lgn-private-create-backwards-compatibility-theme($theme) { + @if not map-get($theme, color) { + @return $theme; + } + $color: map-get($theme, color); + @return map-merge($theme, $color); +} + +// Checks whether the given value resolves to a theme object. Theme objects are always +// of type `map` and can optionally only specify `color`, `density` or `typography`. +@function lgn-private-is-theme-object($value) { + @return type-of($value) == 'map' and ( + map-has-key($value, color) or + map-has-key($value, density) or + map-has-key($value, typography) or + length($value) == 0 + ); + } + +// Gets the theme from the given value that is either already a theme, or a color configuration. +// This handles the legacy case where developers pass a color configuration directly to the +// theme mixin. Before we introduced the new pattern for constructing a theme, developers passed +// the color configuration directly to the theme mixins. This can be still the case if developers +// construct a theme manually and pass it to a theme. We support this for backwards compatibility. +// TODO(devversion): remove this in the future. Constructing themes manually is rare, +// and the code can be easily updated to the new API. +@function lgn-private-legacy-get-theme($theme-or-color-config) { + @if lgn-private-is-theme-object($theme-or-color-config) { + @return $theme-or-color-config; + } + @return lgn-private-create-backwards-compatibility-theme(( + _is-legacy-theme: true, + color: $theme-or-color-config + )); + } + +// Note that the `$theme.primary` key does usually not exist since the color configuration +// is stored in `$theme.color` which contains a property for `primary`. This method copies +// the map from `$theme.color` to `$theme` for backwards compatibility. +@function lgn-private-create-backwards-compatibility-theme($theme) { + @if not map-get($theme, color) { + @return $theme; + } + $color: map-get($theme, color); + @return map-merge($theme, $color); + } + +// Validates the specified theme by ensuring that the optional color config defines +// a primary, accent and warn palette. Returns the theme if no failures were found. +@function _lgn-validate-theme($theme) { + @if map-get($theme, color) { + $color: map-get($theme, color); + @if not map-get($color, primary) { + @error 'Theme does not define a valid "primary" palette.'; + } + @else if not map-get($color, accent) { + @error 'Theme does not define a valid "accent" palette.'; + } + @else if not map-get($color, warn) { + @error 'Theme does not define a valid "warn" palette.'; + } + } + @return $theme; + } + +// Checks whether a given value corresponds to a legacy constructed theme. +@function lgn-private-is-legacy-constructed-theme($value) { + @return type-of($value) == 'map' and map-get($value, '_is-legacy-theme'); + } + +// Gets a color from a theme palette (the output of mat-palette). +// The hue can be one of the standard values (500, A400, etc.), one of the three preconfigured +// hues (default, lighter, darker), or any of the aforementioned prefixed with "-contrast". +// +// @param $color-map The theme palette (output of mat-palette). +// @param $hue The hue from the palette to use. If this is a value between 0 and 1, it will +// be treated as opacity. +// @param $opacity The alpha channel value for the color. +@function lgn-color($palette, $hue: default, $opacity: null) { + // If hueKey is a number between zero and one, then it actually contains an + // opacity value, so recall this function with the default hue and that given opacity. + @if type-of($hue) == number and $hue >= 0 and $hue <= 1 { + @return lgn-color($palette, default, $hue); + } + + $color: map-get($palette, $hue); + + @if (type-of($color) != color) { + // If the $color resolved to something different from a color (e.g. a CSS variable), + // we can't apply the opacity anyway so we return the value as is, otherwise Sass can + // throw an error or output something invalid. + @return $color; + } + + @return rgba($color, if($opacity == null, opacity($color), $opacity)); + } + +/// Gets the typography configuration from the given theme or configuration. +@function lgn-get-typography-config($theme-or-config, $default: null) { + // If a configuration has been passed, return the config directly. + @if not lgn-private-is-theme-object($theme-or-config) { + @return $theme-or-config; + } + // In case a theme has been passed, extract the configuration if present, + // or fall back to the default typography config. + @if (map-has-key($theme-or-config, typography)) { + @return map-get($theme-or-config, typography); + } + @return $default; +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/ailerons_font_faces.scss b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/ailerons_font_faces.scss new file mode 100644 index 0000000000..0d585db450 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/ailerons_font_faces.scss @@ -0,0 +1,4 @@ +@font-face { + font-family: Aileron; + src: url(../../../fonts/ailerons/ailerons.otf ) format('opentype'); +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/fonts.scss b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/lato_font_faces.scss similarity index 71% rename from internal/ui/login/static/resources/themes/scss/fonts.scss rename to internal/ui/login/static/resources/themes/scss/styles/typography/faces/lato_font_faces.scss index 423a199f4a..715dc8b720 100644 --- a/internal/ui/login/static/resources/themes/scss/fonts.scss +++ b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/lato_font_faces.scss @@ -1,10 +1,3 @@ -//Aileron -@font-face { - font-family: Aileron; - src: url(../../../fonts/ailerons/ailerons.otf ) format('opentype'); -} - -//Lato @font-face { font-family: Lato; src: url(../../../fonts/lato/Lato-Thin.ttf ) format('truetype'); @@ -68,17 +61,4 @@ src: url(../../../fonts/lato/Lato-BlackItalic.ttf ) format('truetype'); font-style: italic; font-weight: 800; -} - -//Material Icons -@font-face { - font-family: 'Material Icons'; - font-style: normal; - font-weight: 400; - src: url(../../../fonts/material/MaterialIcons-Regular.eot); /* For IE6-8 */ - src: local('Material Icons'), - local('MaterialIcons-Regular'), - url(../../../fonts/material/MaterialIcons-Regular.woff2) format('woff2'), - url(../../../fonts/material/MaterialIcons-Regular.woff) format('woff'), - url(../../../fonts/material/MaterialIcons-Regular.ttf) format('truetype'); -} +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/pt_sans_font_faces.scss b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/pt_sans_font_faces.scss new file mode 100644 index 0000000000..a0f0ff235f --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/pt_sans_font_faces.scss @@ -0,0 +1,26 @@ + +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Bold.ttf ) format('truetype'); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-BoldItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 700; +} + +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Italic.ttf ) format('truetype'); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Regular.ttf ) format('truetype'); + font-style: normal; + font-weight: 400; +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/raleway_font_faces.scss b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/raleway_font_faces.scss new file mode 100644 index 0000000000..798d321a7d --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/raleway_font_faces.scss @@ -0,0 +1,113 @@ + +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Black.ttf ) format('truetype'); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BlackItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 900; +} + +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Bold.ttf ) format('truetype'); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BoldItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 700; +} + +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBold.ttf ) format('truetype'); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBoldItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 800; +} + +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLight.ttf ) format('truetype'); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLightItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Light.ttf ) format('truetype'); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-LightItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Medium.ttf ) format('truetype'); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-MediumItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Regular.ttf ) format('truetype'); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Italic.ttf ) format('truetype'); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBold.ttf ) format('truetype'); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBoldItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 600; +} + +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Thin.ttf ) format('truetype'); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ThinItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 100; +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/faces/roboto_font_faces.scss b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/roboto_font_faces.scss new file mode 100644 index 0000000000..37c5a8fdcf --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/typography/faces/roboto_font_faces.scss @@ -0,0 +1,76 @@ + +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Black.ttf ) format('truetype'); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BlackItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 900; +} + +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Bold.ttf ) format('truetype'); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BoldItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 700; +} + +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Regular.ttf ) format('truetype'); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Italic.ttf ) format('truetype'); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Light.ttf ) format('truetype'); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-LightItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Medium.ttf ) format('truetype'); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-MediumItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Thin.ttf ) format('truetype'); + font-style: normal; + font-weight: 100; + +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-ThinItalic.ttf ) format('truetype'); + font-style: italic; + font-weight: 100; +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/styles/typography/typography.scss b/internal/ui/login/static/resources/themes/scss/styles/typography/typography.scss new file mode 100644 index 0000000000..0e1ba43829 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/styles/typography/typography.scss @@ -0,0 +1,225 @@ +@import './faces/ailerons_font_faces.scss'; +@import './faces/lato_font_faces.scss'; +@import './faces/roboto_font_faces.scss'; +@import './faces/raleway_font_faces.scss'; +@import './faces/pt_sans_font_faces.scss'; + +@mixin zitadel-lgn-typography($config-or-theme: null) { + $config: if(lgn-private-is-theme-object($config-or-theme), + lgn-get-typography-config($config-or-theme), $config-or-theme); + + @if not $config { + $config: lgn-typography-config(); + } + + @include lgn-base-typography($config); +} + +@function lgn-typography-config( + $font-family: 'Lato, -apple-system, BlinkMacSystemFont, sans-serif', + $display-4: lgn-typography-level(112px, 112px, 300, $letter-spacing: -0.05em), + $display-3: lgn-typography-level(56px, 56px, 400, $letter-spacing: -0.02em), + $display-2: lgn-typography-level(45px, 48px, 400, $letter-spacing: -0.005em), + $display-1: lgn-typography-level(34px, 40px, 400), + $headline: lgn-typography-level(24px, 32px, 400), + $title: lgn-typography-level(20px, 32px, 500), + $subheading-2: lgn-typography-level(16px, 28px, 400), + $subheading-1: lgn-typography-level(15px, 24px, 400), + $body-2: lgn-typography-level(14px, 24px, 500), + $body-1: lgn-typography-level(14px, 20px, 400), + $caption-1: lgn-typography-level(12px, 20px, 400), + $button: lgn-typography-level(14px, 36px, 500), + $input: lgn-typography-level(inherit, 1.125, 400), +) { + $config: ( + display-4: $display-4, + display-3: $display-3, + display-2: $display-2, + display-1: $display-1, + headline: $headline, + title: $title, + subheading-2: $subheading-2, + subheading-1: $subheading-1, + body-2: $body-2, + body-1: $body-1, + caption-1: $caption-1, + button: $button, + input: $input, + ); + + // Loop through the levels and set the `font-family` of the ones that don't have one to the base. + @each $key, $level in $config { + @if map-get($level, font-family) == null { + $new-level: map-merge($level, (font-family: $font-family)); + $config: map-merge($config, ($key: $new-level)); + } + } + + // Add the base font family to the config. + @return map-merge($config, (font-family: $font-family)); +} + +@function lgn-typography-level( + $font-size, + $line-height: $font-size, + $font-weight: 400, + $font-family: null, + $letter-spacing: normal) { + + @return ( + font-size: $font-size, + line-height: $line-height, + font-weight: $font-weight, + font-family: $font-family, + letter-spacing: $letter-spacing + ); +} + +// Converts a typography level into CSS styles. +@mixin lgn-typography-level-to-styles($config, $level) { + $font-size: lgn-font-size($config, $level); + $font-weight: lgn-font-weight($config, $level); + $line-height: lgn-line-height($config, $level); + $font-family: lgn-font-family($config, $level); + + @include lgn-typography-font-shorthand($font-size, $font-weight, $line-height, $font-family); + letter-spacing: lgn-letter-spacing($config, $level); +} + +// Utility for fetching a nested value from a typography config. +@function _lgn-get-type-value($config, $level, $name) { + @return map-get(map-get($config, $level), $name); +} + +// Gets the font size for a level inside a typography config. +@function lgn-font-size($config, $level) { + @return _lgn-get-type-value($config, $level, font-size); +} + +// Gets the line height for a level inside a typography config. +@function lgn-line-height($config, $level) { + @return _lgn-get-type-value($config, $level, line-height); +} + +// Gets the font weight for a level inside a typography config. +@function lgn-font-weight($config, $level) { + @return _lgn-get-type-value($config, $level, font-weight); +} + +// Gets the letter spacing for a level inside a typography config. +@function lgn-letter-spacing($config, $level) { + @return _lgn-get-type-value($config, $level, letter-spacing); +} + +@function lgn-font-family($config, $level: null) { + $font-family: map-get($config, font-family); + + @if $level != null { + $font-family: _lgn-get-type-value($config, $level, font-family); + } + + // Guard against unquoting non-string values, because it's deprecated. + @return if(type-of($font-family) == string, unquote($font-family), $font-family); +} + + // Outputs the shorthand `font` CSS property, based on a set of typography values. Falls back to +// the individual properties if a value that isn't allowed in the shorthand is passed in. +@mixin lgn-typography-font-shorthand($font-size, $font-weight, $line-height, $font-family) { + // If any of the values are set to `inherit`, we can't use the shorthand + // so we fall back to passing in the individual properties. + @if ($font-size == inherit or + $font-weight == inherit or + $line-height == inherit or + $font-family == inherit or + $font-size == null or + $font-weight == null or + $line-height == null or + $font-family == null) { + + font-size: $font-size; + font-weight: $font-weight; + line-height: $line-height; + font-family: $font-family; + } + @else { + // Otherwise use the shorthand `font`, because it's the least amount of bytes. Note + // that we need to use interpolation for `font-size/line-height` in order to prevent + // Sass from dividing the two values. + font: $font-weight #{$font-size}/#{$line-height} $font-family; + } +} + +@mixin lgn-base-typography($config, $selector: '.lgn-typography') { + h1, .lgn-headline, #{$selector} h1 { + @include lgn-typography-level-to-styles($config, headline); + margin: 0 0 16px; + } + + h2, .lgn-title, #{$selector} h2 { + @include lgn-typography-level-to-styles($config, title); + margin: 0 0 16px; + } + + h3, .lgn-subheading-2, #{$selector} h3 { + @include lgn-typography-level-to-styles($config, subheading-2); + margin: 0 0 16px; + } + + h4, .lgn-subheading-1, #{$selector} h4 { + @include lgn-typography-level-to-styles($config, subheading-1); + margin: 0 0 16px; + } + + .lgn-body-strong, .lgn-body-2 { + @include lgn-typography-level-to-styles($config, body-2); + } + + p, .lgn-body, .lgn-body-1, #{$selector} { + @include lgn-typography-level-to-styles($config, body-1); + + p { + margin: 0 0 12px; + } + } + + button, .lgn-button, .lgn-raised-button, .lgn-stroked-button { + @include lgn-typography-level-to-styles($config, button); + } + + span { + @include lgn-typography-level-to-styles($config, body-1); + } + + a, .lgn-a { + @include lgn-typography-level-to-styles($config, body-1); + } + + small .lgn-small, .lgn-caption { + @include lgn-typography-level-to-styles($config, caption-1); + } + + label, .lgn-label, #{$selector} .lgn-label, #{$selector} label { + @include lgn-typography-level-to-styles($config, caption-1); + margin: 0 0 2px 0; + } + + .lgn-display-4, #{$selector} .lgn-display-4 { + @include lgn-typography-level-to-styles($config, display-4); + margin: 0 0 56px; + } + + .lgn-display-3, #{$selector} .lgn-display-3 { + @include lgn-typography-level-to-styles($config, display-3); + margin: 0 0 64px; + } + + .lgn-display-2, #{$selector} .lgn-display-2 { + @include lgn-typography-level-to-styles($config, display-2); + margin: 0 0 64px; + } + + .lgn-display-1, #{$selector} .lgn-display-1 { + @include lgn-typography-level-to-styles($config, display-1); + margin: 0 0 64px; + } + } \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/variables.scss b/internal/ui/login/static/resources/themes/scss/variables.scss deleted file mode 100644 index 31b23f5379..0000000000 --- a/internal/ui/login/static/resources/themes/scss/variables.scss +++ /dev/null @@ -1,58 +0,0 @@ -// ----- FONTS ------------ -$standardFont: Lato; -$headerFont: Lato; - -// ----- LAYOUT ------------ -$inputHeight: 50px; -$headerSize: 40px; -$header2Size: 30px; -$header3Size: 26px; -$retina: "only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx)"; - -@mixin retina-background-image($file, $type, $hover, $width, $height) { - $hovername: ''; - @if $hover { - $hovername: '-hover'; - } - $filename :$file + $hovername; - background-image: url($filename + '.' + $type); - @media #{$retina} { - background-image: url($filename + '@2x.' + $type); - background-size: $width $height; - } -} - -// ----- DARK-THEME -------- -$backgroundColor: #282828; -$fontColor: #BBBBC8; -$primaryColor: #3574C6; -$primaryColorHover: lighten($primaryColor, 10%); -$labelColor: #898989; -$inputBorderColor: #999999; -$inputBackgroundColor: #252525; -$buttonBackgroundColorHover: $inputBackgroundColor; -$profileImgDark: "../../../images/icon-user-dark"; -$otherUserImgDark: "../../../images/icon-newuser-dark"; -$idpGoogleImg: "../../../images/idp/google"; -$idpGoogleFontColor: #FFFFFF; -$idpGoogleBackgroundColor: #4285F4; -$nokColor: #F20D6B; -$okColor: #0DF279; -$errorColor: red; - - - -// ----- LIGHT-THEME -------- -$backgroundColorLight: #f5f5f5; -$fontColorLight: $backgroundColor; -$primaryColorLight: $primaryColor; -$primaryColorHoverLight: lighten($primaryColorLight, 10%); -$inputBackgroundColorLight: #FFFFFF; -$buttonBackgroundColorHoverLight: $inputBackgroundColorLight; -$profileImgLight: "../../../images/icon-user-light"; -$otherUserImgLight: "../../../images/icon-newuser-light"; -$idpGoogleImgLight: "../../../images/idp/google"; -$idpGoogleFontColorLight: #8b8d8d; -$idpGoogleBackgroundColorLight: #FFFFFF; -$nokColorLight: #F20D6B; -$okColorLight: #50CA3D; \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/zitadel-alternative.scss b/internal/ui/login/static/resources/themes/scss/zitadel-alternative.scss new file mode 100644 index 0000000000..2e2ea0ee42 --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/zitadel-alternative.scss @@ -0,0 +1,142 @@ +// This file is meant to show off a possible starting point for an organisation whitelabeling + +@import './styles/theming/all'; + +// Include non-theme styles for core. -> mainly background of the login + +$custom-typography: + lgn-typography-config( + $font-family: 'Raleway' + ); + +@include lgn-core($custom-typography); +$light-text: white; +$dark-text: black; + +$lgn-alternative-dark-brand: ( + 50: #ffffff, + 100: #ffffff, + 200: #ffffff, + 300: #ffffff, + 400: #ffffff, + 500: #ffffff, + 600: #ffffff, + 700: #ffffff, + 800: #ffffff, + 900: #ffffff, + A100: #ffffff, + A200: #ffffff, + A400: #ffffff, + A700: #ffffff, + contrast: ( + 50: $light-text, + 100: $light-text, + 200: $light-text, + 300: $light-text, + 400: $light-text, + 500: $dark-text, + 600: $dark-text, + 700: $dark-text, + 800: $dark-text, + 900: $dark-text, + A100: $light-text, + A200: $dark-text, + A400: $dark-text, + A700: $dark-text, + ) +); + +$lgn-alternative-light-brand: ( + 50: #e0e0e0, + 100: #b3b3b3, + 200: #808080, + 300: #4d4d4d, + 400: #262626, + 500: #000000, + 600: #000000, + 700: #000000, + 800: #000000, + 900: #000000, + A100: #a6a6a6, + A200: #8c8c8c, + A400: #737373, + A700: #666666, + contrast: ( + 50: $dark-text, + 100: $dark-text, + 200: $dark-text, + 300: $dark-text, + 400: $dark-text, + 500: $light-text, + 600: $light-text, + 700: $light-text, + 800: $light-text, + 900: $light-text, + A100: $dark-text, + A200: $light-text, + A400: $light-text, + A700: $light-text, + ) +); + +$lgn-alternative-warn: ( + 50: #ffebee, + 100: #ffcdd2, + 200: #ef9a9a, + 300: #e57373, + 400: #ef5350, + 500: #f44336, + 600: #e53935, + 700: #d32f2f, + 800: #c62828, + 900: #b71c1c, + A100: #ff8a80, + A200: #ff5252, + A400: #ff1744, + A700: #d50000, + contrast: ( + 50: $dark-text, + 100: $dark-text, + 200: $dark-text, + 300: $dark-text, + 400: $dark-text, + 500: $light-text, + 600: $light-text, + 700: $light-text, + 800: $light-text, + 900: $light-text, + A100: $dark-text, + A200: $light-text, + A400: $light-text, + A700: $light-text, + ) +); + +$light-primary: lgn-palette($lgn-alternative-light-brand); +$light-accent: lgn-palette($lgn-alternative-light-brand); +$light-warn: lgn-palette($lgn-alternative-warn); + +$dark-primary: lgn-palette($lgn-alternative-dark-brand); +$dark-accent: lgn-palette($lgn-alternative-dark-brand); +$dark-warn: lgn-palette($lgn-alternative-warn); + +$light-theme: lgn-light-theme($light-primary, $light-accent, $light-warn); +$dark-theme: lgn-dark-theme($dark-primary, $dark-accent, $dark-warn); + +$light-theme: lgn-light-theme(( + color: ( + primary: $light-primary, + accent: $light-accent, + ) +)); + +// Include all theme styles for the components. +@include zitadel-lgn-theme($dark-theme); + +.lgn-dark-theme { + @include zitadel-lgn-theme($dark-theme); +} + +.lgn-light-theme { + @include zitadel-lgn-theme($light-theme); +} diff --git a/internal/ui/login/static/resources/themes/scss/zitadel.scss b/internal/ui/login/static/resources/themes/scss/zitadel.scss new file mode 100644 index 0000000000..57453e169f --- /dev/null +++ b/internal/ui/login/static/resources/themes/scss/zitadel.scss @@ -0,0 +1,33 @@ +@import './styles/theming/all'; + +// Include non-theme styles for core. -> mainly background of the login +@include lgn-core(); + +$light-primary: lgn-palette($lgn-light-brand); +$light-accent: lgn-palette($lgn-light-brand); +$light-warn: lgn-palette($lgn-warn); + +$dark-primary: lgn-palette($lgn-dark-brand); +$dark-accent: lgn-palette($lgn-dark-brand); +$dark-warn: lgn-palette($lgn-warn); + +$light-theme: lgn-light-theme($light-primary, $light-accent, $light-warn); +$dark-theme: lgn-dark-theme($dark-primary, $dark-accent, $dark-warn); + +$light-theme: lgn-light-theme(( + color: ( + primary: $light-primary, + accent: $light-accent, + ) +)); + +// Include all theme styles for the components. +@include zitadel-lgn-theme($dark-theme); + +.lgn-dark-theme { + @include zitadel-lgn-theme($dark-theme); +} + +.lgn-light-theme { + @include zitadel-lgn-theme($light-theme); +} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/scss/zitadel/dark.scss b/internal/ui/login/static/resources/themes/scss/zitadel/dark.scss deleted file mode 100644 index dd95159e7d..0000000000 --- a/internal/ui/login/static/resources/themes/scss/zitadel/dark.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import "../variables"; -@import "variables"; -@import "../main"; diff --git a/internal/ui/login/static/resources/themes/scss/zitadel/light.scss b/internal/ui/login/static/resources/themes/scss/zitadel/light.scss deleted file mode 100644 index 3a32c19485..0000000000 --- a/internal/ui/login/static/resources/themes/scss/zitadel/light.scss +++ /dev/null @@ -1,4 +0,0 @@ -@import "../variables"; -@import "variables"; -@import "../main"; -@import "../light"; diff --git a/internal/ui/login/static/resources/themes/scss/zitadel/variables.scss b/internal/ui/login/static/resources/themes/scss/zitadel/variables.scss deleted file mode 100644 index c0c9dd6f96..0000000000 --- a/internal/ui/login/static/resources/themes/scss/zitadel/variables.scss +++ /dev/null @@ -1,8 +0,0 @@ -$logoImgDark: "../logo-dark.png"; -$logoImgLight: "../logo-light.png"; - -$footerimgDark: ""; -$footerimgLight: ""; - -$bodyImgDark: "../flavor-spikes01-wide.png"; -$bodyImgLight: "../flavor-spikes01-wide.png"; \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/css/bundle.css b/internal/ui/login/static/resources/themes/zitadel/css/bundle.css new file mode 100644 index 0000000000..3d864d0328 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/css/bundle.css @@ -0,0 +1,2119 @@ +@charset "UTF-8"; +footer { + width: 100%; + box-sizing: border-box; + background: #00000020; + min-height: 50px; + display: flex; + align-items: center; + padding: 0 1rem; +} +footer .fill-space { + flex: 1; +} +footer a { + font-size: 12px; + margin-left: 1rem; +} +@media only screen and (min-width: 600px) { + footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + } +} + +.lgn-header { + display: block; + position: relative; + margin: 1rem auto 0.5rem auto; + padding: 0; + width: 100%; +} +.lgn-header .lgn-logo { + height: 43px; + width: 160px; + margin: 0 auto; +} + +.lgn-button, .lgn-stroked-button, .lgn-icon-button { + box-sizing: border-box; + position: relative; + cursor: pointer; + outline: none; + border: none; + -webkit-tap-highlight-color: transparent; + display: inline-block; + white-space: nowrap; + text-decoration: none; + vertical-align: baseline; + text-align: center; + margin: 0; + min-width: 64px; + line-height: 36px; + padding: 0 16px; + border-radius: 6px; + overflow: visible; +} +.lgn-button[disabled], .lgn-stroked-button[disabled], .lgn-icon-button[disabled] { + cursor: default; +} +.lgn-button::-moz-focus-inner, .lgn-stroked-button::-moz-focus-inner, .lgn-icon-button::-moz-focus-inner { + border: 0; +} + +.lgn-raised-button { + box-sizing: border-box; + position: relative; + cursor: pointer; + outline: none; + border: none; + -webkit-tap-highlight-color: transparent; + display: inline-block; + white-space: nowrap; + text-decoration: none; + vertical-align: baseline; + text-align: center; + margin: 0; + min-width: 64px; + line-height: 36px; + padding: 0 16px; + border-radius: 6px; + overflow: visible; + transform: translate3d(0, 0, 0); +} +.lgn-raised-button[disabled] { + cursor: default; +} +.lgn-raised-button::-moz-focus-inner { + border: 0; +} + +.lgn-icon-button { + padding: 0; + min-width: 0; + width: 40px; + height: 40px; + flex-shrink: 0; + line-height: 40px; + border-radius: 50%; +} +.lgn-icon-button i, .lgn-icon-button .mat-icon { + line-height: 24px; +} + +.lgn-stroked-button { + border: 1px solid currentColor; + padding: 0 15px; + line-height: 34px; +} + +.lgn-button:focus { + pointer-events: none; + transition: opacity 200ms cubic-bezier(0.35, 0, 0.25, 1), background-color 200ms cubic-bezier(0.35, 0, 0.25, 1); +} + +.lgn-button *, .lgn-stroked-button *, .lgn-raised-button * { + vertical-align: middle; +} + +input:not([type=radio]):not([type=checkbox]), +.lgn-input { + display: block; + box-sizing: border-box; + padding-inline-start: 10px; + outline: none; + display: inline-block; + text-align: start; + cursor: text; + border-radius: 4px; + transform: all 0.2 linear; + font-size: 1rem; + border-style: solid; + border-width: 1px; + height: 40px; + padding: 10px; + transition: border-color 0.2s ease-in-out; + width: 100%; + margin: 0 0 2px 0; +} +input:not([type=radio]):not([type=checkbox])::placeholder, +.lgn-input::placeholder { + font-size: 14px; + font-style: italic; +} + +select, .lgn-select { + display: block; + box-sizing: border-box; + padding-inline-start: 10px; + outline: none; + display: inline-block; + text-align: start; + cursor: text; + border-radius: 4px; + transform: all 0.2 linear; + font-size: 1rem; + border-style: solid; + border-width: 1px; + height: 40px; + padding: 10px; + transition: border-color 0.2s ease-in-out; + width: 100%; + margin: 0 0 2px 0; +} +select::placeholder, .lgn-select::placeholder { + font-size: 14px; + font-style: italic; +} + +.lgn-suffix-wrapper { + position: relative; +} +.lgn-suffix-wrapper [lgnSuffix] { + position: absolute; + right: 0.5rem; + top: 9px; + height: inherit; + vertical-align: middle; +} + +.lgn-label { + display: block; + font-size: 12px; + transition: color 0.2s ease; + margin: 0 0 2px 0; + font-weight: 400; +} + +@keyframes ripple { + 0% { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0); + } + 50% { + box-shadow: 0 0 0 15px rgba(0, 0, 0, 0.1); + } + 100% { + box-shadow: 0 0 0 15px rgba(0, 0, 0, 0); + } +} +.lgn-radio { + outline: none; + margin: 16px 0; + display: inline-block; +} +.lgn-radio.block { + display: block; +} +.lgn-radio label { + display: inline-block; + height: 20px; + position: relative; + padding: 0 0 0 30px; + margin-bottom: 0; + cursor: pointer; + vertical-align: middle; + padding-top: 2px; + outline: none; + font-size: 14px; + line-height: 16px; +} +.lgn-radio label::before, .lgn-radio label::after { + position: absolute; + content: ""; + border-radius: 50%; + transition: all 0.3s ease; + transition-property: transform, border-color; +} +.lgn-radio label::before { + left: 0; + top: 0; + width: 20px; + height: 20px; + border-width: 2px; + border-style: solid; +} +.lgn-radio label::after { + top: 5px; + left: 5px; + width: 10px; + height: 10px; + transform: scale(0); +} +.lgn-radio input[type=radio] { + opacity: 0; + margin: 0; + width: 0; + height: 0; + outline: none; +} +.lgn-radio input[type=radio]:checked + label::before { + animation: ripple 0.2s linear forwards; +} +.lgn-radio input[type=radio]:checked + label::after { + transform: scale(1); +} +.lgn-radio input[type=radio]:focus + label { + opacity: 1; +} +.lgn-radio input[type=radio]:disabled + label { + cursor: not-allowed; + font-style: italic; +} +.lgn-radio input[type=radio]:disabled:focus { + opacity: 0; +} +.lgn-radio *, +.lgn-radio *::before, +.lgn-radio *::after { + box-sizing: border-box; +} + +a { + text-decoration: none; + outline: none; + cursor: pointer; + margin: 2px 0; +} +a.block { + display: block; +} + +.lgn-idp { + display: block; + margin: 0.5rem 0; + box-sizing: border-box; + display: flex; + align-items: center; + position: relative; + padding: 0 1px; + border-radius: 0.5rem; + border-width: 1px; + border-style: solid; +} +.lgn-idp span.logo { + height: 46px; + width: 46px; +} +.lgn-idp span.provider-name { + line-height: 36px; + position: absolute; + left: 50%; + transform: translateX(-50%); +} +.lgn-idp.google span.logo { + height: 46px; + width: 46px; + background-image: url("../../../images/idp/google.png"); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; +} + +.lgn-error { + display: flex; + align-items: center; + outline: none; +} +.lgn-error i { + margin-right: 0.5rem; + font-size: 1.5rem; +} + +.lgn-qrcode { + display: block; + margin: auto; + margin: 1rem 0; + margin-bottom: 1.5rem; +} +.lgn-qrcode svg { + margin: auto; + display: block; + border-radius: 0.5rem; +} + +.lgn-max-width-wrapper { + max-width: 400px; + margin: auto; + margin-top: 50px; + margin-bottom: 50px; + display: block; +} +@media only screen and (min-width: 600px) { + .lgn-max-width-wrapper { + margin-top: 100px; + } +} + +.content-container { + position: relative; + display: block; + margin: 0 auto 0 auto; + padding: 20px; + width: 100%; + box-sizing: border-box; +} +.content-container .lgn-head h1 { + text-align: center; +} +.content-container .lgn-head p { + text-align: center; +} +.content-container .lgn-actions { + display: flex; + align-items: center; + padding: 0.5rem 0; + margin-top: 1rem; +} +.content-container .lgn-actions.lgn-reverse-order { + flex-direction: row-reverse; +} +.content-container .lgn-actions .fill-space { + flex: 1; +} +.content-container .lgn-row { + display: flex; + align-items: center; + padding: 0; +} +.content-container .lgn-row.lgn-reverse-order { + flex-direction: row-reverse; +} +.content-container .lgn-row .fill-space { + flex: 1; +} +.content-container .lgn-login-profile { + margin-bottom: 0.5rem; +} +.content-container .lgn-login-profile .lgn-profile-image { + display: block; + margin: 0.5rem; +} +.content-container .lgn-login-profile .lgn-names { + border-width: 1px; + border-style: solid; + border-radius: 50vw; + display: flex; + align-items: center; +} +.content-container .lgn-login-profile .lgn-names .inline-block { + display: inline-block; + margin: 0 2px; +} +.content-container .lgn-login-profile .lgn-names .lgn-displayname { + margin: 0.5rem 1rem; +} +.content-container .lgn-login-profile .lgn-names .lgn-loginname p { + margin: 0.5rem 1rem; +} +.content-container .lgn-left-action { + position: absolute; + left: 1rem; + top: -40px; +} +.content-container .lgn-register-options { + display: flex; + flex-direction: column; +} +.content-container .lgn-mfa-other { + display: flex; + flex-direction: column; +} +.content-container .lgn-mfa-other button { + width: 100%; + margin: 0.5rem 0; +} + +i { + font-size: 1.2rem; +} + +.lgn-account-selection { + display: flex; + flex-direction: column; + width: 100%; +} +.lgn-account-selection .lgn-account { + display: flex; + align-items: center; + border: none; + outline: none; +} +.lgn-account-selection .lgn-account .left { + padding: 0.5rem 1rem; +} +.lgn-account-selection .lgn-account .lgn-names { + display: block; + margin: 0.5rem; + text-align: start; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-displayname { + font-size: 16px; + margin: 0.5rem 0; + margin-bottom: 0; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-loginname { + font-size: 14px; + margin: 0; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-session-state { + margin: 0; + font-size: 14px; + margin-bottom: 0.5rem; +} +.lgn-account-selection .lgn-account .fill-space { + flex: 1; +} +.lgn-account-selection .lgn-account i { + font-size: 1.2rem; +} + +.lgn-avatar { + height: 32px; + width: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + text-transform: uppercase; + box-sizing: border-box; + letter-spacing: 0.05em; + font-size: 14px; + outline: none; + font-weight: bold; +} + +.lgn-checkbox { + display: inline-block; + position: relative; + margin: 0 0 10px; + font-size: 14px; + line-height: 24px; + box-sizing: inherit; +} +.lgn-checkbox input[type=checkbox] { + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + opacity: 0; + z-index: 0; + box-sizing: inherit; +} +.lgn-checkbox label { + display: block; + padding: 0 0 0 30px; + cursor: pointer; + box-sizing: inherit; + font-size: 14px; + line-height: 28px; +} +.lgn-checkbox label:before { + content: ""; + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + border-radius: 2px; + transition: all 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transition-property: background-color, border-color; +} +.lgn-checkbox label:after { + content: ""; + position: absolute; + top: 5px; + left: 5px; + width: 6px; + height: 12px; + transform: rotate(45deg); + transition: border-color 0.28s cubic-bezier(0.4, 0, 0.2, 1); +} + +.lgn-select, select { + background-position: right 10px center; + background-repeat: no-repeat; + background-size: auto 50%; + color: white; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; +} +.lgn-select::-ms-expand, select::-ms-expand { + display: none; +} + +.lgn-list.lgn-policy, ul.lgn-policy { + display: flex; + flex-wrap: wrap; +} +.lgn-list.lgn-policy li, ul.lgn-policy li { + flex: 1 0 50%; +} +.lgn-list li, ul li { + display: flex; + align-items: center; + list-style: none; + margin: 4px 0; + font-style: italic; +} +.lgn-list li i, ul li i { + margin: 0 0.5rem; + font-size: 20px; +} +.lgn-list:not(.lgn-no-dots) li::before, ul:not(.lgn-no-dots) li::before { + content: "•"; + font-weight: bold; + display: inline-block; + width: 20px; + margin-left: -20px; + font-style: normal; +} +.lgn-list.lgn-no-dots, ul.lgn-no-dots { + list-style-type: none; + padding-inline-start: 0; +} + +@font-face { + font-family: Aileron; + src: url(../../../fonts/ailerons/ailerons.otf) format("opentype"); +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 800; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Medium.ttf) format("truetype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-MediumItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBold.ttf) format("truetype"); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLight.ttf) format("truetype"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Medium.ttf) format("truetype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-MediumItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBold.ttf) format("truetype"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +.lgn-success-label { + color: #0e6245; + background: #cbf4c9; + border-radius: 0.5rem; + padding: 0.5rem; +} + +footer { + width: 100%; + box-sizing: border-box; + background: #00000020; + min-height: 50px; + display: flex; + align-items: center; + padding: 0 1rem; +} +footer .fill-space { + flex: 1; +} +footer a { + font-size: 12px; + margin-left: 1rem; +} +@media only screen and (min-width: 600px) { + footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + } +} + +.lgn-header { + display: block; + position: relative; + margin: 1rem auto 0.5rem auto; + padding: 0; + width: 100%; +} +.lgn-header .lgn-logo { + height: 43px; + width: 160px; + margin: 0 auto; +} + +.lgn-button, .lgn-stroked-button, .lgn-icon-button { + box-sizing: border-box; + position: relative; + cursor: pointer; + outline: none; + border: none; + -webkit-tap-highlight-color: transparent; + display: inline-block; + white-space: nowrap; + text-decoration: none; + vertical-align: baseline; + text-align: center; + margin: 0; + min-width: 64px; + line-height: 36px; + padding: 0 16px; + border-radius: 6px; + overflow: visible; +} +.lgn-button[disabled], .lgn-stroked-button[disabled], .lgn-icon-button[disabled] { + cursor: default; +} +.lgn-button::-moz-focus-inner, .lgn-stroked-button::-moz-focus-inner, .lgn-icon-button::-moz-focus-inner { + border: 0; +} + +.lgn-raised-button { + box-sizing: border-box; + position: relative; + cursor: pointer; + outline: none; + border: none; + -webkit-tap-highlight-color: transparent; + display: inline-block; + white-space: nowrap; + text-decoration: none; + vertical-align: baseline; + text-align: center; + margin: 0; + min-width: 64px; + line-height: 36px; + padding: 0 16px; + border-radius: 6px; + overflow: visible; + transform: translate3d(0, 0, 0); +} +.lgn-raised-button[disabled] { + cursor: default; +} +.lgn-raised-button::-moz-focus-inner { + border: 0; +} + +.lgn-icon-button { + padding: 0; + min-width: 0; + width: 40px; + height: 40px; + flex-shrink: 0; + line-height: 40px; + border-radius: 50%; +} +.lgn-icon-button i, .lgn-icon-button .mat-icon { + line-height: 24px; +} + +.lgn-stroked-button { + border: 1px solid currentColor; + padding: 0 15px; + line-height: 34px; +} + +.lgn-button:focus { + pointer-events: none; + transition: opacity 200ms cubic-bezier(0.35, 0, 0.25, 1), background-color 200ms cubic-bezier(0.35, 0, 0.25, 1); +} + +.lgn-button *, .lgn-stroked-button *, .lgn-raised-button * { + vertical-align: middle; +} + +input:not([type=radio]):not([type=checkbox]), +.lgn-input { + display: block; + box-sizing: border-box; + padding-inline-start: 10px; + outline: none; + display: inline-block; + text-align: start; + cursor: text; + border-radius: 4px; + transform: all 0.2 linear; + font-size: 1rem; + border-style: solid; + border-width: 1px; + height: 40px; + padding: 10px; + transition: border-color 0.2s ease-in-out; + width: 100%; + margin: 0 0 2px 0; +} +input:not([type=radio]):not([type=checkbox])::placeholder, +.lgn-input::placeholder { + font-size: 14px; + font-style: italic; +} + +select, .lgn-select { + display: block; + box-sizing: border-box; + padding-inline-start: 10px; + outline: none; + display: inline-block; + text-align: start; + cursor: text; + border-radius: 4px; + transform: all 0.2 linear; + font-size: 1rem; + border-style: solid; + border-width: 1px; + height: 40px; + padding: 10px; + transition: border-color 0.2s ease-in-out; + width: 100%; + margin: 0 0 2px 0; +} +select::placeholder, .lgn-select::placeholder { + font-size: 14px; + font-style: italic; +} + +.lgn-suffix-wrapper { + position: relative; +} +.lgn-suffix-wrapper [lgnSuffix] { + position: absolute; + right: 0.5rem; + top: 9px; + height: inherit; + vertical-align: middle; +} + +.lgn-label { + display: block; + font-size: 12px; + transition: color 0.2s ease; + margin: 0 0 2px 0; + font-weight: 400; +} + +@keyframes ripple { + 0% { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0); + } + 50% { + box-shadow: 0 0 0 15px rgba(0, 0, 0, 0.1); + } + 100% { + box-shadow: 0 0 0 15px rgba(0, 0, 0, 0); + } +} +.lgn-radio { + outline: none; + margin: 16px 0; + display: inline-block; +} +.lgn-radio.block { + display: block; +} +.lgn-radio label { + display: inline-block; + height: 20px; + position: relative; + padding: 0 0 0 30px; + margin-bottom: 0; + cursor: pointer; + vertical-align: middle; + padding-top: 2px; + outline: none; + font-size: 14px; + line-height: 16px; +} +.lgn-radio label::before, .lgn-radio label::after { + position: absolute; + content: ""; + border-radius: 50%; + transition: all 0.3s ease; + transition-property: transform, border-color; +} +.lgn-radio label::before { + left: 0; + top: 0; + width: 20px; + height: 20px; + border-width: 2px; + border-style: solid; +} +.lgn-radio label::after { + top: 5px; + left: 5px; + width: 10px; + height: 10px; + transform: scale(0); +} +.lgn-radio input[type=radio] { + opacity: 0; + margin: 0; + width: 0; + height: 0; + outline: none; +} +.lgn-radio input[type=radio]:checked + label::before { + animation: ripple 0.2s linear forwards; +} +.lgn-radio input[type=radio]:checked + label::after { + transform: scale(1); +} +.lgn-radio input[type=radio]:focus + label { + opacity: 1; +} +.lgn-radio input[type=radio]:disabled + label { + cursor: not-allowed; + font-style: italic; +} +.lgn-radio input[type=radio]:disabled:focus { + opacity: 0; +} +.lgn-radio *, +.lgn-radio *::before, +.lgn-radio *::after { + box-sizing: border-box; +} + +a { + text-decoration: none; + outline: none; + cursor: pointer; + margin: 2px 0; +} +a.block { + display: block; +} + +.lgn-idp { + display: block; + margin: 0.5rem 0; + box-sizing: border-box; + display: flex; + align-items: center; + position: relative; + padding: 0 1px; + border-radius: 0.5rem; + border-width: 1px; + border-style: solid; +} +.lgn-idp span.logo { + height: 46px; + width: 46px; +} +.lgn-idp span.provider-name { + line-height: 36px; + position: absolute; + left: 50%; + transform: translateX(-50%); +} +.lgn-idp.google span.logo { + height: 46px; + width: 46px; + background-image: url("../../../images/idp/google.png"); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; +} + +.lgn-error { + display: flex; + align-items: center; + outline: none; +} +.lgn-error i { + margin-right: 0.5rem; + font-size: 1.5rem; +} + +.lgn-qrcode { + display: block; + margin: auto; + margin: 1rem 0; + margin-bottom: 1.5rem; +} +.lgn-qrcode svg { + margin: auto; + display: block; + border-radius: 0.5rem; +} + +.lgn-max-width-wrapper { + max-width: 400px; + margin: auto; + margin-top: 50px; + margin-bottom: 50px; + display: block; +} +@media only screen and (min-width: 600px) { + .lgn-max-width-wrapper { + margin-top: 100px; + } +} + +.content-container { + position: relative; + display: block; + margin: 0 auto 0 auto; + padding: 20px; + width: 100%; + box-sizing: border-box; +} +.content-container .lgn-head h1 { + text-align: center; +} +.content-container .lgn-head p { + text-align: center; +} +.content-container .lgn-actions { + display: flex; + align-items: center; + padding: 0.5rem 0; + margin-top: 1rem; +} +.content-container .lgn-actions.lgn-reverse-order { + flex-direction: row-reverse; +} +.content-container .lgn-actions .fill-space { + flex: 1; +} +.content-container .lgn-row { + display: flex; + align-items: center; + padding: 0; +} +.content-container .lgn-row.lgn-reverse-order { + flex-direction: row-reverse; +} +.content-container .lgn-row .fill-space { + flex: 1; +} +.content-container .lgn-login-profile { + margin-bottom: 0.5rem; +} +.content-container .lgn-login-profile .lgn-profile-image { + display: block; + margin: 0.5rem; +} +.content-container .lgn-login-profile .lgn-names { + border-width: 1px; + border-style: solid; + border-radius: 50vw; + display: flex; + align-items: center; +} +.content-container .lgn-login-profile .lgn-names .inline-block { + display: inline-block; + margin: 0 2px; +} +.content-container .lgn-login-profile .lgn-names .lgn-displayname { + margin: 0.5rem 1rem; +} +.content-container .lgn-login-profile .lgn-names .lgn-loginname p { + margin: 0.5rem 1rem; +} +.content-container .lgn-left-action { + position: absolute; + left: 1rem; + top: -40px; +} +.content-container .lgn-register-options { + display: flex; + flex-direction: column; +} +.content-container .lgn-mfa-other { + display: flex; + flex-direction: column; +} +.content-container .lgn-mfa-other button { + width: 100%; + margin: 0.5rem 0; +} + +i { + font-size: 1.2rem; +} + +.lgn-account-selection { + display: flex; + flex-direction: column; + width: 100%; +} +.lgn-account-selection .lgn-account { + display: flex; + align-items: center; + border: none; + outline: none; +} +.lgn-account-selection .lgn-account .left { + padding: 0.5rem 1rem; +} +.lgn-account-selection .lgn-account .lgn-names { + display: block; + margin: 0.5rem; + text-align: start; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-displayname { + font-size: 16px; + margin: 0.5rem 0; + margin-bottom: 0; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-loginname { + font-size: 14px; + margin: 0; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-session-state { + margin: 0; + font-size: 14px; + margin-bottom: 0.5rem; +} +.lgn-account-selection .lgn-account .fill-space { + flex: 1; +} +.lgn-account-selection .lgn-account i { + font-size: 1.2rem; +} + +.lgn-avatar { + height: 32px; + width: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + text-transform: uppercase; + box-sizing: border-box; + letter-spacing: 0.05em; + font-size: 14px; + outline: none; + font-weight: bold; +} + +.lgn-checkbox { + display: inline-block; + position: relative; + margin: 0 0 10px; + font-size: 14px; + line-height: 24px; + box-sizing: inherit; +} +.lgn-checkbox input[type=checkbox] { + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + opacity: 0; + z-index: 0; + box-sizing: inherit; +} +.lgn-checkbox label { + display: block; + padding: 0 0 0 30px; + cursor: pointer; + box-sizing: inherit; + font-size: 14px; + line-height: 28px; +} +.lgn-checkbox label:before { + content: ""; + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + border-radius: 2px; + transition: all 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transition-property: background-color, border-color; +} +.lgn-checkbox label:after { + content: ""; + position: absolute; + top: 5px; + left: 5px; + width: 6px; + height: 12px; + transform: rotate(45deg); + transition: border-color 0.28s cubic-bezier(0.4, 0, 0.2, 1); +} + +.lgn-select, select { + background-position: right 10px center; + background-repeat: no-repeat; + background-size: auto 50%; + color: white; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; +} +.lgn-select::-ms-expand, select::-ms-expand { + display: none; +} + +.lgn-list.lgn-policy, ul.lgn-policy { + display: flex; + flex-wrap: wrap; +} +.lgn-list.lgn-policy li, ul.lgn-policy li { + flex: 1 0 50%; +} +.lgn-list li, ul li { + display: flex; + align-items: center; + list-style: none; + margin: 4px 0; + font-style: italic; +} +.lgn-list li i, ul li i { + margin: 0 0.5rem; + font-size: 20px; +} +.lgn-list:not(.lgn-no-dots) li::before, ul:not(.lgn-no-dots) li::before { + content: "•"; + font-weight: bold; + display: inline-block; + width: 20px; + margin-left: -20px; + font-style: normal; +} +.lgn-list.lgn-no-dots, ul.lgn-no-dots { + list-style-type: none; + padding-inline-start: 0; +} + +@font-face { + font-family: Aileron; + src: url(../../../fonts/ailerons/ailerons.otf) format("opentype"); +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 800; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Medium.ttf) format("truetype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-MediumItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBold.ttf) format("truetype"); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLight.ttf) format("truetype"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Medium.ttf) format("truetype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-MediumItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBold.ttf) format("truetype"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +.lgn-success-label { + color: #0e6245; + background: #cbf4c9; + border-radius: 0.5rem; + padding: 0.5rem; +} + +@font-face { + font-family: Aileron; + src: url(../../../fonts/ailerons/ailerons.otf) format("opentype"); +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 800; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Medium.ttf) format("truetype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-MediumItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBold.ttf) format("truetype"); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLight.ttf) format("truetype"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Medium.ttf) format("truetype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-MediumItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBold.ttf) format("truetype"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +.lgn-max-width-wrapper { + max-width: 400px; + margin: auto; + margin-top: 50px; + margin-bottom: 50px; + display: block; +} +@media only screen and (min-width: 600px) { + .lgn-max-width-wrapper { + margin-top: 100px; + } +} + +.content-container { + position: relative; + display: block; + margin: 0 auto 0 auto; + padding: 20px; + width: 100%; + box-sizing: border-box; +} +.content-container .lgn-head h1 { + text-align: center; +} +.content-container .lgn-head p { + text-align: center; +} +.content-container .lgn-actions { + display: flex; + align-items: center; + padding: 0.5rem 0; + margin-top: 1rem; +} +.content-container .lgn-actions.lgn-reverse-order { + flex-direction: row-reverse; +} +.content-container .lgn-actions .fill-space { + flex: 1; +} +.content-container .lgn-row { + display: flex; + align-items: center; + padding: 0; +} +.content-container .lgn-row.lgn-reverse-order { + flex-direction: row-reverse; +} +.content-container .lgn-row .fill-space { + flex: 1; +} +.content-container .lgn-login-profile { + margin-bottom: 0.5rem; +} +.content-container .lgn-login-profile .lgn-profile-image { + display: block; + margin: 0.5rem; +} +.content-container .lgn-login-profile .lgn-names { + border-width: 1px; + border-style: solid; + border-radius: 50vw; + display: flex; + align-items: center; +} +.content-container .lgn-login-profile .lgn-names .inline-block { + display: inline-block; + margin: 0 2px; +} +.content-container .lgn-login-profile .lgn-names .lgn-displayname { + margin: 0.5rem 1rem; +} +.content-container .lgn-login-profile .lgn-names .lgn-loginname p { + margin: 0.5rem 1rem; +} +.content-container .lgn-left-action { + position: absolute; + left: 1rem; + top: -40px; +} +.content-container .lgn-register-options { + display: flex; + flex-direction: column; +} +.content-container .lgn-mfa-other { + display: flex; + flex-direction: column; +} +.content-container .lgn-mfa-other button { + width: 100%; + margin: 0.5rem 0; +} + +i { + font-size: 1.2rem; +} + +.lgn-register .double-col { + display: flex; + flex-wrap: wrap; + margin: 0 -0.5rem; +} +.lgn-register .double-col .lgn-field { + margin: 0 0.5rem; + flex: 1; + box-sizing: border-box; + margin-bottom: 0.5rem; +} +.lgn-register .lgn-field { + margin-bottom: 0.5rem; +} + +.lgn-header { + display: block; + position: relative; + margin: 1rem auto 0.5rem auto; + padding: 0; + width: 100%; +} +.lgn-header .lgn-logo { + height: 43px; + width: 160px; + margin: 0 auto; +} + +@keyframes shake { + 10%, 90% { + transform: translate3d(-1px, 0, 0); + } + 20%, 80% { + transform: translate3d(2px, 0, 0); + } + 30%, 50%, 70% { + transform: translate3d(-4px, 0, 0); + } + 40%, 60% { + transform: translate3d(4px, 0, 0); + } +} +[shake] { + animation: shake 0.8s cubic-bezier(0.36, 0.07, 0.19, 0.97) both; + transform: translate3d(0, 0, 0); +} + +/*# sourceMappingURL=bundle.css.map */ diff --git a/internal/ui/login/static/resources/themes/zitadel/css/bundle.css.map b/internal/ui/login/static/resources/themes/zitadel/css/bundle.css.map new file mode 100644 index 0000000000..b889956c74 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/css/bundle.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../scss/styles/footer/footer.scss","../../scss/styles/header/header.scss","../../scss/styles/button/button.scss","../../scss/styles/button/button_base.scss","../../scss/styles/input/input.scss","../../scss/styles/input/input_base.scss","../../scss/styles/label/label.scss","../../scss/styles/label/label_base.scss","../../scss/styles/radio/radio_base.scss","../../scss/styles/radio/radio.scss","../../scss/styles/a/a.scss","../../scss/styles/identity_provider/identity_provider.scss","../../scss/styles/identity_provider/identity_provider_base.scss","../../scss/styles/error/error.scss","../../scss/styles/qrcode/qrcode.scss","../../scss/styles/container/container.scss","../../scss/styles/account_selection/account_selection.scss","../../scss/styles/avatar/avatar.scss","../../scss/styles/checkbox/checkbox.scss","../../scss/styles/checkbox/checkbox_base.scss","../../scss/styles/select/select.scss","../../scss/styles/select/select_base.scss","../../scss/styles/list/list_base.scss","../../scss/styles/typography/faces/ailerons_font_faces.scss","../../scss/styles/typography/faces/lato_font_faces.scss","../../scss/styles/typography/faces/roboto_font_faces.scss","../../scss/styles/typography/faces/raleway_font_faces.scss","../../scss/styles/typography/faces/pt_sans_font_faces.scss","../../scss/styles/success_label/success_label.scss","../../scss/styles/register/register.scss","../../scss/styles/animations.scss"],"names":[],"mappings":";AAIA;EACI;EACA;EACA;EACA,YAPY;EAQZ;EACA;EACA,SATa;;AAWb;EACI;;AAGJ;EACI;EACA;;AAGJ;EAlBJ;IAmBQ;IACA;IACA;IACA;;;;ACvBR;EACI;EACA;EACA,QALgB;EAMhB,SAPiB;EAQjB;;AAEA;EACI;EACA;EACA;;;ACXR;ECkBE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EAGA,QAjCkB;EAkClB,WAnCqB;EAoCrB,aAlCuB;EAmCvB,SAtCmB;EAuCnB,eAnCyB;EAqCzB;;AAEA;EACE;;AAGF;EACE;;;AD1CJ;ECcE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EAGA,QAjCkB;EAkClB,WAnCqB;EAoCrB,aAlCuB;EAmCvB,SAtCmB;EAuCnB,eAnCyB;EAqCzB;EAgBA;;AAdA;EACE;;AAGF;EACE;;;ADtCJ;EACE;EACA;EACA,OCCqB;EDArB;EACA;EACA,aCFqB;EDGrB,eCF8B;;ADI9B;EACE,aCJ0B;;;ADQ9B;EACE;EACA,SCf2B;EDgB3B,aCjB+B;;;ADoBjC;EACE;EACA,YC3B4B;;;AD+B5B;EACE;;;AEnCJ;AAAA;ECOI;EACA;EACA,sBAXsB;EAYtB;EACA;EACA;EACA;EACA,eAZsB;EAatB;EACA;EACA;EACA,cAfqB;EAgBrB,QAlBoB;EAmBpB,SArBgB;EAsBhB;EACA;EACA,QAvBe;;AAyBf;AAAA;EACI,WAtB0B;EAuB1B;;;ADrBR;ECCI;EACA;EACA,sBAXsB;EAYtB;EACA;EACA;EACA;EACA,eAZsB;EAatB;EACA;EACA;EACA,cAfqB;EAgBrB,QAlBoB;EAmBpB,SArBgB;EAsBhB;EACA;EACA,QAvBe;;AAyBf;EACI,WAtB0B;EAuB1B;;;ADjBR;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AElBR;ECGI;EACA,WANkB;EAOlB;EACA,QAPe;EAQf,aAPoB;;;ACMxB;EACI;IACE;;EAGF;IACE;;EAGF;IACE;;;AChBN;EDqBI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA,QA9BS;EA+BT;EACA,SA7BkB;EA8BlB;EACA;EACA;EACA;EACA;EACA,WAzCc;EA0Cd;;AAEA;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OArDK;EAsDL,QAtDK;EAuDL;EACA;;AAGJ;EACI;EACA;EACA,OA7Da;EA8Db,QA9Da;EA+Db;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAOA;EACI;EACA;;AAGJ;EACI;;AAKZ;AAAA;AAAA;EAGI;;;AE5GR;EACI;EACA;EACA;EACA;;AAEA;EACI;;;ACLR;ECKI;EACA,QARa;EASb;EACA;EACA;EACA;EACA,SAZc;EAad,eAXoB;EAYpB;EACA;;AAEA;EACI;EACA;;AAGJ;EACI,aAtB4B;EAuB5B;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;ACtCZ;EACI;EACA;EACA;;AACA;EACI;EACA;;;ACNR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;ACHR;EACI,WAPsB;EAQtB;EACA;EACA,eAN0B;EAO1B;;AAEA;EAPJ;IAQQ,YAXmB;;;;AAe3B;EACI;EACA;EACA,QAnBmB;EAoBnB,SArBoB;EAsBpB;EACA;;AAGI;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;;AAEA;EACI;EACA;;AAEJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGA;EACI;;AAMhB;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;;;AAKZ;EACI;;;ACtHJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAIR;EACI;;AAGJ;EACI;;;AC3CZ;EACI,QAHc;EAId,OAJc;EAKd;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACdJ;ECCI;EACA;EACA;EACA,WANqB;EAOrB;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;EACA,WA3BiB;EA4BjB;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AChDZ;ECCI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI;;;ACVJ;EACI;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAKJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;;;ACpCR;EACI;EACA;;ACFJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AC7DJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;ACzEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AC9GJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;ACtBJ;EACI;EACA;EACA;EACA;;;A5BFJ;EACI;EACA;EACA;EACA,YAPY;EAQZ;EACA;EACA,SATa;;AAWb;EACI;;AAGJ;EACI;EACA;;AAGJ;EAlBJ;IAmBQ;IACA;IACA;IACA;;;;ACvBR;EACI;EACA;EACA,QALgB;EAMhB,SAPiB;EAQjB;;AAEA;EACI;EACA;EACA;;;ACXR;ECkBE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EAGA,QAjCkB;EAkClB,WAnCqB;EAoCrB,aAlCuB;EAmCvB,SAtCmB;EAuCnB,eAnCyB;EAqCzB;;AAEA;EACE;;AAGF;EACE;;;AD1CJ;ECcE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EAGA,QAjCkB;EAkClB,WAnCqB;EAoCrB,aAlCuB;EAmCvB,SAtCmB;EAuCnB,eAnCyB;EAqCzB;EAgBA;;AAdA;EACE;;AAGF;EACE;;;ADtCJ;EACE;EACA;EACA,OCCqB;EDArB;EACA;EACA,aCFqB;EDGrB,eCF8B;;ADI9B;EACE,aCJ0B;;;ADQ9B;EACE;EACA,SCf2B;EDgB3B,aCjB+B;;;ADoBjC;EACE;EACA,YC3B4B;;;AD+B5B;EACE;;;AEnCJ;AAAA;ECOI;EACA;EACA,sBAXsB;EAYtB;EACA;EACA;EACA;EACA,eAZsB;EAatB;EACA;EACA;EACA,cAfqB;EAgBrB,QAlBoB;EAmBpB,SArBgB;EAsBhB;EACA;EACA,QAvBe;;AAyBf;AAAA;EACI,WAtB0B;EAuB1B;;;ADrBR;ECCI;EACA;EACA,sBAXsB;EAYtB;EACA;EACA;EACA;EACA,eAZsB;EAatB;EACA;EACA;EACA,cAfqB;EAgBrB,QAlBoB;EAmBpB,SArBgB;EAsBhB;EACA;EACA,QAvBe;;AAyBf;EACI,WAtB0B;EAuB1B;;;ADjBR;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AElBR;ECGI;EACA,WANkB;EAOlB;EACA,QAPe;EAQf,aAPoB;;;ACMxB;EACI;IACE;;EAGF;IACE;;EAGF;IACE;;;AChBN;EDqBI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA,QA9BS;EA+BT;EACA,SA7BkB;EA8BlB;EACA;EACA;EACA;EACA;EACA,WAzCc;EA0Cd;;AAEA;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OArDK;EAsDL,QAtDK;EAuDL;EACA;;AAGJ;EACI;EACA;EACA,OA7Da;EA8Db,QA9Da;EA+Db;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAOA;EACI;EACA;;AAGJ;EACI;;AAKZ;AAAA;AAAA;EAGI;;;AE5GR;EACI;EACA;EACA;EACA;;AAEA;EACI;;;ACLR;ECKI;EACA,QARa;EASb;EACA;EACA;EACA;EACA,SAZc;EAad,eAXoB;EAYpB;EACA;;AAEA;EACI;EACA;;AAGJ;EACI,aAtB4B;EAuB5B;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;ACtCZ;EACI;EACA;EACA;;AACA;EACI;EACA;;;ACNR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;ACHR;EACI,WAPsB;EAQtB;EACA;EACA,eAN0B;EAO1B;;AAEA;EAPJ;IAQQ,YAXmB;;;;AAe3B;EACI;EACA;EACA,QAnBmB;EAoBnB,SArBoB;EAsBpB;EACA;;AAGI;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;;AAEA;EACI;EACA;;AAEJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGA;EACI;;AAMhB;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;;;AAKZ;EACI;;;ACtHJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAIR;EACI;;AAGJ;EACI;;;AC3CZ;EACI,QAHc;EAId,OAJc;EAKd;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACdJ;ECCI;EACA;EACA;EACA,WANqB;EAOrB;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;EACA,WA3BiB;EA4BjB;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AChDZ;ECCI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI;;;ACVJ;EACI;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAKJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;;;ACpCR;EACI;EACA;;ACFJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AC7DJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;ACzEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AC9GJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;ACtBJ;EACI;EACA;EACA;EACA;;;ALNJ;EACI;EACA;;ACFJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AC7DJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;ACzEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AC9GJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AZlBJ;EACI,WAPsB;EAQtB;EACA;EACA,eAN0B;EAO1B;;AAEA;EAPJ;IAQQ,YAXmB;;;;AAe3B;EACI;EACA;EACA,QAnBmB;EAoBnB,SArBoB;EAsBpB;EACA;;AAGI;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;;AAEA;EACI;EACA;;AAEJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGA;EACI;;AAMhB;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;;;AAKZ;EACI;;;AcvHA;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIR;EACI;;;A5BdR;EACI;EACA;EACA,QALgB;EAMhB,SAPiB;EAQjB;;AAEA;EACI;EACA;EACA;;;A6BbR;EACI;IACE;;EAGF;IACE;;EAGF;IACE;;EAGF;IACE;;;AAIN;EACI;EACA","file":"bundle.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/css/dark.css b/internal/ui/login/static/resources/themes/zitadel/css/dark.css deleted file mode 100644 index e9f2328c89..0000000000 --- a/internal/ui/login/static/resources/themes/zitadel/css/dark.css +++ /dev/null @@ -1,513 +0,0 @@ -@font-face { - font-family: Aileron; - src: url(../../../fonts/ailerons/ailerons.otf) format("opentype"); -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Thin.ttf) format("truetype"); - font-style: normal; - font-weight: 100; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-ThinItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 100; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Light.ttf) format("truetype"); - font-style: normal; - font-weight: 200; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-LightItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 200; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Regular.ttf) format("truetype"); - font-style: normal; - font-weight: 400; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Italic.ttf) format("truetype"); - font-style: italic; - font-weight: 400; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Bold.ttf) format("truetype"); - font-style: normal; - font-weight: 700; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-BoldItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 700; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Black.ttf) format("truetype"); - font-style: normal; - font-weight: 800; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-BlackItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 800; -} -@font-face { - font-family: "Material Icons"; - font-style: normal; - font-weight: 400; - src: url(../../../fonts/material/MaterialIcons-Regular.eot); - /* For IE6-8 */ - src: local("Material Icons"), local("MaterialIcons-Regular"), url(../../../fonts/material/MaterialIcons-Regular.woff2) format("woff2"), url(../../../fonts/material/MaterialIcons-Regular.woff) format("woff"), url(../../../fonts/material/MaterialIcons-Regular.ttf) format("truetype"); -} -*, *::before, *::after { - box-sizing: border-box; - font-family: Lato; - font-size: 16px; - font-weight: 400; -} - -body { - margin: 0 0 100px 0; -} -body.waiting * { - cursor: wait !important; -} - -html { - width: 100%; - min-height: 100%; - font-weight: 300; - background-color: #282828; - color: #BBBBC8; - background-repeat: no-repeat; - background-position: bottom right; - background-size: contain; - background-image: url("../flavor-spikes01-wide.png"); -} - -h1 { - color: #BBBBC8; - font-family: Lato; - font-weight: 300; - font-size: 40px; - text-align: center; -} - -h2 { - color: #BBBBC8; - font-family: Lato; - font-weight: 300; - font-size: 30px; -} - -p { - font-weight: 300; - text-align: center; -} - -header { - padding: 8px; -} -header .logo { - background-image: url("../logo-dark.png"); - background-repeat: no-repeat; - background-size: contain; - height: 80px; - margin: 30px; -} - -.head { - width: 100%; - max-width: 1000px; - margin: auto; -} - -.content form { - margin: auto; - padding: 20px; - width: 100%; - max-width: 500px; -} - -a { - color: #3574C6; - text-decoration: none; - font-weight: 400; -} -a:hover { - color: #5b8fd3; -} -a.tos-link { - font-size: 14px; -} - -button, .button { - background-color: #282828; - color: #3574C6; - border: 1px solid #3574C6; - border-radius: 5px; - width: 100%; - max-width: 600px; - height: 50px; - transition: all 0.3s ease 0s; - cursor: pointer; - outline: none; - display: inline-block; - text-align: center; - line-height: 44px; - padding: 1px 6px; -} -button:hover, .button:hover { - background-color: #5b8fd3; - color: #282828; - border: 1px solid #5b8fd3; -} -button.primary, .button.primary { - background-color: #3574C6; - color: #BBBBC8; - border: none; -} -button.primary:hover, .button.primary:hover { - background-color: #5b8fd3; -} -button:disabled, .button:disabled { - background-color: #999999; - border: 1px solid #999999; -} -button:disabled:hover, .button:disabled:hover { - background-color: #999999; - border: 1px solid #999999; -} -button.google, .button.google { - display: flex; - align-items: center; - position: relative; - padding: 0 1px; - color: #FFFFFF; - background-color: #4285F4; -} -button.google span.logo, .button.google span.logo { - height: 46px; - width: 46px; - background-color: #FFFFFF; - background-image: url("../../../images/idp/google.png"); - background-size: 25px; - background-position: center; - background-repeat: no-repeat; - border-radius: 5px; -} -button.google span.provider-name, .button.google span.provider-name { - position: absolute; - left: 50%; - transform: translateX(-50%); -} - -input:not([type=radio]), select { - background-color: #252525; - color: #BBBBC8; - height: 50px; - border: 1px solid #999999; - border-radius: 5px; - padding-left: 8px; -} - -form button.user-selection .profile-image, .login-profile .profile-image { - height: 80px; - width: 80px; - background-position: center; - background-repeat: no-repeat; - background-size: contain; - background-image: url("../../../images/icon-user-dark.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.user-selection .profile-image, .login-profile .profile-image { - background-image: url("../../../images/icon-user-dark@2x.png"); - background-size: 80px 80px; - } -} -form button.user-selection:hover .profile-image, .login-profile:hover .profile-image { - background-image: url("../../../images/icon-user-dark-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.user-selection:hover .profile-image, .login-profile:hover .profile-image { - background-image: url("../../../images/icon-user-dark-hover@2x.png"); - background-size: 80px 80px; - } -} - -.login-profile .profile-image { - margin-left: auto; - margin-right: auto; -} -.login-profile .names { - padding: 10px 0; - text-align: center; -} -.login-profile .names div:first-of-type { - font-size: 26px; - font-weight: 300; -} -.login-profile .names div:nth-of-type(2) { - font-weight: 300; - font-size: 0.9rem; - font-style: italic; - color: #898989; -} - -form .field { - display: grid; - padding: 10px 0; -} -form .field.radio-button { - display: flex; -} -form .field.radio-button input[type=radio] { - height: 20px; - vertical-align: middle; -} -form .field.radio-button label { - height: 20px; - display: inline-block; - padding: 3px 0 0 15px; - width: 100%; -} -form .field.check-box { - display: flex; -} -form .field.check-box input[type=checkbox] { - height: 16px; - vertical-align: middle; -} -form .field.check-box label { - height: 16px; - text-transform: inherit; - display: inline-block; - padding: 2px 0 0 15px; - width: 100%; - color: #BBBBC8; -} -form label { - color: #898989; - text-transform: uppercase; - font-size: 0.8rem; - margin-bottom: 3px; -} -form label span.optional { - font-style: italic; - text-transform: none; -} -form .actions { - padding: 20px 0; -} -form .actions .right { - float: right; -} -form .actions button, form .actions a { - margin: 10px 0; -} -form button.clean { - border: none; - height: auto; - color: #BBBBC8; - text-align: left; - text-transform: unset; - display: flex; - padding: 15px; -} -form button.clean:hover { - border: none; - background-color: #252525; -} -form button.clean * { - font-weight: 300; -} -form .user-selection-list { - margin-bottom: 40px; -} -form button.user-selection .sessionstate { - display: inline-block; - height: 20px; - width: 20px; - border-radius: 20px; - border-color: #999999; - border-style: solid; - border-width: 1px; - position: absolute; - bottom: 0px; - right: 10px; -} -form button.user-selection .sessionstate.sessionstate-0 { - background-color: #138D00; -} -form button.user-selection .sessionstate.sessionstate-1 { - background-color: #BC372E; -} -form button.user-selection > div { - position: relative; -} -form button.user-selection > div.names { - margin: 0 15px; -} -form button.user-selection > div.names .displayname { - font-size: 1.4rem; -} -form button.user-selection > div.names .loginname { - color: #898989; -} -form button.user-selection:disabled { - background: transparent; - border: none; - cursor: not-allowed; -} -form button.user-selection:disabled .profile-image { - opacity: 0.3; -} -form button.user-selection:disabled .sessionstate { - background-color: #282828; -} -form button.user-selection:disabled .names .displayname, form button.user-selection:disabled .names .loginname { - font-style: italic; - color: #444444; -} -.user-selection + form button.other-user { - margin-top: 80px; -} -form button.other-user .other-user-image { - width: 80px; - height: 60px; - background-repeat: no-repeat; - background-position: center; - background-image: url("../../../images/icon-newuser-dark.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.other-user .other-user-image { - background-image: url("../../../images/icon-newuser-dark@2x.png"); - background-size: 80px 60px; - } -} -form button.other-user:hover .other-user-image { - background-repeat: no-repeat; - background-position: center; - background-image: url("../../../images/icon-newuser-dark-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.other-user:hover .other-user-image { - background-image: url("../../../images/icon-newuser-dark-hover@2x.png"); - background-size: 80px 60px; - } -} -form button.other-user > div:nth-of-type(2) { - margin: 15px; - font-size: 1.4rem; -} -form ul#passwordcomplexity { - display: flex; - flex-wrap: wrap; - padding: 0; - list-style: none; - margin-bottom: 0; -} -form ul#passwordcomplexity li { - flex: 1 0 50%; - display: block; - font-weight: 300; - font-size: 12px; - line-height: 12px; -} -form ul#passwordcomplexity li i { - height: 26px; - padding-right: 10px; - vertical-align: middle; - color: #0DF279; -} -form ul#passwordcomplexity li.invalid i { - color: #F20D6B; -} -form #loginname { - display: flex; -} -form #loginname .loginname-suffix { - padding-left: 5px; - line-height: 50px; -} - -#copy-secret { - visibility: hidden; - position: absolute; -} - -#qrcode { - text-align: center; -} -#qrcode svg rect.color { - fill: #BBBBC8; -} -#qrcode svg rect.bg-color { - fill: #282828; -} - -#secret .copy { - float: right; - cursor: pointer; -} - -footer { - width: 100%; - background-size: cover; - bottom: 0; - z-index: -1; -} - -.material-icons { - font-family: "Material Icons"; - font-weight: normal; - font-style: normal; - font-size: 24px; - /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - /* Support for IE. */ - font-feature-settings: "liga"; -} - -.free-tier { - border: 2px solid #F20D6B; - border-radius: 5px; - padding: 10px; -} - -.error { - color: #F20D6B; -} - -.hidden { - display: none; -} - -#wa-error { - margin-top: 20px; -} - -/*# sourceMappingURL=dark.css.map */ diff --git a/internal/ui/login/static/resources/themes/zitadel/css/dark.css.map b/internal/ui/login/static/resources/themes/zitadel/css/dark.css.map deleted file mode 100644 index 7bb0985450..0000000000 --- a/internal/ui/login/static/resources/themes/zitadel/css/dark.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA,kBCIc;EDHd,OCIQ;EDHR;EACA;EACA;EAEI;;;AAIR;EACI,OCNQ;EDOR,aC/BS;EDgCT;EACA,WC7BS;ED8BT;;;AAGJ;EACI,OCdQ;EDeR,aCvCS;EDwCT;EACA,WCpCU;;;ADuCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OClDW;EDmDX;EACA;;AAEA;EACI,OCtDY;;ADyDhB;EACI;;;AAIR;EACI,kBClEc;EDmEd,OCjEW;EDkEX;EACA;EACA;EACA;EACA,QC5FU;ED6FV;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBC/EY;EDgFZ,OCnFU;EDoFV;;AAGJ;EACI,kBCtFO;EDuFP,OCxFI;EDyFJ;;AACA;EACI,kBCzFQ;;AD6FhB;EACI,kBC5FW;ED6FX;;AAEA;EACI,kBChGO;EDiGP;;AAIR;EACI;EACA;EACA;EACA;EACA,OCpGa;EDqGb,kBCpGmB;;ADsGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAOZ;EACI,kBClImB;EDmInB,OCxIQ;EDyIR,QC9JU;ED+JV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EACA;EC9JN;;AACA;EDwJE;ICvJA;IACA;;;AD+JA;EClKF;;AACA;EDiKE;IChKA;IACA;;;;ADsKA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WC5LE;ED6LF;;AAGJ;EACI;EACA;EACA;EACA,OC/KC;;;ADqLT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OC3NA;;AD+NR;EACI,OC7NK;ED8NL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OC1PI;ED2PJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBC7PW;;ADgQf;EACI;;AAIR;EACI;;AAMA;EACI;EACA;EACA;EACA;EACA,cClRO;EDmRP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OC9SP;;ADmTL;EACI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI,kBCjUE;;ADqUF;EACI;EACA;;AAOZ;EACI;;AAEJ;EACI;EACA;EACA;EACA;EC7VV;;AACA;EDwVM;ICvVJ;IACA;;;AD+VQ;EACI;EACA;ECpWd;;AACA;EDiWU;IChWR;IACA;;;ADsWI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OC3WN;;ADgXE;EACI,OClXL;;ADuXP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCrZI;;ADwZR;EACI,MC1ZU;;;AD+Zd;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OClcO;;;ADqcX;EACI;;;AAGJ;EACI","file":"dark.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/css/light.css b/internal/ui/login/static/resources/themes/zitadel/css/light.css deleted file mode 100644 index 26432267ba..0000000000 --- a/internal/ui/login/static/resources/themes/zitadel/css/light.css +++ /dev/null @@ -1,651 +0,0 @@ -@font-face { - font-family: Aileron; - src: url(../../../fonts/ailerons/ailerons.otf) format("opentype"); -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Thin.ttf) format("truetype"); - font-style: normal; - font-weight: 100; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-ThinItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 100; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Light.ttf) format("truetype"); - font-style: normal; - font-weight: 200; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-LightItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 200; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Regular.ttf) format("truetype"); - font-style: normal; - font-weight: 400; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Italic.ttf) format("truetype"); - font-style: italic; - font-weight: 400; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Bold.ttf) format("truetype"); - font-style: normal; - font-weight: 700; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-BoldItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 700; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-Black.ttf) format("truetype"); - font-style: normal; - font-weight: 800; -} -@font-face { - font-family: Lato; - src: url(../../../fonts/lato/Lato-BlackItalic.ttf) format("truetype"); - font-style: italic; - font-weight: 800; -} -@font-face { - font-family: "Material Icons"; - font-style: normal; - font-weight: 400; - src: url(../../../fonts/material/MaterialIcons-Regular.eot); - /* For IE6-8 */ - src: local("Material Icons"), local("MaterialIcons-Regular"), url(../../../fonts/material/MaterialIcons-Regular.woff2) format("woff2"), url(../../../fonts/material/MaterialIcons-Regular.woff) format("woff"), url(../../../fonts/material/MaterialIcons-Regular.ttf) format("truetype"); -} -*, *::before, *::after { - box-sizing: border-box; - font-family: Lato; - font-size: 16px; - font-weight: 400; -} - -body { - margin: 0 0 100px 0; -} -body.waiting * { - cursor: wait !important; -} - -html { - width: 100%; - min-height: 100%; - font-weight: 300; - background-color: #282828; - color: #BBBBC8; - background-repeat: no-repeat; - background-position: bottom right; - background-size: contain; - background-image: url("../flavor-spikes01-wide.png"); -} - -h1 { - color: #BBBBC8; - font-family: Lato; - font-weight: 300; - font-size: 40px; - text-align: center; -} - -h2 { - color: #BBBBC8; - font-family: Lato; - font-weight: 300; - font-size: 30px; -} - -p { - font-weight: 300; - text-align: center; -} - -header { - padding: 8px; -} -header .logo { - background-image: url("../logo-dark.png"); - background-repeat: no-repeat; - background-size: contain; - height: 80px; - margin: 30px; -} - -.head { - width: 100%; - max-width: 1000px; - margin: auto; -} - -.content form { - margin: auto; - padding: 20px; - width: 100%; - max-width: 500px; -} - -a { - color: #3574C6; - text-decoration: none; - font-weight: 400; -} -a:hover { - color: #5b8fd3; -} -a.tos-link { - font-size: 14px; -} - -button, .button { - background-color: #282828; - color: #3574C6; - border: 1px solid #3574C6; - border-radius: 5px; - width: 100%; - max-width: 600px; - height: 50px; - transition: all 0.3s ease 0s; - cursor: pointer; - outline: none; - display: inline-block; - text-align: center; - line-height: 44px; - padding: 1px 6px; -} -button:hover, .button:hover { - background-color: #5b8fd3; - color: #282828; - border: 1px solid #5b8fd3; -} -button.primary, .button.primary { - background-color: #3574C6; - color: #BBBBC8; - border: none; -} -button.primary:hover, .button.primary:hover { - background-color: #5b8fd3; -} -button:disabled, .button:disabled { - background-color: #999999; - border: 1px solid #999999; -} -button:disabled:hover, .button:disabled:hover { - background-color: #999999; - border: 1px solid #999999; -} -button.google, .button.google { - display: flex; - align-items: center; - position: relative; - padding: 0 1px; - color: #FFFFFF; - background-color: #4285F4; -} -button.google span.logo, .button.google span.logo { - height: 46px; - width: 46px; - background-color: #FFFFFF; - background-image: url("../../../images/idp/google.png"); - background-size: 25px; - background-position: center; - background-repeat: no-repeat; - border-radius: 5px; -} -button.google span.provider-name, .button.google span.provider-name { - position: absolute; - left: 50%; - transform: translateX(-50%); -} - -input:not([type=radio]), select { - background-color: #252525; - color: #BBBBC8; - height: 50px; - border: 1px solid #999999; - border-radius: 5px; - padding-left: 8px; -} - -form button.user-selection .profile-image, .login-profile .profile-image { - height: 80px; - width: 80px; - background-position: center; - background-repeat: no-repeat; - background-size: contain; - background-image: url("../../../images/icon-user-dark.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.user-selection .profile-image, .login-profile .profile-image { - background-image: url("../../../images/icon-user-dark@2x.png"); - background-size: 80px 80px; - } -} -form button.user-selection:hover .profile-image, .login-profile:hover .profile-image { - background-image: url("../../../images/icon-user-dark-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.user-selection:hover .profile-image, .login-profile:hover .profile-image { - background-image: url("../../../images/icon-user-dark-hover@2x.png"); - background-size: 80px 80px; - } -} - -.login-profile .profile-image { - margin-left: auto; - margin-right: auto; -} -.login-profile .names { - padding: 10px 0; - text-align: center; -} -.login-profile .names div:first-of-type { - font-size: 26px; - font-weight: 300; -} -.login-profile .names div:nth-of-type(2) { - font-weight: 300; - font-size: 0.9rem; - font-style: italic; - color: #898989; -} - -form .field { - display: grid; - padding: 10px 0; -} -form .field.radio-button { - display: flex; -} -form .field.radio-button input[type=radio] { - height: 20px; - vertical-align: middle; -} -form .field.radio-button label { - height: 20px; - display: inline-block; - padding: 3px 0 0 15px; - width: 100%; -} -form .field.check-box { - display: flex; -} -form .field.check-box input[type=checkbox] { - height: 16px; - vertical-align: middle; -} -form .field.check-box label { - height: 16px; - text-transform: inherit; - display: inline-block; - padding: 2px 0 0 15px; - width: 100%; - color: #BBBBC8; -} -form label { - color: #898989; - text-transform: uppercase; - font-size: 0.8rem; - margin-bottom: 3px; -} -form label span.optional { - font-style: italic; - text-transform: none; -} -form .actions { - padding: 20px 0; -} -form .actions .right { - float: right; -} -form .actions button, form .actions a { - margin: 10px 0; -} -form button.clean { - border: none; - height: auto; - color: #BBBBC8; - text-align: left; - text-transform: unset; - display: flex; - padding: 15px; -} -form button.clean:hover { - border: none; - background-color: #252525; -} -form button.clean * { - font-weight: 300; -} -form .user-selection-list { - margin-bottom: 40px; -} -form button.user-selection .sessionstate { - display: inline-block; - height: 20px; - width: 20px; - border-radius: 20px; - border-color: #999999; - border-style: solid; - border-width: 1px; - position: absolute; - bottom: 0px; - right: 10px; -} -form button.user-selection .sessionstate.sessionstate-0 { - background-color: #138D00; -} -form button.user-selection .sessionstate.sessionstate-1 { - background-color: #BC372E; -} -form button.user-selection > div { - position: relative; -} -form button.user-selection > div.names { - margin: 0 15px; -} -form button.user-selection > div.names .displayname { - font-size: 1.4rem; -} -form button.user-selection > div.names .loginname { - color: #898989; -} -form button.user-selection:disabled { - background: transparent; - border: none; - cursor: not-allowed; -} -form button.user-selection:disabled .profile-image { - opacity: 0.3; -} -form button.user-selection:disabled .sessionstate { - background-color: #282828; -} -form button.user-selection:disabled .names .displayname, form button.user-selection:disabled .names .loginname { - font-style: italic; - color: #444444; -} -.user-selection + form button.other-user { - margin-top: 80px; -} -form button.other-user .other-user-image { - width: 80px; - height: 60px; - background-repeat: no-repeat; - background-position: center; - background-image: url("../../../images/icon-newuser-dark.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.other-user .other-user-image { - background-image: url("../../../images/icon-newuser-dark@2x.png"); - background-size: 80px 60px; - } -} -form button.other-user:hover .other-user-image { - background-repeat: no-repeat; - background-position: center; - background-image: url("../../../images/icon-newuser-dark-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - form button.other-user:hover .other-user-image { - background-image: url("../../../images/icon-newuser-dark-hover@2x.png"); - background-size: 80px 60px; - } -} -form button.other-user > div:nth-of-type(2) { - margin: 15px; - font-size: 1.4rem; -} -form ul#passwordcomplexity { - display: flex; - flex-wrap: wrap; - padding: 0; - list-style: none; - margin-bottom: 0; -} -form ul#passwordcomplexity li { - flex: 1 0 50%; - display: block; - font-weight: 300; - font-size: 12px; - line-height: 12px; -} -form ul#passwordcomplexity li i { - height: 26px; - padding-right: 10px; - vertical-align: middle; - color: #0DF279; -} -form ul#passwordcomplexity li.invalid i { - color: #F20D6B; -} -form #loginname { - display: flex; -} -form #loginname .loginname-suffix { - padding-left: 5px; - line-height: 50px; -} - -#copy-secret { - visibility: hidden; - position: absolute; -} - -#qrcode { - text-align: center; -} -#qrcode svg rect.color { - fill: #BBBBC8; -} -#qrcode svg rect.bg-color { - fill: #282828; -} - -#secret .copy { - float: right; - cursor: pointer; -} - -footer { - width: 100%; - background-size: cover; - bottom: 0; - z-index: -1; -} - -.material-icons { - font-family: "Material Icons"; - font-weight: normal; - font-style: normal; - font-size: 24px; - /* Preferred icon size */ - display: inline-block; - line-height: 1; - text-transform: none; - letter-spacing: normal; - word-wrap: normal; - white-space: nowrap; - direction: ltr; - /* Support for all WebKit browsers. */ - -webkit-font-smoothing: antialiased; - /* Support for Safari and Chrome. */ - text-rendering: optimizeLegibility; - /* Support for Firefox. */ - -moz-osx-font-smoothing: grayscale; - /* Support for IE. */ - font-feature-settings: "liga"; -} - -.free-tier { - border: 2px solid #F20D6B; - border-radius: 5px; - padding: 10px; -} - -.error { - color: #F20D6B; -} - -.hidden { - display: none; -} - -#wa-error { - margin-top: 20px; -} - -html { - background-color: #f5f5f5; - color: #282828; - background-image: url("../flavor-spikes01-wide.png"); -} -html header .logo { - background-image: url("../logo-light.png"); -} -html h1, html h2 { - color: #282828; -} -html button, html .button { - background-color: #f5f5f5; - color: #3574C6; - border: 1px solid #3574C6; -} -html button:hover, html .button:hover { - background-color: #5b8fd3; - border: 1px solid #5b8fd3; - color: #FFFFFF; -} -html button.primary, html .button.primary { - background-color: #3574C6; - color: #FFFFFF; - border: none; - box-shadow: 0px 10px 30px #3574C6; -} -html button.primary:hover, html .button.primary:hover { - background-color: #5b8fd3; -} -html button:disabled, html .button:disabled { - background-color: #999999; - border: 1px solid #999999; -} -html button:disabled:hover, html .button:disabled:hover { - background-color: #999999; - border: 1px solid #999999; -} -html button.clean, html .button.clean { - color: #282828; -} -html button.clean:hover, html .button.clean:hover { - border: none; - background-color: #FFFFFF; -} -html button.user-selection .profile-image, html .button.user-selection .profile-image { - background-image: url("../../../images/icon-user-light.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - html button.user-selection .profile-image, html .button.user-selection .profile-image { - background-image: url("../../../images/icon-user-light@2x.png"); - background-size: 80px 80px; - } -} -html button.user-selection:hover, html .button.user-selection:hover { - background-color: #FFFFFF; -} -html button.user-selection:hover .profile-image, html .button.user-selection:hover .profile-image { - background-image: url("../../../images/icon-user-light-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - html button.user-selection:hover .profile-image, html .button.user-selection:hover .profile-image { - background-image: url("../../../images/icon-user-light-hover@2x.png"); - background-size: 80px 80px; - } -} -html button.other-user .other-user-image, html .button.other-user .other-user-image { - background-image: url("../../../images/icon-newuser-light.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - html button.other-user .other-user-image, html .button.other-user .other-user-image { - background-image: url("../../../images/icon-newuser-light@2x.png"); - background-size: 80px 60px; - } -} -html button.other-user:hover .other-user-image, html .button.other-user:hover .other-user-image { - background-image: url("../../../images/icon-newuser-light-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - html button.other-user:hover .other-user-image, html .button.other-user:hover .other-user-image { - background-image: url("../../../images/icon-newuser-light-hover@2x.png"); - background-size: 80px 60px; - } -} -html button.google, html .button.google { - color: #8b8d8d; - background-color: #FFFFFF; -} -html button.google span.logo, html .button.google span.logo { - background-image: url("../../../images/idp/google.png"); -} -html input:not([type=radio]), html select { - background-color: #FFFFFF; - color: #282828; -} -html #qrcode svg rect.color { - fill: #282828; -} -html #qrcode svg rect.bg-color { - fill: #f5f5f5; -} -form .field.check-box label { - color: #282828; -} -form ul#passwordcomplexity li i { - color: #50CA3D; -} -form ul#passwordcomplexity li.invalid i { - color: #F20D6B; -} - -.login-profile .profile-image, form button.user-selection .profile-image { - background-image: url("../../../images/icon-user-light.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - .login-profile .profile-image, form button.user-selection .profile-image { - background-image: url("../../../images/icon-user-light@2x.png"); - background-size: 80px 80px; - } -} -.login-profile:hover .profile-image, form button.user-selection:hover .profile-image { - background-image: url("../../../images/icon-user-light-hover.png"); -} -@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { - .login-profile:hover .profile-image, form button.user-selection:hover .profile-image { - background-image: url("../../../images/icon-user-light-hover@2x.png"); - background-size: 80px 80px; - } -} - -.free-tier { - border: 2px solid #F20D6B; -} - -.error { - color: #F20D6B; -} - -/*# sourceMappingURL=light.css.map */ diff --git a/internal/ui/login/static/resources/themes/zitadel/css/light.css.map b/internal/ui/login/static/resources/themes/zitadel/css/light.css.map deleted file mode 100644 index ab57d44c72..0000000000 --- a/internal/ui/login/static/resources/themes/zitadel/css/light.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sourceRoot":"","sources":["../../scss/fonts.scss","../../scss/main.scss","../../scss/variables.scss","../../scss/light.scss"],"names":[],"mappings":"AACA;EACI;EACA;;AAIJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;AAA6D;EAC7D;;AC5EJ;EACI;EACA,aCHW;EDIX;EACA;;;AAGJ;EACI;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA,kBCIc;EDHd,OCIQ;EDHR;EACA;EACA;EAEI;;;AAIR;EACI,OCNQ;EDOR,aC/BS;EDgCT;EACA,WC7BS;ED8BT;;;AAGJ;EACI,OCdQ;EDeR,aCvCS;EDwCT;EACA,WCpCU;;;ADuCd;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI,OClDW;EDmDX;EACA;;AAEA;EACI,OCtDY;;ADyDhB;EACI;;;AAIR;EACI,kBClEc;EDmEd,OCjEW;EDkEX;EACA;EACA;EACA;EACA,QC5FU;ED6FV;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI,kBC/EY;EDgFZ,OCnFU;EDoFV;;AAGJ;EACI,kBCtFO;EDuFP,OCxFI;EDyFJ;;AACA;EACI,kBCzFQ;;AD6FhB;EACI,kBC5FW;ED6FX;;AAEA;EACI,kBChGO;EDiGP;;AAIR;EACI;EACA;EACA;EACA;EACA,OCpGa;EDqGb,kBCpGmB;;ADsGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAOZ;EACI,kBClImB;EDmInB,OCxIQ;EDyIR,QC9JU;ED+JV;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EACA;EC9JN;;AACA;EDwJE;ICvJA;IACA;;;AD+JA;EClKF;;AACA;EDiKE;IChKA;IACA;;;;ADsKA;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,WC5LE;ED6LF;;AAGJ;EACI;EACA;EACA;EACA,OC/KC;;;ADqLT;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA,OC3NA;;AD+NR;EACI,OC7NK;ED8NL;EACA;EACA;;AAEA;EACI;EACA;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,OC1PI;ED2PJ;EACA;EACA;EACA;;AAEA;EACI;EACA,kBC7PW;;ADgQf;EACI;;AAIR;EACI;;AAMA;EACI;EACA;EACA;EACA;EACA,cClRO;EDmRP;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAKR;EACI;;AAEA;EACI;;AAEA;EACI;;AAEJ;EACI,OC9SP;;ADmTL;EACI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI,kBCjUE;;ADqUF;EACI;EACA;;AAOZ;EACI;;AAEJ;EACI;EACA;EACA;EACA;EC7VV;;AACA;EDwVM;ICvVJ;IACA;;;AD+VQ;EACI;EACA;ECpWd;;AACA;EDiWU;IChWR;IACA;;;ADsWI;EACI;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA,OC3WN;;ADgXE;EACI,OClXL;;ADuXP;EACI;;AACA;EACI;EACA;;;AAKZ;EACI;EACA;;;AAGJ;EACI;;AAEA;EACI,MCrZI;;ADwZR;EACI,MC1ZU;;;AD+Zd;EACI;EACA;;;AAIR;EAII;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;AAAkB;EAClB;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;AACA;EACA;AAEA;EACA;AAEA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI,OClcO;;;ADqcX;EACI;;;AAGJ;EACI;;;AE/eJ;EACI,kBD2CmB;EC1CnB,ODsBc;ECpBV;;AAGJ;EACI;;AAGJ;EACI,ODYU;;ACTd;EACI,kBD4Be;EC3Bf,ODSO;ECRP;;AAEA;EACI,kBD0Ba;ECzBb;EACA,ODyBgB;;ACtBpB;EACI,kBDDG;ECEH,ODoBgB;ECnBhB;EACA;;AACA;EACI,kBDLI;;ACSZ;EACI,kBDRO;ECSP;;AAEA;EACI,kBDZG;ECaH;;AAIR;EACI,ODvBM;;ACyBN;EACI;EACA,kBDHY;;ACQhB;EDxCV;;AACA;ECuCU;IDtCR;IACA;;;ACyCQ;EACI,kBDbY;;ACeZ;ED/Cd;;AACA;EC8Cc;ID7CZ;IACA;;;ACmDQ;EDtDV;;AACA;ECqDU;IDpDR;IACA;;;ACwDY;ED3Dd;;AACA;EC0Dc;IDzDZ;IACA;;;AC8DI;EACI,OD7Bc;EC8Bd,kBD7BoB;;AC+BpB;EACI;;AAKZ;EACI,kBD5CoB;EC6CpB,ODrEU;;ACyEV;EACI,MD1EM;;AC6EV;EACI,MD1DW;;ACsEnB;EACI,OD3FU;;AC+Fb;EACI,ODhEM;;ACoEN;EACI,ODtEG;;;AC8EZ;EDrHF;;AACA;ECoHE;IDnHA;IACA;;;ACsHA;EDzHF;;AACA;ECwHE;IDvHA;IACA;;;;AC2HJ;EACI;;;AAGJ;EACI,OD5FY","file":"light.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/css/main.css b/internal/ui/login/static/resources/themes/zitadel/css/main.css new file mode 100644 index 0000000000..9101ba81a7 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/css/main.css @@ -0,0 +1,22 @@ +body { + margin: 0 auto; + display: flex; + flex-direction: column; + height: 100vh; +} +body .lgn-grow { + flex: 1; +} +body.waiting * { + cursor: wait !important; +} + +.hidden { + display: none !important; +} + +.text-align-center { + text-align: center; +} + +/*# sourceMappingURL=main.css.map */ diff --git a/internal/ui/login/static/resources/themes/zitadel/css/main.css.map b/internal/ui/login/static/resources/themes/zitadel/css/main.css.map new file mode 100644 index 0000000000..56b37b0359 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/css/main.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../scss/main.scss"],"names":[],"mappings":"AAAA;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;;AAIR;EACI;;;AAGJ;EACI","file":"main.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/css/zitadel.css b/internal/ui/login/static/resources/themes/zitadel/css/zitadel.css new file mode 100644 index 0000000000..318ea5e852 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/css/zitadel.css @@ -0,0 +1,1913 @@ +@charset "UTF-8"; +footer { + width: 100%; + box-sizing: border-box; + background: #00000020; + min-height: 50px; + display: flex; + align-items: center; + padding: 0 1rem; +} +footer .fill-space { + flex: 1; +} +footer a { + font-size: 12px; + margin-left: 1rem; +} +@media only screen and (min-width: 600px) { + footer { + position: fixed; + bottom: 0; + left: 0; + right: 0; + } +} + +.lgn-header { + display: block; + position: relative; + margin: 1rem auto 0.5rem auto; + padding: 0; + width: 100%; +} +.lgn-header .lgn-logo { + height: 43px; + width: 160px; + margin: 0 auto; +} + +.lgn-button, .lgn-stroked-button, .lgn-icon-button { + box-sizing: border-box; + position: relative; + cursor: pointer; + outline: none; + border: none; + -webkit-tap-highlight-color: transparent; + display: inline-block; + white-space: nowrap; + text-decoration: none; + vertical-align: baseline; + text-align: center; + margin: 0; + min-width: 64px; + line-height: 36px; + padding: 0 16px; + border-radius: 6px; + overflow: visible; +} +.lgn-button[disabled], .lgn-stroked-button[disabled], .lgn-icon-button[disabled] { + cursor: default; +} +.lgn-button::-moz-focus-inner, .lgn-stroked-button::-moz-focus-inner, .lgn-icon-button::-moz-focus-inner { + border: 0; +} + +.lgn-raised-button { + box-sizing: border-box; + position: relative; + cursor: pointer; + outline: none; + border: none; + -webkit-tap-highlight-color: transparent; + display: inline-block; + white-space: nowrap; + text-decoration: none; + vertical-align: baseline; + text-align: center; + margin: 0; + min-width: 64px; + line-height: 36px; + padding: 0 16px; + border-radius: 6px; + overflow: visible; + transform: translate3d(0, 0, 0); +} +.lgn-raised-button[disabled] { + cursor: default; +} +.lgn-raised-button::-moz-focus-inner { + border: 0; +} + +.lgn-icon-button { + padding: 0; + min-width: 0; + width: 40px; + height: 40px; + flex-shrink: 0; + line-height: 40px; + border-radius: 50%; +} +.lgn-icon-button i, .lgn-icon-button .mat-icon { + line-height: 24px; +} + +.lgn-stroked-button { + border: 1px solid currentColor; + padding: 0 15px; + line-height: 34px; +} + +.lgn-button:focus { + pointer-events: none; + transition: opacity 200ms cubic-bezier(0.35, 0, 0.25, 1), background-color 200ms cubic-bezier(0.35, 0, 0.25, 1); +} + +.lgn-button *, .lgn-stroked-button *, .lgn-raised-button * { + vertical-align: middle; +} + +input:not([type=radio]):not([type=checkbox]), +.lgn-input { + display: block; + box-sizing: border-box; + padding-inline-start: 10px; + outline: none; + display: inline-block; + text-align: start; + cursor: text; + border-radius: 4px; + transform: all 0.2 linear; + font-size: 1rem; + border-style: solid; + border-width: 1px; + height: 40px; + padding: 10px; + transition: border-color 0.2s ease-in-out; + width: 100%; + margin: 0 0 2px 0; +} +input:not([type=radio]):not([type=checkbox])::placeholder, +.lgn-input::placeholder { + font-size: 14px; + font-style: italic; +} + +select, .lgn-select { + display: block; + box-sizing: border-box; + padding-inline-start: 10px; + outline: none; + display: inline-block; + text-align: start; + cursor: text; + border-radius: 4px; + transform: all 0.2 linear; + font-size: 1rem; + border-style: solid; + border-width: 1px; + height: 40px; + padding: 10px; + transition: border-color 0.2s ease-in-out; + width: 100%; + margin: 0 0 2px 0; +} +select::placeholder, .lgn-select::placeholder { + font-size: 14px; + font-style: italic; +} + +.lgn-suffix-wrapper { + position: relative; +} +.lgn-suffix-wrapper [lgnSuffix] { + position: absolute; + right: 0.5rem; + top: 9px; + height: inherit; + vertical-align: middle; +} + +.lgn-label { + display: block; + font-size: 12px; + transition: color 0.2s ease; + margin: 0 0 2px 0; + font-weight: 400; +} + +@keyframes ripple { + 0% { + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0); + } + 50% { + box-shadow: 0 0 0 15px rgba(0, 0, 0, 0.1); + } + 100% { + box-shadow: 0 0 0 15px rgba(0, 0, 0, 0); + } +} +.lgn-radio { + outline: none; + margin: 16px 0; + display: inline-block; +} +.lgn-radio.block { + display: block; +} +.lgn-radio label { + display: inline-block; + height: 20px; + position: relative; + padding: 0 0 0 30px; + margin-bottom: 0; + cursor: pointer; + vertical-align: middle; + padding-top: 2px; + outline: none; + font-size: 14px; + line-height: 16px; +} +.lgn-radio label::before, .lgn-radio label::after { + position: absolute; + content: ""; + border-radius: 50%; + transition: all 0.3s ease; + transition-property: transform, border-color; +} +.lgn-radio label::before { + left: 0; + top: 0; + width: 20px; + height: 20px; + border-width: 2px; + border-style: solid; +} +.lgn-radio label::after { + top: 5px; + left: 5px; + width: 10px; + height: 10px; + transform: scale(0); +} +.lgn-radio input[type=radio] { + opacity: 0; + margin: 0; + width: 0; + height: 0; + outline: none; +} +.lgn-radio input[type=radio]:checked + label::before { + animation: ripple 0.2s linear forwards; +} +.lgn-radio input[type=radio]:checked + label::after { + transform: scale(1); +} +.lgn-radio input[type=radio]:focus + label { + opacity: 1; +} +.lgn-radio input[type=radio]:disabled + label { + cursor: not-allowed; + font-style: italic; +} +.lgn-radio input[type=radio]:disabled:focus { + opacity: 0; +} +.lgn-radio *, +.lgn-radio *::before, +.lgn-radio *::after { + box-sizing: border-box; +} + +a { + text-decoration: none; + outline: none; + cursor: pointer; + margin: 2px 0; +} +a.block { + display: block; +} + +.lgn-idp { + display: block; + margin: 0.5rem 0; + box-sizing: border-box; + display: flex; + align-items: center; + position: relative; + padding: 0 1px; + border-radius: 0.5rem; + border-width: 1px; + border-style: solid; +} +.lgn-idp span.logo { + height: 46px; + width: 46px; +} +.lgn-idp span.provider-name { + line-height: 36px; + position: absolute; + left: 50%; + transform: translateX(-50%); +} +.lgn-idp.google span.logo { + height: 46px; + width: 46px; + background-image: url("../../../images/idp/google.png"); + background-size: 25px; + background-position: center; + background-repeat: no-repeat; + border-radius: 5px; +} + +.lgn-error { + display: flex; + align-items: center; + outline: none; +} +.lgn-error i { + margin-right: 0.5rem; + font-size: 1.5rem; +} + +.lgn-qrcode { + display: block; + margin: auto; + margin: 1rem 0; + margin-bottom: 1.5rem; +} +.lgn-qrcode svg { + margin: auto; + display: block; + border-radius: 0.5rem; +} + +.lgn-max-width-wrapper { + max-width: 400px; + margin: auto; + margin-top: 50px; + margin-bottom: 50px; + display: block; +} +@media only screen and (min-width: 600px) { + .lgn-max-width-wrapper { + margin-top: 100px; + } +} + +.content-container { + position: relative; + display: block; + margin: 0 auto 0 auto; + padding: 20px; + width: 100%; + box-sizing: border-box; +} +.content-container .lgn-head h1 { + text-align: center; +} +.content-container .lgn-head p { + text-align: center; +} +.content-container .lgn-actions { + display: flex; + align-items: center; + padding: 0.5rem 0; + margin-top: 1rem; +} +.content-container .lgn-actions.lgn-reverse-order { + flex-direction: row-reverse; +} +.content-container .lgn-actions .fill-space { + flex: 1; +} +.content-container .lgn-row { + display: flex; + align-items: center; + padding: 0; +} +.content-container .lgn-row.lgn-reverse-order { + flex-direction: row-reverse; +} +.content-container .lgn-row .fill-space { + flex: 1; +} +.content-container .lgn-login-profile { + margin-bottom: 0.5rem; +} +.content-container .lgn-login-profile .lgn-profile-image { + display: block; + margin: 0.5rem; +} +.content-container .lgn-login-profile .lgn-names { + border-width: 1px; + border-style: solid; + border-radius: 50vw; + display: flex; + align-items: center; +} +.content-container .lgn-login-profile .lgn-names .inline-block { + display: inline-block; + margin: 0 2px; +} +.content-container .lgn-login-profile .lgn-names .lgn-displayname { + margin: 0.5rem 1rem; +} +.content-container .lgn-login-profile .lgn-names .lgn-loginname p { + margin: 0.5rem 1rem; +} +.content-container .lgn-left-action { + position: absolute; + left: 1rem; + top: -40px; +} +.content-container .lgn-register-options { + display: flex; + flex-direction: column; +} +.content-container .lgn-mfa-other { + display: flex; + flex-direction: column; +} +.content-container .lgn-mfa-other button { + width: 100%; + margin: 0.5rem 0; +} + +i { + font-size: 1.2rem; +} + +.lgn-account-selection { + display: flex; + flex-direction: column; + width: 100%; +} +.lgn-account-selection .lgn-account { + display: flex; + align-items: center; + border: none; + outline: none; +} +.lgn-account-selection .lgn-account .left { + padding: 0.5rem 1rem; +} +.lgn-account-selection .lgn-account .lgn-names { + display: block; + margin: 0.5rem; + text-align: start; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-displayname { + font-size: 16px; + margin: 0.5rem 0; + margin-bottom: 0; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-loginname { + font-size: 14px; + margin: 0; +} +.lgn-account-selection .lgn-account .lgn-names .lgn-session-state { + margin: 0; + font-size: 14px; + margin-bottom: 0.5rem; +} +.lgn-account-selection .lgn-account .fill-space { + flex: 1; +} +.lgn-account-selection .lgn-account i { + font-size: 1.2rem; +} + +.lgn-avatar { + height: 32px; + width: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + text-transform: uppercase; + box-sizing: border-box; + letter-spacing: 0.05em; + font-size: 14px; + outline: none; + font-weight: bold; +} + +.lgn-checkbox { + display: inline-block; + position: relative; + margin: 0 0 10px; + font-size: 14px; + line-height: 24px; + box-sizing: inherit; +} +.lgn-checkbox input[type=checkbox] { + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + opacity: 0; + z-index: 0; + box-sizing: inherit; +} +.lgn-checkbox label { + display: block; + padding: 0 0 0 30px; + cursor: pointer; + box-sizing: inherit; + font-size: 14px; + line-height: 28px; +} +.lgn-checkbox label:before { + content: ""; + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + border-radius: 2px; + transition: all 0.28s cubic-bezier(0.4, 0, 0.2, 1); + transition-property: background-color, border-color; +} +.lgn-checkbox label:after { + content: ""; + position: absolute; + top: 5px; + left: 5px; + width: 6px; + height: 12px; + transform: rotate(45deg); + transition: border-color 0.28s cubic-bezier(0.4, 0, 0.2, 1); +} + +.lgn-select, select { + background-position: right 10px center; + background-repeat: no-repeat; + background-size: auto 50%; + color: white; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; +} +.lgn-select::-ms-expand, select::-ms-expand { + display: none; +} + +.lgn-list.lgn-policy, ul.lgn-policy { + display: flex; + flex-wrap: wrap; +} +.lgn-list.lgn-policy li, ul.lgn-policy li { + flex: 1 0 50%; +} +.lgn-list li, ul li { + display: flex; + align-items: center; + list-style: none; + margin: 4px 0; + font-style: italic; +} +.lgn-list li i, ul li i { + margin: 0 0.5rem; + font-size: 20px; +} +.lgn-list:not(.lgn-no-dots) li::before, ul:not(.lgn-no-dots) li::before { + content: "•"; + font-weight: bold; + display: inline-block; + width: 20px; + margin-left: -20px; + font-style: normal; +} +.lgn-list.lgn-no-dots, ul.lgn-no-dots { + list-style-type: none; + padding-inline-start: 0; +} + +@font-face { + font-family: Aileron; + src: url(../../../fonts/ailerons/ailerons.otf) format("opentype"); +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Lato; + src: url(../../../fonts/lato/Lato-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 800; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 900; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Medium.ttf) format("truetype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-MediumItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Roboto; + src: url(../../../fonts/Roboto/Roboto-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Black.ttf) format("truetype"); + font-style: normal; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BlackItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 900; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBold.ttf) format("truetype"); + font-style: normal; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraBoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 800; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLight.ttf) format("truetype"); + font-style: normal; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ExtraLightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 200; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Light.ttf) format("truetype"); + font-style: normal; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-LightItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 300; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Medium.ttf) format("truetype"); + font-style: normal; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-MediumItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 500; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBold.ttf) format("truetype"); + font-style: normal; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-SemiBoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 600; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-Thin.ttf) format("truetype"); + font-style: normal; + font-weight: 100; +} +@font-face { + font-family: Raleway; + src: url(../../../fonts/Raleway/Raleway-ThinItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 100; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Bold.ttf) format("truetype"); + font-style: normal; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-BoldItalic.ttf) format("truetype"); + font-style: italic; + font-weight: 700; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Italic.ttf) format("truetype"); + font-style: italic; + font-weight: 400; +} +@font-face { + font-family: PTSans; + src: url(../../../fonts/PT_Sans/PTSans-Regular.ttf) format("truetype"); + font-style: normal; + font-weight: 400; +} +.lgn-success-label { + color: #0e6245; + background: #cbf4c9; + border-radius: 0.5rem; + padding: 0.5rem; +} + +h1, .lgn-headline, .lgn-typography h1 { + font: 400 24px/32px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; + margin: 0 0 16px; +} + +h2, .lgn-title, .lgn-typography h2 { + font: 500 20px/32px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; + margin: 0 0 16px; +} + +h3, .lgn-subheading-2, .lgn-typography h3 { + font: 400 16px/28px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; + margin: 0 0 16px; +} + +h4, .lgn-subheading-1, .lgn-typography h4 { + font: 400 15px/24px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; + margin: 0 0 16px; +} + +.lgn-body-strong, .lgn-body-2 { + font: 500 14px/24px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; +} + +p, .lgn-body, .lgn-body-1, .lgn-typography { + font: 400 14px/20px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; +} +p p, .lgn-body p, .lgn-body-1 p, .lgn-typography p { + margin: 0 0 12px; +} + +button, .lgn-button, .lgn-raised-button, .lgn-stroked-button { + font: 500 14px/36px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; +} + +span { + font: 400 14px/20px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; +} + +a, .lgn-a { + font: 400 14px/20px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; +} + +small .lgn-small, .lgn-caption { + font: 400 12px/20px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; +} + +label, .lgn-label, .lgn-typography .lgn-label, .lgn-typography label { + font: 400 12px/20px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; + margin: 0 0 2px 0; +} + +.lgn-display-4, .lgn-typography .lgn-display-4 { + font: 300 112px/112px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: -0.05em; + margin: 0 0 56px; +} + +.lgn-display-3, .lgn-typography .lgn-display-3 { + font: 400 56px/56px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: -0.02em; + margin: 0 0 64px; +} + +.lgn-display-2, .lgn-typography .lgn-display-2 { + font: 400 45px/48px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: -0.005em; + margin: 0 0 64px; +} + +.lgn-display-1, .lgn-typography .lgn-display-1 { + font: 400 34px/40px Lato, -apple-system, BlinkMacSystemFont, sans-serif; + letter-spacing: normal; + margin: 0 0 64px; +} + +.lgn-app-background { + background-color: #212224; + color: white; +} + +.lgn-theme-loaded-marker { + display: none; +} + +.lgn-logo { + background: url("../logo-light.svg") no-repeat; + background-position: auto; + background-size: contain; +} + +.lgn-button, +.lgn-stroked-button, +.lgn-icon-button { + color: inherit; + background: transparent; +} +.lgn-button.lgn-primary, +.lgn-stroked-button.lgn-primary, +.lgn-icon-button.lgn-primary { + color: #5282c1; +} +.lgn-button.lgn-accent, +.lgn-stroked-button.lgn-accent, +.lgn-icon-button.lgn-accent { + color: #5282c1; +} +.lgn-button.lgn-warn, +.lgn-stroked-button.lgn-warn, +.lgn-icon-button.lgn-warn { + color: #f44336; +} +.lgn-button.lgn-primary[disabled], .lgn-button.lgn-accent[disabled], .lgn-button.lgn-warn[disabled], .lgn-button[disabled][disabled], +.lgn-stroked-button.lgn-primary[disabled], +.lgn-stroked-button.lgn-accent[disabled], +.lgn-stroked-button.lgn-warn[disabled], +.lgn-stroked-button[disabled][disabled], +.lgn-icon-button.lgn-primary[disabled], +.lgn-icon-button.lgn-accent[disabled], +.lgn-icon-button.lgn-warn[disabled], +.lgn-icon-button[disabled][disabled] { + color: rgba(255, 255, 255, 0.3); +} + +.lgn-button:focus, +.lgn-stroked-button:focus, +.lgn-raised-button:focus { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} + +.lgn-stroked-button:not([disabled]) { + border-color: rgba(255, 255, 255, 0.12); +} + +.lgn-button.lgn-primary { + color: #5282c1; +} +.lgn-button.lgn-accent { + color: #5282c1; +} +.lgn-button.lgn-warn { + color: #f44336; +} +.lgn-button.lgn-primary[disabled], .lgn-button.lgn-accent[disabled], .lgn-button.lgn-warn[disabled], .lgn-button[disabled][disabled] { + color: rgba(255, 255, 255, 0.3); +} +.lgn-button:hover { + background-color: rgba(82, 130, 193, 0.1); +} +.lgn-button:focus { + background-color: rgba(82, 130, 193, 0.2); +} +.lgn-button:active { + background-color: rgba(82, 130, 193, 0.25); +} + +.lgn-raised-button { + color: white; + background-color: #424242; +} +.lgn-raised-button.lgn-primary { + color: white; +} +.lgn-raised-button.lgn-accent { + color: white; +} +.lgn-raised-button.lgn-warn { + color: white; +} +.lgn-raised-button.lgn-primary[disabled], .lgn-raised-button.lgn-accent[disabled], .lgn-raised-button.lgn-warn[disabled], .lgn-raised-button[disabled][disabled] { + color: rgba(255, 255, 255, 0.3); +} +.lgn-raised-button.lgn-primary { + background-color: #5282c1; +} +.lgn-raised-button.lgn-accent { + background-color: #5282c1; +} +.lgn-raised-button.lgn-warn { + background-color: #f44336; +} +.lgn-raised-button.lgn-primary[disabled], .lgn-raised-button.lgn-accent[disabled], .lgn-raised-button.lgn-warn[disabled], .lgn-raised-button[disabled][disabled] { + background-color: rgba(255, 255, 255, 0.12); +} +.lgn-raised-button:active { + background-color: rgba(82, 130, 193, 0.8); +} + +.lgn-button, +.lgn-stroked-button { + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); +} + +.lgn-raised-button { + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} +.lgn-raised-button:not([disabled]):active { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.lgn-raised-button[disabled] { + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); +} + +.lgn-input:not([disabled]), +select:not([disabled]), .lgn-select:not([disabled]) { + border-color: #403e3e; +} + +.lgn-input, +select, .lgn-select { + color: white; + background-color: rgba(0, 0, 0, 0.2); +} +.lgn-input:hover, +select:hover, .lgn-select:hover { + border-color: #aeafb1; +} +.lgn-input:active, +select:active, .lgn-select:active { + border-color: #5282c1; +} +.lgn-input:focus, +select:focus, .lgn-select:focus { + border-color: #5282c1; +} +.lgn-input[color=warn], +select[color=warn], .lgn-select[color=warn] { + border-color: #f44336; +} + +.lgn-input::placeholder, +select::placeholder, +.lgn-select::placeholder { + color: #757575; +} + +label::before { + border-color: #403e3e; +} +label::after { + background: #5282c1; +} + +input[type=radio] { + opacity: 0; +} +input[type=radio]:checked + label::before { + border-color: #5282c1; +} +input[type=radio]:focus + label { + opacity: 1; + outline: none; +} +input[type=radio]:disabled + label::before { + border-color: rgba(255, 255, 255, 0.12); +} +input[type=radio]:disabled:focus { + opacity: 0; +} + +input[type=checkbox] { + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + opacity: 0; + z-index: 0; +} + +.lgn-checkbox label:before { + background-color: transparent; + border: 2px solid #403e3e; +} +.lgn-checkbox label:after { + border-bottom: 2px solid transparent; + border-right: 2px solid transparent; + background: transparent; +} + +input[type=checkbox]:checked + label:before { + background-color: #5282c1; + border-color: #5282c1; +} +input[type=checkbox]:checked + label:after { + border-color: #fff; +} + +.lgn-label { + color: #757575; +} + +footer { + background-color: #212224; + border-top: 1px solid #303131; +} +a { + color: #5282c1; +} +a:hover, a:active { + color: #6992c9; +} + +.lgn-error { + color: #f44336; +} + +.lgn-qrcode svg { + background: white; +} +.lgn-qrcode svg rect.color { + fill: black; +} +.lgn-qrcode svg rect.bg-color { + fill: white; +} + +.lgn-error .lgn-error-message { + color: #f44336; +} + +.lgn-login-profile .lgn-names { + border-color: rgba(255, 255, 255, 0.12); +} + +.lgn-account-selection { + display: flex; + flex-direction: column; + width: 100%; +} +.lgn-account-selection .lgn-account { + color: inherit; + background: transparent; + box-shadow: inset 0 -1px #303131; + cursor: pointer; +} +.lgn-account-selection .lgn-account:hover { + background-color: rgba(255, 255, 255, 0.02); +} +.lgn-account-selection .lgn-account:focus { + background-color: rgba(255, 255, 255, 0.05); +} +.lgn-account-selection .lgn-account:active { + background-color: rgba(255, 255, 255, 0.05); +} +.lgn-account-selection .lgn-account .lgn-loginname { + font-size: 14px; + color: #757575; +} +.lgn-account-selection .lgn-account .lgn-session-state { + color: #757575; +} +.lgn-account-selection .lgn-account .lgn-session-state.i0 { + color: #85d996; +} +.lgn-account-selection .lgn-account .lgn-session-state.i1 { + color: #f44336; +} + +.lgn-avatar:not(.transparent) { + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} +.lgn-avatar:not(.transparent).lgn-primary { + background-color: #5282c1; +} +.lgn-avatar:not(.transparent).lgn-accent { + background-color: #5282c1; +} +.lgn-avatar:not(.transparent).lgn-warn { + background-color: #f44336; +} +.lgn-avatar:not(.transparent).lgn-primary[disabled], .lgn-avatar:not(.transparent).lgn-accent[disabled], .lgn-avatar:not(.transparent).lgn-warn[disabled], .lgn-avatar:not(.transparent)[disabled][disabled] { + background-color: rgba(255, 255, 255, 0.12); +} + +.lgn-avatar .initials.lgn-primary { + color: white; +} +.lgn-avatar .initials.lgn-accent { + color: white; +} +.lgn-avatar .initials.lgn-warn { + color: white; +} +.lgn-avatar .initials.lgn-primary[disabled], .lgn-avatar .initials.lgn-accent[disabled], .lgn-avatar .initials.lgn-warn[disabled], .lgn-avatar .initials[disabled][disabled] { + color: rgba(255, 255, 255, 0.3); +} + +.lgn-select, select { + background-image: url("../select_arrow_dark.svg"); +} + +.lgn-list li::before, ul li::before { + color: #5282c1; +} +.lgn-list li i.lgn-warn, ul li i.lgn-warn { + color: #f44336; +} +.lgn-list li i.lgn-valid, ul li i.lgn-valid { + color: #85d996; +} + +.lgn-idp { + border-color: rgba(255, 255, 255, 0.12); + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); +} +.lgn-idp:not([disabled]):active { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.lgn-idp.google { + color: #8b8d8d; + background-color: white; +} + +.lgn-success-label { + color: #cbf4c9; + background-color: #4f566b; +} + +.lgn-dark-theme .lgn-app-background, .lgn-dark-theme.lgn-app-background { + background-color: #212224; + color: white; +} +.lgn-theme-loaded-marker { + display: none; +} + +.lgn-dark-theme .lgn-logo { + background: url("../logo-light.svg") no-repeat; + background-position: auto; + background-size: contain; +} +.lgn-dark-theme .lgn-button, +.lgn-dark-theme .lgn-stroked-button, +.lgn-dark-theme .lgn-icon-button { + color: inherit; + background: transparent; +} +.lgn-dark-theme .lgn-button.lgn-primary, +.lgn-dark-theme .lgn-stroked-button.lgn-primary, +.lgn-dark-theme .lgn-icon-button.lgn-primary { + color: #5282c1; +} +.lgn-dark-theme .lgn-button.lgn-accent, +.lgn-dark-theme .lgn-stroked-button.lgn-accent, +.lgn-dark-theme .lgn-icon-button.lgn-accent { + color: #5282c1; +} +.lgn-dark-theme .lgn-button.lgn-warn, +.lgn-dark-theme .lgn-stroked-button.lgn-warn, +.lgn-dark-theme .lgn-icon-button.lgn-warn { + color: #f44336; +} +.lgn-dark-theme .lgn-button.lgn-primary[disabled], .lgn-dark-theme .lgn-button.lgn-accent[disabled], .lgn-dark-theme .lgn-button.lgn-warn[disabled], .lgn-dark-theme .lgn-button[disabled][disabled], +.lgn-dark-theme .lgn-stroked-button.lgn-primary[disabled], +.lgn-dark-theme .lgn-stroked-button.lgn-accent[disabled], +.lgn-dark-theme .lgn-stroked-button.lgn-warn[disabled], +.lgn-dark-theme .lgn-stroked-button[disabled][disabled], +.lgn-dark-theme .lgn-icon-button.lgn-primary[disabled], +.lgn-dark-theme .lgn-icon-button.lgn-accent[disabled], +.lgn-dark-theme .lgn-icon-button.lgn-warn[disabled], +.lgn-dark-theme .lgn-icon-button[disabled][disabled] { + color: rgba(255, 255, 255, 0.3); +} +.lgn-dark-theme .lgn-button:focus, +.lgn-dark-theme .lgn-stroked-button:focus, +.lgn-dark-theme .lgn-raised-button:focus { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.lgn-dark-theme .lgn-stroked-button:not([disabled]) { + border-color: rgba(255, 255, 255, 0.12); +} +.lgn-dark-theme .lgn-button.lgn-primary { + color: #5282c1; +} +.lgn-dark-theme .lgn-button.lgn-accent { + color: #5282c1; +} +.lgn-dark-theme .lgn-button.lgn-warn { + color: #f44336; +} +.lgn-dark-theme .lgn-button.lgn-primary[disabled], .lgn-dark-theme .lgn-button.lgn-accent[disabled], .lgn-dark-theme .lgn-button.lgn-warn[disabled], .lgn-dark-theme .lgn-button[disabled][disabled] { + color: rgba(255, 255, 255, 0.3); +} +.lgn-dark-theme .lgn-button:hover { + background-color: rgba(82, 130, 193, 0.1); +} +.lgn-dark-theme .lgn-button:focus { + background-color: rgba(82, 130, 193, 0.2); +} +.lgn-dark-theme .lgn-button:active { + background-color: rgba(82, 130, 193, 0.25); +} +.lgn-dark-theme .lgn-raised-button { + color: white; + background-color: #424242; +} +.lgn-dark-theme .lgn-raised-button.lgn-primary { + color: white; +} +.lgn-dark-theme .lgn-raised-button.lgn-accent { + color: white; +} +.lgn-dark-theme .lgn-raised-button.lgn-warn { + color: white; +} +.lgn-dark-theme .lgn-raised-button.lgn-primary[disabled], .lgn-dark-theme .lgn-raised-button.lgn-accent[disabled], .lgn-dark-theme .lgn-raised-button.lgn-warn[disabled], .lgn-dark-theme .lgn-raised-button[disabled][disabled] { + color: rgba(255, 255, 255, 0.3); +} +.lgn-dark-theme .lgn-raised-button.lgn-primary { + background-color: #5282c1; +} +.lgn-dark-theme .lgn-raised-button.lgn-accent { + background-color: #5282c1; +} +.lgn-dark-theme .lgn-raised-button.lgn-warn { + background-color: #f44336; +} +.lgn-dark-theme .lgn-raised-button.lgn-primary[disabled], .lgn-dark-theme .lgn-raised-button.lgn-accent[disabled], .lgn-dark-theme .lgn-raised-button.lgn-warn[disabled], .lgn-dark-theme .lgn-raised-button[disabled][disabled] { + background-color: rgba(255, 255, 255, 0.12); +} +.lgn-dark-theme .lgn-raised-button:active { + background-color: rgba(82, 130, 193, 0.8); +} +.lgn-dark-theme .lgn-button, +.lgn-dark-theme .lgn-stroked-button { + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); +} +.lgn-dark-theme .lgn-raised-button { + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} +.lgn-dark-theme .lgn-raised-button:not([disabled]):active { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.lgn-dark-theme .lgn-raised-button[disabled] { + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); +} +.lgn-dark-theme .lgn-input:not([disabled]), +.lgn-dark-theme select:not([disabled]), .lgn-dark-theme .lgn-select:not([disabled]) { + border-color: #403e3e; +} +.lgn-dark-theme .lgn-input, +.lgn-dark-theme select, .lgn-dark-theme .lgn-select { + color: white; + background-color: rgba(0, 0, 0, 0.2); +} +.lgn-dark-theme .lgn-input:hover, +.lgn-dark-theme select:hover, .lgn-dark-theme .lgn-select:hover { + border-color: #aeafb1; +} +.lgn-dark-theme .lgn-input:active, +.lgn-dark-theme select:active, .lgn-dark-theme .lgn-select:active { + border-color: #5282c1; +} +.lgn-dark-theme .lgn-input:focus, +.lgn-dark-theme select:focus, .lgn-dark-theme .lgn-select:focus { + border-color: #5282c1; +} +.lgn-dark-theme .lgn-input[color=warn], +.lgn-dark-theme select[color=warn], .lgn-dark-theme .lgn-select[color=warn] { + border-color: #f44336; +} +.lgn-dark-theme .lgn-input::placeholder, +.lgn-dark-theme select::placeholder, +.lgn-dark-theme .lgn-select::placeholder { + color: #757575; +} +.lgn-dark-theme label::before { + border-color: #403e3e; +} +.lgn-dark-theme label::after { + background: #5282c1; +} +.lgn-dark-theme input[type=radio] { + opacity: 0; +} +.lgn-dark-theme input[type=radio]:checked + label::before { + border-color: #5282c1; +} +.lgn-dark-theme input[type=radio]:focus + label { + opacity: 1; + outline: none; +} +.lgn-dark-theme input[type=radio]:disabled + label::before { + border-color: rgba(255, 255, 255, 0.12); +} +.lgn-dark-theme input[type=radio]:disabled:focus { + opacity: 0; +} +.lgn-dark-theme input[type=checkbox] { + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + opacity: 0; + z-index: 0; +} +.lgn-dark-theme .lgn-checkbox label:before { + background-color: transparent; + border: 2px solid #403e3e; +} +.lgn-dark-theme .lgn-checkbox label:after { + border-bottom: 2px solid transparent; + border-right: 2px solid transparent; + background: transparent; +} +.lgn-dark-theme input[type=checkbox]:checked + label:before { + background-color: #5282c1; + border-color: #5282c1; +} +.lgn-dark-theme input[type=checkbox]:checked + label:after { + border-color: #fff; +} +.lgn-dark-theme .lgn-label { + color: #757575; +} +.lgn-dark-theme footer { + background-color: #212224; + border-top: 1px solid #303131; +} +.lgn-dark-theme a { + color: #5282c1; +} +.lgn-dark-theme a:hover, .lgn-dark-theme a:active { + color: #6992c9; +} +.lgn-dark-theme .lgn-error { + color: #f44336; +} +.lgn-dark-theme .lgn-qrcode svg { + background: white; +} +.lgn-dark-theme .lgn-qrcode svg rect.color { + fill: black; +} +.lgn-dark-theme .lgn-qrcode svg rect.bg-color { + fill: white; +} +.lgn-dark-theme .lgn-error .lgn-error-message { + color: #f44336; +} +.lgn-dark-theme .lgn-login-profile .lgn-names { + border-color: rgba(255, 255, 255, 0.12); +} +.lgn-dark-theme .lgn-account-selection { + display: flex; + flex-direction: column; + width: 100%; +} +.lgn-dark-theme .lgn-account-selection .lgn-account { + color: inherit; + background: transparent; + box-shadow: inset 0 -1px #303131; + cursor: pointer; +} +.lgn-dark-theme .lgn-account-selection .lgn-account:hover { + background-color: rgba(255, 255, 255, 0.02); +} +.lgn-dark-theme .lgn-account-selection .lgn-account:focus { + background-color: rgba(255, 255, 255, 0.05); +} +.lgn-dark-theme .lgn-account-selection .lgn-account:active { + background-color: rgba(255, 255, 255, 0.05); +} +.lgn-dark-theme .lgn-account-selection .lgn-account .lgn-loginname { + font-size: 14px; + color: #757575; +} +.lgn-dark-theme .lgn-account-selection .lgn-account .lgn-session-state { + color: #757575; +} +.lgn-dark-theme .lgn-account-selection .lgn-account .lgn-session-state.i0 { + color: #85d996; +} +.lgn-dark-theme .lgn-account-selection .lgn-account .lgn-session-state.i1 { + color: #f44336; +} +.lgn-dark-theme .lgn-avatar:not(.transparent) { + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} +.lgn-dark-theme .lgn-avatar:not(.transparent).lgn-primary { + background-color: #5282c1; +} +.lgn-dark-theme .lgn-avatar:not(.transparent).lgn-accent { + background-color: #5282c1; +} +.lgn-dark-theme .lgn-avatar:not(.transparent).lgn-warn { + background-color: #f44336; +} +.lgn-dark-theme .lgn-avatar:not(.transparent).lgn-primary[disabled], .lgn-dark-theme .lgn-avatar:not(.transparent).lgn-accent[disabled], .lgn-dark-theme .lgn-avatar:not(.transparent).lgn-warn[disabled], .lgn-dark-theme .lgn-avatar:not(.transparent)[disabled][disabled] { + background-color: rgba(255, 255, 255, 0.12); +} +.lgn-dark-theme .lgn-avatar .initials.lgn-primary { + color: white; +} +.lgn-dark-theme .lgn-avatar .initials.lgn-accent { + color: white; +} +.lgn-dark-theme .lgn-avatar .initials.lgn-warn { + color: white; +} +.lgn-dark-theme .lgn-avatar .initials.lgn-primary[disabled], .lgn-dark-theme .lgn-avatar .initials.lgn-accent[disabled], .lgn-dark-theme .lgn-avatar .initials.lgn-warn[disabled], .lgn-dark-theme .lgn-avatar .initials[disabled][disabled] { + color: rgba(255, 255, 255, 0.3); +} +.lgn-dark-theme .lgn-select, .lgn-dark-theme select { + background-image: url("../select_arrow_dark.svg"); +} +.lgn-dark-theme .lgn-list li::before, .lgn-dark-theme ul li::before { + color: #5282c1; +} +.lgn-dark-theme .lgn-list li i.lgn-warn, .lgn-dark-theme ul li i.lgn-warn { + color: #f44336; +} +.lgn-dark-theme .lgn-list li i.lgn-valid, .lgn-dark-theme ul li i.lgn-valid { + color: #85d996; +} +.lgn-dark-theme .lgn-idp { + border-color: rgba(255, 255, 255, 0.12); + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); +} +.lgn-dark-theme .lgn-idp:not([disabled]):active { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.lgn-dark-theme .lgn-idp.google { + color: #8b8d8d; + background-color: white; +} +.lgn-dark-theme .lgn-success-label { + color: #cbf4c9; + background-color: #4f566b; +} + +.lgn-light-theme .lgn-app-background, .lgn-light-theme.lgn-app-background { + background-color: #fafafa; + color: rgba(0, 0, 0, 0.87); +} +.lgn-theme-loaded-marker { + display: none; +} + +.lgn-light-theme .lgn-logo { + background: url("../logo-dark.svg") no-repeat; + background-position: auto; + background-size: contain; +} +.lgn-light-theme .lgn-button, +.lgn-light-theme .lgn-stroked-button, +.lgn-light-theme .lgn-icon-button { + color: inherit; + background: transparent; +} +.lgn-light-theme .lgn-button.lgn-primary, +.lgn-light-theme .lgn-stroked-button.lgn-primary, +.lgn-light-theme .lgn-icon-button.lgn-primary { + color: #5469d4; +} +.lgn-light-theme .lgn-button.lgn-accent, +.lgn-light-theme .lgn-stroked-button.lgn-accent, +.lgn-light-theme .lgn-icon-button.lgn-accent { + color: #5469d4; +} +.lgn-light-theme .lgn-button.lgn-warn, +.lgn-light-theme .lgn-stroked-button.lgn-warn, +.lgn-light-theme .lgn-icon-button.lgn-warn { + color: #f44336; +} +.lgn-light-theme .lgn-button.lgn-primary[disabled], .lgn-light-theme .lgn-button.lgn-accent[disabled], .lgn-light-theme .lgn-button.lgn-warn[disabled], .lgn-light-theme .lgn-button[disabled][disabled], +.lgn-light-theme .lgn-stroked-button.lgn-primary[disabled], +.lgn-light-theme .lgn-stroked-button.lgn-accent[disabled], +.lgn-light-theme .lgn-stroked-button.lgn-warn[disabled], +.lgn-light-theme .lgn-stroked-button[disabled][disabled], +.lgn-light-theme .lgn-icon-button.lgn-primary[disabled], +.lgn-light-theme .lgn-icon-button.lgn-accent[disabled], +.lgn-light-theme .lgn-icon-button.lgn-warn[disabled], +.lgn-light-theme .lgn-icon-button[disabled][disabled] { + color: rgba(0, 0, 0, 0.26); +} +.lgn-light-theme .lgn-button:focus, +.lgn-light-theme .lgn-stroked-button:focus, +.lgn-light-theme .lgn-raised-button:focus { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-stroked-button:not([disabled]) { + border-color: rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-button.lgn-primary { + color: #5469d4; +} +.lgn-light-theme .lgn-button.lgn-accent { + color: #5469d4; +} +.lgn-light-theme .lgn-button.lgn-warn { + color: #f44336; +} +.lgn-light-theme .lgn-button.lgn-primary[disabled], .lgn-light-theme .lgn-button.lgn-accent[disabled], .lgn-light-theme .lgn-button.lgn-warn[disabled], .lgn-light-theme .lgn-button[disabled][disabled] { + color: rgba(0, 0, 0, 0.26); +} +.lgn-light-theme .lgn-button:hover { + background-color: rgba(84, 105, 212, 0.1); +} +.lgn-light-theme .lgn-button:focus { + background-color: rgba(84, 105, 212, 0.2); +} +.lgn-light-theme .lgn-button:active { + background-color: rgba(84, 105, 212, 0.25); +} +.lgn-light-theme .lgn-raised-button { + color: rgba(0, 0, 0, 0.87); + background-color: white; +} +.lgn-light-theme .lgn-raised-button.lgn-primary { + color: white; +} +.lgn-light-theme .lgn-raised-button.lgn-accent { + color: white; +} +.lgn-light-theme .lgn-raised-button.lgn-warn { + color: white; +} +.lgn-light-theme .lgn-raised-button.lgn-primary[disabled], .lgn-light-theme .lgn-raised-button.lgn-accent[disabled], .lgn-light-theme .lgn-raised-button.lgn-warn[disabled], .lgn-light-theme .lgn-raised-button[disabled][disabled] { + color: rgba(0, 0, 0, 0.26); +} +.lgn-light-theme .lgn-raised-button.lgn-primary { + background-color: #5469d4; +} +.lgn-light-theme .lgn-raised-button.lgn-accent { + background-color: #5469d4; +} +.lgn-light-theme .lgn-raised-button.lgn-warn { + background-color: #f44336; +} +.lgn-light-theme .lgn-raised-button.lgn-primary[disabled], .lgn-light-theme .lgn-raised-button.lgn-accent[disabled], .lgn-light-theme .lgn-raised-button.lgn-warn[disabled], .lgn-light-theme .lgn-raised-button[disabled][disabled] { + background-color: rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-raised-button:active { + background-color: rgba(84, 105, 212, 0.8); +} +.lgn-light-theme .lgn-button, +.lgn-light-theme .lgn-stroked-button { + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-raised-button { + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-raised-button:not([disabled]):active { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-raised-button[disabled] { + box-shadow: 0px 0px 0px 0px rgba(0, 0, 0, 0.2), 0px 0px 0px 0px rgba(0, 0, 0, 0.14), 0px 0px 0px 0px rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-input:not([disabled]), +.lgn-light-theme select:not([disabled]), .lgn-light-theme .lgn-select:not([disabled]) { + border-color: rgba(0, 0, 0, 0.2509803922); +} +.lgn-light-theme .lgn-input, +.lgn-light-theme select, .lgn-light-theme .lgn-select { + color: rgba(0, 0, 0, 0.87); + background-color: rgba(250, 250, 250, 0.3137254902); +} +.lgn-light-theme .lgn-input:hover, +.lgn-light-theme select:hover, .lgn-light-theme .lgn-select:hover { + border-color: #1a1b1b; +} +.lgn-light-theme .lgn-input:active, +.lgn-light-theme select:active, .lgn-light-theme .lgn-select:active { + border-color: #5469d4; +} +.lgn-light-theme .lgn-input:focus, +.lgn-light-theme select:focus, .lgn-light-theme .lgn-select:focus { + border-color: #5469d4; +} +.lgn-light-theme .lgn-input[color=warn], +.lgn-light-theme select[color=warn], .lgn-light-theme .lgn-select[color=warn] { + border-color: #f44336; +} +.lgn-light-theme .lgn-input::placeholder, +.lgn-light-theme select::placeholder, +.lgn-light-theme .lgn-select::placeholder { + color: #757575; +} +.lgn-light-theme label::before { + border-color: rgba(0, 0, 0, 0.2509803922); +} +.lgn-light-theme label::after { + background: #5469d4; +} +.lgn-light-theme input[type=radio] { + opacity: 0; +} +.lgn-light-theme input[type=radio]:checked + label::before { + border-color: #5469d4; +} +.lgn-light-theme input[type=radio]:focus + label { + opacity: 1; + outline: none; +} +.lgn-light-theme input[type=radio]:disabled + label::before { + border-color: rgba(0, 0, 0, 0.12); +} +.lgn-light-theme input[type=radio]:disabled:focus { + opacity: 0; +} +.lgn-light-theme input[type=checkbox] { + position: absolute; + top: 4px; + left: 0; + width: 16px; + height: 16px; + opacity: 0; + z-index: 0; +} +.lgn-light-theme .lgn-checkbox label:before { + background-color: transparent; + border: 2px solid rgba(0, 0, 0, 0.2509803922); +} +.lgn-light-theme .lgn-checkbox label:after { + border-bottom: 2px solid transparent; + border-right: 2px solid transparent; + background: transparent; +} +.lgn-light-theme input[type=checkbox]:checked + label:before { + background-color: #5469d4; + border-color: #5469d4; +} +.lgn-light-theme input[type=checkbox]:checked + label:after { + border-color: #fff; +} +.lgn-light-theme .lgn-label { + color: #757575; +} +.lgn-light-theme footer { + background-color: #fafafa; + border-top: 1px solid #e3e8ee; +} +.lgn-light-theme a { + color: #5469d4; +} +.lgn-light-theme a:hover, .lgn-light-theme a:active { + color: #6e80da; +} +.lgn-light-theme .lgn-error { + color: #f44336; +} +.lgn-light-theme .lgn-qrcode svg { + background: #fafafa; +} +.lgn-light-theme .lgn-qrcode svg rect.color { + fill: black; +} +.lgn-light-theme .lgn-qrcode svg rect.bg-color { + fill: #fafafa; +} +.lgn-light-theme .lgn-error .lgn-error-message { + color: #f44336; +} +.lgn-light-theme .lgn-login-profile .lgn-names { + border-color: rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-account-selection { + display: flex; + flex-direction: column; + width: 100%; +} +.lgn-light-theme .lgn-account-selection .lgn-account { + color: inherit; + background: transparent; + box-shadow: inset 0 -1px #e3e8ee; + cursor: pointer; +} +.lgn-light-theme .lgn-account-selection .lgn-account:hover { + background-color: rgba(0, 0, 0, 0.02); +} +.lgn-light-theme .lgn-account-selection .lgn-account:focus { + background-color: rgba(0, 0, 0, 0.05); +} +.lgn-light-theme .lgn-account-selection .lgn-account:active { + background-color: rgba(0, 0, 0, 0.05); +} +.lgn-light-theme .lgn-account-selection .lgn-account .lgn-loginname { + font-size: 14px; + color: #757575; +} +.lgn-light-theme .lgn-account-selection .lgn-account .lgn-session-state { + color: #757575; +} +.lgn-light-theme .lgn-account-selection .lgn-account .lgn-session-state.i0 { + color: #85d996; +} +.lgn-light-theme .lgn-account-selection .lgn-account .lgn-session-state.i1 { + color: #f44336; +} +.lgn-light-theme .lgn-avatar:not(.transparent) { + box-shadow: 0px 3px 1px -2px rgba(0, 0, 0, 0.2), 0px 2px 2px 0px rgba(0, 0, 0, 0.14), 0px 1px 5px 0px rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-avatar:not(.transparent).lgn-primary { + background-color: #5469d4; +} +.lgn-light-theme .lgn-avatar:not(.transparent).lgn-accent { + background-color: #5469d4; +} +.lgn-light-theme .lgn-avatar:not(.transparent).lgn-warn { + background-color: #f44336; +} +.lgn-light-theme .lgn-avatar:not(.transparent).lgn-primary[disabled], .lgn-light-theme .lgn-avatar:not(.transparent).lgn-accent[disabled], .lgn-light-theme .lgn-avatar:not(.transparent).lgn-warn[disabled], .lgn-light-theme .lgn-avatar:not(.transparent)[disabled][disabled] { + background-color: rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-avatar .initials.lgn-primary { + color: white; +} +.lgn-light-theme .lgn-avatar .initials.lgn-accent { + color: white; +} +.lgn-light-theme .lgn-avatar .initials.lgn-warn { + color: white; +} +.lgn-light-theme .lgn-avatar .initials.lgn-primary[disabled], .lgn-light-theme .lgn-avatar .initials.lgn-accent[disabled], .lgn-light-theme .lgn-avatar .initials.lgn-warn[disabled], .lgn-light-theme .lgn-avatar .initials[disabled][disabled] { + color: rgba(0, 0, 0, 0.26); +} +.lgn-light-theme .lgn-select, .lgn-light-theme select { + background-image: url("../select_arrow_light.svg"); +} +.lgn-light-theme .lgn-list li::before, .lgn-light-theme ul li::before { + color: #5469d4; +} +.lgn-light-theme .lgn-list li i.lgn-warn, .lgn-light-theme ul li i.lgn-warn { + color: #f44336; +} +.lgn-light-theme .lgn-list li i.lgn-valid, .lgn-light-theme ul li i.lgn-valid { + color: #85d996; +} +.lgn-light-theme .lgn-idp { + border-color: rgba(0, 0, 0, 0.12); + box-shadow: 0px 2px 1px -1px rgba(0, 0, 0, 0.2), 0px 1px 1px 0px rgba(0, 0, 0, 0.14), 0px 1px 3px 0px rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-idp:not([disabled]):active { + box-shadow: 0px 5px 5px -3px rgba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px rgba(0, 0, 0, 0.12); +} +.lgn-light-theme .lgn-idp.google { + color: #8b8d8d; + background-color: white; +} +.lgn-light-theme .lgn-success-label { + color: #0e6245; + background-color: #cbf4c9; +} + +/*# sourceMappingURL=zitadel.css.map */ diff --git a/internal/ui/login/static/resources/themes/zitadel/css/zitadel.css.map b/internal/ui/login/static/resources/themes/zitadel/css/zitadel.css.map new file mode 100644 index 0000000000..4731937075 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/css/zitadel.css.map @@ -0,0 +1 @@ +{"version":3,"sourceRoot":"","sources":["../../scss/styles/footer/footer.scss","../../scss/styles/header/header.scss","../../scss/styles/button/button.scss","../../scss/styles/button/button_base.scss","../../scss/styles/input/input.scss","../../scss/styles/input/input_base.scss","../../scss/styles/label/label.scss","../../scss/styles/label/label_base.scss","../../scss/styles/radio/radio_base.scss","../../scss/styles/radio/radio.scss","../../scss/styles/a/a.scss","../../scss/styles/identity_provider/identity_provider.scss","../../scss/styles/identity_provider/identity_provider_base.scss","../../scss/styles/error/error.scss","../../scss/styles/qrcode/qrcode.scss","../../scss/styles/container/container.scss","../../scss/styles/account_selection/account_selection.scss","../../scss/styles/avatar/avatar.scss","../../scss/styles/checkbox/checkbox.scss","../../scss/styles/checkbox/checkbox_base.scss","../../scss/styles/select/select.scss","../../scss/styles/select/select_base.scss","../../scss/styles/list/list_base.scss","../../scss/styles/typography/faces/ailerons_font_faces.scss","../../scss/styles/typography/faces/lato_font_faces.scss","../../scss/styles/typography/faces/roboto_font_faces.scss","../../scss/styles/typography/faces/raleway_font_faces.scss","../../scss/styles/typography/faces/pt_sans_font_faces.scss","../../scss/styles/success_label/success_label.scss","../../scss/styles/typography/typography.scss","../../scss/styles/core/core.scss","../../scss/styles/header/header_theme.scss","../../scss/styles/button/button_theme.scss","../../scss/styles/elevation/elevation.scss","../../scss/styles/input/input_theme.scss","../../scss/styles/radio/radio_theme.scss","../../scss/styles/checkbox/checkbox_theme.scss","../../scss/styles/label/label_theme.scss","../../scss/styles/footer/footer_theme.scss","../../scss/styles/a/a_theme.scss","../../scss/styles/error/error_theme.scss","../../scss/styles/qrcode/qrcode_theme.scss","../../scss/styles/container/container_theme.scss","../../scss/styles/account_selection/account_selection_theme.scss","../../scss/styles/avatar/avatar_theme.scss","../../scss/styles/select/select_theme.scss","../../scss/styles/list/list_theme.scss","../../scss/styles/identity_provider/identity_provider_theme.scss","../../scss/styles/success_label/success_label_theme.scss"],"names":[],"mappings":";AAIA;EACI;EACA;EACA;EACA,YAPY;EAQZ;EACA;EACA,SATa;;AAWb;EACI;;AAGJ;EACI;EACA;;AAGJ;EAlBJ;IAmBQ;IACA;IACA;IACA;;;;ACvBR;EACI;EACA;EACA,QALgB;EAMhB,SAPiB;EAQjB;;AAEA;EACI;EACA;EACA;;;ACXR;ECkBE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EAGA,QAjCkB;EAkClB,WAnCqB;EAoCrB,aAlCuB;EAmCvB,SAtCmB;EAuCnB,eAnCyB;EAqCzB;;AAEA;EACE;;AAGF;EACE;;;AD1CJ;ECcE;EACA;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EAGA,QAjCkB;EAkClB,WAnCqB;EAoCrB,aAlCuB;EAmCvB,SAtCmB;EAuCnB,eAnCyB;EAqCzB;EAgBA;;AAdA;EACE;;AAGF;EACE;;;ADtCJ;EACE;EACA;EACA,OCCqB;EDArB;EACA;EACA,aCFqB;EDGrB,eCF8B;;ADI9B;EACE,aCJ0B;;;ADQ9B;EACE;EACA,SCf2B;EDgB3B,aCjB+B;;;ADoBjC;EACE;EACA,YC3B4B;;;AD+B5B;EACE;;;AEnCJ;AAAA;ECOI;EACA;EACA,sBAXsB;EAYtB;EACA;EACA;EACA;EACA,eAZsB;EAatB;EACA;EACA;EACA,cAfqB;EAgBrB,QAlBoB;EAmBpB,SArBgB;EAsBhB;EACA;EACA,QAvBe;;AAyBf;AAAA;EACI,WAtB0B;EAuB1B;;;ADrBR;ECCI;EACA;EACA,sBAXsB;EAYtB;EACA;EACA;EACA;EACA,eAZsB;EAatB;EACA;EACA;EACA,cAfqB;EAgBrB,QAlBoB;EAmBpB,SArBgB;EAsBhB;EACA;EACA,QAvBe;;AAyBf;EACI,WAtB0B;EAuB1B;;;ADjBR;EACI;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AElBR;ECGI;EACA,WANkB;EAOlB;EACA,QAPe;EAQf,aAPoB;;;ACMxB;EACI;IACE;;EAGF;IACE;;EAGF;IACE;;;AChBN;EDqBI;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA,QA9BS;EA+BT;EACA,SA7BkB;EA8BlB;EACA;EACA;EACA;EACA;EACA,WAzCc;EA0Cd;;AAEA;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA,OArDK;EAsDL,QAtDK;EAuDL;EACA;;AAGJ;EACI;EACA;EACA,OA7Da;EA8Db,QA9Da;EA+Db;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAOA;EACI;EACA;;AAGJ;EACI;;AAKZ;AAAA;AAAA;EAGI;;;AE5GR;EACI;EACA;EACA;EACA;;AAEA;EACI;;;ACLR;ECKI;EACA,QARa;EASb;EACA;EACA;EACA;EACA,SAZc;EAad,eAXoB;EAYpB;EACA;;AAEA;EACI;EACA;;AAGJ;EACI,aAtB4B;EAuB5B;EACA;EACA;;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;ACtCZ;EACI;EACA;EACA;;AACA;EACI;EACA;;;ACNR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;ACHR;EACI,WAPsB;EAQtB;EACA;EACA,eAN0B;EAO1B;;AAEA;EAPJ;IAQQ,YAXmB;;;;AAe3B;EACI;EACA;EACA,QAnBmB;EAoBnB,SArBoB;EAsBpB;EACA;;AAGI;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;;AAIA;EACI;;AAGJ;EACI;;AAIR;EACI;;AAEA;EACI;EACA;;AAEJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;;AAGA;EACI;;AAMhB;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;EACA;;;AAKZ;EACI;;;ACtHJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAIR;EACI;;AAGJ;EACI;;;AC3CZ;EACI,QAHc;EAId,OAJc;EAKd;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACdJ;ECCI;EACA;EACA;EACA,WANqB;EAOrB;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;EACA,WA3BiB;EA4BjB;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AChDZ;ECCI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI;;;ACVJ;EACI;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAKJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAIR;EACI;EACA;;;ACpCR;EACI;EACA;;ACFJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AC7DJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;ACzEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AC9GJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;;ACtBJ;EACI;EACA;EACA;EACA;;;ACkJA;EALE;EA9DF;EAqEE;;;AAGF;EAVE;EA9DF;EA0EE;;;AAGF;EAfE;EA9DF;EA+EE;;;AAGF;EApBE;EA9DF;EAoFE;;;AAGF;EAzBE;EA9DF;;;AA2FA;EA7BE;EA9DF;;AA8FE;EACE;;;AAIJ;EArCE;EA9DF;;;AAuGA;EAzCE;EA9DF;;;AA2GA;EA7CE;EA9DF;;;AA+GA;EAjDE;EA9DF;;;AAmHA;EArDE;EA9DF;EAqHI;;;AAGJ;EA1DE;EA9DF;EA0HE;;;AAGF;EA/DE;EA9DF;EA+HE;;;AAGF;EApEE;EA9DF;EAoIE;;;AAGF;EAzEE;EA9DF;EAyIE;;;ACrNF;EAIE;EACA;;;AAKA;EACE;;;ACNJ;EACI;EACA;EACA;;;ACIN;AAAA;AAAA;EAGE;EACA;;AAyEF;AAAA;AAAA;EACE;;AAEF;AAAA;AAAA;EACE;;AAEF;AAAA;AAAA;EACE;;AAOI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEI;;;AApFV;AAAA;AAAA;ECwGA;;;ADjGA;EACE;;;AA4DF;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAvER;EAEE;;AAGF;EACE;;AAGF;EACE;;;AAIJ;EACE;EACA;;AAuCF;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAhBV;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAlDR;EACE;;;AAIJ;AAAA;ECiEA;;;AD5DA;EC4DA;;ADzDE;ECyDF;;ADjDE;ECiDF;;;ACnHE;AAAA;EAEE;;;AAGF;AAAA;EAEE;EACA;;AAEA;AAAA;EACE;;AAGF;AAAA;EAuBF;;AAnBE;AAAA;EAmBF;;AAdE;AAAA;EACE;;;AAIJ;AAAA;AAAA;EAGI;;;AC9BA;EACI;;AAGJ;EACI;;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;AAIA;EACI;;AAaJ;EACI;;;ACtCZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;;AAMJ;EACI;EACA;;AAGJ;EACI;;;AC9BR;EACE;;;ACJF;EACE;EACA;;ACLF;EACE;;AAEA;EAEI;;;ACLN;EACE;;;ACCE;EACI;;AAGJ;EACI;;AAGJ;EACI;;;ACTJ;EACI;;;AAKJ;EAEI;;;ACPR;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EAEI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;;AAGJ;EAEI;;;ACvChB;EXqHF;;AWpGE;EACE;;AAEF;EACE;;AAEF;EACE;;AAOE;EAEI;;;AAhBR;EACE;;AAEF;EACE;;AAEF;EACE;;AAOE;EAEI;;;ACjCR;EACI;;;ACCA;EACI;;AAIA;EACI;;AAGJ;EACI;;;ACbZ;EACI;EdqHN;;AcjHM;EdiHN;;Ac7GM;EACI;EACA;;;ACXR;EACI;EACA;;;AlBTJ;EAIE;EACA;;AAKA;EACE;;;ACNJ;EACI;EACA;EACA;;ACIN;AAAA;AAAA;EAGE;EACA;;AAyEF;AAAA;AAAA;EACE;;AAEF;AAAA;AAAA;EACE;;AAEF;AAAA;AAAA;EACE;;AAOI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEI;;AApFV;AAAA;AAAA;ECwGA;;ADjGA;EACE;;AA4DF;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAvER;EAEE;;AAGF;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;;AAuCF;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAhBV;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAlDR;EACE;;AAIJ;AAAA;ECiEA;;AD5DA;EC4DA;;ADzDE;ECyDF;;ADjDE;ECiDF;;ACnHE;AAAA;EAEE;;AAGF;AAAA;EAEE;EACA;;AAEA;AAAA;EACE;;AAGF;AAAA;EAuBF;;AAnBE;AAAA;EAmBF;;AAdE;AAAA;EACE;;AAIJ;AAAA;AAAA;EAGI;;AC9BA;EACI;;AAGJ;EACI;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;AAIA;EACI;;AAaJ;EACI;;ACtCZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAMJ;EACI;EACA;;AAGJ;EACI;;AC9BR;EACE;;ACJF;EACE;EACA;;ACLF;EACE;;AAEA;EAEI;;ACLN;EACE;;ACCE;EACI;;AAGJ;EACI;;AAGJ;EACI;;ACTJ;EACI;;AAKJ;EAEI;;ACPR;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EAEI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;;AAGJ;EAEI;;ACvChB;EXqHF;;AWpGE;EACE;;AAEF;EACE;;AAEF;EACE;;AAOE;EAEI;;AAhBR;EACE;;AAEF;EACE;;AAEF;EACE;;AAOE;EAEI;;ACjCR;EACI;;ACCA;EACI;;AAIA;EACI;;AAGJ;EACI;;ACbZ;EACI;EdqHN;;AcjHM;EdiHN;;Ac7GM;EACI;EACA;;ACXR;EACI;EACA;;;AlBTJ;EAIE;EACA;;AAKA;EACE;;;ACNJ;EACI;EACA;EACA;;ACIN;AAAA;AAAA;EAGE;EACA;;AAyEF;AAAA;AAAA;EACE;;AAEF;AAAA;AAAA;EACE;;AAEF;AAAA;AAAA;EACE;;AAOI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEI;;AApFV;AAAA;AAAA;ECwGA;;ADjGA;EACE;;AA4DF;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAvER;EAEE;;AAGF;EACE;;AAGF;EACE;;AAIJ;EACE;EACA;;AAuCF;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAhBV;EACE;;AAEF;EACE;;AAEF;EACE;;AAOI;EAEI;;AAlDR;EACE;;AAIJ;AAAA;ECiEA;;AD5DA;EC4DA;;ADzDE;ECyDF;;ADjDE;ECiDF;;ACnHE;AAAA;EAEE;;AAGF;AAAA;EAEE;EACA;;AAEA;AAAA;EACE;;AAGF;AAAA;EAuBF;;AAnBE;AAAA;EAmBF;;AAdE;AAAA;EACE;;AAIJ;AAAA;AAAA;EAGI;;AC9BA;EACI;;AAGJ;EACI;;AAIR;EACI;;AAEA;EACI;;AAGJ;EACI;EACA;;AAIA;EACI;;AAaJ;EACI;;ACtCZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAKA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAMJ;EACI;EACA;;AAGJ;EACI;;AC9BR;EACE;;ACJF;EACE;EACA;;ACLF;EACE;;AAEA;EAEI;;ACLN;EACE;;ACCE;EACI;;AAGJ;EACI;;AAGJ;EACI;;ACTJ;EACI;;AAKJ;EAEI;;ACPR;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EAEI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAEA;EACI;;AAGJ;EAEI;;ACvChB;EXqHF;;AWpGE;EACE;;AAEF;EACE;;AAEF;EACE;;AAOE;EAEI;;AAhBR;EACE;;AAEF;EACE;;AAEF;EACE;;AAOE;EAEI;;ACjCR;EACI;;ACCA;EACI;;AAIA;EACI;;AAGJ;EACI;;ACbZ;EACI;EdqHN;;AcjHM;EdiHN;;Ac7GM;EACI;EACA;;ACXR;EACI;EACA","file":"zitadel.css"} \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/favicon.ico b/internal/ui/login/static/resources/themes/zitadel/favicon.ico index b488a5d341..0b13cbabf6 100644 Binary files a/internal/ui/login/static/resources/themes/zitadel/favicon.ico and b/internal/ui/login/static/resources/themes/zitadel/favicon.ico differ diff --git a/internal/ui/login/static/resources/themes/zitadel/logo-dark.png b/internal/ui/login/static/resources/themes/zitadel/logo-dark.png deleted file mode 100644 index b77c080722..0000000000 Binary files a/internal/ui/login/static/resources/themes/zitadel/logo-dark.png and /dev/null differ diff --git a/internal/ui/login/static/resources/themes/zitadel/logo-dark.svg b/internal/ui/login/static/resources/themes/zitadel/logo-dark.svg new file mode 100644 index 0000000000..c0308b345a --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/logo-dark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/internal/ui/login/static/resources/themes/zitadel/logo-light.png b/internal/ui/login/static/resources/themes/zitadel/logo-light.png deleted file mode 100644 index 365021ab49..0000000000 Binary files a/internal/ui/login/static/resources/themes/zitadel/logo-light.png and /dev/null differ diff --git a/internal/ui/login/static/resources/themes/zitadel/logo-light.svg b/internal/ui/login/static/resources/themes/zitadel/logo-light.svg new file mode 100644 index 0000000000..32f7e51805 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/logo-light.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/internal/ui/login/static/resources/themes/zitadel/select_arrow_dark.svg b/internal/ui/login/static/resources/themes/zitadel/select_arrow_dark.svg new file mode 100644 index 0000000000..43f22f2982 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/select_arrow_dark.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/internal/ui/login/static/resources/themes/zitadel/select_arrow_light.svg b/internal/ui/login/static/resources/themes/zitadel/select_arrow_light.svg new file mode 100644 index 0000000000..6a62ac0c49 --- /dev/null +++ b/internal/ui/login/static/resources/themes/zitadel/select_arrow_light.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/internal/ui/login/static/templates/change_password.html b/internal/ui/login/static/templates/change_password.html index 5bb0d8c0a8..e53c03576f 100644 --- a/internal/ui/login/static/templates/change_password.html +++ b/internal/ui/login/static/templates/change_password.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "PasswordChange.Description"}}

    @@ -14,39 +14,37 @@
    - - + +
    - - + + {{ .PasswordPolicyDescription }}
    - - + +
    {{ template "error-message" .}} -
    - - +
    + {{t "Actions.Cancel"}} + +
    @@ -55,5 +53,4 @@ -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/change_password_done.html b/internal/ui/login/static/templates/change_password_done.html index 1afe440cc3..8273ac18b8 100644 --- a/internal/ui/login/static/templates/change_password_done.html +++ b/internal/ui/login/static/templates/change_password_done.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "PasswordChangeDone.Description"}}

    @@ -12,12 +12,13 @@ - -
    - +
    + + +
    - -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/change_username.html b/internal/ui/login/static/templates/change_username.html index 9dd7cfa136..6aeb2896ff 100644 --- a/internal/ui/login/static/templates/change_username.html +++ b/internal/ui/login/static/templates/change_username.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "UsernameChange.Description"}}

    @@ -12,20 +12,21 @@ -
    -
    - - -
    +
    + +
    {{ template "error-message" .}} -
    - - +
    + {{t "Actions.Cancel"}} + + +
    @@ -33,5 +34,4 @@ -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/change_username_done.html b/internal/ui/login/static/templates/change_username_done.html index dcd5d89613..8bf77afd6a 100644 --- a/internal/ui/login/static/templates/change_username_done.html +++ b/internal/ui/login/static/templates/change_username_done.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "UsernameChangeDone.Description"}}

    @@ -13,11 +13,11 @@ -
    - +
    + +
    -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/error-message.html b/internal/ui/login/static/templates/error-message.html index 323d2d2624..95372b0964 100644 --- a/internal/ui/login/static/templates/error-message.html +++ b/internal/ui/login/static/templates/error-message.html @@ -1,7 +1,10 @@ {{ define "error-message" }} {{if .ErrMessage }} -
    - {{ if .ErrType }}{{ .ErrType }} - {{end}}{{ .ErrMessage }} +
    + +

    + {{ if .ErrType }}{{ .ErrType }} - {{end}}{{ .ErrMessage }} +

    {{end}} {{ end }} \ No newline at end of file diff --git a/internal/ui/login/static/templates/error.html b/internal/ui/login/static/templates/error.html index 724c2037af..ce0eb444d6 100644 --- a/internal/ui/login/static/templates/error.html +++ b/internal/ui/login/static/templates/error.html @@ -1,9 +1,12 @@ {{template "main-top" .}} -
    - {{ .ErrType }} - {{ .ErrMessage }} +
    +
    + +

    + {{ if .ErrType }}{{ .ErrType }} - {{end}}{{ .ErrMessage }} +

    +
    -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/external_not_found_option.html b/internal/ui/login/static/templates/external_not_found_option.html index 29510b7c96..1023b4498d 100644 --- a/internal/ui/login/static/templates/external_not_found_option.html +++ b/internal/ui/login/static/templates/external_not_found_option.html @@ -1,7 +1,6 @@ - {{template "main-top" .}} -
    +

    {{t "ExternalNotFoundOption.Title"}}

    {{t "ExternalNotFoundOption.Description"}}

    @@ -12,10 +11,17 @@ -
    - - - +
    + + + + +
    {{template "error-message" .}} @@ -25,5 +31,4 @@ -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/footer.html b/internal/ui/login/static/templates/footer.html index ee505f2268..8e3428d0cd 100644 --- a/internal/ui/login/static/templates/footer.html +++ b/internal/ui/login/static/templates/footer.html @@ -1,3 +1,7 @@ {{define "footer"}} - + {{end}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/header.html b/internal/ui/login/static/templates/header.html index ce06daef56..cc34edc265 100644 --- a/internal/ui/login/static/templates/header.html +++ b/internal/ui/login/static/templates/header.html @@ -1,3 +1,5 @@ {{define "header"}} - +
    + +
    {{end}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/init_password.html b/internal/ui/login/static/templates/init_password.html index 446bca767c..8463180889 100644 --- a/internal/ui/login/static/templates/init_password.html +++ b/internal/ui/login/static/templates/init_password.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "InitPassword.Description" }}

    @@ -15,43 +15,36 @@
    - - + +
    - - + + {{ .PasswordPolicyDescription }}
    - - + +
    {{ template "error-message" .}} -
    - - - + + + @@ -60,5 +53,4 @@ -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/init_password_done.html b/internal/ui/login/static/templates/init_password_done.html index 05d4b14ca2..6294a0bbe3 100644 --- a/internal/ui/login/static/templates/init_password_done.html +++ b/internal/ui/login/static/templates/init_password_done.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "PasswordSetDone.Description"}}

    @@ -12,14 +12,14 @@ -
    - - +
    + {{t "Actions.Cancel"}} + +
    -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/init_user.html b/internal/ui/login/static/templates/init_user.html index 09c919c725..a708bea681 100644 --- a/internal/ui/login/static/templates/init_user.html +++ b/internal/ui/login/static/templates/init_user.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "InitUser.Description" }}

    @@ -16,52 +16,47 @@
    - - + +
    + + + {{ if not .PasswordSet }}
    - - + + {{ .PasswordPolicyDescription }}
    - - + +
    {{ end }}
    {{ template "error-message" .}} -
    - - - +
    + {{t "Actions.Cancel"}} + +
    {{ if not .PasswordSet }} - - - + + + {{ end }} -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/init_user_done.html b/internal/ui/login/static/templates/init_user_done.html index 4b7e2527ec..54a9135815 100644 --- a/internal/ui/login/static/templates/init_user_done.html +++ b/internal/ui/login/static/templates/init_user_done.html @@ -1,6 +1,8 @@ {{template "main-top" .}} -
    +
    +

    {{t "InitUserDone.Title"}}

    + {{ template "user-profile" . }}

    {{t "InitUserDone.Description"}}

    @@ -12,14 +14,14 @@ -
    - - + -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/link_users_done.html b/internal/ui/login/static/templates/link_users_done.html index 6101d08422..af1922b163 100644 --- a/internal/ui/login/static/templates/link_users_done.html +++ b/internal/ui/login/static/templates/link_users_done.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "LinkingUsersDone.Description"}}

    @@ -12,14 +12,14 @@ -
    - - +
    + {{t "Actions.Cancel"}} + +
    -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/login.html b/internal/ui/login/static/templates/login.html index 347770c129..4241d0c52b 100644 --- a/internal/ui/login/static/templates/login.html +++ b/internal/ui/login/static/templates/login.html @@ -1,13 +1,12 @@ - {{template "main-top" .}} -
    +
    {{if .Linking}} -

    {{t "Login.TitleLinking"}}

    -

    {{t "Login.DescriptionLinking"}}{{if .OrgName}} {{t "Login.MustBeMemberOfOrg" "OrgName" .OrgName}}{{end}}

    +

    {{t "Login.TitleLinking"}}

    +

    {{t "Login.DescriptionLinking"}}{{if .OrgName}} {{t "Login.MustBeMemberOfOrg" "OrgName" .OrgName}}{{end}}

    {{else}} -

    {{t "Login.Title"}}

    -

    {{t "Login.Description"}}{{if .OrgName}} {{t "Login.MustBeMemberOfOrg" "OrgName" .OrgName}}{{end}}

    +

    {{t "Login.Title"}}

    +

    {{t "Login.Description"}}{{if .OrgName}} {{t "Login.MustBeMemberOfOrg" "OrgName" .OrgName}}{{end}}

    {{end}}
    @@ -20,40 +19,39 @@ {{if .LoginPolicy.AllowUsernamePassword }}
    -
    - - -
    + +
    {{end}} {{template "error-message" .}} -
    - +
    + + {{if .LoginPolicy.AllowRegister}} - + {{end}}
    {{if hasExternalLogin }} -
    -

    {{t "Login.ExternalLogin"}}

    +
    +

    {{t "Login.ExternalLogin"}}

    - {{ $reqid := .AuthReqID}} - {{range $provider := .IDPProviders}} - - - {{$provider.Name}} - - {{end}} -
    + {{ $reqid := .AuthReqID}} + {{range $provider := .IDPProviders}} + + + {{$provider.Name}} + + {{end}} +
    {{end}} - -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/logout_done.html b/internal/ui/login/static/templates/logout_done.html index 4c492356e2..ee4454090a 100644 --- a/internal/ui/login/static/templates/logout_done.html +++ b/internal/ui/login/static/templates/logout_done.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +

    {{t "LogoutDone.Title"}}

    {{t "LogoutDone.Description"}}

    @@ -8,11 +8,11 @@ {{ .CSRF }} -
    +
    +
    -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/mail_verification.html b/internal/ui/login/static/templates/mail_verification.html index 916aab69e9..85f97acc24 100644 --- a/internal/ui/login/static/templates/mail_verification.html +++ b/internal/ui/login/static/templates/mail_verification.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "EmailVerification.Description"}}

    @@ -14,26 +14,30 @@
    -
    - - -
    + +
    {{ template "error-message" .}} -
    - +
    + + + + {{ if .UserID }} - + {{ end }} - - {{t "Actions.Cancel"}} + + +
    -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/mail_verified.html b/internal/ui/login/static/templates/mail_verified.html index 7aa54d49cb..749b6ef3bf 100644 --- a/internal/ui/login/static/templates/mail_verified.html +++ b/internal/ui/login/static/templates/mail_verified.html @@ -1,6 +1,6 @@ {{template "main-top" .}} -
    +
    {{ template "user-profile" . }}

    {{t "EmailVerificationDone.Description"}}

    @@ -12,15 +12,15 @@ - -
    - - +
    + {{t "Actions.Cancel"}} + +
    -{{template "main-bottom" .}} - \ No newline at end of file +{{template "main-bottom" .}} \ No newline at end of file diff --git a/internal/ui/login/static/templates/main.html b/internal/ui/login/static/templates/main.html index 5b9aab1f6b..fe05e51114 100644 --- a/internal/ui/login/static/templates/main.html +++ b/internal/ui/login/static/templates/main.html @@ -1,32 +1,37 @@ {{define "main-top"}} + - {{if .ThemeMode}} - - {{else}} - - - {{end}} + + + + + {{ .Title }} + + - -
    - {{template "header" .}} -
    -
    -{{end}} - + + +
    +
    + {{template "header" .}} +
    + {{end}} + -{{define "main-bottom"}} -
    + {{define "main-bottom"}} +
    +
    +