aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.dockerignore4
-rw-r--r--.gitignore462
-rw-r--r--Dockerfile16
-rw-r--r--VSH.sln34
-rwxr-xr-xbuild_and_push.sh35
-rwxr-xr-xsloc_count.sh2
-rw-r--r--src/BackgroundServices/AssetsCleanupBackgroundService.cs61
-rw-r--r--src/BackgroundServices/StartupTasksBackgroundService.cs35
-rw-r--r--src/BackgroundServices/VippsOrderStatusCheckerBackgroundService.cs59
-rw-r--r--src/Controllers/AccountController.cs119
-rw-r--r--src/Controllers/CategoriesController.cs106
-rw-r--r--src/Controllers/DocumentsController.cs76
-rw-r--r--src/Controllers/MainControllerBase.cs26
-rw-r--r--src/Controllers/OrdersController.cs339
-rw-r--r--src/Controllers/ProductsController.cs121
-rw-r--r--src/Controllers/RootController.cs75
-rw-r--r--src/Data/Database/Base.cs15
-rw-r--r--src/Data/Database/Category.cs30
-rw-r--r--src/Data/Database/Document.cs9
-rw-r--r--src/Data/Database/Order.cs98
-rw-r--r--src/Data/Database/Product.cs54
-rw-r--r--src/Data/Database/User.cs18
-rw-r--r--src/Data/Dtos/AdminViewOrderDto.cs29
-rw-r--r--src/Data/Enums/AnalyticType.cs7
-rw-r--r--src/Data/Enums/CategoryVisibility.cs8
-rw-r--r--src/Data/Enums/CookieType.cs8
-rw-r--r--src/Data/Enums/DocumentType.cs10
-rw-r--r--src/Data/Enums/OrderAdminStatus.cs9
-rw-r--r--src/Data/Enums/OrderPaymentType.cs7
-rw-r--r--src/Data/Enums/OrderStatus.cs11
-rw-r--r--src/Data/Enums/PriceSuffix.cs7
-rw-r--r--src/Data/Enums/ProductVisibility.cs8
-rw-r--r--src/Data/MainDbContext.cs40
-rw-r--r--src/Data/Miscellaneous/AppCookie.cs8
-rw-r--r--src/Data/Miscellaneous/AppPath.cs7
-rw-r--r--src/Data/Miscellaneous/AppSettings.cs118
-rw-r--r--src/Data/Miscellaneous/OpenGraphData.cs12
-rw-r--r--src/Data/Payloads/CreateProductDto.cs22
-rw-r--r--src/Data/Payloads/LoginPayload.cs8
-rw-r--r--src/Data/Payloads/UpdatePasswordPayload.cs6
-rw-r--r--src/Data/Payloads/ValidateOrderPayload.cs15
-rw-r--r--src/Data/Results/AppValidationResult.cs27
-rw-r--r--src/Data/Results/ErrorResult.cs12
-rw-r--r--src/Data/Static/AppCookies.cs21
-rw-r--r--src/Data/Static/AppPaths.cs40
-rw-r--r--src/Migrations/20210305140605_CleanSlate.Designer.cs315
-rw-r--r--src/Migrations/20210305140605_CleanSlate.cs166
-rw-r--r--src/Migrations/20210308201742_VippsResponsesAsStrings.Designer.cs314
-rw-r--r--src/Migrations/20210308201742_VippsResponsesAsStrings.cs17
-rw-r--r--src/Migrations/20210309193123_RemoveVippsResponses.Designer.cs255
-rw-r--r--src/Migrations/20210309193123_RemoveVippsResponses.cs81
-rw-r--r--src/Migrations/MainDbContextModelSnapshot.cs253
-rw-r--r--src/Pages/Errors/Index.cshtml33
-rw-r--r--src/Pages/Errors/Index.cshtml.cs19
-rw-r--r--src/Pages/Handlekorg.cshtml100
-rw-r--r--src/Pages/Handlekorg.cshtml.cs8
-rw-r--r--src/Pages/Index.cshtml41
-rw-r--r--src/Pages/Index.cshtml.cs34
-rw-r--r--src/Pages/Kontoret/Bestillinger.cshtml67
-rw-r--r--src/Pages/Kontoret/Bestillinger.cshtml.cs8
-rw-r--r--src/Pages/Kontoret/Dokumenter.cshtml21
-rw-r--r--src/Pages/Kontoret/Dokumenter.cshtml.cs8
-rw-r--r--src/Pages/Kontoret/Produkter.cshtml18
-rw-r--r--src/Pages/Kontoret/Produkter.cshtml.cs8
-rw-r--r--src/Pages/Kontoret/_ViewImports.cshtml3
-rw-r--r--src/Pages/Kontoret/_ViewStart.cshtml3
-rw-r--r--src/Pages/Leverandorar.cshtml9
-rw-r--r--src/Pages/Leverandorar.cshtml.cs23
-rw-r--r--src/Pages/LoggInn.cshtml34
-rw-r--r--src/Pages/LoggInn.cshtml.cs19
-rw-r--r--src/Pages/OmOss.cshtml9
-rw-r--r--src/Pages/OmOss.cshtml.cs23
-rw-r--r--src/Pages/Partials/_AdminCategoriesModal.cshtml25
-rw-r--r--src/Pages/Partials/_AdminProductModal.cshtml72
-rw-r--r--src/Pages/Partials/_CultureSelector.cshtml35
-rw-r--r--src/Pages/Personvern.cshtml8
-rw-r--r--src/Pages/Personvern.cshtml.cs25
-rw-r--r--src/Pages/Produktar.cshtml163
-rw-r--r--src/Pages/Produktar.cshtml.cs82
-rw-r--r--src/Pages/SalesTerms.cshtml9
-rw-r--r--src/Pages/SalesTerms.cshtml.cs25
-rw-r--r--src/Pages/Shared/_AdminLayout.cshtml114
-rw-r--r--src/Pages/Shared/_PublicLayout.cshtml152
-rw-r--r--src/Pages/Status.cshtml136
-rw-r--r--src/Pages/Status.cshtml.cs53
-rw-r--r--src/Pages/_ViewImports.cshtml3
-rw-r--r--src/Pages/_ViewStart.cshtml3
-rw-r--r--src/Program.cs44
-rw-r--r--src/Properties/launchSettings.json12
-rw-r--r--src/Resources/ConnectingClasses/SharedControllerResources.cs6
-rw-r--r--src/Resources/ConnectingClasses/SharedPageResources.cs6
-rw-r--r--src/Resources/ConnectingClasses/SharedServiceResources.cs6
-rw-r--r--src/Resources/SharedControllerResources.en.resx47
-rw-r--r--src/Resources/SharedPageResources.en.resx47
-rw-r--r--src/Resources/SharedServiceResources.en.resx14
-rw-r--r--src/Services/AssetsService.cs58
-rw-r--r--src/Services/CookieService.cs55
-rw-r--r--src/Services/EmailService.cs45
-rw-r--r--src/Services/OrderService.cs126
-rw-r--r--src/Startup.cs169
-rw-r--r--src/Utilities/ConfigurationExtensions.cs26
-rw-r--r--src/Utilities/EnumName.cs38
-rw-r--r--src/Utilities/ImageFunctions.cs61
-rw-r--r--src/VSH.csproj46
-rw-r--r--src/appsettings.json10
-rw-r--r--src/wwwroot/assets/profile/header.min.new.svg303
-rw-r--r--src/wwwroot/assets/profile/header.min.svg1
-rw-r--r--src/wwwroot/assets/profile/header.svg530
-rw-r--r--src/wwwroot/assets/profile/innrammet.svg16
-rwxr-xr-xsrc/wwwroot/assets/profile/logohvit.svg78
-rw-r--r--src/wwwroot/assets/profile/og_default.pngbin0 -> 34063 bytes
-rw-r--r--src/wwwroot/assets/profile/og_default.svg16
-rw-r--r--src/wwwroot/assets/profile/vipps_badge.pngbin0 -> 696 bytes
-rw-r--r--src/wwwroot/assets/profile/vipps_button.pngbin0 -> 1350 bytes
-rw-r--r--src/wwwroot/backbundle.js4
-rw-r--r--src/wwwroot/backbundle.scss7
-rw-r--r--src/wwwroot/frontbundle.js7
-rw-r--r--src/wwwroot/frontbundle.scss6
-rw-r--r--src/wwwroot/manifest.json7
-rw-r--r--src/wwwroot/package-lock.json11329
-rw-r--r--src/wwwroot/package.json35
-rw-r--r--src/wwwroot/prepros.config931
-rw-r--r--src/wwwroot/scripts/api/account-api.ts28
-rw-r--r--src/wwwroot/scripts/api/account-api.types.ts5
-rw-r--r--src/wwwroot/scripts/api/categories-api.ts33
-rw-r--r--src/wwwroot/scripts/api/categories-api.types.ts17
-rw-r--r--src/wwwroot/scripts/api/db-base.ts3
-rw-r--r--src/wwwroot/scripts/api/documents-api.ts24
-rw-r--r--src/wwwroot/scripts/api/order-api.ts64
-rw-r--r--src/wwwroot/scripts/api/order-api.types.ts39
-rw-r--r--src/wwwroot/scripts/api/products-api.ts59
-rw-r--r--src/wwwroot/scripts/api/products-api.types.ts35
-rw-r--r--src/wwwroot/scripts/api/settings-api.ts17
-rw-r--r--src/wwwroot/scripts/api/settings-api.types.ts3
-rw-r--r--src/wwwroot/scripts/back/bestillinger.js321
-rw-r--r--src/wwwroot/scripts/back/dokumenter.js102
-rw-r--r--src/wwwroot/scripts/back/index.js51
-rw-r--r--src/wwwroot/scripts/back/produkter.js671
-rw-r--r--src/wwwroot/scripts/base.js84
-rw-r--r--src/wwwroot/scripts/cart-core.js109
-rw-r--r--src/wwwroot/scripts/components.js48
-rw-r--r--src/wwwroot/scripts/configuration.js41
-rw-r--r--src/wwwroot/scripts/front/handlekurv.js256
-rw-r--r--src/wwwroot/scripts/front/logginn.js92
-rw-r--r--src/wwwroot/scripts/front/produkter.js341
-rw-r--r--src/wwwroot/scripts/front/status.js10
-rw-r--r--src/wwwroot/scripts/grid.ts390
-rw-r--r--src/wwwroot/scripts/i10n.ts95
-rw-r--r--src/wwwroot/scripts/icons.js58
-rw-r--r--src/wwwroot/scripts/messages.js12
-rw-r--r--src/wwwroot/scripts/tabs.js31
-rw-r--r--src/wwwroot/scripts/toaster.js131
-rw-r--r--src/wwwroot/scripts/utilities.js254
-rw-r--r--src/wwwroot/scripts/vendor/cycle.js174
-rw-r--r--src/wwwroot/scripts/vendor/quill.js25
-rw-r--r--src/wwwroot/styles/back.scss45
-rw-r--r--src/wwwroot/styles/base.scss168
-rw-r--r--src/wwwroot/styles/front.scss190
-rw-r--r--src/wwwroot/styles/variables.scss3
-rw-r--r--src/wwwroot/styles/vendor/bootstrap-icons.all.scss1202
-rw-r--r--src/wwwroot/styles/vendor/bootstrap-icons.scss28
-rw-r--r--src/wwwroot/styles/vendor/bootstrap-menu-kit.scss383
-rw-r--r--src/wwwroot/styles/vendor/bootstrap-side-modal.scss48
-rw-r--r--src/wwwroot/styles/vendor/quill.imageUploader.min.css33
-rw-r--r--src/wwwroot/styles/vendor/quill.snow.css945
-rw-r--r--src/wwwroot/tsconfig.json10
-rw-r--r--src/wwwroot/version.txt1
-rw-r--r--src/wwwroot/webpack.config.js156
168 files changed, 25949 insertions, 0 deletions
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..17f68b2
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,4 @@
+bin/
+obj/
+**/src/AppData
+**/src/wwwroot/assets/images
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f56a119
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,462 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+##
+## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
+
+# User-specific files
+*.rsuser
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Mono auto generated files
+mono_crash.*
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+[Aa][Rr][Mm]/
+[Aa][Rr][Mm]64/
+bld/
+[Bb]in/
+[Oo]bj/
+[Ll]og/
+
+# Visual Studio 2015/2017 cache/options directory
+.vs/
+# Uncomment if you have tasks that create the project's static files in wwwroot
+#wwwroot/
+
+# Visual Studio 2017 auto generated files
+Generated\ Files/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUNIT
+*.VisualState.xml
+TestResult.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+# Benchmark Results
+BenchmarkDotNet.Artifacts/
+
+# .NET Core
+project.lock.json
+project.fragment.lock.json
+artifacts/
+
+# StyleCop
+StyleCopReport.xml
+
+# Files built by Visual Studio
+*_i.c
+*_p.c
+*_h.h
+*.ilk
+*.meta
+*.obj
+*.iobj
+*.pch
+*.pdb
+*.ipdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*_wpftmp.csproj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+*.VC.db
+*.VC.VC.opendb
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# Visual Studio Trace Files
+*.e2e
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding add-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# AxoCover is a Code Coverage Tool
+.axoCover/*
+!.axoCover/settings.json
+
+# Visual Studio code coverage results
+*.coverage
+*.coveragexml
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# Note: Comment the next line if you want to checkin your web deploy settings,
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# Microsoft Azure Web App publish settings. Comment the next line if you want to
+# checkin your Azure Web App publish settings, but sensitive information contained
+# in these scripts will be unencrypted
+PublishScripts/
+
+# NuGet Packages
+*.nupkg
+# The packages folder can be ignored because of Package Restore
+**/[Pp]ackages/*
+# except build/, which is used as an MSBuild target.
+!**/[Pp]ackages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/[Pp]ackages/repositories.config
+# NuGet v3's project.json files produces more ignorable files
+*.nuget.props
+*.nuget.targets
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Windows Store app package directories and files
+AppPackages/
+BundleArtifacts/
+Package.StoreAssociation.xml
+_pkginfo.txt
+*.appx
+*.appxbundle
+*.appxupload
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!?*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.jfm
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+# Including strong name files can present a security risk
+# (https://github.com/github/gitignore/pull/2483#issue-259490424)
+#*.snk
+
+# Since there are multiple workflows, uncomment next line to ignore bower_components
+# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
+#bower_components/
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+ServiceFabricBackup/
+*.rptproj.bak
+
+# SQL Server files
+*.mdf
+*.ldf
+*.ndf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+*.rptproj.rsuser
+*- Backup*.rdl
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+node_modules/
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
+*.vbw
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+paket-files/
+
+# FAKE - F# Make
+.fake/
+
+# CodeRush personal settings
+.cr/personal
+
+# Python Tools for Visual Studio (PTVS)
+__pycache__/
+*.pyc
+
+# Cake - Uncomment if you are using it
+# tools/**
+# !tools/packages.config
+
+# Tabs Studio
+*.tss
+
+# Telerik's JustMock configuration file
+*.jmconfig
+
+# BizTalk build output
+*.btp.cs
+*.btm.cs
+*.odx.cs
+*.xsd.cs
+
+# OpenCover UI analysis results
+OpenCover/
+
+# Azure Stream Analytics local run output
+ASALocalRun/
+
+# MSBuild Binary and Structured Log
+*.binlog
+
+# NVidia Nsight GPU debugger configuration file
+*.nvuser
+
+# MFractors (Xamarin productivity tool) working folder
+.mfractor/
+
+# Local History for Visual Studio
+.localhistory/
+
+# BeatPulse healthcheck temp database
+healthchecksdb
+
+# Backup folder for Package Reference Convert tool in Visual Studio 2017
+MigrationBackup/
+
+##
+## Visual studio for Mac
+##
+
+
+# globs
+Makefile.in
+*.userprefs
+*.usertasks
+config.make
+config.status
+aclocal.m4
+install-sh
+autom4te.cache/
+*.tar.gz
+tarballs/
+test-results/
+
+# Mac bundle stuff
+*.dmg
+*.app
+
+# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
+# Windows thumbnail cache files
+Thumbs.db
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+# JetBrains Rider
+.idea/
+*.sln.iml
+
+##
+## Visual Studio Code
+##
+.vscode/*
+!.vscode/settings.json
+!.vscode/tasks.json
+!.vscode/launch.json
+!.vscode/extensions.json
+**/bin
+**/obj
+# See https://help.github.com/ignore-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+
+# testing
+/coverage
+
+# production
+/build
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+**/src/AppData
+**/src/wwwroot/assets/images
+**/server-secrets.*
+**/src/.version
+/src/wwwroot/dist/
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..c70c8b5
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,16 @@
+FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env
+WORKDIR /source
+
+# Copy csproj and restore as distinct layers
+COPY src/*.csproj ./
+RUN dotnet restore
+
+# Copy everything else and build
+COPY src/ ./
+RUN dotnet publish -c Release -o out
+
+# Build runtime image
+FROM mcr.microsoft.com/dotnet/aspnet:6.0
+WORKDIR /app
+COPY --from=build-env /source/out .
+ENTRYPOINT ["dotnet", "VSH.dll"]
diff --git a/VSH.sln b/VSH.sln
new file mode 100644
index 0000000..f22f370
--- /dev/null
+++ b/VSH.sln
@@ -0,0 +1,34 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26124.0
+MinimumVisualStudioVersion = 15.0.26124.0
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VSH", "src\VSH.csproj", "{183A52C4-90E9-456E-86CF-E5197D942F44}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Debug|x64.Build.0 = Debug|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Debug|x86.Build.0 = Debug|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Release|Any CPU.Build.0 = Release|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Release|x64.ActiveCfg = Release|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Release|x64.Build.0 = Release|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Release|x86.ActiveCfg = Release|Any CPU
+ {183A52C4-90E9-456E-86CF-E5197D942F44}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+EndGlobal
diff --git a/build_and_push.sh b/build_and_push.sh
new file mode 100755
index 0000000..3cf5241
--- /dev/null
+++ b/build_and_push.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+set -Eeuo pipefail
+
+do_push() {
+ IMAGE_NAME="website"
+ HUB_NAME="dr.ivarlovlie.no/vsh/website"
+ COMMIT_HASH=$(git rev-parse --short HEAD)
+
+ pushd src/wwwroot
+ npm run build
+ echo $COMMIT_HASH >version.txt
+ popd
+
+ docker build -t $IMAGE_NAME .
+ docker tag $IMAGE_NAME $HUB_NAME:$COMMIT_HASH
+ docker tag $IMAGE_NAME $HUB_NAME:latest
+
+ echo ""
+ echo "CTRL+C to cancel, anything to push to docker hub"
+ read -n 1
+ docker push $HUB_NAME:$COMMIT_HASH
+ docker push $HUB_NAME:latest
+}
+
+if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
+ do_push
+else
+ echo "unclean git tree! CTRL+C to cancel, anything to commit and push to default branch"
+ read -n 1
+ read -p "Enter commit message: " COMMIT_MESSAGE
+ git add .
+ git commit -m "$COMMIT_MESSAGE"
+ git push
+ do_push
+fi
diff --git a/sloc_count.sh b/sloc_count.sh
new file mode 100755
index 0000000..1c0879c
--- /dev/null
+++ b/sloc_count.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+cloc --exclude-dir=node_modules,vendor,bin,obj --exclude-lang=SVG,JSON,XML ./src
diff --git a/src/BackgroundServices/AssetsCleanupBackgroundService.cs b/src/BackgroundServices/AssetsCleanupBackgroundService.cs
new file mode 100644
index 0000000..effb5d7
--- /dev/null
+++ b/src/BackgroundServices/AssetsCleanupBackgroundService.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using VSH.Services;
+
+namespace VSH.BackgroundServices;
+
+/// <summary>
+/// This service is not really necessary, but it is nice to have for future reference.
+/// The job that this service is doing, could maybe become an http endpoint?
+/// </summary>
+public class AssetsCleanupBackgroundService : BackgroundService
+{
+ private readonly IServiceProvider _serviceProvider;
+ private readonly ILogger<AssetsCleanupBackgroundService> _logger;
+
+ private static TimeSpan CleanupInterval => TimeSpan.FromSeconds(10);
+
+ public AssetsCleanupBackgroundService(
+ IServiceProvider serviceProvider,
+ ILogger<AssetsCleanupBackgroundService> logger
+ ) {
+ _serviceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
+ _logger = logger;
+ }
+
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
+ await StartInternalAsync(stoppingToken);
+ }
+
+ private async Task StartInternalAsync(CancellationToken cancellationToken) {
+ while (true) {
+ if (cancellationToken.IsCancellationRequested) {
+ _logger.LogDebug("CancellationRequested... Exiting");
+ break;
+ }
+
+ try {
+ await Task.Delay(CleanupInterval, cancellationToken);
+ } catch (TaskCanceledException) {
+ _logger.LogDebug("TaskCanceledException... Exiting");
+ break;
+ } catch (Exception ex) {
+ _logger.LogError($"Task.Delay exception: {ex.Message}. Exiting.");
+ break;
+ }
+
+ if (cancellationToken.IsCancellationRequested) {
+ _logger.LogDebug("CancellationRequested... Exiting");
+ break;
+ }
+
+ using var serviceProvider = _serviceProvider.CreateScope();
+ var assetsService = serviceProvider.ServiceProvider.GetRequiredService<AssetsService>();
+ await assetsService.RemoveUnusedProductImages();
+ }
+ }
+}
diff --git a/src/BackgroundServices/StartupTasksBackgroundService.cs b/src/BackgroundServices/StartupTasksBackgroundService.cs
new file mode 100644
index 0000000..8aebee9
--- /dev/null
+++ b/src/BackgroundServices/StartupTasksBackgroundService.cs
@@ -0,0 +1,35 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using VSH.Data.Static;
+
+namespace VSH.BackgroundServices;
+
+public class StartupTasksBackgroundService : BackgroundService
+{
+ private readonly ILogger<StartupTasksBackgroundService> _logger;
+
+ private static IEnumerable<string> PathsToEnsureCreated => new List<string> {
+ AppPaths.ProductImages.HostPath,
+ AppPaths.DocumentImages.HostPath,
+ };
+
+ public StartupTasksBackgroundService(ILogger<StartupTasksBackgroundService> logger) {
+ _logger = logger;
+ }
+
+ protected override Task ExecuteAsync(CancellationToken stoppingToken) {
+ EnsureCreated();
+ return Task.CompletedTask;
+ }
+
+ private void EnsureCreated() {
+ foreach (var path in PathsToEnsureCreated) {
+ Directory.CreateDirectory(path);
+ _logger.LogInformation("EnsuredCreated: " + path);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/BackgroundServices/VippsOrderStatusCheckerBackgroundService.cs b/src/BackgroundServices/VippsOrderStatusCheckerBackgroundService.cs
new file mode 100644
index 0000000..73804d2
--- /dev/null
+++ b/src/BackgroundServices/VippsOrderStatusCheckerBackgroundService.cs
@@ -0,0 +1,59 @@
+using System;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using IOL.VippsEcommerce;
+using IOL.VippsEcommerce.Models.Api;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using VSH.Data;
+using VSH.Data.Enums;
+
+namespace VSH.BackgroundServices;
+
+public class VippsOrderStatusCheckerBackgroundService : BackgroundService
+{
+ private readonly ILogger<VippsOrderStatusCheckerBackgroundService> _logger;
+
+ public VippsOrderStatusCheckerBackgroundService(
+ IServiceProvider services,
+ ILogger<VippsOrderStatusCheckerBackgroundService> logger
+ ) {
+ Services = services;
+ _logger = logger;
+ }
+
+ public IServiceProvider Services { get; }
+
+ protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
+ using var scope = Services.CreateScope();
+ var context =
+ scope.ServiceProvider
+ .GetRequiredService<MainDbContext>();
+ var vipps =
+ scope.ServiceProvider
+ .GetService<VippsEcommerceService>();
+
+ if (vipps == default) {
+ return;
+ }
+
+ foreach (var order in context.Orders.Where(c => c.Created < DateTime.UtcNow.AddDays(1)
+ && c.Status == OrderStatus.AWAITING_VIPPS)) {
+ try {
+ var vippsResponse = await vipps.GetPaymentDetailsAsync(order.OrderReference, stoppingToken);
+ order.VippsTransactionId = vippsResponse.TransactionLogHistory.LastOrDefault()?.TransactionId;
+ } catch (Exception e) {
+ if (e is VippsRequestException vippsRequestException) {
+ Console.WriteLine(vippsRequestException);
+ }
+
+ Console.WriteLine(e);
+ }
+
+ await context.SaveChangesAsync(stoppingToken);
+ _logger.LogInformation("Got payment details from vipps for order with id: " + order.Id);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/Controllers/AccountController.cs b/src/Controllers/AccountController.cs
new file mode 100644
index 0000000..ab80b78
--- /dev/null
+++ b/src/Controllers/AccountController.cs
@@ -0,0 +1,119 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Claims;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Authentication.Cookies;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Localization;
+using VSH.Data;
+using VSH.Data.Payloads;
+using VSH.Data.Results;
+using IOL.Helpers;
+using VSH.Data.Database;
+
+namespace VSH.Controllers;
+
+public class AccountController : MainControllerBase
+{
+ private readonly IAuthenticationService _authentication;
+ private readonly MainDbContext _context;
+ private readonly IStringLocalizer<SharedControllerResources> _localizer;
+
+ public AccountController(
+ MainDbContext context,
+ IStringLocalizer<SharedControllerResources> localizer,
+ IAuthenticationService authentication
+ ) {
+ _context = context;
+ _localizer = localizer;
+ _authentication = authentication;
+ }
+
+ [ValidateAntiForgeryToken]
+ [HttpPost("login")]
+ public ActionResult Login(LoginPayload payload) {
+ if (!ModelState.IsValid)
+ BadRequest(ModelState);
+ var user = _context.Users.SingleOrDefault(u => u.Username == payload.Username);
+ if (user == default || !user.VerifyPassword(payload.Password))
+ return BadRequest(new ErrorResult(_localizer["Ugyldig brukernavn eller passord"]));
+
+ var claims = new List<Claim> {
+ new(ClaimTypes.NameIdentifier, user.Id.ToString()),
+ new(ClaimTypes.Name, user.Username),
+ };
+ var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
+ var principal = new ClaimsPrincipal(identity);
+ var authenticationProperties = new AuthenticationProperties {
+ AllowRefresh = true,
+ IssuedUtc = DateTimeOffset.UtcNow,
+ };
+
+ if (payload.Persist) {
+ authenticationProperties.ExpiresUtc = DateTimeOffset.UtcNow.AddMonths(6);
+ authenticationProperties.IsPersistent = true;
+ }
+
+ HttpContext.SignInAsync(principal, authenticationProperties);
+ return Ok();
+ }
+
+ [Authorize]
+ [HttpPost("update-password")]
+ public ActionResult UpdatePassword(UpdatePasswordPayload payload) {
+ if (payload.NewPassword.IsNullOrWhiteSpace()) {
+ return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"],
+ _localizer["Nytt passord er påkrevd"]));
+ }
+
+ if (payload.NewPassword.Length < 6) {
+ return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"],
+ _localizer["Nytt passord må minst inneholde 6 karakterer"]));
+ }
+
+ var user = _context.Users.SingleOrDefault(c => c.Id == LoggedInUser.Id);
+ if (user == default) {
+ HttpContext.SignOutAsync();
+ return Redirect("/");
+ }
+
+
+ user.HashAndSetPassword(payload.NewPassword);
+ user.Updated = DateTime.UtcNow;
+ _context.SaveChanges();
+ return Ok();
+ }
+
+ [AllowAnonymous]
+ [HttpGet("create-initial")]
+ public ActionResult CreateInitialUser() {
+ if (_context.Users.Any()) return Redirect("/kontoret");
+ var user = new User("admin@ivarlovlie.no");
+ user.SetBaseValues();
+ user.HashAndSetPassword("ivar123");
+ _context.Users.Add(user);
+ _context.SaveChanges();
+ return Redirect("/kontoret");
+ }
+
+ [AllowAnonymous]
+ [HttpGet("me")]
+ public async Task<ActionResult> GetLoggedInUser() {
+ var authres =
+ await _authentication.AuthenticateAsync(HttpContext, CookieAuthenticationDefaults.AuthenticationScheme);
+ if (authres.Succeeded)
+ return Ok(LoggedInUser);
+
+ await HttpContext.SignOutAsync();
+ return StatusCode(403);
+ }
+
+ [HttpGet("logout")]
+ public ActionResult Logout() {
+ HttpContext.SignOutAsync();
+ return Ok();
+ }
+} \ No newline at end of file
diff --git a/src/Controllers/CategoriesController.cs b/src/Controllers/CategoriesController.cs
new file mode 100644
index 0000000..5ef87ea
--- /dev/null
+++ b/src/Controllers/CategoriesController.cs
@@ -0,0 +1,106 @@
+using System;
+using System.Linq;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Localization;
+using VSH.Data;
+using VSH.Data.Database;
+using VSH.Data.Enums;
+using VSH.Data.Results;
+using IOL.Helpers;
+
+namespace VSH.Controllers;
+
+public class CategoriesController : MainControllerBase
+{
+ private readonly MainDbContext _context;
+ private readonly IStringLocalizer<SharedControllerResources> _localizer;
+
+ public CategoriesController(MainDbContext context, IStringLocalizer<SharedControllerResources> localizer) {
+ _context = context;
+ _localizer = localizer;
+ }
+
+ [HttpGet]
+ public ActionResult GetCategories() {
+ return Ok(_context.Categories.OrderBy(c => c.Created));
+ }
+
+ [HttpGet("with-products")]
+ public ActionResult GetCategoriesWithProducts() {
+ return Ok(_context.Categories.Include(c => c.Products)
+ .OrderBy(c => c.Created));
+ }
+
+ [HttpGet("{id}")]
+ public ActionResult GetCategory(Guid id) {
+ return Ok(_context.Categories.SingleOrDefault(c => c.Id == id));
+ }
+
+ [HttpGet("{id}/enable")]
+ public ActionResult EnableCategory(Guid id) {
+ var category = _context.Categories.SingleOrDefault(c => c.Id == id);
+ if (category == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"]));
+ category.VisibilityState = CategoryVisibility.DEFAULT;
+ category.Update();
+ _context.SaveChanges();
+ return Ok();
+ }
+
+ [HttpGet("{id}/disable")]
+ public ActionResult DisableCategory(Guid id) {
+ var category = _context.Categories.SingleOrDefault(c => c.Id == id);
+ if (category == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"]));
+ category.VisibilityState = CategoryVisibility.DISABLED;
+ category.Update();
+ _context.SaveChanges();
+ return Ok();
+ }
+
+ [HttpGet("create")]
+ public ActionResult CreateCategoryAsync(string name) {
+ if (name.IsNullOrWhiteSpace())
+ return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"], _localizer["Navn er påkrevd"]));
+
+ if (_context.Categories.Any(c => c.Name == name))
+ return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"],
+ _localizer["En kategori med det navnet finnes allerede"]));
+
+ var newCategory = new Category(name);
+ newCategory.SetBaseValues();
+ _context.Categories.Add(newCategory);
+ _context.SaveChanges();
+ return Ok(newCategory);
+ }
+
+ [HttpGet("{id}/update")]
+ public ActionResult UpdateCategoryAsync(Guid id, string newName) {
+ var category = _context.Categories.SingleOrDefault(c => c.Id == id);
+ if (category == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"]));
+ if (newName.IsNullOrWhiteSpace())
+ return BadRequest(new ErrorResult(_localizer["Ugyldig skjema"],
+ _localizer["Det nye navnet kan ikke være tomt"]));
+ category.Update(new Category(newName));
+ _context.SaveChanges();
+ return Ok();
+ }
+
+ [HttpDelete("{id}/delete")]
+ public ActionResult DeleteCategoryAsync(Guid id) {
+ var category = _context.Categories.Include(c => c.Products).SingleOrDefault(c => c.Id == id);
+ if (category == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"]));
+ if (category.Products.Any()) {
+ category.VisibilityState = CategoryVisibility.DELETED;
+ _context.SaveChanges();
+ } else {
+ _context.Categories.Remove(category);
+ _context.SaveChanges();
+ }
+
+ return Ok();
+ }
+} \ No newline at end of file
diff --git a/src/Controllers/DocumentsController.cs b/src/Controllers/DocumentsController.cs
new file mode 100644
index 0000000..b2a6122
--- /dev/null
+++ b/src/Controllers/DocumentsController.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using IOL.Helpers;
+using Microsoft.AspNetCore.Mvc;
+using VSH.Data;
+using VSH.Data.Database;
+using VSH.Data.Enums;
+using VSH.Data.Static;
+using VSH.Utilities;
+
+namespace VSH.Controllers;
+
+public class DocumentsController : MainControllerBase
+{
+ private readonly MainDbContext _context;
+
+ public DocumentsController(MainDbContext context) {
+ _context = context;
+ }
+
+ [HttpGet("{type}")]
+ public ActionResult GetDocument(DocumentType type) {
+ var document = _context.Documents.SingleOrDefault(d => d.Type == type);
+ return Ok(document?.Content);
+ }
+
+ [HttpPost("{type}")]
+ public ActionResult UpdateDocument([FromRoute] DocumentType type, [FromForm] string content) {
+ var document = _context.Documents.SingleOrDefault(d => d.Type == type);
+ if (document == default) {
+ var newDocument = new Document {
+ Content = content,
+ Type = type,
+ Created = DateTime.UtcNow
+ };
+ _context.Documents.Add(newDocument);
+ _context.SaveChanges();
+ return Ok(newDocument.Content);
+ }
+
+ document.Content = content;
+ document.Updated = DateTime.UtcNow;
+ _context.SaveChanges();
+ return Ok(document.Content);
+ }
+
+ [HttpPost("upload-images")]
+ public ActionResult UploadImages() {
+ var files = Request.Form.Files;
+ if (files.Count == 0)
+ return BadRequest();
+ var filePaths = new List<FileInfo>();
+ var fileNames = new List<string>();
+ foreach (var file in files) {
+ var fileName = RandomString.Generate(4,
+ true)
+ + "_"
+ + file.FileName;
+ var filePath = Path.Combine(AppPaths.DocumentImages.HostPath,
+ fileName);
+ using var writeStream = new FileStream(filePath,
+ FileMode.CreateNew);
+ file.CopyTo(writeStream);
+ filePaths.Add(new FileInfo(filePath));
+ fileNames.Add(fileName);
+ }
+
+ foreach (var filePath in filePaths) {
+ ImageFunctions.EnsureNormalOrLessImageResolution(filePath);
+ }
+
+ return Ok(fileNames);
+ }
+} \ No newline at end of file
diff --git a/src/Controllers/MainControllerBase.cs b/src/Controllers/MainControllerBase.cs
new file mode 100644
index 0000000..4f8f47f
--- /dev/null
+++ b/src/Controllers/MainControllerBase.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Linq;
+using System.Security.Claims;
+using IOL.Helpers;
+using Microsoft.AspNetCore.Mvc;
+
+namespace VSH.Controllers;
+
+[ApiController]
+[Route("api/[controller]")]
+public class MainControllerBase : ControllerBase
+{
+ public string CurrentHost => Request.GetRequestHost();
+
+
+ protected LoggedInUserModel LoggedInUser => new() {
+ Username = User.Identity?.Name,
+ Id = User.Claims.SingleOrDefault(c => c.Type == ClaimTypes.NameIdentifier)?.Value.ToGuid() ?? default
+ };
+
+ protected class LoggedInUserModel
+ {
+ public Guid Id { get; set; }
+ public string Username { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/Controllers/OrdersController.cs b/src/Controllers/OrdersController.cs
new file mode 100644
index 0000000..39c0818
--- /dev/null
+++ b/src/Controllers/OrdersController.cs
@@ -0,0 +1,339 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.Json;
+using System.Threading.Tasks;
+using IOL.Helpers;
+using IOL.VippsEcommerce;
+using IOL.VippsEcommerce.Models.Api;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+using VSH.Data;
+using VSH.Data.Database;
+using VSH.Data.Dtos;
+using VSH.Data.Enums;
+using VSH.Data.Results;
+using VSH.Services;
+using VSH.Utilities;
+
+namespace VSH.Controllers;
+
+public class OrdersController : MainControllerBase
+{
+ private readonly MainDbContext _context;
+ private readonly OrderService _orderService;
+ private readonly IVippsEcommerceService _vippsService;
+ private readonly EmailService _emailService;
+ private readonly ILogger<OrdersController> _logger;
+ private readonly IConfiguration _configuration;
+
+ public OrdersController(
+ MainDbContext context,
+ IConfiguration configuration,
+ OrderService orderService,
+ IVippsEcommerceService vippsService,
+ EmailService emailService,
+ ILogger<OrdersController> logger
+ ) {
+ _context = context;
+ _configuration = configuration;
+ _orderService = orderService;
+ _vippsService = vippsService;
+ _logger = logger;
+ _emailService = emailService;
+ }
+
+ [HttpGet]
+ public ActionResult GetOrders(string filter = default) {
+ return filter switch {
+ "not-cancelled" => Ok(_context.Orders.Where(c => c.Status != OrderStatus.CANCELLED)
+ .OrderByDescending(c => c.Created)),
+ _ => Ok(_context.Orders.OrderByDescending(c => c.Created))
+ };
+ }
+
+ [HttpPost("submit")]
+ public async Task<ActionResult> SubmitOrder(Order payload) {
+ var validationResult = _orderService.ValidateOrder(payload);
+ if (!validationResult.IsValid)
+ return BadRequest(validationResult);
+ payload.SetBaseValues();
+ var orderRef = RandomString.Generate(6);
+ var isOrderRefUsed = _context.Orders.Any(c => c.OrderReference == orderRef);
+
+ while (isOrderRefUsed) {
+ orderRef = RandomString.Generate(6);
+ isOrderRefUsed = _context.Orders.Any(c => c.OrderReference == orderRef);
+ }
+
+ payload.OrderReference = orderRef;
+
+ foreach (var payloadProduct in payload.Products) {
+ var dbProduct = _context.Products.SingleOrDefault(c => c.Id == payloadProduct.Id);
+ if (dbProduct == default) {
+ throw new ApplicationException("Could not find product in order payload that passed validation");
+ }
+
+ payloadProduct.PriceAtTimeOfOrder = dbProduct.Price;
+ }
+
+ switch (payload.PaymentType) {
+ case OrderPaymentType.VIPPS: {
+ payload.Id = Guid.NewGuid();
+ payload.Status = OrderStatus.AWAITING_VIPPS;
+ await _context.Orders.AddAsync(payload);
+ await _context.SaveChangesAsync();
+ var vippsUrl = await _orderService.GetVippsPaymentUrlAsync(payload, CurrentHost);
+ return Ok(vippsUrl);
+ }
+ case OrderPaymentType.INVOICE_BY_EMAIL: {
+ payload.Status = OrderStatus.AWAITING_INVOICE;
+ await _context.Orders.AddAsync(payload);
+ await _context.SaveChangesAsync();
+
+ await _emailService.SendEmailAsync("Ny ordre - VSH",
+ payload.GetAdminMailContent(CurrentHost),
+ _configuration.GetOrderStatusEmailRecipients());
+ await _emailService.SendEmailAsync("Din ordre hos Vinjesvingen Handel AS",
+ payload.GetCustomerMailContent(CurrentHost),
+ payload.ContactInfo.EmailAddress);
+ return Ok("/status/" + payload.OrderReference + "?clearCart=true");
+ }
+ default: {
+ return BadRequest("No PaymentType was specified");
+ }
+ }
+ }
+
+ [HttpGet("{orderId}/details")]
+ public ActionResult<AdminViewOrderDto> GetOrderDetails(Guid orderId) {
+ var order = _context.Orders.SingleOrDefault(c => c.Id == orderId);
+ if (order == default) {
+ return NotFound();
+ }
+
+ var products = new List<AdminViewOrderDto.OrderDetailProduct>();
+
+ foreach (var orderProduct in order.Products) {
+ var dbProduct = _context.Products.SingleOrDefault(c => c.Id == orderProduct.Id);
+ if (dbProduct == default)
+ continue;
+ products.Add(new AdminViewOrderDto.OrderDetailProduct {
+ Id = orderProduct.Id,
+ Count = orderProduct.NumberOfItems,
+ PayedPrice = orderProduct.PriceAtTimeOfOrder,
+ Name = dbProduct.Name
+ });
+ }
+
+ var x = new AdminViewOrderDto {
+ Comment = order.Comment,
+ Id = order.Id,
+ Products = products,
+ Status = order.Status,
+ ContactInformation = order.ContactInfo,
+ OrderDate = order.Created,
+ OrderReference = order.OrderReference,
+ PaymentType = order.PaymentType,
+ VippsId = order.VippsTransactionId,
+ VippsStatus = order.VippsStatus.ToString(),
+ VippsTransactionStatus = order.VippsTransactionStatus.ToString()
+ };
+
+ return x;
+ }
+
+
+ [HttpGet("{orderId}/capture")]
+ public async Task<ActionResult> CaptureVippsPayment(Guid orderId) {
+ var order = _context.Orders.SingleOrDefault(c => c.Id == orderId);
+ if (order == default)
+ return NotFound();
+ try {
+ var response = await _vippsService.CapturePaymentAsync(order.OrderReference,
+ new VippsPaymentActionRequest {
+ Transaction = new TTransaction {
+ TransactionText =
+ order.OrderReference
+ + "_"
+ + DateTime.UtcNow.ToString("O")
+ }
+ });
+ if (response == default)
+ return StatusCode(500);
+ order.VippsStatus = response.TransactionInfo.Status;
+ await _context.SaveChangesAsync();
+ return Ok();
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ e.Data.Add("orderId", orderId);
+ return StatusCode(500);
+ }
+ }
+
+ [HttpGet("{orderId}/cancel")]
+ public async Task<ActionResult> CancelVippsPayment(Guid orderId) {
+ var order = _context.Orders.SingleOrDefault(c => c.Id == orderId);
+ if (order == default)
+ return NotFound();
+ try {
+ var response = await _vippsService.CancelPaymentAsync(order.OrderReference,
+ new VippsPaymentActionRequest {
+ Transaction = new TTransaction {
+ TransactionText =
+ order.OrderReference
+ + "_"
+ + DateTime.UtcNow.ToString("O")
+ }
+ });
+ if (response == default)
+ return StatusCode(500);
+ order.VippsStatus = response.TransactionInfo.Status;
+ await _context.SaveChangesAsync();
+ return Ok();
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ e.Data.Add("orderId", orderId);
+ return StatusCode(500);
+ }
+ }
+
+ [HttpGet("{orderId}/refund")]
+ public async Task<ActionResult> RefundVippsPayment(Guid orderId) {
+ var order = _context.Orders.SingleOrDefault(c => c.Id == orderId);
+ if (order == default)
+ return NotFound();
+ try {
+ var response = await _vippsService.RefundPaymentAsync(order.OrderReference,
+ new VippsPaymentActionRequest {
+ Transaction = new TTransaction {
+ TransactionText =
+ order.OrderReference
+ + "_"
+ + DateTime.UtcNow.ToString("O")
+ }
+ });
+ if (response == default)
+ return StatusCode(500);
+ order.VippsStatus = response.TransactionInfo.Status;
+ await _context.SaveChangesAsync();
+ return Ok();
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ e.Data.Add("orderId", orderId);
+ return StatusCode(500);
+ }
+ }
+
+ [HttpPost("validate-products")]
+ public ActionResult<AppValidationResult> ValidateOrderProducts(Order payload) {
+ return _orderService.ValidateOrderProducts(payload);
+ }
+
+ [HttpPost("validate")]
+ public ActionResult<AppValidationResult> ValidateOrder(Order payload) {
+ return _orderService.ValidateOrder(payload);
+ }
+
+ /// <summary>
+ /// This is used for all payment updates performed at vipps and can be called anytime from vipps
+ /// This endpoint updates the order status and save the body as an VippsResponses.InitiationResponse in db
+ /// </summary>
+ /// <param name="orderReference"></param>
+ /// <returns></returns>
+ [HttpPost("vipps/callbacks-for-payment-update/v2/payments/{orderReference}")]
+ public async Task<ActionResult> VippsPaymentUpdateCallback([FromRoute] string orderReference) {
+ var bodyContent = await new StreamReader(Request.Body).ReadToEndAsync();
+ _logger.LogInformation("Recieved vipps payment update callback for order: " + orderReference);
+ _logger.LogDebug("With body: " + bodyContent);
+
+ var order = _context.Orders.SingleOrDefault(c => c.OrderReference == orderReference);
+ if (order == default) {
+ _logger.LogWarning("Could not find order: " + orderReference + ", in database");
+ return Ok();
+ }
+
+ try {
+ var response = JsonSerializer.Deserialize<VippsPaymentInitiationCallbackResponse>(bodyContent);
+ if (response == default) {
+ _logger.LogCritical("Could not deserialize vipps response into "
+ + nameof(VippsPaymentInitiationCallbackResponse));
+ return Ok();
+ }
+
+ order.VippsTransactionId = response.TransactionInfo.TransactionId;
+ order.VippsTransactionStatus = response.TransactionInfo.StatusEnum();
+ order.Status = order.VippsTransactionStatus switch {
+ ETransactionStatus.SALE or ETransactionStatus.RESERVED => OrderStatus.COMPLETED,
+ ETransactionStatus.REJECTED or
+ ETransactionStatus.CANCELLED or
+ ETransactionStatus.AUTO_CANCEL => OrderStatus.CANCELLED,
+ ETransactionStatus.SALE_FAILED or ETransactionStatus.RESERVE_FAILED => OrderStatus.FAILED,
+ _ => OrderStatus.FAILED
+ };
+ await _context.SaveChangesAsync();
+
+ if (order.Status != OrderStatus.COMPLETED) {
+ _logger.LogWarning("OrderStatus is unsatisfactory for this stage of payment history, returning to cart page with error message");
+ if (response.TransactionInfo != default) {
+ _logger.LogWarning("Vipps TransactionStatus is " + response.TransactionInfo?.Status);
+ } else {
+ _logger.LogWarning("Vipps TransactionInfo is empty");
+ }
+ }
+
+ return Ok();
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ e.Data.Add("orderid", order.Id);
+ _logger.LogCritical(e, "WHOOOOOOOOOOOPS");
+ return Ok();
+ }
+ }
+
+ /// <summary>
+ /// This endpoint is specified in the intiation request to vipps, regardless of the result of a capture in vipps, vipps will send customers to this endpoint.
+ /// This endpoint decides where a customer is sent based on the result of a vipps payment request
+ /// </summary>
+ /// <param name="orderReference"></param>
+ /// <returns></returns>
+ [HttpGet("vipps/payment-callback/{orderReference}")]
+ public async Task<ActionResult> VippsPaymentCallback([FromRoute] string orderReference) {
+ _logger.LogInformation("Recieved vipps payment callback for order: " + orderReference);
+
+ var order = _context.Orders.SingleOrDefault(c => c.OrderReference == orderReference);
+ if (order == default) {
+ _logger.LogWarning("Could not find order: " + orderReference + ", in database");
+ return Redirect("/handlekorg?error=failed");
+ }
+
+ try {
+ if (order.Status == OrderStatus.CANCELLED) {
+ return Redirect("/handlekorg?error=cancelled");
+ }
+
+ if (order.Status != OrderStatus.COMPLETED) {
+ _logger.LogWarning("OrderStatus is unsatisfactory for this stage of payment history, returning to cart page with error message");
+
+ return Redirect("/handlekorg?error=failed");
+ }
+
+ await _emailService.SendEmailAsync("Ny ordre - VSH",
+ order.GetAdminMailContent(CurrentHost),
+ _configuration.GetOrderStatusEmailRecipients());
+
+ await _emailService.SendEmailAsync("Din ordre hos Vinjesvingen Handel AS",
+ order.GetCustomerMailContent(CurrentHost),
+ order.ContactInfo.EmailAddress);
+
+ return Redirect("/status/" + orderReference + "?clearCart=true");
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ e.Data.Add("orderid", order.Id);
+ _logger.LogCritical(e, "WHOOOOOOOOOOOPS");
+ return Redirect("/handlekorg?error=failed");
+ }
+ }
+}
diff --git a/src/Controllers/ProductsController.cs b/src/Controllers/ProductsController.cs
new file mode 100644
index 0000000..9bd7e93
--- /dev/null
+++ b/src/Controllers/ProductsController.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using IOL.Helpers;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Localization;
+using VSH.Data;
+using VSH.Data.Database;
+using VSH.Data.Enums;
+using VSH.Data.Results;
+using VSH.Data.Static;
+using VSH.Utilities;
+
+namespace VSH.Controllers;
+
+[Authorize]
+public class ProductsController : MainControllerBase
+{
+ private readonly MainDbContext _context;
+ private readonly IStringLocalizer<SharedControllerResources> _localizer;
+
+ public ProductsController(
+ MainDbContext context,
+ IStringLocalizer<SharedControllerResources> localizer
+ ) {
+ _context = context;
+ _localizer = localizer;
+ }
+
+ [HttpGet]
+ [AllowAnonymous]
+ public ActionResult GetAllProducts() {
+ return Ok(_context.Products.Include(c => c.Category));
+ }
+
+ [HttpGet("{id}")]
+ [AllowAnonymous]
+ public Product GetProduct(Guid id) {
+ return _context.Products
+ .Include(c => c.Category)
+ .SingleOrDefault(c => c.Id == id);
+ }
+
+ [HttpPost("upload-images")]
+ public ActionResult UploadImages() {
+ if (Request.Form.Files.Count == 0)
+ return BadRequest();
+ var filePaths = new List<FileInfo>();
+ var fileNames = new List<string>();
+ foreach (var file in Request.Form.Files) {
+ var fileName = RandomString.Generate(8, true) + file.FileName.ExtractExtension();
+ var filePath = Path.Combine(AppPaths.ProductImages.HostPath, fileName);
+ using var writeStream = new FileStream(filePath, FileMode.CreateNew);
+ file.CopyTo(writeStream);
+ filePaths.Add(new FileInfo(filePath));
+ fileNames.Add(fileName);
+ }
+
+ foreach (var filePath in filePaths) {
+ ImageFunctions.CreateProductImageCollection(filePath);
+ }
+
+ return Ok(fileNames);
+ }
+
+ [HttpPost("create")]
+ public ActionResult CreateProductAsync(Product payload) {
+ payload.SetBaseValues();
+ var category = _context.Categories.SingleOrDefault(p => p.Id == payload.Category.Id);
+ if (category == default)
+ return BadRequest(new ErrorResult(_localizer["Kunne ikke finne kategorien"]));
+ payload.Category = category;
+ payload.Slug = payload.Name.Slugified();
+ _context.Products.Add(payload);
+ _context.SaveChanges();
+ return Ok();
+ }
+
+
+ [HttpPost("{id}/update")]
+ public ActionResult UpdateProductAsync([FromRoute] Guid id, [FromBody] Product payload) {
+ var product = _context.Products.SingleOrDefault(p => p.Id == id);
+ if (product == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne produktet"]));
+ var category = _context.Categories.AsNoTracking().SingleOrDefault(c => c.Id == payload.Category.Id);
+ if (category == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne kategorien"]));
+
+ var newImages = payload.Images.Select(c => new ProductImage(c.FileName, c.Order)).ToList();
+
+ product.Images = newImages;
+ product.Category = category;
+ product.Name = payload.Name;
+ product.Slug = product.Name.Slugified();
+ product.Description = payload.Description;
+ product.Price = payload.Price;
+ product.Count = payload.Count;
+ product.PriceSuffix = payload.PriceSuffix;
+ product.ShowOnFrontpage = payload.ShowOnFrontpage;
+ product.Updated = DateTime.UtcNow;
+ _context.SaveChanges();
+
+ return Ok();
+ }
+
+ [HttpDelete("{id}/delete")]
+ public ActionResult DeleteProductAsync(Guid id) {
+ var product = _context.Products.SingleOrDefault(p => p.Id == id);
+ if (product == default)
+ return NotFound(new ErrorResult(_localizer["Kunne ikke finne produktet"]));
+
+ product.VisibilityState = ProductVisibility.DELETED;
+ product.Updated = DateTime.UtcNow;
+
+ _context.SaveChanges();
+ return Ok();
+ }
+} \ No newline at end of file
diff --git a/src/Controllers/RootController.cs b/src/Controllers/RootController.cs
new file mode 100644
index 0000000..6a31d46
--- /dev/null
+++ b/src/Controllers/RootController.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Text;
+using IOL.VippsEcommerce;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Localization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using VSH.Data.Static;
+
+namespace VSH.Controllers;
+
+public class RootController : MainControllerBase
+{
+ private readonly IVippsEcommerceService _vippsEcommerceService;
+ private readonly IConfiguration _configuration;
+
+ public RootController(IConfiguration configuration, IVippsEcommerceService vippsEcommerceService) {
+ _configuration = configuration;
+ _vippsEcommerceService = vippsEcommerceService;
+ }
+
+ [HttpGet("~/kontoret")]
+ public ActionResult AdminRedirect() {
+ return Redirect("/kontoret/produkter");
+ }
+
+ [Authorize]
+ [HttpGet("~/info")]
+ public ActionResult GetInfo() {
+ var infoString = new StringBuilder();
+ infoString.AppendLine("Variables");
+ infoString.AppendLine($" - CurrentHost: {CurrentHost}");
+ infoString.AppendLine("Environment");
+ infoString.AppendLine($" - DB_HOST: {_configuration.GetValue("DB_HOST", "unset")}");
+ infoString.AppendLine($" - DB_PORT: {_configuration.GetValue("DB_PORT", "unset")}");
+ infoString.AppendLine($" - DB_USER: {_configuration.GetValue("DB_USER", "unset")}");
+ infoString.AppendLine($" - DB_PASSWORD: {HiddenIfSet(_configuration.GetValue("DB_PASSWORD", "unset"))}");
+ infoString.AppendLine($" - DB_NAME: {_configuration.GetValue("DB_NAME", "unset")}");
+ infoString.AppendLine($" - SENDGRID_API_KEY: {HiddenIfSet(_configuration.GetValue("SENDGRID_API_KEY", "unset"))}");
+ infoString.AppendLine($" - MAIL_FROM_ADDRESS: {_configuration.GetValue("MAIL_FROM_ADDRESS", "unset")}");
+ infoString.AppendLine($" - MAIL_REPLY_TO_ADDRESS: {_configuration.GetValue("MAIL_REPLY_TO_ADDRESS", "unset")}");
+ infoString.AppendLine($" - MAIL_FROM_NAME: {_configuration.GetValue("MAIL_FROM_NAME", "unset")}");
+ infoString.AppendLine("Headers");
+ infoString.AppendLine($" - X-Forwarded-For: {Request.Headers["X-Forwarded-For"]}");
+ infoString.AppendLine($" - X-Real-IP: {Request.Headers["X-Real-IP"]}");
+ infoString.AppendLine($" - X-Forwarded-Host: {Request.Headers["X-Forwarded-Host"]}");
+ infoString.AppendLine($" - X-Forwarded-Proto: {Request.Headers["X-Forwarded-Proto"]}");
+ return Ok(infoString.ToString());
+ }
+
+ [Authorize]
+ [HttpGet("~/vipps-config")]
+ public ActionResult GetVippsConfiguration() {
+ return Ok(_vippsEcommerceService.Configuration);
+ }
+
+ private string HiddenIfSet(string value) {
+ return value == "unset" ? "unset" : "*****";
+ }
+
+ [HttpPost("~/set-culture")]
+ public ActionResult SetCulture(
+ [FromForm] string culture,
+ [FromQuery] string returnUrl
+ ) {
+ Response.Cookies.Append(AppCookies.Culture.Name,
+ CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
+ new CookieOptions {
+ Expires = DateTimeOffset.UtcNow.AddYears(1)
+ });
+
+ return LocalRedirect(returnUrl);
+ }
+} \ No newline at end of file
diff --git a/src/Data/Database/Base.cs b/src/Data/Database/Base.cs
new file mode 100644
index 0000000..4084ec8
--- /dev/null
+++ b/src/Data/Database/Base.cs
@@ -0,0 +1,15 @@
+using System;
+
+namespace VSH.Data.Database;
+
+public class Base
+{
+ public Guid Id { get; set; }
+ public DateTime Created { get; set; }
+ public DateTime? Updated { get; set; }
+
+ public void SetBaseValues() {
+ Id = Guid.NewGuid();
+ Created = DateTime.UtcNow;
+ }
+} \ No newline at end of file
diff --git a/src/Data/Database/Category.cs b/src/Data/Database/Category.cs
new file mode 100644
index 0000000..6e0d324
--- /dev/null
+++ b/src/Data/Database/Category.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using IOL.Helpers;
+using VSH.Data.Enums;
+using VSH.Utilities;
+
+namespace VSH.Data.Database;
+
+public class Category : Base
+{
+ public Category(string name = default) {
+ if (name.IsNullOrWhiteSpace())
+ return;
+ Name = name;
+ Slug = name.Slugified();
+ }
+
+ public string Name { get; set; }
+ public string Slug { get; set; }
+ public CategoryVisibility VisibilityState { get; set; }
+ public ICollection<Product> Products { get; set; }
+ public bool Disabled => VisibilityState == CategoryVisibility.DISABLED;
+ public bool Deleted => VisibilityState == CategoryVisibility.DELETED;
+
+ public void Update(Category update = default) {
+ Name = update?.Name ?? Name;
+ VisibilityState = update?.VisibilityState ?? VisibilityState;
+ Updated = DateTime.UtcNow;
+ }
+} \ No newline at end of file
diff --git a/src/Data/Database/Document.cs b/src/Data/Database/Document.cs
new file mode 100644
index 0000000..2ae40d6
--- /dev/null
+++ b/src/Data/Database/Document.cs
@@ -0,0 +1,9 @@
+using VSH.Data.Enums;
+
+namespace VSH.Data.Database;
+
+public class Document : Base
+{
+ public DocumentType Type { get; set; }
+ public string Content { get; set; }
+} \ No newline at end of file
diff --git a/src/Data/Database/Order.cs b/src/Data/Database/Order.cs
new file mode 100644
index 0000000..02869b2
--- /dev/null
+++ b/src/Data/Database/Order.cs
@@ -0,0 +1,98 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using IOL.Helpers;
+using IOL.VippsEcommerce.Models.Api;
+using VSH.Data.Enums;
+using VSH.Utilities;
+
+namespace VSH.Data.Database;
+
+public class Order : Base
+{
+ public string Comment { get; set; }
+ public string OrderReference { get; set; }
+ public OrderStatus Status { get; set; }
+ public OrderPaymentType PaymentType { get; set; }
+ public string VippsTransactionId { get; set; }
+ public ETransactionStatus VippsTransactionStatus { get; set; }
+ public EStatusEnum VippsStatus { get; set; }
+ public ContactInformation ContactInfo { get; set; }
+ public List<OrderProduct> Products { get; set; }
+
+ public class ContactInformation
+ {
+ public string Name { get; set; }
+ public string PhoneNumber { get; set; }
+ public string EmailAddress { get; set; }
+ }
+
+ public decimal Total(bool includeTax = true) {
+ if (!Products.Any())
+ return default;
+ var total = Products.Sum(product => product.PriceAtTimeOfOrder * product.NumberOfItems);
+ if (includeTax)
+ return total;
+ var taxCut = total * 25 / 100;
+ return total - taxCut;
+ }
+
+ public decimal Tax(bool includeTax = true) {
+ if (!Products.Any())
+ return default;
+ var total = Products.Sum(product => product.PriceAtTimeOfOrder * product.NumberOfItems);
+ var taxCut = total * 25 / 100;
+ return taxCut;
+ }
+
+ public string GetAdminMailContent(string hostname) => @$"
+Referanse: {OrderReference}
+Lenke: {hostname}/kontoret/bestillinger?order={OrderReference}
+Betalingsmetode: {EnumName.ForPaymentType(PaymentType)}
+Status: {EnumName.ForOrderStatus(Status)}
+Navn: {ContactInfo.Name}
+E-postadresse: {ContactInfo.EmailAddress}
+Telefon: {ContactInfo.PhoneNumber}
+{(Comment.HasValue() ? "Kommentar:" + Comment : "")}
+";
+
+ public string GetCustomerMailContent(string hostname) => @$"
+Hei {ContactInfo.Name}, tusen takk for din bestilling!
+Gå til {hostname}/status/{OrderReference} for å få full oversikt over bestillinga.
+
+Hvis du har spørsmål angående din ordre er det bare å svare på denne mailen så svarer vi så raskt vi kan.
+
+Med venleg hilsen
+
+Øystein og Bodil
+Vinjesvingen Handel AS
+915 61 900
+";
+}
+
+public class OrderProduct
+{
+ public Guid Id { get; set; }
+
+ public int NumberOfItems { get; set; }
+
+ public decimal PriceAtTimeOfOrder { get; set; }
+
+ public decimal Total(bool includeTax = true) {
+ if (NumberOfItems == default || PriceAtTimeOfOrder == default)
+ return default;
+ var total = PriceAtTimeOfOrder * NumberOfItems;
+ if (includeTax)
+ return total;
+ var taxCut = total * 25 / 100;
+ return total - taxCut;
+ }
+
+ public decimal Tax(bool includeTax = true) {
+ if (NumberOfItems == default || PriceAtTimeOfOrder == default)
+ return default;
+ var total = PriceAtTimeOfOrder * NumberOfItems;
+ var taxCut = total * 25 / 100;
+ return taxCut;
+ }
+} \ No newline at end of file
diff --git a/src/Data/Database/Product.cs b/src/Data/Database/Product.cs
new file mode 100644
index 0000000..d8a3d8b
--- /dev/null
+++ b/src/Data/Database/Product.cs
@@ -0,0 +1,54 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using VSH.Data.Enums;
+using VSH.Data.Miscellaneous;
+using VSH.Data.Static;
+using VSH.Utilities;
+
+namespace VSH.Data.Database;
+
+public class Product : Base
+{
+ public string Name { get; set; }
+ public string Description { get; set; }
+ public decimal Price { get; set; }
+ public PriceSuffix PriceSuffix { get; set; }
+ public ProductVisibility VisibilityState { get; set; }
+ public Category Category { get; set; }
+ public List<ProductImage> Images { get; set; }
+ public int Count { get; set; }
+ public string Slug { get; set; }
+ public bool ShowOnFrontpage { get; set; }
+
+ public string ReadablePriceSuffix => EnumName.ForPriceSuffix(PriceSuffix);
+
+ public AppPath GetPrimaryImage() {
+ var productImage = Images.OrderBy(c => c.Order).FirstOrDefault();
+ return productImage != default ? productImage.GetPath() : AppPaths.DefaultProductImage;
+ }
+
+ public string WebPath() => $"/produktar/{Category?.Slug}/{Slug}";
+
+ public bool IsVisible => VisibilityState == ProductVisibility.DEFAULT;
+ public bool IsAvailable => Count == -1 || Count >= 1;
+}
+
+public class ProductImage
+{
+ public ProductImage(string fileName = default, int order = default) {
+ FileName = fileName;
+ Order = order;
+ }
+
+ public int Order { get; }
+ public string FileName { get; }
+
+ public AppPath GetPath() {
+ if (FileName == default) return AppPaths.DefaultProductImage;
+ return new AppPath {
+ WebPath = Path.Combine(AppPaths.ProductImages.WebPath, FileName),
+ HostPath = Path.Combine(AppPaths.ProductImages.HostPath, FileName),
+ };
+ }
+} \ No newline at end of file
diff --git a/src/Data/Database/User.cs b/src/Data/Database/User.cs
new file mode 100644
index 0000000..f8b083d
--- /dev/null
+++ b/src/Data/Database/User.cs
@@ -0,0 +1,18 @@
+using IOL.Helpers;
+
+namespace VSH.Data.Database;
+
+public class User : Base
+{
+ public User(string username) => Username = username;
+ public string Username { get; set; }
+ public string Password { get; set; }
+
+ public void HashAndSetPassword(string password) {
+ Password = PasswordHelper.HashPassword(password);
+ }
+
+ public bool VerifyPassword(string password) {
+ return PasswordHelper.Verify(password, Password);
+ }
+} \ No newline at end of file
diff --git a/src/Data/Dtos/AdminViewOrderDto.cs b/src/Data/Dtos/AdminViewOrderDto.cs
new file mode 100644
index 0000000..846b503
--- /dev/null
+++ b/src/Data/Dtos/AdminViewOrderDto.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using VSH.Data.Database;
+using VSH.Data.Enums;
+
+namespace VSH.Data.Dtos;
+
+public class AdminViewOrderDto
+{
+ public Guid Id { get; set; }
+ public Order.ContactInformation ContactInformation { get; set; }
+ public List<OrderDetailProduct> Products { get; set; }
+ public string OrderReference { get; set; }
+ public DateTime OrderDate { get; set; }
+ public OrderPaymentType PaymentType { get; set; }
+ public OrderStatus Status { get; set; }
+ public string VippsStatus { get; set; }
+ public string VippsId { get; set; }
+ public string VippsTransactionStatus { get; set; }
+ public string Comment { get; set; }
+
+ public class OrderDetailProduct
+ {
+ public Guid Id { get; set; }
+ public string Name { get; set; }
+ public int Count { get; set; }
+ public decimal PayedPrice { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/Data/Enums/AnalyticType.cs b/src/Data/Enums/AnalyticType.cs
new file mode 100644
index 0000000..0ec8b6b
--- /dev/null
+++ b/src/Data/Enums/AnalyticType.cs
@@ -0,0 +1,7 @@
+namespace VSH.Data.Enums;
+
+public enum AnalyticType
+{
+ PAGE_LOAD,
+ ERROR
+} \ No newline at end of file
diff --git a/src/Data/Enums/CategoryVisibility.cs b/src/Data/Enums/CategoryVisibility.cs
new file mode 100644
index 0000000..b69ee56
--- /dev/null
+++ b/src/Data/Enums/CategoryVisibility.cs
@@ -0,0 +1,8 @@
+namespace VSH.Data.Enums;
+
+public enum CategoryVisibility
+{
+ DEFAULT = 0,
+ DISABLED = 1,
+ DELETED = 2
+} \ No newline at end of file
diff --git a/src/Data/Enums/CookieType.cs b/src/Data/Enums/CookieType.cs
new file mode 100644
index 0000000..74f1742
--- /dev/null
+++ b/src/Data/Enums/CookieType.cs
@@ -0,0 +1,8 @@
+namespace VSH.Data.Enums;
+
+public enum CookieType
+{
+ XSRF = 0,
+ SESSION = 1,
+ CULTURE = 2
+} \ No newline at end of file
diff --git a/src/Data/Enums/DocumentType.cs b/src/Data/Enums/DocumentType.cs
new file mode 100644
index 0000000..084e80e
--- /dev/null
+++ b/src/Data/Enums/DocumentType.cs
@@ -0,0 +1,10 @@
+namespace VSH.Data.Enums;
+
+public enum DocumentType
+{
+ PRIVACY_POLICY = 0,
+ SALES_TERMS = 1,
+ ABOUT_PAGE = 2,
+ CONTACT_PAGE = 3,
+ DEALERS_PAGE = 4,
+} \ No newline at end of file
diff --git a/src/Data/Enums/OrderAdminStatus.cs b/src/Data/Enums/OrderAdminStatus.cs
new file mode 100644
index 0000000..b3235ea
--- /dev/null
+++ b/src/Data/Enums/OrderAdminStatus.cs
@@ -0,0 +1,9 @@
+namespace VSH.Data.Enums;
+
+public enum OrderAdminStatus
+{
+ VIPPS_CAPTURED = 0,
+ INVOICE_SENT = 1,
+ PAYED = 2,
+ IN_PROGESS = 3,
+} \ No newline at end of file
diff --git a/src/Data/Enums/OrderPaymentType.cs b/src/Data/Enums/OrderPaymentType.cs
new file mode 100644
index 0000000..73df3b9
--- /dev/null
+++ b/src/Data/Enums/OrderPaymentType.cs
@@ -0,0 +1,7 @@
+namespace VSH.Data.Enums;
+
+public enum OrderPaymentType
+{
+ VIPPS = 0,
+ INVOICE_BY_EMAIL = 1
+} \ No newline at end of file
diff --git a/src/Data/Enums/OrderStatus.cs b/src/Data/Enums/OrderStatus.cs
new file mode 100644
index 0000000..9baee22
--- /dev/null
+++ b/src/Data/Enums/OrderStatus.cs
@@ -0,0 +1,11 @@
+namespace VSH.Data.Enums;
+
+public enum OrderStatus
+{
+ IN_PROGRESS = 0,
+ CANCELLED = 1,
+ FAILED = 2,
+ COMPLETED = 3,
+ AWAITING_INVOICE = 4,
+ AWAITING_VIPPS = 5,
+} \ No newline at end of file
diff --git a/src/Data/Enums/PriceSuffix.cs b/src/Data/Enums/PriceSuffix.cs
new file mode 100644
index 0000000..c421cd2
--- /dev/null
+++ b/src/Data/Enums/PriceSuffix.cs
@@ -0,0 +1,7 @@
+namespace VSH.Data.Enums;
+
+public enum PriceSuffix
+{
+ PER = 0,
+ KILOS = 1
+} \ No newline at end of file
diff --git a/src/Data/Enums/ProductVisibility.cs b/src/Data/Enums/ProductVisibility.cs
new file mode 100644
index 0000000..41ecc4d
--- /dev/null
+++ b/src/Data/Enums/ProductVisibility.cs
@@ -0,0 +1,8 @@
+namespace VSH.Data.Enums;
+
+public enum ProductVisibility
+{
+ DEFAULT = 0,
+ DISABLED = 1,
+ DELETED = 2
+} \ No newline at end of file
diff --git a/src/Data/MainDbContext.cs b/src/Data/MainDbContext.cs
new file mode 100644
index 0000000..c95a4d0
--- /dev/null
+++ b/src/Data/MainDbContext.cs
@@ -0,0 +1,40 @@
+using Microsoft.EntityFrameworkCore;
+using VSH.Data.Database;
+
+namespace VSH.Data;
+
+public class MainDbContext : DbContext
+{
+ public MainDbContext(DbContextOptions<MainDbContext> options) : base(options) { }
+
+ public DbSet<User> Users { get; set; }
+ public DbSet<Category> Categories { get; set; }
+ public DbSet<Product> Products { get; set; }
+ public DbSet<Order> Orders { get; set; }
+ public DbSet<Document> Documents { get; set; }
+
+ protected override void OnModelCreating(ModelBuilder modelBuilder) {
+ modelBuilder.Entity<User>(e => {
+ e.ToTable("Users");
+ });
+ modelBuilder.Entity<Category>(e => {
+ e.ToTable("Categories");
+ });
+ modelBuilder.Entity<Order>(e => {
+ e.Property(c => c.Products).HasColumnType("jsonb");
+ e.Property(c => c.ContactInfo).HasColumnType("jsonb");
+ e.ToTable("Orders");
+ });
+
+ modelBuilder.Entity<Product>(e => {
+ e.Property(c => c.Images).HasColumnType("jsonb");
+ e.ToTable("Products");
+ });
+
+ modelBuilder.Entity<Document>(e => {
+ e.ToTable("Documents");
+ });
+
+ base.OnModelCreating(modelBuilder);
+ }
+} \ No newline at end of file
diff --git a/src/Data/Miscellaneous/AppCookie.cs b/src/Data/Miscellaneous/AppCookie.cs
new file mode 100644
index 0000000..f355bb6
--- /dev/null
+++ b/src/Data/Miscellaneous/AppCookie.cs
@@ -0,0 +1,8 @@
+namespace VSH.Data.Miscellaneous;
+
+public sealed record AppCookie
+{
+ public string Name { get; init; }
+ public string Description { get; init; }
+ public bool Required { get; init; }
+} \ No newline at end of file
diff --git a/src/Data/Miscellaneous/AppPath.cs b/src/Data/Miscellaneous/AppPath.cs
new file mode 100644
index 0000000..4e17a88
--- /dev/null
+++ b/src/Data/Miscellaneous/AppPath.cs
@@ -0,0 +1,7 @@
+namespace VSH.Data.Miscellaneous;
+
+public sealed record AppPath
+{
+ public string HostPath { get; init; }
+ public string WebPath { get; init; }
+} \ No newline at end of file
diff --git a/src/Data/Miscellaneous/AppSettings.cs b/src/Data/Miscellaneous/AppSettings.cs
new file mode 100644
index 0000000..048c67c
--- /dev/null
+++ b/src/Data/Miscellaneous/AppSettings.cs
@@ -0,0 +1,118 @@
+using System.Text.Json.Serialization;
+
+namespace VSH.Data.Miscellaneous;
+
+public class AppSettings
+{
+ [JsonPropertyName("General")]
+ public GeneralConfiguration General { get; set; }
+
+ [JsonPropertyName("Serilog")]
+ public SerilogConfiguration Serilog { get; set; }
+
+ public class GeneralConfiguration
+ {
+ public const string Name = "General";
+
+ [JsonPropertyName("StoreName")]
+ public string StoreName { get; set; }
+
+ [JsonPropertyName("LegalName")]
+ public string LegalName { get; set; }
+
+ [JsonPropertyName("ShortStoreName")]
+ public string ShortStoreName { get; set; }
+
+ [JsonPropertyName("DefaultCulture")]
+ public string DefaultCulture { get; set; }
+
+ [JsonPropertyName("GoogleMapsUrl")]
+ public string GoogleMapsUrl { get; set; }
+
+ [JsonPropertyName("DefaultDescription")]
+ public string DefaultDescription { get; set; }
+ }
+
+ public class SerilogConfiguration
+ {
+ public const string Name = "Serilog";
+
+ [JsonPropertyName("Using")]
+ public string[] Using { get; set; }
+
+ [JsonPropertyName("MinimumLevel")]
+ public MinimumLevel MinimumLevel { get; set; }
+
+ [JsonPropertyName("WriteTo")]
+ public WriteTo[] WriteTo { get; set; }
+
+ [JsonPropertyName("Enrich")]
+ public string[] Enrich { get; set; }
+
+ [JsonPropertyName("Destructure")]
+ public Destructure[] Destructure { get; set; }
+
+ [JsonPropertyName("Properties")]
+ public Properties Properties { get; set; }
+ }
+
+ public class Destructure
+ {
+ [JsonPropertyName("Name")]
+ public string Name { get; set; }
+
+ [JsonPropertyName("Args")]
+ public Args Args { get; set; }
+ }
+
+ public class Args
+ {
+ [JsonPropertyName("maximumDestructuringDepth")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public long? MaximumDestructuringDepth { get; set; }
+
+ [JsonPropertyName("maximumStringLength")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public long? MaximumStringLength { get; set; }
+
+ [JsonPropertyName("maximumCollectionCount")]
+ [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
+ public long? MaximumCollectionCount { get; set; }
+ }
+
+ public class MinimumLevel
+ {
+ [JsonPropertyName("Default")]
+ public string Default { get; set; }
+
+ [JsonPropertyName("Override")]
+ public Override Override { get; set; }
+ }
+
+ public class Override
+ {
+ [JsonPropertyName("Microsoft")]
+ public string Microsoft { get; set; }
+
+ [JsonPropertyName("System")]
+ public string System { get; set; }
+
+ [JsonPropertyName("Microsoft.AspNetCore")]
+ public string MicrosoftAspNetCore { get; set; }
+
+ [JsonPropertyName("Microsoft.Hosting")]
+ public string MicrosoftHosting { get; set; }
+ }
+
+ public class Properties
+ {
+ [JsonPropertyName("Application")]
+ public string Application { get; set; }
+ }
+
+ public class WriteTo
+ {
+ [JsonPropertyName("Name")]
+ public string Name { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/Data/Miscellaneous/OpenGraphData.cs b/src/Data/Miscellaneous/OpenGraphData.cs
new file mode 100644
index 0000000..5bf33fe
--- /dev/null
+++ b/src/Data/Miscellaneous/OpenGraphData.cs
@@ -0,0 +1,12 @@
+namespace VSH.Data.Miscellaneous;
+
+public class OpenGraphData
+{
+ public string Type { get; set; }
+ public string Locale { get; set; }
+ public string Url { get; set; }
+ public string Title { get; set; }
+ public string Description { get; set; }
+ public string SiteName { get; set; }
+ public string Image { get; set; }
+} \ No newline at end of file
diff --git a/src/Data/Payloads/CreateProductDto.cs b/src/Data/Payloads/CreateProductDto.cs
new file mode 100644
index 0000000..eada16e
--- /dev/null
+++ b/src/Data/Payloads/CreateProductDto.cs
@@ -0,0 +1,22 @@
+using System;
+using System.Collections.Generic;
+using VSH.Data.Enums;
+
+namespace VSH.Data.Payloads;
+
+public class CreateProductDto
+{
+ public string Name { get; set; }
+ public string Description { get; set; }
+ public double Price { get; set; }
+ public PriceSuffix PriceSuffix { get; set; }
+ public Guid CategoryId { get; set; }
+ public List<TProductImage> Images { get; set; }
+ public int Count { get; set; }
+
+ public class TProductImage
+ {
+ public string FileName { get; set; }
+ public int Order { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/Data/Payloads/LoginPayload.cs b/src/Data/Payloads/LoginPayload.cs
new file mode 100644
index 0000000..8e4f461
--- /dev/null
+++ b/src/Data/Payloads/LoginPayload.cs
@@ -0,0 +1,8 @@
+namespace VSH.Data.Payloads;
+
+public record LoginPayload
+{
+ public string Username { get; set; }
+ public string Password { get; set; }
+ public bool Persist { get; set; }
+} \ No newline at end of file
diff --git a/src/Data/Payloads/UpdatePasswordPayload.cs b/src/Data/Payloads/UpdatePasswordPayload.cs
new file mode 100644
index 0000000..4105eb4
--- /dev/null
+++ b/src/Data/Payloads/UpdatePasswordPayload.cs
@@ -0,0 +1,6 @@
+namespace VSH.Data.Payloads;
+
+public class UpdatePasswordPayload
+{
+ public string NewPassword { get; set; }
+} \ No newline at end of file
diff --git a/src/Data/Payloads/ValidateOrderPayload.cs b/src/Data/Payloads/ValidateOrderPayload.cs
new file mode 100644
index 0000000..d3aee82
--- /dev/null
+++ b/src/Data/Payloads/ValidateOrderPayload.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace VSH.Data.Payloads;
+
+public record ValidateOrderPayload
+{
+ public List<ProductValidationDto> Products { get; set; }
+
+ public class ProductValidationDto
+ {
+ public Guid Id { get; set; }
+ public int Count { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/Data/Results/AppValidationResult.cs b/src/Data/Results/AppValidationResult.cs
new file mode 100644
index 0000000..0b1c967
--- /dev/null
+++ b/src/Data/Results/AppValidationResult.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace VSH.Data.Results;
+
+public class AppValidationResult
+{
+ public AppValidationResult() {
+ Errors = new List<ValidationError>();
+ }
+
+ public bool IsValid => !Errors.Any();
+ public List<ValidationError> Errors { get; set; }
+
+
+ public class ValidationError
+ {
+ public ValidationError(Guid id = default) {
+ Id = id != default ? id : null;
+ Errors = new List<string>();
+ }
+
+ public Guid? Id { get; set; }
+ public List<string> Errors { get; set; }
+ }
+} \ No newline at end of file
diff --git a/src/Data/Results/ErrorResult.cs b/src/Data/Results/ErrorResult.cs
new file mode 100644
index 0000000..60d1b1d
--- /dev/null
+++ b/src/Data/Results/ErrorResult.cs
@@ -0,0 +1,12 @@
+namespace VSH.Data.Results;
+
+public class ErrorResult
+{
+ public ErrorResult(string title = default, string message = default) {
+ Title = title;
+ Message = message;
+ }
+
+ public string Title { get; set; }
+ public string Message { get; set; }
+} \ No newline at end of file
diff --git a/src/Data/Static/AppCookies.cs b/src/Data/Static/AppCookies.cs
new file mode 100644
index 0000000..711d59e
--- /dev/null
+++ b/src/Data/Static/AppCookies.cs
@@ -0,0 +1,21 @@
+using VSH.Data.Miscellaneous;
+
+namespace VSH.Data.Static;
+
+public static class AppCookies
+{
+ public static AppCookie Xsrf => new() {
+ Name = "vsh_xsrf",
+ Required = true
+ };
+
+ public static AppCookie Session => new() {
+ Name = "vsh_session",
+ Required = true
+ };
+
+ public static AppCookie Culture => new() {
+ Name = "vsh_culture",
+ Required = false
+ };
+} \ No newline at end of file
diff --git a/src/Data/Static/AppPaths.cs b/src/Data/Static/AppPaths.cs
new file mode 100644
index 0000000..4073a75
--- /dev/null
+++ b/src/Data/Static/AppPaths.cs
@@ -0,0 +1,40 @@
+using System.IO;
+using VSH.Data.Miscellaneous;
+
+namespace VSH.Data.Static;
+
+public static class AppPaths
+{
+ public static AppPath WwwRoot => new() {
+ HostPath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot"),
+ WebPath = "/"
+ };
+
+ public static AppPath Assets => new() {
+ HostPath = Path.Combine(WwwRoot.HostPath, "assets"),
+ WebPath = "/assets"
+ };
+
+ public static AppPath ProductImages => new() {
+ HostPath = Path.Combine(Assets.HostPath, "images", "products"),
+ WebPath = Path.Combine(Assets.WebPath, "images", "products")
+ };
+
+ public static AppPath DocumentImages => new() {
+ HostPath = Path.Combine(Assets.HostPath, "images", "documents"),
+ WebPath = Path.Combine(Assets.WebPath, "images", "documents")
+ };
+
+ public static AppPath DataProtectionKeys => new() {
+ HostPath = Path.Combine(AppData.HostPath, "DPKeys"),
+ };
+
+ public static AppPath AppData => new() {
+ HostPath = Path.Combine(Directory.GetCurrentDirectory(), "AppData"),
+ };
+
+ public static AppPath DefaultProductImage => new() {
+ HostPath = Path.Combine(Assets.HostPath, "profile", "innrammet.svg"),
+ WebPath = Path.Combine(Assets.WebPath, "profile", "innrammet.svg")
+ };
+} \ No newline at end of file
diff --git a/src/Migrations/20210305140605_CleanSlate.Designer.cs b/src/Migrations/20210305140605_CleanSlate.Designer.cs
new file mode 100644
index 0000000..7065863
--- /dev/null
+++ b/src/Migrations/20210305140605_CleanSlate.Designer.cs
@@ -0,0 +1,315 @@
+// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using VSH.Data;
+using VSH.Data.Database;
+// using VSH.Data.Vipps;
+
+namespace VSH.Migrations
+{
+ [DbContext(typeof(MainDbContext))]
+ [Migration("20210305140605_CleanSlate")]
+ partial class CleanSlate
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("Relational:MaxIdentifierLength", 63)
+ .HasAnnotation("ProductVersion", "5.0.3")
+ .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+ modelBuilder.Entity("VSH.Data.Database.Category", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property<string>("Slug")
+ .HasColumnType("text")
+ .HasColumnName("slug");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VisibilityState")
+ .HasColumnType("integer")
+ .HasColumnName("visibility_state");
+
+ b.HasKey("Id")
+ .HasName("pk_categories");
+
+ b.ToTable("Categories");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Document", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("Content")
+ .HasColumnType("text")
+ .HasColumnName("content");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<int>("Type")
+ .HasColumnType("integer")
+ .HasColumnName("type");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.HasKey("Id")
+ .HasName("pk_documents");
+
+ b.ToTable("Documents");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Order", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("Comment")
+ .HasColumnType("text")
+ .HasColumnName("comment");
+
+ b.Property<Order.ContactInformation>("ContactInfo")
+ .HasColumnType("jsonb")
+ .HasColumnName("contact_info");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("OrderReference")
+ .HasColumnType("text")
+ .HasColumnName("order_reference");
+
+ b.Property<int>("PaymentType")
+ .HasColumnType("integer")
+ .HasColumnName("payment_type");
+
+ b.Property<List<OrderProduct>>("Products")
+ .HasColumnType("jsonb")
+ .HasColumnName("products");
+
+ b.Property<int>("Status")
+ .HasColumnType("integer")
+ .HasColumnName("status");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.HasKey("Id")
+ .HasName("pk_orders");
+
+ b.ToTable("Orders");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Product", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<Guid?>("CategoryId")
+ .HasColumnType("uuid")
+ .HasColumnName("category_id");
+
+ b.Property<int>("Count")
+ .HasColumnType("integer")
+ .HasColumnName("count");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property<List<ProductImage>>("Images")
+ .HasColumnType("jsonb")
+ .HasColumnName("images");
+
+ b.Property<string>("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property<decimal>("Price")
+ .HasColumnType("numeric")
+ .HasColumnName("price");
+
+ b.Property<int>("PriceSuffix")
+ .HasColumnType("integer")
+ .HasColumnName("price_suffix");
+
+ b.Property<bool>("ShowOnFrontpage")
+ .HasColumnType("boolean")
+ .HasColumnName("show_on_frontpage");
+
+ b.Property<string>("Slug")
+ .HasColumnType("text")
+ .HasColumnName("slug");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VisibilityState")
+ .HasColumnType("integer")
+ .HasColumnName("visibility_state");
+
+ b.HasKey("Id")
+ .HasName("pk_products");
+
+ b.HasIndex("CategoryId")
+ .HasDatabaseName("ix_products_category_id");
+
+ b.ToTable("Products");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.User", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Password")
+ .HasColumnType("text")
+ .HasColumnName("password");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<string>("Username")
+ .HasColumnType("text")
+ .HasColumnName("username");
+
+ b.HasKey("Id")
+ .HasName("pk_users");
+
+ b.ToTable("Users");
+ });
+ //
+ // modelBuilder.Entity("VSH.Data.Database.VippsResponse", b =>
+ // {
+ // b.Property<Guid>("Id")
+ // .ValueGeneratedOnAdd()
+ // .HasColumnType("uuid")
+ // .HasColumnName("id");
+ //
+ // b.Property<VippsPaymentActionResponse>("CancellationResponse")
+ // .HasColumnType("jsonb")
+ // .HasColumnName("cancellation_response");
+ //
+ // b.Property<VippsPaymentActionResponse>("CaptureResponse")
+ // .HasColumnType("jsonb")
+ // .HasColumnName("capture_response");
+ //
+ // b.Property<DateTime>("Created")
+ // .HasColumnType("timestamp without time zone")
+ // .HasColumnName("created");
+ //
+ // b.Property<VippsErrorResponse>("ErrorResponse")
+ // .HasColumnType("jsonb")
+ // .HasColumnName("error_response");
+ //
+ // b.Property<VippsPaymentInitiationCallbackResponse>("InitiationResponse")
+ // .HasColumnType("jsonb")
+ // .HasColumnName("initiation_response");
+ //
+ // b.Property<Guid>("OrderId")
+ // .HasColumnType("uuid")
+ // .HasColumnName("order_id");
+ //
+ // b.Property<VippsGetPaymentDetailsResponse>("PaymentDetailResponse")
+ // .HasColumnType("jsonb")
+ // .HasColumnName("payment_detail_response");
+ //
+ // b.Property<VippsPaymentActionResponse>("RefundResponse")
+ // .HasColumnType("jsonb")
+ // .HasColumnName("refund_response");
+ //
+ // b.Property<int>("StatusCode")
+ // .HasColumnType("integer")
+ // .HasColumnName("status_code");
+ //
+ // b.Property<DateTime?>("Updated")
+ // .HasColumnType("timestamp without time zone")
+ // .HasColumnName("updated");
+ //
+ // b.HasKey("Id")
+ // .HasName("pk_vipps_responses");
+ //
+ // b.HasIndex("OrderId")
+ // .HasDatabaseName("ix_vipps_responses_order_id");
+ //
+ // b.ToTable("VippsResponses");
+ // });
+
+ modelBuilder.Entity("VSH.Data.Database.Product", b =>
+ {
+ b.HasOne("VSH.Data.Database.Category", "Category")
+ .WithMany("Products")
+ .HasForeignKey("CategoryId")
+ .HasConstraintName("fk_products_categories_category_id");
+
+ b.Navigation("Category");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.VippsResponse", b =>
+ {
+ b.HasOne("VSH.Data.Database.Order", null)
+ .WithMany("VippsResponses")
+ .HasForeignKey("OrderId")
+ .HasConstraintName("fk_vipps_responses_orders_order_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Category", b =>
+ {
+ b.Navigation("Products");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Order", b =>
+ {
+ b.Navigation("VippsResponses");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/Migrations/20210305140605_CleanSlate.cs b/src/Migrations/20210305140605_CleanSlate.cs
new file mode 100644
index 0000000..bde6c16
--- /dev/null
+++ b/src/Migrations/20210305140605_CleanSlate.cs
@@ -0,0 +1,166 @@
+using System;
+using System.Collections.Generic;
+using IOL.VippsEcommerce.Models.Api;
+using Microsoft.EntityFrameworkCore.Migrations;
+using VSH.Data.Database;
+
+namespace VSH.Migrations
+{
+ public partial class CleanSlate : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "Categories",
+ columns: table => new
+ {
+ id = table.Column<Guid>(type: "uuid", nullable: false),
+ name = table.Column<string>(type: "text", nullable: true),
+ slug = table.Column<string>(type: "text", nullable: true),
+ visibility_state = table.Column<int>(type: "integer", nullable: false),
+ created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
+ updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_categories", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Documents",
+ columns: table => new
+ {
+ id = table.Column<Guid>(type: "uuid", nullable: false),
+ type = table.Column<int>(type: "integer", nullable: false),
+ content = table.Column<string>(type: "text", nullable: true),
+ created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
+ updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_documents", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Orders",
+ columns: table => new
+ {
+ id = table.Column<Guid>(type: "uuid", nullable: false),
+ comment = table.Column<string>(type: "text", nullable: true),
+ order_reference = table.Column<string>(type: "text", nullable: true),
+ status = table.Column<int>(type: "integer", nullable: false),
+ payment_type = table.Column<int>(type: "integer", nullable: false),
+ contact_info = table.Column<Order.ContactInformation>(type: "jsonb", nullable: true),
+ products = table.Column<List<OrderProduct>>(type: "jsonb", nullable: true),
+ created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
+ updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_orders", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Users",
+ columns: table => new
+ {
+ id = table.Column<Guid>(type: "uuid", nullable: false),
+ username = table.Column<string>(type: "text", nullable: true),
+ password = table.Column<string>(type: "text", nullable: true),
+ created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
+ updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_users", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Products",
+ columns: table => new
+ {
+ id = table.Column<Guid>(type: "uuid", nullable: false),
+ name = table.Column<string>(type: "text", nullable: true),
+ description = table.Column<string>(type: "text", nullable: true),
+ price = table.Column<decimal>(type: "numeric", nullable: false),
+ price_suffix = table.Column<int>(type: "integer", nullable: false),
+ visibility_state = table.Column<int>(type: "integer", nullable: false),
+ category_id = table.Column<Guid>(type: "uuid", nullable: true),
+ images = table.Column<List<ProductImage>>(type: "jsonb", nullable: true),
+ count = table.Column<int>(type: "integer", nullable: false),
+ slug = table.Column<string>(type: "text", nullable: true),
+ show_on_frontpage = table.Column<bool>(type: "boolean", nullable: false),
+ created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
+ updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_products", x => x.id);
+ table.ForeignKey(
+ name: "fk_products_categories_category_id",
+ column: x => x.category_id,
+ principalTable: "Categories",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Restrict);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "VippsResponses",
+ columns: table => new
+ {
+ id = table.Column<Guid>(type: "uuid", nullable: false),
+ order_id = table.Column<Guid>(type: "uuid", nullable: false),
+ status_code = table.Column<int>(type: "integer", nullable: false),
+ initiation_response = table.Column<VippsPaymentInitiationCallbackResponse>(type: "jsonb", nullable: true),
+ payment_detail_response = table.Column<VippsGetPaymentDetailsResponse>(type: "jsonb", nullable: true),
+ cancellation_response = table.Column<VippsPaymentActionResponse>(type: "jsonb", nullable: true),
+ refund_response = table.Column<VippsPaymentActionResponse>(type: "jsonb", nullable: true),
+ capture_response = table.Column<VippsPaymentActionResponse>(type: "jsonb", nullable: true),
+ error_response = table.Column<VippsErrorResponse>(type: "jsonb", nullable: true),
+ created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
+ updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_vipps_responses", x => x.id);
+ table.ForeignKey(
+ name: "fk_vipps_responses_orders_order_id",
+ column: x => x.order_id,
+ principalTable: "Orders",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "ix_products_category_id",
+ table: "Products",
+ column: "category_id");
+
+ migrationBuilder.CreateIndex(
+ name: "ix_vipps_responses_order_id",
+ table: "VippsResponses",
+ column: "order_id");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Documents");
+
+ migrationBuilder.DropTable(
+ name: "Products");
+
+ migrationBuilder.DropTable(
+ name: "Users");
+
+ migrationBuilder.DropTable(
+ name: "VippsResponses");
+
+ migrationBuilder.DropTable(
+ name: "Categories");
+
+ migrationBuilder.DropTable(
+ name: "Orders");
+ }
+ }
+}
diff --git a/src/Migrations/20210308201742_VippsResponsesAsStrings.Designer.cs b/src/Migrations/20210308201742_VippsResponsesAsStrings.Designer.cs
new file mode 100644
index 0000000..5a332a5
--- /dev/null
+++ b/src/Migrations/20210308201742_VippsResponsesAsStrings.Designer.cs
@@ -0,0 +1,314 @@
+// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using VSH.Data;
+using VSH.Data.Database;
+
+namespace VSH.Migrations
+{
+ [DbContext(typeof(MainDbContext))]
+ [Migration("20210308201742_VippsResponsesAsStrings")]
+ partial class VippsResponsesAsStrings
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("Relational:MaxIdentifierLength", 63)
+ .HasAnnotation("ProductVersion", "5.0.3")
+ .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+ modelBuilder.Entity("VSH.Data.Database.Category", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property<string>("Slug")
+ .HasColumnType("text")
+ .HasColumnName("slug");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VisibilityState")
+ .HasColumnType("integer")
+ .HasColumnName("visibility_state");
+
+ b.HasKey("Id")
+ .HasName("pk_categories");
+
+ b.ToTable("Categories");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Document", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("Content")
+ .HasColumnType("text")
+ .HasColumnName("content");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<int>("Type")
+ .HasColumnType("integer")
+ .HasColumnName("type");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.HasKey("Id")
+ .HasName("pk_documents");
+
+ b.ToTable("Documents");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Order", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("Comment")
+ .HasColumnType("text")
+ .HasColumnName("comment");
+
+ b.Property<Order.ContactInformation>("ContactInfo")
+ .HasColumnType("jsonb")
+ .HasColumnName("contact_info");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("OrderReference")
+ .HasColumnType("text")
+ .HasColumnName("order_reference");
+
+ b.Property<int>("PaymentType")
+ .HasColumnType("integer")
+ .HasColumnName("payment_type");
+
+ b.Property<List<OrderProduct>>("Products")
+ .HasColumnType("jsonb")
+ .HasColumnName("products");
+
+ b.Property<int>("Status")
+ .HasColumnType("integer")
+ .HasColumnName("status");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.HasKey("Id")
+ .HasName("pk_orders");
+
+ b.ToTable("Orders");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Product", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<Guid?>("CategoryId")
+ .HasColumnType("uuid")
+ .HasColumnName("category_id");
+
+ b.Property<int>("Count")
+ .HasColumnType("integer")
+ .HasColumnName("count");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property<List<ProductImage>>("Images")
+ .HasColumnType("jsonb")
+ .HasColumnName("images");
+
+ b.Property<string>("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property<decimal>("Price")
+ .HasColumnType("numeric")
+ .HasColumnName("price");
+
+ b.Property<int>("PriceSuffix")
+ .HasColumnType("integer")
+ .HasColumnName("price_suffix");
+
+ b.Property<bool>("ShowOnFrontpage")
+ .HasColumnType("boolean")
+ .HasColumnName("show_on_frontpage");
+
+ b.Property<string>("Slug")
+ .HasColumnType("text")
+ .HasColumnName("slug");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VisibilityState")
+ .HasColumnType("integer")
+ .HasColumnName("visibility_state");
+
+ b.HasKey("Id")
+ .HasName("pk_products");
+
+ b.HasIndex("CategoryId")
+ .HasDatabaseName("ix_products_category_id");
+
+ b.ToTable("Products");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.User", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Password")
+ .HasColumnType("text")
+ .HasColumnName("password");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<string>("Username")
+ .HasColumnType("text")
+ .HasColumnName("username");
+
+ b.HasKey("Id")
+ .HasName("pk_users");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.VippsResponse", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("CancellationResponse")
+ .HasColumnType("jsonb")
+ .HasColumnName("cancellation_response");
+
+ b.Property<string>("CaptureResponse")
+ .HasColumnType("jsonb")
+ .HasColumnName("capture_response");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("ErrorResponse")
+ .HasColumnType("jsonb")
+ .HasColumnName("error_response");
+
+ b.Property<string>("InitiationResponse")
+ .HasColumnType("jsonb")
+ .HasColumnName("initiation_response");
+
+ b.Property<Guid>("OrderId")
+ .HasColumnType("uuid")
+ .HasColumnName("order_id");
+
+ b.Property<string>("PaymentDetailResponse")
+ .HasColumnType("jsonb")
+ .HasColumnName("payment_detail_response");
+
+ b.Property<string>("RefundResponse")
+ .HasColumnType("jsonb")
+ .HasColumnName("refund_response");
+
+ b.Property<int>("StatusCode")
+ .HasColumnType("integer")
+ .HasColumnName("status_code");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.HasKey("Id")
+ .HasName("pk_vipps_responses");
+
+ b.HasIndex("OrderId")
+ .HasDatabaseName("ix_vipps_responses_order_id");
+
+ b.ToTable("VippsResponses");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Product", b =>
+ {
+ b.HasOne("VSH.Data.Database.Category", "Category")
+ .WithMany("Products")
+ .HasForeignKey("CategoryId")
+ .HasConstraintName("fk_products_categories_category_id");
+
+ b.Navigation("Category");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.VippsResponse", b =>
+ {
+ b.HasOne("VSH.Data.Database.Order", null)
+ .WithMany("VippsResponses")
+ .HasForeignKey("OrderId")
+ .HasConstraintName("fk_vipps_responses_orders_order_id")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired();
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Category", b =>
+ {
+ b.Navigation("Products");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Order", b =>
+ {
+ b.Navigation("VippsResponses");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/Migrations/20210308201742_VippsResponsesAsStrings.cs b/src/Migrations/20210308201742_VippsResponsesAsStrings.cs
new file mode 100644
index 0000000..c0de79a
--- /dev/null
+++ b/src/Migrations/20210308201742_VippsResponsesAsStrings.cs
@@ -0,0 +1,17 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace VSH.Migrations
+{
+ public partial class VippsResponsesAsStrings : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+
+ }
+ }
+}
diff --git a/src/Migrations/20210309193123_RemoveVippsResponses.Designer.cs b/src/Migrations/20210309193123_RemoveVippsResponses.Designer.cs
new file mode 100644
index 0000000..81db0a1
--- /dev/null
+++ b/src/Migrations/20210309193123_RemoveVippsResponses.Designer.cs
@@ -0,0 +1,255 @@
+// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using VSH.Data;
+using VSH.Data.Database;
+
+namespace VSH.Migrations
+{
+ [DbContext(typeof(MainDbContext))]
+ [Migration("20210309193123_RemoveVippsResponses")]
+ partial class RemoveVippsResponses
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("Relational:MaxIdentifierLength", 63)
+ .HasAnnotation("ProductVersion", "5.0.3")
+ .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+ modelBuilder.Entity("VSH.Data.Database.Category", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property<string>("Slug")
+ .HasColumnType("text")
+ .HasColumnName("slug");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VisibilityState")
+ .HasColumnType("integer")
+ .HasColumnName("visibility_state");
+
+ b.HasKey("Id")
+ .HasName("pk_categories");
+
+ b.ToTable("Categories");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Document", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("Content")
+ .HasColumnType("text")
+ .HasColumnName("content");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<int>("Type")
+ .HasColumnType("integer")
+ .HasColumnName("type");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.HasKey("Id")
+ .HasName("pk_documents");
+
+ b.ToTable("Documents");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Order", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("Comment")
+ .HasColumnType("text")
+ .HasColumnName("comment");
+
+ b.Property<Order.ContactInformation>("ContactInfo")
+ .HasColumnType("jsonb")
+ .HasColumnName("contact_info");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("OrderReference")
+ .HasColumnType("text")
+ .HasColumnName("order_reference");
+
+ b.Property<int>("PaymentType")
+ .HasColumnType("integer")
+ .HasColumnName("payment_type");
+
+ b.Property<List<OrderProduct>>("Products")
+ .HasColumnType("jsonb")
+ .HasColumnName("products");
+
+ b.Property<int>("Status")
+ .HasColumnType("integer")
+ .HasColumnName("status");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VippsStatus")
+ .HasColumnType("integer")
+ .HasColumnName("vipps_status");
+
+ b.Property<string>("VippsTransactionId")
+ .HasColumnType("text")
+ .HasColumnName("vipps_transaction_id");
+
+ b.Property<int>("VippsTransactionStatus")
+ .HasColumnType("integer")
+ .HasColumnName("vipps_transaction_status");
+
+ b.HasKey("Id")
+ .HasName("pk_orders");
+
+ b.ToTable("Orders");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Product", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<Guid?>("CategoryId")
+ .HasColumnType("uuid")
+ .HasColumnName("category_id");
+
+ b.Property<int>("Count")
+ .HasColumnType("integer")
+ .HasColumnName("count");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property<List<ProductImage>>("Images")
+ .HasColumnType("jsonb")
+ .HasColumnName("images");
+
+ b.Property<string>("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property<decimal>("Price")
+ .HasColumnType("numeric")
+ .HasColumnName("price");
+
+ b.Property<int>("PriceSuffix")
+ .HasColumnType("integer")
+ .HasColumnName("price_suffix");
+
+ b.Property<bool>("ShowOnFrontpage")
+ .HasColumnType("boolean")
+ .HasColumnName("show_on_frontpage");
+
+ b.Property<string>("Slug")
+ .HasColumnType("text")
+ .HasColumnName("slug");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VisibilityState")
+ .HasColumnType("integer")
+ .HasColumnName("visibility_state");
+
+ b.HasKey("Id")
+ .HasName("pk_products");
+
+ b.HasIndex("CategoryId")
+ .HasDatabaseName("ix_products_category_id");
+
+ b.ToTable("Products");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.User", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Password")
+ .HasColumnType("text")
+ .HasColumnName("password");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<string>("Username")
+ .HasColumnType("text")
+ .HasColumnName("username");
+
+ b.HasKey("Id")
+ .HasName("pk_users");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Product", b =>
+ {
+ b.HasOne("VSH.Data.Database.Category", "Category")
+ .WithMany("Products")
+ .HasForeignKey("CategoryId")
+ .HasConstraintName("fk_products_categories_category_id");
+
+ b.Navigation("Category");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Category", b =>
+ {
+ b.Navigation("Products");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/Migrations/20210309193123_RemoveVippsResponses.cs b/src/Migrations/20210309193123_RemoveVippsResponses.cs
new file mode 100644
index 0000000..8fdd4f0
--- /dev/null
+++ b/src/Migrations/20210309193123_RemoveVippsResponses.cs
@@ -0,0 +1,81 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+namespace VSH.Migrations
+{
+ public partial class RemoveVippsResponses : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "VippsResponses");
+
+ migrationBuilder.AddColumn<int>(
+ name: "vipps_status",
+ table: "Orders",
+ type: "integer",
+ nullable: false,
+ defaultValue: 0);
+
+ migrationBuilder.AddColumn<string>(
+ name: "vipps_transaction_id",
+ table: "Orders",
+ type: "text",
+ nullable: true);
+
+ migrationBuilder.AddColumn<int>(
+ name: "vipps_transaction_status",
+ table: "Orders",
+ type: "integer",
+ nullable: false,
+ defaultValue: 0);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "vipps_status",
+ table: "Orders");
+
+ migrationBuilder.DropColumn(
+ name: "vipps_transaction_id",
+ table: "Orders");
+
+ migrationBuilder.DropColumn(
+ name: "vipps_transaction_status",
+ table: "Orders");
+
+ migrationBuilder.CreateTable(
+ name: "VippsResponses",
+ columns: table => new
+ {
+ id = table.Column<Guid>(type: "uuid", nullable: false),
+ cancellation_response = table.Column<string>(type: "jsonb", nullable: true),
+ capture_response = table.Column<string>(type: "jsonb", nullable: true),
+ created = table.Column<DateTime>(type: "timestamp without time zone", nullable: false),
+ error_response = table.Column<string>(type: "jsonb", nullable: true),
+ initiation_response = table.Column<string>(type: "jsonb", nullable: true),
+ order_id = table.Column<Guid>(type: "uuid", nullable: false),
+ payment_detail_response = table.Column<string>(type: "jsonb", nullable: true),
+ refund_response = table.Column<string>(type: "jsonb", nullable: true),
+ status_code = table.Column<int>(type: "integer", nullable: false),
+ updated = table.Column<DateTime>(type: "timestamp without time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_vipps_responses", x => x.id);
+ table.ForeignKey(
+ name: "fk_vipps_responses_orders_order_id",
+ column: x => x.order_id,
+ principalTable: "Orders",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "ix_vipps_responses_order_id",
+ table: "VippsResponses",
+ column: "order_id");
+ }
+ }
+}
diff --git a/src/Migrations/MainDbContextModelSnapshot.cs b/src/Migrations/MainDbContextModelSnapshot.cs
new file mode 100644
index 0000000..34b688e
--- /dev/null
+++ b/src/Migrations/MainDbContextModelSnapshot.cs
@@ -0,0 +1,253 @@
+// <auto-generated />
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using VSH.Data;
+using VSH.Data.Database;
+
+namespace VSH.Migrations
+{
+ [DbContext(typeof(MainDbContext))]
+ partial class MainDbContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("Relational:MaxIdentifierLength", 63)
+ .HasAnnotation("ProductVersion", "5.0.3")
+ .HasAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
+
+ modelBuilder.Entity("VSH.Data.Database.Category", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property<string>("Slug")
+ .HasColumnType("text")
+ .HasColumnName("slug");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VisibilityState")
+ .HasColumnType("integer")
+ .HasColumnName("visibility_state");
+
+ b.HasKey("Id")
+ .HasName("pk_categories");
+
+ b.ToTable("Categories");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Document", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("Content")
+ .HasColumnType("text")
+ .HasColumnName("content");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<int>("Type")
+ .HasColumnType("integer")
+ .HasColumnName("type");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.HasKey("Id")
+ .HasName("pk_documents");
+
+ b.ToTable("Documents");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Order", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<string>("Comment")
+ .HasColumnType("text")
+ .HasColumnName("comment");
+
+ b.Property<Order.ContactInformation>("ContactInfo")
+ .HasColumnType("jsonb")
+ .HasColumnName("contact_info");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("OrderReference")
+ .HasColumnType("text")
+ .HasColumnName("order_reference");
+
+ b.Property<int>("PaymentType")
+ .HasColumnType("integer")
+ .HasColumnName("payment_type");
+
+ b.Property<List<OrderProduct>>("Products")
+ .HasColumnType("jsonb")
+ .HasColumnName("products");
+
+ b.Property<int>("Status")
+ .HasColumnType("integer")
+ .HasColumnName("status");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VippsStatus")
+ .HasColumnType("integer")
+ .HasColumnName("vipps_status");
+
+ b.Property<string>("VippsTransactionId")
+ .HasColumnType("text")
+ .HasColumnName("vipps_transaction_id");
+
+ b.Property<int>("VippsTransactionStatus")
+ .HasColumnType("integer")
+ .HasColumnName("vipps_transaction_status");
+
+ b.HasKey("Id")
+ .HasName("pk_orders");
+
+ b.ToTable("Orders");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Product", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<Guid?>("CategoryId")
+ .HasColumnType("uuid")
+ .HasColumnName("category_id");
+
+ b.Property<int>("Count")
+ .HasColumnType("integer")
+ .HasColumnName("count");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Description")
+ .HasColumnType("text")
+ .HasColumnName("description");
+
+ b.Property<List<ProductImage>>("Images")
+ .HasColumnType("jsonb")
+ .HasColumnName("images");
+
+ b.Property<string>("Name")
+ .HasColumnType("text")
+ .HasColumnName("name");
+
+ b.Property<decimal>("Price")
+ .HasColumnType("numeric")
+ .HasColumnName("price");
+
+ b.Property<int>("PriceSuffix")
+ .HasColumnType("integer")
+ .HasColumnName("price_suffix");
+
+ b.Property<bool>("ShowOnFrontpage")
+ .HasColumnType("boolean")
+ .HasColumnName("show_on_frontpage");
+
+ b.Property<string>("Slug")
+ .HasColumnType("text")
+ .HasColumnName("slug");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<int>("VisibilityState")
+ .HasColumnType("integer")
+ .HasColumnName("visibility_state");
+
+ b.HasKey("Id")
+ .HasName("pk_products");
+
+ b.HasIndex("CategoryId")
+ .HasDatabaseName("ix_products_category_id");
+
+ b.ToTable("Products");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.User", b =>
+ {
+ b.Property<Guid>("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property<DateTime>("Created")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("created");
+
+ b.Property<string>("Password")
+ .HasColumnType("text")
+ .HasColumnName("password");
+
+ b.Property<DateTime?>("Updated")
+ .HasColumnType("timestamp without time zone")
+ .HasColumnName("updated");
+
+ b.Property<string>("Username")
+ .HasColumnType("text")
+ .HasColumnName("username");
+
+ b.HasKey("Id")
+ .HasName("pk_users");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Product", b =>
+ {
+ b.HasOne("VSH.Data.Database.Category", "Category")
+ .WithMany("Products")
+ .HasForeignKey("CategoryId")
+ .HasConstraintName("fk_products_categories_category_id");
+
+ b.Navigation("Category");
+ });
+
+ modelBuilder.Entity("VSH.Data.Database.Category", b =>
+ {
+ b.Navigation("Products");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/src/Pages/Errors/Index.cshtml b/src/Pages/Errors/Index.cshtml
new file mode 100644
index 0000000..5db7b59
--- /dev/null
+++ b/src/Pages/Errors/Index.cshtml
@@ -0,0 +1,33 @@
+@page "{code}"
+@using System.Net
+@model VSH.Pages.Errors.Index
+@{
+ ViewData["Title"] = Model.ErrorStatusCode switch {
+ HttpStatusCode.NotFound => "Fant ikkje sida",
+ var _ => "Uventa feil"
+ };
+}
+<section class="container py-3 py-lg-5">
+ @switch (Model.ErrorStatusCode) {
+ case HttpStatusCode.NotFound:
+ <div class="text-component text-center margin-bottom-lg">
+ <h1>Fant ikkje siden</h1>
+ <p>Beklagar, sida du prøvar å nå finnes ikkje.</p>
+ <p><a href="/">GÃ¥ til forsida</a> eller <a href="/kontakt">kontakt oss</a>.</p>
+ </div>
+ break;
+ case HttpStatusCode.InternalServerError:
+ <div class="text-component text-center margin-bottom-lg">
+ <h1>Her gjekk noko gale</h1>
+ <p>Vi jobbar med å løysa problemet, ver vennleg og prøv igjen seinare.</p>
+ </div>
+ break;
+ default:
+ <div class="text-component text-center margin-bottom-lg">
+ <h1>Heisann, her gjekk ikkje alt etter planen</h1>
+ <p>Ver vennleg og prøv igjen snart.</p>
+ <p><a href="/">GÃ¥ til forsida</a> eller <a href="/kontakt">kontakt oss</a>.</p>
+ </div>
+ break;
+ }
+</section>
diff --git a/src/Pages/Errors/Index.cshtml.cs b/src/Pages/Errors/Index.cshtml.cs
new file mode 100644
index 0000000..05e405d
--- /dev/null
+++ b/src/Pages/Errors/Index.cshtml.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Net;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace VSH.Pages.Errors;
+
+public class Index : PageModel
+{
+ public HttpStatusCode ErrorStatusCode { get; set; }
+
+ public void OnGet() {
+ try {
+ if (int.TryParse(RouteData.Values["code"]?.ToString(), out var status))
+ ErrorStatusCode = (HttpStatusCode)status;
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/Pages/Handlekorg.cshtml b/src/Pages/Handlekorg.cshtml
new file mode 100644
index 0000000..9f8f159
--- /dev/null
+++ b/src/Pages/Handlekorg.cshtml
@@ -0,0 +1,100 @@
+@page
+@model VSH.Pages.Handlekorg
+@{
+ ViewData["Title"] = "Handlekorg";
+}
+
+<div class="container py-3 py-md-5">
+ <div class="row">
+ <div class="alert alert-info p-3 d-none" id="order-alert"></div>
+ <div class="col-12 col-lg-8 pe-lg-5">
+ <div class="spinner-border text-primary m-0-auto d-flex" role="status" id="order-summary-spinner">
+ <span class="visually-hidden">Lastar...</span>
+ </div>
+ <div class="d-none" id="order-summary-wrapper">
+ <div class="row">
+ <table class="table">
+ <thead>
+ <tr>
+ <th scope="col">Produkt</th>
+ <th scope="col">Antall</th>
+ <th scope="col">Pris</th>
+ <th scope="col">Totalsum</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ <div class="row d-flex float-right flex-column" id="total-wrapper">
+ <div class="d-flex flex-column w-max-content">
+ <span class="fs-3">Totalt inkl. MVA: <span id="total-sum"></span></span>
+ <span>Av dei MVA: <span id="total-tax"></span></span>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="col-12 col-lg-4" id="submit-order-wrapper">
+ <form id="submit-order-form" onsubmit="return false">
+ <div class="loader">
+ <div class="spinner-border" role="status">
+ <span class="visually-hidden">Lastar...</span>
+ </div>
+ </div>
+ <fieldset class="py-3">
+ <div class="mb-3">
+ <label for="input-name" class="form-label">Namn <span class="text-danger">&midast;</span></label>
+ <input type="text" id="input-name" class="form-control" required>
+ </div>
+ <div class="row mb-3">
+ <div class="col">
+ <label for="input-phone" class="form-label">Telefon <span class="text-danger">&midast;</span></label>
+ <input type="tel" inputmode="tel" id="input-phone" class="form-control" required>
+ </div>
+ <div class="col">
+ <label for="input-email" class="form-label">E-postadresse <span class="text-danger">&midast;</span></label>
+ <input type="email" inputmode="email" id="input-email" class="form-control" required>
+ </div>
+ </div>
+ <label for="input-comment" class="form-label">Anna informasjon</label>
+ <textarea class="form-control" id="input-comment" rows="3"></textarea>
+ </fieldset>
+ <ul id="form-errors" class="alert alert-danger py-3 ps-5 d-none"></ul>
+ <fieldset class="py-3">
+ <legend>Betal med</legend>
+ <div class="nav nav-pills nav-fill" role="tablist">
+ <a class="nav-link active" id="vipps-tab-buttom" data-bs-toggle="tab" href="#vipps-tab" role="tab" aria-controls="vipps-tab" aria-selected="true">Vipps</a>
+ <a class="nav-link ms-sm-0 ms-md-2" id="invoice-tab-buttom" data-bs-toggle="tab" href="#invoice-tab" role="tab" aria-controls="invoice-tab" aria-selected="false">Faktura på mail</a>
+ </div>
+ <div class="tab-content">
+ <div class="tab-pane py-3 active" id="vipps-tab" role="tabpanel">
+ <p>Gå til vipps for å fullføre betalinga</p>
+ <div class="form-check mb-3">
+ <input class="form-check-input" type="checkbox" value="" id="vipps-terms-confirm" required>
+ <label class="form-check-label" for="vipps-terms-confirm">
+ Eg samtykker til <a href="/vilkår">salsvilkårane</a> og <a href="/personvern">personvernerklæringa.</a>
+ </label>
+ </div>
+ <div class="d-flex justify-content-end">
+ <button class="btn btn-link shadow-none submit-vipps">
+ <img src="/assets/profile/vipps_button.png" alt="Fortsett med vipps">
+ </button>
+ </div>
+ </div>
+ <div class="tab-pane py-3" id="invoice-tab" role="tabpanel">
+ <p>Du får tilsendt faktura på mail til <span id="invoice-mail">e-postadressa di</span></p>
+ <div class="form-check mb-3">
+ <input class="form-check-input" type="checkbox" id="invoice-terms-confirm" required>
+ <label class="form-check-label" for="invoice-terms-confirm">
+ Eg samtykker til <a href="/vilkår">salsvilkårane</a> og <a href="/personvern">personvernerklæringa.</a>
+ </label>
+ </div>
+ <div class="d-flex justify-content-end">
+ <button class="btn btn-primary btn-lg shadow-none submit-invoice">Send bestilling</button>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </form>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/src/Pages/Handlekorg.cshtml.cs b/src/Pages/Handlekorg.cshtml.cs
new file mode 100644
index 0000000..02f72a7
--- /dev/null
+++ b/src/Pages/Handlekorg.cshtml.cs
@@ -0,0 +1,8 @@
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace VSH.Pages;
+
+public class Handlekorg : PageModel
+{
+ public void OnGet() { }
+} \ No newline at end of file
diff --git a/src/Pages/Index.cshtml b/src/Pages/Index.cshtml
new file mode 100644
index 0000000..aa23602
--- /dev/null
+++ b/src/Pages/Index.cshtml
@@ -0,0 +1,41 @@
+@page
+@using Microsoft.Extensions.Localization
+@inject IStringLocalizer<SharedPageResources> Localizer;
+@model IndexModel
+@{
+ ViewData["Title"] = Localizer["Forsida"];
+}
+
+@section Head {
+ <style>
+ #body-wrapper {
+ overflow-x: hidden;
+ }
+ </style>
+}
+
+<div class="my-2" id="frontpage-image">
+ <svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1283 471.46">
+ <defs>
+ <style>.cls-12,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-8,.cls-9{fill:none;stroke:#ee741e;stroke-miterlimit:10}.cls-2{stroke-width:.93px}.cls-8,.cls-9{stroke-width:.94px}.cls-12,.cls-14,.cls-15{stroke-width:.95px}.cls-16{stroke-width:.98px}.cls-17{stroke-width:1px}.cls-18{fill:#ee741e}</style>
+ </defs><path fill="#fff" d="M0 0h1283v471.46H0z"/><path class="cls-2" d="M561.56 286.96l394.6-2.79M561.56 295.34l395.53-.93M235.82 418.65v6.52l155.42 4.65v-6.58l-155.42-4.59zM325.16 396.32l-89.34 22.33M391.24 422.96l89.81-34.55M391.71 429.36l72.59-28.85M464.72 396.32v7.83h63.77v-7l-63.77-.83zM482.91 383.75v8.71M392.17 387.48l88.49.63"/><path class="cls-2" d="M351.91 375.61v-3.38l24.2-3.37v2.44l25.45.35a.12.12 0 010 .23L378 382.82l-33.5-4.65c-.16 0-.16-.9 0-.93l31.64-5.94" transform="translate(1.64)"/><path class="cls-2" d="M326.56 350.25v46.07h5.06v-2.31l9.83 1.84v3.72l3.72.93 8.38-2.79V379.31"/><path stroke-width=".89" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M340.99 369.79l-9.31-1.86v19.28l9.31 2.54v-19.96z"/><path class="cls-2" d="M347.86 367.93l33.83-4.65s4.66-17.68-11.16-16.75-22.07 3.47-22.67 12 0 9.4 0 9.4z" transform="translate(1.64)"/><path class="cls-2" d="M352.45 365.14l25.5-3.51s3.51-13.33-8.42-12.63-16.63 2.62-17.08 9 0 7.14 0 7.14zM358.43 322.33V340s-25.13-3.72-37.23 7.45l20.47 3.79s17.49-17.82 44.11-4.76" transform="translate(1.64)"/><path class="cls-2" d="M368.82 322.33v19.38"/><path class="cls-2" d="M355.63 314.88h13.54a.41.41 0 00.21-.76c-2.2-1.3-7.52-3.45-14.2.76" transform="translate(1.64)"/><path class="cls-2" d="M360.06 315.81l-1.91 6.52h12.06l-1.77-7.45"/><path class="cls-2" d="M383.55 380s.53 2.27 4 7.18.67 23.53.67 23.53h-5.88s3-15.93.72-21c-1.78-3.6-2.29-3.19-2.29-3.19s1.28 1.89 1.57 7.46a108.72 108.72 0 01-.64 13.94l-4.65.78v-20.29c0-5.59-1.86-1.86-8.38 1.86-7.44 7.44-.93 21.4-.93 21.4s-5.58.93-6.51.93c-3.72-17.68 0-25.12 4.65-27s4.66-3.72 4.66-3.72" transform="translate(1.64)"/><path class="cls-2" d="M339.59 306.51l217.78-.93v1.86l-217.78.98v-1.91zM339.59 306.51l92.14-35.37 129.36-.93"/><path class="cls-2" d="M562.95 217.16l-1.86 85.62h8.38l-4.16 3.73v5.89h-218.1v-3.98M407.53 370.72v-55.04h38.27l-1.06 55.04h-37.21z"/><path class="cls-2" d="M402.41 373.05v-57.37h48.05l-1.34 57.37h-46.71zM547.13 378.17l-151.7-2.79M553.36 312.4v70.5l138.03 3.65M536.22 389.34l151.44 4.65-1.56 2.33 49.96.46-2.16-7.03 18.91.69M535.97 396.32l149.83 4.18.3-4.18"/><path class="cls-2" d="M736.06 396.78l10-.46 2.78 9.36-218.46-7.97"/><path class="cls-2" d="M748.84 405.68v6.88l-218.46-8.33v-6.52l5.59-1.39.25-6.98 10.91-5.23v-5.94l-18.64 6.42v9.66l-49.3-1.93M617.86 264.63h-19.54v-35.37h19.54v35.37zM639.27 264.63H619.72v-35.37h19.55v35.37zM629.7 229.73v34.43M619.72 240.87h19.08M619.87 252.44l18.93.01M608.3 229.73v34.43M598.32 240.87h19.08M598.32 252.44l19.08.01M591.8 224.61l.93 2.79h51.97l1.08-2.79H591.8zM594.33 227.4v39.52h2.88V227.4M640.87 227.4v39.52h2.88V227.4M591.8 266.92h53.98v2.24l-53.98.53v-2.77zM730.77 261.78h-20.32v-35.36h20.32v35.36zM753.02 261.78H732.7v-35.36h20.32v35.36zM743.07 226.88v34.44M732.7 238.03h19.83M732.85 249.59l19.68.02M720.82 226.88v34.44M710.45 238.03h19.83M710.45 249.59l19.83.02M703.68 221.76l.96 2.8h54.02l1.13-2.8h-56.11zM706.31 224.56v39.51h2.99v-39.51M754.68 224.56v39.51h2.99v-39.51M703.68 264.07h56.11v2.24l-56.11.54v-2.78zM858.65 260.7h-22v-36.42h22v36.42zM882.75 260.7h-22v-36.42h22v36.42zM871.98 224.76v35.46M860.75 236.24h21.48M860.92 248.15l21.31.01M847.88 224.76v35.46M836.65 236.24h21.48M836.65 248.15l21.48.01M829.32 219.49l1.05 2.87h58.49l1.23-2.87h-60.77zM832.16 222.36v40.7h3.25v-40.7M884.55 222.36v40.7h3.24v-40.7M829.32 263.06h60.77v2.31l-60.77.55v-2.86zM735.13 314.88h18.61v41.88h-18.61zM744.43 314.88l.35 41.88M735.13 325.28h18.61M735.13 335.31h18.61M735.13 345.13h18.61M755.6 314.88h18.61v41.88H755.6zM764.91 314.88l.35 41.88M755.6 325.28h18.62M755.6 335.31h18.62M755.6 345.13h18.62"/><path class="cls-2" d="M732.34 313.02h44.67v45.6h-44.67zM596.23 314.75h16.39v38.89h-16.39zM604.43 314.75l.3 38.89M596.23 324.41h16.39M596.23 333.72h16.39M596.23 342.84h16.39M614.26 314.75h16.39v38.89h-16.39zM622.46 314.75l.3 38.89M614.26 324.41h16.39M614.26 333.72h16.39M614.26 342.84h16.39"/><path class="cls-2" d="M594.6 313.02h37.69v42.35H594.6zM855.29 317.67h19.63v41.88h-19.63zM865.1 317.67l.36 41.89M855.29 328.08h19.62M855.29 338.11h19.62M855.29 347.92h19.62M876.87 317.67h19.63v41.88h-19.63zM886.69 317.67l.36 41.89M876.87 328.08h19.63M876.87 338.11h19.63M876.87 347.92h19.63"/><path class="cls-2" d="M853.32 315.81h45.14v45.6h-45.14zM696.97 313.95h22.34v49.33h-22.34z"/><path class="cls-2" d="M692.32 310.23h31.64v67.94h-31.64zM692.32 378.17h31.64v8.38h-31.64zM695.06 386.55l-3.67 4.78 27.92-.13-1.63-4.65M730.47 306.51h13.03v4.65h-13.03z"/><circle class="cls-2" cx="722.1" cy="340.01" r=".93"/><path class="cls-2" d="M720.46 342.8v1.87a.93.93 0 01-.93.93h-4.65v-.94h5.58" transform="translate(1.64)"/><path class="cls-2" d="M688.65 386.47v-79.96h39.27v82.43"/><path class="cls-2" d="M751.3 373.52h14.34a.09.09 0 01.08.14c-.9 1.08-6.79 7.51-14.46-.05a.05.05 0 01.04-.09z" transform="translate(1.64)"/><path class="cls-2" d="M765.83 373.52s.23 1.86-.7 18.61c-8.37 4.65-14-1.69-14-1.69v-16.92" transform="translate(1.64)"/><path class="cls-2" d="M385.26 346.49v24.91M345.17 351.18v48.86"/><path class="cls-2" d="M749.31 185.52L904.73 179l79.11 14.89L816 199.48l-294.52 8.37 52-16.7 157.81-4.6" transform="translate(1.64)"/><path stroke-width="1.03" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M732.8 156.42l17.02.25 1.13 32.57H732.8v-32.82z"/><path class="cls-2" d="M526.66 210.65v4.73l458.82-14.08v-4.27l-458.82 13.62z"/><path class="cls-2" d="M961.16 202.04l24.32 5.81 6.52-13.02-9.64-1.52M522.93 207.85v8.95l3.73 1.57v4.55l18.94-7.53M569.47 302.78l387.16-.93-1.86-99.58"/><path class="cls-2" d="M947.54 301.85c.39.93-.38 94.93-.38 94.93l-182-4.65" transform="translate(1.64)"/><path class="cls-2" d="M939.88 396.78l.93 13.03-165.11-3.43M956.69 288.36l103.93 27.45-2.99 8.6-101.13-28.37M1028.18 316.74l6.63 89.35-49.33 1.78M1031.15 405.84v10.14M562.84 222.36l391.86-9.53M561.56 275.79l394.07-2.47M562.68 229.73l31.45-.47M643.75 229.26l62.99-.93M757.67 226.88l73.91-2.12M887.79 224.28l66.91-1.92M562.68 239.03l31.45-.46M643.75 238.57l62.99-.93M757.67 236.19l73.91-2.12M887.79 233.59l66.91-1.92M562.68 250.2l31.45-.46M643.75 249.74l62.99-.94M757.67 247.36l73.91-2.13M887.79 244.76l66.91-1.92M562.68 260.44l31.45-.47M643.75 259.97l62.99-.93M757.67 257.6l73.91-2.13M887.79 254.99l66.91-1.91"/><path stroke-width=".92" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M561.75 268.81l30.52-.46M645.32 268.35l184.27-2.79"/><path stroke-width=".91" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M890.09 263.37l64.61-1.92"/><path class="cls-2" d="M574.06 302.78v80.62M580.32 302.78v80.47M587.43 302.74v80.66M559.84 312.56v70.69M566.96 305.11v78.29M634.55 302.78l.06 82.37M640.81 302.78v82.37M647.93 302.74v82.41M655.03 302.78v83.3M661.29 302.78v83.3M668.4 302.74v83.34M674.57 302.78v83.3M680.83 302.78v83.3M594.53 355.38v28.84M600.79 355.38v28.78M607.91 355.37v28.85M615.01 355.38v28.84M621.27 355.38v28.78M628.1 355.37v29.78M594.53 302.75v9.81M600.79 302.75v9.79M607.91 302.74v9.82M615.01 302.75v9.81M621.27 302.75v9.79M628.38 302.74v9.82M802.07 301.86v90.73"/><path class="cls-8" d="M808.33 301.86v91.49M815.45 301.81v91.72M822.55 301.86v91.67"/><path class="cls-9" d="M828.81 301.86v91.67"/><path class="cls-8" d="M835.92 301.81v91.72"/><path stroke-width=".94" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M842.09 301.86v91.67"/><path class="cls-9" d="M848.35 301.86v91.67"/><path class="cls-2" d="M855.47 301.81v13.54M780.67 302.32v90.27M787.86 302.32v90.11M794.97 302.32v90.27M755.54 358.16v14.89M762.73 358.18v14.87M769.84 359.09v32.57M775.08 359.11v33.48M734.14 359.09v30.71M741.33 359.09v30.66M748.44 358.16v31.64M757.4 302.32v10.24M764.59 302.32v10.24M771.71 302.62v10.57M736 302.62v3.42M743.19 302.62v4.35M750.3 302.32v10.26M882.11 301.82v13.53M888.37 301.82v13.5M895.49 301.81v13.54M902.59 301.86v93.53M908.85 301.86v93.35M915.96 301.81v93.58M922.13 301.86v94.46M928.39 301.86v94.28M935.51 301.81v94.51M943.88 301.81v94.51M861.64 301.96v13.39M867.9 301.96v13.36M875.01 301.95v13.4"/><path stroke-width=".95" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M855.47 360.95v33.51"/><path class="cls-12" d="M882.11 361.9v33.49"/><path stroke-width=".95" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M888.37 361.88v33.45"/><path class="cls-12" d="M895.49 361.88v33.51"/><path class="cls-14" d="M861.64 360.97v33.49M867.9 360.97v33.42M875.01 360.95v33.51"/><path class="cls-2" d="M516.82 364.18v-7.39s3.72-4.71 7.45-4.71 6.51 2.79 5.58 4.66-.93 7.44-.93 7.44a15.35 15.35 0 01-12.1 0z" transform="translate(1.64)"/><path class="cls-2" d="M516.82 365.42V377s6.52 2.09 12.1.23v-13M523.43 363s2.7.3 2.7-.63-1.68-2.49-2.7-1.71 0 2.34 0 2.34z" transform="translate(1.64)"/><path class="cls-15" d="M407.53 358.53h37.44M374.65 313.02v29.24M382.56 312.4v32.03M390.91 312.56v58.9M399.29 312.56v58.9"/><path class="cls-2" d="M454.99 312.09l-1.72 63.75M463.37 313.02l-1.73 63.75"/><path class="cls-16" d="M480.12 313.02l-1.72 63.75M471.75 313.02l-1.73 63.75M489.43 313.02l-1.73 63.75"/><path class="cls-17" d="M497.81 312.56l-1.73 65.14M514.56 312.56l-1.73 65.14M506.18 312.56l-1.73 65.14"/><path class="cls-2" d="M521.7 312.4v41.24M530.38 312.4l-.5 40.88M537.35 312.4l-1.13 65.3M545.89 312.09l-1.71 66.02M552.01 312.4v70.85l1.99-.33M960.96 297.29l1.25 87.86M975.68 301.42l-.44 93.04M990.45 305.56v102.31M1004.09 309.3l1.87 98.19M1016.51 313.01l3.41 94.01"/><path class="cls-2" d="M946 414.88q-3.35-10.53-6.36-21.17c4.91 5.55 5.88 13.66 10.36 19.56l-3.44-19.6a3.29 3.29 0 01.27-2.59c1.35 1.32 1.7 3.33 2.06 5.18a82.64 82.64 0 004.21 14.63 3 3 0 001.51 1.94c1.26-7.83-.92-15.83-.32-23.74.55 7.4 1.13 14.89 3.38 22a6.86 6.86 0 00.91-2.43l3-12.65a142 142 0 01-1.91 16.43l5.72-13c.82 4.36-1.47 8.78-1.09 13.21 1.13-1 1.53-2.57 2-4a25.27 25.27 0 014.37-8L967.14 415q4.1-5.27 8.52-10.26c.77 3.36-2 6.57-2 10l6.72-7.18c.75 1.66-.51 3.5-.8 5.3a1.58 1.58 0 000 .78c.35.94 1.73.7 2.68.35a13 13 0 016.58-.85c1.41.23 2.76.77 4.16 1.05a5.59 5.59 0 004.16-.49M944.75 412.93c-1.78-1.88-2.28-4.64-3.82-6.73-.41-.56-1.08-1.11-1.73-.85s-.73 1.14-.71 1.85l.08 2.86c0 .54 0 1.17-.48 1.45a1.19 1.19 0 01-.79.1 6.29 6.29 0 01-1.59-.66 2.57 2.57 0 00-1.66-.32 1.12 1.12 0 00-.9 1.26 1.54 1.54 0 001.14.86 14.76 14.76 0 005.18.22c-1.48.42-3.07.25-4.56.61a30.28 30.28 0 00-2.93 1.09c-2.94 1-6.17.74-9.27.44" transform="translate(1.64)"/><path class="cls-2" d="M947.83 414.31a33.48 33.48 0 01-1.49-6.59l-1.42-9.13c.32 0 .56.29.73.58a25.08 25.08 0 012.5 5.16c.41 1.35.59 2.77 1 4.11.54 1.66 1.48 3.2 1.73 4.93.29-5.67.6-11.35 1.38-17q1.37 5.67 2.47 11.4c.35 1.82.73 3.74 2 5.1 2-4.4 2.17-9.35 2.35-14.17.29 2.29.2 4.62.33 6.92a14.84 14.84 0 001.68 6.66 27.13 27.13 0 003.15-9.25l-.47 7.9a9.64 9.64 0 00.09 2.63 3.53 3.53 0 001.77-1.76c1.25-2.22 2-4.8 3.77-6.6a59.09 59.09 0 00-1.52 9.25 6.7 6.7 0 002-2.44q1.43-2.43 2.82-4.87a55.44 55.44 0 01-1 7.48M977.47 408.1a30.9 30.9 0 004.12-7.81c.46.54.94 1.06 1.45 1.55a2.82 2.82 0 001.11.74 1.67 1.67 0 001.89-1.21 2.37 2.37 0 00-.73-2.25 4.14 4.14 0 00-2.23-1 5.93 5.93 0 002.69-1.92 2 2 0 00-.55-2.91 2.22 2.22 0 00-2.24.53 4.05 4.05 0 00-1.4 2.76 3.16 3.16 0 00-1.69-1.44 2.62 2.62 0 00-2.58 1.51 2.39 2.39 0 00-.41 1.36 2 2 0 001.59 1.59 5.74 5.74 0 002.4-.14" transform="translate(1.64)"/><path class="cls-2" d="M971.64 406.82a43.28 43.28 0 003.46-8.65 4.59 4.59 0 01.75-1.93c.22-.26.49-.46.72-.7a2.81 2.81 0 00.78-2 1.32 1.32 0 00-.14-.65c-.4-.65-1.4-.42-2 0a5.88 5.88 0 00-2 2.5 3.57 3.57 0 00-2.72-1.69 1.63 1.63 0 00-1.62.65c-.39.71.16 1.59.81 2.07a4.73 4.73 0 003.82.81" transform="translate(1.64)"/><path class="cls-2" d="M963.59 401.9c.53-2.47 2.15-4.58 2.73-7a22.71 22.71 0 01.71-3.17c.31-.76.83-1.57.56-2.35a1.6 1.6 0 00-2.39-.56 2.69 2.69 0 00-.88 2.57 2.07 2.07 0 00-2.62-.2 1.6 1.6 0 000 2.46c.83.56 1.94.07 2.82-.42l3.11-1.75a4.1 4.1 0 011.33-.56 1.39 1.39 0 011.31.43c.54.7 0 1.71-.7 2.25a3 3 0 01-2 .72A1.76 1.76 0 01966 393M959 400.58l.28-10a2.13 2.13 0 002.34-1.35 6.17 6.17 0 00.29-2.9 2.41 2.41 0 00-.22-1 .83.83 0 00-.86-.46 1.07 1.07 0 00-.53.41 5.66 5.66 0 00-.66 3.71 6.35 6.35 0 00-2.21-3.3c-.3-.22-.74-.41-1-.15a.81.81 0 00-.13.63 6 6 0 001.75 3.57 1.37 1.37 0 00-1.49-1.16 2.6 2.6 0 00-1.75 1.07 1 1 0 00-.27.94 1 1 0 00.73.48 6.5 6.5 0 003.19 0M749.35 407.26q-1.61-3.75-2.83-7.64a17.35 17.35 0 012.34 6.77c.72-2.11.18-4.69 1.58-6.43l.29 7.35a19.69 19.69 0 013-5.28 6.47 6.47 0 01-1.31 2.32 3.32 3.32 0 00-.77 2.49 27.28 27.28 0 015.82-2.08l-1.28 2.39a4.22 4.22 0 011.4-1.64 1.47 1.47 0 012 .31c.11.18.16.38.28.55.4.59 1.31.48 1.93.13a6.34 6.34 0 011.85-1c.89-.18 1.75.37 2.66.49 1.25.18 2.51-.47 3.77-.31.76.1 1.46.49 2.22.65 1.93.39 3.9-.78 5.86-.55a19.88 19.88 0 012.71.77 14.72 14.72 0 003 .38l5.11.29" transform="translate(1.64)"/><path class="cls-2" d="M780.12 407.83c-1.9-.75-4-.4-6.06-.51a29.3 29.3 0 00-3.37-.2 18.26 18.26 0 00-4.33 1.11 26.24 26.24 0 01-4.87 1M749.51 404.89a26.24 26.24 0 01-.52-7.29 2.83 2.83 0 01.9-2.22c1.15-.78 3 .28 4-.65a1.56 1.56 0 000-2.2 2.12 2.12 0 00-2.3-.33 3.49 3.49 0 00-1.68 1.75 7.58 7.58 0 00-.31-2.68 3.26 3.26 0 00-.81-1.48 1.58 1.58 0 00-1.56-.44 2 2 0 00-1 2.27 4.37 4.37 0 002.12 3.1 5.29 5.29 0 00-3.34-1.07 2.68 2.68 0 00-1.92.73 1.39 1.39 0 00-.07 1.89 2 2 0 001.35.42 11.89 11.89 0 003.36-.39M458.36 408.52a15.77 15.77 0 003.21-8.77 37.41 37.41 0 01-3.36 6.19l-.72-2.9c-.89 1-.64 3-1.88 3.52-1 .48-2.58-.37-3.27.54-.5.65-.12 1.09-.92 1.25-.41.08-1.62-.74-2-.92l-4-1.85c-.48-.22-1.05-.64-.88-1.14a.84.84 0 01.4-.43c1.17-.67 2.62.11 3.69.93s2.33 1.76 3.63 1.4a.75.75 0 00.35-.19.92.92 0 00.13-.7 12.83 12.83 0 01.54-4.69c.78 2.07.48 6.29-1.26 7.9s-5.39 2-7.44 2.76l-6.69 2.37a31.42 31.42 0 01-4.74 1.4M280 432.39c-2.64-1.48-5.84-1.64-8.86-1.36s-6 1-9 1.09c-5.8.2-11.55-1.81-17.34-1.36a38.31 38.31 0 005.2-5.86l-5.31 5.16a17 17 0 01-.64-4.85q-.19 2.55-.6 5.07l-2.78-3.41.82 4.41c-2.08-.84-2.37-4.53-4.62-4.53l1.58 4.85a10.65 10.65 0 01-2.43-3.26c-.48.45-.45 1.21-.69 1.81s-1.23 1-1.49.41a1.37 1.37 0 010-.67c.09-1.3-1-2.33-1.6-3.48a10.37 10.37 0 01-.91-3.94l-.84-8.84c-1.54 5.31 1.21 11 .6 16.46a57.61 57.61 0 00-7.24-11.28c-.44-.54-1.15-1.11-1.74-.75.07 1.62 1.23 2.95 2.33 4.13q4.26 4.53 8.74 8.84a42.88 42.88 0 00-13.46-7.47 67.92 67.92 0 0010.92 9 37 37 0 00-7.24-3.05 12.59 12.59 0 00-7.73.19 92.59 92.59 0 0017.24 2.07c0 .73-.77 1.19-1.45 1.45-5.14 1.94-10.88 1.41-16.23 2.67a48.81 48.81 0 00-8.16 2.95M286 310.43h16.58a6.28 6.28 0 001.63-.21c2.61-.68 9.65-3.19 2-9a19.15 19.15 0 00-17.4-3.23c-3.95 1.18-7 3.41-8.27 5.38-1.47 2.3-1 3.06-.63 4.13s2.55 2.6 6.31 2.92M288.64 286.67s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M293.54 286.26s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M298 285.89s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M289.33 298.21a3.74 3.74 0 00-1.41 4.21M295.48 297.17s-3.65 1.81-2.71 5.25M300.67 298s-3.13 1.35-2.58 4.4M352.84 77.37V85l20.25-8.78v-8c-4.46-4.15-13.71-3.19-13.71-3.19l-6.54 12.28 20.09-8.93" transform="translate(1.64)"/><ellipse class="cls-2" cx="367.39" cy="67.8" rx="1.43" ry=".64"/><ellipse class="cls-2" cx="366.09" cy="75.88" rx="1.59" ry="1.43"/><ellipse class="cls-2" cx="359.58" cy="72.74" rx="1.28" ry=".48"/><path class="cls-2" d="M435.69 33.88s0 1.31-1.31 0 1.31-3.88 2.62-2.61l1.31 1.3M463.78 33.23l-6.62-2.32s-7.76-1.6-14.54 0-6.28 7.54-5 8.85l2.22 2.24c-1.73 3.5.42 7 .42 7h3.92a5.73 5.73 0 01-1.31-4 2.56 2.56 0 012.61-2.62l1.31 1.31c1.31 1.31 7.84 0 7.84 0-1.31 2.61 2.61 5.23 2.61 5.23h2.62c-1.31-1.31-1.31-9.15.74-6.54s6.87 0 6.87 0l1.53-2.62c-2.61 0-3.92-3.92-3.92-3.92" transform="translate(1.64)"/><path class="cls-2" d="M463.36 37.53s-2.44-3.51 2.71-5.45l1.52.32s-.59 2.88-2.11 2.6M564.42 35a2.56 2.56 0 01-2.62-2.61c0-1.31 1.31-2.61 3.27.65h1.31c1.3 0 1.3 0 3.91 1.84s0 3.39 0 3.39a11.48 11.48 0 00-3.91.65c-1.31.65.17 4.06-.66 6.53-.65 2-3.26 3.27-3.26 3.27s-1 5.88-.31 7.19c1 .65 1.31 3.26 1.31 3.26h-3.62v-2.64a1.28 1.28 0 01-1.3-1.31c0-1.3-1.15-5.88-1.47-5.88-4.09 2-10.29-.65-10.29-.65" transform="translate(1.64)"/><path class="cls-2" d="M546.78 49l-2 3v2.61a4.58 4.58 0 011.3 2.61 5.24 5.24 0 00.29 2l-2.9-.65s0-2.61-1.31-2.61v-2.7L540.9 52l1.3-2.62s.71-3.35-.3-4.94a4.75 4.75 0 012.92-6.81c2.48-.83 11.76 1.3 14.37 0S561.8 35 561.8 35" transform="translate(1.64)"/><rect class="cls-2" x="625.42" y="67.29" width="5.69" height="1.81" rx=".62"/><path class="cls-2" d="M623.31 76.87a2.19 2.19 0 00-2 2.17v14a2.19 2.19 0 002.18 2.18h6.26a2.19 2.19 0 002.18-2.18V79a2.19 2.19 0 00-1.57-2" transform="translate(1.64)"/><path class="cls-2" d="M633.58 93.17v-.11M626.23 69.1l-1.52 7.76M630.41 69.1l1.51 7.74.01.02M631.92 76.84l.12.12M625.47 72.98l5.31-1.98M622.96 81.68h10.63M622.96 91.93h10.62M630.48 65.22v-2.85M632.55 65.82l2.21-2M633.33 67.61l3.1.15"/><path class="cls-2" d="M654.59 155.68s3.63 5.23 8.59 2.35a3.63 3.63 0 01-2.67 4.69s-5.73-1.81-6.49-6.49-.38-12.27 9.92-14.07a17.64 17.64 0 018.33.25h.14a10.27 10.27 0 015.66 4.4c.76 1.08 1.91 5.77 1.91 5.77s-6.49 3.61-13.36.36c-7.26-2.49-8.78-3.21-12.03 2.74zM672.27 142.41s-6.37 2.91-2.58 11.61" transform="translate(1.64)"/><path class="cls-2" d="M664.15 142.12a19 19 0 00-2.09-2l-1.44-1.12s6.62-1.32 8.2 2.77" transform="translate(1.64)"/><ellipse class="cls-2" cx="676.08" cy="147.75" rx=".76" ry=".72"/><path class="cls-2" d="M275.58 202.46l.16 2.55 14.45-.72-.18-2.75-14.16.9-.27.02zM274.09 227.75l6.32 1.66-.94-14.66-3.73-9.74-1.89 8.26.24 14.48z"/><path class="cls-2" d="M274.09 227.75l3.3-2.28 2.77 3.88M276.65 213.78l.74 11.69M279.45 214.52l13.86-.89-2.92-9.36"/><path class="cls-2" d="M280.41 229.41l14.39-1.6-1.49-14.18M280.93 202.12l.17 2.55 2.84 4.5 3.44-.22-2.37-4.68.08-2.42M280.25 226.99l14.26-1.89"/><path class="cls-2" d="M284.91 218.44a2.89 2.89 0 00-3.18-.13 2.45 2.45 0 102.33 4.22 3.11 3.11 0 001.49-1.75" transform="translate(1.64)"/><ellipse class="cls-2" cx="287.66" cy="219.43" rx="2.41" ry="2.86" transform="rotate(-48.66 288.45921753 217.6128333)"/><path class="cls-2" d="M287.32 217.37l4.13 3.95M282.03 221.8l4.64-3.24"/><path class="cls-2" d="M304.82 114.56s3 1.25.9 2.75c-1.19.85-1.8 2.29 0 3.15M309.27 114.19s3 1.25.9 2.75c-1.19.85-1.8 2.29 0 3.15" transform="translate(1.64)"/><path class="cls-2" d="M302.55 124.63h12.66a.65.65 0 01.65.65v2.45h-14v-2.45a.65.65 0 01.69-.65zM303.59 123.08h10.28a.53.53 0 01.53.53v1h-11.34v-1a.53.53 0 01.53-.53z"/><path class="cls-2" d="M300.75 127.73l.28 2.52 1.36 12a.5.5 0 00.49.44h8.61a.5.5 0 00.49-.44l1.7-14.54" transform="translate(1.64)"/><path class="cls-2" d="M315.03 130.26h-12.36M303.42 136.91h10.83"/><path class="cls-18" d="M394.18 150.93h1.24l3.43 10.23 3.43-10.23h1.24l-4.12 11.9h-1.1zM405.32 150.93h1.18v11.9h-1.18zm.81 0H413V152h-6.83zm0 5.44h5.93v1.1h-5.93zm0 5.36H413v1.1h-6.83zM415.33 150.93h1.18v11.9h-1.18zm.84 10.8H423v1.1h-6.8zM424.94 150.93h1.17v11.9h-1.17zm.57 8.27l6.52-8.27h1.52l-7.55 9.18zm3.35-2.72l.68-1.22 4.51 7.57h-1.41zM436.86 162.44a3.43 3.43 0 01-1.42-1.5 5.25 5.25 0 01-.49-2.37v-3.37a5.26 5.26 0 01.49-2.38 3.36 3.36 0 011.42-1.49 5.19 5.19 0 014.53 0 3.43 3.43 0 011.43 1.49 5.4 5.4 0 01.49 2.38v3.37a5.38 5.38 0 01-.49 2.37 3.51 3.51 0 01-1.43 1.5 5.28 5.28 0 01-4.53 0zm3.89-1a2.5 2.5 0 001-1.1 4 4 0 00.35-1.75v-3.48a4 4 0 00-.35-1.75 2.5 2.5 0 00-1-1.1 3.66 3.66 0 00-3.25 0 2.42 2.42 0 00-1 1.1 3.9 3.9 0 00-.36 1.75v3.48a3.87 3.87 0 00.36 1.75 2.42 2.42 0 001 1.1 3.66 3.66 0 003.25 0zM454.72 150.93H456v11.9h-1.18v-10.22l.13.52-3.59 8.05h-.83l-3.58-7.88.12-.69v10.22h-1.18v-11.9h1.24l3.82 8.59zM467.77 150.93H469v11.9h-1.18v-10.22l.12.52-3.58 8.05h-.84L460 153.3l.12-.69v10.22h-1.22v-11.9h1.23l3.82 8.59zM472 150.93h1.18v11.9H472zm.81 0h6.83V152h-6.83zm0 5.44h5.93v1.1h-5.93zm0 5.36h6.83v1.1h-6.83zM482 150.93h1.19l6.9 10.72-.48-.33v-10.39h1.18v11.89h-1.2L482.5 152l.64.47v10.33H482zM493.82 161.49h1.34v1.34h-1.34zm.08-10.56h1.17v9.17h-1.17zM394.91 180.47h.79v7.92h-.79zm.55 0h4.44v.73h-4.44zm0 3.69h3.84v.73h-3.84zM401.27 180.46h.78v7.93h-.78zm.48 3.85h2.71a1.67 1.67 0 00.78-.19 1.35 1.35 0 00.51-.55 1.68 1.68 0 00.19-.82 1.8 1.8 0 00-.18-.82 1.38 1.38 0 00-.52-.55 1.61 1.61 0 00-.78-.19h-2.71v-.73h2.66a2.46 2.46 0 011.21.28 2 2 0 01.81.81 2.48 2.48 0 01.29 1.2 2.45 2.45 0 01-.29 1.2 2 2 0 01-.81.81 2.49 2.49 0 01-1.21.28h-2.66zm2.54.49l.73-.26 2 3.85h-.94zM408.55 180.47h.78v7.92h-.78zm.54 0h4.55v.73h-4.55zm0 3.62h4v.73h-4zm0 3.57h4.55v.73h-4.55zM415.22 180.47h.78v7.92h-.79zm.76 7.19h1.79a2.36 2.36 0 001.65-.51 2.06 2.06 0 00.55-1.55v-2.34a2.06 2.06 0 00-.55-1.55 2.36 2.36 0 00-1.65-.51H416v-.73h1.76a4 4 0 011.68.31 2.1 2.1 0 011 .95 3.36 3.36 0 01.33 1.58v2.24a3.36 3.36 0 01-.33 1.58 2.17 2.17 0 01-1 1 4 4 0 01-1.68.31H416zM424.38 180.47h.95l2.93 7.92h-.88l-2.52-7.1-2.53 7.1h-.87zm-1.57 5.27H427v.73h-4.17zM434.44 184.34v1.17a3.83 3.83 0 01-.31 1.65 2.06 2.06 0 01-.92 1 3.26 3.26 0 01-1.55.33 3.47 3.47 0 01-1.56-.32 2 2 0 01-.93-.92 3.44 3.44 0 01-.31-1.56v-2.34a3.91 3.91 0 01.3-1.64 2.13 2.13 0 01.93-1 3.22 3.22 0 011.54-.33 3 3 0 011.33.27 2.21 2.21 0 01.91.78 3.55 3.55 0 01.5 1.31h-.85a2.72 2.72 0 00-.39-.91 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.33 2.33 0 00-1.11.25 1.64 1.64 0 00-.66.74 3 3 0 00-.22 1.24v2.34a2.71 2.71 0 00.22 1.15 1.51 1.51 0 00.68.69 2.48 2.48 0 001.12.22 2.2 2.2 0 001.09-.23 1.52 1.52 0 00.65-.72 3.25 3.25 0 00.21-1.26v-.46h-1.92v-.73zM441 188.39h-.79v-7.26l-1.45.91v-.82l1.13-.75H441zM442.67 187.76l3-3.91a3.37 3.37 0 00.46-.75 1.76 1.76 0 00.16-.65 1.27 1.27 0 00-.37-1 1.43 1.43 0 00-1-.35 1.41 1.41 0 00-1 .38 1.71 1.71 0 00-.47 1h-.82a3.11 3.11 0 01.4-1.17 2 2 0 01.78-.73 2.33 2.33 0 011.11-.26 2.64 2.64 0 011.21.25 1.62 1.62 0 01.76.7 2.19 2.19 0 01.27 1.12 2.23 2.23 0 01-.22.85 4.79 4.79 0 01-.6 1l-2.63 3.37h3.49v.73h-4.47zM452.28 185.19v.73h-3.67v-.73zM455.66 188.39h-.78v-7.26l-1.46.91v-.82l1.13-.75h1.11zM460.6 184.46v.19a.74.74 0 01-.45.37 2.26 2.26 0 01-.77.12 2.06 2.06 0 01-1.09-.29 1.89 1.89 0 01-.72-.81 2.8 2.8 0 01-.26-1.22 3.06 3.06 0 01.26-1.31 1.76 1.76 0 01.76-.83 2.61 2.61 0 012.39 0 1.91 1.91 0 01.75.84 3 3 0 01.26 1.33 3.7 3.7 0 01-.11.91 5.1 5.1 0 01-.31 1l-.06.14a1 1 0 00-.07.15l-1.69 3.39h-.88zm0-.49a1.79 1.79 0 00.37-1.2 1.77 1.77 0 00-.38-1.21 1.47 1.47 0 00-2.1 0 1.77 1.77 0 00-.38 1.21 1.73 1.73 0 00.38 1.19 1.51 1.51 0 002.11 0zM394.91 193.87h.79v7.93h-.79zm.56 7.2H400v.73h-4.54zM403.59 193.87h.94l2.93 7.93h-.87l-2.53-7.11-2.52 7.11h-.88zm-1.59 5.27h4.17v.73H402zM409.34 201.56a2.06 2.06 0 01-.92-1 3.61 3.61 0 01-.31-1.61v-5.11h.79V199a2.18 2.18 0 00.49 1.56 2 2 0 001.5.52 2 2 0 001.51-.52 2.18 2.18 0 00.5-1.56v-5.15h.78V199a3.76 3.76 0 01-.3 1.61 2.13 2.13 0 01-.93 1 3.47 3.47 0 01-1.56.32 3.39 3.39 0 01-1.55-.37zM415.43 193.86h.78v7.94h-.78zm.48 3.85h2.71a1.55 1.55 0 00.78-.19 1.29 1.29 0 00.51-.55 1.68 1.68 0 00.19-.82 1.8 1.8 0 00-.18-.82 1.23 1.23 0 00-.52-.54 1.51 1.51 0 00-.78-.2h-2.71v-.73h2.67a2.45 2.45 0 011.2.29 1.89 1.89 0 01.81.8 2.48 2.48 0 01.29 1.2 2.42 2.42 0 01-.29 1.2 2 2 0 01-.81.81 2.47 2.47 0 01-1.2.28h-2.67zm2.55.49l.72-.25 2 3.85h-.94zM422.71 193.87h.78v7.93h-.78zm.75 7.2h1.8a2.36 2.36 0 001.65-.52 2 2 0 00.54-1.55v-2.34a2.06 2.06 0 00-.54-1.55 2.36 2.36 0 00-1.65-.51h-1.8v-.73h1.76a3.91 3.91 0 011.68.31 2.08 2.08 0 011 .95 3.39 3.39 0 01.33 1.58V199a3.24 3.24 0 01-.34 1.58 2.1 2.1 0 01-1 .95 4 4 0 01-1.68.32h-1.76zM431.87 193.87h.95l2.92 7.93h-.87l-2.52-7.11-2.53 7.11H429zm-1.57 5.27h4.17v.73h-4.17zM441.93 197.74v1.17a4 4 0 01-.31 1.65 2.11 2.11 0 01-.92 1 3.29 3.29 0 01-1.55.33 3.61 3.61 0 01-1.56-.31 2.06 2.06 0 01-.94-.93 3.56 3.56 0 01-.31-1.55v-2.34a4 4 0 01.31-1.65 2.08 2.08 0 01.93-1 3.23 3.23 0 011.54-.32 3 3 0 011.32.26 2.09 2.09 0 01.91.78 3.39 3.39 0 01.51 1.31H441a2.87 2.87 0 00-.39-.9 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.34 2.34 0 00-1.11.24 1.62 1.62 0 00-.66.75 3 3 0 00-.22 1.24v2.34a2.55 2.55 0 00.22 1.14 1.47 1.47 0 00.68.69 2.45 2.45 0 001.12.23 2.23 2.23 0 001.09-.24 1.42 1.42 0 00.64-.72 3.06 3.06 0 00.22-1.26v-.46h-1.92v-.73zM448.48 201.8h-.79v-7.27l-1.45.91v-.82l1.12-.75h1.12zM450.16 201.16l3-3.91a3.31 3.31 0 00.45-.75 1.58 1.58 0 00.16-.65 1.3 1.3 0 00-.36-1 1.44 1.44 0 00-1-.34 1.38 1.38 0 00-1 .37 1.71 1.71 0 00-.47 1.05h-.82a2.85 2.85 0 01.4-1.16 2 2 0 01.78-.74 2.33 2.33 0 011.11-.25 2.81 2.81 0 011.21.24 1.67 1.67 0 01.76.7 2.21 2.21 0 01.26 1.12 2.19 2.19 0 01-.21.85 5.5 5.5 0 01-.6 1l-2.63 3.38h3.49v.73h-4.47zM459.76 198.59v.73h-3.66v-.73zM463.15 201.8h-.78v-7.27l-1.46.91v-.82l1.13-.75h1.11zM469.05 194.53L467 201.8h-.86l2.09-7.2h-2.71v1.46h-.79v-2.19h4.32zM396.21 215.17a3.68 3.68 0 01-.95-.33 3.75 3.75 0 01-.84-.54l.48-.62a3.47 3.47 0 001.09.65 3.71 3.71 0 001.31.22 2.67 2.67 0 001.58-.41 1.3 1.3 0 00.56-1.13 1 1 0 00-.25-.72 1.5 1.5 0 00-.62-.41 7.84 7.84 0 00-1-.25h-.24a8.26 8.26 0 01-1.33-.33 1.94 1.94 0 01-.86-.58 1.75 1.75 0 01-.35-1.15 2.32 2.32 0 01.33-1.26 2.1 2.1 0 011-.79 3.86 3.86 0 011.52-.27 4 4 0 01.84.09 4.28 4.28 0 01.81.27 5 5 0 01.79.47l-.46.61a4.34 4.34 0 00-1-.54 3 3 0 00-1-.17 2.39 2.39 0 00-1.5.41 1.35 1.35 0 00-.54 1.15.93.93 0 00.27.71 1.66 1.66 0 00.66.38 9.36 9.36 0 001.09.26h.18a8.4 8.4 0 011.24.35 2 2 0 01.83.62 1.74 1.74 0 01.33 1.12 2.15 2.15 0 01-.34 1.24 2.1 2.1 0 01-1 .79 4.09 4.09 0 01-1.57.27 5.44 5.44 0 01-1.06-.11zM402.7 215a2.13 2.13 0 01-.93-1 3.75 3.75 0 01-.31-1.61v-5.11h.79v5.15a2.12 2.12 0 00.5 1.56 2 2 0 001.49.52 2 2 0 001.51-.52 2.16 2.16 0 00.5-1.56v-5.15h.75v5.11a3.75 3.75 0 01-.31 1.61 2.13 2.13 0 01-.93 1 3.44 3.44 0 01-1.56.32 3.35 3.35 0 01-1.5-.32zM408.78 207.27h.79l4.61 7.14-.33-.22v-6.92h.79v7.92h-.8l-4.7-7.2.43.31v6.89h-.79zM416.6 207.27h.79v7.93h-.79zm.76 7.2h1.79a2.36 2.36 0 001.65-.52 2 2 0 00.55-1.55v-2.33a2.07 2.07 0 00-.55-1.56 2.36 2.36 0 00-1.65-.51h-1.79v-.73h1.76a4 4 0 011.68.31 2.14 2.14 0 011 .95 3.39 3.39 0 01.33 1.58v2.25a3.35 3.35 0 01-.33 1.57 2.17 2.17 0 01-1 .95 4 4 0 01-1.68.32h-1.75zM425.76 207.27h.95l2.93 7.93h-.88l-2.52-7.11-2.53 7.11h-.87zm-1.57 5.27h4.17v.73h-4.17zM435.82 211.15v1.16a3.8 3.8 0 01-.31 1.65 2.06 2.06 0 01-.92 1 3.26 3.26 0 01-1.55.33 3.47 3.47 0 01-1.56-.31 2 2 0 01-.93-.93 3.4 3.4 0 01-.31-1.55v-2.34a4 4 0 01.3-1.65 2.13 2.13 0 01.93-1 3.35 3.35 0 011.54-.32 3.07 3.07 0 011.33.26 2.21 2.21 0 01.91.78 3.62 3.62 0 01.5 1.31h-.85a2.66 2.66 0 00-.39-.9 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.34 2.34 0 00-1.11.24 1.62 1.62 0 00-.66.75 3 3 0 00-.22 1.24v2.34a2.55 2.55 0 00.22 1.14 1.47 1.47 0 00.68.69 2.48 2.48 0 001.12.23 2.2 2.2 0 001.09-.24 1.38 1.38 0 00.64-.72 3.06 3.06 0 00.22-1.26v-.45h-1.92v-.73zM442.37 215.2h-.79v-7.27l-1.45.91V208l1.12-.75h1.12zM445.05 215a1.94 1.94 0 01-.82-.68 2.33 2.33 0 01-.39-1.08h.79a1.65 1.65 0 00.27.68 1.31 1.31 0 00.55.43 1.86 1.86 0 00.77.15 1.53 1.53 0 001.1-.38 1.42 1.42 0 00.39-1.07v-.24a1.38 1.38 0 00-.38-1 1.43 1.43 0 00-1.06-.37h-.56v-.73h.56a1.38 1.38 0 001-.32 1.23 1.23 0 00.34-.91v-.24a1.28 1.28 0 00-.36-1 1.39 1.39 0 00-1-.34 1.59 1.59 0 00-.66.14 1.39 1.39 0 00-.5.41 1.76 1.76 0 00-.29.65h-.8a2.6 2.6 0 01.41-1 2 2 0 01.77-.66 2.29 2.29 0 011.06-.23 2.2 2.2 0 011.59.54 2 2 0 01.56 1.52v.24a1.83 1.83 0 01-.26 1 1.6 1.6 0 01-.75.6 1.36 1.36 0 01.84.6 2.17 2.17 0 01.3 1.19v.24a2.46 2.46 0 01-.27 1.19 1.72 1.72 0 01-.77.74 2.72 2.72 0 01-1.23.26 2.66 2.66 0 01-1.2-.33zM453.79 212v.73h-3.66V212zM457.18 215.2h-.78v-7.27l-1.46.91V208l1.13-.75h1.11zM463.07 207.93l-2 7.27h-.86l2.09-7.2h-2.71v1.47h-.79v-2.2h4.31z" transform="translate(1.64)"/><path d="M683 282.77h60.29a.18.18 0 01.18.18v10.11a5.4 5.4 0 01-5.4 5.4H677.5a.18.18 0 01-.18-.18v-9.8a5.71 5.71 0 015.68-5.71z" stroke-width="1.4" stroke="#ed7320" stroke-miterlimit="10" fill="#fff"/><path class="cls-18" d="M678.29 288.52h.76l1 3.19 1-3.19h.76l-1.45 4.39h-.61zM682.29 288.52h.71v.72h-.72zm0 1.26h.71v3.13h-.72zM683.87 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM686.91 293.5h.27a.2.2 0 00.15-.06.24.24 0 000-.18v-3.48h.73v3.58a.88.88 0 01-.2.61.74.74 0 01-.57.22h-.43zm.47-5h.73v.72h-.73zM689.55 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.78 1.78 0 01.16-.8 1.17 1.17 0 01.46-.5 1.54 1.54 0 01.73-.17 1.19 1.19 0 01.69.2 1.3 1.3 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.14v-.53h1.47a1 1 0 00-.18-.52.53.53 0 00-.42-.18.61.61 0 00-.5.21.84.84 0 00-.18.58v.4a.75.75 0 00.19.55.78.78 0 00.55.19 1.09 1.09 0 00.35-.07 1.08 1.08 0 00.31-.19l.48.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM692.93 292.91a2.36 2.36 0 01-.47-.16 1.6 1.6 0 01-.4-.25l.43-.54a1.89 1.89 0 00.49.25 1.46 1.46 0 00.49.09 1.09 1.09 0 00.5-.09.28.28 0 00.17-.26.24.24 0 00-.08-.19.4.4 0 00-.22-.09l-.36-.05h-.21a2.82 2.82 0 01-.54-.11.68.68 0 01-.36-.25.88.88 0 01-.14-.53 1 1 0 01.14-.54 1 1 0 01.42-.34 2 2 0 01.69-.11 1.83 1.83 0 01.47 0 2.23 2.23 0 01.44.13 3.11 3.11 0 01.4.22l-.44.53a1.58 1.58 0 00-.44-.2 1.39 1.39 0 00-.44-.07 1 1 0 00-.43.08.27.27 0 00-.15.24.19.19 0 00.08.16.44.44 0 00.21.07l.35.05h.14a2.66 2.66 0 01.58.1.77.77 0 01.39.26.89.89 0 01.16.58 1 1 0 01-.15.56.88.88 0 01-.45.34 2 2 0 01-.73.12 3.1 3.1 0 01-.54 0zM697.25 289.78h.75l-1.18 3.13h-.53l-1.18-3.13h.74l.7 2.1zM698.51 288.52h.72v.72h-.72zm0 1.26h.72v3.13h-.72zM700.09 289.78h.72v3.13h-.72zM702 291a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.84.84 0 01.5-.15 1 1 0 01.78.33 1.44 1.44 0 01.28.95v1.9H702zM704 292.81a1 1 0 01-.37-.45 1.88 1.88 0 01-.12-.71v-.6a1.94 1.94 0 01.12-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1 1 0 01.35.42l-.06.67a.59.59 0 00-.07-.31.37.37 0 00-.18-.19.62.62 0 00-.71.1.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.62.62 0 00.71.1.41.41 0 00.18-.19.62.62 0 00.07-.31v.69a.82.82 0 01-.8.55 1.07 1.07 0 01-.54-.16zm0 1.25a1.1 1.1 0 01-.45-.37l.49-.45a.71.71 0 00.27.22.8.8 0 00.33.08.69.69 0 00.49-.17.61.61 0 00.18-.47v-3.12h.69v3a1.53 1.53 0 01-.16.74 1.12 1.12 0 01-.47.47 1.6 1.6 0 01-.75.16 1.51 1.51 0 01-.62-.09zM707.45 292.8a1.14 1.14 0 01-.49-.48 1.65 1.65 0 01-.16-.77v-.35a1.78 1.78 0 01.16-.8 1.12 1.12 0 01.46-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.69.2 1.29 1.29 0 01.43.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a.9.9 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.89.89 0 00-.17.58v.4a.75.75 0 00.19.55.77.77 0 00.54.19 1.15 1.15 0 00.36-.07 1.23 1.23 0 00.31-.19l.47.44a1.73 1.73 0 01-.54.35 1.53 1.53 0 01-.6.12 1.57 1.57 0 01-.75-.19zM710.21 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM718.72 288.52h.73v4.39h-.73zm.39 1.88h2.5v.69h-2.5zm2.07-1.88h.72v4.39h-.72zM723 292.72a.92.92 0 01-.27-.73.88.88 0 01.27-.7 1.25 1.25 0 01.82-.23h.84v.56h-.88a.47.47 0 00-.32.09.32.32 0 00-.11.28.33.33 0 00.14.29.76.76 0 00.42.1 1.29 1.29 0 00.51-.08.25.25 0 00.17-.23l.06.44a.49.49 0 01-.18.25.75.75 0 01-.31.15 1.6 1.6 0 01-.39 0 1.17 1.17 0 01-.77-.19zm1.63-1.8a.49.49 0 00-.16-.4.6.6 0 00-.44-.15 1 1 0 00-.35.06 1.07 1.07 0 00-.32.16l-.48-.41a1.21 1.21 0 01.48-.33 1.81 1.81 0 01.67-.12 1.55 1.55 0 01.68.14 1 1 0 01.44.4 1.22 1.22 0 01.15.63v2h-.67zM726.16 289.78h.73v3.13h-.73zM728 291a.6.6 0 00-.16-.43.54.54 0 00-.43-.16.5.5 0 00-.55.55l-.07-.65a1.24 1.24 0 01.36-.44.9.9 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.28.95v1.9H728zM730 292.81a.93.93 0 01-.37-.45 1.87 1.87 0 01-.13-.71v-.6a1.93 1.93 0 01.13-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1.13 1.13 0 01.35.42l-.07.67a.71.71 0 00-.06-.31.37.37 0 00-.18-.19.56.56 0 00-.3-.07.51.51 0 00-.41.17.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.51.51 0 00.41.17.56.56 0 00.3-.07.41.41 0 00.18-.19.75.75 0 00.06-.31v.69a1 1 0 01-.3.4.84.84 0 01-.5.15 1.07 1.07 0 01-.53-.16zm1.33-4.29h.73v4.39h-.73zM733.52 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.93 1.93 0 01.16-.8 1.14 1.14 0 01.47-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.68.2 1.24 1.24 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a1 1 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.84.84 0 00-.18.58v.4a.76.76 0 00.2.55.77.77 0 00.54.19 1 1 0 00.35-.07 1.29 1.29 0 00.32-.19l.47.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM737 292a.24.24 0 00.06.18.21.21 0 00.16.06h.22v.69h-.4a.73.73 0 01-.56-.21.86.86 0 01-.2-.62v-3.57h.72z" transform="translate(1.64)"/><path d="M720.79 282.77c-.18.63-.55 1.78-1.29 3.67-1.24 3.19-3 5.09-2.47 7.14s2 3 4.82 3.84a45.51 45.51 0 004.73 1.05l-.74-.13" stroke="#ed7320" stroke-width=".93" stroke-miterlimit="10" fill="none"/>
+ </svg>
+</div>
+<div class="container">
+ <div class="row my-5">
+ @if (Model.HighlightedProducts.Any(c => c.IsAvailable && c.IsVisible)) {
+ <h2>Favorittar</h2>
+ <div class="favorites">
+ @foreach (var product in Model.HighlightedProducts.Where(c => c.IsVisible && c.IsAvailable).OrderByDescending(c => c.Updated)) {
+ <a href="@product.WebPath()" class="favorite-card">
+ <img src="@product.GetPrimaryImage().WebPath" class="lazyload blur-up" alt="...">
+ <h3 class="mt-2">@product.Name</h3>
+ </a>
+ }
+ </div>
+ }
+ </div>
+ <div class="row contact-section" id="kontakt">
+ @Html.Raw(Model.ContactHtml)
+ </div>
+</div> \ No newline at end of file
diff --git a/src/Pages/Index.cshtml.cs b/src/Pages/Index.cshtml.cs
new file mode 100644
index 0000000..3cefa0d
--- /dev/null
+++ b/src/Pages/Index.cshtml.cs
@@ -0,0 +1,34 @@
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+using VSH.Data;
+using VSH.Data.Database;
+using VSH.Data.Enums;
+
+namespace VSH.Pages;
+
+public class IndexModel : PageModel
+{
+ private readonly MainDbContext _context;
+
+ public string ContactHtml { get; set; }
+ public List<Product> HighlightedProducts { get; set; } = new();
+
+ public IndexModel(MainDbContext context) {
+ _context = context;
+ }
+
+ public ActionResult OnGet() {
+ ContactHtml = _context.Documents.OrderBy(c => c.Created)
+ .LastOrDefault(c => c.Type == DocumentType.CONTACT_PAGE)
+ ?.Content;
+ HighlightedProducts = _context.Products
+ .Where(c => c.ShowOnFrontpage
+ && c.VisibilityState == ProductVisibility.DEFAULT)
+ .Include(c => c.Category)
+ .ToList();
+ return Page();
+ }
+} \ No newline at end of file
diff --git a/src/Pages/Kontoret/Bestillinger.cshtml b/src/Pages/Kontoret/Bestillinger.cshtml
new file mode 100644
index 0000000..961e12a
--- /dev/null
+++ b/src/Pages/Kontoret/Bestillinger.cshtml
@@ -0,0 +1,67 @@
+@page
+@model VSH.Pages.Kontoret.Bestillinger
+@{
+ ViewData["Title"] = "Bestillinger";
+}
+<div class="d-flex justify-content-center my-5" id="orders-loader">
+ <div class="spinner-border" role="status">
+ <span class="visually-hidden">Laster...</span>
+ </div>
+</div>
+<div id="orders-wrapper" class="d-none py-3"></div>
+
+<div id="order-info-modal" tabindex="-1" class="modal">
+ <div class="modal-dialog modal-dialog-scrollable modal-lg">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title"></h5>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+ </div>
+ <div class="modal-body">
+ <div id="loader">
+ <div class="spinner-border text-primary" role="status">
+ <span class="visually-hidden">Loading...</span>
+ </div>
+ </div>
+ <div id="loaded">
+ <span class="text-bold">Betalingsmetode:</span> <span id="order-payment-type"></span> <br>
+ <div class="ps-5 d-none" id="vipps-section">
+ <span class="text-bold">Vipps - status:</span> <span id="vipps-status"></span> <br>
+ <span class="text-bold">Vipps - lenke:</span> <span id="vipps-link"></span> <br>
+ <button id="vipps-order-capture" class="btn btn-link d-none" title="Trykk her for å signalisere om levert bestilling">
+ <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
+ Bestillingen er levert
+ </button>
+ <button id="vipps-order-refund" class="btn btn-link d-none" title="Trykk her for å refundere bestillingen hos vipps">
+ <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
+ Bestillingen er refundert
+ </button>
+ <button id="vipps-order-cancel" class="btn btn-link d-none" title="Trykk her for å kansellere bestillingen hos vipps">
+ <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
+ Bestillingen er kansellert
+ </button>
+ </div>
+ <span class="text-bold">Status:</span> <span id="order-status"></span> <br>
+ <span class="text-bold">Navn:</span> <span id="contact-info-name"></span> <br>
+ <span class="text-bold">E-postadresse:</span> <span id="contact-info-emailAddress"></span> <br>
+ <span class="text-bold">Telefon:</span> <span id="contact-info-phoneNumber"></span> <br>
+ <span class="text-bold">Referanse:</span> <span id="order-reference"></span> <br>
+ <span class="text-bold">Bestillingsdato:</span> <span id="order-date"></span> <br>
+ <span class="text-bold">Totalt:</span> <span id="order-total"></span> <br>
+ <span class="text-bold">Kommentar:</span> <span id="order-comment"></span>
+ <table class="table">
+ <thead>
+ <tr>
+ <th scope="col">#</th>
+ <th scope="col">Navn</th>
+ <th scope="col">Antall</th>
+ <th scope="col">Pris</th>
+ </tr>
+ </thead>
+ <tbody></tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/src/Pages/Kontoret/Bestillinger.cshtml.cs b/src/Pages/Kontoret/Bestillinger.cshtml.cs
new file mode 100644
index 0000000..8aff3c4
--- /dev/null
+++ b/src/Pages/Kontoret/Bestillinger.cshtml.cs
@@ -0,0 +1,8 @@
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace VSH.Pages.Kontoret;
+
+public class Bestillinger : PageModel
+{
+ public void OnGet() { }
+} \ No newline at end of file
diff --git a/src/Pages/Kontoret/Dokumenter.cshtml b/src/Pages/Kontoret/Dokumenter.cshtml
new file mode 100644
index 0000000..55e0ba6
--- /dev/null
+++ b/src/Pages/Kontoret/Dokumenter.cshtml
@@ -0,0 +1,21 @@
+@page
+@using VSH.Data.Enums
+@using VSH.Utilities
+@using IOL.Helpers
+@model VSH.Pages.Kontoret.Dokumenter
+@{
+ ViewData["Title"] = "Dokumenter";
+}
+
+<div class="d-flex mb-3">
+ <select name="document-selector" id="document-selector" class="form-select">
+ @foreach (var option in EnumHelpers.GetValues<DocumentType>()) {
+ <option value="@(option)">@EnumName.ForDocumentType(option)</option>
+ }
+ </select>
+ <button class="btn btn-outline-primary ms-3 fs-3" id="publish-button" title="Publiser">
+ <i class="bi bi-cloud-upload"></i>
+ </button>
+</div>
+
+<div id="editor"></div> \ No newline at end of file
diff --git a/src/Pages/Kontoret/Dokumenter.cshtml.cs b/src/Pages/Kontoret/Dokumenter.cshtml.cs
new file mode 100644
index 0000000..ca72b4e
--- /dev/null
+++ b/src/Pages/Kontoret/Dokumenter.cshtml.cs
@@ -0,0 +1,8 @@
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace VSH.Pages.Kontoret;
+
+public class Dokumenter : PageModel
+{
+ public void OnGet() { }
+} \ No newline at end of file
diff --git a/src/Pages/Kontoret/Produkter.cshtml b/src/Pages/Kontoret/Produkter.cshtml
new file mode 100644
index 0000000..825005d
--- /dev/null
+++ b/src/Pages/Kontoret/Produkter.cshtml
@@ -0,0 +1,18 @@
+@page
+@model VSH.Pages.Kontoret.Produkter2
+@{
+ ViewData["Title"] = "Produkter";
+}
+
+<button class="btn btn-primary" id="open-product-modal">Legg til produkt</button>
+<button class="btn btn-primary" id="open-categories-modal">Ã…pne kategorier</button>
+
+<div class="d-flex justify-content-center my-5" id="products-loader">
+ <div class="spinner-border" role="status">
+ <span class="visually-hidden">Laster...</span>
+ </div>
+</div>
+<div id="products" class="d-none py-3"></div>
+
+<partial name="Partials/_AdminProductModal"/>
+<partial name="Partials/_AdminCategoriesModal"/> \ No newline at end of file
diff --git a/src/Pages/Kontoret/Produkter.cshtml.cs b/src/Pages/Kontoret/Produkter.cshtml.cs
new file mode 100644
index 0000000..0d16e08
--- /dev/null
+++ b/src/Pages/Kontoret/Produkter.cshtml.cs
@@ -0,0 +1,8 @@
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace VSH.Pages.Kontoret;
+
+public class Produkter2 : PageModel
+{
+ public void OnGet() { }
+} \ No newline at end of file
diff --git a/src/Pages/Kontoret/_ViewImports.cshtml b/src/Pages/Kontoret/_ViewImports.cshtml
new file mode 100644
index 0000000..01f3f6a
--- /dev/null
+++ b/src/Pages/Kontoret/_ViewImports.cshtml
@@ -0,0 +1,3 @@
+@using VSH
+@namespace VSH.Pages.Kontoret
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/src/Pages/Kontoret/_ViewStart.cshtml b/src/Pages/Kontoret/_ViewStart.cshtml
new file mode 100644
index 0000000..0297c66
--- /dev/null
+++ b/src/Pages/Kontoret/_ViewStart.cshtml
@@ -0,0 +1,3 @@
+@{
+ Layout = "_AdminLayout";
+} \ No newline at end of file
diff --git a/src/Pages/Leverandorar.cshtml b/src/Pages/Leverandorar.cshtml
new file mode 100644
index 0000000..eb712a5
--- /dev/null
+++ b/src/Pages/Leverandorar.cshtml
@@ -0,0 +1,9 @@
+@page "/leverandørar"
+@model VSH.Pages.Leverandorar
+@{
+ ViewData["Title"] = "Leverandørar";
+}
+
+<div class="container py-3 py-md-5 dynamic-content">
+ @Html.Raw(Model.DealersPageHtml)
+</div> \ No newline at end of file
diff --git a/src/Pages/Leverandorar.cshtml.cs b/src/Pages/Leverandorar.cshtml.cs
new file mode 100644
index 0000000..e8f467b
--- /dev/null
+++ b/src/Pages/Leverandorar.cshtml.cs
@@ -0,0 +1,23 @@
+using System.Linq;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+using VSH.Data;
+using VSH.Data.Enums;
+
+namespace VSH.Pages;
+
+public class Leverandorar : PageModel
+{
+ private readonly MainDbContext _context;
+
+ public Leverandorar(MainDbContext context) {
+ context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
+ _context = context;
+ }
+
+ public string DealersPageHtml { get; set; }
+
+ public void OnGet() {
+ DealersPageHtml = _context.Documents.FirstOrDefault(c => c.Type == DocumentType.DEALERS_PAGE)?.Content;
+ }
+} \ No newline at end of file
diff --git a/src/Pages/LoggInn.cshtml b/src/Pages/LoggInn.cshtml
new file mode 100644
index 0000000..6349466
--- /dev/null
+++ b/src/Pages/LoggInn.cshtml
@@ -0,0 +1,34 @@
+@page
+@using Microsoft.AspNetCore.Antiforgery
+@model VSH.Pages.LoggInn
+@inject IAntiforgery Antiforgery
+@{
+ ViewData["Title"] = "Logg inn";
+ var token = Antiforgery.GetAndStoreTokens(HttpContext).RequestToken;
+}
+
+<div class="container mw-450px py-3 py-md-5">
+ <div class="alert alert-danger d-none" id="error" role="alert">
+ <h4 class="alert-header" id="error-title"></h4>
+ <p class="mb-0" id="error-message"></p>
+ </div>
+ <form id="login-form" onsubmit="return false">
+ <div class="mb-3">
+ <label for="input-email" class="form-label">E-postadresse</label>
+ <input type="email" class="form-control" name="input-email" id="input-email" placeholder="navn@domene.no" autofocus required>
+ </div>
+ <div class="mb-3">
+ <label for="input-password" class="form-label">Passord</label>
+ <input type="password" class="form-control" name="input-password" id="input-password" required>
+ </div>
+ <div class="mb-3 form-check">
+ <input type="checkbox" class="form-check-input" id="persist-session">
+ <label class="form-check-label" for="persist-session">Husk meg</label>
+ </div>
+ <input type="hidden" name="xsrf" value="@token">
+ <button type="submit" id="submit" class="btn btn-primary float-right">
+ <span class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
+ Logg inn
+ </button>
+ </form>
+</div>
diff --git a/src/Pages/LoggInn.cshtml.cs b/src/Pages/LoggInn.cshtml.cs
new file mode 100644
index 0000000..d4ee7d7
--- /dev/null
+++ b/src/Pages/LoggInn.cshtml.cs
@@ -0,0 +1,19 @@
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+
+namespace VSH.Pages;
+
+public class LoggInn : PageModel
+{
+ public ActionResult OnGet() {
+ if (User.Identity?.IsAuthenticated ?? false) {
+ if (Request.Query.ContainsKey("ReturnUrl")) {
+ return Redirect(Request.Query["ReturnUrl"]);
+ }
+
+ return Redirect("/kontoret");
+ }
+
+ return Page();
+ }
+} \ No newline at end of file
diff --git a/src/Pages/OmOss.cshtml b/src/Pages/OmOss.cshtml
new file mode 100644
index 0000000..0ba277c
--- /dev/null
+++ b/src/Pages/OmOss.cshtml
@@ -0,0 +1,9 @@
+@page "/om-oss"
+@model VSH.Pages.OmOss
+@{
+ ViewData["Title"] = "Om oss";
+}
+
+<div class="container py-3 py-md-5 dynamic-content">
+ @Html.Raw(Model.AboutUsPageHtml)
+</div> \ No newline at end of file
diff --git a/src/Pages/OmOss.cshtml.cs b/src/Pages/OmOss.cshtml.cs
new file mode 100644
index 0000000..217f829
--- /dev/null
+++ b/src/Pages/OmOss.cshtml.cs
@@ -0,0 +1,23 @@
+using System.Linq;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+using VSH.Data;
+using VSH.Data.Enums;
+
+namespace VSH.Pages;
+
+public class OmOss : PageModel
+{
+ private readonly MainDbContext _context;
+
+ public OmOss(MainDbContext context) {
+ context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
+ _context = context;
+ }
+
+ public string AboutUsPageHtml { get; set; }
+
+ public void OnGet() {
+ AboutUsPageHtml = _context.Documents.FirstOrDefault(c => c.Type == DocumentType.ABOUT_PAGE)?.Content;
+ }
+} \ No newline at end of file
diff --git a/src/Pages/Partials/_AdminCategoriesModal.cshtml b/src/Pages/Partials/_AdminCategoriesModal.cshtml
new file mode 100644
index 0000000..ee52f2a
--- /dev/null
+++ b/src/Pages/Partials/_AdminCategoriesModal.cshtml
@@ -0,0 +1,25 @@
+<div class="modal" tabindex="-1" id="categories-modal">
+ <div class="modal-dialog modal-dialog-scrollable modal-lg">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title">Kategorier</h5>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+ </div>
+ <div class="modal-body">
+ <div class="card">
+ <div class="card-header p-3">
+ <form onsubmit="return false;" id="new-category-form">
+ <input type="text" class="form-control" id="new-category-name" name="new-category-name" placeholder="Legg til en ny kategori" autocomplete="off" required>
+ </form>
+ </div>
+ <div class="d-flex justify-content-center p-3" id="loading-wrapper">
+ <div class="spinner-border" role="status">
+ <span class="visually-hidden">Laster...</span>
+ </div>
+ </div>
+ <div class="list-group list-group-flush d-none" id="list-wrapper"></div>
+ </div>
+ </div>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/src/Pages/Partials/_AdminProductModal.cshtml b/src/Pages/Partials/_AdminProductModal.cshtml
new file mode 100644
index 0000000..06cbc81
--- /dev/null
+++ b/src/Pages/Partials/_AdminProductModal.cshtml
@@ -0,0 +1,72 @@
+<div class="modal" tabindex="-1" id="product-modal">
+ <div class="modal-dialog modal-dialog-scrollable modal-lg">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title" id="product-modal-title">Nytt produkt</h5>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+ </div>
+ <div class="modal-body">
+ <form class="margin-bottom-sm" id="product-form">
+ <div class="loader">
+ <div class="spinner-border" role="status">
+ <span class="visually-hidden">Laster...</span>
+ </div>
+ </div>
+ <fieldset class="mb-3">
+ <label class="form-label mb-2" for="input-name">Navn</label>
+ <input class="form-control" type="text" name="input-name" id="input-name" required/>
+ </fieldset>
+ <fieldset class="mb-3 row">
+ <div class="col">
+ <label class="form-label mb-2" for="input-price">Pris</label>
+ <div class="input-group">
+ <input class="form-control" type="text" name="input-price" id="input-price" required/>
+ <select class="form-select" style="max-width: 85px;" id="input-price-suffix">
+ <option selected value="0">,-</option>
+ <option value="1">,- kg</option>
+ </select>
+ </div>
+ </div>
+ <div class="col">
+ <label class="form-label mb-2" for="input-count">Besetning (-1 for uendelig)</label>
+ <div class="input-group">
+ <input class="form-control" type="number" min="-1" name="input-count" id="input-count" placeholder="Antall produkter/kilo for salg"/>
+ </div>
+ </div>
+ </fieldset>
+ <fieldset class="mb-3">
+ <label class="form-label mb-2" for="input-description">Beskrivelse</label>
+ <textarea class="form-control" name="input-description" id="input-description"></textarea>
+ </fieldset>
+ <fieldset class="mb-3">
+ <label for="" class="form-label mb-2">Bilder</label>
+ <div class="row pb-2" id="input-images-row">
+ </div>
+ </fieldset>
+ <fieldset class="form-check form-switch mb-3">
+ <input class="form-check-input" type="checkbox" id="show-on-frontpage" name="show-on-frontpage">
+ <label class="form-check-label" for="show-on-frontpage">Vis på forsiden</label>
+ </fieldset>
+ <fieldset class="mb-3">
+ <label for="" class="form-label mb-2">Kategori</label>
+ <div id="product-category-picker-wrapper">
+ <div id="picker" class="d-none"></div>
+ <div class="d-flex justify-content-center" id="loader">
+ <div class="spinner-border" role="status">
+ <span class="visually-hidden">Laster...</span>
+ </div>
+ </div>
+ </div>
+ </fieldset>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-lg btn-secondary" data-bs-dismiss="modal">Avbryt</button>
+ <button type="button" class="btn btn-lg btn-primary" id="submit-product-form">
+ <span class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
+ <span class="text">Lagre</span>
+ </button>
+ </div>
+ </div>
+ </div>
+</div> \ No newline at end of file
diff --git a/src/Pages/Partials/_CultureSelector.cshtml b/src/Pages/Partials/_CultureSelector.cshtml
new file mode 100644
index 0000000..07965f9
--- /dev/null
+++ b/src/Pages/Partials/_CultureSelector.cshtml
@@ -0,0 +1,35 @@
+@using Microsoft.AspNetCore.Builder
+@using Microsoft.AspNetCore.Localization
+@using Microsoft.Extensions.Localization
+@using Microsoft.Extensions.Options
+@using IOL.Helpers
+
+@inject IStringLocalizer<SharedPageResources> Localizer
+@inject IOptions<RequestLocalizationOptions> LocOptions
+
+@{
+ var requestCulture = Context.Features.Get<IRequestCultureFeature>();
+ var cultureItems = LocOptions.Value.SupportedUICultures;
+}
+
+<div>
+ <form asp-controller="Root"
+ asp-action="SetCulture"
+ asp-route-returnUrl="@Context.Request.Path"
+ method="post"
+ class="row row-cols-lg-auto g-3 align-items-center"
+ role="form">
+ <div class="col">
+ <select class="form-control" name="culture">
+ @foreach (var item in cultureItems) {
+ if (item.Name == requestCulture?.RequestCulture.UICulture.Name) {
+ <option value="@item.Name" selected>@item.NativeName.Capitalize()</option>
+ } else {
+ <option value="@item.Name">@item.NativeName.Capitalize()</option>
+ }
+ }
+ </select>
+ </div>
+ <button type="submit" class="btn btn-default btn-xs">@Localizer["Lagre"]</button>
+ </form>
+</div> \ No newline at end of file
diff --git a/src/Pages/Personvern.cshtml b/src/Pages/Personvern.cshtml
new file mode 100644
index 0000000..83d5043
--- /dev/null
+++ b/src/Pages/Personvern.cshtml
@@ -0,0 +1,8 @@
+@page
+@model PrivacyModel
+@{
+ ViewData["Title"] = "Personvern";
+}
+<div class="container py-3 py-md-5 dynamic-content">
+ @Html.Raw(Model.PrivacyPolicyHtml)
+</div> \ No newline at end of file
diff --git a/src/Pages/Personvern.cshtml.cs b/src/Pages/Personvern.cshtml.cs
new file mode 100644
index 0000000..1a661c5
--- /dev/null
+++ b/src/Pages/Personvern.cshtml.cs
@@ -0,0 +1,25 @@
+using System.Linq;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+using VSH.Data;
+using VSH.Data.Enums;
+
+namespace VSH.Pages;
+
+public class PrivacyModel : PageModel
+{
+ private readonly MainDbContext _context;
+
+ public PrivacyModel(MainDbContext context) {
+ context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
+ _context = context;
+ }
+
+ public string PrivacyPolicyHtml { get; set; }
+
+ public void OnGet() {
+ PrivacyPolicyHtml = _context.Documents.OrderBy(c => c.Created)
+ .LastOrDefault(c => c.Type == DocumentType.PRIVACY_POLICY)
+ ?.Content;
+ }
+} \ No newline at end of file
diff --git a/src/Pages/Produktar.cshtml b/src/Pages/Produktar.cshtml
new file mode 100644
index 0000000..f43e4ab
--- /dev/null
+++ b/src/Pages/Produktar.cshtml
@@ -0,0 +1,163 @@
+@page "{categorySlug?}/{productSlug?}"
+@using VSH.Data.Static
+@using IOL.Helpers
+@model VSH.Pages.Produktar
+@{
+ var title = "Produktar";
+ if (Model.IsProduct) {
+ title = Model.CurrentProduct.Name;
+ } else if (Model.IsCategory) {
+ title = Model.Categories.FirstOrDefault()?.Name;
+ }
+
+ ViewData["Title"] = title;
+}
+
+<div class="container py-3 py-md-5">
+ @if (Model.IsCategory || Model.IsProduct) {
+ <nav aria-label="breadcrumb" class="pt-3">
+ <ol class="breadcrumb">
+ @if (Model.Categories?.Count == 1) {
+ <li class="breadcrumb-item">
+ <a href="/produktar">Produktar</a>
+ </li>
+ <li class="breadcrumb-item active" aria-current="page">
+ @Model.Categories.SingleOrDefault()?.Name
+ </li>
+ }
+ @if (Model.IsProduct) {
+ <li class="breadcrumb-item">
+ <a href="/produktar">Produktar</a>
+ </li>
+ <li class="breadcrumb-item">
+ <a href="/produktar/@Model.CategorySlug">@Model.CurrentProduct.Category.Name</a>
+ </li>
+ <li class="breadcrumb-item active" aria-current="page">
+ @Model.CurrentProduct.Name
+ </li>
+ }
+ </ol>
+ </nav>
+ }
+
+ @if (Model.IsProduct) {
+ <div class="row" id="single-product-wrapper" data-id="@Model.CurrentProduct.Id">
+ <div class="col-12 col-md-6">
+ @if (Model.CurrentProduct.Images.Any()) {
+ if (Model.CurrentProduct.Images.Count > 1) {
+ <div id="product-carousel" class="carousel">
+ <div class="carousel-inner">
+ @{ var index = 0; }
+ @foreach (var secondaryImage in Model.CurrentProduct.Images.OrderBy(c => c.Order)) {
+ <div class="carousel-item @(index == 0 ? "active" : "")">
+ <img src="@secondaryImage.GetPath().WebPath" class="d-block w-100 @(index == 0 ? "lazyload blur-up" : "")" alt="">
+ </div>
+ index++;
+ }
+ </div>
+ </div>
+ <div class="d-flex justify-content-start flex-wrap mt-2" id="carousel-navigator">
+ @{ var secIndex = 0; }
+ @foreach (var secondaryImage in Model.CurrentProduct.Images.OrderBy(c => c.Order)) {
+ <div class="px-1 thumb-button cursor-pointer" data-thumb-index="@secIndex">
+ <img src="@secondaryImage.GetPath().WebPath" class="img-thumbnail lazyload blur-up border-0" alt="">
+ </div>
+ secIndex++;
+ }
+ </div>
+ } else {
+ var fileName = Model.CurrentProduct.GetPrimaryImage();
+ <img src="@(fileName.WebPath.ExtractFileName() + "-150" + fileName.WebPath.ExtractExtension())"
+ data-src="@fileName.WebPath"
+ class="card-img-top lazyload blur-up"
+ alt="Bilde av produktet">
+ }
+ } else {
+ <img src="/assets/profile/innrammet.svg"
+ data-src="/assets/profile/innrammet.svg"
+ class="card-img-top lazyload blur-up placeholder p-5"
+ alt="Bilde av produktet">
+ }
+ </div>
+ <div class="col-12 pt-3 col-md-6">
+ <div class="row">
+ <h2 class="title">@Model.CurrentProduct.Name</h2>
+ <p class="description">@Model.CurrentProduct.Description</p>
+ </div>
+ <div class="row">
+ <div class="col d-flex justify-content-end align-items-center buttons">
+ @if (Model.CurrentProduct.IsAvailable) {
+ <div class="add-to-cart-button">
+ <div class="counter-wrapper"></div>
+ <button class="btn btn-outline-primary shadow-none disabled bag-button" data-product-max-count="@Model.CurrentProduct.Count">
+ <div class="spinner-border text-primary" role="status">
+ <span class="visually-hidden">Loading...</span>
+ </div>
+ </button>
+ <span class="product-price text-bold" data-price="@Model.CurrentProduct.Price">@Model.CurrentProduct.Price@(Model.CurrentProduct.ReadablePriceSuffix)</span>
+ </div>
+ } else {
+ <button class="btn btn-lg btn-outline-primary shadow-none disabled">
+ Utselt
+ </button>
+ }
+ </div>
+ </div>
+ </div>
+ </div>
+ } else if ((Model.IsCategory || Model.IsCategories) && Model.Categories?.Count >= 1) {
+ foreach (var category in Model.Categories.Where(category => category.Products.Count >= 1)) {
+ <div class="row mb-3">
+ <h2 class="h2">@category.Name</h2>
+ @foreach (var product in category.Products.Where(c => c.IsVisible)) {
+ <div class="col-sm-12 col-md-6 col-xl-3 p-1 px-2 mb-3">
+ <div class="card product-card" data-id="@product.Id">
+ @if (product.Images.Any()) {
+ var fileName = product.GetPrimaryImage();
+ <a href="@product.WebPath()">
+ <img src="@(fileName.WebPath.ExtractFileName() + "-150" + fileName.WebPath.ExtractExtension())"
+ data-src="@fileName.WebPath"
+ class="card-img-top lazyload blur-up"
+ alt="">
+ </a>
+ } else {
+ <a href="@product.WebPath()">
+ <img src="@AppPaths.DefaultProductImage.WebPath"
+ data-src="@AppPaths.DefaultProductImage.WebPath"
+ class="card-img-top lazyload blur-up placeholder"
+ alt="">
+ </a>
+ }
+ <div class="card-body">
+ <a class="card-title fs-3 text-reset text-decoration-none" href="@product.WebPath()">
+ @product.Name
+ </a>
+ <div class="d-flex justify-content-end align-items-center pt-1 buttons">
+ @if (product.IsAvailable) {
+ <div class="add-to-cart-button">
+ <div class="counter-wrapper"></div>
+ <button class="btn btn-outline-primary shadow-none disabled bag-button" data-product-max-count="@product.Count">
+ <div class="spinner-border text-primary" role="status">
+ <span class="visually-hidden">Loading...</span>
+ </div>
+ </button>
+ <span class="product-price text-bold" data-price="@product.Price">@product.Price@(product.ReadablePriceSuffix)</span>
+ </div>
+ } else {
+ <button class="btn btn-link float-right shadow-none disabled">
+ Utselt
+ </button>
+ }
+ </div>
+ </div>
+ </div>
+ </div>
+ }
+ </div>
+ }
+ } else {
+ <h2>
+ Heisann, her er det tomt for augneblinken. Prøv igjen snart.
+ </h2>
+ }
+</div> \ No newline at end of file
diff --git a/src/Pages/Produktar.cshtml.cs b/src/Pages/Produktar.cshtml.cs
new file mode 100644
index 0000000..b0ba470
--- /dev/null
+++ b/src/Pages/Produktar.cshtml.cs
@@ -0,0 +1,82 @@
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using IOL.Helpers;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Localization;
+using Microsoft.Extensions.Options;
+using VSH.Data.Miscellaneous;
+using VSH.Data.Database;
+using VSH.Data;
+using VSH.Data.Enums;
+using VSH.Data.Static;
+
+namespace VSH.Pages;
+
+public class Produktar : PageModel
+{
+ private readonly MainDbContext _context;
+ private readonly IStringLocalizer<SharedPageResources> _localizer;
+ private readonly IOptions<AppSettings.GeneralConfiguration> _options;
+
+ public string ProductSlug { get; set; }
+ public string CategorySlug { get; set; }
+ public bool IsProduct { get; set; }
+ public bool IsCategory { get; set; }
+ public bool IsCategories { get; set; }
+ public Product CurrentProduct { get; set; }
+
+ public Produktar(
+ MainDbContext context,
+ IStringLocalizer<SharedPageResources> localizer,
+ IOptions<AppSettings.GeneralConfiguration> options
+ ) {
+ _context = context;
+ _localizer = localizer;
+ _options = options;
+ }
+
+ public List<Category> Categories { get; set; }
+
+ public ActionResult OnGet(string categorySlug, string productSlug) {
+ ProductSlug = productSlug;
+ CategorySlug = categorySlug;
+
+ if (ProductSlug.HasValue()) {
+ CurrentProduct = _context.Products.Where(c => c.VisibilityState == ProductVisibility.DEFAULT)
+ .Include(c => c.Category)
+ .SingleOrDefault(p => p.Slug == ProductSlug);
+ IsProduct = CurrentProduct != default;
+ if (!IsProduct)
+ return Page();
+ var productImage = CurrentProduct != null && CurrentProduct.Images.Any()
+ ? CurrentProduct.Images.OrderBy(c => c.Order).FirstOrDefault()
+ : default;
+
+ ViewData["open_graph"] = new OpenGraphData {
+ Description = CurrentProduct?.Description,
+ Image = productImage != default
+ ? (HttpContext.Request.GetRequestHost()
+ + Path.Combine(AppPaths.ProductImages.WebPath, productImage.FileName))
+ : default,
+ Title = $"{CurrentProduct?.Name} {_localizer["frå"]} {_options.Value.StoreName}",
+ };
+ } else if (CategorySlug.HasValue()) {
+ Categories = _context
+ .Categories.Where(c => c.Slug == CategorySlug
+ && c.VisibilityState == CategoryVisibility.DEFAULT)
+ .Include(c => c.Products)
+ .ToList();
+ IsCategory = !IsProduct && Categories?.Count == 1;
+ } else {
+ Categories = _context.Categories.Where(c => c.VisibilityState == CategoryVisibility.DEFAULT)
+ .Include(c => c.Products)
+ .ToList();
+ IsCategories = !IsProduct && Categories?.Count >= 1;
+ }
+
+ return Page();
+ }
+} \ No newline at end of file
diff --git a/src/Pages/SalesTerms.cshtml b/src/Pages/SalesTerms.cshtml
new file mode 100644
index 0000000..7c48bff
--- /dev/null
+++ b/src/Pages/SalesTerms.cshtml
@@ -0,0 +1,9 @@
+@page "/vilkår"
+@model VSH.Pages.SalesTerms
+@{
+ ViewData["Title"] = "Salgsvilkår";
+}
+
+<div class="container py-5 dynamic-content">
+ @Html.Raw(Model.TermsPageHtml)
+</div> \ No newline at end of file
diff --git a/src/Pages/SalesTerms.cshtml.cs b/src/Pages/SalesTerms.cshtml.cs
new file mode 100644
index 0000000..fe58839
--- /dev/null
+++ b/src/Pages/SalesTerms.cshtml.cs
@@ -0,0 +1,25 @@
+using System.Linq;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+using VSH.Data;
+using VSH.Data.Enums;
+
+namespace VSH.Pages;
+
+public class SalesTerms : PageModel
+{
+ private readonly MainDbContext _context;
+
+ public SalesTerms(MainDbContext context) {
+ context.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;
+ _context = context;
+ }
+
+ public string TermsPageHtml { get; set; }
+
+ public void OnGet() {
+ TermsPageHtml = _context.Documents.OrderBy(c => c.Created)
+ .LastOrDefault(c => c.Type == DocumentType.SALES_TERMS)
+ ?.Content;
+ }
+} \ No newline at end of file
diff --git a/src/Pages/Shared/_AdminLayout.cshtml b/src/Pages/Shared/_AdminLayout.cshtml
new file mode 100644
index 0000000..d352928
--- /dev/null
+++ b/src/Pages/Shared/_AdminLayout.cshtml
@@ -0,0 +1,114 @@
+@using VSH.Data.Miscellaneous
+@using Microsoft.Extensions.Options
+@using Microsoft.Extensions.Configuration
+@using VSH.Utilities
+@inject IOptions<AppSettings.GeneralConfiguration> Options;
+@inject IConfiguration Configuration;
+<!DOCTYPE html>
+<html lang="no">
+<head>
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+ <link rel="manifest" href="/manifest.json">
+ <link rel="stylesheet" href="~/dist/backbundle.css" asp-append-version="true">
+ @await RenderSectionAsync("Head", required: false)
+ <title>@ViewData["Title"] - Kontoret - @Options.Value.StoreName</title>
+</head>
+<body>
+
+<div class="container my-3">
+ <div class="row">
+ <div class="col">
+ <div class="d-flex mb-3">
+ <div class="flex-grow-1">
+ <h2>@Options.Value.ShortStoreName</h2>
+ </div>
+ <div class="dropdown" id="account-dropdown">
+ <button class="dropdown-toggle btn btn-light" type="button" id="account-dropdown-btn" data-bs-toggle="dropdown" aria-expanded="false">
+ <span class="d-none d-lg-inline">@Context.User.Identity?.Name</span>
+ <span class="d-inline d-lg-none">
+ <i class="bi bi-person fs-3"></i>
+ </span>
+ </button>
+ <div class="dropdown-menu dropdown-menu-right" aria-labelledby="account-dropdown-btn">
+ <a href="/" title="GÃ¥ til forsiden" class="dropdown-item">GÃ¥ til forsiden</a>
+ <span class="dropdown-item open-update-password-modal cursor-pointer">Endre passord</span>
+ <hr class="dropdown-divider">
+ <span class="text-danger dropdown-item logout-btn cursor-pointer">Logg ut</span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div style="height: 52px;overflow-y: hidden">
+ <div style="overflow: auto hidden">
+ <ul class="nav nav-tabs" role="tablist" style="flex-wrap: nowrap;">
+ <li class="nav-item" role="presentation">
+ @if (Context.Request.Path.Value?.StartsWith("/kontoret/produkter") ?? false) {
+ <a class="nav-link active" href="/kontoret/produkter" role="tab">Produkter</a>
+ } else {
+ <a class="nav-link" href="/kontoret/produkter" role="tab">Produkter</a>
+ }
+ </li>
+ <li class="nav-item" role="presentation">
+ @if (Context.Request.Path.Value?.StartsWith("/kontoret/bestillinger") ?? false) {
+ <a class="nav-link active" href="/kontoret/bestillinger" role="tab">Bestillinger</a>
+ } else {
+ <a class="nav-link" href="/kontoret/bestillinger" role="tab">Bestillinger</a>
+ }
+ </li>
+ <li class="nav-item" role="presentation">
+ @if (Context.Request.Path.Value?.StartsWith("/kontoret/dokumenter") ?? false) {
+ <a class="nav-link active" href="/kontoret/dokumenter" role="tab">Dokumenter</a>
+ } else {
+ <a class="nav-link" href="/kontoret/dokumenter" role="tab">Dokumenter</a>
+ }
+ </li>
+ </ul>
+ </div>
+ </div>
+
+ <script>
+ if (window.innerWidth < 768) {
+ document.querySelector(".nav").style.paddingBottom = "50px";
+ document.querySelector(".nav").className = "nav nav-pills";
+ }
+ </script>
+
+ <main class="py-3">
+ @RenderBody()
+ </main>
+</div>
+
+<div class="modal" tabindex="-1" id="update-password-modal">
+ <div class="modal-dialog modal-sm">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title" id="product-modal-title">Endre passord</h5>
+ <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
+ </div>
+ <div class="modal-body">
+ <form onsubmit="return false">
+ <fieldset>
+ <label for="input-new-password" class="form-label mb-2">Nytt passord</label>
+ <input class="form-control" type="password" id="input-new-password" minlength="6" min="6" placeholder="Minst 6 karakterer" required>
+ </fieldset>
+ </form>
+ </div>
+ <div class="modal-footer">
+ <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Avbryt</button>
+ <button type="button" class="btn btn-primary" id="submit-new-password-form">
+ <span class="spinner-border spinner-border-sm d-none" role="status" aria-hidden="true"></span>
+ <span class="text">Lagre</span>
+ </button>
+ </div>
+ </div>
+ </div>
+</div>
+
+<span id="version-text" style="position: absolute; bottom: 0; right: 0">@Configuration.GetVersion()</span>
+
+<script src="~/dist/backbundle.min.js" asp-append-version="true"></script>
+@await RenderSectionAsync("Scripts", required: false)
+</body>
+</html> \ No newline at end of file
diff --git a/src/Pages/Shared/_PublicLayout.cshtml b/src/Pages/Shared/_PublicLayout.cshtml
new file mode 100644
index 0000000..d3280dd
--- /dev/null
+++ b/src/Pages/Shared/_PublicLayout.cshtml
@@ -0,0 +1,152 @@
+@using VSH.Data.Miscellaneous
+@using Microsoft.Extensions.Options
+@using Microsoft.Extensions.Localization
+@using IOL.Helpers
+@inject IOptions<AppSettings.GeneralConfiguration> Options;
+@inject IStringLocalizer<SharedPageResources> Localizer;
+@{
+ var host = Context.Request.GetRequestHost();
+ var currentUrl = host + Context.Request.Path.Value;
+ const string CURRENT_CULTURE = "nn";
+ var openGraphData = ViewData["open_graph"] as OpenGraphData;
+}
+<!DOCTYPE html>
+<html lang="@CURRENT_CULTURE">
+<head>
+ <meta charset="utf-8"/>
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+ <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
+ <meta name="description" content="@(openGraphData?.Description ?? Options.Value.DefaultDescription)"/>
+ <meta name="geo.region" content="NO"/>
+ <meta name="geo.placename" content="Vinje"/>
+ <meta name="geo.position" content="59.621963;7.82424"/>
+ <meta name="ICBM" content="59.621963, 7.82424"/>
+ <meta property="og:type" content="@(openGraphData?.Type ?? "website")"/>
+ <meta property="og:locale" content="@(openGraphData?.Locale ?? CURRENT_CULTURE)"/>
+ <meta property="og:title" content="@(openGraphData?.Title ?? ViewData["Title"])"/>
+ <meta property="og:url" content="@(openGraphData?.Url ?? currentUrl)"/>
+ <meta property="og:description" content="@(openGraphData?.Description ?? Options.Value.DefaultDescription)"/>
+ <meta property="og:site_name" content="@(openGraphData?.SiteName ?? Options.Value.StoreName)"/>
+ <meta property="og:image" content="@(openGraphData?.Image ?? (host + "/assets/profile/og_default.png"))"/>
+ <link rel="stylesheet" href="~/dist/frontbundle.css" asp-append-version="true">
+ @await RenderSectionAsync("Head", required: false)
+ <title>@ViewData["Title"] - @Options.Value.StoreName</title>
+</head>
+<body class="d-flex min-vh-100 flex-column">
+
+<nav class="navbar fixed-top navbar-expand-lg user-select-none bg-white">
+ <a class="navbar-brand ps-3" href="/">
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 195.32 48.63">
+ <defs>
+ <style>.cls-logo-1{fill:none;stroke:#ee741e;stroke-miterlimit:10;stroke-width:3px}.cls-logo-2{fill:#ee741e}</style>
+ </defs>
+ <path class="cls-logo-1"
+ d="M24 1.5h167.33a2.49 2.49 0 012.49 2.5v21.72a21.39 21.39 0 01-21.39 21.39H4a2.49 2.49 0 01-2.5-2.5V24A22.5 22.5 0 0124 1.5z"/>
+ <path class="cls-logo-2"
+ d="M244.67 287.43h2.21l2.9 9.27 2.89-9.27h2.21l-4.21 12.78h-1.79zM256.31 287.43h2.1v2.1h-2.1zm0 3.65h2.1v9.13h-2.1zM260.89 291.08H263v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.66 1.66 0 00-1.25-.45 1.61 1.61 0 00-1.19.42 1.56 1.56 0 00-.43 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.82 2.82 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM269.72 301.9h.78a.58.58 0 00.45-.18.78.78 0 00.16-.51v-10.13h2.1v10.42a2.51 2.51 0 01-.59 1.78 2.12 2.12 0 01-1.64.64h-1.26zm1.37-14.47h2.13v2.1h-2.13zM278.3 300.34l-.91-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.23 4.23 0 012.12-.5 3.4 3.4 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.15 2.15 0 00.56 1.59 2.19 2.19 0 001.59.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.38 1.27a5 5 0 01-1.56 1 4.52 4.52 0 01-1.74.36zM288 300.34l-.73-.15a6.67 6.67 0 01-1.39-.46 5.07 5.07 0 01-1.16-.73l1.27-1.58a5.72 5.72 0 001.42.75 4.2 4.2 0 001.41.25 3.18 3.18 0 001.46-.26.8.8 0 00.49-.75.66.66 0 00-.24-.56 1.34 1.34 0 00-.62-.26 10.1 10.1 0 00-1.05-.14h-.62a9.26 9.26 0 01-1.57-.29 2 2 0 01-1-.73 2.46 2.46 0 01-.42-1.54 2.84 2.84 0 01.42-1.58 2.51 2.51 0 011.22-1 5.28 5.28 0 012-.33 6.92 6.92 0 011.37.14 7 7 0 011.28.39 6.53 6.53 0 011.15.65l-1.25 1.53a5.57 5.57 0 00-1.3-.59 4.47 4.47 0 00-1.27-.2 2.8 2.8 0 00-1.26.23.78.78 0 00-.43.71.52.52 0 00.24.46 1.64 1.64 0 00.59.21c.24 0 .58.08 1 .12h.4a11.1 11.1 0 011.68.29 2.28 2.28 0 011.13.77 2.65 2.65 0 01.47 1.68 2.92 2.92 0 01-.44 1.63 2.7 2.7 0 01-1.31 1 5.71 5.71 0 01-2.12.34zM299.78 291.08h2.13l-3.43 9.13H297l-3.43-9.13h2.13l2.06 6.12zM303.43 287.43h2.09v2.1h-2.09zm0 3.65h2.09v9.13h-2.09zM308 291.08h2.1v9.13H308zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.64 1.64 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.78 2.78 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1zM319.23 299.9a2.73 2.73 0 01-1.06-1.31 5.14 5.14 0 01-.37-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011-1.31 3 3 0 011.66-.46 2.49 2.49 0 011.41.43 3 3 0 011 1.22l-.18 1.94a2.06 2.06 0 00-.18-.9 1.39 1.39 0 00-.54-.56 1.72 1.72 0 00-.85-.19 1.52 1.52 0 00-1.22.51 2.17 2.17 0 00-.43 1.42v1.72a2.12 2.12 0 00.43 1.41 1.54 1.54 0 001.22.49 1.62 1.62 0 00.85-.2 1.39 1.39 0 00.54-.56 2 2 0 00.18-.89l.12 2a2.39 2.39 0 01-2.33 1.59 3 3 0 01-1.61-.46zm.93 4l-.84-.39a3.06 3.06 0 01-1.3-1.07l1.42-1.3a2.18 2.18 0 00.78.64 2.33 2.33 0 001 .22 2 2 0 001.41-.49 1.79 1.79 0 00.52-1.38v-9.07h2.1v8.85a4.65 4.65 0 01-.47 2.16 3.11 3.11 0 01-1.37 1.36 4.67 4.67 0 01-2.17.47zM330.3 300.34l-.91-.48a3.19 3.19 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.22 3.22 0 011.34-1.46 4.29 4.29 0 012.12-.5 3.38 3.38 0 012 .59 3.57 3.57 0 011.27 1.69 7.33 7.33 0 01.43 2.67v.6h-6.19V295h4.24v-.1a2.52 2.52 0 00-.53-1.48 1.51 1.51 0 00-1.21-.53 1.84 1.84 0 00-1.46.59 2.48 2.48 0 00-.52 1.69v1.16a1.95 1.95 0 002.14 2.15 2.86 2.86 0 001-.2 3 3 0 00.91-.55l1.39 1.27a5.19 5.19 0 01-1.56 1 4.53 4.53 0 01-1.75.36zM337.42 291.08h2.1v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.62 1.62 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.8 2.8 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1z"
+ transform="translate(-234.32 -270.82)"/>
+ <path class="cls-logo-1"
+ d="M363.62 271.28c-.58 1.89-1.77 5.38-4.09 11.1-3.92 9.68-9.44 15.37-7.86 21.65s5.65 9.4 14.19 12c2.49.77 4.85 1.41 7 1.95"
+ transform="translate(-234.32 -270.82)"/>
+ <path class="cls-logo-2"
+ d="M363.63 287.43h2.1v12.78h-2.1zm1.11 5.46H372v2h-7.27zm6-5.46h2.1v12.78h-2.1zM376 299.64a2.71 2.71 0 01-.78-2.12 2.5 2.5 0 01.79-2 3.56 3.56 0 012.37-.68h2.44l.13 1.63h-2.55a1.41 1.41 0 00-.94.27 1 1 0 00-.31.81.94.94 0 00.41.84 2.12 2.12 0 001.22.28 3.76 3.76 0 001.49-.22.71.71 0 00.48-.68l.19 1.3a1.59 1.59 0 01-.52.72 2.51 2.51 0 01-.9.43 4.28 4.28 0 01-1.16.15 3.47 3.47 0 01-2.36-.73zm4.74-5.22a1.53 1.53 0 00-.45-1.18 1.82 1.82 0 00-1.28-.43 3.32 3.32 0 00-1 .17 3.2 3.2 0 00-.92.47l-1.4-1.18a3.52 3.52 0 011.41-1 5.22 5.22 0 011.9-.27 4.61 4.61 0 012 .4 2.9 2.9 0 011.26 1.16 3.65 3.65 0 01.44 1.83v5.87h-1.95zM385.25 291.08h2.1v9.13h-2.1zm5.4 3.6a1.75 1.75 0 00-.44-1.27A1.66 1.66 0 00389 293a1.61 1.61 0 00-1.19.42 1.59 1.59 0 00-.42 1.18l-.19-1.89a3.38 3.38 0 011-1.28 2.56 2.56 0 011.48-.44 2.81 2.81 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM396.47 299.9a2.81 2.81 0 01-1.07-1.31 5.33 5.33 0 01-.36-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011.05-1.31 3 3 0 011.65-.46 2.55 2.55 0 011.42.43 3.17 3.17 0 011 1.22l-.19 1.94a2.06 2.06 0 00-.18-.9 1.27 1.27 0 00-.54-.56 1.7 1.7 0 00-.85-.19 1.5 1.5 0 00-1.21.51 2.11 2.11 0 00-.43 1.42v1.72a2.07 2.07 0 00.43 1.41 1.52 1.52 0 001.21.49 1.6 1.6 0 00.85-.2 1.27 1.27 0 00.54-.56 2 2 0 00.18-.89l.13 2a2.46 2.46 0 01-.88 1.15 2.4 2.4 0 01-1.45.44 2.93 2.93 0 01-1.66-.46zm3.88-12.47h2.11v12.78h-2.11zM407.54 300.34l-.92-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.26 4.26 0 012.12-.5 3.38 3.38 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.12 2.12 0 00.57 1.59 2.14 2.14 0 001.58.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.37 1.29a5 5 0 01-1.56 1 4.48 4.48 0 01-1.74.36zM416.75 297.53a.73.73 0 00.17.51.62.62 0 00.48.18h.6v2h-1.14a2.12 2.12 0 01-1.64-.63 2.53 2.53 0 01-.59-1.78v-10.38h2.1z"
+ transform="translate(-234.32 -270.82)"/>
+ </svg>
+ </a>
+ <button class="navbar-toggler shadow-none border-0 text-primary" type="button" data-bs-toggle="collapse" data-bs-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="bi bi-list" viewBox="0 0 16 16">
+ <path fill-rule="evenodd" d="M2.5 11.5A.5.5 0 0 1 3 11h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm0-4A.5.5 0 0 1 3 3h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5z"/>
+ </svg>
+ </button>
+ <div id="header-cart-button" class="d-flex d-none px-1 h-100 align-items-center cursor-pointer text-primary">
+ <span class="d-none d-md-inline-block px-1">Handlekorg</span>
+ <span class="d-inline-block d-md-none px-1">
+ <svg xmlns="http://www.w3.org/2000/svg" width="22" height="22" fill="currentColor" class="bi bi-basket3" viewBox="0 0 16 16">
+ <path d="M5.757 1.071a.5.5 0 0 1 .172.686L3.383 6h9.234L10.07 1.757a.5.5 0 1 1 .858-.514L13.783 6H15.5a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5H.5a.5.5 0 0 1-.5-.5v-1A.5.5 0 0 1 .5 6h1.717L5.07 1.243a.5.5 0 0 1 .686-.172zM3.394 15l-1.48-6h-.97l1.525 6.426a.75.75 0 0 0 .729.574h9.606a.75.75 0 0 0 .73-.574L15.056 9h-.972l-1.479 6h-9.21z"/>
+ </svg>
+ </span>(<span id="item-count"></span>)
+ </div>
+ <div class="collapse navbar-collapse bg-white px-3" id="navbar">
+ <ul class="navbar-nav me-auto text-uppercase">
+ <li class="nav-item d-none">
+ @if (Context.Request.Path.Value?.StartsWith("/produktar") ?? false) {
+ <a href="/produktar" class="nav-link active" title="@Localizer["GÃ¥ til /produktar"]" aria-current="page">@Localizer["Produktar"]</a>
+ } else {
+ <a href="/produktar" class="nav-link" title="@Localizer["GÃ¥ til /produktar"]">@Localizer["Produktar"]</a>
+ }
+ </li>
+ <li class="nav-item">
+ @if (Context.Request.Path.Value?.StartsWith("/leverandørar") ?? false) {
+ <a href="/leverandørar" class="nav-link active" title="@Localizer["Gå til /leverandørar"]" aria-current="page">@Localizer["Leverandørar"]</a>
+ } else {
+ <a href="/leverandørar" class="nav-link" title="@Localizer["Gå til /leverandørar"]">@Localizer["Leverandørar"]</a>
+ }
+ </li>
+ <li class="nav-item">
+ @if (Context.Request.Path.Value?.StartsWith("/om-oss") ?? false) {
+ <a href="/om-oss" class="nav-link active" title="@Localizer["GÃ¥ til /om-oss"]" aria-current="page">@Localizer["Om oss"]</a>
+ } else {
+ <a href="/om-oss" class="nav-link" title="@Localizer["GÃ¥ til /om-oss"]">@Localizer["Om oss"]</a>
+ }
+ </li>
+ <li class="nav-item">
+ <a href="/#kontakt" class="nav-link" title="@Localizer["GÃ¥ til kontaktinformasjon"]">@Localizer["Kontakt oss"]</a>
+ </li>
+ @if (User.Identity?.IsAuthenticated ?? false) {
+ <li class="nav-item">
+ <a href="/kontoret" class="nav-link" title="@Localizer["GÃ¥ til kontoret"]">
+ Kontoret
+ </a>
+ </li>
+ }
+ </ul>
+ </div>
+</nav>
+
+<main class="flex-1" id="body-wrapper">
+
+ @RenderBody()
+
+</main>
+
+<footer>
+ <div class="container py-5">
+ <div class="row">
+ <div class="col-sm-6">
+ <span class="text-uppercase">&copy; @Options.Value.StoreName</span>
+ | <a href="/personvern">@Localizer["Personvernerklæring"]</a>
+ | <a href="/vilkår">@Localizer["Salsvilkår"]</a>
+ | <a href="https://www.facebook.com/VinjesvingenHandel">Facebook</a>
+ </div>
+ </div>
+ </div>
+</footer>
+
+<div id="cart-modal" class="modal modal-right" tabindex="-1" role="dialog">
+ <div class="modal-dialog modal-dialog-aside" role="document">
+ <div class="modal-content">
+ <div class="modal-header">
+ <h5 class="modal-title">@Localizer["Handlekorg"]</h5>
+ <button type="button" class="btn-close close" data-bs-dismiss="modal" aria-label="@Localizer["Lukk"]"></button>
+ </div>
+ <div class="modal-body">
+ <div id="product-list"></div>
+ </div>
+ <div class="modal-footer flex-column align-items-end">
+ <div id="quote" class="mb-3 mb-md-4">
+ <span class="h3">@Localizer["I alt"]: <span id="total"></span></span>
+ </div>
+
+ <div class="w-100">
+ <button type="button" class="btn btn-primary btn-lg submit-cart w-100">@Localizer["GÃ¥ til kassa"]</button>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+
+<script src="~/dist/frontbundle.min.js" asp-append-version="true"></script>
+@await RenderSectionAsync("Scripts", required: false)
+
+</body>
+</html>
diff --git a/src/Pages/Status.cshtml b/src/Pages/Status.cshtml
new file mode 100644
index 0000000..d0e2ad1
--- /dev/null
+++ b/src/Pages/Status.cshtml
@@ -0,0 +1,136 @@
+@page "{orderReference}"
+@using VSH.Data.Enums
+@using VSH.Utilities
+@using System.Globalization
+@using IOL.Helpers
+@model VSH.Pages.Status
+
+@{
+ string title;
+ if (Model.CurrentOrder == default) {
+ title = "Fant ikkje ordren";
+ } else {
+ title = Model.CurrentOrder.Status switch {
+ OrderStatus.CANCELLED => "Kansellert bestilling",
+ OrderStatus.FAILED => "Feila bestilling",
+ OrderStatus.COMPLETED => "Fullført bestilling",
+ OrderStatus.AWAITING_INVOICE
+ or OrderStatus.AWAITING_VIPPS
+ or OrderStatus.IN_PROGRESS => "Ventar på betaling",
+ var _ => "Uventa feil"
+ };
+ }
+ ViewData["Title"] = title;
+}
+<div class="container py-5">
+ @if (Model.CurrentOrder != default) {
+ <div class="row">
+ <div class="col-12 col-md-4">
+ <div class="row mb-3">
+ <h2>Din bestilling</h2>
+ <hr>
+ <p>
+ <span class="text-bold">Status:</span>
+ @(title)
+ </p>
+ <p>
+ <span class="text-bold">Betalingsmetode:</span>
+ @(EnumName.ForPaymentType(Model.CurrentOrder.PaymentType))
+ @if (Model.CurrentOrder.PaymentType == OrderPaymentType.INVOICE_BY_EMAIL) {
+ <small>Du får tilsendt faktura til din e-postadresse</small>
+ }
+ </p>
+ <p>
+ <span class="text-bold">Referanse:</span>
+ @Model.CurrentOrder.OrderReference
+ </p>
+ <p>
+ <span class="text-bold">Dato:</span>
+ @Model.CurrentOrder.Created.ToOsloTimeZone().ToString("dd.MM.yyyy HH:mm", new CultureInfo("nb-NO"))
+ </p>
+
+ @if (!Model.CurrentOrder.Comment.IsNullOrWhiteSpace()) {
+ <p>
+ <span class="text-bold">Øvrig informasjon:</span>
+ @Model.CurrentOrder.Comment
+ </p>
+ }
+
+ </div>
+ <div class="row">
+ <h3>Kontaktinformasjon</h3>
+ <hr>
+ <p>
+ <span class="text-bold">Namn:</span>
+ @Model.CurrentOrder.ContactInfo.Name
+ </p>
+
+ @if (!Model.CurrentOrder.ContactInfo.EmailAddress.IsNullOrWhiteSpace()) {
+ <p>
+ <span class="text-bold">E-postadresse:</span>
+ @Model.CurrentOrder.ContactInfo.EmailAddress
+ </p>
+ }
+
+ @if (!Model.CurrentOrder.ContactInfo.PhoneNumber.IsNullOrWhiteSpace()) {
+ <p>
+ <span class="text-bold">Telefonnummer:</span>
+ @Model.CurrentOrder.ContactInfo.PhoneNumber
+ </p>
+ }
+ </div>
+ <div class="row">
+ <h3>Spørsmål?</h3>
+ <hr>
+ <p><a href="/#kontakt">Ta gjerne kontakt</a> hvis du har spørsmål vedrørande ordren din.</p>
+ </div>
+ </div>
+ <div class="col-12 col-md-8">
+ <div class="row">
+ <h2>Produktar</h2>
+ <hr>
+ <div class="h-100">
+ @foreach (var product in Model.CurrentOrderProducts) {
+ <div class="border-0 my-3 d-flex align-items-center">
+ <a href="@product.DbProdcut.WebPath()">
+ <img src="@product.DbProdcut.GetPrimaryImage().WebPath" class="blur-up lazyload w-150px object-fit-contain" alt="">
+ </a>
+ <div class="p-2 w-100">
+ <a href="@product.DbProdcut.WebPath()" class="h3">@product.DbProdcut.Name</a>
+ <div class="d-flex flex-column align-items-end w-100">
+ <span>Antall: <span>@product.OrderProduct.NumberOfItems</span></span>
+ <span class="fs-4">
+ Totalt:
+ <span>
+ @product.OrderProduct.Total().ToString("N", new NumberFormatInfo {
+ CurrencyDecimalDigits = 2
+ }),-
+ </span>
+ </span>
+ </div>
+ </div>
+ </div>
+ }
+ </div>
+ <div class="d-flex float-right flex-column">
+ <div class="d-flex flex-column">
+ <span class="h2">
+ Totalt: @Model.CurrentOrder.Total().ToString("N", new NumberFormatInfo {
+ CurrencyDecimalDigits = 2
+ }),-
+ </span>
+ <span>
+ Av dei MVA: @Model.CurrentOrder.Tax().ToString("N", new NumberFormatInfo {
+ CurrencyDecimalDigits = 2
+ }),-
+ </span>
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+ } else {
+ <h2>Vi fant ikkje din ordre</h2>
+ <p>Ver vennleg og <a href="/#kontakt">kontakt oss</a> hvis du meiner dette er ein feil.</p>
+ }
+</div>
diff --git a/src/Pages/Status.cshtml.cs b/src/Pages/Status.cshtml.cs
new file mode 100644
index 0000000..ed15120
--- /dev/null
+++ b/src/Pages/Status.cshtml.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.RazorPages;
+using Microsoft.EntityFrameworkCore;
+using VSH.Data;
+using VSH.Data.Database;
+
+namespace VSH.Pages;
+
+public class Status : PageModel
+{
+ private readonly MainDbContext _context;
+ public Order CurrentOrder { get; private set; }
+ public List<StatusProduct> CurrentOrderProducts { get; }
+
+ public Status(MainDbContext context) {
+ _context = context;
+ CurrentOrderProducts = new List<StatusProduct>();
+ }
+
+ public ActionResult OnGet(string orderReference) {
+ try {
+ CurrentOrder = _context.Orders.SingleOrDefault(o => o.OrderReference == orderReference);
+ if (CurrentOrder == default) return Page();
+
+ foreach (var orderProduct in CurrentOrder.Products) {
+ var dbProduct = _context.Products.Include(c => c.Category)
+ .SingleOrDefault(p => p.Id == orderProduct.Id);
+ if (dbProduct == default) continue;
+ CurrentOrderProducts.Add(new StatusProduct(dbProduct, orderProduct));
+ }
+
+ return Page();
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ }
+
+ return Redirect("/errors/500");
+ }
+
+ public class StatusProduct
+ {
+ public StatusProduct(Product dbProdcut, OrderProduct orderProduct) {
+ DbProdcut = dbProdcut;
+ OrderProduct = orderProduct;
+ }
+
+ public Product DbProdcut { get; }
+ public OrderProduct OrderProduct { get; }
+ }
+} \ No newline at end of file
diff --git a/src/Pages/_ViewImports.cshtml b/src/Pages/_ViewImports.cshtml
new file mode 100644
index 0000000..3a327c4
--- /dev/null
+++ b/src/Pages/_ViewImports.cshtml
@@ -0,0 +1,3 @@
+@using VSH
+@namespace VSH.Pages
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/src/Pages/_ViewStart.cshtml b/src/Pages/_ViewStart.cshtml
new file mode 100644
index 0000000..45bfaa9
--- /dev/null
+++ b/src/Pages/_ViewStart.cshtml
@@ -0,0 +1,3 @@
+@{
+ Layout = "_PublicLayout";
+}
diff --git a/src/Program.cs b/src/Program.cs
new file mode 100644
index 0000000..a723a0e
--- /dev/null
+++ b/src/Program.cs
@@ -0,0 +1,44 @@
+using System;
+using System.Reflection;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Hosting;
+using Serilog;
+
+namespace VSH;
+
+public static class Program
+{
+ public static int Main(string[] args) {
+ var config = new ConfigurationBuilder()
+ .AddUserSecrets(Assembly.GetExecutingAssembly(), true)
+ .AddEnvironmentVariables()
+ .Build();
+
+ Log.Logger = new LoggerConfiguration()
+ .Enrich.FromLogContext()
+ .WriteTo.Console()
+#if !DEBUG
+ .WriteTo.Seq(config.GetValue<string>("SEQ_API_URL"), apiKey: config.GetValue<string>("SEQ_API_KEY"))
+#endif
+ .CreateLogger();
+
+ try {
+ Log.Information("Starting web host");
+ CreateHostBuilder(args).Build().Run();
+ return 0;
+ } catch (Exception ex) {
+ Log.Fatal(ex, "Host terminated unexpectedly");
+ return 1;
+ } finally {
+ Log.CloseAndFlush();
+ }
+ }
+
+ private static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
+ .UseSerilog()
+ .ConfigureWebHostDefaults(webBuilder => {
+ webBuilder.UseKestrel(o => o.AddServerHeader = false);
+ webBuilder.UseStartup<Startup>();
+ });
+}
diff --git a/src/Properties/launchSettings.json b/src/Properties/launchSettings.json
new file mode 100644
index 0000000..0b6cfb3
--- /dev/null
+++ b/src/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "Default": {
+ "commandName": "Project",
+ "launchBrowser": false,
+ "applicationUrl": "https://0.0.0.0:5002;http://0.0.0.0:5001",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/Resources/ConnectingClasses/SharedControllerResources.cs b/src/Resources/ConnectingClasses/SharedControllerResources.cs
new file mode 100644
index 0000000..84fbf25
--- /dev/null
+++ b/src/Resources/ConnectingClasses/SharedControllerResources.cs
@@ -0,0 +1,6 @@
+namespace VSH;
+
+public class SharedControllerResources
+{
+ // dummy class for resource file
+} \ No newline at end of file
diff --git a/src/Resources/ConnectingClasses/SharedPageResources.cs b/src/Resources/ConnectingClasses/SharedPageResources.cs
new file mode 100644
index 0000000..79bac17
--- /dev/null
+++ b/src/Resources/ConnectingClasses/SharedPageResources.cs
@@ -0,0 +1,6 @@
+namespace VSH;
+
+public class SharedPageResources
+{
+ // dummy class for resource file
+} \ No newline at end of file
diff --git a/src/Resources/ConnectingClasses/SharedServiceResources.cs b/src/Resources/ConnectingClasses/SharedServiceResources.cs
new file mode 100644
index 0000000..e0bd98d
--- /dev/null
+++ b/src/Resources/ConnectingClasses/SharedServiceResources.cs
@@ -0,0 +1,6 @@
+namespace VSH;
+
+public class SharedServiceResources
+{
+ // dummy class for resource file
+} \ No newline at end of file
diff --git a/src/Resources/SharedControllerResources.en.resx b/src/Resources/SharedControllerResources.en.resx
new file mode 100644
index 0000000..6b75a2b
--- /dev/null
+++ b/src/Resources/SharedControllerResources.en.resx
@@ -0,0 +1,47 @@
+<root>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>1.3</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="_Kunne ikke finne produktet" xml:space="preserve">
+ <value>Could not find that product</value>
+ </data>
+ <data name="_Kunne ikke finne kategorien" xml:space="preserve">
+ <value>Could not find that category</value>
+ </data>
+ <data name="_En kategori med det navnet finnes allerede" xml:space="preserve">
+ <value>A category with that name already exists</value>
+ </data>
+ <data name="_Kan ikke slette kategorier som har tilhørende produkter" xml:space="preserve">
+ <value>Can not delete categories that contains products</value>
+ </data>
+ <data name="_Kan ikke slette kategorien" xml:space="preserve">
+ <value>Could not delete the category</value>
+ </data>
+ <data name="_Ugyldig skjema" xml:space="preserve">
+ <value>Invalid form</value>
+ </data>
+ <data name="_Ugyldig brukernavn eller passord" xml:space="preserve">
+ <value>Invalid username or password</value>
+ </data>
+ <data name="_Navn er påkrevd" xml:space="preserve">
+ <value>Name is required</value>
+ </data>
+ <data name="_Det nye navnet kan ikke være tomt" xml:space="preserve">
+ <value>New name is required</value>
+ </data>
+ <data name="_Nytt passord er påkrevd" xml:space="preserve">
+ <value>New password is required</value>
+ </data>
+ <data name="_Produktet er dessverre utilgjengelig" xml:space="preserve">
+ <value>This product is unfortunately not available</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/src/Resources/SharedPageResources.en.resx b/src/Resources/SharedPageResources.en.resx
new file mode 100644
index 0000000..0ba582f
--- /dev/null
+++ b/src/Resources/SharedPageResources.en.resx
@@ -0,0 +1,47 @@
+<root>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>1.3</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="_Forsiden" xml:space="preserve">
+ <value>Frontpage</value>
+ </data>
+ <data name="_Lagre" xml:space="preserve">
+ <value>Save</value>
+ </data>
+ <data name="_Språk" xml:space="preserve">
+ <value>Language</value>
+ </data>
+ <data name="_GÃ¥ videre" xml:space="preserve">
+ <value>Continue</value>
+ </data>
+ <data name="_Lukk" xml:space="preserve">
+ <value>Close</value>
+ </data>
+ <data name="_Handlekurv" xml:space="preserve">
+ <value>Cart</value>
+ </data>
+ <data name="_Personvernerklæring" xml:space="preserve">
+ <value>Privacy policy</value>
+ </data>
+ <data name="_Kontakt" xml:space="preserve">
+ <value>Contact</value>
+ </data>
+ <data name="_Produkter" xml:space="preserve">
+ <value>Products</value>
+ </data>
+ <data name="_GÃ¥ til kontoret" xml:space="preserve">
+ <value>Go to the office</value>
+ </data>
+ <data name="_I alt" xml:space="preserve">
+ <value>In total</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/src/Resources/SharedServiceResources.en.resx b/src/Resources/SharedServiceResources.en.resx
new file mode 100644
index 0000000..0db1973
--- /dev/null
+++ b/src/Resources/SharedServiceResources.en.resx
@@ -0,0 +1,14 @@
+<root>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>1.3</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+</root> \ No newline at end of file
diff --git a/src/Services/AssetsService.cs b/src/Services/AssetsService.cs
new file mode 100644
index 0000000..bf0029a
--- /dev/null
+++ b/src/Services/AssetsService.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using IOL.Helpers;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Logging;
+using VSH.Data;
+using VSH.Data.Static;
+
+namespace VSH.Services;
+
+public class AssetsService
+{
+ private readonly MainDbContext _context;
+ private readonly ILogger<AssetsService> _logger;
+
+
+ public AssetsService(MainDbContext context, ILogger<AssetsService> logger) {
+ _context = context;
+ _logger = logger;
+ }
+
+ public Task RemoveUnusedProductImages() {
+ try {
+ _logger.LogDebug("Starting RemoveUnusedProductImages");
+ var inUseFileNames = new List<string>();
+
+ foreach (var productImageList in _context.Products.Select(c => c.Images).AsNoTracking()) {
+ var defaultFiles = productImageList.Select(image => image.FileName).ToList();
+ var smallFiles = defaultFiles.Select(c => c.ExtractFileName() + "-300" + c.ExtractExtension());
+ var miniFiles = defaultFiles.Select(c => c.ExtractFileName() + "-150" + c.ExtractExtension());
+ inUseFileNames.AddRange(defaultFiles);
+ inUseFileNames.AddRange(miniFiles);
+ inUseFileNames.AddRange(smallFiles);
+ }
+
+ var removedFileCount = 0;
+ if (inUseFileNames.Any()) {
+ foreach (var diskFile in Directory.EnumerateFiles(AppPaths.ProductImages.HostPath)) {
+ if (inUseFileNames.Any(c => c == diskFile))
+ continue;
+ if (File.Exists(diskFile))
+ File.Delete(diskFile);
+ removedFileCount++;
+ _logger.LogDebug("Deleted " + diskFile);
+ }
+ }
+
+ _logger.LogInformation("Removed " + removedFileCount + " unused product images");
+ return Task.CompletedTask;
+ } catch (Exception ex) {
+ _logger.LogError("Exception removing unused assets: {exception}", ex.Message);
+ return Task.CompletedTask;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/Services/CookieService.cs b/src/Services/CookieService.cs
new file mode 100644
index 0000000..d73f0b6
--- /dev/null
+++ b/src/Services/CookieService.cs
@@ -0,0 +1,55 @@
+using System.Collections.Generic;
+using System.Globalization;
+using VSH.Data.Enums;
+using VSH.Data.Miscellaneous;
+using VSH.Data.Static;
+
+namespace VSH.Services;
+
+public class CookieService
+{
+ private static Dictionary<string, string> XsrfCookieDescriptions => new() {
+ {
+ "en",
+ "This cookie is only required for submitting forms like the order submit form. The cookie is used to prevent abuse, nothing personal is saved or shared with this cookie."
+ }, {
+ "nb",
+ "Denne informasjonskapselen er bare påkrevd for å sende skjema som for eksempel bestillingsskjema. Informasjonskapselen blir brukt for å forhindre misbruk, ingen persondata blir lagret eller delt med denne informasjonskapselen."
+ },
+ };
+
+ private static Dictionary<string, string> SessionCookieDescriptions => new() {
+ {
+ "en",
+ "This cookie is only required for keeping you logged in while using this site. The cookie is purely functional and nothing personal is saved or shared with this cookie."
+ }, {
+ "nb",
+ "Denne informasjonskapselen er bare påkrevd for å holde deg logget på imens du bruker denne siden. Informasjonskapselen er bare funksjonell og ingen persondata blir lagret eller delt med denne informasjonskapselen."
+ },
+ };
+
+ private static Dictionary<string, string> CultureCookieDescriptions => new() {
+ {
+ "en", "This cookie is used to keep track of your preffered language, nothing personal is saved or shared with this cookie."
+ }, {
+ "nb",
+ "Denne informasjonskapselen bruker vi for å lagre hvilket språk du vil se siden på, ingen persondata blir lagret eller delt med denne informasjonskapselen."
+ },
+ };
+
+ public static AppCookie GetCookie(CookieType type) {
+ var isoCode = CultureInfo.DefaultThreadCurrentCulture?.TwoLetterISOLanguageName ?? Startup.DefaultCulture.TwoLetterISOLanguageName;
+ return type switch {
+ CookieType.XSRF => AppCookies.Xsrf with {
+ Description = XsrfCookieDescriptions[isoCode]
+ },
+ CookieType.SESSION => AppCookies.Session with {
+ Description = SessionCookieDescriptions[isoCode]
+ },
+ CookieType.CULTURE => AppCookies.Culture with {
+ Description = CultureCookieDescriptions[isoCode]
+ },
+ _ => default
+ };
+ }
+} \ No newline at end of file
diff --git a/src/Services/EmailService.cs b/src/Services/EmailService.cs
new file mode 100644
index 0000000..d5098e0
--- /dev/null
+++ b/src/Services/EmailService.cs
@@ -0,0 +1,45 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Logging;
+
+namespace VSH.Services;
+
+public class EmailService
+{
+ private readonly string _sendGridApiKey;
+ private readonly string _fromAddress;
+ private readonly string _fromName;
+ private readonly string _replyToAddress;
+ private readonly ILogger<EmailService> _logger;
+
+ public EmailService(IConfiguration configuration, ILogger<EmailService> logger) {
+ _sendGridApiKey = configuration.GetValue<string>("SENDGRID_API_KEY");
+ _fromAddress = configuration.GetValue<string>("MAIL_FROM_ADDRESS");
+ _replyToAddress = configuration.GetValue<string>("MAIL_REPLY_TO_ADDRESS");
+ _fromName = configuration.GetValue<string>("MAIL_FROM_NAME");
+ _logger = logger;
+ }
+
+ public async Task<bool> SendEmailAsync(
+ string subject,
+ string message,
+ IEnumerable<string> recipients
+ ) {
+ foreach (var recipient in recipients) {
+ if (!await SendEmailAsync(subject, message, recipient)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ public Task<bool> SendEmailAsync(
+ string subject,
+ string message,
+ string recipient
+ ) {
+ return Task.FromResult(false);
+ }
+}
diff --git a/src/Services/OrderService.cs b/src/Services/OrderService.cs
new file mode 100644
index 0000000..21dfdee
--- /dev/null
+++ b/src/Services/OrderService.cs
@@ -0,0 +1,126 @@
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using IOL.Helpers;
+using IOL.VippsEcommerce;
+using IOL.VippsEcommerce.Models.Api;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Localization;
+using VSH.Data;
+using VSH.Data.Database;
+using VSH.Data.Results;
+using VSH.Utilities;
+
+namespace VSH.Services;
+
+public class OrderService
+{
+ private readonly MainDbContext _context;
+ private readonly IStringLocalizer<SharedServiceResources> _localizer;
+ private readonly IVippsEcommerceService _vippsService;
+ private readonly string _vippsMsn;
+
+ public OrderService(
+ MainDbContext context,
+ IStringLocalizer<SharedServiceResources> localizer,
+ IVippsEcommerceService vippsService,
+ IConfiguration configuration
+ ) {
+ _context = context;
+ _localizer = localizer;
+ _vippsService = vippsService;
+ _vippsMsn = configuration.GetValue<string>("VIPPS_MSN");
+ }
+
+ public AppValidationResult ValidateOrderProducts(Order payload) {
+ var validationResult = new AppValidationResult();
+ foreach (var product in payload.Products) {
+ var dbProduct = _context.Products.SingleOrDefault(p => p.Id == product.Id);
+ if (dbProduct == default || !dbProduct.IsAvailable || !dbProduct.IsVisible) {
+ var error = new AppValidationResult.ValidationError(product.Id);
+ error.Errors.Add(string.Format(_localizer["Dette produktet er dessverre ikke tilgjengelig"]));
+ validationResult.Errors.Add(error);
+ } else if (dbProduct.Count != -1 && dbProduct.Count < product.NumberOfItems) {
+ var error = new AppValidationResult.ValidationError(product.Id);
+ error.Errors.Add(string.Format(_localizer
+ [
+ "Vi har dessverre ikke så mange eksemplarer av dette produktet"]));
+ validationResult.Errors.Add(error);
+ }
+ }
+
+ return validationResult;
+ }
+
+ public AppValidationResult ValidateOrder(Order payload) {
+ var validationResult = new AppValidationResult();
+ if (payload.ContactInfo != default) {
+ if (payload.ContactInfo.Name.IsNullOrWhiteSpace()) {
+ var error = new AppValidationResult.ValidationError();
+ error.Errors.Add(_localizer["Navn er påkrevd"]);
+ validationResult.Errors.Add(error);
+ }
+
+ if (payload.ContactInfo.EmailAddress.IsNullOrWhiteSpace()) {
+ var error = new AppValidationResult.ValidationError();
+ error.Errors.Add(_localizer["E-postadresse er påkrevd"]);
+ validationResult.Errors.Add(error);
+ } else if (!payload.ContactInfo.EmailAddress.IsValidEmailAddress()) {
+ var error = new AppValidationResult.ValidationError();
+ error.Errors.Add(_localizer["E-postadressen er ugyldig"]);
+ validationResult.Errors.Add(error);
+ }
+
+ if (payload.ContactInfo.PhoneNumber.IsNullOrWhiteSpace()) {
+ var error = new AppValidationResult.ValidationError();
+ error.Errors.Add(_localizer["Telefonnummer er påkrevd"]);
+ validationResult.Errors.Add(error);
+ } else if (!payload.ContactInfo.PhoneNumber.IsValidNorwegianPhoneNumber()) {
+ var error = new AppValidationResult.ValidationError();
+ error.Errors.Add(_localizer["Telefonnummeret er ugyldig"]);
+ validationResult.Errors.Add(error);
+ }
+ } else {
+ var error = new AppValidationResult.ValidationError();
+ error.Errors.Add(_localizer["Kontaktinfo er påkrevd"]);
+ validationResult.Errors.Add(error);
+ }
+
+ var productValidationResult = ValidateOrderProducts(payload);
+ validationResult.Errors.AddRange(productValidationResult.Errors);
+
+ return validationResult;
+ }
+
+ public async Task<Uri> GetVippsPaymentUrlAsync(Order order, string hostname) {
+ var totalAmountInOre = order.Products.Sum(c => c.NumberOfItems * c.PriceAtTimeOfOrder) * 100;
+
+ var initiatePaymentRequest = new VippsInitiatePaymentRequest {
+ CustomerInfo = new TCustomerInfo {
+ MobileNumber = order.ContactInfo.PhoneNumber
+ },
+ Transaction = new TTransactionInfoInitiate {
+ Amount = Convert.ToInt32(totalAmountInOre),
+ OrderId = order.OrderReference,
+ TimeStamp = DateTime.UtcNow.ToString("o"),
+ SkipLandingPage = false,
+ TransactionText = "Bestilling på nett",
+ UseExplicitCheckoutFlow = false
+ },
+ MerchantInfo = new TMerchantInfo {
+ FallBack = hostname + "/api/orders/vipps/payment-callback/" + order.OrderReference,
+ CallbackPrefix = hostname + "/api/orders/vipps/callbacks-for-payment-update",
+ IsApp = false,
+ MerchantSerialNumber = _vippsMsn
+ }
+ };
+
+ try {
+ var response = await _vippsService.InitiatePaymentAsync(initiatePaymentRequest);
+ return response.Url.IsNullOrWhiteSpace() ? default : new Uri(response.Url);
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ throw;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/Startup.cs b/src/Startup.cs
new file mode 100644
index 0000000..c51a0e7
--- /dev/null
+++ b/src/Startup.cs
@@ -0,0 +1,169 @@
+using System;
+using System.Globalization;
+using System.IO;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using IOL.VippsEcommerce;
+using Microsoft.AspNetCore.Authentication.Cookies;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.DataProtection;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Localization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using VSH.BackgroundServices;
+using VSH.Data;
+using VSH.Data.Miscellaneous;
+using VSH.Data.Static;
+using VSH.Services;
+
+namespace VSH;
+
+public class Startup
+{
+ private IConfiguration Configuration { get; }
+ private IWebHostEnvironment Environment { get; }
+
+ public Startup(IConfiguration configuration, IWebHostEnvironment environment) {
+ Configuration = configuration;
+ Environment = environment;
+ }
+
+ // https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes
+ private static readonly CultureInfo[] _supportedCultures = {
+ new("nb"),
+ new("en")
+ };
+
+ public static CultureInfo DefaultCulture { get; private set; } = new("nb");
+
+ private static readonly Action<RequestLocalizationOptions> _appLocalizationOptions = options => {
+ options.DefaultRequestCulture = new RequestCulture(DefaultCulture, DefaultCulture);
+ options.ApplyCurrentCultureToResponseHeaders = false;
+ options.SupportedCultures = _supportedCultures;
+ options.SupportedUICultures = _supportedCultures;
+ /*options.RequestCultureProviders.Insert(0, new CookieRequestCultureProvider {
+ CookieName = Cookies.Culture.Name,
+ Options = new RequestLocalizationOptions {
+ DefaultRequestCulture = new RequestCulture(DefaultCulture, DefaultCulture)
+ }
+ }
+ );*/
+ };
+
+ private static readonly Action<JsonOptions> _jsonSettings = options => {
+ options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.Preserve;
+ options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
+ options.JsonSerializerOptions.NumberHandling = JsonNumberHandling.AllowReadingFromString;
+ options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
+ };
+
+ private string GetConnectionStringFromEnvironment() {
+ var host = Configuration.GetValue<string>("DB_HOST");
+ var port = Configuration.GetValue<string>("DB_PORT");
+ var user = Configuration.GetValue<string>("DB_USER");
+ var password = Configuration.GetValue<string>("DB_PASSWORD");
+ var database = Configuration.GetValue("DB_NAME", "vsh");
+ return $"Server={host};Port={port};Database={database};User Id={user};Password={password}";
+ }
+
+ public void ConfigureServices(IServiceCollection services) {
+ DefaultCulture = new CultureInfo(Configuration["General:DefaultCulture"]);
+ services.AddDataProtection()
+ .PersistKeysToFileSystem(new DirectoryInfo(AppPaths.DataProtectionKeys.HostPath));
+
+ services.Configure(_jsonSettings);
+
+ services.AddCors();
+
+ services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
+ .AddCookie(options => {
+ options.LoginPath = new PathString("/logginn");
+ options.Cookie.Name = AppCookies.Session.Name;
+ options.Cookie.SameSite = SameSiteMode.Strict;
+ options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
+ });
+
+ services.AddVippsEcommerceService(o => {
+ o.ApiUrl = "https://example.org";
+ o.PrimarySubscriptionKey = "1234";
+ o.ClientSecret = "1234";
+ o.ClientId = "1234";
+ });
+
+ services.AddAntiforgery(options => {
+ options.HeaderName = "XSRF-TOKEN";
+ options.FormFieldName = "xsrf";
+ options.Cookie.Name = AppCookies.Xsrf.Name;
+ options.Cookie.SameSite = SameSiteMode.Strict;
+ options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
+ });
+
+ services.AddDbContext<MainDbContext>(options => {
+ options.UseNpgsql(GetConnectionStringFromEnvironment(),
+ builder => {
+ builder.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery);
+ builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), default);
+ })
+ .UseSnakeCaseNamingConvention();
+ if (Environment.IsDevelopment())
+ options.EnableSensitiveDataLogging();
+ });
+
+ services.Configure(_appLocalizationOptions);
+ services.AddLocalization(options => {
+ options.ResourcesPath = "Resources";
+ });
+
+ services.AddScoped<OrderService>();
+ services.AddScoped<AssetsService>();
+ services.AddSingleton<EmailService>();
+ services.AddHostedService<StartupTasksBackgroundService>();
+ services.AddHostedService<VippsOrderStatusCheckerBackgroundService>();
+ services.Configure<AppSettings.GeneralConfiguration>(Configuration.GetSection(AppSettings.GeneralConfiguration.Name));
+ services.AddRazorPages(options => {
+ options.Conventions.AuthorizeFolder("/kontoret");
+ })
+ .AddRazorRuntimeCompilation()
+ .AddJsonOptions(_jsonSettings);
+
+ services.Configure<RouteOptions>(options => {
+ options.LowercaseUrls = true;
+ options.LowercaseQueryStrings = true;
+ });
+ services.AddControllers().AddJsonOptions(_jsonSettings);
+ }
+
+ public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
+ if (env.IsDevelopment()) {
+ app.UseDeveloperExceptionPage();
+ } else {
+ app.UseExceptionHandler("/errors/500");
+ }
+
+ CultureInfo.DefaultThreadCurrentCulture = DefaultCulture;
+ CultureInfo.DefaultThreadCurrentUICulture = DefaultCulture;
+
+ app.UseStatusCodePagesWithReExecute("/errors/{0}")
+ .UseStaticFiles()
+ .UseRouting()
+ .UseCors(builder => {
+ builder.WithOrigins("http://localhost:8080")
+ .AllowCredentials()
+ .AllowAnyHeader()
+ .AllowAnyMethod();
+ })
+ .UseRequestLocalization(_appLocalizationOptions)
+ .UseAuthentication()
+ .UseAuthorization()
+ .UseEndpoints(endpoints => {
+ endpoints.MapControllers();
+ endpoints.MapRazorPages();
+ });
+ }
+}
diff --git a/src/Utilities/ConfigurationExtensions.cs b/src/Utilities/ConfigurationExtensions.cs
new file mode 100644
index 0000000..9205567
--- /dev/null
+++ b/src/Utilities/ConfigurationExtensions.cs
@@ -0,0 +1,26 @@
+using System.Collections.Generic;
+using System.IO;
+using Microsoft.Extensions.Configuration;
+using VSH.Data.Static;
+
+namespace VSH.Utilities;
+
+public static class ConfigurationExtensions
+{
+ public static string GetVersion(this IConfiguration configuration) {
+ var versionFilePath = Path.Combine(AppPaths.WwwRoot.HostPath, "version.txt");
+ if (!File.Exists(versionFilePath))
+ return "unknown-" + configuration.GetValue<string>("ASPNETCORE_ENVIRONMENT");
+ var versionText = File.ReadAllText(versionFilePath);
+ return versionText + "-" + configuration.GetValue<string>("ASPNETCORE_ENVIRONMENT");
+ }
+
+ public static IEnumerable<string> GetOrderStatusEmailRecipients(this IConfiguration configuration) {
+ var orderEmailRecipientsFilePath =
+ Path.Combine(AppPaths.AppData.HostPath, "settings", "order_email_addresses");
+ if (!File.Exists(orderEmailRecipientsFilePath))
+ return default;
+ var fileContent = File.ReadAllText(orderEmailRecipientsFilePath);
+ return fileContent.Split(";");
+ }
+} \ No newline at end of file
diff --git a/src/Utilities/EnumName.cs b/src/Utilities/EnumName.cs
new file mode 100644
index 0000000..0bd871d
--- /dev/null
+++ b/src/Utilities/EnumName.cs
@@ -0,0 +1,38 @@
+using System;
+using VSH.Data.Enums;
+
+namespace VSH.Utilities;
+
+public static class EnumName
+{
+ public static string ForDocumentType(DocumentType type) => type switch {
+ DocumentType.SALES_TERMS => "Salsvilkår",
+ DocumentType.CONTACT_PAGE => "Kontaktside",
+ DocumentType.PRIVACY_POLICY => "Personvernerklæring",
+ DocumentType.ABOUT_PAGE => "Om oss",
+ DocumentType.DEALERS_PAGE => "Leverandørar",
+ _ => throw new ArgumentException("Unknown DocumentType " + type)
+ };
+
+ public static string ForOrderStatus(OrderStatus type) => type switch {
+ OrderStatus.FAILED => "Feila",
+ OrderStatus.CANCELLED => "Kansellert",
+ OrderStatus.COMPLETED => "Fullført",
+ OrderStatus.IN_PROGRESS => "Pågåande",
+ OrderStatus.AWAITING_VIPPS => "Ventar på vipps",
+ OrderStatus.AWAITING_INVOICE => "Ventar på faktura",
+ _ => throw new ArgumentException("Unknown OrderStatus " + type)
+ };
+
+ public static string ForPriceSuffix(PriceSuffix type) => type switch {
+ PriceSuffix.PER => ",-",
+ PriceSuffix.KILOS => ",- kg",
+ _ => throw new ArgumentException("Unknown PriceSuffix " + type)
+ };
+
+ public static string ForPaymentType(OrderPaymentType type) => type switch {
+ OrderPaymentType.VIPPS => "Vipps",
+ OrderPaymentType.INVOICE_BY_EMAIL => "Faktura på mail",
+ _ => throw new ArgumentException("Unknown OrderPaymentType " + type)
+ };
+} \ No newline at end of file
diff --git a/src/Utilities/ImageFunctions.cs b/src/Utilities/ImageFunctions.cs
new file mode 100644
index 0000000..dd2e07c
--- /dev/null
+++ b/src/Utilities/ImageFunctions.cs
@@ -0,0 +1,61 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+using ImageMagick;
+using IOL.Helpers;
+using VSH.Data.Static;
+
+namespace VSH.Utilities;
+
+public static class ImageFunctions
+{
+ private static MagickGeometry SmallGeometry => new(300);
+ private static MagickGeometry MiniGeometry => new(150);
+ private static MagickGeometry NormalGeometry => new(1280, 720);
+
+ public static void CreateProductImageCollection(FileInfo path) {
+ try {
+ using var image = new MagickImage(path);
+ if (image.Width > NormalGeometry.Width) {
+ image.Resize(NormalGeometry);
+ image.Write(path);
+ }
+
+ Debug.WriteLine(path.Name);
+
+ if (image.Width > SmallGeometry.Width) {
+ var fileName = Path.Combine(path.DirectoryName ?? AppPaths.ProductImages.HostPath,
+ path.Name.ExtractFileName() + "-300" + path.Extension);
+ if (!File.Exists(fileName)) {
+ image.Resize(SmallGeometry);
+ image.Write(fileName);
+ }
+ }
+
+ if (image.Width > MiniGeometry.Width) {
+ var fileName = Path.Combine(path.DirectoryName ?? AppPaths.ProductImages.HostPath,
+ path.Name.ExtractFileName() + "-150" + path.Extension);
+ if (!File.Exists(fileName)) {
+ image.Resize(MiniGeometry);
+ image.Write(fileName);
+ }
+ }
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ throw;
+ }
+ }
+
+ public static void EnsureNormalOrLessImageResolution(FileInfo path) {
+ try {
+ using var image = new MagickImage(path);
+ if (image.Width <= NormalGeometry.Width)
+ return;
+ image.Resize(NormalGeometry);
+ image.Write(path);
+ } catch (Exception e) {
+ Console.WriteLine(e);
+ throw;
+ }
+ }
+} \ No newline at end of file
diff --git a/src/VSH.csproj b/src/VSH.csproj
new file mode 100644
index 0000000..33e374a
--- /dev/null
+++ b/src/VSH.csproj
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project Sdk="Microsoft.NET.Sdk.Web">
+ <PropertyGroup>
+ <TargetFramework>net6.0</TargetFramework>
+ <UserSecretsId>c0ee06d5-7110-4457-8e58-8ccf3857b533</UserSecretsId>
+ <RuntimeIdentifier>linux-x64</RuntimeIdentifier>
+ <IsPackable>false</IsPackable>
+ </PropertyGroup>
+ <ItemGroup>
+ <PackageReference Include="EFCore.NamingConventions" Version="6.0.0" />
+ <PackageReference Include="IOL.Helpers" Version="2.0.0" />
+ <PackageReference Include="IOL.VippsEcommerce" Version="2.0.0" />
+ <PackageReference Include="Magick.NET-Q8-x64" Version="9.0.0" />
+ <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.1" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.1" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.1">
+ <PrivateAssets>all</PrivateAssets>
+ <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+ </PackageReference>
+ <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.3" />
+ <PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
+ <PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0" />
+ <PackageReference Include="Serilog.Sinks.Seq" Version="5.1.1" />
+ </ItemGroup>
+ <ItemGroup>
+ <Content Update="wwwroot/styles/**" CopyToPublishDirectory="Never" />
+ <Content Update="wwwroot/scripts/**" CopyToPublishDirectory="Never" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Update="Resources\SharedPageResources.nb.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>SharedPageResources.nb.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ <EmbeddedResource Update="Resources\SharedControllerResources.nb.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>SharedControllerResources.nb.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ <EmbeddedResource Update="Resources\SharedServiceResources.nb.resx">
+ <Generator>ResXFileCodeGenerator</Generator>
+ <LastGenOutput>SharedServiceResources.nb.Designer.cs</LastGenOutput>
+ </EmbeddedResource>
+ </ItemGroup>
+ <Target Name="MakeAppDataFoler" AfterTargets="Build">
+ <MakeDir Directories="$(OutDir)/AppData" Condition="!Exists('$(OutDir)/AppData')" />
+ </Target>
+</Project>
diff --git a/src/appsettings.json b/src/appsettings.json
new file mode 100644
index 0000000..6bb8d41
--- /dev/null
+++ b/src/appsettings.json
@@ -0,0 +1,10 @@
+{
+ "General": {
+ "StoreName": "Vinjesvingen Handel",
+ "LegalName": "Vinjesvingen Handel AS",
+ "ShortStoreName": "VSH",
+ "DefaultCulture": "nn",
+ "DefaultDescription": "Shopping og detaljhandel i Vinjesvingen",
+ "GoogleMapsUrl": "https://www.google.com/maps/place/Vinjesvingen+Handel/@59.6219662,7.821985,17z/data=!3m1!4b1!4m5!3m4!1s0x463f3346fe5a04e1:0x459ef21e0d098697!8m2!3d59.6219662!4d7.824179"
+ }
+}
diff --git a/src/wwwroot/assets/profile/header.min.new.svg b/src/wwwroot/assets/profile/header.min.new.svg
new file mode 100644
index 0000000..505f81c
--- /dev/null
+++ b/src/wwwroot/assets/profile/header.min.new.svg
@@ -0,0 +1,303 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ id="Layer_1"
+ viewBox="0 0 1283 471.46"
+ version="1.1">
+ <defs
+ id="defs3930">
+ <style
+ id="style3928">.cls-12,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-8,.cls-9{fill:none;stroke:#ee741e;stroke-miterlimit:10}.cls-2{stroke-width:.93px}.cls-8,.cls-9{stroke-width:.94px}.cls-12,.cls-14,.cls-15{stroke-width:.95px}.cls-16{stroke-width:.98px}.cls-17{stroke-width:1px}.cls-18{fill:#ee741e}</style>
+ </defs>
+ <path
+ class="cls-2"
+ d="M561.56 286.96l394.6-2.79M561.56 295.34l395.53-.93M235.82 418.65v6.52l155.42 4.65v-6.58l-155.42-4.59zM325.16 396.32l-89.34 22.33M391.24 422.96l89.81-34.55M391.71 429.36l72.59-28.85M464.72 396.32v7.83h63.77v-7l-63.77-.83zM482.91 383.75v8.71M392.17 387.48l88.49.63"
+ id="path3934" />
+ <path
+ class="cls-2"
+ d="M351.91 375.61v-3.38l24.2-3.37v2.44l25.45.35a.12.12 0 010 .23L378 382.82l-33.5-4.65c-.16 0-.16-.9 0-.93l31.64-5.94"
+ transform="translate(1.64)"
+ id="path3936" />
+ <path
+ class="cls-2"
+ d="M326.56 350.25v46.07h5.06v-2.31l9.83 1.84v3.72l3.72.93 8.38-2.79V379.31"
+ id="path3938" />
+ <path
+ stroke-width=".89"
+ stroke-miterlimit="10"
+ stroke="#ee741e"
+ fill="none"
+ d="M340.99 369.79l-9.31-1.86v19.28l9.31 2.54v-19.96z"
+ id="path3940" />
+ <path
+ class="cls-2"
+ d="M347.86 367.93l33.83-4.65s4.66-17.68-11.16-16.75-22.07 3.47-22.67 12 0 9.4 0 9.4z"
+ transform="translate(1.64)"
+ id="path3942" />
+ <path
+ class="cls-2"
+ d="M352.45 365.14l25.5-3.51s3.51-13.33-8.42-12.63-16.63 2.62-17.08 9 0 7.14 0 7.14zM358.43 322.33V340s-25.13-3.72-37.23 7.45l20.47 3.79s17.49-17.82 44.11-4.76"
+ transform="translate(1.64)"
+ id="path3944" />
+ <path
+ class="cls-2"
+ d="M368.82 322.33v19.38"
+ id="path3946" />
+ <path
+ class="cls-2"
+ d="M355.63 314.88h13.54a.41.41 0 00.21-.76c-2.2-1.3-7.52-3.45-14.2.76"
+ transform="translate(1.64)"
+ id="path3948" />
+ <path
+ class="cls-2"
+ d="M360.06 315.81l-1.91 6.52h12.06l-1.77-7.45"
+ id="path3950" />
+ <path
+ class="cls-2"
+ d="M383.55 380s.53 2.27 4 7.18.67 23.53.67 23.53h-5.88s3-15.93.72-21c-1.78-3.6-2.29-3.19-2.29-3.19s1.28 1.89 1.57 7.46a108.72 108.72 0 01-.64 13.94l-4.65.78v-20.29c0-5.59-1.86-1.86-8.38 1.86-7.44 7.44-.93 21.4-.93 21.4s-5.58.93-6.51.93c-3.72-17.68 0-25.12 4.65-27s4.66-3.72 4.66-3.72"
+ transform="translate(1.64)"
+ id="path3952" />
+ <path
+ class="cls-2"
+ d="M339.59 306.51l217.78-.93v1.86l-217.78.98v-1.91zM339.59 306.51l92.14-35.37 129.36-.93"
+ id="path3954" />
+ <path
+ class="cls-2"
+ d="M562.95 217.16l-1.86 85.62h8.38l-4.16 3.73v5.89h-218.1v-3.98M407.53 370.72v-55.04h38.27l-1.06 55.04h-37.21z"
+ id="path3956" />
+ <path
+ class="cls-2"
+ d="M402.41 373.05v-57.37h48.05l-1.34 57.37h-46.71zM547.13 378.17l-151.7-2.79M553.36 312.4v70.5l138.03 3.65M536.22 389.34l151.44 4.65-1.56 2.33 49.96.46-2.16-7.03 18.91.69M535.97 396.32l149.83 4.18.3-4.18"
+ id="path3958" />
+ <path
+ class="cls-2"
+ d="M736.06 396.78l10-.46 2.78 9.36-218.46-7.97"
+ id="path3960" />
+ <path
+ class="cls-2"
+ d="M748.84 405.68v6.88l-218.46-8.33v-6.52l5.59-1.39.25-6.98 10.91-5.23v-5.94l-18.64 6.42v9.66l-49.3-1.93M617.86 264.63h-19.54v-35.37h19.54v35.37zM639.27 264.63H619.72v-35.37h19.55v35.37zM629.7 229.73v34.43M619.72 240.87h19.08M619.87 252.44l18.93.01M608.3 229.73v34.43M598.32 240.87h19.08M598.32 252.44l19.08.01M591.8 224.61l.93 2.79h51.97l1.08-2.79H591.8zM594.33 227.4v39.52h2.88V227.4M640.87 227.4v39.52h2.88V227.4M591.8 266.92h53.98v2.24l-53.98.53v-2.77zM730.77 261.78h-20.32v-35.36h20.32v35.36zM753.02 261.78H732.7v-35.36h20.32v35.36zM743.07 226.88v34.44M732.7 238.03h19.83M732.85 249.59l19.68.02M720.82 226.88v34.44M710.45 238.03h19.83M710.45 249.59l19.83.02M703.68 221.76l.96 2.8h54.02l1.13-2.8h-56.11zM706.31 224.56v39.51h2.99v-39.51M754.68 224.56v39.51h2.99v-39.51M703.68 264.07h56.11v2.24l-56.11.54v-2.78zM858.65 260.7h-22v-36.42h22v36.42zM882.75 260.7h-22v-36.42h22v36.42zM871.98 224.76v35.46M860.75 236.24h21.48M860.92 248.15l21.31.01M847.88 224.76v35.46M836.65 236.24h21.48M836.65 248.15l21.48.01M829.32 219.49l1.05 2.87h58.49l1.23-2.87h-60.77zM832.16 222.36v40.7h3.25v-40.7M884.55 222.36v40.7h3.24v-40.7M829.32 263.06h60.77v2.31l-60.77.55v-2.86zM735.13 314.88h18.61v41.88h-18.61zM744.43 314.88l.35 41.88M735.13 325.28h18.61M735.13 335.31h18.61M735.13 345.13h18.61M755.6 314.88h18.61v41.88H755.6zM764.91 314.88l.35 41.88M755.6 325.28h18.62M755.6 335.31h18.62M755.6 345.13h18.62"
+ id="path3962" />
+ <path
+ class="cls-2"
+ d="M732.34 313.02h44.67v45.6h-44.67zM596.23 314.75h16.39v38.89h-16.39zM604.43 314.75l.3 38.89M596.23 324.41h16.39M596.23 333.72h16.39M596.23 342.84h16.39M614.26 314.75h16.39v38.89h-16.39zM622.46 314.75l.3 38.89M614.26 324.41h16.39M614.26 333.72h16.39M614.26 342.84h16.39"
+ id="path3964" />
+ <path
+ class="cls-2"
+ d="M594.6 313.02h37.69v42.35H594.6zM855.29 317.67h19.63v41.88h-19.63zM865.1 317.67l.36 41.89M855.29 328.08h19.62M855.29 338.11h19.62M855.29 347.92h19.62M876.87 317.67h19.63v41.88h-19.63zM886.69 317.67l.36 41.89M876.87 328.08h19.63M876.87 338.11h19.63M876.87 347.92h19.63"
+ id="path3966" />
+ <path
+ class="cls-2"
+ d="M853.32 315.81h45.14v45.6h-45.14zM696.97 313.95h22.34v49.33h-22.34z"
+ id="path3968" />
+ <path
+ class="cls-2"
+ d="M692.32 310.23h31.64v67.94h-31.64zM692.32 378.17h31.64v8.38h-31.64zM695.06 386.55l-3.67 4.78 27.92-.13-1.63-4.65M730.47 306.51h13.03v4.65h-13.03z"
+ id="path3970" />
+ <circle
+ class="cls-2"
+ cx="722.1"
+ cy="340.01"
+ r=".93"
+ id="circle3972" />
+ <path
+ class="cls-2"
+ d="m 720.46,342.8 v 1.87 c 0,0.51362 -0.41638,0.93 -0.93,0.93 h -4.65 l 0.0998,-0.94 H 720.46"
+ id="path3974"
+ transform="translate(1.64)"
+ style="fill:none;stroke:#ee741e;stroke-width:0.93000001px;stroke-miterlimit:10"/>
+ <path
+ class="cls-2"
+ d="M688.65 386.47v-79.96h39.27v82.43"
+ id="path3976" />
+ <path
+ class="cls-2"
+ d="M751.3 373.52h14.34a.09.09 0 01.08.14c-.9 1.08-6.79 7.51-14.46-.05a.05.05 0 01.04-.09z"
+ transform="translate(1.64)"
+ id="path3978" />
+ <path
+ class="cls-2"
+ d="M765.83 373.52s.23 1.86-.7 18.61c-8.37 4.65-14-1.69-14-1.69v-16.92"
+ transform="translate(1.64)"
+ id="path3980" />
+ <path
+ class="cls-2"
+ d="M385.26 346.49v24.91M345.17 351.18v48.86"
+ id="path3982" />
+ <path
+ class="cls-2"
+ d="M749.31 185.52L904.73 179l79.11 14.89L816 199.48l-294.52 8.37 52-16.7 157.81-4.6"
+ transform="translate(1.64)"
+ id="path3984" />
+ <path
+ stroke-width="1.03"
+ stroke-miterlimit="10"
+ stroke="#ee741e"
+ fill="none"
+ d="M732.8 156.42l17.02.25 1.13 32.57H732.8v-32.82z"
+ id="path3986" />
+ <path
+ class="cls-2"
+ d="M526.66 210.65v4.73l458.82-14.08v-4.27l-458.82 13.62z"
+ id="path3988" />
+ <path
+ class="cls-2"
+ d="M961.16 202.04l24.32 5.81 6.52-13.02-9.64-1.52M522.93 207.85v8.95l3.73 1.57v4.55l18.94-7.53M569.47 302.78l387.16-.93-1.86-99.58"
+ id="path3990" />
+ <path
+ class="cls-2"
+ d="M947.54 301.85c.39.93-.38 94.93-.38 94.93l-182-4.65"
+ transform="translate(1.64)"
+ id="path3992" />
+ <path
+ class="cls-2"
+ d="M939.88 396.78l.93 13.03-165.11-3.43M956.69 288.36l103.93 27.45-2.99 8.6-101.13-28.37M1028.18 316.74l6.63 89.35-49.33 1.78M1031.15 405.84v10.14M562.84 222.36l391.86-9.53M561.56 275.79l394.07-2.47M562.68 229.73l31.45-.47M643.75 229.26l62.99-.93M757.67 226.88l73.91-2.12M887.79 224.28l66.91-1.92M562.68 239.03l31.45-.46M643.75 238.57l62.99-.93M757.67 236.19l73.91-2.12M887.79 233.59l66.91-1.92M562.68 250.2l31.45-.46M643.75 249.74l62.99-.94M757.67 247.36l73.91-2.13M887.79 244.76l66.91-1.92M562.68 260.44l31.45-.47M643.75 259.97l62.99-.93M757.67 257.6l73.91-2.13M887.79 254.99l66.91-1.91"
+ id="path3994" />
+ <path
+ stroke-width=".92"
+ stroke-miterlimit="10"
+ stroke="#ee741e"
+ fill="none"
+ d="M561.75 268.81l30.52-.46M645.32 268.35l184.27-2.79"
+ id="path3996" />
+ <path
+ stroke-width=".91"
+ stroke-miterlimit="10"
+ stroke="#ee741e"
+ fill="none"
+ d="M890.09 263.37l64.61-1.92"
+ id="path3998" />
+ <path
+ class="cls-2"
+ d="M574.06 302.78v80.62M580.32 302.78v80.47M587.43 302.74v80.66M559.84 312.56v70.69M566.96 305.11v78.29M634.55 302.78l.06 82.37M640.81 302.78v82.37M647.93 302.74v82.41M655.03 302.78v83.3M661.29 302.78v83.3M668.4 302.74v83.34M674.57 302.78v83.3M680.83 302.78v83.3M594.53 355.38v28.84M600.79 355.38v28.78M607.91 355.37v28.85M615.01 355.38v28.84M621.27 355.38v28.78M628.1 355.37v29.78M594.53 302.75v9.81M600.79 302.75v9.79M607.91 302.74v9.82M615.01 302.75v9.81M621.27 302.75v9.79M628.38 302.74v9.82M802.07 301.86v90.73"
+ id="path4000" />
+ <path
+ class="cls-8"
+ d="M808.33 301.86v91.49M815.45 301.81v91.72M822.55 301.86v91.67"
+ id="path4002" />
+ <path
+ class="cls-9"
+ d="M828.81 301.86v91.67"
+ id="path4004" />
+ <path
+ class="cls-8"
+ d="M835.92 301.81v91.72"
+ id="path4006" />
+ <path
+ stroke-width=".94"
+ stroke-miterlimit="10"
+ stroke="#ee741e"
+ fill="none"
+ d="M842.09 301.86v91.67"
+ id="path4008" />
+ <path
+ class="cls-9"
+ d="M848.35 301.86v91.67"
+ id="path4010" />
+ <path
+ class="cls-2"
+ d="M855.47 301.81v13.54M780.67 302.32v90.27M787.86 302.32v90.11M794.97 302.32v90.27M755.54 358.16v14.89M762.73 358.18v14.87M769.84 359.09v32.57M775.08 359.11v33.48M734.14 359.09v30.71M741.33 359.09v30.66M748.44 358.16v31.64M757.4 302.32v10.24M764.59 302.32v10.24M771.71 302.62v10.57M736 302.62v3.42M743.19 302.62v4.35M750.3 302.32v10.26M882.11 301.82v13.53M888.37 301.82v13.5M895.49 301.81v13.54M902.59 301.86v93.53M908.85 301.86v93.35M915.96 301.81v93.58M922.13 301.86v94.46M928.39 301.86v94.28M935.51 301.81v94.51M943.88 301.81v94.51M861.64 301.96v13.39M867.9 301.96v13.36M875.01 301.95v13.4"
+ id="path4012" />
+ <path
+ stroke-width=".95"
+ stroke-miterlimit="10"
+ stroke="#ee741e"
+ fill="none"
+ d="M855.47 360.95v33.51"
+ id="path4014" />
+ <path
+ class="cls-12"
+ d="M882.11 361.9v33.49"
+ id="path4016" />
+ <path
+ stroke-width=".95"
+ stroke-miterlimit="10"
+ stroke="#ee741e"
+ fill="none"
+ d="M888.37 361.88v33.45"
+ id="path4018" />
+ <path
+ class="cls-12"
+ d="M895.49 361.88v33.51"
+ id="path4020" />
+ <path
+ class="cls-14"
+ d="M861.64 360.97v33.49M867.9 360.97v33.42M875.01 360.95v33.51"
+ id="path4022" />
+ <path
+ class="cls-2"
+ d="M516.82 364.18v-7.39s3.72-4.71 7.45-4.71 6.51 2.79 5.58 4.66-.93 7.44-.93 7.44a15.35 15.35 0 01-12.1 0z"
+ transform="translate(1.64)"
+ id="path4024" />
+ <path
+ class="cls-2"
+ d="M516.82 365.42V377s6.52 2.09 12.1.23v-13M523.43 363s2.7.3 2.7-.63-1.68-2.49-2.7-1.71 0 2.34 0 2.34z"
+ transform="translate(1.64)"
+ id="path4026" />
+ <path
+ class="cls-15"
+ d="M407.53 358.53h37.44M374.65 313.02v29.24M382.56 312.4v32.03M390.91 312.56v58.9M399.29 312.56v58.9"
+ id="path4028" />
+ <path
+ class="cls-2"
+ d="M454.99 312.09l-1.72 63.75M463.37 313.02l-1.73 63.75"
+ id="path4030" />
+ <path
+ class="cls-16"
+ d="M480.12 313.02l-1.72 63.75M471.75 313.02l-1.73 63.75M489.43 313.02l-1.73 63.75"
+ id="path4032" />
+ <path
+ class="cls-17"
+ d="M497.81 312.56l-1.73 65.14M514.56 312.56l-1.73 65.14M506.18 312.56l-1.73 65.14"
+ id="path4034" />
+ <path
+ class="cls-2"
+ d="M521.7 312.4v41.24M530.38 312.4l-.5 40.88M537.35 312.4l-1.13 65.3M545.89 312.09l-1.71 66.02M552.01 312.4v70.85l1.99-.33M960.96 297.29l1.25 87.86M975.68 301.42l-.44 93.04M990.45 305.56v102.31M1004.09 309.3l1.87 98.19M1016.51 313.01l3.41 94.01"
+ id="path4036" />
+ <path
+ class="cls-2"
+ d="M946 414.88q-3.35-10.53-6.36-21.17c4.91 5.55 5.88 13.66 10.36 19.56l-3.44-19.6a3.29 3.29 0 01.27-2.59c1.35 1.32 1.7 3.33 2.06 5.18a82.64 82.64 0 004.21 14.63 3 3 0 001.51 1.94c1.26-7.83-.92-15.83-.32-23.74.55 7.4 1.13 14.89 3.38 22a6.86 6.86 0 00.91-2.43l3-12.65a142 142 0 01-1.91 16.43l5.72-13c.82 4.36-1.47 8.78-1.09 13.21 1.13-1 1.53-2.57 2-4a25.27 25.27 0 014.37-8L967.14 415q4.1-5.27 8.52-10.26c.77 3.36-2 6.57-2 10l6.72-7.18c.75 1.66-.51 3.5-.8 5.3a1.58 1.58 0 000 .78c.35.94 1.73.7 2.68.35a13 13 0 016.58-.85c1.41.23 2.76.77 4.16 1.05a5.59 5.59 0 004.16-.49M944.75 412.93c-1.78-1.88-2.28-4.64-3.82-6.73-.41-.56-1.08-1.11-1.73-.85s-.73 1.14-.71 1.85l.08 2.86c0 .54 0 1.17-.48 1.45a1.19 1.19 0 01-.79.1 6.29 6.29 0 01-1.59-.66 2.57 2.57 0 00-1.66-.32 1.12 1.12 0 00-.9 1.26 1.54 1.54 0 001.14.86 14.76 14.76 0 005.18.22c-1.48.42-3.07.25-4.56.61a30.28 30.28 0 00-2.93 1.09c-2.94 1-6.17.74-9.27.44"
+ transform="translate(1.64)"
+ id="path4038" />
+ <path
+ class="cls-2"
+ d="M947.83 414.31a33.48 33.48 0 01-1.49-6.59l-1.42-9.13c.32 0 .56.29.73.58a25.08 25.08 0 012.5 5.16c.41 1.35.59 2.77 1 4.11.54 1.66 1.48 3.2 1.73 4.93.29-5.67.6-11.35 1.38-17q1.37 5.67 2.47 11.4c.35 1.82.73 3.74 2 5.1 2-4.4 2.17-9.35 2.35-14.17.29 2.29.2 4.62.33 6.92a14.84 14.84 0 001.68 6.66 27.13 27.13 0 003.15-9.25l-.47 7.9a9.64 9.64 0 00.09 2.63 3.53 3.53 0 001.77-1.76c1.25-2.22 2-4.8 3.77-6.6a59.09 59.09 0 00-1.52 9.25 6.7 6.7 0 002-2.44q1.43-2.43 2.82-4.87a55.44 55.44 0 01-1 7.48M977.47 408.1a30.9 30.9 0 004.12-7.81c.46.54.94 1.06 1.45 1.55a2.82 2.82 0 001.11.74 1.67 1.67 0 001.89-1.21 2.37 2.37 0 00-.73-2.25 4.14 4.14 0 00-2.23-1 5.93 5.93 0 002.69-1.92 2 2 0 00-.55-2.91 2.22 2.22 0 00-2.24.53 4.05 4.05 0 00-1.4 2.76 3.16 3.16 0 00-1.69-1.44 2.62 2.62 0 00-2.58 1.51 2.39 2.39 0 00-.41 1.36 2 2 0 001.59 1.59 5.74 5.74 0 002.4-.14"
+ transform="translate(1.64)"
+ id="path4040" />
+ <path
+ class="cls-2"
+ d="M971.64 406.82a43.28 43.28 0 003.46-8.65 4.59 4.59 0 01.75-1.93c.22-.26.49-.46.72-.7a2.81 2.81 0 00.78-2 1.32 1.32 0 00-.14-.65c-.4-.65-1.4-.42-2 0a5.88 5.88 0 00-2 2.5 3.57 3.57 0 00-2.72-1.69 1.63 1.63 0 00-1.62.65c-.39.71.16 1.59.81 2.07a4.73 4.73 0 003.82.81"
+ transform="translate(1.64)"
+ id="path4042" />
+ <path
+ class="cls-2"
+ d="M963.59 401.9c.53-2.47 2.15-4.58 2.73-7a22.71 22.71 0 01.71-3.17c.31-.76.83-1.57.56-2.35a1.6 1.6 0 00-2.39-.56 2.69 2.69 0 00-.88 2.57 2.07 2.07 0 00-2.62-.2 1.6 1.6 0 000 2.46c.83.56 1.94.07 2.82-.42l3.11-1.75a4.1 4.1 0 011.33-.56 1.39 1.39 0 011.31.43c.54.7 0 1.71-.7 2.25a3 3 0 01-2 .72A1.76 1.76 0 01966 393M959 400.58l.28-10a2.13 2.13 0 002.34-1.35 6.17 6.17 0 00.29-2.9 2.41 2.41 0 00-.22-1 .83.83 0 00-.86-.46 1.07 1.07 0 00-.53.41 5.66 5.66 0 00-.66 3.71 6.35 6.35 0 00-2.21-3.3c-.3-.22-.74-.41-1-.15a.81.81 0 00-.13.63 6 6 0 001.75 3.57 1.37 1.37 0 00-1.49-1.16 2.6 2.6 0 00-1.75 1.07 1 1 0 00-.27.94 1 1 0 00.73.48 6.5 6.5 0 003.19 0M749.35 407.26q-1.61-3.75-2.83-7.64a17.35 17.35 0 012.34 6.77c.72-2.11.18-4.69 1.58-6.43l.29 7.35a19.69 19.69 0 013-5.28 6.47 6.47 0 01-1.31 2.32 3.32 3.32 0 00-.77 2.49 27.28 27.28 0 015.82-2.08l-1.28 2.39a4.22 4.22 0 011.4-1.64 1.47 1.47 0 012 .31c.11.18.16.38.28.55.4.59 1.31.48 1.93.13a6.34 6.34 0 011.85-1c.89-.18 1.75.37 2.66.49 1.25.18 2.51-.47 3.77-.31.76.1 1.46.49 2.22.65 1.93.39 3.9-.78 5.86-.55a19.88 19.88 0 012.71.77 14.72 14.72 0 003 .38l5.11.29"
+ transform="translate(1.64)"
+ id="path4044" />
+ <path
+ d="M683 282.77h60.29a.18.18 0 01.18.18v10.11a5.4 5.4 0 01-5.4 5.4H677.5a.18.18 0 01-.18-.18v-9.8a5.71 5.71 0 015.68-5.71z"
+ stroke-width="1.4"
+ stroke="#ed7320"
+ stroke-miterlimit="10"
+ fill="#fff"
+ id="path4094" />
+ <path
+ class="cls-18"
+ d="M678.29 288.52h.76l1 3.19 1-3.19h.76l-1.45 4.39h-.61zM682.29 288.52h.71v.72h-.72zm0 1.26h.71v3.13h-.72zM683.87 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM686.91 293.5h.27a.2.2 0 00.15-.06.24.24 0 000-.18v-3.48h.73v3.58a.88.88 0 01-.2.61.74.74 0 01-.57.22h-.43zm.47-5h.73v.72h-.73zM689.55 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.78 1.78 0 01.16-.8 1.17 1.17 0 01.46-.5 1.54 1.54 0 01.73-.17 1.19 1.19 0 01.69.2 1.3 1.3 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.14v-.53h1.47a1 1 0 00-.18-.52.53.53 0 00-.42-.18.61.61 0 00-.5.21.84.84 0 00-.18.58v.4a.75.75 0 00.19.55.78.78 0 00.55.19 1.09 1.09 0 00.35-.07 1.08 1.08 0 00.31-.19l.48.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM692.93 292.91a2.36 2.36 0 01-.47-.16 1.6 1.6 0 01-.4-.25l.43-.54a1.89 1.89 0 00.49.25 1.46 1.46 0 00.49.09 1.09 1.09 0 00.5-.09.28.28 0 00.17-.26.24.24 0 00-.08-.19.4.4 0 00-.22-.09l-.36-.05h-.21a2.82 2.82 0 01-.54-.11.68.68 0 01-.36-.25.88.88 0 01-.14-.53 1 1 0 01.14-.54 1 1 0 01.42-.34 2 2 0 01.69-.11 1.83 1.83 0 01.47 0 2.23 2.23 0 01.44.13 3.11 3.11 0 01.4.22l-.44.53a1.58 1.58 0 00-.44-.2 1.39 1.39 0 00-.44-.07 1 1 0 00-.43.08.27.27 0 00-.15.24.19.19 0 00.08.16.44.44 0 00.21.07l.35.05h.14a2.66 2.66 0 01.58.1.77.77 0 01.39.26.89.89 0 01.16.58 1 1 0 01-.15.56.88.88 0 01-.45.34 2 2 0 01-.73.12 3.1 3.1 0 01-.54 0zM697.25 289.78h.75l-1.18 3.13h-.53l-1.18-3.13h.74l.7 2.1zM698.51 288.52h.72v.72h-.72zm0 1.26h.72v3.13h-.72zM700.09 289.78h.72v3.13h-.72zM702 291a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.84.84 0 01.5-.15 1 1 0 01.78.33 1.44 1.44 0 01.28.95v1.9H702zM704 292.81a1 1 0 01-.37-.45 1.88 1.88 0 01-.12-.71v-.6a1.94 1.94 0 01.12-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1 1 0 01.35.42l-.06.67a.59.59 0 00-.07-.31.37.37 0 00-.18-.19.62.62 0 00-.71.1.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.62.62 0 00.71.1.41.41 0 00.18-.19.62.62 0 00.07-.31v.69a.82.82 0 01-.8.55 1.07 1.07 0 01-.54-.16zm0 1.25a1.1 1.1 0 01-.45-.37l.49-.45a.71.71 0 00.27.22.8.8 0 00.33.08.69.69 0 00.49-.17.61.61 0 00.18-.47v-3.12h.69v3a1.53 1.53 0 01-.16.74 1.12 1.12 0 01-.47.47 1.6 1.6 0 01-.75.16 1.51 1.51 0 01-.62-.09zM707.45 292.8a1.14 1.14 0 01-.49-.48 1.65 1.65 0 01-.16-.77v-.35a1.78 1.78 0 01.16-.8 1.12 1.12 0 01.46-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.69.2 1.29 1.29 0 01.43.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a.9.9 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.89.89 0 00-.17.58v.4a.75.75 0 00.19.55.77.77 0 00.54.19 1.15 1.15 0 00.36-.07 1.23 1.23 0 00.31-.19l.47.44a1.73 1.73 0 01-.54.35 1.53 1.53 0 01-.6.12 1.57 1.57 0 01-.75-.19zM710.21 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM718.72 288.52h.73v4.39h-.73zm.39 1.88h2.5v.69h-2.5zm2.07-1.88h.72v4.39h-.72zM723 292.72a.92.92 0 01-.27-.73.88.88 0 01.27-.7 1.25 1.25 0 01.82-.23h.84v.56h-.88a.47.47 0 00-.32.09.32.32 0 00-.11.28.33.33 0 00.14.29.76.76 0 00.42.1 1.29 1.29 0 00.51-.08.25.25 0 00.17-.23l.06.44a.49.49 0 01-.18.25.75.75 0 01-.31.15 1.6 1.6 0 01-.39 0 1.17 1.17 0 01-.77-.19zm1.63-1.8a.49.49 0 00-.16-.4.6.6 0 00-.44-.15 1 1 0 00-.35.06 1.07 1.07 0 00-.32.16l-.48-.41a1.21 1.21 0 01.48-.33 1.81 1.81 0 01.67-.12 1.55 1.55 0 01.68.14 1 1 0 01.44.4 1.22 1.22 0 01.15.63v2h-.67zM726.16 289.78h.73v3.13h-.73zM728 291a.6.6 0 00-.16-.43.54.54 0 00-.43-.16.5.5 0 00-.55.55l-.07-.65a1.24 1.24 0 01.36-.44.9.9 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.28.95v1.9H728zM730 292.81a.93.93 0 01-.37-.45 1.87 1.87 0 01-.13-.71v-.6a1.93 1.93 0 01.13-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1.13 1.13 0 01.35.42l-.07.67a.71.71 0 00-.06-.31.37.37 0 00-.18-.19.56.56 0 00-.3-.07.51.51 0 00-.41.17.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.51.51 0 00.41.17.56.56 0 00.3-.07.41.41 0 00.18-.19.75.75 0 00.06-.31v.69a1 1 0 01-.3.4.84.84 0 01-.5.15 1.07 1.07 0 01-.53-.16zm1.33-4.29h.73v4.39h-.73zM733.52 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.93 1.93 0 01.16-.8 1.14 1.14 0 01.47-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.68.2 1.24 1.24 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a1 1 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.84.84 0 00-.18.58v.4a.76.76 0 00.2.55.77.77 0 00.54.19 1 1 0 00.35-.07 1.29 1.29 0 00.32-.19l.47.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM737 292a.24.24 0 00.06.18.21.21 0 00.16.06h.22v.69h-.4a.73.73 0 01-.56-.21.86.86 0 01-.2-.62v-3.57h.72z"
+ transform="translate(1.64)"
+ id="path4096" />
+ <path
+ d="M720.79 282.77c-.18.63-.55 1.78-1.29 3.67-1.24 3.19-3 5.09-2.47 7.14s2 3 4.82 3.84a45.51 45.51 0 004.73 1.05l-.74-.13"
+ stroke="#ed7320"
+ stroke-width=".93"
+ stroke-miterlimit="10"
+ fill="none"
+ id="path4098" />
+ <rect
+ style="fill:#ffffff"
+ id="rect4643"
+ width="49.513657"
+ height="86.249596"
+ x="117.39529"
+ y="36.21896" />
+</svg>
diff --git a/src/wwwroot/assets/profile/header.min.svg b/src/wwwroot/assets/profile/header.min.svg
new file mode 100644
index 0000000..a8f13d2
--- /dev/null
+++ b/src/wwwroot/assets/profile/header.min.svg
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1283 471.46"><defs><style>.cls-12,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-8,.cls-9{fill:none;stroke:#ee741e;stroke-miterlimit:10}.cls-2{stroke-width:.93px}.cls-8,.cls-9{stroke-width:.94px}.cls-12,.cls-14,.cls-15{stroke-width:.95px}.cls-16{stroke-width:.98px}.cls-17{stroke-width:1px}.cls-18{fill:#ee741e}</style></defs><path fill="#fff" d="M0 0h1283v471.46H0z"/><path class="cls-2" d="M561.56 286.96l394.6-2.79M561.56 295.34l395.53-.93M235.82 418.65v6.52l155.42 4.65v-6.58l-155.42-4.59zM325.16 396.32l-89.34 22.33M391.24 422.96l89.81-34.55M391.71 429.36l72.59-28.85M464.72 396.32v7.83h63.77v-7l-63.77-.83zM482.91 383.75v8.71M392.17 387.48l88.49.63"/><path class="cls-2" d="M351.91 375.61v-3.38l24.2-3.37v2.44l25.45.35a.12.12 0 010 .23L378 382.82l-33.5-4.65c-.16 0-.16-.9 0-.93l31.64-5.94" transform="translate(1.64)"/><path class="cls-2" d="M326.56 350.25v46.07h5.06v-2.31l9.83 1.84v3.72l3.72.93 8.38-2.79V379.31"/><path stroke-width=".89" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M340.99 369.79l-9.31-1.86v19.28l9.31 2.54v-19.96z"/><path class="cls-2" d="M347.86 367.93l33.83-4.65s4.66-17.68-11.16-16.75-22.07 3.47-22.67 12 0 9.4 0 9.4z" transform="translate(1.64)"/><path class="cls-2" d="M352.45 365.14l25.5-3.51s3.51-13.33-8.42-12.63-16.63 2.62-17.08 9 0 7.14 0 7.14zM358.43 322.33V340s-25.13-3.72-37.23 7.45l20.47 3.79s17.49-17.82 44.11-4.76" transform="translate(1.64)"/><path class="cls-2" d="M368.82 322.33v19.38"/><path class="cls-2" d="M355.63 314.88h13.54a.41.41 0 00.21-.76c-2.2-1.3-7.52-3.45-14.2.76" transform="translate(1.64)"/><path class="cls-2" d="M360.06 315.81l-1.91 6.52h12.06l-1.77-7.45"/><path class="cls-2" d="M383.55 380s.53 2.27 4 7.18.67 23.53.67 23.53h-5.88s3-15.93.72-21c-1.78-3.6-2.29-3.19-2.29-3.19s1.28 1.89 1.57 7.46a108.72 108.72 0 01-.64 13.94l-4.65.78v-20.29c0-5.59-1.86-1.86-8.38 1.86-7.44 7.44-.93 21.4-.93 21.4s-5.58.93-6.51.93c-3.72-17.68 0-25.12 4.65-27s4.66-3.72 4.66-3.72" transform="translate(1.64)"/><path class="cls-2" d="M339.59 306.51l217.78-.93v1.86l-217.78.98v-1.91zM339.59 306.51l92.14-35.37 129.36-.93"/><path class="cls-2" d="M562.95 217.16l-1.86 85.62h8.38l-4.16 3.73v5.89h-218.1v-3.98M407.53 370.72v-55.04h38.27l-1.06 55.04h-37.21z"/><path class="cls-2" d="M402.41 373.05v-57.37h48.05l-1.34 57.37h-46.71zM547.13 378.17l-151.7-2.79M553.36 312.4v70.5l138.03 3.65M536.22 389.34l151.44 4.65-1.56 2.33 49.96.46-2.16-7.03 18.91.69M535.97 396.32l149.83 4.18.3-4.18"/><path class="cls-2" d="M736.06 396.78l10-.46 2.78 9.36-218.46-7.97"/><path class="cls-2" d="M748.84 405.68v6.88l-218.46-8.33v-6.52l5.59-1.39.25-6.98 10.91-5.23v-5.94l-18.64 6.42v9.66l-49.3-1.93M617.86 264.63h-19.54v-35.37h19.54v35.37zM639.27 264.63H619.72v-35.37h19.55v35.37zM629.7 229.73v34.43M619.72 240.87h19.08M619.87 252.44l18.93.01M608.3 229.73v34.43M598.32 240.87h19.08M598.32 252.44l19.08.01M591.8 224.61l.93 2.79h51.97l1.08-2.79H591.8zM594.33 227.4v39.52h2.88V227.4M640.87 227.4v39.52h2.88V227.4M591.8 266.92h53.98v2.24l-53.98.53v-2.77zM730.77 261.78h-20.32v-35.36h20.32v35.36zM753.02 261.78H732.7v-35.36h20.32v35.36zM743.07 226.88v34.44M732.7 238.03h19.83M732.85 249.59l19.68.02M720.82 226.88v34.44M710.45 238.03h19.83M710.45 249.59l19.83.02M703.68 221.76l.96 2.8h54.02l1.13-2.8h-56.11zM706.31 224.56v39.51h2.99v-39.51M754.68 224.56v39.51h2.99v-39.51M703.68 264.07h56.11v2.24l-56.11.54v-2.78zM858.65 260.7h-22v-36.42h22v36.42zM882.75 260.7h-22v-36.42h22v36.42zM871.98 224.76v35.46M860.75 236.24h21.48M860.92 248.15l21.31.01M847.88 224.76v35.46M836.65 236.24h21.48M836.65 248.15l21.48.01M829.32 219.49l1.05 2.87h58.49l1.23-2.87h-60.77zM832.16 222.36v40.7h3.25v-40.7M884.55 222.36v40.7h3.24v-40.7M829.32 263.06h60.77v2.31l-60.77.55v-2.86zM735.13 314.88h18.61v41.88h-18.61zM744.43 314.88l.35 41.88M735.13 325.28h18.61M735.13 335.31h18.61M735.13 345.13h18.61M755.6 314.88h18.61v41.88H755.6zM764.91 314.88l.35 41.88M755.6 325.28h18.62M755.6 335.31h18.62M755.6 345.13h18.62"/><path class="cls-2" d="M732.34 313.02h44.67v45.6h-44.67zM596.23 314.75h16.39v38.89h-16.39zM604.43 314.75l.3 38.89M596.23 324.41h16.39M596.23 333.72h16.39M596.23 342.84h16.39M614.26 314.75h16.39v38.89h-16.39zM622.46 314.75l.3 38.89M614.26 324.41h16.39M614.26 333.72h16.39M614.26 342.84h16.39"/><path class="cls-2" d="M594.6 313.02h37.69v42.35H594.6zM855.29 317.67h19.63v41.88h-19.63zM865.1 317.67l.36 41.89M855.29 328.08h19.62M855.29 338.11h19.62M855.29 347.92h19.62M876.87 317.67h19.63v41.88h-19.63zM886.69 317.67l.36 41.89M876.87 328.08h19.63M876.87 338.11h19.63M876.87 347.92h19.63"/><path class="cls-2" d="M853.32 315.81h45.14v45.6h-45.14zM696.97 313.95h22.34v49.33h-22.34z"/><path class="cls-2" d="M692.32 310.23h31.64v67.94h-31.64zM692.32 378.17h31.64v8.38h-31.64zM695.06 386.55l-3.67 4.78 27.92-.13-1.63-4.65M730.47 306.51h13.03v4.65h-13.03z"/><circle class="cls-2" cx="722.1" cy="340.01" r=".93"/><path class="cls-2" d="M720.46 342.8v1.87a.93.93 0 01-.93.93h-4.65v-.94h5.58" transform="translate(1.64)"/><path class="cls-2" d="M688.65 386.47v-79.96h39.27v82.43"/><path class="cls-2" d="M751.3 373.52h14.34a.09.09 0 01.08.14c-.9 1.08-6.79 7.51-14.46-.05a.05.05 0 01.04-.09z" transform="translate(1.64)"/><path class="cls-2" d="M765.83 373.52s.23 1.86-.7 18.61c-8.37 4.65-14-1.69-14-1.69v-16.92" transform="translate(1.64)"/><path class="cls-2" d="M385.26 346.49v24.91M345.17 351.18v48.86"/><path class="cls-2" d="M749.31 185.52L904.73 179l79.11 14.89L816 199.48l-294.52 8.37 52-16.7 157.81-4.6" transform="translate(1.64)"/><path stroke-width="1.03" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M732.8 156.42l17.02.25 1.13 32.57H732.8v-32.82z"/><path class="cls-2" d="M526.66 210.65v4.73l458.82-14.08v-4.27l-458.82 13.62z"/><path class="cls-2" d="M961.16 202.04l24.32 5.81 6.52-13.02-9.64-1.52M522.93 207.85v8.95l3.73 1.57v4.55l18.94-7.53M569.47 302.78l387.16-.93-1.86-99.58"/><path class="cls-2" d="M947.54 301.85c.39.93-.38 94.93-.38 94.93l-182-4.65" transform="translate(1.64)"/><path class="cls-2" d="M939.88 396.78l.93 13.03-165.11-3.43M956.69 288.36l103.93 27.45-2.99 8.6-101.13-28.37M1028.18 316.74l6.63 89.35-49.33 1.78M1031.15 405.84v10.14M562.84 222.36l391.86-9.53M561.56 275.79l394.07-2.47M562.68 229.73l31.45-.47M643.75 229.26l62.99-.93M757.67 226.88l73.91-2.12M887.79 224.28l66.91-1.92M562.68 239.03l31.45-.46M643.75 238.57l62.99-.93M757.67 236.19l73.91-2.12M887.79 233.59l66.91-1.92M562.68 250.2l31.45-.46M643.75 249.74l62.99-.94M757.67 247.36l73.91-2.13M887.79 244.76l66.91-1.92M562.68 260.44l31.45-.47M643.75 259.97l62.99-.93M757.67 257.6l73.91-2.13M887.79 254.99l66.91-1.91"/><path stroke-width=".92" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M561.75 268.81l30.52-.46M645.32 268.35l184.27-2.79"/><path stroke-width=".91" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M890.09 263.37l64.61-1.92"/><path class="cls-2" d="M574.06 302.78v80.62M580.32 302.78v80.47M587.43 302.74v80.66M559.84 312.56v70.69M566.96 305.11v78.29M634.55 302.78l.06 82.37M640.81 302.78v82.37M647.93 302.74v82.41M655.03 302.78v83.3M661.29 302.78v83.3M668.4 302.74v83.34M674.57 302.78v83.3M680.83 302.78v83.3M594.53 355.38v28.84M600.79 355.38v28.78M607.91 355.37v28.85M615.01 355.38v28.84M621.27 355.38v28.78M628.1 355.37v29.78M594.53 302.75v9.81M600.79 302.75v9.79M607.91 302.74v9.82M615.01 302.75v9.81M621.27 302.75v9.79M628.38 302.74v9.82M802.07 301.86v90.73"/><path class="cls-8" d="M808.33 301.86v91.49M815.45 301.81v91.72M822.55 301.86v91.67"/><path class="cls-9" d="M828.81 301.86v91.67"/><path class="cls-8" d="M835.92 301.81v91.72"/><path stroke-width=".94" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M842.09 301.86v91.67"/><path class="cls-9" d="M848.35 301.86v91.67"/><path class="cls-2" d="M855.47 301.81v13.54M780.67 302.32v90.27M787.86 302.32v90.11M794.97 302.32v90.27M755.54 358.16v14.89M762.73 358.18v14.87M769.84 359.09v32.57M775.08 359.11v33.48M734.14 359.09v30.71M741.33 359.09v30.66M748.44 358.16v31.64M757.4 302.32v10.24M764.59 302.32v10.24M771.71 302.62v10.57M736 302.62v3.42M743.19 302.62v4.35M750.3 302.32v10.26M882.11 301.82v13.53M888.37 301.82v13.5M895.49 301.81v13.54M902.59 301.86v93.53M908.85 301.86v93.35M915.96 301.81v93.58M922.13 301.86v94.46M928.39 301.86v94.28M935.51 301.81v94.51M943.88 301.81v94.51M861.64 301.96v13.39M867.9 301.96v13.36M875.01 301.95v13.4"/><path stroke-width=".95" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M855.47 360.95v33.51"/><path class="cls-12" d="M882.11 361.9v33.49"/><path stroke-width=".95" stroke-miterlimit="10" stroke="#ee741e" fill="none" d="M888.37 361.88v33.45"/><path class="cls-12" d="M895.49 361.88v33.51"/><path class="cls-14" d="M861.64 360.97v33.49M867.9 360.97v33.42M875.01 360.95v33.51"/><path class="cls-2" d="M516.82 364.18v-7.39s3.72-4.71 7.45-4.71 6.51 2.79 5.58 4.66-.93 7.44-.93 7.44a15.35 15.35 0 01-12.1 0z" transform="translate(1.64)"/><path class="cls-2" d="M516.82 365.42V377s6.52 2.09 12.1.23v-13M523.43 363s2.7.3 2.7-.63-1.68-2.49-2.7-1.71 0 2.34 0 2.34z" transform="translate(1.64)"/><path class="cls-15" d="M407.53 358.53h37.44M374.65 313.02v29.24M382.56 312.4v32.03M390.91 312.56v58.9M399.29 312.56v58.9"/><path class="cls-2" d="M454.99 312.09l-1.72 63.75M463.37 313.02l-1.73 63.75"/><path class="cls-16" d="M480.12 313.02l-1.72 63.75M471.75 313.02l-1.73 63.75M489.43 313.02l-1.73 63.75"/><path class="cls-17" d="M497.81 312.56l-1.73 65.14M514.56 312.56l-1.73 65.14M506.18 312.56l-1.73 65.14"/><path class="cls-2" d="M521.7 312.4v41.24M530.38 312.4l-.5 40.88M537.35 312.4l-1.13 65.3M545.89 312.09l-1.71 66.02M552.01 312.4v70.85l1.99-.33M960.96 297.29l1.25 87.86M975.68 301.42l-.44 93.04M990.45 305.56v102.31M1004.09 309.3l1.87 98.19M1016.51 313.01l3.41 94.01"/><path class="cls-2" d="M946 414.88q-3.35-10.53-6.36-21.17c4.91 5.55 5.88 13.66 10.36 19.56l-3.44-19.6a3.29 3.29 0 01.27-2.59c1.35 1.32 1.7 3.33 2.06 5.18a82.64 82.64 0 004.21 14.63 3 3 0 001.51 1.94c1.26-7.83-.92-15.83-.32-23.74.55 7.4 1.13 14.89 3.38 22a6.86 6.86 0 00.91-2.43l3-12.65a142 142 0 01-1.91 16.43l5.72-13c.82 4.36-1.47 8.78-1.09 13.21 1.13-1 1.53-2.57 2-4a25.27 25.27 0 014.37-8L967.14 415q4.1-5.27 8.52-10.26c.77 3.36-2 6.57-2 10l6.72-7.18c.75 1.66-.51 3.5-.8 5.3a1.58 1.58 0 000 .78c.35.94 1.73.7 2.68.35a13 13 0 016.58-.85c1.41.23 2.76.77 4.16 1.05a5.59 5.59 0 004.16-.49M944.75 412.93c-1.78-1.88-2.28-4.64-3.82-6.73-.41-.56-1.08-1.11-1.73-.85s-.73 1.14-.71 1.85l.08 2.86c0 .54 0 1.17-.48 1.45a1.19 1.19 0 01-.79.1 6.29 6.29 0 01-1.59-.66 2.57 2.57 0 00-1.66-.32 1.12 1.12 0 00-.9 1.26 1.54 1.54 0 001.14.86 14.76 14.76 0 005.18.22c-1.48.42-3.07.25-4.56.61a30.28 30.28 0 00-2.93 1.09c-2.94 1-6.17.74-9.27.44" transform="translate(1.64)"/><path class="cls-2" d="M947.83 414.31a33.48 33.48 0 01-1.49-6.59l-1.42-9.13c.32 0 .56.29.73.58a25.08 25.08 0 012.5 5.16c.41 1.35.59 2.77 1 4.11.54 1.66 1.48 3.2 1.73 4.93.29-5.67.6-11.35 1.38-17q1.37 5.67 2.47 11.4c.35 1.82.73 3.74 2 5.1 2-4.4 2.17-9.35 2.35-14.17.29 2.29.2 4.62.33 6.92a14.84 14.84 0 001.68 6.66 27.13 27.13 0 003.15-9.25l-.47 7.9a9.64 9.64 0 00.09 2.63 3.53 3.53 0 001.77-1.76c1.25-2.22 2-4.8 3.77-6.6a59.09 59.09 0 00-1.52 9.25 6.7 6.7 0 002-2.44q1.43-2.43 2.82-4.87a55.44 55.44 0 01-1 7.48M977.47 408.1a30.9 30.9 0 004.12-7.81c.46.54.94 1.06 1.45 1.55a2.82 2.82 0 001.11.74 1.67 1.67 0 001.89-1.21 2.37 2.37 0 00-.73-2.25 4.14 4.14 0 00-2.23-1 5.93 5.93 0 002.69-1.92 2 2 0 00-.55-2.91 2.22 2.22 0 00-2.24.53 4.05 4.05 0 00-1.4 2.76 3.16 3.16 0 00-1.69-1.44 2.62 2.62 0 00-2.58 1.51 2.39 2.39 0 00-.41 1.36 2 2 0 001.59 1.59 5.74 5.74 0 002.4-.14" transform="translate(1.64)"/><path class="cls-2" d="M971.64 406.82a43.28 43.28 0 003.46-8.65 4.59 4.59 0 01.75-1.93c.22-.26.49-.46.72-.7a2.81 2.81 0 00.78-2 1.32 1.32 0 00-.14-.65c-.4-.65-1.4-.42-2 0a5.88 5.88 0 00-2 2.5 3.57 3.57 0 00-2.72-1.69 1.63 1.63 0 00-1.62.65c-.39.71.16 1.59.81 2.07a4.73 4.73 0 003.82.81" transform="translate(1.64)"/><path class="cls-2" d="M963.59 401.9c.53-2.47 2.15-4.58 2.73-7a22.71 22.71 0 01.71-3.17c.31-.76.83-1.57.56-2.35a1.6 1.6 0 00-2.39-.56 2.69 2.69 0 00-.88 2.57 2.07 2.07 0 00-2.62-.2 1.6 1.6 0 000 2.46c.83.56 1.94.07 2.82-.42l3.11-1.75a4.1 4.1 0 011.33-.56 1.39 1.39 0 011.31.43c.54.7 0 1.71-.7 2.25a3 3 0 01-2 .72A1.76 1.76 0 01966 393M959 400.58l.28-10a2.13 2.13 0 002.34-1.35 6.17 6.17 0 00.29-2.9 2.41 2.41 0 00-.22-1 .83.83 0 00-.86-.46 1.07 1.07 0 00-.53.41 5.66 5.66 0 00-.66 3.71 6.35 6.35 0 00-2.21-3.3c-.3-.22-.74-.41-1-.15a.81.81 0 00-.13.63 6 6 0 001.75 3.57 1.37 1.37 0 00-1.49-1.16 2.6 2.6 0 00-1.75 1.07 1 1 0 00-.27.94 1 1 0 00.73.48 6.5 6.5 0 003.19 0M749.35 407.26q-1.61-3.75-2.83-7.64a17.35 17.35 0 012.34 6.77c.72-2.11.18-4.69 1.58-6.43l.29 7.35a19.69 19.69 0 013-5.28 6.47 6.47 0 01-1.31 2.32 3.32 3.32 0 00-.77 2.49 27.28 27.28 0 015.82-2.08l-1.28 2.39a4.22 4.22 0 011.4-1.64 1.47 1.47 0 012 .31c.11.18.16.38.28.55.4.59 1.31.48 1.93.13a6.34 6.34 0 011.85-1c.89-.18 1.75.37 2.66.49 1.25.18 2.51-.47 3.77-.31.76.1 1.46.49 2.22.65 1.93.39 3.9-.78 5.86-.55a19.88 19.88 0 012.71.77 14.72 14.72 0 003 .38l5.11.29" transform="translate(1.64)"/><path class="cls-2" d="M780.12 407.83c-1.9-.75-4-.4-6.06-.51a29.3 29.3 0 00-3.37-.2 18.26 18.26 0 00-4.33 1.11 26.24 26.24 0 01-4.87 1M749.51 404.89a26.24 26.24 0 01-.52-7.29 2.83 2.83 0 01.9-2.22c1.15-.78 3 .28 4-.65a1.56 1.56 0 000-2.2 2.12 2.12 0 00-2.3-.33 3.49 3.49 0 00-1.68 1.75 7.58 7.58 0 00-.31-2.68 3.26 3.26 0 00-.81-1.48 1.58 1.58 0 00-1.56-.44 2 2 0 00-1 2.27 4.37 4.37 0 002.12 3.1 5.29 5.29 0 00-3.34-1.07 2.68 2.68 0 00-1.92.73 1.39 1.39 0 00-.07 1.89 2 2 0 001.35.42 11.89 11.89 0 003.36-.39M458.36 408.52a15.77 15.77 0 003.21-8.77 37.41 37.41 0 01-3.36 6.19l-.72-2.9c-.89 1-.64 3-1.88 3.52-1 .48-2.58-.37-3.27.54-.5.65-.12 1.09-.92 1.25-.41.08-1.62-.74-2-.92l-4-1.85c-.48-.22-1.05-.64-.88-1.14a.84.84 0 01.4-.43c1.17-.67 2.62.11 3.69.93s2.33 1.76 3.63 1.4a.75.75 0 00.35-.19.92.92 0 00.13-.7 12.83 12.83 0 01.54-4.69c.78 2.07.48 6.29-1.26 7.9s-5.39 2-7.44 2.76l-6.69 2.37a31.42 31.42 0 01-4.74 1.4M280 432.39c-2.64-1.48-5.84-1.64-8.86-1.36s-6 1-9 1.09c-5.8.2-11.55-1.81-17.34-1.36a38.31 38.31 0 005.2-5.86l-5.31 5.16a17 17 0 01-.64-4.85q-.19 2.55-.6 5.07l-2.78-3.41.82 4.41c-2.08-.84-2.37-4.53-4.62-4.53l1.58 4.85a10.65 10.65 0 01-2.43-3.26c-.48.45-.45 1.21-.69 1.81s-1.23 1-1.49.41a1.37 1.37 0 010-.67c.09-1.3-1-2.33-1.6-3.48a10.37 10.37 0 01-.91-3.94l-.84-8.84c-1.54 5.31 1.21 11 .6 16.46a57.61 57.61 0 00-7.24-11.28c-.44-.54-1.15-1.11-1.74-.75.07 1.62 1.23 2.95 2.33 4.13q4.26 4.53 8.74 8.84a42.88 42.88 0 00-13.46-7.47 67.92 67.92 0 0010.92 9 37 37 0 00-7.24-3.05 12.59 12.59 0 00-7.73.19 92.59 92.59 0 0017.24 2.07c0 .73-.77 1.19-1.45 1.45-5.14 1.94-10.88 1.41-16.23 2.67a48.81 48.81 0 00-8.16 2.95M286 310.43h16.58a6.28 6.28 0 001.63-.21c2.61-.68 9.65-3.19 2-9a19.15 19.15 0 00-17.4-3.23c-3.95 1.18-7 3.41-8.27 5.38-1.47 2.3-1 3.06-.63 4.13s2.55 2.6 6.31 2.92M288.64 286.67s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M293.54 286.26s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M298 285.89s3.06 1.76 1 3.73c-1.17 1.1-1.74 3 .13 4.24M289.33 298.21a3.74 3.74 0 00-1.41 4.21M295.48 297.17s-3.65 1.81-2.71 5.25M300.67 298s-3.13 1.35-2.58 4.4M352.84 77.37V85l20.25-8.78v-8c-4.46-4.15-13.71-3.19-13.71-3.19l-6.54 12.28 20.09-8.93" transform="translate(1.64)"/><ellipse class="cls-2" cx="367.39" cy="67.8" rx="1.43" ry=".64"/><ellipse class="cls-2" cx="366.09" cy="75.88" rx="1.59" ry="1.43"/><ellipse class="cls-2" cx="359.58" cy="72.74" rx="1.28" ry=".48"/><path class="cls-2" d="M435.69 33.88s0 1.31-1.31 0 1.31-3.88 2.62-2.61l1.31 1.3M463.78 33.23l-6.62-2.32s-7.76-1.6-14.54 0-6.28 7.54-5 8.85l2.22 2.24c-1.73 3.5.42 7 .42 7h3.92a5.73 5.73 0 01-1.31-4 2.56 2.56 0 012.61-2.62l1.31 1.31c1.31 1.31 7.84 0 7.84 0-1.31 2.61 2.61 5.23 2.61 5.23h2.62c-1.31-1.31-1.31-9.15.74-6.54s6.87 0 6.87 0l1.53-2.62c-2.61 0-3.92-3.92-3.92-3.92" transform="translate(1.64)"/><path class="cls-2" d="M463.36 37.53s-2.44-3.51 2.71-5.45l1.52.32s-.59 2.88-2.11 2.6M564.42 35a2.56 2.56 0 01-2.62-2.61c0-1.31 1.31-2.61 3.27.65h1.31c1.3 0 1.3 0 3.91 1.84s0 3.39 0 3.39a11.48 11.48 0 00-3.91.65c-1.31.65.17 4.06-.66 6.53-.65 2-3.26 3.27-3.26 3.27s-1 5.88-.31 7.19c1 .65 1.31 3.26 1.31 3.26h-3.62v-2.64a1.28 1.28 0 01-1.3-1.31c0-1.3-1.15-5.88-1.47-5.88-4.09 2-10.29-.65-10.29-.65" transform="translate(1.64)"/><path class="cls-2" d="M546.78 49l-2 3v2.61a4.58 4.58 0 011.3 2.61 5.24 5.24 0 00.29 2l-2.9-.65s0-2.61-1.31-2.61v-2.7L540.9 52l1.3-2.62s.71-3.35-.3-4.94a4.75 4.75 0 012.92-6.81c2.48-.83 11.76 1.3 14.37 0S561.8 35 561.8 35" transform="translate(1.64)"/><rect class="cls-2" x="625.42" y="67.29" width="5.69" height="1.81" rx=".62"/><path class="cls-2" d="M623.31 76.87a2.19 2.19 0 00-2 2.17v14a2.19 2.19 0 002.18 2.18h6.26a2.19 2.19 0 002.18-2.18V79a2.19 2.19 0 00-1.57-2" transform="translate(1.64)"/><path class="cls-2" d="M633.58 93.17v-.11M626.23 69.1l-1.52 7.76M630.41 69.1l1.51 7.74.01.02M631.92 76.84l.12.12M625.47 72.98l5.31-1.98M622.96 81.68h10.63M622.96 91.93h10.62M630.48 65.22v-2.85M632.55 65.82l2.21-2M633.33 67.61l3.1.15"/><path class="cls-2" d="M654.59 155.68s3.63 5.23 8.59 2.35a3.63 3.63 0 01-2.67 4.69s-5.73-1.81-6.49-6.49-.38-12.27 9.92-14.07a17.64 17.64 0 018.33.25h.14a10.27 10.27 0 015.66 4.4c.76 1.08 1.91 5.77 1.91 5.77s-6.49 3.61-13.36.36c-7.26-2.49-8.78-3.21-12.03 2.74zM672.27 142.41s-6.37 2.91-2.58 11.61" transform="translate(1.64)"/><path class="cls-2" d="M664.15 142.12a19 19 0 00-2.09-2l-1.44-1.12s6.62-1.32 8.2 2.77" transform="translate(1.64)"/><ellipse class="cls-2" cx="676.08" cy="147.75" rx=".76" ry=".72"/><path class="cls-2" d="M275.58 202.46l.16 2.55 14.45-.72-.18-2.75-14.16.9-.27.02zM274.09 227.75l6.32 1.66-.94-14.66-3.73-9.74-1.89 8.26.24 14.48z"/><path class="cls-2" d="M274.09 227.75l3.3-2.28 2.77 3.88M276.65 213.78l.74 11.69M279.45 214.52l13.86-.89-2.92-9.36"/><path class="cls-2" d="M280.41 229.41l14.39-1.6-1.49-14.18M280.93 202.12l.17 2.55 2.84 4.5 3.44-.22-2.37-4.68.08-2.42M280.25 226.99l14.26-1.89"/><path class="cls-2" d="M284.91 218.44a2.89 2.89 0 00-3.18-.13 2.45 2.45 0 102.33 4.22 3.11 3.11 0 001.49-1.75" transform="translate(1.64)"/><ellipse class="cls-2" cx="287.66" cy="219.43" rx="2.41" ry="2.86" transform="rotate(-48.66 288.45921753 217.6128333)"/><path class="cls-2" d="M287.32 217.37l4.13 3.95M282.03 221.8l4.64-3.24"/><path class="cls-2" d="M304.82 114.56s3 1.25.9 2.75c-1.19.85-1.8 2.29 0 3.15M309.27 114.19s3 1.25.9 2.75c-1.19.85-1.8 2.29 0 3.15" transform="translate(1.64)"/><path class="cls-2" d="M302.55 124.63h12.66a.65.65 0 01.65.65v2.45h-14v-2.45a.65.65 0 01.69-.65zM303.59 123.08h10.28a.53.53 0 01.53.53v1h-11.34v-1a.53.53 0 01.53-.53z"/><path class="cls-2" d="M300.75 127.73l.28 2.52 1.36 12a.5.5 0 00.49.44h8.61a.5.5 0 00.49-.44l1.7-14.54" transform="translate(1.64)"/><path class="cls-2" d="M315.03 130.26h-12.36M303.42 136.91h10.83"/><path class="cls-18" d="M394.18 150.93h1.24l3.43 10.23 3.43-10.23h1.24l-4.12 11.9h-1.1zM405.32 150.93h1.18v11.9h-1.18zm.81 0H413V152h-6.83zm0 5.44h5.93v1.1h-5.93zm0 5.36H413v1.1h-6.83zM415.33 150.93h1.18v11.9h-1.18zm.84 10.8H423v1.1h-6.8zM424.94 150.93h1.17v11.9h-1.17zm.57 8.27l6.52-8.27h1.52l-7.55 9.18zm3.35-2.72l.68-1.22 4.51 7.57h-1.41zM436.86 162.44a3.43 3.43 0 01-1.42-1.5 5.25 5.25 0 01-.49-2.37v-3.37a5.26 5.26 0 01.49-2.38 3.36 3.36 0 011.42-1.49 5.19 5.19 0 014.53 0 3.43 3.43 0 011.43 1.49 5.4 5.4 0 01.49 2.38v3.37a5.38 5.38 0 01-.49 2.37 3.51 3.51 0 01-1.43 1.5 5.28 5.28 0 01-4.53 0zm3.89-1a2.5 2.5 0 001-1.1 4 4 0 00.35-1.75v-3.48a4 4 0 00-.35-1.75 2.5 2.5 0 00-1-1.1 3.66 3.66 0 00-3.25 0 2.42 2.42 0 00-1 1.1 3.9 3.9 0 00-.36 1.75v3.48a3.87 3.87 0 00.36 1.75 2.42 2.42 0 001 1.1 3.66 3.66 0 003.25 0zM454.72 150.93H456v11.9h-1.18v-10.22l.13.52-3.59 8.05h-.83l-3.58-7.88.12-.69v10.22h-1.18v-11.9h1.24l3.82 8.59zM467.77 150.93H469v11.9h-1.18v-10.22l.12.52-3.58 8.05h-.84L460 153.3l.12-.69v10.22h-1.22v-11.9h1.23l3.82 8.59zM472 150.93h1.18v11.9H472zm.81 0h6.83V152h-6.83zm0 5.44h5.93v1.1h-5.93zm0 5.36h6.83v1.1h-6.83zM482 150.93h1.19l6.9 10.72-.48-.33v-10.39h1.18v11.89h-1.2L482.5 152l.64.47v10.33H482zM493.82 161.49h1.34v1.34h-1.34zm.08-10.56h1.17v9.17h-1.17zM394.91 180.47h.79v7.92h-.79zm.55 0h4.44v.73h-4.44zm0 3.69h3.84v.73h-3.84zM401.27 180.46h.78v7.93h-.78zm.48 3.85h2.71a1.67 1.67 0 00.78-.19 1.35 1.35 0 00.51-.55 1.68 1.68 0 00.19-.82 1.8 1.8 0 00-.18-.82 1.38 1.38 0 00-.52-.55 1.61 1.61 0 00-.78-.19h-2.71v-.73h2.66a2.46 2.46 0 011.21.28 2 2 0 01.81.81 2.48 2.48 0 01.29 1.2 2.45 2.45 0 01-.29 1.2 2 2 0 01-.81.81 2.49 2.49 0 01-1.21.28h-2.66zm2.54.49l.73-.26 2 3.85h-.94zM408.55 180.47h.78v7.92h-.78zm.54 0h4.55v.73h-4.55zm0 3.62h4v.73h-4zm0 3.57h4.55v.73h-4.55zM415.22 180.47h.78v7.92h-.79zm.76 7.19h1.79a2.36 2.36 0 001.65-.51 2.06 2.06 0 00.55-1.55v-2.34a2.06 2.06 0 00-.55-1.55 2.36 2.36 0 00-1.65-.51H416v-.73h1.76a4 4 0 011.68.31 2.1 2.1 0 011 .95 3.36 3.36 0 01.33 1.58v2.24a3.36 3.36 0 01-.33 1.58 2.17 2.17 0 01-1 1 4 4 0 01-1.68.31H416zM424.38 180.47h.95l2.93 7.92h-.88l-2.52-7.1-2.53 7.1h-.87zm-1.57 5.27H427v.73h-4.17zM434.44 184.34v1.17a3.83 3.83 0 01-.31 1.65 2.06 2.06 0 01-.92 1 3.26 3.26 0 01-1.55.33 3.47 3.47 0 01-1.56-.32 2 2 0 01-.93-.92 3.44 3.44 0 01-.31-1.56v-2.34a3.91 3.91 0 01.3-1.64 2.13 2.13 0 01.93-1 3.22 3.22 0 011.54-.33 3 3 0 011.33.27 2.21 2.21 0 01.91.78 3.55 3.55 0 01.5 1.31h-.85a2.72 2.72 0 00-.39-.91 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.33 2.33 0 00-1.11.25 1.64 1.64 0 00-.66.74 3 3 0 00-.22 1.24v2.34a2.71 2.71 0 00.22 1.15 1.51 1.51 0 00.68.69 2.48 2.48 0 001.12.22 2.2 2.2 0 001.09-.23 1.52 1.52 0 00.65-.72 3.25 3.25 0 00.21-1.26v-.46h-1.92v-.73zM441 188.39h-.79v-7.26l-1.45.91v-.82l1.13-.75H441zM442.67 187.76l3-3.91a3.37 3.37 0 00.46-.75 1.76 1.76 0 00.16-.65 1.27 1.27 0 00-.37-1 1.43 1.43 0 00-1-.35 1.41 1.41 0 00-1 .38 1.71 1.71 0 00-.47 1h-.82a3.11 3.11 0 01.4-1.17 2 2 0 01.78-.73 2.33 2.33 0 011.11-.26 2.64 2.64 0 011.21.25 1.62 1.62 0 01.76.7 2.19 2.19 0 01.27 1.12 2.23 2.23 0 01-.22.85 4.79 4.79 0 01-.6 1l-2.63 3.37h3.49v.73h-4.47zM452.28 185.19v.73h-3.67v-.73zM455.66 188.39h-.78v-7.26l-1.46.91v-.82l1.13-.75h1.11zM460.6 184.46v.19a.74.74 0 01-.45.37 2.26 2.26 0 01-.77.12 2.06 2.06 0 01-1.09-.29 1.89 1.89 0 01-.72-.81 2.8 2.8 0 01-.26-1.22 3.06 3.06 0 01.26-1.31 1.76 1.76 0 01.76-.83 2.61 2.61 0 012.39 0 1.91 1.91 0 01.75.84 3 3 0 01.26 1.33 3.7 3.7 0 01-.11.91 5.1 5.1 0 01-.31 1l-.06.14a1 1 0 00-.07.15l-1.69 3.39h-.88zm0-.49a1.79 1.79 0 00.37-1.2 1.77 1.77 0 00-.38-1.21 1.47 1.47 0 00-2.1 0 1.77 1.77 0 00-.38 1.21 1.73 1.73 0 00.38 1.19 1.51 1.51 0 002.11 0zM394.91 193.87h.79v7.93h-.79zm.56 7.2H400v.73h-4.54zM403.59 193.87h.94l2.93 7.93h-.87l-2.53-7.11-2.52 7.11h-.88zm-1.59 5.27h4.17v.73H402zM409.34 201.56a2.06 2.06 0 01-.92-1 3.61 3.61 0 01-.31-1.61v-5.11h.79V199a2.18 2.18 0 00.49 1.56 2 2 0 001.5.52 2 2 0 001.51-.52 2.18 2.18 0 00.5-1.56v-5.15h.78V199a3.76 3.76 0 01-.3 1.61 2.13 2.13 0 01-.93 1 3.47 3.47 0 01-1.56.32 3.39 3.39 0 01-1.55-.37zM415.43 193.86h.78v7.94h-.78zm.48 3.85h2.71a1.55 1.55 0 00.78-.19 1.29 1.29 0 00.51-.55 1.68 1.68 0 00.19-.82 1.8 1.8 0 00-.18-.82 1.23 1.23 0 00-.52-.54 1.51 1.51 0 00-.78-.2h-2.71v-.73h2.67a2.45 2.45 0 011.2.29 1.89 1.89 0 01.81.8 2.48 2.48 0 01.29 1.2 2.42 2.42 0 01-.29 1.2 2 2 0 01-.81.81 2.47 2.47 0 01-1.2.28h-2.67zm2.55.49l.72-.25 2 3.85h-.94zM422.71 193.87h.78v7.93h-.78zm.75 7.2h1.8a2.36 2.36 0 001.65-.52 2 2 0 00.54-1.55v-2.34a2.06 2.06 0 00-.54-1.55 2.36 2.36 0 00-1.65-.51h-1.8v-.73h1.76a3.91 3.91 0 011.68.31 2.08 2.08 0 011 .95 3.39 3.39 0 01.33 1.58V199a3.24 3.24 0 01-.34 1.58 2.1 2.1 0 01-1 .95 4 4 0 01-1.68.32h-1.76zM431.87 193.87h.95l2.92 7.93h-.87l-2.52-7.11-2.53 7.11H429zm-1.57 5.27h4.17v.73h-4.17zM441.93 197.74v1.17a4 4 0 01-.31 1.65 2.11 2.11 0 01-.92 1 3.29 3.29 0 01-1.55.33 3.61 3.61 0 01-1.56-.31 2.06 2.06 0 01-.94-.93 3.56 3.56 0 01-.31-1.55v-2.34a4 4 0 01.31-1.65 2.08 2.08 0 01.93-1 3.23 3.23 0 011.54-.32 3 3 0 011.32.26 2.09 2.09 0 01.91.78 3.39 3.39 0 01.51 1.31H441a2.87 2.87 0 00-.39-.9 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.34 2.34 0 00-1.11.24 1.62 1.62 0 00-.66.75 3 3 0 00-.22 1.24v2.34a2.55 2.55 0 00.22 1.14 1.47 1.47 0 00.68.69 2.45 2.45 0 001.12.23 2.23 2.23 0 001.09-.24 1.42 1.42 0 00.64-.72 3.06 3.06 0 00.22-1.26v-.46h-1.92v-.73zM448.48 201.8h-.79v-7.27l-1.45.91v-.82l1.12-.75h1.12zM450.16 201.16l3-3.91a3.31 3.31 0 00.45-.75 1.58 1.58 0 00.16-.65 1.3 1.3 0 00-.36-1 1.44 1.44 0 00-1-.34 1.38 1.38 0 00-1 .37 1.71 1.71 0 00-.47 1.05h-.82a2.85 2.85 0 01.4-1.16 2 2 0 01.78-.74 2.33 2.33 0 011.11-.25 2.81 2.81 0 011.21.24 1.67 1.67 0 01.76.7 2.21 2.21 0 01.26 1.12 2.19 2.19 0 01-.21.85 5.5 5.5 0 01-.6 1l-2.63 3.38h3.49v.73h-4.47zM459.76 198.59v.73h-3.66v-.73zM463.15 201.8h-.78v-7.27l-1.46.91v-.82l1.13-.75h1.11zM469.05 194.53L467 201.8h-.86l2.09-7.2h-2.71v1.46h-.79v-2.19h4.32zM396.21 215.17a3.68 3.68 0 01-.95-.33 3.75 3.75 0 01-.84-.54l.48-.62a3.47 3.47 0 001.09.65 3.71 3.71 0 001.31.22 2.67 2.67 0 001.58-.41 1.3 1.3 0 00.56-1.13 1 1 0 00-.25-.72 1.5 1.5 0 00-.62-.41 7.84 7.84 0 00-1-.25h-.24a8.26 8.26 0 01-1.33-.33 1.94 1.94 0 01-.86-.58 1.75 1.75 0 01-.35-1.15 2.32 2.32 0 01.33-1.26 2.1 2.1 0 011-.79 3.86 3.86 0 011.52-.27 4 4 0 01.84.09 4.28 4.28 0 01.81.27 5 5 0 01.79.47l-.46.61a4.34 4.34 0 00-1-.54 3 3 0 00-1-.17 2.39 2.39 0 00-1.5.41 1.35 1.35 0 00-.54 1.15.93.93 0 00.27.71 1.66 1.66 0 00.66.38 9.36 9.36 0 001.09.26h.18a8.4 8.4 0 011.24.35 2 2 0 01.83.62 1.74 1.74 0 01.33 1.12 2.15 2.15 0 01-.34 1.24 2.1 2.1 0 01-1 .79 4.09 4.09 0 01-1.57.27 5.44 5.44 0 01-1.06-.11zM402.7 215a2.13 2.13 0 01-.93-1 3.75 3.75 0 01-.31-1.61v-5.11h.79v5.15a2.12 2.12 0 00.5 1.56 2 2 0 001.49.52 2 2 0 001.51-.52 2.16 2.16 0 00.5-1.56v-5.15h.75v5.11a3.75 3.75 0 01-.31 1.61 2.13 2.13 0 01-.93 1 3.44 3.44 0 01-1.56.32 3.35 3.35 0 01-1.5-.32zM408.78 207.27h.79l4.61 7.14-.33-.22v-6.92h.79v7.92h-.8l-4.7-7.2.43.31v6.89h-.79zM416.6 207.27h.79v7.93h-.79zm.76 7.2h1.79a2.36 2.36 0 001.65-.52 2 2 0 00.55-1.55v-2.33a2.07 2.07 0 00-.55-1.56 2.36 2.36 0 00-1.65-.51h-1.79v-.73h1.76a4 4 0 011.68.31 2.14 2.14 0 011 .95 3.39 3.39 0 01.33 1.58v2.25a3.35 3.35 0 01-.33 1.57 2.17 2.17 0 01-1 .95 4 4 0 01-1.68.32h-1.75zM425.76 207.27h.95l2.93 7.93h-.88l-2.52-7.11-2.53 7.11h-.87zm-1.57 5.27h4.17v.73h-4.17zM435.82 211.15v1.16a3.8 3.8 0 01-.31 1.65 2.06 2.06 0 01-.92 1 3.26 3.26 0 01-1.55.33 3.47 3.47 0 01-1.56-.31 2 2 0 01-.93-.93 3.4 3.4 0 01-.31-1.55v-2.34a4 4 0 01.3-1.65 2.13 2.13 0 01.93-1 3.35 3.35 0 011.54-.32 3.07 3.07 0 011.33.26 2.21 2.21 0 01.91.78 3.62 3.62 0 01.5 1.31h-.85a2.66 2.66 0 00-.39-.9 1.63 1.63 0 00-.63-.54 2 2 0 00-.87-.18 2.34 2.34 0 00-1.11.24 1.62 1.62 0 00-.66.75 3 3 0 00-.22 1.24v2.34a2.55 2.55 0 00.22 1.14 1.47 1.47 0 00.68.69 2.48 2.48 0 001.12.23 2.2 2.2 0 001.09-.24 1.38 1.38 0 00.64-.72 3.06 3.06 0 00.22-1.26v-.45h-1.92v-.73zM442.37 215.2h-.79v-7.27l-1.45.91V208l1.12-.75h1.12zM445.05 215a1.94 1.94 0 01-.82-.68 2.33 2.33 0 01-.39-1.08h.79a1.65 1.65 0 00.27.68 1.31 1.31 0 00.55.43 1.86 1.86 0 00.77.15 1.53 1.53 0 001.1-.38 1.42 1.42 0 00.39-1.07v-.24a1.38 1.38 0 00-.38-1 1.43 1.43 0 00-1.06-.37h-.56v-.73h.56a1.38 1.38 0 001-.32 1.23 1.23 0 00.34-.91v-.24a1.28 1.28 0 00-.36-1 1.39 1.39 0 00-1-.34 1.59 1.59 0 00-.66.14 1.39 1.39 0 00-.5.41 1.76 1.76 0 00-.29.65h-.8a2.6 2.6 0 01.41-1 2 2 0 01.77-.66 2.29 2.29 0 011.06-.23 2.2 2.2 0 011.59.54 2 2 0 01.56 1.52v.24a1.83 1.83 0 01-.26 1 1.6 1.6 0 01-.75.6 1.36 1.36 0 01.84.6 2.17 2.17 0 01.3 1.19v.24a2.46 2.46 0 01-.27 1.19 1.72 1.72 0 01-.77.74 2.72 2.72 0 01-1.23.26 2.66 2.66 0 01-1.2-.33zM453.79 212v.73h-3.66V212zM457.18 215.2h-.78v-7.27l-1.46.91V208l1.13-.75h1.11zM463.07 207.93l-2 7.27h-.86l2.09-7.2h-2.71v1.47h-.79v-2.2h4.31z" transform="translate(1.64)"/><path d="M683 282.77h60.29a.18.18 0 01.18.18v10.11a5.4 5.4 0 01-5.4 5.4H677.5a.18.18 0 01-.18-.18v-9.8a5.71 5.71 0 015.68-5.71z" stroke-width="1.4" stroke="#ed7320" stroke-miterlimit="10" fill="#fff"/><path class="cls-18" d="M678.29 288.52h.76l1 3.19 1-3.19h.76l-1.45 4.39h-.61zM682.29 288.52h.71v.72h-.72zm0 1.26h.71v3.13h-.72zM683.87 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM686.91 293.5h.27a.2.2 0 00.15-.06.24.24 0 000-.18v-3.48h.73v3.58a.88.88 0 01-.2.61.74.74 0 01-.57.22h-.43zm.47-5h.73v.72h-.73zM689.55 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.78 1.78 0 01.16-.8 1.17 1.17 0 01.46-.5 1.54 1.54 0 01.73-.17 1.19 1.19 0 01.69.2 1.3 1.3 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.14v-.53h1.47a1 1 0 00-.18-.52.53.53 0 00-.42-.18.61.61 0 00-.5.21.84.84 0 00-.18.58v.4a.75.75 0 00.19.55.78.78 0 00.55.19 1.09 1.09 0 00.35-.07 1.08 1.08 0 00.31-.19l.48.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM692.93 292.91a2.36 2.36 0 01-.47-.16 1.6 1.6 0 01-.4-.25l.43-.54a1.89 1.89 0 00.49.25 1.46 1.46 0 00.49.09 1.09 1.09 0 00.5-.09.28.28 0 00.17-.26.24.24 0 00-.08-.19.4.4 0 00-.22-.09l-.36-.05h-.21a2.82 2.82 0 01-.54-.11.68.68 0 01-.36-.25.88.88 0 01-.14-.53 1 1 0 01.14-.54 1 1 0 01.42-.34 2 2 0 01.69-.11 1.83 1.83 0 01.47 0 2.23 2.23 0 01.44.13 3.11 3.11 0 01.4.22l-.44.53a1.58 1.58 0 00-.44-.2 1.39 1.39 0 00-.44-.07 1 1 0 00-.43.08.27.27 0 00-.15.24.19.19 0 00.08.16.44.44 0 00.21.07l.35.05h.14a2.66 2.66 0 01.58.1.77.77 0 01.39.26.89.89 0 01.16.58 1 1 0 01-.15.56.88.88 0 01-.45.34 2 2 0 01-.73.12 3.1 3.1 0 01-.54 0zM697.25 289.78h.75l-1.18 3.13h-.53l-1.18-3.13h.74l.7 2.1zM698.51 288.52h.72v.72h-.72zm0 1.26h.72v3.13h-.72zM700.09 289.78h.72v3.13h-.72zM702 291a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.84.84 0 01.5-.15 1 1 0 01.78.33 1.44 1.44 0 01.28.95v1.9H702zM704 292.81a1 1 0 01-.37-.45 1.88 1.88 0 01-.12-.71v-.6a1.94 1.94 0 01.12-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1 1 0 01.35.42l-.06.67a.59.59 0 00-.07-.31.37.37 0 00-.18-.19.62.62 0 00-.71.1.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.62.62 0 00.71.1.41.41 0 00.18-.19.62.62 0 00.07-.31v.69a.82.82 0 01-.8.55 1.07 1.07 0 01-.54-.16zm0 1.25a1.1 1.1 0 01-.45-.37l.49-.45a.71.71 0 00.27.22.8.8 0 00.33.08.69.69 0 00.49-.17.61.61 0 00.18-.47v-3.12h.69v3a1.53 1.53 0 01-.16.74 1.12 1.12 0 01-.47.47 1.6 1.6 0 01-.75.16 1.51 1.51 0 01-.62-.09zM707.45 292.8a1.14 1.14 0 01-.49-.48 1.65 1.65 0 01-.16-.77v-.35a1.78 1.78 0 01.16-.8 1.12 1.12 0 01.46-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.69.2 1.29 1.29 0 01.43.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a.9.9 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.89.89 0 00-.17.58v.4a.75.75 0 00.19.55.77.77 0 00.54.19 1.15 1.15 0 00.36-.07 1.23 1.23 0 00.31-.19l.47.44a1.73 1.73 0 01-.54.35 1.53 1.53 0 01-.6.12 1.57 1.57 0 01-.75-.19zM710.21 289.78h.72v3.13h-.72zm1.86 1.23a.59.59 0 00-.15-.43.56.56 0 00-.43-.16.53.53 0 00-.41.15.52.52 0 00-.15.4l-.06-.65a1.06 1.06 0 01.36-.44.85.85 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.27.95v1.9h-.72zM718.72 288.52h.73v4.39h-.73zm.39 1.88h2.5v.69h-2.5zm2.07-1.88h.72v4.39h-.72zM723 292.72a.92.92 0 01-.27-.73.88.88 0 01.27-.7 1.25 1.25 0 01.82-.23h.84v.56h-.88a.47.47 0 00-.32.09.32.32 0 00-.11.28.33.33 0 00.14.29.76.76 0 00.42.1 1.29 1.29 0 00.51-.08.25.25 0 00.17-.23l.06.44a.49.49 0 01-.18.25.75.75 0 01-.31.15 1.6 1.6 0 01-.39 0 1.17 1.17 0 01-.77-.19zm1.63-1.8a.49.49 0 00-.16-.4.6.6 0 00-.44-.15 1 1 0 00-.35.06 1.07 1.07 0 00-.32.16l-.48-.41a1.21 1.21 0 01.48-.33 1.81 1.81 0 01.67-.12 1.55 1.55 0 01.68.14 1 1 0 01.44.4 1.22 1.22 0 01.15.63v2h-.67zM726.16 289.78h.73v3.13h-.73zM728 291a.6.6 0 00-.16-.43.54.54 0 00-.43-.16.5.5 0 00-.55.55l-.07-.65a1.24 1.24 0 01.36-.44.9.9 0 01.51-.15 1 1 0 01.78.33 1.49 1.49 0 01.28.95v1.9H728zM730 292.81a.93.93 0 01-.37-.45 1.87 1.87 0 01-.13-.71v-.6a1.93 1.93 0 01.13-.72.91.91 0 01.36-.45 1.06 1.06 0 01.57-.16.86.86 0 01.49.15 1.13 1.13 0 01.35.42l-.07.67a.71.71 0 00-.06-.31.37.37 0 00-.18-.19.56.56 0 00-.3-.07.51.51 0 00-.41.17.74.74 0 00-.15.49v.6a.69.69 0 00.15.48.51.51 0 00.41.17.56.56 0 00.3-.07.41.41 0 00.18-.19.75.75 0 00.06-.31v.69a1 1 0 01-.3.4.84.84 0 01-.5.15 1.07 1.07 0 01-.53-.16zm1.33-4.29h.73v4.39h-.73zM733.52 292.8a1.11 1.11 0 01-.48-.48 1.65 1.65 0 01-.17-.77v-.35a1.93 1.93 0 01.16-.8 1.14 1.14 0 01.47-.5 1.49 1.49 0 01.73-.17 1.19 1.19 0 01.68.2 1.24 1.24 0 01.44.58 2.53 2.53 0 01.15.92v.21h-2.13v-.53h1.46a1 1 0 00-.19-.52.51.51 0 00-.41-.18.64.64 0 00-.51.21.84.84 0 00-.18.58v.4a.76.76 0 00.2.55.77.77 0 00.54.19 1 1 0 00.35-.07 1.29 1.29 0 00.32-.19l.47.44a1.73 1.73 0 01-.54.35 1.73 1.73 0 01-1.36 0zM737 292a.24.24 0 00.06.18.21.21 0 00.16.06h.22v.69h-.4a.73.73 0 01-.56-.21.86.86 0 01-.2-.62v-3.57h.72z" transform="translate(1.64)"/><path d="M720.79 282.77c-.18.63-.55 1.78-1.29 3.67-1.24 3.19-3 5.09-2.47 7.14s2 3 4.82 3.84a45.51 45.51 0 004.73 1.05l-.74-.13" stroke="#ed7320" stroke-width=".93" stroke-miterlimit="10" fill="none"/></svg> \ No newline at end of file
diff --git a/src/wwwroot/assets/profile/header.svg b/src/wwwroot/assets/profile/header.svg
new file mode 100644
index 0000000..1a3f1e9
--- /dev/null
+++ b/src/wwwroot/assets/profile/header.svg
@@ -0,0 +1,530 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1283 471.46">
+ <defs>
+ <style>
+ .cls-1,.cls-19{fill:#fff;}.cls-10,.cls-11,.cls-12,.cls-13,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-20,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7,.cls-8,.cls-9{fill:none;}.cls-10,.cls-11,.cls-12,.cls-13,.cls-14,.cls-15,.cls-16,.cls-17,.cls-2,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7,.cls-8,.cls-9{stroke:#ee741e;}.cls-10,.cls-11,.cls-12,.cls-13,.cls-14,.cls-15,.cls-16,.cls-17,.cls-19,.cls-2,.cls-20,.cls-3,.cls-4,.cls-5,.cls-6,.cls-7,.cls-8,.cls-9{stroke-miterlimit:10;}.cls-2,.cls-20{stroke-width:0.93px;}.cls-3{stroke-width:0.89px;}.cls-4{stroke-width:1.03px;}.cls-5{stroke-width:0.92px;}.cls-6{stroke-width:0.92px;}.cls-7{stroke-width:0.91px;}.cls-8{stroke-width:0.94px;}.cls-9{stroke-width:0.94px;}.cls-10{stroke-width:0.94px;}.cls-11{stroke-width:0.95px;}.cls-12{stroke-width:0.95px;}.cls-13{stroke-width:0.95px;}.cls-14{stroke-width:0.95px;}.cls-15{stroke-width:0.95px;}.cls-16{stroke-width:0.98px;}.cls-17{stroke-width:1px;}.cls-18{fill:#ee741e;}.cls-19,.cls-20{stroke:#ed7320;}.cls-19{stroke-width:1.4px;}
+ </style>
+ </defs>
+ <rect class="cls-1" width="1283" height="471.46"/>
+ <line class="cls-2" x1="561.56" y1="286.96" x2="956.16" y2="284.17"/>
+ <line class="cls-2" x1="561.56" y1="295.34" x2="957.09" y2="294.41"/>
+ <polygon class="cls-2" points="235.82 418.65 235.82 425.17 391.24 429.82 391.24 423.24 235.82 418.65"/>
+ <line class="cls-2" x1="325.16" y1="396.32" x2="235.82" y2="418.65"/>
+ <line class="cls-2" x1="391.24" y1="422.96" x2="481.05" y2="388.41"/>
+ <line class="cls-2" x1="391.71" y1="429.36" x2="464.3" y2="400.51"/>
+ <polygon class="cls-2" points="464.72 396.32 464.72 404.15 528.49 404.15 528.49 397.15 464.72 396.32"/>
+ <line class="cls-2" x1="482.91" y1="383.75" x2="482.91" y2="392.46"/>
+ <path class="cls-2" d="M476.46,389.74" transform="translate(1.64)"/>
+ <line class="cls-2" x1="392.17" y1="387.48" x2="480.66" y2="388.11"/>
+ <path class="cls-2"
+ d="M351.91,375.61v-3.38l24.2-3.37v2.44l25.45.35a.12.12,0,0,1,0,.23L378,382.82l-33.5-4.65c-.16,0-.16-.9,0-.93l31.64-5.94"
+ transform="translate(1.64)"/>
+ <polyline class="cls-2"
+ points="326.56 350.25 326.56 396.32 331.62 396.32 331.62 394.01 341.45 395.85 341.45 399.57 345.17 400.5 353.55 397.71 353.55 394.94 353.55 379.31"/>
+ <polygon class="cls-3" points="340.99 369.79 331.68 367.93 331.68 387.21 340.99 389.75 340.99 369.79"/>
+ <path class="cls-2"
+ d="M347.86,367.93l33.83-4.65s4.66-17.68-11.16-16.75-22.07,3.47-22.67,12S347.86,367.93,347.86,367.93Z"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M352.45,365.14l25.5-3.51s3.51-13.33-8.42-12.63-16.63,2.62-17.08,9S352.45,365.14,352.45,365.14Z"
+ transform="translate(1.64)"/>
+ <path class="cls-2" d="M358.43,322.33V340s-25.13-3.72-37.23,7.45l20.47,3.79s17.49-17.82,44.11-4.76"
+ transform="translate(1.64)"/>
+ <line class="cls-2" x1="368.82" y1="322.33" x2="368.82" y2="341.71"/>
+ <path class="cls-2" d="M355.63,314.88h13.54a.41.41,0,0,0,.21-.76c-2.2-1.3-7.52-3.45-14.2.76"
+ transform="translate(1.64)"/>
+ <polyline class="cls-2" points="360.06 315.81 358.15 322.33 370.21 322.33 368.44 314.88"/>
+ <path class="cls-2"
+ d="M383.55,380s.53,2.27,4,7.18.67,23.53.67,23.53h-5.88s3-15.93.72-21c-1.78-3.6-2.29-3.19-2.29-3.19s1.28,1.89,1.57,7.46a108.72,108.72,0,0,1-.64,13.94l-4.65.78V388.41c0-5.59-1.86-1.86-8.38,1.86-7.44,7.44-.93,21.4-.93,21.4s-5.58.93-6.51.93c-3.72-17.68,0-25.12,4.65-27s4.66-3.72,4.66-3.72"
+ transform="translate(1.64)"/>
+ <polygon class="cls-2" points="339.59 306.51 557.37 305.58 557.37 307.44 339.59 308.42 339.59 306.51"/>
+ <polyline class="cls-2" points="339.59 306.51 431.73 271.14 561.09 270.21"/>
+ <polyline class="cls-2"
+ points="562.95 217.16 561.09 302.78 569.47 302.78 565.31 306.51 565.31 312.4 347.21 312.4 347.21 308.42"/>
+ <polygon class="cls-2" points="407.53 370.72 407.53 315.68 445.8 315.68 444.74 370.72 407.53 370.72"/>
+ <polygon class="cls-2" points="402.41 373.05 402.41 315.68 450.46 315.68 449.12 373.05 402.41 373.05"/>
+ <line class="cls-2" x1="547.13" y1="378.17" x2="395.43" y2="375.38"/>
+ <polyline class="cls-2" points="553.36 312.4 553.36 382.9 691.39 386.55"/>
+ <polyline class="cls-2" points="536.22 389.34 687.66 393.99 686.1 396.32 736.06 396.78 733.9 389.75 752.81 390.44"/>
+ <polyline class="cls-2" points="535.97 396.32 685.8 400.5 686.1 396.32"/>
+ <path class="cls-2" d="M734.42,395.28" transform="translate(1.64)"/>
+ <polyline class="cls-2" points="736.06 396.78 746.06 396.32 748.84 405.68 530.38 397.71"/>
+ <polyline class="cls-2"
+ points="748.84 405.68 748.84 412.56 530.38 404.23 530.38 397.71 535.97 396.32 536.22 389.34 547.13 384.11 547.13 378.17 528.49 384.59 528.49 394.25 479.19 392.32"/>
+ <polygon class="cls-2"
+ points="617.86 264.63 608.09 264.63 598.32 264.63 598.32 229.26 617.86 229.26 617.86 264.63"/>
+ <polygon class="cls-2" points="639.27 264.63 629.5 264.63 619.72 264.63 619.72 229.26 639.27 229.26 639.27 264.63"/>
+ <line class="cls-2" x1="629.7" y1="229.73" x2="629.7" y2="264.16"/>
+ <line class="cls-2" x1="619.72" y1="240.87" x2="638.8" y2="240.87"/>
+ <line class="cls-2" x1="619.87" y1="252.44" x2="638.8" y2="252.45"/>
+ <line class="cls-2" x1="608.3" y1="229.73" x2="608.3" y2="264.16"/>
+ <line class="cls-2" x1="598.32" y1="240.87" x2="617.4" y2="240.87"/>
+ <line class="cls-2" x1="598.32" y1="252.44" x2="617.4" y2="252.45"/>
+ <polygon class="cls-2" points="591.8 224.61 592.73 227.4 644.7 227.4 645.78 224.61 591.8 224.61"/>
+ <polyline class="cls-2" points="594.33 227.4 594.33 266.92 597.21 266.92 597.21 227.4"/>
+ <polyline class="cls-2" points="640.87 227.4 640.87 266.92 643.75 266.92 643.75 227.4"/>
+ <polygon class="cls-2" points="591.8 266.92 645.78 266.92 645.78 269.16 591.8 269.69 591.8 266.92"/>
+ <polygon class="cls-2"
+ points="730.77 261.78 720.61 261.78 710.45 261.78 710.45 226.42 730.77 226.42 730.77 261.78"/>
+ <polygon class="cls-2" points="753.02 261.78 742.86 261.78 732.7 261.78 732.7 226.42 753.02 226.42 753.02 261.78"/>
+ <line class="cls-2" x1="743.07" y1="226.88" x2="743.07" y2="261.32"/>
+ <line class="cls-2" x1="732.7" y1="238.03" x2="752.53" y2="238.03"/>
+ <line class="cls-2" x1="732.85" y1="249.59" x2="752.53" y2="249.61"/>
+ <line class="cls-2" x1="720.82" y1="226.88" x2="720.82" y2="261.32"/>
+ <line class="cls-2" x1="710.45" y1="238.03" x2="730.28" y2="238.03"/>
+ <line class="cls-2" x1="710.45" y1="249.59" x2="730.28" y2="249.61"/>
+ <polygon class="cls-2" points="703.68 221.76 704.64 224.56 758.66 224.56 759.79 221.76 703.68 221.76"/>
+ <polyline class="cls-2" points="706.31 224.56 706.31 264.07 709.3 264.07 709.3 224.56"/>
+ <polyline class="cls-2" points="754.68 224.56 754.68 264.07 757.67 264.07 757.67 224.56"/>
+ <polygon class="cls-2" points="703.68 264.07 759.79 264.07 759.79 266.31 703.68 266.85 703.68 264.07"/>
+ <polygon class="cls-2" points="858.65 260.7 847.65 260.7 836.65 260.7 836.65 224.28 858.65 224.28 858.65 260.7"/>
+ <polygon class="cls-2" points="882.75 260.7 871.75 260.7 860.75 260.7 860.75 224.28 882.75 224.28 882.75 260.7"/>
+ <line class="cls-2" x1="871.98" y1="224.76" x2="871.98" y2="260.22"/>
+ <line class="cls-2" x1="860.75" y1="236.24" x2="882.23" y2="236.24"/>
+ <line class="cls-2" x1="860.92" y1="248.15" x2="882.23" y2="248.16"/>
+ <line class="cls-2" x1="847.88" y1="224.76" x2="847.88" y2="260.22"/>
+ <line class="cls-2" x1="836.65" y1="236.24" x2="858.13" y2="236.24"/>
+ <line class="cls-2" x1="836.65" y1="248.15" x2="858.13" y2="248.16"/>
+ <polygon class="cls-2" points="829.32 219.49 830.37 222.36 888.86 222.36 890.09 219.49 829.32 219.49"/>
+ <polyline class="cls-2" points="832.16 222.36 832.16 263.06 835.41 263.06 835.41 222.36"/>
+ <polyline class="cls-2" points="884.55 222.36 884.55 263.06 887.79 263.06 887.79 222.36"/>
+ <polygon class="cls-2" points="829.32 263.06 890.09 263.06 890.09 265.37 829.32 265.92 829.32 263.06"/>
+ <rect class="cls-2" x="735.13" y="314.88" width="18.61" height="41.88"/>
+ <line class="cls-2" x1="744.43" y1="314.88" x2="744.78" y2="356.76"/>
+ <line class="cls-2" x1="735.13" y1="325.28" x2="753.74" y2="325.28"/>
+ <line class="cls-2" x1="735.13" y1="335.31" x2="753.74" y2="335.31"/>
+ <line class="cls-2" x1="735.13" y1="345.13" x2="753.74" y2="345.13"/>
+ <rect class="cls-2" x="755.6" y="314.88" width="18.61" height="41.88"/>
+ <line class="cls-2" x1="764.91" y1="314.88" x2="765.26" y2="356.76"/>
+ <line class="cls-2" x1="755.6" y1="325.28" x2="774.22" y2="325.28"/>
+ <line class="cls-2" x1="755.6" y1="335.31" x2="774.22" y2="335.31"/>
+ <line class="cls-2" x1="755.6" y1="345.13" x2="774.22" y2="345.13"/>
+ <rect class="cls-2" x="732.34" y="313.02" width="44.67" height="45.6"/>
+ <rect class="cls-2" x="596.23" y="314.75" width="16.39" height="38.89"/>
+ <line class="cls-2" x1="604.43" y1="314.75" x2="604.73" y2="353.64"/>
+ <line class="cls-2" x1="596.23" y1="324.41" x2="612.62" y2="324.41"/>
+ <line class="cls-2" x1="596.23" y1="333.72" x2="612.62" y2="333.72"/>
+ <line class="cls-2" x1="596.23" y1="342.84" x2="612.62" y2="342.84"/>
+ <rect class="cls-2" x="614.26" y="314.75" width="16.39" height="38.89"/>
+ <line class="cls-2" x1="622.46" y1="314.75" x2="622.76" y2="353.64"/>
+ <line class="cls-2" x1="614.26" y1="324.41" x2="630.65" y2="324.41"/>
+ <line class="cls-2" x1="614.26" y1="333.72" x2="630.65" y2="333.72"/>
+ <line class="cls-2" x1="614.26" y1="342.84" x2="630.65" y2="342.84"/>
+ <rect class="cls-2" x="594.6" y="313.02" width="37.69" height="42.35"/>
+ <rect class="cls-2" x="855.29" y="317.67" width="19.63" height="41.88"/>
+ <line class="cls-2" x1="865.1" y1="317.67" x2="865.46" y2="359.56"/>
+ <line class="cls-2" x1="855.29" y1="328.08" x2="874.91" y2="328.08"/>
+ <line class="cls-2" x1="855.29" y1="338.11" x2="874.91" y2="338.11"/>
+ <line class="cls-2" x1="855.29" y1="347.92" x2="874.91" y2="347.92"/>
+ <rect class="cls-2" x="876.87" y="317.67" width="19.63" height="41.88"/>
+ <line class="cls-2" x1="886.69" y1="317.67" x2="887.05" y2="359.56"/>
+ <line class="cls-2" x1="876.87" y1="328.08" x2="896.5" y2="328.08"/>
+ <line class="cls-2" x1="876.87" y1="338.11" x2="896.5" y2="338.11"/>
+ <line class="cls-2" x1="876.87" y1="347.92" x2="896.5" y2="347.92"/>
+ <rect class="cls-2" x="853.32" y="315.81" width="45.14" height="45.6"/>
+ <rect class="cls-2" x="696.97" y="313.95" width="22.34" height="49.33"/>
+ <rect class="cls-2" x="692.32" y="310.23" width="31.64" height="67.94"/>
+ <rect class="cls-2" x="692.32" y="378.17" width="31.64" height="8.38"/>
+ <polyline class="cls-2" points="695.06 386.55 691.39 391.33 719.31 391.2 717.68 386.55"/>
+ <rect class="cls-2" x="730.47" y="306.51" width="13.03" height="4.65"/>
+ <circle class="cls-2" cx="722.1" cy="340.01" r="0.93"/>
+ <path class="cls-2" d="M719.53,342.8" transform="translate(1.64)"/>
+ <path class="cls-2" d="M720.46,342.8v1.87a.93.93,0,0,1-.93.93h-4.65v-.94h5.58" transform="translate(1.64)"/>
+ <polyline class="cls-2" points="688.65 386.47 688.65 306.51 727.92 306.51 727.92 388.94"/>
+ <path class="cls-2"
+ d="M751.3,373.52h14.34a.09.09,0,0,1,.08.14c-.9,1.08-6.79,7.51-14.46-.05A.05.05,0,0,1,751.3,373.52Z"
+ transform="translate(1.64)"/>
+ <path class="cls-2" d="M765.83,373.52s.23,1.86-.7,18.61c-8.37,4.65-14-1.69-14-1.69V373.52"
+ transform="translate(1.64)"/>
+ <line class="cls-2" x1="385.26" y1="346.49" x2="385.26" y2="371.4"/>
+ <line class="cls-2" x1="345.17" y1="351.18" x2="345.17" y2="400.04"/>
+ <path class="cls-2" d="M749.31,185.52,904.73,179l79.11,14.89L816,199.48l-294.52,8.37s0,0,0,0l52-16.7,157.81-4.6"
+ transform="translate(1.64)"/>
+ <polygon class="cls-4" points="732.8 156.42 749.82 156.67 750.95 189.24 732.8 189.24 732.8 156.42"/>
+ <polygon class="cls-2" points="526.66 210.65 526.66 215.38 985.48 201.3 985.48 197.03 526.66 210.65"/>
+ <polyline class="cls-2" points="961.16 202.04 985.48 207.85 992 194.83 982.36 193.31"/>
+ <polyline class="cls-2" points="522.93 207.85 522.93 216.8 526.66 218.37 526.66 222.92 545.6 215.39"/>
+ <polyline class="cls-2" points="569.47 302.78 956.63 301.85 954.77 202.27"/>
+ <path class="cls-2" d="M947.54,301.85c.39.93-.38,94.93-.38,94.93l-182-4.65" transform="translate(1.64)"/>
+ <polyline class="cls-2" points="939.88 396.78 940.81 409.81 775.7 406.38"/>
+ <polyline class="cls-2" points="956.69 288.36 1060.62 315.81 1057.63 324.41 956.5 296.04"/>
+ <polyline class="cls-2" points="1028.18 316.74 1034.81 406.09 985.48 407.87"/>
+ <line class="cls-2" x1="1031.15" y1="405.84" x2="1031.15" y2="415.98"/>
+ <line class="cls-2" x1="562.84" y1="222.36" x2="954.7" y2="212.83"/>
+ <line class="cls-2" x1="561.56" y1="275.79" x2="955.63" y2="273.32"/>
+ <line class="cls-2" x1="562.68" y1="229.73" x2="594.13" y2="229.26"/>
+ <line class="cls-2" x1="643.75" y1="229.26" x2="706.74" y2="228.33"/>
+ <line class="cls-2" x1="757.67" y1="226.88" x2="831.58" y2="224.76"/>
+ <line class="cls-2" x1="887.79" y1="224.28" x2="954.7" y2="222.36"/>
+ <line class="cls-2" x1="562.68" y1="239.03" x2="594.13" y2="238.57"/>
+ <line class="cls-2" x1="643.75" y1="238.57" x2="706.74" y2="237.64"/>
+ <line class="cls-2" x1="757.67" y1="236.19" x2="831.58" y2="234.07"/>
+ <line class="cls-2" x1="887.79" y1="233.59" x2="954.7" y2="231.67"/>
+ <line class="cls-2" x1="562.68" y1="250.2" x2="594.13" y2="249.74"/>
+ <line class="cls-2" x1="643.75" y1="249.74" x2="706.74" y2="248.8"/>
+ <line class="cls-2" x1="757.67" y1="247.36" x2="831.58" y2="245.23"/>
+ <line class="cls-2" x1="887.79" y1="244.76" x2="954.7" y2="242.84"/>
+ <line class="cls-2" x1="562.68" y1="260.44" x2="594.13" y2="259.97"/>
+ <line class="cls-2" x1="643.75" y1="259.97" x2="706.74" y2="259.04"/>
+ <line class="cls-2" x1="757.67" y1="257.6" x2="831.58" y2="255.47"/>
+ <line class="cls-2" x1="887.79" y1="254.99" x2="954.7" y2="253.08"/>
+ <line class="cls-5" x1="561.75" y1="268.81" x2="592.27" y2="268.35"/>
+ <line class="cls-6" x1="645.32" y1="268.35" x2="829.59" y2="265.56"/>
+ <line class="cls-7" x1="890.09" y1="263.37" x2="954.7" y2="261.45"/>
+ <line class="cls-2" x1="574.06" y1="302.78" x2="574.06" y2="383.4"/>
+ <line class="cls-2" x1="580.32" y1="302.78" x2="580.32" y2="383.25"/>
+ <line class="cls-2" x1="587.43" y1="302.74" x2="587.43" y2="383.4"/>
+ <line class="cls-2" x1="559.84" y1="312.56" x2="559.84" y2="383.25"/>
+ <line class="cls-2" x1="566.96" y1="305.11" x2="566.96" y2="383.4"/>
+ <line class="cls-2" x1="634.55" y1="302.78" x2="634.61" y2="385.15"/>
+ <line class="cls-2" x1="640.81" y1="302.78" x2="640.81" y2="385.15"/>
+ <line class="cls-2" x1="647.93" y1="302.74" x2="647.93" y2="385.15"/>
+ <line class="cls-2" x1="655.03" y1="302.78" x2="655.03" y2="386.08"/>
+ <line class="cls-2" x1="661.29" y1="302.78" x2="661.29" y2="386.08"/>
+ <line class="cls-2" x1="668.4" y1="302.74" x2="668.4" y2="386.08"/>
+ <line class="cls-2" x1="674.57" y1="302.78" x2="674.57" y2="386.08"/>
+ <line class="cls-2" x1="680.83" y1="302.78" x2="680.83" y2="386.08"/>
+ <line class="cls-2" x1="594.53" y1="355.38" x2="594.53" y2="384.22"/>
+ <line class="cls-2" x1="600.79" y1="355.38" x2="600.79" y2="384.16"/>
+ <line class="cls-2" x1="607.91" y1="355.37" x2="607.91" y2="384.22"/>
+ <line class="cls-2" x1="615.01" y1="355.38" x2="615.01" y2="384.22"/>
+ <line class="cls-2" x1="621.27" y1="355.38" x2="621.27" y2="384.16"/>
+ <line class="cls-2" x1="628.1" y1="355.37" x2="628.1" y2="385.15"/>
+ <line class="cls-2" x1="594.53" y1="302.75" x2="594.53" y2="312.56"/>
+ <line class="cls-2" x1="600.79" y1="302.75" x2="600.79" y2="312.54"/>
+ <line class="cls-2" x1="607.91" y1="302.74" x2="607.91" y2="312.56"/>
+ <line class="cls-2" x1="615.01" y1="302.75" x2="615.01" y2="312.56"/>
+ <line class="cls-2" x1="621.27" y1="302.75" x2="621.27" y2="312.54"/>
+ <line class="cls-2" x1="628.38" y1="302.74" x2="628.38" y2="312.56"/>
+ <line class="cls-2" x1="802.07" y1="301.86" x2="802.07" y2="392.59"/>
+ <line class="cls-8" x1="808.33" y1="301.86" x2="808.33" y2="393.35"/>
+ <line class="cls-8" x1="815.45" y1="301.81" x2="815.45" y2="393.53"/>
+ <line class="cls-8" x1="822.55" y1="301.86" x2="822.55" y2="393.53"/>
+ <line class="cls-9" x1="828.81" y1="301.86" x2="828.81" y2="393.53"/>
+ <line class="cls-8" x1="835.92" y1="301.81" x2="835.92" y2="393.53"/>
+ <line class="cls-10" x1="842.09" y1="301.86" x2="842.09" y2="393.53"/>
+ <line class="cls-9" x1="848.35" y1="301.86" x2="848.35" y2="393.53"/>
+ <line class="cls-2" x1="855.47" y1="301.81" x2="855.47" y2="315.35"/>
+ <line class="cls-2" x1="780.67" y1="302.32" x2="780.67" y2="392.59"/>
+ <line class="cls-2" x1="787.86" y1="302.32" x2="787.86" y2="392.43"/>
+ <line class="cls-2" x1="794.97" y1="302.32" x2="794.97" y2="392.59"/>
+ <line class="cls-2" x1="755.54" y1="358.16" x2="755.54" y2="373.05"/>
+ <line class="cls-2" x1="762.73" y1="358.18" x2="762.73" y2="373.05"/>
+ <line class="cls-2" x1="769.84" y1="359.09" x2="769.84" y2="391.66"/>
+ <line class="cls-2" x1="775.08" y1="359.11" x2="775.08" y2="392.59"/>
+ <line class="cls-2" x1="734.14" y1="359.09" x2="734.14" y2="389.8"/>
+ <line class="cls-2" x1="741.33" y1="359.09" x2="741.33" y2="389.75"/>
+ <line class="cls-2" x1="748.44" y1="358.16" x2="748.44" y2="389.8"/>
+ <line class="cls-2" x1="757.4" y1="302.32" x2="757.4" y2="312.56"/>
+ <line class="cls-2" x1="764.59" y1="302.32" x2="764.59" y2="312.56"/>
+ <line class="cls-2" x1="771.71" y1="302.62" x2="771.71" y2="313.19"/>
+ <line class="cls-2" x1="736" y1="302.62" x2="736" y2="306.04"/>
+ <line class="cls-2" x1="743.19" y1="302.62" x2="743.19" y2="306.97"/>
+ <line class="cls-2" x1="750.3" y1="302.32" x2="750.3" y2="312.58"/>
+ <line class="cls-2" x1="882.11" y1="301.82" x2="882.11" y2="315.35"/>
+ <line class="cls-2" x1="888.37" y1="301.82" x2="888.37" y2="315.32"/>
+ <line class="cls-2" x1="895.49" y1="301.81" x2="895.49" y2="315.35"/>
+ <line class="cls-2" x1="902.59" y1="301.86" x2="902.59" y2="395.39"/>
+ <line class="cls-2" x1="908.85" y1="301.86" x2="908.85" y2="395.21"/>
+ <line class="cls-2" x1="915.96" y1="301.81" x2="915.96" y2="395.39"/>
+ <line class="cls-2" x1="922.13" y1="301.86" x2="922.13" y2="396.32"/>
+ <line class="cls-2" x1="928.39" y1="301.86" x2="928.39" y2="396.14"/>
+ <line class="cls-2" x1="935.51" y1="301.81" x2="935.51" y2="396.32"/>
+ <line class="cls-2" x1="943.88" y1="301.81" x2="943.88" y2="396.32"/>
+ <line class="cls-2" x1="861.64" y1="301.96" x2="861.64" y2="315.35"/>
+ <line class="cls-2" x1="867.9" y1="301.96" x2="867.9" y2="315.32"/>
+ <line class="cls-2" x1="875.01" y1="301.95" x2="875.01" y2="315.35"/>
+ <line class="cls-11" x1="855.47" y1="360.95" x2="855.47" y2="394.46"/>
+ <line class="cls-12" x1="882.11" y1="361.9" x2="882.11" y2="395.39"/>
+ <line class="cls-13" x1="888.37" y1="361.88" x2="888.37" y2="395.33"/>
+ <line class="cls-12" x1="895.49" y1="361.88" x2="895.49" y2="395.39"/>
+ <line class="cls-14" x1="861.64" y1="360.97" x2="861.64" y2="394.46"/>
+ <line class="cls-14" x1="867.9" y1="360.97" x2="867.9" y2="394.39"/>
+ <line class="cls-14" x1="875.01" y1="360.95" x2="875.01" y2="394.46"/>
+ <path class="cls-2"
+ d="M516.82,364.18v-7.39s3.72-4.71,7.45-4.71,6.51,2.79,5.58,4.66-.93,7.44-.93,7.44A15.35,15.35,0,0,1,516.82,364.18Z"
+ transform="translate(1.64)"/>
+ <path class="cls-2" d="M516.82,365.42V377s6.52,2.09,12.1.23v-13" transform="translate(1.64)"/>
+ <path class="cls-2" d="M523.43,363s2.7.3,2.7-.63-1.68-2.49-2.7-1.71S523.43,363,523.43,363Z"
+ transform="translate(1.64)"/>
+ <line class="cls-15" x1="407.53" y1="358.53" x2="444.97" y2="358.53"/>
+ <line class="cls-15" x1="374.65" y1="313.02" x2="374.65" y2="342.26"/>
+ <line class="cls-15" x1="382.56" y1="312.4" x2="382.56" y2="344.43"/>
+ <line class="cls-15" x1="390.91" y1="312.56" x2="390.91" y2="371.46"/>
+ <line class="cls-15" x1="399.29" y1="312.56" x2="399.29" y2="371.46"/>
+ <line class="cls-2" x1="454.99" y1="312.09" x2="453.27" y2="375.84"/>
+ <line class="cls-2" x1="463.37" y1="313.02" x2="461.64" y2="376.77"/>
+ <line class="cls-16" x1="480.12" y1="313.02" x2="478.4" y2="376.77"/>
+ <line class="cls-16" x1="471.75" y1="313.02" x2="470.02" y2="376.77"/>
+ <line class="cls-16" x1="489.43" y1="313.02" x2="487.7" y2="376.77"/>
+ <line class="cls-17" x1="497.81" y1="312.56" x2="496.08" y2="377.7"/>
+ <line class="cls-17" x1="514.56" y1="312.56" x2="512.83" y2="377.7"/>
+ <line class="cls-17" x1="506.18" y1="312.56" x2="504.45" y2="377.7"/>
+ <line class="cls-2" x1="521.7" y1="312.4" x2="521.7" y2="353.64"/>
+ <line class="cls-2" x1="530.38" y1="312.4" x2="529.88" y2="353.28"/>
+ <line class="cls-2" x1="537.35" y1="312.4" x2="536.22" y2="377.7"/>
+ <line class="cls-2" x1="545.89" y1="312.09" x2="544.18" y2="378.11"/>
+ <polyline class="cls-2" points="552.01 312.4 552.01 383.25 554 382.92"/>
+ <line class="cls-2" x1="960.96" y1="297.29" x2="962.21" y2="385.15"/>
+ <line class="cls-2" x1="975.68" y1="301.42" x2="975.24" y2="394.46"/>
+ <line class="cls-2" x1="990.45" y1="305.56" x2="990.45" y2="407.87"/>
+ <line class="cls-2" x1="1004.09" y1="309.3" x2="1005.96" y2="407.49"/>
+ <line class="cls-2" x1="1016.51" y1="313.01" x2="1019.92" y2="407.02"/>
+ <path class="cls-2"
+ d="M946,414.88q-3.35-10.53-6.36-21.17c4.91,5.55,5.88,13.66,10.36,19.56l-3.44-19.6a3.29,3.29,0,0,1,.27-2.59c1.35,1.32,1.7,3.33,2.06,5.18a82.64,82.64,0,0,0,4.21,14.63,3,3,0,0,0,1.51,1.94c1.26-7.83-.92-15.83-.32-23.74.55,7.4,1.13,14.89,3.38,22a6.86,6.86,0,0,0,.91-2.43l3-12.65a142,142,0,0,1-1.91,16.43l5.72-13c.82,4.36-1.47,8.78-1.09,13.21,1.13-1,1.53-2.57,2-4a25.27,25.27,0,0,1,4.37-8L967.14,415q4.1-5.27,8.52-10.26c.77,3.36-2,6.57-2,10l6.72-7.18c.75,1.66-.51,3.5-.8,5.3a1.58,1.58,0,0,0,0,.78c.35.94,1.73.7,2.68.35a13,13,0,0,1,6.58-.85c1.41.23,2.76.77,4.16,1.05a5.59,5.59,0,0,0,4.16-.49"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M944.75,412.93c-1.78-1.88-2.28-4.64-3.82-6.73-.41-.56-1.08-1.11-1.73-.85s-.73,1.14-.71,1.85l.08,2.86c0,.54,0,1.17-.48,1.45a1.19,1.19,0,0,1-.79.1,6.29,6.29,0,0,1-1.59-.66,2.57,2.57,0,0,0-1.66-.32,1.12,1.12,0,0,0-.9,1.26,1.54,1.54,0,0,0,1.14.86,14.76,14.76,0,0,0,5.18.22c-1.48.42-3.07.25-4.56.61a30.28,30.28,0,0,0-2.93,1.09c-2.94,1-6.17.74-9.27.44"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M947.83,414.31a33.48,33.48,0,0,1-1.49-6.59l-1.42-9.13c.32,0,.56.29.73.58a25.08,25.08,0,0,1,2.5,5.16c.41,1.35.59,2.77,1,4.11.54,1.66,1.48,3.2,1.73,4.93.29-5.67.6-11.35,1.38-17q1.37,5.67,2.47,11.4c.35,1.82.73,3.74,2,5.1,2-4.4,2.17-9.35,2.35-14.17.29,2.29.2,4.62.33,6.92a14.84,14.84,0,0,0,1.68,6.66,27.13,27.13,0,0,0,3.15-9.25l-.47,7.9a9.64,9.64,0,0,0,.09,2.63,3.53,3.53,0,0,0,1.77-1.76c1.25-2.22,2-4.8,3.77-6.6a59.09,59.09,0,0,0-1.52,9.25,6.7,6.7,0,0,0,2-2.44q1.43-2.43,2.82-4.87a55.44,55.44,0,0,1-1,7.48"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M977.47,408.1a30.9,30.9,0,0,0,4.12-7.81c.46.54.94,1.06,1.45,1.55a2.82,2.82,0,0,0,1.11.74,1.67,1.67,0,0,0,1.89-1.21,2.37,2.37,0,0,0-.73-2.25,4.14,4.14,0,0,0-2.23-1,5.93,5.93,0,0,0,2.69-1.92,2,2,0,0,0-.55-2.91,2.22,2.22,0,0,0-2.24.53,4.05,4.05,0,0,0-1.4,2.76,3.16,3.16,0,0,0-1.69-1.44,2.62,2.62,0,0,0-2.58,1.51,2.39,2.39,0,0,0-.41,1.36,2,2,0,0,0,1.59,1.59,5.74,5.74,0,0,0,2.4-.14"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M971.64,406.82a43.28,43.28,0,0,0,3.46-8.65,4.59,4.59,0,0,1,.75-1.93c.22-.26.49-.46.72-.7a2.81,2.81,0,0,0,.78-2,1.32,1.32,0,0,0-.14-.65c-.4-.65-1.4-.42-2,0a5.88,5.88,0,0,0-2,2.5,3.57,3.57,0,0,0-2.72-1.69,1.63,1.63,0,0,0-1.62.65c-.39.71.16,1.59.81,2.07a4.73,4.73,0,0,0,3.82.81"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M963.59,401.9c.53-2.47,2.15-4.58,2.73-7a22.71,22.71,0,0,1,.71-3.17c.31-.76.83-1.57.56-2.35a1.6,1.6,0,0,0-2.39-.56,2.69,2.69,0,0,0-.88,2.57,2.07,2.07,0,0,0-2.62-.2,1.6,1.6,0,0,0,0,2.46c.83.56,1.94.07,2.82-.42l3.11-1.75a4.1,4.1,0,0,1,1.33-.56,1.39,1.39,0,0,1,1.31.43c.54.7,0,1.71-.7,2.25a3,3,0,0,1-2,.72A1.76,1.76,0,0,1,966,393"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M959,400.58l.28-10a2.13,2.13,0,0,0,2.34-1.35,6.17,6.17,0,0,0,.29-2.9,2.41,2.41,0,0,0-.22-1,.83.83,0,0,0-.86-.46,1.07,1.07,0,0,0-.53.41,5.66,5.66,0,0,0-.66,3.71,6.35,6.35,0,0,0-2.21-3.3c-.3-.22-.74-.41-1-.15a.81.81,0,0,0-.13.63,6,6,0,0,0,1.75,3.57,1.37,1.37,0,0,0-1.49-1.16,2.6,2.6,0,0,0-1.75,1.07,1,1,0,0,0-.27.94,1,1,0,0,0,.73.48,6.5,6.5,0,0,0,3.19,0"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M749.35,407.26q-1.61-3.75-2.83-7.64a17.35,17.35,0,0,1,2.34,6.77c.72-2.11.18-4.69,1.58-6.43l.29,7.35a19.69,19.69,0,0,1,3-5.28,6.47,6.47,0,0,1-1.31,2.32,3.32,3.32,0,0,0-.77,2.49,27.28,27.28,0,0,1,5.82-2.08l-1.28,2.39a4.22,4.22,0,0,1,1.4-1.64,1.47,1.47,0,0,1,2,.31c.11.18.16.38.28.55.4.59,1.31.48,1.93.13a6.34,6.34,0,0,1,1.85-1c.89-.18,1.75.37,2.66.49,1.25.18,2.51-.47,3.77-.31.76.1,1.46.49,2.22.65,1.93.39,3.9-.78,5.86-.55a19.88,19.88,0,0,1,2.71.77,14.72,14.72,0,0,0,3,.38l5.11.29"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M780.12,407.83c-1.9-.75-4-.4-6.06-.51a29.3,29.3,0,0,0-3.37-.2,18.26,18.26,0,0,0-4.33,1.11,26.24,26.24,0,0,1-4.87,1"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M749.51,404.89a26.24,26.24,0,0,1-.52-7.29,2.83,2.83,0,0,1,.9-2.22c1.15-.78,3,.28,4-.65a1.56,1.56,0,0,0,0-2.2,2.12,2.12,0,0,0-2.3-.33,3.49,3.49,0,0,0-1.68,1.75,7.58,7.58,0,0,0-.31-2.68,3.26,3.26,0,0,0-.81-1.48,1.58,1.58,0,0,0-1.56-.44,2,2,0,0,0-1,2.27,4.37,4.37,0,0,0,2.12,3.1,5.29,5.29,0,0,0-3.34-1.07,2.68,2.68,0,0,0-1.92.73,1.39,1.39,0,0,0-.07,1.89,2,2,0,0,0,1.35.42,11.89,11.89,0,0,0,3.36-.39"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M458.36,408.52a15.77,15.77,0,0,0,3.21-8.77,37.41,37.41,0,0,1-3.36,6.19l-.72-2.9c-.89,1-.64,3-1.88,3.52-1,.48-2.58-.37-3.27.54-.5.65-.12,1.09-.92,1.25-.41.08-1.62-.74-2-.92l-4-1.85c-.48-.22-1.05-.64-.88-1.14a.84.84,0,0,1,.4-.43c1.17-.67,2.62.11,3.69.93s2.33,1.76,3.63,1.4a.75.75,0,0,0,.35-.19.92.92,0,0,0,.13-.7,12.83,12.83,0,0,1,.54-4.69c.78,2.07.48,6.29-1.26,7.9s-5.39,2-7.44,2.76l-6.69,2.37a31.42,31.42,0,0,1-4.74,1.4"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M280,432.39c-2.64-1.48-5.84-1.64-8.86-1.36s-6,1-9,1.09c-5.8.2-11.55-1.81-17.34-1.36A38.31,38.31,0,0,0,250,424.9l-5.31,5.16a17,17,0,0,1-.64-4.85q-.19,2.55-.6,5.07l-2.78-3.41.82,4.41c-2.08-.84-2.37-4.53-4.62-4.53l1.58,4.85a10.65,10.65,0,0,1-2.43-3.26c-.48.45-.45,1.21-.69,1.81s-1.23,1-1.49.41a1.37,1.37,0,0,1,0-.67c.09-1.3-1-2.33-1.6-3.48a10.37,10.37,0,0,1-.91-3.94l-.84-8.84c-1.54,5.31,1.21,11,.6,16.46a57.61,57.61,0,0,0-7.24-11.28c-.44-.54-1.15-1.11-1.74-.75.07,1.62,1.23,2.95,2.33,4.13q4.26,4.53,8.74,8.84a42.88,42.88,0,0,0-13.46-7.47,67.92,67.92,0,0,0,10.92,9,37,37,0,0,0-7.24-3.05,12.59,12.59,0,0,0-7.73.19,92.59,92.59,0,0,0,17.24,2.07c0,.73-.77,1.19-1.45,1.45-5.14,1.94-10.88,1.41-16.23,2.67a48.81,48.81,0,0,0-8.16,2.95"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M286,310.43h16.58a6.28,6.28,0,0,0,1.63-.21c2.61-.68,9.65-3.19,2-9a19.15,19.15,0,0,0-17.4-3.23c-3.95,1.18-7,3.41-8.27,5.38-1.47,2.3-1,3.06-.63,4.13s2.55,2.6,6.31,2.92"
+ transform="translate(1.64)"/>
+ <path class="cls-2" d="M288.64,286.67s3.06,1.76,1,3.73c-1.17,1.1-1.74,3,.13,4.24" transform="translate(1.64)"/>
+ <path class="cls-2" d="M293.54,286.26s3.06,1.76,1,3.73c-1.17,1.1-1.74,3,.13,4.24" transform="translate(1.64)"/>
+ <path class="cls-2" d="M298,285.89s3.06,1.76,1,3.73c-1.17,1.1-1.74,3,.13,4.24" transform="translate(1.64)"/>
+ <path class="cls-2" d="M289.33,298.21a3.74,3.74,0,0,0-1.41,4.21" transform="translate(1.64)"/>
+ <path class="cls-2" d="M295.48,297.17s-3.65,1.81-2.71,5.25" transform="translate(1.64)"/>
+ <path class="cls-2" d="M300.67,298s-3.13,1.35-2.58,4.4" transform="translate(1.64)"/>
+ <path class="cls-2" d="M352.84,77.37V85l20.25-8.78v-8c-4.46-4.15-13.71-3.19-13.71-3.19l-6.54,12.28,20.09-8.93"
+ transform="translate(1.64)"/>
+ <ellipse class="cls-2" cx="367.39" cy="67.8" rx="1.43" ry="0.64"/>
+ <ellipse class="cls-2" cx="366.09" cy="75.88" rx="1.59" ry="1.43"/>
+ <ellipse class="cls-2" cx="359.58" cy="72.74" rx="1.28" ry="0.48"/>
+ <path class="cls-2" d="M435.69,33.88s0,1.31-1.31,0S435.69,30,437,31.27l1.31,1.3" transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M463.78,33.23l-6.62-2.32s-7.76-1.6-14.54,0-6.28,7.54-5,8.85L439.84,42c-1.73,3.5.42,7,.42,7h3.92A5.73,5.73,0,0,1,442.87,45a2.56,2.56,0,0,1,2.61-2.62l1.31,1.31c1.31,1.31,7.84,0,7.84,0-1.31,2.61,2.61,5.23,2.61,5.23h2.62c-1.31-1.31-1.31-9.15.74-6.54s6.87,0,6.87,0L469,39.76c-2.61,0-3.92-3.92-3.92-3.92"
+ transform="translate(1.64)"/>
+ <path class="cls-2" d="M463.36,37.53s-2.44-3.51,2.71-5.45l1.52.32S467,35.28,465.48,35" transform="translate(1.64)"/>
+ <path class="cls-2" d="M552.45,88.32" transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M564.42,35a2.56,2.56,0,0,1-2.62-2.61c0-1.31,1.31-2.61,3.27.65h1.31c1.3,0,1.3,0,3.91,1.84s0,3.39,0,3.39a11.48,11.48,0,0,0-3.91.65c-1.31.65.17,4.06-.66,6.53-.65,2-3.26,3.27-3.26,3.27s-1,5.88-.31,7.19c1,.65,1.31,3.26,1.31,3.26h-3.62V56.53a1.28,1.28,0,0,1-1.3-1.31c0-1.3-1.15-5.88-1.47-5.88-4.09,2-10.29-.65-10.29-.65"
+ transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M546.78,49l-2,3v2.61a4.58,4.58,0,0,1,1.3,2.61,5.24,5.24,0,0,0,.29,2l-2.9-.65s0-2.61-1.31-2.61V53.26L540.9,52l1.3-2.62s.71-3.35-.3-4.94a4.75,4.75,0,0,1,2.92-6.81c2.48-.83,11.76,1.3,14.37,0S561.8,35,561.8,35"
+ transform="translate(1.64)"/>
+ <rect class="cls-2" x="625.42" y="67.29" width="5.69" height="1.81" rx="0.62"/>
+ <path class="cls-2"
+ d="M623.31,76.87a2.19,2.19,0,0,0-2,2.17v14a2.19,2.19,0,0,0,2.18,2.18h6.26a2.19,2.19,0,0,0,2.18-2.18V79A2.19,2.19,0,0,0,630.36,77"
+ transform="translate(1.64)"/>
+ <path class="cls-2" d="M626.63,69.1" transform="translate(1.64)"/>
+ <line class="cls-2" x1="633.58" y1="93.17" x2="633.58" y2="93.06"/>
+ <line class="cls-2" x1="626.23" y1="69.1" x2="624.71" y2="76.86"/>
+ <polyline class="cls-2" points="630.41 69.1 631.92 76.84 631.93 76.86"/>
+ <line class="cls-2" x1="631.92" y1="76.84" x2="632.04" y2="76.96"/>
+ <line class="cls-2" x1="625.47" y1="72.98" x2="630.78" y2="71"/>
+ <line class="cls-2" x1="622.96" y1="81.68" x2="633.59" y2="81.68"/>
+ <line class="cls-2" x1="622.96" y1="91.93" x2="633.58" y2="91.93"/>
+ <line class="cls-2" x1="630.48" y1="65.22" x2="630.48" y2="62.37"/>
+ <line class="cls-2" x1="632.55" y1="65.82" x2="634.76" y2="63.82"/>
+ <line class="cls-2" x1="633.33" y1="67.61" x2="636.43" y2="67.76"/>
+ <path class="cls-2"
+ d="M654.59,155.68s3.63,5.23,8.59,2.35a3.63,3.63,0,0,1-2.67,4.69s-5.73-1.81-6.49-6.49-.38-12.27,9.92-14.07a17.64,17.64,0,0,1,8.33.25l.14,0a10.27,10.27,0,0,1,5.66,4.4c.76,1.08,1.91,5.77,1.91,5.77s-6.49,3.61-13.36.36C659.36,150.45,657.84,149.73,654.59,155.68Z"
+ transform="translate(1.64)"/>
+ <path class="cls-2" d="M672.27,142.41s-6.37,2.91-2.58,11.61" transform="translate(1.64)"/>
+ <path class="cls-2" d="M664.15,142.12a19,19,0,0,0-2.09-2L660.62,139s6.62-1.32,8.2,2.77"
+ transform="translate(1.64)"/>
+ <ellipse class="cls-2" cx="676.08" cy="147.75" rx="0.76" ry="0.72"/>
+ <polygon class="cls-2"
+ points="275.58 202.46 275.74 205.01 290.19 204.29 290.01 201.54 275.85 202.44 275.58 202.46"/>
+ <polygon class="cls-2"
+ points="274.09 227.75 280.41 229.41 279.47 214.75 275.74 205.01 273.85 213.27 274.09 227.75"/>
+ <polyline class="cls-2" points="274.09 227.75 277.39 225.47 280.16 229.35"/>
+ <line class="cls-2" x1="276.65" y1="213.78" x2="277.39" y2="225.47"/>
+ <polyline class="cls-2" points="279.45 214.52 293.31 213.63 290.39 204.27"/>
+ <polyline class="cls-2" points="280.41 229.41 294.8 227.81 293.31 213.63"/>
+ <polyline class="cls-2"
+ points="280.93 202.12 281.1 204.67 283.94 209.17 287.38 208.95 285.01 204.27 285.09 201.85"/>
+ <line class="cls-2" x1="280.25" y1="226.99" x2="294.51" y2="225.1"/>
+ <path class="cls-2" d="M284.91,218.44a2.89,2.89,0,0,0-3.18-.13,2.45,2.45,0,1,0,2.33,4.22,3.11,3.11,0,0,0,1.49-1.75"
+ transform="translate(1.64)"/>
+ <ellipse class="cls-2" cx="287.66" cy="219.43" rx="2.41" ry="2.86"
+ transform="translate(-65.46 290.45) rotate(-48.66)"/>
+ <line class="cls-2" x1="287.32" y1="217.37" x2="291.45" y2="221.32"/>
+ <line class="cls-2" x1="282.03" y1="221.8" x2="286.67" y2="218.56"/>
+ <path class="cls-2" d="M304.82,114.56s3,1.25.9,2.75c-1.19.85-1.8,2.29,0,3.15" transform="translate(1.64)"/>
+ <path class="cls-2" d="M309.27,114.19s3,1.25.9,2.75c-1.19.85-1.8,2.29,0,3.15" transform="translate(1.64)"/>
+ <path class="cls-2"
+ d="M302.55,124.63h12.66a.65.65,0,0,1,.65.65v2.45a0,0,0,0,1,0,0h-14a0,0,0,0,1,0,0v-2.45A.65.65,0,0,1,302.55,124.63Z"/>
+ <path class="cls-2"
+ d="M303.59,123.08h10.28a.53.53,0,0,1,.53.53v1a0,0,0,0,1,0,0H303.06a0,0,0,0,1,0,0v-1A.53.53,0,0,1,303.59,123.08Z"/>
+ <path class="cls-2" d="M300.75,127.73l.28,2.52,1.36,12a.5.5,0,0,0,.49.44h8.61a.5.5,0,0,0,.49-.44l1.7-14.54"
+ transform="translate(1.64)"/>
+ <line class="cls-2" x1="315.03" y1="130.26" x2="302.67" y2="130.26"/>
+ <line class="cls-2" x1="303.42" y1="136.91" x2="314.25" y2="136.91"/>
+ <path class="cls-18" d="M394.18,150.93h1.24l3.43,10.23,3.43-10.23h1.24l-4.12,11.9h-1.1Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M405.32,150.93h1.18v11.9h-1.18Zm.81,0H413V152h-6.83Zm0,5.44h5.93v1.1h-5.93Zm0,5.36H413v1.1h-6.83Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M415.33,150.93h1.18v11.9h-1.18Zm.84,10.8H423v1.1h-6.8Z" transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M424.94,150.93h1.17v11.9h-1.17Zm.57,8.27,6.52-8.27h1.52L426,160.11Zm3.35-2.72.68-1.22,4.51,7.57h-1.41Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M436.86,162.44a3.43,3.43,0,0,1-1.42-1.5,5.25,5.25,0,0,1-.49-2.37V155.2a5.26,5.26,0,0,1,.49-2.38,3.36,3.36,0,0,1,1.42-1.49,5.19,5.19,0,0,1,4.53,0,3.43,3.43,0,0,1,1.43,1.49,5.4,5.4,0,0,1,.49,2.38v3.37a5.38,5.38,0,0,1-.49,2.37,3.51,3.51,0,0,1-1.43,1.5,5.28,5.28,0,0,1-4.53,0Zm3.89-1a2.5,2.5,0,0,0,1-1.1,4,4,0,0,0,.35-1.75v-3.48a4,4,0,0,0-.35-1.75,2.5,2.5,0,0,0-1-1.1,3.66,3.66,0,0,0-3.25,0,2.42,2.42,0,0,0-1,1.1,3.9,3.9,0,0,0-.36,1.75v3.48a3.87,3.87,0,0,0,.36,1.75,2.42,2.42,0,0,0,1,1.1,3.66,3.66,0,0,0,3.25,0Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M454.72,150.93H456v11.9h-1.18V152.61l.13.52-3.59,8.05h-.83l-3.58-7.88.12-.69v10.22h-1.18v-11.9h1.24l3.82,8.59Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M467.77,150.93H469v11.9h-1.18V152.61l.12.52-3.58,8.05h-.84L460,153.3l.12-.69v10.22H458.9v-11.9h1.23l3.82,8.59Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M472,150.93h1.18v11.9H472Zm.81,0h6.83V152h-6.83Zm0,5.44h5.93v1.1h-5.93Zm0,5.36h6.83v1.1h-6.83Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M482,150.93h1.19l6.9,10.72-.48-.33V150.93h1.18v11.89h-1.2L482.5,152l.64.47v10.33H482Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M493.82,161.49h1.34v1.34h-1.34Zm.08-10.56h1.17v9.17H493.9Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M394.91,180.47h.79v7.92h-.79Zm.55,0h4.44v.73h-4.44Zm0,3.69h3.84v.73h-3.84Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M401.27,180.46h.78v7.93h-.78Zm.48,3.85h2.71a1.67,1.67,0,0,0,.78-.19,1.35,1.35,0,0,0,.51-.55,1.68,1.68,0,0,0,.19-.82,1.8,1.8,0,0,0-.18-.82,1.38,1.38,0,0,0-.52-.55,1.61,1.61,0,0,0-.78-.19h-2.71v-.73h2.66a2.46,2.46,0,0,1,1.21.28,2,2,0,0,1,.81.81,2.48,2.48,0,0,1,.29,1.2,2.45,2.45,0,0,1-.29,1.2,2,2,0,0,1-.81.81,2.49,2.49,0,0,1-1.21.28h-2.66Zm2.54.49.73-.26,2,3.85h-.94Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M408.55,180.47h.78v7.92h-.78Zm.54,0h4.55v.73h-4.55Zm0,3.62h4v.73h-4Zm0,3.57h4.55v.73h-4.55Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M415.22,180.47H416v7.92h-.79Zm.76,7.19h1.79a2.36,2.36,0,0,0,1.65-.51,2.06,2.06,0,0,0,.55-1.55v-2.34a2.06,2.06,0,0,0-.55-1.55,2.36,2.36,0,0,0-1.65-.51H416v-.73h1.76a4,4,0,0,1,1.68.31,2.1,2.1,0,0,1,1,.95,3.36,3.36,0,0,1,.33,1.58v2.24a3.36,3.36,0,0,1-.33,1.58,2.17,2.17,0,0,1-1,1,4,4,0,0,1-1.68.31H416Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M424.38,180.47h.95l2.93,7.92h-.88l-2.52-7.1-2.53,7.1h-.87Zm-1.57,5.27H427v.73h-4.17Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M434.44,184.34v1.17a3.83,3.83,0,0,1-.31,1.65,2.06,2.06,0,0,1-.92,1,3.26,3.26,0,0,1-1.55.33,3.47,3.47,0,0,1-1.56-.32,2,2,0,0,1-.93-.92,3.44,3.44,0,0,1-.31-1.56v-2.34a3.91,3.91,0,0,1,.3-1.64,2.13,2.13,0,0,1,.93-1,3.22,3.22,0,0,1,1.54-.33,3,3,0,0,1,1.33.27,2.21,2.21,0,0,1,.91.78,3.55,3.55,0,0,1,.5,1.31h-.85a2.72,2.72,0,0,0-.39-.91,1.63,1.63,0,0,0-.63-.54,2,2,0,0,0-.87-.18,2.33,2.33,0,0,0-1.11.25,1.64,1.64,0,0,0-.66.74,3,3,0,0,0-.22,1.24v2.34a2.71,2.71,0,0,0,.22,1.15,1.51,1.51,0,0,0,.68.69,2.48,2.48,0,0,0,1.12.22,2.2,2.2,0,0,0,1.09-.23,1.52,1.52,0,0,0,.65-.72,3.25,3.25,0,0,0,.21-1.26v-.46h-1.92v-.73Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M441,188.39h-.79v-7.26l-1.45.91v-.82l1.13-.75H441Z" transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M442.67,187.76l3-3.91a3.37,3.37,0,0,0,.46-.75,1.76,1.76,0,0,0,.16-.65h0a1.27,1.27,0,0,0-.37-1,1.43,1.43,0,0,0-1-.35,1.41,1.41,0,0,0-1,.38,1.71,1.71,0,0,0-.47,1h-.82a3.11,3.11,0,0,1,.4-1.17,2,2,0,0,1,.78-.73,2.33,2.33,0,0,1,1.11-.26,2.64,2.64,0,0,1,1.21.25,1.62,1.62,0,0,1,.76.7,2.19,2.19,0,0,1,.27,1.12h0a2.23,2.23,0,0,1-.22.85,4.79,4.79,0,0,1-.6,1l-2.63,3.37h3.49v.73h-4.47Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M452.28,185.19v.73h-3.67v-.73Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M455.66,188.39h-.78v-7.26l-1.46.91v-.82l1.13-.75h1.11Z" transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M460.6,184.46v.19a.74.74,0,0,1-.45.37,2.26,2.26,0,0,1-.77.12,2.06,2.06,0,0,1-1.09-.29,1.89,1.89,0,0,1-.72-.81,2.8,2.8,0,0,1-.26-1.22h0a3.06,3.06,0,0,1,.26-1.31,1.76,1.76,0,0,1,.76-.83,2.61,2.61,0,0,1,2.39,0,1.91,1.91,0,0,1,.75.84,3,3,0,0,1,.26,1.33h0a3.7,3.7,0,0,1-.11.91,5.1,5.1,0,0,1-.31,1l-.06.14a1,1,0,0,0-.07.15l-1.69,3.39h-.88Zm0-.49a1.79,1.79,0,0,0,.37-1.2h0a1.77,1.77,0,0,0-.38-1.21,1.47,1.47,0,0,0-2.1,0,1.77,1.77,0,0,0-.38,1.21h0a1.73,1.73,0,0,0,.38,1.19,1.51,1.51,0,0,0,2.11,0Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M394.91,193.87h.79v7.93h-.79Zm.56,7.2H400v.73h-4.54Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M403.59,193.87h.94l2.93,7.93h-.87l-2.53-7.11-2.52,7.11h-.88ZM402,199.14h4.17v.73H402Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M409.34,201.56a2.06,2.06,0,0,1-.92-1,3.61,3.61,0,0,1-.31-1.61v-5.11h.79V199a2.18,2.18,0,0,0,.49,1.56,2,2,0,0,0,1.5.52,2,2,0,0,0,1.51-.52,2.18,2.18,0,0,0,.5-1.56v-5.15h.78V199a3.76,3.76,0,0,1-.3,1.61,2.13,2.13,0,0,1-.93,1,3.47,3.47,0,0,1-1.56.32A3.39,3.39,0,0,1,409.34,201.56Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M415.43,193.86h.78v7.94h-.78Zm.48,3.85h2.71a1.55,1.55,0,0,0,.78-.19,1.29,1.29,0,0,0,.51-.55,1.68,1.68,0,0,0,.19-.82,1.8,1.8,0,0,0-.18-.82,1.23,1.23,0,0,0-.52-.54,1.51,1.51,0,0,0-.78-.2h-2.71v-.73h2.67a2.45,2.45,0,0,1,1.2.29,1.89,1.89,0,0,1,.81.8,2.48,2.48,0,0,1,.29,1.2,2.42,2.42,0,0,1-.29,1.2,2,2,0,0,1-.81.81,2.47,2.47,0,0,1-1.2.28h-2.67Zm2.55.49.72-.25,2,3.85h-.94Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M422.71,193.87h.78v7.93h-.78Zm.75,7.2h1.8a2.36,2.36,0,0,0,1.65-.52,2,2,0,0,0,.54-1.55v-2.34a2.06,2.06,0,0,0-.54-1.55,2.36,2.36,0,0,0-1.65-.51h-1.8v-.73h1.76a3.91,3.91,0,0,1,1.68.31,2.08,2.08,0,0,1,1,.95,3.39,3.39,0,0,1,.33,1.58V199a3.24,3.24,0,0,1-.34,1.58,2.1,2.1,0,0,1-1,.95,4,4,0,0,1-1.68.32h-1.76Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M431.87,193.87h.95l2.92,7.93h-.87l-2.52-7.11-2.53,7.11H429Zm-1.57,5.27h4.17v.73H430.3Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M441.93,197.74v1.17a4,4,0,0,1-.31,1.65,2.11,2.11,0,0,1-.92,1,3.29,3.29,0,0,1-1.55.33,3.61,3.61,0,0,1-1.56-.31,2.06,2.06,0,0,1-.94-.93,3.56,3.56,0,0,1-.31-1.55v-2.34a4,4,0,0,1,.31-1.65,2.08,2.08,0,0,1,.93-1,3.23,3.23,0,0,1,1.54-.32,3,3,0,0,1,1.32.26,2.09,2.09,0,0,1,.91.78,3.39,3.39,0,0,1,.51,1.31H441a2.87,2.87,0,0,0-.39-.9,1.63,1.63,0,0,0-.63-.54,2,2,0,0,0-.87-.18,2.34,2.34,0,0,0-1.11.24,1.62,1.62,0,0,0-.66.75,3,3,0,0,0-.22,1.24v2.34a2.55,2.55,0,0,0,.22,1.14,1.47,1.47,0,0,0,.68.69,2.45,2.45,0,0,0,1.12.23,2.23,2.23,0,0,0,1.09-.24,1.42,1.42,0,0,0,.64-.72,3.06,3.06,0,0,0,.22-1.26v-.46h-1.92v-.73Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M448.48,201.8h-.79v-7.27l-1.45.91v-.82l1.12-.75h1.12Z" transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M450.16,201.16l3-3.91a3.31,3.31,0,0,0,.45-.75,1.58,1.58,0,0,0,.16-.65h0a1.3,1.3,0,0,0-.36-1,1.44,1.44,0,0,0-1-.34,1.38,1.38,0,0,0-1,.37,1.71,1.71,0,0,0-.47,1.05h-.82a2.85,2.85,0,0,1,.4-1.16,2,2,0,0,1,.78-.74,2.33,2.33,0,0,1,1.11-.25,2.81,2.81,0,0,1,1.21.24,1.67,1.67,0,0,1,.76.7,2.21,2.21,0,0,1,.26,1.12h0a2.19,2.19,0,0,1-.21.85,5.5,5.5,0,0,1-.6,1l-2.63,3.38h3.49v.73h-4.47Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M459.76,198.59v.73H456.1v-.73Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M463.15,201.8h-.78v-7.27l-1.46.91v-.82l1.13-.75h1.11Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M469.05,194.53,467,201.8h-.86l2.09-7.2h-2.71v1.46h-.79v-2.19h4.32Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M396.21,215.17a3.68,3.68,0,0,1-.95-.33,3.75,3.75,0,0,1-.84-.54l.48-.62a3.47,3.47,0,0,0,1.09.65,3.71,3.71,0,0,0,1.31.22,2.67,2.67,0,0,0,1.58-.41,1.3,1.3,0,0,0,.56-1.13h0a1,1,0,0,0-.25-.72,1.5,1.5,0,0,0-.62-.41,7.84,7.84,0,0,0-1-.25h-.08l-.16,0a8.26,8.26,0,0,1-1.33-.33,1.94,1.94,0,0,1-.86-.58,1.75,1.75,0,0,1-.35-1.15h0a2.32,2.32,0,0,1,.33-1.26,2.1,2.1,0,0,1,1-.79,3.86,3.86,0,0,1,1.52-.27,4,4,0,0,1,.84.09,4.28,4.28,0,0,1,.81.27,5,5,0,0,1,.79.47l-.46.61a4.34,4.34,0,0,0-1-.54,3,3,0,0,0-1-.17,2.39,2.39,0,0,0-1.5.41,1.35,1.35,0,0,0-.54,1.15h0a.93.93,0,0,0,.27.71,1.66,1.66,0,0,0,.66.38,9.36,9.36,0,0,0,1.09.26l0,0h.18a8.4,8.4,0,0,1,1.24.35,2,2,0,0,1,.83.62,1.74,1.74,0,0,1,.33,1.12h0a2.15,2.15,0,0,1-.34,1.24,2.1,2.1,0,0,1-1,.79,4.09,4.09,0,0,1-1.57.27A5.44,5.44,0,0,1,396.21,215.17Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M402.7,215a2.13,2.13,0,0,1-.93-1,3.75,3.75,0,0,1-.31-1.61v-5.11h.79v5.15a2.12,2.12,0,0,0,.5,1.56,2,2,0,0,0,1.49.52,2,2,0,0,0,1.51-.52,2.16,2.16,0,0,0,.5-1.56v-5.15H407v5.11a3.75,3.75,0,0,1-.31,1.61,2.13,2.13,0,0,1-.93,1,3.44,3.44,0,0,1-1.56.32A3.35,3.35,0,0,1,402.7,215Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M408.78,207.27h.79l4.61,7.14-.33-.22v-6.92h.79v7.92h-.8l-4.7-7.2.43.31v6.89h-.79Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M416.6,207.27h.79v7.93h-.79Zm.76,7.2h1.79a2.36,2.36,0,0,0,1.65-.52,2,2,0,0,0,.55-1.55v-2.33a2.07,2.07,0,0,0-.55-1.56,2.36,2.36,0,0,0-1.65-.51h-1.79v-.73h1.76a4,4,0,0,1,1.68.31,2.14,2.14,0,0,1,1,.95,3.39,3.39,0,0,1,.33,1.58v2.25a3.35,3.35,0,0,1-.33,1.57,2.17,2.17,0,0,1-1,.95,4,4,0,0,1-1.68.32h-1.75Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M425.76,207.27h.95l2.93,7.93h-.88l-2.52-7.11-2.53,7.11h-.87Zm-1.57,5.27h4.17v.73h-4.17Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M435.82,211.15v1.16a3.8,3.8,0,0,1-.31,1.65,2.06,2.06,0,0,1-.92,1,3.26,3.26,0,0,1-1.55.33,3.47,3.47,0,0,1-1.56-.31,2,2,0,0,1-.93-.93,3.4,3.4,0,0,1-.31-1.55v-2.34a4,4,0,0,1,.3-1.65,2.13,2.13,0,0,1,.93-1,3.35,3.35,0,0,1,1.54-.32,3.07,3.07,0,0,1,1.33.26,2.21,2.21,0,0,1,.91.78,3.62,3.62,0,0,1,.5,1.31h-.85a2.66,2.66,0,0,0-.39-.9,1.63,1.63,0,0,0-.63-.54,2,2,0,0,0-.87-.18,2.34,2.34,0,0,0-1.11.24,1.62,1.62,0,0,0-.66.75,3,3,0,0,0-.22,1.24v2.34a2.55,2.55,0,0,0,.22,1.14,1.47,1.47,0,0,0,.68.69,2.48,2.48,0,0,0,1.12.23,2.2,2.2,0,0,0,1.09-.24,1.38,1.38,0,0,0,.64-.72,3.06,3.06,0,0,0,.22-1.26v-.45h-1.92v-.73Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M442.37,215.2h-.79v-7.27l-1.45.91V208l1.12-.75h1.12Z" transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M445.05,215a1.94,1.94,0,0,1-.82-.68,2.33,2.33,0,0,1-.39-1.08h.79a1.65,1.65,0,0,0,.27.68,1.31,1.31,0,0,0,.55.43,1.86,1.86,0,0,0,.77.15,1.53,1.53,0,0,0,1.1-.38,1.42,1.42,0,0,0,.39-1.07v-.24a1.38,1.38,0,0,0-.38-1,1.43,1.43,0,0,0-1.06-.37h-.56v-.73h.56a1.38,1.38,0,0,0,1-.32,1.23,1.23,0,0,0,.34-.91v-.24a1.28,1.28,0,0,0-.36-1,1.39,1.39,0,0,0-1-.34,1.59,1.59,0,0,0-.66.14,1.39,1.39,0,0,0-.5.41,1.76,1.76,0,0,0-.29.65H444a2.6,2.6,0,0,1,.41-1,2,2,0,0,1,.77-.66,2.29,2.29,0,0,1,1.06-.23,2.2,2.2,0,0,1,1.59.54,2,2,0,0,1,.56,1.52v.24a1.83,1.83,0,0,1-.26,1,1.6,1.6,0,0,1-.75.6,1.36,1.36,0,0,1,.84.6,2.17,2.17,0,0,1,.3,1.19v.24a2.46,2.46,0,0,1-.27,1.19,1.72,1.72,0,0,1-.77.74,2.72,2.72,0,0,1-1.23.26A2.66,2.66,0,0,1,445.05,215Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M453.79,212v.73h-3.66V212Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M457.18,215.2h-.78v-7.27l-1.46.91V208l1.13-.75h1.11Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M463.07,207.93l-2,7.27h-.86l2.09-7.2h-2.71v1.47h-.79v-2.2h4.31Z"
+ transform="translate(1.64)"/>
+ <path class="cls-19"
+ d="M683,282.77h60.29a.18.18,0,0,1,.18.18v10.11a5.4,5.4,0,0,1-5.4,5.4H677.5a.18.18,0,0,1-.18-.18v-9.8A5.71,5.71,0,0,1,683,282.77Z"/>
+ <path class="cls-18" d="M678.29,288.52h.76l1,3.19,1-3.19h.76l-1.45,4.39h-.61Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M682.29,288.52H683v.72h-.72Zm0,1.26H683v3.13h-.72Z" transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M683.87,289.78h.72v3.13h-.72Zm1.86,1.23a.59.59,0,0,0-.15-.43.56.56,0,0,0-.43-.16.53.53,0,0,0-.41.15.52.52,0,0,0-.15.4l-.06-.65a1.06,1.06,0,0,1,.36-.44.85.85,0,0,1,.51-.15,1,1,0,0,1,.78.33,1.49,1.49,0,0,1,.27.95v1.9h-.72Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M686.91,293.5h.27a.2.2,0,0,0,.15-.06.24.24,0,0,0,0-.18v-3.48h.73v3.58a.88.88,0,0,1-.2.61.74.74,0,0,1-.57.22h-.43Zm.47-5h.73v.72h-.73Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M689.55,292.8a1.11,1.11,0,0,1-.48-.48,1.65,1.65,0,0,1-.17-.77v-.35a1.78,1.78,0,0,1,.16-.8,1.17,1.17,0,0,1,.46-.5,1.54,1.54,0,0,1,.73-.17,1.19,1.19,0,0,1,.69.2,1.3,1.3,0,0,1,.44.58,2.53,2.53,0,0,1,.15.92v.21h-2.14v-.53h1.47v0a1,1,0,0,0-.18-.52.53.53,0,0,0-.42-.18.61.61,0,0,0-.5.21.84.84,0,0,0-.18.58v.4a.75.75,0,0,0,.19.55.78.78,0,0,0,.55.19,1.09,1.09,0,0,0,.35-.07,1.08,1.08,0,0,0,.31-.19l.48.44a1.73,1.73,0,0,1-.54.35,1.73,1.73,0,0,1-1.36,0Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M692.93,292.91a2.36,2.36,0,0,1-.47-.16,1.6,1.6,0,0,1-.4-.25l.43-.54a1.89,1.89,0,0,0,.49.25,1.46,1.46,0,0,0,.49.09,1.09,1.09,0,0,0,.5-.09.28.28,0,0,0,.17-.26.24.24,0,0,0-.08-.19.4.4,0,0,0-.22-.09l-.36-.05h-.21a2.82,2.82,0,0,1-.54-.11.68.68,0,0,1-.36-.25.88.88,0,0,1-.14-.53,1,1,0,0,1,.14-.54,1,1,0,0,1,.42-.34,2,2,0,0,1,.69-.11,1.83,1.83,0,0,1,.47,0,2.23,2.23,0,0,1,.44.13,3.11,3.11,0,0,1,.4.22l-.44.53a1.58,1.58,0,0,0-.44-.2,1.39,1.39,0,0,0-.44-.07,1,1,0,0,0-.43.08.27.27,0,0,0-.15.24.19.19,0,0,0,.08.16.44.44,0,0,0,.21.07l.35.05h.14a2.66,2.66,0,0,1,.58.1.77.77,0,0,1,.39.26.89.89,0,0,1,.16.58,1,1,0,0,1-.15.56.88.88,0,0,1-.45.34,2,2,0,0,1-.73.12A3.1,3.1,0,0,1,692.93,292.91Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M697.25,289.78H698l-1.18,3.13h-.53l-1.18-3.13h.74l.7,2.1Z" transform="translate(1.64)"/>
+ <path class="cls-18" d="M698.51,288.52h.72v.72h-.72Zm0,1.26h.72v3.13h-.72Z" transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M700.09,289.78h.72v3.13h-.72ZM702,291a.59.59,0,0,0-.15-.43.56.56,0,0,0-.43-.16.53.53,0,0,0-.41.15.52.52,0,0,0-.15.4l-.06-.65a1.06,1.06,0,0,1,.36-.44.84.84,0,0,1,.5-.15,1,1,0,0,1,.78.33,1.44,1.44,0,0,1,.28.95v1.9H702Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M704,292.81a1,1,0,0,1-.37-.45,1.88,1.88,0,0,1-.12-.71v-.6a1.94,1.94,0,0,1,.12-.72.91.91,0,0,1,.36-.45,1.06,1.06,0,0,1,.57-.16.86.86,0,0,1,.49.15,1,1,0,0,1,.35.42l-.06.67a.59.59,0,0,0-.07-.31.37.37,0,0,0-.18-.19.62.62,0,0,0-.71.1.74.74,0,0,0-.15.49v.6a.69.69,0,0,0,.15.48.62.62,0,0,0,.71.1.41.41,0,0,0,.18-.19.62.62,0,0,0,.07-.31l0,.69a.82.82,0,0,1-.8.55A1.07,1.07,0,0,1,704,292.81Zm0,1.25a1.1,1.1,0,0,1-.45-.37l.49-.45a.71.71,0,0,0,.27.22.8.8,0,0,0,.33.08.69.69,0,0,0,.49-.17.61.61,0,0,0,.18-.47v-3.12H706v3a1.53,1.53,0,0,1-.16.74,1.12,1.12,0,0,1-.47.47,1.6,1.6,0,0,1-.75.16A1.51,1.51,0,0,1,704,294.06Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M707.45,292.8a1.14,1.14,0,0,1-.49-.48,1.65,1.65,0,0,1-.16-.77v-.35a1.78,1.78,0,0,1,.16-.8,1.12,1.12,0,0,1,.46-.5,1.49,1.49,0,0,1,.73-.17,1.19,1.19,0,0,1,.69.2,1.29,1.29,0,0,1,.43.58,2.53,2.53,0,0,1,.15.92v.21h-2.13v-.53h1.46v0a.9.9,0,0,0-.19-.52.51.51,0,0,0-.41-.18.64.64,0,0,0-.51.21.89.89,0,0,0-.17.58v.4a.75.75,0,0,0,.19.55.77.77,0,0,0,.54.19,1.15,1.15,0,0,0,.36-.07,1.23,1.23,0,0,0,.31-.19l.47.44a1.73,1.73,0,0,1-.54.35,1.53,1.53,0,0,1-.6.12A1.57,1.57,0,0,1,707.45,292.8Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M710.21,289.78h.72v3.13h-.72Zm1.86,1.23a.59.59,0,0,0-.15-.43.56.56,0,0,0-.43-.16.53.53,0,0,0-.41.15.52.52,0,0,0-.15.4l-.06-.65a1.06,1.06,0,0,1,.36-.44.85.85,0,0,1,.51-.15,1,1,0,0,1,.78.33,1.49,1.49,0,0,1,.27.95v1.9h-.72Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18" d="M718.72,288.52h.73v4.39h-.73Zm.39,1.88h2.5v.69h-2.5Zm2.07-1.88h.72v4.39h-.72Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M723,292.72a.92.92,0,0,1-.27-.73.88.88,0,0,1,.27-.7,1.25,1.25,0,0,1,.82-.23h.84l0,.56h-.88a.47.47,0,0,0-.32.09.32.32,0,0,0-.11.28.33.33,0,0,0,.14.29.76.76,0,0,0,.42.1,1.29,1.29,0,0,0,.51-.08.25.25,0,0,0,.17-.23l.06.44a.49.49,0,0,1-.18.25.75.75,0,0,1-.31.15,1.6,1.6,0,0,1-.39,0A1.17,1.17,0,0,1,723,292.72Zm1.63-1.8a.49.49,0,0,0-.16-.4.6.6,0,0,0-.44-.15,1,1,0,0,0-.35.06,1.07,1.07,0,0,0-.32.16l-.48-.41a1.21,1.21,0,0,1,.48-.33,1.81,1.81,0,0,1,.67-.12,1.55,1.55,0,0,1,.68.14,1,1,0,0,1,.44.4,1.22,1.22,0,0,1,.15.63v2h-.67Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M726.16,289.78h.73v3.13h-.73ZM728,291a.6.6,0,0,0-.16-.43.54.54,0,0,0-.43-.16.5.5,0,0,0-.55.55l-.07-.65a1.24,1.24,0,0,1,.36-.44.9.9,0,0,1,.51-.15,1,1,0,0,1,.78.33,1.49,1.49,0,0,1,.28.95v1.9H728Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M730,292.81a.93.93,0,0,1-.37-.45,1.87,1.87,0,0,1-.13-.71v-.6a1.93,1.93,0,0,1,.13-.72.91.91,0,0,1,.36-.45,1.06,1.06,0,0,1,.57-.16.86.86,0,0,1,.49.15,1.13,1.13,0,0,1,.35.42l-.07.67a.71.71,0,0,0-.06-.31.37.37,0,0,0-.18-.19.56.56,0,0,0-.3-.07.51.51,0,0,0-.41.17.74.74,0,0,0-.15.49v.6a.69.69,0,0,0,.15.48.51.51,0,0,0,.41.17.56.56,0,0,0,.3-.07.41.41,0,0,0,.18-.19.75.75,0,0,0,.06-.31l0,.69a1,1,0,0,1-.3.4.84.84,0,0,1-.5.15A1.07,1.07,0,0,1,730,292.81Zm1.33-4.29h.73v4.39h-.73Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M733.52,292.8a1.11,1.11,0,0,1-.48-.48,1.65,1.65,0,0,1-.17-.77v-.35a1.93,1.93,0,0,1,.16-.8,1.14,1.14,0,0,1,.47-.5,1.49,1.49,0,0,1,.73-.17,1.19,1.19,0,0,1,.68.2,1.24,1.24,0,0,1,.44.58,2.53,2.53,0,0,1,.15.92v.21h-2.13v-.53h1.46v0a1,1,0,0,0-.19-.52.51.51,0,0,0-.41-.18.64.64,0,0,0-.51.21.84.84,0,0,0-.18.58v.4a.76.76,0,0,0,.2.55.77.77,0,0,0,.54.19,1,1,0,0,0,.35-.07,1.29,1.29,0,0,0,.32-.19l.47.44a1.73,1.73,0,0,1-.54.35,1.73,1.73,0,0,1-1.36,0Z"
+ transform="translate(1.64)"/>
+ <path class="cls-18"
+ d="M737,292a.24.24,0,0,0,.06.18.21.21,0,0,0,.16.06h.22v.69h-.4a.73.73,0,0,1-.56-.21.86.86,0,0,1-.2-.62v-3.57H737Z"
+ transform="translate(1.64)"/>
+ <path class="cls-20"
+ d="M719.15,282.77c-.18.63-.55,1.78-1.29,3.67-1.24,3.19-3,5.09-2.47,7.14s2,3,4.82,3.84a45.51,45.51,0,0,0,4.73,1.05l-.74-.13"
+ transform="translate(1.64)"/>
+</svg> \ No newline at end of file
diff --git a/src/wwwroot/assets/profile/innrammet.svg b/src/wwwroot/assets/profile/innrammet.svg
new file mode 100644
index 0000000..4b80d53
--- /dev/null
+++ b/src/wwwroot/assets/profile/innrammet.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 195.32 48.63">
+ <defs>
+ <style>.cls-1{fill:none;stroke:#ee741e;stroke-miterlimit:10;stroke-width:3px}.cls-2{fill:#ee741e}</style>
+ </defs>
+ <path class="cls-1"
+ d="M24 1.5h167.33a2.49 2.49 0 012.49 2.5v21.72a21.39 21.39 0 01-21.39 21.39H4a2.49 2.49 0 01-2.5-2.5V24A22.5 22.5 0 0124 1.5z"/>
+ <path class="cls-2"
+ d="M244.67 287.43h2.21l2.9 9.27 2.89-9.27h2.21l-4.21 12.78h-1.79zM256.31 287.43h2.1v2.1h-2.1zm0 3.65h2.1v9.13h-2.1zM260.89 291.08H263v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.66 1.66 0 00-1.25-.45 1.61 1.61 0 00-1.19.42 1.56 1.56 0 00-.43 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.82 2.82 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM269.72 301.9h.78a.58.58 0 00.45-.18.78.78 0 00.16-.51v-10.13h2.1v10.42a2.51 2.51 0 01-.59 1.78 2.12 2.12 0 01-1.64.64h-1.26zm1.37-14.47h2.13v2.1h-2.13zM278.3 300.34l-.91-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.23 4.23 0 012.12-.5 3.4 3.4 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.15 2.15 0 00.56 1.59 2.19 2.19 0 001.59.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.38 1.27a5 5 0 01-1.56 1 4.52 4.52 0 01-1.74.36zM288 300.34l-.73-.15a6.67 6.67 0 01-1.39-.46 5.07 5.07 0 01-1.16-.73l1.27-1.58a5.72 5.72 0 001.42.75 4.2 4.2 0 001.41.25 3.18 3.18 0 001.46-.26.8.8 0 00.49-.75.66.66 0 00-.24-.56 1.34 1.34 0 00-.62-.26 10.1 10.1 0 00-1.05-.14h-.62a9.26 9.26 0 01-1.57-.29 2 2 0 01-1-.73 2.46 2.46 0 01-.42-1.54 2.84 2.84 0 01.42-1.58 2.51 2.51 0 011.22-1 5.28 5.28 0 012-.33 6.92 6.92 0 011.37.14 7 7 0 011.28.39 6.53 6.53 0 011.15.65l-1.25 1.53a5.57 5.57 0 00-1.3-.59 4.47 4.47 0 00-1.27-.2 2.8 2.8 0 00-1.26.23.78.78 0 00-.43.71.52.52 0 00.24.46 1.64 1.64 0 00.59.21c.24 0 .58.08 1 .12h.4a11.1 11.1 0 011.68.29 2.28 2.28 0 011.13.77 2.65 2.65 0 01.47 1.68 2.92 2.92 0 01-.44 1.63 2.7 2.7 0 01-1.31 1 5.71 5.71 0 01-2.12.34zM299.78 291.08h2.13l-3.43 9.13H297l-3.43-9.13h2.13l2.06 6.12zM303.43 287.43h2.09v2.1h-2.09zm0 3.65h2.09v9.13h-2.09zM308 291.08h2.1v9.13H308zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.64 1.64 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.78 2.78 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1zM319.23 299.9a2.73 2.73 0 01-1.06-1.31 5.14 5.14 0 01-.37-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011-1.31 3 3 0 011.66-.46 2.49 2.49 0 011.41.43 3 3 0 011 1.22l-.18 1.94a2.06 2.06 0 00-.18-.9 1.39 1.39 0 00-.54-.56 1.72 1.72 0 00-.85-.19 1.52 1.52 0 00-1.22.51 2.17 2.17 0 00-.43 1.42v1.72a2.12 2.12 0 00.43 1.41 1.54 1.54 0 001.22.49 1.62 1.62 0 00.85-.2 1.39 1.39 0 00.54-.56 2 2 0 00.18-.89l.12 2a2.39 2.39 0 01-2.33 1.59 3 3 0 01-1.61-.46zm.93 4l-.84-.39a3.06 3.06 0 01-1.3-1.07l1.42-1.3a2.18 2.18 0 00.78.64 2.33 2.33 0 001 .22 2 2 0 001.41-.49 1.79 1.79 0 00.52-1.38v-9.07h2.1v8.85a4.65 4.65 0 01-.47 2.16 3.11 3.11 0 01-1.37 1.36 4.67 4.67 0 01-2.17.47zM330.3 300.34l-.91-.48a3.19 3.19 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.22 3.22 0 011.34-1.46 4.29 4.29 0 012.12-.5 3.38 3.38 0 012 .59 3.57 3.57 0 011.27 1.69 7.33 7.33 0 01.43 2.67v.6h-6.19V295h4.24v-.1a2.52 2.52 0 00-.53-1.48 1.51 1.51 0 00-1.21-.53 1.84 1.84 0 00-1.46.59 2.48 2.48 0 00-.52 1.69v1.16a1.95 1.95 0 002.14 2.15 2.86 2.86 0 001-.2 3 3 0 00.91-.55l1.39 1.27a5.19 5.19 0 01-1.56 1 4.53 4.53 0 01-1.75.36zM337.42 291.08h2.1v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.62 1.62 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.8 2.8 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1z"
+ transform="translate(-234.32 -270.82)"/>
+ <path class="cls-1"
+ d="M363.62 271.28c-.58 1.89-1.77 5.38-4.09 11.1-3.92 9.68-9.44 15.37-7.86 21.65s5.65 9.4 14.19 12c2.49.77 4.85 1.41 7 1.95"
+ transform="translate(-234.32 -270.82)"/>
+ <path class="cls-2"
+ d="M363.63 287.43h2.1v12.78h-2.1zm1.11 5.46H372v2h-7.27zm6-5.46h2.1v12.78h-2.1zM376 299.64a2.71 2.71 0 01-.78-2.12 2.5 2.5 0 01.79-2 3.56 3.56 0 012.37-.68h2.44l.13 1.63h-2.55a1.41 1.41 0 00-.94.27 1 1 0 00-.31.81.94.94 0 00.41.84 2.12 2.12 0 001.22.28 3.76 3.76 0 001.49-.22.71.71 0 00.48-.68l.19 1.3a1.59 1.59 0 01-.52.72 2.51 2.51 0 01-.9.43 4.28 4.28 0 01-1.16.15 3.47 3.47 0 01-2.36-.73zm4.74-5.22a1.53 1.53 0 00-.45-1.18 1.82 1.82 0 00-1.28-.43 3.32 3.32 0 00-1 .17 3.2 3.2 0 00-.92.47l-1.4-1.18a3.52 3.52 0 011.41-1 5.22 5.22 0 011.9-.27 4.61 4.61 0 012 .4 2.9 2.9 0 011.26 1.16 3.65 3.65 0 01.44 1.83v5.87h-1.95zM385.25 291.08h2.1v9.13h-2.1zm5.4 3.6a1.75 1.75 0 00-.44-1.27A1.66 1.66 0 00389 293a1.61 1.61 0 00-1.19.42 1.59 1.59 0 00-.42 1.18l-.19-1.89a3.38 3.38 0 011-1.28 2.56 2.56 0 011.48-.44 2.81 2.81 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM396.47 299.9a2.81 2.81 0 01-1.07-1.31 5.33 5.33 0 01-.36-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011.05-1.31 3 3 0 011.65-.46 2.55 2.55 0 011.42.43 3.17 3.17 0 011 1.22l-.19 1.94a2.06 2.06 0 00-.18-.9 1.27 1.27 0 00-.54-.56 1.7 1.7 0 00-.85-.19 1.5 1.5 0 00-1.21.51 2.11 2.11 0 00-.43 1.42v1.72a2.07 2.07 0 00.43 1.41 1.52 1.52 0 001.21.49 1.6 1.6 0 00.85-.2 1.27 1.27 0 00.54-.56 2 2 0 00.18-.89l.13 2a2.46 2.46 0 01-.88 1.15 2.4 2.4 0 01-1.45.44 2.93 2.93 0 01-1.66-.46zm3.88-12.47h2.11v12.78h-2.11zM407.54 300.34l-.92-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.26 4.26 0 012.12-.5 3.38 3.38 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.12 2.12 0 00.57 1.59 2.14 2.14 0 001.58.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.37 1.29a5 5 0 01-1.56 1 4.48 4.48 0 01-1.74.36zM416.75 297.53a.73.73 0 00.17.51.62.62 0 00.48.18h.6v2h-1.14a2.12 2.12 0 01-1.64-.63 2.53 2.53 0 01-.59-1.78v-10.38h2.1z"
+ transform="translate(-234.32 -270.82)"/>
+</svg> \ No newline at end of file
diff --git a/src/wwwroot/assets/profile/logohvit.svg b/src/wwwroot/assets/profile/logohvit.svg
new file mode 100755
index 0000000..1cafd38
--- /dev/null
+++ b/src/wwwroot/assets/profile/logohvit.svg
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 595.3 841.9" style="enable-background:new 0 0 595.3 841.9;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:none;stroke:#EE7321;stroke-width:3;stroke-miterlimit:10;}
+ .st1{fill:#EE7321;}
+</style>
+<path class="st0" d="M369.8,442.9H201.3c-1.4,0-2.5-1.1-2.5-2.5v-20.6c0-12.4,10.1-22.5,22.5-22.5h167.3c1.4,0,2.5,1.1,2.5,2.5v21.7
+ C391.1,433.4,381.6,442.9,369.8,442.9z"/>
+<g>
+ <g>
+ <path class="st1" d="M207.7,412.4h2.2l2.9,9.3l2.9-9.3h2.2l-4.2,12.8h-1.8L207.7,412.4z"/>
+ <path class="st1" d="M219.3,412.4h2.1v2.1h-2.1V412.4z M219.3,416.1h2.1v9.1h-2.1V416.1z"/>
+ <path class="st1" d="M223.9,416.1h2.1v9.1h-2.1V416.1z M229.3,419.7c0-0.5-0.1-1-0.4-1.3s-0.7-0.4-1.2-0.4c-0.5,0-0.9,0.1-1.2,0.4
+ s-0.4,0.7-0.4,1.2l-0.2-1.9c0.3-0.6,0.6-1,1-1.3s0.9-0.4,1.5-0.4c1,0,1.7,0.3,2.3,1s0.8,1.6,0.8,2.7v5.5h-2.1V419.7z"/>
+ <path class="st1" d="M232.7,426.9h0.8c0.2,0,0.3-0.1,0.4-0.2s0.2-0.3,0.2-0.5v-10.1h2.1v10.4c0,0.8-0.2,1.4-0.6,1.8
+ s-0.9,0.6-1.6,0.6h-1.3V426.9z M234.1,412.4h2.1v2.1h-2.1V412.4z"/>
+ <path class="st1" d="M241.3,425.3c0,0-0.3-0.2-0.9-0.5s-1.1-0.8-1.4-1.4c-0.3-0.6-0.5-1.4-0.5-2.2v-1c0-0.9,0.2-1.7,0.5-2.3
+ s0.8-1.1,1.3-1.5s1.3-0.5,2.1-0.5c0.8,0,1.4,0.2,2,0.6s1,1,1.3,1.7s0.4,1.6,0.4,2.7v0.6h-6.2V420h4.2l0-0.1
+ c-0.1-0.6-0.2-1.1-0.5-1.5s-0.7-0.5-1.2-0.5c-0.6,0-1.1,0.2-1.5,0.6c-0.3,0.4-0.5,1-0.5,1.7v1.2c0,0.7,0.2,1.2,0.6,1.6
+ s0.9,0.6,1.6,0.6c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5l1.4,1.3c-0.5,0.4-1,0.8-1.6,1c-0.6,0.2-1.2,0.4-1.7,0.4
+ C241.7,425.3,241.3,425.3,241.3,425.3z"/>
+ <path class="st1" d="M251,425.3c0,0-0.2-0.1-0.7-0.2c-0.5-0.1-1-0.3-1.4-0.5s-0.8-0.4-1.2-0.7l1.3-1.6c0.5,0.3,0.9,0.6,1.4,0.7
+ s1,0.3,1.4,0.3c0.6,0,1.1-0.1,1.5-0.3s0.5-0.4,0.5-0.8c0-0.3-0.1-0.4-0.2-0.6s-0.4-0.2-0.6-0.3s-0.6-0.1-1.1-0.1
+ c-0.1,0-0.2,0-0.2,0s-0.2,0-0.2,0c0,0,0,0-0.1,0s0,0-0.1,0c-0.6-0.1-1.2-0.2-1.6-0.3s-0.8-0.4-1-0.7s-0.4-0.9-0.4-1.5
+ c0-0.6,0.1-1.2,0.4-1.6c0.3-0.4,0.7-0.8,1.2-1c0.5-0.2,1.2-0.3,2-0.3c0.5,0,0.9,0,1.4,0.1c0.4,0.1,0.9,0.2,1.3,0.4
+ s0.8,0.4,1.2,0.6l-1.3,1.5c-0.4-0.3-0.9-0.5-1.3-0.6s-0.9-0.2-1.3-0.2c-0.6,0-1,0.1-1.3,0.2s-0.4,0.4-0.4,0.7
+ c0,0.2,0.1,0.4,0.2,0.5s0.4,0.2,0.6,0.2c0.2,0,0.6,0.1,1,0.1c0,0,0.1,0,0.1,0s0.1,0,0.1,0c0,0,0,0,0.1,0s0,0,0.1,0
+ c0.7,0.1,1.2,0.2,1.7,0.3s0.8,0.4,1.1,0.8c0.3,0.4,0.5,0.9,0.5,1.7c0,0.6-0.1,1.2-0.4,1.6c-0.3,0.4-0.7,0.8-1.3,1
+ c-0.6,0.2-1.3,0.3-2.1,0.3C251.2,425.3,251,425.3,251,425.3z"/>
+ <path class="st1" d="M263,416.1h2.1l-3.4,9.1h-1.5l-3.4-9.1h2.1l2.1,6.1L263,416.1z"/>
+ <path class="st1" d="M266.7,412.4h2.1v2.1h-2.1V412.4z M266.7,416.1h2.1v9.1h-2.1V416.1z"/>
+ <path class="st1" d="M271.3,416.1h2.1v9.1h-2.1V416.1z M276.7,419.7c0-0.5-0.1-1-0.4-1.3s-0.7-0.4-1.2-0.4c-0.5,0-0.9,0.1-1.2,0.4
+ s-0.4,0.7-0.4,1.2l-0.2-1.9c0.3-0.6,0.6-1,1-1.3s0.9-0.4,1.5-0.4c1,0,1.7,0.3,2.3,1s0.8,1.6,0.8,2.7v5.5h-2.1V419.7z"/>
+ <path class="st1" d="M282.5,424.9c-0.5-0.3-0.8-0.7-1.1-1.3c-0.2-0.6-0.4-1.3-0.4-2.1v-1.7c0-0.8,0.1-1.5,0.4-2.1
+ c0.2-0.6,0.6-1,1.1-1.3c0.5-0.3,1-0.5,1.7-0.5c0.5,0,1,0.1,1.4,0.4s0.8,0.7,1,1.2l-0.2,1.9c0-0.4-0.1-0.7-0.2-0.9
+ s-0.3-0.4-0.5-0.6s-0.5-0.2-0.9-0.2c-0.5,0-0.9,0.2-1.2,0.5s-0.4,0.8-0.4,1.4v1.7c0,0.6,0.1,1.1,0.4,1.4c0.3,0.3,0.7,0.5,1.2,0.5
+ c0.3,0,0.6-0.1,0.9-0.2c0.2-0.1,0.4-0.3,0.5-0.6s0.2-0.5,0.2-0.9l0.1,2c-0.2,0.5-0.5,0.9-0.9,1.1c-0.4,0.3-0.9,0.4-1.5,0.4
+ C283.5,425.4,283,425.2,282.5,424.9z M283.4,428.9c0,0-0.3-0.1-0.8-0.4c-0.6-0.3-1-0.6-1.3-1.1l1.4-1.3c0.2,0.3,0.5,0.5,0.8,0.6
+ s0.6,0.2,1,0.2c0.6,0,1.1-0.2,1.4-0.5c0.3-0.3,0.5-0.8,0.5-1.4v-9.1h2.1v8.9c0,0.8-0.2,1.6-0.5,2.2s-0.8,1.1-1.4,1.4
+ s-1.3,0.5-2.2,0.5C283.8,428.9,283.4,428.9,283.4,428.9z"/>
+ <path class="st1" d="M293.6,425.3c0,0-0.3-0.2-0.9-0.5s-1.1-0.8-1.4-1.4c-0.3-0.6-0.5-1.4-0.5-2.2v-1c0-0.9,0.2-1.7,0.5-2.3
+ s0.8-1.1,1.3-1.5s1.3-0.5,2.1-0.5c0.8,0,1.4,0.2,2,0.6s1,1,1.3,1.7s0.4,1.6,0.4,2.7v0.6h-6.2V420h4.2l0-0.1
+ c-0.1-0.6-0.2-1.1-0.5-1.5s-0.7-0.5-1.2-0.5c-0.6,0-1.1,0.2-1.5,0.6c-0.3,0.4-0.5,1-0.5,1.7v1.2c0,0.7,0.2,1.2,0.6,1.6
+ s0.9,0.6,1.6,0.6c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5l1.4,1.3c-0.5,0.4-1,0.8-1.6,1c-0.6,0.2-1.2,0.4-1.7,0.4
+ C294,425.3,293.6,425.3,293.6,425.3z"/>
+ <path class="st1" d="M300.7,416.1h2.1v9.1h-2.1V416.1z M306.1,419.7c0-0.5-0.1-1-0.4-1.3s-0.7-0.4-1.2-0.4c-0.5,0-0.9,0.1-1.2,0.4
+ s-0.4,0.7-0.4,1.2l-0.2-1.9c0.3-0.6,0.6-1,1-1.3s0.9-0.4,1.5-0.4c1,0,1.7,0.3,2.3,1s0.8,1.6,0.8,2.7v5.5h-2.1V419.7z"/>
+ </g>
+</g>
+<path class="st0" d="M326.6,396.3c-0.6,1.9-1.8,5.4-4.1,11.1c-3.9,9.7-9.4,15.4-7.9,21.6c1.6,6.3,5.6,9.4,14.2,12
+ c2.5,0.8,4.9,1.4,7,1.9"/>
+<g>
+ <g>
+ <path class="st1" d="M326.6,412.4h2.1v12.8h-2.1V412.4z M327.7,417.9h7.3v2h-7.3V417.9z M333.8,412.4h2.1v12.8h-2.1V412.4z"/>
+ <path class="st1" d="M339,424.6c-0.5-0.5-0.8-1.2-0.8-2.1c0-0.9,0.3-1.6,0.8-2s1.3-0.7,2.4-0.7h2.4l0.1,1.6h-2.6
+ c-0.4,0-0.7,0.1-0.9,0.3s-0.3,0.4-0.3,0.8c0,0.4,0.1,0.7,0.4,0.8c0.3,0.2,0.7,0.3,1.2,0.3c0.7,0,1.2-0.1,1.5-0.2s0.5-0.4,0.5-0.7
+ l0.2,1.3c-0.1,0.3-0.3,0.5-0.5,0.7s-0.5,0.3-0.9,0.4c-0.4,0.1-0.7,0.1-1.2,0.1C340.3,425.3,339.5,425.1,339,424.6z M343.8,419.4
+ c0-0.5-0.2-0.9-0.5-1.2s-0.7-0.4-1.3-0.4c-0.4,0-0.7,0.1-1,0.2s-0.6,0.3-0.9,0.5l-1.4-1.2c0.4-0.4,0.8-0.7,1.4-1
+ c0.6-0.2,1.2-0.3,1.9-0.3c0.8,0,1.4,0.1,2,0.4c0.6,0.3,1,0.7,1.3,1.2c0.3,0.5,0.4,1.1,0.4,1.8v5.9h-1.9V419.4z"/>
+ <path class="st1" d="M348.2,416.1h2.1v9.1h-2.1V416.1z M353.7,419.7c0-0.5-0.1-1-0.4-1.3s-0.7-0.4-1.2-0.4c-0.5,0-0.9,0.1-1.2,0.4
+ s-0.4,0.7-0.4,1.2l-0.2-1.9c0.3-0.6,0.6-1,1-1.3s0.9-0.4,1.5-0.4c1,0,1.7,0.3,2.3,1s0.8,1.6,0.8,2.7v5.5h-2.1V419.7z"/>
+ <path class="st1" d="M359.5,424.9c-0.5-0.3-0.8-0.7-1.1-1.3c-0.2-0.6-0.4-1.3-0.4-2.1v-1.7c0-0.8,0.1-1.5,0.4-2.1
+ c0.2-0.6,0.6-1,1.1-1.3c0.5-0.3,1-0.5,1.7-0.5c0.5,0,1,0.1,1.4,0.4s0.8,0.7,1,1.2l-0.2,1.9c0-0.4-0.1-0.7-0.2-0.9
+ s-0.3-0.4-0.5-0.6s-0.5-0.2-0.9-0.2c-0.5,0-0.9,0.2-1.2,0.5s-0.4,0.8-0.4,1.4v1.7c0,0.6,0.1,1.1,0.4,1.4c0.3,0.3,0.7,0.5,1.2,0.5
+ c0.3,0,0.6-0.1,0.9-0.2c0.2-0.1,0.4-0.3,0.5-0.6s0.2-0.5,0.2-0.9l0.1,2c-0.2,0.5-0.5,0.9-0.9,1.1c-0.4,0.3-0.9,0.4-1.5,0.4
+ C360.5,425.4,359.9,425.2,359.5,424.9z M363.4,412.4h2.1v12.8h-2.1V412.4z"/>
+ <path class="st1" d="M370.5,425.3c0,0-0.3-0.2-0.9-0.5s-1.1-0.8-1.4-1.4c-0.3-0.6-0.5-1.4-0.5-2.2v-1c0-0.9,0.2-1.7,0.5-2.3
+ s0.8-1.1,1.3-1.5s1.3-0.5,2.1-0.5c0.8,0,1.4,0.2,2,0.6s1,1,1.3,1.7s0.4,1.6,0.4,2.7v0.6h-6.2V420h4.2l0-0.1
+ c-0.1-0.6-0.2-1.1-0.5-1.5s-0.7-0.5-1.2-0.5c-0.6,0-1.1,0.2-1.5,0.6c-0.3,0.4-0.5,1-0.5,1.7v1.2c0,0.7,0.2,1.2,0.6,1.6
+ s0.9,0.6,1.6,0.6c0.3,0,0.7-0.1,1-0.2c0.3-0.1,0.6-0.3,0.9-0.5l1.4,1.3c-0.5,0.4-1,0.8-1.6,1c-0.6,0.2-1.2,0.4-1.7,0.4
+ C371,425.3,370.5,425.3,370.5,425.3z"/>
+ <path class="st1" d="M379.8,422.5c0,0.2,0.1,0.4,0.2,0.5s0.3,0.2,0.5,0.2h0.6v2h-1.1c-0.7,0-1.2-0.2-1.6-0.6s-0.6-1-0.6-1.8v-10.4
+ h2.1V422.5z"/>
+ </g>
+</g>
+</svg>
diff --git a/src/wwwroot/assets/profile/og_default.png b/src/wwwroot/assets/profile/og_default.png
new file mode 100644
index 0000000..1254587
--- /dev/null
+++ b/src/wwwroot/assets/profile/og_default.png
Binary files differ
diff --git a/src/wwwroot/assets/profile/og_default.svg b/src/wwwroot/assets/profile/og_default.svg
new file mode 100644
index 0000000..4b80d53
--- /dev/null
+++ b/src/wwwroot/assets/profile/og_default.svg
@@ -0,0 +1,16 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 195.32 48.63">
+ <defs>
+ <style>.cls-1{fill:none;stroke:#ee741e;stroke-miterlimit:10;stroke-width:3px}.cls-2{fill:#ee741e}</style>
+ </defs>
+ <path class="cls-1"
+ d="M24 1.5h167.33a2.49 2.49 0 012.49 2.5v21.72a21.39 21.39 0 01-21.39 21.39H4a2.49 2.49 0 01-2.5-2.5V24A22.5 22.5 0 0124 1.5z"/>
+ <path class="cls-2"
+ d="M244.67 287.43h2.21l2.9 9.27 2.89-9.27h2.21l-4.21 12.78h-1.79zM256.31 287.43h2.1v2.1h-2.1zm0 3.65h2.1v9.13h-2.1zM260.89 291.08H263v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.66 1.66 0 00-1.25-.45 1.61 1.61 0 00-1.19.42 1.56 1.56 0 00-.43 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.82 2.82 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM269.72 301.9h.78a.58.58 0 00.45-.18.78.78 0 00.16-.51v-10.13h2.1v10.42a2.51 2.51 0 01-.59 1.78 2.12 2.12 0 01-1.64.64h-1.26zm1.37-14.47h2.13v2.1h-2.13zM278.3 300.34l-.91-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.23 4.23 0 012.12-.5 3.4 3.4 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.15 2.15 0 00.56 1.59 2.19 2.19 0 001.59.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.38 1.27a5 5 0 01-1.56 1 4.52 4.52 0 01-1.74.36zM288 300.34l-.73-.15a6.67 6.67 0 01-1.39-.46 5.07 5.07 0 01-1.16-.73l1.27-1.58a5.72 5.72 0 001.42.75 4.2 4.2 0 001.41.25 3.18 3.18 0 001.46-.26.8.8 0 00.49-.75.66.66 0 00-.24-.56 1.34 1.34 0 00-.62-.26 10.1 10.1 0 00-1.05-.14h-.62a9.26 9.26 0 01-1.57-.29 2 2 0 01-1-.73 2.46 2.46 0 01-.42-1.54 2.84 2.84 0 01.42-1.58 2.51 2.51 0 011.22-1 5.28 5.28 0 012-.33 6.92 6.92 0 011.37.14 7 7 0 011.28.39 6.53 6.53 0 011.15.65l-1.25 1.53a5.57 5.57 0 00-1.3-.59 4.47 4.47 0 00-1.27-.2 2.8 2.8 0 00-1.26.23.78.78 0 00-.43.71.52.52 0 00.24.46 1.64 1.64 0 00.59.21c.24 0 .58.08 1 .12h.4a11.1 11.1 0 011.68.29 2.28 2.28 0 011.13.77 2.65 2.65 0 01.47 1.68 2.92 2.92 0 01-.44 1.63 2.7 2.7 0 01-1.31 1 5.71 5.71 0 01-2.12.34zM299.78 291.08h2.13l-3.43 9.13H297l-3.43-9.13h2.13l2.06 6.12zM303.43 287.43h2.09v2.1h-2.09zm0 3.65h2.09v9.13h-2.09zM308 291.08h2.1v9.13H308zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.64 1.64 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.78 2.78 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1zM319.23 299.9a2.73 2.73 0 01-1.06-1.31 5.14 5.14 0 01-.37-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011-1.31 3 3 0 011.66-.46 2.49 2.49 0 011.41.43 3 3 0 011 1.22l-.18 1.94a2.06 2.06 0 00-.18-.9 1.39 1.39 0 00-.54-.56 1.72 1.72 0 00-.85-.19 1.52 1.52 0 00-1.22.51 2.17 2.17 0 00-.43 1.42v1.72a2.12 2.12 0 00.43 1.41 1.54 1.54 0 001.22.49 1.62 1.62 0 00.85-.2 1.39 1.39 0 00.54-.56 2 2 0 00.18-.89l.12 2a2.39 2.39 0 01-2.33 1.59 3 3 0 01-1.61-.46zm.93 4l-.84-.39a3.06 3.06 0 01-1.3-1.07l1.42-1.3a2.18 2.18 0 00.78.64 2.33 2.33 0 001 .22 2 2 0 001.41-.49 1.79 1.79 0 00.52-1.38v-9.07h2.1v8.85a4.65 4.65 0 01-.47 2.16 3.11 3.11 0 01-1.37 1.36 4.67 4.67 0 01-2.17.47zM330.3 300.34l-.91-.48a3.19 3.19 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.22 3.22 0 011.34-1.46 4.29 4.29 0 012.12-.5 3.38 3.38 0 012 .59 3.57 3.57 0 011.27 1.69 7.33 7.33 0 01.43 2.67v.6h-6.19V295h4.24v-.1a2.52 2.52 0 00-.53-1.48 1.51 1.51 0 00-1.21-.53 1.84 1.84 0 00-1.46.59 2.48 2.48 0 00-.52 1.69v1.16a1.95 1.95 0 002.14 2.15 2.86 2.86 0 001-.2 3 3 0 00.91-.55l1.39 1.27a5.19 5.19 0 01-1.56 1 4.53 4.53 0 01-1.75.36zM337.42 291.08h2.1v9.13h-2.1zm5.41 3.6a1.75 1.75 0 00-.44-1.27 1.68 1.68 0 00-1.25-.45 1.62 1.62 0 00-1.2.42 1.59 1.59 0 00-.42 1.18l-.18-1.89a3.21 3.21 0 011-1.28 2.54 2.54 0 011.48-.44 2.8 2.8 0 012.26 1 4.19 4.19 0 01.81 2.75v5.54h-2.1z"
+ transform="translate(-234.32 -270.82)"/>
+ <path class="cls-1"
+ d="M363.62 271.28c-.58 1.89-1.77 5.38-4.09 11.1-3.92 9.68-9.44 15.37-7.86 21.65s5.65 9.4 14.19 12c2.49.77 4.85 1.41 7 1.95"
+ transform="translate(-234.32 -270.82)"/>
+ <path class="cls-2"
+ d="M363.63 287.43h2.1v12.78h-2.1zm1.11 5.46H372v2h-7.27zm6-5.46h2.1v12.78h-2.1zM376 299.64a2.71 2.71 0 01-.78-2.12 2.5 2.5 0 01.79-2 3.56 3.56 0 012.37-.68h2.44l.13 1.63h-2.55a1.41 1.41 0 00-.94.27 1 1 0 00-.31.81.94.94 0 00.41.84 2.12 2.12 0 001.22.28 3.76 3.76 0 001.49-.22.71.71 0 00.48-.68l.19 1.3a1.59 1.59 0 01-.52.72 2.51 2.51 0 01-.9.43 4.28 4.28 0 01-1.16.15 3.47 3.47 0 01-2.36-.73zm4.74-5.22a1.53 1.53 0 00-.45-1.18 1.82 1.82 0 00-1.28-.43 3.32 3.32 0 00-1 .17 3.2 3.2 0 00-.92.47l-1.4-1.18a3.52 3.52 0 011.41-1 5.22 5.22 0 011.9-.27 4.61 4.61 0 012 .4 2.9 2.9 0 011.26 1.16 3.65 3.65 0 01.44 1.83v5.87h-1.95zM385.25 291.08h2.1v9.13h-2.1zm5.4 3.6a1.75 1.75 0 00-.44-1.27A1.66 1.66 0 00389 293a1.61 1.61 0 00-1.19.42 1.59 1.59 0 00-.42 1.18l-.19-1.89a3.38 3.38 0 011-1.28 2.56 2.56 0 011.48-.44 2.81 2.81 0 012.27 1 4.25 4.25 0 01.8 2.75v5.54h-2.1zM396.47 299.9a2.81 2.81 0 01-1.07-1.31 5.33 5.33 0 01-.36-2.07v-1.74a5.45 5.45 0 01.36-2.08 2.82 2.82 0 011.05-1.31 3 3 0 011.65-.46 2.55 2.55 0 011.42.43 3.17 3.17 0 011 1.22l-.19 1.94a2.06 2.06 0 00-.18-.9 1.27 1.27 0 00-.54-.56 1.7 1.7 0 00-.85-.19 1.5 1.5 0 00-1.21.51 2.11 2.11 0 00-.43 1.42v1.72a2.07 2.07 0 00.43 1.41 1.52 1.52 0 001.21.49 1.6 1.6 0 00.85-.2 1.27 1.27 0 00.54-.56 2 2 0 00.18-.89l.13 2a2.46 2.46 0 01-.88 1.15 2.4 2.4 0 01-1.45.44 2.93 2.93 0 01-1.66-.46zm3.88-12.47h2.11v12.78h-2.11zM407.54 300.34l-.92-.48a3.24 3.24 0 01-1.4-1.39 4.73 4.73 0 01-.48-2.22v-1a5.26 5.26 0 01.46-2.31 3.3 3.3 0 011.35-1.46 4.26 4.26 0 012.12-.5 3.38 3.38 0 012 .59 3.62 3.62 0 011.26 1.69 7.32 7.32 0 01.44 2.67v.6h-6.2V295h4.25v-.1a2.59 2.59 0 00-.54-1.48 1.51 1.51 0 00-1.2-.53 1.88 1.88 0 00-1.47.59 2.53 2.53 0 00-.52 1.69v1.16a2.12 2.12 0 00.57 1.59 2.14 2.14 0 001.58.56 2.85 2.85 0 001-.2 2.92 2.92 0 00.91-.55l1.37 1.29a5 5 0 01-1.56 1 4.48 4.48 0 01-1.74.36zM416.75 297.53a.73.73 0 00.17.51.62.62 0 00.48.18h.6v2h-1.14a2.12 2.12 0 01-1.64-.63 2.53 2.53 0 01-.59-1.78v-10.38h2.1z"
+ transform="translate(-234.32 -270.82)"/>
+</svg> \ No newline at end of file
diff --git a/src/wwwroot/assets/profile/vipps_badge.png b/src/wwwroot/assets/profile/vipps_badge.png
new file mode 100644
index 0000000..9f04790
--- /dev/null
+++ b/src/wwwroot/assets/profile/vipps_badge.png
Binary files differ
diff --git a/src/wwwroot/assets/profile/vipps_button.png b/src/wwwroot/assets/profile/vipps_button.png
new file mode 100644
index 0000000..b76cc1d
--- /dev/null
+++ b/src/wwwroot/assets/profile/vipps_button.png
Binary files differ
diff --git a/src/wwwroot/backbundle.js b/src/wwwroot/backbundle.js
new file mode 100644
index 0000000..136ab4e
--- /dev/null
+++ b/src/wwwroot/backbundle.js
@@ -0,0 +1,4 @@
+import "./scripts/back/index";
+import "./scripts/back/produkter";
+import "./scripts/back/bestillinger";
+import "./scripts/back/dokumenter"; \ No newline at end of file
diff --git a/src/wwwroot/backbundle.scss b/src/wwwroot/backbundle.scss
new file mode 100644
index 0000000..907dfaa
--- /dev/null
+++ b/src/wwwroot/backbundle.scss
@@ -0,0 +1,7 @@
+@import "./styles/variables";
+@import "~bootstrap/scss/bootstrap";
+@import "./styles/vendor/quill.snow";
+@import "./styles/vendor/quill.imageUploader.min";
+@import "./styles/vendor/bootstrap-icons";
+@import "./styles/base";
+@import "./styles/back"; \ No newline at end of file
diff --git a/src/wwwroot/frontbundle.js b/src/wwwroot/frontbundle.js
new file mode 100644
index 0000000..b84d9ec
--- /dev/null
+++ b/src/wwwroot/frontbundle.js
@@ -0,0 +1,7 @@
+import "lazysizes/lazysizes";
+import "bootstrap/js/dist/collapse";
+
+import "./scripts/front/produkter";
+import "./scripts/front/handlekurv";
+import "./scripts/front/logginn";
+import "./scripts/front/status"; \ No newline at end of file
diff --git a/src/wwwroot/frontbundle.scss b/src/wwwroot/frontbundle.scss
new file mode 100644
index 0000000..37b6d28
--- /dev/null
+++ b/src/wwwroot/frontbundle.scss
@@ -0,0 +1,6 @@
+@import "./styles/variables";
+@import "~bootstrap/scss/bootstrap";
+@import "./styles/vendor/bootstrap-side-modal";
+@import "./styles/vendor/bootstrap-icons";
+@import "./styles/base";
+@import "./styles/front";
diff --git a/src/wwwroot/manifest.json b/src/wwwroot/manifest.json
new file mode 100644
index 0000000..3c03528
--- /dev/null
+++ b/src/wwwroot/manifest.json
@@ -0,0 +1,7 @@
+{
+ "manifest_version": 2,
+ "name": "Vinjesvingen Handel - Kontoret",
+ "version": "0.1",
+ "start_url": "/kontoret",
+ "display": "minimal-ui"
+} \ No newline at end of file
diff --git a/src/wwwroot/package-lock.json b/src/wwwroot/package-lock.json
new file mode 100644
index 0000000..5591190
--- /dev/null
+++ b/src/wwwroot/package-lock.json
@@ -0,0 +1,11329 @@
+{
+ "name": "wwwroot",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "@popperjs/core": "^2.5.4",
+ "bootstrap": "^5.0.0-beta1",
+ "js-search": "^2.0.0",
+ "lazysizes": "^5.2.2"
+ },
+ "devDependencies": {
+ "autoprefixer": "^10.1.0",
+ "css-loader": "^5.0.1",
+ "extract-loader": "^5.1.0",
+ "file-loader": "^6.2.0",
+ "html-loader": "^1.3.2",
+ "mini-css-extract-plugin": "^1.3.3",
+ "node-sass-glob-importer": "^5.3.2",
+ "postcss": "^8.2.1",
+ "postcss-loader": "^4.1.0",
+ "quill": "^1.3.7",
+ "quill-blot-formatter": "^1.0.5",
+ "quill-image-drop-module": "^1.0.3",
+ "quill-image-uploader": "^1.2.2",
+ "sass": "^1.30.0",
+ "sass-loader": "^10.1.0",
+ "style-loader": "^2.0.0",
+ "ts-loader": "^8.0.12",
+ "typescript": "^4.1.3",
+ "webpack": "^5.10.1",
+ "webpack-cli": "^4.2.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+ "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.12.13"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz",
+ "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.1.tgz",
+ "integrity": "sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "7.2.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.7.tgz",
+ "integrity": "sha512-EHXbc1z2GoQRqHaAT7+grxlTJ3WE2YNeD6jlpPoRc83cCoThRY+NUWjCUZaYmk51OICkPXn2hhphcWcWXgNW0Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
+ "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "0.0.46",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz",
+ "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
+ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "14.14.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.33.tgz",
+ "integrity": "sha512-oJqcTrgPUF29oUP8AsUqbXGJNuPutsetaa9kTQAQce5Lx5dTYWV02ScBiT/k1BX/Z7pKeqedmvp39Wu4zR7N7g==",
+ "dev": true
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz",
+ "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz",
+ "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz",
+ "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz",
+ "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz",
+ "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.0",
+ "@webassemblyjs/helper-api-error": "1.11.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz",
+ "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz",
+ "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-buffer": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
+ "@webassemblyjs/wasm-gen": "1.11.0"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz",
+ "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz",
+ "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz",
+ "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz",
+ "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-buffer": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
+ "@webassemblyjs/helper-wasm-section": "1.11.0",
+ "@webassemblyjs/wasm-gen": "1.11.0",
+ "@webassemblyjs/wasm-opt": "1.11.0",
+ "@webassemblyjs/wasm-parser": "1.11.0",
+ "@webassemblyjs/wast-printer": "1.11.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz",
+ "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
+ "@webassemblyjs/ieee754": "1.11.0",
+ "@webassemblyjs/leb128": "1.11.0",
+ "@webassemblyjs/utf8": "1.11.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz",
+ "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-buffer": "1.11.0",
+ "@webassemblyjs/wasm-gen": "1.11.0",
+ "@webassemblyjs/wasm-parser": "1.11.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz",
+ "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-api-error": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
+ "@webassemblyjs/ieee754": "1.11.0",
+ "@webassemblyjs/leb128": "1.11.0",
+ "@webassemblyjs/utf8": "1.11.0"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz",
+ "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webpack-cli/configtest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz",
+ "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==",
+ "dev": true,
+ "peerDependencies": {
+ "webpack": "4.x.x || 5.x.x",
+ "webpack-cli": "4.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/info": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz",
+ "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==",
+ "dev": true,
+ "dependencies": {
+ "envinfo": "^7.7.3"
+ },
+ "peerDependencies": {
+ "webpack-cli": "4.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/serve": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz",
+ "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==",
+ "dev": true,
+ "peerDependencies": {
+ "webpack-cli": "4.x.x"
+ },
+ "peerDependenciesMeta": {
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz",
+ "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "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/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true,
+ "bin": {
+ "atob": "bin/atob.js"
+ },
+ "engines": {
+ "node": ">= 4.5.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.5.tgz",
+ "integrity": "sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.16.3",
+ "caniuse-lite": "^1.0.30001196",
+ "colorette": "^1.2.2",
+ "fraction.js": "^4.0.13",
+ "normalize-range": "^0.1.2",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "node_modules/babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "dev": true,
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "babel-generator": "^6.26.0",
+ "babel-helpers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "convert-source-map": "^1.5.1",
+ "debug": "^2.6.9",
+ "json5": "^0.5.1",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.4",
+ "path-is-absolute": "^1.0.1",
+ "private": "^0.1.8",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.7"
+ }
+ },
+ "node_modules/babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "dependencies": {
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "detect-indent": "^4.0.0",
+ "jsesc": "^1.3.0",
+ "lodash": "^4.17.4",
+ "source-map": "^0.5.7",
+ "trim-right": "^1.0.1"
+ }
+ },
+ "node_modules/babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-explode-assignable-expression": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-add-module-exports": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz",
+ "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==",
+ "dev": true
+ },
+ "node_modules/babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+ "dev": true
+ },
+ "node_modules/babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+ "dev": true
+ },
+ "node_modules/babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+ "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+ "dev": true
+ },
+ "node_modules/babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-remap-async-to-generator": "^6.24.1",
+ "babel-plugin-syntax-async-functions": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-define-map": "^6.24.1",
+ "babel-helper-function-name": "^6.24.1",
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-types": "^6.26.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-call-delegate": "^6.24.1",
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "regexpu-core": "^2.0.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "dev": true,
+ "dependencies": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "dependencies": {
+ "regenerator-transform": "^0.10.0"
+ }
+ },
+ "node_modules/babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "node_modules/babel-preset-env": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-check-es2015-constants": "^6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+ "babel-plugin-transform-async-to-generator": "^6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+ "babel-plugin-transform-es2015-classes": "^6.23.0",
+ "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-destructuring": "^6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+ "babel-plugin-transform-es2015-for-of": "^6.23.0",
+ "babel-plugin-transform-es2015-function-name": "^6.22.0",
+ "babel-plugin-transform-es2015-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+ "babel-plugin-transform-es2015-object-super": "^6.22.0",
+ "babel-plugin-transform-es2015-parameters": "^6.23.0",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-spread": "^6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+ "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+ "babel-plugin-transform-exponentiation-operator": "^6.22.0",
+ "babel-plugin-transform-regenerator": "^6.22.0",
+ "browserslist": "^3.2.6",
+ "invariant": "^2.2.2",
+ "semver": "^5.3.0"
+ }
+ },
+ "node_modules/babel-preset-env/node_modules/browserslist": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+ "dev": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30000844",
+ "electron-to-chromium": "^1.3.47"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ }
+ },
+ "node_modules/babel-preset-env/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/babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "dependencies": {
+ "babel-core": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "core-js": "^2.5.0",
+ "home-or-tmp": "^2.0.0",
+ "lodash": "^4.17.4",
+ "mkdirp": "^0.5.1",
+ "source-map-support": "^0.4.15"
+ }
+ },
+ "node_modules/babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "node_modules/babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "dependencies": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "node_modules/babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "node_modules/babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true,
+ "bin": {
+ "babylon": "bin/babylon.js"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "node_modules/base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "dependencies": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/base/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bootstrap": {
+ "version": "5.0.0-beta2",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-beta2.tgz",
+ "integrity": "sha512-e+uPbPHqTQWKyCX435uVlOmgH9tUt0xtjvyOC7knhKgOS643BrQKuTo+KecGpPV7qlmOyZgCfaM4xxPWtDEN/g==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ },
+ "peerDependencies": {
+ "@popperjs/core": "^2.6.0"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "dependencies": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/braces/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/braces/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.16.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
+ "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
+ "dev": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001181",
+ "colorette": "^1.2.1",
+ "electron-to-chromium": "^1.3.649",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.70"
+ },
+ "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/btoa": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
+ "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
+ "dev": true,
+ "bin": {
+ "btoa": "bin/btoa.js"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "node_modules/cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "dependencies": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001198",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001198.tgz",
+ "integrity": "sha512-r5GGgESqOPZzwvdLVER374FpQu2WluCF1Z2DSiFJ89KSmGjT0LVKjgv4NcAqHmGWF9ihNpqRI9KXO9Ex4sKsgA==",
+ "dev": true
+ },
+ "node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz",
+ "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==",
+ "dev": true,
+ "dependencies": {
+ "camel-case": "^3.0.0",
+ "constant-case": "^2.0.0",
+ "dot-case": "^2.1.0",
+ "header-case": "^1.0.0",
+ "is-lower-case": "^1.1.0",
+ "is-upper-case": "^1.1.0",
+ "lower-case": "^1.1.1",
+ "lower-case-first": "^1.0.0",
+ "no-case": "^2.3.2",
+ "param-case": "^2.1.0",
+ "pascal-case": "^2.0.0",
+ "path-case": "^2.1.0",
+ "sentence-case": "^2.1.0",
+ "snake-case": "^2.1.0",
+ "swap-case": "^1.1.0",
+ "title-case": "^2.1.0",
+ "upper-case": "^1.1.1",
+ "upper-case-first": "^1.1.0"
+ }
+ },
+ "node_modules/change-case/node_modules/camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "node_modules/change-case/node_modules/param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "node_modules/change-case/node_modules/pascal-case": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz",
+ "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=",
+ "dev": true,
+ "dependencies": {
+ "camel-case": "^3.0.0",
+ "upper-case-first": "^1.1.0"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+ "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.1"
+ }
+ },
+ "node_modules/chokidar/node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar/node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar/node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/chokidar/node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/chrome-trace-event/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/class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/class-utils/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clean-css": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+ "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "~0.6.0"
+ },
+ "engines": {
+ "node": ">= 4.0"
+ }
+ },
+ "node_modules/clean-css/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "dependencies": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
+ "node_modules/commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/constant-case": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz",
+ "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=",
+ "dev": true,
+ "dependencies": {
+ "snake-case": "^2.1.0",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "node_modules/copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.",
+ "dev": true,
+ "hasInstallScript": true
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+ "dev": true,
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.1.2.tgz",
+ "integrity": "sha512-T7vTXHSx0KrVEg/xjcl7G01RcVXpcw4OELwDPvkr7izQNny85A84dK3dqrczuEfBcu7Yg7mdTjJLSTibRUoRZg==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.2.0",
+ "cssesc": "^3.0.0",
+ "icss-utils": "^5.1.0",
+ "loader-utils": "^2.0.0",
+ "postcss": "^8.2.8",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.1.0",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.4"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.27.0 || ^5.0.0"
+ }
+ },
+ "node_modules/css-node-extract": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/css-node-extract/-/css-node-extract-2.1.3.tgz",
+ "integrity": "sha512-E7CzbC0I4uAs2dI8mPCVe+K37xuja5kjIugOotpwICFL7vzhmFMAPHvS/MF9gFrmv8DDUANsxrgyT/I3OLukcw==",
+ "dev": true,
+ "dependencies": {
+ "change-case": "^3.0.1",
+ "postcss": "^6.0.14"
+ }
+ },
+ "node_modules/css-node-extract/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-node-extract/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-node-extract/node_modules/postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/css-node-extract/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-node-extract/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-selector-extract": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/css-selector-extract/-/css-selector-extract-3.3.6.tgz",
+ "integrity": "sha512-bBI8ZJKKyR9iHvxXb4t3E6WTMkis94eINopVg7y2FmmMjLXUVduD7mPEcADi4i9FX4wOypFMFpySX+0keuefxg==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^6.0.14"
+ }
+ },
+ "node_modules/css-selector-extract/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-selector-extract/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/css-selector-extract/node_modules/postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/css-selector-extract/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/css-selector-extract/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "dev": true,
+ "dependencies": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "dependencies": {
+ "object-keys": "^1.0.12"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "dependencies": {
+ "repeating": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz",
+ "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "entities": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/dom-serializer/node_modules/domhandler": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+ "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
+ "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz",
+ "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.4.tgz",
+ "integrity": "sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/domutils/node_modules/domhandler": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+ "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.1.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz",
+ "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.3.684",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.684.tgz",
+ "integrity": "sha512-GV/vz2EmmtRSvfGSQ5A0Lucic//IRSDijgL15IgzbBEEnp4rfbxeUSZSlBfmsj7BQvE4sBdgfsvPzLCnp6L21w==",
+ "dev": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+ "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.5.0",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz",
+ "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==",
+ "dev": true,
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz",
+ "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==",
+ "dev": true
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
+ "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+ "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "dependencies": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-brackets/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "dependencies": {
+ "homedir-polyfill": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "node_modules/extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "dependencies": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "dependencies": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extglob/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extract-loader": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-5.1.0.tgz",
+ "integrity": "sha512-+U7sMNULTgm3d3G4hE+N7Rvr/Npsxa7M1jfgvhyYdJuOnyLepm9e2gGuriKw1mrX+mJnX4krPfKI4qyLJ5x94w==",
+ "dev": true,
+ "dependencies": {
+ "babel-core": "^6.26.3",
+ "babel-plugin-add-module-exports": "^1.0.2",
+ "babel-preset-env": "^1.7.0",
+ "babel-runtime": "^6.26.0",
+ "btoa": "^1.2.1",
+ "loader-utils": "^1.1.0",
+ "resolve": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/extract-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/extract-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==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
+ "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==",
+ "dev": true
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
+ "node_modules/file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fill-range/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fill-range/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/findup-sync": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+ "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
+ "dev": true,
+ "dependencies": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz",
+ "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "dependencies": {
+ "map-cache": "^0.2.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+ "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "node_modules/global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "dependencies": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-values/node_modules/kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/header-case": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz",
+ "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.1.3"
+ }
+ },
+ "node_modules/home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "dependencies": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "dependencies": {
+ "parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/html-loader": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz",
+ "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==",
+ "dev": true,
+ "dependencies": {
+ "html-minifier-terser": "^5.1.1",
+ "htmlparser2": "^4.1.0",
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/html-minifier-terser": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+ "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+ "dev": true,
+ "dependencies": {
+ "camel-case": "^4.1.1",
+ "clean-css": "^4.2.3",
+ "commander": "^4.1.1",
+ "he": "^1.2.0",
+ "param-case": "^3.0.3",
+ "relateurl": "^0.2.7",
+ "terser": "^4.6.3"
+ },
+ "bin": {
+ "html-minifier-terser": "cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
+ "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^3.0.0",
+ "domutils": "^2.0.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+ "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+ "dev": true,
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "node_modules/interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-arguments": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+ "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "node_modules/is-core-module": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+ "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finite": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-lower-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz",
+ "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^1.1.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
+ "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-symbols": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-upper-case": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz",
+ "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=",
+ "dev": true,
+ "dependencies": {
+ "upper-case": "^1.1.0"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/js-search": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/js-search/-/js-search-2.0.0.tgz",
+ "integrity": "sha512-lJ8KzjlwcelIWuAdKyzsXv45W6OIwRpayzc7XmU8mzgWadg5UVOKVmnq/tXudddEB9Ceic3tVaGu6QOK/eebhg=="
+ },
+ "node_modules/js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "node_modules/jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "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/json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
+ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/lazysizes": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.3.0.tgz",
+ "integrity": "sha512-h5i4WPc2FdeTOUHBcU7eyNnOULPCC90wVho+SQTZRh9Q8lev6P0yFwKq8rvfMdBvsKsCyDQBdqoBng9FYbcR/g=="
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "node_modules/loader-runner": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
+ "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/loader-utils/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==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
+ "node_modules/lower-case-first": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz",
+ "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^1.1.2"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "dependencies": {
+ "object-visit": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/memory-fs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+ "dev": true,
+ "dependencies": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.3.0 <5.0.0 || >=5.10"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.46.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz",
+ "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.29",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz",
+ "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.46.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "1.3.9",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz",
+ "integrity": "sha512-Ac4s+xhVbqlyhXS5J/Vh/QXUz3ycXlCqoCPpg0vdfhsIBH9eg/It/9L1r1XhSCH737M1lqcWnMuWL13zcygn5A==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0",
+ "webpack-sources": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.4.0 || ^5.0.0"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "dev": true
+ },
+ "node_modules/mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "dependencies": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.5"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "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/nanoid": {
+ "version": "3.1.20",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
+ "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "dependencies": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^1.1.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "1.1.71",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+ "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+ "dev": true
+ },
+ "node_modules/node-sass-glob-importer": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/node-sass-glob-importer/-/node-sass-glob-importer-5.3.2.tgz",
+ "integrity": "sha512-QTX7KPsISgp55REV6pMH703nzHfWCOEYEQC0cDyTRo7XO6WDvyC0OAzekuQ4gs505IZcxv9KxZ3uPJ5s5H9D3g==",
+ "dev": true,
+ "dependencies": {
+ "node-sass-magic-importer": "^5.3.2"
+ },
+ "engines": {
+ "node": ">=6.11.1",
+ "npm": ">=3.0.0"
+ }
+ },
+ "node_modules/node-sass-magic-importer": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/node-sass-magic-importer/-/node-sass-magic-importer-5.3.2.tgz",
+ "integrity": "sha512-T3wTUdUoXQE3QN+EsyPpUXRI1Gj1lEsrySQ9Kzlzi15QGKi+uRa9fmvkcSy2y3BKgoj//7Mt9+s+7p0poMpg6Q==",
+ "dev": true,
+ "dependencies": {
+ "css-node-extract": "^2.1.3",
+ "css-selector-extract": "^3.3.6",
+ "findup-sync": "^3.0.0",
+ "glob": "^7.1.3",
+ "object-hash": "^1.3.1",
+ "postcss-scss": "^2.0.0",
+ "resolve": "^1.10.1"
+ },
+ "engines": {
+ "node": ">=6.11.1",
+ "npm": ">=3.0.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "dependencies": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-copy/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-hash": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
+ "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/param-case/node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/param-case/node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/param-case/node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parchment": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
+ "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==",
+ "dev": true
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/pascal-case/node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/pascal-case/node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz",
+ "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.2.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz",
+ "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
+ "dev": true,
+ "dependencies": {
+ "colorette": "^1.2.2",
+ "nanoid": "^3.1.20",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz",
+ "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==",
+ "dev": true,
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.4",
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.4"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+ "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.4"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-scss": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+ "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
+ "dev": true,
+ "dependencies": {
+ "postcss": "^7.0.6"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/postcss-scss/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-scss/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-scss/node_modules/chalk/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-scss/node_modules/postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ }
+ },
+ "node_modules/postcss-scss/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/postcss-scss/node_modules/supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+ "dev": true
+ },
+ "node_modules/postcss/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "dev": true
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/quill": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
+ "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^2.1.1",
+ "deep-equal": "^1.0.1",
+ "eventemitter3": "^2.0.3",
+ "extend": "^3.0.2",
+ "parchment": "^1.1.4",
+ "quill-delta": "^3.6.2"
+ }
+ },
+ "node_modules/quill-blot-formatter": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/quill-blot-formatter/-/quill-blot-formatter-1.0.5.tgz",
+ "integrity": "sha1-k0yt0Q7Zz2i1SyK5nR4Kagb0R50=",
+ "dev": true,
+ "dependencies": {
+ "deepmerge": "^2.0.0"
+ },
+ "peerDependencies": {
+ "quill": "^1.3.4"
+ }
+ },
+ "node_modules/quill-delta": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
+ "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+ "dev": true,
+ "dependencies": {
+ "deep-equal": "^1.0.1",
+ "extend": "^3.0.2",
+ "fast-diff": "1.1.2"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/quill-image-drop-module": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/quill-image-drop-module/-/quill-image-drop-module-1.0.3.tgz",
+ "integrity": "sha1-Dl7IMp3WehISbxZrGRv2TSBXp9M=",
+ "dev": true,
+ "dependencies": {
+ "quill": "^1.2.2"
+ }
+ },
+ "node_modules/quill-image-uploader": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/quill-image-uploader/-/quill-image-uploader-1.2.2.tgz",
+ "integrity": "sha512-23jM2SVJC2W4hCXre4PX1hy4Lk3fBNVIognvHoyKTLl0AjQOiCSnsoIoUSnS2+9+wxvZIk6ET/cMVvtwpERa6g==",
+ "dev": true,
+ "peerDependencies": {
+ "quill": "^1.3.7"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+ "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.9.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "^6.18.0",
+ "babel-types": "^6.19.0",
+ "private": "^0.1.6"
+ }
+ },
+ "node_modules/regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+ "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~0.5.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/regjsparser/node_modules/jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ }
+ },
+ "node_modules/relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "dependencies": {
+ "is-finite": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-cwd/node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "deprecated": "https://github.com/lydell/resolve-url#deprecated",
+ "dev": true
+ },
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "dependencies": {
+ "ret": "~0.1.10"
+ }
+ },
+ "node_modules/sass": {
+ "version": "1.32.8",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz",
+ "integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=2.0.0 <4.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/sass-loader": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz",
+ "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==",
+ "dev": true,
+ "dependencies": {
+ "klona": "^2.0.4",
+ "loader-utils": "^2.0.0",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0",
+ "sass": "^1.3.0",
+ "webpack": "^4.36.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sentence-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz",
+ "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0",
+ "upper-case-first": "^1.1.2"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+ "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/set-value/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/set-value/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snake-case": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz",
+ "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "node_modules/snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "dependencies": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-node/node_modules/define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon-util/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/snapdragon/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true
+ },
+ "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/source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "dev": true,
+ "dependencies": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "^0.5.6"
+ }
+ },
+ "node_modules/source-map-url": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+ "dev": true
+ },
+ "node_modules/split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "dependencies": {
+ "extend-shallow": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "dependencies": {
+ "is-descriptor": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "dependencies": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/static-extend/node_modules/kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/style-loader": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz",
+ "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/swap-case": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz",
+ "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^1.1.1",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+ "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.20.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.12"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz",
+ "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==",
+ "dev": true,
+ "dependencies": {
+ "jest-worker": "^26.6.2",
+ "p-limit": "^3.1.0",
+ "schema-utils": "^3.0.0",
+ "serialize-javascript": "^5.0.1",
+ "source-map": "^0.6.1",
+ "terser": "^5.5.1"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/terser-webpack-plugin/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/terser": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz",
+ "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.20.0",
+ "source-map": "~0.7.2",
+ "source-map-support": "~0.5.19"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/terser/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/terser/node_modules/source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/title-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz",
+ "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.0.3"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-object-path/node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "dependencies": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ts-loader": {
+ "version": "8.0.17",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.17.tgz",
+ "integrity": "sha512-OeVfSshx6ot/TCxRwpBHQ/4lRzfgyTkvi7ghDVrLXOHzTbSK413ROgu/xNqM72i3AFeAIJgQy78FwSMKmOW68w==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "enhanced-resolve": "^4.0.0",
+ "loader-utils": "^2.0.0",
+ "micromatch": "^4.0.0",
+ "semver": "^7.3.4"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "typescript": "*",
+ "webpack": "*"
+ }
+ },
+ "node_modules/ts-loader/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/ts-loader/node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-loader/node_modules/chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/ts-loader/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/ts-loader/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/ts-loader/node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-loader/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-loader/node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/ts-loader/node_modules/micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-loader/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ts-loader/node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+ "dev": true
+ },
+ "node_modules/typescript": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
+ "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dev": true,
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/union-value/node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "node_modules/unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "dependencies": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "dependencies": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "dependencies": {
+ "isarray": "1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/unset-value/node_modules/has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "node_modules/upper-case-first": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz",
+ "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=",
+ "dev": true,
+ "dependencies": {
+ "upper-case": "^1.1.1"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "deprecated": "Please see https://github.com/lydell/urix#deprecated",
+ "dev": true
+ },
+ "node_modules/use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "node_modules/watchpack": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz",
+ "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==",
+ "dev": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.24.4",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.24.4.tgz",
+ "integrity": "sha512-RXOdxF9hFFFhg47BryCgyFrEyyu7Y/75/uiI2DoUiTMqysK+WczVSTppvkR47oZcmI/DPaXCiCiaXBP8QjkNpA==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.0",
+ "@types/estree": "^0.0.46",
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/wasm-edit": "1.11.0",
+ "@webassemblyjs/wasm-parser": "1.11.0",
+ "acorn": "^8.0.4",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.7.0",
+ "es-module-lexer": "^0.4.0",
+ "eslint-scope": "^5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.4",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.0.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.1.1",
+ "watchpack": "^2.0.0",
+ "webpack-sources": "^2.1.1"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz",
+ "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==",
+ "dev": true,
+ "dependencies": {
+ "@discoveryjs/json-ext": "^0.5.0",
+ "@webpack-cli/configtest": "^1.0.1",
+ "@webpack-cli/info": "^1.2.2",
+ "@webpack-cli/serve": "^1.3.0",
+ "colorette": "^1.2.1",
+ "commander": "^7.0.0",
+ "enquirer": "^2.3.6",
+ "execa": "^5.0.0",
+ "fastest-levenshtein": "^1.0.12",
+ "import-local": "^3.0.2",
+ "interpret": "^2.2.0",
+ "rechoir": "^0.7.0",
+ "v8-compile-cache": "^2.2.0",
+ "webpack-merge": "^5.7.3"
+ },
+ "bin": {
+ "webpack-cli": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "4.x.x || 5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@webpack-cli/generators": {
+ "optional": true
+ },
+ "@webpack-cli/init": {
+ "optional": true
+ },
+ "@webpack-cli/migrate": {
+ "optional": true
+ },
+ "webpack-bundle-analyzer": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli/node_modules/commander": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
+ "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz",
+ "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==",
+ "dev": true,
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "dev": true,
+ "dependencies": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/webpack-sources/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack/node_modules/enhanced-resolve": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz",
+ "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack/node_modules/tapable": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
+ "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack/node_modules/webpack-sources": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
+ "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
+ "dev": true,
+ "dependencies": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/wildcard": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ },
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+ "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.12.13"
+ }
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.12.11",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+ "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.13.10",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+ "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.12.11",
+ "chalk": "^2.0.0",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@discoveryjs/json-ext": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz",
+ "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==",
+ "dev": true
+ },
+ "@popperjs/core": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.1.tgz",
+ "integrity": "sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA=="
+ },
+ "@types/eslint": {
+ "version": "7.2.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.7.tgz",
+ "integrity": "sha512-EHXbc1z2GoQRqHaAT7+grxlTJ3WE2YNeD6jlpPoRc83cCoThRY+NUWjCUZaYmk51OICkPXn2hhphcWcWXgNW0Q==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "@types/eslint-scope": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
+ "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
+ "dev": true,
+ "requires": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.46",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz",
+ "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==",
+ "dev": true
+ },
+ "@types/json-schema": {
+ "version": "7.0.7",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
+ "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "14.14.33",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.33.tgz",
+ "integrity": "sha512-oJqcTrgPUF29oUP8AsUqbXGJNuPutsetaa9kTQAQce5Lx5dTYWV02ScBiT/k1BX/Z7pKeqedmvp39Wu4zR7N7g==",
+ "dev": true
+ },
+ "@types/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+ "dev": true
+ },
+ "@webassemblyjs/ast": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz",
+ "integrity": "sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/helper-numbers": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0"
+ }
+ },
+ "@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz",
+ "integrity": "sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-api-error": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz",
+ "integrity": "sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-buffer": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz",
+ "integrity": "sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-numbers": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz",
+ "integrity": "sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.0",
+ "@webassemblyjs/helper-api-error": "1.11.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz",
+ "integrity": "sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz",
+ "integrity": "sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-buffer": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
+ "@webassemblyjs/wasm-gen": "1.11.0"
+ }
+ },
+ "@webassemblyjs/ieee754": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz",
+ "integrity": "sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==",
+ "dev": true,
+ "requires": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "@webassemblyjs/leb128": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz",
+ "integrity": "sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==",
+ "dev": true,
+ "requires": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/utf8": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz",
+ "integrity": "sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==",
+ "dev": true
+ },
+ "@webassemblyjs/wasm-edit": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz",
+ "integrity": "sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-buffer": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
+ "@webassemblyjs/helper-wasm-section": "1.11.0",
+ "@webassemblyjs/wasm-gen": "1.11.0",
+ "@webassemblyjs/wasm-opt": "1.11.0",
+ "@webassemblyjs/wasm-parser": "1.11.0",
+ "@webassemblyjs/wast-printer": "1.11.0"
+ }
+ },
+ "@webassemblyjs/wasm-gen": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz",
+ "integrity": "sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
+ "@webassemblyjs/ieee754": "1.11.0",
+ "@webassemblyjs/leb128": "1.11.0",
+ "@webassemblyjs/utf8": "1.11.0"
+ }
+ },
+ "@webassemblyjs/wasm-opt": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz",
+ "integrity": "sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-buffer": "1.11.0",
+ "@webassemblyjs/wasm-gen": "1.11.0",
+ "@webassemblyjs/wasm-parser": "1.11.0"
+ }
+ },
+ "@webassemblyjs/wasm-parser": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz",
+ "integrity": "sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/helper-api-error": "1.11.0",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.0",
+ "@webassemblyjs/ieee754": "1.11.0",
+ "@webassemblyjs/leb128": "1.11.0",
+ "@webassemblyjs/utf8": "1.11.0"
+ }
+ },
+ "@webassemblyjs/wast-printer": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz",
+ "integrity": "sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.0",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webpack-cli/configtest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz",
+ "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "@webpack-cli/info": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz",
+ "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==",
+ "dev": true,
+ "requires": {
+ "envinfo": "^7.7.3"
+ }
+ },
+ "@webpack-cli/serve": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz",
+ "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==",
+ "dev": true,
+ "requires": {}
+ },
+ "@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.1.0.tgz",
+ "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+ "dev": true
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+ "dev": true
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+ "dev": true
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.5.tgz",
+ "integrity": "sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA==",
+ "dev": true,
+ "requires": {
+ "browserslist": "^4.16.3",
+ "caniuse-lite": "^1.0.30001196",
+ "colorette": "^1.2.2",
+ "fraction.js": "^4.0.13",
+ "normalize-range": "^0.1.2",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "babel-code-frame": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
+ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.3",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.2"
+ }
+ },
+ "babel-core": {
+ "version": "6.26.3",
+ "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
+ "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "babel-generator": "^6.26.0",
+ "babel-helpers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-register": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "convert-source-map": "^1.5.1",
+ "debug": "^2.6.9",
+ "json5": "^0.5.1",
+ "lodash": "^4.17.4",
+ "minimatch": "^3.0.4",
+ "path-is-absolute": "^1.0.1",
+ "private": "^0.1.8",
+ "slash": "^1.0.0",
+ "source-map": "^0.5.7"
+ }
+ },
+ "babel-generator": {
+ "version": "6.26.1",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
+ "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "dev": true,
+ "requires": {
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "detect-indent": "^4.0.0",
+ "jsesc": "^1.3.0",
+ "lodash": "^4.17.4",
+ "source-map": "^0.5.7",
+ "trim-right": "^1.0.1"
+ }
+ },
+ "babel-helper-builder-binary-assignment-operator-visitor": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz",
+ "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=",
+ "dev": true,
+ "requires": {
+ "babel-helper-explode-assignable-expression": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-call-delegate": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz",
+ "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-define-map": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz",
+ "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-helper-explode-assignable-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz",
+ "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz",
+ "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=",
+ "dev": true,
+ "requires": {
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-get-function-arity": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz",
+ "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-hoist-variables": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz",
+ "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-optimise-call-expression": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz",
+ "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-regex": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz",
+ "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-helper-remap-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helper-replace-supers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz",
+ "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=",
+ "dev": true,
+ "requires": {
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-helpers": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+ "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-add-module-exports": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz",
+ "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==",
+ "dev": true
+ },
+ "babel-plugin-check-es2015-constants": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz",
+ "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-syntax-async-functions": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
+ "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
+ "dev": true
+ },
+ "babel-plugin-syntax-exponentiation-operator": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
+ "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
+ "dev": true
+ },
+ "babel-plugin-syntax-trailing-function-commas": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz",
+ "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=",
+ "dev": true
+ },
+ "babel-plugin-transform-async-to-generator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz",
+ "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=",
+ "dev": true,
+ "requires": {
+ "babel-helper-remap-async-to-generator": "^6.24.1",
+ "babel-plugin-syntax-async-functions": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-arrow-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz",
+ "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoped-functions": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz",
+ "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-block-scoping": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz",
+ "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-plugin-transform-es2015-classes": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz",
+ "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=",
+ "dev": true,
+ "requires": {
+ "babel-helper-define-map": "^6.24.1",
+ "babel-helper-function-name": "^6.24.1",
+ "babel-helper-optimise-call-expression": "^6.24.1",
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-computed-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz",
+ "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-destructuring": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz",
+ "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-duplicate-keys": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz",
+ "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-for-of": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz",
+ "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-function-name": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz",
+ "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=",
+ "dev": true,
+ "requires": {
+ "babel-helper-function-name": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz",
+ "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-amd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz",
+ "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-commonjs": {
+ "version": "6.26.2",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz",
+ "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-strict-mode": "^6.24.1",
+ "babel-runtime": "^6.26.0",
+ "babel-template": "^6.26.0",
+ "babel-types": "^6.26.0"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-systemjs": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz",
+ "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=",
+ "dev": true,
+ "requires": {
+ "babel-helper-hoist-variables": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-modules-umd": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz",
+ "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=",
+ "dev": true,
+ "requires": {
+ "babel-plugin-transform-es2015-modules-amd": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-object-super": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz",
+ "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=",
+ "dev": true,
+ "requires": {
+ "babel-helper-replace-supers": "^6.24.1",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-parameters": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz",
+ "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=",
+ "dev": true,
+ "requires": {
+ "babel-helper-call-delegate": "^6.24.1",
+ "babel-helper-get-function-arity": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-template": "^6.24.1",
+ "babel-traverse": "^6.24.1",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-shorthand-properties": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz",
+ "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-spread": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz",
+ "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-sticky-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz",
+ "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-plugin-transform-es2015-template-literals": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz",
+ "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-typeof-symbol": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz",
+ "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-es2015-unicode-regex": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz",
+ "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=",
+ "dev": true,
+ "requires": {
+ "babel-helper-regex": "^6.24.1",
+ "babel-runtime": "^6.22.0",
+ "regexpu-core": "^2.0.0"
+ }
+ },
+ "babel-plugin-transform-exponentiation-operator": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz",
+ "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=",
+ "dev": true,
+ "requires": {
+ "babel-helper-builder-binary-assignment-operator-visitor": "^6.24.1",
+ "babel-plugin-syntax-exponentiation-operator": "^6.8.0",
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-plugin-transform-regenerator": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz",
+ "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "^0.10.0"
+ }
+ },
+ "babel-plugin-transform-strict-mode": {
+ "version": "6.24.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz",
+ "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.24.1"
+ }
+ },
+ "babel-preset-env": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz",
+ "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==",
+ "dev": true,
+ "requires": {
+ "babel-plugin-check-es2015-constants": "^6.22.0",
+ "babel-plugin-syntax-trailing-function-commas": "^6.22.0",
+ "babel-plugin-transform-async-to-generator": "^6.22.0",
+ "babel-plugin-transform-es2015-arrow-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoped-functions": "^6.22.0",
+ "babel-plugin-transform-es2015-block-scoping": "^6.23.0",
+ "babel-plugin-transform-es2015-classes": "^6.23.0",
+ "babel-plugin-transform-es2015-computed-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-destructuring": "^6.23.0",
+ "babel-plugin-transform-es2015-duplicate-keys": "^6.22.0",
+ "babel-plugin-transform-es2015-for-of": "^6.23.0",
+ "babel-plugin-transform-es2015-function-name": "^6.22.0",
+ "babel-plugin-transform-es2015-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-amd": "^6.22.0",
+ "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-systemjs": "^6.23.0",
+ "babel-plugin-transform-es2015-modules-umd": "^6.23.0",
+ "babel-plugin-transform-es2015-object-super": "^6.22.0",
+ "babel-plugin-transform-es2015-parameters": "^6.23.0",
+ "babel-plugin-transform-es2015-shorthand-properties": "^6.22.0",
+ "babel-plugin-transform-es2015-spread": "^6.22.0",
+ "babel-plugin-transform-es2015-sticky-regex": "^6.22.0",
+ "babel-plugin-transform-es2015-template-literals": "^6.22.0",
+ "babel-plugin-transform-es2015-typeof-symbol": "^6.23.0",
+ "babel-plugin-transform-es2015-unicode-regex": "^6.22.0",
+ "babel-plugin-transform-exponentiation-operator": "^6.22.0",
+ "babel-plugin-transform-regenerator": "^6.22.0",
+ "browserslist": "^3.2.6",
+ "invariant": "^2.2.2",
+ "semver": "^5.3.0"
+ },
+ "dependencies": {
+ "browserslist": {
+ "version": "3.2.8",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz",
+ "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30000844",
+ "electron-to-chromium": "^1.3.47"
+ }
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "babel-register": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
+ "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "dev": true,
+ "requires": {
+ "babel-core": "^6.26.0",
+ "babel-runtime": "^6.26.0",
+ "core-js": "^2.5.0",
+ "home-or-tmp": "^2.0.0",
+ "lodash": "^4.17.4",
+ "mkdirp": "^0.5.1",
+ "source-map-support": "^0.4.15"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
+ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "babel-traverse": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
+ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.26.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.26.0",
+ "babel-types": "^6.26.0",
+ "babylon": "^6.18.0",
+ "debug": "^2.6.8",
+ "globals": "^9.18.0",
+ "invariant": "^2.2.2",
+ "lodash": "^4.17.4"
+ }
+ },
+ "babel-types": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.26.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.17.4",
+ "to-fast-properties": "^1.0.3"
+ }
+ },
+ "babylon": {
+ "version": "6.18.0",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
+ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ }
+ }
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bootstrap": {
+ "version": "5.0.0-beta2",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.0.0-beta2.tgz",
+ "integrity": "sha512-e+uPbPHqTQWKyCX435uVlOmgH9tUt0xtjvyOC7knhKgOS643BrQKuTo+KecGpPV7qlmOyZgCfaM4xxPWtDEN/g==",
+ "requires": {}
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ }
+ }
+ },
+ "browserslist": {
+ "version": "4.16.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
+ "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001181",
+ "colorette": "^1.2.1",
+ "electron-to-chromium": "^1.3.649",
+ "escalade": "^3.1.1",
+ "node-releases": "^1.1.70"
+ }
+ },
+ "btoa": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
+ "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "dev": true
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "dev": true,
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "call-bind": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+ "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "get-intrinsic": "^1.0.2"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "requires": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "camelcase": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
+ "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+ "dev": true
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001198",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001198.tgz",
+ "integrity": "sha512-r5GGgESqOPZzwvdLVER374FpQu2WluCF1Z2DSiFJ89KSmGjT0LVKjgv4NcAqHmGWF9ihNpqRI9KXO9Ex4sKsgA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "change-case": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.1.0.tgz",
+ "integrity": "sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==",
+ "dev": true,
+ "requires": {
+ "camel-case": "^3.0.0",
+ "constant-case": "^2.0.0",
+ "dot-case": "^2.1.0",
+ "header-case": "^1.0.0",
+ "is-lower-case": "^1.1.0",
+ "is-upper-case": "^1.1.0",
+ "lower-case": "^1.1.1",
+ "lower-case-first": "^1.0.0",
+ "no-case": "^2.3.2",
+ "param-case": "^2.1.0",
+ "pascal-case": "^2.0.0",
+ "path-case": "^2.1.0",
+ "sentence-case": "^2.1.0",
+ "snake-case": "^2.1.0",
+ "swap-case": "^1.1.0",
+ "title-case": "^2.1.0",
+ "upper-case": "^1.1.1",
+ "upper-case-first": "^1.1.0"
+ },
+ "dependencies": {
+ "camel-case": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
+ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "param-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz",
+ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "pascal-case": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz",
+ "integrity": "sha1-LVeNNFX2YNpl7KGO+VtODekSdh4=",
+ "dev": true,
+ "requires": {
+ "camel-case": "^3.0.0",
+ "upper-case-first": "^1.1.0"
+ }
+ }
+ }
+ },
+ "chokidar": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+ "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.1",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
+ }
+ },
+ "chrome-trace-event": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+ "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.9.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ }
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "clean-css": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz",
+ "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+ "dev": true,
+ "requires": {
+ "source-map": "~0.6.0"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "clone": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+ "dev": true
+ },
+ "clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "colorette": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+ "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+ "dev": true
+ },
+ "commander": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "constant-case": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz",
+ "integrity": "sha1-QXV2TTidP6nI7NKRhu1gBSQ7akY=",
+ "dev": true,
+ "requires": {
+ "snake-case": "^2.1.0",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.1"
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "dev": true
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "dev": true
+ },
+ "cosmiconfig": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+ "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+ "dev": true,
+ "requires": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "dependencies": {
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "css-loader": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.1.2.tgz",
+ "integrity": "sha512-T7vTXHSx0KrVEg/xjcl7G01RcVXpcw4OELwDPvkr7izQNny85A84dK3dqrczuEfBcu7Yg7mdTjJLSTibRUoRZg==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^6.2.0",
+ "cssesc": "^3.0.0",
+ "icss-utils": "^5.1.0",
+ "loader-utils": "^2.0.0",
+ "postcss": "^8.2.8",
+ "postcss-modules-extract-imports": "^3.0.0",
+ "postcss-modules-local-by-default": "^4.0.0",
+ "postcss-modules-scope": "^3.0.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.1.0",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.4"
+ }
+ },
+ "css-node-extract": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/css-node-extract/-/css-node-extract-2.1.3.tgz",
+ "integrity": "sha512-E7CzbC0I4uAs2dI8mPCVe+K37xuja5kjIugOotpwICFL7vzhmFMAPHvS/MF9gFrmv8DDUANsxrgyT/I3OLukcw==",
+ "dev": true,
+ "requires": {
+ "change-case": "^3.0.1",
+ "postcss": "^6.0.14"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "css-selector-extract": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/css-selector-extract/-/css-selector-extract-3.3.6.tgz",
+ "integrity": "sha512-bBI8ZJKKyR9iHvxXb4t3E6WTMkis94eINopVg7y2FmmMjLXUVduD7mPEcADi4i9FX4wOypFMFpySX+0keuefxg==",
+ "dev": true,
+ "requires": {
+ "postcss": "^6.0.14"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "postcss": {
+ "version": "6.0.23",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.1",
+ "source-map": "^0.6.1",
+ "supports-color": "^5.4.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+ "dev": true
+ },
+ "deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "dev": true,
+ "requires": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ }
+ },
+ "deepmerge": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz",
+ "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "detect-file": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
+ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
+ "dev": true
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "dom-serializer": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz",
+ "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0",
+ "entities": "^2.0.0"
+ },
+ "dependencies": {
+ "domhandler": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+ "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.1.0"
+ }
+ }
+ }
+ },
+ "domelementtype": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
+ "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz",
+ "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1"
+ }
+ },
+ "domutils": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.4.4.tgz",
+ "integrity": "sha512-jBC0vOsECI4OMdD0GC9mGn7NXPLb+Qt6KW1YDQzeQYRUFKmNG8lh7mO5HiELfr+lLQE7loDVI4QcAxV80HS+RA==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "^1.0.1",
+ "domelementtype": "^2.0.1",
+ "domhandler": "^4.0.0"
+ },
+ "dependencies": {
+ "domhandler": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+ "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.1.0"
+ }
+ }
+ }
+ },
+ "dot-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz",
+ "integrity": "sha1-NNzzf1Co6TwrO8qLt/uRVcfaO+4=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.3.684",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.684.tgz",
+ "integrity": "sha512-GV/vz2EmmtRSvfGSQ5A0Lucic//IRSDijgL15IgzbBEEnp4rfbxeUSZSlBfmsj7BQvE4sBdgfsvPzLCnp6L21w==",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
+ "enhanced-resolve": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+ "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.5.0",
+ "tapable": "^1.0.0"
+ }
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true
+ },
+ "envinfo": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz",
+ "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==",
+ "dev": true
+ },
+ "errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "requires": {
+ "prr": "~1.0.1"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-module-lexer": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz",
+ "integrity": "sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==",
+ "dev": true
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "eventemitter3": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz",
+ "integrity": "sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=",
+ "dev": true
+ },
+ "events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true
+ },
+ "execa": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+ "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ }
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "dev": true,
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "expand-tilde": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
+ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
+ "dev": true,
+ "requires": {
+ "homedir-polyfill": "^1.0.1"
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "dev": true,
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ }
+ }
+ },
+ "extract-loader": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-5.1.0.tgz",
+ "integrity": "sha512-+U7sMNULTgm3d3G4hE+N7Rvr/Npsxa7M1jfgvhyYdJuOnyLepm9e2gGuriKw1mrX+mJnX4krPfKI4qyLJ5x94w==",
+ "dev": true,
+ "requires": {
+ "babel-core": "^6.26.3",
+ "babel-plugin-add-module-exports": "^1.0.2",
+ "babel-preset-env": "^1.7.0",
+ "babel-runtime": "^6.26.0",
+ "btoa": "^1.2.1",
+ "loader-utils": "^1.1.0",
+ "resolve": "^1.8.1"
+ },
+ "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==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-diff": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz",
+ "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fastest-levenshtein": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
+ "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
+ "dev": true
+ },
+ "file-loader": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+ "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ }
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "findup-sync": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
+ "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
+ "dev": true,
+ "requires": {
+ "detect-file": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "micromatch": "^3.0.4",
+ "resolve-dir": "^1.0.1"
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true
+ },
+ "fraction.js": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.0.13.tgz",
+ "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==",
+ "dev": true
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "dev": true,
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+ "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+ "dev": true
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "global-modules": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
+ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "dev": true,
+ "requires": {
+ "global-prefix": "^1.0.1",
+ "is-windows": "^1.0.1",
+ "resolve-dir": "^1.0.0"
+ }
+ },
+ "global-prefix": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
+ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.2",
+ "homedir-polyfill": "^1.0.1",
+ "ini": "^1.3.4",
+ "is-windows": "^1.0.1",
+ "which": "^1.2.14"
+ }
+ },
+ "globals": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+ "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "dev": true
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "header-case": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz",
+ "integrity": "sha1-lTWXMZfBRLCWE81l0xfvGZY70C0=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.1.3"
+ }
+ },
+ "home-or-tmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+ "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "dev": true,
+ "requires": {
+ "os-homedir": "^1.0.0",
+ "os-tmpdir": "^1.0.1"
+ }
+ },
+ "homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "requires": {
+ "parse-passwd": "^1.0.0"
+ }
+ },
+ "html-loader": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz",
+ "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==",
+ "dev": true,
+ "requires": {
+ "html-minifier-terser": "^5.1.1",
+ "htmlparser2": "^4.1.0",
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ }
+ },
+ "html-minifier-terser": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+ "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+ "dev": true,
+ "requires": {
+ "camel-case": "^4.1.1",
+ "clean-css": "^4.2.3",
+ "commander": "^4.1.1",
+ "he": "^1.2.0",
+ "param-case": "^3.0.3",
+ "relateurl": "^0.2.7",
+ "terser": "^4.6.3"
+ }
+ },
+ "htmlparser2": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz",
+ "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.0.1",
+ "domhandler": "^3.0.0",
+ "domutils": "^2.0.0",
+ "entities": "^2.0.0"
+ }
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ },
+ "icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true,
+ "requires": {}
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "import-local": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
+ "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ }
+ },
+ "indexes-of": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "dev": true
+ },
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-arguments": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+ "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+ "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
+ "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-lower-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz",
+ "integrity": "sha1-fhR75HaNxGbbO/shzGCzHmrWk5M=",
+ "dev": true,
+ "requires": {
+ "lower-case": "^1.1.0"
+ }
+ },
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-regex": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
+ "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true
+ },
+ "is-upper-case": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz",
+ "integrity": "sha1-jQsfp+eTOh5YSDYA7H2WYcuvdW8=",
+ "dev": true,
+ "requires": {
+ "upper-case": "^1.1.0"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true
+ },
+ "jest-worker": {
+ "version": "26.6.2",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
+ "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "js-search": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/js-search/-/js-search-2.0.0.tgz",
+ "integrity": "sha512-lJ8KzjlwcelIWuAdKyzsXv45W6OIwRpayzc7XmU8mzgWadg5UVOKVmnq/tXudddEB9Ceic3tVaGu6QOK/eebhg=="
+ },
+ "js-tokens": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+ "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true
+ },
+ "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
+ },
+ "json5": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+ "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ },
+ "klona": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
+ "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
+ "dev": true
+ },
+ "lazysizes": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/lazysizes/-/lazysizes-5.3.0.tgz",
+ "integrity": "sha512-h5i4WPc2FdeTOUHBcU7eyNnOULPCC90wVho+SQTZRh9Q8lev6P0yFwKq8rvfMdBvsKsCyDQBdqoBng9FYbcR/g=="
+ },
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "loader-runner": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
+ "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "lower-case": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz",
+ "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=",
+ "dev": true
+ },
+ "lower-case-first": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz",
+ "integrity": "sha1-5dp8JvKacHO+AtUrrJmA5ZIq36E=",
+ "dev": true,
+ "requires": {
+ "lower-case": "^1.1.2"
+ }
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "dev": true,
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "memory-fs": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
+ "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+ "dev": true,
+ "requires": {
+ "errno": "^0.1.3",
+ "readable-stream": "^2.0.1"
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ }
+ },
+ "mime-db": {
+ "version": "1.46.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz",
+ "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.29",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz",
+ "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.46.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "mini-css-extract-plugin": {
+ "version": "1.3.9",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.3.9.tgz",
+ "integrity": "sha512-Ac4s+xhVbqlyhXS5J/Vh/QXUz3ycXlCqoCPpg0vdfhsIBH9eg/It/9L1r1XhSCH737M1lqcWnMuWL13zcygn5A==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0",
+ "webpack-sources": "^1.1.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "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==",
+ "dev": true
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "nanoid": {
+ "version": "3.1.20",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz",
+ "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==",
+ "dev": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "no-case": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz",
+ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==",
+ "dev": true,
+ "requires": {
+ "lower-case": "^1.1.1"
+ }
+ },
+ "node-releases": {
+ "version": "1.1.71",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+ "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+ "dev": true
+ },
+ "node-sass-glob-importer": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/node-sass-glob-importer/-/node-sass-glob-importer-5.3.2.tgz",
+ "integrity": "sha512-QTX7KPsISgp55REV6pMH703nzHfWCOEYEQC0cDyTRo7XO6WDvyC0OAzekuQ4gs505IZcxv9KxZ3uPJ5s5H9D3g==",
+ "dev": true,
+ "requires": {
+ "node-sass-magic-importer": "^5.3.2"
+ }
+ },
+ "node-sass-magic-importer": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/node-sass-magic-importer/-/node-sass-magic-importer-5.3.2.tgz",
+ "integrity": "sha512-T3wTUdUoXQE3QN+EsyPpUXRI1Gj1lEsrySQ9Kzlzi15QGKi+uRa9fmvkcSy2y3BKgoj//7Mt9+s+7p0poMpg6Q==",
+ "dev": true,
+ "requires": {
+ "css-node-extract": "^2.1.3",
+ "css-selector-extract": "^3.3.6",
+ "findup-sync": "^3.0.0",
+ "glob": "^7.1.3",
+ "object-hash": "^1.3.1",
+ "postcss-scss": "^2.0.0",
+ "resolve": "^1.10.1"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-hash": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz",
+ "integrity": "sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==",
+ "dev": true
+ },
+ "object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "dev": true
+ },
+ "os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ },
+ "dependencies": {
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ }
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "requires": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "requires": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ }
+ }
+ },
+ "parchment": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz",
+ "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==",
+ "dev": true
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
+ "dev": true
+ },
+ "pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ },
+ "dependencies": {
+ "lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "requires": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ }
+ }
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true
+ },
+ "path-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz",
+ "integrity": "sha1-lLgDfDctP+KQbkZbtF4l0ibo7qU=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "dev": true
+ },
+ "postcss": {
+ "version": "8.2.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz",
+ "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
+ "dev": true,
+ "requires": {
+ "colorette": "^1.2.2",
+ "nanoid": "^3.1.20",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "postcss-loader": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.2.0.tgz",
+ "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==",
+ "dev": true,
+ "requires": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.4",
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.4"
+ }
+ },
+ "postcss-modules-extract-imports": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+ "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+ "dev": true,
+ "requires": {}
+ },
+ "postcss-modules-local-by-default": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+ "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+ "dev": true,
+ "requires": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^6.0.2",
+ "postcss-value-parser": "^4.1.0"
+ }
+ },
+ "postcss-modules-scope": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+ "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+ "dev": true,
+ "requires": {
+ "postcss-selector-parser": "^6.0.4"
+ }
+ },
+ "postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "requires": {
+ "icss-utils": "^5.0.0"
+ }
+ },
+ "postcss-scss": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+ "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
+ "dev": true,
+ "requires": {
+ "postcss": "^7.0.6"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+ "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "indexes-of": "^1.0.1",
+ "uniq": "^1.0.1",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+ "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+ "dev": true
+ },
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "dev": true
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "quill": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz",
+ "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==",
+ "dev": true,
+ "requires": {
+ "clone": "^2.1.1",
+ "deep-equal": "^1.0.1",
+ "eventemitter3": "^2.0.3",
+ "extend": "^3.0.2",
+ "parchment": "^1.1.4",
+ "quill-delta": "^3.6.2"
+ }
+ },
+ "quill-blot-formatter": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/quill-blot-formatter/-/quill-blot-formatter-1.0.5.tgz",
+ "integrity": "sha1-k0yt0Q7Zz2i1SyK5nR4Kagb0R50=",
+ "dev": true,
+ "requires": {
+ "deepmerge": "^2.0.0"
+ }
+ },
+ "quill-delta": {
+ "version": "3.6.3",
+ "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz",
+ "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==",
+ "dev": true,
+ "requires": {
+ "deep-equal": "^1.0.1",
+ "extend": "^3.0.2",
+ "fast-diff": "1.1.2"
+ }
+ },
+ "quill-image-drop-module": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/quill-image-drop-module/-/quill-image-drop-module-1.0.3.tgz",
+ "integrity": "sha1-Dl7IMp3WehISbxZrGRv2TSBXp9M=",
+ "dev": true,
+ "requires": {
+ "quill": "^1.2.2"
+ }
+ },
+ "quill-image-uploader": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/quill-image-uploader/-/quill-image-uploader-1.2.2.tgz",
+ "integrity": "sha512-23jM2SVJC2W4hCXre4PX1hy4Lk3fBNVIognvHoyKTLl0AjQOiCSnsoIoUSnS2+9+wxvZIk6ET/cMVvtwpERa6g==",
+ "dev": true,
+ "requires": {}
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
+ "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
+ "dev": true,
+ "requires": {
+ "resolve": "^1.9.0"
+ }
+ },
+ "regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "dev": true
+ },
+ "regenerator-transform": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz",
+ "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.18.0",
+ "babel-types": "^6.19.0",
+ "private": "^0.1.6"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regexp.prototype.flags": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+ "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "regexpu-core": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
+ "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=",
+ "dev": true,
+ "requires": {
+ "regenerate": "^1.2.1",
+ "regjsgen": "^0.2.0",
+ "regjsparser": "^0.1.4"
+ }
+ },
+ "regjsgen": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
+ "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
+ "dev": true
+ },
+ "regjsparser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz",
+ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=",
+ "dev": true,
+ "requires": {
+ "jsesc": "~0.5.0"
+ },
+ "dependencies": {
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+ "dev": true
+ }
+ }
+ },
+ "relateurl": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
+ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+ "dev": true
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "resolve": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+ "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.2.0",
+ "path-parse": "^1.0.6"
+ }
+ },
+ "resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ }
+ }
+ },
+ "resolve-dir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "dev": true,
+ "requires": {
+ "expand-tilde": "^2.0.0",
+ "global-modules": "^1.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "dev": true,
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "sass": {
+ "version": "1.32.8",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz",
+ "integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==",
+ "dev": true,
+ "requires": {
+ "chokidar": ">=2.0.0 <4.0.0"
+ }
+ },
+ "sass-loader": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz",
+ "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==",
+ "dev": true,
+ "requires": {
+ "klona": "^2.0.4",
+ "loader-utils": "^2.0.0",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.0.0",
+ "semver": "^7.3.2"
+ }
+ },
+ "schema-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
+ "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.6",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "sentence-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz",
+ "integrity": "sha1-H24t2jnBaL+S0T+G1KkYkz9mftQ=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0",
+ "upper-case-first": "^1.1.2"
+ }
+ },
+ "serialize-javascript": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+ "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ }
+ }
+ },
+ "shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.2"
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+ "dev": true
+ },
+ "slash": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+ "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "dev": true
+ },
+ "snake-case": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz",
+ "integrity": "sha1-Qb2xtz8w7GagTU4srRt2OH1NbZ8=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "dev": true,
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ }
+ }
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "source-list-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
+ "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "dev": true,
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.4.18",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
+ "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.5.6"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+ "dev": true
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "dev": true,
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ }
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "dev": true,
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "dev": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "dev": true,
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+ "dev": true
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "style-loader": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz",
+ "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==",
+ "dev": true,
+ "requires": {
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^3.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "swap-case": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz",
+ "integrity": "sha1-w5IDpFhzhfrTyFCgvRvK+ggZdOM=",
+ "dev": true,
+ "requires": {
+ "lower-case": "^1.1.1",
+ "upper-case": "^1.1.1"
+ }
+ },
+ "tapable": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz",
+ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+ "dev": true
+ },
+ "terser": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
+ "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.20.0",
+ "source-map": "~0.6.1",
+ "source-map-support": "~0.5.12"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ }
+ }
+ },
+ "terser-webpack-plugin": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz",
+ "integrity": "sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==",
+ "dev": true,
+ "requires": {
+ "jest-worker": "^26.6.2",
+ "p-limit": "^3.1.0",
+ "schema-utils": "^3.0.0",
+ "serialize-javascript": "^5.0.1",
+ "source-map": "^0.6.1",
+ "terser": "^5.5.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "terser": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.6.0.tgz",
+ "integrity": "sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.20.0",
+ "source-map": "~0.7.2",
+ "source-map-support": "~0.5.19"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true
+ }
+ }
+ }
+ }
+ },
+ "title-case": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz",
+ "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=",
+ "dev": true,
+ "requires": {
+ "no-case": "^2.2.0",
+ "upper-case": "^1.0.3"
+ }
+ },
+ "to-fast-properties": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
+ "dev": true
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "dev": true,
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "dev": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "ts-loader": {
+ "version": "8.0.17",
+ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.17.tgz",
+ "integrity": "sha512-OeVfSshx6ot/TCxRwpBHQ/4lRzfgyTkvi7ghDVrLXOHzTbSK413ROgu/xNqM72i3AFeAIJgQy78FwSMKmOW68w==",
+ "dev": true,
+ "requires": {
+ "chalk": "^4.1.0",
+ "enhanced-resolve": "^4.0.0",
+ "loader-utils": "^2.0.0",
+ "micromatch": "^4.0.0",
+ "semver": "^7.3.4"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+ "dev": true,
+ "requires": {
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ }
+ }
+ },
+ "tslib": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+ "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+ "dev": true
+ },
+ "typescript": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
+ "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dev": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ }
+ }
+ },
+ "uniq": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+ "dev": true
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "dev": true,
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "dev": true,
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+ "dev": true
+ }
+ }
+ },
+ "upper-case": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz",
+ "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=",
+ "dev": true
+ },
+ "upper-case-first": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz",
+ "integrity": "sha1-XXm+3P8UQZUY/S7bCgUHybaFkRU=",
+ "dev": true,
+ "requires": {
+ "upper-case": "^1.1.1"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
+ "watchpack": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz",
+ "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==",
+ "dev": true,
+ "requires": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ }
+ },
+ "webpack": {
+ "version": "5.24.4",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.24.4.tgz",
+ "integrity": "sha512-RXOdxF9hFFFhg47BryCgyFrEyyu7Y/75/uiI2DoUiTMqysK+WczVSTppvkR47oZcmI/DPaXCiCiaXBP8QjkNpA==",
+ "dev": true,
+ "requires": {
+ "@types/eslint-scope": "^3.7.0",
+ "@types/estree": "^0.0.46",
+ "@webassemblyjs/ast": "1.11.0",
+ "@webassemblyjs/wasm-edit": "1.11.0",
+ "@webassemblyjs/wasm-parser": "1.11.0",
+ "acorn": "^8.0.4",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.7.0",
+ "es-module-lexer": "^0.4.0",
+ "eslint-scope": "^5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.4",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.0.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.1.1",
+ "watchpack": "^2.0.0",
+ "webpack-sources": "^2.1.1"
+ },
+ "dependencies": {
+ "enhanced-resolve": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz",
+ "integrity": "sha512-6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "tapable": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz",
+ "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==",
+ "dev": true
+ },
+ "webpack-sources": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
+ "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
+ "dev": true,
+ "requires": {
+ "source-list-map": "^2.0.1",
+ "source-map": "^0.6.1"
+ }
+ }
+ }
+ },
+ "webpack-cli": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz",
+ "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==",
+ "dev": true,
+ "requires": {
+ "@discoveryjs/json-ext": "^0.5.0",
+ "@webpack-cli/configtest": "^1.0.1",
+ "@webpack-cli/info": "^1.2.2",
+ "@webpack-cli/serve": "^1.3.0",
+ "colorette": "^1.2.1",
+ "commander": "^7.0.0",
+ "enquirer": "^2.3.6",
+ "execa": "^5.0.0",
+ "fastest-levenshtein": "^1.0.12",
+ "import-local": "^3.0.2",
+ "interpret": "^2.2.0",
+ "rechoir": "^0.7.0",
+ "v8-compile-cache": "^2.2.0",
+ "webpack-merge": "^5.7.3"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
+ "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
+ "dev": true
+ }
+ }
+ },
+ "webpack-merge": {
+ "version": "5.7.3",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz",
+ "integrity": "sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==",
+ "dev": true,
+ "requires": {
+ "clone-deep": "^4.0.1",
+ "wildcard": "^2.0.0"
+ }
+ },
+ "webpack-sources": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
+ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+ "dev": true,
+ "requires": {
+ "source-list-map": "^2.0.0",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ }
+ }
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "wildcard": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "yaml": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.0.tgz",
+ "integrity": "sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg==",
+ "dev": true
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true
+ }
+ }
+}
diff --git a/src/wwwroot/package.json b/src/wwwroot/package.json
new file mode 100644
index 0000000..090e6c5
--- /dev/null
+++ b/src/wwwroot/package.json
@@ -0,0 +1,35 @@
+{
+ "private": true,
+ "scripts": {
+ "build": "webpack-cli --mode='production'",
+ "watch": "webpack-cli --watch"
+ },
+ "devDependencies": {
+ "autoprefixer": "^10.1.0",
+ "css-loader": "^5.0.1",
+ "extract-loader": "^5.1.0",
+ "file-loader": "^6.2.0",
+ "html-loader": "^1.3.2",
+ "mini-css-extract-plugin": "^1.3.3",
+ "node-sass-glob-importer": "^5.3.2",
+ "postcss": "^8.2.1",
+ "postcss-loader": "^4.1.0",
+ "quill": "^1.3.7",
+ "quill-blot-formatter": "^1.0.5",
+ "quill-image-drop-module": "^1.0.3",
+ "quill-image-uploader": "^1.2.2",
+ "sass": "^1.30.0",
+ "sass-loader": "^10.1.0",
+ "style-loader": "^2.0.0",
+ "ts-loader": "^8.0.12",
+ "typescript": "^4.1.3",
+ "webpack": "^5.10.1",
+ "webpack-cli": "^4.2.0"
+ },
+ "dependencies": {
+ "@popperjs/core": "^2.5.4",
+ "bootstrap": "^5.0.0-beta1",
+ "js-search": "^2.0.0",
+ "lazysizes": "^5.2.2"
+ }
+}
diff --git a/src/wwwroot/prepros.config b/src/wwwroot/prepros.config
new file mode 100644
index 0000000..07c0c19
--- /dev/null
+++ b/src/wwwroot/prepros.config
@@ -0,0 +1,931 @@
+{
+ "version": "7",
+ "about": "This is a Prepros (https://prepros.io) configuration file. You can commit this file to a git repo to backup and sync project configurations.",
+ "config": {
+ "proxy": {
+ "enable": false,
+ "target": "",
+ "useLocalAssets": false
+ },
+ "reload": {
+ "enable": false,
+ "delay": 0,
+ "animate": false,
+ "afterUpload": false
+ },
+ "sync": {
+ "enable": false,
+ "mouse": true,
+ "keyboard": true,
+ "form": true,
+ "scroll": true
+ },
+ "watcher": {
+ "enable": true,
+ "maxFiles": 2000,
+ "usePolling": false,
+ "pollingInterval": 500,
+ "extensions": [
+ ".html",
+ ".htm",
+ ".php"
+ ],
+ "ignore": {
+ "patterns": [
+ ".*",
+ "wp-admin",
+ "wp-includes",
+ "node_modules",
+ "Prepros Export",
+ "bower_components",
+ "/scripts",
+ "/assets",
+ "/dist",
+ "/backbundle.js",
+ "/frontbundle.js",
+ "/webpack.config.js"
+ ],
+ "exceptions": []
+ }
+ },
+ "exporter": {
+ "ignore": {
+ "patterns": [
+ ".*",
+ "desktop.ini",
+ "prepros.cfg",
+ "node_modules",
+ "Prepros Export",
+ "prepros.config",
+ "prepros-6.config",
+ "*-original.jpg",
+ "*-original.jpeg",
+ "*-original.png",
+ "*-original.svg",
+ "*.scss",
+ "*.sass",
+ "*.less",
+ "*.pug",
+ "*.jade",
+ "*.styl",
+ "*.haml",
+ "*.slim",
+ "*.coffee",
+ "*.kit",
+ "*.turf",
+ "*.ts"
+ ],
+ "exceptions": []
+ }
+ },
+ "uploader": {
+ "remotePath": "",
+ "timeout": 20000,
+ "autoUpload": false,
+ "reuseConnection": true,
+ "connectionType": "ftp",
+ "history": []
+ },
+ "packages": {
+ "createPackageLock": false
+ },
+ "tasks": {
+ "autoprefixer": {
+ "cascade": true,
+ "add": true,
+ "remove": true,
+ "supports": true,
+ "flexbox": true,
+ "grid": "autoplace",
+ "browsers": [
+ "> 2%",
+ "not dead"
+ ],
+ "sourceMap": false
+ },
+ "babel": {
+ "sourceMap": false,
+ "presets": {
+ "@babel/preset-env": {
+ "enable": true,
+ "options": {
+ "targets": [
+ "> 2%",
+ "not dead"
+ ],
+ "preserveImports": false,
+ "polyfills": true
+ }
+ },
+ "@babel/preset-react": false,
+ "@babel/preset-flow": false
+ },
+ "plugins": {
+ "@babel/plugin-proposal-class-properties": false,
+ "@babel/plugin-proposal-decorators": {
+ "enable": false,
+ "options": {
+ "decoratorsBeforeExport": true
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": false,
+ "@babel/plugin-proposal-function-sent": false,
+ "@babel/plugin-proposal-nullish-coalescing-operator": false,
+ "@babel/plugin-proposal-numeric-separator": false,
+ "@babel/plugin-proposal-optional-chaining": false,
+ "@babel/plugin-proposal-private-methods": false,
+ "@babel/plugin-proposal-throw-expressions": false
+ },
+ "customPresets": [],
+ "customPlugins": []
+ },
+ "bundle-js": {
+ "sourceMap": false,
+ "exclude": [
+ "node_modules",
+ "bower_components"
+ ],
+ "devMode": true,
+ "globals": [],
+ "externals": [],
+ "babel": {
+ "enable": true,
+ "options": {
+ "sourceMap": false,
+ "presets": {
+ "@babel/preset-env": {
+ "enable": true,
+ "options": {
+ "targets": [
+ "> 2%",
+ "not dead"
+ ],
+ "preserveImports": false,
+ "polyfills": false
+ }
+ },
+ "@babel/preset-react": true,
+ "@babel/preset-flow": false
+ },
+ "plugins": {
+ "@babel/plugin-proposal-class-properties": false,
+ "@babel/plugin-proposal-decorators": {
+ "enable": false,
+ "options": {
+ "decoratorsBeforeExport": true
+ }
+ },
+ "@babel/plugin-proposal-export-namespace-from": false,
+ "@babel/plugin-proposal-function-sent": false,
+ "@babel/plugin-proposal-nullish-coalescing-operator": false,
+ "@babel/plugin-proposal-numeric-separator": false,
+ "@babel/plugin-proposal-optional-chaining": false,
+ "@babel/plugin-proposal-private-methods": false,
+ "@babel/plugin-proposal-throw-expressions": false
+ },
+ "customPresets": [],
+ "customPlugins": []
+ }
+ },
+ "css": {
+ "enable": true
+ },
+ "fonts": {
+ "enable": true
+ }
+ },
+ "coffeescript": {
+ "header": false,
+ "bare": false,
+ "sourceMap": false
+ },
+ "command": {
+ "command": "",
+ "rootDir": ""
+ },
+ "concat-js": {
+ "sourceMap": false,
+ "rootDir": ""
+ },
+ "copy": {
+ "sourceMap": false
+ },
+ "dart-sass": {
+ "indentType": "tab",
+ "indentWidth": 2,
+ "linefeed": "lf",
+ "sourceMap": false
+ },
+ "haml": {
+ "doubleQuoteAttributes": true
+ },
+ "jpg": {
+ "quality": 90
+ },
+ "less": {
+ "javascriptEnabled": false,
+ "strictImports": false,
+ "insecure": false,
+ "math": "always",
+ "strictUnits": false,
+ "dumpLineNumbers": false,
+ "sourceMap": false
+ },
+ "markdown": {
+ "githubFlavored": true,
+ "wrapWithHtml": false
+ },
+ "minify-css": {
+ "sourceMap": false
+ },
+ "minify-html": {
+ "caseSensitive": false,
+ "collapseBooleanAttributes": true,
+ "collapseInlineTagWhitespace": false,
+ "collapseWhitespace": true,
+ "conservativeCollapse": false,
+ "decodeEntities": false,
+ "html5": true,
+ "includeAutoGeneratedTags": true,
+ "keepClosingSlash": false,
+ "minifyCSS": true,
+ "minifyJS": true,
+ "preserveLineBreaks": false,
+ "preventAttributesEscaping": false,
+ "processConditionalComments": false,
+ "removeAttributeQuotes": false,
+ "removeComments": true,
+ "removeEmptyAttributes": false,
+ "removeEmptyElement": false,
+ "removeOptionalTags": false,
+ "removeRedundantAttributes": false,
+ "removeScriptTypeAttributes": false,
+ "removeStyleLinkTypeAttributes": false,
+ "removeTagWhitespace": false,
+ "sortAttributes": false,
+ "sortClassName": false,
+ "useShortDoctype": true
+ },
+ "minify-js": {
+ "parse": {
+ "bare_returns": false
+ },
+ "compress": {
+ "arrows": true,
+ "arguments": false,
+ "booleans": true,
+ "booleans_as_integers": false,
+ "collapse_vars": true,
+ "comparisons": true,
+ "computed_props": true,
+ "conditionals": true,
+ "dead_code": true,
+ "directives": true,
+ "drop_console": false,
+ "drop_debugger": true,
+ "evaluate": true,
+ "expression": false,
+ "global_defs": [],
+ "hoist_funs": false,
+ "hoist_props": true,
+ "hoist_vars": false,
+ "if_return": true,
+ "inline": 3,
+ "join_vars": true,
+ "keep_fargs": true,
+ "keep_infinity": false,
+ "loops": true,
+ "negate_iife": true,
+ "properties": true,
+ "pure_funcs": [],
+ "pure_getters": false,
+ "reduce_vars": true,
+ "sequences": true,
+ "side_effects": true,
+ "switches": true,
+ "top_retain": [],
+ "typeofs": true,
+ "unsafe": false,
+ "unsafe_arrows": false,
+ "unsafe_comps": false,
+ "unsafe_Function": false,
+ "unsafe_math": false,
+ "unsafe_proto": false,
+ "unsafe_regexp": false,
+ "unsafe_undefined": false,
+ "unused": false
+ },
+ "mangle": {
+ "eval": false,
+ "reserved": []
+ },
+ "output": {
+ "ascii_only": false,
+ "braces": false,
+ "comments": "none",
+ "inline_script": true,
+ "keep_numbers": false,
+ "keep_quoted_props": false,
+ "preamble": null,
+ "quote_keys": false,
+ "quote_style": 0,
+ "semicolons": true,
+ "shebang": true,
+ "webkit": false,
+ "wrap_iife": false,
+ "wrap_func_args": true
+ },
+ "sourceMap": false,
+ "toplevel": false,
+ "ie8": false,
+ "keep_classnames": false,
+ "keep_fnames": false,
+ "safari10": false
+ },
+ "node-sass": {
+ "indentType": "space",
+ "indentWidth": 2,
+ "linefeed": "lf",
+ "outputStyle": "expanded",
+ "precision": 10,
+ "sourceMap": false,
+ "sourceComments": false
+ },
+ "png": {
+ "quality": 90
+ },
+ "postcss-import": {
+ "ignoreKeywords": [],
+ "sourceMap": false
+ },
+ "postcss-preset-env": {
+ "stage": 2,
+ "browsers": [
+ "> 2%",
+ "not dead"
+ ],
+ "sourceMap": false
+ },
+ "pug": {
+ "pretty": false
+ },
+ "slim": {
+ "indent": "space",
+ "indentSize": 2,
+ "pretty": true
+ },
+ "stylus": {
+ "useNib": true,
+ "sourceMap": false,
+ "linenos": false
+ },
+ "svg": {
+ "cleanupAttrs": true,
+ "removeDoctype": true,
+ "removeXMLProcInst": true,
+ "removeComments": true,
+ "removeMetadata": true,
+ "removeTitle": true,
+ "removeDesc": true,
+ "removeUselessDefs": true,
+ "removeEditorsNSData": true,
+ "removeEmptyAttrs": true,
+ "removeHiddenElems": true,
+ "removeEmptyText": true,
+ "removeEmptyContainers": true,
+ "removeViewBox": false,
+ "cleanupEnableBackground": true,
+ "convertStyleToAttrs": true,
+ "convertColors": true,
+ "convertPathData": true,
+ "convertTransform": true,
+ "removeUnknownsAndDefaults": true,
+ "removeNonInheritableGroupAttrs": true,
+ "removeUselessStrokeAndFill": true,
+ "removeUnusedNS": true,
+ "cleanupIDs": true,
+ "cleanupNumericValues": true,
+ "moveElemsAttrsToGroup": true,
+ "moveGroupAttrsToElems": true,
+ "collapseGroups": true,
+ "removeRasterImages": false,
+ "mergePaths": true,
+ "convertShapeToPath": true,
+ "sortAttrs": true,
+ "removeDimensions": true
+ },
+ "turf": {
+ "rootDir": ""
+ },
+ "typescript": {
+ "allowJs": false,
+ "allowSyntheticDefaultImports": true,
+ "allowUmdGlobalAccess": false,
+ "allowUnreachableCode": false,
+ "allowUnusedLabels": false,
+ "alwaysStrict": false,
+ "charset": "utf8",
+ "checkJs": false,
+ "declaration": false,
+ "disableSizeLimit": false,
+ "downlevelIteration": false,
+ "emitBOM": false,
+ "emitDecoratorMetadata": false,
+ "experimentalDecorators": false,
+ "forceConsistentCasingInFileNames": false,
+ "importHelpers": false,
+ "jsx": "React",
+ "keyofStringsOnly": false,
+ "lib": [],
+ "maxNodeModuleJsDepth": 0,
+ "module": "ES2015",
+ "moduleResolution": "NodeJs",
+ "newLine": "LineFeed",
+ "noFallthroughCasesInSwitch": false,
+ "noImplicitAny": false,
+ "noImplicitReturns": false,
+ "noImplicitThis": false,
+ "noStrictGenericChecks": false,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noImplicitUseStrict": false,
+ "noLib": false,
+ "noResolve": false,
+ "preserveConstEnums": false,
+ "jsxFactory": "React.createElement",
+ "removeComments": false,
+ "skipLibCheck": false,
+ "sourceMap": false,
+ "strict": false,
+ "strictFunctionTypes": false,
+ "strictBindCallApply": false,
+ "strictNullChecks": false,
+ "strictPropertyInitialization": false,
+ "suppressExcessPropertyErrors": false,
+ "suppressImplicitAnyIndexErrors": false,
+ "target": "ES3",
+ "resolveJsonModule": false,
+ "esModuleInterop": false,
+ "useDefineForClassFields": false
+ }
+ },
+ "fileTypes": {
+ "sass": {
+ "extensions": [
+ ".scss",
+ ".sass"
+ ],
+ "autoCompile": true,
+ "sourceMap": true,
+ "tasks": [
+ {
+ "task": "dart-sass",
+ "enable": true
+ },
+ {
+ "task": "autoprefixer",
+ "enable": true
+ },
+ {
+ "task": "minify-css",
+ "enable": true
+ }
+ ],
+ "output": {
+ "extension": ".css",
+ "type": "SOURCE_RELATIVE",
+ "segments": [
+ {
+ "segment": "scss",
+ "replaceWith": "css"
+ },
+ {
+ "segment": "sass",
+ "replaceWith": "css"
+ }
+ ],
+ "relativePath": "dist"
+ }
+ },
+ "less": {
+ "extensions": [
+ ".less"
+ ],
+ "autoCompile": true,
+ "sourceMap": false,
+ "tasks": [
+ {
+ "task": "less",
+ "enable": true
+ },
+ {
+ "task": "autoprefixer",
+ "enable": true
+ },
+ {
+ "task": "minify-css",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".css",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "less",
+ "replaceWith": "css"
+ }
+ ]
+ }
+ },
+ "pug": {
+ "extensions": [
+ ".pug",
+ ".jade"
+ ],
+ "autoCompile": false,
+ "tasks": [
+ {
+ "task": "pug",
+ "enable": true
+ },
+ {
+ "task": "minify-html",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".html",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "pug",
+ "replaceWith": "html"
+ }
+ ]
+ }
+ },
+ "css": {
+ "extensions": [
+ ".css"
+ ],
+ "autoCompile": false,
+ "sourceMap": false,
+ "tasks": [
+ {
+ "task": "copy",
+ "enable": true
+ },
+ {
+ "task": "postcss-import",
+ "enable": true
+ },
+ {
+ "task": "postcss-preset-env",
+ "enable": true
+ },
+ {
+ "task": "autoprefixer",
+ "enable": true
+ },
+ {
+ "task": "minify-css",
+ "enable": true
+ }
+ ],
+ "output": {
+ "extension": ".css",
+ "type": "SOURCE_RELATIVE",
+ "relativePath": "",
+ "suffix": "-dist",
+ "alwaysSuffix": false
+ }
+ },
+ "javascript": {
+ "extensions": [
+ ".js",
+ ".jsx"
+ ],
+ "autoCompile": false,
+ "sourceMap": false,
+ "tasks": [
+ {
+ "task": "copy",
+ "enable": true
+ },
+ {
+ "task": "concat-js",
+ "enable": false
+ },
+ {
+ "task": "babel",
+ "enable": true
+ },
+ {
+ "task": "bundle-js",
+ "enable": true
+ },
+ {
+ "task": "minify-js",
+ "enable": true
+ }
+ ],
+ "output": {
+ "extension": ".js",
+ "type": "SOURCE_RELATIVE",
+ "relativePath": "",
+ "suffix": ".bundle",
+ "alwaysSuffix": false,
+ "segments": [
+ {
+ "segment": "js",
+ "replaceWith": "bundle.js"
+ }
+ ]
+ }
+ },
+ "stylus": {
+ "extensions": [
+ ".styl"
+ ],
+ "autoCompile": true,
+ "sourceMap": false,
+ "tasks": [
+ {
+ "task": "stylus",
+ "enable": true
+ },
+ {
+ "task": "autoprefixer",
+ "enable": true
+ },
+ {
+ "task": "minify-css",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".css",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "stylus",
+ "replaceWith": "css"
+ },
+ {
+ "segment": "styl",
+ "replaceWith": "css"
+ }
+ ]
+ }
+ },
+ "markdown": {
+ "extensions": [
+ ".md",
+ ".markdown",
+ ".mkd"
+ ],
+ "autoCompile": false,
+ "tasks": [
+ {
+ "task": "markdown",
+ "enable": true
+ },
+ {
+ "task": "minify-html",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".html",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "markdown",
+ "replaceWith": "html"
+ }
+ ]
+ }
+ },
+ "haml": {
+ "extensions": [
+ ".haml"
+ ],
+ "autoCompile": true,
+ "tasks": [
+ {
+ "task": "haml",
+ "enable": true
+ },
+ {
+ "task": "minify-html",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".html",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "haml",
+ "replaceWith": "html"
+ }
+ ]
+ }
+ },
+ "slim": {
+ "extensions": [
+ ".slim"
+ ],
+ "autoCompile": true,
+ "tasks": [
+ {
+ "task": "slim",
+ "enable": true
+ },
+ {
+ "task": "minify-html",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".html",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "slim",
+ "replaceWith": "html"
+ }
+ ]
+ }
+ },
+ "coffeescript": {
+ "extensions": [
+ ".coffee"
+ ],
+ "autoCompile": true,
+ "sourceMap": false,
+ "tasks": [
+ {
+ "task": "coffeescript",
+ "enable": true
+ },
+ {
+ "task": "babel",
+ "enable": false
+ },
+ {
+ "task": "bundle-js",
+ "enable": false
+ },
+ {
+ "task": "minify-js",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".js",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "coffee-script",
+ "replaceWith": "js"
+ },
+ {
+ "segment": "coffeescript",
+ "replaceWith": "js"
+ },
+ {
+ "segment": "coffee",
+ "replaceWith": "js"
+ }
+ ]
+ }
+ },
+ "turf": {
+ "extensions": [
+ ".turf",
+ ".kit"
+ ],
+ "autoCompile": true,
+ "tasks": [
+ {
+ "task": "turf",
+ "enable": true
+ },
+ {
+ "task": "minify-html",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".html",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "turf",
+ "replaceWith": "html"
+ }
+ ]
+ }
+ },
+ "typescript": {
+ "extensions": [
+ ".ts",
+ ".tsx"
+ ],
+ "autoCompile": true,
+ "sourceMap": false,
+ "tasks": [
+ {
+ "task": "typescript",
+ "enable": true
+ },
+ {
+ "task": "babel",
+ "enable": false
+ },
+ {
+ "task": "bundle-js",
+ "enable": false
+ },
+ {
+ "task": "minify-js",
+ "enable": false
+ }
+ ],
+ "output": {
+ "extension": ".js",
+ "type": "REPLACE_SEGMENTS",
+ "segments": [
+ {
+ "segment": "typescript",
+ "replaceWith": "js"
+ },
+ {
+ "segment": "ts",
+ "replaceWith": "js"
+ }
+ ]
+ }
+ },
+ "jpg": {
+ "extensions": [
+ ".jpg",
+ ".jpeg"
+ ],
+ "tasks": [
+ {
+ "task": "jpg",
+ "enable": true
+ }
+ ],
+ "output": {
+ "extension": ".jpg",
+ "type": "SOURCE_RELATIVE",
+ "relativePath": ""
+ }
+ },
+ "png": {
+ "extensions": [
+ ".png"
+ ],
+ "tasks": [
+ {
+ "task": "png",
+ "enable": true
+ }
+ ],
+ "output": {
+ "extension": ".png",
+ "type": "SOURCE_RELATIVE",
+ "relativePath": ""
+ }
+ },
+ "svg": {
+ "extensions": [
+ ".svg"
+ ],
+ "tasks": [
+ {
+ "task": "svg",
+ "enable": true
+ }
+ ],
+ "output": {
+ "extension": ".svg",
+ "type": "SOURCE_RELATIVE",
+ "relativePath": ""
+ }
+ }
+ },
+ "files": [
+ {
+ "file": "scripts/grid.ts",
+ "config": {
+ "autoCompile": false
+ }
+ }
+ ]
+ }
+}
diff --git a/src/wwwroot/scripts/api/account-api.ts b/src/wwwroot/scripts/api/account-api.ts
new file mode 100644
index 0000000..0d8604b
--- /dev/null
+++ b/src/wwwroot/scripts/api/account-api.ts
@@ -0,0 +1,28 @@
+import {LoginPayload} from "./account-api.types"
+
+export function login(payload: LoginPayload, xsrf: string): Promise<Response> {
+ return fetch("/api/account/login", {
+ method: "post",
+ body: JSON.stringify(payload),
+ headers: {
+ "Content-Type": "application/json;charset=utf-8",
+ "XSRF-TOKEN": xsrf
+ }
+ });
+}
+
+export function logout(): Promise<Response> {
+ return fetch("/api/account/logout");
+}
+
+export function updatePassword(newPassword: string): Promise<Response> {
+ return fetch("/api/account/update-password", {
+ method: "post",
+ body: JSON.stringify({
+ newPassword
+ }),
+ headers: {
+ "Content-Type": "application/json;charset=utf-8"
+ }
+ });
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/account-api.types.ts b/src/wwwroot/scripts/api/account-api.types.ts
new file mode 100644
index 0000000..3c02441
--- /dev/null
+++ b/src/wwwroot/scripts/api/account-api.types.ts
@@ -0,0 +1,5 @@
+export interface LoginPayload {
+ username: string,
+ password: string,
+ persist: boolean
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/categories-api.ts b/src/wwwroot/scripts/api/categories-api.ts
new file mode 100644
index 0000000..1ca1d97
--- /dev/null
+++ b/src/wwwroot/scripts/api/categories-api.ts
@@ -0,0 +1,33 @@
+export function getCategories(withProducts: boolean = false): Promise<Response> {
+ return fetch(withProducts ? "/api/categories/with-products" : "/api/categories");
+}
+
+export function getCategory(categoryId: string): Promise<Response> {
+ return fetch("/api/categories/" + categoryId);
+}
+
+export function createCategory(name: string, disabled: boolean): Promise<Response> {
+ return fetch("/api/categories/create?" + new URLSearchParams({
+ name
+ }));
+}
+
+export function updateCategory(categoryId: string, newName: string): Promise<Response> {
+ return fetch("/api/categories/" + categoryId + "/update?" + new URLSearchParams({
+ newName
+ }));
+}
+
+export function deleteCategory(categoryId: string): Promise<Response> {
+ return fetch("/api/categories/" + categoryId + "/delete", {
+ method: "delete"
+ });
+}
+
+export function enableCategory(categoryId: string): Promise<Response> {
+ return fetch("/api/categories/" + categoryId + "/enable");
+}
+
+export function disableCategory(categoryId: string): Promise<Response> {
+ return fetch("/api/categories/" + categoryId + "/disable");
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/categories-api.types.ts b/src/wwwroot/scripts/api/categories-api.types.ts
new file mode 100644
index 0000000..7040cea
--- /dev/null
+++ b/src/wwwroot/scripts/api/categories-api.types.ts
@@ -0,0 +1,17 @@
+import {Base} from "./db-base";
+import {Product} from "./products-api.types";
+
+export interface Category extends Base {
+ name: string,
+ slug: string,
+ visibilityState: CategoryVisibility,
+ disabled: boolean,
+ deleted: boolean,
+ products: Array<Product>
+}
+
+export enum CategoryVisibility {
+ Default = 0,
+ Disabled = 1,
+ Deleted = 2
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/db-base.ts b/src/wwwroot/scripts/api/db-base.ts
new file mode 100644
index 0000000..a6593a1
--- /dev/null
+++ b/src/wwwroot/scripts/api/db-base.ts
@@ -0,0 +1,3 @@
+export interface Base {
+ id: string,
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/documents-api.ts b/src/wwwroot/scripts/api/documents-api.ts
new file mode 100644
index 0000000..f458f6c
--- /dev/null
+++ b/src/wwwroot/scripts/api/documents-api.ts
@@ -0,0 +1,24 @@
+export function uploadDocumentImages(files: Array<File>): Promise<Response> {
+ if (files.length <= 0) throw new Error("files.length was " + files.length);
+ const data = new FormData();
+ for (const file of files)
+ data.append("files", file);
+
+ return fetch("/api/documents/upload-images", {
+ method: "post",
+ body: data
+ });
+}
+
+export function getDocument(documentType: string) {
+ return fetch("/api/documents/" + documentType);
+}
+
+export function setDocument(documentType: string, content: string) {
+ const fd = new FormData();
+ fd.append("content", content);
+ return fetch("/api/documents/" + documentType, {
+ method: "post",
+ body: fd,
+ });
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/order-api.ts b/src/wwwroot/scripts/api/order-api.ts
new file mode 100644
index 0000000..eaacffe
--- /dev/null
+++ b/src/wwwroot/scripts/api/order-api.ts
@@ -0,0 +1,64 @@
+import {SubmitOrderPayload, ValidateOrderPayload} from "./order-api.types";
+
+export function validateOrderProducts(payload: ValidateOrderPayload): Promise<Response> {
+ return fetch("/api/orders/validate-products", {
+ headers: {
+ "Content-Type": "application/json;charset=utf-8"
+ },
+ body: JSON.stringify(payload),
+ method: "post",
+ credentials: "include"
+ });
+}
+
+export function validateOrder(payload: ValidateOrderPayload): Promise<Response> {
+ return fetch("/api/orders/validate", {
+ headers: {
+ "Content-Type": "application/json;charset=utf-8"
+ },
+ body: JSON.stringify(payload),
+ method: "post",
+ credentials: "include"
+ });
+}
+
+export function getOrderDetails(id): Promise<Response> {
+ return fetch("/api/orders/" + id + "/details", {
+ credentials: "include"
+ });
+}
+
+export function captureVippsOrder(id: String): Promise<Response> {
+ return fetch("/api/orders/" + id + "/capture")
+}
+
+export function cancelOrder(id: String): Promise<Response> {
+ return fetch("/api/orders/" + id + "/cancel")
+}
+
+export function refundOrder(id: String): Promise<Response> {
+ return fetch("/api/orders/" + id + "/refund")
+}
+
+export function submitOrder(payload: SubmitOrderPayload): Promise<Response> {
+ return fetch("/api/orders/submit", {
+ headers: {
+ "Content-Type": "application/json;charset=utf-8"
+ },
+ body: JSON.stringify(payload),
+ method: "post",
+ credentials: "include"
+ });
+}
+
+export function getOrders(filter?: string): Promise<Response> {
+ return fetch("/api/orders?filter=" + filter, {
+ credentials: "include"
+ });
+}
+
+export function getOrder(id): Promise<Response> {
+ return fetch("/api/orders/" + id, {
+ credentials: "include"
+ });
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/order-api.types.ts b/src/wwwroot/scripts/api/order-api.types.ts
new file mode 100644
index 0000000..8f4ca25
--- /dev/null
+++ b/src/wwwroot/scripts/api/order-api.types.ts
@@ -0,0 +1,39 @@
+import {Base} from "./db-base";
+
+export interface ValidateOrderPayload {
+ products: Array<ProductValidationDto>
+}
+
+export interface Order extends Base {
+ comment: string,
+ paymentType: OrderPaymentType,
+ status: OrderStatus,
+ ContactInfo: ContactInformation,
+ ProductIds: Array<string>
+}
+
+export interface SubmitOrderPayload extends Order {
+}
+
+export interface ContactInformation {
+ name: string,
+ phoneNumber: string,
+ emailaddress: string
+}
+
+export interface ProductValidationDto {
+ id: string,
+ count: number
+}
+
+export enum OrderPaymentType {
+ Vipps = 0,
+ InvoiceByEmail = 1
+}
+
+export enum OrderStatus {
+ InProgress = 0,
+ Completed = 3,
+ Canceled = 1,
+ Failed = 2
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/products-api.ts b/src/wwwroot/scripts/api/products-api.ts
new file mode 100644
index 0000000..6069830
--- /dev/null
+++ b/src/wwwroot/scripts/api/products-api.ts
@@ -0,0 +1,59 @@
+import {CreateProductPayload, Product} from "./products-api.types";
+
+export function createProduct(payload: CreateProductPayload): Promise<Response> {
+ return fetch("/api/products/create", {
+ headers: {
+ "Content-Type": "application/json;charset=utf-8"
+ },
+ body: JSON.stringify(payload),
+ method: "post",
+ credentials: "include"
+ });
+}
+
+export function getProduct(id: string): Promise<Response> {
+ return fetch("/api/products/" + id, {
+ method: "get",
+ credentials: "include"
+ });
+}
+
+export function getProducts(): Promise<Response> {
+ return fetch("/api/products", {
+ method: "get",
+ credentials: "include"
+ });
+}
+
+export function uploadProductImages(files: Array<File>): Promise<Response> {
+ if (files.length <= 0) throw new Error("files.length was " + files.length);
+ const data = new FormData();
+ for (const file of files)
+ data.append("files", file);
+
+ return fetch("/api/products/upload-images", {
+ method: "post",
+ body: data
+ });
+}
+
+export function deleteProduct(id: string): Promise<Response> {
+ return fetch("/api/products/" + id + "/delete", {
+ method: "delete",
+ credentials: "include"
+ });
+}
+
+export function updateProduct(data: Product): Promise<Response> {
+ if (!data.id) {
+ throw new Error("data.id was undefined");
+ }
+ return fetch("/api/products/" + data.id + "/update", {
+ method: "post",
+ headers: {
+ "Content-Type": "application/json;charset=utf-8"
+ },
+ body: JSON.stringify(data),
+ credentials: "include"
+ });
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/products-api.types.ts b/src/wwwroot/scripts/api/products-api.types.ts
new file mode 100644
index 0000000..f4fdd5e
--- /dev/null
+++ b/src/wwwroot/scripts/api/products-api.types.ts
@@ -0,0 +1,35 @@
+import {Base} from "./db-base";
+import {Category} from "./categories-api.types";
+
+export interface Product extends Base {
+ name: string,
+ description: string,
+ price: number,
+ priceSuffix: PriceSuffix,
+ visibilityState: ProductVisibility,
+ category: Category,
+ images: Array<Image>,
+ slug: string,
+ disabled: boolean,
+ deleted: boolean
+}
+
+export interface CreateProductPayload extends Product {
+}
+
+export interface Image {
+ order: number,
+ fileName: string
+}
+
+export enum PriceSuffix {
+ Money = 0,
+ Kilos = 1,
+ Per = 2
+}
+
+export enum ProductVisibility {
+ Default = 0,
+ Disabled = 1,
+ Deleted = 2
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/api/settings-api.ts b/src/wwwroot/scripts/api/settings-api.ts
new file mode 100644
index 0000000..7f7e482
--- /dev/null
+++ b/src/wwwroot/scripts/api/settings-api.ts
@@ -0,0 +1,17 @@
+export function setOrderEmailList(payload: string[]): Promise<Response> {
+ return fetch("/api/settings/order-emails", {
+ headers: {
+ "Content-Type": "application/json;charset=utf-8"
+ },
+ body: JSON.stringify(payload),
+ method: "post",
+ credentials: "include"
+ });
+}
+
+export function getOrderEmailList(): Promise<Response> {
+ return fetch("/api/settings/order-emails", {
+ method: "get",
+ credentials: "include"
+ });
+}
diff --git a/src/wwwroot/scripts/api/settings-api.types.ts b/src/wwwroot/scripts/api/settings-api.types.ts
new file mode 100644
index 0000000..fe9864a
--- /dev/null
+++ b/src/wwwroot/scripts/api/settings-api.types.ts
@@ -0,0 +1,3 @@
+export interface SettingsApiTypes {
+
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/back/bestillinger.js b/src/wwwroot/scripts/back/bestillinger.js
new file mode 100644
index 0000000..17b56d5
--- /dev/null
+++ b/src/wwwroot/scripts/back/bestillinger.js
@@ -0,0 +1,321 @@
+import Grid from "../grid";
+import {strings} from "../i10n";
+import {$, doc, pageInit, toaster} from "../base";
+import {eyeIcon} from "../icons";
+import {utilites} from "../utilities";
+import {messages} from "../messages";
+import {cancelOrder, captureVippsOrder, getOrderDetails, getOrders, refundOrder} from "../api/order-api";
+import Modal from "bootstrap/js/src/modal";
+
+if (location.pathname.startsWith("/kontoret/bestillinger")) {
+ const ordersLoader = $("#orders-loader");
+ const ordersWrapper = $("#orders-wrapper");
+ const orderInfoModalEl = $("#order-info-modal");
+ const orderInfoModal = new Modal(orderInfoModalEl);
+
+ const grid = new Grid({
+ search: {
+ dataIds: ["orderReference", ["contactInfo", "name"], ["contactInfo", "emailAddress"], ["contactInfo", "phoneNumber"]],
+ },
+ strings: {
+ search: strings.languageSpesific.search,
+ nextPage: strings.languageSpesific.next_page,
+ previousPage: strings.languageSpesific.previous_page,
+ },
+ debug: location.href.includes("localhost"),
+ classes: {
+ table: "table table-bordered mt-3",
+ thead: "table-primary",
+ },
+ columns: [
+ {
+ dataId: "orderReference",
+ minWidth: "150px",
+ columnName: "Referanse",
+ className: "btn-link cursor-pointer",
+ click: (row) => openViewOrderModal(row),
+ },
+ {
+ columnName: "Navn",
+ dataId: ["contactInfo", "name"],
+ minWidth: "200px",
+ },
+ {
+ columnName: "E-postadresse",
+ dataId: ["contactInfo", "emailAddress"],
+ minWidth: "200px",
+ },
+ {
+ columnName: "Telefonnummer",
+ dataId: ["contactInfo", "phoneNumber"],
+ minWidth: "150px",
+ },
+ {
+ dataId: "created",
+ minWidth: "175px",
+ cellValue: (row) => utilites.toReadableDateString(new Date(row.created)),
+ columnName: "Dato",
+ },
+ {
+ minWidth: "150px",
+ columnName: "Status",
+ cellValue: (row) => {
+ const status = doc.createElement("span");
+ switch (row.status) {
+ case 0: {
+ status.innerText = "Pågående";
+ break;
+ }
+ case 1: {
+ status.innerText = "Kansellert";
+ break;
+ }
+ case 2: {
+ status.innerText = "Feilet";
+ status.classList.add("text-danger");
+ break;
+ }
+ case 3: {
+ status.innerText = "Fullført";
+ status.classList.add("text-success");
+ break;
+ }
+ case 4: {
+ status.innerText = "Venter på faktura";
+ break;
+ }
+ case 5: {
+ status.innerText = "Venter på vipps";
+ break;
+ }
+ }
+ return status;
+ },
+ },
+ {
+ columnName: "",
+ width: "40px",
+ minWidth: "40px",
+ cellValue: (row) => {
+ const viewOrder = doc.createElement("button");
+ viewOrder.className = "btn btn-link text-info shadow-none";
+ viewOrder.title = strings.languageSpesific.view + ` "${row.orderReference}"`;
+ viewOrder.innerHTML = eyeIcon();
+ viewOrder.onclick = () => openViewOrderModal(row);
+ return viewOrder;
+ },
+ },
+ ],
+ });
+
+ if (location.pathname.startsWith("/kontoret/bestillinger")) {
+ pageInit(() => {
+ renderProductsView();
+ });
+ }
+
+ function openViewOrderModal({id, orderReference}) {
+ orderInfoModalEl.querySelector(".modal-title").innerText = orderReference;
+ $("#loader").style.display = "";
+ $("#loaded").style.display = "none";
+
+ orderInfoModal.show();
+
+ getOrderDetails(id).then(res => {
+ if (res.ok) {
+ res.json().then(order => {
+ order = utilites.resolveReferences(order);
+ $("#contact-info-name").innerText = order.contactInformation.name;
+ $("#contact-info-emailAddress").innerHTML = `<a href='mailto:${order.contactInformation.emailAddress}'>${order.contactInformation.emailAddress}</a>`;
+ $("#contact-info-phoneNumber").innerHTML = `<a href='tel:${order.contactInformation.phoneNumber}'>${order.contactInformation.phoneNumber}</a>`;
+ $("#order-reference").innerText = order.orderReference;
+ $("#order-date").innerText = new Date(order.orderDate).toLocaleDateString();
+ $("#order-payment-type").innerText = utilites.getOrderPaymentName(order.paymentType);
+ $("#order-status").innerText = utilites.getOrderStatusName(order.status);
+ if (order.comment && order.comment !== "") {
+ $("#order-comment").innerText = order.comment;
+ $("#order-comment").style.display = "inline-block";
+ } else {
+ $("#order-comment").style.display = "none";
+ }
+
+ if (order.paymentType === 0) {
+ if ([
+ "SALE",
+ "RESERVED",
+ ].includes(order.vippsTransactionStatus)) {
+ $("#vipps-order-refund").classList.remove("d-none");
+ $("#vipps-order-refund").onclick = () => {
+ if (confirm("Er du sikker på at du vil refundere ordren " + order.orderReference)) {
+ $("#vipps-order-refund").classList.add("loading");
+ refundOrder(order.id).then(res => {
+ if (res.ok) {
+ toaster.success("Refundert", "Ordren er refundert, og vipps har startet refundering");
+ } else {
+ console.error("Received non-successful status code when submitting refund order command");
+ toaster.error("En feil oppstod", "Prøv å refundere i vipps portalen");
+ }
+ $("#vipps-order-refund").classList.remove("loading");
+ }).catch(err => {
+ $("#vipps-order-refund").classList.remove("loading");
+
+ console.error("refund order NetworkRequest failed");
+ toaster.error("En uventet feil oppstod");
+ console.error(err);
+ });
+ }
+ };
+ }
+
+ if ([
+ "SALE",
+ "RESERVED",
+ ].includes(order.vippsTransactionStatus)) {
+ $("#vipps-order-capture").classList.remove("d-none");
+ $("#vipps-order-capture").onclick = () => {
+ if (confirm("Er du sikker på at du vil fullføre ordren " + order.orderReference)) {
+ $("#vipps-order-capture").classList.add("loading");
+ captureVippsOrder(order.id).then(res => {
+ if (res.ok) {
+ toaster.success("Fullført", "Ordren er fullført, og vipps har registrert transaksjonen");
+ } else {
+ console.error("Received non-successful status code when submitting fulfill order command");
+ toaster.error("En feil oppstod", "Prøv å fullføre i vipps portalen");
+ }
+ $("#vipps-order-capture").classList.remove("loading");
+ }).catch(err => {
+ $("#vipps-order-capture").classList.remove("loading");
+ console.error("fulfill order NetworkRequest failed");
+ toaster.error("En uventet feil oppstod");
+ console.error(err);
+ });
+ }
+ };
+ }
+
+ if ([
+ "SALE",
+ "RESERVED",
+ ].includes(order.vippsTransactionStatus)) {
+ $("#vipps-order-cancel").classList.remove("d-none");
+ $("#vipps-order-cancel").onclick = () => {
+ if (confirm("Er du sikker på at du vil kansellere ordren " + order.orderReference)) {
+ $("#vipps-order-cancel").classList.add("loading");
+ cancelOrder(order.id).then(res => {
+ if (res.ok) {
+ toaster.success("Kansellert", "Ordren er kansellert");
+ } else {
+ console.error("Received non-successful status code when submitting cancel order command");
+ toaster.error("En feil oppstod", "Prøv å kansellere i vipps portalen");
+ }
+ $("#vipps-order-cancel").classList.remove("loading");
+ }).catch(err => {
+ $("#vipps-order-cancel").classList.remove("loading");
+ console.error("cancel order NetworkRequest failed");
+ toaster.error("En uventet feil oppstod");
+ console.error(err);
+ });
+ }
+ };
+ }
+
+
+ switch (order.vippsTransactionStatus) {
+ case "SALE":
+ $("#vipps-status").innerText = "Salg (fullført og overført)";
+ break;
+ case "RESERVED":
+ $("#vipps-status").innerText = "Reservert";
+ break;
+ case "CANCELLED":
+ $("#vipps-status").innerText = "Kansellert";
+ break;
+ case "REJECTED":
+ $("#vipps-status").innerText = "Avslått";
+ break;
+ case "SALE_FAILED":
+ $("#vipps-status").innerText = "Salg feilet";
+ break;
+ case "AUTO_CANCEL":
+ $("#vipps-status").innerText = "Automatisk kansellering";
+ break;
+ case "RESERVE_FAILED":
+ $("#vipps-status").innerText = "Reservering feilet";
+ break;
+ }
+ $("#vipps-link").innerHTML = `<a href='https://portal.vipps.no/61861/transactions/${order.vippsId}' target="_blank">Ã…pne bestillingen i Vipps-portalen</a>`;
+ $("#vipps-section").classList.remove("d-none");
+ } else {
+ $("#vipps-section").classList.add("d-none");
+ }
+
+ orderInfoModalEl.querySelector(".modal-body").style.display = "";
+
+ const productsBody = orderInfoModalEl.querySelector("tbody");
+ productsBody.innerHTML = "";
+ let productIndex = 1;
+ let totalPrice = 0;
+ for (const product of order.products) {
+ const rowItem = doc.createElement("tr");
+ const nrCell = doc.createElement("td");
+ nrCell.innerText = productIndex.toString();
+ const nameCell = doc.createElement("td");
+ nameCell.innerText = product.name;
+ const countCell = doc.createElement("td");
+ countCell.innerText = product.count;
+ const priceCell = doc.createElement("td");
+ const totalSum = product.payedPrice * product.count;
+ priceCell.innerText = `${product.payedPrice} (totalt: ${totalSum})`;
+
+ rowItem.appendChild(nrCell);
+ rowItem.appendChild(nameCell);
+ rowItem.appendChild(countCell);
+ rowItem.appendChild(priceCell);
+ productsBody.appendChild(rowItem);
+ productIndex++;
+ totalPrice += totalSum;
+ }
+ $("#order-total").innerText = totalPrice;
+ $("#loader").style.display = "none";
+ $("#loaded").style.display = "";
+ orderInfoModal.show();
+ });
+ } else {
+ toaster.error("En feil oppstod", "Kunne ikke hente ordren, prøv igjen snart!");
+ }
+ }).catch(error => {
+ console.error(error);
+ });
+ }
+
+ function renderProductsView() {
+ ordersWrapper.innerHTML = "";
+ ordersWrapper.classList.add("d-none");
+ ordersLoader.classList.remove("d-none");
+
+ getOrders("not-cancelled").then(res => {
+ if (res.ok) {
+ res.json().then(products => {
+ grid.render(ordersWrapper);
+ products = utilites.resolveReferences(products);
+ grid.refresh(products);
+ const queryOrderRef = new URL(location.href).searchParams.get("order");
+ if (queryOrderRef) {
+ const product = products.find(c => c.orderReference === queryOrderRef);
+ openViewOrderModal(product);
+ }
+ });
+ ordersWrapper.classList.remove("d-none");
+ ordersLoader.classList.add("d-none");
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_retrieve_orders,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(error => {
+ console.error(error);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+ }
+}
diff --git a/src/wwwroot/scripts/back/dokumenter.js b/src/wwwroot/scripts/back/dokumenter.js
new file mode 100644
index 0000000..c92bdbf
--- /dev/null
+++ b/src/wwwroot/scripts/back/dokumenter.js
@@ -0,0 +1,102 @@
+import {$, pageInit, toaster} from "../base";
+import Quill from "../vendor/quill";
+import {uploadDocumentImages, getDocument, setDocument} from "../api/documents-api";
+import {configuration} from "../configuration";
+import {utilites} from "../utilities";
+import {strings} from "../i10n";
+
+if (location.pathname.startsWith("/kontoret/dokumenter")) {
+ const documentSelect = $("#document-selector");
+ const publishButton = $("#publish-button");
+ const toolbarOptions = [["link", "image"],
+ ["bold", "italic", "underline", "strike"],
+ ["blockquote", "code-block"],
+ [{"header": 1}, {"header": 2}],
+ [{"list": "ordered"}, {"list": "bullet"}],
+ [{"script": "sub"}, {"script": "super"}],
+ [{"indent": "-1"}, {"indent": "+1"}],
+ [{"direction": "rtl"}],
+ [{"size": ["small", false, "large", "huge"]}],
+ [{"header": [1, 2, 3, 4, 5, 6, false]}],
+ [{"color": []}, {"background": []}],
+ [{"font": []}],
+ [{"align": []}],
+ ["clean"]];
+
+
+ pageInit(() => {
+ documentSelect.onchange = () => setDocumentContent();
+ publishButton.onclick = () => publishDocument();
+ const editor = new Quill("#editor", {
+ theme: "snow",
+ modules: {
+ toolbar: toolbarOptions,
+ blotFormatter: true,
+ imageDrop: true,
+ imageUploader: {
+ upload: (file) => new Promise(((resolve, reject) => {
+ uploadDocumentImages([file]).then(res => {
+ if (res.ok) {
+ res.json().then(fileNames => {
+ fileNames = utilites.resolveReferences(fileNames);
+ resolve(configuration.paths.documents + fileNames[0]);
+ });
+ } else {
+ reject(res);
+ }
+ }).catch(error => {
+ reject(error);
+ });
+ })),
+ },
+ },
+ });
+
+ function publishDocument() {
+ const html = editor.container.querySelector(".ql-editor").innerHTML;
+ if (!html || html === "<p><br></p>") return;
+ setDocument(documentSelect.value, html).then(res => {
+ if (res.ok) {
+ toaster.success("Dokumentet er publisert");
+ } else {
+ utilites.handleError(res, {
+ title: "Kunne ikke publisere dokumentet",
+ message: "Prøv igjen senere",
+ });
+ }
+ }).catch(error => {
+ console.error(error);
+ toaster.errorObj({
+ title: strings.languageSpesific.could_not_reach_server,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ });
+ }
+
+ function setDocumentContent() {
+ getDocument(documentSelect.value).then(res => {
+ if (res.ok) {
+ res.text().then(content => {
+ editor.setText("");
+ if (content) {
+ editor.clipboard.dangerouslyPasteHTML(0, content);
+ }
+ });
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.an_error_occured,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(error => {
+ console.error(error);
+ toaster.errorObj({
+ title: strings.languageSpesific.could_not_reach_server,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ });
+ }
+
+ setDocumentContent();
+ });
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/back/index.js b/src/wwwroot/scripts/back/index.js
new file mode 100644
index 0000000..5b71a8d
--- /dev/null
+++ b/src/wwwroot/scripts/back/index.js
@@ -0,0 +1,51 @@
+import {$, toaster} from "../base";
+import {logout, updatePassword} from "../api/account-api";
+import {Modal} from "bootstrap";
+import {utilites} from "../utilities";
+import {messages} from "../messages";
+import {strings} from "../i10n.ts";
+
+const updatePasswordModalElement = $("#update-password-modal");
+const updatePasswordModal = new Modal(updatePasswordModalElement);
+const logoutButton = $(".logout-btn");
+const newPasswordInput = $("#input-new-password");
+const submitNewPasswordFormButton = $("#submit-new-password-form");
+
+logoutButton.addEventListener("click", (e) => {
+ e.preventDefault();
+ if (confirm(strings.languageSpesific.are_you_sure)) {
+ logout().then((res) => {
+ if (res.status === 200) {
+ setTimeout(function () {
+ location.href = "/";
+ }, 500);
+ }
+ });
+ }
+});
+
+function initSetpasswordModal() {
+ newPasswordInput.value = "";
+ submitNewPasswordFormButton.addEventListener("click", () => {
+ if (newPasswordInput.value.length < 6) return;
+ submitNewPasswordFormButton.querySelector(".spinner-border").classList.remove("d-none");
+ submitNewPasswordFormButton.classList.add("disabled");
+ updatePassword(newPasswordInput.value).then(res => {
+ if (res.ok) {
+ toaster.success(strings.languageSpesific.new_password_is_applied);
+ newPasswordInput.value = "";
+ updatePasswordModal.hide();
+ } else {
+ utilites.handleError(res, messages.unknownError);
+ }
+ submitNewPasswordFormButton.querySelector(".spinner-border").classList.add("d-none");
+ submitNewPasswordFormButton.classList.remove("disabled");
+ });
+ });
+}
+
+$(".open-update-password-modal").addEventListener("click", (e) => {
+ e.preventDefault();
+ initSetpasswordModal();
+ updatePasswordModal.show();
+}); \ No newline at end of file
diff --git a/src/wwwroot/scripts/back/produkter.js b/src/wwwroot/scripts/back/produkter.js
new file mode 100644
index 0000000..ab8ecf6
--- /dev/null
+++ b/src/wwwroot/scripts/back/produkter.js
@@ -0,0 +1,671 @@
+import {$, $$, doc, toaster} from "../base";
+import {configuration} from "../configuration";
+import {utilites} from "../utilities";
+import {createCategory, deleteCategory, disableCategory, enableCategory, getCategories} from "../api/categories-api";
+import {createProduct, deleteProduct, getProducts, updateProduct, uploadProductImages} from "../api/products-api";
+import Modal from "bootstrap/js/dist/modal";
+import Grid from "../grid";
+import {messages} from "../messages";
+import {eyeIcon, pencilSquareIcon, plusIcon, threeDotsVerticalIcon, trashIcon} from "../icons";
+import {strings} from "../i10n.ts";
+
+let shouldReloadProductsView;
+const isProductsPage = location.pathname.startsWith("/kontoret/produkter");
+const inputImages = $("#input-images-row");
+const productsWrapper = $("#products");
+const productsLoader = $("#products-loader");
+const productForm = $("#product-form");
+const productCategoriesPickerElement = $("#product-category-picker-wrapper #picker");
+const productCategoriesPickerLoadingElement = $("#product-category-picker-wrapper #loader");
+const productModalElement = $("#product-modal");
+const submitProductFormButton = $("#submit-product-form");
+const submitProductFormButtonSpinner = $("#submit-product-form .spinner-border");
+const openProductModalButton = $("#open-product-modal");
+const productModalTitle = $("#product-modal-title");
+const productModal = isProductsPage ? new Modal(productModalElement, {
+ backdrop: "static",
+}) : undefined;
+
+const newCategoryForm = $("#new-category-form");
+const newCategoryName = $("#new-category-name");
+const categoryModalElement = $("#categories-modal");
+const categoryModal = isProductsPage ? new Modal(categoryModalElement) : undefined;
+const categoryListElement = $("#categories-modal #list-wrapper");
+const openCategoriesModalButton = $("#open-categories-modal");
+const categoryListLoadingElement = $("#categories-modal #loading-wrapper");
+
+if (isProductsPage) {
+ renderProductsView();
+ sessionStorage.removeItem(configuration.storageKeys.productForm.imageUrls);
+ openProductModalButton.addEventListener("click", () => openProductModal(undefined, undefined));
+ openCategoriesModalButton.addEventListener("click", openCategoriesModal);
+}
+
+/*
+ PRODUCTS
+*/
+
+const grid = new Grid({
+ search: {
+ dataIds: ["name", ["category", "name"]],
+ },
+ strings: {
+ search: strings.languageSpesific.search,
+ nextPage: strings.languageSpesific.next_page,
+ previousPage: strings.languageSpesific.previous_page,
+ },
+ classes: {
+ table: "table table-bordered mt-3",
+ thead: "table-primary",
+ },
+ columns: [
+ {
+ dataId: "name",
+ minWidth: "250px",
+ columnName: "Navn",
+ },
+ {
+ columnName: "Beskrivelse",
+ dataId: "description",
+ maxWidth: "250px",
+ minWidth: "250px",
+ width: "250px",
+ },
+ {
+ minWidth: "250px",
+ dataId: ["category", "name"],
+ columnName: "Kategori",
+ },
+ {
+ minWidth: "100px",
+ columnName: "Pris",
+ cellValue: (row) => row.price + row.readablePriceSuffix,
+ },
+ {
+ columnName: "",
+ width: "80px",
+ minWidth: "80px",
+ cellValue: (row) => {
+ const group = doc.createElement("div");
+ group.className = "btn-group";
+ const deleteProductButton = doc.createElement("button");
+ deleteProductButton.className = "btn btn-link text-danger shadow-none p-0 ps-3";
+ deleteProductButton.title = strings.languageSpesific.delete + ` "${row.name}"`;
+ deleteProductButton.innerHTML = trashIcon("22", "22");
+ deleteProductButton.onclick = () => removeProduct(row.id, row.name);
+ const editProductButton = doc.createElement("button");
+ editProductButton.className = "btn btn-link text-info shadow-none p-0";
+ editProductButton.title = strings.languageSpesific.edit + ` "${row.name}"`;
+ editProductButton.innerHTML = pencilSquareIcon();
+ editProductButton.onclick = () => openProductModal(row);
+ group.appendChild(editProductButton);
+ group.appendChild(deleteProductButton);
+ return group;
+ },
+ },
+ ],
+});
+
+function renderProductsView() {
+ productsWrapper.innerHTML = "";
+ productsWrapper.classList.add("d-none");
+ productsLoader.classList.remove("d-none");
+
+ getProducts().then(res => {
+ if (res.ok) {
+ res.json().then(products => {
+ grid.render(productsWrapper);
+ products = utilites.resolveReferences(products);
+ grid.refresh(products);
+ });
+ productsWrapper.classList.remove("d-none");
+ productsLoader.classList.add("d-none");
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_retrieve_products,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(error => {
+ console.error(error);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+}
+
+function removeProduct(id, name) {
+ if (!name || !id) return;
+ if (confirm(`${strings.languageSpesific.are_you_sure_you_want_to_delete} ${name}?`)) {
+ deleteProduct(id).then(res => {
+ if (res.ok) {
+ toaster.success(`${name} ${strings.languageSpesific.is_deleted_LC}`);
+ grid.removeByID(id);
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_delete_product,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(error => {
+ console.error(error);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+ }
+}
+
+
+function uploadFiles() {
+ const input = doc.createElement("input");
+ const maxFiles = 5;
+ const maxFileSize = 2 * 1024 * 1024;
+ input.type = "file";
+ input.multiple = true;
+ input.accept = "image/png,image/jpeg";
+ input.onchange = (e) => {
+ productForm.classList.add("loading");
+ const files = e.target.files;
+
+ if (files.length > maxFiles) {
+ toaster.error(strings.languageSpesific.too_many_files, strings.languageSpesific.max_five_files_at_a_time);
+ productForm.classList.remove("loading");
+ return;
+ }
+
+ for (const file of files) {
+ if (!input.accept.split(",").includes(file.type)) {
+ toaster.error(strings.languageSpesific.invalid_file, file.name + " " + strings.languageSpesific.has_invalid_file_format_LC);
+ productForm.classList.remove("loading");
+ return;
+ }
+ if (file.size > maxFileSize) {
+ toaster.error(strings.languageSpesific.too_big_file, file.name + " " + strings.languageSpesific.is_too_big_LC);
+ productForm.classList.remove("loading");
+ return;
+ }
+ }
+
+ uploadProductImages(files).then(res => {
+ if (res.ok) {
+ res.json().then(fileNameArray => {
+ fileNameArray = utilites.resolveReferences(fileNameArray);
+ const sessionStorageImages = utilites.getSessionStorageJSON(configuration.storageKeys.productForm.imageUrls) ?? [];
+ const newImages = [...sessionStorageImages];
+ for (let i = 0; i < fileNameArray.length; i++) {
+ newImages.push({
+ order: i,
+ fileName: fileNameArray[i],
+ });
+ }
+ utilites.setSessionStorageJSON(configuration.storageKeys.productForm.imageUrls, newImages);
+ renderProductFormImages(() => {
+ productForm.classList.remove("loading");
+ if (inputImages.childNodes.length > 3) {
+ inputImages.scrollLeft = inputImages.scrollWidth;
+ }
+ });
+ });
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_upload + " " + (files.length === 1
+ ? strings.languageSpesific.the_image.toLocaleLowerCase()
+ : strings.languageSpesific.the_images.toLocaleLowerCase()),
+ message: strings.languageSpesific.try_again_soon,
+ });
+ productForm.classList.remove("loading");
+ }
+ }).catch(error => {
+ console.error(error);
+ toaster.errorObj(messages.networkRequestFailed);
+ productForm.classList.remove("loading");
+ });
+ };
+ input.click();
+}
+
+function renderProductFormImages(cb) {
+ inputImages.innerHTML = "";
+ inputImages.appendChild(getAddImageCardButton());
+ let images = utilites.getSessionStorageJSON(configuration.storageKeys.productForm.imageUrls);
+ if (utilites.array.isEmpty(images)) return;
+ images = images.sort(img => img.order);
+ for (const image of images) {
+ inputImages.appendChild(generateProductFormImageColumn(image));
+ }
+ // drag to scroll
+ let pos = {top: 0, left: 0, x: 0, y: 0};
+ let mouseIsDown;
+ inputImages.addEventListener("mousemove", (e) => {
+ if (mouseIsDown) {
+ const dx = e.clientX - pos.x;
+ // scroll
+ inputImages.scrollLeft = pos.left - dx;
+ }
+ });
+ inputImages.addEventListener("mousedown", (e) => {
+ mouseIsDown = true;
+ inputImages.style.cursor = "grabbing";
+ inputImages.style.userSelect = "none";
+ pos = {
+ // current scroll
+ left: inputImages.scrollLeft,
+ top: inputImages.scrollTop,
+ // current mouse position
+ x: e.clientX,
+ y: e.clientY,
+ };
+ });
+ inputImages.addEventListener("mouseup", () => {
+ mouseIsDown = false;
+ inputImages.style.removeProperty("cursor");
+ inputImages.style.removeProperty("user-select");
+ });
+
+ if (typeof cb === "function") cb();
+}
+
+
+function getAddImageCardButton() {
+ const wrapper = doc.createElement("div");
+ wrapper.className = "col mw-100px";
+ const button = doc.createElement("div");
+ button.type = "button";
+ button.onclick = () => uploadFiles();
+ button.className = "btn btn-light p-3 d-flex align-items-center justify-content-center h-100 border-primary text-primary";
+ button.innerHTML = plusIcon("32", "32");
+ wrapper.appendChild(button);
+ return wrapper;
+}
+
+function deleteImageFromSessionStorage(image) {
+ const oldImages = utilites.getSessionStorageJSON(configuration.storageKeys.productForm.imageUrls);
+ const newImages = [];
+ for (const oldImage of oldImages)
+ if (oldImage.fileName !== image.fileName)
+ newImages.push(oldImage);
+ utilites.setSessionStorageJSON(configuration.storageKeys.productForm.imageUrls, newImages);
+ renderProductFormImages();
+}
+
+function generateProductFormImageColumn(image) {
+ const wrapper = doc.createElement("div");
+ wrapper.className = "col-3 product-form-image-thumbnail";
+
+ const card = doc.createElement("div");
+ card.className = "card";
+
+ const img = doc.createElement("img");
+ img.src = configuration.paths.products + image.fileName;
+ img.className = "card-img";
+ img.alt = strings.languageSpesific.picture_of_the_product;
+
+ const cardOverlay = doc.createElement("div");
+ cardOverlay.className = "card-img-overlay";
+
+ const dropdownWrapper = doc.createElement("div");
+ dropdownWrapper.className = "dropleft";
+
+ const contextMenuButton = doc.createElement("div");
+ contextMenuButton.className = "btn btn-light float-end context-menu-button";
+ contextMenuButton.setAttribute("data-bs-toggle", "dropdown");
+ contextMenuButton.setAttribute("aria-expanded", "false");
+ contextMenuButton.type = "button";
+ contextMenuButton.innerHTML = threeDotsVerticalIcon();
+
+ const dropdownMenu = doc.createElement("ul");
+ dropdownMenu.className = "dropdown-menu";
+
+ const deleteMenuItem = doc.createElement("li");
+ deleteMenuItem.innerText = `${strings.languageSpesific.delete} ${strings.languageSpesific.the_image.toLocaleLowerCase()}`;
+ deleteMenuItem.onclick = () => deleteImageFromSessionStorage(image);
+ deleteMenuItem.className = "text-danger dropdown-item";
+
+ dropdownMenu.appendChild(deleteMenuItem);
+ dropdownWrapper.appendChild(contextMenuButton);
+ dropdownWrapper.appendChild(dropdownMenu);
+ cardOverlay.appendChild(dropdownWrapper);
+ card.appendChild(img);
+ card.appendChild(cardOverlay);
+ wrapper.appendChild(card);
+ return wrapper;
+}
+
+function generateCategoryPickerItem(category, initialCategoryId = undefined) {
+ const wrapper = doc.createElement("div");
+ wrapper.className = "form-check form-check-inline";
+ const radio = doc.createElement("input");
+ radio.type = "radio";
+ radio.name = "category";
+ radio.className = "form-check-input";
+ radio.value = category.id;
+ radio.id = category.id;
+ if (initialCategoryId !== undefined && category.id === initialCategoryId) radio.checked = true;
+ const label = doc.createElement("label");
+ label.className = "form-check-label cursor-pointer";
+ label.innerHTML = category.disabled ? ("<span class='text-decoration-line-through'>" + category.name + "</span>") : category.name;
+ label.htmlFor = category.id;
+ wrapper.appendChild(radio);
+ wrapper.appendChild(label);
+ return wrapper;
+}
+
+function renderCategoriesPicker(initialCategoryId = undefined) {
+ productCategoriesPickerElement.innerHTML = "";
+ getCategories().then(res => {
+ if (res.ok) {
+ res.json().then(data => {
+ let i = 0;
+ data = utilites.resolveReferences(data);
+ data.forEach(category => {
+ i++;
+ if (i % 3 === 1) productCategoriesPickerElement.appendChild(doc.createElement("br"));
+ if (initialCategoryId !== undefined)
+ productCategoriesPickerElement.appendChild(generateCategoryPickerItem(category, initialCategoryId));
+ else
+ productCategoriesPickerElement.appendChild(generateCategoryPickerItem(category));
+ });
+ productCategoriesPickerLoadingElement.classList.add("d-none");
+ productCategoriesPickerElement.classList.remove("d-none");
+ });
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_retrieve_categories,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch((error) => {
+ console.error(error);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+}
+
+function submitProductForm() {
+ const id = productModalElement.dataset.id;
+ const isEditing = id !== "" && productModalElement.dataset.isEditing === "true";
+ const payload = {
+ name: $("#input-name").value,
+ price: $("#input-price").value,
+ priceSuffix: parseInt($("#input-price-suffix").value),
+ description: $("#input-description").value,
+ count: parseInt($("#input-count").value),
+ showOnFrontpage: $("input[name='show-on-frontpage']:checked")?.checked ?? false,
+ category: {
+ id: $("input[name='category']:checked").value,
+ },
+ images: [],
+ };
+
+ if (!payload.count && payload.count !== 0) payload.count = -1;
+
+ const images = utilites.getSessionStorageJSON(configuration.storageKeys.productForm.imageUrls);
+ if (images !== undefined) {
+ if (typeof images[0] !== "object") {
+ for (let i = 0; i < images.length; i++) {
+ payload.images.push({
+ order: i,
+ fileName: images[i],
+ });
+ }
+ } else {
+ payload.images = images;
+ }
+ }
+
+ if (isEditing) payload.id = id;
+ if (!payload.name || !payload.price || !payload.category.id) {
+ toaster.error(strings.languageSpesific.invalid_form);
+ return;
+ }
+
+ if (payload.price.substring(payload.price.lastIndexOf(".")).length > 3 || payload.price.split(".").length > 2) {
+ toaster.error(strings.languageSpesific.invalid_form);
+ return;
+ }
+
+ payload.price = parseFloat(payload.price);
+
+ const action = isEditing ? updateProduct(payload) : createProduct(payload);
+ productForm.classList.add("loading");
+ submitProductFormButton.classList.add("disabled");
+ submitProductFormButtonSpinner.classList.remove("d-none");
+ action.then((res) => {
+ if (res.ok) {
+ shouldReloadProductsView = true;
+ productModal.hide();
+ sessionStorage.removeItem(configuration.storageKeys.productForm.imageUrls);
+ productForm.classList.remove("loading");
+ submitProductFormButton.classList.remove("disabled");
+ submitProductFormButtonSpinner.classList.add("d-none");
+ } else {
+ utilites.handleError(res, {
+ title: isEditing ? strings.languageSpesific.could_not_update_the_product : strings.languageSpesific.could_not_add_the_product,
+ message: "Prøv igjen snart",
+ });
+ productForm.classList.remove("loading");
+ submitProductFormButton.classList.remove("disabled");
+ submitProductFormButtonSpinner.classList.add("d-none");
+ }
+ }).catch((error) => {
+ console.error(error);
+ toaster.errorObj(messages.networkRequestFailed);
+ productForm.classList.remove("loading");
+ submitProductFormButton.classList.remove("disabled");
+ submitProductFormButtonSpinner.classList.add("d-none");
+ });
+}
+
+function disposeNewProductModal() {
+ if (shouldReloadProductsView) {
+ renderProductsView();
+ shouldReloadProductsView = false;
+ }
+ sessionStorage.removeItem(configuration.storageKeys.productForm.imageUrls);
+ productModalElement.dataset.isEditing = "false";
+ productForm.reset();
+ productForm.classList.remove("loading");
+ submitProductFormButton.removeEventListener("click", submitProductForm);
+ console.log("disposed newProductModal");
+}
+
+function openProductModal(edit = undefined, initalCategoryId = undefined) {
+ productForm.reset();
+ productModalElement.addEventListener("hidden.bs.modal", disposeNewProductModal, {once: true});
+ submitProductFormButton.addEventListener("click", submitProductForm);
+ utilites.dom.restrictInputToNumbers($("#input-price"), ["."], true);
+ utilites.dom.restrictInputToNumbers($("#input-count"), ["+", "-"], true);
+
+ if (edit !== undefined) {
+ if (!utilites.array.isEmpty(edit.images)) {
+ utilites.setSessionStorageJSON(configuration.storageKeys.productForm.imageUrls, edit.images);
+ }
+ renderCategoriesPicker(edit.category.id);
+ productModalElement.dataset.isEditing = "true";
+ productModalElement.dataset.id = edit.id;
+ $("#input-name").value = edit.name;
+ $("#input-price").value = edit.price;
+ $("#input-price-suffix").value = edit.priceSuffix;
+ $("#input-count").value = edit.count;
+ $("#show-on-frontpage").checked = edit.showOnFrontpage;
+ $("#input-description").value = edit.description;
+ productModalTitle.innerText = strings.languageSpesific.edit + " " + edit.name;
+ $("#submit-product-form .text").innerText = strings.languageSpesific.save;
+ } else {
+ sessionStorage.removeItem(configuration.storageKeys.productForm.imageUrls);
+ productModalTitle.innerText = strings.languageSpesific.new_product;
+ $("#submit-product-form .text").innerText = strings.languageSpesific.create;
+ productModalElement.dataset.isEditing = "false";
+ productModalElement.dataset.id = "";
+ if (initalCategoryId !== undefined)
+ renderCategoriesPicker(initalCategoryId);
+ else
+ renderCategoriesPicker();
+ }
+ renderProductFormImages();
+ productModal.show();
+}
+
+
+/*
+ CATEGORIES
+*/
+
+function removeCategory(id, name) {
+ if (!id || !name) return;
+ if (confirm(`${strings.languageSpesific.are_you_sure_you_want_to_delete} ${name}?`)) {
+ deleteCategory(id).then(res => {
+ if (res.ok) {
+ shouldReloadProductsView = true;
+ renderCategoriesList();
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_delete_category,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(err => {
+ console.error(err);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+ }
+}
+
+function setCategoryState(id, name, disabled) {
+ if (typeof disabled !== "boolean" || !id || !name) return;
+ const actionName = disabled ? ` ${strings.languageSpesific.hide_V.toLocaleLowerCase()} ` : ` ${strings.languageSpesific.show_V.toLocaleLowerCase()} `;
+ const confirmText = `${strings.languageSpesific.are_you_sure_you_want_to} ${actionName} ${name} ${strings.languageSpesific.in_the_store.toLocaleLowerCase()}?`;
+ if (confirm(confirmText)) {
+ const action = disabled ? disableCategory(id) : enableCategory(id);
+ action.then(res => {
+ if (res.ok) {
+ shouldReloadProductsView = true;
+ renderCategoriesList();
+ } else {
+ utilites.handleError(res, {
+ title: `${strings.languageSpesific.could_not} ${actionName} ${name}`,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(err => {
+ console.error(err);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+ }
+}
+
+function generateCategoryListItem(category) {
+ const nameEl = doc.createElement("div");
+ nameEl.className = "flex-grow-1";
+ nameEl.innerText = category.name;
+
+ const disabledCheckEl = doc.createElement("div");
+ const disabledCheckInputEl = doc.createElement("input");
+ disabledCheckEl.className = "form-check form-switch";
+
+ if (category.disabled === true) {
+ disabledCheckEl.title = `${strings.languageSpesific.show} ${category.name} ${strings.languageSpesific.in_the_store}`;
+ disabledCheckInputEl.checked = false;
+ disabledCheckInputEl.onclick = (e) => {
+ e.preventDefault();
+ disabledCheckInputEl.checked = false;
+ setCategoryState(category.id, category.name, false);
+ };
+ } else if (category.disabled === false) {
+ disabledCheckEl.title = `${strings.languageSpesific.hide} ${category.name} ${strings.languageSpesific.in_the_store}`;
+ disabledCheckInputEl.checked = true;
+ disabledCheckInputEl.onclick = (e) => {
+ e.preventDefault();
+ disabledCheckInputEl.checked = true;
+ setCategoryState(category.id, category.name, true);
+ };
+ }
+ disabledCheckInputEl.type = "checkbox";
+ disabledCheckInputEl.className = "form-check-input";
+ disabledCheckEl.appendChild(disabledCheckInputEl);
+
+ const deleteButtonEl = doc.createElement("button");
+ deleteButtonEl.className = "btn btn-link text-danger";
+ deleteButtonEl.title = "Slett \"" + category.name + "\" for godt";
+ deleteButtonEl.innerHTML = trashIcon("22", "22");
+ deleteButtonEl.onclick = () => removeCategory(category.id, category.name);
+
+ const secondParent = doc.createElement("div");
+ secondParent.className = "d-flex align-items-center";
+ secondParent.appendChild(nameEl);
+ secondParent.appendChild(disabledCheckEl);
+ secondParent.appendChild(deleteButtonEl);
+
+ const parent = doc.createElement("div");
+ parent.className = "list-group-item";
+ parent.dataset.id = category.id;
+ parent.appendChild(secondParent);
+
+ return parent;
+}
+
+function renderCategoriesList() {
+ categoryListElement.innerHTML = "";
+ getCategories().then(res => {
+ if (res.ok) {
+ res.json().then(data => {
+ data = utilites.resolveReferences(data);
+ data.forEach(category => {
+ categoryListElement.appendChild(generateCategoryListItem(category));
+ });
+ categoryListLoadingElement.classList.add("d-none");
+ categoryListElement.classList.remove("d-none");
+ });
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_retrieve_categories,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(err => {
+ console.error(err);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+}
+
+function handleKeyUpWhenCategoriesModalIsVisible(e) {
+ if (utilites.dom.elementHasFocus(newCategoryName) && e.key === "Enter") {
+ e.preventDefault();
+ if (newCategoryName.value) {
+ newCategoryForm.classList.add("loading");
+ createCategory(newCategoryName.value).then(res => {
+ if (res.ok) {
+ shouldReloadProductsView = true;
+ renderCategoriesList();
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_add_the_category,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ newCategoryForm.classList.remove("loading");
+ }).catch(err => {
+ console.error(err);
+ toaster.errorObj(messages.networkRequestFailed);
+ });
+ } else {
+ toaster.error(strings.languageSpesific.name + " " + strings.languageSpesific.is_required_LC);
+ }
+ }
+}
+
+function disposeCategoriesModal() {
+ if (shouldReloadProductsView) {
+ renderProductsView();
+ shouldReloadProductsView = false;
+ }
+ newCategoryForm.reset();
+ doc.removeEventListener("keyup", handleKeyUpWhenCategoriesModalIsVisible);
+ console.log("disposed categoriesModal");
+}
+
+function openCategoriesModal() {
+ newCategoryForm.reset();
+ doc.addEventListener("keyup", handleKeyUpWhenCategoriesModalIsVisible);
+ categoryModalElement.addEventListener("hidden.bs.modal", disposeCategoriesModal, {
+ once: true,
+ });
+ renderCategoriesList();
+ categoryModal.show();
+}
diff --git a/src/wwwroot/scripts/base.js b/src/wwwroot/scripts/base.js
new file mode 100644
index 0000000..860cd34
--- /dev/null
+++ b/src/wwwroot/scripts/base.js
@@ -0,0 +1,84 @@
+import {Toaster} from "./toaster";
+import {configuration} from "./configuration";
+
+export const toaster = new Toaster();
+export const doc = document,
+ $$ = (s, o = doc) => o.querySelectorAll(s),
+ $ = (s, o = doc) => o.querySelector(s);
+
+function toggleDarkTheme() {
+ if (localStorage["dark-theme"] === "true") localStorage["dark-theme"] = "false";
+ else localStorage["dark-theme"] = "true";
+ setTheme();
+}
+
+function setTheme() {
+ if (localStorage["dark-theme"] === "true") {
+ document.getElementsByTagName("html")[0].setAttribute("dark-theme", "");
+ } else {
+ document.getElementsByTagName("html")[0].removeAttribute("dark-theme");
+ }
+}
+
+window.addEventListener("error", (e) => {
+ if (configuration.analytics.error) {
+ (async () => {
+ const error = {
+ msg: e.message,
+ line: e.lineno,
+ path: location.pathname,
+ filename: e.filename,
+ };
+ await fetch("/api/analytics/error", {
+ method: "post",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify(error),
+ });
+ })();
+ }
+});
+
+window.addEventListener("load", () => {
+ if (configuration.analytics.pageload && !location.pathname.startsWith("/kontoret")) {
+ (async () => {
+ //const loadTime = window.performance.timing.domContentLoadedEventEnd -
+ // window.performance.timing.navigationStart;
+ const loadTime = window.performance.timeOrigin - window.performance.now();
+ await fetch("/api/analytics/pageload", {
+ method: "post",
+ headers: {
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({time: loadTime, path: location.pathname}),
+ });
+ })();
+ }
+});
+
+// https://stackoverflow.com/a/18234317/11961742
+String.prototype.formatUnicorn = String.prototype.formatUnicorn || function () {
+ "use strict";
+ let str = this.toString();
+ if (arguments.length) {
+ const t = typeof arguments[0];
+ const args = ("string" === t || "number" === t) ?
+ Array.prototype.slice.call(arguments)
+ : arguments[0];
+
+ for (const key in args) {
+ str = str.replace(new RegExp("\\{" + key + "\\}", "gi"), args[key]);
+ }
+ }
+
+ return str;
+};
+
+setTheme();
+
+export function pageInit(cb) {
+ if (typeof cb === "function") cb();
+}
+
+doc.addEventListener("DOMContentLoaded", pageInit);
diff --git a/src/wwwroot/scripts/cart-core.js b/src/wwwroot/scripts/cart-core.js
new file mode 100644
index 0000000..c15d0af
--- /dev/null
+++ b/src/wwwroot/scripts/cart-core.js
@@ -0,0 +1,109 @@
+import {utilites} from "./utilities";
+import {configuration} from "./configuration";
+import {getProducts} from "./api/products-api";
+
+export function setCart(data) {
+ return utilites.setSessionStorageJSON(configuration.storageKeys.cart, data);
+}
+
+export function getCart() {
+ return utilites.getSessionStorageJSON(configuration.storageKeys.cart);
+}
+
+export function cartDispose() {
+ sessionStorage.removeItem(configuration.storageKeys.cart);
+}
+
+export function priceTotal() {
+ const cartData = getCart();
+ if (utilites.array.isEmpty(cartData)) {
+ return null;
+ }
+ let total = null;
+ for (const product of cartData) {
+ total += product.price * product.count;
+ }
+ return typeof total !== "number" ? total : total.toFixed(2) + ",-";
+}
+
+export function priceTax() {
+ const cartData = getCart();
+ if (utilites.array.isEmpty(cartData)) {
+ return null;
+ }
+ let total = null;
+ for (const product of cartData) {
+ total += product.price * product.count;
+ }
+ return typeof total !== "number" ? total : ((total) * 25 / 100).toFixed(2) + ",-";
+}
+
+export function updatePricesFromApi() {
+ return new Promise((ok, error) => {
+ const cartData = getCart();
+ if (!cartData) {
+
+ ok();
+ return;
+ }
+ getProducts().then(res => {
+ if (res.ok) {
+ res.json().then(apiProducts => {
+ apiProducts = utilites.resolveReferences(apiProducts);
+ for (const latestProduct of apiProducts) {
+ const index = cartData.findIndex(c => c.id === latestProduct.id);
+ if (index !== -1) {
+ cartData[index].price = latestProduct.price;
+ }
+ if (index !== -1) {
+ cartData[index].readablePrice = latestProduct.price + latestProduct.readablePriceSuffix;
+ }
+ }
+ setCart(cartData);
+ ok();
+ });
+ }
+ });
+ });
+}
+
+export function setProductCount(id, newCount) {
+ const cartData = getCart();
+ const productIndex = cartData.findIndex(c => c.id === id);
+ cartData[productIndex].count = newCount;
+ setCart(cartData);
+}
+
+export function removeProductFromCart(id, callback) {
+ const cartData = getCart();
+ if (utilites.array.isEmpty(cartData)) {
+ return;
+ }
+ const updatedCart = utilites.array.removeItemByIdAll(cartData, {id});
+ if (updatedCart.length === 0) {
+ cartDispose();
+ } else {
+ setCart(updatedCart);
+ }
+ if (typeof callback === "function") {
+ callback(updatedCart);
+ }
+}
+
+export function addOrUpdateProduct(product, callback) {
+ let cartData = getCart();
+ if (utilites.array.isEmpty(cartData)) {
+ cartData = [];
+ }
+ const indexOfCurrent = cartData.length === 0 ? -1 : cartData.findIndex(c => c.id === product.id);
+ if (indexOfCurrent === -1 && product !== undefined) { // adding
+ product.count = 1;
+ cartData.push(product);
+ } else if (indexOfCurrent !== -1) { // updating
+ cartData[indexOfCurrent] = product;
+ }
+ setCart(cartData);
+ if (typeof callback === "function") {
+ callback();
+ }
+}
diff --git a/src/wwwroot/scripts/components.js b/src/wwwroot/scripts/components.js
new file mode 100644
index 0000000..28d25f0
--- /dev/null
+++ b/src/wwwroot/scripts/components.js
@@ -0,0 +1,48 @@
+import {configuration} from "./configuration";
+import {doc} from "./base";
+
+export function getCounterControl(options = configuration.defaultParameters.counterControlOptions) {
+ const wrapper = doc.createElement("div");
+ wrapper.className = "number-input";
+
+ const count = doc.createElement("input");
+ count.inputMode = "numeric";
+ count.type = "number";
+ if (options.min !== undefined) {
+ count.min = options.min;
+ }
+ if (options.max !== undefined) {
+ count.max = options.max;
+ }
+ if (options.initialCount !== undefined) {
+ count.value = options.initialCount;
+ }
+ if (options.onChange !== undefined && typeof options.onChange === "function") {
+ count.addEventListener("change", (e) => {
+ options.onChange(e);
+ });
+ }
+
+ const minus = doc.createElement("button");
+ minus.innerHTML = "&#45;";
+ minus.onclick = (e) => {
+ count.stepDown();
+ count.dispatchEvent(new Event("change"));
+ };
+
+ const plus = doc.createElement("button");
+ plus.innerHTML = "&#43;";
+ plus.onclick = (e) => {
+ count.stepUp();
+ count.dispatchEvent(new Event("change"));
+ };
+
+ wrapper.appendChild(minus);
+ wrapper.appendChild(count);
+ wrapper.appendChild(plus);
+ return wrapper;
+}
+
+export function getSpinner() {
+ return `<div class="spinner-border text-primary" role="status"><span class="visually-hidden">Laster...</span></div>`;
+}
diff --git a/src/wwwroot/scripts/configuration.js b/src/wwwroot/scripts/configuration.js
new file mode 100644
index 0000000..418152d
--- /dev/null
+++ b/src/wwwroot/scripts/configuration.js
@@ -0,0 +1,41 @@
+export const configuration = {
+ storageKeys: {
+ cart: "cart",
+ productForm: {
+ imageUrls: "productForm.images",
+ },
+ },
+ debug: location.hostname !== "localhost",
+ analytics: {
+ pageload: false,
+ error: true,
+ },
+ cookies: {
+ culture: "vsh_culture",
+ },
+ paths: {
+ products: "/assets/images/products/",
+ documents: "/assets/images/documents/",
+ swaggerDoc: {
+ main: "/swagger/v1/swagger.json",
+ },
+ },
+ defaultParameters: {
+ counterControlOptions: {
+ min: undefined,
+ max: undefined,
+ initialCount: undefined,
+ onChange: undefined,
+ },
+ },
+ enums: {
+ orderStatus: {
+ IN_PROGRESS: 0,
+ CANCELLED: 0,
+ FAILED: 2,
+ COMPLETED: 3,
+ AWAITING_INVOICE: 4,
+ AWAITING_VIPPS: 5,
+ },
+ },
+};
diff --git a/src/wwwroot/scripts/front/handlekurv.js b/src/wwwroot/scripts/front/handlekurv.js
new file mode 100644
index 0000000..bb80b3e
--- /dev/null
+++ b/src/wwwroot/scripts/front/handlekurv.js
@@ -0,0 +1,256 @@
+import {utilites} from "../utilities";
+import {$, doc, pageInit} from "../base";
+import {
+ cartDispose,
+ getCart,
+ priceTax,
+ priceTotal,
+ removeProductFromCart,
+ setProductCount,
+ updatePricesFromApi,
+} from "../cart-core";
+
+import {getCounterControl} from "../components";
+import {strings} from "../i10n.ts";
+import {submitOrder} from "../api/order-api";
+import "bootstrap/js/dist/tab";
+
+const inputName = $("#input-name");
+const inputEmail = $("#input-email");
+const inputPhone = $("#input-phone");
+const inputComment = $("#input-comment");
+const invoiceMail = $("#invoice-mail");
+
+const orderSummaryWrapper = $("#order-summary-wrapper");
+const submitOrderWrapper = $("#submit-order-wrapper");
+const orderSummaryLoader = $("#order-summary-spinner");
+const total = $("#total-wrapper");
+
+function setOrderSummaryLoaderVisibility(show = false) {
+ if (show) {
+ orderSummaryWrapper.classList.add("d-none");
+ orderSummaryLoader.classList.remove("d-none");
+ } else {
+ orderSummaryWrapper.classList.remove("d-none");
+ orderSummaryLoader.classList.add("d-none");
+ }
+}
+
+function renderOverview() {
+ setOrderSummaryLoaderVisibility(true);
+ const cartData = getCart();
+ if (utilites.array.isEmpty(cartData)) {
+ const noItemsAlert = doc.createElement("div");
+ noItemsAlert.className = "alert alert-primary";
+ noItemsAlert.innerHTML = `${strings.languageSpesific.the_shopping_bag_is_empty}, ${strings.languageSpesific.go_to} <a href='/produktar'>/produktar</a> ${strings.languageSpesific.to_add_LC}`;
+ orderSummaryWrapper.appendChild(noItemsAlert);
+ setOrderSummaryLoaderVisibility(false);
+ orderSummaryWrapper.querySelector("table").classList.add("d-none");
+ total.classList.add("d-none");
+ submitOrderWrapper.classList.add("d-none");
+ return;
+ }
+ const tbody = orderSummaryWrapper.querySelector("tbody");
+ tbody.innerHTML = "";
+ for (const product of cartData)
+ tbody.appendChild(getProductTableRow(product));
+ updateTotal();
+ setOrderSummaryLoaderVisibility(false);
+}
+
+function updateTotal() {
+ total.querySelector("#total-sum").innerText = priceTotal();
+ total.querySelector("#total-tax").innerText = priceTax();
+}
+
+function getProductTableRow(product) {
+ const row = doc.createElement("tr");
+
+ const productCell = doc.createElement("td");
+ productCell.innerText = product.name;
+
+ const priceTotalCell = doc.createElement("td");
+ priceTotalCell.innerText = (product.price * product.count).toFixed(2) + ",-";
+
+ const countCell = doc.createElement("td");
+
+ const counterControl = getCounterControl({
+ initialCount: product.count,
+ min: "0",
+ max: product.maxCount,
+ onChange: (e) => {
+ const newCount = parseInt(e.target.value);
+ if (newCount === 0) {
+ removeProductFromCart(product.id, (updatedCart) => {
+ if (updatedCart.length >= 1) {
+ row.remove();
+ updateTotal();
+ } else {
+ renderOverview();
+ }
+ });
+ return;
+ }
+ setProductCount(product.id, newCount);
+ priceTotalCell.innerText = (product.price * newCount).toFixed(2) + ",-";
+ updateTotal();
+ },
+ });
+ counterControl.style.height = "30px";
+ countCell.appendChild(counterControl);
+
+ const priceCell = doc.createElement("td");
+ priceCell.innerText = product.readablePrice;
+
+ row.appendChild(productCell);
+ row.appendChild(countCell);
+ row.appendChild(priceCell);
+ row.appendChild(priceTotalCell);
+
+ return row;
+}
+
+function getOrderPayload() {
+ const payload = {
+ comment: inputComment.value,
+ contactInfo: {
+ name: inputName.value,
+ emailAddress: inputEmail.value,
+ phoneNumber: inputPhone.value,
+ },
+ products: [],
+ };
+ const cartData = getCart();
+ if (utilites.array.isEmpty(cartData)) return undefined;
+ for (const item of cartData) {
+ if (payload.products.findIndex(c => c.id === item.id) !== -1) continue;
+ payload.products.push({
+ id: item.id,
+ numberOfItems: item.count,
+ });
+ }
+ return payload;
+}
+
+function isSubmitOrderFormValid() {
+ return (
+ inputName.value &&
+ inputEmail.value &&
+ inputPhone.value &&
+ $("#vipps-terms-confirm").checked || $("#invoice-terms-confirm").checked
+ );
+}
+
+function submitOrderForm(type) {
+ if (isSubmitOrderFormValid()) {
+ const payload = getOrderPayload();
+ if (payload === undefined) return;
+ payload.paymentType = type;
+ $("#submit-order-form").classList.add("loading");
+ $("#form-errors").classList.add("d-none");
+ $("#form-errors").innerHTML = "";
+ submitOrder(payload).then(res => {
+ if (res.ok) {
+ res.text().then(continueTo => {
+ window.location.replace(continueTo.replaceAll("\"", ""));
+ });
+ } else {
+ console.log(res.headers.get("Content-Type"));
+ if (res.headers.get("Content-Type")?.startsWith("application/json")) {
+ res.json().then(errorJson => {
+ if (errorJson.isValid === false) {
+ errorJson = utilites.resolveReferences(errorJson);
+ for (const error of errorJson.errors) {
+ if (error.id == null) {
+ const listItem = doc.createElement("li");
+ if (error.errors.length === 1) {
+ listItem.innerText = error.errors[0];
+ } else {
+ let html;
+ for (const itemError of error.errors) {
+ html += itemError + "<br>";
+ }
+ listItem.innerHTML = html;
+ }
+ $("#form-errors").appendChild(listItem);
+ } else {
+ const cartproducts = getCart();
+ const errorProduct = cartproducts.find(c => c.id === error.id);
+ const listItem = doc.createElement("li");
+ if (error.errors.length === 1) {
+ listItem.innerHTML = `<b>${errorProduct.name}:</b> ${error.errors[0]}`;
+ } else {
+ let html = "";
+ for (const itemError of error.errors) {
+ html += `<b>${errorProduct.name}:</b> ${itemError} <br>`;
+ }
+ listItem.innerHTML = html;
+ }
+ $("#form-errors").appendChild(listItem);
+ }
+ }
+ $("#form-errors").classList.remove("d-none");
+ $("#submit-order-form").classList.remove("loading");
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.an_unknown_error_occured,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ $("#submit-order-form").classList.remove("loading");
+ }
+ });
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.an_unknown_error_occured,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ $("#submit-order-form").classList.remove("loading");
+ }
+ }
+ })
+ .catch(err => {
+ console.error(err);
+ });
+ }
+}
+
+window.disposeCart = () => {
+ cartDispose();
+ location.href = "/";
+};
+
+function handleCallbackError() {
+ const urlParams = new URLSearchParams(window.location.search);
+ const error = urlParams.get("error");
+ console.log(error);
+ switch (error) {
+ case "cancelled":
+ $("#order-alert").classList.remove("d-none");
+ $("#order-alert").innerHTML = "Din bestilling er kansellert! <span class='btn btn-link' onclick='disposeCart()' title='Slett handlekorgen'>Klikk her for å slette handlekorgen</span>";
+ break;
+ case "failed":
+ $("#order-alert").classList.remove("d-none");
+ $("#order-alert").innerHTML = "Bestillingen feilet, venlegst prøv igjen eller <a href='/#kontakt'>ta kontakt</a> med oss hvis problemet vedvarer!";
+ break;
+ }
+ urlParams.delete("error");
+}
+
+if (location.pathname.startsWith("/handlekorg")) {
+ pageInit(() => {
+ updatePricesFromApi().then(() => {
+ $(".submit-vipps").addEventListener("click", () => submitOrderForm(0));
+ $(".submit-invoice").addEventListener("click", () => submitOrderForm(1));
+ inputEmail.addEventListener("keyup", (e) => {
+ if (utilites.validators.isEmail(e.target.value)) {
+ invoiceMail.innerText = e.target.value;
+ } else {
+ invoiceMail.innerText = "din e-postadresse";
+ }
+ });
+
+ renderOverview();
+ });
+ handleCallbackError();
+ });
+}
diff --git a/src/wwwroot/scripts/front/logginn.js b/src/wwwroot/scripts/front/logginn.js
new file mode 100644
index 0000000..f15a323
--- /dev/null
+++ b/src/wwwroot/scripts/front/logginn.js
@@ -0,0 +1,92 @@
+import {$, pageInit} from "../base";
+import {utilites} from "../utilities";
+import {login} from "../api/account-api";
+import {strings} from "../i10n.ts";
+
+const submitButton = $("#submit");
+const submitButtonSpinner = $("#submit .spinner-border");
+const errorContainer = $("#error");
+const errorMessage = $("#error-message");
+const errorTitle = $("#error-title");
+const continueTo = new URL(location.href).searchParams.get("ReturnUrl")
+ ? new URL(location.href).searchParams.get("ReturnUrl")
+ : "/kontoret";
+const email = $("#input-email");
+const password = $("#input-password");
+const persist = $("#persist-session");
+const loginForm = $("#login-form");
+
+const loading = {
+ show() {
+ submitButton.classList.add("disabled");
+ submitButtonSpinner.classList.remove("d-none");
+ },
+ hide() {
+ submitButton.classList.remove("disabled");
+ submitButtonSpinner.classList.add("d-none");
+ },
+};
+
+const error = {
+ show(title = strings.languageSpesific.an_error_occured, message = strings.languageSpesific.try_again_soon) {
+ errorMessage.innerText = message;
+ errorTitle.innerText = title;
+ errorContainer.classList.remove("d-none");
+ },
+ hide() {
+ errorMessage.innerText = "";
+ errorTitle.innerText = "";
+ errorContainer.classList.add("d-none");
+ },
+};
+
+const form = {
+ submit() {
+ loading.show();
+ error.hide();
+ let payload = {
+ username: email.value,
+ password: password.value,
+ persist: persist.checked,
+ };
+ login(payload, $("input[name=\"xsrf\"]").value).then((response) => {
+ if (response.status === 200) {
+ error.hide();
+ location.href = continueTo;
+ } else {
+ utilites.handleError(response, {
+ title: strings.languageSpesific.an_unknown_error_occured,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ loading.hide();
+ }
+ }).catch((err) => console.log(err));
+ },
+ isValid() {
+ email.removeAttribute("aria-invalid");
+ password.removeAttribute("aria-invalid");
+ if (!email.value || !utilites.validators.isEmail(email.value)) {
+ error.show(undefined, strings.languageSpesific.the_email_address + " " + strings.languageSpesific.is_invalid_LC);
+ email.setAttribute("aria-invalid", "true");
+ return false;
+ }
+ if (!password.value) {
+ error.show(undefined, strings.languageSpesific.the_password + " " + strings.languageSpesific.is_invalid_LC);
+ password.setAttribute("aria-invalid", "true");
+ return false;
+ }
+ return true;
+ },
+};
+
+if (location.pathname.startsWith("/logginn")) {
+ pageInit(() => {
+ loginForm.addEventListener("submit", (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ if (form.isValid()) {
+ form.submit();
+ }
+ });
+ });
+}
diff --git a/src/wwwroot/scripts/front/produkter.js b/src/wwwroot/scripts/front/produkter.js
new file mode 100644
index 0000000..86a2afb
--- /dev/null
+++ b/src/wwwroot/scripts/front/produkter.js
@@ -0,0 +1,341 @@
+import {validateOrderProducts} from "../api/order-api";
+import {$, $$, doc, pageInit, toaster} from "../base";
+import Modal from "bootstrap/js/dist/modal";
+import Carousel from "bootstrap/js/dist/carousel";
+import {utilites} from "../utilities";
+import {
+ addOrUpdateProduct,
+ cartDispose,
+ getCart,
+ priceTotal,
+ removeProductFromCart,
+ setProductCount,
+} from "../cart-core";
+import {getCounterControl} from "../components";
+import {messages} from "../messages";
+import {strings} from "../i10n.ts";
+
+const headerCartButton = $("#header-cart-button");
+const headerCartButtonCount = $("#header-cart-button #item-count");
+const cartViewRoot = $("#cart-modal #product-list");
+const submitCartButton = $("#cart-modal .submit-cart");
+const cartModalElement = $("#cart-modal");
+const cartModal = new Modal(cartModalElement, {
+ keyboard: false,
+});
+
+const isProductPage = location.pathname.startsWith("/produktar") && location.pathname.match(/\/./g).length === 3;
+const isProductsGridPage = location.pathname.startsWith("/produktar") && location.pathname.match(/\/./g).length <= 2;
+
+if (!location.pathname.startsWith("/handlekorg")) {
+ pageInit(() => {
+ renderHeaderIcon(false);
+ renderProductButtons();
+ cartModalElement.addEventListener("show.bs.modal", () => {
+ renderCartView();
+ renderTotalView();
+ });
+ headerCartButton.addEventListener("click", () => cartModal.toggle());
+ submitCartButton.addEventListener("click", () => submitCart());
+ });
+} else {
+ headerCartButton.classList.add("d-none");
+}
+
+if (location.pathname.match("(\/produktar\/.*\/.*)") !== null && $("#carousel-navigator") !== null) {
+ const carousel = new Carousel($("#product-carousel"));
+ $$(".thumb-button").forEach(el => {
+ const index = el.dataset.thumbIndex;
+ el.onclick = () => carousel.to(index);
+ });
+}
+
+function dispose() {
+ cartDispose();
+ renderHeaderIcon();
+ renderCartView();
+ renderTotalView();
+ renderProductButtons();
+}
+
+function renderProductButtons() {
+ const cartData = getCart();
+ if (isProductPage) {
+ const productWrapper = $("#single-product-wrapper");
+ const productId = productWrapper.dataset.id;
+ const productIndex = utilites.array.isEmpty(cartData) ? -1 : cartData.findIndex(c => c.id === productId);
+ const bagButton = productWrapper.querySelector(".buttons .bag-button") ?? doc.createElement("dummy");
+ const counterWrapper = productWrapper.querySelector(".buttons .counter-wrapper") ?? doc.createElement("dummy");
+ bagButton.classList.remove("disabled");
+ counterWrapper.innerHTML = "";
+
+ if (productIndex !== -1) {
+ const maxProductCount = bagButton.dataset.productMaxCount === "-1" ? 99999 : bagButton.dataset.productMaxCount;
+ const minProductCount = "0";
+ const product = cartData[productIndex];
+ bagButton.classList.add("d-none");
+ counterWrapper.appendChild(getCounterControl({
+ initialCount: product.count,
+ min: minProductCount,
+ max: maxProductCount,
+ onChange: (e) => {
+ let newCount = e.target.value;
+ if (newCount <= minProductCount) {
+ removeProduct(product.id);
+ bagButton.classList.remove("d-none");
+ return;
+ }
+
+ if (newCount > maxProductCount) newCount = maxProductCount;
+ setProductCount(product.id, parseInt(newCount));
+ renderHeaderIcon();
+ $$("[data-id='" + product.id + "'] .counter-wrapper").forEach(el => {
+ el.querySelector(".number-input input").value = parseInt(newCount);
+ });
+ },
+ }));
+ } else {
+ bagButton.innerHTML = "Legg i handlekorgen";
+ bagButton.onclick = () => addProduct(productId);
+ bagButton.classList.remove("d-none");
+ }
+ } else if (isProductsGridPage) {
+ $$(".product-card").forEach(productCard => {
+ const productId = productCard.dataset.id;
+ const bagButton = productCard.querySelector(".buttons .bag-button") ?? doc.createElement("dummy");
+ const counterWrapper = productCard.querySelector(".buttons .counter-wrapper") ?? doc.createElement("dummy");
+ const productIndex = utilites.array.isEmpty(cartData) ? -1 : cartData.findIndex(c => c.id === productId);
+ bagButton.classList.remove("disabled");
+ counterWrapper.innerHTML = "";
+
+ if (productIndex !== -1) {
+ const maxProductCount = bagButton.dataset.productMaxCount === "-1" ? 99999 : bagButton.dataset.productMaxCount;
+ const minProductCount = "0";
+ const product = cartData[productIndex];
+ bagButton.innerHTML = "Legg i handlekorgen";
+ bagButton.classList.add("d-none");
+ counterWrapper.appendChild(getCounterControl({
+ initialCount: product.count,
+ min: minProductCount,
+ max: maxProductCount,
+ onChange: (e) => {
+ let newCount = e.target.value;
+ if (newCount <= minProductCount) {
+ removeProduct(product.id);
+ bagButton.classList.remove("d-none");
+ return;
+ }
+ if (newCount > maxProductCount) newCount = maxProductCount;
+ setProductCount(product.id, parseInt(newCount));
+ renderHeaderIcon();
+ $$("[data-id='" + product.id + "'] .counter-wrapper").forEach(el => {
+ el.querySelector(".number-input input").value = parseInt(newCount);
+ });
+
+ },
+ }));
+ } else {
+ bagButton.innerHTML = "Legg i handlekorgen";
+ bagButton.onclick = () => addProduct(productId);
+ bagButton.classList.remove("d-none");
+ }
+ });
+ }
+}
+
+function getProductDataFromHtml(id) {
+ if (isProductsGridPage) {
+ const card = $(".product-card[data-id='" + id + "']");
+ if (card === undefined) return card;
+ const bagButton = card.querySelector(".bag-button");
+ return {
+ id: id,
+ name: card.querySelector(".card-title").innerText,
+ price: card.querySelector(".product-price").dataset.price,
+ readablePrice: card.querySelector(".product-price").innerText,
+ maxCount: bagButton.dataset.productMaxCount === "-1" ? 99999 : bagButton.dataset.productMaxCount,
+ };
+ } else if (isProductPage) {
+ const productWrapper = $("#single-product-wrapper[data-id='" + id + "']");
+ if (productWrapper === undefined) return productWrapper;
+ const bagButton = productWrapper.querySelector(".bag-button");
+ return {
+ id: id,
+ name: productWrapper.querySelector(".title").innerText,
+ description: productWrapper.querySelector(".description").innerText,
+ price: productWrapper.querySelector(".product-price").dataset.price,
+ readablePrice: productWrapper.querySelector(".product-price").innerText,
+ maxCount: bagButton.dataset.productMaxCount === "-1" ? 99999 : bagButton.dataset.productMaxCount,
+ };
+ }
+}
+
+function addProduct(id) {
+ addOrUpdateProduct(getProductDataFromHtml(id), () => {
+ renderHeaderIcon();
+ renderProductButtons();
+ });
+}
+
+function removeProduct(id) {
+ removeProductFromCart(id, () => {
+ renderHeaderIcon();
+ renderTotalView();
+ renderCartView();
+ renderProductButtons();
+ });
+}
+
+function renderHeaderIcon() {
+ const cartData = getCart();
+ if (utilites.array.isEmpty(cartData)) {
+ headerCartButtonCount.innerText = "0";
+ return;
+ }
+ const currentCount = parseInt(headerCartButtonCount.innerText);
+ let count = 0;
+ for (const product of cartData)
+ count += product.count;
+
+ if (currentCount !== count) {
+ headerCartButtonCount.innerText = count >= 1 ? count : "0";
+ }
+}
+
+function getProductListItemHTML(product) {
+ console.log(product);
+ const wrapper = doc.createElement("div");
+ wrapper.dataset.id = product.id;
+ wrapper.className = "mb-3";
+
+ const card = doc.createElement("div");
+ card.className = "card";
+
+ const cardHeaderWrapper = doc.createElement("div");
+ cardHeaderWrapper.className = "card-header d-flex justify-content-between align-items-center";
+
+ const cardHeader = doc.createElement("h5");
+ cardHeader.className = "mb-0";
+ cardHeader.innerText = product.name;
+ cardHeaderWrapper.appendChild(cardHeader);
+ const removeProductButton = doc.createElement("button");
+ removeProductButton.className = "btn btn-link shadow-none text-danger pe-0";
+ removeProductButton.innerText = "Slett";
+ removeProductButton.onclick = () => removeProduct(product.id);
+ cardHeaderWrapper.appendChild(removeProductButton);
+
+ card.appendChild(cardHeaderWrapper);
+ const cardBody = doc.createElement("div");
+ cardBody.className = "card-body";
+
+ const itemCountWrapper = doc.createElement("div");
+ itemCountWrapper.className = "d-flex justify-content-between align-items-center";
+
+ itemCountWrapper.appendChild(getCounterControl({
+ initialCount: product.count,
+ min: "0",
+ max: product.maxCount,
+ onChange: (e) => {
+ let newCount = e.target.value;
+ if (newCount <= "0") {
+ removeProduct(product.id);
+ return;
+ }
+ if (newCount > product.maxCount) newCount = product.maxCount;
+ setProductCount(product.id, parseInt(newCount));
+ renderHeaderIcon();
+ $$("[data-id='" + product.id + "'] .counter-wrapper").forEach(el => {
+ el.querySelector(".number-input input").value = newCount;
+ });
+ renderTotalView();
+ },
+ }));
+
+ const price = doc.createElement("div");
+ price.className = "h3";
+ price.innerText = product.readablePrice;
+ itemCountWrapper.appendChild(price);
+
+
+ cardBody.append(itemCountWrapper);
+ card.appendChild(cardBody);
+ wrapper.appendChild(card);
+ return wrapper;
+}
+
+function renderTotalView() {
+ const cartTotal = priceTotal();
+ if (cartTotal == null) {
+ $("#cart-modal .modal-footer").classList.add("d-none");
+ $("#total").innerText = "";
+ } else {
+ $("#cart-modal .modal-footer").classList.remove("d-none");
+ $("#total").innerText = cartTotal;
+ }
+}
+
+function renderCartView() {
+ const cartData = getCart();
+ cartViewRoot.innerHTML = "";
+ if (utilites.array.isEmpty(cartData)) {
+ const noItemsAlert = doc.createElement("div");
+ noItemsAlert.className = "alert alert-primary";
+ noItemsAlert.role = "alert";
+ noItemsAlert.innerHTML = `${strings.languageSpesific.the_shopping_bag_is_empty}, ${strings.languageSpesific.go_to_LC} <a href='/produktar'>/produktar</a> ${strings.languageSpesific.to_add_LC}`;
+ cartViewRoot.appendChild(noItemsAlert);
+ } else {
+ for (const product of cartData)
+ cartViewRoot.appendChild(getProductListItemHTML(product));
+ }
+}
+
+function validateCartModal() {
+ return new Promise((greatSuccess, graveFailure) => {
+ const payload = {
+ products: [],
+ };
+
+ const cartData = getCart();
+ if (utilites.array.isEmpty(cartData)) {
+ toaster.error(strings.languageSpesific.the_shopping_bag_is_empty);
+ return;
+ }
+
+ for (const product of cartData) {
+ payload.products.push({
+ id: product.id,
+ count: product.count,
+ });
+ }
+
+ validateOrderProducts(payload).then(res => {
+ if (res.ok) {
+ res.json().then(json => {
+ if (json.isValid) {
+ return greatSuccess(true);
+ } else {
+ toaster.error(strings.languageSpesific.invalid_form);
+ //TODO: show validation errors
+ return greatSuccess(false);
+ }
+ });
+ } else {
+ utilites.handleError(res, {
+ title: strings.languageSpesific.could_not_validate_your_order,
+ message: strings.languageSpesific.try_again_soon,
+ });
+ }
+ }).catch(err => {
+ console.error(err);
+ toaster.errorObj(messages.unknownError);
+ });
+ });
+}
+
+function submitCart() {
+ validateCartModal().then(isValid => {
+ if (isValid === true) {
+ location.href = "/handlekorg";
+ }
+ });
+}
diff --git a/src/wwwroot/scripts/front/status.js b/src/wwwroot/scripts/front/status.js
new file mode 100644
index 0000000..3addfac
--- /dev/null
+++ b/src/wwwroot/scripts/front/status.js
@@ -0,0 +1,10 @@
+import {cartDispose} from "../cart-core";
+import {pageInit} from "../base";
+
+if (location.pathname.startsWith("/status")) {
+ pageInit(() => {
+ const urlParams = new URLSearchParams(window.location.search);
+ const clearCart = urlParams.get("clearCart");
+ if (clearCart) cartDispose();
+ });
+}
diff --git a/src/wwwroot/scripts/grid.ts b/src/wwwroot/scripts/grid.ts
new file mode 100644
index 0000000..ecf708b
--- /dev/null
+++ b/src/wwwroot/scripts/grid.ts
@@ -0,0 +1,390 @@
+import * as JsSearch from "js-search";
+
+interface GridProps {
+ id?: string;
+ debug?: boolean;
+ data: Array<Object>;
+ columns: Array<GridColumn>;
+ pageSize?: number;
+ search?: SearchConfiguration;
+ classes?: GridClasses
+ strings?: GridStrings
+}
+
+interface GridConfiguration {
+ id: string;
+ debug: boolean;
+ data: Array<Object>;
+ columns: Array<GridColumn>;
+ pageSize: number;
+ search: SearchConfiguration;
+ classes: GridClasses,
+ strings: GridStrings
+}
+
+interface GridStrings {
+ previousPage: string,
+ nextPage: string,
+ search: string
+}
+
+interface GridClasses {
+ table: string,
+ thead: string
+}
+
+interface SearchConfiguration {
+ dataIds: Array<string | Array<string>>;
+}
+
+interface GridColumn {
+ dataId?: string | Array<string>;
+ columnName: string | Function;
+ cellValue?: string | Function | Element;
+ width?: string;
+ maxWidth?: string;
+ minWidth?: string;
+ className?: string;
+ click?: Function
+}
+
+export default class Grid {
+ private readonly canRender: boolean;
+ private readonly defaultOptions: GridConfiguration = {
+ id: "id",
+ debug: false,
+ columns: [],
+ data: [],
+ pageSize: 0,
+ classes: {
+ table: "table",
+ thead: "table-light"
+ },
+ search: {
+ dataIds: [],
+ },
+ strings: {
+ nextPage: "Neste",
+ previousPage: "Forrige",
+ search: "Søk"
+ }
+ };
+ private configuration: GridConfiguration;
+ private domElement: Element;
+ private searchIndex: JsSearch.Search;
+ public currentPage: number = 0;
+
+ constructor(props: GridProps) {
+ this.setOptions(props);
+ this.validateOptions();
+ this.canRender = true;
+ }
+
+ private setOptions(props: GridProps = this.defaultOptions): void {
+ this.configuration = {} as GridConfiguration;
+ this.configuration.columns = [];
+ for (const column of props.columns) {
+ if (isGridColumn(column)) {
+ this.configuration.columns.push(column);
+ } else {
+ this.log("column is not of type GridColumn: " + JSON.stringify(column));
+ }
+ }
+ this.configuration.data = props.data ?? this.defaultOptions.data;
+ this.configuration.id = props.id ?? this.defaultOptions.id;
+ this.configuration.debug = props.debug ?? this.defaultOptions.debug;
+ this.configuration.pageSize = props.pageSize ?? this.defaultOptions.pageSize;
+ this.configuration.classes = props.classes ?? this.defaultOptions.classes;
+ this.configuration.search = props.search ?? this.defaultOptions.search;
+ this.configuration.strings = props.strings ?? this.defaultOptions.strings;
+ }
+
+ private validateOptions(): void {
+ if (this.configuration.data.length === undefined) {
+ throw new GridError("props.data.length is undefined");
+ }
+ if (this.configuration.columns.length === undefined || this.configuration.columns.length <= 0) {
+ throw new GridError("props.columns.length is undefined or <= 0");
+ }
+ }
+
+ private renderCurrentPageIndicator(): void {
+ if (this.configuration.pageSize <= 0) return;
+ this.domElement.querySelectorAll(".pagination .page-item").forEach((el) => {
+ if (el.getAttribute("data-page-number") == this.currentPage.toString()) el.classList.add("active");
+ else el.classList.remove("active");
+ });
+ }
+
+ private renderPaginator(): void {
+ this.log("start renderPaginator");
+ if (this.configuration.pageSize <= 0 || this.configuration.data.length < this.configuration.pageSize) return;
+ const nav = document.createElement("nav");
+ nav.className = "float-right user-select-none";
+ const ul = document.createElement("ul");
+ ul.className = "pagination";
+ const previousItem = document.createElement("li");
+ previousItem.className = "page-item";
+ previousItem.onclick = () => this.navigate(this.currentPage - 1);
+ const previousLink = document.createElement("span");
+ previousLink.style.cursor = "pointer";
+ previousLink.className = "page-link";
+ previousLink.innerText = this.configuration.strings.previousPage;
+ previousItem.appendChild(previousLink);
+ ul.appendChild(previousItem);
+
+ for (let i = 0; i < this.configuration.data.length / this.configuration.pageSize; i++) {
+ const item = document.createElement("li");
+ item.className = "page-item";
+ item.dataset.pageNumber = i.toString();
+ item.onclick = () => this.navigate(i);
+ const link = document.createElement("span");
+ link.className = "page-link";
+ link.style.cursor = "pointer";
+ link.innerText = (i + 1).toString();
+ item.appendChild(link);
+ ul.appendChild(item);
+ }
+
+ const nextItem = document.createElement("li");
+ nextItem.className = "page-item";
+ nextItem.onclick = () => this.navigate(this.currentPage + 1);
+ const nextLink = document.createElement("span");
+ nextLink.style.cursor = "pointer";
+ nextLink.className = "page-link";
+ nextLink.innerText = this.configuration.strings.nextPage;
+ nextItem.appendChild(nextLink);
+
+ ul.appendChild(nextItem);
+ nav.appendChild(ul);
+ this.domElement.appendChild(nav);
+ this.log("end renderPaginator");
+ }
+
+ private renderWrapper(): void {
+ const wrapper = document.createElement("div");
+ wrapper.className = "table-responsive";
+ const table = document.createElement("table");
+ const thead = document.createElement("thead");
+ const tbody = document.createElement("tbody");
+ table.className = this.configuration.classes.table;
+ thead.className = this.configuration.classes.thead;
+ table.appendChild(thead);
+ table.appendChild(tbody);
+ wrapper.appendChild(table);
+ this.domElement.appendChild(wrapper);
+ }
+
+ private renderHead(): void {
+ const wrapper = this.domElement.querySelector("table thead");
+ wrapper.innerHTML = "";
+ const row = document.createElement("tr");
+ for (const col of this.configuration.columns) {
+ const th = document.createElement("th");
+ th.innerText = this.asString(col.columnName);
+ row.appendChild(th);
+ }
+ wrapper.appendChild(row);
+ }
+
+ // https://github.com/bvaughn/js-search/blob/master/source/getNestedFieldValue.js
+ private getNestedFieldValue<T>(object: Object, path: Array<string>): T {
+ path = path || [];
+ object = object || {};
+
+ let value = object;
+
+ // walk down the property path
+ for (let i = 0; i < path.length; i++) {
+ value = value[path[i]];
+ if (value == null) {
+ return null;
+ }
+ }
+
+ return value as T;
+ }
+
+ private renderBody(data: Array<Object> = null, isSearchResult: boolean = false): void {
+ let wrapper: Element;
+ if (isSearchResult) {
+ this.domElement.querySelector("table tbody:not(.search-results)").classList.add("d-none");
+ this.domElement.querySelector("table tbody.search-results").classList.remove("d-none");
+ wrapper = this.domElement.querySelector("table tbody.search-results");
+ } else {
+ this.domElement.querySelector("table tbody.search-results")?.classList.add("d-none");
+ this.domElement.querySelector("table tbody:not(.search-results)").classList.remove("d-none");
+ wrapper = this.domElement.querySelector("table tbody:not(.search-results)");
+ }
+ wrapper.innerHTML = "";
+ let items = data ?? this.configuration.data;
+ if (this.configuration.pageSize > 0) {
+ items = items.slice(0, this.configuration.pageSize);
+ }
+ for (const item of items) {
+ const row = document.createElement("tr");
+ // @ts-ignore
+ row.dataset.id = item[this.configuration.id];
+ for (const val of this.configuration.columns) {
+ const cell = document.createElement("td");
+ cell.className = "text-break";
+ if (val.width) cell.style.width = val.width;
+ if (val.maxWidth) cell.style.maxWidth = val.maxWidth;
+ if (val.minWidth) cell.style.minWidth = val.minWidth;
+
+ if (val.click instanceof Function) cell.onclick = () => val.click(item);
+ if (val.className) {
+ this.log(val.className)
+ val.className.split(" ").forEach(className => {
+ cell.classList.add(className)
+ })
+ }
+ if (val.cellValue instanceof Function) {
+ const computed = val.cellValue(item);
+ if (computed instanceof Element) cell.appendChild(computed);
+ else if (typeof computed === "string" || typeof computed === "number") cell.innerText = computed as string;
+ } else if (Array.isArray(val.dataId)) {
+ cell.innerText = this.getNestedFieldValue(item, val.dataId);
+ } else if (typeof val.dataId === "string" && val.dataId.length > 0) {
+ cell.innerText = item[val.dataId];
+ } else if (typeof val.cellValue === "string" || typeof val.cellValue === "number") {
+ cell.innerText = val.cellValue;
+ } else if (val.cellValue instanceof Element) {
+ cell.appendChild(val.cellValue);
+ }
+ row.appendChild(cell);
+ }
+ wrapper.appendChild(row);
+ }
+ }
+
+ private asString(val: string | Function, callbackData: any = undefined) {
+ if (val instanceof Function) {
+ return val(callbackData);
+ } else {
+ return val;
+ }
+ }
+
+ private static id(): string {
+ return Math.random().toString(36).substring(2) + Date.now().toString(36);
+ }
+
+ private log(message: any): void {
+ if (!this.configuration.debug) return;
+ console.log("Grid Debug: " + message);
+ }
+
+ private renderSearch() {
+ if (this.configuration.search.dataIds.length < 1) return;
+ const wrapper = document.createElement("div");
+ const searchInput = document.createElement("input");
+ searchInput.type = "text";
+ searchInput.className = "form-control";
+ searchInput.placeholder = this.configuration.strings.search;
+ searchInput.oninput = () => this.search(searchInput.value);
+ wrapper.appendChild(searchInput);
+ this.domElement.appendChild(wrapper);
+ }
+
+ private renderSearchResultWrapper() {
+ if (this.configuration.search.dataIds.length < 1) return;
+ const searchWrapper = document.createElement("tbody");
+ searchWrapper.className = "search-results";
+ this.domElement.querySelector("table").appendChild(searchWrapper);
+ }
+
+ private populateSearchIndex() {
+ if (this.configuration.search.dataIds.length < 1) return;
+ this.searchIndex = new JsSearch.Search(this.configuration.id);
+ this.searchIndex.indexStrategy = new JsSearch.PrefixIndexStrategy();
+ this.configuration.search.dataIds.forEach((id) => this.searchIndex.addIndex(id));
+ this.searchIndex.addDocuments(this.configuration.data);
+ }
+
+ public search(query: string): void {
+ if (this.configuration.search.dataIds.length < 1) return;
+ let result = this.searchIndex.search(query);
+ if (result.length === 0) {
+ this.renderBody(this.configuration.data);
+ } else {
+ this.renderBody(result, true);
+ }
+ }
+
+ public navigate(pageNumber: number): void {
+ const maxPage = Math.ceil(this.configuration.data.length / this.configuration.pageSize - 1);
+ if (this.configuration.pageSize <= 0 || pageNumber < 0 || pageNumber === this.currentPage || pageNumber > maxPage) return;
+ this.log("Navigating to page: " + pageNumber);
+ const skipCount = this.configuration.pageSize * pageNumber;
+ const endIndex =
+ this.configuration.data.length < skipCount + this.configuration.pageSize
+ ? this.configuration.data.length
+ : skipCount + this.configuration.pageSize;
+ this.renderBody(this.configuration.data.slice(skipCount, endIndex));
+ this.currentPage = pageNumber;
+ this.renderCurrentPageIndicator();
+ }
+
+ public removeByID(id: string): void {
+ // @ts-ignore
+ const itemIndex = this.configuration.data.findIndex((c) => c[this.configuration.id] === id);
+ if (itemIndex !== -1) {
+ delete this.configuration.data[itemIndex];
+ this.domElement.querySelector(`tr[data-id="${id}"]`).remove();
+ } else {
+ this.log("Grid does not contain id: " + id);
+ }
+ }
+
+ public refresh(data?: Array<Object>) {
+ this.renderPaginator();
+ this.navigate(0);
+ if (data !== undefined) this.configuration.data = data;
+ this.renderBody();
+ this.populateSearchIndex();
+ }
+
+ public render(el: Element): void {
+ if (this.canRender) {
+ this.log("Grid starting render");
+ this.domElement = el;
+ this.renderSearch();
+ this.populateSearchIndex();
+ this.renderWrapper();
+ this.renderHead();
+ this.renderBody();
+ this.renderPaginator();
+ this.renderCurrentPageIndicator();
+ this.renderSearchResultWrapper();
+ this.log("Grid was rendered");
+ } else {
+ throw new GridError("render is not allowed due to invalid props");
+ }
+ }
+}
+
+class GridError extends Error {
+ constructor(message: string) {
+ super(message);
+ this.name = "GridError";
+ }
+}
+
+function isArrayOfGridColumn(array: Array<GridColumn> | Array<string>): array is Array<GridColumn> {
+ try {
+ // @ts-ignore
+ return !(array.map((element) => "name" in element).indexOf(false) !== -1);
+ } catch (e) {
+ return false;
+ }
+}
+
+function isGridColumn(val: GridColumn | string): val is GridColumn {
+ try {
+ // @ts-ignore
+ return "columnName" in val && ("cellValue" in val || "dataId" in val);
+ } catch (e) {
+ return false;
+ }
+}
diff --git a/src/wwwroot/scripts/i10n.ts b/src/wwwroot/scripts/i10n.ts
new file mode 100644
index 0000000..e26b0be
--- /dev/null
+++ b/src/wwwroot/scripts/i10n.ts
@@ -0,0 +1,95 @@
+/**
+ * _LC = lowercase
+ * _V = verb
+ */
+
+/*
+import {configuration} from "./configuration";
+import Cookies from "js-cookie";
+*/
+
+const versions = [
+ {
+ id: "nb",
+ isDefault: true,
+ value: {
+ could_not_reach_server: "Kunne ikkje kontakte serveren",
+ an_unknown_error_occured: "Ein uventa feil oppstod",
+ an_error_occured: "Ein feil oppstod",
+ try_again_soon: "Prøv igjen snart",
+ new_password_is_applied: "Nytt passord er sett",
+ are_you_sure: "Er du sikker?",
+ are_you_sure_you_want_to_delete: "Er du sikker på at du vil slette",
+ is_deleted_LC: "er sletta",
+ has_invalid_file_format_LC: "har ugyldig filformat",
+ delete: "Slett",
+ cancel: "Kanseller",
+ view: "Inspiser",
+ edit: "Rediger",
+ invalid_form: "Ugyldig skjema",
+ the_product_is_updated: "Produktet er oppdatert",
+ the_product_is_added: "Produktet er lagt til",
+ could_not: "Kunne ikkje",
+ could_not_update_the_product: "Kunne ikkje oppdatere produktet",
+ could_not_add_the_product: "Kunne ikkje legge til produktet",
+ could_not_add_the_category: "Kunne ikkje legge til kategorien",
+ could_not_retrieve_products: "Kunne ikkje hente produktene",
+ could_not_retrieve_orders: "Kunne ikkje hente bestillingene",
+ could_not_retrieve_categories: "Kunne ikkje hente kategoriene",
+ could_not_delete_product: "Kunne ikkje slette produktet",
+ could_not_delete_category: "Kunne ikkje slette kategorien",
+ could_not_upload: "Kunne ikkje laste opp",
+ too_many_files: "For mange filer",
+ max_five_files_at_a_time: "Maks 5 filer om gangen",
+ invalid_file: "Ugyldig fil",
+ is_too_big_LC: "er for stor",
+ too_big_file: "For stor fil",
+ the_image: "Bildet",
+ the_images: "Bildene",
+ is_uploaded_LC: "er lasta opp",
+ picture_of_the_product: "Bilde av produktet",
+ save: "Lagre",
+ new_product: "Nytt produkt",
+ create: "Opprett",
+ hide_V: "Gjemme",
+ show_V: "Vise",
+ show: "Vis",
+ hide: "Gjem",
+ are_you_sure_you_want_to: "Er du sikker på at du vil",
+ in_the_store: "I butikken",
+ is_required_LC: "er påkrevd",
+ is_invalid_LC: "er ugyldig",
+ name: "Namn",
+ the_email_address: "E-postadressen",
+ the_password: "Passordet",
+ could_not_validate_your_order: "Kunne ikkje validere din ordre",
+ the_shopping_bag_is_empty: "Handlekorgen er tom",
+ to_add_LC: "for å legge til",
+ go_to: "GÃ¥ til",
+ go_to_LC: "gå til",
+ click_on: "Trykk på",
+ search: "Søk",
+ next_page: "Neste side",
+ previous_page: "Forrige side",
+ },
+ },
+];
+
+/*function getIsoCodeFromCultureCookie(v) {
+ if (v === undefined) return "";
+ return v.slice(v.lastIndexOf('=') + 1)
+}
+// uses js-cookie
+const prefferedLanguage = getIsoCodeFromCultureCookie(Cookies.get(configuration.cookies.culture));
+const indexOfPrefferedLanguage = versions.findIndex(version => version.id === prefferedLanguage);
+const indexOfDefaultLanguage = versions.findIndex(version => version.isDefault === true);
+export const strings = {
+ languageSpesific: indexOfPrefferedLanguage !== -1
+ ? versions[indexOfPrefferedLanguage].value
+ : versions[indexOfDefaultLanguage].value,
+};
+ */
+
+export const strings = {
+ languageSpesific: versions[0].value
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/icons.js b/src/wwwroot/scripts/icons.js
new file mode 100644
index 0000000..6fa3559
--- /dev/null
+++ b/src/wwwroot/scripts/icons.js
@@ -0,0 +1,58 @@
+export function bagDashIcon(height = "1em", width = "1em") {
+ return `
+<svg width="${height}" height="${height}" viewBox="0 0 16 16" class="bi bi-bag-plus" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" d="M8 1a2.5 2.5 0 0 0-2.5 2.5V4h5v-.5A2.5 2.5 0 0 0 8 1zm3.5 3v-.5a3.5 3.5 0 1 0-7 0V4H1v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V4h-3.5zM2 5v9a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5H2z"/>
+ <path fill-rule="evenodd" d="M5.5 10a.5.5 0 0 1 .5-.5h4a.5.5 0 0 1 0 1H6a.5.5 0 0 1-.5-.5z"/>
+</svg>
+`;
+}
+
+export function bagPlusIcon(height = "1em", width = "1em") {
+ return `
+<svg width="${height}" height="${height}" viewBox="0 0 16 16" class="bi bi-bag-plus" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" d="M8 1a2.5 2.5 0 0 0-2.5 2.5V4h5v-.5A2.5 2.5 0 0 0 8 1zm3.5 3v-.5a3.5 3.5 0 1 0-7 0V4H1v10a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V4h-3.5zM2 5v9a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V5H2z"/>
+ <path fill-rule="evenodd" d="M8 7.5a.5.5 0 0 1 .5.5v1.5H10a.5.5 0 0 1 0 1H8.5V12a.5.5 0 0 1-1 0v-1.5H6a.5.5 0 0 1 0-1h1.5V8a.5.5 0 0 1 .5-.5z"/>
+</svg>
+`;
+}
+
+export function trashIcon(height = "1em", width = "1em") {
+ return `
+<svg width="${height}" height="${height}" viewBox="0 0 16 16" class="bi bi-trash2" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" d="M3.18 4l1.528 9.164a1 1 0 0 0 .986.836h4.612a1 1 0 0 0 .986-.836L12.82 4H3.18zm.541 9.329A2 2 0 0 0 5.694 15h4.612a2 2 0 0 0 1.973-1.671L14 3H2l1.721 10.329z"/>
+ <path d="M14 3c0 1.105-2.686 2-6 2s-6-.895-6-2 2.686-2 6-2 6 .895 6 2z"/>
+ <path fill-rule="evenodd" d="M12.9 3c-.18-.14-.497-.307-.974-.466C10.967 2.214 9.58 2 8 2s-2.968.215-3.926.534c-.477.16-.795.327-.975.466.18.14.498.307.975.466C5.032 3.786 6.42 4 8 4s2.967-.215 3.926-.534c.477-.16.795-.327.975-.466zM8 5c3.314 0 6-.895 6-2s-2.686-2-6-2-6 .895-6 2 2.686 2 6 2z"/>
+</svg>`;
+}
+
+export function plusIcon(height = "1em", width = "1em") {
+ return `
+<svg width="${width}" height="${height}" viewBox="0 0 16 16" class="bi bi-plus" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/>
+</svg>
+`;
+}
+
+export function pencilSquareIcon(height = "1em", width = "1em") {
+ return `
+<svg width="${width}" height="${height}" viewBox="0 0 16 16" class="bi bi-pencil-square" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
+ <path d="M15.502 1.94a.5.5 0 0 1 0 .706L14.459 3.69l-2-2L13.502.646a.5.5 0 0 1 .707 0l1.293 1.293zm-1.75 2.456l-2-2L4.939 9.21a.5.5 0 0 0-.121.196l-.805 2.414a.25.25 0 0 0 .316.316l2.414-.805a.5.5 0 0 0 .196-.12l6.813-6.814z"/>
+ <path fill-rule="evenodd" d="M1 13.5A1.5 1.5 0 0 0 2.5 15h11a1.5 1.5 0 0 0 1.5-1.5v-6a.5.5 0 0 0-1 0v6a.5.5 0 0 1-.5.5h-11a.5.5 0 0 1-.5-.5v-11a.5.5 0 0 1 .5-.5H9a.5.5 0 0 0 0-1H2.5A1.5 1.5 0 0 0 1 2.5v11z"/>
+</svg>
+`;
+}
+
+export function threeDotsVerticalIcon(height = "1em", width = "1em") {
+ return `
+<svg width="${width}" height="${height}" viewBox="0 0 16 16" class="bi bi-three-dots-vertical" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" d="M9.5 13a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0zm0-5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/>
+</svg>`;
+}
+
+export function eyeIcon(height = "1em", width = "1em") {
+ return `
+<svg width="${width}" height="${height}" viewBox="0 0 16 16" class="bi bi-eye" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.134 13.134 0 0 0 1.66 2.043C4.12 11.332 5.88 12.5 8 12.5c2.12 0 3.879-1.168 5.168-2.457A13.134 13.134 0 0 0 14.828 8a13.133 13.133 0 0 0-1.66-2.043C11.879 4.668 10.119 3.5 8 3.5c-2.12 0-3.879 1.168-5.168 2.457A13.133 13.133 0 0 0 1.172 8z"/>
+ <path fill-rule="evenodd" d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z"/>
+</svg>`;
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/messages.js b/src/wwwroot/scripts/messages.js
new file mode 100644
index 0000000..a426677
--- /dev/null
+++ b/src/wwwroot/scripts/messages.js
@@ -0,0 +1,12 @@
+import {strings} from "./i10n.ts";
+
+export const messages = {
+ networkRequestFailed: {
+ title: strings.languageSpesific.could_not_reach_server,
+ message: strings.languageSpesific.try_again_soon,
+ },
+ unknownError: {
+ title: strings.languageSpesific.an_unknown_error_occured,
+ message: strings.languageSpesific.try_again_soon,
+ },
+}; \ No newline at end of file
diff --git a/src/wwwroot/scripts/tabs.js b/src/wwwroot/scripts/tabs.js
new file mode 100644
index 0000000..69d670c
--- /dev/null
+++ b/src/wwwroot/scripts/tabs.js
@@ -0,0 +1,31 @@
+export function initTabs() {
+ let firstActiveIsShown = false;
+ document.querySelectorAll(".tab-content-container[data-tab]").forEach(contentContainer => {
+ if (contentContainer.classList.contains("active") && !firstActiveIsShown) {
+ firstActiveIsShown = true;
+ return;
+ }
+ contentContainer.style.display = "none";
+ });
+
+ document.querySelectorAll(".tab-button[data-tab]").forEach(button => {
+ button.addEventListener("click", handleButtonClick);
+ });
+
+ function handleButtonClick(element) {
+ if (element.originalTarget.dataset.tab) {
+ document.querySelectorAll(".tab-button[data-tab]").forEach(b => {
+ if (b.dataset.tab === element.originalTarget.dataset.tab)
+ b.classList.add("active");
+ else
+ b.classList.remove("active");
+ });
+ document.querySelectorAll(".tab-content-container[data-tab]").forEach(c => {
+ if (c.dataset.tab === element.originalTarget.dataset.tab)
+ c.style.display = "";
+ else
+ c.style.display = "none";
+ });
+ }
+ }
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/toaster.js b/src/wwwroot/scripts/toaster.js
new file mode 100644
index 0000000..c0e039d
--- /dev/null
+++ b/src/wwwroot/scripts/toaster.js
@@ -0,0 +1,131 @@
+import Toast from "bootstrap/js/dist/toast";
+
+export class Toaster {
+ constructor(options) {
+ if (!options) {
+ options = {hideAfter: 3500, position: "top-right"};
+ }
+ this.root = document.createElement("div");
+ this.root.id = "toaster-container";
+ switch (options.position) {
+ case"top-right":
+ this.root.style = "display: flex; align-items: end; flex-direction: column; position: absolute; top: 0; right: 0; padding: 15px; z-index: 9999;";
+ break;
+ case"top-left":
+ this.root.style = "position: absolute; top: 0; padding: 15px; z-index: 9999;";
+ break;
+ case"bottom-right":
+ this.root.style = "display: flex; align-items: end; flex-direction: column; position: absolute; bottom: 0; right: 0; padding: 15px; z-index: 9999;";
+ break;
+ case"bottom-left":
+ this.root.style = "position: absolute; bottom: 0; padding: 15px; z-index: 9999;";
+ break;
+ default:
+ this.root.style = "display: flex; align-items: end; flex-direction: column; position: absolute; top: 0; right: 0; padding: 15px; z-index: 9999;";
+ break;
+ }
+ document.body.appendChild(this.root);
+ this.defaultTimeout = options.hideAfter ? options.hideAfter : 3500;
+ this.toastTypes = {error: "error", success: "success", info: "info"};
+ }
+
+ display(title, message, autohide, type) {
+ if (!title || typeof title !== "string" || typeof message !== "string") {
+ throw new Error("Toaster: title &| message is empty or not a string");
+ }
+ let toast = document.createElement("div");
+ toast.className = "toast";
+ toast.role = "alert";
+ toast.id = Math.random().toString(36).substring(2) + Date.now().toString(36);
+ let toastHeader = document.createElement("div");
+ toastHeader.className = "toast-header";
+ let toastTypeIndicator = document.createElement("div");
+ switch (type) {
+ case this.toastTypes.error:
+ toastTypeIndicator.className = "toast-type-indicator rounded me-2 bg-danger";
+ toast.style = "width: max-content; min-width: 300px; border-color: var(--bs-danger);";
+ break;
+ case this.toastTypes.success:
+ toastTypeIndicator.className = "toast-type-indicator rounded me-2 bg-success";
+ toast.style = "width: max-content; min-width: 300px; border-color: var(--bs-success);";
+ break;
+ case this.toastTypes.info:
+ toastTypeIndicator.className = "toast-type-indicator rounded me-2 bg-info";
+ toast.style = "width: max-content; min-width: 300px; border-color: var(--bs-info);";
+ break;
+ }
+ toastTypeIndicator.style = "width: 18px; height: 18px;";
+ toastHeader.appendChild(toastTypeIndicator);
+ let toastTitle = document.createElement("strong");
+ toastTitle.className = "me-auto text-truncate";
+ toastTitle.innerText = title;
+ toastHeader.appendChild(toastTitle);
+ let toastCloseButton = document.createElement("button");
+ toastCloseButton.className = "ms-2 mb-1 close";
+ toastCloseButton.setAttribute("data-bs-dismiss","toast");
+ toastCloseButton.onclick = () => {
+ setTimeout(() => {
+ toast.parentNode.removeChild(toast);
+ }, parseInt(1e3));
+ };
+ if (!autohide) {
+ let toastCloseButtonIcon = document.createElement("img");
+ toastCloseButtonIcon.src = "data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" viewBox=\"0 0 16 16\"><path fill-rule=\"evenodd\" d=\"M14 1H2a1 1 0 00-1 1v12a1 1 0 001 1h12a1 1 0 001-1V2a1 1 0 00-1-1zM2 0a2 2 0 00-2 2v12a2 2 0 002 2h12a2 2 0 002-2V2a2 2 0 00-2-2H2z\" clip-rule=\"evenodd\"/><path fill-rule=\"evenodd\" d=\"M11.854 4.146a.5.5 0 010 .708l-7 7a.5.5 0 01-.708-.708l7-7a.5.5 0 01.708 0z\" clip-rule=\"evenodd\"/><path fill-rule=\"evenodd\" d=\"M4.146 4.146a.5.5 0 000 .708l7 7a.5.5 0 00.708-.708l-7-7a.5.5 0 00-.708 0z\" clip-rule=\"evenodd\"/></svg>";
+ toastCloseButtonIcon.alt = "x";
+ toastCloseButtonIcon.dataset.ariaHidden = "true";
+ toastCloseButton.appendChild(toastCloseButtonIcon);
+ toastHeader.appendChild(toastCloseButton);
+ }
+ toast.appendChild(toastHeader);
+ if (message) {
+ let toastBody = document.createElement("div");
+ toastBody.className = "toast-body";
+ toastBody.style = "word-wrap: break-word;";
+ toastBody.innerText = message;
+ toast.appendChild(toastBody);
+ }
+ this.root.appendChild(toast);
+ let delay = 0;
+ if (typeof autohide === "number" && autohide !== 0) {
+ delay = autohide;
+ autohide = true;
+ } else if (autohide) {
+ delay = this.defaultTimeout;
+ }
+ new Toast(document.getElementById(toast.id), {
+ animation: true,
+ autohide: autohide,
+ delay: delay
+ }).show();
+ if (delay) setTimeout(() => {
+ toast.parentNode.removeChild(toast);
+ }, parseInt(delay + 1e3));
+ }
+
+ error(title, message = "", autohide = true) {
+ this.display(title, message, autohide, this.toastTypes.error);
+ }
+
+ errorObj(props) {
+ if (props.autohide === undefined) props.autohide = true;
+ this.display(props.title, props.message, props.autohide, this.toastTypes.error);
+ }
+
+ success(title, message = "", autohide = true) {
+ this.display(title, message, autohide, this.toastTypes.success);
+ }
+
+ successObj(props) {
+ if (props.autohide === undefined) props.autohide = true;
+ this.display(props.title, props.message, props.autohide, this.toastTypes.success);
+ }
+
+ info(title, message = "", autohide = true) {
+ this.display(title, message, autohide, this.toastTypes.info);
+ }
+
+ infoObj(props) {
+ if (props.autohide === undefined) props.autohide = true;
+ this.display(props.title, props.message, props.autohide, this.toastTypes.info);
+ }
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/utilities.js b/src/wwwroot/scripts/utilities.js
new file mode 100644
index 0000000..02af8b5
--- /dev/null
+++ b/src/wwwroot/scripts/utilities.js
@@ -0,0 +1,254 @@
+import {toaster} from "./base";
+import {messages} from "./messages";
+
+export const utilites = {
+ dom: {
+ restrictInputToNumbers(el, specials, mergeSpecialsWithDefaults) {
+ el.addEventListener("keydown", e => {
+ const defaultSpecials = [
+ "Backspace",
+ "ArrowLeft",
+ "ArrowRight",
+ "Tab",
+ ];
+ let keys = specials ?? defaultSpecials;
+ if (mergeSpecialsWithDefaults && specials) keys = [...specials, ...defaultSpecials];
+ if (keys.indexOf(e.key) !== -1) {
+ return;
+ }
+ if (isNaN(parseInt(e.key))) {
+ e.preventDefault();
+ }
+ });
+ },
+ elementHasFocus: (el) => el === document.activeElement,
+ moveFocus(element) {
+ if (!element) element = document.getElementsByTagName("body")[0];
+ element.focus();
+ if (!this.elementHasFocus(element)) {
+ element.setAttribute("tabindex", "-1");
+ element.focus();
+ }
+ },
+ },
+ array: {
+ isEmpty: (arr) => arr === undefined || !Array.isArray(arr) || arr.length <= 0,
+ removeItemOnce(arr, value) {
+ const index = arr.indexOf(value);
+ if (index > -1) {
+ arr.splice(index, 1);
+ }
+ return arr;
+ },
+ pushOrUpdate(arr, obj) {
+ const index = arr.findIndex((e) => e.id === obj.id);
+ if (index === -1) {
+ arr.push(obj);
+ } else {
+ arr[index] = obj;
+ }
+ },
+ removeItemAll(arr, value) {
+ let i = 0;
+ while (i < arr.length) {
+ if (arr[i] === value) {
+ arr.splice(i, 1);
+ } else {
+ ++i;
+ }
+ }
+ return arr;
+ },
+ removeItemByIdAll(arr, value) {
+ let i = 0;
+ while (i < arr.length) {
+ if (arr[i].id === value.id) {
+ arr.splice(i, 1);
+ } else {
+ ++i;
+ }
+ }
+ return arr;
+ },
+ },
+ object: {
+ // http://youmightnotneedjquery.com/#deep_extend
+ extend(object, ext) {
+ ext = ext || {};
+ for (let i = 1; i < object.length; i++) {
+ let obj = object[i];
+ if (!obj) continue;
+ for (let key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ if (typeof obj[key] === "object") {
+ if (obj[key] instanceof Array)
+ ext[key] = obj[key].slice(0);
+ else
+ ext[key] = this.extend(ext[key], obj[key]);
+ } else
+ ext[key] = obj[key];
+ }
+ }
+ }
+ return ext;
+ },
+ isEmptyObj(obj) {
+ return obj !== undefined && Object.keys(obj).length > 0;
+ },
+ },
+ validators: {
+ isEmail(input) {
+ const re = /\S+@\S+\.\S+/;
+ return re.test(input);
+ },
+ },
+ getRandomInt(min, max) {
+ min = Math.ceil(min);
+ max = Math.floor(max);
+ return Math.floor(Math.random() * (max - min + 1)) + min;
+ },
+ isInternetExplorer() {
+ const ua = navigator.userAgent;
+ return ua.indexOf("MSIE") > -1 || ua.indexOf("Trident") > -1;
+ },
+ toReadableDateString(date) {
+ date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
+ return date.toLocaleString("nb-NO");
+ },
+ toReadableBytes(bytes) {
+ const s = ["bytes", "kB", "MB", "GB", "TB", "PB"];
+ const e = Math.floor(Math.log(bytes) / Math.log(1024));
+ return (bytes / Math.pow(1024, e)).toFixed(2) + " " + s[e];
+ },
+ toReadablePriceSuffix(suffix) {
+ switch (suffix) {
+ case 0:
+ return ",-";
+ case 1:
+ return ",- kg";
+ case 2:
+ return ",- stk";
+ }
+ },
+ setSessionStorageJSON(key, object) {
+ sessionStorage.setItem(key, JSON.stringify(object));
+ },
+ getSessionStorageJSON(key) {
+ const dataString = sessionStorage.getItem(key);
+ if (dataString === null) return undefined;
+ return JSON.parse(dataString);
+ },
+ setLocalStorageJSON(key, object) {
+ localStorage.setItem(key, JSON.stringify(object));
+ },
+ getLocalStorageJSON(key) {
+ const dataString = localStorage.getItem(key);
+ if (dataString === null) return undefined;
+ return JSON.parse(dataString);
+ },
+ handleError: (httpResult, fallback) => {
+ if (httpResult.headers !== undefined && httpResult.headers.get("ContentType") === "application/json") {
+ httpResult.json().then(error => {
+ console.error(error);
+ toaster.errorObj(utilites.errorOrDefault(error, fallback));
+ });
+ } else {
+ toaster.errorObj(fallback);
+ }
+ },
+ getOrderStatusName: (status) => {
+ switch (status) {
+ case 0:
+ return "Pågående";
+ case 1:
+ return "Kansellert";
+ case 2:
+ return "Feilet";
+ case 3:
+ return "Fullført";
+ case 4:
+ return "Venter på faktura";
+ case 5:
+ return "Venter på vipps";
+ default:
+ return "Ukjent";
+ }
+ },
+ getOrderPaymentName: (status) => {
+ switch (status) {
+ case 0:
+ return "Vipps";
+ case 1:
+ return "Faktura på mail";
+ default:
+ return "Ukjent";
+ }
+ },
+ errorOrDefault: (res, fallback) => {
+ let title;
+ let message;
+
+ if (res.title) title = res.title;
+ else if (fallback.title) title = fallback.title;
+ else title = messages.unknownError.title;
+
+ if (res.message) message = res.message;
+ else if (fallback.message) message = fallback.message;
+ else message = messages.unknownError.message;
+
+ return {
+ title,
+ message,
+ };
+ },
+ // https://stackoverflow.com/a/15757499/11961742
+ resolveReferences(json) {
+ if (typeof json === "string")
+ json = JSON.parse(json);
+
+ const byid = {}, // all objects by id
+ refs = []; // references to objects that could not be resolved
+ json = (function recurse(obj, prop, parent) {
+ if (typeof obj !== "object" || !obj) // a primitive value
+ return obj;
+ if (Object.prototype.toString.call(obj) === "[object Array]") {
+ for (let i = 0; i < obj.length; i++) {
+ // check also if the array element is not a primitive value
+ if (typeof obj[i] !== "object" || !obj[i]) {// a primitive value
+ continue;
+ } else if ("$ref" in obj[i]) {
+ obj[i] = recurse(obj[i], i, obj);
+ } else {
+ obj[i] = recurse(obj[i], prop, obj);
+ }
+ }
+ return obj;
+ }
+ if ("$ref" in obj) { // a reference
+ let ref = obj.$ref;
+ if (ref in byid)
+ return byid[ref];
+ // else we have to make it lazy:
+ refs.push([parent, prop, ref]);
+ return;
+ } else if ("$id" in obj) {
+ let id = obj.$id;
+ delete obj.$id;
+ if ("$values" in obj) // an array
+ obj = obj.$values.map(recurse);
+ else // a plain object
+ for (let prop in obj)
+ obj[prop] = recurse(obj[prop], prop, obj);
+ byid[id] = obj;
+ }
+ return obj;
+ })(json); // run it!
+
+ for (let i = 0; i < refs.length; i++) { // resolve previously unknown references
+ let ref = refs[i];
+ ref[0][ref[1]] = byid[ref[2]];
+ // Notice that this throws if you put in a reference at top-level
+ }
+ return json;
+ },
+};
diff --git a/src/wwwroot/scripts/vendor/cycle.js b/src/wwwroot/scripts/vendor/cycle.js
new file mode 100644
index 0000000..10262a9
--- /dev/null
+++ b/src/wwwroot/scripts/vendor/cycle.js
@@ -0,0 +1,174 @@
+/*
+ cycle.js
+ 2018-05-15
+ Public Domain.
+ NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+ This code should be minified before deployment.
+ See http://javascript.crockford.com/jsmin.html
+ USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+ NOT CONTROL.
+*/
+
+// The file uses the WeakMap feature of ES6.
+
+/*jslint eval */
+
+/*property
+ $ref, decycle, forEach, get, indexOf, isArray, keys, length, push,
+ retrocycle, set, stringify, test
+*/
+
+export function decycle(object, replacer) {
+ "use strict";
+
+// Make a deep copy of an object or array, assuring that there is at most
+// one instance of each object or array in the resulting structure. The
+// duplicate references (which might be forming cycles) are replaced with
+// an object of the form
+
+// {"$ref": PATH}
+
+// where the PATH is a JSONPath string that locates the first occurance.
+
+// So,
+
+// var a = [];
+// a[0] = a;
+// return JSON.stringify(JSON.decycle(a));
+
+// produces the string '[{"$ref":"$"}]'.
+
+// If a replacer function is provided, then it will be called for each value.
+// A replacer function receives a value and returns a replacement value.
+
+// JSONPath is used to locate the unique object. $ indicates the top level of
+// the object or array. [NUMBER] or [STRING] indicates a child element or
+// property.
+
+ var objects = new WeakMap(); // object to path mappings
+
+ return (function derez(value, path) {
+
+// The derez function recurses through the object, producing the deep copy.
+
+ var old_path; // The path of an earlier occurance of value
+ var nu; // The new object or array
+
+// If a replacer function was provided, then call it to get a replacement value.
+
+ if (replacer !== undefined) {
+ value = replacer(value);
+ }
+
+// typeof null === "object", so go on if this value is really an object but not
+// one of the weird builtin objects.
+
+ if (
+ typeof value === "object"
+ && value !== null
+ && !(value instanceof Boolean)
+ && !(value instanceof Date)
+ && !(value instanceof Number)
+ && !(value instanceof RegExp)
+ && !(value instanceof String)
+ ) {
+
+// If the value is an object or array, look to see if we have already
+// encountered it. If so, return a {"$ref":PATH} object. This uses an
+// ES6 WeakMap.
+
+ old_path = objects.get(value);
+ if (old_path !== undefined) {
+ return {$ref: old_path};
+ }
+
+// Otherwise, accumulate the unique value and its path.
+
+ objects.set(value, path);
+
+// If it is an array, replicate the array.
+
+ if (Array.isArray(value)) {
+ nu = [];
+ value.forEach(function (element, i) {
+ nu[i] = derez(element, path + "[" + i + "]");
+ });
+ } else {
+
+// If it is an object, replicate the object.
+
+ nu = {};
+ Object.keys(value).forEach(function (name) {
+ nu[name] = derez(
+ value[name],
+ path + "[" + JSON.stringify(name) + "]",
+ );
+ });
+ }
+ return nu;
+ }
+ return value;
+ }(object, "$"));
+}
+
+
+export function retrocycle($) {
+ "use strict";
+
+// Restore an object that was reduced by decycle. Members whose values are
+// objects of the form
+// {$ref: PATH}
+// are replaced with references to the value found by the PATH. This will
+// restore cycles. The object will be mutated.
+
+// The eval function is used to locate the values described by a PATH. The
+// root object is kept in a $ variable. A regular expression is used to
+// assure that the PATH is extremely well formed. The regexp contains nested
+// * quantifiers. That has been known to have extremely bad performance
+// problems on some browsers for very long strings. A PATH is expected to be
+// reasonably short. A PATH is allowed to belong to a very restricted subset of
+// Goessner's JSONPath.
+
+// So,
+// var s = '[{"$ref":"$"}]';
+// return JSON.retrocycle(JSON.parse(s));
+// produces an array containing a single element which is the array itself.
+
+ var px = /^\$(?:\[(?:\d+|"(?:[^\\"\u0000-\u001f]|\\(?:[\\"\/bfnrt]|u[0-9a-zA-Z]{4}))*")\])*$/;
+
+ (function rez(value) {
+
+// The rez function walks recursively through the object looking for $ref
+// properties. When it finds one that has a value that is a path, then it
+// replaces the $ref object with a reference to the value that is found by
+// the path.
+
+ if (value && typeof value === "object") {
+ if (Array.isArray(value)) {
+ value.forEach(function (element, i) {
+ if (typeof element === "object" && element !== null) {
+ var path = element.$ref;
+ if (typeof path === "string" && px.test(path)) {
+ value[i] = eval(path);
+ } else {
+ rez(element);
+ }
+ }
+ });
+ } else {
+ Object.keys(value).forEach(function (name) {
+ var item = value[name];
+ if (typeof item === "object" && item !== null) {
+ var path = item.$ref;
+ if (typeof path === "string" && px.test(path)) {
+ value[name] = eval(path);
+ } else {
+ rez(item);
+ }
+ }
+ });
+ }
+ }
+ }($));
+ return $;
+} \ No newline at end of file
diff --git a/src/wwwroot/scripts/vendor/quill.js b/src/wwwroot/scripts/vendor/quill.js
new file mode 100644
index 0000000..fa7e400
--- /dev/null
+++ b/src/wwwroot/scripts/vendor/quill.js
@@ -0,0 +1,25 @@
+import Quill from "quill/core";
+
+import Toolbar from "quill/modules/toolbar";
+import Snow from "quill/themes/snow";
+
+import Bold from "quill/formats/bold";
+import Italic from "quill/formats/italic";
+import Header from "quill/formats/header";
+import ImageUploader from "quill-image-uploader";
+import BlotFormatter from "quill-blot-formatter";
+import {ImageDrop} from "quill-image-drop-module";
+
+Quill.register({
+ "modules/toolbar": Toolbar,
+ "modules/imageDrop": ImageDrop,
+ "modules/blotFormatter": BlotFormatter,
+ "modules/imageUploader": ImageUploader,
+ "themes/snow": Snow,
+ "formats/bold": Bold,
+ "formats/italic": Italic,
+ "formats/header": Header,
+});
+
+
+export default Quill;
diff --git a/src/wwwroot/styles/back.scss b/src/wwwroot/styles/back.scss
new file mode 100644
index 0000000..145ee54
--- /dev/null
+++ b/src/wwwroot/styles/back.scss
@@ -0,0 +1,45 @@
+
+.product-form-image-thumbnail {
+ max-width: 250px;
+ min-width: 250px;
+
+ .card {
+ height: 100%;
+ }
+
+ img {
+ object-fit: cover;
+ height: 100%;
+ }
+
+ .context-menu-button {
+ margin: -1rem;
+ background: rgba(0, 0, 0, .4);
+ color: white;
+ border: none;
+ border-radius: 0 0 0 0.25rem;
+ padding: 0 0 2px 0;
+ cursor: pointer !important;
+ }
+}
+
+
+#input-images-row {
+ flex-wrap: unset;
+ overflow-x: auto;
+}
+
+.draghandle {
+ margin-left: -74px;
+ padding-right: 24px;
+ cursor: move;
+ display: none;
+}
+
+#products.dragging .draghandle {
+ display: inline-block !important;
+}
+
+#products.dragging .products-wrapper {
+ display: none !important;
+}
diff --git a/src/wwwroot/styles/base.scss b/src/wwwroot/styles/base.scss
new file mode 100644
index 0000000..493c4eb
--- /dev/null
+++ b/src/wwwroot/styles/base.scss
@@ -0,0 +1,168 @@
+.cursor-pointer {
+ cursor: pointer;
+}
+
+label {
+ user-select: none;
+}
+
+img {
+ user-select: none;
+}
+
+.btn {
+ .spinner-border {
+ display: none;
+ }
+
+ .disabled {
+ user-select: none;
+ pointer-events: none;
+ cursor: not-allowed;
+ opacity: .4;
+ }
+
+ &.loading {
+ user-select: none;
+ pointer-events: none;
+ cursor: wait;
+ opacity: .5;
+
+ > .spinner-border {
+ display: inline-block;
+ }
+ }
+}
+
+form {
+ .loader {
+ display: none;
+ }
+
+ .disabled {
+ user-select: none;
+ pointer-events: none;
+ cursor: not-allowed;
+ opacity: .4;
+ }
+
+ &.loading {
+ user-select: none;
+ pointer-events: none;
+ cursor: wait;
+ opacity: .5;
+ }
+}
+
+img {
+ &.object-fit-cover {
+ object-fit: cover;
+ }
+
+ &.object-fit-fill {
+ object-fit: fill;
+ }
+
+ &.object-fit-contain {
+ object-fit: contain;
+ }
+}
+
+.text-bold {
+ font-weight: 600;
+}
+
+.btn {
+ border-radius: 0;
+
+ &.btn-primary {
+ color: white;
+ }
+
+ &.btn-outline-primary:hover {
+ color: white;
+ }
+
+}
+
+.m-0-auto {
+ margin: 0 auto;
+}
+
+.flex-1 {
+ flex: 1;
+}
+
+.w-150px {
+ width: 150px;
+}
+
+.mw-150px {
+ max-width: 150px;
+}
+
+.mw-450px {
+ max-width: 450px;
+}
+
+.w-100px {
+ width: 100px
+}
+
+.w-max-content {
+ width: max-content;
+}
+
+.mw-100px {
+ max-width: 100px
+}
+
+.mh-150px {
+ min-height: 150px;
+}
+
+.number-input {
+ max-width: 90px;
+ width: 90px;
+ display: flex;
+ height: 30px;
+ background: rgba($vsh-orange, 0.8);
+ border-radius: 0;
+ border: 1px solid rgba($vsh-orange, 0.8);
+
+ input {
+ max-width: 5ch;
+ border: none;
+ text-align: center;
+ -moz-appearance: textfield;
+ }
+
+ button {
+ border: none;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ width: 30px;
+ background: transparent;
+ font-size: 22px;
+ cursor: pointer;
+ padding: 0 5px;
+ }
+
+
+ input::-webkit-inner-spin-button,
+ input::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+ }
+}
+
+.blur-up {
+ opacity: 0;
+ transition: opacity 200ms;
+
+ &.lazyloaded {
+ opacity: 1;
+ }
+}
+
diff --git a/src/wwwroot/styles/front.scss b/src/wwwroot/styles/front.scss
new file mode 100644
index 0000000..e2fa4b8
--- /dev/null
+++ b/src/wwwroot/styles/front.scss
@@ -0,0 +1,190 @@
+:root {
+ --navbar-height: 72px;
+}
+
+body {
+ padding-top: var(--navbar-height);
+ color: #333;
+}
+
+.big-text {
+ font-size: 1.875rem;
+}
+
+.navbar {
+ height: var(--navbar-height);
+
+ .nav-link.active {
+ border-bottom: 2px solid;
+ font-weight: 600;
+ }
+
+ .navbar-brand {
+ width: 200px;
+ }
+
+ .navbar-toggler {
+ position: absolute;
+ right: 0;
+ top: 0;
+ width: 72px;
+ height: var(--navbar-height);
+ }
+}
+
+#frontpage-image {
+ margin-right: -5rem;
+ margin-left: -12.5rem;
+}
+
+@media (max-width: 1200px) {
+ #frontpage-image {
+ margin-right: -20rem;
+ margin-left: -8.5rem;
+ }
+}
+
+#header-cart-button {
+ position: absolute;
+ z-index: 10000;
+ top: 0;
+ right: 0;
+ padding: 10px 20px;
+ margin-right: 25px;
+ max-height: var(--navbar-height);
+}
+
+.contact-section {
+ ul {
+ list-style: none;
+ }
+}
+
+.favorites {
+ display: flex;
+ width: 100%;
+ overflow-x: auto;
+ gap: 15px;
+ flex-direction: row;
+
+ .favorite-card {
+ width: 450px;
+
+ img {
+ width: 100%;
+ min-width: 275px;
+ height: calc(100% - 50px);
+ object-fit: contain;
+ }
+
+ h4 {
+ padding: 10px 12px;
+ }
+ }
+}
+
+@media (max-width: 992px) {
+ #header-cart-button {
+ margin-right: 58px;
+ padding: 0;
+ }
+ .navbar {
+
+ .nav-link {
+ padding-left: 3rem;
+ }
+ }
+
+ #carousel-navigator {
+ display: none !important;
+ }
+}
+
+#product-carousel {
+ min-height: 400px;
+
+ .carousel-item img {
+ max-height: 400px;
+ object-fit: contain;
+ }
+}
+
+.thumb-button {
+ img {
+ max-width: 200px;
+ width: 200px;
+ max-height: 128px;
+ height: 128px;
+ object-fit: cover;
+ }
+
+ &:hover > img {
+ background: $vsh-orange;
+ }
+}
+
+.add-to-cart-button {
+ box-shadow: .125rem .125rem #e00751;
+ padding: .3125rem;
+ font-size: 1.25rem;
+ background: $vsh-orange;
+ color: #fafafa !important;
+ display: flex;
+ align-items: center;
+
+ .counter-wrapper .number-input {
+ margin-right: 15px;
+ }
+
+ .bag-button {
+ color: white;
+ font-weight: 600;
+ font-style: italic;
+ }
+}
+
+
+.product-card {
+ border: none;
+
+ .card-img-top {
+ height: 220px;
+ min-height: 220px;
+ max-height: 220px;
+ object-fit: contain;
+ }
+
+ .card-body {
+ padding: .5rem;
+ }
+
+ .placeholder {
+ object-fit: contain;
+ padding: 0 25px;
+ }
+}
+
+.dynamic-content img {
+ max-width: 100% !important;
+ object-fit: contain;
+}
+
+#payment-tab-content .tab-pane {
+ min-height: 75px;
+}
+
+#cart-modal {
+ padding: 0 !important;
+
+ .modal-dialog {
+ width: 450px;
+ }
+
+ @media (max-width: 451px) {
+ .modal-dialog {
+ width: 100%;
+ max-width: 100%;
+ transition: none;
+ }
+ }
+}
diff --git a/src/wwwroot/styles/variables.scss b/src/wwwroot/styles/variables.scss
new file mode 100644
index 0000000..6c51ebd
--- /dev/null
+++ b/src/wwwroot/styles/variables.scss
@@ -0,0 +1,3 @@
+$border-radius: 0;
+$vsh-orange: #ee741e;
+$primary: $vsh-orange;
diff --git a/src/wwwroot/styles/vendor/bootstrap-icons.all.scss b/src/wwwroot/styles/vendor/bootstrap-icons.all.scss
new file mode 100644
index 0000000..c7edcde
--- /dev/null
+++ b/src/wwwroot/styles/vendor/bootstrap-icons.all.scss
@@ -0,0 +1,1202 @@
+//v1.2.0
+.bi-alarm-fill::before { content: "\f101"; }
+.bi-alarm::before { content: "\f102"; }
+.bi-align-bottom::before { content: "\f103"; }
+.bi-align-center::before { content: "\f104"; }
+.bi-align-end::before { content: "\f105"; }
+.bi-align-middle::before { content: "\f106"; }
+.bi-align-start::before { content: "\f107"; }
+.bi-align-top::before { content: "\f108"; }
+.bi-alt::before { content: "\f109"; }
+.bi-app-indicator::before { content: "\f10a"; }
+.bi-app::before { content: "\f10b"; }
+.bi-archive-fill::before { content: "\f10c"; }
+.bi-archive::before { content: "\f10d"; }
+.bi-arrow-90deg-down::before { content: "\f10e"; }
+.bi-arrow-90deg-left::before { content: "\f10f"; }
+.bi-arrow-90deg-right::before { content: "\f110"; }
+.bi-arrow-90deg-up::before { content: "\f111"; }
+.bi-arrow-bar-down::before { content: "\f112"; }
+.bi-arrow-bar-left::before { content: "\f113"; }
+.bi-arrow-bar-right::before { content: "\f114"; }
+.bi-arrow-bar-up::before { content: "\f115"; }
+.bi-arrow-clockwise::before { content: "\f116"; }
+.bi-arrow-counterclockwise::before { content: "\f117"; }
+.bi-arrow-down-circle-fill::before { content: "\f118"; }
+.bi-arrow-down-circle::before { content: "\f119"; }
+.bi-arrow-down-left-circle-fill::before { content: "\f11a"; }
+.bi-arrow-down-left-circle::before { content: "\f11b"; }
+.bi-arrow-down-left-square-fill::before { content: "\f11c"; }
+.bi-arrow-down-left-square::before { content: "\f11d"; }
+.bi-arrow-down-left::before { content: "\f11e"; }
+.bi-arrow-down-right-circle-fill::before { content: "\f11f"; }
+.bi-arrow-down-right-circle::before { content: "\f120"; }
+.bi-arrow-down-right-square-fill::before { content: "\f121"; }
+.bi-arrow-down-right-square::before { content: "\f122"; }
+.bi-arrow-down-right::before { content: "\f123"; }
+.bi-arrow-down-short::before { content: "\f124"; }
+.bi-arrow-down-square-fill::before { content: "\f125"; }
+.bi-arrow-down-square::before { content: "\f126"; }
+.bi-arrow-down-up::before { content: "\f127"; }
+.bi-arrow-down::before { content: "\f128"; }
+.bi-arrow-left-circle-fill::before { content: "\f129"; }
+.bi-arrow-left-circle::before { content: "\f12a"; }
+.bi-arrow-left-right::before { content: "\f12b"; }
+.bi-arrow-left-short::before { content: "\f12c"; }
+.bi-arrow-left-square-fill::before { content: "\f12d"; }
+.bi-arrow-left-square::before { content: "\f12e"; }
+.bi-arrow-left::before { content: "\f12f"; }
+.bi-arrow-repeat::before { content: "\f130"; }
+.bi-arrow-return-left::before { content: "\f131"; }
+.bi-arrow-return-right::before { content: "\f132"; }
+.bi-arrow-right-circle-fill::before { content: "\f133"; }
+.bi-arrow-right-circle::before { content: "\f134"; }
+.bi-arrow-right-short::before { content: "\f135"; }
+.bi-arrow-right-square-fill::before { content: "\f136"; }
+.bi-arrow-right-square::before { content: "\f137"; }
+.bi-arrow-right::before { content: "\f138"; }
+.bi-arrow-up-circle-fill::before { content: "\f139"; }
+.bi-arrow-up-circle::before { content: "\f13a"; }
+.bi-arrow-up-left-circle-fill::before { content: "\f13b"; }
+.bi-arrow-up-left-circle::before { content: "\f13c"; }
+.bi-arrow-up-left-square-fill::before { content: "\f13d"; }
+.bi-arrow-up-left-square::before { content: "\f13e"; }
+.bi-arrow-up-left::before { content: "\f13f"; }
+.bi-arrow-up-right-circle-fill::before { content: "\f140"; }
+.bi-arrow-up-right-circle::before { content: "\f141"; }
+.bi-arrow-up-right-square-fill::before { content: "\f142"; }
+.bi-arrow-up-right-square::before { content: "\f143"; }
+.bi-arrow-up-right::before { content: "\f144"; }
+.bi-arrow-up-short::before { content: "\f145"; }
+.bi-arrow-up-square-fill::before { content: "\f146"; }
+.bi-arrow-up-square::before { content: "\f147"; }
+.bi-arrow-up::before { content: "\f148"; }
+.bi-arrows-angle-contract::before { content: "\f149"; }
+.bi-arrows-angle-expand::before { content: "\f14a"; }
+.bi-arrows-collapse::before { content: "\f14b"; }
+.bi-arrows-expand::before { content: "\f14c"; }
+.bi-arrows-fullscreen::before { content: "\f14d"; }
+.bi-arrows-move::before { content: "\f14e"; }
+.bi-aspect-ratio-fill::before { content: "\f14f"; }
+.bi-aspect-ratio::before { content: "\f150"; }
+.bi-asterisk::before { content: "\f151"; }
+.bi-at::before { content: "\f152"; }
+.bi-award-fill::before { content: "\f153"; }
+.bi-award::before { content: "\f154"; }
+.bi-back::before { content: "\f155"; }
+.bi-backspace-fill::before { content: "\f156"; }
+.bi-backspace-reverse-fill::before { content: "\f157"; }
+.bi-backspace-reverse::before { content: "\f158"; }
+.bi-backspace::before { content: "\f159"; }
+.bi-badge-4k-fill::before { content: "\f15a"; }
+.bi-badge-4k::before { content: "\f15b"; }
+.bi-badge-8k-fill::before { content: "\f15c"; }
+.bi-badge-8k::before { content: "\f15d"; }
+.bi-badge-ad-fill::before { content: "\f15e"; }
+.bi-badge-ad::before { content: "\f15f"; }
+.bi-badge-cc-fill::before { content: "\f160"; }
+.bi-badge-cc::before { content: "\f161"; }
+.bi-badge-hd-fill::before { content: "\f162"; }
+.bi-badge-hd::before { content: "\f163"; }
+.bi-badge-tm-fill::before { content: "\f164"; }
+.bi-badge-tm::before { content: "\f165"; }
+.bi-badge-vo-fill::before { content: "\f166"; }
+.bi-badge-vo::before { content: "\f167"; }
+.bi-bag-check-fill::before { content: "\f168"; }
+.bi-bag-check::before { content: "\f169"; }
+.bi-bag-dash-fill::before { content: "\f16a"; }
+.bi-bag-dash::before { content: "\f16b"; }
+.bi-bag-fill::before { content: "\f16c"; }
+.bi-bag-plus-fill::before { content: "\f16d"; }
+.bi-bag-plus::before { content: "\f16e"; }
+.bi-bag-x-fill::before { content: "\f16f"; }
+.bi-bag-x::before { content: "\f170"; }
+.bi-bag::before { content: "\f171"; }
+.bi-bar-chart-fill::before { content: "\f172"; }
+.bi-bar-chart-line-fill::before { content: "\f173"; }
+.bi-bar-chart-line::before { content: "\f174"; }
+.bi-bar-chart-steps::before { content: "\f175"; }
+.bi-bar-chart::before { content: "\f176"; }
+.bi-basket-fill::before { content: "\f177"; }
+.bi-basket::before { content: "\f178"; }
+.bi-basket2-fill::before { content: "\f179"; }
+.bi-basket2::before { content: "\f17a"; }
+.bi-basket3-fill::before { content: "\f17b"; }
+.bi-basket3::before { content: "\f17c"; }
+.bi-battery-charging::before { content: "\f17d"; }
+.bi-battery-full::before { content: "\f17e"; }
+.bi-battery-half::before { content: "\f17f"; }
+.bi-battery::before { content: "\f180"; }
+.bi-bell-fill::before { content: "\f181"; }
+.bi-bell::before { content: "\f182"; }
+.bi-bezier::before { content: "\f183"; }
+.bi-bezier2::before { content: "\f184"; }
+.bi-bicycle::before { content: "\f185"; }
+.bi-binoculars-fill::before { content: "\f186"; }
+.bi-binoculars::before { content: "\f187"; }
+.bi-blockquote-left::before { content: "\f188"; }
+.bi-blockquote-right::before { content: "\f189"; }
+.bi-book-fill::before { content: "\f18a"; }
+.bi-book-half::before { content: "\f18b"; }
+.bi-book::before { content: "\f18c"; }
+.bi-bookmark-check-fill::before { content: "\f18d"; }
+.bi-bookmark-check::before { content: "\f18e"; }
+.bi-bookmark-dash-fill::before { content: "\f18f"; }
+.bi-bookmark-dash::before { content: "\f190"; }
+.bi-bookmark-fill::before { content: "\f191"; }
+.bi-bookmark-heart-fill::before { content: "\f192"; }
+.bi-bookmark-heart::before { content: "\f193"; }
+.bi-bookmark-plus-fill::before { content: "\f194"; }
+.bi-bookmark-plus::before { content: "\f195"; }
+.bi-bookmark-star-fill::before { content: "\f196"; }
+.bi-bookmark-star::before { content: "\f197"; }
+.bi-bookmark-x-fill::before { content: "\f198"; }
+.bi-bookmark-x::before { content: "\f199"; }
+.bi-bookmark::before { content: "\f19a"; }
+.bi-bookmarks-fill::before { content: "\f19b"; }
+.bi-bookmarks::before { content: "\f19c"; }
+.bi-bookshelf::before { content: "\f19d"; }
+.bi-bootstrap-fill::before { content: "\f19e"; }
+.bi-bootstrap-reboot::before { content: "\f19f"; }
+.bi-bootstrap::before { content: "\f1a0"; }
+.bi-border-style::before { content: "\f1a1"; }
+.bi-border-width::before { content: "\f1a2"; }
+.bi-bounding-box-circles::before { content: "\f1a3"; }
+.bi-bounding-box::before { content: "\f1a4"; }
+.bi-box-arrow-down-left::before { content: "\f1a5"; }
+.bi-box-arrow-down-right::before { content: "\f1a6"; }
+.bi-box-arrow-down::before { content: "\f1a7"; }
+.bi-box-arrow-in-down-left::before { content: "\f1a8"; }
+.bi-box-arrow-in-down-right::before { content: "\f1a9"; }
+.bi-box-arrow-in-down::before { content: "\f1aa"; }
+.bi-box-arrow-in-left::before { content: "\f1ab"; }
+.bi-box-arrow-in-right::before { content: "\f1ac"; }
+.bi-box-arrow-in-up-left::before { content: "\f1ad"; }
+.bi-box-arrow-in-up-right::before { content: "\f1ae"; }
+.bi-box-arrow-in-up::before { content: "\f1af"; }
+.bi-box-arrow-left::before { content: "\f1b0"; }
+.bi-box-arrow-right::before { content: "\f1b1"; }
+.bi-box-arrow-up-left::before { content: "\f1b2"; }
+.bi-box-arrow-up-right::before { content: "\f1b3"; }
+.bi-box-arrow-up::before { content: "\f1b4"; }
+.bi-box-seam::before { content: "\f1b5"; }
+.bi-box::before { content: "\f1b6"; }
+.bi-braces::before { content: "\f1b7"; }
+.bi-bricks::before { content: "\f1b8"; }
+.bi-briefcase-fill::before { content: "\f1b9"; }
+.bi-briefcase::before { content: "\f1ba"; }
+.bi-brightness-alt-high-fill::before { content: "\f1bb"; }
+.bi-brightness-alt-high::before { content: "\f1bc"; }
+.bi-brightness-alt-low-fill::before { content: "\f1bd"; }
+.bi-brightness-alt-low::before { content: "\f1be"; }
+.bi-brightness-high-fill::before { content: "\f1bf"; }
+.bi-brightness-high::before { content: "\f1c0"; }
+.bi-brightness-low-fill::before { content: "\f1c1"; }
+.bi-brightness-low::before { content: "\f1c2"; }
+.bi-broadcast-pin::before { content: "\f1c3"; }
+.bi-broadcast::before { content: "\f1c4"; }
+.bi-brush-fill::before { content: "\f1c5"; }
+.bi-brush::before { content: "\f1c6"; }
+.bi-bucket-fill::before { content: "\f1c7"; }
+.bi-bucket::before { content: "\f1c8"; }
+.bi-bug-fill::before { content: "\f1c9"; }
+.bi-bug::before { content: "\f1ca"; }
+.bi-building::before { content: "\f1cb"; }
+.bi-bullseye::before { content: "\f1cc"; }
+.bi-calculator-fill::before { content: "\f1cd"; }
+.bi-calculator::before { content: "\f1ce"; }
+.bi-calendar-check-fill::before { content: "\f1cf"; }
+.bi-calendar-check::before { content: "\f1d0"; }
+.bi-calendar-date-fill::before { content: "\f1d1"; }
+.bi-calendar-date::before { content: "\f1d2"; }
+.bi-calendar-day-fill::before { content: "\f1d3"; }
+.bi-calendar-day::before { content: "\f1d4"; }
+.bi-calendar-event-fill::before { content: "\f1d5"; }
+.bi-calendar-event::before { content: "\f1d6"; }
+.bi-calendar-fill::before { content: "\f1d7"; }
+.bi-calendar-minus-fill::before { content: "\f1d8"; }
+.bi-calendar-minus::before { content: "\f1d9"; }
+.bi-calendar-month-fill::before { content: "\f1da"; }
+.bi-calendar-month::before { content: "\f1db"; }
+.bi-calendar-plus-fill::before { content: "\f1dc"; }
+.bi-calendar-plus::before { content: "\f1dd"; }
+.bi-calendar-range-fill::before { content: "\f1de"; }
+.bi-calendar-range::before { content: "\f1df"; }
+.bi-calendar-week-fill::before { content: "\f1e0"; }
+.bi-calendar-week::before { content: "\f1e1"; }
+.bi-calendar-x-fill::before { content: "\f1e2"; }
+.bi-calendar-x::before { content: "\f1e3"; }
+.bi-calendar::before { content: "\f1e4"; }
+.bi-calendar2-check-fill::before { content: "\f1e5"; }
+.bi-calendar2-check::before { content: "\f1e6"; }
+.bi-calendar2-date-fill::before { content: "\f1e7"; }
+.bi-calendar2-date::before { content: "\f1e8"; }
+.bi-calendar2-day-fill::before { content: "\f1e9"; }
+.bi-calendar2-day::before { content: "\f1ea"; }
+.bi-calendar2-event-fill::before { content: "\f1eb"; }
+.bi-calendar2-event::before { content: "\f1ec"; }
+.bi-calendar2-fill::before { content: "\f1ed"; }
+.bi-calendar2-minus-fill::before { content: "\f1ee"; }
+.bi-calendar2-minus::before { content: "\f1ef"; }
+.bi-calendar2-month-fill::before { content: "\f1f0"; }
+.bi-calendar2-month::before { content: "\f1f1"; }
+.bi-calendar2-plus-fill::before { content: "\f1f2"; }
+.bi-calendar2-plus::before { content: "\f1f3"; }
+.bi-calendar2-range-fill::before { content: "\f1f4"; }
+.bi-calendar2-range::before { content: "\f1f5"; }
+.bi-calendar2-week-fill::before { content: "\f1f6"; }
+.bi-calendar2-week::before { content: "\f1f7"; }
+.bi-calendar2-x-fill::before { content: "\f1f8"; }
+.bi-calendar2-x::before { content: "\f1f9"; }
+.bi-calendar2::before { content: "\f1fa"; }
+.bi-calendar3-event-fill::before { content: "\f1fb"; }
+.bi-calendar3-event::before { content: "\f1fc"; }
+.bi-calendar3-fill::before { content: "\f1fd"; }
+.bi-calendar3-range-fill::before { content: "\f1fe"; }
+.bi-calendar3-range::before { content: "\f1ff"; }
+.bi-calendar3-week-fill::before { content: "\f200"; }
+.bi-calendar3-week::before { content: "\f201"; }
+.bi-calendar3::before { content: "\f202"; }
+.bi-calendar4-event::before { content: "\f203"; }
+.bi-calendar4-range::before { content: "\f204"; }
+.bi-calendar4-week::before { content: "\f205"; }
+.bi-calendar4::before { content: "\f206"; }
+.bi-camera-fill::before { content: "\f207"; }
+.bi-camera-reels-fill::before { content: "\f208"; }
+.bi-camera-reels::before { content: "\f209"; }
+.bi-camera-video-fill::before { content: "\f20a"; }
+.bi-camera-video-off-fill::before { content: "\f20b"; }
+.bi-camera-video-off::before { content: "\f20c"; }
+.bi-camera-video::before { content: "\f20d"; }
+.bi-camera::before { content: "\f20e"; }
+.bi-camera2::before { content: "\f20f"; }
+.bi-capslock-fill::before { content: "\f210"; }
+.bi-capslock::before { content: "\f211"; }
+.bi-card-checklist::before { content: "\f212"; }
+.bi-card-heading::before { content: "\f213"; }
+.bi-card-image::before { content: "\f214"; }
+.bi-card-list::before { content: "\f215"; }
+.bi-card-text::before { content: "\f216"; }
+.bi-caret-down-fill::before { content: "\f217"; }
+.bi-caret-down-square-fill::before { content: "\f218"; }
+.bi-caret-down-square::before { content: "\f219"; }
+.bi-caret-down::before { content: "\f21a"; }
+.bi-caret-left-fill::before { content: "\f21b"; }
+.bi-caret-left-square-fill::before { content: "\f21c"; }
+.bi-caret-left-square::before { content: "\f21d"; }
+.bi-caret-left::before { content: "\f21e"; }
+.bi-caret-right-fill::before { content: "\f21f"; }
+.bi-caret-right-square-fill::before { content: "\f220"; }
+.bi-caret-right-square::before { content: "\f221"; }
+.bi-caret-right::before { content: "\f222"; }
+.bi-caret-up-fill::before { content: "\f223"; }
+.bi-caret-up-square-fill::before { content: "\f224"; }
+.bi-caret-up-square::before { content: "\f225"; }
+.bi-caret-up::before { content: "\f226"; }
+.bi-cart-check-fill::before { content: "\f227"; }
+.bi-cart-check::before { content: "\f228"; }
+.bi-cart-dash-fill::before { content: "\f229"; }
+.bi-cart-dash::before { content: "\f22a"; }
+.bi-cart-fill::before { content: "\f22b"; }
+.bi-cart-plus-fill::before { content: "\f22c"; }
+.bi-cart-plus::before { content: "\f22d"; }
+.bi-cart-x-fill::before { content: "\f22e"; }
+.bi-cart-x::before { content: "\f22f"; }
+.bi-cart::before { content: "\f230"; }
+.bi-cart2::before { content: "\f231"; }
+.bi-cart3::before { content: "\f232"; }
+.bi-cart4::before { content: "\f233"; }
+.bi-cash-stack::before { content: "\f234"; }
+.bi-cash::before { content: "\f235"; }
+.bi-cast::before { content: "\f236"; }
+.bi-chat-dots-fill::before { content: "\f237"; }
+.bi-chat-dots::before { content: "\f238"; }
+.bi-chat-fill::before { content: "\f239"; }
+.bi-chat-left-dots-fill::before { content: "\f23a"; }
+.bi-chat-left-dots::before { content: "\f23b"; }
+.bi-chat-left-fill::before { content: "\f23c"; }
+.bi-chat-left-quote-fill::before { content: "\f23d"; }
+.bi-chat-left-quote::before { content: "\f23e"; }
+.bi-chat-left-text-fill::before { content: "\f23f"; }
+.bi-chat-left-text::before { content: "\f240"; }
+.bi-chat-left::before { content: "\f241"; }
+.bi-chat-quote-fill::before { content: "\f242"; }
+.bi-chat-quote::before { content: "\f243"; }
+.bi-chat-right-dots-fill::before { content: "\f244"; }
+.bi-chat-right-dots::before { content: "\f245"; }
+.bi-chat-right-fill::before { content: "\f246"; }
+.bi-chat-right-quote-fill::before { content: "\f247"; }
+.bi-chat-right-quote::before { content: "\f248"; }
+.bi-chat-right-text-fill::before { content: "\f249"; }
+.bi-chat-right-text::before { content: "\f24a"; }
+.bi-chat-right::before { content: "\f24b"; }
+.bi-chat-square-dots-fill::before { content: "\f24c"; }
+.bi-chat-square-dots::before { content: "\f24d"; }
+.bi-chat-square-fill::before { content: "\f24e"; }
+.bi-chat-square-quote-fill::before { content: "\f24f"; }
+.bi-chat-square-quote::before { content: "\f250"; }
+.bi-chat-square-text-fill::before { content: "\f251"; }
+.bi-chat-square-text::before { content: "\f252"; }
+.bi-chat-square::before { content: "\f253"; }
+.bi-chat-text-fill::before { content: "\f254"; }
+.bi-chat-text::before { content: "\f255"; }
+.bi-chat::before { content: "\f256"; }
+.bi-check-all::before { content: "\f257"; }
+.bi-check-circle-fill::before { content: "\f258"; }
+.bi-check-circle::before { content: "\f259"; }
+.bi-check-square-fill::before { content: "\f25a"; }
+.bi-check-square::before { content: "\f25b"; }
+.bi-check::before { content: "\f25c"; }
+.bi-check2-all::before { content: "\f25d"; }
+.bi-check2-circle::before { content: "\f25e"; }
+.bi-check2-square::before { content: "\f25f"; }
+.bi-check2::before { content: "\f260"; }
+.bi-chevron-bar-contract::before { content: "\f261"; }
+.bi-chevron-bar-down::before { content: "\f262"; }
+.bi-chevron-bar-expand::before { content: "\f263"; }
+.bi-chevron-bar-left::before { content: "\f264"; }
+.bi-chevron-bar-right::before { content: "\f265"; }
+.bi-chevron-bar-up::before { content: "\f266"; }
+.bi-chevron-compact-down::before { content: "\f267"; }
+.bi-chevron-compact-left::before { content: "\f268"; }
+.bi-chevron-compact-right::before { content: "\f269"; }
+.bi-chevron-compact-up::before { content: "\f26a"; }
+.bi-chevron-contract::before { content: "\f26b"; }
+.bi-chevron-double-down::before { content: "\f26c"; }
+.bi-chevron-double-left::before { content: "\f26d"; }
+.bi-chevron-double-right::before { content: "\f26e"; }
+.bi-chevron-double-up::before { content: "\f26f"; }
+.bi-chevron-down::before { content: "\f270"; }
+.bi-chevron-expand::before { content: "\f271"; }
+.bi-chevron-left::before { content: "\f272"; }
+.bi-chevron-right::before { content: "\f273"; }
+.bi-chevron-up::before { content: "\f274"; }
+.bi-circle-fill::before { content: "\f275"; }
+.bi-circle-half::before { content: "\f276"; }
+.bi-circle-square::before { content: "\f277"; }
+.bi-circle::before { content: "\f278"; }
+.bi-clipboard-check::before { content: "\f279"; }
+.bi-clipboard-data::before { content: "\f27a"; }
+.bi-clipboard-minus::before { content: "\f27b"; }
+.bi-clipboard-plus::before { content: "\f27c"; }
+.bi-clipboard-x::before { content: "\f27d"; }
+.bi-clipboard::before { content: "\f27e"; }
+.bi-clock-fill::before { content: "\f27f"; }
+.bi-clock-history::before { content: "\f280"; }
+.bi-clock::before { content: "\f281"; }
+.bi-cloud-arrow-down-fill::before { content: "\f282"; }
+.bi-cloud-arrow-down::before { content: "\f283"; }
+.bi-cloud-arrow-up-fill::before { content: "\f284"; }
+.bi-cloud-arrow-up::before { content: "\f285"; }
+.bi-cloud-check-fill::before { content: "\f286"; }
+.bi-cloud-check::before { content: "\f287"; }
+.bi-cloud-download-fill::before { content: "\f288"; }
+.bi-cloud-download::before { content: "\f289"; }
+.bi-cloud-fill::before { content: "\f28a"; }
+.bi-cloud-minus-fill::before { content: "\f28b"; }
+.bi-cloud-minus::before { content: "\f28c"; }
+.bi-cloud-plus-fill::before { content: "\f28d"; }
+.bi-cloud-plus::before { content: "\f28e"; }
+.bi-cloud-slash-fill::before { content: "\f28f"; }
+.bi-cloud-slash::before { content: "\f290"; }
+.bi-cloud-upload-fill::before { content: "\f291"; }
+.bi-cloud-upload::before { content: "\f292"; }
+.bi-cloud::before { content: "\f293"; }
+.bi-code-slash::before { content: "\f294"; }
+.bi-code-square::before { content: "\f295"; }
+.bi-code::before { content: "\f296"; }
+.bi-collection-fill::before { content: "\f297"; }
+.bi-collection-play-fill::before { content: "\f298"; }
+.bi-collection-play::before { content: "\f299"; }
+.bi-collection::before { content: "\f29a"; }
+.bi-columns-gap::before { content: "\f29b"; }
+.bi-columns::before { content: "\f29c"; }
+.bi-command::before { content: "\f29d"; }
+.bi-compass-fill::before { content: "\f29e"; }
+.bi-compass::before { content: "\f29f"; }
+.bi-cone-striped::before { content: "\f2a0"; }
+.bi-cone::before { content: "\f2a1"; }
+.bi-controller::before { content: "\f2a2"; }
+.bi-cpu-fill::before { content: "\f2a3"; }
+.bi-cpu::before { content: "\f2a4"; }
+.bi-credit-card-2-back-fill::before { content: "\f2a5"; }
+.bi-credit-card-2-back::before { content: "\f2a6"; }
+.bi-credit-card-2-front-fill::before { content: "\f2a7"; }
+.bi-credit-card-2-front::before { content: "\f2a8"; }
+.bi-credit-card-fill::before { content: "\f2a9"; }
+.bi-credit-card::before { content: "\f2aa"; }
+.bi-crop::before { content: "\f2ab"; }
+.bi-cup-fill::before { content: "\f2ac"; }
+.bi-cup-straw::before { content: "\f2ad"; }
+.bi-cup::before { content: "\f2ae"; }
+.bi-cursor-fill::before { content: "\f2af"; }
+.bi-cursor-text::before { content: "\f2b0"; }
+.bi-cursor::before { content: "\f2b1"; }
+.bi-dash-circle-fill::before { content: "\f2b2"; }
+.bi-dash-circle::before { content: "\f2b3"; }
+.bi-dash-square-fill::before { content: "\f2b4"; }
+.bi-dash-square::before { content: "\f2b5"; }
+.bi-dash::before { content: "\f2b6"; }
+.bi-diagram-2-fill::before { content: "\f2b7"; }
+.bi-diagram-2::before { content: "\f2b8"; }
+.bi-diagram-3-fill::before { content: "\f2b9"; }
+.bi-diagram-3::before { content: "\f2ba"; }
+.bi-diamond-fill::before { content: "\f2bb"; }
+.bi-diamond-half::before { content: "\f2bc"; }
+.bi-diamond::before { content: "\f2bd"; }
+.bi-dice-1-fill::before { content: "\f2be"; }
+.bi-dice-1::before { content: "\f2bf"; }
+.bi-dice-2-fill::before { content: "\f2c0"; }
+.bi-dice-2::before { content: "\f2c1"; }
+.bi-dice-3-fill::before { content: "\f2c2"; }
+.bi-dice-3::before { content: "\f2c3"; }
+.bi-dice-4-fill::before { content: "\f2c4"; }
+.bi-dice-4::before { content: "\f2c5"; }
+.bi-dice-5-fill::before { content: "\f2c6"; }
+.bi-dice-5::before { content: "\f2c7"; }
+.bi-dice-6-fill::before { content: "\f2c8"; }
+.bi-dice-6::before { content: "\f2c9"; }
+.bi-disc-fill::before { content: "\f2ca"; }
+.bi-disc::before { content: "\f2cb"; }
+.bi-discord::before { content: "\f2cc"; }
+.bi-display-fill::before { content: "\f2cd"; }
+.bi-display::before { content: "\f2ce"; }
+.bi-distribute-horizontal::before { content: "\f2cf"; }
+.bi-distribute-vertical::before { content: "\f2d0"; }
+.bi-door-closed-fill::before { content: "\f2d1"; }
+.bi-door-closed::before { content: "\f2d2"; }
+.bi-door-open-fill::before { content: "\f2d3"; }
+.bi-door-open::before { content: "\f2d4"; }
+.bi-dot::before { content: "\f2d5"; }
+.bi-download::before { content: "\f2d6"; }
+.bi-droplet-fill::before { content: "\f2d7"; }
+.bi-droplet-half::before { content: "\f2d8"; }
+.bi-droplet::before { content: "\f2d9"; }
+.bi-earbuds::before { content: "\f2da"; }
+.bi-easel-fill::before { content: "\f2db"; }
+.bi-easel::before { content: "\f2dc"; }
+.bi-egg-fill::before { content: "\f2dd"; }
+.bi-egg-fried::before { content: "\f2de"; }
+.bi-egg::before { content: "\f2df"; }
+.bi-eject-fill::before { content: "\f2e0"; }
+.bi-eject::before { content: "\f2e1"; }
+.bi-emoji-angry-fill::before { content: "\f2e2"; }
+.bi-emoji-angry::before { content: "\f2e3"; }
+.bi-emoji-dizzy-fill::before { content: "\f2e4"; }
+.bi-emoji-dizzy::before { content: "\f2e5"; }
+.bi-emoji-expressionless-fill::before { content: "\f2e6"; }
+.bi-emoji-expressionless::before { content: "\f2e7"; }
+.bi-emoji-frown-fill::before { content: "\f2e8"; }
+.bi-emoji-frown::before { content: "\f2e9"; }
+.bi-emoji-heart-eyes-fill::before { content: "\f2ea"; }
+.bi-emoji-heart-eyes::before { content: "\f2eb"; }
+.bi-emoji-laughing-fill::before { content: "\f2ec"; }
+.bi-emoji-laughing::before { content: "\f2ed"; }
+.bi-emoji-neutral-fill::before { content: "\f2ee"; }
+.bi-emoji-neutral::before { content: "\f2ef"; }
+.bi-emoji-smile-fill::before { content: "\f2f0"; }
+.bi-emoji-smile-upside-down-fill::before { content: "\f2f1"; }
+.bi-emoji-smile-upside-down::before { content: "\f2f2"; }
+.bi-emoji-smile::before { content: "\f2f3"; }
+.bi-emoji-sunglasses-fill::before { content: "\f2f4"; }
+.bi-emoji-sunglasses::before { content: "\f2f5"; }
+.bi-emoji-wink-fill::before { content: "\f2f6"; }
+.bi-emoji-wink::before { content: "\f2f7"; }
+.bi-envelope-fill::before { content: "\f2f8"; }
+.bi-envelope-open-fill::before { content: "\f2f9"; }
+.bi-envelope-open::before { content: "\f2fa"; }
+.bi-envelope::before { content: "\f2fb"; }
+.bi-exclamation-circle-fill::before { content: "\f2fc"; }
+.bi-exclamation-circle::before { content: "\f2fd"; }
+.bi-exclamation-diamond-fill::before { content: "\f2fe"; }
+.bi-exclamation-diamond::before { content: "\f2ff"; }
+.bi-exclamation-octagon-fill::before { content: "\f300"; }
+.bi-exclamation-octagon::before { content: "\f301"; }
+.bi-exclamation-square-fill::before { content: "\f302"; }
+.bi-exclamation-square::before { content: "\f303"; }
+.bi-exclamation-triangle-fill::before { content: "\f304"; }
+.bi-exclamation-triangle::before { content: "\f305"; }
+.bi-exclamation::before { content: "\f306"; }
+.bi-exclude::before { content: "\f307"; }
+.bi-eye-fill::before { content: "\f308"; }
+.bi-eye-slash-fill::before { content: "\f309"; }
+.bi-eye-slash::before { content: "\f30a"; }
+.bi-eye::before { content: "\f30b"; }
+.bi-eyeglasses::before { content: "\f30c"; }
+.bi-facebook::before { content: "\f30d"; }
+.bi-file-arrow-down-fill::before { content: "\f30e"; }
+.bi-file-arrow-down::before { content: "\f30f"; }
+.bi-file-arrow-up-fill::before { content: "\f310"; }
+.bi-file-arrow-up::before { content: "\f311"; }
+.bi-file-bar-graph-fill::before { content: "\f312"; }
+.bi-file-bar-graph::before { content: "\f313"; }
+.bi-file-binary-fill::before { content: "\f314"; }
+.bi-file-binary::before { content: "\f315"; }
+.bi-file-break-fill::before { content: "\f316"; }
+.bi-file-break::before { content: "\f317"; }
+.bi-file-check-fill::before { content: "\f318"; }
+.bi-file-check::before { content: "\f319"; }
+.bi-file-code-fill::before { content: "\f31a"; }
+.bi-file-code::before { content: "\f31b"; }
+.bi-file-diff-fill::before { content: "\f31c"; }
+.bi-file-diff::before { content: "\f31d"; }
+.bi-file-earmark-arrow-down-fill::before { content: "\f31e"; }
+.bi-file-earmark-arrow-down::before { content: "\f31f"; }
+.bi-file-earmark-arrow-up-fill::before { content: "\f320"; }
+.bi-file-earmark-arrow-up::before { content: "\f321"; }
+.bi-file-earmark-bar-graph-fill::before { content: "\f322"; }
+.bi-file-earmark-bar-graph::before { content: "\f323"; }
+.bi-file-earmark-binary-fill::before { content: "\f324"; }
+.bi-file-earmark-binary::before { content: "\f325"; }
+.bi-file-earmark-break-fill::before { content: "\f326"; }
+.bi-file-earmark-break::before { content: "\f327"; }
+.bi-file-earmark-check-fill::before { content: "\f328"; }
+.bi-file-earmark-check::before { content: "\f329"; }
+.bi-file-earmark-code-fill::before { content: "\f32a"; }
+.bi-file-earmark-code::before { content: "\f32b"; }
+.bi-file-earmark-diff-fill::before { content: "\f32c"; }
+.bi-file-earmark-diff::before { content: "\f32d"; }
+.bi-file-earmark-easel-fill::before { content: "\f32e"; }
+.bi-file-earmark-easel::before { content: "\f32f"; }
+.bi-file-earmark-excel-fill::before { content: "\f330"; }
+.bi-file-earmark-excel::before { content: "\f331"; }
+.bi-file-earmark-fill::before { content: "\f332"; }
+.bi-file-earmark-font-fill::before { content: "\f333"; }
+.bi-file-earmark-font::before { content: "\f334"; }
+.bi-file-earmark-image-fill::before { content: "\f335"; }
+.bi-file-earmark-image::before { content: "\f336"; }
+.bi-file-earmark-lock-fill::before { content: "\f337"; }
+.bi-file-earmark-lock::before { content: "\f338"; }
+.bi-file-earmark-lock2-fill::before { content: "\f339"; }
+.bi-file-earmark-lock2::before { content: "\f33a"; }
+.bi-file-earmark-medical-fill::before { content: "\f33b"; }
+.bi-file-earmark-medical::before { content: "\f33c"; }
+.bi-file-earmark-minus-fill::before { content: "\f33d"; }
+.bi-file-earmark-minus::before { content: "\f33e"; }
+.bi-file-earmark-music-fill::before { content: "\f33f"; }
+.bi-file-earmark-music::before { content: "\f340"; }
+.bi-file-earmark-person-fill::before { content: "\f341"; }
+.bi-file-earmark-person::before { content: "\f342"; }
+.bi-file-earmark-play-fill::before { content: "\f343"; }
+.bi-file-earmark-play::before { content: "\f344"; }
+.bi-file-earmark-plus-fill::before { content: "\f345"; }
+.bi-file-earmark-plus::before { content: "\f346"; }
+.bi-file-earmark-post-fill::before { content: "\f347"; }
+.bi-file-earmark-post::before { content: "\f348"; }
+.bi-file-earmark-ppt-fill::before { content: "\f349"; }
+.bi-file-earmark-ppt::before { content: "\f34a"; }
+.bi-file-earmark-richtext-fill::before { content: "\f34b"; }
+.bi-file-earmark-richtext::before { content: "\f34c"; }
+.bi-file-earmark-ruled-fill::before { content: "\f34d"; }
+.bi-file-earmark-ruled::before { content: "\f34e"; }
+.bi-file-earmark-slides-fill::before { content: "\f34f"; }
+.bi-file-earmark-slides::before { content: "\f350"; }
+.bi-file-earmark-spreadsheet-fill::before { content: "\f351"; }
+.bi-file-earmark-spreadsheet::before { content: "\f352"; }
+.bi-file-earmark-text-fill::before { content: "\f353"; }
+.bi-file-earmark-text::before { content: "\f354"; }
+.bi-file-earmark-word-fill::before { content: "\f355"; }
+.bi-file-earmark-word::before { content: "\f356"; }
+.bi-file-earmark-x-fill::before { content: "\f357"; }
+.bi-file-earmark-x::before { content: "\f358"; }
+.bi-file-earmark-zip-fill::before { content: "\f359"; }
+.bi-file-earmark-zip::before { content: "\f35a"; }
+.bi-file-earmark::before { content: "\f35b"; }
+.bi-file-easel-fill::before { content: "\f35c"; }
+.bi-file-easel::before { content: "\f35d"; }
+.bi-file-excel-fill::before { content: "\f35e"; }
+.bi-file-excel::before { content: "\f35f"; }
+.bi-file-fill::before { content: "\f360"; }
+.bi-file-font-fill::before { content: "\f361"; }
+.bi-file-font::before { content: "\f362"; }
+.bi-file-image-fill::before { content: "\f363"; }
+.bi-file-image::before { content: "\f364"; }
+.bi-file-lock-fill::before { content: "\f365"; }
+.bi-file-lock::before { content: "\f366"; }
+.bi-file-lock2-fill::before { content: "\f367"; }
+.bi-file-lock2::before { content: "\f368"; }
+.bi-file-medical-fill::before { content: "\f369"; }
+.bi-file-medical::before { content: "\f36a"; }
+.bi-file-minus-fill::before { content: "\f36b"; }
+.bi-file-minus::before { content: "\f36c"; }
+.bi-file-music-fill::before { content: "\f36d"; }
+.bi-file-music::before { content: "\f36e"; }
+.bi-file-person-fill::before { content: "\f36f"; }
+.bi-file-person::before { content: "\f370"; }
+.bi-file-play-fill::before { content: "\f371"; }
+.bi-file-play::before { content: "\f372"; }
+.bi-file-plus-fill::before { content: "\f373"; }
+.bi-file-plus::before { content: "\f374"; }
+.bi-file-post-fill::before { content: "\f375"; }
+.bi-file-post::before { content: "\f376"; }
+.bi-file-ppt-fill::before { content: "\f377"; }
+.bi-file-ppt::before { content: "\f378"; }
+.bi-file-richtext-fill::before { content: "\f379"; }
+.bi-file-richtext::before { content: "\f37a"; }
+.bi-file-ruled-fill::before { content: "\f37b"; }
+.bi-file-ruled::before { content: "\f37c"; }
+.bi-file-slides-fill::before { content: "\f37d"; }
+.bi-file-slides::before { content: "\f37e"; }
+.bi-file-spreadsheet-fill::before { content: "\f37f"; }
+.bi-file-spreadsheet::before { content: "\f380"; }
+.bi-file-text-fill::before { content: "\f381"; }
+.bi-file-text::before { content: "\f382"; }
+.bi-file-word-fill::before { content: "\f383"; }
+.bi-file-word::before { content: "\f384"; }
+.bi-file-x-fill::before { content: "\f385"; }
+.bi-file-x::before { content: "\f386"; }
+.bi-file-zip-fill::before { content: "\f387"; }
+.bi-file-zip::before { content: "\f388"; }
+.bi-file::before { content: "\f389"; }
+.bi-files-alt::before { content: "\f38a"; }
+.bi-files::before { content: "\f38b"; }
+.bi-film::before { content: "\f38c"; }
+.bi-filter-circle-fill::before { content: "\f38d"; }
+.bi-filter-circle::before { content: "\f38e"; }
+.bi-filter-left::before { content: "\f38f"; }
+.bi-filter-right::before { content: "\f390"; }
+.bi-filter-square-fill::before { content: "\f391"; }
+.bi-filter-square::before { content: "\f392"; }
+.bi-filter::before { content: "\f393"; }
+.bi-flag-fill::before { content: "\f394"; }
+.bi-flag::before { content: "\f395"; }
+.bi-flower1::before { content: "\f396"; }
+.bi-flower2::before { content: "\f397"; }
+.bi-flower3::before { content: "\f398"; }
+.bi-folder-check::before { content: "\f399"; }
+.bi-folder-fill::before { content: "\f39a"; }
+.bi-folder-minus::before { content: "\f39b"; }
+.bi-folder-plus::before { content: "\f39c"; }
+.bi-folder-symlink-fill::before { content: "\f39d"; }
+.bi-folder-symlink::before { content: "\f39e"; }
+.bi-folder-x::before { content: "\f39f"; }
+.bi-folder::before { content: "\f3a0"; }
+.bi-folder2-open::before { content: "\f3a1"; }
+.bi-folder2::before { content: "\f3a2"; }
+.bi-fonts::before { content: "\f3a3"; }
+.bi-forward-fill::before { content: "\f3a4"; }
+.bi-forward::before { content: "\f3a5"; }
+.bi-front::before { content: "\f3a6"; }
+.bi-fullscreen-exit::before { content: "\f3a7"; }
+.bi-fullscreen::before { content: "\f3a8"; }
+.bi-funnel-fill::before { content: "\f3a9"; }
+.bi-funnel::before { content: "\f3aa"; }
+.bi-gear-fill::before { content: "\f3ab"; }
+.bi-gear-wide-connected::before { content: "\f3ac"; }
+.bi-gear-wide::before { content: "\f3ad"; }
+.bi-gear::before { content: "\f3ae"; }
+.bi-gem::before { content: "\f3af"; }
+.bi-geo-alt-fill::before { content: "\f3b0"; }
+.bi-geo-alt::before { content: "\f3b1"; }
+.bi-geo-fill::before { content: "\f3b2"; }
+.bi-geo::before { content: "\f3b3"; }
+.bi-gift-fill::before { content: "\f3b4"; }
+.bi-gift::before { content: "\f3b5"; }
+.bi-github::before { content: "\f3b6"; }
+.bi-globe::before { content: "\f3b7"; }
+.bi-globe2::before { content: "\f3b8"; }
+.bi-google::before { content: "\f3b9"; }
+.bi-graph-down::before { content: "\f3ba"; }
+.bi-graph-up::before { content: "\f3bb"; }
+.bi-grid-1x2-fill::before { content: "\f3bc"; }
+.bi-grid-1x2::before { content: "\f3bd"; }
+.bi-grid-3x2-gap-fill::before { content: "\f3be"; }
+.bi-grid-3x2-gap::before { content: "\f3bf"; }
+.bi-grid-3x2::before { content: "\f3c0"; }
+.bi-grid-3x3-gap-fill::before { content: "\f3c1"; }
+.bi-grid-3x3-gap::before { content: "\f3c2"; }
+.bi-grid-3x3::before { content: "\f3c3"; }
+.bi-grid-fill::before { content: "\f3c4"; }
+.bi-grid::before { content: "\f3c5"; }
+.bi-grip-horizontal::before { content: "\f3c6"; }
+.bi-grip-vertical::before { content: "\f3c7"; }
+.bi-hammer::before { content: "\f3c8"; }
+.bi-hand-index-thumb::before { content: "\f3c9"; }
+.bi-hand-index::before { content: "\f3ca"; }
+.bi-hand-thumbs-down::before { content: "\f3cb"; }
+.bi-hand-thumbs-up::before { content: "\f3cc"; }
+.bi-handbag-fill::before { content: "\f3cd"; }
+.bi-handbag::before { content: "\f3ce"; }
+.bi-hash::before { content: "\f3cf"; }
+.bi-hdd-fill::before { content: "\f3d0"; }
+.bi-hdd-network-fill::before { content: "\f3d1"; }
+.bi-hdd-network::before { content: "\f3d2"; }
+.bi-hdd-rack-fill::before { content: "\f3d3"; }
+.bi-hdd-rack::before { content: "\f3d4"; }
+.bi-hdd-stack-fill::before { content: "\f3d5"; }
+.bi-hdd-stack::before { content: "\f3d6"; }
+.bi-hdd::before { content: "\f3d7"; }
+.bi-headphones::before { content: "\f3d8"; }
+.bi-headset::before { content: "\f3d9"; }
+.bi-heart-fill::before { content: "\f3da"; }
+.bi-heart-half::before { content: "\f3db"; }
+.bi-heart::before { content: "\f3dc"; }
+.bi-heptagon-fill::before { content: "\f3dd"; }
+.bi-heptagon-half::before { content: "\f3de"; }
+.bi-heptagon::before { content: "\f3df"; }
+.bi-hexagon-fill::before { content: "\f3e0"; }
+.bi-hexagon-half::before { content: "\f3e1"; }
+.bi-hexagon::before { content: "\f3e2"; }
+.bi-hourglass-bottom::before { content: "\f3e3"; }
+.bi-hourglass-split::before { content: "\f3e4"; }
+.bi-hourglass-top::before { content: "\f3e5"; }
+.bi-hourglass::before { content: "\f3e6"; }
+.bi-house-door-fill::before { content: "\f3e7"; }
+.bi-house-door::before { content: "\f3e8"; }
+.bi-house-fill::before { content: "\f3e9"; }
+.bi-house::before { content: "\f3ea"; }
+.bi-hr::before { content: "\f3eb"; }
+.bi-image-alt::before { content: "\f3ec"; }
+.bi-image-fill::before { content: "\f3ed"; }
+.bi-image::before { content: "\f3ee"; }
+.bi-images::before { content: "\f3ef"; }
+.bi-inbox-fill::before { content: "\f3f0"; }
+.bi-inbox::before { content: "\f3f1"; }
+.bi-inboxes-fill::before { content: "\f3f2"; }
+.bi-inboxes::before { content: "\f3f3"; }
+.bi-info-circle-fill::before { content: "\f3f4"; }
+.bi-info-circle::before { content: "\f3f5"; }
+.bi-info-square-fill::before { content: "\f3f6"; }
+.bi-info-square::before { content: "\f3f7"; }
+.bi-info::before { content: "\f3f8"; }
+.bi-input-cursor-text::before { content: "\f3f9"; }
+.bi-input-cursor::before { content: "\f3fa"; }
+.bi-instagram::before { content: "\f3fb"; }
+.bi-intersect::before { content: "\f3fc"; }
+.bi-journal-album::before { content: "\f3fd"; }
+.bi-journal-arrow-down::before { content: "\f3fe"; }
+.bi-journal-arrow-up::before { content: "\f3ff"; }
+.bi-journal-bookmark-fill::before { content: "\f400"; }
+.bi-journal-bookmark::before { content: "\f401"; }
+.bi-journal-check::before { content: "\f402"; }
+.bi-journal-code::before { content: "\f403"; }
+.bi-journal-medical::before { content: "\f404"; }
+.bi-journal-minus::before { content: "\f405"; }
+.bi-journal-plus::before { content: "\f406"; }
+.bi-journal-richtext::before { content: "\f407"; }
+.bi-journal-text::before { content: "\f408"; }
+.bi-journal-x::before { content: "\f409"; }
+.bi-journal::before { content: "\f40a"; }
+.bi-journals::before { content: "\f40b"; }
+.bi-joystick::before { content: "\f40c"; }
+.bi-justify-left::before { content: "\f40d"; }
+.bi-justify-right::before { content: "\f40e"; }
+.bi-justify::before { content: "\f40f"; }
+.bi-kanban-fill::before { content: "\f410"; }
+.bi-kanban::before { content: "\f411"; }
+.bi-key-fill::before { content: "\f412"; }
+.bi-key::before { content: "\f413"; }
+.bi-keyboard-fill::before { content: "\f414"; }
+.bi-keyboard::before { content: "\f415"; }
+.bi-ladder::before { content: "\f416"; }
+.bi-lamp-fill::before { content: "\f417"; }
+.bi-lamp::before { content: "\f418"; }
+.bi-laptop-fill::before { content: "\f419"; }
+.bi-laptop::before { content: "\f41a"; }
+.bi-layers-fill::before { content: "\f41b"; }
+.bi-layers-half::before { content: "\f41c"; }
+.bi-layers::before { content: "\f41d"; }
+.bi-layout-sidebar-inset-reverse::before { content: "\f41e"; }
+.bi-layout-sidebar-inset::before { content: "\f41f"; }
+.bi-layout-sidebar-reverse::before { content: "\f420"; }
+.bi-layout-sidebar::before { content: "\f421"; }
+.bi-layout-split::before { content: "\f422"; }
+.bi-layout-text-sidebar-reverse::before { content: "\f423"; }
+.bi-layout-text-sidebar::before { content: "\f424"; }
+.bi-layout-text-window-reverse::before { content: "\f425"; }
+.bi-layout-text-window::before { content: "\f426"; }
+.bi-layout-three-columns::before { content: "\f427"; }
+.bi-layout-wtf::before { content: "\f428"; }
+.bi-life-preserver::before { content: "\f429"; }
+.bi-lightning-fill::before { content: "\f42a"; }
+.bi-lightning::before { content: "\f42b"; }
+.bi-link-45deg::before { content: "\f42c"; }
+.bi-link::before { content: "\f42d"; }
+.bi-linkedin::before { content: "\f42e"; }
+.bi-list-check::before { content: "\f42f"; }
+.bi-list-nested::before { content: "\f430"; }
+.bi-list-ol::before { content: "\f431"; }
+.bi-list-stars::before { content: "\f432"; }
+.bi-list-task::before { content: "\f433"; }
+.bi-list-ul::before { content: "\f434"; }
+.bi-list::before { content: "\f435"; }
+.bi-lock-fill::before { content: "\f436"; }
+.bi-lock::before { content: "\f437"; }
+.bi-mailbox::before { content: "\f438"; }
+.bi-mailbox2::before { content: "\f439"; }
+.bi-map-fill::before { content: "\f43a"; }
+.bi-map::before { content: "\f43b"; }
+.bi-markdown-fill::before { content: "\f43c"; }
+.bi-markdown::before { content: "\f43d"; }
+.bi-menu-app-fill::before { content: "\f43e"; }
+.bi-menu-app::before { content: "\f43f"; }
+.bi-menu-button-fill::before { content: "\f440"; }
+.bi-menu-button-wide-fill::before { content: "\f441"; }
+.bi-menu-button-wide::before { content: "\f442"; }
+.bi-menu-button::before { content: "\f443"; }
+.bi-menu-down::before { content: "\f444"; }
+.bi-menu-up::before { content: "\f445"; }
+.bi-mic-fill::before { content: "\f446"; }
+.bi-mic-mute-fill::before { content: "\f447"; }
+.bi-mic-mute::before { content: "\f448"; }
+.bi-mic::before { content: "\f449"; }
+.bi-minecart-loaded::before { content: "\f44a"; }
+.bi-minecart::before { content: "\f44b"; }
+.bi-moon::before { content: "\f44c"; }
+.bi-mouse::before { content: "\f44d"; }
+.bi-mouse2::before { content: "\f44e"; }
+.bi-mouse3::before { content: "\f44f"; }
+.bi-music-note-beamed::before { content: "\f450"; }
+.bi-music-note-list::before { content: "\f451"; }
+.bi-music-note::before { content: "\f452"; }
+.bi-music-player-fill::before { content: "\f453"; }
+.bi-music-player::before { content: "\f454"; }
+.bi-newspaper::before { content: "\f455"; }
+.bi-node-minus-fill::before { content: "\f456"; }
+.bi-node-minus::before { content: "\f457"; }
+.bi-node-plus-fill::before { content: "\f458"; }
+.bi-node-plus::before { content: "\f459"; }
+.bi-nut-fill::before { content: "\f45a"; }
+.bi-nut::before { content: "\f45b"; }
+.bi-octagon-fill::before { content: "\f45c"; }
+.bi-octagon-half::before { content: "\f45d"; }
+.bi-octagon::before { content: "\f45e"; }
+.bi-option::before { content: "\f45f"; }
+.bi-outlet::before { content: "\f460"; }
+.bi-paperclip::before { content: "\f461"; }
+.bi-paragraph::before { content: "\f462"; }
+.bi-patch-check-fll::before { content: "\f463"; }
+.bi-patch-check::before { content: "\f464"; }
+.bi-patch-exclamation-fll::before { content: "\f465"; }
+.bi-patch-exclamation::before { content: "\f466"; }
+.bi-patch-minus-fll::before { content: "\f467"; }
+.bi-patch-minus::before { content: "\f468"; }
+.bi-patch-plus-fll::before { content: "\f469"; }
+.bi-patch-plus::before { content: "\f46a"; }
+.bi-patch-question-fll::before { content: "\f46b"; }
+.bi-patch-question::before { content: "\f46c"; }
+.bi-pause-btn-fill::before { content: "\f46d"; }
+.bi-pause-btn::before { content: "\f46e"; }
+.bi-pause-circle-fill::before { content: "\f46f"; }
+.bi-pause-circle::before { content: "\f470"; }
+.bi-pause-fill::before { content: "\f471"; }
+.bi-pause::before { content: "\f472"; }
+.bi-peace-fill::before { content: "\f473"; }
+.bi-peace::before { content: "\f474"; }
+.bi-pen-fill::before { content: "\f475"; }
+.bi-pen::before { content: "\f476"; }
+.bi-pencil-fill::before { content: "\f477"; }
+.bi-pencil-square::before { content: "\f478"; }
+.bi-pencil::before { content: "\f479"; }
+.bi-pentagon-fill::before { content: "\f47a"; }
+.bi-pentagon-half::before { content: "\f47b"; }
+.bi-pentagon::before { content: "\f47c"; }
+.bi-people-fill::before { content: "\f47d"; }
+.bi-people::before { content: "\f47e"; }
+.bi-percent::before { content: "\f47f"; }
+.bi-person-badge-fill::before { content: "\f480"; }
+.bi-person-badge::before { content: "\f481"; }
+.bi-person-bounding-box::before { content: "\f482"; }
+.bi-person-check-fill::before { content: "\f483"; }
+.bi-person-check::before { content: "\f484"; }
+.bi-person-circle::before { content: "\f485"; }
+.bi-person-dash-fill::before { content: "\f486"; }
+.bi-person-dash::before { content: "\f487"; }
+.bi-person-fill::before { content: "\f488"; }
+.bi-person-lines-fill::before { content: "\f489"; }
+.bi-person-plus-fill::before { content: "\f48a"; }
+.bi-person-plus::before { content: "\f48b"; }
+.bi-person-square::before { content: "\f48c"; }
+.bi-person-x-fill::before { content: "\f48d"; }
+.bi-person-x::before { content: "\f48e"; }
+.bi-person::before { content: "\f48f"; }
+.bi-phone-fill::before { content: "\f490"; }
+.bi-phone-landscape-fill::before { content: "\f491"; }
+.bi-phone-landscape::before { content: "\f492"; }
+.bi-phone-vibrate::before { content: "\f493"; }
+.bi-phone::before { content: "\f494"; }
+.bi-pie-chart-fill::before { content: "\f495"; }
+.bi-pie-chart::before { content: "\f496"; }
+.bi-pip-fill::before { content: "\f497"; }
+.bi-pip::before { content: "\f498"; }
+.bi-play-btn-fill::before { content: "\f499"; }
+.bi-play-btn::before { content: "\f49a"; }
+.bi-play-circle-fill::before { content: "\f49b"; }
+.bi-play-circle::before { content: "\f49c"; }
+.bi-play-fill::before { content: "\f49d"; }
+.bi-play::before { content: "\f49e"; }
+.bi-plug-fill::before { content: "\f49f"; }
+.bi-plug::before { content: "\f4a0"; }
+.bi-plus-circle-fill::before { content: "\f4a1"; }
+.bi-plus-circle::before { content: "\f4a2"; }
+.bi-plus-square-fill::before { content: "\f4a3"; }
+.bi-plus-square::before { content: "\f4a4"; }
+.bi-plus::before { content: "\f4a5"; }
+.bi-power::before { content: "\f4a6"; }
+.bi-printer-fill::before { content: "\f4a7"; }
+.bi-printer::before { content: "\f4a8"; }
+.bi-puzzle-fill::before { content: "\f4a9"; }
+.bi-puzzle::before { content: "\f4aa"; }
+.bi-question-circle-fill::before { content: "\f4ab"; }
+.bi-question-circle::before { content: "\f4ac"; }
+.bi-question-diamond-fill::before { content: "\f4ad"; }
+.bi-question-diamond::before { content: "\f4ae"; }
+.bi-question-octagon-fill::before { content: "\f4af"; }
+.bi-question-octagon::before { content: "\f4b0"; }
+.bi-question-square-fill::before { content: "\f4b1"; }
+.bi-question-square::before { content: "\f4b2"; }
+.bi-question::before { content: "\f4b3"; }
+.bi-receipt-cutoff::before { content: "\f4b4"; }
+.bi-receipt::before { content: "\f4b5"; }
+.bi-reception-0::before { content: "\f4b6"; }
+.bi-reception-1::before { content: "\f4b7"; }
+.bi-reception-2::before { content: "\f4b8"; }
+.bi-reception-3::before { content: "\f4b9"; }
+.bi-reception-4::before { content: "\f4ba"; }
+.bi-record-btn-fill::before { content: "\f4bb"; }
+.bi-record-btn::before { content: "\f4bc"; }
+.bi-record-circle-fill::before { content: "\f4bd"; }
+.bi-record-circle::before { content: "\f4be"; }
+.bi-record-fill::before { content: "\f4bf"; }
+.bi-record::before { content: "\f4c0"; }
+.bi-record2-fill::before { content: "\f4c1"; }
+.bi-record2::before { content: "\f4c2"; }
+.bi-reply-all-fill::before { content: "\f4c3"; }
+.bi-reply-all::before { content: "\f4c4"; }
+.bi-reply-fill::before { content: "\f4c5"; }
+.bi-reply::before { content: "\f4c6"; }
+.bi-rss-fill::before { content: "\f4c7"; }
+.bi-rss::before { content: "\f4c8"; }
+.bi-scissors::before { content: "\f4c9"; }
+.bi-screwdriver::before { content: "\f4ca"; }
+.bi-search::before { content: "\f4cb"; }
+.bi-segmented-nav::before { content: "\f4cc"; }
+.bi-server::before { content: "\f4cd"; }
+.bi-share-fill::before { content: "\f4ce"; }
+.bi-share::before { content: "\f4cf"; }
+.bi-shield-check::before { content: "\f4d0"; }
+.bi-shield-exclamation::before { content: "\f4d1"; }
+.bi-shield-fill-check::before { content: "\f4d2"; }
+.bi-shield-fill-exclamation::before { content: "\f4d3"; }
+.bi-shield-fill-minus::before { content: "\f4d4"; }
+.bi-shield-fill-plus::before { content: "\f4d5"; }
+.bi-shield-fill-x::before { content: "\f4d6"; }
+.bi-shield-fill::before { content: "\f4d7"; }
+.bi-shield-lock-fill::before { content: "\f4d8"; }
+.bi-shield-lock::before { content: "\f4d9"; }
+.bi-shield-minus::before { content: "\f4da"; }
+.bi-shield-plus::before { content: "\f4db"; }
+.bi-shield-shaded::before { content: "\f4dc"; }
+.bi-shield-slash-fill::before { content: "\f4dd"; }
+.bi-shield-slash::before { content: "\f4de"; }
+.bi-shield-x::before { content: "\f4df"; }
+.bi-shield::before { content: "\f4e0"; }
+.bi-shift-fill::before { content: "\f4e1"; }
+.bi-shift::before { content: "\f4e2"; }
+.bi-shop-window::before { content: "\f4e3"; }
+.bi-shop::before { content: "\f4e4"; }
+.bi-shuffle::before { content: "\f4e5"; }
+.bi-signpost-2-fill::before { content: "\f4e6"; }
+.bi-signpost-2::before { content: "\f4e7"; }
+.bi-signpost-fill::before { content: "\f4e8"; }
+.bi-signpost-split-fill::before { content: "\f4e9"; }
+.bi-signpost-split::before { content: "\f4ea"; }
+.bi-signpost::before { content: "\f4eb"; }
+.bi-sim-fill::before { content: "\f4ec"; }
+.bi-sim::before { content: "\f4ed"; }
+.bi-skip-backward-btn-fill::before { content: "\f4ee"; }
+.bi-skip-backward-btn::before { content: "\f4ef"; }
+.bi-skip-backward-circle-fill::before { content: "\f4f0"; }
+.bi-skip-backward-circle::before { content: "\f4f1"; }
+.bi-skip-backward-fill::before { content: "\f4f2"; }
+.bi-skip-backward::before { content: "\f4f3"; }
+.bi-skip-end-btn-fill::before { content: "\f4f4"; }
+.bi-skip-end-btn::before { content: "\f4f5"; }
+.bi-skip-end-circle-fill::before { content: "\f4f6"; }
+.bi-skip-end-circle::before { content: "\f4f7"; }
+.bi-skip-end-fill::before { content: "\f4f8"; }
+.bi-skip-end::before { content: "\f4f9"; }
+.bi-skip-forward-btn-fill::before { content: "\f4fa"; }
+.bi-skip-forward-btn::before { content: "\f4fb"; }
+.bi-skip-forward-circle-fill::before { content: "\f4fc"; }
+.bi-skip-forward-circle::before { content: "\f4fd"; }
+.bi-skip-forward-fill::before { content: "\f4fe"; }
+.bi-skip-forward::before { content: "\f4ff"; }
+.bi-skip-start-btn-fill::before { content: "\f500"; }
+.bi-skip-start-btn::before { content: "\f501"; }
+.bi-skip-start-circle-fill::before { content: "\f502"; }
+.bi-skip-start-circle::before { content: "\f503"; }
+.bi-skip-start-fill::before { content: "\f504"; }
+.bi-skip-start::before { content: "\f505"; }
+.bi-slack::before { content: "\f506"; }
+.bi-slash-circle-fill::before { content: "\f507"; }
+.bi-slash-circle::before { content: "\f508"; }
+.bi-slash-square-fill::before { content: "\f509"; }
+.bi-slash-square::before { content: "\f50a"; }
+.bi-slash::before { content: "\f50b"; }
+.bi-sliders::before { content: "\f50c"; }
+.bi-smartwatch::before { content: "\f50d"; }
+.bi-sort-alpha-down-alt::before { content: "\f50e"; }
+.bi-sort-alpha-down::before { content: "\f50f"; }
+.bi-sort-alpha-up-alt::before { content: "\f510"; }
+.bi-sort-alpha-up::before { content: "\f511"; }
+.bi-sort-down-alt::before { content: "\f512"; }
+.bi-sort-down::before { content: "\f513"; }
+.bi-sort-numeric-down-alt::before { content: "\f514"; }
+.bi-sort-numeric-down::before { content: "\f515"; }
+.bi-sort-numeric-up-alt::before { content: "\f516"; }
+.bi-sort-numeric-up::before { content: "\f517"; }
+.bi-sort-up-alt::before { content: "\f518"; }
+.bi-sort-up::before { content: "\f519"; }
+.bi-soundwave::before { content: "\f51a"; }
+.bi-speaker-fill::before { content: "\f51b"; }
+.bi-speaker::before { content: "\f51c"; }
+.bi-spellcheck::before { content: "\f51d"; }
+.bi-square-fill::before { content: "\f51e"; }
+.bi-square-half::before { content: "\f51f"; }
+.bi-square::before { content: "\f520"; }
+.bi-star-fill::before { content: "\f521"; }
+.bi-star-half::before { content: "\f522"; }
+.bi-star::before { content: "\f523"; }
+.bi-stickies-fill::before { content: "\f524"; }
+.bi-stickies::before { content: "\f525"; }
+.bi-sticky-fill::before { content: "\f526"; }
+.bi-sticky::before { content: "\f527"; }
+.bi-stop-btn-fill::before { content: "\f528"; }
+.bi-stop-btn::before { content: "\f529"; }
+.bi-stop-circle-fill::before { content: "\f52a"; }
+.bi-stop-circle::before { content: "\f52b"; }
+.bi-stop-fill::before { content: "\f52c"; }
+.bi-stop::before { content: "\f52d"; }
+.bi-stoplights-fill::before { content: "\f52e"; }
+.bi-stoplights::before { content: "\f52f"; }
+.bi-stopwatch-fill::before { content: "\f530"; }
+.bi-stopwatch::before { content: "\f531"; }
+.bi-subtract::before { content: "\f532"; }
+.bi-suit-club-fill::before { content: "\f533"; }
+.bi-suit-club::before { content: "\f534"; }
+.bi-suit-diamond-fill::before { content: "\f535"; }
+.bi-suit-diamond::before { content: "\f536"; }
+.bi-suit-heart-fill::before { content: "\f537"; }
+.bi-suit-heart::before { content: "\f538"; }
+.bi-suit-spade-fill::before { content: "\f539"; }
+.bi-suit-spade::before { content: "\f53a"; }
+.bi-sun::before { content: "\f53b"; }
+.bi-sunglasses::before { content: "\f53c"; }
+.bi-table::before { content: "\f53d"; }
+.bi-tablet-fill::before { content: "\f53e"; }
+.bi-tablet-landscape-fill::before { content: "\f53f"; }
+.bi-tablet-landscape::before { content: "\f540"; }
+.bi-tablet::before { content: "\f541"; }
+.bi-tag-fill::before { content: "\f542"; }
+.bi-tag::before { content: "\f543"; }
+.bi-tags-fill::before { content: "\f544"; }
+.bi-tags::before { content: "\f545"; }
+.bi-telephone-fill::before { content: "\f546"; }
+.bi-telephone-forward-fill::before { content: "\f547"; }
+.bi-telephone-forward::before { content: "\f548"; }
+.bi-telephone-inbound-fill::before { content: "\f549"; }
+.bi-telephone-inbound::before { content: "\f54a"; }
+.bi-telephone-minus-fill::before { content: "\f54b"; }
+.bi-telephone-minus::before { content: "\f54c"; }
+.bi-telephone-outbound-fill::before { content: "\f54d"; }
+.bi-telephone-outbound::before { content: "\f54e"; }
+.bi-telephone-plus-fill::before { content: "\f54f"; }
+.bi-telephone-plus::before { content: "\f550"; }
+.bi-telephone-x-fill::before { content: "\f551"; }
+.bi-telephone-x::before { content: "\f552"; }
+.bi-telephone::before { content: "\f553"; }
+.bi-terminal-fill::before { content: "\f554"; }
+.bi-terminal::before { content: "\f555"; }
+.bi-text-center::before { content: "\f556"; }
+.bi-text-indent-left::before { content: "\f557"; }
+.bi-text-indent-right::before { content: "\f558"; }
+.bi-text-left::before { content: "\f559"; }
+.bi-text-paragraph::before { content: "\f55a"; }
+.bi-text-right::before { content: "\f55b"; }
+.bi-textarea-resize::before { content: "\f55c"; }
+.bi-textarea-t::before { content: "\f55d"; }
+.bi-textarea::before { content: "\f55e"; }
+.bi-thermometer-half::before { content: "\f55f"; }
+.bi-thermometer::before { content: "\f560"; }
+.bi-three-dots-vertical::before { content: "\f561"; }
+.bi-three-dots::before { content: "\f562"; }
+.bi-toggle-off::before { content: "\f563"; }
+.bi-toggle-on::before { content: "\f564"; }
+.bi-toggle2-off::before { content: "\f565"; }
+.bi-toggle2-on::before { content: "\f566"; }
+.bi-toggles::before { content: "\f567"; }
+.bi-toggles2::before { content: "\f568"; }
+.bi-tools::before { content: "\f569"; }
+.bi-trash-fill::before { content: "\f56a"; }
+.bi-trash::before { content: "\f56b"; }
+.bi-trash2-fill::before { content: "\f56c"; }
+.bi-trash2::before { content: "\f56d"; }
+.bi-tree-fill::before { content: "\f56e"; }
+.bi-tree::before { content: "\f56f"; }
+.bi-triangle-fill::before { content: "\f570"; }
+.bi-triangle-half::before { content: "\f571"; }
+.bi-triangle::before { content: "\f572"; }
+.bi-trophy-fill::before { content: "\f573"; }
+.bi-trophy::before { content: "\f574"; }
+.bi-truck-flatbed::before { content: "\f575"; }
+.bi-truck::before { content: "\f576"; }
+.bi-tv-fill::before { content: "\f577"; }
+.bi-tv::before { content: "\f578"; }
+.bi-twitch::before { content: "\f579"; }
+.bi-twitter::before { content: "\f57a"; }
+.bi-type-bold::before { content: "\f57b"; }
+.bi-type-h1::before { content: "\f57c"; }
+.bi-type-h2::before { content: "\f57d"; }
+.bi-type-h3::before { content: "\f57e"; }
+.bi-type-italic::before { content: "\f57f"; }
+.bi-type-strikethrough::before { content: "\f580"; }
+.bi-type-underline::before { content: "\f581"; }
+.bi-type::before { content: "\f582"; }
+.bi-ui-checks-grid::before { content: "\f583"; }
+.bi-ui-checks::before { content: "\f584"; }
+.bi-ui-radios-grid::before { content: "\f585"; }
+.bi-ui-radios::before { content: "\f586"; }
+.bi-union::before { content: "\f587"; }
+.bi-unlock-fill::before { content: "\f588"; }
+.bi-unlock::before { content: "\f589"; }
+.bi-upc-scan::before { content: "\f58a"; }
+.bi-upc::before { content: "\f58b"; }
+.bi-upload::before { content: "\f58c"; }
+.bi-vector-pen::before { content: "\f58d"; }
+.bi-view-list::before { content: "\f58e"; }
+.bi-view-stacked::before { content: "\f58f"; }
+.bi-vinyl-fill::before { content: "\f590"; }
+.bi-vinyl::before { content: "\f591"; }
+.bi-voicemail::before { content: "\f592"; }
+.bi-volume-down-fill::before { content: "\f593"; }
+.bi-volume-down::before { content: "\f594"; }
+.bi-volume-mute-fill::before { content: "\f595"; }
+.bi-volume-mute::before { content: "\f596"; }
+.bi-volume-off-fill::before { content: "\f597"; }
+.bi-volume-off::before { content: "\f598"; }
+.bi-volume-up-fill::before { content: "\f599"; }
+.bi-volume-up::before { content: "\f59a"; }
+.bi-vr::before { content: "\f59b"; }
+.bi-wallet-fill::before { content: "\f59c"; }
+.bi-wallet::before { content: "\f59d"; }
+.bi-wallet2::before { content: "\f59e"; }
+.bi-watch::before { content: "\f59f"; }
+.bi-wifi-1::before { content: "\f5a0"; }
+.bi-wifi-2::before { content: "\f5a1"; }
+.bi-wifi-off::before { content: "\f5a2"; }
+.bi-wifi::before { content: "\f5a3"; }
+.bi-window::before { content: "\f5a4"; }
+.bi-wrench::before { content: "\f5a5"; }
+.bi-x-circle-fill::before { content: "\f5a6"; }
+.bi-x-circle::before { content: "\f5a7"; }
+.bi-x-diamond-fill::before { content: "\f5a8"; }
+.bi-x-diamond::before { content: "\f5a9"; }
+.bi-x-octagon-fill::before { content: "\f5aa"; }
+.bi-x-octagon::before { content: "\f5ab"; }
+.bi-x-square-fill::before { content: "\f5ac"; }
+.bi-x-square::before { content: "\f5ad"; }
+.bi-x::before { content: "\f5ae"; }
+.bi-youtube::before { content: "\f5af"; }
+.bi-zoom-in::before { content: "\f5b0"; }
+.bi-zoom-out::before { content: "\f5b1"; }
diff --git a/src/wwwroot/styles/vendor/bootstrap-icons.scss b/src/wwwroot/styles/vendor/bootstrap-icons.scss
new file mode 100644
index 0000000..f820c52
--- /dev/null
+++ b/src/wwwroot/styles/vendor/bootstrap-icons.scss
@@ -0,0 +1,28 @@
+@font-face {
+ font-family: "bootstrap-icons";
+ src: url("/fonts/bootstrap-icons.woff") format("woff"), url("/fonts/bootstrap-icons.woff2") format("woff2");
+}
+
+[class^="bi-"]::before,
+[class*=" bi-"]::before {
+ display: inline-block;
+ font-family: "bootstrap-icons" !important;
+ font-style: normal;
+ font-weight: normal !important;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ vertical-align: text-bottom;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.bi-bag-plus::before { content: "\f16e"; }
+.bi-trash2::before { content: "\f56d"; }
+.bi-bag-plus::before { content: "\f16e"; }
+.bi-pencil-square::before { content: "\f478"; }
+.bi-three-dots-vertical::before { content: "\f561"; }
+.bi-eye::before { content: "\f30b"; }
+.bi-file-earmark-person::before { content: "\f342"; }
+.bi-list::before { content: "\f435"; }
+.bi-cloud-upload::before { content: "\f292"; }
diff --git a/src/wwwroot/styles/vendor/bootstrap-menu-kit.scss b/src/wwwroot/styles/vendor/bootstrap-menu-kit.scss
new file mode 100644
index 0000000..69936ee
--- /dev/null
+++ b/src/wwwroot/styles/vendor/bootstrap-menu-kit.scss
@@ -0,0 +1,383 @@
+/* --- bootstrap-menu styling http://bootstrap-menu.com */
+body.offcanvas-active {
+ overflow: hidden;
+}
+
+.offcanvas-header {
+ display: none;
+}
+
+.screen-overlay {
+ width: 0%;
+ height: 100%;
+ z-index: 30;
+ position: fixed;
+ top: 0;
+ left: 0;
+ opacity: 0;
+ visibility: hidden;
+ background-color: rgba(34, 34, 34, 0.6);
+ transition: opacity 0.2s linear, visibility 0.1s, width 1s ease-in;
+}
+
+.screen-overlay.show {
+ transition: opacity 0.5s ease, width 0s;
+ opacity: 1;
+ width: 100%;
+ visibility: visible;
+}
+
+.modal .modal-dialog-aside {
+ width: 350px;
+ max-width: 80%;
+ height: 100%;
+ margin: 0;
+ transform: translate(0);
+ transition: transform 0.2s;
+}
+
+.modal .modal-dialog-aside .modal-content {
+ height: inherit;
+ border: 0;
+ border-radius: 0;
+}
+
+.modal .modal-dialog-aside .modal-content .modal-body {
+ overflow-y: auto;
+}
+
+.modal.fixed-left .modal-dialog-aside {
+ margin-right: auto;
+ transform: translateX(-100%);
+}
+
+.modal.fixed-right .modal-dialog-aside {
+ margin-left: auto;
+ transform: translateX(100%);
+}
+
+.modal.show .modal-dialog-aside {
+ transform: translateX(0);
+}
+
+.dropdown-large,
+.megasubmenu,
+.megamenu {
+ padding: 20px;
+}
+
+.dropdown-menu .dropdown-menu {
+ margin-left: 0;
+ margin-right: 0;
+}
+
+.dropdown-menu .dropdown-toggle:after {
+ border-top: 0.3em solid transparent;
+ border-right: 0;
+ border-bottom: 0.3em solid transparent;
+ border-left: 0.3em solid;
+}
+
+.navbar {
+ .icon-arrow:after {
+ content: "\276F";
+ line-height: 1;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 7px;
+ margin-top: -2px;
+ opacity: 0.3;
+ font-size: 80%;
+ }
+}
+
+.dropdown.has-dimmer:after {
+ content: "";
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ transition: opacity 0.15s ease-in-out;
+ opacity: 0;
+ visibility: hidden;
+ background-color: rgba(0, 0, 0, 0.5);
+ pointer-events: none;
+}
+
+.navbar:not(.navbar-hover) {
+ .dropdown.show.has-dimmer:hover .nav-link {
+ position: relative;
+ z-index: 12;
+ }
+
+ .dropdown.show.has-dimmer:after {
+ z-index: 10;
+ opacity: 1;
+ visibility: visible;
+ position: fixed;
+ }
+}
+
+/* ============ desktop view ============ */
+@media all and (min-width: 992px) {
+ .navbar {
+ padding-top: 0;
+ padding-bottom: 0;
+
+ .has-megamenu {
+ position: static !important;
+ }
+
+ .dropdown-menu {
+ margin-top: 0;
+ }
+
+ .megamenu {
+ left: 0;
+ right: 0;
+ width: 100%;
+ padding: 20px;
+ }
+
+ .megasubmenu {
+ left: 100%;
+ top: 0;
+ min-height: 100%;
+ min-width: 500px;
+ }
+
+ .dropdown-large {
+ min-width: 500px;
+ }
+
+ .nav-link {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+ }
+ }
+
+ .submenu,
+ .dropdown-menu .dropdown-menu {
+ display: none;
+ position: absolute;
+ left: 100%;
+ top: -7px;
+
+ &.submenu-left {
+ right: 100%;
+ left: auto;
+ }
+ }
+
+ .navbar-hover {
+ .dropdown.has-dimmer:hover .nav-link {
+ position: relative;
+ z-index: 12;
+ }
+
+ .dropdown.has-dimmer:hover:after {
+ z-index: 10;
+ opacity: 1;
+ visibility: visible;
+ position: fixed;
+ }
+
+ &.navbar-dark {
+ .nav-item:hover .nav-link {
+ color: #fff;
+ }
+ }
+
+ &.navbar-light {
+ .nav-item:hover .nav-link {
+ color: #000;
+ }
+ }
+
+ .dropdown-menu:not(.animate) {
+ display: none;
+ }
+
+ .animate {
+ display: block;
+ opacity: 0;
+ visibility: hidden;
+ transition: 0.4s;
+ margin-top: 0;
+ }
+
+ .dropdown-menu .animate {
+ transition: 0.1s;
+ }
+
+ .fade-down {
+ top: 90%;
+ transform: rotateX(-80deg);
+ transform-origin: 0% 0%;
+ }
+
+ .fade-up {
+ top: 100px;
+ }
+
+ .dropdown-menu .fade-down {
+ top: 0;
+ }
+
+ .nav-item:hover,
+ .dropdown:hover {
+ > .dropdown-menu {
+ display: block;
+ transition: 0.4s;
+ opacity: 1;
+ visibility: visible;
+ top: 100%;
+ transform: rotateX(0deg);
+ }
+ }
+ }
+
+ .dropdown-menu {
+ > li:hover {
+ background-color: #f1f1f1;
+ }
+
+ li {
+ position: relative;
+ }
+
+ li.has-megasubmenu {
+ position: static;
+ }
+
+ li:hover {
+ > .submenu,
+ > .dropdown-menu {
+ display: block;
+ transition: 0.4s;
+ opacity: 1;
+ visibility: visible;
+ top: 0%;
+ transform: rotateX(0deg);
+ }
+
+ > .megasubmenu {
+ display: block;
+ transition: 0.4s;
+ opacity: 1;
+ visibility: visible;
+ top: 0%;
+ transform: rotateX(0deg);
+ }
+ }
+ }
+}
+
+/* ============ desktop view .end// ============ */
+
+/* ============ small screen ============ */
+@media all and (max-width: 991px) {
+ .offcanvas-header {
+ display: block;
+ }
+
+ .mobile-offcanvas {
+ visibility: hidden;
+ transform: translateX(-100%);
+ border-radius: 0;
+ display: block;
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100%;
+ z-index: 1200;
+ width: 80%;
+ overflow-y: scroll;
+ overflow-x: hidden;
+ transition: visibility 0.2s ease-in-out, transform 0.2s ease-in-out;
+
+ .container {
+ display: block;
+ }
+ }
+
+ .mobile-offcanvas.show {
+ visibility: visible;
+ transform: translateX(0);
+ }
+}
+
+/* ============ small screen //end ============ */
+
+/* ============ THEME SOFT ============ */
+.navbar-soft {
+ background-color: white;
+ box-shadow: 0 2px 3px rgba(100, 100, 100, 0.1);
+ font-size: 14px;
+
+ .navbar-toggler {
+ color: rgba(0, 0, 0, 0.5);
+ border-color: rgba(0, 0, 0, 0.1);
+ }
+
+ .navbar-toggler-icon {
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
+ }
+
+ .navbar-brand {
+ color: #111;
+ font-weight: 600;
+ font-size: 18px;
+ }
+
+ .navbar-nav {
+ .nav-item {
+ margin-left: 5px;
+ margin-right: 5px;
+ }
+
+ .nav-link {
+ padding: 1.4rem 0.5rem;
+ font-weight: 600;
+ text-transform: uppercase;
+ color: #888;
+ border: 2px solid transparent;
+ }
+
+ .nav-item:hover,
+ .nav-item.show {
+ .nav-link {
+ border-bottom: 2px solid orange;
+ color: #111;
+ }
+ }
+ }
+
+ .dropdown-menu {
+ border: 0;
+ background-clip: initial;
+ border-radius: 0;
+ box-shadow: 0 1px 5px rgba(70, 70, 70, 0.2);
+
+ .dropdown-item {
+ padding: 0.6rem 1.5rem;
+ border-bottom: 1px solid #f1f1f1;
+ }
+ }
+}
+
+/* ============ small screen ============ */
+@media all and (max-width: 991px) {
+ .navbar-soft {
+ .navbar-nav {
+ margin-bottom: 10px;
+ margin-top: 10px;
+
+ .nav-link {
+ padding: 0.6rem 0rem;
+ }
+ }
+ }
+}
+
+/* ============ small screen //end ============ */
diff --git a/src/wwwroot/styles/vendor/bootstrap-side-modal.scss b/src/wwwroot/styles/vendor/bootstrap-side-modal.scss
new file mode 100644
index 0000000..63bbf4d
--- /dev/null
+++ b/src/wwwroot/styles/vendor/bootstrap-side-modal.scss
@@ -0,0 +1,48 @@
+.modal-left .modal-dialog,
+.modal-right .modal-dialog {
+ width: 350px;
+ max-width: 80%;
+ height: 100%;
+ margin: 0;
+ transform: translate(0);
+ transition: transform 0.2s;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .modal-left .modal-dialog,
+ .modal-right .modal-dialog {
+ transition: none;
+ }
+}
+
+.modal-left .modal-content,
+.modal-right .modal-content {
+ height: inherit;
+ border: 0;
+ border-radius: 0;
+}
+
+.modal-left .modal-body,
+.modal-right .modal-body {
+ overflow-y: auto;
+}
+
+.modal-left.modal.fade .modal-dialog,
+.modal-right.modal.fade .modal-dialog {
+ transform: translateX(0);
+}
+
+.modal-left.modal.show .modal-dialog,
+.modal-right.modal.show .modal-dialog {
+ transform: none;
+}
+
+.modal.modal-left .modal-dialog {
+ margin-right: auto;
+ transform: translateX(-100%);
+}
+
+.modal.modal-right .modal-dialog {
+ margin-left: auto;
+ transform: translateX(100%);
+} \ No newline at end of file
diff --git a/src/wwwroot/styles/vendor/quill.imageUploader.min.css b/src/wwwroot/styles/vendor/quill.imageUploader.min.css
new file mode 100644
index 0000000..56a1d94
--- /dev/null
+++ b/src/wwwroot/styles/vendor/quill.imageUploader.min.css
@@ -0,0 +1,33 @@
+.image-uploading {
+ position: relative;
+ display: inline-block;
+}
+
+.image-uploading img {
+ max-width: 98% !important;
+ filter: blur(5px);
+ opacity: 0.3;
+}
+
+.image-uploading::before {
+ content: "";
+ box-sizing: border-box;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ margin-left: -15px;
+ border-radius: 50%;
+ border: 3px solid #ccc;
+ border-top-color: #1e986c;
+ z-index: 1;
+ animation: spinner 0.6s linear infinite;
+}
+
+@keyframes spinner {
+ to {
+ transform: rotate(360deg);
+ }
+}
diff --git a/src/wwwroot/styles/vendor/quill.snow.css b/src/wwwroot/styles/vendor/quill.snow.css
new file mode 100644
index 0000000..ccf825d
--- /dev/null
+++ b/src/wwwroot/styles/vendor/quill.snow.css
@@ -0,0 +1,945 @@
+/*!
+ * Quill Editor v1.3.7
+ * https://quilljs.com/
+ * Copyright (c) 2014, Jason Chen
+ * Copyright (c) 2013, salesforce.com
+ */
+.ql-container {
+ box-sizing: border-box;
+ font-family: Helvetica, Arial, sans-serif;
+ font-size: 13px;
+ height: 100%;
+ margin: 0px;
+ position: relative;
+}
+.ql-container.ql-disabled .ql-tooltip {
+ visibility: hidden;
+}
+.ql-container.ql-disabled .ql-editor ul[data-checked] > li::before {
+ pointer-events: none;
+}
+.ql-clipboard {
+ left: -100000px;
+ height: 1px;
+ overflow-y: hidden;
+ position: absolute;
+ top: 50%;
+}
+.ql-clipboard p {
+ margin: 0;
+ padding: 0;
+}
+.ql-editor {
+ box-sizing: border-box;
+ line-height: 1.42;
+ height: 100%;
+ outline: none;
+ overflow-y: auto;
+ padding: 12px 15px;
+ tab-size: 4;
+ -moz-tab-size: 4;
+ text-align: left;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+.ql-editor > * {
+ cursor: text;
+}
+.ql-editor p,
+.ql-editor ol,
+.ql-editor ul,
+.ql-editor pre,
+.ql-editor blockquote,
+.ql-editor h1,
+.ql-editor h2,
+.ql-editor h3,
+.ql-editor h4,
+.ql-editor h5,
+.ql-editor h6 {
+ margin: 0;
+ padding: 0;
+ counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+}
+.ql-editor ol,
+.ql-editor ul {
+ padding-left: 1.5em;
+}
+.ql-editor ol > li,
+.ql-editor ul > li {
+ list-style-type: none;
+}
+.ql-editor ul > li::before {
+ content: '\2022';
+}
+.ql-editor ul[data-checked=true],
+.ql-editor ul[data-checked=false] {
+ pointer-events: none;
+}
+.ql-editor ul[data-checked=true] > li *,
+.ql-editor ul[data-checked=false] > li * {
+ pointer-events: all;
+}
+.ql-editor ul[data-checked=true] > li::before,
+.ql-editor ul[data-checked=false] > li::before {
+ color: #777;
+ cursor: pointer;
+ pointer-events: all;
+}
+.ql-editor ul[data-checked=true] > li::before {
+ content: '\2611';
+}
+.ql-editor ul[data-checked=false] > li::before {
+ content: '\2610';
+}
+.ql-editor li::before {
+ display: inline-block;
+ white-space: nowrap;
+ width: 1.2em;
+}
+.ql-editor li:not(.ql-direction-rtl)::before {
+ margin-left: -1.5em;
+ margin-right: 0.3em;
+ text-align: right;
+}
+.ql-editor li.ql-direction-rtl::before {
+ margin-left: 0.3em;
+ margin-right: -1.5em;
+}
+.ql-editor ol li:not(.ql-direction-rtl),
+.ql-editor ul li:not(.ql-direction-rtl) {
+ padding-left: 1.5em;
+}
+.ql-editor ol li.ql-direction-rtl,
+.ql-editor ul li.ql-direction-rtl {
+ padding-right: 1.5em;
+}
+.ql-editor ol li {
+ counter-reset: list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+ counter-increment: list-0;
+}
+.ql-editor ol li:before {
+ content: counter(list-0, decimal) '. ';
+}
+.ql-editor ol li.ql-indent-1 {
+ counter-increment: list-1;
+}
+.ql-editor ol li.ql-indent-1:before {
+ content: counter(list-1, lower-alpha) '. ';
+}
+.ql-editor ol li.ql-indent-1 {
+ counter-reset: list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+}
+.ql-editor ol li.ql-indent-2 {
+ counter-increment: list-2;
+}
+.ql-editor ol li.ql-indent-2:before {
+ content: counter(list-2, lower-roman) '. ';
+}
+.ql-editor ol li.ql-indent-2 {
+ counter-reset: list-3 list-4 list-5 list-6 list-7 list-8 list-9;
+}
+.ql-editor ol li.ql-indent-3 {
+ counter-increment: list-3;
+}
+.ql-editor ol li.ql-indent-3:before {
+ content: counter(list-3, decimal) '. ';
+}
+.ql-editor ol li.ql-indent-3 {
+ counter-reset: list-4 list-5 list-6 list-7 list-8 list-9;
+}
+.ql-editor ol li.ql-indent-4 {
+ counter-increment: list-4;
+}
+.ql-editor ol li.ql-indent-4:before {
+ content: counter(list-4, lower-alpha) '. ';
+}
+.ql-editor ol li.ql-indent-4 {
+ counter-reset: list-5 list-6 list-7 list-8 list-9;
+}
+.ql-editor ol li.ql-indent-5 {
+ counter-increment: list-5;
+}
+.ql-editor ol li.ql-indent-5:before {
+ content: counter(list-5, lower-roman) '. ';
+}
+.ql-editor ol li.ql-indent-5 {
+ counter-reset: list-6 list-7 list-8 list-9;
+}
+.ql-editor ol li.ql-indent-6 {
+ counter-increment: list-6;
+}
+.ql-editor ol li.ql-indent-6:before {
+ content: counter(list-6, decimal) '. ';
+}
+.ql-editor ol li.ql-indent-6 {
+ counter-reset: list-7 list-8 list-9;
+}
+.ql-editor ol li.ql-indent-7 {
+ counter-increment: list-7;
+}
+.ql-editor ol li.ql-indent-7:before {
+ content: counter(list-7, lower-alpha) '. ';
+}
+.ql-editor ol li.ql-indent-7 {
+ counter-reset: list-8 list-9;
+}
+.ql-editor ol li.ql-indent-8 {
+ counter-increment: list-8;
+}
+.ql-editor ol li.ql-indent-8:before {
+ content: counter(list-8, lower-roman) '. ';
+}
+.ql-editor ol li.ql-indent-8 {
+ counter-reset: list-9;
+}
+.ql-editor ol li.ql-indent-9 {
+ counter-increment: list-9;
+}
+.ql-editor ol li.ql-indent-9:before {
+ content: counter(list-9, decimal) '. ';
+}
+.ql-editor .ql-indent-1:not(.ql-direction-rtl) {
+ padding-left: 3em;
+}
+.ql-editor li.ql-indent-1:not(.ql-direction-rtl) {
+ padding-left: 4.5em;
+}
+.ql-editor .ql-indent-1.ql-direction-rtl.ql-align-right {
+ padding-right: 3em;
+}
+.ql-editor li.ql-indent-1.ql-direction-rtl.ql-align-right {
+ padding-right: 4.5em;
+}
+.ql-editor .ql-indent-2:not(.ql-direction-rtl) {
+ padding-left: 6em;
+}
+.ql-editor li.ql-indent-2:not(.ql-direction-rtl) {
+ padding-left: 7.5em;
+}
+.ql-editor .ql-indent-2.ql-direction-rtl.ql-align-right {
+ padding-right: 6em;
+}
+.ql-editor li.ql-indent-2.ql-direction-rtl.ql-align-right {
+ padding-right: 7.5em;
+}
+.ql-editor .ql-indent-3:not(.ql-direction-rtl) {
+ padding-left: 9em;
+}
+.ql-editor li.ql-indent-3:not(.ql-direction-rtl) {
+ padding-left: 10.5em;
+}
+.ql-editor .ql-indent-3.ql-direction-rtl.ql-align-right {
+ padding-right: 9em;
+}
+.ql-editor li.ql-indent-3.ql-direction-rtl.ql-align-right {
+ padding-right: 10.5em;
+}
+.ql-editor .ql-indent-4:not(.ql-direction-rtl) {
+ padding-left: 12em;
+}
+.ql-editor li.ql-indent-4:not(.ql-direction-rtl) {
+ padding-left: 13.5em;
+}
+.ql-editor .ql-indent-4.ql-direction-rtl.ql-align-right {
+ padding-right: 12em;
+}
+.ql-editor li.ql-indent-4.ql-direction-rtl.ql-align-right {
+ padding-right: 13.5em;
+}
+.ql-editor .ql-indent-5:not(.ql-direction-rtl) {
+ padding-left: 15em;
+}
+.ql-editor li.ql-indent-5:not(.ql-direction-rtl) {
+ padding-left: 16.5em;
+}
+.ql-editor .ql-indent-5.ql-direction-rtl.ql-align-right {
+ padding-right: 15em;
+}
+.ql-editor li.ql-indent-5.ql-direction-rtl.ql-align-right {
+ padding-right: 16.5em;
+}
+.ql-editor .ql-indent-6:not(.ql-direction-rtl) {
+ padding-left: 18em;
+}
+.ql-editor li.ql-indent-6:not(.ql-direction-rtl) {
+ padding-left: 19.5em;
+}
+.ql-editor .ql-indent-6.ql-direction-rtl.ql-align-right {
+ padding-right: 18em;
+}
+.ql-editor li.ql-indent-6.ql-direction-rtl.ql-align-right {
+ padding-right: 19.5em;
+}
+.ql-editor .ql-indent-7:not(.ql-direction-rtl) {
+ padding-left: 21em;
+}
+.ql-editor li.ql-indent-7:not(.ql-direction-rtl) {
+ padding-left: 22.5em;
+}
+.ql-editor .ql-indent-7.ql-direction-rtl.ql-align-right {
+ padding-right: 21em;
+}
+.ql-editor li.ql-indent-7.ql-direction-rtl.ql-align-right {
+ padding-right: 22.5em;
+}
+.ql-editor .ql-indent-8:not(.ql-direction-rtl) {
+ padding-left: 24em;
+}
+.ql-editor li.ql-indent-8:not(.ql-direction-rtl) {
+ padding-left: 25.5em;
+}
+.ql-editor .ql-indent-8.ql-direction-rtl.ql-align-right {
+ padding-right: 24em;
+}
+.ql-editor li.ql-indent-8.ql-direction-rtl.ql-align-right {
+ padding-right: 25.5em;
+}
+.ql-editor .ql-indent-9:not(.ql-direction-rtl) {
+ padding-left: 27em;
+}
+.ql-editor li.ql-indent-9:not(.ql-direction-rtl) {
+ padding-left: 28.5em;
+}
+.ql-editor .ql-indent-9.ql-direction-rtl.ql-align-right {
+ padding-right: 27em;
+}
+.ql-editor li.ql-indent-9.ql-direction-rtl.ql-align-right {
+ padding-right: 28.5em;
+}
+.ql-editor .ql-video {
+ display: block;
+ max-width: 100%;
+}
+.ql-editor .ql-video.ql-align-center {
+ margin: 0 auto;
+}
+.ql-editor .ql-video.ql-align-right {
+ margin: 0 0 0 auto;
+}
+.ql-editor .ql-bg-black {
+ background-color: #000;
+}
+.ql-editor .ql-bg-red {
+ background-color: #e60000;
+}
+.ql-editor .ql-bg-orange {
+ background-color: #f90;
+}
+.ql-editor .ql-bg-yellow {
+ background-color: #ff0;
+}
+.ql-editor .ql-bg-green {
+ background-color: #008a00;
+}
+.ql-editor .ql-bg-blue {
+ background-color: #06c;
+}
+.ql-editor .ql-bg-purple {
+ background-color: #93f;
+}
+.ql-editor .ql-color-white {
+ color: #fff;
+}
+.ql-editor .ql-color-red {
+ color: #e60000;
+}
+.ql-editor .ql-color-orange {
+ color: #f90;
+}
+.ql-editor .ql-color-yellow {
+ color: #ff0;
+}
+.ql-editor .ql-color-green {
+ color: #008a00;
+}
+.ql-editor .ql-color-blue {
+ color: #06c;
+}
+.ql-editor .ql-color-purple {
+ color: #93f;
+}
+.ql-editor .ql-font-serif {
+ font-family: Georgia, Times New Roman, serif;
+}
+.ql-editor .ql-font-monospace {
+ font-family: Monaco, Courier New, monospace;
+}
+.ql-editor .ql-size-small {
+ font-size: 0.75em;
+}
+.ql-editor .ql-size-large {
+ font-size: 1.5em;
+}
+.ql-editor .ql-size-huge {
+ font-size: 2.5em;
+}
+.ql-editor .ql-direction-rtl {
+ direction: rtl;
+ text-align: inherit;
+}
+.ql-editor .ql-align-center {
+ text-align: center;
+}
+.ql-editor .ql-align-justify {
+ text-align: justify;
+}
+.ql-editor .ql-align-right {
+ text-align: right;
+}
+.ql-editor.ql-blank::before {
+ color: rgba(0,0,0,0.6);
+ content: attr(data-placeholder);
+ font-style: italic;
+ left: 15px;
+ pointer-events: none;
+ position: absolute;
+ right: 15px;
+}
+.ql-snow.ql-toolbar:after,
+.ql-snow .ql-toolbar:after {
+ clear: both;
+ content: '';
+ display: table;
+}
+.ql-snow.ql-toolbar button,
+.ql-snow .ql-toolbar button {
+ background: none;
+ border: none;
+ cursor: pointer;
+ display: inline-block;
+ float: left;
+ height: 24px;
+ padding: 3px 5px;
+ width: 28px;
+}
+.ql-snow.ql-toolbar button svg,
+.ql-snow .ql-toolbar button svg {
+ float: left;
+ height: 100%;
+}
+.ql-snow.ql-toolbar button:active:hover,
+.ql-snow .ql-toolbar button:active:hover {
+ outline: none;
+}
+.ql-snow.ql-toolbar input.ql-image[type=file],
+.ql-snow .ql-toolbar input.ql-image[type=file] {
+ display: none;
+}
+.ql-snow.ql-toolbar button:hover,
+.ql-snow .ql-toolbar button:hover,
+.ql-snow.ql-toolbar button:focus,
+.ql-snow .ql-toolbar button:focus,
+.ql-snow.ql-toolbar button.ql-active,
+.ql-snow .ql-toolbar button.ql-active,
+.ql-snow.ql-toolbar .ql-picker-label:hover,
+.ql-snow .ql-toolbar .ql-picker-label:hover,
+.ql-snow.ql-toolbar .ql-picker-label.ql-active,
+.ql-snow .ql-toolbar .ql-picker-label.ql-active,
+.ql-snow.ql-toolbar .ql-picker-item:hover,
+.ql-snow .ql-toolbar .ql-picker-item:hover,
+.ql-snow.ql-toolbar .ql-picker-item.ql-selected,
+.ql-snow .ql-toolbar .ql-picker-item.ql-selected {
+ color: #06c;
+}
+.ql-snow.ql-toolbar button:hover .ql-fill,
+.ql-snow .ql-toolbar button:hover .ql-fill,
+.ql-snow.ql-toolbar button:focus .ql-fill,
+.ql-snow .ql-toolbar button:focus .ql-fill,
+.ql-snow.ql-toolbar button.ql-active .ql-fill,
+.ql-snow .ql-toolbar button.ql-active .ql-fill,
+.ql-snow.ql-toolbar .ql-picker-label:hover .ql-fill,
+.ql-snow .ql-toolbar .ql-picker-label:hover .ql-fill,
+.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,
+.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-fill,
+.ql-snow.ql-toolbar .ql-picker-item:hover .ql-fill,
+.ql-snow .ql-toolbar .ql-picker-item:hover .ql-fill,
+.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill,
+.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-fill,
+.ql-snow.ql-toolbar button:hover .ql-stroke.ql-fill,
+.ql-snow .ql-toolbar button:hover .ql-stroke.ql-fill,
+.ql-snow.ql-toolbar button:focus .ql-stroke.ql-fill,
+.ql-snow .ql-toolbar button:focus .ql-stroke.ql-fill,
+.ql-snow.ql-toolbar button.ql-active .ql-stroke.ql-fill,
+.ql-snow .ql-toolbar button.ql-active .ql-stroke.ql-fill,
+.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
+.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke.ql-fill,
+.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
+.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke.ql-fill,
+.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
+.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke.ql-fill,
+.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill,
+.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke.ql-fill {
+ fill: #06c;
+}
+.ql-snow.ql-toolbar button:hover .ql-stroke,
+.ql-snow .ql-toolbar button:hover .ql-stroke,
+.ql-snow.ql-toolbar button:focus .ql-stroke,
+.ql-snow .ql-toolbar button:focus .ql-stroke,
+.ql-snow.ql-toolbar button.ql-active .ql-stroke,
+.ql-snow .ql-toolbar button.ql-active .ql-stroke,
+.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke,
+.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke,
+.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,
+.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke,
+.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke,
+.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke,
+.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
+.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke,
+.ql-snow.ql-toolbar button:hover .ql-stroke-miter,
+.ql-snow .ql-toolbar button:hover .ql-stroke-miter,
+.ql-snow.ql-toolbar button:focus .ql-stroke-miter,
+.ql-snow .ql-toolbar button:focus .ql-stroke-miter,
+.ql-snow.ql-toolbar button.ql-active .ql-stroke-miter,
+.ql-snow .ql-toolbar button.ql-active .ql-stroke-miter,
+.ql-snow.ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
+.ql-snow .ql-toolbar .ql-picker-label:hover .ql-stroke-miter,
+.ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
+.ql-snow .ql-toolbar .ql-picker-label.ql-active .ql-stroke-miter,
+.ql-snow.ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
+.ql-snow .ql-toolbar .ql-picker-item:hover .ql-stroke-miter,
+.ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter,
+.ql-snow .ql-toolbar .ql-picker-item.ql-selected .ql-stroke-miter {
+ stroke: #06c;
+}
+@media (pointer: coarse) {
+ .ql-snow.ql-toolbar button:hover:not(.ql-active),
+ .ql-snow .ql-toolbar button:hover:not(.ql-active) {
+ color: #444;
+ }
+ .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-fill,
+ .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-fill,
+ .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill,
+ .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke.ql-fill {
+ fill: #444;
+ }
+ .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke,
+ .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke,
+ .ql-snow.ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter,
+ .ql-snow .ql-toolbar button:hover:not(.ql-active) .ql-stroke-miter {
+ stroke: #444;
+ }
+}
+.ql-snow {
+ box-sizing: border-box;
+}
+.ql-snow * {
+ box-sizing: border-box;
+}
+.ql-snow .ql-hidden {
+ display: none;
+}
+.ql-snow .ql-out-bottom,
+.ql-snow .ql-out-top {
+ visibility: hidden;
+}
+.ql-snow .ql-tooltip {
+ position: absolute;
+ transform: translateY(10px);
+}
+.ql-snow .ql-tooltip a {
+ cursor: pointer;
+ text-decoration: none;
+}
+.ql-snow .ql-tooltip.ql-flip {
+ transform: translateY(-10px);
+}
+.ql-snow .ql-formats {
+ display: inline-block;
+ vertical-align: middle;
+}
+.ql-snow .ql-formats:after {
+ clear: both;
+ content: '';
+ display: table;
+}
+.ql-snow .ql-stroke {
+ fill: none;
+ stroke: #444;
+ stroke-linecap: round;
+ stroke-linejoin: round;
+ stroke-width: 2;
+}
+.ql-snow .ql-stroke-miter {
+ fill: none;
+ stroke: #444;
+ stroke-miterlimit: 10;
+ stroke-width: 2;
+}
+.ql-snow .ql-fill,
+.ql-snow .ql-stroke.ql-fill {
+ fill: #444;
+}
+.ql-snow .ql-empty {
+ fill: none;
+}
+.ql-snow .ql-even {
+ fill-rule: evenodd;
+}
+.ql-snow .ql-thin,
+.ql-snow .ql-stroke.ql-thin {
+ stroke-width: 1;
+}
+.ql-snow .ql-transparent {
+ opacity: 0.4;
+}
+.ql-snow .ql-direction svg:last-child {
+ display: none;
+}
+.ql-snow .ql-direction.ql-active svg:last-child {
+ display: inline;
+}
+.ql-snow .ql-direction.ql-active svg:first-child {
+ display: none;
+}
+.ql-snow .ql-editor h1 {
+ font-size: 2em;
+}
+.ql-snow .ql-editor h2 {
+ font-size: 1.5em;
+}
+.ql-snow .ql-editor h3 {
+ font-size: 1.17em;
+}
+.ql-snow .ql-editor h4 {
+ font-size: 1em;
+}
+.ql-snow .ql-editor h5 {
+ font-size: 0.83em;
+}
+.ql-snow .ql-editor h6 {
+ font-size: 0.67em;
+}
+.ql-snow .ql-editor a {
+ text-decoration: underline;
+}
+.ql-snow .ql-editor blockquote {
+ border-left: 4px solid #ccc;
+ margin-bottom: 5px;
+ margin-top: 5px;
+ padding-left: 16px;
+}
+.ql-snow .ql-editor code,
+.ql-snow .ql-editor pre {
+ background-color: #f0f0f0;
+ border-radius: 3px;
+}
+.ql-snow .ql-editor pre {
+ white-space: pre-wrap;
+ margin-bottom: 5px;
+ margin-top: 5px;
+ padding: 5px 10px;
+}
+.ql-snow .ql-editor code {
+ font-size: 85%;
+ padding: 2px 4px;
+}
+.ql-snow .ql-editor pre.ql-syntax {
+ background-color: #23241f;
+ color: #f8f8f2;
+ overflow: visible;
+}
+.ql-snow .ql-editor img {
+ max-width: 100%;
+}
+.ql-snow .ql-picker {
+ color: #444;
+ display: inline-block;
+ float: left;
+ font-size: 14px;
+ font-weight: 500;
+ height: 24px;
+ position: relative;
+ vertical-align: middle;
+}
+.ql-snow .ql-picker-label {
+ cursor: pointer;
+ display: inline-block;
+ height: 100%;
+ padding-left: 8px;
+ padding-right: 2px;
+ position: relative;
+ width: 100%;
+}
+.ql-snow .ql-picker-label::before {
+ display: inline-block;
+ line-height: 22px;
+}
+.ql-snow .ql-picker-options {
+ background-color: #fff;
+ display: none;
+ min-width: 100%;
+ padding: 4px 8px;
+ position: absolute;
+ white-space: nowrap;
+}
+.ql-snow .ql-picker-options .ql-picker-item {
+ cursor: pointer;
+ display: block;
+ padding-bottom: 5px;
+ padding-top: 5px;
+}
+.ql-snow .ql-picker.ql-expanded .ql-picker-label {
+ color: #ccc;
+ z-index: 2;
+}
+.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill {
+ fill: #ccc;
+}
+.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke {
+ stroke: #ccc;
+}
+.ql-snow .ql-picker.ql-expanded .ql-picker-options {
+ display: block;
+ margin-top: -1px;
+ top: 100%;
+ z-index: 1;
+}
+.ql-snow .ql-color-picker,
+.ql-snow .ql-icon-picker {
+ width: 28px;
+}
+.ql-snow .ql-color-picker .ql-picker-label,
+.ql-snow .ql-icon-picker .ql-picker-label {
+ padding: 2px 4px;
+}
+.ql-snow .ql-color-picker .ql-picker-label svg,
+.ql-snow .ql-icon-picker .ql-picker-label svg {
+ right: 4px;
+}
+.ql-snow .ql-icon-picker .ql-picker-options {
+ padding: 4px 0px;
+}
+.ql-snow .ql-icon-picker .ql-picker-item {
+ height: 24px;
+ width: 24px;
+ padding: 2px 4px;
+}
+.ql-snow .ql-color-picker .ql-picker-options {
+ padding: 3px 5px;
+ width: 152px;
+}
+.ql-snow .ql-color-picker .ql-picker-item {
+ border: 1px solid transparent;
+ float: left;
+ height: 16px;
+ margin: 2px;
+ padding: 0px;
+ width: 16px;
+}
+.ql-snow .ql-picker:not(.ql-color-picker):not(.ql-icon-picker) svg {
+ position: absolute;
+ margin-top: -9px;
+ right: 0;
+ top: 50%;
+ width: 18px;
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-label]:not([data-label=''])::before,
+.ql-snow .ql-picker.ql-font .ql-picker-label[data-label]:not([data-label=''])::before,
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-label]:not([data-label=''])::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-label]:not([data-label=''])::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-label]:not([data-label=''])::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-label]:not([data-label=''])::before {
+ content: attr(data-label);
+}
+.ql-snow .ql-picker.ql-header {
+ width: 98px;
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item::before {
+ content: 'Normal';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+ content: 'Heading 1';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+ content: 'Heading 2';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+ content: 'Heading 3';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+ content: 'Heading 4';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+ content: 'Heading 5';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+ content: 'Heading 6';
+}
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
+ font-size: 2em;
+}
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
+ font-size: 1.5em;
+}
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
+ font-size: 1.17em;
+}
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
+ font-size: 1em;
+}
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
+ font-size: 0.83em;
+}
+.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
+ font-size: 0.67em;
+}
+.ql-snow .ql-picker.ql-font {
+ width: 108px;
+}
+.ql-snow .ql-picker.ql-font .ql-picker-label::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item::before {
+ content: 'Sans Serif';
+}
+.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=serif]::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
+ content: 'Serif';
+}
+.ql-snow .ql-picker.ql-font .ql-picker-label[data-value=monospace]::before,
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
+ content: 'Monospace';
+}
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=serif]::before {
+ font-family: Georgia, Times New Roman, serif;
+}
+.ql-snow .ql-picker.ql-font .ql-picker-item[data-value=monospace]::before {
+ font-family: Monaco, Courier New, monospace;
+}
+.ql-snow .ql-picker.ql-size {
+ width: 98px;
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item::before {
+ content: 'Normal';
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=small]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
+ content: 'Small';
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=large]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
+ content: 'Large';
+}
+.ql-snow .ql-picker.ql-size .ql-picker-label[data-value=huge]::before,
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
+ content: 'Huge';
+}
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=small]::before {
+ font-size: 10px;
+}
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=large]::before {
+ font-size: 18px;
+}
+.ql-snow .ql-picker.ql-size .ql-picker-item[data-value=huge]::before {
+ font-size: 32px;
+}
+.ql-snow .ql-color-picker.ql-background .ql-picker-item {
+ background-color: #fff;
+}
+.ql-snow .ql-color-picker.ql-color .ql-picker-item {
+ background-color: #000;
+}
+.ql-toolbar.ql-snow {
+ border: 1px solid #ccc;
+ box-sizing: border-box;
+ font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
+ padding: 8px;
+}
+.ql-toolbar.ql-snow .ql-formats {
+ margin-right: 15px;
+}
+.ql-toolbar.ql-snow .ql-picker-label {
+ border: 1px solid transparent;
+}
+.ql-toolbar.ql-snow .ql-picker-options {
+ border: 1px solid transparent;
+ box-shadow: rgba(0,0,0,0.2) 0 2px 8px;
+}
+.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label {
+ border-color: #ccc;
+}
+.ql-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options {
+ border-color: #ccc;
+}
+.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item.ql-selected,
+.ql-toolbar.ql-snow .ql-color-picker .ql-picker-item:hover {
+ border-color: #000;
+}
+.ql-toolbar.ql-snow + .ql-container.ql-snow {
+ border-top: 0px;
+}
+.ql-snow .ql-tooltip {
+ background-color: #fff;
+ border: 1px solid #ccc;
+ box-shadow: 0px 0px 5px #ddd;
+ color: #444;
+ padding: 5px 12px;
+ white-space: nowrap;
+}
+.ql-snow .ql-tooltip::before {
+ content: "Visit URL:";
+ line-height: 26px;
+ margin-right: 8px;
+}
+.ql-snow .ql-tooltip input[type=text] {
+ display: none;
+ border: 1px solid #ccc;
+ font-size: 13px;
+ height: 26px;
+ margin: 0px;
+ padding: 3px 5px;
+ width: 170px;
+}
+.ql-snow .ql-tooltip a.ql-preview {
+ display: inline-block;
+ max-width: 200px;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ vertical-align: top;
+}
+.ql-snow .ql-tooltip a.ql-action::after {
+ border-right: 1px solid #ccc;
+ content: 'Edit';
+ margin-left: 16px;
+ padding-right: 8px;
+}
+.ql-snow .ql-tooltip a.ql-remove::before {
+ content: 'Remove';
+ margin-left: 8px;
+}
+.ql-snow .ql-tooltip a {
+ line-height: 26px;
+}
+.ql-snow .ql-tooltip.ql-editing a.ql-preview,
+.ql-snow .ql-tooltip.ql-editing a.ql-remove {
+ display: none;
+}
+.ql-snow .ql-tooltip.ql-editing input[type=text] {
+ display: inline-block;
+}
+.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
+ border-right: 0px;
+ content: 'Save';
+ padding-right: 0px;
+}
+.ql-snow .ql-tooltip[data-mode=link]::before {
+ content: "Enter link:";
+}
+.ql-snow .ql-tooltip[data-mode=formula]::before {
+ content: "Enter formula:";
+}
+.ql-snow .ql-tooltip[data-mode=video]::before {
+ content: "Enter video:";
+}
+.ql-snow a {
+ color: #06c;
+}
+.ql-container.ql-snow {
+ border: 1px solid #ccc;
+}
diff --git a/src/wwwroot/tsconfig.json b/src/wwwroot/tsconfig.json
new file mode 100644
index 0000000..1ca0483
--- /dev/null
+++ b/src/wwwroot/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "outDir": "./dist/",
+ "noImplicitAny": false,
+ "module": "es6",
+ "target": "es5",
+ "moduleResolution": "Node",
+ "allowJs": true
+ }
+}
diff --git a/src/wwwroot/version.txt b/src/wwwroot/version.txt
new file mode 100644
index 0000000..60c921b
--- /dev/null
+++ b/src/wwwroot/version.txt
@@ -0,0 +1 @@
+19e4d37
diff --git a/src/wwwroot/webpack.config.js b/src/wwwroot/webpack.config.js
new file mode 100644
index 0000000..2ab3436
--- /dev/null
+++ b/src/wwwroot/webpack.config.js
@@ -0,0 +1,156 @@
+const path = require("path");
+const globImporter = require("node-sass-glob-importer");
+
+module.exports = [
+ {
+ mode: "development",
+ entry: ["./frontbundle.js", "./frontbundle.scss"],
+ watch: (process.argv.indexOf("--watch") > -1),
+ watchOptions: {
+ ignored: /node_modules/,
+ },
+ module: {
+ rules: [
+ {
+ test: /\.ts?$/,
+ exclude: /node_modules/,
+ use: "ts-loader",
+ },
+ {
+ test: /\.svg$/,
+ use: [{
+ loader: "html-loader",
+ options: {
+ minimize: true,
+ },
+ }],
+ },
+ {
+ test: /\.(css|scss)$/i,
+ use: [
+ {
+ loader: "file-loader",
+ options: {
+ name: "[name].css",
+ },
+ },
+ {
+ loader: "extract-loader",
+ },
+ {
+ loader: "css-loader?-url",
+ },
+ {
+ loader: "postcss-loader",
+ options: {
+ postcssOptions: {
+ plugins: ["autoprefixer"],
+ },
+ },
+ },
+ {
+ loader: "sass-loader",
+ options: {
+ sourceMap: true,
+ sassOptions: {
+ outputStyle: "compressed",
+ importer: globImporter(),
+ },
+ },
+ },
+ ],
+ },
+ ],
+ },
+ resolve: {
+ extensions: [".ts", ".js", ".scss", ".css"],
+ },
+ devtool: "source-map",
+ output: {
+ filename: "frontbundle.min.js",
+ path: path.resolve(__dirname, "dist"),
+ },
+ },
+ {
+ mode: "development",
+ entry: ["./backbundle.js", "./backbundle.scss"],
+ watch: (process.argv.indexOf("--watch") > -1),
+ watchOptions: {
+ ignored: /node_modules/,
+ },
+ module: {
+ rules: [
+ {
+ test: /\.ts$/,
+ use: [{
+ loader: "ts-loader",
+ options: {
+ compilerOptions: {
+ declaration: false,
+ target: "es5",
+ module: "commonjs",
+ },
+ transpileOnly: true,
+ },
+ }],
+ },
+ {
+ test: /\.svg$/,
+ use: [{
+ loader: "html-loader",
+ options: {
+ minimize: true,
+ },
+ }],
+ },
+ {
+ test: /\.(css|scss)$/i,
+ use: [
+ {
+ loader: "file-loader",
+ options: {
+ name: "[name].css",
+ },
+ },
+ {
+ loader: "extract-loader",
+ },
+ {
+ loader: "css-loader?-url",
+ },
+ {
+ loader: "postcss-loader",
+ options: {
+ postcssOptions: {
+ plugins: ["autoprefixer"],
+ },
+ },
+ },
+ {
+ loader: "sass-loader",
+ options: {
+ sourceMap: true,
+ sassOptions: {
+ outputStyle: "compressed",
+ importer: globImporter(),
+ },
+ },
+ },
+ ],
+ },
+ ],
+ },
+ resolve: {
+ extensions: [".ts", ".js", ".scss", ".css"],
+ alias: {
+ "parchment": path.resolve(__dirname, "node_modules/parchment/src/parchment.ts"),
+ "quill$": path.resolve(__dirname, "node_modules/quill/quill.js"),
+ },
+ },
+ devtool: "source-map",
+ output: {
+ filename: "backbundle.min.js",
+ path: path.resolve(__dirname, "dist"),
+ },
+ },
+]; \ No newline at end of file