From 8977226495d40fc90850a9cb385855147dceaf45 Mon Sep 17 00:00:00 2001 From: Mikhail Knyazhev Date: Sun, 24 Jul 2022 05:27:01 +0300 Subject: [PATCH] ui refactoring --- .deb.yaml | 6 +- .gitignore | 2 + Makefile | 13 +- cmd/fdns/main.go | 51 +- configs/config.dev.yaml | 40 +- configs/config.yaml | 35 +- go.mod | 33 +- go.sum | 87 +- init/supervisor/conf.d/fdns.conf | 2 +- init/systemd/fdns.service | 2 +- internal/api/api.go | 34 - internal/api/controller.go | 34 - internal/api/controller_easyjson.go | 190 - internal/api/dic.go | 14 - internal/dnsserver/server.go | 17 +- internal/webserver/config.go | 20 +- internal/webserver/di.go | 29 + internal/webserver/routes.go | 63 - internal/webserver/ws.go | 51 + internal/webserver/ws_api.go | 329 ++ internal/webserver/ws_api_easyjson.go | 656 ++++ internal/webserver/ws_ui.go | 34 + pkg/blacklist/config.go | 5 - pkg/blacklist/repository.go | 72 +- pkg/cache/repository.go | 100 +- pkg/cache/ruleip.go | 13 + pkg/database/common.go | 54 + pkg/database/db.go | 61 + pkg/database/queries.go | 181 + pkg/database/queries_test.go | 23 + pkg/database/sql.go | 40 + pkg/dic.go | 6 +- pkg/dnscli/client.go | 123 +- pkg/dnscli/config.go | 5 - pkg/httpcli/cli.go | 4 +- pkg/rules/config.go | 7 +- pkg/rules/repository.go | 134 +- pkg/rules/resolver.go | 1 + pkg/rules/rules.go | 64 +- pkg/utils/utils.go | 49 + resource/404.html | 25 + resource/adblock-rules.json | 13 + resource/default-rules.json | 8 + resource/index.html | 19 + scripts/build.sh | 2 +- scripts/docker.sh | 4 +- scripts/env.sh | 16 +- scripts/preinst.sh | 4 + web/README.md | 27 - web/angular.json | 4 +- web/package-lock.json | 3283 ++++++++++------- web/package.json | 55 +- web/src/app/app-routing.module.ts | 36 +- web/src/app/app.component.html | 10 +- web/src/app/app.component.scss | 5 + web/src/app/app.module.ts | 63 +- .../components/adblock/adblock.component.html | 40 + .../components/adblock/adblock.component.scss | 16 + .../components/adblock/adblock.component.ts | 58 + .../app/components/cache/cache.component.html | 10 - .../app/components/cache/cache.component.scss | 0 .../app/components/cache/cache.component.ts | 35 - .../components/dynamic/dynamic.component.html | 35 + .../components/dynamic/dynamic.component.scss | 13 + .../components/dynamic/dynamic.component.ts | 40 + .../app/components/fixed/fixed.component.html | 73 + .../app/components/fixed/fixed.component.scss | 6 + .../app/components/fixed/fixed.component.ts | 84 + web/src/app/models/adblock.ts | 11 + web/src/app/models/cache.ts | 1 + web/src/app/models/fixed.ts | 12 + web/src/app/pipe/domain-filter.pipe.ts | 21 + web/src/app/pipe/domain.pipe.ts | 12 + web/src/app/pipe/index.pipe.ts | 15 + web/src/app/pipe/pipe.module.ts | 24 + .../app/services/error-interceptor.service.ts | 34 + .../app/services/http/error.interceptor.ts | 23 - web/src/app/services/http/http.service.ts | 66 - web/src/environments/urls.ts | 14 +- web/src/styles.scss | 43 + web/tslint.json | 2 +- 81 files changed, 4787 insertions(+), 2159 deletions(-) delete mode 100755 internal/api/api.go delete mode 100755 internal/api/controller.go delete mode 100644 internal/api/controller_easyjson.go delete mode 100755 internal/api/dic.go create mode 100755 internal/webserver/di.go delete mode 100755 internal/webserver/routes.go create mode 100644 internal/webserver/ws.go create mode 100644 internal/webserver/ws_api.go create mode 100644 internal/webserver/ws_api_easyjson.go create mode 100644 internal/webserver/ws_ui.go delete mode 100644 pkg/blacklist/config.go create mode 100644 pkg/database/common.go create mode 100644 pkg/database/db.go create mode 100644 pkg/database/queries.go create mode 100644 pkg/database/queries_test.go create mode 100644 pkg/database/sql.go delete mode 100644 pkg/dnscli/config.go create mode 100644 resource/404.html create mode 100644 resource/adblock-rules.json create mode 100644 resource/default-rules.json create mode 100644 resource/index.html delete mode 100644 web/README.md create mode 100644 web/src/app/components/adblock/adblock.component.html create mode 100644 web/src/app/components/adblock/adblock.component.scss create mode 100644 web/src/app/components/adblock/adblock.component.ts delete mode 100644 web/src/app/components/cache/cache.component.html delete mode 100644 web/src/app/components/cache/cache.component.scss delete mode 100644 web/src/app/components/cache/cache.component.ts create mode 100644 web/src/app/components/dynamic/dynamic.component.html create mode 100644 web/src/app/components/dynamic/dynamic.component.scss create mode 100644 web/src/app/components/dynamic/dynamic.component.ts create mode 100644 web/src/app/components/fixed/fixed.component.html create mode 100644 web/src/app/components/fixed/fixed.component.scss create mode 100644 web/src/app/components/fixed/fixed.component.ts create mode 100644 web/src/app/models/adblock.ts create mode 100644 web/src/app/models/fixed.ts create mode 100644 web/src/app/pipe/domain-filter.pipe.ts create mode 100644 web/src/app/pipe/domain.pipe.ts create mode 100644 web/src/app/pipe/index.pipe.ts create mode 100644 web/src/app/pipe/pipe.module.ts create mode 100644 web/src/app/services/error-interceptor.service.ts delete mode 100644 web/src/app/services/http/error.interceptor.ts delete mode 100644 web/src/app/services/http/http.service.ts diff --git a/.deb.yaml b/.deb.yaml index 28ea460..afc74c3 100755 --- a/.deb.yaml +++ b/.deb.yaml @@ -1,11 +1,11 @@ package: fdns source: fdns -version: '1:0.0.4' +version: '1:0.0.5' architecture: - amd64 - arm64 maintainer: DewepOnline -homepage: https://dewep.online/fdns.html +homepage: https://www.dewep.online/products/fdns description: - Filter DNS section: web @@ -14,9 +14,11 @@ control: depends: - systemd - ca-certificates + - sqlite3 build: scripts/build.sh conffiles: - /etc/fdns/config.yaml + - /var/lib/fdns/data.sqlite preinst: scripts/preinst.sh postinst: scripts/postinst.sh prerm: scripts/prerm.sh diff --git a/.gitignore b/.gitignore index d26b3c0..6b73ca9 100644 --- a/.gitignore +++ b/.gitignore @@ -6,11 +6,13 @@ *.out *.lock *.log +*.sqlite .DS_Store .glide .idea .vscode +.tools /vendor .angulardoc.json diff --git a/Makefile b/Makefile index 13c8997..d3c62e5 100644 --- a/Makefile +++ b/Makefile @@ -3,13 +3,13 @@ SHELL=/bin/bash .PHONY: run_back run_front run_back: go generate ./... - go run -race cmd/fdns/main.go -config=./configs/config.dev.yaml + go run -race cmd/fdns/main.go run -config=./configs/config.dev.yaml run_front: cd web && npm ci --no-delete --cache=/tmp && npm run start .PHONY: build_back build_font build_back: - bash scripts/build.sh back + bash scripts/build.sh amd64 build_font: bash scripts/build.sh front @@ -31,5 +31,12 @@ develop_down: ci: bash scripts/ci.sh -deb: build_font build_back +deb: build_font deb-builder build + +nslookup: + nslookup -port=8053 google.com 127.0.0.1 + nslookup -port=8053 yandex.ru 127.0.0.1 + nslookup -port=8053 vk.com 127.0.0.1 + nslookup -port=8053 dewep.pro 127.0.0.1 + nslookup -port=8053 dewep.online 127.0.0.1 diff --git a/cmd/fdns/main.go b/cmd/fdns/main.go index aad021a..4f1a5ce 100755 --- a/cmd/fdns/main.go +++ b/cmd/fdns/main.go @@ -1,35 +1,42 @@ package main import ( - "flag" - - "github.com/dewep-online/fdns/internal/api" "github.com/dewep-online/fdns/internal/dnsserver" "github.com/dewep-online/fdns/internal/webserver" "github.com/dewep-online/fdns/pkg" "github.com/deweppro/go-app/application" + "github.com/deweppro/go-app/console" "github.com/deweppro/go-logger" ) -var configFile = flag.String("config", "./config.yaml", "path to config file") - func main() { - flag.Parse() + root := console.New("uri-one", "help uri-one") + root.AddCommand(appRun()) + root.Exec() +} - application.New(). - Logger(logger.Default()). - ConfigFile( - *configFile, - pkg.Config, - webserver.Config, - dnsserver.Config, - api.Config, - ). - Modules( - pkg.Module, - webserver.Module, - dnsserver.Module, - api.Module, - ). - Run() +func appRun() console.CommandGetter { + return console.NewCommand(func(setter console.CommandSetter) { + setter.Setup("run", "run application") + setter.Example("run --config=./config.yaml") + setter.Flag(func(f console.FlagsSetter) { + f.StringVar("config", "./config.yaml", "path to config file") + }) + setter.ExecFunc(func(_ []string, config string) { + application.New(). + Logger(logger.Default()). + ConfigFile( + config, + pkg.Config, + webserver.Config, + dnsserver.Config, + ). + Modules( + pkg.Module, + webserver.Module, + dnsserver.Module, + ). + Run() + }) + }) } diff --git a/configs/config.dev.yaml b/configs/config.dev.yaml index ff2e7b4..8592bf2 100755 --- a/configs/config.dev.yaml +++ b/configs/config.dev.yaml @@ -4,9 +4,9 @@ log: /dev/stdout level: 3 http: - addr: 0.0.0.0:10053 + addr: 0.0.0.0:10080 debug: - addr: 0.0.0.0:12053 + addr: 0.0.0.0:10081 srv: enable: true @@ -25,37 +25,7 @@ blacklistip: - 127.0.0.1 - 10.0.0.0/24 -dns: - - 1.1.1.1 - - "1.0.0.1:53" +sqlite: + - file: ./data.sqlite -dump-rules: ./dump.txt - -adblock-rules: - - https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt - - https://easylist.to/easylist/easylist.txt - - https://filters.adtidy.org/extension/ublock/filters/11.txt - - https://easylist.to/easylist/easyprivacy.txt - - https://filters.adtidy.org/extension/ublock/filters/17.txt - - https://filters.adtidy.org/extension/ublock/filters/3.txt - - https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/badware.txt - - https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt - - https://filters.adtidy.org/extension/ublock/filters/4.txt - - https://filters.adtidy.org/extension/ublock/filters/14.txt - - https://raw.githubusercontent.com/Spam404/lists/master/adblock-list.txt - -dns-rules: - "example-ns.com": "8.8.8.8, [2001:4860:4860::8888]:53" - -host-rules: - "example-host.com": "255.255.255.255, 0:0:0:0:0:ffff:ffff:ffff" - "example-host2.com": "" - -regexp-rules: - '.*\.example-regexp\.com': "255.255.255.255, 0:0:0:0:0:ffff:ffff:ffff" - '(\d+)-(\d+)-(\d+)-(\d+)\.example\.com': "$1.$2.$3.$4" - '(\d+)-(\d+)-(\d+)-(\d+)\.example2\.com': "" - -query-rules: - "ex?mple.*": "255.255.255.255, 0:0:0:0:0:ffff:ffff:ffff" - "ex?mple2.*": "" +adblock-rules: https://fdns.dewep.online/adblock-rules.json diff --git a/configs/config.yaml b/configs/config.yaml index 1d7e8ae..80adfb7 100755 --- a/configs/config.yaml +++ b/configs/config.yaml @@ -25,36 +25,7 @@ blacklistip: - 127.0.0.1 - 10.0.0.0/24 -dns: - - 1.1.1.1 - - "1.0.0.1:53" -# - "2606:4700:4700::1111" -# - "[2606:4700:4700::1001]:53" +sqlite: + - file: /var/lib/fdns/data.sqlite -dump-rules: /var/lib/fdns/dump.txt - -adblock-rules: - - https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt - - https://easylist.to/easylist/easylist.txt - - https://filters.adtidy.org/extension/ublock/filters/11.txt - - https://easylist.to/easylist/easyprivacy.txt - - https://filters.adtidy.org/extension/ublock/filters/17.txt - - https://filters.adtidy.org/extension/ublock/filters/3.txt - - https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/badware.txt - - https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt - - https://filters.adtidy.org/extension/ublock/filters/4.txt - - https://filters.adtidy.org/extension/ublock/filters/14.txt - - https://raw.githubusercontent.com/Spam404/lists/master/adblock-list.txt - -dns-rules: -# "example-ns.com": "8.8.8.8, [2001:4860:4860::8888]:53" - -host-rules: -# "example-host.com": "255.255.255.255, 0:0:0:0:0:ffff:ffff:ffff" - -regexp-rules: -# '.*\.example-regexp\.com': "255.255.255.255, 0:0:0:0:0:ffff:ffff:ffff" -# '(\d+)-(\d+)-(\d+)-(\d+)\.example\.com': "$1.$2.$3.$4" - -query-rules: -# "ex?mple.*": "255.255.255.255, 0:0:0:0:0:ffff:ffff:ffff" +adblock-rules: https://fdns.dewep.online/adblock-rules.json diff --git a/go.mod b/go.mod index 1202410..2d78eea 100644 --- a/go.mod +++ b/go.mod @@ -3,24 +3,27 @@ module github.com/dewep-online/fdns go 1.17 require ( - github.com/deweppro/go-app v1.4.3 - github.com/deweppro/go-http v1.3.4 - github.com/deweppro/go-logger v1.2.3 - github.com/deweppro/go-static v1.0.6 + github.com/deweppro/go-app v1.5.4 + github.com/deweppro/go-errors v0.0.4 + github.com/deweppro/go-http v1.4.3 + github.com/deweppro/go-logger v1.3.0 + github.com/deweppro/go-orm v1.1.0 + github.com/deweppro/go-static v1.1.1 github.com/mailru/easyjson v0.7.7 - github.com/miekg/dns v1.1.46 + github.com/miekg/dns v1.1.50 + github.com/stretchr/testify v1.7.1 ) require ( - github.com/deweppro/go-algorithms v1.1.1 // indirect - github.com/deweppro/go-chan-pool v1.1.1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/deweppro/go-algorithms v1.2.0 // indirect + github.com/deweppro/go-chan-pool v1.1.2 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/pelletier/go-toml v1.9.3 // indirect - github.com/pkg/errors v0.9.1 // indirect - golang.org/x/mod v0.5.1 // indirect - golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd // indirect - golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c // indirect - golang.org/x/tools v0.1.9 // indirect - golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect + github.com/mattn/go-sqlite3 v1.14.13 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect + golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect + golang.org/x/tools v0.1.11 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 61e5e5a..abe64be 100644 --- a/go.sum +++ b/go.sum @@ -1,49 +1,54 @@ 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/deweppro/go-algorithms v1.1.1 h1:FOzPuYmFuFGN6Nmcos5zC1WfD3Ya8XxUJ6OihrhFh4Q= -github.com/deweppro/go-algorithms v1.1.1/go.mod h1:h50x8PTIGbiIhOh5vH/10J39vTzi2UmG7TVLupellqY= -github.com/deweppro/go-app v1.4.3 h1:hS+9HnAkPutdx2Cegtg7iuKBR4eV3jac93b5QdwBYQQ= -github.com/deweppro/go-app v1.4.3/go.mod h1:Tm4RUCOw7R/qnomzYT/rIykfqRI1zNfDArpHsaLgl/I= -github.com/deweppro/go-chan-pool v1.1.1 h1:TCoQhgXG6GP7zTJiKwOmqSeaR64651cWFpVniD5BIys= -github.com/deweppro/go-chan-pool v1.1.1/go.mod h1:lEtDI+rhCE/ES1i9q0FOtYgjMftw5PCCepit4a+9Uds= -github.com/deweppro/go-http v1.3.4 h1:TFTzHL9aum8vV0+rKxvULCM43niOrX8HawHRrYbThX0= -github.com/deweppro/go-http v1.3.4/go.mod h1:ojctNbO2yH7tiSMTu+PN0zgJPS7hFIWGPdoUS+dERQQ= -github.com/deweppro/go-logger v1.2.3 h1:icOV4UwBGc8s9S8zcNIcDjBK00qQtcuBZzBgRmMaq24= -github.com/deweppro/go-logger v1.2.3/go.mod h1:bPDvX/7B3+i5f8nGOq4bZbhJrf4PgjYRCePqMrF5smw= -github.com/deweppro/go-static v1.0.6 h1:9tT0fUjVUVPIp2yWT/7uaJykp0X8sT2O5pltqusyi9s= -github.com/deweppro/go-static v1.0.6/go.mod h1:Y74ygnNwniS2d22EIe4e4kASIBaD6IlmaLKUbq90PQE= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/deweppro/go-algorithms v1.2.0 h1:fBS+GNQaeSDSmvFWdmkKLcKXo2DhX5M0AJaCxEqGedY= +github.com/deweppro/go-algorithms v1.2.0/go.mod h1:zYdfRdlpaXgdT36OgvdjH1qtTZFWEeBi3KUQmWltMPI= +github.com/deweppro/go-app v1.5.4 h1:Dqg6fk4lGP2z2NtlhmT5qdDpGuYwzvRMzsEpVgvnh68= +github.com/deweppro/go-app v1.5.4/go.mod h1:rZ95OfFGvRnm5ndIJI+DOtoOuVrgy3NeQ2vwmbmi0Tk= +github.com/deweppro/go-chan-pool v1.1.2 h1:mm+gvwAFB5NijCiJDSx9RqrB2AWTembzL9Rf6XTv4BI= +github.com/deweppro/go-chan-pool v1.1.2/go.mod h1:6meJsORhraeyvJNPy4hx8xgBNjp2xx3KGB/d5Q5a/I4= +github.com/deweppro/go-errors v0.0.4 h1:TW91LRqHAkUauDJ5lzz73LziANH7mjli1tyvtwzXRCM= +github.com/deweppro/go-errors v0.0.4/go.mod h1:BLsNcxaHh1fjNl/o1TB69JwA8XueSk/Nszkvw4ZwI/I= +github.com/deweppro/go-http v1.4.3 h1:bm4PY+SBoZ9KISdtrAx8rV/hKn6t+ggt5P12+hqlE3o= +github.com/deweppro/go-http v1.4.3/go.mod h1:zta7HINyRd9nmSRtqxw6APOTXwDPBI42G9iZQwqtQVU= +github.com/deweppro/go-logger v1.3.0 h1:KN6RQmb6IoNBxQ7zx7Y1AtptHeL//FRgvQyEF5PrcsE= +github.com/deweppro/go-logger v1.3.0/go.mod h1:jxBBLyHmIvJ4erGUj5qeE6ir36ztyAL1pI+9GymOHVI= +github.com/deweppro/go-orm v1.1.0 h1:CmW1OU+W6mn0Nk1MdoMf6PWxP12nIK/sXImboIwindw= +github.com/deweppro/go-orm v1.1.0/go.mod h1:JEbxJLmXMjSOtlwhuJmrJKZRLhcJcexRvGZ6hgautaw= +github.com/deweppro/go-static v1.1.1 h1:FMKScbEj/GWEqmjiOuBFTHph15kui79RQwyT9QxZjVE= +github.com/deweppro/go-static v1.1.1/go.mod h1:xE+EEQL4vtpACZ+IkgfQvx6hbGsXnNeEodrPwN22s1c= +github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/miekg/dns v1.1.46 h1:uzwpxRtSVxtcIZmz/4Uz6/Rn7G11DvsaslXoy5LxQio= -github.com/miekg/dns v1.1.46/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= -github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/mattn/go-sqlite3 v1.14.13 h1:1tj15ngiFfcZzii7yd82foL+ks+ouQcj8j/TPq3fk1I= +github.com/mattn/go-sqlite3 v1.14.13/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA= +github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME= 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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -53,32 +58,32 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c h1:sSIdNI2Dd6vGv47bKc/xArpfxVmEz2+3j0E6I484xC4= -golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= 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-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -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-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/init/supervisor/conf.d/fdns.conf b/init/supervisor/conf.d/fdns.conf index 6637c8c..8724924 100755 --- a/init/supervisor/conf.d/fdns.conf +++ b/init/supervisor/conf.d/fdns.conf @@ -1,5 +1,5 @@ [program:fdns] -command=/usr/bin/fdns --config=/etc/fdns/config.yaml +command=/usr/bin/fdns run --config=/etc/fdns/config.yaml autostart=true autorestart=true startretries=10 diff --git a/init/systemd/fdns.service b/init/systemd/fdns.service index 169c04e..371ce7d 100755 --- a/init/systemd/fdns.service +++ b/init/systemd/fdns.service @@ -7,7 +7,7 @@ Group=root Restart=on-failure RestartSec=30s Type=simple -ExecStart=/usr/bin/fdns --config=/etc/fdns/config.yaml +ExecStart=/usr/bin/fdns run --config=/etc/fdns/config.yaml KillMode=process KillSignal=SIGTERM diff --git a/internal/api/api.go b/internal/api/api.go deleted file mode 100755 index 9352a53..0000000 --- a/internal/api/api.go +++ /dev/null @@ -1,34 +0,0 @@ -package api - -import ( - "net/http" - - "github.com/dewep-online/fdns/pkg/cache" - "github.com/deweppro/go-http/pkg/routes" -) - -//API model -type API struct { - route *routes.Router - repo *cache.Repository -} - -//NewAPI init api -func NewAPI(route *routes.Router, repo *cache.Repository) *API { - return &API{ - route: route, - repo: repo, - } -} - -//Up startup api service -func (v *API) Up() error { - v.route.Route("/api/cache/list", v.CacheList, http.MethodGet) - - return nil -} - -//Down shutdown api service -func (v *API) Down() error { - return nil -} diff --git a/internal/api/controller.go b/internal/api/controller.go deleted file mode 100755 index ca4ea1d..0000000 --- a/internal/api/controller.go +++ /dev/null @@ -1,34 +0,0 @@ -package api - -import ( - "net/http" - "sort" - - "github.com/deweppro/go-http/pkg/httputil/enc" -) - -//go:generate easyjson - -//easyjson:json -type ( - CacheList []CacheListItem - CacheListItem struct { - Domain string `json:"domain"` - IP []string `json:"ip"` - } -) - -//Index controller -func (v *API) CacheList(w http.ResponseWriter, r *http.Request) { - list := make(CacheList, 0) - v.repo.List(func(name string, ip []string) { - list = append(list, CacheListItem{ - Domain: name, - IP: ip, - }) - }) - sort.Slice(list, func(i, j int) bool { - return list[i].Domain < list[j].Domain - }) - enc.JSON(w, list) -} diff --git a/internal/api/controller_easyjson.go b/internal/api/controller_easyjson.go deleted file mode 100644 index bfabf62..0000000 --- a/internal/api/controller_easyjson.go +++ /dev/null @@ -1,190 +0,0 @@ -// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT. - -package api - -import ( - json "encoding/json" - easyjson "github.com/mailru/easyjson" - jlexer "github.com/mailru/easyjson/jlexer" - jwriter "github.com/mailru/easyjson/jwriter" -) - -// suppress unused package warning -var ( - _ *json.RawMessage - _ *jlexer.Lexer - _ *jwriter.Writer - _ easyjson.Marshaler -) - -func easyjson168ae10cDecodeGithubComDewepOnlineFdnsInternalApi(in *jlexer.Lexer, out *CacheListItem) { - isTopLevel := in.IsStart() - if in.IsNull() { - if isTopLevel { - in.Consumed() - } - in.Skip() - return - } - in.Delim('{') - for !in.IsDelim('}') { - key := in.UnsafeFieldName(false) - in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } - switch key { - case "domain": - out.Domain = string(in.String()) - case "ip": - if in.IsNull() { - in.Skip() - out.IP = nil - } else { - in.Delim('[') - if out.IP == nil { - if !in.IsDelim(']') { - out.IP = make([]string, 0, 4) - } else { - out.IP = []string{} - } - } else { - out.IP = (out.IP)[:0] - } - for !in.IsDelim(']') { - var v1 string - v1 = string(in.String()) - out.IP = append(out.IP, v1) - in.WantComma() - } - in.Delim(']') - } - default: - in.SkipRecursive() - } - in.WantComma() - } - in.Delim('}') - if isTopLevel { - in.Consumed() - } -} -func easyjson168ae10cEncodeGithubComDewepOnlineFdnsInternalApi(out *jwriter.Writer, in CacheListItem) { - out.RawByte('{') - first := true - _ = first - { - const prefix string = ",\"domain\":" - out.RawString(prefix[1:]) - out.String(string(in.Domain)) - } - { - const prefix string = ",\"ip\":" - out.RawString(prefix) - if in.IP == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 { - out.RawString("null") - } else { - out.RawByte('[') - for v2, v3 := range in.IP { - if v2 > 0 { - out.RawByte(',') - } - out.String(string(v3)) - } - out.RawByte(']') - } - } - out.RawByte('}') -} - -// MarshalJSON supports json.Marshaler interface -func (v CacheListItem) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - easyjson168ae10cEncodeGithubComDewepOnlineFdnsInternalApi(&w, v) - return w.Buffer.BuildBytes(), w.Error -} - -// MarshalEasyJSON supports easyjson.Marshaler interface -func (v CacheListItem) MarshalEasyJSON(w *jwriter.Writer) { - easyjson168ae10cEncodeGithubComDewepOnlineFdnsInternalApi(w, v) -} - -// UnmarshalJSON supports json.Unmarshaler interface -func (v *CacheListItem) UnmarshalJSON(data []byte) error { - r := jlexer.Lexer{Data: data} - easyjson168ae10cDecodeGithubComDewepOnlineFdnsInternalApi(&r, v) - return r.Error() -} - -// UnmarshalEasyJSON supports easyjson.Unmarshaler interface -func (v *CacheListItem) UnmarshalEasyJSON(l *jlexer.Lexer) { - easyjson168ae10cDecodeGithubComDewepOnlineFdnsInternalApi(l, v) -} -func easyjson168ae10cDecodeGithubComDewepOnlineFdnsInternalApi1(in *jlexer.Lexer, out *CacheList) { - isTopLevel := in.IsStart() - if in.IsNull() { - in.Skip() - *out = nil - } else { - in.Delim('[') - if *out == nil { - if !in.IsDelim(']') { - *out = make(CacheList, 0, 1) - } else { - *out = CacheList{} - } - } else { - *out = (*out)[:0] - } - for !in.IsDelim(']') { - var v4 CacheListItem - (v4).UnmarshalEasyJSON(in) - *out = append(*out, v4) - in.WantComma() - } - in.Delim(']') - } - if isTopLevel { - in.Consumed() - } -} -func easyjson168ae10cEncodeGithubComDewepOnlineFdnsInternalApi1(out *jwriter.Writer, in CacheList) { - if in == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 { - out.RawString("null") - } else { - out.RawByte('[') - for v5, v6 := range in { - if v5 > 0 { - out.RawByte(',') - } - (v6).MarshalEasyJSON(out) - } - out.RawByte(']') - } -} - -// MarshalJSON supports json.Marshaler interface -func (v CacheList) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - easyjson168ae10cEncodeGithubComDewepOnlineFdnsInternalApi1(&w, v) - return w.Buffer.BuildBytes(), w.Error -} - -// MarshalEasyJSON supports easyjson.Marshaler interface -func (v CacheList) MarshalEasyJSON(w *jwriter.Writer) { - easyjson168ae10cEncodeGithubComDewepOnlineFdnsInternalApi1(w, v) -} - -// UnmarshalJSON supports json.Unmarshaler interface -func (v *CacheList) UnmarshalJSON(data []byte) error { - r := jlexer.Lexer{Data: data} - easyjson168ae10cDecodeGithubComDewepOnlineFdnsInternalApi1(&r, v) - return r.Error() -} - -// UnmarshalEasyJSON supports easyjson.Unmarshaler interface -func (v *CacheList) UnmarshalEasyJSON(l *jlexer.Lexer) { - easyjson168ae10cDecodeGithubComDewepOnlineFdnsInternalApi1(l, v) -} diff --git a/internal/api/dic.go b/internal/api/dic.go deleted file mode 100755 index 2e0c71f..0000000 --- a/internal/api/dic.go +++ /dev/null @@ -1,14 +0,0 @@ -package api - -import ( - "github.com/deweppro/go-app/application" -) - -var ( - //Module di injector - Module = application.Modules{ - NewAPI, - } - //Config di injector - Config = application.Modules{} -) diff --git a/internal/dnsserver/server.go b/internal/dnsserver/server.go index 04c9c8c..6c2108f 100644 --- a/internal/dnsserver/server.go +++ b/internal/dnsserver/server.go @@ -7,8 +7,9 @@ import ( "net/http" "time" + "github.com/deweppro/go-app/application/ctx" + "github.com/dewep-online/fdns/pkg/rules" - "github.com/deweppro/go-app/application" "github.com/deweppro/go-logger" "github.com/miekg/dns" ) @@ -18,20 +19,18 @@ type ( conf *ConfigTCP servers map[string]*dns.Server store *rules.Repository - close *application.ForceClose } ) -func New(c *ConfigTCP, f *application.ForceClose, r *rules.Repository) *Server { +func New(c *ConfigTCP, r *rules.Repository) *Server { return &Server{ servers: make(map[string]*dns.Server), conf: c, - close: f, store: r, } } -func (v *Server) Up() error { +func (v *Server) Up(ctx ctx.Context) error { handler := dns.NewServeMux() handler.HandleFunc(".", v.handler) @@ -43,13 +42,13 @@ func (v *Server) Up() error { return err } - v.runServers() + v.runServers(ctx) return nil } -func (v *Server) Down() (err error) { +func (v *Server) Down(_ ctx.Context) (err error) { for name, server := range v.servers { if err := server.Shutdown(); err != nil && err != http.ErrServerClosed { logger.Errorf("%s [%s]: %s", name, server.Addr, err.Error()) @@ -139,7 +138,7 @@ func (v *Server) tlsCertificate() (*tls.Certificate, error) { return &cert, nil } -func (v *Server) runServers() { +func (v *Server) runServers(ctx ctx.Context) { for name, server := range v.servers { server := server name := name @@ -147,7 +146,7 @@ func (v *Server) runServers() { go func(name string, srv *dns.Server) { if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { logger.Errorf("%s [%s]: %s", name, srv.Addr, err.Error()) - v.close.Close() + ctx.Close() } }(name, server) diff --git a/internal/webserver/config.go b/internal/webserver/config.go index 06d1d63..0bd6520 100755 --- a/internal/webserver/config.go +++ b/internal/webserver/config.go @@ -3,15 +3,19 @@ package webserver import "github.com/deweppro/go-http/servers" type ( - BaseConfig struct { - Middleware Middleware `yaml:"middleware"` + //MiddlewareConfig model + MiddlewareConfig struct { + Middleware ConfigItem `yaml:"middleware"` } - Middleware struct { + + //ConfigItem model + ConfigItem struct { Throttling int64 `yaml:"throttling"` } -) -type WebConfig struct { - Http servers.Config `yaml:"http"` - Debug servers.Config `yaml:"debug"` -} + //WebConfig model + WebConfig struct { + Http servers.Config `yaml:"http"` + Debug servers.Config `yaml:"debug"` + } +) diff --git a/internal/webserver/di.go b/internal/webserver/di.go new file mode 100755 index 0000000..064f6e4 --- /dev/null +++ b/internal/webserver/di.go @@ -0,0 +1,29 @@ +package webserver + +import ( + "github.com/deweppro/go-app/application" + "github.com/deweppro/go-http/pkg/routes" + "github.com/deweppro/go-http/servers/debug" + "github.com/deweppro/go-http/servers/web" + "github.com/deweppro/go-logger" +) + +var ( + //Module di injector + Module = application.Modules{ + routes.NewRouter, + WebAdapter, + New, + } + //Config di injector + Config = application.Modules{ + &WebConfig{}, + &MiddlewareConfig{}, + } +) + +func WebAdapter(c *WebConfig, r *routes.Router) (*web.Server, *debug.Debug) { + ws := web.New(c.Http, r, logger.Default()) + ds := debug.New(c.Debug, logger.Default()) + return ws, ds +} diff --git a/internal/webserver/routes.go b/internal/webserver/routes.go deleted file mode 100755 index 9549d27..0000000 --- a/internal/webserver/routes.go +++ /dev/null @@ -1,63 +0,0 @@ -package webserver - -import ( - "net/http" - - "github.com/deweppro/go-http/pkg/routes" - "github.com/deweppro/go-logger" - "github.com/deweppro/go-static" -) - -//go:generate static ./../../web/dist/fdns ui - -var ui static.Reader - -//Routes model -type Routes struct { - route *routes.Router - conf *BaseConfig -} - -//NewRoutes init router -func New(c *BaseConfig, r *routes.Router) *Routes { - return &Routes{ - route: r, - conf: c, - } -} - -//Up startup api service -func (v *Routes) Up() error { - v.route.Global(routes.RecoveryMiddleware(logger.Default())) - v.route.Global(routes.ThrottlingMiddleware(v.conf.Middleware.Throttling)) - - for _, file := range ui.List() { - logger.WithFields(logger.Fields{"url": file}).Infof("add static route") - v.route.Route(file, v.Static, http.MethodGet) - } - v.route.Route("/", v.Static, http.MethodGet) - - return nil -} - -//Down shutdown api service -func (v *Routes) Down() error { - return nil -} - -//Static controller -func (v *Routes) Static(w http.ResponseWriter, r *http.Request) { - filename := r.RequestURI - switch filename { - case "", "/": - filename = "/index.html" - default: - } - - if err := ui.ResponseWrite(w, filename); err != nil { - logger.WithFields(logger.Fields{ - "err": err.Error(), - "url": filename, - }).Infof("static response") - } -} diff --git a/internal/webserver/ws.go b/internal/webserver/ws.go new file mode 100644 index 0000000..0fb302a --- /dev/null +++ b/internal/webserver/ws.go @@ -0,0 +1,51 @@ +package webserver + +import ( + "github.com/dewep-online/fdns/pkg/cache" + "github.com/dewep-online/fdns/pkg/database" + "github.com/dewep-online/fdns/pkg/dnscli" + "github.com/dewep-online/fdns/pkg/rules" + "github.com/deweppro/go-http/pkg/routes" + "github.com/deweppro/go-logger" + "github.com/deweppro/go-static" +) + +//WebServer model +type WebServer struct { + conf *MiddlewareConfig + route *routes.Router + cache *static.Cache + repo *cache.Repository + rules *rules.Repository + cli *dnscli.Client + db *database.Database +} + +func New(route *routes.Router, conf *MiddlewareConfig, repo *cache.Repository, + rules *rules.Repository, db *database.Database, cli *dnscli.Client) *WebServer { + return &WebServer{ + cache: static.New(), + route: route, + conf: conf, + repo: repo, + rules: rules, + cli: cli, + db: db, + } +} + +//Up startup api service +func (v *WebServer) Up() error { + v.route.Global(routes.RecoveryMiddleware(logger.Default())) + v.route.Global(routes.ThrottlingMiddleware(v.conf.Middleware.Throttling)) + + v.RegisterUI() + v.RegisterAPI() + + return nil +} + +//Down shutdown api service +func (v *WebServer) Down() error { + return nil +} diff --git a/internal/webserver/ws_api.go b/internal/webserver/ws_api.go new file mode 100644 index 0000000..5009b3f --- /dev/null +++ b/internal/webserver/ws_api.go @@ -0,0 +1,329 @@ +package webserver + +//go:generate easyjson + +import ( + "net/http" + "sort" + "strings" + + "github.com/deweppro/go-http/pkg/httputil/dec" + "github.com/deweppro/go-http/pkg/httputil/enc" + + "github.com/dewep-online/fdns/pkg/database" + + "github.com/dewep-online/fdns/pkg/utils" + + "github.com/deweppro/go-logger" +) + +func (v *WebServer) RegisterAPI() { + v.route.Route("/api", v.Index, http.MethodGet) + v.route.Route("/api/cache/list", v.CacheList, http.MethodGet) + v.route.Route("/api/cache/block", v.BlockDomain, http.MethodPost) + + v.route.Route("/api/adblock/list/uri", v.AdblockURIList, http.MethodGet) + v.route.Route("/api/adblock/list/domain", v.AdblockDomainList, http.MethodGet) + v.route.Route("/api/adblock/active", v.AdblockActive, http.MethodPost) + + v.route.Route("/api/fixed/list", v.FixedList, http.MethodGet) + v.route.Route("/api/fixed/save", v.FixedSave, http.MethodPost) + v.route.Route("/api/fixed/active", v.FixedActive, http.MethodPost) + v.route.Route("/api/fixed/delete", v.FixedDelete, http.MethodPost) +} + +func (v *WebServer) Index(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + if _, err := w.Write([]byte("Hello")); err != nil { + logger.Errorf("Index: %s", err.Error()) + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//easyjson:json +type ( + CacheList []CacheListItem + CacheListItem struct { + Domain string `json:"domain"` + IP []string `json:"ip"` + TTL string `json:"ttl"` + } +) + +func (v *WebServer) CacheList(w http.ResponseWriter, r *http.Request) { + var dyn bool + t := r.URL.Query().Get("type") + filter := r.URL.Query().Get("filter") + if t == "1" { + dyn = true + } + + list := make(CacheList, 0) + v.repo.List(dyn, strings.TrimSpace(filter), func(name string, ip []string, ttl string) { + list = append(list, CacheListItem{ + Domain: name, + IP: ip, + TTL: ttl, + }) + }) + sort.Slice(list, func(i, j int) bool { + return list[i].Domain < list[j].Domain + }) + enc.JSON(w, list) +} + +//easyjson:json +type BlockDomainModel struct { + Domain string `json:"domain"` +} + +func (v *WebServer) BlockDomain(w http.ResponseWriter, r *http.Request) { + var err error + mod := BlockDomainModel{} + if err = dec.JSON(r, &mod); err != nil { + enc.Error(w, err) + return + } + mod.Domain, err = utils.ValidateDomain(mod.Domain) + if err != nil { + enc.Error(w, err) + return + } + + err = v.db.SetRules(r.Context(), database.Host, mod.Domain, "", database.ActiveTrue) + if err != nil { + enc.Error(w, err) + return + } + + v.repo.Set(mod.Domain, nil, nil, 0) + v.repo.DelDynamic(mod.Domain) + w.WriteHeader(http.StatusOK) +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//easyjson:json +type ( + AdblockDomainModel struct { + Tag string `json:"tag"` + Domain string `json:"domain"` + Active bool `json:"active"` + } + AdblockURIModel struct { + Tag string `json:"tag"` + URI string `json:"uri"` + Active bool `json:"active"` + } +) + +func (v *WebServer) AdblockURIList(w http.ResponseWriter, r *http.Request) { + vv, err := v.db.GetBlacklistURI(r.Context(), 0) + if err != nil { + enc.Error(w, err) + return + } + list := make([]AdblockURIModel, 0, len(vv)) + for _, model := range vv { + list = append(list, AdblockURIModel{ + Tag: model.Tag, + URI: model.URI, + Active: model.Active == database.ActiveTrue, + }) + } + sort.Slice(list, func(i, j int) bool { + return list[i].URI < list[j].URI + }) + enc.JSON(w, list) +} + +func (v *WebServer) AdblockDomainList(w http.ResponseWriter, r *http.Request) { + vv, err := v.db.GetBlacklistDomain(r.Context(), 0) + if err != nil { + enc.Error(w, err) + return + } + list := make([]AdblockDomainModel, 0, len(vv)) + for _, model := range vv { + list = append(list, AdblockDomainModel{ + Tag: model.Tag, + Domain: model.Domain, + Active: model.Active == database.ActiveTrue, + }) + } + sort.Slice(list, func(i, j int) bool { + return list[i].Domain < list[j].Domain + }) + enc.JSON(w, list) +} + +//easyjson:json +type ( + AdblockActiveModel struct { + Domain string `json:"domain"` + Active bool `json:"active"` + } +) + +func (v *WebServer) AdblockActive(w http.ResponseWriter, r *http.Request) { + var err error + mod := AdblockActiveModel{} + if err = dec.JSON(r, &mod); err != nil { + enc.Error(w, err) + return + } + mod.Domain, err = utils.ValidateDomain(mod.Domain) + if err != nil { + enc.Error(w, err) + return + } + + active := database.ActiveFalse + if mod.Active { + active = database.ActiveTrue + } + + if err = v.db.SetBlacklistDomainActive(r.Context(), mod.Domain, active); err != nil { + enc.Error(w, err) + return + } + + if mod.Active { + v.repo.DelDynamic(mod.Domain) + v.repo.Set(mod.Domain, nil, nil, 0) + } else { + v.repo.DelFixed(mod.Domain) + } + + w.WriteHeader(http.StatusOK) +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//easyjson:json +type ( + FixedList []FixedListItem + FixedListItem struct { + Types string `json:"types"` + Origin string `json:"origin"` + Domain string `json:"domain"` + IPs string `json:"ips"` + Active bool `json:"active"` + } +) + +func (v *WebServer) FixedList(w http.ResponseWriter, r *http.Request) { + rules, err := v.db.GetAllRules(r.Context(), 0) + if err != nil { + enc.Error(w, err) + return + } + list := make(FixedList, 0, len(rules)) + for _, rule := range rules { + list = append(list, FixedListItem{ + Types: rule.Types, + Origin: rule.Domain, + Domain: rule.Domain, + IPs: rule.IPs, + Active: rule.Active == database.ActiveTrue, + }) + } + sort.Slice(list, func(i, j int) bool { + return list[i].Types < list[j].Types + }) + enc.JSON(w, list) +} + +func (v *WebServer) FixedSave(w http.ResponseWriter, r *http.Request) { + var err error + mod := FixedListItem{} + if err = dec.JSON(r, &mod); err != nil { + enc.Error(w, err) + return + } + + tt, err := database.ValidateType(mod.Types) + if err != nil { + enc.Error(w, err) + return + } + + if tt == database.Host { + mod.Domain, err = utils.ValidateDomain(mod.Domain) + if err != nil { + enc.Error(w, err) + return + } + } + + active := database.ActiveFalse + if mod.Active { + active = database.ActiveTrue + } + + if err = v.db.SetRules(r.Context(), tt, mod.Domain, mod.IPs, active); err != nil { + enc.Error(w, err) + return + } + + switch tt { + case database.Host: + if mod.Active { + ip4, ip6 := utils.DecodeIPs(mod.IPs) + v.repo.DelDynamic(mod.Domain) + v.repo.Set(mod.Domain, ip4, ip6, 0) + } else { + v.repo.DelFixed(mod.Domain) + } + + case database.DNS, database.Regex, database.Query: + if mod.Active { + v.rules.ReplaceRexResolve(tt, mod.Origin, mod.Domain, mod.IPs) + } else { + v.rules.DeleteRexResolve(mod.Origin) + } + + case database.NS: + v.cli.UpgradeNS(r.Context()) + } + + mod.Origin = mod.Domain + + enc.JSON(w, &mod) +} + +func (v *WebServer) FixedActive(w http.ResponseWriter, r *http.Request) { + v.FixedSave(w, r) +} + +func (v *WebServer) FixedDelete(w http.ResponseWriter, r *http.Request) { + var err error + mod := FixedListItem{} + if err = dec.JSON(r, &mod); err != nil { + enc.Error(w, err) + return + } + + tt, err := database.ValidateType(mod.Types) + if err != nil { + enc.Error(w, err) + return + } + + if err = v.db.DelRules(r.Context(), tt, mod.Origin); err != nil { + enc.Error(w, err) + return + } + + switch tt { + case database.Host: + v.repo.DelFixed(mod.Origin) + case database.DNS, database.Regex, database.Query: + v.rules.DeleteRexResolve(mod.Origin) + case database.NS: + v.cli.UpgradeNS(r.Context()) + } + + w.WriteHeader(http.StatusOK) +} diff --git a/internal/webserver/ws_api_easyjson.go b/internal/webserver/ws_api_easyjson.go new file mode 100644 index 0000000..bdf5c39 --- /dev/null +++ b/internal/webserver/ws_api_easyjson.go @@ -0,0 +1,656 @@ +// Code generated by easyjson for marshaling/unmarshaling. DO NOT EDIT. + +package webserver + +import ( + json "encoding/json" + easyjson "github.com/mailru/easyjson" + jlexer "github.com/mailru/easyjson/jlexer" + jwriter "github.com/mailru/easyjson/jwriter" +) + +// suppress unused package warning +var ( + _ *json.RawMessage + _ *jlexer.Lexer + _ *jwriter.Writer + _ easyjson.Marshaler +) + +func easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver(in *jlexer.Lexer, out *FixedListItem) { + isTopLevel := in.IsStart() + if in.IsNull() { + if isTopLevel { + in.Consumed() + } + in.Skip() + return + } + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "types": + out.Types = string(in.String()) + case "origin": + out.Origin = string(in.String()) + case "domain": + out.Domain = string(in.String()) + case "ips": + out.IPs = string(in.String()) + case "active": + out.Active = bool(in.Bool()) + default: + in.SkipRecursive() + } + in.WantComma() + } + in.Delim('}') + if isTopLevel { + in.Consumed() + } +} +func easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver(out *jwriter.Writer, in FixedListItem) { + out.RawByte('{') + first := true + _ = first + { + const prefix string = ",\"types\":" + out.RawString(prefix[1:]) + out.String(string(in.Types)) + } + { + const prefix string = ",\"origin\":" + out.RawString(prefix) + out.String(string(in.Origin)) + } + { + const prefix string = ",\"domain\":" + out.RawString(prefix) + out.String(string(in.Domain)) + } + { + const prefix string = ",\"ips\":" + out.RawString(prefix) + out.String(string(in.IPs)) + } + { + const prefix string = ",\"active\":" + out.RawString(prefix) + out.Bool(bool(in.Active)) + } + out.RawByte('}') +} + +// MarshalJSON supports json.Marshaler interface +func (v FixedListItem) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver(&w, v) + return w.Buffer.BuildBytes(), w.Error +} + +// MarshalEasyJSON supports easyjson.Marshaler interface +func (v FixedListItem) MarshalEasyJSON(w *jwriter.Writer) { + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver(w, v) +} + +// UnmarshalJSON supports json.Unmarshaler interface +func (v *FixedListItem) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver(&r, v) + return r.Error() +} + +// UnmarshalEasyJSON supports easyjson.Unmarshaler interface +func (v *FixedListItem) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver(l, v) +} +func easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver1(in *jlexer.Lexer, out *FixedList) { + isTopLevel := in.IsStart() + if in.IsNull() { + in.Skip() + *out = nil + } else { + in.Delim('[') + if *out == nil { + if !in.IsDelim(']') { + *out = make(FixedList, 0, 0) + } else { + *out = FixedList{} + } + } else { + *out = (*out)[:0] + } + for !in.IsDelim(']') { + var v1 FixedListItem + (v1).UnmarshalEasyJSON(in) + *out = append(*out, v1) + in.WantComma() + } + in.Delim(']') + } + if isTopLevel { + in.Consumed() + } +} +func easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver1(out *jwriter.Writer, in FixedList) { + if in == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 { + out.RawString("null") + } else { + out.RawByte('[') + for v2, v3 := range in { + if v2 > 0 { + out.RawByte(',') + } + (v3).MarshalEasyJSON(out) + } + out.RawByte(']') + } +} + +// MarshalJSON supports json.Marshaler interface +func (v FixedList) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver1(&w, v) + return w.Buffer.BuildBytes(), w.Error +} + +// MarshalEasyJSON supports easyjson.Marshaler interface +func (v FixedList) MarshalEasyJSON(w *jwriter.Writer) { + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver1(w, v) +} + +// UnmarshalJSON supports json.Unmarshaler interface +func (v *FixedList) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver1(&r, v) + return r.Error() +} + +// UnmarshalEasyJSON supports easyjson.Unmarshaler interface +func (v *FixedList) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver1(l, v) +} +func easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver2(in *jlexer.Lexer, out *CacheListItem) { + isTopLevel := in.IsStart() + if in.IsNull() { + if isTopLevel { + in.Consumed() + } + in.Skip() + return + } + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "domain": + out.Domain = string(in.String()) + case "ip": + if in.IsNull() { + in.Skip() + out.IP = nil + } else { + in.Delim('[') + if out.IP == nil { + if !in.IsDelim(']') { + out.IP = make([]string, 0, 4) + } else { + out.IP = []string{} + } + } else { + out.IP = (out.IP)[:0] + } + for !in.IsDelim(']') { + var v4 string + v4 = string(in.String()) + out.IP = append(out.IP, v4) + in.WantComma() + } + in.Delim(']') + } + case "ttl": + out.TTL = string(in.String()) + default: + in.SkipRecursive() + } + in.WantComma() + } + in.Delim('}') + if isTopLevel { + in.Consumed() + } +} +func easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver2(out *jwriter.Writer, in CacheListItem) { + out.RawByte('{') + first := true + _ = first + { + const prefix string = ",\"domain\":" + out.RawString(prefix[1:]) + out.String(string(in.Domain)) + } + { + const prefix string = ",\"ip\":" + out.RawString(prefix) + if in.IP == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 { + out.RawString("null") + } else { + out.RawByte('[') + for v5, v6 := range in.IP { + if v5 > 0 { + out.RawByte(',') + } + out.String(string(v6)) + } + out.RawByte(']') + } + } + { + const prefix string = ",\"ttl\":" + out.RawString(prefix) + out.String(string(in.TTL)) + } + out.RawByte('}') +} + +// MarshalJSON supports json.Marshaler interface +func (v CacheListItem) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver2(&w, v) + return w.Buffer.BuildBytes(), w.Error +} + +// MarshalEasyJSON supports easyjson.Marshaler interface +func (v CacheListItem) MarshalEasyJSON(w *jwriter.Writer) { + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver2(w, v) +} + +// UnmarshalJSON supports json.Unmarshaler interface +func (v *CacheListItem) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver2(&r, v) + return r.Error() +} + +// UnmarshalEasyJSON supports easyjson.Unmarshaler interface +func (v *CacheListItem) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver2(l, v) +} +func easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver3(in *jlexer.Lexer, out *CacheList) { + isTopLevel := in.IsStart() + if in.IsNull() { + in.Skip() + *out = nil + } else { + in.Delim('[') + if *out == nil { + if !in.IsDelim(']') { + *out = make(CacheList, 0, 1) + } else { + *out = CacheList{} + } + } else { + *out = (*out)[:0] + } + for !in.IsDelim(']') { + var v7 CacheListItem + (v7).UnmarshalEasyJSON(in) + *out = append(*out, v7) + in.WantComma() + } + in.Delim(']') + } + if isTopLevel { + in.Consumed() + } +} +func easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver3(out *jwriter.Writer, in CacheList) { + if in == nil && (out.Flags&jwriter.NilSliceAsEmpty) == 0 { + out.RawString("null") + } else { + out.RawByte('[') + for v8, v9 := range in { + if v8 > 0 { + out.RawByte(',') + } + (v9).MarshalEasyJSON(out) + } + out.RawByte(']') + } +} + +// MarshalJSON supports json.Marshaler interface +func (v CacheList) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver3(&w, v) + return w.Buffer.BuildBytes(), w.Error +} + +// MarshalEasyJSON supports easyjson.Marshaler interface +func (v CacheList) MarshalEasyJSON(w *jwriter.Writer) { + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver3(w, v) +} + +// UnmarshalJSON supports json.Unmarshaler interface +func (v *CacheList) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver3(&r, v) + return r.Error() +} + +// UnmarshalEasyJSON supports easyjson.Unmarshaler interface +func (v *CacheList) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver3(l, v) +} +func easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver4(in *jlexer.Lexer, out *BlockDomainModel) { + isTopLevel := in.IsStart() + if in.IsNull() { + if isTopLevel { + in.Consumed() + } + in.Skip() + return + } + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "domain": + out.Domain = string(in.String()) + default: + in.SkipRecursive() + } + in.WantComma() + } + in.Delim('}') + if isTopLevel { + in.Consumed() + } +} +func easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver4(out *jwriter.Writer, in BlockDomainModel) { + out.RawByte('{') + first := true + _ = first + { + const prefix string = ",\"domain\":" + out.RawString(prefix[1:]) + out.String(string(in.Domain)) + } + out.RawByte('}') +} + +// MarshalJSON supports json.Marshaler interface +func (v BlockDomainModel) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver4(&w, v) + return w.Buffer.BuildBytes(), w.Error +} + +// MarshalEasyJSON supports easyjson.Marshaler interface +func (v BlockDomainModel) MarshalEasyJSON(w *jwriter.Writer) { + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver4(w, v) +} + +// UnmarshalJSON supports json.Unmarshaler interface +func (v *BlockDomainModel) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver4(&r, v) + return r.Error() +} + +// UnmarshalEasyJSON supports easyjson.Unmarshaler interface +func (v *BlockDomainModel) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver4(l, v) +} +func easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver5(in *jlexer.Lexer, out *AdblockURIModel) { + isTopLevel := in.IsStart() + if in.IsNull() { + if isTopLevel { + in.Consumed() + } + in.Skip() + return + } + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "tag": + out.Tag = string(in.String()) + case "uri": + out.URI = string(in.String()) + case "active": + out.Active = bool(in.Bool()) + default: + in.SkipRecursive() + } + in.WantComma() + } + in.Delim('}') + if isTopLevel { + in.Consumed() + } +} +func easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver5(out *jwriter.Writer, in AdblockURIModel) { + out.RawByte('{') + first := true + _ = first + { + const prefix string = ",\"tag\":" + out.RawString(prefix[1:]) + out.String(string(in.Tag)) + } + { + const prefix string = ",\"uri\":" + out.RawString(prefix) + out.String(string(in.URI)) + } + { + const prefix string = ",\"active\":" + out.RawString(prefix) + out.Bool(bool(in.Active)) + } + out.RawByte('}') +} + +// MarshalJSON supports json.Marshaler interface +func (v AdblockURIModel) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver5(&w, v) + return w.Buffer.BuildBytes(), w.Error +} + +// MarshalEasyJSON supports easyjson.Marshaler interface +func (v AdblockURIModel) MarshalEasyJSON(w *jwriter.Writer) { + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver5(w, v) +} + +// UnmarshalJSON supports json.Unmarshaler interface +func (v *AdblockURIModel) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver5(&r, v) + return r.Error() +} + +// UnmarshalEasyJSON supports easyjson.Unmarshaler interface +func (v *AdblockURIModel) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver5(l, v) +} +func easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver6(in *jlexer.Lexer, out *AdblockDomainModel) { + isTopLevel := in.IsStart() + if in.IsNull() { + if isTopLevel { + in.Consumed() + } + in.Skip() + return + } + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "tag": + out.Tag = string(in.String()) + case "domain": + out.Domain = string(in.String()) + case "active": + out.Active = bool(in.Bool()) + default: + in.SkipRecursive() + } + in.WantComma() + } + in.Delim('}') + if isTopLevel { + in.Consumed() + } +} +func easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver6(out *jwriter.Writer, in AdblockDomainModel) { + out.RawByte('{') + first := true + _ = first + { + const prefix string = ",\"tag\":" + out.RawString(prefix[1:]) + out.String(string(in.Tag)) + } + { + const prefix string = ",\"domain\":" + out.RawString(prefix) + out.String(string(in.Domain)) + } + { + const prefix string = ",\"active\":" + out.RawString(prefix) + out.Bool(bool(in.Active)) + } + out.RawByte('}') +} + +// MarshalJSON supports json.Marshaler interface +func (v AdblockDomainModel) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver6(&w, v) + return w.Buffer.BuildBytes(), w.Error +} + +// MarshalEasyJSON supports easyjson.Marshaler interface +func (v AdblockDomainModel) MarshalEasyJSON(w *jwriter.Writer) { + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver6(w, v) +} + +// UnmarshalJSON supports json.Unmarshaler interface +func (v *AdblockDomainModel) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver6(&r, v) + return r.Error() +} + +// UnmarshalEasyJSON supports easyjson.Unmarshaler interface +func (v *AdblockDomainModel) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver6(l, v) +} +func easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver7(in *jlexer.Lexer, out *AdblockActiveModel) { + isTopLevel := in.IsStart() + if in.IsNull() { + if isTopLevel { + in.Consumed() + } + in.Skip() + return + } + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeFieldName(false) + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "domain": + out.Domain = string(in.String()) + case "active": + out.Active = bool(in.Bool()) + default: + in.SkipRecursive() + } + in.WantComma() + } + in.Delim('}') + if isTopLevel { + in.Consumed() + } +} +func easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver7(out *jwriter.Writer, in AdblockActiveModel) { + out.RawByte('{') + first := true + _ = first + { + const prefix string = ",\"domain\":" + out.RawString(prefix[1:]) + out.String(string(in.Domain)) + } + { + const prefix string = ",\"active\":" + out.RawString(prefix) + out.Bool(bool(in.Active)) + } + out.RawByte('}') +} + +// MarshalJSON supports json.Marshaler interface +func (v AdblockActiveModel) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver7(&w, v) + return w.Buffer.BuildBytes(), w.Error +} + +// MarshalEasyJSON supports easyjson.Marshaler interface +func (v AdblockActiveModel) MarshalEasyJSON(w *jwriter.Writer) { + easyjson2a2898efEncodeGithubComDewepOnlineFdnsInternalWebserver7(w, v) +} + +// UnmarshalJSON supports json.Unmarshaler interface +func (v *AdblockActiveModel) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver7(&r, v) + return r.Error() +} + +// UnmarshalEasyJSON supports easyjson.Unmarshaler interface +func (v *AdblockActiveModel) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson2a2898efDecodeGithubComDewepOnlineFdnsInternalWebserver7(l, v) +} diff --git a/internal/webserver/ws_ui.go b/internal/webserver/ws_ui.go new file mode 100644 index 0000000..58b9636 --- /dev/null +++ b/internal/webserver/ws_ui.go @@ -0,0 +1,34 @@ +package webserver + +//go:generate static ./../../web/dist/fdns ui + +import ( + "net/http" + + "github.com/deweppro/go-logger" + "github.com/deweppro/go-static" +) + +var ui static.Reader + +func (v *WebServer) RegisterUI() { + for _, file := range ui.List() { + logger.Debugf("static: %s", file) + v.route.Route(file, v.Static, http.MethodGet) + } + v.route.Route("/", v.Static, http.MethodGet) +} + +//Static controller +func (v *WebServer) Static(w http.ResponseWriter, r *http.Request) { + filename := r.RequestURI + switch filename { + case "", "/": + filename = "/index.html" + break + } + + if err := ui.ResponseWrite(w, filename); err != nil { + logger.Errorf("static response: %s", err.Error()) + } +} diff --git a/pkg/blacklist/config.go b/pkg/blacklist/config.go deleted file mode 100644 index 093e64d..0000000 --- a/pkg/blacklist/config.go +++ /dev/null @@ -1,5 +0,0 @@ -package blacklist - -type Config struct { - BlackListIP []string `yaml:"blacklistip"` -} diff --git a/pkg/blacklist/repository.go b/pkg/blacklist/repository.go index 64a70c4..fb69566 100644 --- a/pkg/blacklist/repository.go +++ b/pkg/blacklist/repository.go @@ -1,41 +1,81 @@ package blacklist import ( + "context" "net" + "sync" + "time" + + "github.com/dewep-online/fdns/pkg/utils" + "github.com/deweppro/go-app/application/ctx" + "github.com/deweppro/go-errors" + "github.com/deweppro/go-logger" + + "github.com/dewep-online/fdns/pkg/database" ) type Repository struct { - conf *Config - blacklistIP []net.IP - blacklistIPNet []*net.IPNet + db *database.Database + blacklistIP map[string]net.IP + blacklistIPNet map[string]*net.IPNet + mux sync.RWMutex } -func New(c *Config) *Repository { +func New(db *database.Database) *Repository { return &Repository{ - conf: c, + db: db, + blacklistIP: make(map[string]net.IP), + blacklistIPNet: make(map[string]*net.IPNet), } } -func (v *Repository) Up() error { - for _, ip := range v.conf.BlackListIP { - if _, n, err := net.ParseCIDR(ip); err == nil { - v.blacklistIPNet = append(v.blacklistIPNet, n) +func (v *Repository) Up(ctx ctx.Context) error { + var timestamp int64 + utils.Interval(ctx.Context(), time.Minute*5, func(ctx context.Context) { + err := errors.Wrap( + v.db.GetRulesMap(ctx, database.IP, timestamp, func(m map[string]string) error { + ipmap := make(map[string]net.IP) + netmap := make(map[string]*net.IPNet) + + for name, ip := range m { + if _, n, err := net.ParseCIDR(ip); err == nil { + netmap[name] = n + } else { + ipmap[name] = net.ParseIP(ip) + } + } + + v.mux.Lock() + v.blacklistIP, v.blacklistIPNet = ipmap, netmap + v.mux.Unlock() + + return nil + }), + ) + if err != nil { + logger.Warnf("update rules [blacklist]: %s", utils.StringError(err)) } else { - v.blacklistIP = append(v.blacklistIP, net.ParseIP(ip)) + v.mux.RLock() + logger.Infof("update rules [blacklist]: ip=%d net=%d", len(v.blacklistIP), len(v.blacklistIPNet)) + v.mux.RUnlock() } - } + + timestamp = time.Now().Unix() + }) + return nil } -func (v *Repository) Down() error { +func (v *Repository) Down(_ ctx.Context) error { return nil } func (v *Repository) Has(ip net.IP) bool { - for _, item := range v.blacklistIP { - if item.Equal(ip) { - return true - } + v.mux.RLock() + defer v.mux.RUnlock() + vv := ip.String() + if _, ok := v.blacklistIP[vv]; ok { + return true } for _, item := range v.blacklistIPNet { if item.Contains(ip) { diff --git a/pkg/cache/repository.go b/pkg/cache/repository.go index 8825e24..90687b5 100644 --- a/pkg/cache/repository.go +++ b/pkg/cache/repository.go @@ -1,26 +1,25 @@ package cache import ( + "strings" "sync" "time" - "github.com/deweppro/go-app/application" + "github.com/deweppro/go-app/application/ctx" ) type Repository struct { - data map[string]*Record - temp map[string]*Record + dyn map[string]*Record + fix map[string]*Record - ctx *application.ForceClose wg sync.WaitGroup mux sync.RWMutex } -func New(ctx *application.ForceClose) *Repository { +func New() *Repository { return &Repository{ - data: make(map[string]*Record), - temp: make(map[string]*Record), - ctx: ctx, + dyn: make(map[string]*Record), + fix: make(map[string]*Record), } } @@ -28,10 +27,10 @@ func (v *Repository) Get(name string) *Record { v.mux.RLock() defer v.mux.RUnlock() - if d, ok := v.data[name]; ok { + if d, ok := v.fix[name]; ok { return d } - if d, ok := v.temp[name]; ok { + if d, ok := v.dyn[name]; ok { return d } return nil @@ -43,30 +42,85 @@ func (v *Repository) Set(name string, ip4, ip6 []string, ttl int64) { m := NewRecord(ip4, ip6, ttl) if m.IsStatic() { - v.temp[name] = m + v.fix[name] = m } else { - v.data[name] = m + v.dyn[name] = m } } -func (v *Repository) Del(name string) { +func (v *Repository) DelDynamic(name string) { v.mux.Lock() defer v.mux.Unlock() - delete(v.data, name) + delete(v.dyn, name) } -func (v *Repository) List(call func(name string, ip []string)) { +func (v *Repository) DelFixed(name string) { + v.mux.Lock() + defer v.mux.Unlock() + + delete(v.fix, name) +} + +func (v *Repository) DelByCallback(call func(name string) bool) { + var result []string + v.mux.RLock() + for name, _ := range v.fix { + if call(name) { + result = append(result, name) + } + } + for name, _ := range v.dyn { + if call(name) { + result = append(result, name) + } + } + v.mux.RUnlock() + + v.mux.Lock() + for _, name := range result { + delete(v.fix, name) + delete(v.dyn, name) + } + v.mux.Unlock() +} + +func (v *Repository) Reset() { + v.mux.Lock() + defer v.mux.Unlock() + + v.dyn = make(map[string]*Record) + v.fix = make(map[string]*Record) +} + +func (v *Repository) List(dyn bool, filter string, call func(name string, ip []string, ttl string)) { v.mux.RLock() defer v.mux.RUnlock() - for name, vv := range v.data { - ip := vv.AllIPs() - call(name, ip) + now := time.Now() + + fn := func(list map[string]*Record) { + for name, vv := range list { + if len(filter) > 2 && strings.Index(name, filter) == -1 { + continue + } + ip := vv.AllIPs() + var ttl string + if vv.ttl > 0 { + ttl = time.Unix(vv.ttl, 0).Sub(now).String() + } + call(strings.Trim(name, "."), ip, ttl) + } + } + + if dyn { + fn(v.dyn) + } else { + fn(v.fix) } } -func (v *Repository) Up() error { +func (v *Repository) Up(ctx ctx.Context) error { v.wg.Add(1) go func() { defer v.wg.Done() @@ -76,14 +130,14 @@ func (v *Repository) Up() error { for { select { - case <-v.ctx.C.Done(): + case <-ctx.Done(): return case t := <-timer.C: v.mux.Lock() - for name, record := range v.data { + for name, record := range v.dyn { if record.GetTTL() <= t.Unix() { - delete(v.data, name) + delete(v.dyn, name) } } v.mux.Unlock() @@ -93,7 +147,7 @@ func (v *Repository) Up() error { return nil } -func (v *Repository) Down() error { +func (v *Repository) Down(_ ctx.Context) error { v.wg.Wait() return nil } diff --git a/pkg/cache/ruleip.go b/pkg/cache/ruleip.go index 66aa08d..edc9bd0 100644 --- a/pkg/cache/ruleip.go +++ b/pkg/cache/ruleip.go @@ -1,5 +1,7 @@ package cache +import "strings" + type Record struct { ip4 map[string]struct{} ip6 map[string]struct{} @@ -63,3 +65,14 @@ func (v *Record) AllIPs() []string { } return vv } + +func (v *Record) AllIPsString() string { + vv := make([]string, 0, len(v.ip4)+len(v.ip6)) + for ip := range v.ip4 { + vv = append(vv, ip) + } + for ip := range v.ip6 { + vv = append(vv, ip) + } + return strings.Join(vv, ", ") +} diff --git a/pkg/database/common.go b/pkg/database/common.go new file mode 100644 index 0000000..c478bc7 --- /dev/null +++ b/pkg/database/common.go @@ -0,0 +1,54 @@ +package database + +import "fmt" + +type ( + Types string + Active int64 +) + +var ( + NS Types = "ns" + DNS Types = "dns" + Host Types = "host" + Regex Types = "regexp" + Query Types = "query" + IP Types = "ip" + + typeList = map[Types]struct{}{ + NS: {}, + DNS: {}, + Host: {}, + Query: {}, + } + + ActiveTrue Active = 1 + ActiveFalse Active = 0 + ActiveALL Active = -1 +) + +type ( + RuleModel struct { + Types string + Domain string + IPs string + Active Active + } + RulesModel []RuleModel +) + +func (v RulesModel) ToMap() map[string]string { + result := make(map[string]string, len(v)) + for _, m := range v { + result[m.Domain] = m.IPs + } + return result +} + +func ValidateType(v string) (Types, error) { + vv := Types(v) + if _, ok := typeList[vv]; ok { + return vv, nil + } + return Types(""), fmt.Errorf("type is not supported") +} diff --git a/pkg/database/db.go b/pkg/database/db.go new file mode 100644 index 0000000..090da7e --- /dev/null +++ b/pkg/database/db.go @@ -0,0 +1,61 @@ +package database + +import ( + "context" + "database/sql" + + "github.com/deweppro/go-app/application/ctx" + "github.com/deweppro/go-logger" + "github.com/deweppro/go-orm" + "github.com/deweppro/go-orm/schema" + "github.com/deweppro/go-orm/schema/sqlite" +) + +type Database struct { + conn schema.Connector + pool *orm.Stmt + log logger.Logger +} + +func New(log logger.Logger, conf *sqlite.Config) (*Database, error) { + conn := sqlite.New(conf) + pool := orm.NewDB(conn, orm.Plugins{Logger: log}) + db := &Database{ + conn: conn, + pool: pool.Pool(""), + log: log, + } + return db, nil +} + +func (v *Database) Up(ctx ctx.Context) error { + if err := v.conn.Reconnect(); err != nil { + return err + } + if err := v.pool.Ping(); err != nil { + return err + } + return v.pool.CallContext("check_tables", ctx.Context(), func(ctx context.Context, conn *sql.DB) error { + row := conn.QueryRowContext(ctx, checkTables) + var count int + if err := row.Scan(&count); err != nil { + return err + } + if err := row.Err(); err != nil { + return err + } + if count == 0 { + v.log.Infof("Creating SQLite database") + for _, migration := range migrations { + if _, err := conn.ExecContext(ctx, migration); err != nil { + return err + } + } + } + return nil + }) +} + +func (v *Database) Down(_ ctx.Context) error { + return v.conn.Close() +} diff --git a/pkg/database/queries.go b/pkg/database/queries.go new file mode 100644 index 0000000..9cc81ed --- /dev/null +++ b/pkg/database/queries.go @@ -0,0 +1,181 @@ +package database + +import ( + "context" + "fmt" + "time" + + "github.com/deweppro/go-logger" + + "github.com/dewep-online/fdns/pkg/utils" + + "github.com/deweppro/go-orm" +) + +func (v *Database) GetRulesMap(ctx context.Context, types Types, ts int64, call func(map[string]string) error) error { + list, err := v.GetRules(ctx, types, ts, ActiveTrue) + if err != nil { + return fmt.Errorf("load rules [%s]: %w", string(types), err) + } + logger.Infof("update rules [%s]: %d", string(types), len(list)) + return call(list.ToMap()) +} + +func (v *Database) GetAllRules(ctx context.Context, ts int64) (RulesModel, error) { + result := make(RulesModel, 0, 1000) + err := v.pool.QueryContext("get_all_rules", ctx, func(q orm.Querier) { + q.SQL("select `types`, `domain`, `ips`, `active` from `rules` where `updated_at` >= ?;", ts) + q.Bind(func(bind orm.Scanner) error { + m := RuleModel{} + if err := bind.Scan(&m.Types, &m.Domain, &m.IPs, &m.Active); err != nil { + return err + } + result = append(result, m) + return nil + }) + }) + return result, err +} + +func (v *Database) GetRules(ctx context.Context, t Types, ts int64, active Active) (RulesModel, error) { + result := make(RulesModel, 0, 1000) + err := v.pool.QueryContext("get_rules_type", ctx, func(q orm.Querier) { + q.SQL("select `domain`, `ips` from `rules` where `types` = ? and `active` = ? and updated_at >= ?;", + string(t), int64(active), ts) + q.Bind(func(bind orm.Scanner) error { + m := RuleModel{} + if err := bind.Scan(&m.Domain, &m.IPs); err != nil { + return err + } + result = append(result, m) + return nil + }) + }) + return result, err +} + +func (v *Database) SetRules(ctx context.Context, t Types, domain, ips string, active Active) error { + return v.pool.ExecContext("set_rule", ctx, func(q orm.Executor) { + q.SQL("replace into rules (types, domain, ips, active, updated_at) values (?, ?, ?, ?, ?);") + q.Params(string(t), domain, ips, int64(active), time.Now().Unix()) + }) +} + +func (v *Database) DelRules(ctx context.Context, t Types, domain string) error { + return v.pool.ExecContext("del_rule", ctx, func(q orm.Executor) { + q.SQL("delete from rules where types = ? and domain = ?;") + q.Params(string(t), domain) + }) +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +type ( + BlacklistDomainModel struct { + Tag string + Domain string + Active Active + } + BlacklistDomainsModel []BlacklistDomainModel +) + +func (v BlacklistDomainsModel) ToMap(a Active) map[string]string { + result := make(map[string]string, len(v)) + for _, m := range v { + if a != ActiveALL && m.Active != a { + continue + } + result[m.Domain] = "" + } + return result +} + +func (v *Database) GetBlacklistDomain(ctx context.Context, ts int64) (BlacklistDomainsModel, error) { + result := make(BlacklistDomainsModel, 0, 1000) + err := v.pool.QueryContext("get_blacklist_domain", ctx, func(q orm.Querier) { + q.SQL("select `tag`, `domain`, `active` from `blacklist_domains` where updated_at >= ?;", ts) + q.Bind(func(bind orm.Scanner) error { + m := BlacklistDomainModel{} + if err := bind.Scan(&m.Tag, &m.Domain, &m.Active); err != nil { + return err + } + result = append(result, m) + return nil + }) + }) + return result, err +} + +func (v *Database) SetBlacklistDomain(ctx context.Context, tag string, domain []string) error { + return v.pool.TransactionContext("set_blacklist_domain", ctx, func(v orm.Tx) { + v.Exec(func(e orm.Executor) { + e.SQL(`insert or ignore into blacklist_domains (tag, domain, updated_at) values (?, ?, ?);`) + ts := time.Now().Unix() + for _, s := range domain { + e.Params(tag, s, ts) + } + }) + }) +} + +func (v *Database) SetBlacklistDomainActive(ctx context.Context, domain string, active Active) error { + return v.pool.TransactionContext("set_blacklist_domain", ctx, func(v orm.Tx) { + v.Exec(func(e orm.Executor) { + e.SQL(`update blacklist_domains set active = ?, updated_at = ? where domain = ?;`) + e.Params(int64(active), time.Now().Unix(), domain) + e.Bind(func(result orm.Result) error { + if result.RowsAffected == 0 { + return fmt.Errorf("cant update active: %s", domain) + } + return nil + }) + }) + }) +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +type ( + BlacklistURIModel struct { + Tag string + URI string + Active Active + } + BlacklistURIsModel []BlacklistURIModel +) + +func (v BlacklistURIsModel) ToMap(a Active) map[string]string { + result := make(map[string]string, len(v)) + for _, m := range v { + if a != ActiveALL && m.Active != a { + continue + } + result[m.Tag] = m.URI + } + return result +} + +func (v *Database) GetBlacklistURI(ctx context.Context, ts int64) (BlacklistURIsModel, error) { + result := make(BlacklistURIsModel, 0, 1000) + err := v.pool.QueryContext("get_blacklist_list", ctx, func(q orm.Querier) { + q.SQL("select `tag`, `url`, `active` from `blacklist_list` where updated_at >= ?;", ts) + q.Bind(func(bind orm.Scanner) error { + m := BlacklistURIModel{} + if err := bind.Scan(&m.Tag, &m.URI, &m.Active); err != nil { + return err + } + result = append(result, m) + return nil + }) + }) + return result, err +} + +func (v *Database) SetBlacklistURI(ctx context.Context, uri string) (string, error) { + tag := utils.Tag(uri) + err := v.pool.ExecContext("set_blacklist_list", ctx, func(q orm.Executor) { + q.SQL(`insert or ignore into blacklist_list (tag, url, updated_at) values (?, ?, ?);`) + q.Params(tag, uri, time.Now().Unix()) + }) + return tag, err +} diff --git a/pkg/database/queries_test.go b/pkg/database/queries_test.go new file mode 100644 index 0000000..976ff90 --- /dev/null +++ b/pkg/database/queries_test.go @@ -0,0 +1,23 @@ +package database_test + +import ( + "testing" + + "github.com/dewep-online/fdns/pkg/database" + "github.com/stretchr/testify/require" +) + +func TestBlacklistDomainsModel_ToMap(t *testing.T) { + list := make(database.BlacklistDomainsModel, 0) + list = append(list, database.BlacklistDomainModel{ + Tag: "123", + Domain: "aaa", + Active: 0, + }, database.BlacklistDomainModel{ + Tag: "456", + Domain: "bbb", + Active: 1, + }) + require.Equal(t, map[string]string{"bbb": ""}, list.ToMap(database.ActiveTrue)) + require.Equal(t, map[string]string{"aaa": ""}, list.ToMap(database.ActiveFalse)) +} diff --git a/pkg/database/sql.go b/pkg/database/sql.go new file mode 100644 index 0000000..cbeef33 --- /dev/null +++ b/pkg/database/sql.go @@ -0,0 +1,40 @@ +package database + +const ( + checkTables = "select count(*) from `sqlite_master`;" +) + +var migrations = []string{ + `create table blacklist_list + ( + tag TEXT not null, + url TEXT not null, + active INTEGER default 1 not null, + updated_at INTEGER not null + );`, + `create unique index blacklist_list_tag_uindex on blacklist_list (tag);`, + `create unique index blacklist_list_url_uindex on blacklist_list (url);`, + `create index blacklist_list_active_index on blacklist_list (active);`, + `create table blacklist_domains + ( + tag TEXT not null, + domain TEXT not null, + active INTEGER default 1 not null, + updated_at INTEGER not null + );`, + `create index blacklist_domains_tag_index on blacklist_domains (tag);`, + `create unique index blacklist_domains_domain_uindex on blacklist_domains (domain);`, + `create index blacklist_domains_active_index on blacklist_domains (active);`, + `create table rules + ( + types TEXT, + domain TEXT, + ips TEXT, + active INTEGER default 1 not null, + updated_at INTEGER + );`, + `create unique index rules_types_domain_uindex on rules (types, domain);`, + `create index rules_active_index on rules (active);`, + `insert into rules (types, domain, ips, active, updated_at) + values ('ns', 'cloudflare.com', '1.1.1.1, 1.0.0.1', 1, 0);`, +} diff --git a/pkg/dic.go b/pkg/dic.go index 6cda6a8..61529fd 100755 --- a/pkg/dic.go +++ b/pkg/dic.go @@ -3,9 +3,11 @@ package pkg import ( "github.com/dewep-online/fdns/pkg/blacklist" "github.com/dewep-online/fdns/pkg/cache" + "github.com/dewep-online/fdns/pkg/database" "github.com/dewep-online/fdns/pkg/dnscli" "github.com/dewep-online/fdns/pkg/rules" "github.com/deweppro/go-app/application" + "github.com/deweppro/go-orm/schema/sqlite" ) var ( @@ -15,11 +17,11 @@ var ( cache.New, dnscli.New, rules.New, + database.New, } //Config di injector Config = application.Modules{ - &blacklist.Config{}, - &dnscli.Config{}, &rules.Config{}, + &sqlite.Config{}, } ) diff --git a/pkg/dnscli/client.go b/pkg/dnscli/client.go index 1378f6c..980a9f2 100644 --- a/pkg/dnscli/client.go +++ b/pkg/dnscli/client.go @@ -1,11 +1,17 @@ package dnscli import ( + "context" "math/rand" "strings" + "sync" "time" "github.com/dewep-online/fdns/pkg/utils" + "github.com/deweppro/go-app/application/ctx" + + "github.com/dewep-online/fdns/pkg/database" + "github.com/deweppro/go-logger" "github.com/miekg/dns" ) @@ -13,43 +19,81 @@ import ( type Client struct { ips []string cli *dns.Client + db *database.Database + mux sync.RWMutex } -func New(c *Config) *Client { +func New(db *database.Database) *Client { return &Client{ cli: &dns.Client{ Net: "", ReadTimeout: time.Second * 5, WriteTimeout: time.Second * 5, }, - ips: append([]string{}, c.DNS...), + ips: make([]string, 0, 10), + db: db, } } +func (o *Client) Up(ctx ctx.Context) error { + utils.Interval(ctx.Context(), time.Minute*15, o.UpgradeNS) + return nil +} + +func (o *Client) Down(_ ctx.Context) error { + return nil +} + +func (o *Client) UpgradeNS(ctx context.Context) { + msg := new(dns.Msg) + msg.SetQuestion(dns.Fqdn("example.com."), dns.TypeNS) + + rules, err := o.db.GetRules(ctx, database.NS, 0, database.ActiveTrue) + if err != nil { + logger.Errorf("load dns: %s", err.Error()) + return + } + + var ips []string + for _, rule := range rules { + ip4, ip6 := utils.DecodeIPs(rule.IPs) + ips = append(ips, ip4...) + ips = append(ips, ip6...) + } + + ips = utils.ValidateDNSs(ips) + result := make([]string, 0, len(ips)) + + for _, ip := range ips { + if _, _, err = o.cli.Exchange(msg, ip); err != nil { + logger.Errorf("error dns: [%s] %s", ip, err.Error()) + continue + } + logger.Infof("set dns: %s", ip) + result = append(result, ip) + } + + o.mux.Lock() + o.ips = result + o.mux.Unlock() +} + func (o *Client) ExchangeRandomDNS(msg *dns.Msg) (*dns.Msg, error) { + o.mux.RLock() + defer o.mux.RUnlock() + rand.Seed(time.Now().UnixNano()) rand.Shuffle(len(o.ips), func(i, j int) { o.ips[i], o.ips[j] = o.ips[j], o.ips[i] }) return o.Exchange(msg, o.ips) } -func (o *Client) Exchange(msg *dns.Msg, addrs []string) (*dns.Msg, error) { - var ( - mq, mr []string - resp *dns.Msg - err error - ) +func (o *Client) Exchange(msg *dns.Msg, addrs []string) (resp *dns.Msg, err error) { + var mq, mr []string for _, ns := range addrs { - - if resp, _, err = o.cli.Exchange(msg, ns); err != nil { - - logger.WithFields(logger.Fields{ - "ns": ns, - "q": strings.Join(mq, ","), - "err": err.Error(), - }).Errorf("receive ip") - + resp, _, err = o.cli.Exchange(msg, ns) + if err != nil { continue } @@ -61,49 +105,16 @@ func (o *Client) Exchange(msg *dns.Msg, addrs []string) (*dns.Msg, error) { mr = append(mr, a.String()) } - logger.WithFields(logger.Fields{ - "ns": ns, - "q": strings.Join(mq, ","), - "a": strings.Join(mr, ","), - }).Infof("receive ip") + logger.Infof("reverse: NS: %s QUERY: %s RESPONSE: %s", + ns, strings.Join(mq, ","), strings.Join(mr, ",")) break } - if resp == nil && err == nil { - return nil, utils.ErrEmptyIP - } - - return resp, nil -} - -func (o *Client) Up() error { - msg := new(dns.Msg) - msg.SetQuestion(dns.Fqdn("example.com."), dns.TypeNS) - - list := utils.ValidateDNSs(o.ips) - o.ips = make([]string, 0) - - for _, ip := range list { - logger.WithFields(logger.Fields{ - "ip": ip, - }).Infof("add ns") - o.ips = append(o.ips, ip) - - if _, _, err := o.cli.Exchange(msg, ip); err != nil { - logger.WithFields(logger.Fields{ - "err": err.Error(), - "ip": ip, - }).Errorf("add ns") - } - } - - if len(o.ips) == 0 { - return utils.ErrEmptyDNSList + if err != nil { + logger.Infof("reverse: NS: %s QUERY: %s ERROR: %s", + addrs, strings.Join(mq, ","), err.Error()) } - return nil -} -func (o *Client) Down() error { - return nil + return } diff --git a/pkg/dnscli/config.go b/pkg/dnscli/config.go deleted file mode 100644 index 3bd3c27..0000000 --- a/pkg/dnscli/config.go +++ /dev/null @@ -1,5 +0,0 @@ -package dnscli - -type Config struct { - DNS []string `yaml:"dns"` -} diff --git a/pkg/httpcli/cli.go b/pkg/httpcli/cli.go index cecf210..3b9070e 100644 --- a/pkg/httpcli/cli.go +++ b/pkg/httpcli/cli.go @@ -8,7 +8,7 @@ import ( "net/http" "time" - "github.com/pkg/errors" + "github.com/deweppro/go-errors" ) type Client struct { @@ -34,7 +34,7 @@ func New() *Client { func (v *Client) Call(method, uri string, body []byte) (int, []byte, error) { req, err := http.NewRequest(method, uri, bytes.NewReader(body)) if err != nil { - return 0, nil, errors.Wrap(err, "create request") + return 0, nil, errors.WrapMessage(err, "create request") } req.Header.Set("Connection", "keep-alive") resp, err := v.cli.Do(req) diff --git a/pkg/rules/config.go b/pkg/rules/config.go index ec0e06b..bcd770f 100644 --- a/pkg/rules/config.go +++ b/pkg/rules/config.go @@ -2,11 +2,6 @@ package rules type ( Config struct { - DumpRules string `yaml:"dump-rules"` - AdblockRules []string `yaml:"adblock-rules"` - DNSRules map[string]string `yaml:"dns-rules"` - HostRules map[string]string `yaml:"host-rules"` - RegExpRules map[string]string `yaml:"regexp-rules"` - QueryRules map[string]string `yaml:"query-rules"` + AdblockRules string `yaml:"adblock-rules"` } ) diff --git a/pkg/rules/repository.go b/pkg/rules/repository.go index 853f29a..4d99e36 100644 --- a/pkg/rules/repository.go +++ b/pkg/rules/repository.go @@ -1,10 +1,20 @@ package rules import ( + "context" + "fmt" "regexp" "sync" "time" + "github.com/deweppro/go-errors" + + "github.com/deweppro/go-logger" + + "github.com/dewep-online/fdns/pkg/database" + + "github.com/deweppro/go-app/application/ctx" + "github.com/dewep-online/fdns/pkg/utils" "github.com/dewep-online/fdns/pkg/blacklist" @@ -18,42 +28,74 @@ type Repository struct { cache *cache.Repository cli *dnscli.Client blacklist *blacklist.Repository - resolve []Resolver + db *database.Database + resolve map[string]Resolver mux sync.RWMutex } -func New(c *Config, r *cache.Repository, d *dnscli.Client, b *blacklist.Repository) *Repository { +func New(c *Config, r *cache.Repository, d *dnscli.Client, b *blacklist.Repository, db *database.Database) *Repository { return &Repository{ conf: c, cache: r, cli: d, blacklist: b, - resolve: make([]Resolver, 0), + db: db, + resolve: make(map[string]Resolver, 0), } } -func (v *Repository) Up() error { - if err := HostRules(v.conf.HostRules, v); err != nil { - return err - } - if err := DNSRules(v.conf.DNSRules, v); err != nil { - return err - } - if err := RegexpRules(v.conf.RegExpRules, v); err != nil { - return err - } - if err := QueryRules(v.conf.QueryRules, v); err != nil { - return err - } +func (v *Repository) Up(ctx ctx.Context) error { + var timestamp int64 - time.AfterFunc(time.Minute, func() { - AdblockRules(v.conf.AdblockRules, v) + utils.Interval(ctx.Context(), time.Hour*24, func(ctx context.Context) { + uris := LoadAdblockRules(v.conf.AdblockRules) + AdblockRules(uris, func(uri string, domains []string) { + tag, err := v.db.SetBlacklistURI(ctx, uri) + if err != nil { + logger.Warnf("adblock-uri [%s]: %s", uri, utils.StringError(err)) + return + } + if err = v.db.SetBlacklistDomain(ctx, tag, domains); err != nil { + logger.Warnf("adblock-uri [%s]: %s", uri, utils.StringError(err)) + return + } + }) + }) + + utils.Interval(ctx.Context(), time.Minute*5, func(ctx context.Context) { + err := errors.Wrap( + v.db.GetRulesMap(ctx, database.DNS, timestamp, func(m map[string]string) error { + return DNSRules(m, v) + }), + v.db.GetRulesMap(ctx, database.Host, timestamp, func(m map[string]string) error { + return HostRules(m, v) + }), + v.db.GetRulesMap(ctx, database.Regex, timestamp, func(m map[string]string) error { + return RegexpRules(m, v) + }), + v.db.GetRulesMap(ctx, database.Query, timestamp, func(m map[string]string) error { + return QueryRules(m, v) + }), + func() error { + rules, err := v.db.GetBlacklistDomain(ctx, timestamp) + if err != nil { + return err + } + logger.Infof("update rules [adblock]: %d", len(rules)) + return HostRules(rules.ToMap(database.ActiveTrue), v) + }(), + ) + if err != nil { + logger.Warnf("update rules: %s", utils.StringError(err)) + } + + timestamp = time.Now().Unix() }) return nil } -func (v *Repository) Down() error { +func (v *Repository) Down(ctx ctx.Context) error { return nil } @@ -61,17 +103,59 @@ func (v *Repository) SetHostResolve(domain string, ip4, ip6 []string, ttl int64) v.cache.Set(domain, ip4, ip6, ttl) } -func (v *Repository) SetRexResolve(format string, rx *regexp.Regexp, ip4, ip6 []string, tp uint) { +func (v *Repository) ReplaceRexResolve(t database.Types, o, n, ips string) { + m := map[string]string{n: ips} + switch t { + case database.DNS: + _ = DNSRules(m, v) + case database.Regex: + _ = RegexpRules(m, v) + case database.Query: + _ = QueryRules(m, v) + } + + v.mux.Lock() + r, ok := v.resolve[o] + if o != n { + delete(v.resolve, o) + } + v.mux.Unlock() + + if ok { + v.cache.DelByCallback(func(name string) bool { + _, _, ok = r.Match(name) + fmt.Println(r.rule, name, ok) + return ok + }) + } +} + +func (v *Repository) DeleteRexResolve(name string) { + v.mux.Lock() + r, ok := v.resolve[name] + delete(v.resolve, name) + v.mux.Unlock() + + if ok { + v.cache.DelByCallback(func(name string) bool { + _, _, ok = r.Match(name) + return ok + }) + } +} + +func (v *Repository) SetRexResolve(rule, format string, rx *regexp.Regexp, ip4, ip6 []string, tp uint) { v.mux.Lock() defer v.mux.Unlock() - v.resolve = append(v.resolve, Resolver{ + v.resolve[rule] = Resolver{ + rule: rule, reg: rx, format: format, types: tp, ip4: ip4, ip6: ip6, - }) + } } func (v *Repository) Resolve(q dns.Question) []dns.RR { @@ -91,9 +175,6 @@ func (v *Repository) Resolve(q dns.Question) []dns.RR { if ttl6 > ttl { ttl = ttl6 } - if ttl > 0 { - ttl = time.Now().Add(time.Second * time.Duration(ttl)).Unix() - } v.cache.Set(q.Name, ip4, ip6, ttl) } } @@ -149,6 +230,9 @@ func (v *Repository) nslookup(msg *dns.Msg, ips []string) (int64, []string) { ip []string ttl uint32 ) + if resp == nil { + return time.Now().Add(time.Second * time.Duration(ttl)).Unix(), ip + } for _, vv := range resp.Answer { switch vv.(type) { case *dns.A: diff --git a/pkg/rules/resolver.go b/pkg/rules/resolver.go index e9e3218..c3e95ce 100644 --- a/pkg/rules/resolver.go +++ b/pkg/rules/resolver.go @@ -7,6 +7,7 @@ import ( ) type Resolver struct { + rule string reg *regexp.Regexp format string types uint diff --git a/pkg/rules/rules.go b/pkg/rules/rules.go index 8c5d908..19937a3 100644 --- a/pkg/rules/rules.go +++ b/pkg/rules/rules.go @@ -1,6 +1,7 @@ package rules import ( + "encoding/json" "fmt" "net/http" "regexp" @@ -25,23 +26,27 @@ type ( SetHostResolve(domain string, ip4, ip6 []string, ttl int64) } ResolveSetter interface { - SetRexResolve(format string, rx *regexp.Regexp, ip4, ip6 []string, tp uint) + SetRexResolve(rule, format string, rx *regexp.Regexp, ip4, ip6 []string, tp uint) } ) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + func HostRules(data map[string]string, setter HostSetter) error { for domain, ips := range data { ip4, ip6 := utils.DecodeIPs(ips) - setter.SetHostResolve(domain+".", ip4, ip6, 0) + setter.SetHostResolve(domain, ip4, ip6, 0) } return nil } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + func DNSRules(data map[string]string, setter ResolveSetter) error { - for domain, ips := range data { + for rule, ips := range data { ip4, ip6 := utils.DecodeIPs(ips) - domain = regexp.QuoteMeta(domain) + domain := regexp.QuoteMeta(rule) domain = strings.ReplaceAll(domain, "\\?", "?") domain = strings.ReplaceAll(domain, "\\*", ".*") domain = fmt.Sprintf("^.*%s\\.$", strings.Trim(domain, "^$")) @@ -51,6 +56,7 @@ func DNSRules(data map[string]string, setter ResolveSetter) error { } setter.SetRexResolve( + rule, "", rx, utils.ValidateDNSs(ip4), @@ -61,16 +67,19 @@ func DNSRules(data map[string]string, setter ResolveSetter) error { return nil } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + func RegexpRules(data map[string]string, setter ResolveSetter) error { - for domain, ips := range data { + for rule, ips := range data { ip4, ip6 := utils.DecodeIPs(ips) - domain = fmt.Sprintf("^%s\\.$", strings.Trim(domain, "^$")) + domain := fmt.Sprintf("^%s\\.$", strings.Trim(rule, "^$")) rx, err := regexp.Compile(domain) if err != nil { return err } setter.SetRexResolve( + rule, ips, rx, utils.ValidateDNSs(ip4), @@ -81,11 +90,13 @@ func RegexpRules(data map[string]string, setter ResolveSetter) error { return nil } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + func QueryRules(data map[string]string, setter ResolveSetter) error { - for domain, ips := range data { + for rule, ips := range data { ip4, ip6 := utils.DecodeIPs(ips) - domain = regexp.QuoteMeta(domain) + domain := regexp.QuoteMeta(rule) domain = strings.ReplaceAll(domain, "\\?", ".") domain = strings.ReplaceAll(domain, "\\*", ".*") domain = fmt.Sprintf("^%s\\.$", strings.Trim(domain, "^$")) @@ -95,6 +106,7 @@ func QueryRules(data map[string]string, setter ResolveSetter) error { } setter.SetRexResolve( + rule, ips, rx, utils.ValidateDNSs(ip4), @@ -105,28 +117,42 @@ func QueryRules(data map[string]string, setter ResolveSetter) error { return nil } +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + var ( cli = httpcli.New() - rex = regexp.MustCompile(`\|\|([a-z0-9-.]+)\^`) + rex = regexp.MustCompile(`\|\|([a-z0-9-.]+)\^\n`) ) -func AdblockRules(data []string, setter HostSetter) { +func LoadAdblockRules(uri string) []string { + code, b, err := cli.Call(http.MethodGet, uri, nil) + if err != nil || code != http.StatusOK { + logger.Warnf("adblock-rules [%d] %s: %s", code, uri, utils.StringError(err)) + return nil + } + result := make([]string, 0, 10) + if err = json.Unmarshal(b, &result); err != nil { + logger.Warnf("adblock-rules [%d] %s: %s", code, uri, utils.StringError(err)) + } + return result +} +func AdblockRules(data []string, setter func(uri string, domains []string)) { for _, uri := range data { code, b, err := cli.Call(http.MethodGet, uri, nil) - if err != nil { - logger.Warnf("adblock [%d] %s: %s", code, uri, err.Error()) + if err != nil || code != http.StatusOK { + logger.Warnf("adblock [%d] %s: %s", code, uri, utils.StringError(err)) continue } - if code != http.StatusOK { - logger.Warnf("adblock [%d] %s: %s", code, uri, err.Error()) - continue + + rexResult := rex.FindAll(b, -1) + result := make([]string, 0, len(rexResult)) + for _, domain := range rexResult { + result = append(result, + strings.Trim(string(domain[2:len(domain)-1]), "\n^")+".") } - result := rex.FindAll(b, -1) logger.Infof("adblock [%d] %s", len(result), uri) - for _, domain := range result { - setter.SetHostResolve(string(domain[2:len(domain)-1])+".", nil, nil, 0) - } + setter(uri, result) } } diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index 9e5b41a..8644aa9 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -1,9 +1,15 @@ package utils import ( + "context" + "crypto/md5" + "encoding/hex" "errors" + "fmt" "net" + "regexp" "strings" + "time" ) var ( @@ -60,3 +66,46 @@ func DecodeIPs(data string) (ip4, ip6 []string) { func EncodeIPs(ip4, ip6 []string) string { return strings.Join(append(ip4, ip6...), ", ") } + +func Interval(ctx context.Context, interval time.Duration, call func(context.Context)) { + call(ctx) + + go func() { + tick := time.NewTicker(interval) + defer tick.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-tick.C: + call(ctx) + } + } + }() +} + +func StringError(err error) string { + if err == nil { + return "" + } + return err.Error() +} + +func Tag(s string) string { + h := md5.New() + h.Write([]byte(s)) + return hex.EncodeToString(h.Sum(nil)) +} + +var domainRex = regexp.MustCompile(`^(?i)[a-z0-9-]+(\.[a-z0-9-]+)+\.?$`) + +func ValidateDomain(domain string) (string, error) { + domain = strings.TrimSpace(domain) + if !domainRex.MatchString(domain) { + return "", fmt.Errorf("invalid domain") + } + domain = strings.TrimRight(domain, ".") + domain = strings.ToLower(domain) + return domain + ".", nil +} diff --git a/resource/404.html b/resource/404.html new file mode 100644 index 0000000..998cadd --- /dev/null +++ b/resource/404.html @@ -0,0 +1,25 @@ + + + + + + fDNS | 404 + + + + +

404

+

Page not found

+ + \ No newline at end of file diff --git a/resource/adblock-rules.json b/resource/adblock-rules.json new file mode 100644 index 0000000..23179d5 --- /dev/null +++ b/resource/adblock-rules.json @@ -0,0 +1,13 @@ +[ + "https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt", + "https://easylist.to/easylist/easylist.txt", + "https://filters.adtidy.org/extension/ublock/filters/11.txt", + "https://easylist.to/easylist/easyprivacy.txt", + "https://filters.adtidy.org/extension/ublock/filters/17.txt", + "https://filters.adtidy.org/extension/ublock/filters/3.txt", + "https://cdn.statically.io/gh/uBlockOrigin/uAssets/master/filters/badware.txt", + "https://raw.githubusercontent.com/uBlockOrigin/uAssets/master/filters/filters.txt", + "https://filters.adtidy.org/extension/ublock/filters/4.txt", + "https://filters.adtidy.org/extension/ublock/filters/14.txt", + "https://raw.githubusercontent.com/Spam404/lists/master/adblock-list.txt" +] \ No newline at end of file diff --git a/resource/default-rules.json b/resource/default-rules.json new file mode 100644 index 0000000..55c8d27 --- /dev/null +++ b/resource/default-rules.json @@ -0,0 +1,8 @@ +{ + "dns": [], + "host": [], + "regexp": [], + "query": [ + {"rule": "*local*","ip": "127.0.0.1"} + ] +} \ No newline at end of file diff --git a/resource/index.html b/resource/index.html new file mode 100644 index 0000000..e801c28 --- /dev/null +++ b/resource/index.html @@ -0,0 +1,19 @@ + + + + + + fDNS | Home + + + + +

Hey! I am the fDNS service!

+ + \ No newline at end of file diff --git a/scripts/build.sh b/scripts/build.sh index 0d28cc4..39b2af8 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -27,4 +27,4 @@ front) GOBIN=$TOOLS_BIN go generate ./... && \ GO111MODULE=on CGO_ENABLED=1 GOOS=linux GOARCH=$1 go build -o $ROOT/build/bin/fdns_$1 $GO_MAIN ;; -esac +esac \ No newline at end of file diff --git a/scripts/docker.sh b/scripts/docker.sh index bb17f8a..6b9285e 100755 --- a/scripts/docker.sh +++ b/scripts/docker.sh @@ -11,7 +11,7 @@ docker_up() { } docker_down() { - docker-compose -f deployments/docker-compose.yaml -p dev_fdns down + docker-compose -f deployments/docker-compose.yaml -p dev_urione down } case $1 in @@ -25,4 +25,4 @@ docker_down) *) echo "docker_up or docker_down" ;; -esac +esac \ No newline at end of file diff --git a/scripts/env.sh b/scripts/env.sh index d30da51..a9dc4ce 100644 --- a/scripts/env.sh +++ b/scripts/env.sh @@ -39,12 +39,12 @@ lints() { tests() { go clean -testcache - go test -v -race -run Integration ./... - - if [ "$COVERALLS_TOKEN" == "dev" ]; then - go test -v -race -run Unit ./... - else - go test -v -race -run Unit -covermode=atomic -coverprofile=coverage.out ./... - $TOOLS_BIN/goveralls -coverprofile=coverage.out -repotoken $COVERALLS_TOKEN - fi + go test -v -race ./... + +# if [ "$COVERALLS_TOKEN" == "dev" ]; then +# go test -v -race -run Unit ./... +# else +# go test -v -race -run Unit -covermode=atomic -coverprofile=coverage.out ./... +# $TOOLS_BIN/goveralls -coverprofile=coverage.out -repotoken $COVERALLS_TOKEN +# fi } \ No newline at end of file diff --git a/scripts/preinst.sh b/scripts/preinst.sh index 02f0f20..61a9bb8 100644 --- a/scripts/preinst.sh +++ b/scripts/preinst.sh @@ -7,6 +7,10 @@ if test -f "/lib/systemd/system/systemd-resolved.service"; then systemctl daemon-reload fi +if ! [ -d /var/lib/fdns/ ]; then + mkdir /var/lib/fdns +fi + if test -f "/etc/systemd/system/fdns.service"; then systemctl disable fdns systemctl stop fdns diff --git a/web/README.md b/web/README.md deleted file mode 100644 index 6c52147..0000000 --- a/web/README.md +++ /dev/null @@ -1,27 +0,0 @@ -# Fdns - -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.6. - -## Development server - -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page. diff --git a/web/angular.json b/web/angular.json index 7fb71d3..7a18274 100644 --- a/web/angular.json +++ b/web/angular.json @@ -46,9 +46,9 @@ "optimization": true, "outputHashing": "all", "sourceMap": false, - "namedChunks": false, + "namedChunks": true, "extractLicenses": true, - "vendorChunk": false, + "vendorChunk": true, "buildOptimizer": true, "budgets": [ { diff --git a/web/package-lock.json b/web/package-lock.json index 52b656d..96d0220 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -8,53 +8,57 @@ "name": "fdns", "version": "0.0.0", "dependencies": { - "@angular/animations": "~13.2.4", - "@angular/common": "~13.2.4", - "@angular/compiler": "~13.2.4", - "@angular/core": "~13.2.4", - "@angular/forms": "~13.2.4", - "@angular/platform-browser": "~13.2.4", - "@angular/platform-browser-dynamic": "~13.2.4", - "@angular/router": "~13.2.4", + "@angular/animations": "^13.3.11", + "@angular/cdk": "^13.3.9", + "@angular/common": "^13.3.11", + "@angular/compiler": "^13.3.11", + "@angular/core": "^13.3.11", + "@angular/forms": "^13.3.11", + "@angular/platform-browser": "^13.3.11", + "@angular/platform-browser-dynamic": "^13.3.11", + "@angular/router": "^13.3.11", + "@deweppro/core": "^0.1.5", "bootstrap": "^5.0.1", "jquery": "^3.6.0", "lodash": "^4.17.21", - "rxjs": "~6.6.0", + "ngx-toastr": "^14.3.0", + "open-fonts": "^1.1.1", + "open-iconic": "^1.1.1", + "rxjs": "^6.6.0", "sprintf-js": "^1.1.2", "tslib": "^2.0.0", - "zone.js": "~0.11.3" + "zone.js": "^0.11.3" }, "devDependencies": { - "@angular-devkit/build-angular": "~13.2.5", - "@angular/cli": "~13.2.5", - "@angular/compiler-cli": "~13.2.4", + "@angular-devkit/build-angular": "^13.2.5", + "@angular/cli": "^13.2.5", + "@angular/compiler-cli": "^13.3.11", "@types/jasmine": "^3.7.7", "@types/jquery": "^3.5.5", "@types/lodash": "^4.14.168", "@types/node": "^15.12.2", "@types/sprintf-js": "^1.1.2", - "codelyzer": "^6.0.0", - "jasmine-core": "~3.7.1", - "jasmine-spec-reporter": "~5.0.0", - "karma": "~6.3.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage": "~2.0.3", - "karma-jasmine": "~4.0.0", + "jasmine-core": "^3.7.1", + "jasmine-spec-reporter": "^5.0.0", + "karma": "^6.3.0", + "karma-chrome-launcher": "^3.1.0", + "karma-coverage": "^2.0.3", + "karma-jasmine": "^4.0.0", "karma-jasmine-html-reporter": "^1.5.0", - "protractor": "~7.0.0", - "ts-node": "~8.3.0", - "tslint": "~6.1.0", - "typescript": "~4.5.5" + "protractor": "^7.0.0", + "ts-node": "^8.3.0", + "tslint": "^6.1.0", + "typescript": "^4.5.5" } }, "node_modules/@ampproject/remapping": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", - "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "sourcemap-codec": "1.4.8" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -76,15 +80,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "13.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.5.tgz", - "integrity": "sha512-ny80YoLOrS6USJCzCChj1ZOEVTldcx0KWo3e86barmt5iVA2ekrnsQ02Bor5Bl5NlZFpE6Fu0FCXFAQZElFmcg==", + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.9.tgz", + "integrity": "sha512-1LqcMizeabx3yOkx3tptCSAoEhG6nO6hPgI/B3EJ07G/ZcoxunMWSeN3P3zT10dZMEHhcxl+8cSStSXaXj9hfA==", "dev": true, "dependencies": { - "@ampproject/remapping": "1.1.1", - "@angular-devkit/architect": "0.1302.5", - "@angular-devkit/build-webpack": "0.1302.5", - "@angular-devkit/core": "13.2.5", + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1303.9", + "@angular-devkit/build-webpack": "0.1303.9", + "@angular-devkit/core": "13.3.9", "@babel/core": "7.16.12", "@babel/generator": "7.16.8", "@babel/helper-annotate-as-pure": "7.16.7", @@ -95,9 +99,9 @@ "@babel/runtime": "7.16.7", "@babel/template": "7.16.7", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.2.5", + "@ngtools/webpack": "13.3.9", "ansi-colors": "4.1.1", - "babel-loader": "8.2.3", + "babel-loader": "8.2.5", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", "cacache": "15.3.0", @@ -117,7 +121,7 @@ "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.0", "mini-css-extract-plugin": "2.5.3", - "minimatch": "3.0.4", + "minimatch": "3.0.5", "open": "8.4.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", @@ -129,18 +133,18 @@ "regenerator-runtime": "0.13.9", "resolve-url-loader": "5.0.0", "rxjs": "6.6.7", - "sass": "1.49.0", + "sass": "1.49.9", "sass-loader": "12.4.0", "semver": "7.3.5", "source-map-loader": "3.0.1", "source-map-support": "0.5.21", "stylus": "0.56.0", "stylus-loader": "6.2.0", - "terser": "5.11.0", + "terser": "5.14.2", "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.1", - "webpack": "5.67.0", + "webpack": "5.70.0", "webpack-dev-middleware": "5.3.0", "webpack-dev-server": "4.7.3", "webpack-merge": "5.8.0", @@ -155,14 +159,14 @@ "esbuild": "0.14.22" }, "peerDependencies": { - "@angular/compiler-cli": "^13.0.0", - "@angular/localize": "^13.0.0", - "@angular/service-worker": "^13.0.0", + "@angular/compiler-cli": "^13.0.0 || ^13.3.0-rc.0", + "@angular/localize": "^13.0.0 || ^13.3.0-rc.0", + "@angular/service-worker": "^13.0.0 || ^13.3.0-rc.0", "karma": "^6.3.0", "ng-packagr": "^13.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.4.3 <4.6" + "typescript": ">=4.4.3 <4.7" }, "peerDependenciesMeta": { "@angular/localize": { @@ -185,13 +189,77 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1303.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.9.tgz", + "integrity": "sha512-RMHqCGDxbLqT+250A0a8vagsoTdqGjAxjhrvTeq7PJmClI7uJ/uA1Fs18+t85toIqVKn2hovdY9sNf42nBDD2Q==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.3.9", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.9.tgz", + "integrity": "sha512-XqCuIWyoqIsLABjV3GQL/+EiBCt3xVPPtNp3Mg4gjBsDLW7PEnvbb81yGkiZQmIsq4EIyQC/6fQa3VdjsCshGg==", + "dev": true, + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/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 + }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1302.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.5.tgz", - "integrity": "sha512-hxtFDX1cQaGfpHMSWRqfMO9/hucfIz61C0Lc/QGg9spay1Dvjwe+JpEoKMv3mz1K2fwHO9Hr5ZBAYFT4C5mxZQ==", + "version": "0.1303.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.9.tgz", + "integrity": "sha512-CdYXvAN1xAik8FyfdF1B8Nt1B/1aBvkZr65AUVFOmP6wuVzcdn78BMZmZD42srYbV2449sWi5Vyo/j0a/lfJww==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1302.5", + "@angular-devkit/architect": "0.1303.9", "rxjs": "6.6.7" }, "engines": { @@ -204,6 +272,70 @@ "webpack-dev-server": "^4.0.0" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1303.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.9.tgz", + "integrity": "sha512-RMHqCGDxbLqT+250A0a8vagsoTdqGjAxjhrvTeq7PJmClI7uJ/uA1Fs18+t85toIqVKn2hovdY9sNf42nBDD2Q==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.3.9", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.9.tgz", + "integrity": "sha512-XqCuIWyoqIsLABjV3GQL/+EiBCt3xVPPtNp3Mg4gjBsDLW7PEnvbb81yGkiZQmIsq4EIyQC/6fQa3VdjsCshGg==", + "dev": true, + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/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 + }, "node_modules/@angular-devkit/core": { "version": "13.2.5", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.5.tgz", @@ -231,6 +363,28 @@ } } }, + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/core/node_modules/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 + }, "node_modules/@angular-devkit/schematics": { "version": "13.2.5", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.5.tgz", @@ -250,9 +404,9 @@ } }, "node_modules/@angular/animations": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.4.tgz", - "integrity": "sha512-+vuov1+UPD6KIxkI56n4gxNp72hpPmmzwY+r8M+MzyB/UUTBQY8RX0dmgvXJ2zejy08dd9eF+7qmRGK1Nwjszg==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.11.tgz", + "integrity": "sha512-KE/3RuvixHIk9YTSwaUsezsUm9Ig9Y8rZMpHOT/8bRtzPiJ5ld2GnDHjrJgyZn7TdoP4wz4YCta5eC4ycu+KCw==", "dependencies": { "tslib": "^2.3.0" }, @@ -260,9 +414,31 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/core": "13.2.4" + "@angular/core": "13.3.11" } }, + "node_modules/@angular/cdk": { + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.9.tgz", + "integrity": "sha512-XCuCbeuxWFyo3EYrgEYx7eHzwl76vaWcxtWXl00ka8d+WAOtMQ6Tf1D98ybYT5uwF9889fFpXAPw98mVnlo3MA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "optionalDependencies": { + "parse5": "^5.0.0" + }, + "peerDependencies": { + "@angular/common": "^13.0.0 || ^14.0.0-0", + "@angular/core": "^13.0.0 || ^14.0.0-0", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + }, "node_modules/@angular/cli": { "version": "13.2.5", "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.5.tgz", @@ -300,9 +476,9 @@ } }, "node_modules/@angular/common": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.4.tgz", - "integrity": "sha512-telHfROR8QYZ0IE7rZF8yQG4PkKIZ9oKpl3HwybSzTTbvWwHPtScqvr4b1oKjb0Q6F4OkH3QtrZ+PXMAp0Hv/w==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.11.tgz", + "integrity": "sha512-gPMwDYIAag1izXm2tRQ6EOIx9FVEUqLdr+qYtRVoQtoBmfkoTSLGcpeBXqqlPVxVPbA6Li1WZZT5wxLLlLAN+Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -310,14 +486,14 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/core": "13.2.4", + "@angular/core": "13.3.11", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.4.tgz", - "integrity": "sha512-3lgeEPcpyWJeXaQeQy978s2Ut227pqbW1ALIO7JRngynj3zAZ9XsYwPi8xj1HS3MBWVdfHDDsWaIegqLPMZ5Jw==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.11.tgz", + "integrity": "sha512-EV6JCBbXdHDHbPShWmymvuoxFYG0KVc8sDJpYp47WLHCY2zgZaXhvWs//Hrls3fmi+TGTekgRa2jOBBNce/Ggg==", "dependencies": { "tslib": "^2.3.0" }, @@ -326,16 +502,16 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.4.tgz", - "integrity": "sha512-ORqyQyU83lvODPD3BmOzPtZBluCSnr415qRku74H3wCbS9GURpDUA2yh5ckpQPXrhdVgHcWmGJlbGcA2KgTaUw==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.11.tgz", + "integrity": "sha512-cl+3Wzxt8NRi2WY+RdsxuQ3yQRUp8pSlfSlJJnfaKE1BEqap6uem2DovuhnIbmrLhxZ5xt7o+I1szyO6sn6+ag==", "dev": true, "dependencies": { - "@babel/core": "^7.8.6", + "@babel/core": "^7.17.2", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", "dependency-graph": "^0.11.0", - "magic-string": "^0.25.0", + "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", "sourcemap-codec": "^1.4.8", @@ -351,8 +527,101 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/compiler": "13.2.4", - "typescript": ">=4.4.2 <4.6" + "@angular/compiler": "13.3.11", + "typescript": ">=4.4.2 <4.7" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", + "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@angular/compiler-cli/node_modules/magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" } }, "node_modules/@angular/compiler-cli/node_modules/yargs": { @@ -383,9 +652,9 @@ } }, "node_modules/@angular/core": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.4.tgz", - "integrity": "sha512-cCgf8Crx86hvZQX8lc7Yy5fedRI4trAXYsysrJ7ISRohfFk31Z/W5BEpKO8CkX51Ja5IfJPyoI2DVVTvrwzsEQ==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.11.tgz", + "integrity": "sha512-9BmE2CxyV0g+AkBeuc8IwjSOiJ8Y+kptXnqD/J8EAFT3B0/fLGVnjFdZC6Sev9L0SNZb6qdzebpfIOLqbUjReQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -398,9 +667,9 @@ } }, "node_modules/@angular/forms": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.4.tgz", - "integrity": "sha512-XdWJZy4zfJ4ZGEhKZBceHAAozBQZPp1BRl7m2j09EV2I6l/nLdrYhgKGd4UBUtJWyXElPEuEgLiKKdmlPKF5eQ==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.11.tgz", + "integrity": "sha512-iMgTNB+Qc3TsfAZSk1FnUE6MVoddPzxhG9AKCfSlvpjFh8VmXkIjxPL3dun7J8OjayT3X+B8f7LZ9AkKNXtBKw==", "dependencies": { "tslib": "^2.3.0" }, @@ -408,16 +677,16 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.2.4", - "@angular/core": "13.2.4", - "@angular/platform-browser": "13.2.4", + "@angular/common": "13.3.11", + "@angular/core": "13.3.11", + "@angular/platform-browser": "13.3.11", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.4.tgz", - "integrity": "sha512-zyQ5wtCY+V+ww9Lx6fDdCYTJ7lRuszcN4eqogbtLak8uNnC+DjZSjNbgsrCwZ/v5q712DtCTQlSOFtRg9SWYug==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.11.tgz", + "integrity": "sha512-PG3chCErARb6wNzkOed2NsZmgvTmbumRx/6sMXqGkDKXYQm0JULnl4X42Rn+JCgJ9DLJi5/jrd1dbcBCrKk9Vg==", "dependencies": { "tslib": "^2.3.0" }, @@ -425,9 +694,9 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/animations": "13.2.4", - "@angular/common": "13.2.4", - "@angular/core": "13.2.4" + "@angular/animations": "13.3.11", + "@angular/common": "13.3.11", + "@angular/core": "13.3.11" }, "peerDependenciesMeta": { "@angular/animations": { @@ -436,9 +705,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.4.tgz", - "integrity": "sha512-9GOG46hjxrSHAL0pO90LPcaGoGleqlhKgoeSd6MVjNHOU2B2JWMuiu3NmJa0PjYFzqC89b0ypRoitf68+XTEjA==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.11.tgz", + "integrity": "sha512-xM0VRC1Nw//SHO3gkghUHyjCaaQbk1UYMq4vIu3iKVq9KLqOSZgccv0NcOKHzXXN3S5RgX2auuyOUOCD6ny1Pg==", "dependencies": { "tslib": "^2.3.0" }, @@ -446,16 +715,16 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.2.4", - "@angular/compiler": "13.2.4", - "@angular/core": "13.2.4", - "@angular/platform-browser": "13.2.4" + "@angular/common": "13.3.11", + "@angular/compiler": "13.3.11", + "@angular/core": "13.3.11", + "@angular/platform-browser": "13.3.11" } }, "node_modules/@angular/router": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.4.tgz", - "integrity": "sha512-ZNahK4W+DAHThGwCOkW2MN12/Zx9PgNL/DRhGyPpL8vBBIgmOjoLB5N5QWMICauIgGQ635oorSN6lGxX6ZPbCA==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.11.tgz", + "integrity": "sha512-bJTcxDYKEyoqtsi1kJcDJWLmEN+dXpwhU07SsqUwfyN4V5fYF1ApDhpJ4c17hNdjEqe106srT9tiHXhmWayhmQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -463,9 +732,9 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.2.4", - "@angular/core": "13.2.4", - "@angular/platform-browser": "13.2.4", + "@angular/common": "13.3.11", + "@angular/core": "13.3.11", + "@angular/platform-browser": "13.3.11", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -476,21 +745,21 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "dependencies": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -593,14 +862,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "engines": { @@ -685,13 +954,10 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "dev": true, - "dependencies": { - "@babel/types": "^7.16.7" - }, "engines": { "node": ">=6.9.0" } @@ -709,38 +975,39 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "node_modules/@babel/helper-function-name/node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -759,31 +1026,45 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -841,12 +1122,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -865,30 +1146,30 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "dependencies": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -910,26 +1191,40 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -938,9 +1233,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -2081,19 +2376,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2102,35 +2397,40 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "dev": true, "dependencies": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, "node_modules/@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2152,6 +2452,22 @@ "postcss": "^8.3" } }, + "node_modules/@deweppro/core": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@deweppro/core/-/core-0.1.5.tgz", + "integrity": "sha512-4iomx56vZfMvaZ328VT9KxHtPoRE76WK2pyyT2ujUmUQWlB+juz+GPJfke78G125kg42agHXooX5Ky+QD/hBNQ==", + "dependencies": { + "tslib": ">=2.0.0" + }, + "funding": { + "url": "https://sobe.ru/na/deweppro" + }, + "peerDependencies": { + "@angular/common": ">=12.0.0", + "@angular/core": ">=12.0.0", + "rxjs": ">=6.0.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", @@ -2192,6 +2508,19 @@ "node": ">=8" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", @@ -2201,10 +2530,59 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@ngtools/webpack": { - "version": "13.2.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.5.tgz", - "integrity": "sha512-obiPvwPe+UJUO8cfNbBxukLKG30F+gLF5/erexwklRknJzS4KP8ciH2on6XlTuXUahpDjbO0pffugFE2I/IszQ==", + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.9.tgz", + "integrity": "sha512-wmgOI5sogAuilwBZJqCHVMjm2uhDxjdSmNLFx7eznwGDa6LjvjuATqCv2dVlftq0Y/5oZFVrg5NpyHt5kfZ8Cg==", "dev": true, "engines": { "node": "^12.20.0 || ^14.15.0 || >=16.10.0", @@ -2213,7 +2591,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^13.0.0", - "typescript": ">=4.4.3 <4.6", + "typescript": ">=4.4.3 <4.7", "webpack": "^5.30.0" } }, @@ -2349,6 +2727,16 @@ "read-package-json-fast": "^2.0.1" } }, + "node_modules/@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@schematics/angular": { "version": "13.2.5", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.5.tgz", @@ -2460,9 +2848,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "node_modules/@types/express": { @@ -2478,9 +2866,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -2489,9 +2877,9 @@ } }, "node_modules/@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "dependencies": { "@types/node": "*" @@ -2561,9 +2949,9 @@ "dev": true }, "node_modules/@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, "node_modules/@types/selenium-webdriver": { @@ -2613,9 +3001,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.1.tgz", - "integrity": "sha512-UxlLOfkuQnT2YSBCNq0x86SGOUxas6gAySFeDe2DcnEnA8655UIPoCDorWZCugcvKIL8IUI4oueUfJ1hhZSE2A==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, "dependencies": { "@types/node": "*" @@ -2907,14 +3295,14 @@ } }, "node_modules/ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { @@ -2939,6 +3327,28 @@ } } }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/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 + }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", @@ -3018,15 +3428,6 @@ "node": ">= 8" } }, - "node_modules/app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "dev": true, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -3067,16 +3468,6 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "node_modules/aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "dependencies": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -3131,16 +3522,10 @@ "node": ">=0.8" } }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, "node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "dependencies": { "lodash": "^4.17.14" @@ -3206,23 +3591,14 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "node_modules/axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "dependencies": { - "ast-types-flow": "0.0.7" - } - }, "node_modules/babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, @@ -3234,30 +3610,18 @@ "webpack": ">=2" } }, - "node_modules/babel-loader/node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/babel-loader/node_modules/loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" }, "engines": { - "node": ">=4.0.0" + "node": ">=8.9.0" } }, "node_modules/babel-plugin-dynamic-import-node": { @@ -3396,7 +3760,7 @@ "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "node_modules/bcrypt-pbkdf": { @@ -3453,24 +3817,27 @@ } }, "node_modules/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/body-parser/node_modules/debug": { @@ -3482,16 +3849,37 @@ "ms": "2.0.0" } }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", "dev": true, "dependencies": { "array-flatten": "^2.1.0", @@ -3543,26 +3931,31 @@ } }, "node_modules/browserslist": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", - "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", + "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001366", + "electron-to-chromium": "^1.4.188", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.4" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/browserstack": { @@ -3729,14 +4122,20 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", + "version": "1.0.30001368", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz", + "integrity": "sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/caseless": { "version": "0.12.0", @@ -3891,74 +4290,6 @@ "node": ">=6" } }, - "node_modules/codelyzer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", - "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==", - "dev": true, - "dependencies": { - "@angular/compiler": "9.0.0", - "@angular/core": "9.0.0", - "app-root-path": "^3.0.0", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "rxjs": "^6.5.3", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2", - "tslib": "^1.10.0", - "zone.js": "~0.10.3" - }, - "peerDependencies": { - "@angular/compiler": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", - "@angular/core": ">=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next", - "tslint": "^5.0.0 || ^6.0.0" - } - }, - "node_modules/codelyzer/node_modules/@angular/compiler": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", - "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", - "dev": true, - "peerDependencies": { - "tslib": "^1.10.0" - } - }, - "node_modules/codelyzer/node_modules/@angular/core": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", - "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", - "dev": true, - "peerDependencies": { - "rxjs": "^6.5.3", - "tslib": "^1.10.0", - "zone.js": "~0.10.2" - } - }, - "node_modules/codelyzer/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/codelyzer/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/codelyzer/node_modules/zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -3984,9 +4315,9 @@ } }, "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, "node_modules/colors": { @@ -4019,7 +4350,7 @@ "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "node_modules/component-emitter": { @@ -4061,7 +4392,7 @@ "node_modules/compression/node_modules/bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true, "engines": { "node": ">= 0.8" @@ -4079,7 +4410,7 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/concat-map": { @@ -4195,7 +4526,7 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "node_modules/copy-anything": { @@ -4234,6 +4565,22 @@ "webpack": "^5.1.0" } }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/copy-webpack-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -4258,6 +4605,12 @@ "node": ">=10.13.0" } }, + "node_modules/copy-webpack-plugin/node_modules/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 + }, "node_modules/copy-webpack-plugin/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -4563,16 +4916,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, "node_modules/css-what": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", @@ -4594,15 +4937,6 @@ "node": ">=0.10.0" } }, - "node_modules/cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "dependencies": { - "through": "X.X.X" - } - }, "node_modules/cssdb": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", @@ -4627,12 +4961,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "node_modules/damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", - "dev": true - }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -4841,10 +5169,14 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-node": { "version": "2.1.0", @@ -4882,7 +5214,7 @@ "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "node_modules/dns-packet": { @@ -4898,7 +5230,7 @@ "node_modules/dns-txt": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", "dev": true, "dependencies": { "buffer-indexof": "^1.0.0" @@ -4988,9 +5320,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.72.tgz", - "integrity": "sha512-9LkRQwjW6/wnSfevR21a3k8sOJ+XWSH7kkzs9/EUenKmuDkndP3W9y1yCZpOxufwGbX3JV8glZZSDb4o95zwXQ==", + "version": "1.4.198", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.198.tgz", + "integrity": "sha512-jwqQPdKGeAslcq8L+1SZZgL6uDiIDmTe9Gq4brsdWAH27y7MJ2g9Ue6MyST3ogmSM49EAQP7bype1V5hsuNrmQ==", "dev": true }, "node_modules/emoji-regex": { @@ -5074,9 +5406,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz", - "integrity": "sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -5602,7 +5934,7 @@ "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "engines": { "node": ">= 0.6" @@ -5662,38 +5994,39 @@ } }, "node_modules/express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -5705,9 +6038,18 @@ "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -5717,12 +6059,51 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5743,6 +6124,15 @@ } ] }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -5800,12 +6190,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -5991,7 +6375,7 @@ "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "engines": { "node": ">= 0.6" @@ -6055,6 +6439,15 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.2.tgz", @@ -6251,28 +6644,6 @@ "node": ">=6" } }, - "node_modules/har-validator/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/har-validator/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -6380,7 +6751,7 @@ "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "dependencies": { "inherits": "^2.0.1", @@ -6414,9 +6785,9 @@ } }, "node_modules/html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "node_modules/html-escaper": { @@ -6434,29 +6805,47 @@ "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "dependencies": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" }, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" } }, "node_modules/http-parser-js": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", - "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "node_modules/http-proxy": { @@ -6488,9 +6877,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", - "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", @@ -7377,9 +7766,9 @@ "dev": true }, "node_modules/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==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "node_modules/json-stringify-safe": { @@ -7389,13 +7778,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -7997,12 +8383,12 @@ } }, "node_modules/memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dev": true, "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" }, "engines": { "node": ">= 4.0.0" @@ -8011,7 +8397,7 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "node_modules/merge-stream": { @@ -8032,7 +8418,7 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "engines": { "node": ">= 0.6" @@ -8112,6 +8498,22 @@ "webpack": "^5.0.0" } }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -8124,6 +8526,12 @@ "ajv": "^8.8.2" } }, + "node_modules/mini-css-extract-plugin/node_modules/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 + }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -8150,9 +8558,9 @@ "dev": true }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -8162,9 +8570,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/minipass": { @@ -8301,7 +8709,7 @@ "node_modules/multicast-dns-service-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", "dev": true }, "node_modules/mute-stream": { @@ -8365,6 +8773,19 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/ngx-toastr": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-14.3.0.tgz", + "integrity": "sha512-d8j/sOr60w5U7rGlcKQ0Ff4u+m2NzhqU5ZdJXn7QW3aR3Zf/rY7/Fd14BmUindTOWVr2NeTYcQXCjLpir0ldpA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": ">=12.0.0-0", + "@angular/core": ">=12.0.0-0", + "@angular/platform-browser": ">=12.0.0-0" + } + }, "node_modules/nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -8388,9 +8809,9 @@ "optional": true }, "node_modules/node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -8448,9 +8869,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "node_modules/nopt": { @@ -8690,6 +9111,15 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", @@ -8801,6 +9231,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open-fonts": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/open-fonts/-/open-fonts-1.1.1.tgz", + "integrity": "sha512-1b1y5pYdbHr9TS93Gr0qWu00xp00goadqZGBoQuVB0TN/Nc8Sgrq5FYdzJHltkQUnW5fLyMSYA14F7+/vBOe7w==", + "deprecated": "Project has moved to @xz/fonts" + }, + "node_modules/open-iconic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/open-iconic/-/open-iconic-1.1.1.tgz", + "integrity": "sha512-OQNnNMDxg4q+Kl4+8FT9l+7ZUS2fhDe39inzT1J/lQTmSmrOLI3Fkm/QHu0ro83mIfAhgM+F3ZpuHw8vomHCmQ==" + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -8946,12 +9387,12 @@ } }, "node_modules/p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "dependencies": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" }, "engines": { @@ -9139,7 +9580,7 @@ "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "node_modules/path-type": { @@ -9255,12 +9696,12 @@ } }, "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -10140,10 +10581,13 @@ } }, "node_modules/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, "engines": { "node": ">=0.6" }, @@ -10190,13 +10634,13 @@ } }, "node_modules/raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" }, @@ -10298,13 +10742,14 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -10617,9 +11062,9 @@ "dev": true }, "node_modules/sass": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", - "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -10630,7 +11075,7 @@ "sass": "sass.js" }, "engines": { - "node": ">=8.9.0" + "node": ">=12.0.0" } }, "node_modules/sass-loader": { @@ -10737,32 +11182,10 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "node_modules/selenium-webdriver": { @@ -10805,12 +11228,12 @@ } }, "node_modules/selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "dependencies": { - "node-forge": "^1.2.0" + "node-forge": "^1" }, "engines": { "node": ">=10" @@ -10831,43 +11254,25 @@ "node": ">=10" } }, - "node_modules/semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "dependencies": { - "semver": "^5.3.0" - } - }, - "node_modules/semver-dsl/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -10885,9 +11290,18 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -10906,6 +11320,27 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -10918,7 +11353,7 @@ "node_modules/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "dependencies": { "accepts": "~1.3.4", @@ -10945,7 +11380,7 @@ "node_modules/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "dependencies": { "depd": "~1.1.2", @@ -10960,13 +11395,13 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "node_modules/serve-index/node_modules/setprototypeof": { @@ -10976,15 +11411,15 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -11044,6 +11479,20 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -11503,14 +11952,14 @@ } }, "node_modules/terser": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", - "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "dependencies": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "bin": { @@ -11554,28 +12003,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -11959,6 +12386,32 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -12185,13 +12638,13 @@ } }, "node_modules/webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -12199,7 +12652,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -12254,6 +12707,22 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -12266,6 +12735,12 @@ "ajv": "^8.8.2" } }, + "node_modules/webpack-dev-middleware/node_modules/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 + }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -12336,6 +12811,22 @@ } } }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/webpack-dev-server/node_modules/ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -12370,9 +12861,9 @@ } }, "node_modules/webpack-dev-server/node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "dependencies": { "globby": "^11.0.1", @@ -12429,6 +12920,12 @@ "node": ">=8" } }, + "node_modules/webpack-dev-server/node_modules/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 + }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -12472,27 +12969,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/webpack-merge": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", @@ -12536,28 +13012,6 @@ } } }, - "node_modules/webpack/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -12802,13 +13256,13 @@ }, "dependencies": { "@ampproject/remapping": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", - "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "sourcemap-codec": "1.4.8" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@angular-devkit/architect": { @@ -12822,15 +13276,15 @@ } }, "@angular-devkit/build-angular": { - "version": "13.2.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.5.tgz", - "integrity": "sha512-ny80YoLOrS6USJCzCChj1ZOEVTldcx0KWo3e86barmt5iVA2ekrnsQ02Bor5Bl5NlZFpE6Fu0FCXFAQZElFmcg==", + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.9.tgz", + "integrity": "sha512-1LqcMizeabx3yOkx3tptCSAoEhG6nO6hPgI/B3EJ07G/ZcoxunMWSeN3P3zT10dZMEHhcxl+8cSStSXaXj9hfA==", "dev": true, "requires": { - "@ampproject/remapping": "1.1.1", - "@angular-devkit/architect": "0.1302.5", - "@angular-devkit/build-webpack": "0.1302.5", - "@angular-devkit/core": "13.2.5", + "@ampproject/remapping": "2.2.0", + "@angular-devkit/architect": "0.1303.9", + "@angular-devkit/build-webpack": "0.1303.9", + "@angular-devkit/core": "13.3.9", "@babel/core": "7.16.12", "@babel/generator": "7.16.8", "@babel/helper-annotate-as-pure": "7.16.7", @@ -12841,9 +13295,9 @@ "@babel/runtime": "7.16.7", "@babel/template": "7.16.7", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.2.5", + "@ngtools/webpack": "13.3.9", "ansi-colors": "4.1.1", - "babel-loader": "8.2.3", + "babel-loader": "8.2.5", "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.9.1", "cacache": "15.3.0", @@ -12864,7 +13318,7 @@ "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.0", "mini-css-extract-plugin": "2.5.3", - "minimatch": "3.0.4", + "minimatch": "3.0.5", "open": "8.4.0", "ora": "5.4.1", "parse5-html-rewriting-stream": "6.0.1", @@ -12876,32 +13330,120 @@ "regenerator-runtime": "0.13.9", "resolve-url-loader": "5.0.0", "rxjs": "6.6.7", - "sass": "1.49.0", + "sass": "1.49.9", "sass-loader": "12.4.0", "semver": "7.3.5", "source-map-loader": "3.0.1", "source-map-support": "0.5.21", "stylus": "0.56.0", "stylus-loader": "6.2.0", - "terser": "5.11.0", + "terser": "5.14.2", "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.1", - "webpack": "5.67.0", + "webpack": "5.70.0", "webpack-dev-middleware": "5.3.0", "webpack-dev-server": "4.7.3", "webpack-merge": "5.8.0", "webpack-subresource-integrity": "5.1.0" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1303.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.9.tgz", + "integrity": "sha512-RMHqCGDxbLqT+250A0a8vagsoTdqGjAxjhrvTeq7PJmClI7uJ/uA1Fs18+t85toIqVKn2hovdY9sNf42nBDD2Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.3.9", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.9.tgz", + "integrity": "sha512-XqCuIWyoqIsLABjV3GQL/+EiBCt3xVPPtNp3Mg4gjBsDLW7PEnvbb81yGkiZQmIsq4EIyQC/6fQa3VdjsCshGg==", + "dev": true, + "requires": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + } } }, "@angular-devkit/build-webpack": { - "version": "0.1302.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.5.tgz", - "integrity": "sha512-hxtFDX1cQaGfpHMSWRqfMO9/hucfIz61C0Lc/QGg9spay1Dvjwe+JpEoKMv3mz1K2fwHO9Hr5ZBAYFT4C5mxZQ==", + "version": "0.1303.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.9.tgz", + "integrity": "sha512-CdYXvAN1xAik8FyfdF1B8Nt1B/1aBvkZr65AUVFOmP6wuVzcdn78BMZmZD42srYbV2449sWi5Vyo/j0a/lfJww==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1302.5", + "@angular-devkit/architect": "0.1303.9", "rxjs": "6.6.7" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1303.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.9.tgz", + "integrity": "sha512-RMHqCGDxbLqT+250A0a8vagsoTdqGjAxjhrvTeq7PJmClI7uJ/uA1Fs18+t85toIqVKn2hovdY9sNf42nBDD2Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.3.9", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.9.tgz", + "integrity": "sha512-XqCuIWyoqIsLABjV3GQL/+EiBCt3xVPPtNp3Mg4gjBsDLW7PEnvbb81yGkiZQmIsq4EIyQC/6fQa3VdjsCshGg==", + "dev": true, + "requires": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + } } }, "@angular-devkit/core": { @@ -12916,6 +13458,26 @@ "magic-string": "0.25.7", "rxjs": "6.6.7", "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + } } }, "@angular-devkit/schematics": { @@ -12932,11 +13494,28 @@ } }, "@angular/animations": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.4.tgz", - "integrity": "sha512-+vuov1+UPD6KIxkI56n4gxNp72hpPmmzwY+r8M+MzyB/UUTBQY8RX0dmgvXJ2zejy08dd9eF+7qmRGK1Nwjszg==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.11.tgz", + "integrity": "sha512-KE/3RuvixHIk9YTSwaUsezsUm9Ig9Y8rZMpHOT/8bRtzPiJ5ld2GnDHjrJgyZn7TdoP4wz4YCta5eC4ycu+KCw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/cdk": { + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.9.tgz", + "integrity": "sha512-XCuCbeuxWFyo3EYrgEYx7eHzwl76vaWcxtWXl00ka8d+WAOtMQ6Tf1D98ybYT5uwF9889fFpXAPw98mVnlo3MA==", "requires": { + "parse5": "^5.0.0", "tslib": "^2.3.0" + }, + "dependencies": { + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "optional": true + } } }, "@angular/cli": { @@ -12967,32 +13546,32 @@ } }, "@angular/common": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.4.tgz", - "integrity": "sha512-telHfROR8QYZ0IE7rZF8yQG4PkKIZ9oKpl3HwybSzTTbvWwHPtScqvr4b1oKjb0Q6F4OkH3QtrZ+PXMAp0Hv/w==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.11.tgz", + "integrity": "sha512-gPMwDYIAag1izXm2tRQ6EOIx9FVEUqLdr+qYtRVoQtoBmfkoTSLGcpeBXqqlPVxVPbA6Li1WZZT5wxLLlLAN+Q==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.4.tgz", - "integrity": "sha512-3lgeEPcpyWJeXaQeQy978s2Ut227pqbW1ALIO7JRngynj3zAZ9XsYwPi8xj1HS3MBWVdfHDDsWaIegqLPMZ5Jw==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.11.tgz", + "integrity": "sha512-EV6JCBbXdHDHbPShWmymvuoxFYG0KVc8sDJpYp47WLHCY2zgZaXhvWs//Hrls3fmi+TGTekgRa2jOBBNce/Ggg==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.4.tgz", - "integrity": "sha512-ORqyQyU83lvODPD3BmOzPtZBluCSnr415qRku74H3wCbS9GURpDUA2yh5ckpQPXrhdVgHcWmGJlbGcA2KgTaUw==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.11.tgz", + "integrity": "sha512-cl+3Wzxt8NRi2WY+RdsxuQ3yQRUp8pSlfSlJJnfaKE1BEqap6uem2DovuhnIbmrLhxZ5xt7o+I1szyO6sn6+ag==", "dev": true, "requires": { - "@babel/core": "^7.8.6", + "@babel/core": "^7.17.2", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", "dependency-graph": "^0.11.0", - "magic-string": "^0.25.0", + "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", "sourcemap-codec": "^1.4.8", @@ -13000,6 +13579,81 @@ "yargs": "^17.2.1" }, "dependencies": { + "@babel/core": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.9.tgz", + "integrity": "sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.9", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", + "dev": true, + "requires": { + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + }, + "magic-string": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", + "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "yargs": { "version": "17.3.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", @@ -13024,41 +13678,41 @@ } }, "@angular/core": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.4.tgz", - "integrity": "sha512-cCgf8Crx86hvZQX8lc7Yy5fedRI4trAXYsysrJ7ISRohfFk31Z/W5BEpKO8CkX51Ja5IfJPyoI2DVVTvrwzsEQ==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.11.tgz", + "integrity": "sha512-9BmE2CxyV0g+AkBeuc8IwjSOiJ8Y+kptXnqD/J8EAFT3B0/fLGVnjFdZC6Sev9L0SNZb6qdzebpfIOLqbUjReQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.4.tgz", - "integrity": "sha512-XdWJZy4zfJ4ZGEhKZBceHAAozBQZPp1BRl7m2j09EV2I6l/nLdrYhgKGd4UBUtJWyXElPEuEgLiKKdmlPKF5eQ==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.11.tgz", + "integrity": "sha512-iMgTNB+Qc3TsfAZSk1FnUE6MVoddPzxhG9AKCfSlvpjFh8VmXkIjxPL3dun7J8OjayT3X+B8f7LZ9AkKNXtBKw==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.4.tgz", - "integrity": "sha512-zyQ5wtCY+V+ww9Lx6fDdCYTJ7lRuszcN4eqogbtLak8uNnC+DjZSjNbgsrCwZ/v5q712DtCTQlSOFtRg9SWYug==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.11.tgz", + "integrity": "sha512-PG3chCErARb6wNzkOed2NsZmgvTmbumRx/6sMXqGkDKXYQm0JULnl4X42Rn+JCgJ9DLJi5/jrd1dbcBCrKk9Vg==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.4.tgz", - "integrity": "sha512-9GOG46hjxrSHAL0pO90LPcaGoGleqlhKgoeSd6MVjNHOU2B2JWMuiu3NmJa0PjYFzqC89b0ypRoitf68+XTEjA==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.11.tgz", + "integrity": "sha512-xM0VRC1Nw//SHO3gkghUHyjCaaQbk1UYMq4vIu3iKVq9KLqOSZgccv0NcOKHzXXN3S5RgX2auuyOUOCD6ny1Pg==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.4.tgz", - "integrity": "sha512-ZNahK4W+DAHThGwCOkW2MN12/Zx9PgNL/DRhGyPpL8vBBIgmOjoLB5N5QWMICauIgGQ635oorSN6lGxX6ZPbCA==", + "version": "13.3.11", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.11.tgz", + "integrity": "sha512-bJTcxDYKEyoqtsi1kJcDJWLmEN+dXpwhU07SsqUwfyN4V5fYF1ApDhpJ4c17hNdjEqe106srT9tiHXhmWayhmQ==", "requires": { "tslib": "^2.3.0" } @@ -13070,18 +13724,18 @@ "dev": true }, "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", "dev": true, "requires": { - "@babel/highlight": "^7.16.7" + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz", - "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==", + "version": "7.18.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.8.tgz", + "integrity": "sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==", "dev": true }, "@babel/core": { @@ -13160,14 +13814,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dev": true, "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "dependencies": { @@ -13229,13 +13883,10 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dev": true, - "requires": { - "@babel/types": "^7.16.7" - } + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true }, "@babel/helper-explode-assignable-expression": { "version": "7.16.7", @@ -13247,32 +13898,35 @@ } }, "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + } } }, "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { @@ -13285,28 +13939,41 @@ } }, "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.17.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz", - "integrity": "sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.3", - "@babel/types": "^7.17.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + } } }, "@babel/helper-optimise-call-expression": { @@ -13349,12 +14016,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -13367,24 +14034,24 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dev": true, "requires": { - "@babel/types": "^7.16.7" + "@babel/types": "^7.18.6" } }, "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "dev": true }, "@babel/helper-wrap-function": { @@ -13400,31 +14067,44 @@ } }, "@babel/helpers": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz", - "integrity": "sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dev": true, "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.17.0", - "@babel/types": "^7.17.0" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" + }, + "dependencies": { + "@babel/template": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.6.tgz", + "integrity": "sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.6", + "@babel/types": "^7.18.6" + } + } } }, "@babel/highlight": { - "version": "7.16.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", - "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", - "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -14191,49 +14871,54 @@ } }, "@babel/traverse": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", - "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.17.3", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.17.3", - "@babel/types": "^7.17.0", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.9.tgz", + "integrity": "sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.9", + "@babel/types": "^7.18.9", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/generator": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", - "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.9.tgz", + "integrity": "sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==", "dev": true, "requires": { - "@babel/types": "^7.17.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.9", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } } } }, "@babel/types": { - "version": "7.17.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", - "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.9.tgz", + "integrity": "sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.16.7", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, @@ -14246,6 +14931,14 @@ "postcss-value-parser": "^4.2.0" } }, + "@deweppro/core": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@deweppro/core/-/core-0.1.5.tgz", + "integrity": "sha512-4iomx56vZfMvaZ328VT9KxHtPoRE76WK2pyyT2ujUmUQWlB+juz+GPJfke78G125kg42agHXooX5Ky+QD/hBNQ==", + "requires": { + "tslib": ">=2.0.0" + } + }, "@discoveryjs/json-ext": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", @@ -14277,16 +14970,71 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@jridgewell/resolve-uri": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz", "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==", "dev": true }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz", + "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@ngtools/webpack": { - "version": "13.2.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.5.tgz", - "integrity": "sha512-obiPvwPe+UJUO8cfNbBxukLKG30F+gLF5/erexwklRknJzS4KP8ciH2on6XlTuXUahpDjbO0pffugFE2I/IszQ==", + "version": "13.3.9", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.9.tgz", + "integrity": "sha512-wmgOI5sogAuilwBZJqCHVMjm2uhDxjdSmNLFx7eznwGDa6LjvjuATqCv2dVlftq0Y/5oZFVrg5NpyHt5kfZ8Cg==", "dev": true, "requires": {} }, @@ -14400,6 +15148,12 @@ "read-package-json-fast": "^2.0.1" } }, + "@popperjs/core": { + "version": "2.11.5", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", + "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==", + "peer": true + }, "@schematics/angular": { "version": "13.2.5", "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.5.tgz", @@ -14500,9 +15254,9 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "@types/express": { @@ -14518,9 +15272,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.28", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", - "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "version": "4.17.29", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", + "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", "dev": true, "requires": { "@types/node": "*", @@ -14529,9 +15283,9 @@ } }, "@types/http-proxy": { - "version": "1.17.8", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", - "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "version": "1.17.9", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", + "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", "dev": true, "requires": { "@types/node": "*" @@ -14601,9 +15355,9 @@ "dev": true }, "@types/retry": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", - "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, "@types/selenium-webdriver": { @@ -14653,9 +15407,9 @@ "dev": true }, "@types/ws": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.1.tgz", - "integrity": "sha512-UxlLOfkuQnT2YSBCNq0x86SGOUxas6gAySFeDe2DcnEnA8655UIPoCDorWZCugcvKIL8IUI4oueUfJ1hhZSE2A==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", "dev": true, "requires": { "@types/node": "*" @@ -14920,14 +15674,14 @@ } }, "ajv": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", - "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "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", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, @@ -14938,6 +15692,26 @@ "dev": true, "requires": { "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "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 + } } }, "ajv-keywords": { @@ -14993,12 +15767,6 @@ "picomatch": "^2.0.4" } }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==", - "dev": true - }, "aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -15038,16 +15806,6 @@ } } }, - "aria-query": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", - "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7", - "commander": "^2.11.0" - } - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -15087,16 +15845,10 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", - "dev": true - }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" @@ -15140,45 +15892,27 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "axobject-query": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", - "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", - "dev": true, - "requires": { - "ast-types-flow": "0.0.7" - } - }, "babel-loader": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", - "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", + "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", - "loader-utils": "^1.4.0", + "loader-utils": "^2.0.0", "make-dir": "^3.1.0", "schema-utils": "^2.6.5" }, "dependencies": { - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", - "json5": "^1.0.1" + "json5": "^2.1.2" } } } @@ -15285,7 +16019,7 @@ "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", "dev": true }, "bcrypt-pbkdf": { @@ -15330,21 +16064,23 @@ } }, "body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dev": true, "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.7", - "raw-body": "2.4.3", - "type-is": "~1.6.18" + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, "dependencies": { "debug": { @@ -15356,18 +16092,33 @@ "ms": "2.0.0" } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } } } }, "bonjour": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", - "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "integrity": "sha512-RaVTblr+OnEli0r/ud8InrU7D+G0y6aJhlxaLa6Pwty4+xoxboF1BsUI45tujvRpbj9dQVoglChqonGAsjEBYg==", "dev": true, "requires": { "array-flatten": "^2.1.0", @@ -15410,16 +16161,15 @@ } }, "browserslist": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.3.tgz", - "integrity": "sha512-XK3X4xtKJ+Txj8G5c30B4gsm71s69lqXlkYui4s6EkKxuv49qjYlY6oVd+IFJ73d4YymtM3+djvvt/R/iJwwDg==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.2.tgz", + "integrity": "sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001312", - "electron-to-chromium": "^1.4.71", - "escalade": "^3.1.1", - "node-releases": "^2.0.2", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001366", + "electron-to-chromium": "^1.4.188", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.4" } }, "browserstack": { @@ -15550,9 +16300,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001312", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz", - "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", + "version": "1.0.30001368", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001368.tgz", + "integrity": "sha512-wgfRYa9DenEomLG/SdWgQxpIyvdtH3NW8Vq+tB6AwR9e56iOIcu1im5F/wNdDf04XlKHXqIx4N8Jo0PemeBenQ==", "dev": true }, "caseless": { @@ -15668,62 +16418,6 @@ "shallow-clone": "^3.0.0" } }, - "codelyzer": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", - "integrity": "sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==", - "dev": true, - "requires": { - "@angular/compiler": "9.0.0", - "@angular/core": "9.0.0", - "app-root-path": "^3.0.0", - "aria-query": "^3.0.0", - "axobject-query": "2.0.2", - "css-selector-tokenizer": "^0.7.1", - "cssauron": "^1.4.0", - "damerau-levenshtein": "^1.0.4", - "rxjs": "^6.5.3", - "semver-dsl": "^1.0.1", - "source-map": "^0.5.7", - "sprintf-js": "^1.1.2", - "tslib": "^1.10.0", - "zone.js": "~0.10.3" - }, - "dependencies": { - "@angular/compiler": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-9.0.0.tgz", - "integrity": "sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==", - "dev": true, - "requires": {} - }, - "@angular/core": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-9.0.0.tgz", - "integrity": "sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==", - "dev": true, - "requires": {} - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "zone.js": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz", - "integrity": "sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==", - "dev": true - } - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -15746,9 +16440,9 @@ "dev": true }, "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, "colors": { @@ -15775,7 +16469,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "component-emitter": { @@ -15811,7 +16505,7 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "dev": true }, "debug": { @@ -15826,7 +16520,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } @@ -15919,7 +16613,7 @@ "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true }, "copy-anything": { @@ -15945,6 +16639,18 @@ "serialize-javascript": "^6.0.0" }, "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -15963,6 +16669,12 @@ "is-glob": "^4.0.3" } }, + "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 + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -16190,31 +16902,12 @@ "nth-check": "^2.0.1" } }, - "css-selector-tokenizer": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", - "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "fastparse": "^1.1.2" - } - }, "css-what": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", "dev": true }, - "cssauron": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", - "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", - "dev": true, - "requires": { - "through": "X.X.X" - } - }, "cssdb": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", @@ -16233,12 +16926,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "damerau-levenshtein": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", - "integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==", - "dev": true - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -16396,9 +17083,9 @@ "dev": true }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true }, "detect-node": { @@ -16431,7 +17118,7 @@ "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", "dev": true }, "dns-packet": { @@ -16447,7 +17134,7 @@ "dns-txt": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", - "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "integrity": "sha512-Ix5PrWjphuSoUXV/Zv5gaFHjnaJtb02F2+Si3Ht9dyJ87+Z/lMmy+dpNHtTGraNK958ndXq2i+GLkWsWHcKaBQ==", "dev": true, "requires": { "buffer-indexof": "^1.0.0" @@ -16519,9 +17206,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.72", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.72.tgz", - "integrity": "sha512-9LkRQwjW6/wnSfevR21a3k8sOJ+XWSH7kkzs9/EUenKmuDkndP3W9y1yCZpOxufwGbX3JV8glZZSDb4o95zwXQ==", + "version": "1.4.198", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.198.tgz", + "integrity": "sha512-jwqQPdKGeAslcq8L+1SZZgL6uDiIDmTe9Gq4brsdWAH27y7MJ2g9Ue6MyST3ogmSM49EAQP7bype1V5hsuNrmQ==", "dev": true }, "emoji-regex": { @@ -16592,9 +17279,9 @@ } }, "enhanced-resolve": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz", - "integrity": "sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -16898,7 +17585,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true }, "eventemitter-asyncresource": { @@ -16943,38 +17630,39 @@ "dev": true }, "express": { - "version": "4.17.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", - "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.2", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.2", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.7", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", - "statuses": "~1.5.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -16983,7 +17671,13 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true }, "debug": { @@ -16995,17 +17689,53 @@ "ms": "2.0.0" } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true } } }, @@ -17057,12 +17787,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fastparse": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", - "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", - "dev": true - }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -17196,7 +17920,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, "fs-extra": { @@ -17244,6 +17968,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gauge": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.2.tgz", @@ -17391,26 +18121,6 @@ "requires": { "ajv": "^6.12.3", "har-schema": "^2.0.0" - }, - "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" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, "has": { @@ -17495,7 +18205,7 @@ "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -17531,9 +18241,9 @@ } }, "html-entities": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", - "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", "dev": true }, "html-escaper": { @@ -17551,26 +18261,40 @@ "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", "dev": true }, "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "requires": { - "depd": "~1.1.2", + "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", + "statuses": "2.0.1", "toidentifier": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } } }, "http-parser-js": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", - "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", "dev": true }, "http-proxy": { @@ -17596,9 +18320,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.3.tgz", - "integrity": "sha512-1bloEwnrHMnCoO/Gcwbz7eSVvW50KPES01PecpagI+YLNLci4AcuKJrujW4Mc3sBLpFxMSlsLNHS5Nl/lvrTPA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dev": true, "requires": { "@types/http-proxy": "^1.17.8", @@ -18255,9 +18979,9 @@ "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==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stringify-safe": { @@ -18267,13 +18991,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonc-parser": { "version": "3.0.0", @@ -18735,18 +19456,18 @@ "dev": true }, "memfs": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", - "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", + "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", "dev": true, "requires": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.3" } }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "merge-stream": { @@ -18764,7 +19485,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true }, "micromatch": { @@ -18813,6 +19534,18 @@ "schema-utils": "^4.0.0" }, "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -18822,6 +19555,12 @@ "fast-deep-equal": "^3.1.3" } }, + "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 + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -18843,18 +19582,18 @@ "dev": true }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { @@ -18959,7 +19698,7 @@ "multicast-dns-service-types": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", - "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "integrity": "sha512-cnAsSVxIDsYt0v7HmC0hWZFwwXSh+E6PgCrREDuN/EsjgLwA5XRmlMHhSiDPrt6HxY1gTivEa/Zh7GtODoLevQ==", "dev": true }, "mute-stream": { @@ -19010,6 +19749,14 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "ngx-toastr": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/ngx-toastr/-/ngx-toastr-14.3.0.tgz", + "integrity": "sha512-d8j/sOr60w5U7rGlcKQ0Ff4u+m2NzhqU5ZdJXn7QW3aR3Zf/rY7/Fd14BmUindTOWVr2NeTYcQXCjLpir0ldpA==", + "requires": { + "tslib": "^2.3.0" + } + }, "nice-napi": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", @@ -19029,9 +19776,9 @@ "optional": true }, "node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, "node-gyp": { @@ -19071,9 +19818,9 @@ "optional": true }, "node-releases": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz", - "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", "dev": true }, "nopt": { @@ -19261,6 +20008,12 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", @@ -19339,6 +20092,16 @@ "is-wsl": "^2.2.0" } }, + "open-fonts": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/open-fonts/-/open-fonts-1.1.1.tgz", + "integrity": "sha512-1b1y5pYdbHr9TS93Gr0qWu00xp00goadqZGBoQuVB0TN/Nc8Sgrq5FYdzJHltkQUnW5fLyMSYA14F7+/vBOe7w==" + }, + "open-iconic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/open-iconic/-/open-iconic-1.1.1.tgz", + "integrity": "sha512-OQNnNMDxg4q+Kl4+8FT9l+7ZUS2fhDe39inzT1J/lQTmSmrOLI3Fkm/QHu0ro83mIfAhgM+F3ZpuHw8vomHCmQ==" + }, "ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -19443,12 +20206,12 @@ } }, "p-retry": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", - "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", "dev": true, "requires": { - "@types/retry": "^0.12.0", + "@types/retry": "0.12.0", "retry": "^0.13.1" }, "dependencies": { @@ -19599,7 +20362,7 @@ "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "path-type": { @@ -19689,12 +20452,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } } } @@ -20316,10 +21079,13 @@ "dev": true }, "qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", - "dev": true + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "queue-microtask": { "version": "1.2.3", @@ -20343,13 +21109,13 @@ "dev": true }, "raw-body": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", - "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { "bytes": "3.1.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -20436,13 +21202,14 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz", - "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, "regexpu-core": { @@ -20677,9 +21444,9 @@ "dev": true }, "sass": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", - "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -20751,32 +21518,12 @@ "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", "ajv-keywords": "^3.5.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" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - } } }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", "dev": true }, "selenium-webdriver": { @@ -20812,12 +21559,12 @@ } }, "selfsigned": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz", - "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", "dev": true, "requires": { - "node-forge": "^1.2.0" + "node-forge": "^1" } }, "semver": { @@ -20829,42 +21576,25 @@ "lru-cache": "^6.0.0" } }, - "semver-dsl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", - "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", - "dev": true, - "requires": { - "semver": "^5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.8.1", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { @@ -20879,11 +21609,17 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true } } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -20895,6 +21631,21 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true } } }, @@ -20910,7 +21661,7 @@ "serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", "dev": true, "requires": { "accepts": "~1.3.4", @@ -20934,7 +21685,7 @@ "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", "dev": true, "requires": { "depd": "~1.1.2", @@ -20946,13 +21697,13 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, "setprototypeof": { @@ -20964,15 +21715,15 @@ } }, "serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.2" + "send": "0.18.0" } }, "set-blocking": { @@ -21017,6 +21768,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -21362,14 +22124,14 @@ } }, "terser": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", - "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", + "version": "5.14.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", + "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" } }, @@ -21386,24 +22148,6 @@ "terser": "^5.7.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" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -21684,6 +22428,16 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "update-browserslist-db": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz", + "integrity": "sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -21864,13 +22618,13 @@ } }, "webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -21878,7 +22632,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -21895,24 +22649,6 @@ "webpack-sources": "^3.2.3" }, "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" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -21939,6 +22675,18 @@ "schema-utils": "^4.0.0" }, "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -21948,6 +22696,12 @@ "fast-deep-equal": "^3.1.3" } }, + "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 + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -21999,6 +22753,18 @@ "ws": "^8.1.0" }, "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, "ajv-keywords": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", @@ -22021,9 +22787,9 @@ "dev": true }, "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", "dev": true, "requires": { "globby": "^11.0.1", @@ -22062,6 +22828,12 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "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 + }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", @@ -22088,13 +22860,6 @@ "requires": { "ansi-regex": "^6.0.1" } - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} } } }, diff --git a/web/package.json b/web/package.json index 21d17d3..884167b 100644 --- a/web/package.json +++ b/web/package.json @@ -7,46 +7,51 @@ "build": "ng build --configuration production", "test": "ng test", "lint": "ng lint", - "e2e": "ng e2e" + "e2e": "ng e2e", + "update": "(npm i || true) && npm audit fix --force" }, "private": true, "dependencies": { - "@angular/animations": "~13.2.4", - "@angular/common": "~13.2.4", - "@angular/compiler": "~13.2.4", - "@angular/core": "~13.2.4", - "@angular/forms": "~13.2.4", - "@angular/platform-browser": "~13.2.4", - "@angular/platform-browser-dynamic": "~13.2.4", - "@angular/router": "~13.2.4", + "@angular/animations": "^13.3.11", + "@angular/common": "^13.3.11", + "@angular/compiler": "^13.3.11", + "@angular/core": "^13.3.11", + "@angular/forms": "^13.3.11", + "@angular/platform-browser": "^13.3.11", + "@angular/platform-browser-dynamic": "^13.3.11", + "@angular/router": "^13.3.11", + "@angular/cdk": "^13.3.9", + "@deweppro/core": "^0.1.5", "bootstrap": "^5.0.1", "jquery": "^3.6.0", "lodash": "^4.17.21", - "rxjs": "~6.6.0", + "ngx-toastr": "^14.3.0", + "open-fonts": "^1.1.1", + "open-iconic": "^1.1.1", + "rxjs": "^6.6.0", "sprintf-js": "^1.1.2", "tslib": "^2.0.0", - "zone.js": "~0.11.3" + "zone.js": "^0.11.3" }, "devDependencies": { - "@angular-devkit/build-angular": "~13.2.5", - "@angular/cli": "~13.2.5", - "@angular/compiler-cli": "~13.2.4", + "@angular-devkit/build-angular": "^13.2.5", + "@angular/cli": "^13.2.5", + "@angular/compiler-cli": "^13.3.11", "@types/jasmine": "^3.7.7", "@types/jquery": "^3.5.5", "@types/lodash": "^4.14.168", "@types/node": "^15.12.2", "@types/sprintf-js": "^1.1.2", - "codelyzer": "^6.0.0", - "jasmine-core": "~3.7.1", - "jasmine-spec-reporter": "~5.0.0", - "karma": "~6.3.0", - "karma-chrome-launcher": "~3.1.0", - "karma-coverage": "~2.0.3", - "karma-jasmine": "~4.0.0", + "jasmine-core": "^3.7.1", + "jasmine-spec-reporter": "^5.0.0", + "karma": "^6.3.0", + "karma-chrome-launcher": "^3.1.0", + "karma-coverage": "^2.0.3", + "karma-jasmine": "^4.0.0", "karma-jasmine-html-reporter": "^1.5.0", - "protractor": "~7.0.0", - "ts-node": "~8.3.0", - "tslint": "~6.1.0", - "typescript": "~4.5.5" + "protractor": "^7.0.0", + "ts-node": "^8.3.0", + "tslint": "^6.1.0", + "typescript": "^4.5.5" } } diff --git a/web/src/app/app-routing.module.ts b/web/src/app/app-routing.module.ts index 0ebcc4c..392fb85 100644 --- a/web/src/app/app-routing.module.ts +++ b/web/src/app/app-routing.module.ts @@ -1,16 +1,32 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { CacheComponent } from './components/cache/cache.component'; +import {NgModule} from '@angular/core'; +import {RouterModule, Routes} from '@angular/router'; +import {AdblockComponent} from 'src/app/components/adblock/adblock.component'; +import {DynamicComponent} from 'src/app/components/dynamic/dynamic.component'; +import {FixedComponent} from 'src/app/components/fixed/fixed.component'; const routes: Routes = [ - { - path: "cache", - component: CacheComponent, - } + { + path: 'cache/dynamic', + component: DynamicComponent + }, + { + path: 'cache/adblock', + component: AdblockComponent + }, + { + path: 'cache/fixed', + component: FixedComponent + }, + { + path: '', + redirectTo: 'cache/dynamic', + pathMatch: 'full', + }, ]; @NgModule({ - imports: [RouterModule.forRoot(routes, { useHash: true })], - exports: [RouterModule] + imports: [RouterModule.forRoot(routes, {useHash: true})], + exports: [RouterModule] }) -export class AppRoutingModule { } +export class AppRoutingModule { +} diff --git a/web/src/app/app.component.html b/web/src/app/app.component.html index 59a30e6..7b523ba 100644 --- a/web/src/app/app.component.html +++ b/web/src/app/app.component.html @@ -4,10 +4,16 @@
diff --git a/web/src/app/app.component.scss b/web/src/app/app.component.scss index e69de29..20d5e3e 100644 --- a/web/src/app/app.component.scss +++ b/web/src/app/app.component.scss @@ -0,0 +1,5 @@ +.logo { + color: #FF7F50FF; + font-weight: bold; + text-shadow: 1px 0px 3px rgba(0, 0, 0, 0.3); +} diff --git a/web/src/app/app.module.ts b/web/src/app/app.module.ts index feb15a0..70a4f87 100644 --- a/web/src/app/app.module.ts +++ b/web/src/app/app.module.ts @@ -1,27 +1,44 @@ -import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; -import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { ErrorInterceptor } from './services/http/error.interceptor'; -import { HttpService } from './services/http/http.service'; -import { CacheComponent } from './components/cache/cache.component'; +import {ScrollingModule} from '@angular/cdk/scrolling'; +import {HTTP_INTERCEPTORS} from '@angular/common/http'; +import {NgModule} from '@angular/core'; +import {FormsModule} from '@angular/forms'; +import {BrowserModule} from '@angular/platform-browser'; +import {DuiCoreModule} from '@deweppro/core'; +import {ToastrModule} from 'ngx-toastr'; +import {DynamicComponent} from 'src/app/components/dynamic/dynamic.component'; +import {PipeModule} from 'src/app/pipe/pipe.module'; +import {ErrorInterceptor} from 'src/app/services/error-interceptor.service'; +import {environment} from 'src/environments/environment'; +import {AppRoutingModule} from './app-routing.module'; +import {AppComponent} from './app.component'; +import {AdblockComponent} from './components/adblock/adblock.component'; +import {FixedComponent} from './components/fixed/fixed.component'; @NgModule({ - declarations: [ - AppComponent, - CacheComponent - ], - imports: [ - BrowserModule, - AppRoutingModule, - HttpClientModule, - ], - providers: [ - HttpService, - { provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true }, - ], - bootstrap: [AppComponent] + declarations: [ + AppComponent, + DynamicComponent, + AdblockComponent, + FixedComponent + ], + imports: [ + BrowserModule, + AppRoutingModule, + FormsModule, + PipeModule, + DuiCoreModule.forRoot(environment.apiPrefix), + ToastrModule.forRoot({ + preventDuplicates: true, + progressBar: true, + positionClass: 'toast-bottom-right' + }), + ScrollingModule + ], + providers: [ + {provide: HTTP_INTERCEPTORS, useClass: ErrorInterceptor, multi: true} + ], + bootstrap: [AppComponent] }) -export class AppModule { } +export class AppModule { +} diff --git a/web/src/app/components/adblock/adblock.component.html b/web/src/app/components/adblock/adblock.component.html new file mode 100644 index 0000000..3bdfff0 --- /dev/null +++ b/web/src/app/components/adblock/adblock.component.html @@ -0,0 +1,40 @@ +

Adblock Domains {{domains.length}}

+ +
+
+
+
+
Filter
+
+ +
+ +
+
+
+
+ +
+
+ +
+ +
{{uri.uri}}
+ +
+
+ {{domain.domain}} +
+
+ +
+ + +
+
diff --git a/web/src/app/components/adblock/adblock.component.scss b/web/src/app/components/adblock/adblock.component.scss new file mode 100644 index 0000000..17c5cf1 --- /dev/null +++ b/web/src/app/components/adblock/adblock.component.scss @@ -0,0 +1,16 @@ +.card-title { + color: blue !important; + font-size: 9pt !important; + word-wrap: anywhere; +} + +.card-body{ + padding: 7px !important; +} + +.uri { + font-weight: bold; + font-size: 8pt !important; + word-wrap: anywhere; + padding: 7px !important; +} diff --git a/web/src/app/components/adblock/adblock.component.ts b/web/src/app/components/adblock/adblock.component.ts new file mode 100644 index 0000000..6e853c1 --- /dev/null +++ b/web/src/app/components/adblock/adblock.component.ts @@ -0,0 +1,58 @@ +import {Component, NgZone, OnInit} from '@angular/core'; +import {RequestService} from '@deweppro/core'; +import {AdblockDomain, AdblockURI} from 'src/app/models/adblock'; +import {CacheItem} from 'src/app/models/cache'; +import {environment} from 'src/environments/environment'; + +@Component({ + selector: 'app-adblock', + templateUrl: './adblock.component.html', + styleUrls: ['./adblock.component.scss'] +}) +export class AdblockComponent implements OnInit { + + uris: AdblockURI[] = []; + domains: AdblockDomain[] = []; + filter = ''; + constructor( + protected http: RequestService + ) { + } + + ngOnInit(): void { + this.reload(); + } + + reload(): void { + this.uriList(); + this.domainList(); + } + + uriList(): void { + this.http.get(environment.adblock_list_uri) + .subscribe((value: any) => { + this.uris = value; + }); + } + + domainList(): void { + this.http.get(environment.adblock_list_domain) + .subscribe((value: any) => { + this.domains = value; + }); + } + + changeActive(domain: string, active: boolean): void { + active = !active; + this.http.post(environment.adblock_active, {domain, active}) + .subscribe(() => { + this.domains = this.domains.map((value) => { + if (value.domain === domain) { + value.active = active; + } + return value; + }); + }); + } + +} diff --git a/web/src/app/components/cache/cache.component.html b/web/src/app/components/cache/cache.component.html deleted file mode 100644 index dc894ce..0000000 --- a/web/src/app/components/cache/cache.component.html +++ /dev/null @@ -1,10 +0,0 @@ -

Cached Domains

- - - - - - -
{{v.domain}} - {{ip}} -
diff --git a/web/src/app/components/cache/cache.component.scss b/web/src/app/components/cache/cache.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/web/src/app/components/cache/cache.component.ts b/web/src/app/components/cache/cache.component.ts deleted file mode 100644 index 80ba84e..0000000 --- a/web/src/app/components/cache/cache.component.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Data } from '@angular/router'; -import { CacheItem } from 'src/app/models/cache'; -import { HttpService } from 'src/app/services/http/http.service'; -import { environment } from 'src/environments/environment'; - -@Component({ - selector: 'app-cache', - templateUrl: './cache.component.html', - styleUrls: ['./cache.component.scss'] -}) -export class CacheComponent implements OnInit { - - list: CacheItem[] = []; - - constructor(public http: HttpService) { - - } - - ngOnInit(): void { - this.CacheList(); - } - - - CacheList(): void { - this.http.get(environment.cache_list) - .then((value: any) => { - this.list = value; - }) - .catch((e: any) => { - console.error(e); - }); - } - -} diff --git a/web/src/app/components/dynamic/dynamic.component.html b/web/src/app/components/dynamic/dynamic.component.html new file mode 100644 index 0000000..7dc35c5 --- /dev/null +++ b/web/src/app/components/dynamic/dynamic.component.html @@ -0,0 +1,35 @@ +

Dynamic Cache Domains

+ +
+
+
+
+
Filter
+
+ +
+ +
+
+
+
+ +
+
+
+
+
+
{{v.domain}}
+
ttl: {{v.ttl}}
+

+ {{ip}} +

+ Open + Block +
+
+
+
+
diff --git a/web/src/app/components/dynamic/dynamic.component.scss b/web/src/app/components/dynamic/dynamic.component.scss new file mode 100644 index 0000000..2285a2e --- /dev/null +++ b/web/src/app/components/dynamic/dynamic.component.scss @@ -0,0 +1,13 @@ +.fsm { + font-size: 9pt; + padding: 0 5px; +} + +.card-subtitle { + color: green !important; + font-size: 8pt; +} + +.card-title { + color: blue !important; +} diff --git a/web/src/app/components/dynamic/dynamic.component.ts b/web/src/app/components/dynamic/dynamic.component.ts new file mode 100644 index 0000000..970b2de --- /dev/null +++ b/web/src/app/components/dynamic/dynamic.component.ts @@ -0,0 +1,40 @@ +import {Component, OnInit} from '@angular/core'; +import {RequestService} from '@deweppro/core'; +import {CacheItem} from 'src/app/models/cache'; +import {environment} from 'src/environments/environment'; + +@Component({ + selector: 'app-dynamic', + templateUrl: './dynamic.component.html', + styleUrls: ['./dynamic.component.scss'] +}) +export class DynamicComponent implements OnInit { + + list: CacheItem[] = []; + filter = ''; + + constructor( + protected http: RequestService + ) { + } + + ngOnInit(): void { + this.cacheList(); + } + + cacheList(): void { + this.http.get(environment.cache_list, {type: 1, filter: this.filter}) + .subscribe((value: any) => { + this.list = value; + }); + } + + blockDomain(domain: string): void { + this.http.post(environment.cache_block, {domain}) + .subscribe(() => { + this.list = this.list.filter(value => { + return value.domain !== domain; + }); + }); + } +} diff --git a/web/src/app/components/fixed/fixed.component.html b/web/src/app/components/fixed/fixed.component.html new file mode 100644 index 0000000..81f3a3b --- /dev/null +++ b/web/src/app/components/fixed/fixed.component.html @@ -0,0 +1,73 @@ +

Rules

+ +
+
+ + +
  • + [{{rule.types}}] {{rule.origin}} + + off + on + +
  • +
    + +
    + + New + +
    +
    + +
    + +

    + {{rule.origin}} + {{rule.domain}} +

    + +
    + Rule + +
    + +
    + IPs + +
    + +
    + + +
    + +
    +
    + Save +
    + +
    +
    + Del +
    +
    + +
    + +
    +
    diff --git a/web/src/app/components/fixed/fixed.component.scss b/web/src/app/components/fixed/fixed.component.scss new file mode 100644 index 0000000..e1d2dfa --- /dev/null +++ b/web/src/app/components/fixed/fixed.component.scss @@ -0,0 +1,6 @@ +.short-list { + height: 56vh; + width: 100%; + overflow-y: scroll; + font-size: 8pt; +} diff --git a/web/src/app/components/fixed/fixed.component.ts b/web/src/app/components/fixed/fixed.component.ts new file mode 100644 index 0000000..37b42af --- /dev/null +++ b/web/src/app/components/fixed/fixed.component.ts @@ -0,0 +1,84 @@ +import {Component, OnInit} from '@angular/core'; +import {RequestService} from '@deweppro/core'; +import {ToastrService} from 'ngx-toastr'; +import {Fixed} from 'src/app/models/fixed'; +import {environment} from 'src/environments/environment'; + +@Component({ + selector: 'app-fixed', + templateUrl: './fixed.component.html', + styleUrls: ['./fixed.component.scss'] +}) +export class FixedComponent implements OnInit { + + list: Fixed[] = []; + id = 0; + + constructor( + private http: RequestService, + private alert: ToastrService + ) { + } + + ngOnInit(): void { + this.rulesList(); + } + + rulesList(): void { + this.http.get(environment.fixed_list) + .subscribe((value: any) => { + this.list = value; + }); + } + + show(i: number): void { + this.id = i; + } + + save(rule: Fixed): void { + this.http.post(environment.fixed_save, rule) + .subscribe((value: any) => { + this.list.splice(this.id, 1, value); + this.rebuild(); + this.alert.success('Saved!'); + }); + } + + add(): void { + const el: Fixed = {active: false, origin: '', domain: '', types: '', ips: ''}; + this.list = [el, ...this.list]; + this.show(0); + } + + del(rule: Fixed): void { + if (!confirm('Do you really want to delete?')) { + return; + } + if (rule.origin.length === 0) { + this.list.splice(this.id, 1); + this.rebuild(); + this.alert.success('Deleted!'); + return; + } + this.http.post(environment.fixed_delete, rule) + .subscribe(() => { + this.list.splice(this.id, 1); + this.rebuild(); + this.alert.success('Deleted!'); + }); + } + + active(rule: Fixed): void { + rule.active = !rule.active; + this.http.post(environment.fixed_active, rule) + .subscribe((value: any) => { + this.list.splice(this.id, 1, value); + this.rebuild(); + this.alert.success(rule.active ? 'Activated!' : 'Deactivated!'); + }); + } + + private rebuild(): void { + this.list = [...this.list]; + } +} diff --git a/web/src/app/models/adblock.ts b/web/src/app/models/adblock.ts new file mode 100644 index 0000000..fb1b040 --- /dev/null +++ b/web/src/app/models/adblock.ts @@ -0,0 +1,11 @@ +export class AdblockURI { + tag!: string; + uri!: string; + active!: boolean; +} + +export class AdblockDomain { + tag!: string; + domain!: string; + active!: boolean; +} diff --git a/web/src/app/models/cache.ts b/web/src/app/models/cache.ts index 1421af5..daf4763 100644 --- a/web/src/app/models/cache.ts +++ b/web/src/app/models/cache.ts @@ -1,4 +1,5 @@ export class CacheItem { domain!: string; ip!: string[]; + ttl!: string; } diff --git a/web/src/app/models/fixed.ts b/web/src/app/models/fixed.ts new file mode 100644 index 0000000..4acd8d2 --- /dev/null +++ b/web/src/app/models/fixed.ts @@ -0,0 +1,12 @@ +export class FixedTypeItem { + name!: string; + code!: string; +} + +export class Fixed { + types!: string; + origin!: string; + domain!: string; + ips!: string; + active!: boolean; +} diff --git a/web/src/app/pipe/domain-filter.pipe.ts b/web/src/app/pipe/domain-filter.pipe.ts new file mode 100644 index 0000000..9d87cf5 --- /dev/null +++ b/web/src/app/pipe/domain-filter.pipe.ts @@ -0,0 +1,21 @@ +import {Pipe, PipeTransform} from '@angular/core'; +import {AdblockDomain, AdblockURI} from 'src/app/models/adblock'; + +@Pipe({ + name: 'domainFilter' +}) +export class DomainFilterPipe implements PipeTransform { + + transform(list: AdblockDomain[], arg: AdblockURI, filter: string): AdblockDomain[] { + return list.filter(value => { + if (value.tag !== arg.tag) { + return false; + } + if (filter.length < 3) { + return false; + } + return value.domain.indexOf(filter) !== -1; + }); + } + +} diff --git a/web/src/app/pipe/domain.pipe.ts b/web/src/app/pipe/domain.pipe.ts new file mode 100644 index 0000000..15b0aed --- /dev/null +++ b/web/src/app/pipe/domain.pipe.ts @@ -0,0 +1,12 @@ +import {Pipe, PipeTransform} from '@angular/core'; + +@Pipe({ + name: 'domain' +}) +export class DomainPipe implements PipeTransform { + + transform(value: string): string { + return 'https://' + value.trim(); + } + +} diff --git a/web/src/app/pipe/index.pipe.ts b/web/src/app/pipe/index.pipe.ts new file mode 100644 index 0000000..2af343f --- /dev/null +++ b/web/src/app/pipe/index.pipe.ts @@ -0,0 +1,15 @@ +import {Pipe, PipeTransform} from '@angular/core'; +import {Fixed} from 'src/app/models/fixed'; + +@Pipe({ + name: 'index' +}) +export class IndexPipe implements PipeTransform { + + transform(list: Fixed[], index: number): Fixed[] { + return list.filter((value, i) => { + return index === i; + }); + } + +} diff --git a/web/src/app/pipe/pipe.module.ts b/web/src/app/pipe/pipe.module.ts new file mode 100644 index 0000000..c9551fd --- /dev/null +++ b/web/src/app/pipe/pipe.module.ts @@ -0,0 +1,24 @@ +import {NgModule} from '@angular/core'; +import {CommonModule} from '@angular/common'; +import {DomainFilterPipe} from 'src/app/pipe/domain-filter.pipe'; +import {DomainPipe} from 'src/app/pipe/domain.pipe'; +import {IndexPipe} from 'src/app/pipe/index.pipe'; + + +@NgModule({ + declarations: [ + DomainPipe, + DomainFilterPipe, + IndexPipe + ], + exports: [ + DomainPipe, + DomainFilterPipe, + IndexPipe + ], + imports: [ + CommonModule + ] +}) +export class PipeModule { +} diff --git a/web/src/app/services/error-interceptor.service.ts b/web/src/app/services/error-interceptor.service.ts new file mode 100644 index 0000000..6b66af0 --- /dev/null +++ b/web/src/app/services/error-interceptor.service.ts @@ -0,0 +1,34 @@ +import { + HttpErrorResponse, + HttpEvent, + HttpHandler, + HttpInterceptor, + HttpRequest +} from '@angular/common/http'; +import {Injectable} from '@angular/core'; +import {Router} from '@angular/router'; +import {ToastrService} from 'ngx-toastr'; +import {EMPTY, Observable, throwError} from 'rxjs'; +import {catchError} from 'rxjs/operators'; + +@Injectable() +export class ErrorInterceptor implements HttpInterceptor { + constructor( + private router: Router, + private alert: ToastrService + ) { + } + + intercept( + request: HttpRequest, + next: HttpHandler + ): Observable> { + return next.handle(request).pipe( + catchError((err: HttpErrorResponse) => { + const message = err?.error || err?.message || err.statusText; + this.alert.error(message, 'HTTP ERROR'); + return EMPTY; + }) + ); + } +} diff --git a/web/src/app/services/http/error.interceptor.ts b/web/src/app/services/http/error.interceptor.ts deleted file mode 100644 index 4069be8..0000000 --- a/web/src/app/services/http/error.interceptor.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable, throwError } from 'rxjs'; -import { catchError } from 'rxjs/operators'; - -@Injectable() -export class ErrorInterceptor implements HttpInterceptor { - - constructor() { - } - - intercept(request: HttpRequest, next: HttpHandler): Observable> { - return next.handle(request).pipe(catchError(error => { - if (error.error instanceof ErrorEvent) { - return throwError(`An error occurred: ${error.error.message}`); - } else if (typeof (error) === 'string') { - return throwError(error); - } else { - return throwError(`Backend returned code ${error.status}, body was: ${error.message}`); - } - })); - } -} diff --git a/web/src/app/services/http/http.service.ts b/web/src/app/services/http/http.service.ts deleted file mode 100644 index 31e6bca..0000000 --- a/web/src/app/services/http/http.service.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { HttpClient, HttpHeaders } from '@angular/common/http'; -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs'; -import { take } from 'rxjs/operators'; -import { environment } from 'src/environments/environment'; - - -@Injectable({ - providedIn: 'root' -}) -export class HttpService { - protected cache = new Map(); - - constructor( - protected http: HttpClient, - ) { - } - - get(url: string): Promise { - return this._promise(this.http.get(this._build(url), { headers: this._headers(null) })); - } - - post(url: string, data: object): Promise { - return this._promise(this.http.post(this._build(url), data, { headers: this._headers(data) })); - } - - put(url: string, data: object): Promise { - return this._promise(this.http.put(this._build(url), data, { headers: this._headers(data) })); - } - - delete(url: string): Promise { - return this._promise(this.http.delete(this._build(url), { headers: this._headers(null) })); - } - - protected _promise(obs: Observable): Promise { - return new Promise((resolve, reject) => { - obs - .pipe( - take(1) - ) - .subscribe( - (value: any) => resolve(value), - (err: any) => reject(err), - () => { }, - ); - - }); - } - - protected _build(url: string): string { - return `/${environment.apiprefix}/${url}`; - } - - protected _headers(body?: any): HttpHeaders { - let head = new HttpHeaders(); - - if (body instanceof FormData) { - // head = head.set('Content-Type', 'multipart/form-data'); - } else { - head = head.set('Content-Type', 'application/json'); - } - - return head; - } - -} diff --git a/web/src/environments/urls.ts b/web/src/environments/urls.ts index 4db499a..0288b6c 100644 --- a/web/src/environments/urls.ts +++ b/web/src/environments/urls.ts @@ -1,5 +1,15 @@ export const urls = { - apiprefix: 'api', + apiPrefix: 'api', - cache_list: 'cache/list' + cache_list: 'cache/list', + cache_block: 'cache/block', + + adblock_list_uri: 'adblock/list/uri', + adblock_list_domain: 'adblock/list/domain', + adblock_active: 'adblock/active', + + fixed_list: 'fixed/list', + fixed_save: 'fixed/save', + fixed_active: 'fixed/active', + fixed_delete: 'fixed/delete' }; diff --git a/web/src/styles.scss b/web/src/styles.scss index badf6ae..20e1440 100644 --- a/web/src/styles.scss +++ b/web/src/styles.scss @@ -1,3 +1,46 @@ @import "~bootstrap/scss/bootstrap"; @import "~bootstrap/scss/bootstrap-grid"; @import "~bootstrap/scss/bootstrap-reboot"; +@import "~open-iconic/font/css/open-iconic-bootstrap"; +@import '~ngx-toastr/toastr'; +@import "@deweppro/core/styles/base.css"; +@import "~open-fonts/fonts/jetbrains-mono.css"; + +* { + font-family: 'JetBrains Mono', sans-serif; +} + +* { + -moz-user-select: text !important; + -khtml-user-select: text !important; + -webkit-user-select: text !important; + user-select: text !important; +} + +:active, :hover, :focus { + outline: 0 !important; + outline-offset: 0 !important; + box-shadow: none !important; +} + +.clickable { + cursor: pointer; +} + +.clickable:hover { + opacity: 0.8; + position: relative; + z-index: 1; +} + + +#toast-container { + .toast-title { + font-size: 10pt; + } + + .toast-message { + font-size: 9pt; + } +} + diff --git a/web/tslint.json b/web/tslint.json index 277c8eb..04d376b 100644 --- a/web/tslint.json +++ b/web/tslint.json @@ -1,7 +1,7 @@ { "extends": "tslint:recommended", "rulesDirectory": [ - "codelyzer" + ], "rules": { "align": {