diff --git a/.github/workflows/newman-build.yaml b/.github/workflows/newman-build.yaml new file mode 100644 index 00000000..71f387bd --- /dev/null +++ b/.github/workflows/newman-build.yaml @@ -0,0 +1,65 @@ +name: Build newman and publish artifacts + +on: + push: + branches: [ PIC-5667-postgres-migration ] + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - name: Set up Java 8 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' + java-version: '8' + + - name: Install Maven 3.6.3 + uses: stCarolas/setup-maven@v4 + with: + maven-version: 3.6.3 + + - name: Checkout code + uses: actions/checkout@v4 + + - name: Build all modules + run: mvn clean package + + - name: Install GitHub CLI + run: | + sudo apt update + sudo apt install -y gh + + - name: Zip all target directories + run: | + mkdir -p build-zips + for dir in */target; do + parent=$(dirname "$dir") + zipfile="build-zips/${parent}.zip" + echo "Zipping $dir -> $zipfile" + (cd "$dir" && zip -r "../../$zipfile" .) + done + + - name: Generate checksums + run: | + cd build-zips + sha256sum *.zip > checksums.sha256 + cat checksums.sha256 + + - name: Create or update GitHub Release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout) + + # Create release if not exists + gh release view "v$VERSION" >/dev/null 2>&1 || \ + gh release create "v$VERSION" --title "v$VERSION" --notes "SHA256 checksums below:" + + # Upload all files including checksums + for file in build-zips/*.zip build-zips/checksums.sha256; do + echo "Uploading $file" + gh release upload "v$VERSION" "$file" --clobber + done \ No newline at end of file diff --git a/docker/Dockerfile b/docker/_Dockerfile similarity index 85% rename from docker/Dockerfile rename to docker/_Dockerfile index 7f43c173..41f7c565 100644 --- a/docker/Dockerfile +++ b/docker/_Dockerfile @@ -8,10 +8,10 @@ ARG gid=1001 RUN apt-get update -y RUN apt-get install coreutils wget -y -ENV MAVEN_VERSION 3.6.3 -ENV MAVEN_FILE apache-maven-${MAVEN_VERSION}-bin.tar.gz -ENV NODE_VERSION 22.11.0 -ENV NODE_FILE node-v${NODE_VERSION}-linux-x64.tar.gz +ENV MAVEN_VERSION=3.6.3 +ENV MAVEN_FILE=apache-maven-${MAVEN_VERSION}-bin.tar.gz +ENV NODE_VERSION=22.11.0 +ENV NODE_FILE=node-v${NODE_VERSION}-linux-x64.tar.gz # Jenkins is run with user `newman`, uid = 1000 # If you bind mount a volume from the host or a data container, @@ -21,7 +21,7 @@ RUN groupadd -g ${gid} ${group} \ # Install Java. RUN apt-get install openjdk-8-jdk -y -ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ +ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ # Install Maven RUN wget --no-verbose -O /tmp/${MAVEN_FILE} \ @@ -66,3 +66,5 @@ USER root RUN apt-get install sudo curl -y netbase USER ${user} + +CMD ["sh", "/newman/bin/newman-server.sh"] \ No newline at end of file diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml new file mode 100644 index 00000000..58d22ba2 --- /dev/null +++ b/docker/docker-compose.yml @@ -0,0 +1,32 @@ +version: "3.8" + +services: + newman-server: + image: newman-server:1.0 + container_name: newman-server + ports: + - "8080:8080" + - "8443:8443" + volumes: + - /home/newman/server:/newman + entrypoint: ["/newman/bin/newman-server.sh"] + networks: + - newman-network + + newman-postgres: + image: postgres + container_name: newman-postgres + ports: + - "5432:5432" + environment: + POSTGRES_DB: newman-db + POSTGRES_USER: admin + POSTGRES_PASSWORD: password + volumes: + - /home/newman/postgres_data:/var/lib/postgresql/data + networks: + - newman-network + +networks: + newman-network: + driver: bridge diff --git a/files/branch_list.txt b/files/branch_list.txt new file mode 100644 index 00000000..8b25206f --- /dev/null +++ b/files/branch_list.txt @@ -0,0 +1 @@ +master \ No newline at end of file diff --git a/files/newman-submitter-loop.sh b/files/newman-submitter-loop.sh new file mode 100755 index 00000000..0ad48746 --- /dev/null +++ b/files/newman-submitter-loop.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +while true; do + source submitter-env.sh + + # take branches from file + branch_list=`cat ${BRANCH_FILE_PATH}` + IFS=',' read -a branch_array <<< "${branch_list}" + echo "starting loop over branches ..." + + # loop over all branches + for branch in "${branch_array[@]}" + do + echo "Start submitting XAP jobs. Date is [`date`]" + # current hour + HOURS=$(date +%H) + + if [ $HOURS -ge 20 -a $HOURS -le 23 ]; then + echo "running in nightly mode, will trigger new jobs even if no changes where made, date is `date`" + export NEWMAN_MODE="NIGHTLY" + export NEWMAN_BUILD_TAGS="XAP,DOTNET" + else + echo "running in daily mode, will trigger new jobs only if changes in build were made, date is `date`" + export NEWMAN_MODE="DAILY" + export NEWMAN_BUILD_TAGS="XAP" + fi + + export NEWMAN_BUILD_BRANCH=${branch} + + echo "NEWMAN_BUILD_BRANCH=${NEWMAN_BUILD_BRANCH}" + echo "NEWMAN_BUILD_TAGS=${NEWMAN_BUILD_TAGS}" + echo "NEWMAN_MODE=${NEWMAN_MODE}" + + #checking future job + java -jar newman-submitter-2.0.jar + HAS_FUTURE_JOBS=$? + echo "FINISHED SUBMIT LOOP!! [HAS_FUTURE_JOBS=${HAS_FUTURE_JOBS}]. Date is [`date`]" + sleep 60 + done +done diff --git a/files/submitter-env.ini b/files/submitter-env.ini new file mode 100644 index 00000000..680054b3 --- /dev/null +++ b/files/submitter-env.ini @@ -0,0 +1,41 @@ +[main] +DISCONNECT = 59f25af5b3859424cac590ad +MANAGER = 5c88ea4bb38594355214b205 +XAP_CORE = 59f25d19b3859424cac590bf +OFF_HEAP = 59f25d5bb3859424cac590c2 +ROCKS_DB = 59f25d5ab3859424cac590c1 +JETTY9 = 59f25af6b3859424cac590b1 +WAN = 59f25af7b3859424cac590b9 +I9E_SGTEST = 59f59592b3859424cac690fa +MONGO_DB = 59f25af7b3859424cac590b4 +ESM_SECURITY = 59f25af7b3859424cac590b7 +SERVICE_GRID = 59f25af7b3859424cac590b5 +SECURITY = 59f25af7b3859424cac590b8 +ESM = 59f25af7b3859424cac590b6 +DOTNET = 59f25af6b3859424cac590ae +WEB_UI = 59f25e0f6d98c14e1daa2008 +MANAGER_SECURITY = 58907cbb29f67f0c0af7eee1 +INSIGHTEDGE_PREMIUM = 59f25af6b3859424cac590b0 +MX_OFF_HEAP = 5a96b14268c479caafb1162f +MX_PMEM = 5be44547b385947afe427786 +FOOTPRINT = 5b1ce25cb385946642f31fac +I9E_SGTEST_CLI = 5b4c8771b38594390d56cccf +DEMOTE = 5b6c24e7b385941b3b8ce4bf +DEMOTE_ROCKSDB = 5b82bae131f99308478e101b +AX_SPARK = 5d2b2d1c4cedfd000ca050d8 +K8S_I9E = 5c88efc7b38594355214b36b +K8S_XAP = 5c88efb2b38594355214b36a +OPS_UI = 5ef32df04cedfd00099271ae +OPS_UI_SECURED = 5ef327854cedfd000992719e +ELASTICGRID = 5f9fe92cf10dba603d82bb9e +PERFORMANCE = 59f25e0f6d98c14e1daa5000 +TIERED_STORAGE_COLD_ONLY = 61dae61c4cedfd000c4bf3b2 +DAILY_SUITES_LIST = ${XAP_CORE},${SERVICE_GRID},${MANAGER},${ROCKS_DB},${OFF_HEAP},${DISCONNECT},${ESM_SECURITY},${WAN},${MONGO_DB},${ESM},${SECURITY},${JETTY9},${WEB_UI},${MANAGER_SECURITY},${MX_OFF_HEAP},${FOOTPRINT},${DEMOTE},${OPS_UI},${OPS_UI_SECURED},${TIERED_STORAGE_COLD_ONLY} +NIGHTLY_SUITES_LIST = ${XAP_CORE},${SERVICE_GRID},${MANAGER},${ROCKS_DB},${DISCONNECT},${WAN},${MONGO_DB},${SECURITY},${JETTY9},${WEB_UI},${MANAGER_SECURITY},${MX_OFF_HEAP},${OFF_HEAP},${FOOTPRINT},${DEMOTE},${DEMOTE_ROCKSDB},${OPS_UI},${OPS_UI_SECURED},${PERFORMANCE},${K8S_XAP},${TIERED_STORAGE_COLD_ONLY},${DOTNET} +LAST_DAILY_SUITE = 5f9fe92cf10dba603d82bb9e +LAST_NIGHTLY_RUN = 2025/05/27 +JOB_CONFIG_DEFAULT = OPENJDK_17 +JOB_CONFIG_SCHEDULED = {"5":"OPENJDK_21"} +AGENT_GROUPS_DEFAULT = onprem,onprem-dotnet +DAILY_JOB_PRIORITY_DEFAULT = 0 +NIGHTLY_JOB_PRIORITY_DEFAULT = 3 \ No newline at end of file diff --git a/files/submitter.sh b/files/submitter.sh new file mode 100644 index 00000000..19bfe4d5 --- /dev/null +++ b/files/submitter.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +source submitter-env.sh + +# take branches from file +branch_list=`cat ${BRANCH_FILE_PATH}` +IFS=',' read -a branch_array <<< "${branch_list}" +echo "starting loop over branches ..." + +# loop over all branches +for branch in "${branch_array[@]}" +do + echo "Start submitting XAP jobs. Date is [`date`]" + # current hour + HOURS=$(date +%H) + + # check if nightly or daily mode - every branch +# if [ $HOURS -ge 20 -a $HOURS -le 23 ]; then + if [ $HOURS -ge 20 -a $HOURS -le 23 ]; then + echo "running in nightly mode, will trigger new jobs even if no changes where made, date is `date`" + export NEWMAN_MODE="NIGHTLY" + export NEWMAN_BUILD_TAGS="XAP,DOTNET" + else + echo "running in daily mode, will trigger new jobs only if changes in build were made, date is `date`" + export NEWMAN_MODE="DAILY" + export NEWMAN_BUILD_TAGS="XAP" + fi + + export NEWMAN_BUILD_BRANCH=${branch} + + echo "NEWMAN_BUILD_BRANCH=${NEWMAN_BUILD_BRANCH}" + echo "NEWMAN_BUILD_TAGS=${NEWMAN_BUILD_TAGS}" + echo "NEWMAN_MODE=${NEWMAN_MODE}" + + #checking future job + java -jar newman-submitter-2.0.jar + HAS_FUTURE_JOBS=$? + echo "FINISHED SUBMIT LOOP!! [HAS_FUTURE_JOBS=${HAS_FUTURE_JOBS}]. Date is [`date`]" +done diff --git a/newman-agent/src/main/java/com/gigaspaces/newman/JobExecutor.java b/newman-agent/src/main/java/com/gigaspaces/newman/JobExecutor.java index 8f591251..9490865e 100644 --- a/newman-agent/src/main/java/com/gigaspaces/newman/JobExecutor.java +++ b/newman-agent/src/main/java/com/gigaspaces/newman/JobExecutor.java @@ -1,8 +1,8 @@ package com.gigaspaces.newman; -import com.gigaspaces.newman.beans.Job; -import com.gigaspaces.newman.beans.Suite; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Job; +import com.gigaspaces.newman.entities.Suite; +import com.gigaspaces.newman.entities.Test; import com.gigaspaces.newman.utils.FileUtils; import com.gigaspaces.newman.utils.ProcessResult; import com.gigaspaces.newman.utils.ProcessUtils; @@ -12,11 +12,13 @@ import java.io.File; import java.io.IOException; import java.net.URI; +import java.net.URISyntaxException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; import static com.gigaspaces.newman.utils.FileUtils.*; +import static com.gigaspaces.newman.utils.StringUtils.getNonEmptySystemProperty; public class JobExecutor { private static final Logger logger = LoggerFactory.getLogger(JobExecutor.class); @@ -25,6 +27,7 @@ public class JobExecutor { private final Job job; private final Path jobFolder; private final Path newmanLogFolder; + private final String proxy = getNonEmptySystemProperty("resources.proxy.url", null); public JobExecutor(Job job, String basePath) { this.job = job; @@ -50,8 +53,9 @@ public boolean setup() { logger.info("Downloading {} resources into {}...", job.getBuild().getResources().size(), resourcesFolder); validateUris(job.getBuild().getResources()); for (URI resource : job.getBuild().getResources()) { - logger.info("Downloading {}...", resource); - download(resource.toURL(), resourcesFolder); + URI proxiedResource = wrapWithProxy(resource); + logger.info("Downloading {}...", proxiedResource); + download(proxiedResource.toURL(), resourcesFolder); } logger.info("Extracting Newman Artifacts..."); @@ -88,6 +92,24 @@ public boolean setup() { } } + private URI wrapWithProxy(URI origPath) { + if (proxy == null) { + logger.info("No proxy has been found"); + return origPath; + } + + logger.info("Using proxy - {}", proxy); + String origPathStr = proxy.split(":")[0]; + String proxyPathStr = proxy.split(":")[1]; + + try { + return new URI(origPath.toString().replace(origPathStr, proxyPathStr)); + } catch (URISyntaxException e) { + logger.error("Failed to wrap proxy URI {} with {}: {}", origPathStr, proxyPathStr, e); + return origPath; + } + } + private long overrideSetupTimeoutIfRequested() { Map customVariablesFromSuite = getCustomVariablesFromSuite(); String customTimeout = customVariablesFromSuite.get(Suite.CUSTOM_SETUP_TIMEOUT); @@ -178,9 +200,16 @@ private Collection wrapUniqueArgsWithQuotes(List arguments) { } private void teardownTest(Test test) { + logger.info("Tearing down test {}", test.getName()); + Path testFolder = append(jobFolder, "test-" + test.getId()); Path outputFile = append(append(testFolder, "output"), "end-" + test.getTestType() + ".log"); Path teardownScript = append(jobFolder, "end-" + test.getTestType() + SCRIPT_SUFFIX); + + logger.info("testFolder path: {}", testFolder); + logger.info("outputFile path: {}", outputFile); + logger.info("teardownScript path: {}", teardownScript); + if (exists(teardownScript)) { logger.info("Executing teardown for test {}", test); try { diff --git a/newman-agent/src/main/java/com/gigaspaces/newman/NewmanAgent.java b/newman-agent/src/main/java/com/gigaspaces/newman/NewmanAgent.java index a034f5b7..7e7b4724 100644 --- a/newman-agent/src/main/java/com/gigaspaces/newman/NewmanAgent.java +++ b/newman-agent/src/main/java/com/gigaspaces/newman/NewmanAgent.java @@ -1,6 +1,7 @@ package com.gigaspaces.newman; -import com.gigaspaces.newman.beans.*; +import com.gigaspaces.newman.beans.CapabilitiesAndRequirements; +import com.gigaspaces.newman.entities.*; import com.gigaspaces.newman.utils.FileUtils; import com.gigaspaces.newman.utils.ProcessUtils; import org.slf4j.Logger; @@ -32,6 +33,7 @@ public class NewmanAgent { private final Timer timer = new Timer(true); private static final int DEFAULT_TIMEOUT_SECONDS = 60; private static final int MILLISECONDS_IN_SECOND = 1000; + private static final int SETUP_TIMEOUT_MINS = 20; private volatile boolean workerShouldStop = false; private volatile long lastPriorityCheckedTime; @@ -161,7 +163,7 @@ public void run() { } private void setFinalAgentName() { - this.name = config.getHostAddress() + "-" + UUID.randomUUID().toString(); + this.name = config.getHostAddress() + "-" + UUID.randomUUID(); } private void start() { @@ -218,7 +220,25 @@ private void start() { // ping server during job setup and execution keepAliveTask = startKeepAliveTask(job.getId(), keepAliveTask); jobExecutor = new JobExecutor(job, config.getNewmanHome()); - boolean setupFinished = jobExecutor.setup(); + + // Wrap setup in timeout protection to prevent agent from hanging the main thread + boolean setupFinished; + ExecutorService setupExecutor = Executors.newSingleThreadExecutor(); + try { + JobExecutor jobExecutorSetupIndication = jobExecutor; + Future setupFuture = setupExecutor.submit(() -> jobExecutorSetupIndication.setup()); + // Timeout: 30 minutes for setup (can be adjusted based on expected download sizes) + setupFinished = setupFuture.get(SETUP_TIMEOUT_MINS, TimeUnit.MINUTES); + } catch (TimeoutException e) { + logger.error("Setup of job {} timed out after {} minutes, agent would have hung", job.getId(), SETUP_TIMEOUT_MINS); + setupFinished = false; + } catch (Exception e) { + logger.error("Setup of job {} failed with exception: {}", job.getId(), e); + setupFinished = false; + } finally { + setupExecutor.shutdownNow(); // Force shutdown to interrupt hung threads + } + reportJobSetup(job.getId(), name, jobExecutor.getJobFolder()); if (!setupFinished) { @@ -332,11 +352,7 @@ private void resubmitFailed(String jobId, Test failedTest) { Job job = null; try { job = client.getJob(jobId).toCompletableFuture().get(DEFAULT_TIMEOUT_SECONDS, TimeUnit.SECONDS); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } catch (TimeoutException e) { + } catch (InterruptedException | ExecutionException | TimeoutException e) { e.printStackTrace(); } if (job == null) { @@ -356,9 +372,7 @@ private void resubmitFailed(String jobId, Test failedTest) { tests.add(newTest); try { client.createTests(tests, "don't count").toCompletableFuture().get(DEFAULT_TIMEOUT_SECONDS * 5, TimeUnit.SECONDS); - } catch (InterruptedException | TimeoutException e) { - e.printStackTrace(); - } catch (ExecutionException e) { + } catch (InterruptedException | TimeoutException | ExecutionException e) { e.printStackTrace(); } } @@ -432,6 +446,7 @@ private Job waitForJob(boolean toStopAfterOneIterate) { agent.setHostAddress(config.getHostAddress()); agent.setPid(ProcessUtils.getProcessId("unknownPID")); agent.setGroupName(config.getGroupName()); + agent.setWorkersCount(config.getNumOfWorkers()); String capabilities = config.getCapabilities(); // TODO note - if set is empty, mongodb will NOT write that filed to DB agent.setCapabilities(CapabilitiesAndRequirements.parse(capabilities)); diff --git a/newman-agent/src/test/java/com/gigaspaces/newman/jobexecutor/JobExecutorTests.java b/newman-agent/src/test/java/com/gigaspaces/newman/jobexecutor/JobExecutorTests.java index cf951db2..3724229b 100644 --- a/newman-agent/src/test/java/com/gigaspaces/newman/jobexecutor/JobExecutorTests.java +++ b/newman-agent/src/test/java/com/gigaspaces/newman/jobexecutor/JobExecutorTests.java @@ -1,7 +1,7 @@ package com.gigaspaces.newman.jobexecutor; import com.gigaspaces.newman.JobExecutor; -import com.gigaspaces.newman.beans.Job; +import com.gigaspaces.newman.entities.Job; import com.gigaspaces.newman.utils.MockUtils; import org.junit.After; import org.junit.Assert; diff --git a/newman-agent/src/test/java/com/gigaspaces/newman/utils/MockUtils.java b/newman-agent/src/test/java/com/gigaspaces/newman/utils/MockUtils.java index 370bb200..86994e72 100644 --- a/newman-agent/src/test/java/com/gigaspaces/newman/utils/MockUtils.java +++ b/newman-agent/src/test/java/com/gigaspaces/newman/utils/MockUtils.java @@ -1,7 +1,7 @@ package com.gigaspaces.newman.utils; -import com.gigaspaces.newman.beans.Build; -import com.gigaspaces.newman.beans.Job; +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.entities.Job; import com.gigaspaces.newman.beans.State; import java.net.URI; diff --git a/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/DiffComparableData.java b/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/DiffComparableData.java index 95baf238..78c910f3 100644 --- a/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/DiffComparableData.java +++ b/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/DiffComparableData.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.crons.suitediff; -import com.gigaspaces.newman.beans.Suite; +import com.gigaspaces.newman.entities.Suite; /** * Created by moran on 8/19/15. diff --git a/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/HistoryTestData.java b/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/HistoryTestData.java index 1136199e..911423c3 100644 --- a/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/HistoryTestData.java +++ b/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/HistoryTestData.java @@ -1,7 +1,7 @@ package com.gigaspaces.newman.crons.suitediff; -import com.gigaspaces.newman.beans.Suite; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Suite; +import com.gigaspaces.newman.entities.Test; /** * Created by moran on 5/14/17. diff --git a/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/SuiteDiffCronJob.java b/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/SuiteDiffCronJob.java index ecc01cfe..d156e723 100644 --- a/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/SuiteDiffCronJob.java +++ b/newman-analytics/src/main/java/com/gigaspaces/newman/crons/suitediff/SuiteDiffCronJob.java @@ -4,6 +4,9 @@ import com.gigaspaces.newman.analytics.CronJob; import com.gigaspaces.newman.analytics.PropertiesConfigurer; import com.gigaspaces.newman.beans.*; +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.entities.Job; +import com.gigaspaces.newman.entities.Test; import com.gigaspaces.newman.server.NewmanServerConfig; import com.gigaspaces.newman.smtp.Mailman; import com.gigaspaces.newman.utils.StringUtils; @@ -122,7 +125,7 @@ private void sendEmail(Properties properties, NewmanClient newmanClient) throws if (latestBuild.getTags().contains("NIGHTLY")) { htmlTemplate.setAttribute("suitesThatDidNotParticipate", suitesThatDidNotParticipate); } - htmlTemplate.setAttribute("totalSuites", latestBuild.getBuildStatus().getSuitesIds().size()); + htmlTemplate.setAttribute("totalSuites", latestBuild.getBuildStatus().getSuites().size()); htmlTemplate.setAttribute("totalPassed", latestBuild.getBuildStatus().getPassedTests()); htmlTemplate.setAttribute("totalFailed", latestBuild.getBuildStatus().getFailedTests()); htmlTemplate.setAttribute("totalFailedx", latestBuild.getBuildStatus().getFailed3TimesTests()); diff --git a/newman-client/src/main/java/com/gigaspaces/newman/ConvertSuitesCriteria.java b/newman-client/src/main/java/com/gigaspaces/newman/ConvertSuitesCriteria.java index 9d565d13..cc0014ac 100644 --- a/newman-client/src/main/java/com/gigaspaces/newman/ConvertSuitesCriteria.java +++ b/newman-client/src/main/java/com/gigaspaces/newman/ConvertSuitesCriteria.java @@ -1,12 +1,11 @@ package com.gigaspaces.newman; import com.gigaspaces.newman.beans.Batch; -import com.gigaspaces.newman.beans.Suite; +import com.gigaspaces.newman.entities.Suite; import com.gigaspaces.newman.beans.criteria.*; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; diff --git a/newman-client/src/main/java/com/gigaspaces/newman/Main.java b/newman-client/src/main/java/com/gigaspaces/newman/Main.java index 22774a5c..ccc0144f 100644 --- a/newman-client/src/main/java/com/gigaspaces/newman/Main.java +++ b/newman-client/src/main/java/com/gigaspaces/newman/Main.java @@ -5,6 +5,7 @@ import com.gigaspaces.newman.beans.criteria.CriteriaBuilder; import com.gigaspaces.newman.beans.criteria.PatternCriteria; import com.gigaspaces.newman.beans.criteria.TestCriteria; +import com.gigaspaces.newman.entities.*; import com.gigaspaces.newman.utils.EnvUtils; import com.gigaspaces.newman.utils.FileUtils; //import com.google.gson.Gson; diff --git a/newman-client/src/main/java/com/gigaspaces/newman/NewmanClient.java b/newman-client/src/main/java/com/gigaspaces/newman/NewmanClient.java index d601c5ec..213ba186 100644 --- a/newman-client/src/main/java/com/gigaspaces/newman/NewmanClient.java +++ b/newman-client/src/main/java/com/gigaspaces/newman/NewmanClient.java @@ -1,6 +1,7 @@ package com.gigaspaces.newman; import com.gigaspaces.newman.beans.*; +import com.gigaspaces.newman.entities.*; import org.glassfish.jersey.client.JerseyClientBuilder; import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; import org.glassfish.jersey.client.rx.RxClient; diff --git a/newman-client/src/main/java/com/gigaspaces/newman/RestClient.java b/newman-client/src/main/java/com/gigaspaces/newman/RestClient.java index 2f37e37f..e01e806f 100644 --- a/newman-client/src/main/java/com/gigaspaces/newman/RestClient.java +++ b/newman-client/src/main/java/com/gigaspaces/newman/RestClient.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; import com.gigaspaces.newman.beans.Batch; -import com.gigaspaces.newman.beans.Job; +import com.gigaspaces.newman.entities.Job; import com.gigaspaces.newman.beans.JobRequest; import org.glassfish.jersey.SslConfigurator; import org.glassfish.jersey.client.JerseyClientBuilder; diff --git a/newman-common/pom.xml b/newman-common/pom.xml index e5ef74fe..fd7dd2d7 100644 --- a/newman-common/pom.xml +++ b/newman-common/pom.xml @@ -45,10 +45,6 @@ org.glassfish.jersey.ext jersey-entity-filtering - - org.mongodb.morphia - morphia - commons-io commons-io @@ -57,6 +53,12 @@ net.lingala.zip4j zip4j + + + org.apache.commons + commons-lang3 + 3.17.0 + diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/AllSuitesAndBuilds.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/AllSuitesAndBuildsView.java similarity index 56% rename from newman-common/src/main/java/com/gigaspaces/newman/beans/AllSuitesAndBuilds.java rename to newman-common/src/main/java/com/gigaspaces/newman/beans/AllSuitesAndBuildsView.java index f0a2ec58..88121838 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/AllSuitesAndBuilds.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/AllSuitesAndBuildsView.java @@ -7,15 +7,15 @@ * Created by Evgeny Fisher * 2/25/16. */ -public class AllSuitesAndBuilds { +public class AllSuitesAndBuildsView { - private List suites = new ArrayList(); - private List builds = new ArrayList(); + private List suites = new ArrayList<>(); + private List builds = new ArrayList<>(); - public AllSuitesAndBuilds() { + public AllSuitesAndBuildsView() { } - public AllSuitesAndBuilds( List builds, List suites ) { + public AllSuitesAndBuildsView(List builds, List suites ) { this.builds = builds; this.suites = suites; } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/Batch.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/Batch.java index 559a22b7..3d79bddb 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/Batch.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/Batch.java @@ -1,7 +1,7 @@ package com.gigaspaces.newman.beans; -import com.gigaspaces.newman.utils.ToStringBuilder; -import org.mongodb.morphia.annotations.Transient; +import javax.persistence.*; +import org.apache.commons.lang3.builder.ToStringBuilder; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; @@ -109,7 +109,7 @@ public void setNext(URI next) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("values", values) .append("offset", offset) .append("limit", limit) diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/Build.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/Build.java deleted file mode 100644 index 44be3235..00000000 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/Build.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.gigaspaces.newman.beans; - -import com.gigaspaces.newman.utils.ToStringBuilder; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; -import org.mongodb.morphia.annotations.Indexed; -import org.mongodb.morphia.utils.IndexDirection; - -import java.net.URI; -import java.util.*; - -/** - * Created by Barak Bar Orion - * 4/13/15. - */ -@Entity -public class Build { - @Id - private String id; - @Indexed(value= IndexDirection.ASC, unique=false) - private String name; - private Map shas; - @Indexed(value= IndexDirection.ASC, unique=false) - private String branch; - private Collection resources; - private Collection testsMetadata; //JSON metadata of the tests - private Set tags; - private Date buildTime; - private BuildStatus buildStatus; - - public Build() { - this.shas = new HashMap<>(); - this.resources = new ArrayList<>(); - this.testsMetadata = new ArrayList<>(); - this.tags = new HashSet<>(); - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Map getShas() { - return shas; - } - - public void setShas(Map shas) { - this.shas = shas; - } - - public String getBranch() { - return branch; - } - - public void setBranch(String branch) { - this.branch = branch; - } - - public Collection getResources() { - return resources; - } - - public void setResources(Collection resources) { - this.resources = resources; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Date getBuildTime() { - return buildTime; - } - - public void setBuildTime(Date buildTime) { - this.buildTime = buildTime; - } - - public Collection getTestsMetadata() { - return testsMetadata; - } - - public void setTestsMetadata(Collection testsMetadata) { - this.testsMetadata = testsMetadata; - } - - public BuildStatus getBuildStatus() { - return buildStatus; - } - - public void setBuildStatus(BuildStatus buildStatus) { - this.buildStatus = buildStatus; - } - - public Set getTags() { - return tags; - } - - public void setTags(Set tags) { - this.tags = tags; - } - - public void addTag(String tag){ - tags.add(tag); - } - - @Override - public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) - .append("id", id) - .append("name", name) - .append("shas", shas) - .append("branch", branch) - .append("resources", resources) - .append("testsMetadata", testsMetadata) - .append("tags", tags) - .append("buildTime", buildTime) - .append("buildStatus", buildStatus) - .toString(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Build build = (Build) o; - - if (id != null ? !id.equals(build.id) : build.id != null) return false; - if (name != null ? !name.equals(build.name) : build.name != null) return false; - return !(branch != null ? !branch.equals(build.branch) : build.branch != null); - - } - - @Override - public int hashCode() { - int result = id != null ? id.hashCode() : 0; - result = 31 * result + (name != null ? name.hashCode() : 0); - result = 31 * result + (branch != null ? branch.hashCode() : 0); - return result; - } -} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildStatus.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildStatus.java deleted file mode 100644 index eb8e83a5..00000000 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildStatus.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.gigaspaces.newman.beans; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by Barak Bar Orion - * 5/14/15. - */ -public class BuildStatus { - - private int totalTests; - private int passedTests; - private int failedTests; - private int failed3TimesTests = 0; - private int runningTests; - private int numOfTestRetries = 0; - - private int totalJobs; - private int pendingJobs; - private int runningJobs; - private int doneJobs; - private int brokenJobs; - - private List suitesNames; - private List suitesIds; - - public BuildStatus(){ - this.suitesNames = new ArrayList<>(); - this.suitesIds = new ArrayList<>(); - } - - public int getTotalTests() { - return totalTests; - } - - public void setTotalTests(int totalTests) { - this.totalTests = totalTests; - } - - public int getPassedTests() { - return passedTests; - } - - public void setPassedTests(int passedTests) { - this.passedTests = passedTests; - } - - public int getFailedTests() { - return failedTests; - } - - public void setFailedTests(int failedTests) { - this.failedTests = failedTests; - } - - public int getFailed3TimesTests() { - return failed3TimesTests; - } - - public void setFailed3TimesTests(int failed3TimesTests) { this.failed3TimesTests = failed3TimesTests; } - - public int getRunningTests() { - return runningTests; - } - - public void setRunningTests(int runningTests) { - this.runningTests = runningTests; - } - - public int getNumOfTestRetries() { - return numOfTestRetries; - } - - public void setNumOfTestRetries(int numOfTestRetries) { - this.numOfTestRetries = numOfTestRetries; - } - - public int getTotalJobs() { - return totalJobs; - } - - public void setTotalJobs(int totalJobs) { - this.totalJobs = totalJobs; - } - - public int getPendingJobs() { - return pendingJobs; - } - - public void setPendingJobs(int pendingJobs) { - this.pendingJobs = pendingJobs; - } - - public int getRunningJobs() { - return runningJobs; - } - - public void setRunningJobs(int runningJobs) { - this.runningJobs = runningJobs; - } - - public int getDoneJobs() { - return doneJobs; - } - - public void setDoneJobs(int doneJobs) { - this.doneJobs = doneJobs; - } - - public List getSuitesNames() { - return suitesNames; - } - - public void setSuitesNames(List suitesNames) { - this.suitesNames = suitesNames; - } - - public List getSuitesIds() { - return suitesIds; - } - - public void setSuitesIds(List suitesIds) { - this.suitesIds = suitesIds; - } - - public int getBrokenJobs() { - return brokenJobs; - } - - public void setBrokenJobs(int brokenJobs) { - this.brokenJobs = brokenJobs; - } - - @Override - public String toString() { - return "BuildStatus{" + - "totalTests=" + totalTests + - ", passedTests=" + passedTests + - ", failedTests=" + failedTests + - ", failed3TimesTests=" + failed3TimesTests + - ", runningTests=" + runningTests + - ", numOfTestRetries=" + numOfTestRetries + - ", totalJobs=" + totalJobs + - ", pendingJobs=" + pendingJobs + - ", runningJobs=" + runningJobs + - ", doneJobs=" + doneJobs + - ", brokenJobs=" + brokenJobs + - ", suitesNames=" + suitesNames + - ", suitesIds=" + suitesIds + - '}'; - } -} \ No newline at end of file diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildView.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildView.java index 9c52b25a..df02359d 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildView.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildView.java @@ -1,6 +1,7 @@ package com.gigaspaces.newman.beans; -import com.gigaspaces.newman.utils.ToStringBuilder; +import com.gigaspaces.newman.projections.PBuildThin; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.Set; @@ -14,7 +15,7 @@ public class BuildView { private String branch; private Set tags; - public BuildView( Build build ) { + public BuildView( PBuildThin build ) { this.id = build.getId(); this.name = build.getName(); this.branch = build.getBranch(); @@ -47,7 +48,7 @@ public void setName(String name) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("id", id) .append("name", name) .toString(); diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildWithJobs.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildWithJobs.java deleted file mode 100644 index 78729b32..00000000 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildWithJobs.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.gigaspaces.newman.beans; - -import java.util.List; - -/** - * Created by Barak Bar Orion - * 5/11/15. - */ -public class BuildWithJobs { - private Build build; - private List jobs; - - public BuildWithJobs() { - } - - public BuildWithJobs( Build build, List jobs ) { - this.build = build; - this.jobs = jobs; - } - - public List getJobs() { - return jobs; - } - - public void setJobs(List jobs) { - this.jobs = jobs; - } - - public Build getBuild() { - return build; - } - - public void setBuild(Build build) { - this.build = build; - } - - @Override - public String toString() { - return "BuildWithJobs{" + - "jobs=" + jobs + - ", build=" + build + - '}'; - } -} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/CapabilitiesAndRequirements.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/CapabilitiesAndRequirements.java index 21e32eee..95890639 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/CapabilitiesAndRequirements.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/CapabilitiesAndRequirements.java @@ -1,5 +1,7 @@ package com.gigaspaces.newman.beans; +import com.gigaspaces.newman.entities.Job; + import java.util.*; import java.util.stream.Collectors; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/DashboardData.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/DashboardData.java index 348dc703..b50d9297 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/DashboardData.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/DashboardData.java @@ -1,5 +1,9 @@ package com.gigaspaces.newman.beans; +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.entities.FutureJob; +import com.gigaspaces.newman.projections.PJobForDashboard; + import java.util.List; import java.util.Map; @@ -13,12 +17,12 @@ public class DashboardData { private List historyBuilds; private List futureJobs; //key is build id - private Map> activeJobs; + private Map> activeJobs; public DashboardData() { } - public DashboardData(List activeBuilds, List pendingBuilds, List historyBuilds, Map> activeJobs, List futureJobs) { + public DashboardData(List activeBuilds, List pendingBuilds, List historyBuilds, Map> activeJobs, List futureJobs) { this.activeBuilds = activeBuilds; this.pendingBuilds = pendingBuilds; this.historyBuilds = historyBuilds; @@ -50,11 +54,11 @@ public void setHistoryBuilds(List historyBuilds) { this.historyBuilds = historyBuilds; } - public Map> getActiveJobs() { + public Map> getActiveJobs() { return activeJobs; } - public void setActiveJobs(Map> activeJobs) { + public void setActiveJobs(Map> activeJobs) { this.activeJobs = activeJobs; } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/EditJobRequest.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/EditJobRequest.java index d6b0b474..bedc4348 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/EditJobRequest.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/EditJobRequest.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans; -import com.gigaspaces.newman.utils.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.Set; @@ -26,7 +26,7 @@ public void setAgentGroups(Set agentGroups) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("agentGroups", agentGroups) .append("priority", priority) .toString(); diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/FutureJobsRequest.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/FutureJobsRequest.java index 384ca978..642d880f 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/FutureJobsRequest.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/FutureJobsRequest.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans; -import com.gigaspaces.newman.utils.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.List; import java.util.Set; @@ -67,7 +67,7 @@ public void setAuthor(String author) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("buildId", buildId) .append("suites", suites) .append("configId",configId) diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/JavaVersion.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/JavaVersion.java index e8449733..66bd1aea 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/JavaVersion.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/JavaVersion.java @@ -6,7 +6,8 @@ public enum JavaVersion { ORACLE_9_0_4("oracle_9_0_4"), OPENJDK_8("openjdk_8"), OPENJDK_11_0_1("openjdk_11_0_1"), - OPENJDK_17_0_1("openjdk_17_0_1"); + OPENJDK_17_0_1("openjdk_17_0_1"), + OPENJDK_21_0_1("openjdk_21_0_1"); private String name; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/Job.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/Job.java deleted file mode 100644 index e440d2bf..00000000 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/Job.java +++ /dev/null @@ -1,261 +0,0 @@ -package com.gigaspaces.newman.beans; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.mongodb.morphia.annotations.Embedded; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; -import org.mongodb.morphia.annotations.Indexed; -import org.mongodb.morphia.annotations.Transient; - -import java.net.URI; -import java.util.Collections; -import java.util.Date; -import java.util.Map; -import java.util.Set; - -/** - * Created by Barak Bar Orion - * 4/13/15. - */ -@Entity -@JsonIgnoreProperties(ignoreUnknown = true) -public class Job { - @Id - private String id; - @Embedded(concreteClass = Build.class) - private Build build; - - @Embedded(concreteClass = Suite.class) //Why isn't this @Reference?, it should be reference! - private Suite suite; - - private Set agentGroups; - private int priority; - - @Indexed - private Date submitTime; - private Date startTime; - private Date endTime; - private URI testURI; - private String submittedBy; - private State state; - private int totalTests; - private int passedTests; - private int failedTests; - private int failed3TimesTests = 0; - private int runningTests; - private int numOfTestRetries = 0; - // first agent start prepare on job - private Date startPrepareTime; - // last time job seen as zombie - private Date lastTimeZombie; - @Embedded - private Set preparingAgents = Collections.emptySet(); - @Transient - private Set agents = Collections.emptySet(); - @Embedded - private Map jobSetupLogs; - - @Embedded(concreteClass = JobConfig.class) - private JobConfig jobConfig; - - public Job() { - state = State.READY; - } - - public void setAgentGroups(Set agentGroups) { this.agentGroups = agentGroups; } - - public Set getAgentGroups() { return agentGroups; } - - public int getPriority() { return priority; } - - public void setPriority(int priority) { this.priority = priority; } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public Build getBuild() { - return build; - } - - public void setBuild(Build build) { - this.build = build; - } - - public Date getSubmitTime() { - return submitTime; - } - - public void setSubmitTime(Date submitTime) { - this.submitTime = submitTime; - } - - public Date getStartTime() { - return startTime; - } - - public void setStartTime(Date startTime) { - this.startTime = startTime; - } - - public Date getEndTime() { - return endTime; - } - - public void setEndTime(Date endTime) { - this.endTime = endTime; - } - - public URI getTestURI() { - return testURI; - } - - public void setTestURI(URI testURI) { - this.testURI = testURI; - } - - public String getSubmittedBy() { - return submittedBy; - } - - public void setSubmittedBy(String submittedBy) { - this.submittedBy = submittedBy; - } - - public State getState() { - return state; - } - - public void setState(State state) { - this.state = state; - } - - public int getTotalTests() { - return totalTests; - } - - public void setTotalTests(int totalTests) { - this.totalTests = totalTests; - } - - public int getPassedTests() { - return passedTests; - } - - public void setPassedTests(int passedTests) { - this.passedTests = passedTests; - } - - public int getFailedTests() { - return failedTests; - } - - public void setFailedTests(int failedTests) { - this.failedTests = failedTests; - } - - public int getFailed3TimesTests() { return failed3TimesTests;} - - public void setFailed3TimesTests(int failed3TimesTests) { this.failed3TimesTests = failed3TimesTests; } - - public int getRunningTests() { - return runningTests; - } - - public void setRunningTests(int runningTests) { - this.runningTests = runningTests; - } - - public int getNumOfTestRetries() { - return numOfTestRetries; - } - - public void setNumOfTestRetries(int numOfTestRetries) { - this.numOfTestRetries = numOfTestRetries; - } - - public Suite getSuite() { - return suite; - } - - public void setSuite(Suite suite) { - this.suite = suite; - } - - public Set getPreparingAgents() { - return preparingAgents; - } - - public void setPreparingAgents(Set preparingAgents) { - this.preparingAgents = preparingAgents; - } - - public Date getStartPrepareTime() { - return startPrepareTime; - } - - public void setStartPrepareTime(Date startPrepareTime) { - this.startPrepareTime = startPrepareTime; - } - - public Date getLastTimeZombie() { - return lastTimeZombie; - } - - public void setLastTimeZombie(Date lastTimeZombie) { - this.lastTimeZombie = lastTimeZombie; - } - - public Map getJobSetupLogs() { - return jobSetupLogs; - } - - public void setJobSetupLogs(Map jobSetupLogs) { - this.jobSetupLogs = jobSetupLogs; - } - - public JobConfig getJobConfig() { - return jobConfig; - } - - public void setJobConfig(JobConfig jobConfig) { - this.jobConfig = jobConfig; - } - - public Set getAgents() { return agents; } - - public void setAgents(Set agents) { this.agents = agents; } - - @Override - public String toString() { - return "Job{" + - "id='" + id + '\'' + - ", build=" + build + - ", suite=" + suite + - ", submitTime=" + submitTime + - ", startTime=" + startTime + - ", endTime=" + endTime + - ", testURI=" + testURI + - ", submittedBy='" + submittedBy + '\'' + - ", state=" + state + - ", totalTests=" + totalTests + - ", passedTests=" + passedTests + - ", failedTests=" + failedTests + - ", failed3TimesTests=" + failed3TimesTests + - ", runningTests=" + runningTests + - ", numOfTestRetries=" + numOfTestRetries + - ", startPrepareTime=" + startPrepareTime + - ", lastTimeZombie=" + lastTimeZombie + - ", preparingAgents=" + preparingAgents + - ", agents=" + agents + - ", agentGroups=" + agentGroups + - ", priority=" + priority + - ", jobSetupLogs=" + jobSetupLogs + - ", jobConfig=" + jobConfig + - '}'; - } -} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/JobRequest.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/JobRequest.java index 3fafda5c..a6e2a846 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/JobRequest.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/JobRequest.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans; -import com.gigaspaces.newman.utils.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.Set; @@ -54,7 +54,7 @@ public void setConfigId(String configId) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("buildId", buildId) .append("suiteId", suiteId) .append("configId", configId) diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/JobView.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/JobView.java index 29aeb2a0..e722e13e 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/JobView.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/JobView.java @@ -1,9 +1,12 @@ package com.gigaspaces.newman.beans; -import com.gigaspaces.newman.utils.ToStringBuilder; +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.entities.Job; +import com.gigaspaces.newman.entities.JobConfig; +import com.gigaspaces.newman.entities.Suite; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.net.URI; -import java.util.Collections; import java.util.Date; import java.util.Set; @@ -37,7 +40,7 @@ public class JobView { private int failed3TimesTests; private int runningTests; private int numOfTestRetries; - private Set preparingAgents = Collections.emptySet(); + private Set preparingAgents; public JobView( Job job ) { @@ -255,7 +258,7 @@ public void setJobConfigName(String jobConfigName) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("id", id) .append("submitTime", submitTime) .append("startTime", startTime) diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/SuiteView.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/SuiteView.java index bcb9c3fc..ba5bce8c 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/SuiteView.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/SuiteView.java @@ -1,6 +1,8 @@ package com.gigaspaces.newman.beans; -import com.gigaspaces.newman.utils.ToStringBuilder; +import com.gigaspaces.newman.entities.Suite; +import com.gigaspaces.newman.projections.PSuiteThin; +import org.apache.commons.lang3.builder.ToStringBuilder; /** * @author evgenyf @@ -12,6 +14,12 @@ public class SuiteView { private String name; private String customVariables; + public SuiteView( PSuiteThin suite ) { + id = suite.getId(); + name = suite.getName(); + customVariables = suite.getCustomVariables(); + } + public SuiteView( Suite suite ) { id = suite.getId(); name = suite.getName(); @@ -44,7 +52,7 @@ public void setCustomVariables(String customVariables) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("id", id) .append("name", name) .append("custom environment variables", customVariables) diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/SuiteWithJobs.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/SuiteWithJobs.java index c68ca4fc..95359be1 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/SuiteWithJobs.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/SuiteWithJobs.java @@ -1,9 +1,9 @@ package com.gigaspaces.newman.beans; -import org.mongodb.morphia.annotations.Id; +import com.gigaspaces.newman.entities.Job; +import com.gigaspaces.newman.projections.PSuiteThin; import java.util.ArrayList; -import java.util.Collections; import java.util.List; /** @@ -12,7 +12,6 @@ */ public class SuiteWithJobs { - @Id private String id; private SuiteView suite; @@ -24,18 +23,18 @@ public class SuiteWithJobs { public SuiteWithJobs() { } - public SuiteWithJobs( Suite suite ) { - this(suite, Collections.emptyList()); + public SuiteWithJobs(PSuiteThin suite, List jobsList) { + prepareJobViews(jobsList); + setId(suite.getId()); + setName( suite.getName() ); + this.suite = new SuiteView( suite ); } - public SuiteWithJobs(Suite suite, List jobsList) { + private void prepareJobViews(List jobsList) { this.jobs = new ArrayList<>( jobsList.size() ); for( Job job : jobsList ){ jobs.add( new JobView( job ) ); } - setId(suite.getId()); - setName( suite.getName() ); - this.suite = new SuiteView( suite ); } public String getId() { diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/TestView.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/TestView.java index e222ab2c..17592e7f 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/TestView.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/TestView.java @@ -1,6 +1,10 @@ package com.gigaspaces.newman.beans; -import com.gigaspaces.newman.utils.ToStringBuilder; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gigaspaces.newman.entities.Test; +import com.gigaspaces.newman.projections.PTest; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.Date; import java.util.List; @@ -9,6 +13,8 @@ * @author evgenyf * 13.12.2015 */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) public class TestView { private String id; @@ -25,6 +31,7 @@ public class TestView { private Date endTime; private int progressPercent; private int runNumber; + private boolean hasLogs; public TestView( Test test ) { @@ -43,6 +50,27 @@ public TestView( Test test ) { progressPercent = test.getProgressPercent(); runNumber = test.getRunNumber(); computeProgressPercent(test.getStatus()); + hasLogs = test.getLogs().getTestLogs().size() > 0; + } + + public TestView( PTest test ) { + + id = test.getId(); + jobId = test.getJobId(); + name = test.getName(); + arguments = test.getArguments(); + status = Test.Status.valueOf(test.getStatus()); + errorMessage = test.getErrorMessage(); + testScore = test.getTestScore(); + historyStats = test.getHistoryStats(); + assignedAgent = test.getAssignedAgent(); + agentGroup = test.getAgentGroup(); + startTime = test.getStartTime(); + endTime = test.getEndTime(); + progressPercent = test.getProgressPercent(); + runNumber = test.getRunNumber(); + computeProgressPercent(status); + hasLogs = test.getLogs().getTestLogs().size() > 0; } public String getId() { @@ -172,9 +200,17 @@ public void setRunNumber(int runNumber) { this.runNumber = runNumber; } + public boolean isHasLogs() { + return hasLogs; + } + + public void setHasLogs(boolean hasLogs) { + this.hasLogs = hasLogs; + } + @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName(), true) + return new ToStringBuilder(this) .append("id", id) .append("jobId", jobId) .append("name", name) @@ -185,6 +221,7 @@ public String toString() { .append("agentGroup", agentGroup) .append("startTime", startTime) .append("endTime", endTime) + .append("hasLogs", hasLogs) .toString(); } } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/AndCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/AndCriteria.java index 8042c673..8118aec4 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/AndCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/AndCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria; -import com.gigaspaces.newman.utils.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.Arrays; import java.util.List; @@ -29,7 +29,7 @@ public void setCriterias(List criterias) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("criterias", criterias) .toString(); } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/ArgumentsCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/ArgumentsCriteria.java index 16d6f526..bb0ac6c8 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/ArgumentsCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/ArgumentsCriteria.java @@ -1,7 +1,8 @@ package com.gigaspaces.newman.beans.criteria; -import com.gigaspaces.newman.beans.Test; -import com.gigaspaces.newman.utils.ToStringBuilder; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.ArrayList; import java.util.List; @@ -16,6 +17,8 @@ * will find a match! * for equality use {@link TestCriteria#createCriteriaByTestArgs(String...)} */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) public class ArgumentsCriteria implements Criteria { private String arg; @@ -61,7 +64,7 @@ public static Criteria containsEitherCriteria(String ... testArgs) { @Override public String toString(){ - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("arg", arg) .toString(); } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/Criteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/Criteria.java index dc753c02..95628536 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/Criteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/Criteria.java @@ -8,9 +8,9 @@ * 5/4/15. */ @JsonTypeInfo( - use = JsonTypeInfo.Id.NAME, + use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, - property = "type") + property = "className") @JsonSubTypes({ @JsonSubTypes.Type(value = AndCriteria.class), @JsonSubTypes.Type(value = OrCriteria.class), diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/CriteriaEvaluator.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/CriteriaEvaluator.java index 26c653b1..8312478f 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/CriteriaEvaluator.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/CriteriaEvaluator.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; import com.gigaspaces.newman.beans.criteria.compiled.*; import java.util.List; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/NotCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/NotCriteria.java index e851dd71..4f441fda 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/NotCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/NotCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria; -import com.gigaspaces.newman.utils.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; /** * A negation of a criteria @@ -26,7 +26,7 @@ public void setCriteria(Criteria criteria) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("criteria", criteria) .toString(); } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/OrCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/OrCriteria.java index 1f66f8f8..e7bd4c5f 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/OrCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/OrCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria; -import com.gigaspaces.newman.utils.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.Arrays; import java.util.List; @@ -29,7 +29,7 @@ public void setCriterias(List criterias) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("criterias", criterias) .toString(); } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/PatternCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/PatternCriteria.java index f1ea6184..f1a7c896 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/PatternCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/PatternCriteria.java @@ -1,12 +1,16 @@ package com.gigaspaces.newman.beans.criteria; -import com.gigaspaces.newman.utils.ToStringBuilder; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.regex.Pattern; /** * Regular expression matching criteria */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) public class PatternCriteria implements Criteria { private String regex; @@ -51,7 +55,7 @@ public static PatternCriteria containsCriteria(String string) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("regex", regex) .toString(); } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/PropertyCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/PropertyCriteria.java index bfb020d5..81b1a907 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/PropertyCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/PropertyCriteria.java @@ -1,7 +1,7 @@ package com.gigaspaces.newman.beans.criteria; import com.gigaspaces.newman.utils.StringUtils; -import com.gigaspaces.newman.utils.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; /** * Key-Value matching criteria @@ -37,7 +37,7 @@ public void setValue(String value) { @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("key", key) .append("value", value) .toString(); diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/SuiteCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/SuiteCriteria.java index c83b68c5..35cd60e1 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/SuiteCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/SuiteCriteria.java @@ -1,7 +1,12 @@ package com.gigaspaces.newman.beans.criteria; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; + import java.util.Collections; import java.util.List; +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) public class SuiteCriteria implements Criteria { private String suiteType; private List include; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/TestCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/TestCriteria.java index cc699d97..9dab5339 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/TestCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/TestCriteria.java @@ -1,7 +1,9 @@ package com.gigaspaces.newman.beans.criteria; -import com.gigaspaces.newman.beans.Test; -import com.gigaspaces.newman.utils.ToStringBuilder; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gigaspaces.newman.entities.Test; +import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.Arrays; import java.util.List; @@ -9,6 +11,8 @@ /** * A test criteria for matching (test name, arguments, type). Only non-null field are matched. */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) public class TestCriteria implements Criteria { private Test test; @@ -71,7 +75,7 @@ public static TestCriteria createUnifiedCriteria(TestCriteria... testCriterias) @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("test", test) .toString(); } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/AndCompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/AndCompiledCriteria.java index 1af0a1cd..855bc9ef 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/AndCompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/AndCompiledCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria.compiled; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; import java.util.List; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/ArgumentCompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/ArgumentCompiledCriteria.java index 5dfb33fc..e13af801 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/ArgumentCompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/ArgumentCompiledCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria.compiled; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; import java.util.List; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/CompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/CompiledCriteria.java index b4c63eeb..8a4b958d 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/CompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/CompiledCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria.compiled; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; /** * Created by moran diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/NotCompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/NotCompiledCriteria.java index f39f0a75..6dd3c8eb 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/NotCompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/NotCompiledCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria.compiled; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; /** * Created by moran diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/OrCompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/OrCompiledCriteria.java index c282c71f..21f4b83e 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/OrCompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/OrCompiledCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria.compiled; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; import java.util.List; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/PatternCompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/PatternCompiledCriteria.java index b9385c7c..4f4dccb0 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/PatternCompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/PatternCompiledCriteria.java @@ -2,7 +2,7 @@ -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; import java.util.regex.Pattern; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/PropertyCompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/PropertyCompiledCriteria.java index a8a219d9..029cf2ac 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/PropertyCompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/PropertyCompiledCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria.compiled; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; import java.util.Map; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/SuiteCompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/SuiteCompiledCriteria.java index 2cfe09e9..dea78e1e 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/SuiteCompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/SuiteCompiledCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria.compiled; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; import java.util.List; diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/TestCompiledCriteria.java b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/TestCompiledCriteria.java index ec95886b..35f8e862 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/TestCompiledCriteria.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/beans/criteria/compiled/TestCompiledCriteria.java @@ -1,6 +1,6 @@ package com.gigaspaces.newman.beans.criteria.compiled; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; public class TestCompiledCriteria implements CompiledCriteria { diff --git a/newman-common/src/main/java/com/gigaspaces/newman/converters/MapToJsonConverter.java b/newman-common/src/main/java/com/gigaspaces/newman/converters/MapToJsonConverter.java new file mode 100644 index 00000000..e791d374 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/converters/MapToJsonConverter.java @@ -0,0 +1,32 @@ +package com.gigaspaces.newman.converters; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import javax.persistence.*; + +import java.io.IOException; +import java.util.Map; + +@Converter +public class MapToJsonConverter implements AttributeConverter, String> { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public String convertToDatabaseColumn(Map attribute) { + try { + return attribute == null ? null : objectMapper.writeValueAsString(attribute); + } catch (JsonProcessingException e) { + throw new IllegalArgumentException("Error converting Map to JSON", e); + } + } + + @Override + public Map convertToEntityAttribute(String dbData) { + try { + return dbData == null || dbData.isEmpty() ? null : objectMapper.readValue(dbData, Map.class); + } catch (IOException e) { + throw new IllegalArgumentException("Error converting JSON to Map", e); + } + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/converters/UriCollectionConverter.java b/newman-common/src/main/java/com/gigaspaces/newman/converters/UriCollectionConverter.java new file mode 100644 index 00000000..db0d09fd --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/converters/UriCollectionConverter.java @@ -0,0 +1,42 @@ +package com.gigaspaces.newman.converters; + +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; +import java.net.URI; +import java.util.Arrays; +import java.util.Collection; +import java.util.stream.Collectors; + +@Converter +public class UriCollectionConverter implements AttributeConverter, String> { + + @Override + public String convertToDatabaseColumn(Collection uris) { + if (uris == null) { + return null; + } + // Convert Collection to a comma-separated string + return uris.stream() + .map(URI::toString) // Convert each URI to string + .collect(Collectors.joining(",")); + } + + @Override + public Collection convertToEntityAttribute(String dbData) { + if (dbData == null || dbData.isEmpty()) { + return null; + } + // Remove the curly braces { and } + if (dbData.startsWith("{") && dbData.endsWith("}")) { + dbData = dbData.substring(1, dbData.length() - 1); + } + + if (dbData.startsWith("\"")) { + dbData = dbData.replaceAll("\"", ""); + } + // Convert comma-separated string back to Collection + return Arrays.stream(dbData.split(",")) + .map(URI::create) // Convert each string back to URI + .collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/newman-common/src/main/java/com/gigaspaces/newman/converters/UriToStringConverter.java b/newman-common/src/main/java/com/gigaspaces/newman/converters/UriToStringConverter.java new file mode 100644 index 00000000..e7cc55b2 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/converters/UriToStringConverter.java @@ -0,0 +1,20 @@ +package com.gigaspaces.newman.converters; + +import javax.persistence.*; + +import java.net.URI; + +@Converter(autoApply = true) +public class UriToStringConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(URI attribute) { + return attribute != null ? attribute.toString() : null; + } + + @Override + public URI convertToEntityAttribute(String dbData) { + return dbData != null ? URI.create(dbData) : null; + } +} + diff --git a/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildDTO.java b/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildDTO.java new file mode 100644 index 00000000..b4c47987 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildDTO.java @@ -0,0 +1,151 @@ +package com.gigaspaces.newman.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.projections.PBuildForView; +import com.gigaspaces.newman.utils.ConvertUtils; + +import java.net.URI; +import java.util.*; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class BuildDTO { + + private String id; + private String name; + private String branch; + private Date buildTime; + + private Map shas; + + private Collection resources; + private Collection testsMetadata; + private Set tags; + private BuildStatusDTO buildStatus; + + public BuildDTO() { + } + + public BuildDTO(PBuildForView projection) { + this.id = projection.getId(); + this.name = projection.getName(); + this.branch = projection.getBranch(); + this.buildTime = projection.getBuildTime(); + this.tags = projection.getTags(); + this.buildStatus = new BuildStatusDTO( + projection.getBuildStatus().getPassedTests(), + projection.getBuildStatus().getFailedTests(), + projection.getBuildStatus().getFailed3TimesTests() ); + } + + // Constructor + public BuildDTO(String id, String name, String branch, Date buildTime, + Map shas, Collection resources, + Collection testsMetadata, Set tags, + BuildStatusDTO buildStatus) { + this.id = id; + this.name = name; + this.branch = branch; + this.buildTime = buildTime; + this.shas = shas; + this.resources = ConvertUtils.unpackPersistentBag(resources); + this.testsMetadata = ConvertUtils.unpackPersistentBag(testsMetadata); + this.tags = tags; + this.buildStatus = buildStatus; + } + + // Getters and setters + + // Conversion method for Build entity to DTO + public static BuildDTO fromEntity(Build build) { + BuildStatusDTO buildStatusDTO = build.getBuildStatus() != null + ? BuildStatusDTO.fromEntity(build.getBuildStatus()) + : null; + + return new BuildDTO( + build.getId(), + build.getName(), + build.getBranch(), + build.getBuildTime(), + build.getShas(), + build.getResources(), + build.getTestsMetadata(), + build.getTags(), + buildStatusDTO + ); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getBranch() { + return branch; + } + + public void setBranch(String branch) { + this.branch = branch; + } + + public Date getBuildTime() { + return buildTime; + } + + public void setBuildTime(Date buildTime) { + this.buildTime = buildTime; + } + + public Map getShas() { + return shas; + } + + public void setShas(Map shas) { + this.shas = shas; + } + + public Set getTags() { + return tags; + } + + public void setTags(Set tags) { + this.tags = tags; + } + + public BuildStatusDTO getBuildStatus() { + return buildStatus; + } + + public void setBuildStatus(BuildStatusDTO buildStatus) { + this.buildStatus = buildStatus; + } + + public Collection getResources() { + return resources; + } + + public void setResources(Collection resources) { + this.resources = resources; + } + + public Collection getTestsMetadata() { + return testsMetadata; + } + + public void setTestsMetadata(Collection testsMetadata) { + this.testsMetadata = testsMetadata; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildStatusDTO.java b/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildStatusDTO.java new file mode 100644 index 00000000..9ec049b0 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildStatusDTO.java @@ -0,0 +1,181 @@ +package com.gigaspaces.newman.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gigaspaces.newman.entities.BuildStatus; + +import java.util.List; +import java.util.stream.Collectors; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class BuildStatusDTO { + + private String id; + private int totalTests; + private int passedTests; + private int failedTests; + private int failed3TimesTests; + private int runningTests; + private int numOfTestRetries; + + private int totalJobs; + private int pendingJobs; + private int runningJobs; + private int doneJobs; + private int brokenJobs; + + private List suites; + + public BuildStatusDTO(int passedTests, int failedTests, int failed3TimesTests) { + this.passedTests = passedTests; + this.failedTests = failedTests; + this.failed3TimesTests = failed3TimesTests; + } + + // Constructor + public BuildStatusDTO(String id, int totalTests, int passedTests, int failedTests, + int failed3TimesTests, int runningTests, int numOfTestRetries, + int totalJobs, int pendingJobs, int runningJobs, int doneJobs, + int brokenJobs, List suites) { + this.id = id; + this.totalTests = totalTests; + this.passedTests = passedTests; + this.failedTests = failedTests; + this.failed3TimesTests = failed3TimesTests; + this.runningTests = runningTests; + this.numOfTestRetries = numOfTestRetries; + this.totalJobs = totalJobs; + this.pendingJobs = pendingJobs; + this.runningJobs = runningJobs; + this.doneJobs = doneJobs; + this.brokenJobs = brokenJobs; + this.suites = suites; + } + + public static BuildStatusDTO fromEntity(BuildStatus buildStatus) { + List suitesDTO = buildStatus.getSuites().stream() + .map(BuildStatusSuiteDTO::fromEntity) // Convert each BuildStatusSuite to BuildStatusSuiteDTO + .collect(Collectors.toList()); + + return new BuildStatusDTO( + buildStatus.getId(), + buildStatus.getTotalTests(), + buildStatus.getPassedTests(), + buildStatus.getFailedTests(), + buildStatus.getFailed3TimesTests(), + buildStatus.getRunningTests(), + buildStatus.getNumOfTestRetries(), + buildStatus.getTotalJobs(), + buildStatus.getPendingJobs(), + buildStatus.getRunningJobs(), + buildStatus.getDoneJobs(), + buildStatus.getBrokenJobs(), + suitesDTO + ); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getTotalTests() { + return totalTests; + } + + public void setTotalTests(int totalTests) { + this.totalTests = totalTests; + } + + public int getPassedTests() { + return passedTests; + } + + public void setPassedTests(int passedTests) { + this.passedTests = passedTests; + } + + public int getFailedTests() { + return failedTests; + } + + public void setFailedTests(int failedTests) { + this.failedTests = failedTests; + } + + public int getFailed3TimesTests() { + return failed3TimesTests; + } + + public void setFailed3TimesTests(int failed3TimesTests) { + this.failed3TimesTests = failed3TimesTests; + } + + public int getRunningTests() { + return runningTests; + } + + public void setRunningTests(int runningTests) { + this.runningTests = runningTests; + } + + public int getNumOfTestRetries() { + return numOfTestRetries; + } + + public void setNumOfTestRetries(int numOfTestRetries) { + this.numOfTestRetries = numOfTestRetries; + } + + public int getTotalJobs() { + return totalJobs; + } + + public void setTotalJobs(int totalJobs) { + this.totalJobs = totalJobs; + } + + public int getPendingJobs() { + return pendingJobs; + } + + public void setPendingJobs(int pendingJobs) { + this.pendingJobs = pendingJobs; + } + + public int getRunningJobs() { + return runningJobs; + } + + public void setRunningJobs(int runningJobs) { + this.runningJobs = runningJobs; + } + + public int getDoneJobs() { + return doneJobs; + } + + public void setDoneJobs(int doneJobs) { + this.doneJobs = doneJobs; + } + + public int getBrokenJobs() { + return brokenJobs; + } + + public void setBrokenJobs(int brokenJobs) { + this.brokenJobs = brokenJobs; + } + + public List getSuites() { + return suites; + } + + public void setSuites(List suites) { + this.suites = suites; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildStatusSuiteDTO.java b/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildStatusSuiteDTO.java new file mode 100644 index 00000000..18cecdff --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildStatusSuiteDTO.java @@ -0,0 +1,55 @@ +package com.gigaspaces.newman.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gigaspaces.newman.entities.BuildStatusSuite; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class BuildStatusSuiteDTO { + + private String id; + private String suiteId; + private String suiteName; + + // Constructor + public BuildStatusSuiteDTO(String id, String suiteId, String suiteName) { + this.id = id; + this.suiteId = suiteId; + this.suiteName = suiteName; + } + + // Conversion method to convert BuildStatusSuite entity to BuildStatusSuiteDTO + public static BuildStatusSuiteDTO fromEntity(BuildStatusSuite buildStatusSuite) { + return new BuildStatusSuiteDTO( + buildStatusSuite.getId(), + buildStatusSuite.getSuiteId(), + buildStatusSuite.getSuiteName() + ); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getSuiteId() { + return suiteId; + } + + public void setSuiteId(String suiteId) { + this.suiteId = suiteId; + } + + public String getSuiteName() { + return suiteName; + } + + public void setSuiteName(String suiteName) { + this.suiteName = suiteName; + } +} + diff --git a/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildsComparisonDTO.java b/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildsComparisonDTO.java new file mode 100644 index 00000000..d48cb41f --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/dto/BuildsComparisonDTO.java @@ -0,0 +1,169 @@ +package com.gigaspaces.newman.dto; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.util.HashMap; +import java.util.Map; + +/** + * Created by Barak Bar Orion + * 5/11/15. + */ +public class BuildsComparisonDTO { + private String[] buildLeftDetails; + private String[] buildRightDetails; + private Map buildResults; + + public BuildsComparisonDTO() { + buildResults = new HashMap<>(); + } + + public BuildsComparisonDTO(String[] buildLeftDetails, String[] buildRightDetails) { + this(); + this.buildLeftDetails = buildLeftDetails; + this.buildRightDetails = buildRightDetails; + } + + public String[] getBuildLeftDetails() { + return buildLeftDetails; + } + + public void setBuildLeftDetails(String[] buildLeftDetails) { + this.buildLeftDetails = buildLeftDetails; + } + + public String[] getBuildRightDetails() { + return buildRightDetails; + } + + public void setBuildRightDetails(String[] buildRightDetails) { + this.buildRightDetails = buildRightDetails; + } + + public Map getBuildResults() { + return buildResults; + } + + public void setBuildResults(Map buildResults) { + this.buildResults = buildResults; + } + + public void addSuiteLeft(String suiteName, String jobId, int total, int passed, int failed, int failed3) { + getBuildResults().compute(suiteName, (key, value) -> { + JobStatsDTO jobStats = new JobStatsDTO(jobId, total, passed, failed, failed3); + if (value == null) { + return new ResultsLeftRightDTO().setLeft(jobStats); + } else { + return value.setLeft(jobStats); + } + }); + } + + public void addSuiteRight(String suiteName, String jobId, int total, int passed, int failed, int failed3) { + getBuildResults().compute(suiteName, (key, value) -> { + JobStatsDTO jobStats = new JobStatsDTO(jobId, total, passed, failed, failed3); + if (value == null) { + return new ResultsLeftRightDTO().setRight(jobStats); + } else { + return value.setRight(jobStats); + } + }); + } + + private static class JobStatsDTO { + + private String jobId; + private int totalTests; + private int passedTests; + private int failedTests; + private int failed3TimesTests; + + public JobStatsDTO() { + } + + public JobStatsDTO(String jobId, int totalTests, int passedTests, int failedTests, int failed3TimesTests) { + this.jobId = jobId; + this.totalTests = totalTests; + this.passedTests = passedTests; + this.failedTests = failedTests; + this.failed3TimesTests = failed3TimesTests; + } + + public String getJobId() { + return jobId; + } + + public void setJobId(String jobId) { + this.jobId = jobId; + } + + public int getTotalTests() { + return totalTests; + } + + public void setTotalTests(int totalTests) { + this.totalTests = totalTests; + } + + public int getPassedTests() { + return passedTests; + } + + public void setPassedTests(int passedTests) { + this.passedTests = passedTests; + } + + public int getFailedTests() { + return failedTests; + } + + public void setFailedTests(int failedTests) { + this.failedTests = failedTests; + } + + public int getFailed3TimesTests() { + return failed3TimesTests; + } + + public void setFailed3TimesTests(int failed3TimesTests) { + this.failed3TimesTests = failed3TimesTests; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("jobId", jobId) + .append("totalTests", totalTests) + .append("passedTests", passedTests) + .append("failedTests", failedTests) + .append("failed3TimesTests", failed3TimesTests) + .toString(); + } + } + + private static class ResultsLeftRightDTO { + JobStatsDTO left; + JobStatsDTO right; + + public ResultsLeftRightDTO() { + } + + public JobStatsDTO getLeft() { + return left; + } + + public ResultsLeftRightDTO setLeft(JobStatsDTO left) { + this.left = left; + return this; + } + + public JobStatsDTO getRight() { + return right; + } + + public ResultsLeftRightDTO setRight(JobStatsDTO right) { + this.right = right; + return this; + } + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/dto/PJobDTO.java b/newman-common/src/main/java/com/gigaspaces/newman/dto/PJobDTO.java new file mode 100644 index 00000000..8fda87f3 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/dto/PJobDTO.java @@ -0,0 +1,242 @@ +package com.gigaspaces.newman.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gigaspaces.newman.beans.State; +import com.gigaspaces.newman.projections.PJob; + +import java.net.URI; +import java.util.Date; +import java.util.Set; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class PJobDTO implements PJob { + private String id; + private PJobDTO.Build build; + private PJobDTO.Suite suite; + private PJobDTO.JobConfig jobConfig; + private Date submitTime; + private Date startTime; + private Date endTime; + private URI testURI; + private String submittedBy; + private State state; + private int totalTests; + private int passedTests; + private int failedTests; + private int failed3TimesTests; + private int runningTests; + private int numOfTestRetries; + private Set preparingAgents; + private Set agentGroups; + private int priority; + + @Override + public String getId() { return id; } + public PJobDTO setId(String id) { this.id = id; return this; } + + @Override + public PJob.Build getBuild() { return build; } + public PJobDTO setBuild(String id, String name, String branch) { + this.build = new Build(id, name, branch); return this; + } + + @Override + public PJob.Suite getSuite() { return suite; } + public PJobDTO setSuite(String id, String name) { + this.suite = new Suite(id,name); return this; + } + + @Override + public PJob.JobConfig getJobConfig() { return jobConfig; } + public PJobDTO setJobConfig(String id, String name) { + this.jobConfig = new JobConfig(id, name); return this; + } + + @Override + public Date getSubmitTime() { return submitTime; } + public PJobDTO setSubmitTime(Date submitTime) { this.submitTime = submitTime; return this; } + + @Override + public Date getStartTime() { return startTime; } + public PJobDTO setStartTime(Date startTime) { this.startTime = startTime; return this; } + + @Override + public Date getEndTime() { return endTime; } + public PJobDTO setEndTime(Date endTime) { this.endTime = endTime; return this; } + + @Override + public URI getTestURI() { return testURI; } + public PJobDTO setTestURI(URI testURI) { this.testURI = testURI; return this; } + + @Override + public String getSubmittedBy() { return submittedBy; } + public PJobDTO setSubmittedBy(String submittedBy) { this.submittedBy = submittedBy; return this; } + + @Override + public State getState() { return state; } + public PJobDTO setState(State state) { this.state = state; return this; } + + @Override + public int getTotalTests() { return totalTests; } + public PJobDTO setTotalTests(int totalTests) { this.totalTests = totalTests; return this; } + + @Override + public int getPassedTests() { return passedTests; } + public PJobDTO setPassedTests(int passedTests) { this.passedTests = passedTests; return this; } + + @Override + public int getFailedTests() { return failedTests; } + public PJobDTO setFailedTests(int failedTests) { this.failedTests = failedTests; return this; } + + @Override + public int getFailed3TimesTests() { return failed3TimesTests; } + public PJobDTO setFailed3TimesTests(int failed3TimesTests) { this.failed3TimesTests = failed3TimesTests; return this; } + + @Override + public int getRunningTests() { return runningTests; } + public PJobDTO setRunningTests(int runningTests) { this.runningTests = runningTests; return this; } + + @Override + public int getNumOfTestRetries() { return numOfTestRetries; } + public PJobDTO setNumOfTestRetries(int numOfTestRetries) { this.numOfTestRetries = numOfTestRetries; return this; } + + @Override + public Set getPreparingAgents() { return preparingAgents; } + public PJobDTO setPreparingAgents(Set preparingAgents) { this.preparingAgents = preparingAgents; return this; } + + @Override + public Set getAgentGroups() { return agentGroups; } + public PJobDTO setAgentGroups(Set agentGroups) { this.agentGroups = agentGroups; return this; } + + @Override + public int getPriority() { return priority; } + public PJobDTO setPriority(int priority) { this.priority = priority; return this; } + + public static PJobDTO fromEntity(com.gigaspaces.newman.entities.Job job) { + return new PJobDTO() + .setId(job.getId()) + .setBuild(job.getBuild().getId(), job.getBuild().getName(), job.getBuild().getBranch()) + .setSuite(job.getSuite().getId(), job.getSuite().getName()) + .setJobConfig(job.getJobConfig().getId(), job.getJobConfig().getName()) + .setSubmitTime(job.getSubmitTime()) + .setStartTime(job.getStartTime()) + .setEndTime(job.getEndTime()) + .setTestURI(job.getTestURI()) + .setSubmittedBy(job.getSubmittedBy()) + .setState(job.getState()) + .setTotalTests(job.getTotalTests()) + .setPassedTests(job.getPassedTests()) + .setFailedTests(job.getFailedTests()) + .setFailed3TimesTests(job.getFailed3TimesTests()) + .setRunningTests(job.getRunningTests()) + .setNumOfTestRetries(job.getNumOfTestRetries()) + .setPreparingAgents(job.getPreparingAgents()) + .setAgentGroups(job.getAgentGroups()) + .setPriority(job.getPriority()); + } + + public static class Build implements PJob.Build{ + private String id; + private String name; + private String branch; + + public Build() {} + + public Build(String id, String name, String branch) { + this.id = id; + this.name = name; + this.branch = branch; + } + + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String getBranch() { + return branch; + } + + public void setBranch(String branch) { + this.branch = branch; + } + } + + public static class Suite implements PJob.Suite { + private String id; + private String name; + + public Suite() {} + + public Suite(String id, String name) { + this.id = id; + this.name = name; + } + + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + + public static class JobConfig implements PJob.JobConfig { + private String id; + private String name; + + public JobConfig() {} + + public JobConfig(String id, String name) { + this.id = id; + this.name = name; + } + + @Override + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } + +} + diff --git a/newman-common/src/main/java/com/gigaspaces/newman/dto/PSuiteDTO.java b/newman-common/src/main/java/com/gigaspaces/newman/dto/PSuiteDTO.java new file mode 100644 index 00000000..fc9ad01a --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/dto/PSuiteDTO.java @@ -0,0 +1,40 @@ +package com.gigaspaces.newman.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gigaspaces.newman.entities.Suite; +import com.gigaspaces.newman.projections.PSuiteThin; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class PSuiteDTO implements PSuiteThin { + + private String id; + private String name; + private String customVariables; + + public PSuiteDTO(String id, String name, String customVariables) { + this.id = id; + this.name = name; + this.customVariables = customVariables; + } + + @Override + public String getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getCustomVariables() { + return customVariables; + } + + public static PSuiteDTO fromEntity(Suite suite) { + return new PSuiteDTO(suite.getId(), suite.getName(), suite.getCustomVariables()); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/dto/TestDTO.java b/newman-common/src/main/java/com/gigaspaces/newman/dto/TestDTO.java new file mode 100644 index 00000000..4762d756 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/dto/TestDTO.java @@ -0,0 +1,102 @@ +package com.gigaspaces.newman.dto; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.gigaspaces.newman.projections.PTest; + +import java.util.Date; +import java.util.List; + +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(JsonInclude.Include.NON_NULL) +public class TestDTO { + + private String id; + private String jobId; + private String name; + private List arguments; + private String status; + private String errorMessage; + private double testScore; + private String historyStats; + private String assignedAgent; + private String agentGroup; + private Date startTime; + private Date endTime; + private int progressPercent; + private int runNumber; + + public TestDTO(PTest projection) { + this.id = projection.getId(); + this.jobId = projection.getJobId(); + this.name = projection.getName(); + this.arguments = projection.getArguments(); + this.status = projection.getStatus(); + this.errorMessage = projection.getErrorMessage(); + this.testScore = projection.getTestScore(); + this.historyStats = projection.getHistoryStats(); + this.assignedAgent = projection.getAssignedAgent(); + this.agentGroup = projection.getAgentGroup(); + this.startTime = projection.getStartTime(); + this.endTime = projection.getEndTime(); + this.progressPercent = projection.getProgressPercent(); + this.runNumber = projection.getRunNumber(); + } + + // Getters and optionally setters (if needed) + public String getId() { + return id; + } + + public String getJobId() { + return jobId; + } + + public String getName() { + return name; + } + + public List getArguments() { + return arguments; + } + + public String getStatus() { + return status; + } + + public String getErrorMessage() { + return errorMessage; + } + + public double getTestScore() { + return testScore; + } + + public String getHistoryStats() { + return historyStats; + } + + public String getAssignedAgent() { + return assignedAgent; + } + + public String getAgentGroup() { + return agentGroup; + } + + public Date getStartTime() { + return startTime; + } + + public Date getEndTime() { + return endTime; + } + + public int getProgressPercent() { + return progressPercent; + } + + public int getRunNumber() { + return runNumber; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/Agent.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/Agent.java similarity index 70% rename from newman-common/src/main/java/com/gigaspaces/newman/beans/Agent.java rename to newman-common/src/main/java/com/gigaspaces/newman/entities/Agent.java index 4a939f69..95c69bfa 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/Agent.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/Agent.java @@ -1,41 +1,45 @@ -package com.gigaspaces.newman.beans; +package com.gigaspaces.newman.entities; -import com.gigaspaces.newman.utils.ToStringBuilder; -import org.mongodb.morphia.annotations.Embedded; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; -import org.mongodb.morphia.annotations.Indexed; -import org.mongodb.morphia.annotations.Transient; +import javax.persistence.*; +import org.apache.commons.lang3.builder.ToStringBuilder; -import java.util.Date; -import java.util.HashSet; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; /** * Created by Barak Bar Orion * 4/16/15. */ @Entity +@Table(name = "agent", uniqueConstraints = @UniqueConstraint(columnNames = "name")) public class Agent { + @Id private String id; - @Indexed(unique=true, dropDups=true) private String name; private String host; private String jobId; private Date lastTouchTime; - @Embedded - private Set currentTests; - private Agent.State state; private String hostAddress; private String pid; - @Embedded(concreteClass = java.util.TreeSet.class) - private Set capabilities; - @Transient - private Job job; private int setupRetries = 0; private String groupName; + private int workersCount; + + @Transient + private Job job; + + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable(name = "agent_current_tests", joinColumns = @JoinColumn(name = "agent_id")) + @Column(name = "current_test") + private Set currentTests; + + @Enumerated(EnumType.STRING) + private Agent.State state; + + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable(name = "agent_capabilities", joinColumns = @JoinColumn(name = "agent_id")) + @Column(name = "capability") + private Set capabilities; public Agent() { currentTests = new HashSet<>(); @@ -108,6 +112,9 @@ public void setCurrentTests(Set currentTests) { this.currentTests = currentTests; } + public void addCurrentTest(String testName) { + this.currentTests.add(testName); + } public String getGroupName() { return groupName; @@ -117,19 +124,38 @@ public void setGroupName(String groupName) { this.groupName = groupName; } + public int getWorkersCount() { + return workersCount; + } + + public void setWorkersCount(int workersCount) { + this.workersCount = workersCount; + } + + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("id", id) .append("name", name) - .append("state", state) .append("host", host) - .append("hostAddress", hostAddress) - .append("pid", pid) .append("jobId", jobId) - .append("currentTests", currentTests) .append("lastTouchTime", lastTouchTime) + .append("currentTests", currentTests) + .append("state", state) + .append("hostAddress", hostAddress) + .append("pid", pid) + .append("capabilities", capabilities) + .append("job", job) .append("setupRetries", setupRetries) + .append("groupName", groupName) + .append("workersCount", workersCount) .toString(); } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/entities/Build.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/Build.java new file mode 100644 index 00000000..307aee2f --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/Build.java @@ -0,0 +1,202 @@ +package com.gigaspaces.newman.entities; + +import com.gigaspaces.newman.converters.MapToJsonConverter; +import javax.persistence.*; + +import io.hypersistence.utils.hibernate.type.array.ListArrayType; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; + +import java.net.URI; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Created by Barak Bar Orion + * 4/13/15. + */ +@Entity +@Table(name = "build", indexes = { + @Index(name = "idx_suite_name", columnList = "name"), + @Index(name = "idx_suite_branch", columnList = "branch") +}) +@TypeDef(name = "list-array", typeClass = ListArrayType.class) +public class Build { + + @Id + private String id; + private String name; + private String branch; + private Date buildTime; + + @Convert(converter = MapToJsonConverter.class) + private Map shas; + + @Type(type = "list-array") + @Column(name = "resources", columnDefinition = "text[]") + private List resources; + + @Type(type = "list-array") + @Column(name = "tests_metadata", columnDefinition = "text[]") + private List testsMetadata; + + @ElementCollection(fetch = FetchType.EAGER) + @CollectionTable(name = "build_tags", joinColumns = @JoinColumn(name = "build_id")) + @Column(name = "tags") + private Set tags; + + @OneToOne(mappedBy = "build", cascade = CascadeType.ALL, orphanRemoval = true) + private BuildStatus buildStatus; + + public Build() { + this.shas = new HashMap<>(); + this.resources = new ArrayList<>(); + this.testsMetadata = new ArrayList<>(); + this.tags = new HashSet<>(); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Map getShas() { + return shas; + } + + public void setShas(Map shas) { + this.shas = shas; + } + + public String getBranch() { + return branch; + } + + public void setBranch(String branch) { + this.branch = branch; + } + + @Transient + public Collection getResources() { + if (this.resources == null) return Collections.emptyList(); + return this.resources.stream() + .map(URI::create) + .collect(Collectors.toList()); + } + + @Transient + public void setResources(Collection res) { + if (res == null) { + this.resources = new ArrayList<>(); + } else { + this.resources = res.stream() + .map(URI::toString) + .collect(Collectors.toList()); + } + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Date getBuildTime() { + return buildTime; + } + + public void setBuildTime(Date buildTime) { + this.buildTime = buildTime; + } + + @Transient + public Collection getTestsMetadata() { + if (this.testsMetadata == null) return new ArrayList<>(); + return this.testsMetadata.stream() + .map(URI::create) + .collect(Collectors.toList()); + } + + @Transient + public void setTestsMetadata(Collection uris) { + if (uris == null) { + this.testsMetadata = new ArrayList<>(); + } else { + this.testsMetadata = uris.stream() + .map(URI::toString) + .collect(Collectors.toList()); + } + } + + public BuildStatus getBuildStatus() { + return buildStatus; + } + + public void setBuildStatus(BuildStatus buildStatus) { + this.buildStatus = buildStatus; + } + + public Set getTags() { + return tags; + } + + public void setTags(Set tags) { + this.tags = tags; + } + + public void addTag(String tag){ + tags.add(tag); + } + + @PrePersist + public void prePersist() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + + if (buildStatus == null) { + buildStatus = new BuildStatus(this); + } + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("id", id) + .append("name", name) + .append("shas", shas) + .append("branch", branch) + .append("resources", resources) + .append("testsMetadata", testsMetadata) + .append("tags", tags) + .append("buildTime", buildTime) + .append("buildStatus", buildStatus) + .toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Build build = (Build) o; + return id.equals(build.id) && name.equals(build.name) && branch.equals(build.branch); + } + + @Override + public int hashCode() { + return Objects.hash(id, name, branch); + } + + public void excludeFields() { + this.shas = new HashMap<>(); + this.resources = new ArrayList<>(); + this.testsMetadata = new ArrayList<>(); + this.tags = new HashSet<>(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/entities/BuildStatus.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/BuildStatus.java new file mode 100644 index 00000000..019e109c --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/BuildStatus.java @@ -0,0 +1,285 @@ +package com.gigaspaces.newman.entities; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.gigaspaces.newman.dto.BuildStatusDTO; +import com.gigaspaces.newman.dto.BuildStatusSuiteDTO; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.hibernate.annotations.Fetch; +import org.hibernate.annotations.FetchMode; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + +/** + * Created by Barak Bar Orion + * 5/14/15. + */ +@Entity +@Table(name = "build_status") +public class BuildStatus { + + @Id + private String id; + private int totalTests; + private int passedTests; + private int failedTests; + private int failed3TimesTests = 0; + private int runningTests; + private int numOfTestRetries = 0; + + private int totalJobs; + private int pendingJobs; + private int runningJobs; + private int doneJobs; + private int brokenJobs; + + @JsonIgnore + @OneToOne + @JoinColumn(name = "build_id") // this will be a foreign key to Build.id + private Build build; + + @Fetch(value = FetchMode.SELECT) + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @JoinColumn(name = "build_status_id") + private List suites; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BuildStatus(Build build) { + this(); + this.build = build; + } + + public BuildStatus() { + this.suites = new ArrayList<>(); + } + + public int getTotalTests() { + return totalTests; + } + + public void setTotalTests(int totalTests) { + this.totalTests = totalTests; + } + + public int getPassedTests() { + return passedTests; + } + + public void setPassedTests(int passedTests) { + this.passedTests = passedTests; + } + + public BuildStatus incPassedTests() { + this.passedTests++; + return this; + } + + public BuildStatus decPassedTests() { + this.passedTests--; + return this; + } + + public int getFailedTests() { + return failedTests; + } + + public void setFailedTests(int failedTests) { + this.failedTests = failedTests; + } + + public BuildStatus incFailedTests() { + this.failedTests++; + return this; + } + + public BuildStatus decFailedTests() { + this.failedTests--; + return this; + } + + public int getFailed3TimesTests() { + return failed3TimesTests; + } + + public void setFailed3TimesTests(int failed3TimesTests) { + this.failed3TimesTests = failed3TimesTests; + } + + public BuildStatus incFailed3Tests() { + this.failed3TimesTests++; + return this; + } + + public BuildStatus decFailed3Tests() { + this.failed3TimesTests--; + return this; + } + + public int getRunningTests() { + return runningTests; + } + + public void setRunningTests(int runningTests) { + this.runningTests = runningTests; + } + + public BuildStatus incRunningTests() { + this.runningTests++; + return this; + } + + public BuildStatus decRunningTests() { + this.runningTests--; + return this; + } + + public int getNumOfTestRetries() { + return numOfTestRetries; + } + + public void setNumOfTestRetries(int numOfTestRetries) { + this.numOfTestRetries = numOfTestRetries; + } + + public int getTotalJobs() { + return totalJobs; + } + + public void setTotalJobs(int totalJobs) { + this.totalJobs = totalJobs; + } + + public BuildStatus incTotalJobs() { + this.totalJobs++; + return this; + } + + public BuildStatus decTotalJobs() { + this.totalJobs--; + return this; + } + + public int getPendingJobs() { + return pendingJobs; + } + + public void setPendingJobs(int pendingJobs) { + this.pendingJobs = pendingJobs; + } + + public BuildStatus incPendingJobs() { + this.pendingJobs++; + return this; + } + + public BuildStatus decPendingJobs() { + this.pendingJobs--; + return this; + } + + public int getRunningJobs() { + return runningJobs; + } + + public void setRunningJobs(int runningJobs) { + this.runningJobs = runningJobs; + } + + public BuildStatus incRunningJobs() { + this.runningJobs++; + return this; + } + + public BuildStatus decRunningJobs() { + this.runningJobs--; + return this; + } + + public int getDoneJobs() { + return doneJobs; + } + + public void setDoneJobs(int doneJobs) { + this.doneJobs = doneJobs; + } + + public BuildStatus decDoneJobs() { + this.doneJobs--; + return this; + } + + public BuildStatus incDoneJobs() { + this.doneJobs++; + return this; + } + + public List getSuites() { + return suites; + } + + public void setSuites(List suites) { + this.suites = suites; + } + + public int getBrokenJobs() { + return brokenJobs; + } + + public void setBrokenJobs(int brokenJobs) { + this.brokenJobs = brokenJobs; + } + + public Build getBuild() { + return build; + } + + public void setBuild(Build build) { + this.build = build; + } + + public BuildStatus decBrokenJobs() { + this.brokenJobs--; + return this; + } + + public BuildStatus incBrokenJobs() { + this.brokenJobs++; + return this; + } + + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("id", id) + .append("totalTests", totalTests) + .append("passedTests", passedTests) + .append("failedTests", failedTests) + .append("failed3TimesTests", failed3TimesTests) + .append("runningTests", runningTests) + .append("numOfTestRetries", numOfTestRetries) + .append("totalJobs", totalJobs) + .append("pendingJobs", pendingJobs) + .append("runningJobs", runningJobs) + .append("doneJobs", doneJobs) + .append("brokenJobs", brokenJobs) + .append("suites", suites) + .toString(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/entities/BuildStatusSuite.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/BuildStatusSuite.java new file mode 100644 index 00000000..0c454a30 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/BuildStatusSuite.java @@ -0,0 +1,81 @@ +package com.gigaspaces.newman.entities; + +import org.apache.commons.lang3.builder.ToStringBuilder; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.PrePersist; +import javax.persistence.Table; +import java.util.Objects; +import java.util.UUID; + + +@Entity +@Table(name = "build_status_suite") +public class BuildStatusSuite { + + @Id + private String id; + private String suiteId; + private String suiteName; + + public BuildStatusSuite() { + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public BuildStatusSuite(String suiteId, String suiteName) { + this.suiteId = suiteId; + this.suiteName = suiteName; + } + + public String getSuiteId() { + return suiteId; + } + + public void setSuiteId(String statusId) { + this.suiteId = statusId; + } + + public String getSuiteName() { + return suiteName; + } + + public void setSuiteName(String statusName) { + this.suiteName = statusName; + } + + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + BuildStatusSuite that = (BuildStatusSuite) o; + return Objects.equals(suiteId, that.suiteId) && Objects.equals(suiteName, that.suiteName); + } + + @Override + public int hashCode() { + return Objects.hash(suiteId, suiteName); + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("id", id) + .append("suiteId", suiteId) + .append("suiteName", suiteName) + .toString(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildsCache.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/BuildsCache.java similarity index 53% rename from newman-common/src/main/java/com/gigaspaces/newman/beans/BuildsCache.java rename to newman-common/src/main/java/com/gigaspaces/newman/entities/BuildsCache.java index 22958d2f..8144e739 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/BuildsCache.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/BuildsCache.java @@ -1,7 +1,11 @@ -package com.gigaspaces.newman.beans; +package com.gigaspaces.newman.entities; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; +import javax.persistence.*; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; /** * @author Boris @@ -9,15 +13,18 @@ * Cache builds representation in DB, this class assumes ONLY 1 thread is calling it! */ @Entity +@Table(name = "builds_cache") public class BuildsCache { @Id private String id; private final int size = 10; - private Build[] cache; private int index; + @OneToMany + private List cache; + public BuildsCache() { - this.cache = new Build[size]; + this.cache = new ArrayList<>(size); } public String getId() { @@ -42,18 +49,19 @@ public void setIndex(int index) { */ public Build put(Build b) { + if (cache.size() < size) { + cache.add(b); + return null; + } - Build res = cache[index % size]; - cache[index % size] = b; - index++; - return res; + Build replacedItem = cache.set(index, b); + index = (index + 1) % size; + return replacedItem; } public void remove(Build b) { - for (int i=0; i < size; i++){ - if (cache[i] != null && cache[i].equals(b)) { - cache[i] = null; - } + if (cache.remove(b)) { + index--; } } @@ -67,11 +75,11 @@ public boolean isInCache(Build b) { } - public Build[] getCache() { + public List getCache() { return cache; } - public void setCache(Build[] cache) { + public void setCache(List cache) { this.cache = cache; } @@ -79,12 +87,20 @@ public int getSize() { return size; } + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + @Override public String toString() { - return "BuildsCache{" + - "id='" + id + '\'' + - ", cache=" + cache + - ", size=" + size + - '}'; + return new ToStringBuilder(this) + .append("id", id) + .append("size", size) + .append("index", index) + .append("cache", cache) + .toString(); } } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/FutureJob.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/FutureJob.java similarity index 89% rename from newman-common/src/main/java/com/gigaspaces/newman/beans/FutureJob.java rename to newman-common/src/main/java/com/gigaspaces/newman/entities/FutureJob.java index 5db7fc6d..ad055c41 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/FutureJob.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/FutureJob.java @@ -1,18 +1,19 @@ -package com.gigaspaces.newman.beans; +package com.gigaspaces.newman.entities; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; +import org.hibernate.annotations.Type; +import javax.persistence.*; import java.util.Date; import java.util.Set; +import java.util.UUID; /** * Created by tamirs * on 10/19/15. */ -@SuppressWarnings("ALL") @Entity +@Table(name = "future_job") public class FutureJob { @Id private String id; @@ -25,9 +26,12 @@ public class FutureJob { private String configName; private String author; private Date submitTime; - private Set agentGroups; private int priority; + @Type(type = "com.gigaspaces.newman.types.SetStringArrayType") + @Column(name = "agent_groups", columnDefinition = "TEXT[]") + private Set agentGroups; + public FutureJob() { } @@ -137,6 +141,13 @@ public void setAgentGroups(Set agentGroups) { public void setPriority(int priority) { this.priority = priority; } + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + @Override public String toString() { return "FutureJob{" + diff --git a/newman-common/src/main/java/com/gigaspaces/newman/entities/Job.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/Job.java new file mode 100644 index 00000000..114ac867 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/Job.java @@ -0,0 +1,377 @@ +package com.gigaspaces.newman.entities; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.gigaspaces.newman.beans.State; +import com.gigaspaces.newman.converters.UriToStringConverter; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.hibernate.annotations.NotFound; +import org.hibernate.annotations.NotFoundAction; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.net.URI; +import java.util.*; + +/** + * Created by Barak Bar Orion + * 4/13/15. + */ +@Entity +@Table(name = "job", indexes = { + @Index(name = "idx_submit_time", columnList = "submit_time") +}) +@JsonIgnoreProperties(ignoreUnknown = true) +public class Job { + + @Id + private String id; + + @ManyToOne + @JoinColumn(name = "build_id") + private Build build; + + @ManyToOne + @JoinColumn(name = "suite_id", insertable = false, updatable = false, + foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + @NotFound(action = NotFoundAction.IGNORE) + private Suite suite; + + @Column(name = "suite_id") + private String suiteId; + + @Column(name = "suite_name") + private String suiteName; + + @Type(type = "com.gigaspaces.newman.types.SetStringArrayType") + @Column(name = "agent_groups", columnDefinition = "TEXT[]") + private Set agentGroups; + private int priority; + + @Column(name = "submit_time") + private Date submitTime; + private Date startTime; + private Date endTime; + @Convert(converter = UriToStringConverter.class) + private URI testURI; + private String submittedBy; + @Enumerated(EnumType.STRING) + private State state; + private int totalTests; + private int passedTests; + private int failedTests; + private int failed3TimesTests = 0; + private int runningTests; + private int numOfTestRetries = 0; + // first agent start prepare on job + private Date startPrepareTime; + // last time job seen as zombie + private Date lastTimeZombie; + + @Type(type = "com.gigaspaces.newman.types.SetStringArrayType") + @Column(name = "preparing_agents", columnDefinition = "TEXT[]") + private Set preparingAgents = Collections.emptySet();; + + @Transient + private Set agents = Collections.emptySet(); + + @OneToOne(mappedBy = "job", cascade = CascadeType.ALL, orphanRemoval = true) + private JobSetupLog jobSetupLog; + + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "job_config_id") + private JobConfig jobConfig; + + public Job(String id, String suiteId, String suiteName, String buildId, String buildName, String buildBranch) { + this.id = id; + this.suite = new Suite(); + this.suite.setId(suiteId); + this.suite.setName(suiteName); + + this.build = new Build(); + this.build.setId(buildId); + this.build.setName(buildName); + this.build.setBranch(buildBranch); + } + + public Job() { + this.state = State.READY; + } + + public void setAgentGroups(Set agentGroups) { this.agentGroups = agentGroups; } + + public Set getAgentGroups() { return agentGroups; } + + public int getPriority() { return priority; } + + public void setPriority(int priority) { this.priority = priority; } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Build getBuild() { + return build; + } + + public void setBuild(Build build) { + this.build = build; + } + + public Date getSubmitTime() { + return submitTime; + } + + public void setSubmitTime(Date submitTime) { + this.submitTime = submitTime; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getEndTime() { + return endTime; + } + + public Job setEndTime(Date endTime) { + this.endTime = endTime; + return this; + } + + public URI getTestURI() { + return testURI; + } + + public void setTestURI(URI testURI) { + this.testURI = testURI; + } + + public String getSubmittedBy() { + return submittedBy; + } + + public void setSubmittedBy(String submittedBy) { + this.submittedBy = submittedBy; + } + + public State getState() { + return state; + } + + public Job setState(State state) { + this.state = state; + return this; + } + + public int getTotalTests() { + return totalTests; + } + + public void setTotalTests(int totalTests) { + this.totalTests = totalTests; + } + + public int getPassedTests() { + return passedTests; + } + + public void setPassedTests(int passedTests) { + this.passedTests = passedTests; + } + + public Job incPassedTests() { + this.passedTests++; + return this; + } + + public Job decPassedTests() { + this.passedTests--; + return this; + } + + public int getFailedTests() { + return failedTests; + } + + public void setFailedTests(int failedTests) { + this.failedTests = failedTests; + } + + public Job incFailedTests() { + this.failedTests++; + return this; + } + + public Job decFailedTests() { + this.failedTests--; + return this; + } + + public int getFailed3TimesTests() { return failed3TimesTests;} + + public void setFailed3TimesTests(int failed3TimesTests) { this.failed3TimesTests = failed3TimesTests; } + + public Job incFailed3Tests() { + this.failed3TimesTests++; + return this; + } + + public Job decFailed3Tests() { + this.failed3TimesTests--; + return this; + } + + public int getRunningTests() { + return runningTests; + } + + public void setRunningTests(int runningTests) { + this.runningTests = runningTests; + } + + public Job incRunningTests() { + this.runningTests++; + return this; + } + + public Job decRunningTests() { + this.runningTests--; + return this; + } + + public int getNumOfTestRetries() { + return numOfTestRetries; + } + + public void setNumOfTestRetries(int numOfTestRetries) { + this.numOfTestRetries = numOfTestRetries; + } + + public String getSuiteId() { + return suiteId; + } + + public void setSuiteId(String suiteId) { + this.suiteId = suiteId; + } + + public String getSuiteName() { + return suiteName; + } + + public void setSuiteName(String suiteName) { + this.suiteName = suiteName; + } + + public Suite getSuite() { + if (suite != null) { + return suite; + } + if (suiteId == null && suiteName == null) { + return null; + } + return new Suite(this.suiteId, this.suiteName); + } + + public void setSuite(Suite suite) { + this.suite = suite; + if (suite != null) { + this.suiteId = suite.getId(); + this.suiteName = suite.getName(); + } + } + + public Set getPreparingAgents() { + return preparingAgents; + } + + public void setPreparingAgents(Set preparingAgents) { + this.preparingAgents = preparingAgents; + } + + public Date getStartPrepareTime() { + return startPrepareTime; + } + + public void setStartPrepareTime(Date startPrepareTime) { + this.startPrepareTime = startPrepareTime; + } + + public Date getLastTimeZombie() { + return lastTimeZombie; + } + + public void setLastTimeZombie(Date lastTimeZombie) { + this.lastTimeZombie = lastTimeZombie; + } + + public JobSetupLog getJobSetupLog() { + return jobSetupLog; + } + + public void setJobSetupLog(JobSetupLog jobSetupLog) { + this.jobSetupLog = jobSetupLog; + } + + public JobConfig getJobConfig() { + return jobConfig; + } + + public void setJobConfig(JobConfig jobConfig) { + this.jobConfig = jobConfig; + } + + public Set getAgents() { return agents; } + + public void setAgents(Set agents) { this.agents = agents; } + + @PrePersist + public void prePersist() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + + if (jobSetupLog == null) { + jobSetupLog = new JobSetupLog(this); + } + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("id", id) + .append("build", build) + .append("suite", suite) + .append("suiteId", suiteId) + .append("suiteName", suiteName) + .append("agentGroups", agentGroups) + .append("priority", priority) + .append("submitTime", submitTime) + .append("startTime", startTime) + .append("endTime", endTime) + .append("testURI", testURI) + .append("submittedBy", submittedBy) + .append("state", state) + .append("totalTests", totalTests) + .append("passedTests", passedTests) + .append("failedTests", failedTests) + .append("failed3TimesTests", failed3TimesTests) + .append("runningTests", runningTests) + .append("numOfTestRetries", numOfTestRetries) + .append("startPrepareTime", startPrepareTime) + .append("lastTimeZombie", lastTimeZombie) + .append("preparingAgents", preparingAgents) + .append("agents", agents) + .append("jobSetupLog", jobSetupLog) + .append("jobConfig", jobConfig) + .toString(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/JobConfig.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/JobConfig.java similarity index 50% rename from newman-common/src/main/java/com/gigaspaces/newman/beans/JobConfig.java rename to newman-common/src/main/java/com/gigaspaces/newman/entities/JobConfig.java index f408613b..99229f9b 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/JobConfig.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/JobConfig.java @@ -1,20 +1,26 @@ -package com.gigaspaces.newman.beans; +package com.gigaspaces.newman.entities; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.gigaspaces.newman.NewmanConsts; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; +import com.gigaspaces.newman.beans.JavaVersion; +import org.apache.commons.lang3.builder.ToStringBuilder; + +import javax.persistence.*; +import java.util.UUID; @Entity -@JsonIgnoreProperties(ignoreUnknown = true) +@Table(name = "job_config") public class JobConfig { @Id private String id; private String name; + + @Enumerated(value = EnumType.STRING) private JavaVersion javaVersion; + private boolean isDefault; + // the constructor will define // default for each configuration public JobConfig() { @@ -46,12 +52,28 @@ public void setJavaVersion(JavaVersion javaVersion) { this.javaVersion = javaVersion; } + public boolean isDefault() { + return isDefault; + } + + public void setDefault(boolean aDefault) { + isDefault = aDefault; + } + + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + @Override public String toString() { - return "JobConfig{" + - "id='" + id + '\'' + - ", name='" + name + '\'' + - ", javaVersion=" + javaVersion + - '}'; + return new ToStringBuilder(this) + .append("id", id) + .append("name", name) + .append("javaVersion", javaVersion) + .append("isDefault", isDefault) + .toString(); } } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/entities/JobSetupLog.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/JobSetupLog.java new file mode 100644 index 00000000..bfa72db2 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/JobSetupLog.java @@ -0,0 +1,77 @@ +package com.gigaspaces.newman.entities; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@Entity +@Table(name = "job_setup_log") +public class JobSetupLog { + + @Id + private String id; + + @JsonIgnore + @OneToOne + @JoinColumn(name = "job_id") + @OnDelete(action = OnDeleteAction.CASCADE) + private Job job; + + @Type(type = "com.gigaspaces.newman.types.MapJsonType") + @Column(name = "agent_logs", columnDefinition = "jsonb") + private Map agentLogs = new HashMap<>(); + + public JobSetupLog() { + } + + public JobSetupLog(Job job) { + this.job = job; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Map getAgentLogs() { + return agentLogs; + } + + public void setAgentLogs(Map agentLogs) { + this.agentLogs = agentLogs; + } + + public Job getJob() { + return job; + } + + public void setJob(Job job) { + this.job = job; + } + + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("id", id) + .append("jobId", job != null ? job.getId() : null) + .append("agentLogs", agentLogs) + .toString(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/PrioritizedJob.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/PrioritizedJob.java similarity index 72% rename from newman-common/src/main/java/com/gigaspaces/newman/beans/PrioritizedJob.java rename to newman-common/src/main/java/com/gigaspaces/newman/entities/PrioritizedJob.java index 2e50f7df..1c6f01a4 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/PrioritizedJob.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/PrioritizedJob.java @@ -1,23 +1,31 @@ -package com.gigaspaces.newman.beans; +package com.gigaspaces.newman.entities; -import org.mongodb.morphia.annotations.*; -import java.util.Collections; +import com.gigaspaces.newman.beans.State; +import org.hibernate.annotations.Type; + +import javax.persistence.*; import java.util.Set; +import java.util.UUID; @Entity +@Table(name = "prioritized_job") public class PrioritizedJob { @Id private String id; private String jobId; - @Embedded - private Set agentGroups = Collections.emptySet(); - @Embedded - private Set requirements = Collections.emptySet(); - @Embedded + private int priority; private boolean isPaused; + @Type(type = "com.gigaspaces.newman.types.SetStringArrayType") + @Column(name = "agent_groups", columnDefinition = "TEXT[]") + private Set agentGroups; + + @Type(type = "com.gigaspaces.newman.types.SetStringArrayType") + @Column(name = "requirements", columnDefinition = "TEXT[]") + private Set requirements; + public PrioritizedJob(){ } @@ -61,14 +69,6 @@ public void setPriority(int priority) { this.priority = priority; } - public String getJob() { - return jobId; - } - - public void setJob(String jobID) { - this.jobId = jobID; - } - public String getJobId() { return jobId; } @@ -76,7 +76,6 @@ public String getJobId() { public void setJobId(String jobId) { this.jobId = jobId; } - public boolean isPaused() { return isPaused; } @@ -85,6 +84,12 @@ public void setPaused(boolean paused) { isPaused = paused; } + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } @Override public String toString() { diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/Suite.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/Suite.java similarity index 53% rename from newman-common/src/main/java/com/gigaspaces/newman/beans/Suite.java rename to newman-common/src/main/java/com/gigaspaces/newman/entities/Suite.java index bcc646a8..bd363d4b 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/Suite.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/Suite.java @@ -1,20 +1,22 @@ -package com.gigaspaces.newman.beans; +package com.gigaspaces.newman.entities; import com.gigaspaces.newman.beans.criteria.Criteria; -import com.gigaspaces.newman.utils.ToStringBuilder; -import org.mongodb.morphia.annotations.*; -import org.mongodb.morphia.utils.IndexDirection; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; +import javax.persistence.*; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.hibernate.annotations.Type; + +import java.util.*; /** * Created by moran * on 4/29/15. */ @Entity +@Table(name = "suite", indexes = { + @Index(name = "idx_suite_name", columnList = "name"), + @Index(name = "idx_suite_custom_variables", columnList = "customVariables") +}) public class Suite { public static final String THREADS_LIMIT = "THREADS_LIMIT"; @@ -22,24 +24,33 @@ public class Suite { @Id private String id; + private String name; // INDEX + @Column(length = 1024) + private String customVariables; //INDEX; key=value separated by comma, e.g SUITE_TYPE=tgrid,SUPPORT_SGTEST=sgtest - @Indexed(value= IndexDirection.ASC, unique=false) - private String name; + private Integer workersAllowed = 1; - @Indexed(value= IndexDirection.ASC, unique=false) - private String customVariables; //key=value separated by comma, e.g SUITE_TYPE=tgrid,SUPPORT_SGTEST=sgtest +// @Convert(converter = StringSetConverter.class) + @Type(type = "com.gigaspaces.newman.types.SetStringArrayType") + @Column(name = "requirements", columnDefinition = "TEXT[]") + private Set requirements; - @Embedded + @Column(name = "criteria", columnDefinition = "JSON") +// @Convert(converter = CriteriaConverter.class) + @Type(type = "com.gigaspaces.newman.types.CriteriaJsonType") private Criteria criteria; @Transient private String displayedCriteria; + public Suite(String id, String name) { + this.id = id; + this.name = name; + } + public Suite() { requirements = new TreeSet<>(); } - @Embedded(concreteClass = java.util.TreeSet.class) - private Set requirements; public String getId() { return id; @@ -73,6 +84,10 @@ public void setCustomVariables(String customVariables) { this.customVariables = customVariables; } + public Integer getWorkersAllowed() { + return workersAllowed; + } + public static Map parseCustomVariables(String customVariables){ Map res = new HashMap<>(); if (customVariables != null) { @@ -85,14 +100,38 @@ public static Map parseCustomVariables(String customVariables){ @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName()) + return new ToStringBuilder(this) .append("id", id) .append("name", name) .append("custom environment variables", customVariables) .append("criteria", criteria) + .append("workers allowed", workersAllowed) .toString(); } + @PreUpdate + public void update() { + if (this.customVariables != null) { + Map vars = Suite.parseCustomVariables(this.customVariables); + String threadsLimit = vars.get(Suite.THREADS_LIMIT); // save threads as a separate field to use it later + if (threadsLimit != null) { + try { + this.workersAllowed = Integer.parseInt(threadsLimit); + } catch (NumberFormatException e) { + this.workersAllowed = 1; // fallback + } + } + } + } + + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + update(); + } + public String getDisplayedCriteria() { return displayedCriteria; } diff --git a/newman-common/src/main/java/com/gigaspaces/newman/beans/Test.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/Test.java similarity index 76% rename from newman-common/src/main/java/com/gigaspaces/newman/beans/Test.java rename to newman-common/src/main/java/com/gigaspaces/newman/entities/Test.java index c7c0829e..9986868a 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/beans/Test.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/Test.java @@ -1,63 +1,67 @@ -package com.gigaspaces.newman.beans; - -import com.gigaspaces.newman.utils.StringUtils; -import com.gigaspaces.newman.utils.ToStringBuilder; -import org.mongodb.morphia.annotations.Embedded; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; -import org.mongodb.morphia.annotations.Indexed; -import org.mongodb.morphia.annotations.PostLoad; -import org.mongodb.morphia.utils.IndexDirection; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +package com.gigaspaces.newman.entities; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.util.*; /** * Created by Barak Bar Orion * 4/16/15. */ @Entity +@Table(name = "test", indexes = { + @Index(name = "idx_job_id", columnList = "jobId"), + @Index(name = "idx_name", columnList = "name"), + @Index(name = "idx_test_score", columnList = "testScore"), + @Index(name = "idx_sha", columnList = "sha") +}) +@JsonIgnoreProperties(ignoreUnknown = true) public class Test { public enum Status {PENDING, SUCCESS, FAIL, RUNNING} @Id private String id; - @Indexed(value = IndexDirection.ASC, unique = false) + private String jobId; - @Indexed(value = IndexDirection.ASC, unique = false) private String name; + private Double testScore; + private String sha; + + @Type(type = "com.gigaspaces.newman.types.ListStringArrayType") + @Column(name = "arguments", columnDefinition = "TEXT[]") private List arguments; private String testType; private Long timeout; + + @Enumerated(value = EnumType.STRING) private Status status; + + @Column(columnDefinition = "TEXT") private String errorMessage; - @Indexed(value = IndexDirection.DESC, unique = false) - private Double testScore; private String historyStats; /* name, url mapping */ - @Embedded - private Map logs; + + @OneToOne(mappedBy = "test", cascade = CascadeType.ALL, orphanRemoval = true) + private TestLog logs; + private String assignedAgent; private String agentGroup; private Date startTime; private Date endTime; private Date scheduledAt; private int progressPercent; - private int runNumber = 1; - - @Indexed(unique = false) - private String sha; + private Integer runNumber = 1; - @Embedded + @Type(type = "com.gigaspaces.newman.types.MapJsonType") + @Column(name = "properties", columnDefinition = "JSON") private Map properties; public Test() { - logs = new HashMap<>(); - properties = new HashMap<>(); - arguments = new ArrayList<>(); + this.properties = new HashMap<>(); + this.arguments = new ArrayList<>(); } public String getId() { @@ -109,12 +113,11 @@ public void setErrorMessage(String errorMessage) { this.errorMessage = errorMessage; } - public Map getLogs() { + public TestLog getLogs() { return logs; } - @SuppressWarnings("unused") - public void setLogs(Map logs) { + public void setLogs(TestLog logs) { this.logs = logs; } @@ -178,16 +181,6 @@ public Map getProperties() { * set properties and replace keys to not contain dots due mongo impl - map keys can't contain dots */ public void setProperties(Map properties) { - if (properties == null) return; - - String[] keyArray = properties.keySet().toArray(new String[properties.size()]); - for (String orginalKeys : keyArray) { - String newKey = StringUtils.dotToDash(orginalKeys); - if (!newKey.equals(orginalKeys)) { - properties.put(newKey, properties.get(orginalKeys)); - properties.remove(orginalKeys); - } - } this.properties = properties; } @@ -242,7 +235,7 @@ public void setHistoryStats(String historyStats) { this.historyStats = historyStats; } - public int getRunNumber() { + public Integer getRunNumber() { return runNumber; } @@ -255,9 +248,20 @@ void postLoad() { computeProgressPercent(); } + @PrePersist + public void prePersist() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + + if (logs == null) { + logs = new TestLog(this); + } + } + @Override public String toString() { - return ToStringBuilder.newBuilder(this.getClass().getSimpleName(), true) + return new ToStringBuilder(this) .append("id", id) .append("jobId", jobId) .append("name", name) diff --git a/newman-common/src/main/java/com/gigaspaces/newman/entities/TestLog.java b/newman-common/src/main/java/com/gigaspaces/newman/entities/TestLog.java new file mode 100644 index 00000000..e9c09363 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/entities/TestLog.java @@ -0,0 +1,77 @@ +package com.gigaspaces.newman.entities; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.hibernate.annotations.OnDelete; +import org.hibernate.annotations.OnDeleteAction; +import org.hibernate.annotations.Type; + +import javax.persistence.*; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@Entity +@Table(name = "test_logs", uniqueConstraints = @UniqueConstraint(columnNames = "test_id")) +public class TestLog { + + @Id + private String id; + + @JsonIgnore + @OneToOne + @JoinColumn(name = "test_id") + @OnDelete(action = OnDeleteAction.CASCADE) + private Test test; + + @Type(type = "com.gigaspaces.newman.types.MapJsonType") + @Column(name = "logs", columnDefinition = "JSON") + private Map testLogs = new HashMap<>(); + + public TestLog() { + } + + public TestLog(Test test) { + this.test = test; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Map getTestLogs() { + return testLogs; + } + + public void setTestLogs(Map testLogs) { + this.testLogs = testLogs; + } + + public Test getTest() { + return test; + } + + public void setTest(Test test) { + this.test = test; + } + + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("id", id) + .append("testId", test != null ? test.getId() : null) + .append("testLogs", testLogs) + .toString(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/projections/PBuildForView.java b/newman-common/src/main/java/com/gigaspaces/newman/projections/PBuildForView.java new file mode 100644 index 00000000..ccae8637 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/projections/PBuildForView.java @@ -0,0 +1,19 @@ +package com.gigaspaces.newman.projections; + +import java.util.Date; +import java.util.Set; + +public interface PBuildForView { + String getId(); + String getName(); + String getBranch(); + Date getBuildTime(); + Set getTags(); + PBuildForView.BuildStatus getBuildStatus(); + + interface BuildStatus { + int getPassedTests(); + int getFailedTests(); + int getFailed3TimesTests(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/projections/PBuildThin.java b/newman-common/src/main/java/com/gigaspaces/newman/projections/PBuildThin.java new file mode 100644 index 00000000..99d2aeda --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/projections/PBuildThin.java @@ -0,0 +1,10 @@ +package com.gigaspaces.newman.projections; + +import java.util.Set; + +public interface PBuildThin { + String getId(); + String getName(); + String getBranch(); + Set getTags(); +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/projections/PJob.java b/newman-common/src/main/java/com/gigaspaces/newman/projections/PJob.java new file mode 100644 index 00000000..c590d05d --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/projections/PJob.java @@ -0,0 +1,50 @@ +package com.gigaspaces.newman.projections; + +import java.net.URI; +import java.util.Date; +import java.util.Set; + +import com.gigaspaces.newman.beans.State; + +public interface PJob { + String getId(); + + PJob.Build getBuild(); + PJob.Suite getSuite(); + PJob.JobConfig getJobConfig(); + + Date getSubmitTime(); + Date getStartTime(); + Date getEndTime(); + + URI getTestURI(); + String getSubmittedBy(); + State getState(); + + int getTotalTests(); + int getPassedTests(); + int getFailedTests(); + int getFailed3TimesTests(); + int getRunningTests(); + int getNumOfTestRetries(); + + Set getPreparingAgents(); + Set getAgentGroups(); + int getPriority(); + + interface Build { + String getId(); + String getName(); + String getBranch(); + } + + interface Suite { + String getId(); + String getName(); + } + + interface JobConfig { + String getId(); + String getName(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/projections/PJobForDashboard.java b/newman-common/src/main/java/com/gigaspaces/newman/projections/PJobForDashboard.java new file mode 100644 index 00000000..928c221e --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/projections/PJobForDashboard.java @@ -0,0 +1,17 @@ +package com.gigaspaces.newman.projections; + +public interface PJobForDashboard { + String getId(); + + int getTotalTests(); + int getPassedTests(); + int getFailedTests(); + int getFailed3TimesTests(); + int getRunningTests(); + int getNumOfTestRetries(); + + interface Suite { + String getId(); + String getName(); + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/projections/PJobThin.java b/newman-common/src/main/java/com/gigaspaces/newman/projections/PJobThin.java new file mode 100644 index 00000000..2b65e901 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/projections/PJobThin.java @@ -0,0 +1,21 @@ +package com.gigaspaces.newman.projections; + +public interface PJobThin { + String getId(); + String getSuiteId(); + String getSuiteName(); + String getBuildId(); + String getBuildName(); + String getBuildBranch(); + + default String string() { + return "Job[" + + "id=" + getId() + + ", suiteId=" + getSuiteId() + + ", suiteName=" + getSuiteName() + + ", buildId=" + getBuildId() + + ", buildName=" + getBuildName() + + ", buildBranch=" + getBuildBranch() + + "]"; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/projections/PSuiteThin.java b/newman-common/src/main/java/com/gigaspaces/newman/projections/PSuiteThin.java new file mode 100644 index 00000000..eab62a7c --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/projections/PSuiteThin.java @@ -0,0 +1,7 @@ +package com.gigaspaces.newman.projections; + +public interface PSuiteThin { + String getId(); + String getName(); + String getCustomVariables(); +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/projections/PTest.java b/newman-common/src/main/java/com/gigaspaces/newman/projections/PTest.java new file mode 100644 index 00000000..190e226c --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/projections/PTest.java @@ -0,0 +1,25 @@ +package com.gigaspaces.newman.projections; + +import com.gigaspaces.newman.entities.TestLog; + +import java.util.Date; +import java.util.List; + +public interface PTest { + String getId(); + String getJobId(); + String getName(); + List getArguments(); + String getStatus(); + String getErrorMessage(); + Double getTestScore(); + String getHistoryStats(); + String getAssignedAgent(); + String getTestType(); + String getAgentGroup(); + Date getStartTime(); + Date getEndTime(); + Integer getProgressPercent(); + Integer getRunNumber(); + TestLog getLogs(); +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/projections/PTestForHistory.java b/newman-common/src/main/java/com/gigaspaces/newman/projections/PTestForHistory.java new file mode 100644 index 00000000..3b148bd9 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/projections/PTestForHistory.java @@ -0,0 +1,14 @@ +package com.gigaspaces.newman.projections; + +import java.util.Date; + +public interface PTestForHistory { + String getName(); + Date getEndTime(); + String getArguments(); + String getSha(); + String getBranch(); + String getJobId(); + String getBuildId(); + String getSuiteId(); +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/types/CriteriaJsonType.java b/newman-common/src/main/java/com/gigaspaces/newman/types/CriteriaJsonType.java new file mode 100644 index 00000000..2b1bc9ec --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/types/CriteriaJsonType.java @@ -0,0 +1,104 @@ +package com.gigaspaces.newman.types; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gigaspaces.newman.beans.criteria.Criteria; +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.usertype.UserType; +import org.postgresql.util.PGobject; + +import java.io.IOException; +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Objects; + +public class CriteriaJsonType implements UserType { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final Class clazz = Criteria.class; + + @Override + public int[] sqlTypes() { + return new int[] { Types.OTHER }; // Use Types.OTHER for handling the PostgreSQL `json` type + } + + @Override + public Class returnedClass() { + return Criteria.class; // We treat it as a String in Java for simplicity + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + return Objects.equals(x, y); + } + + @Override + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) + throws HibernateException, SQLException { + String json = rs.getString(names[0]); + if (json == null) { + return null; + } + try { + return objectMapper.readValue(json, clazz); // Deserialize the JSON string into the specified class + } catch (IOException e) { + throw new HibernateException("Error deserializing JSON to " + clazz.getName(), e); + } + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) + throws HibernateException, SQLException { + if (value != null) { + try { + String json = objectMapper.writeValueAsString(value); // Serialize the object into a JSON string + PGobject pgObject = new PGobject(); + pgObject.setType("json"); + pgObject.setValue(json); + + st.setObject(index, pgObject, Types.OTHER); // Set the JSON string to the prepared statement + } catch (IOException e) { + throw new HibernateException("Error serializing object to JSON", e); + } + } else { + st.setNull(index, Types.OTHER); // Set null if the value is null + } + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + try { + return objectMapper.readValue(objectMapper.writeValueAsString(value), clazz); // Deep copy using serialization + } catch (IOException e) { + throw new HibernateException("Error copying object", e); + } + } + + @Override + public boolean isMutable() { + return false; + } + + @Override + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable) value; + } + + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/types/ListStringArrayType.java b/newman-common/src/main/java/com/gigaspaces/newman/types/ListStringArrayType.java new file mode 100644 index 00000000..8dafa772 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/types/ListStringArrayType.java @@ -0,0 +1,87 @@ +package com.gigaspaces.newman.types; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.usertype.UserType; + +import java.io.Serializable; +import java.sql.*; +import java.util.*; + +public class ListStringArrayType implements UserType { + + @Override + public int[] sqlTypes() { + return new int[]{Types.ARRAY}; + } + + @Override + @SuppressWarnings("unchecked") + public Class> returnedClass() { + return (Class>) (Class) Set.class; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + if (x instanceof Set && y instanceof Set) { + return x.equals(y); + } + return false; + } + + @Override + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) + throws HibernateException, SQLException { + Array array = rs.getArray(names[0]); + if (array != null) { + String[] values = (String[]) array.getArray(); + List resultSet = new ArrayList<>(Arrays.asList(values)); + return resultSet; + } + return null; + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) + throws HibernateException, SQLException { + if (value != null) { + List list = (List) value; + String[] array = list.toArray(new String[0]); + Array sqlArray = session.connection().createArrayOf("text", array); + st.setArray(index, sqlArray); + } else { + st.setNull(index, sqlTypes()[0]); + } + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + List set = (List) value; + return new ArrayList<>(set); + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable) value; + } + + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/types/MapJsonType.java b/newman-common/src/main/java/com/gigaspaces/newman/types/MapJsonType.java new file mode 100644 index 00000000..d216271b --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/types/MapJsonType.java @@ -0,0 +1,100 @@ +package com.gigaspaces.newman.types; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gigaspaces.newman.beans.criteria.Criteria; +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.usertype.UserType; +import org.postgresql.util.PGobject; + +import java.io.IOException; +import java.io.Serializable; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Types; +import java.util.Map; +import java.util.Objects; + +public class MapJsonType implements UserType { + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public int[] sqlTypes() { + return new int[] { Types.OTHER }; // Use Types.OTHER for handling the PostgreSQL `json` type + } + + @Override + public Class returnedClass() { + return Map.class; // We treat it as a String in Java for simplicity + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + return Objects.equals(x, y); + } + + @Override + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) + throws HibernateException, SQLException { + String json = rs.getString(names[0]); + if (json == null) { + return null; + } + try { + return objectMapper.readValue(json, Map.class); // Deserialize the JSON string into the specified class + } catch (IOException e) { + throw new HibernateException("Error deserializing JSON to Map", e); + } + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) + throws HibernateException, SQLException { + if (value != null) { + try { + String jsonMap = objectMapper.writeValueAsString(value); // Serialize the object into a JSON string + st.setObject(index, jsonMap, Types.OTHER); // Set the JSON string to the prepared statement + } catch (IOException e) { + throw new HibernateException("Error serializing Map to JSON", e); + } + } else { + st.setNull(index, Types.OTHER); // Set null if the value is null + } + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + try { + return objectMapper.readValue(objectMapper.writeValueAsString(value), Map.class); // Deep copy using serialization + } catch (IOException e) { + throw new HibernateException("Error copying object", e); + } + } + + @Override + public boolean isMutable() { + return false; + } + + @Override + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable) value; + } + + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/types/SetStringArrayType.java b/newman-common/src/main/java/com/gigaspaces/newman/types/SetStringArrayType.java new file mode 100644 index 00000000..e96d6f00 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/types/SetStringArrayType.java @@ -0,0 +1,93 @@ +package com.gigaspaces.newman.types; + +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.usertype.UserType; + +import java.io.Serializable; +import java.sql.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class SetStringArrayType implements UserType { + + @Override + public int[] sqlTypes() { + return new int[]{Types.ARRAY}; + } + + @Override + @SuppressWarnings("unchecked") + public Class> returnedClass() { + return (Class>) (Class) Set.class; + } + + @Override + public boolean equals(Object x, Object y) throws HibernateException { + if (x instanceof Set && y instanceof Set) { + return x.equals(y); + } + return false; + } + + @Override + public int hashCode(Object x) throws HibernateException { + return x.hashCode(); + } + + @Override + public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) + throws HibernateException, SQLException { + Array array = rs.getArray(names[0]); + if (array != null) { + String[] values = (String[]) array.getArray(); + Set resultSet = new HashSet<>(Arrays.asList(values)); + return resultSet; + } + return null; + } + + @Override + public void nullSafeSet(PreparedStatement st, Object value, int index, SharedSessionContractImplementor session) + throws HibernateException, SQLException { + if (value != null) { + Set set = (Set) value; + String[] array = set.toArray(new String[0]); + Array sqlArray = session.connection().createArrayOf("text", array); + st.setArray(index, sqlArray); + } else { + st.setNull(index, sqlTypes()[0]); + } + } + + @Override + public Object deepCopy(Object value) throws HibernateException { + if (value == null) { + return new HashSet<>(); + } + + Set set = (Set) value; + return new HashSet<>(set); + } + + @Override + public boolean isMutable() { + return true; + } + + @Override + public Serializable disassemble(Object value) throws HibernateException { + return (Serializable) value; + } + + @Override + public Object assemble(Serializable cached, Object owner) throws HibernateException { + return cached; + } + + @Override + public Object replace(Object original, Object target, Object owner) throws HibernateException { + return original; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/utils/ConvertUtils.java b/newman-common/src/main/java/com/gigaspaces/newman/utils/ConvertUtils.java new file mode 100644 index 00000000..45dcf150 --- /dev/null +++ b/newman-common/src/main/java/com/gigaspaces/newman/utils/ConvertUtils.java @@ -0,0 +1,19 @@ +package com.gigaspaces.newman.utils; + +import org.hibernate.collection.internal.PersistentBag; + +import java.util.Collection; +import java.util.List; + +public class ConvertUtils { + + public static Collection unpackPersistentBag(Collection collection) { + if (collection instanceof PersistentBag && collection.size() == 1) { + Object first = ((List) collection).get(0); + if (first instanceof List) { + return (List) first; + } + } + return collection; + } +} diff --git a/newman-common/src/main/java/com/gigaspaces/newman/utils/FileUtils.java b/newman-common/src/main/java/com/gigaspaces/newman/utils/FileUtils.java index f17b6af3..45379caf 100644 --- a/newman-common/src/main/java/com/gigaspaces/newman/utils/FileUtils.java +++ b/newman-common/src/main/java/com/gigaspaces/newman/utils/FileUtils.java @@ -116,8 +116,8 @@ private static HttpURLConnection getConnection(URL url, boolean ssl) throws NoSu } else { connection = (HttpURLConnection) url.openConnection(); } - connection.setReadTimeout(60000); - connection.setReadTimeout(60000); + connection.setConnectTimeout(60000); // 60 seconds to establish connection + connection.setReadTimeout(60000); // 60 seconds to read data return connection; } @@ -221,7 +221,8 @@ public static void validateUris(Collection resources) throws IOException { if (uri.toURL().getProtocol().equalsIgnoreCase("https")){ connection = getHttpsConnection(uri.toURL()); inputStream = connection.getInputStream(); - return; + logger.info("able to connect to URI: " + uri); + continue; // Continue validating remaining URIs } inputStream = uri.toURL().openStream(); logger.info("able to connect to URI: " + uri); diff --git a/newman-common/src/main/java/com/gigaspaces/newman/utils/ToStringBuilder.java b/newman-common/src/main/java/com/gigaspaces/newman/utils/ToStringBuilder.java deleted file mode 100644 index 4d56fd65..00000000 --- a/newman-common/src/main/java/com/gigaspaces/newman/utils/ToStringBuilder.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.gigaspaces.newman.utils; - -import java.util.Collection; -import java.util.Map; - -/** - * Created by moran - * on 4/29/15. - */ -public class ToStringBuilder { - private final String name; - private final boolean ignoreNullValues; - private StringBuilder builder; - - private ToStringBuilder(String name, boolean ignoreNullValues) { - this.name = name; - this.ignoreNullValues = ignoreNullValues; - builder = new StringBuilder(); - } - - public static ToStringBuilder newBuilder(String name) { - return new ToStringBuilder(name, false /*ignoreNullValues*/); - } - - public static ToStringBuilder newBuilder(String name, boolean ignoreNullValues) { - return new ToStringBuilder(name, ignoreNullValues); - } - - public ToStringBuilder append(String key, Object value) { - if (ignoreNullValues) { - if (value == null) { - return this; - } - if (value instanceof Collection) { - if (((Collection) value).size() == 0) { - return this; - } - } - if (value instanceof Map) { - if (((Map) value).size() == 0) { - return this; - } - } - } - if (builder.length() > 0) { - builder.append(',').append(' '); - } - builder.append(key).append(':').append(' ').append('\'').append(value).append('\''); - return this; - } - - @Override - public String toString() { - return name + " {" + builder + " }"; - } -} diff --git a/newman-common/src/test/java/com/gigaspaces/newman/criteria/CriteriaEvaluatorTest.java b/newman-common/src/test/java/com/gigaspaces/newman/criteria/CriteriaEvaluatorTest.java index b14f4e19..ac2a8b67 100644 --- a/newman-common/src/test/java/com/gigaspaces/newman/criteria/CriteriaEvaluatorTest.java +++ b/newman-common/src/test/java/com/gigaspaces/newman/criteria/CriteriaEvaluatorTest.java @@ -1,7 +1,7 @@ package com.gigaspaces.newman.criteria; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Test; import com.gigaspaces.newman.beans.criteria.*; import com.gigaspaces.newman.beans.criteria.CriteriaEvaluator; import org.junit.Assert; diff --git a/newman-scripts/newman-hosts.all b/newman-scripts/newman-hosts.all deleted file mode 100644 index 3674690b..00000000 --- a/newman-scripts/newman-hosts.all +++ /dev/null @@ -1,32 +0,0 @@ -192.168.33.206 -192.168.33.208 -192.168.33.207 -192.168.33.209 -192.168.33.210 -192.168.33.211 -192.168.33.212 -192.168.33.213 -192.168.33.214 -192.168.33.215 -192.168.33.216 -192.168.33.217 -192.168.33.218 -192.168.33.232 -192.168.33.233 -192.168.33.234 -192.168.33.235 -192.168.33.236 -192.168.33.237 -192.168.33.238 -192.168.33.239 -192.168.33.240 -192.168.33.241 -192.168.33.242 -192.168.33.243 -192.168.33.244 -192.168.33.245 -192.168.33.246 -192.168.33.247 -192.168.10.47 -192.168.10.48 -192.168.10.20 diff --git a/newman-scripts/newman-hosts.imc-srv01 b/newman-scripts/newman-hosts.imc-srv01 deleted file mode 100644 index a1ad466b..00000000 --- a/newman-scripts/newman-hosts.imc-srv01 +++ /dev/null @@ -1,13 +0,0 @@ -192.168.33.232 -192.168.33.233 -192.168.33.234 -192.168.33.235 -192.168.33.236 -192.168.33.237 -192.168.33.238 -192.168.33.239 -192.168.33.240 -192.168.33.241 -192.168.33.242 -192.168.33.243 -192.168.33.244 \ No newline at end of file diff --git a/newman-scripts/newman-hosts.imc-srv02 b/newman-scripts/newman-hosts.imc-srv02 deleted file mode 100644 index 35ef1252..00000000 --- a/newman-scripts/newman-hosts.imc-srv02 +++ /dev/null @@ -1,15 +0,0 @@ -192.168.33.206 -192.168.33.207 -192.168.33.208 -192.168.33.209 -192.168.33.210 -192.168.33.211 -192.168.33.212 -192.168.33.213 -192.168.33.214 -192.168.33.215 -192.168.33.216 -192.168.33.217 -192.168.33.218 -192.168.33.219 -192.168.33.220 \ No newline at end of file diff --git a/newman-scripts/newman-hosts.intel b/newman-scripts/newman-hosts.intel deleted file mode 100644 index 5d6eb986..00000000 --- a/newman-scripts/newman-hosts.intel +++ /dev/null @@ -1,33 +0,0 @@ -192.168.33.206 -192.168.33.207 -192.168.33.208 -192.168.33.209 -192.168.33.210 -192.168.33.211 -192.168.33.212 -192.168.33.213 -192.168.33.214 -192.168.33.215 -192.168.33.216 -192.168.33.217 -192.168.33.218 -192.168.33.219 -192.168.33.220 -192.168.33.221 -192.168.33.222 -192.168.33.223 -192.168.33.232 -192.168.33.233 -192.168.33.234 -192.168.33.235 -192.168.33.236 -192.168.33.237 -192.168.33.238 -192.168.33.239 -192.168.33.240 -192.168.33.241 -192.168.33.242 -192.168.33.243 -192.168.33.244 -192.168.33.245 -192.168.33.246 \ No newline at end of file diff --git a/newman-scripts/newman-hosts.lab b/newman-scripts/newman-hosts.lab deleted file mode 100644 index b3bc6baa..00000000 --- a/newman-scripts/newman-hosts.lab +++ /dev/null @@ -1,31 +0,0 @@ -xap-newman-agent-14 -xap-newman-agent-19 -xap-newman-agent-20 -xap-newman-agent-21 -xap-newman-agent-22 -xap-newman-agent-23 -xap-newman-agent-24 -xap-newman-agent-25 -xap-newman-agent-26 -xap-newman-agent-27 -xap-newman-agent-28 -xap-newman-agent-29 -xap-newman-agent-30 -xap-newman-agent-31 -xap-newman-agent-32 -xap-newman-agent-33 -xap-newman-agent-34 -xap-newman-agent-35 -xap-newman-agent-36 -xap-newman-agent-37 -xap-newman-agent-38 -xap-newman-agent-39 -xap-newman-agent-40 -xap-newman-agent-41 -192.168.10.244 -192.168.10.245 -192.168.10.246 -192.168.10.247 -192.168.10.248 -192.168.10.181 -192.168.10.20 \ No newline at end of file diff --git a/newman-scripts/newman-hosts.pmem b/newman-scripts/newman-hosts.pmem deleted file mode 100644 index 4a899706..00000000 --- a/newman-scripts/newman-hosts.pmem +++ /dev/null @@ -1,15 +0,0 @@ -192.168.33.99 -192.168.33.98 -192.168.33.97 -192.168.33.96 -192.168.33.95 -192.168.33.93 -192.168.33.92 -192.168.33.91 -192.168.33.90 -192.168.33.89 -192.168.33.88 -192.168.33.87 -192.168.33.85 -192.168.33.86 -192.168.33.82 \ No newline at end of file diff --git a/newman-server/bin/export-public-key.sh b/newman-server/bin/export-public-key.sh new file mode 100755 index 00000000..34178f87 --- /dev/null +++ b/newman-server/bin/export-public-key.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +. ./env.sh + +echo -e "${Yellow}Exporting server public key to PEM format${Color_Off}" + +# Export certificate from keystore +keytool -exportcert -alias server -keystore $KEYSTORE_DIR/server.keystore \ + -storepass $PASSWORD -rfc -file $KEYSTORE_DIR/server-cert.pem + +# Extract public key from certificate +openssl x509 -in $KEYSTORE_DIR/server-cert.pem -pubkey -noout > $KEYSTORE_DIR/server-public.pem + +# Clean up certificate file +rm -f $KEYSTORE_DIR/server-cert.pem + +echo -e "${Green}Public key exported to $KEYSTORE_DIR/server-public.pem${Color_Off}" diff --git a/newman-server/bin/keysgen.sh b/newman-server/bin/keysgen.sh index 25ab8089..338e7803 100755 --- a/newman-server/bin/keysgen.sh +++ b/newman-server/bin/keysgen.sh @@ -9,3 +9,4 @@ mkdir $KEYSTORE_DIR ./gen-certificate-autority-keys.sh ./gen-key-and-certificate.sh server ./gen-key-and-certificate.sh client +./export-public-key.sh diff --git a/newman-server/bin/newman-server-install.sh b/newman-server/bin/newman-server-install.sh new file mode 100755 index 00000000..ff0536d5 --- /dev/null +++ b/newman-server/bin/newman-server-install.sh @@ -0,0 +1,80 @@ +#!/usr/bin/env bash +set -x +DIRNAME=`cd $(dirname ${BASH_SOURCE[0]}) && pwd` +cd $DIRNAME +# load env if config file exists +source newman-server-env.sh + +# make sure keys have been generated, if not create for development +if [ ! -d "../keys" ]; then + ./keysgen.sh +fi + +# make sure realm properties exist, if not create a for development +mkdir -p ../config + +cat << '_EOF' >> ../config/realm.properties +ester=ester, user +yuval=yuval, user +evgeny=evgeny, user +moran=moran, user +root=root, admin +support=support, user +mishel=mishel, user +sagiv=sagiv, user +yonatan=yonatan, user +michael=michael, user +irena=irena, user +tomer=tomer, user +noi=noi, user +anton=anton, user +oleksii=oleksii, user +alesia=alesia, user +olha=olha, user +michaelg=michaelg, user +sapir=sapir, user +shai=shai, user +davyd=davyd, user +esubotin=esubotin, user +inbal=inbal, user +tolik=tolik, user +user=user, user +_EOF + + +# System environment variables +# Mongo host address to connect to from newman server +# remote mongo db - xap-builder.gspaces.com:27017 +export DB_HOST=${DB_HOST="localhost:5432"} + +# Mongo db name to access in database +export DB_NAME=${DB_NAME="newman-db"} + +export DB_USERNAME=${DB_USERNAME="admin"} +export DB_PASSWORD=${DB_PASSWORD="password"} + +export NEWMAN_SERVER_SPOTINST_TOKEN=${NEWMAN_SERVER_SPOTINST_TOKEN=""} +export NEWMAN_SERVER_SPOTINST_ACCOUNT_ID=${NEWMAN_SERVER_SPOTINST_ACCOUNT_ID=""} +# run newman server +# to debug, add java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ + +# --add-opens not needed unless it's java 9 or higher is used +# java --add-opens java.base/java.lang=ALL-UNNAMED \ +# --add-opens java.base/java.net=ALL-UNNAMED \ +# --add-opens java.base/java.nio=ALL-UNNAMED \ +# --add-opens java.base/java.util=ALL-UNNAMED \ +# --add-opens java.base/java.util.concurrent=ALL-UNNAMED \ +# --add-opens java.base/java.time=ALL-UNNAMED \ + +java -Dproduction=true \ + -Dnewman.server.spotinst.token="${NEWMAN_SERVER_SPOTINST_TOKEN}" \ + -Dnewman.server.spotinst.accountId="${NEWMAN_SERVER_SPOTINST_ACCOUNT_ID}" \ + -Dnewman.postgres.db.host=${DB_HOST} \ + -Dnewman.postgres.db.name=${DB_NAME} \ + -Dnewman.postgres.username=${DB_USERNAME} \ + -Dnewman.postgres.password=${DB_PASSWORD} \ + -Dnewman.server.realm-config-path=../config/realm.properties \ + -Dnewman.keys-folder-path=../keys/server.keystore \ + -Dnewman.certificate=../certs/keystore.p12 \ + -Dnewman.server.web-folder-path=../web -jar \ + ../target/newman-server-1.0.jar 2>&1 > /tmp/newman.log diff --git a/newman-server/bin/newman-server.sh b/newman-server/bin/newman-server.sh index 14c956a4..eee92240 100755 --- a/newman-server/bin/newman-server.sh +++ b/newman-server/bin/newman-server.sh @@ -15,59 +15,57 @@ mkdir -p ../config cat << '_EOF' >> ../config/realm.properties ester=ester, user +rami=rami, admin yuval=yuval, user evgeny=evgeny, user -moran=moran, user root=root, admin support=support, user -mishel=mishel, user -sagiv=sagiv, user yonatan=yonatan, user -michael=michael, user -irena=irena, user -tomer=tomer, user -noi=noi, user anton=anton, user oleksii=oleksii, user alesia=alesia, user -olha=olha, user -michaelg=michaelg, user -sapir=sapir, user shai=shai, user davyd=davyd, user esubotin=esubotin, user inbal=inbal, user tolik=tolik, user -user=user, user +automation=automation, root _EOF # System environment variables # Mongo host address to connect to from newman server # remote mongo db - xap-builder.gspaces.com:27017 -export NEWMAN_MONGO_DB_HOST=${NEWMAN_MONGO_DB_HOST="mongo-server"} +export DB_HOST=${DB_HOST="localhost:5432"} # Mongo db name to access in database -export NEWMAN_MONGO_DB_NAME=${NEWMAN_MONGO_DB_NAME="newman-db"} +export DB_NAME=${DB_NAME="newman-db"} + +export DB_USERNAME=${DB_USERNAME="admin"} +export DB_PASSWORD=${DB_PASSWORD="password"} export NEWMAN_SERVER_SPOTINST_TOKEN=${NEWMAN_SERVER_SPOTINST_TOKEN=""} export NEWMAN_SERVER_SPOTINST_ACCOUNT_ID=${NEWMAN_SERVER_SPOTINST_ACCOUNT_ID=""} # run newman server # to debug, add java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 \ +# --add-opens not needed unless it's java 9 or higher is used # java --add-opens java.base/java.lang=ALL-UNNAMED \ # --add-opens java.base/java.net=ALL-UNNAMED \ # --add-opens java.base/java.nio=ALL-UNNAMED \ # --add-opens java.base/java.util=ALL-UNNAMED \ # --add-opens java.base/java.util.concurrent=ALL-UNNAMED \ # --add-opens java.base/java.time=ALL-UNNAMED \ + java -Dproduction=true \ -Dnewman.server.spotinst.token="${NEWMAN_SERVER_SPOTINST_TOKEN}" \ -Dnewman.server.spotinst.accountId="${NEWMAN_SERVER_SPOTINST_ACCOUNT_ID}" \ - -Dnewman.mongo.db.host=${NEWMAN_MONGO_DB_HOST} \ - -Dnewman.mongo.db.name=${NEWMAN_MONGO_DB_NAME} \ + -Dnewman.postgres.db.host=${DB_HOST} \ + -Dnewman.postgres.db.name=${DB_NAME} \ + -Dnewman.postgres.username=${DB_USERNAME} \ + -Dnewman.postgres.password=${DB_PASSWORD} \ -Dnewman.server.realm-config-path=../config/realm.properties \ -Dnewman.keys-folder-path=../keys/server.keystore \ -Dnewman.certificate=../certs/keystore.p12 \ - -Dnewman.server.web-folder-path=../web/vue -jar \ + -Dnewman.server.web-folder-path=../web -jar \ ../target/newman-server-1.0.jar 2>&1 > /tmp/newman.log diff --git a/newman-server/pom.xml b/newman-server/pom.xml index 4dbf433e..81f7e602 100644 --- a/newman-server/pom.xml +++ b/newman-server/pom.xml @@ -11,6 +11,11 @@ newman-server jar + + ${maven.build.timestamp} + yyyy-MM-dd/HH:mm + + snapshot-repository.java.net @@ -59,14 +64,6 @@ org.glassfish.jersey.security oauth2-client - - org.mongodb - mongo-java-driver - - - org.mongodb.morphia - morphia-logging-slf4j - org.slf4j jul-to-slf4j @@ -95,6 +92,7 @@ src/main/resources + true . diff --git a/newman-server/src/main/java/com/gigaspaces/newman/BuildVersionProvider.java b/newman-server/src/main/java/com/gigaspaces/newman/BuildVersionProvider.java new file mode 100644 index 00000000..11535d35 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/BuildVersionProvider.java @@ -0,0 +1,28 @@ +package com.gigaspaces.newman; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public class BuildVersionProvider { + + private static final String VERSION; + + static { + String version = "unknown"; + try (InputStream is = BuildVersionProvider.class.getResourceAsStream("/version.properties")) { + if (is != null) { + Properties props = new Properties(); + props.load(is); + version = props.getProperty("version", version); + } + } catch (IOException e) { + // log if needed + } + VERSION = version; + } + + public static String getVersion() { + return VERSION; + } +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/NewmanResource.java b/newman-server/src/main/java/com/gigaspaces/newman/NewmanResource.java index b9ade19a..942c8545 100644 --- a/newman-server/src/main/java/com/gigaspaces/newman/NewmanResource.java +++ b/newman-server/src/main/java/com/gigaspaces/newman/NewmanResource.java @@ -3,31 +3,38 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.gigaspaces.newman.beans.*; -import com.gigaspaces.newman.beans.criteria.Criteria; +import com.gigaspaces.newman.beans.atomic.AtomicUpdater; import com.gigaspaces.newman.beans.criteria.*; -import com.gigaspaces.newman.config.Config; -import com.gigaspaces.newman.dao.*; +import com.gigaspaces.newman.beans.repository.*; +import com.gigaspaces.newman.beans.specification.BuildSpecifications; +import com.gigaspaces.newman.beans.specification.JobSpecifications; +import com.gigaspaces.newman.beans.specification.TestSpecifications; +import com.gigaspaces.newman.config.JpaConfig; +import com.gigaspaces.newman.dto.BuildDTO; +import com.gigaspaces.newman.dto.BuildsComparisonDTO; +import com.gigaspaces.newman.dto.PSuiteDTO; +import com.gigaspaces.newman.entities.*; +import com.gigaspaces.newman.projections.*; import com.gigaspaces.newman.utils.FileUtils; -import com.mongodb.MongoClient; -import com.mongodb.MongoInterruptedException; -import com.mongodb.client.DistinctIterable; -import com.mongodb.client.MongoCollection; -import com.mongodb.client.MongoDatabase; -import com.mongodb.client.model.Filters; -import org.bson.conversions.Bson; -import org.bson.types.ObjectId; +import com.gigaspaces.newman.utils.StringUtils; import org.glassfish.jersey.media.multipart.ContentDisposition; import org.glassfish.jersey.media.multipart.FormDataBodyPart; import org.glassfish.jersey.media.multipart.FormDataMultiPart; -import org.mongodb.morphia.Datastore; -import org.mongodb.morphia.Morphia; -import org.mongodb.morphia.query.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; import javax.annotation.security.PermitAll; import javax.annotation.security.RolesAllowed; import javax.inject.Singleton; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; import javax.servlet.ServletContext; import javax.ws.rs.*; import javax.ws.rs.client.Entity; @@ -40,8 +47,12 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; @@ -49,6 +60,8 @@ import java.util.zip.ZipFile; import java.util.zip.ZipInputStream; +import static com.gigaspaces.newman.beans.specification.JobSpecifications.hasPreparingAgents; + /** * Created by Barak Bar Orion * 4/16/15. @@ -80,18 +93,16 @@ public class NewmanResource { private int highestPriorityJob; - private final MongoClient mongoClient; - private final JobDAO jobDAO; - private final TestDAO testDAO; - private final BuildDAO buildDAO; - private final AgentDAO agentDAO; - private final SuiteDAO suiteDAO; - private final PrioritizedJobDAO prioritizedJobDAO; - private final JobConfigDAO jobConfigDAO; - private final FutureJobDAO futureJobDAO; - private final BuildsCacheDAO buildsCacheDAO; - private final Config config; - private static final String SERVER_TESTS_UPLOAD_LOCATION_FOLDER = "tests-logs"; + private final JobRepository jobRepository; + private final TestRepository testRepository; + private final BuildRepository buildRepository; + private final AgentRepository agentRepository; + private final SuiteRepository suiteRepository; + private final PrioritizedJobRepository prioritizedJobRepository; + private final JobConfigRepository jobConfigRepository; + private final FutureJobRepository futureJobRepository; + private final BuildsCacheRepository buildsCacheRepository; + private static final String SERVER_TESTS_UPLOAD_LOCATION_FOLDER = System.getProperty("newman.tests-logs-path", "tests-logs"); private static final String SERVER_JOBS_UPLOAD_LOCATION_FOLDER = "job-setup-logs"; private static final String SERVER_CACHE_BUILDS_FOLDER = "builds"; @@ -102,7 +113,6 @@ public class NewmanResource { private ConcurrentHashMap offlineAgents = new ConcurrentHashMap<>(); private static final int maxJobsPerSuite = 5; - private final DistinctIterable distinctTestsByAssignedAgentFilter; private final static String CRITERIA_PROP_NAME = "criteria"; @@ -112,6 +122,7 @@ public class NewmanResource { private static String HTTP_WEB_ROOT_PATH; private static String HTTPS_WEB_ROOT_PATH; + private static final Object subscribeToJobLock = new Object(); private static final Object takenTestLock = new Object(); private static final Object changeJobPriorityLock = new Object(); private final AtomicLong latestLogSize = new AtomicLong(0); @@ -119,56 +130,63 @@ public class NewmanResource { private final Object serverStatusLock = new Object(); - private ServerStatus serverStatus = new ServerStatus(ServerStatus.Status.RUNNING); + private final ServerStatus serverStatus = new ServerStatus(ServerStatus.Status.RUNNING); private Thread serverSuspendThread; + private static final ExecutorService executor = Executors.newCachedThreadPool(); + private final ApplicationContext context; + public NewmanResource(@Context ServletContext servletContext) { - this.config = Config.fromString(servletContext.getInitParameter("config")); - //noinspection SpellCheckingInspection - mongoClient = new MongoClient(config.getMongo().getHost()); - Morphia morphia = initMorphia(); - Datastore ds = morphia.createDatastore(mongoClient, config.getMongo().getDb()); - ds.ensureIndexes(); - ds.ensureCaps(); - jobDAO = new JobDAO(morphia, mongoClient, config.getMongo().getDb()); - testDAO = new TestDAO(morphia, mongoClient, config.getMongo().getDb()); - buildDAO = new BuildDAO(morphia, mongoClient, config.getMongo().getDb()); - agentDAO = new AgentDAO(morphia, mongoClient, config.getMongo().getDb()); - suiteDAO = new SuiteDAO(morphia, mongoClient, config.getMongo().getDb()); - futureJobDAO = new FutureJobDAO(morphia, mongoClient, config.getMongo().getDb()); - buildsCacheDAO = new BuildsCacheDAO(morphia, mongoClient, config.getMongo().getDb()); - jobConfigDAO = new JobConfigDAO(morphia, mongoClient, config.getMongo().getDb()); - prioritizedJobDAO = new PrioritizedJobDAO(morphia, mongoClient, config.getMongo().getDb()); + this.context = new AnnotationConfigApplicationContext(JpaConfig.class); - MongoDatabase db = mongoClient.getDatabase(config.getMongo().getDb()); - MongoCollection testCollection = db.getCollection("Test"); - distinctTestsByAssignedAgentFilter = testCollection.distinct("assignedAgent", String.class); + // Initialize DAOs with the Datastore + jobRepository = context.getBean(JobRepository.class); + testRepository = context.getBean(TestRepository.class); + buildRepository = context.getBean(BuildRepository.class); + agentRepository = context.getBean(AgentRepository.class); + suiteRepository = context.getBean(SuiteRepository.class); + futureJobRepository = context.getBean(FutureJobRepository.class); + buildsCacheRepository = context.getBean(BuildsCacheRepository.class); + jobConfigRepository = context.getBean(JobConfigRepository.class); + prioritizedJobRepository = context.getBean(PrioritizedJobRepository.class); - highestPriorityJob = getHighestPriorityJob(); + highestPriorityJob = getNotPausedHighestPriorityJob(); if (Boolean.getBoolean("production")) { // This is set to true in the newman server timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { - logger.info("Checking for not seen agents"); - getAgentsNotSeenInLastMillis(1000 * 60 * 3).forEach(NewmanResource.this::handleUnseenAgent); + try { + logger.info("[Automated Task] Checking for not seen agents"); + getAgentsNotSeenInLastMillis(1000 * 60 * 5).forEach(NewmanResource.this::handleUnseenAgent); + } catch (Exception e) { + logger.error("[Automated Task] Error checking for unseen agents", e); + } } }, 1000 * 30, 1000 * 30); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { - logger.info("Checking for zombie agents"); - getZombieAgents(1000 * 60 * 20).forEach(NewmanResource.this::handleZombieAgent); + try { + logger.info("[Automated Task] Checking for zombie agents"); + getZombieAgents(1000 * 60 * 20).forEach(NewmanResource.this::handleZombieAgent); + } catch (Exception e) { + logger.error("[Automated Task] Error checking for zombie agents", e); + } } }, 1000 * 30, 1000 * 30); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { - handleHangingJob(); + try { + handleHangingJob(); + } catch (Exception e) { + logger.error("[Automated Task] Error handling hanging jobs", e); + } } - }, 1000 * 30, 1000 * 30); + }, 1000 * 10, 1000 * 10); } initBuildsCache(); @@ -176,6 +194,11 @@ public void run() { initWebRootsPath(); } + private AtomicUpdater getUpdater(Class clazz) { + EntityManager em = context.getBean(EntityManagerFactory.class).createEntityManager(); + return context.getBean(AtomicUpdater.class, clazz, em); + } + private void handleHangingJob() { Job potentialJob = getPotentialJob(); if (potentialJob == null) { @@ -198,23 +221,26 @@ private boolean handleSetupProblem(Job potentialJob) { return false; } - private void updateBrokenJob(Job potentialJob) { + public void updateBrokenJob(Job potentialJob) { potentialJob.setState(State.BROKEN); updateJob(potentialJob.getId(), potentialJob); if (potentialJob.getPriority() > 0) { deletePrioritizedJob(potentialJob); } - UpdateOperations buildUpdateOperations = buildDAO.createUpdateOperations(); - buildUpdateOperations.inc("buildStatus.brokenJobs").dec("buildStatus.runningJobs"); - buildDAO.getDatastore().findAndModify(buildDAO.createIdQuery(potentialJob.getBuild().getId()), buildUpdateOperations); + + AtomicUpdater buildStatusUpdater = getUpdater(BuildStatus.class); + buildStatusUpdater + .inc("brokenJobs") + .dec("runningJobs") + .whereId(potentialJob.getBuild().getBuildStatus().getId()).execute(); } - private boolean handleZombie(Job potentialJob) { + public boolean handleZombie(Job potentialJob) { if (potentialJob.getLastTimeZombie() == null) { if (isZombie(potentialJob)) { // job not running and zombie - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations(); - updateJobStatus.set("lastTimeZombie", new Date()); - jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(potentialJob.getId()), updateJobStatus); + getUpdater(Job.class) + .set("lasttimezombie", new Date()) + .whereId(potentialJob.getId()).execute(); return true; } } else { // already seen as zombie @@ -246,29 +272,13 @@ private boolean isTimeExpired(long startTimeMilliseconds, int timeToPass, TimeUn } private Job getPotentialJob() { - Set allCapabilities = allNecessaryCapabilities(); - Query basicDummyQuery = basicJobQuery(); - return findJob(allCapabilities, basicDummyQuery, null); + return findJob(allRequirements(), null, null); } - private Query basicJobQuery() { - Query basicDummyQuery = jobDAO.createQuery(); - basicDummyQuery.or(basicDummyQuery.criteria("state").equal(State.READY), basicDummyQuery.criteria("state").equal(State.RUNNING)); - basicDummyQuery.where("(this.totalTests + this.numOfTestRetries) != (this.passedTests + this.failedTests + this.runningTests)"); - basicDummyQuery.order("submitTime"); - return basicDummyQuery; - } + private Set allRequirements() { + Set allRequirements = suiteRepository.findAllRequirements(); - private Set allNecessaryCapabilities() { - // create capabilities from requirements, because might be requirements without suitable agents - Query suitesQuery = suiteDAO.createQuery(); - suitesQuery.retrievedFields(true, "requirements"); - QueryResults suites = suiteDAO.find(suitesQuery); - Set allCapabilities = new HashSet<>(); - for (Suite suite : suites) { - allCapabilities.addAll(suite.getRequirements()); - } - return allCapabilities; + return allRequirements; } private boolean tooLongPrepareTime(Job potentialJob, int maxPrepareTimeHours) { @@ -290,32 +300,24 @@ private boolean tooLongPrepareTime(Job potentialJob, int maxPrepareTimeHours) { } private boolean isZombie(Job job) { - QueryResults agents = agentDAO.find(agentDAO.createQuery()); + Iterable agents = agentRepository.findAll(); // Retrieve all agents from DB // check if there is an agent in the system that can execute this job for (Agent agent : agents) { - if ((job.getSuite().getRequirements().isEmpty() - || job.getSuite().getRequirements() == null - || agent.getCapabilities().containsAll(job.getSuite().getRequirements())) - && (job.getAgentGroups() == null - || job.getAgentGroups().isEmpty() - || job.getAgentGroups().contains(agent.getGroupName()))) { - return false; + boolean hasMatchingCapabilities = (job.getSuite().getRequirements() == null + || job.getSuite().getRequirements().isEmpty() + || agent.getCapabilities().containsAll(job.getSuite().getRequirements())); + + boolean hasMatchingAgentGroup = (job.getAgentGroups() == null + || job.getAgentGroups().isEmpty() + || job.getAgentGroups().contains(agent.getGroupName())); + + if (hasMatchingCapabilities && hasMatchingAgentGroup) { + return false; // Found matching agent, so not a zombie } } return true; } - private Morphia initMorphia() { - Morphia morphia; - try { - morphia = new Morphia().mapPackage("com.gigaspaces.newman.beans.criteria").mapPackage("com.gigaspaces.newman.beans"); - } catch (Exception e) { - logger.error("failed to init morphia", e); - throw e; - } - return morphia; - } - private void initWebRootsPath() { if (HTTP_WEB_ROOT_PATH == null && HTTPS_WEB_ROOT_PATH == null) { String address = System.getProperty("newman.server.address"); @@ -334,9 +336,9 @@ private void initWebRootsPath() { } private void initBuildsCache() { - BuildsCache found = buildsCacheDAO.findOne(buildsCacheDAO.createQuery()); - if (found == null) { - buildsCacheDAO.save(new BuildsCache()); + long buildsCacheCount = buildsCacheRepository.count(); // Assuming there's an ID for the cache, adjust as necessary + if (buildsCacheCount == 0) { + buildsCacheRepository.save(new BuildsCache()); } } @@ -346,12 +348,18 @@ private void initBuildsCache() { public String updateSha() { logger.info("updating SHA for all tests ..."); int records = 0; - Query query = testDAO.createQuery(); - for (Test test : testDAO.find(query)) { + // Find all tests + Iterable tests = testRepository.findAll(); + + for (Test test : tests) { if (test.getSha() == null) { Job job = getJob(test.getJobId()); - UpdateOperations ops = testDAO.createUpdateOperations().set("sha", Sha.compute(test.getName(), test.getArguments(), job.getSuite().getId(), job.getBuild().getBranch())); - testDAO.updateFirst(testDAO.createIdQuery(test.getId()), ops); + // Compute the SHA + String sha = Sha.compute(test.getName(), test.getArguments(), job.getSuite().getId(), job.getBuild().getBranch()); + // Update the SHA in the Test entity + test.setSha(sha); + testRepository.save(test); // Persist the updated Test entity + ++records; } } @@ -368,9 +376,12 @@ public Batch jobsView(@DefaultValue("0") @QueryParam("offset") int offs , @QueryParam("buildId") String buildId , @QueryParam("all") boolean all , @QueryParam("orderBy") List orderBy + , @QueryParam("fromDate") String fromDateStr , @Context UriInfo uriInfo) { - List jobs = retrieveJobs(buildId, orderBy, all, offset, limit, true); + Date fromDate = parseDate(fromDateStr); + + List jobs = retrieveJobs(buildId, orderBy, all, offset, limit, fromDate); List jobViews = new ArrayList<>(jobs.size()); for (Job job : jobs) { @@ -382,32 +393,27 @@ public Batch jobsView(@DefaultValue("0") @QueryParam("offset") int offs @GET @Path("all-builds-and-suites") @Produces(MediaType.APPLICATION_JSON) - public AllSuitesAndBuilds getAllBuildsAndSuites() { - - List suites = getAllThinSuites(true);// suiteDAO.find( suitesQuery ).asList(); + public AllSuitesAndBuildsView getAllBuildsAndSuites() { + List suites = getThinSuites(true); List suiteViews = new ArrayList<>(suites.size()); - for (Suite suite : suites) { + for (PSuiteThin suite : suites) { suiteViews.add(new SuiteView(suite)); } - List builds = getThinBuilds(); - int buildsCount = builds.size(); - List buildViews = new ArrayList<>(buildsCount); - for (Build build : builds) { - buildViews.add(new BuildView(build)); + List buildProjections = getThinBuilds(); + List buildViews = new ArrayList<>(buildProjections.size()); + for (PBuildThin buildProjection : buildProjections) { + buildViews.add(new BuildView(buildProjection)); } - return new AllSuitesAndBuilds(buildViews, suiteViews); + return new AllSuitesAndBuildsView(buildViews, suiteViews); } - private List getThinBuilds() { + private List getThinBuilds() { final int buildsLimit = 30; - Query buildsQuery = buildDAO.createQuery(); + Pageable pageable = PageRequest.of(0, buildsLimit, Sort.by(Sort.Order.desc("buildTime"))); - buildsQuery.retrievedFields(true, "id", "name", "branch", "tags"); - buildsQuery.order("-buildTime").limit(buildsLimit); - List builds = buildDAO.find(buildsQuery).asList(); - return builds; + return buildRepository.findThinBuilds(pageable).getContent(); } @@ -421,7 +427,7 @@ public Batch jobs(@DefaultValue("0") @QueryParam("offset") int offset, , @QueryParam("orderBy") List orderBy , @Context UriInfo uriInfo) { - List jobs = retrieveJobs(buildId, orderBy, all, offset, limit, false); + List jobs = retrieveJobs(buildId, orderBy, all, offset, limit, null); return new Batch<>(jobs, offset, limit, all, orderBy, uriInfo); } @@ -429,71 +435,57 @@ public Batch jobs(@DefaultValue("0") @QueryParam("offset") int offset, @Path("job/running") @Produces(MediaType.TEXT_PLAIN) public String getRunningJobs() { - Query query = jobDAO.createQuery(); - query.or(query.criteria("state").equal("READY"), query.criteria("state").equal("RUNNING")); - query.and(query.criteria("totalTests").greaterThan(0)); - return String.valueOf(jobDAO.find(query).asList().size()); + Long jobCount = jobRepository.countReadyAndRunningJobs(); + return jobCount.toString(); } - private List retrieveJobs(String buildId, List orderBy, boolean all, int offset, int limit, boolean returnThinObjects) { - - Query query = jobDAO.createQuery(); - if (buildId != null) { - query.field("build.id").equal(buildId); - } - if (orderBy != null) { - orderBy.forEach(query::order); - } - if (!all) { - query.offset(offset).limit(limit); - } + private List retrieveJobs(String buildId, List orderBy, boolean all, int offset, int limit, Date fromDate) { + Sort sort = convertOrderByToSort(orderBy); + // Pageable for pagination (if not 'all') + Pageable pageable = all + ? Pageable.unpaged() // If 'all' is true, no limit, fetch all + : convertOffsetLimitToPage(offset, limit, sort); - if (returnThinObjects) { - addRequiredJobTableColumns(query); + // If no date provided, use classic behavior + if (fromDate == null) { + return (buildId != null) + ? jobRepository.findByBuildId(buildId, pageable).getContent() + : jobRepository.findAll(pageable).getContent(); } - return jobDAO.find(query).asList(); - } - - - private void addRequiredBuildTableColumns(Query query) { - query.retrievedFields(false, "resources", "testsMetadata", "shas", "tags"); + // If date is provided, use date filtering + return jobRepository.findAllFromDate(fromDate, pageable).getContent(); } - private void addRequiredJobTableColumns(Query query) { - query.retrievedFields(true, "id", "build.id", "build.name", "build.branch", "suite.id", "suite.name", "jobConfig.id", "jobConfig.name", - "submitTime", "startTime", "endTime", "testURI", "submittedBy", "state", "totalTests", - "passedTests", "failedTests", "failed3TimesTests", "runningTests", "numOfTestRetries", "preparingAgents", "agentGroups", "priority"); - } - - @GET @Path("futureJob") @Produces(MediaType.APPLICATION_JSON) public FutureJob getAndDeleteFutureJob(@Context UriInfo uriInfo) { checkServerStatus(); - Query query = futureJobDAO.createQuery(); - query.order("submitTime"); - FutureJob futureJob = futureJobDAO.findOne(query); - if (futureJob != null) { - Datastore datastore = futureJobDAO.getDatastore(); - datastore.findAndDelete(query); + Optional opFutureJob = futureJobRepository.findFirstByOrderBySubmitTimeAsc(); + if (opFutureJob.isPresent()) { + FutureJob futureJob = opFutureJob.get(); + futureJobRepository.deleteById(futureJob.getId()); + broadcastMessage(DELETED_FUTURE_JOB, futureJob); + + return futureJob; } - return futureJob; + + return null; } @DELETE @Path("deleteFutureJob/{futureJobId}") @Produces(MediaType.APPLICATION_JSON) public Response deleteFutureJob(final @PathParam("futureJobId") String futureJobId) { + Optional opFutureJob = futureJobRepository.findById(futureJobId); + + if (opFutureJob.isPresent()) { + FutureJob futureJob = opFutureJob.get(); + futureJobRepository.deleteById(futureJob.getId()); - Query query = futureJobDAO.createIdQuery(futureJobId); - FutureJob futureJob = futureJobDAO.findOne(query); - if (futureJob != null) { - Datastore datastore = futureJobDAO.getDatastore(); - datastore.findAndDelete(query); broadcastMessage(DELETED_FUTURE_JOB, futureJob); } @@ -504,14 +496,14 @@ public Response deleteFutureJob(final @PathParam("futureJobId") String futureJob @Path("job/{id}") @Produces(MediaType.APPLICATION_JSON) public Job getJob(@PathParam("id") final String id) { + Job job = null; + Optional opJob = jobRepository.findById(id); + if (opJob.isPresent()) { + job = opJob.get(); - Job job = findOneJobById(id); - if (job != null) { - Bson jobIdFilter = Filters.eq("jobId", id); long filterTestsStart = System.currentTimeMillis(); - DistinctIterable assignedAgents = distinctTestsByAssignedAgentFilter.filter(jobIdFilter); - //noinspection unchecked - Set agents = (Set) assignedAgents.into(new HashSet<>()); + // Fetch distinct agents assigned to the job from Test entities + Set agents = testRepository.findDistinctAssignedAgentByJobId(id); job.setAgents(agents); long filterTestsEnd = System.currentTimeMillis(); @@ -523,23 +515,11 @@ public Job getJob(@PathParam("id") final String id) { return job; } - private Job findOneJobById(String jobId) { - Query query = jobDAO.createQuery(); - return jobDAO.findOne(query.field("_id").equal(new ObjectId(jobId))); - } - - private Job findOneThinJobById(String jobId) { - Query query = jobDAO.createQuery(); - query.retrievedFields(true, "id", "suite.id", "suite.name", "build.id", "build.name", "build.branch"); - return jobDAO.findOne(query.field("_id").equal(new ObjectId(jobId))); - } - - @DELETE @Path("jobs/{nubmerOfDaysToNotDelete}") @Produces(MediaType.TEXT_PLAIN) @Consumes(MediaType.TEXT_PLAIN) - public String deleteJobUntilDesiredSpace(final @PathParam("nubmerOfDaysToNotDelete") String nubmerOfDaysToNotDelete) throws InterruptedException { + public String deleteJobUntilDesiredSpace(final @PathParam("nubmerOfDaysToNotDelete") String nubmerOfDaysToNotDelete) { int numberOfDays = Integer.parseInt(nubmerOfDaysToNotDelete); Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, -numberOfDays); @@ -550,36 +530,29 @@ public String deleteJobUntilDesiredSpace(final @PathParam("nubmerOfDaysToNotDele int jobsDeleted = 0; int buildsDeleted = 0; - //old jobs - Query query = jobDAO.createQuery(); - query.field("submitTime").lessThan(deleteUntilDate); - List jobs = jobDAO.find(query).asList(); + // delete old jobs + // Get jobs that should be deleted (submitTime < deleteUntilDate and state != RUNNING) + List jobs = jobRepository.findBySubmitTimeBeforeAndStateNot(deleteUntilDate, State.RUNNING); // find ALL with 'submitTime' less than 'deleteUntilDate' and not 'RUNNING' for (Job job : jobs) { - if (job.getState().equals(State.RUNNING)) { - continue; - } - deleteJob(job.getId()); + deleteJob(job.getId()); // delete JOB jobsDeleted++; - if (null != performDeleteBuild(job.getBuild().getId())) { - buildsDeleted++; - } + + buildRepository.deleteById(job.getBuild().getId()); // delete related BUILD as well + buildsDeleted++; + if (logger.isDebugEnabled()) { logger.debug("deleted job: " + job.getId() + " with build time " + job.getBuild().getBuildTime()); } } - //old builds without jobs - Query filteredQuery = buildDAO.createQuery().field("buildTime").lessThan(deleteUntilDate); - List buildList = buildDAO.find(filteredQuery).asList(); + //delete old builds without jobs + List buildList = buildRepository.findByBuildTimeBefore(deleteUntilDate); for (Build build : buildList) { - Query queryJobs = jobDAO.createQuery(); - queryJobs.field("build.id").equal(build.getId()); - List jobList = jobDAO.find(queryJobs).asList(); + List jobList = jobRepository.findAllByBuildId(build.getId()); if (jobList.isEmpty()) { logger.debug("No jobs for build, delete build: " + build.getId() + " with build time: " + build.getBuildTime()); - if (null != performDeleteBuild(build.getId())) { - buildsDeleted++; - } + buildRepository.deleteById(build.getId()); + buildsDeleted++; } } @@ -595,49 +568,61 @@ public String deleteJobUntilDesiredSpace(final @PathParam("nubmerOfDaysToNotDele public Response createJob(JobRequest jobRequest, @Context SecurityContext sc) { checkServerStatus(); - Build build = buildDAO.findOne(buildDAO.createIdQuery(jobRequest.getBuildId())); - JobConfig jobConfig = jobConfigDAO.findOne(jobConfigDAO.createIdQuery(jobRequest.getConfigId())); - Suite suite = null; + Optional opBuild = buildRepository.findById(jobRequest.getBuildId()); + if (!opBuild.isPresent()) { + return Response.status(Response.Status.NOT_FOUND).build(); + } + Optional opSuite = Optional.empty(); if (jobRequest.getSuiteId() != null) { - suite = suiteDAO.findOne(suiteDAO.createIdQuery(jobRequest.getSuiteId())); + opSuite = suiteRepository.findById(jobRequest.getSuiteId()); } - if (suite == null) { + + if (!opSuite.isPresent()) { return Response.status(Response.Status.BAD_REQUEST).entity("invalid suite id for Job request: " + jobRequest).build(); } - if (build != null) { - Job job = new Job(); - job.setBuild(build); - job.setSuite(suite); - job.setState(State.READY); - job.setSubmitTime(new Date()); - job.setSubmittedBy(jobRequest.getAuthor()); - job.setAgentGroups(jobRequest.getAgentGroups()); - job.setPriority(jobRequest.getPriority()); - if (jobConfig != null) { - job.setJobConfig(jobConfig); - } - jobDAO.save(job); - if (job.getPriority() > 0) { - createPrioritizedJob(job); - } - UpdateOperations buildUpdateOperations = buildDAO.createUpdateOperations().inc("buildStatus.totalJobs") - .inc("buildStatus.pendingJobs") - .add("buildStatus.suitesIds", suite.getId(), false) - .add("buildStatus.suitesNames", suite.getName(), false); - build = buildDAO.getDatastore().findAndModify(buildDAO.createIdQuery(build.getId()), buildUpdateOperations); - broadcastMessage(CREATED_JOB, job); - broadcastMessage(MODIFIED_BUILD, build); - return Response.ok(job).build(); - } else { - return Response.status(Response.Status.NOT_FOUND).build(); + AtomicUpdater buildStatusUpdater = getUpdater(BuildStatus.class); + int updated = buildStatusUpdater + .inc("totalJobs") + .inc("pendingJobs") + .whereId(opBuild.get().getBuildStatus().getId()).execute(); + + if (updated == 0) { + return Response.serverError().build(); + } + + Build build = buildRepository.findById(jobRequest.getBuildId()).get(); + build.getBuildStatus().getSuites().add(new BuildStatusSuite(opSuite.get().getId(), opSuite.get().getName())); + + buildRepository.saveAndFlush(build); + + Optional opJobConfig = jobConfigRepository.findById(jobRequest.getConfigId()); + + Job job = new Job(); + job.setBuild(build); + job.setSuite(opSuite.get()); + job.setState(State.READY); + job.setSubmitTime(new Date()); + job.setSubmittedBy(jobRequest.getAuthor()); + job.setAgentGroups(jobRequest.getAgentGroups()); + job.setPriority(jobRequest.getPriority()); + if (opJobConfig.isPresent()) { + job.setJobConfig(opJobConfig.get()); } + job = jobRepository.saveAndFlush(job); + if (job.getPriority() > 0) { + createPrioritizedJob(job); + } + + broadcastMessage(CREATED_JOB, job); + broadcastMessage(MODIFIED_BUILD, build); + return Response.ok(job).build(); } private void createPrioritizedJob(Job job) { PrioritizedJob prioritizedJob = new PrioritizedJob(job); - prioritizedJobDAO.save(prioritizedJob); + prioritizedJobRepository.saveAndFlush(prioritizedJob); if (job.getPriority() > highestPriorityJob) { highestPriorityJob = job.getPriority(); logger.info("Highest Priority of jobs changed to: " + highestPriorityJob); @@ -648,9 +633,7 @@ private void createPrioritizedJob(Job job) { @Path("futureJob") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public List createFutureJobs( - FutureJobsRequest futureJobsRequest, - @Context SecurityContext sc) { + public List createFutureJobs(FutureJobsRequest futureJobsRequest, @Context SecurityContext sc) { checkServerStatus(); String authorOpt = futureJobsRequest.getAuthor(); @@ -664,30 +647,27 @@ public List createFutureJobs( int priority = futureJobsRequest.getPriority(); if (buildId != null) { - build = buildDAO.findOne(buildDAO.createIdQuery(buildId)); - if (build == null) { - throw new BadRequestException("invalid build id in create FutureJob: " + buildId); - } + Optional opBuild = buildRepository.findById(buildId); + build = opBuild.orElseThrow(() -> new BadRequestException("invalid build id in create FutureJob: " + buildId)); + } if (configId != null) { - jobConfig = jobConfigDAO.findOne(jobConfigDAO.createIdQuery(configId)); - if (jobConfig == null) { - throw new BadRequestException("invalid config id in create FutureJob: " + configId); - } + Optional opJobConfig = jobConfigRepository.findById(configId); + jobConfig = opJobConfig.orElseThrow(() -> new BadRequestException("invalid config id in create FutureJob: " + configId)); } - List response = new ArrayList(); + List response = new ArrayList<>(); if (!suites.isEmpty()) { for (String suiteId : suites) { - Suite suite = suiteDAO.findOne(suiteDAO.createIdQuery(suiteId)); - if (suite == null) { - throw new BadRequestException("invalid suite id in create FutureJob: " + suiteId); - } + Suite suite = suiteRepository.findById(suiteId).orElseThrow(() + -> new BadRequestException("invalid suite id in create FutureJob: " + suiteId)); //noinspection ConstantConditions - FutureJob futureJob = new FutureJob(build.getId(), build.getName(), build.getBranch(), suite.getId(), suite.getName(), jobConfig.getId(), jobConfig.getName(), author, agentGroups, priority); + FutureJob futureJob = new FutureJob(build.getId(), build.getName(), build.getBranch(), + suite.getId(), suite.getName(), jobConfig.getId(), jobConfig.getName(), + author, agentGroups, priority); response.add(futureJob); - futureJobDAO.save(futureJob); + futureJobRepository.saveAndFlush(futureJob); broadcastMessage(CREATE_FUTURE_JOB, futureJob); } @@ -699,11 +679,11 @@ public List createFutureJobs( @POST @Path("job/{id}/toggle") @Produces(MediaType.APPLICATION_JSON) - public Job toggelJobPause(@PathParam("id") final String id) { - Job job = findOneJobById(id); - if (job != null) { + public Job toggleJobPause(@PathParam("id") final String id) { + Optional opJob = jobRepository.findById(id); + if (opJob.isPresent()) { + Job job = opJob.get(); State state = null; - State old = job.getState(); switch (job.getState()) { case READY: case RUNNING: @@ -716,79 +696,87 @@ public Job toggelJobPause(@PathParam("id") final String id) { break; } if (state != null) { - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations().set("state", state); - if (state.equals(State.PAUSED)) { + AtomicUpdater jobUpdater = getUpdater(Job.class); + jobUpdater.set("state", state); + + if (state == State.PAUSED) { // remove startPrepareTime after turn job to paused because after pause agents do setup again on job - updateJobStatus.unset("startPrepareTime"); - if (job.getPriority() > 0) { - UpdateOperations updatePrioritizedJobStatus = prioritizedJobDAO.createUpdateOperations().set("isPaused", true); - PrioritizedJob prioritizedJob = prioritizedJobDAO.getDatastore().findAndModify(prioritizedJobDAO.createQuery().field("jobId").equal(job.getId()), updatePrioritizedJobStatus); - if (prioritizedJob.getPriority() == highestPriorityJob) { - highestPriorityJob = getHighestPriorityJob(); - } - } + jobUpdater.set("startPrepareTime", null); } - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(job.getId()).field("state").equal(old), updateJobStatus); - broadcastMessage(MODIFIED_JOB, job); - //change status of Test(s) from running to pending - if (state == State.READY) { - Query query = testDAO.createQuery(); - query.and(query.criteria("jobId").equal(id), query.criteria("status").equal(Test.Status.RUNNING)); - UpdateOperations updateOps = testDAO.createUpdateOperations().set("status", Test.Status.PENDING); + managePrioritizedJob(job.getId(), job.getPriority(), state == State.PAUSED); + int updated = jobUpdater.whereId(job.getId()).execute(); + if (updated == 0) { + logger.error("Job {} cannot be updated", id); + return null; + } - UpdateResults update = testDAO.getDatastore().update(query, updateOps); - logger.info("---ToggleJobPause, state is READY, affected count:" + update.getUpdatedCount()); + job = jobRepository.findById(id).get(); + broadcastMessage(MODIFIED_JOB, job); - if (job.getPriority() > 0) { - UpdateOperations updatePrioritizedJobStatus = prioritizedJobDAO.createUpdateOperations().set("isPaused", false); - PrioritizedJob prioritizedJob = prioritizedJobDAO.getDatastore().findAndModify(prioritizedJobDAO.createQuery().field("jobId").equal(job.getId()), updatePrioritizedJobStatus); - if (prioritizedJob.getPriority() > highestPriorityJob) { - highestPriorityJob = prioritizedJob.getPriority(); - } - } - } return job; } } return null; } + private void managePrioritizedJob(String jobId, int jobPriority, boolean isPaused) { + if (jobPriority > 0) { + Optional opPrioritizedJob = prioritizedJobRepository.findByJobId(jobId); + PrioritizedJob prioritizedJob = opPrioritizedJob.orElseThrow(() -> new RuntimeException("PrioritizedJob [" + jobId + "] does not exist")); + AtomicUpdater prioritizedJobUpdater = getUpdater(PrioritizedJob.class).set("isPaused", isPaused); + + int updated = prioritizedJobUpdater.whereId(prioritizedJob.getId()).execute(); + if (updated == 0) { + logger.error("PrioritizedJob {} cannot be updated", prioritizedJob.getId()); + return; + } + prioritizedJob = prioritizedJobRepository.findByJobId(jobId).get(); + boolean priorityConditionTrue = isPaused + ? prioritizedJob.getPriority() == highestPriorityJob + : prioritizedJob.getPriority() > highestPriorityJob; + + if (priorityConditionTrue) { + highestPriorityJob = isPaused + ? getNotPausedHighestPriorityJob() + : prioritizedJob.getPriority(); + } + } + } + @POST @Path("jobs/pause") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public synchronized List toggelMultipleJobPause(final List ids) { + public synchronized List toggleMultipleJobPause(final List ids) { List result = new ArrayList<>(ids.size()); for (String id : ids) { - Job job = findOneJobById(id); - if (job != null) { + Optional opJob = jobRepository.findById(id); + if (opJob.isPresent()) { + Job job = opJob.get(); State state = null; - State old = job.getState(); switch (job.getState()) { case READY: case RUNNING: state = State.PAUSED; break; case PAUSED: - break; case DONE: break; } - if (state != null) { - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations().set("state", state); - if (state.equals(State.PAUSED)) { - // remove startPrepareTime after turn job to paused because after pause agents do setup again on job - updateJobStatus.unset("startPrepareTime"); - if (job.getPriority() > 0) { - UpdateOperations updatePrioritizedJobStatus = prioritizedJobDAO.createUpdateOperations().set("isPaused", true); - PrioritizedJob prioritizedJob = prioritizedJobDAO.getDatastore().findAndModify(prioritizedJobDAO.createQuery().field("jobId").equal(job.getId()), updatePrioritizedJobStatus); - if (prioritizedJob.getPriority() == highestPriorityJob) { - highestPriorityJob = getHighestPriorityJob(); - } - } + if (state == State.PAUSED) { + AtomicUpdater jobUpdater = getUpdater(Job.class) + .set("state", State.PAUSED) + .set("startPrepareTime", null); // remove startPrepareTime after turn job to paused because after pause agents do setup again on job + + managePrioritizedJob(job.getId(), job.getPriority(), true); + int updated = jobUpdater.whereId(job.getId()).execute(); + if (updated == 0) { + logger.error("Job {} cannot be updated during bulk PAUSE process", id); + continue; } - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(job.getId()).field("state").equal(old), updateJobStatus); + + job = jobRepository.findById(job.getId()).get(); result.add(job); broadcastMessage(MODIFIED_JOB, job); } @@ -801,59 +789,51 @@ public synchronized List toggelMultipleJobPause(final List ids) { @Path("job/{jobId}") @Produces(MediaType.APPLICATION_JSON) public Job AgentFinishJob(@PathParam("jobId") final String jobId) { - Job job = jobDAO.findOne(jobDAO.createIdQuery(jobId)); - if (job.getRunningTests() <= 0 && job.getState().equals(State.RUNNING)) { - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations().set("state", State.READY); - // remove startPrepareTime after turning job to be on READY state - updateJobStatus.unset("startPrepareTime"); - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(jobId), updateJobStatus); - broadcastMessage(MODIFIED_JOB, job); + int updated = jobRepository.updateJobToReadyIfNoTestsRunning(jobId); + if (updated > 0) { + Job updatedJob = jobRepository.findById(jobId).orElseThrow(() -> new RuntimeException("Job [" + jobId + "] does not exist"));; + broadcastMessage(MODIFIED_JOB, updatedJob); + + return updatedJob; } - return job; + + return null; } @POST @Path("jobs/resume") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public synchronized List toggelMultipleJobResume(final List ids) { + public synchronized List toggleMultipleJobResume(final List ids) { List result = new ArrayList<>(ids.size()); for (String id : ids) { - Job job = findOneJobById(id); - if (job != null) { + Optional opJob = jobRepository.findById(id); + if (opJob.isPresent()) { + Job job = opJob.get(); State state = null; - State old = job.getState(); switch (job.getState()) { case PAUSED: state = State.READY; break; case READY: - break; case RUNNING: - break; case DONE: break; } if (state != null) { - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations().set("state", state); - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(job.getId()).field("state").equal(old), updateJobStatus); - result.add(job); - if (job.getPriority() > 0) { - UpdateOperations updatePrioritizedJobStatus = prioritizedJobDAO.createUpdateOperations().set("isPaused", false); - PrioritizedJob prioritizedJob = prioritizedJobDAO.getDatastore().findAndModify(prioritizedJobDAO.createQuery().field("jobId").equal(job.getId()), updatePrioritizedJobStatus); - if (prioritizedJob.getPriority() > highestPriorityJob) { - highestPriorityJob = prioritizedJob.getPriority(); - } + AtomicUpdater jobUpdater = getUpdater(Job.class); + jobUpdater.set("state", state); + + managePrioritizedJob(job.getId(), job.getPriority(), false); + int updated = jobUpdater.whereId(job.getId()).execute(); + if (updated == 0) { + logger.error("Job {} cannot be updated during bulk RESUME process", id); + continue; } - broadcastMessage(MODIFIED_JOB, job); - - //change status of Test(s) from running to pending - Query query = testDAO.createQuery(); - query.and(query.criteria("jobId").equal(id), query.criteria("status").equal(Test.Status.RUNNING)); - UpdateOperations updateOps = testDAO.createUpdateOperations().set("status", Test.Status.PENDING); - UpdateResults update = testDAO.getDatastore().update(query, updateOps); - logger.info("---toggelMultipleJobResume, state is READY, affected count:" + update.getUpdatedCount()); + job = jobRepository.findById(id).get(); + result.add(job); + broadcastMessage(MODIFIED_JOB, job); } } } @@ -865,60 +845,58 @@ public synchronized List toggelMultipleJobResume(final List ids) { @Produces(MediaType.APPLICATION_JSON) public DashboardData getActiveJobGroup(@Context UriInfo uriInfo) { - Query activeBuildsQuery = buildDAO.createQuery(); - addRequiredBuildTableColumns(activeBuildsQuery); - List activeBuilds = - buildDAO.find(activeBuildsQuery. - where("this.buildStatus.runningJobs>0"). - where("this.buildStatus.totalJobs>0"). - where("this.buildStatus.doneJobs + this.buildStatus.brokenJobs < this.buildStatus.totalJobs"). - order("-buildTime")). - asList(); - - Query pendingBuildsQuery = buildDAO.createQuery(); - addRequiredBuildTableColumns(pendingBuildsQuery); - List pendingBuilds = - buildDAO.find(pendingBuildsQuery. - where("this.buildStatus.pendingJobs>0"). - where("this.buildStatus.runningJobs<=0"). - where("this.buildStatus.totalJobs>0"). - where("this.buildStatus.doneJobs + this.buildStatus.brokenJobs < this.buildStatus.totalJobs"). - limit(5). - order("-buildTime")). - asList(); - - Query historyBuildsQuery = buildDAO.createQuery(); - addRequiredBuildTableColumns(historyBuildsQuery); - List historyBuilds = - buildDAO.find(historyBuildsQuery. - where("this.buildStatus.totalJobs>0"). - where("this.buildStatus.doneJobs + this.buildStatus.brokenJobs == this.buildStatus.totalJobs"). - limit(5). - order("-buildTime")). - asList(); - Query futureJobQuery = futureJobDAO.createQuery(); - List futureJobs = futureJobDAO.find(futureJobQuery).asList(); - - Map> activeJobsMap = createActiveJobsMap(activeBuilds); - - return new DashboardData(activeBuilds, pendingBuilds, historyBuilds, activeJobsMap, futureJobs); +// addRequiredBuildTableColumns(activeBuildsQuery); + List activeBuilds = buildRepository.findActiveBuildsDescByBuildTime(); + activeBuilds.stream().parallel().peek(Build::excludeFields); + +// addRequiredBuildTableColumns(pendingBuildsQuery); + Pageable pageable = PageRequest.of(0, 5); + List pendingBuilds = buildRepository.findPendingBuildsDescByBuildTime(pageable); + pendingBuilds.stream().parallel().peek(Build::excludeFields); + +// addRequiredBuildTableColumns(historyBuildsQuery); + pageable = PageRequest.of(0, 5); + List historyBuilds = buildRepository.findRecentlyCompletedBuildsDescByBuildTime(pageable); + historyBuilds.stream().parallel().peek(Build::excludeFields); + + Map> activeJobsMap = createActiveJobsMap(activeBuilds); + + return new DashboardData(activeBuilds, pendingBuilds, historyBuilds, activeJobsMap, futureJobRepository.findAll()); } @GET - @Path("build/history") - @Produces(MediaType.APPLICATION_JSON) - public Batch getHistoryJobGroup(@Context UriInfo uriInfo) { - Query query = jobDAO.createQuery(); - query.criteria("state").equal(State.DONE); - query.field("build.id").hasNoneOf(Arrays.asList("foo", "bar")); - query.order("-submitTime"); - Iterator iterator = jobDAO.find(query).iterator(); - while (iterator.hasNext()) { - Job next = iterator.next(); - logger.info("job {}", next); - } - ((MorphiaIterator) iterator).close(); - return null; + @Path("build/{build1Date}/compare/{build2Date}") + @Produces(MediaType.APPLICATION_JSON) + public BuildsComparisonDTO getJobRunsComparison(@PathParam("build1Date") String build1DateStr, @PathParam("build2Date") String build2DateStr ) throws ParseException { + + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date dateLeft = formatter.parse(build1DateStr); + Date dateRight = formatter.parse(build2DateStr); + + BuildsComparisonDTO buildsComparisonDTO = new BuildsComparisonDTO(); + + List jobsLeft = jobRepository.findBySubmittedByAndSubmitTime("root", dateLeft); + List jobsRight = jobRepository.findBySubmittedByAndSubmitTime("root", dateRight); + + if (!jobsLeft.isEmpty()) { + Build buildLeft = jobsLeft.get(0).getBuild(); + buildsComparisonDTO.setBuildLeftDetails(new String[]{buildLeft.getId(), buildLeft.getName()}); + for (Job job : jobsLeft) { + buildsComparisonDTO.addSuiteLeft(job.getSuite().getName(), job.getId(), + job.getTotalTests(), job.getPassedTests(), job.getFailedTests(), job.getFailed3TimesTests()); + } + } + + if (!jobsRight.isEmpty()) { + Build buildRight = jobsRight.get(0).getBuild(); + buildsComparisonDTO.setBuildRightDetails(new String[]{buildRight.getId(), buildRight.getName()}); + for (Job job : jobsRight) { + buildsComparisonDTO.addSuiteRight(job.getSuite().getName(), job.getId(), + job.getTotalTests(), job.getPassedTests(), job.getFailedTests(), job.getFailed3TimesTests()); + } + } + + return buildsComparisonDTO; } @@ -928,16 +906,22 @@ public Batch getHistoryJobGroup(@Context UriInfo uriInfo) { @Consumes(MediaType.APPLICATION_JSON) public Job unsubscribe(final Agent agent) { String jobId = agent.getJobId(); - Job job = null; if (jobId == null) { throw new BadRequestException("can't unsubscribe agent without a job " + agent); } + + Job job = null; if (agent.getState() == Agent.State.PREPARING) { - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(jobId), jobDAO.createUpdateOperations().removeAll("preparingAgents", agent.getName())); - broadcastMessage(MODIFIED_JOB, job); + AtomicUpdater jobUpdater = getUpdater(Job.class); + int updated = jobUpdater.remove("preparing_agents", agent.getName()).whereId(jobId).execute(); + + if (updated != 0) { + job = jobRepository.findById(jobId).get(); + broadcastMessage(MODIFIED_JOB, job); + } } - UpdateOperations updateAgentOps = agentDAO.createUpdateOperations().unset("jobId"); - agentDAO.getDatastore().updateFirst(agentDAO.createQuery().field("name").equal(agent.getName()), updateAgentOps, true); + + agentRepository.unsetJobIdByName(agent.getName()); broadcastMessage(MODIFIED_AGENT, agent); return job; } @@ -946,12 +930,12 @@ public Job unsubscribe(final Agent agent) { @Path("freeAgent/{agentName}") @Produces(MediaType.APPLICATION_JSON) public Agent freeAgent(@PathParam("agentName") final String agentName) { - Agent agent = agentDAO.findOne(agentDAO.createQuery().field("name").equal(agentName)); - if (agent != null) { - returnTests(agent); - handleZombieAgent(agent); + Optional opAgent = agentRepository.findByName(agentName); + if (opAgent.isPresent()) { + returnTests(opAgent.get()); + handleZombieAgent(opAgent.get()); } - return agent; + return opAgent.orElse(null); } @PUT @@ -961,16 +945,18 @@ public void addTests(Batch tests, @QueryParam("toCount") String toCountStr if (tests.getValues().isEmpty()) { return; } - Job job = jobDAO.findOne(jobDAO.createIdQuery(tests.getValues().get(0).getJobId())); - if (job == null) { + Optional opExistingJob = jobRepository.findById(tests.getValues().get(0).getJobId()); + if (!opExistingJob.isPresent()) { return; } + Build build = null; + Job job = opExistingJob.get(); int updateNumOfTestRetries = 0; List res = new ArrayList<>(tests.getValues().size()); for (Test test : tests.getValues()) { - res.add(addTest(test, job)); + res.add(addTest(test, job)); // first time test added with PENDING status if ((test.getRunNumber() > 1)) { ++updateNumOfTestRetries; } @@ -979,24 +965,34 @@ public void addTests(Batch tests, @QueryParam("toCount") String toCountStr if (!res.isEmpty()) { Test test = res.get(0); - UpdateOperations jobUpdateOps = jobDAO.createUpdateOperations(); - UpdateOperations buildUpdateOps = buildDAO.createUpdateOperations(); - + AtomicUpdater buildStatusUpdater = getUpdater(BuildStatus.class); + AtomicUpdater jobUpdater = getUpdater(Job.class); // @QueryParam("toCount") - indicates if tests should be added to "totalTests" // if a test fails and is resumitted (aka run number >1 ) we don't want it to be added to "totalTests". if (toCountStr.equals("count")) { - jobUpdateOps.inc("totalTests", res.size()); - buildUpdateOps.inc("buildStatus.totalTests", res.size()); + jobUpdater.inc("totalTests", res.size()); + buildStatusUpdater.inc("totalTests", res.size()); } if (updateNumOfTestRetries > 0) { - jobUpdateOps.inc("numOfTestRetries", updateNumOfTestRetries); - buildUpdateOps.inc("buildStatus.numOfTestRetries", updateNumOfTestRetries); + jobUpdater.inc("numOfTestRetries", updateNumOfTestRetries); + buildStatusUpdater.inc("numOfTestRetries", updateNumOfTestRetries); } if (toCountStr.equals("count") || updateNumOfTestRetries > 0) { - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(test.getJobId()), jobUpdateOps, false, false); - Build build = buildDAO.getDatastore().findAndModify(buildDAO.createIdQuery(job.getBuild().getId()), buildUpdateOps, false, false); + int updated = jobUpdater.whereId(test.getJobId()).execute(); + if (updated == 0) { + logger.error("Job {} cannot be updated", test.getJobId()); + return; + } + job = jobRepository.findById(test.getJobId()).get(); + + updated = buildStatusUpdater.whereId(job.getBuild().getBuildStatus().getId()).execute(); + if (updated == 0) { + logger.error("Build {} cannot be updated", job.getBuild().getId()); + return; + } + build = buildRepository.findById(job.getBuild().getId()).get(); broadcastMessage(MODIFIED_BUILD, build); broadcastMessage(MODIFIED_JOB, job); @@ -1033,18 +1029,17 @@ public Build getPendingBuildsToSubmit( } if ("DAILY".equals(modeStr)) { - - Set excludeTags = new HashSet<>(); - excludeTags.add("RELEASE"); - Query query = buildDAO.createQuery().order("-buildTime").field("branch").equal(branchStr).field("tags").hasNoneOf(excludeTags); - - if (tagsSet != null && !tagsSet.isEmpty()) { // build should be with specifics tags - query.field("tags").hasAllOf(tagsSet); - } - - Build build = buildDAO.findOne(query); - if (build != null && build.getBuildStatus().getTotalJobs() == 0) { - buildsRes = build; + HashSet excludeTags = new HashSet<>(Arrays.asList("RELEASE")); + Specification spec = Specification.where( + BuildSpecifications.matchesBranch(branchStr)) // .field("branch").equal(branchStr) + .and(BuildSpecifications.hasNoTags(excludeTags)) // .field("tags").hasNoneOf(excludeTags); + .and(BuildSpecifications.hasTags(tagsSet)) // .field("tags").hasAllOf(tagsSet); + .and(BuildSpecifications.hasNoJobsInBuildStatus()); // build.getBuildStatus().getTotalJobs() == 0 + + Page page = buildRepository.findAll(spec, PageRequest.of(0, 1, Sort.by(Sort.Direction.DESC, "buildTime"))); // .order("-buildTime") + Optional opBuild = page.getContent().stream().findFirst(); + if (opBuild.isPresent()) { + buildsRes = opBuild.get(); } else { String errorStr = "Did not find build with params - branchStr [" + branchStr + "], tagsStr [" + tagsStr + "], modeStr [" + modeStr + "]"; logger.error(errorStr); @@ -1071,13 +1066,7 @@ public Build getPendingBuildsToSubmit( private Build getLatestReleaseBuild() { Build res = null; - Query query; - Set xapReleaseTags = new HashSet<>(); - xapReleaseTags.add("RELEASE"); - xapReleaseTags.add("XAP"); - query = buildDAO.createQuery().order("-buildTime").field("tags").hasAllOf(xapReleaseTags); - QueryResults queryResults = buildDAO.find(query); - List builds = queryResults.asList(); + List builds = buildRepository.findBuildsWithTags("RELEASE", "XAP"); logger.info("choosing build in getLatestReleaseBuild method. found [" + builds.size() + "] builds, need to pick one.\n builds:"); for (Build nightly : builds) { logger.info("build is id: [" + nightly.getId() + "], name: [" + nightly.getName() + "], branch: [" + nightly.getBranch() + "], " + @@ -1104,7 +1093,13 @@ private Test addTest(Test test, Job job) { test.setStatus(Test.Status.PENDING); test.setScheduledAt(new Date()); test.setSha(Sha.compute(test.getName(), test.getArguments(), job.getSuite().getId(), job.getBuild().getBranch())); - testDAO.save(test); + if (test.getLogs() == null) { + test.setLogs(new TestLog(test)); + } else if (test.getLogs().getTest() == null) { + test.getLogs().setTest(test); + } + test = testRepository.saveAndFlush(test); + broadcastMessage(CREATED_TEST, test); return test; } @@ -1114,114 +1109,158 @@ private Test addTest(Test test, Job job) { @Path("test") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public synchronized Test finishTest(final Test test) { + public Test finishTest(final Test test) { try { if (logger.isDebugEnabled()) { - logger.debug("trying to finish test - id:[{}], name:[{}]", test.getId(), - test.getName()); + logger.info("trying to finish test - id:[{}], name:[{}]", test.getId(), test.getName()); } if (test.getId() == null) { throw new BadRequestException("can't finish test without testId: " + test); } - String jobId = test.getJobId(); - Job testJob = getJob(jobId); + + + Job testJob = getJob(test.getJobId()); if (testJob == null) { - throw new BadRequestException("finishTest - the job of the test is not on database. test: [" + test + "]."); + throw new BadRequestException("finishTest - the job of the test is not on database. Test: [" + test + "]."); } Test.Status status = test.getStatus(); - if (status == null || (status != Test.Status.FAIL && status != Test.Status.SUCCESS)) { + if (status != Test.Status.FAIL && status != Test.Status.SUCCESS) { throw new BadRequestException("can't finish test without state set to success or fail state" + test); } - UpdateOperations testUpdateOps = testDAO.createUpdateOperations(); - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations(); - UpdateOperations updateBuild = buildDAO.createUpdateOperations(); - testUpdateOps.set("status", status); - if (test.getRunNumber() == 1) { - if (status == Test.Status.FAIL) { - updateJobStatus.inc("failedTests"); - updateBuild.inc("buildStatus.failedTests"); - } else { - updateJobStatus.inc("passedTests"); - updateBuild.inc("buildStatus.passedTests"); - } - } - if ((test.getRunNumber() == 3) && (status == Test.Status.FAIL)) { - updateJobStatus.inc("failed3TimesTests"); - updateBuild.inc("buildStatus.failed3TimesTests"); + + // find TEST + Test existingTest = testRepository.findById(test.getId()).get(); + + // changing status to the same one means - one of the threads has missed its turn + // if the job is DONE - also reject all late requests + PENDING test cannot be finished + if (existingTest.getStatus() == status || existingTest.getStatus() == Test.Status.PENDING) { + return null; } - updateJobStatus.dec("runningTests"); - updateBuild.dec("buildStatus.runningTests"); + AtomicUpdater testUpdater = getUpdater(Test.class); if (test.getErrorMessage() != null) { - testUpdateOps.set("errorMessage", test.getErrorMessage()); - } - if (status == Test.Status.FAIL || status == Test.Status.SUCCESS) { - testUpdateOps.set("endTime", new Date()); + testUpdater.set("errorMessage", test.getErrorMessage()); } + testUpdater + .set("endTime", new Date()) + .set("status", status); + int historyLength = 25; - List testHistory = getTests(test.getId(), 0, historyLength, null).getValues(); - String historyStatsString = TestScoreUtils.decodeShortHistoryString(test, testHistory, test.getStatus(), testJob.getBuild()); // added current fail to history; - double reliabilityTestScore = TestScoreUtils.score(historyStatsString); + String historyStatsString; + double reliabilityTestScore; + try { + List testHistory = getTests(test.getId(), 0, historyLength, null).getValues(); + historyStatsString = TestScoreUtils.decodeShortHistoryString(test, testHistory, test.getStatus(), testJob.getBuild()); // added current fail to history; + reliabilityTestScore = TestScoreUtils.score(historyStatsString); + } catch (Throwable e) { + throw new BadRequestException("Failed to update test history for test: " + test.getId(), e); + } + + testUpdater + .set("testScore", reliabilityTestScore) + .set("historyStats", historyStatsString); - testUpdateOps.set("testScore", reliabilityTestScore); - testUpdateOps.set("historyStats", historyStatsString); if (logger.isDebugEnabled()) { logger.debug( "got test history [{}] of test and prepare to update: id:[{}], name:[{}], jobId:[{}], running tests before decrement:[{}]", - historyStatsString, test.getId(), test.getName(), jobId, + historyStatsString, test.getId(), test.getName(), test.getJobId(), testJob.getRunningTests()); } + // save updated TEST - only if status is still RUNNING + int updated = testUpdater.where("id = ? AND status = ?", existingTest.getId(), Test.Status.RUNNING).execute(); + if (updated == 0) { + // Test was already returned to PENDING by returnTests() or finished by another thread + // Skip processing to prevent double decrement + Test currentTest = testRepository.findById(existingTest.getId()).orElse(null); + if (currentTest != null) { + logger.warn("finishTest SKIPPED: testId={}, currentStatus={}, targetStatus={}, assignedAgent={} - Test status is not RUNNING, likely changed by returnTests(). Skipping to prevent double decrement.", + currentTest.getId(), currentTest.getStatus(), status, currentTest.getAssignedAgent()); + } else { + logger.warn("finishTest SKIPPED: testId={} - Test not found", existingTest.getId()); + } + return null; + } + Test savedTest = testRepository.findById(existingTest.getId()).get(); + + // Now, update TEST related things + AtomicUpdater jobUpdater = getUpdater(Job.class); + AtomicUpdater buildStatusUpdater = getUpdater(BuildStatus.class); + if (test.getRunNumber() == 1) { + if (status == Test.Status.FAIL) { + jobUpdater.inc("failedTests"); + buildStatusUpdater.inc("failedTests"); + } else { + jobUpdater.inc("passedTests"); + buildStatusUpdater.inc("passedTests"); + } + } else if (test.getRunNumber() == 3 && status == Test.Status.FAIL) { + jobUpdater.inc("failed3TimesTests"); + buildStatusUpdater.inc("failed3TimesTests"); + } + + jobUpdater.dec("runningTests"); + buildStatusUpdater.dec("runningTests"); - Test result = testDAO.getDatastore().findAndModify(testDAO.createIdQuery(test.getId()), testUpdateOps, false, false); - Query query = testDAO.createQuery(); - query.and(query.criteria("jobId").equal(result.getJobId()), - query.or(query.criteria("status").equal(Test.Status.PENDING), - query.criteria("status").equal(Test.Status.RUNNING))); - if (!testDAO.exists(query)) { - updateJobStatus.set("state", State.DONE).set("endTime", new Date()); - updateBuild.inc("buildStatus.doneJobs").dec("buildStatus.runningJobs"); + boolean testEntryExists = testRepository.existsByJobIdAndStatusIn(existingTest.getJobId(), Arrays.asList(Test.Status.PENDING, Test.Status.RUNNING)); + if (!testEntryExists) { + jobUpdater.set("state", State.DONE).set("endTime", new Date()); + buildStatusUpdater.inc("doneJobs").dec("runningJobs"); if (testJob.getPriority() > 0) { deletePrioritizedJob(testJob); } } - Job job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(result.getJobId()), updateJobStatus); - if (job.getRunningTests() < 0) { - logger.warn("Job: " + job.getId() + " has an illegal number of running tests: "+ job.getRunningTests() + + + updated = jobUpdater.whereId(existingTest.getJobId()).execute(); // SAVE Job + if (updated == 0) { + throw new BadRequestException("can't update job with Id: " + existingTest.getJobId()); + } + Job savedJob = jobRepository.findById(existingTest.getJobId()).get(); + if (savedJob.getRunningTests() < 0) { + logger.warn("Job: " + savedJob.getId() + " has an illegal number of running tests: " + savedJob.getRunningTests() + " after running test: " + test.getArguments() + " with agent: " + test.getAssignedAgent()); } if (logger.isDebugEnabled()) { logger.debug( "After modifying job ( after runningTests decrement ), runningTests:[{}]", - job.getRunningTests()); + savedJob.getRunningTests()); } - Build build = buildDAO.getDatastore().findAndModify(buildDAO.createIdQuery(job.getBuild().getId()), updateBuild); + updated = buildStatusUpdater.whereId(savedJob.getBuild().getBuildStatus().getId()).execute(); // SAVE Build + if (updated == 0) { + throw new BadRequestException("can't update build with Id: " + savedJob.getBuild()); + } + Build savedBuild = buildRepository.findById(savedJob.getBuild().getId()).get(); + + broadcastMessage(MODIFIED_BUILD, savedBuild); + broadcastMessage(MODIFIED_TEST, savedTest); + broadcastMessage(MODIFIED_JOB, savedJob); + + logger.info("succeed finish test- id:[{}], name:[{}]", savedTest.getId(), savedTest.getName()); + return savedTest; - broadcastMessage(MODIFIED_BUILD, build); - broadcastMessage(MODIFIED_TEST, result); - broadcastMessage(MODIFIED_JOB, job); - logger.info("succeed finish test- id:[{}], name:[{}]", result.getId(), result.getName()); - return result; } catch (Exception e) { logger.error("failed to finish test because: ", e); throw e; } finally { if (test.getAssignedAgent() != null) { - UpdateOperations updateOps = agentDAO.createUpdateOperations().set("lastTouchTime", new Date()) - .removeAll("currentTests", test.getId()); - Agent agent = agentDAO.getDatastore().findAndModify(agentDAO.createQuery().field("name").equal(test.getAssignedAgent()), updateOps, false, false); - if (agent != null) { - Agent idling = null; - if (agent.getCurrentTests().isEmpty()) { - idling = agentDAO.getDatastore().findAndModify(agentDAO.createQuery().field("name").equal(test.getAssignedAgent()) - .where("this.currentTests.length == 0"), - agentDAO.createUpdateOperations().set("state", Agent.State.IDLING)); - if (idling != null) { - logger.debug("agent [{}] become idling because it finish all his tests", idling.getName()); - } + Optional opAgent = agentRepository.findByName(test.getAssignedAgent()); + if (opAgent.isPresent()) { + logger.info("releasing agent {} from the finished test {}", opAgent.get().getName(), test.getId()); + Agent currAssignedAgent = opAgent.get(); + currAssignedAgent.setLastTouchTime(new Date()); + currAssignedAgent.getCurrentTests().remove(test.getId()); // remove assigned tests one by one when they complete + + if (currAssignedAgent.getCurrentTests().isEmpty()) { + currAssignedAgent.setState(Agent.State.IDLING); // set agent back to IDLING if it doesn't have tasks to run + } + + agentRepository.saveAndFlush(currAssignedAgent); + broadcastMessage(MODIFIED_AGENT, currAssignedAgent); + + if (currAssignedAgent.getState() == Agent.State.IDLING) { + logger.info("agent [{}] become idling because it finish all his tests", currAssignedAgent.getName()); } - broadcastMessage(MODIFIED_AGENT, idling == null ? agent : idling); } } } @@ -1238,87 +1277,127 @@ public Batch getJobTestsView(@DefaultValue("0") @QueryParam("offset") @QueryParam("jobId") String jobId, @Context UriInfo uriInfo) { - List tests = retrieveJobTests(jobId, orderBy, all, offset, limit); + List tests = retrieveJobTests(jobId, orderBy, all, offset, limit); List testsView = new ArrayList<>(tests.size()); - for (Test test : tests) { - testsView.add(new TestView(test)); + for (PTest PTest : tests) { + testsView.add(new TestView(PTest)); } return new Batch<>(testsView, offset, limit, all, orderBy, uriInfo); } + @GET + @Path("version") + @Produces(MediaType.APPLICATION_JSON) + public Response getVersion() { + return Response.ok(BuildVersionProvider.getVersion()).build(); + } + @GET @Path("test") @Produces(MediaType.APPLICATION_JSON) - public Batch getJobTests(@DefaultValue("0") @QueryParam("offset") int offset, + public Batch getJobTests(@DefaultValue("0") @QueryParam("offset") int offset, @DefaultValue("30") @QueryParam("limit") int limit, @DefaultValue("false") @QueryParam("all") boolean all, @QueryParam("orderBy") List orderBy, @QueryParam("jobId") String jobId, @Context UriInfo uriInfo) { - List tests = jobId != null && jobId.trim().length() > 0 ? - retrieveJobTests(jobId, orderBy, all, offset, limit) : Collections.emptyList(); - return new Batch<>(tests, offset, limit, all, orderBy, uriInfo); + List tests = jobId != null && jobId.trim().length() > 0 + ? retrieveJobTests(jobId, orderBy, all, offset, limit) + : Collections.emptyList(); + + List testsView = new ArrayList<>(tests.size()); + for (PTest PTest : tests) { + testsView.add(new TestView(PTest)); + } + + return new Batch<>(testsView, offset, limit, all, orderBy, uriInfo); } @GET @Path("agent-tests") @Produces(MediaType.APPLICATION_JSON) - public Batch getAgentTests(@DefaultValue("0") @QueryParam("offset") int offset, + public Batch getAgentTests(@DefaultValue("0") @QueryParam("offset") int offset, @DefaultValue("30") @QueryParam("limit") int limit, @DefaultValue("false") @QueryParam("all") boolean all, @QueryParam("orderBy") List orderBy, @QueryParam("agentName") String agentName, @Context UriInfo uriInfo) { - List tests = agentName != null && agentName.trim().length() > 0 ? - retrieveAgentTests(agentName, orderBy, all, offset, limit) : Collections.emptyList(); - return new Batch<>(tests, offset, limit, all, orderBy, uriInfo); - } - - private List retrieveJobTests(String jobId, List orderBy, boolean all, int offset, int limit) { + List tests = (agentName != null && agentName.trim().length() > 0) + ? retrieveAgentTests(agentName, orderBy, all, offset, limit) + : Collections.emptyList(); - Query query = testDAO.createQuery(); - if (jobId != null) { - query.field("jobId").equal(jobId); + List testsView = new ArrayList<>(tests.size()); + for (PTest PTest : tests) { + testsView.add(new TestView(PTest)); } - return applySelectTestsPropertiesAndGet(query, orderBy, all, offset, limit, new String[]{"sha", "properties", "testType", "timeout", "logs", "scheduledAt"}); + return new Batch<>(testsView, offset, limit, all, orderBy, uriInfo); } - private List retrieveAgentTests(String agentName, List orderBy, boolean all, int offset, int limit) { - - Query query = testDAO.createQuery(); - if (agentName != null) { - query.field("assignedAgent").equal(agentName); - } - - return applySelectTestsPropertiesAndGet(query, orderBy, all, offset, limit, new String[]{"sha", "properties", "assignedAgent", "testType", "timeout", "logs", "scheduledAt"}); + private List retrieveJobTests(String jobId, List orderBy, boolean all, int offset, int limit) { + Pageable pageable = preparePageable(orderBy, all, offset, limit); + return testRepository.findAllByJobId(jobId, pageable); } - private List applySelectTestsPropertiesAndGet(Query query, List orderBy, boolean all, int offset, int limit, String[] strings) { + private List retrieveAgentTests(String agentName, List orderBy, boolean all, int offset, int limit) { + Pageable pageable = preparePageable(orderBy, all, offset, limit); + return testRepository.findAllByAssignedAgent(agentName, pageable); + } + private Pageable preparePageable(List orderBy, boolean all, int offset, int limit) { + Sort sort = Sort.unsorted(); if (orderBy != null) { if (orderBy.isEmpty()) { orderBy.add("startTime"); } - orderBy.forEach(query::order); + sort = convertOrderByToSort(orderBy); + } + + // Handle pagination + return all ? Pageable.unpaged() : convertOffsetLimitToPage(offset, limit, sort); + } + + private Sort convertOrderByToSort(List orderBy) { + if (orderBy == null || orderBy.isEmpty()) { + return Sort.unsorted(); } - if (!all) { - query.offset(offset).limit(limit); + return Sort.by(orderBy.stream() + .map(field -> field.startsWith("-") + ? Sort.Order.desc(field.substring(1)) + : Sort.Order.asc(field)) + .collect(Collectors.toList())); + } + + private Date parseDate(String dateStr) { + if (dateStr == null || dateStr.trim().isEmpty()) { + return null; + } + try { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return formatter.parse(dateStr); + } catch (ParseException e) { + logger.warn("Failed to parse date: {}", dateStr, e); + return null; + } + } + + private Pageable convertOffsetLimitToPage(int offset, int limit, Sort sort) { + if (sort == null) { + sort = Sort.unsorted(); } - //redundant test properties for job tests view - query.retrievedFields(false, strings); - return testDAO.find(query).asList(); + // Pageable for pagination (if not 'all') + return PageRequest.of(offset / limit, limit, sort); } @GET @Path("test/{id}") @Produces(MediaType.APPLICATION_JSON) public Test getTest(@PathParam("id") String id) { - Test test = testDAO.findOne(testDAO.createQuery().field("_id").equal(new ObjectId(id))); - return test; + Optional testOptional = testRepository.findById(id); + return testOptional.orElse(null); } @POST @@ -1328,23 +1407,50 @@ public Test getTest(@PathParam("id") String id) { public Test uploadTestLog(FormDataMultiPart form, @PathParam("jobId") String jobId, @PathParam("id") String id, - @Context UriInfo uriInfo) { + @Context UriInfo uriInfo) throws IOException { if (getJob(jobId) == null) { logger.warn("uploadTestLog - the job of the test is not on database. testId:[{}], jobId:[{}].", id, jobId); return null; } + logger.info("Received log file for jobId:[{}], id:[{}]", jobId, id); FormDataBodyPart filePart = form.getField("file"); ContentDisposition contentDispositionHeader = filePart.getContentDisposition(); InputStream fileInputStream = filePart.getValueAs(InputStream.class); String fileName = contentDispositionHeader.getFileName(); - if (fileName.toLowerCase().endsWith(".zip")) { - handleTestLogBundle(id, jobId, uriInfo, fileInputStream, fileName); - } else { - handleTestLogFile(id, jobId, uriInfo, fileInputStream, fileName); + // TODO take care of this part if don't use s3, otherwise 2 files will be created everytime wasting time and space + final java.nio.file.Path tempFile = Files.createTempFile("upload-", "-" + fileName); + try { + Files.copy(fileInputStream, tempFile, StandardCopyOption.REPLACE_EXISTING); + if (!FileUtils.exists(tempFile)) { + logger.error("uploadTestLog - the temp file does not exist: {}", tempFile); + } + } finally { + fileInputStream.close(); } - return null; + executor.execute(() -> { + try { + if (fileName.toLowerCase().endsWith(".zip")) { + handleTestLogBundle(id, jobId, uriInfo, fileInputStream, tempFile, fileName); + } else { + handleTestLogFile(id, jobId, uriInfo, fileInputStream, tempFile, fileName); + } + } catch (Exception e) { + logger.error("Failed to process " + fileName, e); + } finally { + try { + Files.deleteIfExists(tempFile); + } catch (IOException ex) { + logger.warn("Could not delete temp file: " + tempFile, ex); + } + } + }); + + Test test = new Test(); + test.setId(id); // agent needs this to print in its logs + + return test; } @POST @@ -1366,6 +1472,7 @@ public Job uploadJobSetupLog(FormDataMultiPart form, ContentDisposition contentDispositionHeader = filePart.getContentDisposition(); InputStream fileInputStream = filePart.getValueAs(InputStream.class); String fileName = contentDispositionHeader.getFileName(); + handleJobSetupLogFile(jobId, agentName, uriInfo, fileInputStream, fileName); return null; @@ -1374,25 +1481,50 @@ public Job uploadJobSetupLog(FormDataMultiPart form, private void handleJobSetupLogFile(String jobId, String agentName, UriInfo uriInfo, InputStream fileInputStream, String fileName) { String filePath = calculateJobSetupLogFilePath(jobId, agentName) + fileName; try { - saveFile(fileInputStream, filePath); - URI uri = uriInfo.getAbsolutePathBuilder().path(fileName).build(); - UpdateOperations updateOps = jobDAO.createUpdateOperations().set("jobSetupLogs." + getLogName(agentName.replace(".", "_")), uri.toASCIIString()); - Job job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(jobId), updateOps); - broadcastMessage(MODIFIED_JOB, job); - } catch (IOException e) { + Optional opJob = jobRepository.findById(jobId); + if (opJob.isPresent()) { + saveFile(fileInputStream, filePath); + URI uri = uriInfo.getAbsolutePathBuilder().path(fileName).build(); + + String jobSetupLogsValue = uri.toASCIIString(); + + // Update agent setup logs in atomic way to avoid collision with other agents updates + AtomicUpdater JobSetupLogUpdater = getUpdater(JobSetupLog.class); + JobSetupLogUpdater.putKeyValue("agent_logs", agentName, jobSetupLogsValue) + .whereId(opJob.get().getJobSetupLog().getId()).execute(); + + Job job = jobRepository.findById(jobId).get(); + broadcastMessage(MODIFIED_JOB, job); + } + } catch (Exception e) { logger.error("Failed to save log at {} for jobId {}", filePath, jobId, e); } } - private void handleTestLogFile(String testId, String jobId, UriInfo uriInfo, InputStream fileInputStream, String fileName) { + private void handleTestLogFile(String testId, String jobId, UriInfo uriInfo, InputStream fileInputStream, java.nio.file.Path tmpPath, String fileName) { String filePath = calculateTestLogFilePath(jobId, testId) + fileName; + logger.info("Test log file path calculated: " + filePath); try { - saveFile(fileInputStream, filePath); - URI uri = uriInfo.getAbsolutePathBuilder().path(fileName).build(); - UpdateOperations updateOps = testDAO.createUpdateOperations().set("logs." + getLogName(fileName), uri.toASCIIString()); - Test test = testDAO.getDatastore().findAndModify(testDAO.createIdQuery(testId), updateOps); - broadcastMessage(MODIFIED_TEST, test); - } catch (IOException e) { + Optional opTest = testRepository.findById(testId); + if (opTest.isPresent()) { + if (tmpPath != null) { + copyTmpToFile(tmpPath, filePath); + } else { + saveFile(fileInputStream, filePath); + } + logger.info("Log file saved on path: " + filePath); + URI uri = uriInfo.getAbsolutePathBuilder().path(fileName).build(); + + Test test = opTest.get(); + // Update the map + String jobSetupLogsValue = uri.toASCIIString(); + test.getLogs().getTestLogs().put(fileName, jobSetupLogsValue); + logger.info("Test logs added to the test {}: {}", test.getId(), test.getLogs().getTestLogs()); + + test = testRepository.saveAndFlush(test); + broadcastMessage(MODIFIED_TEST, test); + } + } catch (Exception e) { logger.error("Failed to save log at {} for test {} jobId {}", filePath, testId, jobId, e); } } @@ -1405,20 +1537,28 @@ private static String calculateJobSetupLogFilePath(String jobId, String agentNam return SERVER_JOBS_UPLOAD_LOCATION_FOLDER + "/" + jobId + "/" + agentName + "/"; } - private void handleTestLogBundle(String testId, String jobId, UriInfo uriInfo, InputStream fileInputStream, String fileName) { + private void handleTestLogBundle(String testId, String jobId, UriInfo uriInfo, InputStream fileInputStream, java.nio.file.Path tmpPath, String fileName) { String filePath = calculateTestLogFilePath(jobId, testId) + fileName; try { - saveFile(fileInputStream, filePath); + if (tmpPath != null) { + copyTmpToFile(tmpPath, filePath); + } else { + saveFile(fileInputStream, filePath); + } Set entries = extractZipEntries(filePath); String uri = uriInfo.getAbsolutePathBuilder().path(fileName).build().getPath(); - UpdateOperations updateOps = testDAO.createUpdateOperations(); - for (String entry : entries) { - updateOps.set("logs." + entry.replaceAll("\\.", "_"), uri + "!/" + entry); - //https://localhost:8443/api/newman/test/1/logBundle/logs.zip!/logs/pom_files/microsoft.owa.extendedmaillistview.mouse.js - } - Test test = testDAO.getDatastore().findAndModify(testDAO.createIdQuery(testId), updateOps); - broadcastMessage(MODIFIED_TEST, test); + + Optional optionalTest = testRepository.findById(testId); + if (optionalTest.isPresent()) { + Test test = optionalTest.get(); + for (String entry : entries) { + test.getLogs().getTestLogs().put(entry, uri + "!/" + entry); + } + + test = testRepository.saveAndFlush(test); + broadcastMessage(MODIFIED_TEST, test); + } } catch (IOException e) { logger.error("Failed to save log at {} for test {} jobId {}", filePath, testId, jobId, e); } @@ -1514,11 +1654,9 @@ private String calcCacheResourceToDownload(String branch, String BuildName, Stri @Produces(MediaType.APPLICATION_JSON) public synchronized Build cacheBuild(@QueryParam("buildIdToCache") String buildIdToCache) throws IOException, URISyntaxException { try { - Build build = getBuild(buildIdToCache); - - if (build == null) { - throw new IllegalArgumentException("cant cache the build with id " + buildIdToCache + " because it does not exists"); - } + Optional opBuild = buildRepository.findById(buildIdToCache); + Build build = opBuild.orElseThrow(() -> + new IllegalArgumentException("cant cache the build with id " + buildIdToCache + " because it does not exists")); if (!buildCacheEnabled) { logger.info("build caching is disabled"); @@ -1565,12 +1703,7 @@ private void removeFromCache(Build build) { } private void updateBuildCache(BuildsCache cache) { - UpdateOperations updateOps = buildsCacheDAO.createUpdateOperations(); - updateOps.set("cache", cache.getCache()); - updateOps.set("index", cache.getIndex()); - updateOps.set("size", cache.getSize()); - Query query = buildsCacheDAO.createIdQuery(cache.getId()); - buildsCacheDAO.getDatastore().findAndModify(query, updateOps); + buildsCacheRepository.updateBuildCache(cache.getId(), cache.getCache(), cache.getIndex(), cache.getSize()); } private void storeBuildInCache(Build build) throws IOException { @@ -1592,7 +1725,7 @@ private void revertBuild(Build toRemove) throws IOException { } private BuildsCache getCache() { - BuildsCache cache = buildsCacheDAO.findOne(buildsCacheDAO.createQuery()); + BuildsCache cache = buildsCacheRepository.findTopBy(); if (cache == null) { throw new IllegalStateException("builds cache is null"); } @@ -1671,31 +1804,133 @@ private String calcCachePath(Build build) { @GET @Path("log/size") public Response computeLogDirSize() { + // Calculate cache age + long cachedAge = System.currentTimeMillis() - lastLogSizeCheckTime.get(); + + // If cache is fresh (less than 3 hours old) AND has been initialized, return cached value immediately + if (lastLogSizeCheckTime.get() > 0 && cachedAge < TimeUnit.HOURS.toMillis(3)) { + long cachedValue = latestLogSize.get(); + logger.info("Log size request - returning cached value: {} bytes (cache age: {} minutes)", + cachedValue, TimeUnit.MILLISECONDS.toMinutes(cachedAge)); + return Response.ok(String.valueOf(cachedValue)).build(); + } + + // Cache is stale or never initialized - trigger async refresh if not already in progress synchronized (lastLogSizeCheckTime) { - if (System.currentTimeMillis() - lastLogSizeCheckTime.get() < TimeUnit.MINUTES.toMillis(60)) { - return Response.ok(String.valueOf(latestLogSize)).build(); + // Double-check if another thread already started refresh + cachedAge = System.currentTimeMillis() - lastLogSizeCheckTime.get(); + if (lastLogSizeCheckTime.get() == 0 || cachedAge >= TimeUnit.HOURS.toMillis(3)) { + boolean isFirstCalculation = (lastLogSizeCheckTime.get() == 0); + + if (isFirstCalculation) { + logger.info("Log size request - first calculation ever, triggering async calculation"); + } else { + logger.info("Log size request - cache is stale (age: {} hours), triggering async refresh", + TimeUnit.MILLISECONDS.toHours(cachedAge)); + } + + // Mark that we're refreshing (prevent multiple concurrent refreshes) + lastLogSizeCheckTime.set(System.currentTimeMillis()); + + // Trigger async calculation + executor.execute(() -> { + long calculationStart = System.currentTimeMillis(); + logger.info("Starting async log directory size calculation for: {}", + SERVER_TESTS_UPLOAD_LOCATION_FOLDER); + + try { + long size = calculateLogDirSize(); + long calculationDuration = System.currentTimeMillis() - calculationStart; + latestLogSize.set(size); + logger.info("Log directory size calculation completed successfully: {} bytes ({} GB) in {} seconds", + size, String.format("%.2f", size / 1024.0 / 1024.0 / 1024.0), calculationDuration / 1000.0); + } catch (Exception e) { + long calculationDuration = System.currentTimeMillis() - calculationStart; + logger.error("Failed to compute log directory size after {} seconds: {}", + calculationDuration / 1000.0, e.getMessage(), e); + // Roll back the timestamp so next request can retry + lastLogSizeCheckTime.set(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(3)); + } + }); + } else { + logger.info("Log size request - calculation already in progress (started {} seconds ago), returning current value", + TimeUnit.MILLISECONDS.toSeconds(cachedAge)); } - lastLogSizeCheckTime.set(System.currentTimeMillis()); } + + // Return last known value immediately (0 on first request, while refresh happens in background) + long currentValue = latestLogSize.get(); + logger.info("Log size request - returning current value: {} bytes (calculation in progress: {})", + currentValue, lastLogSizeCheckTime.get() > 0 && currentValue == 0); + return Response.ok(String.valueOf(currentValue)).build(); + } + + /** + * Calculate the total size of log directories using 'du' command. + * This is much faster than Java file walking, especially for S3-mounted directories. + * + * Note: Only calculates SERVER_TESTS_UPLOAD_LOCATION_FOLDER size. + * SERVER_JOBS_UPLOAD_LOCATION_FOLDER is not uploaded to S3 and is omitted from calculation. + * + * @return total size in bytes + * @throws IOException if command execution fails + */ + private long calculateLogDirSize() throws IOException { + File testsDir = new File(SERVER_TESTS_UPLOAD_LOCATION_FOLDER); + + // If directory doesn't exist, return 0 + if (!testsDir.exists()) { + logger.warn("Log directory does not exist: {}, returning size 0", SERVER_TESTS_UPLOAD_LOCATION_FOLDER); + return 0; + } + + logger.info("Executing 'du -sb {}' command to calculate directory size", SERVER_TESTS_UPLOAD_LOCATION_FOLDER); + try { - if (!new File(SERVER_TESTS_UPLOAD_LOCATION_FOLDER).exists() || !new File(SERVER_JOBS_UPLOAD_LOCATION_FOLDER).exists()) { - return Response.ok("0").build(); - } - long testLogsSize = Files.walk(Paths.get(SERVER_TESTS_UPLOAD_LOCATION_FOLDER)).mapToLong(p -> p.toFile().length()).sum(); - long jobsSetupLogSize = Files.walk(Paths.get(SERVER_JOBS_UPLOAD_LOCATION_FOLDER)).mapToLong(p -> p.toFile().length()).sum(); - latestLogSize.set(testLogsSize + jobsSetupLogSize); - String sum = String.valueOf(latestLogSize.get()); - return Response.ok(sum, MediaType.TEXT_PLAIN_TYPE).build(); - } catch (Exception e) { - logger.error(e.toString(), e); - return Response.status(Response.Status.EXPECTATION_FAILED).build(); + // Use 'du -sb' command: -s (summary), -b (bytes) + ProcessBuilder pb = new ProcessBuilder("du", "-sb", SERVER_TESTS_UPLOAD_LOCATION_FOLDER); + pb.redirectErrorStream(true); + Process process = pb.start(); + + long size = 0; + String rawOutput = null; + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(process.getInputStream()))) { + String line = reader.readLine(); + rawOutput = line; + if (line != null) { + // Format: "12345678\t/path/to/dir" + String[] parts = line.split("\\s+"); + if (parts.length > 0) { + size = Long.parseLong(parts[0]); + logger.info("Parsed size from du output: {} bytes", size); + } + } + } + + int exitCode = process.waitFor(); + if (exitCode != 0) { + logger.error("du command failed with exit code: {}, output: {}", exitCode, rawOutput); + throw new IOException("du command failed with exit code: " + exitCode); + } + + logger.info("du command completed successfully, returning size: {} bytes", size); + return size; + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + logger.error("Interrupted while executing du command", e); + throw new IOException("Interrupted while calculating directory size", e); + } catch (NumberFormatException e) { + logger.error("Failed to parse du command output as number", e); + throw new IOException("Failed to parse du command output", e); } } @GET @Path("agents/count") public Response getAgentsCount() { - long count = agentDAO.count(); + long count = agentRepository.count(); if (logger.isDebugEnabled()) { logger.debug("agents count=" + count); } @@ -1705,7 +1940,7 @@ public Response getAgentsCount() { @GET @Path("agents/failing") public Response getFailingAgents() { - long count = agentDAO.createQuery().filter("setupRetries >", 0).countAll(); + long count = agentRepository.countBySetupRetriesGreaterThan(0); if (logger.isDebugEnabled()) { logger.debug("agents failed setup count=" + count); } @@ -1767,11 +2002,11 @@ public Batch getSubscriptions(@DefaultValue("0") @QueryParam("offset") in @DefaultValue("30") @QueryParam("limit") int limit , @QueryParam("orderBy") List orderBy , @Context UriInfo uriInfo) { - Query query = agentDAO.createQuery().offset(offset).limit(limit); - if (orderBy != null) { - orderBy.forEach(query::order); - } - return new Batch<>(agentDAO.find(query).asList(), offset, limit, + + Sort sort = convertOrderByToSort(orderBy); + Pageable pageable = convertOffsetLimitToPage(offset, limit, sort); + + return new Batch<>(agentRepository.findAll(pageable).getContent(), offset, limit, false, orderBy, uriInfo); } @@ -1779,12 +2014,17 @@ public Batch getSubscriptions(@DefaultValue("0") @QueryParam("offset") in @Path("ping/{name}/{jobId}") @Produces(MediaType.APPLICATION_JSON) public String pingInSetup(@PathParam("name") final String name, @PathParam("jobId") final String jobId) { - UpdateOperations updateOps = agentDAO.createUpdateOperations().set("lastTouchTime", new Date()); - Agent agent = agentDAO.getDatastore().findAndModify(agentDAO.createQuery().field("name").equal(name), updateOps, false, false); - if (agent == null) { + Optional opAgent = agentRepository.findByName(name); + if (!opAgent.isPresent()) { logger.error("Unknown agent " + name); return null; } + + Agent agent = opAgent.get(); + agent.setLastTouchTime(new Date()); + + agent = agentRepository.save(agent); + String agentIp = agent.getHostAddress(); if (offlineAgents.containsKey(agentIp)) { offlineAgents.remove(agentIp); @@ -1804,14 +2044,14 @@ public String pingInSetup(@PathParam("name") final String name, @PathParam("jobI @Path("agent/{name}") @Produces(MediaType.APPLICATION_JSON) public Agent getAgent(final @PathParam("name") String name) { - Agent agent = agentDAO.findOne(agentDAO.createQuery().field("name").equal(name)); + Optional opAgent = agentRepository.findByName(name); //if such agent not found (already does not exist), then create Agent instance and //provide only its name - if (agent == null) { - agent = new Agent(); - agent.setName(name); - } - return agent; + return opAgent.orElseGet(() -> { + Agent a = new Agent(); + a.setName(name); + return a; + }); } @GET @@ -1822,23 +2062,23 @@ public Batch getAgents(@DefaultValue("0") @QueryParam("offset") int offse @DefaultValue("false") @QueryParam("all") boolean all , @QueryParam("orderBy") List orderBy , @Context UriInfo uriInfo) { - Query query = agentDAO.createQuery(); - if (!all) { - query.offset(offset).limit(limit); - } - if (orderBy != null) { - orderBy.forEach(query::order); - } - List agents = agentDAO.find(query).asList(); + Sort sort = convertOrderByToSort(orderBy); + // Pageable for pagination (if not 'all') + Pageable pageable = all + ? Pageable.unpaged() // If 'all' is true, no limit, fetch all + : PageRequest.of(offset / limit, limit, sort); // Pagination + + List agents = agentRepository.findAll(pageable).getContent(); for (Agent agent : agents) { - String jobId = agent.getJobId(); + String jobId = agent.getJobId(); // contains jobId only, Job is transient if (jobId != null) { - Job job = findOneThinJobById(jobId); + PJobThin jobThin = jobRepository.findOneThinJobById(jobId); // now look for the projection of the related job if (logger.isDebugEnabled()) { - logger.debug("within for on agents, jobID=" + jobId + ", job=" + job); + logger.debug("within for on agents, jobID=" + jobId + ", job=" + jobThin.string()); } - agent.setJob(job); + agent.setJob(new Job(jobThin.getId(), jobThin.getSuiteId(), jobThin.getSuiteName(), + jobThin.getBuildId(), jobThin.getBuildName(), jobThin.getBuildBranch())); } } @@ -1880,129 +2120,187 @@ public Batch cleanAgentRetries(@DefaultValue("0") @QueryParam("offset") i @DefaultValue("false") @QueryParam("all") boolean all , @QueryParam("orderBy") List orderBy , @Context UriInfo uriInfo) { - Query query = agentDAO.createQuery(); - if (!all) { - query.offset(offset).limit(limit); - } - if (orderBy != null) { - orderBy.forEach(query::order); - } - UpdateOperations updateAgentStatus = agentDAO.createUpdateOperations().set("setupRetries", 0); - UpdateResults update = agentDAO.getDatastore().update(query, updateAgentStatus); - logger.info("cleanAgentRetries: number of agents updated " + update.getUpdatedCount()); + Sort sort = convertOrderByToSort(orderBy); + List agents; + if (all) { + agents = agentRepository.findAllWithPositiveSetupRetries(sort); + } else { + Pageable pageable = convertOffsetLimitToPage(offset, limit, sort); + agents = agentRepository.findAllWithPositiveSetupRetries(pageable).getContent(); + } - List agents = agentDAO.find(query).asList(); - int count = 0; for (Agent agent : agents) { - if (agent.getSetupRetries() > 0) { - count++; - } + agent.setSetupRetries(0); + agentRepository.save(agent); broadcastMessage(MODIFIED_AGENT, agent); } - broadcastMessage(MODIFIED_FAILING_AGENTS, count); + broadcastMessage(MODIFIED_FAILING_AGENTS, agents.size()); + return new Batch<>(agents, offset, limit, all, orderBy, uriInfo); } @POST @Path("agent/{name}/{jobId}") @Produces(MediaType.APPLICATION_JSON) - public Test getTest(@PathParam("name") final String name, @PathParam("jobId") final String jobId) { + public Test getTest(@PathParam("name") final String agentName, @PathParam("jobId") final String jobId) { checkServerStatus(); - Agent agent = agentDAO.findOne(agentDAO.createQuery().field("name").equal(name)); - if (agent == null) { - logger.error("bad request unknown agent {}", name); + Optional opAgent = agentRepository.findByName(agentName); + if (!opAgent.isPresent()) { + logger.error("Bad request. Unknown agent {}", agentName); return null; } - if (!jobId.equals(agent.getJobId())) { - logger.error("Agent agent is not on job {} {} ", jobId, agent); + + Agent agent = opAgent.get(); + agent.setLastTouchTime(new Date()); // ping agent is necessary + + if (!jobId.equals(opAgent.get().getJobId())) { + logger.error("Agent agent is not on job {} {} ", jobId, opAgent.get()); return null; } - Job pj = null; - final Object lock = getAgentLock(agent); + final Object agentLock = getAgentLock(agent); //noinspection SynchronizationOnLocalVariableOrMethodParameter - synchronized (lock) { + synchronized (agentLock) { if (agent.getState() == Agent.State.PREPARING) { - pj = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(jobId), jobDAO.createUpdateOperations().removeAll("preparingAgents", agent.getName())); + AtomicUpdater jobUpdater = getUpdater(Job.class); + int updated = jobUpdater.remove("preparing_agents", agent.getName()) + .whereId(jobId).execute(); + if (updated != 0) { + pj = jobRepository.findById(jobId).get(); + } } } - UpdateOperations agentUpdateOps = agentDAO.createUpdateOperations().set("lastTouchTime", new Date()); - Test result; - UpdateOperations updateOps; - Query query; - synchronized (takenTestLock) { - query = testDAO.createQuery(); - query.and(query.criteria("jobId").equal(jobId), query.criteria("status").equal(Test.Status.PENDING)); - updateOps = testDAO.createUpdateOperations().set("status", Test.Status.RUNNING) - .set("assignedAgent", name).set("agentGroup", agent.getGroupName()).set("startTime", new Date()); - result = testDAO.getDatastore().findAndModify(query, updateOps, false, false); + // LOCK job when manipulating with its counters and statuses + Test test = null; + synchronized (takenTestLock) { // this is the place where Tests assigned to Agents or removed if job PAUSED + Optional opTestPending = testRepository.findFirstByJobIdAndStatus(jobId, Test.Status.PENDING); // find job waiting to run + if (opTestPending.isPresent()) { + // TEST + int updated = getUpdater(Test.class) + .set("status", Test.Status.RUNNING) + .set("assignedAgent", agentName) + .set("agentGroup", agent.getGroupName()) + .set("startTime", new Date()) + .whereId(opTestPending.get().getId()).execute(); + + if (updated == 0) { + logger.error("Test {} cannot be updated", opTestPending.get().getId()); + return null; + } + test = testRepository.findById(opTestPending.get().getId()).get(); + } } - if (result != null) { - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations().inc("runningTests"); - Job job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(jobId).field("state").notEqual(State.PAUSED), updateJobStatus); - if (job != null) { + if (test != null) { + AtomicUpdater testResetUpdater = getUpdater(Test.class) + .set("status", Test.Status.PENDING) + .set("assignedAgent", null) + .set("startTime", null).whereId(test.getId()); + + Optional opJobNotPaused = jobRepository.findByIdAndStateNot(jobId, State.PAUSED); // find NOT PAUSED job + if (opJobNotPaused.isPresent()) { + Job job = opJobNotPaused.get(); + + if (!job.getAgentGroups().contains(agent.getGroupName())) { + // dismiss Agent if it doesn't belong to the job's agent group + testResetUpdater.execute(); + return null; + } + + // JOB + AtomicUpdater jobUpdater = getUpdater(Job.class); + jobUpdater + .inc("runningTests") + .set("state", State.RUNNING); + + // BUILD + AtomicUpdater buildStatusUpdater = getUpdater(BuildStatus.class); + buildStatusUpdater.inc("runningTests"); + if (job.getStartTime() == null) { + jobUpdater.set("startTime", new Date()); + buildStatusUpdater + .inc("runningJobs") + .dec("pendingJobs"); + } + + + int updated = jobUpdater.whereId(job.getId()).execute(); // UPDATE job + if (updated == 0) { + logger.error("Job {} cannot be updated", job.getId()); + return null; + } + job = jobRepository.findById(job.getId()).get(); + + updated = buildStatusUpdater.whereId(job.getBuild().getBuildStatus().getId()).execute(); // UPDATE build + if (updated == 0) { + logger.error("build {} cannot be updated", job.getBuild().getId()); + return null; + } + Build build = buildRepository.findById(job.getBuild().getId()).get(); + if (logger.isDebugEnabled()) { logger.debug("After incrementing runningTests for jobId [{}] runningTests [{}]", jobId, job.getRunningTests()); } - UpdateOperations buildUpdateOperations = buildDAO.createUpdateOperations().inc("buildStatus.runningTests"); - UpdateOperations jobUpdateOperations = jobDAO.createUpdateOperations(); - jobUpdateOperations.set("state", State.RUNNING); - if (job.getStartTime() == null) { - jobUpdateOperations.set("startTime", new Date()); - buildUpdateOperations.inc("buildStatus.runningJobs").dec("buildStatus.pendingJobs"); + + logger.info("agent [{}] got test id: [{}], test-state:[{}]", agent.getName(), test.getId(), test.getStatus()); + + // AGENT + agent.addCurrentTest(test.getId()); + agent.setState(Agent.State.RUNNING); + agent = agentRepository.saveAndFlush(agent); // SAVE agent + + broadcastMessage(MODIFIED_TEST, test); + broadcastMessage(MODIFIED_JOB, job); + broadcastMessage(MODIFIED_BUILD, build); + broadcastMessage(MODIFIED_AGENT, agent); + + return test; + } else { + // TEST - set back to PENDING if job is PAUSED + int updated = testResetUpdater.execute(); + if (updated == 0) { + logger.error("Test {} cannot be updated", test.getId()); + return null; } - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(jobId).field("state").notEqual(State.PAUSED), jobUpdateOperations); - agentUpdateOps.add("currentTests", result.getId()); - agentUpdateOps.set("state", Agent.State.RUNNING); - if (job != null) { - Build build = buildDAO.getDatastore().findAndModify(buildDAO.createIdQuery(job.getBuild().getId()), - buildUpdateOperations); - broadcastMessage(MODIFIED_JOB, job); - if (build != null) { - broadcastMessage(MODIFIED_BUILD, build); + test = testRepository.findById(test.getId()).get(); + + + // AGENT + if (agent.getCurrentTests().contains(test.getId())) { + agent.getCurrentTests().remove(test.getId()); // take the test assigment away from the agent + if (agent.getCurrentTests().isEmpty()) { + agent.setState(Agent.State.IDLING); } - } - logger.info("agent [{}] got test id: [{}], test-state:[{}]", agent.getName(), result.getId(), result.getStatus()); - broadcastMessage(MODIFIED_TEST, result); - } else { - // return the test to the pool. - logger.info("Did not find relevant job, returning the test {} to the pool", result.getId()); - updateOps = testDAO.createUpdateOperations().set("status", Test.Status.PENDING) - .unset("assignedAgent").unset("startTime"); - Test test = testDAO.getDatastore().findAndModify(query, updateOps, false, false); - broadcastMessage(MODIFIED_TEST, test); + agent = agentRepository.saveAndFlush(agent); // SAVE agent + + logger.info("Did not find relevant job, returning the test {} to the pool", test.getId()); + + broadcastMessage(MODIFIED_AGENT, agent); + if (pj != null) { + broadcastMessage(MODIFIED_JOB, pj); + } - agent = agentDAO.getDatastore().findAndModify(agentDAO.createIdQuery(agent.getId()), - agentDAO.createUpdateOperations().removeAll("currentTests", result.getId()), false, true); - if (agent.getCurrentTests().isEmpty()) { - Agent idling = agentDAO.getDatastore().findAndModify(agentDAO.createIdQuery(agent.getId()).where("this.currentTests.length == 0"), - agentDAO.createUpdateOperations().set("state", Agent.State.IDLING)); - if (idling != null) { - agent = idling; + if (agent.getState() == Agent.State.IDLING) { logger.warn("agent [{}] is idling from getTest because finished all his tests", agent.getName()); } } - broadcastMessage(MODIFIED_AGENT, agent); - if (pj != null) { - broadcastMessage(MODIFIED_JOB, pj); - } - return null; + return null; // to stop agent going over and over the PAUSED test - return null } } else { logger.info("agent [{}] didn't find ready test for job: [{}]", agent.getName(), jobId); } - agent = agentDAO.getDatastore().findAndModify(agentDAO.createIdQuery(agent.getId()), agentUpdateOps, false, true); + + agent = agentRepository.saveAndFlush(agent); broadcastMessage(MODIFIED_AGENT, agent); - return result; + return null; // this will stop agent seeking for a pending job } private Object getAgentLock(Agent agent) { @@ -2018,123 +2316,149 @@ public Response subscribe(final Agent agent) { checkServerStatus(); agentLocks.putIfAbsent(agent.getName(), new Object()); - Agent found = agentDAO.findOne("name", agent.getName()); - if (found != null) { - // clear older agent data from other jobs. - if (found.getState() == Agent.State.PREPARING) { + String foundAgentId = null; + Agent foundAgent = null; + Optional opFoundAgent = agentRepository.findByName(agent.getName()); + // clear older agent data from other jobs. + if (opFoundAgent.isPresent()) { + foundAgent = opFoundAgent.get(); + foundAgentId = foundAgent.getId(); + if (foundAgent.getState() == Agent.State.PREPARING) { // clear job data if exists. - if (found.getJobId() != null && !found.getJobId().isEmpty()) { - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations().removeAll("preparingAgents", agent.getName()); - Job oldJob = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(found.getJobId()), updateJobStatus); + if (foundAgent.getJobId() != null && !foundAgent.getJobId().isEmpty()) { + AtomicUpdater jobUpdater = getUpdater(Job.class); + jobUpdater + .remove("preparing_agents", foundAgent.getName()) + .whereId(foundAgent.getJobId()).execute(); + Job oldJob = jobRepository.findById(foundAgent.getJobId()).get(); + broadcastMessage(MODIFIED_JOB, oldJob); } - } else if (found.getState() == Agent.State.RUNNING && !found.getCurrentTests().isEmpty() && found.getJobId() != null) { - returnTests(found); + } else if (foundAgent.getState() == Agent.State.RUNNING && !foundAgent.getCurrentTests().isEmpty() && foundAgent.getJobId() != null) { + returnTests(foundAgent); } } - Query basicQuery = basicJobQuery(); - //Return jobs that need more agents that it has now - basicQuery.or( - basicQuery.and(basicQuery.criteria("preparingAgents").exists(), - new WhereCriteria("this.preparingAgents.length < (this.totalTests + this.numOfTestRetries - this.passedTests - this.failedTests - this.runningTests)")), - basicQuery.criteria("preparingAgents").doesNotExist() - ); + Agent newAgent = new Agent(); // create new Agent to subscribe + newAgent.setId(foundAgentId); + newAgent.setLastTouchTime(new Date()); + if (agent.getHost() != null) { + newAgent.setHost(agent.getHost()); + newAgent.setHostAddress(agent.getHostAddress()); + newAgent.setPid(agent.getPid()); + newAgent.setCapabilities(agent.getCapabilities()); + } + newAgent.setName(agent.getName()); + newAgent.setCurrentTests(new HashSet<>()); + newAgent.setGroupName(agent.getGroupName()); + newAgent.setWorkersCount(agent.getWorkersCount()); + newAgent.setState(Agent.State.IDLING); + + Agent subscribedAgent; + Job job; + synchronized (subscribeToJobLock) { // prevent multiple agents pick up the same job because this awakens multiple agents for just 1 test + job = findJob(agent.getCapabilities(), JobSpecifications.preparingAgentsCondition(agent.getWorkersCount()), agent.getGroupName()); + if (job != null) { + newAgent.setJobId(job.getId()); + newAgent.setState(Agent.State.PREPARING); - Job job = findJob(agent.getCapabilities(), basicQuery, agent.getGroupName()); + AtomicUpdater jobUpdater = getUpdater(Job.class); + jobUpdater.add("preparing_agents", agent.getName()); - UpdateOperations updateOps = agentDAO.createUpdateOperations() - .set("lastTouchTime", new Date()); - if (agent.getHost() != null) { - updateOps.set("host", agent.getHost()); - updateOps.set("hostAddress", agent.getHostAddress()); - updateOps.set("pid", agent.getPid()); - updateOps.set("capabilities", agent.getCapabilities()); - } - updateOps.set("currentTests", new HashSet()); - updateOps.set("groupName", agent.getGroupName()); - if (job != null) { - updateOps.set("jobId", job.getId()); - updateOps.set("state", Agent.State.PREPARING); - UpdateOperations updateJobStatus = jobDAO.createUpdateOperations().add("preparingAgents", agent.getName()); - // update startPrepareTime only if not set - if (job.getStartPrepareTime() == null) { - logger.info("agent [host:[{}], name:[{}]] start prepare on job [id:[{}], name:[{}]].", agent.getHost(), agent.getName(), job.getId(), job.getSuite().getName()); - updateJobStatus.set("startPrepareTime", new Date()); - } - // job can be run = not a zombie - if (job.getLastTimeZombie() != null) { - updateJobStatus.unset("lastTimeZombie"); - } - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(job.getId()), updateJobStatus); - broadcastMessage(MODIFIED_JOB, job); - } else { - updateOps.set("state", Agent.State.IDLING); + if (job.getStartPrepareTime() == null) { + logger.info("agent [host:[{}], name:[{}]] start prepare on job [id:[{}], name:[{}]].", newAgent.getHost(), newAgent.getName(), job.getId(), job.getSuite().getName()); + jobUpdater.set("startpreparetime", new Date()); + } + // job can be run = not a zombie + if (job.getLastTimeZombie() != null) { + jobUpdater.set("lasttimezombie", null); + } + jobUpdater.whereId(job.getId()).execute(); + job = jobRepository.findById(job.getId()).get(); + broadcastMessage(MODIFIED_JOB, job); + } + + subscribedAgent = agentRepository.saveAndFlush(newAgent); } - Agent readyAgent = agentDAO.getDatastore().findAndModify(agentDAO.createQuery().field("name").equal(agent.getName()), updateOps, false, true); - if (found == null) { + if (foundAgent == null) { String agentIp = agent.getHostAddress(); if (offlineAgents.containsKey(agentIp)) { offlineAgents.remove(agentIp); broadcastMessage(DELETED_OFFLINE_AGENT, agentIp); } - broadcastMessage(MODIFIED_AGENTS_COUNT, agentDAO.count()); + broadcastMessage(MODIFIED_AGENTS_COUNT, agentRepository.count()); } - if (readyAgent != null && readyAgent.getState().equals(Agent.State.IDLING)) { - logger.debug("agent [{}] is idling at subscribe because didn't find job", readyAgent.getName()); + if (subscribedAgent.getState().equals(Agent.State.IDLING)) { + logger.debug("agent [{}] is idling at subscribe because didn't find job", subscribedAgent.getName()); } //TODO this event is sent every 10 seconds (jobPollInteval) per agent //TODO Check if it is necessary to send it //logger.info(">>> Modified Agent " +agent.getHost()+ " subscribe"); - broadcastMessage(MODIFIED_AGENT, readyAgent); + broadcastMessage(MODIFIED_AGENT, subscribedAgent); return Response.ok(job).build(); } - private Job findJob(Set capabilities, Query basicQuery, String agentGroup) { - List jobs = null; - Job job = null; + private Job findJob(Set capabilities, Specification additionalSpec, String agentGroup) { + Sort sort = Sort.by(Sort.Direction.DESC, "priority") + .and(Sort.by(Sort.Direction.ASC, "submitTime")); // orderBy most priority first + + List jobs; + Specification spec; // WHERE + // Search Job with requirements - if (!capabilities.isEmpty()) { // if agent has capabilities + /*if (!capabilities.isEmpty()) { // if agent has capabilities Query requirementsQuery = basicQuery.cloneQuery(); jobs = requirementsQuery.field("suite.requirements").in(capabilities).asList(); - } - if (jobs != null && jobs.size() > 0) { // if found jobs with match requirements - List jobsFiltered = CapabilitiesAndRequirements.filterByCapabilities(jobs, capabilities); // filter jobs with not supported requirements - if (jobsFiltered != null && !jobsFiltered.isEmpty() && agentGroup != null) { - jobsFiltered = CapabilitiesAndRequirements.filterByGroupNames(jobsFiltered, agentGroup);// filter jobs with not suitable agent groups + }*/ + if (capabilities != null && !capabilities.isEmpty()) { + spec = Specification.where(JobSpecifications.isReadyOrRunning()) + .and(JobSpecifications.hasAnyOfCapabilitiesInRequirements(capabilities)); // AND + if (agentGroup != null) { + spec = spec.and(JobSpecifications.hasAgentGroup(agentGroup)); // AND } - if (jobsFiltered != null && !jobsFiltered.isEmpty()) { - jobsFiltered.sort(Comparator.comparing(Job::getPriority).reversed()); - job = jobsFiltered.get(0); + if (additionalSpec != null) { + spec = spec.and(additionalSpec); // AND } - } - if (job == null) { // search for jobs without requirements - Query noRequirementsQuery = basicQuery.cloneQuery(); - noRequirementsQuery.field("suite.requirements").doesNotExist(); - jobs = jobDAO.find(noRequirementsQuery).asList(); - if (agentGroup != null) { - jobs = CapabilitiesAndRequirements.filterByGroupNames(jobs, agentGroup); - } + jobs = jobRepository.findAll(spec, sort); if (!jobs.isEmpty()) { - jobs.sort(Comparator.comparing(Job::getPriority).reversed()); - job = jobs.get(0); + return jobs.get(0); // job with capabilities } } - return job; + + // --- Here Specification gets reset because no jobs were found + // Search Job without requirements + spec = Specification.where(JobSpecifications.isReadyOrRunning()) // WHERE + .and(JobSpecifications.hasNoRequirements()); // AND + + if (agentGroup != null) { + spec = spec.and(JobSpecifications.hasAgentGroup(agentGroup)); // AND + } + if (additionalSpec != null) { + spec.and(additionalSpec); // AND + } + + jobs = jobRepository.findAll(spec, sort); + + return jobs.isEmpty() ? null : jobs.get(0); // job without capabilities } private Build getLatestBuild(String branch) { - return buildDAO.findOne(buildDAO.createQuery().order("-buildTime").field("branch").equal(branch)); + return buildRepository.findLatestBuildByBranch(branch); } - private int getHighestPriorityJob() { - PrioritizedJob prioritizedJob = prioritizedJobDAO.findOne(prioritizedJobDAO.createQuery().filter("isPaused", false).order("-priority")); - if (prioritizedJob != null) { - logger.info("Highest Priority of jobs: " + prioritizedJob.getPriority()); - return prioritizedJob.getPriority(); + private int getNotPausedHighestPriorityJob() { + Optional prioritizedJob = prioritizedJobRepository.findTopByIsPausedFalseOrderByPriorityDesc(); // highest: 4, lowest: 0 + if (prioritizedJob.isPresent()) { + return prioritizedJob.map(pj -> { + logger.info("Highest Priority of jobs: " + pj.getPriority()); + return pj.getPriority(); + }).orElseGet(() -> { + logger.info("Didn't find prioritized jobs, returning 0"); + return 0; + }); } logger.info("Didn't find prioritized jobs, returning 0"); return 0; @@ -2146,24 +2470,21 @@ private int getHighestPriorityJob() { @Consumes(MediaType.APPLICATION_JSON) public Boolean hasHigherPriorityJob(@PathParam("agentId") final String agentId, @PathParam("jobId") final String jobId) { - Agent agent = agentDAO.findOne(agentDAO.createIdQuery(agentId)); + Optional opAgent = agentRepository.findById(agentId); + Agent agent = opAgent.orElseThrow(() -> new RuntimeException("Agent [" + agentId + "] does not exist"));; - List prioritizedJobs = prioritizedJobDAO.find(prioritizedJobDAO.createQuery().filter("isPaused", false).order("-priority")).asList(); + List prioritizedJobs = prioritizedJobRepository.findByIsPausedFalseOrderByPriorityDesc(); if (prioritizedJobs.isEmpty()) { return false; } - Job job = jobDAO.findOne(jobDAO.createIdQuery(jobId)); + Optional opJob = jobRepository.findById(jobId); + Job job = opJob.orElseThrow(() -> new RuntimeException("Job [" + jobId + "] does not exist")); for (PrioritizedJob prioritizedJob : prioritizedJobs) { if (prioritizedJob.getPriority() > job.getPriority()) { if (prioritizedJob.getAgentGroups().contains(agent.getGroupName()) && agent.getCapabilities().containsAll(prioritizedJob.getRequirements())) { - Query jobQuery = jobDAO.createIdQuery(prioritizedJob.getJobId()); - jobQuery.or(jobQuery.and(jobQuery.criteria("preparingAgents").exists(), - new WhereCriteria("this.preparingAgents.length < (this.totalTests + this.numOfTestRetries - this.passedTests - this.failedTests - this.runningTests)")), - jobQuery.criteria("preparingAgents").doesNotExist()); - jobQuery.filter("totalTests != ", 0); - if (jobQuery.countAll() == 1) { + if (jobRepository.count(JobSpecifications.whereJobId(prioritizedJob.getJobId()).and(hasPreparingAgents())) == 1) { return true; } } @@ -2178,7 +2499,9 @@ public Boolean hasHigherPriorityJob(@PathParam("agentId") final String agentId, @Path("job/{jobId}/edit") @Produces(MediaType.APPLICATION_JSON) public Job changeJob(final @PathParam("jobId") String jobId, EditJobRequest jobRequest) { - Job job = jobDAO.findOne(jobDAO.createIdQuery(jobId)); + Optional opJob = jobRepository.findById(jobId); + Job job = opJob.orElseThrow(() -> new RuntimeException("Job [" + jobId + "] does not exist"));; + int currPriority = job.getPriority(); Set currAgentGroups = job.getAgentGroups(); synchronized (changeJobPriorityLock) { @@ -2187,8 +2510,14 @@ public Job changeJob(final @PathParam("jobId") String jobId, EditJobRequest jobR return job; } - UpdateOperations jobUpdate = jobDAO.createUpdateOperations().set("priority", jobRequest.getPriority()).set("agentGroups", jobRequest.getAgentGroups()); - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(job.getId()), jobUpdate); + AtomicUpdater jobUpdater = getUpdater(Job.class); + jobUpdater + .set("priority", jobRequest.getPriority()) + .set("agent_groups", jobRequest.getAgentGroups()) + .whereId(jobId) + .execute(); + + job = jobRepository.findById(job.getId()).get(); if (currPriority != jobRequest.getPriority()) { if (currPriority == 0) { createPrioritizedJob(job); @@ -2196,10 +2525,14 @@ public Job changeJob(final @PathParam("jobId") String jobId, EditJobRequest jobR if (jobRequest.getPriority() == 0) { deletePrioritizedJob(job); } else { - UpdateOperations prioritizedJobUpdate = prioritizedJobDAO.createUpdateOperations().set("priority", jobRequest.getPriority()).set("agentGroups", jobRequest.getAgentGroups()); - ; - prioritizedJobDAO.getDatastore().findAndModify(prioritizedJobDAO.createQuery().field("jobId").equal(job.getId()), prioritizedJobUpdate); - highestPriorityJob = getHighestPriorityJob(); + Optional opPrioritizedJob = prioritizedJobRepository.findByJobId(job.getId()); + + PrioritizedJob prioritizedJob = opPrioritizedJob.get(); + prioritizedJob.setPriority(jobRequest.getPriority()); + prioritizedJob.setAgentGroups(jobRequest.getAgentGroups()); + + prioritizedJobRepository.saveAndFlush(prioritizedJob); + highestPriorityJob = getNotPausedHighestPriorityJob(); } } } @@ -2213,19 +2546,22 @@ public Job changeJob(final @PathParam("jobId") String jobId, EditJobRequest jobR @Path("build") @Produces(MediaType.APPLICATION_JSON) // @RolesAllowed("admin") - public Batch getBuilds(@DefaultValue("0") @QueryParam("offset") int offset, + public Batch getBuilds(@DefaultValue("0") @QueryParam("offset") int offset, @DefaultValue("50") @QueryParam("limit") int limit, @DefaultValue("false") @QueryParam("all") boolean all , @QueryParam("orderBy") List orderBy , @Context UriInfo uriInfo) { - Query query = buildDAO.createQuery(); - if (!all) { - query.offset(offset).limit(limit); - } - if (orderBy != null) { - orderBy.forEach(query::order); + + Sort sort = convertOrderByToSort(orderBy); + + Pageable pageable = all ? Pageable.unpaged() : convertOffsetLimitToPage(offset, limit, sort); + List buildProjections = buildRepository.findAllForViewList(pageable).getContent(); + List builds = new ArrayList<>(buildProjections.size()); + + for (PBuildForView buildProjection : buildProjections) { + builds.add(new BuildDTO(buildProjection)); } - return new Batch<>(buildDAO.find(query).asList(), offset, limit, all, orderBy, uriInfo); + return new Batch<>(builds, offset, limit, all, orderBy, uriInfo); } @@ -2240,48 +2576,50 @@ public Batch getLatestBuilds(@DefaultValue("0") @QueryParam("offset") int @DefaultValue("true") @QueryParam("with-all-jobs-completed") boolean withAllJobsCompleted, @Context UriInfo uriInfo) { - Query query = buildDAO.createQuery(); - if (!all) { - query.offset(offset).limit(limit); - } - - List orderBy = new ArrayList<>(1); - orderBy.add("-buildTime"); - orderBy.forEach(query::order); + Specification spec = Specification.where(null); + Set tagsSet = null; - Set tagsSet; if (tagsStr != null && !tagsStr.isEmpty()) { tagsSet = new HashSet<>(Arrays.asList(tagsStr.split("\\s*,\\s*"))); - if (!tagsSet.isEmpty()) { // build should be with specifics tags - query.field("tags").hasAllOf(tagsSet); - } + } + + if (tagsSet != null && !tagsSet.isEmpty()) { + spec = spec.and(BuildSpecifications.hasAllTags(tagsSet)); } if (branchStr != null && !branchStr.isEmpty()) { - query.field("branch").equal(branchStr); + spec = spec.and(BuildSpecifications.hasBranch(branchStr)); } if (withAllJobsCompleted) { - query = query - .where("this.buildStatus.totalJobs>0") - .where( - "this.buildStatus.doneJobs + this.buildStatus.brokenJobs == this.buildStatus.totalJobs"); + spec = spec.and(BuildSpecifications.hasAllJobsCompleted()); + } + + List orderBy = Collections.singletonList("-buildTime"); + Sort sort = convertOrderByToSort(orderBy); + + List builds; + if (all) { + builds = buildRepository.findAll(spec, sort); + } else { + Pageable pageable = convertOffsetLimitToPage(offset, limit, sort); + builds = buildRepository.findAll(spec, pageable).getContent(); } - return new Batch<>(buildDAO.find(query).asList(), offset, limit, all, orderBy, uriInfo); + return new Batch<>(builds, offset, limit, all, orderBy, uriInfo); } @PUT @Path("build") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public Build createBuild(final Build build) { + public Build createBuild(Build build) { if (build.getBuildTime() == null) { build.setBuildTime(new Date()); } - build.setBuildStatus(new BuildStatus()); - buildDAO.save(build); + build = buildRepository.save(build); broadcastMessage(CREATED_BUILD, build); + return build; } @@ -2295,12 +2633,12 @@ public Build appendToBuild(final Build build) { throw new BadRequestException("can't append to build " + build + " without a name"); } - Build found = buildDAO.findOne(buildDAO.createQuery().field("name").equal(build.getName())); + Build found = buildRepository.findTopByNameOrderByBuildTimeDesc(build.getName()); if (found == null) { throw new BadRequestException("can't append to build " + build + " since it does not exists"); } - if (build.getId() != null && !found.getId().equalsIgnoreCase(build.getId())) { + if (build.getId() != null && !found.getId().equals(build.getId())) { throw new UnsupportedOperationException("appending build id is not supported"); } @@ -2313,11 +2651,17 @@ public Build appendToBuild(final Build build) { } if (build.getResources() != null && !build.getResources().isEmpty()) { - found.getResources().addAll(build.getResources()); + List appendedResources = (List) found.getResources(); + appendedResources.addAll(build.getResources()); + // replace resources with appended + found.setResources(appendedResources); } if (build.getTestsMetadata() != null && !build.getTestsMetadata().isEmpty()) { - found.getTestsMetadata().addAll(build.getTestsMetadata()); + List appendedMetadata = (List) found.getTestsMetadata(); + appendedMetadata.addAll(build.getTestsMetadata()); + // replace metadata with appended + found.setTestsMetadata(appendedMetadata); } if (build.getTags() != null && !build.getTags().isEmpty()) { @@ -2332,46 +2676,52 @@ public Build appendToBuild(final Build build) { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) public Build updateBuild(final @PathParam("id") String id, final Build build) { - UpdateOperations updateOps = buildDAO.createUpdateOperations(); + Optional optional = buildRepository.findById(id); + if (!optional.isPresent()) { + return null; + } + + Build existingBuild = optional.get(); + if (build.getShas() != null) { - //noinspection SpellCheckingInspection - updateOps.set("shas", build.getShas()); + existingBuild.setShas(build.getShas()); } if (build.getBranch() != null) { - updateOps.set("branch", build.getBranch()); + existingBuild.setBranch(build.getBranch()); } if (build.getResources() != null) { - updateOps.set("resources", build.getResources()); + existingBuild.setResources(build.getResources()); } if (build.getTestsMetadata() != null) { - updateOps.set("testsMetadata", build.getTestsMetadata()); + existingBuild.setTestsMetadata(build.getTestsMetadata()); } if (build.getTags() != null) { - updateOps.set("tags", build.getTags()); - } - Query query = buildDAO.createIdQuery(id); - Build result = buildDAO.getDatastore().findAndModify(query, updateOps); - if (result != null) { - broadcastMessage(MODIFIED_BUILD, result); + existingBuild.setTags(build.getTags()); } - return result; + + Build savedBuild = buildRepository.save(existingBuild); + broadcastMessage(MODIFIED_BUILD, savedBuild); + + return savedBuild; } @POST @Path("job/{id}") @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public Job updateJob(final @PathParam("id") String id, final Job job) { - UpdateOperations updateOps = jobDAO.createUpdateOperations(); - if (job.getState() != null) { - updateOps.set("state", job.getState()); + public Job updateJob(final @PathParam("id") String id, final Job updatedJob) { + int updated = 0; + if (updatedJob.getState() != null) { + updated = getUpdater(Job.class).set("state", updatedJob.getState()).whereId(id).execute(); } - Query query = jobDAO.createIdQuery(id); - Job result = jobDAO.getDatastore().findAndModify(query, updateOps); - if (result != null) { - broadcastMessage(MODIFIED_JOB, result); + if (updated != 0) { + Job job = jobRepository.findById(id).get(); + broadcastMessage(MODIFIED_JOB, job); + + return job; } - return result; + + return null; } @POST @@ -2391,26 +2741,25 @@ public Suite updateSuite(Suite suite) { } } - UpdateOperations updateOps = suiteDAO.createUpdateOperations(); + Optional opSuite = suiteRepository.findById(suite.getId()); + Suite existingSuite = opSuite.orElseThrow(() -> new RuntimeException("Suite [" + suite.getId() + "] does not exist"));; + if (suite.getCriteria() != null) { - updateOps.set(CRITERIA_PROP_NAME, suite.getCriteria()); + existingSuite.setCriteria(suite.getCriteria()); } if (suite.getCustomVariables() != null) { - updateOps.set("customVariables", suite.getCustomVariables()); + existingSuite.setCustomVariables(suite.getCustomVariables()); } if (suite.getName() != null) { - updateOps.set("name", suite.getName()); + existingSuite.setName(suite.getName()); } if (suite.getRequirements() != null) { - updateOps.set("requirements", suite.getRequirements()); - } - String id = suite.getId(); - Query query = suiteDAO.createIdQuery(id); - Suite result = suiteDAO.getDatastore().findAndModify(query, updateOps); - if (result != null) { - broadcastMessage(MODIFIED_SUITE, createSuiteWithJobs(result)); + existingSuite.setRequirements(suite.getRequirements()); } + Suite savedSuite = suiteRepository.save(existingSuite); + broadcastMessage(MODIFIED_SUITE, createSuiteWithJobs(PSuiteDTO.fromEntity(savedSuite))); + return suite; } @@ -2418,12 +2767,28 @@ public Suite updateSuite(Suite suite) { @GET @Path("build/{id}") @Produces(MediaType.APPLICATION_JSON) - public Build getBuild(final @PathParam("id") String id) { - Build build = buildDAO.findOne(buildDAO.createIdQuery(id)); - logger.info("Build [" + build.getName() + "] [" + build.getId() + "] shas:" + Arrays.toString(build.getShas().entrySet().toArray(new Map.Entry[build.getShas().size()]))); - return build; + public BuildDTO getBuild(final @PathParam("id") String id) { + Optional opBuild = buildRepository.findById(id); + Build build = opBuild.orElseThrow(() -> new RuntimeException("Build [" + id + "] does not exist"));; + + logger.info("Build [" + build.getName() + "] [" + build.getId() + "] shas:" + Arrays.toString(build.getShas().entrySet().toArray())); + return BuildDTO.fromEntity(build); } + // TODO - 3 methods are going below might be needed. Review is needed + /*@GET + @Path("db") + @Produces(MediaType.APPLICATION_JSON) + public Response getCollections() { + MongoDatabase db = mongoClient.getDatabase(config.getMongo().getDb()); + List res = new ArrayList<>(); + for (String name : db.listCollectionNames()) { + if (!"system.indexes".equals(name)) { + res.add(name); + } + } + return Response.ok(Entity.json(res)).build(); + } @DELETE @Path("db") @@ -2441,18 +2806,62 @@ public Response deleteCollections() { return Response.ok(Entity.json(deleted)).build(); } + @DELETE + @Path("db/{collectionName}") + @Produces(MediaType.APPLICATION_JSON) + public Response deleteCollection(final @PathParam("collectionName") String collectionName) { + MongoDatabase db = mongoClient.getDatabase(config.getMongo().getDb()); + MongoCollection myCollection = db.getCollection(collectionName); + if (myCollection != null) { + myCollection.drop(); + return Response.ok(Entity.json(collectionName)).build(); + } + return Response.ok().build(); + }*/ + @DELETE @Path("job/{jobId}") @Produces(MediaType.APPLICATION_JSON) public Response deleteJob(final @PathParam("jobId") String jobId) { - Job deletedJob = performDeleteJob(jobId); - if (deletedJob.getPriority() > 0) { - deletePrioritizedJob(deletedJob); + Optional opJob = jobRepository.findById(jobId); + if (!opJob.isPresent()) { + return Response.status(Response.Status.NOT_FOUND).build(); } - performDeleteTestsLogs(jobId); - performDeleteJobSetupLogs(jobId); - updateBuildWithDeletedJob(deletedJob); - performDeleteTests(jobId); + Job deleteCandidate = opJob.get(); + + // Delete job from repository immediately + jobRepository.deleteById(deleteCandidate.getId()); + jobRepository.flush(); // Ensure deletion is committed + + // Delete prioritized job if needed (must be done immediately) + if (deleteCandidate.getPriority() > 0) { + deletePrioritizedJob(deleteCandidate); + } + + // Update build status immediately so UI shows correct counts + updateBuildWithDeletedJob(deleteCandidate); + + // Broadcast deletion immediately so UI updates + broadcastMessage(MODIFIED_JOB, deleteCandidate); + + // Perform cleanup asynchronously to avoid blocking the UI + executor.submit(() -> { + try { + logger.info("Starting async cleanup for job {}", jobId); + + // Delete tests from database + testRepository.deleteByJobId(jobId); + logger.info("Deleted tests for job {}", jobId); + + // Delete log files (can be slow for large directories) + performDeleteTestsLogs(jobId); + performDeleteJobSetupLogs(jobId); + + logger.info("Completed async cleanup for job {}", jobId); + } catch (Exception e) { + logger.error("Error during async cleanup of job " + jobId, e); + } + }); return Response.ok(Entity.json(jobId)).build(); } @@ -2460,27 +2869,71 @@ public Response deleteJob(final @PathParam("jobId") String jobId) { @Path("jobs/deletejobs") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) - public synchronized List deletejobs(final List ids) { - List result = new ArrayList<>(ids.size()); - for (String jobId : ids) { - Job deletedJob = performDeleteJob(jobId); - if (deletedJob.getPriority() > 0) { - deletePrioritizedJob(deletedJob); - } - performDeleteTestsLogs(jobId); - performDeleteJobSetupLogs(jobId); - updateBuildWithDeletedJob(deletedJob); - performDeleteTests(jobId); - result.add(deletedJob); - broadcastMessage(MODIFIED_JOB, deletedJob); + public synchronized Iterable deletejobs(final List ids) { + Iterable jobs = jobRepository.findAllById(ids); + List deletedJobs = new ArrayList<>(); + + // Delete all jobs from repository immediately and perform immediate updates + for (Job deleteJobCandidate : jobs) { + jobRepository.deleteById(deleteJobCandidate.getId()); + deletedJobs.add(deleteJobCandidate); + + // Delete prioritized job if needed (must be done immediately) + if (deleteJobCandidate.getPriority() > 0) { + deletePrioritizedJob(deleteJobCandidate); + } + + // Update build status immediately so UI shows correct counts + updateBuildWithDeletedJob(deleteJobCandidate); + + // Broadcast message for each job + broadcastMessage(MODIFIED_JOB, deleteJobCandidate); } - return result; + + // Flush to ensure all deletions are committed + jobRepository.flush(); + + // Perform cleanup asynchronously to avoid blocking the UI + executor.submit(() -> { + try { + logger.info("Starting async cleanup for {} jobs", deletedJobs.size()); + + for (Job deleteJobCandidate : deletedJobs) { + try { + String jobId = deleteJobCandidate.getId(); + + // Delete tests from database + testRepository.deleteByJobId(jobId); + + // Delete log files (can be slow for large directories) + performDeleteTestsLogs(jobId); + performDeleteJobSetupLogs(jobId); + + logger.info("Completed async cleanup for job {}", jobId); + } catch (Exception e) { + logger.error("Error during async cleanup of job " + deleteJobCandidate.getId(), e); + } + } + + logger.info("Completed async cleanup for all {} jobs", deletedJobs.size()); + } catch (Exception e) { + logger.error("Error during async cleanup of jobs", e); + } + }); + + return deletedJobs; } private void deletePrioritizedJob(Job job) { - PrioritizedJob deletePrioritizedJob = prioritizedJobDAO.getDatastore().findAndDelete(prioritizedJobDAO.createQuery().field("jobId").equal(job.getId())); - if (job.getPriority() == highestPriorityJob) { - highestPriorityJob = getHighestPriorityJob(); + Long deletedCount = prioritizedJobRepository.deleteByJobId(job.getId()); + + if (deletedCount > 0) { + if (job.getPriority() == highestPriorityJob) { + highestPriorityJob = getNotPausedHighestPriorityJob(); + } + } else { + // Already deleted by another thread - let people know. This is fine to avoid handling concurrent call + logger.info("PrioritizedJob for job {} was already deleted. This is OK.", job.getId()); } } @@ -2505,73 +2958,141 @@ private void performDeleteJobSetupLogs(String jobId) { } private void updateBuildWithDeletedJob(Job deletedJob) { - Query query = buildDAO.createIdQuery(deletedJob.getBuild().getId()); - Build associatedBuild = buildDAO.findOne(query); - if (associatedBuild != null) { - BuildStatus associatedBuildStatus = associatedBuild.getBuildStatus(); - State state = deletedJob.getState(); - - UpdateOperations updateOps = buildDAO.createUpdateOperations(); - - if (state == State.DONE) { - int curDoneJobs = associatedBuildStatus.getDoneJobs(); - if (curDoneJobs > 0) { - updateOps.set("buildStatus.doneJobs", curDoneJobs - 1); + Optional opBuild = buildRepository.findById(deletedJob.getBuild().getId()); + if (opBuild.isPresent()) { + Build build = opBuild.get(); + AtomicUpdater buildStatusUpdater = getUpdater(BuildStatus.class); + + if (deletedJob.getState() == State.DONE) { + if (build.getBuildStatus().getDoneJobs() > 0) { + buildStatusUpdater.dec("doneJobs"); + } + } else if (deletedJob.getState() == State.PAUSED) { + if (build.getBuildStatus().getPendingJobs() > 0) { + buildStatusUpdater.dec("pendingJobs"); } - } else if (state == State.PAUSED) { - int curPendingJobs = associatedBuildStatus.getPendingJobs(); - if (curPendingJobs > 0) { - updateOps.set("buildStatus.pendingJobs", curPendingJobs - 1); + } else if (deletedJob.getState() == State.BROKEN) { + if (build.getBuildStatus().getBrokenJobs() > 0) { + buildStatusUpdater.dec("brokenJobs"); } - } else if (state == State.BROKEN) { - int currBrokenJobs = associatedBuildStatus.getBrokenJobs(); - if (currBrokenJobs > 0) { - updateOps.set("buildStatus.brokenJobs", currBrokenJobs - 1); + } + + try { + int updated = buildStatusUpdater.whereId(build.getBuildStatus().getId()).execute(); + if (updated == 0) { + logger.error("Build {} cannot be updated", build.getId()); + return; } + } catch (IllegalStateException ex) { + logger.error("[OK] Failed to update build status for build {}. Reason: {}", build.getId(), ex.getMessage()); } - updateOps.set("buildStatus.totalJobs", associatedBuildStatus.getTotalJobs() - 1); + build = buildRepository.findById(build.getId()).get(); Suite suite = deletedJob.getSuite(); if (suite != null) { - updateOps.removeAll("buildStatus.suitesNames", suite.getName()); - updateOps.removeAll("buildStatus.suitesIds", suite.getId()); + build.getBuildStatus().getSuites().remove(new BuildStatusSuite(suite.getId(), suite.getName())); } - Build modifiedBuild = buildDAO.getDatastore().findAndModify(query, updateOps); - broadcastMessage(MODIFIED_BUILD, modifiedBuild); + build = buildRepository.saveAndFlush(build); + broadcastMessage(MODIFIED_BUILD, build); } } - private Build performDeleteBuild(String buildId) { - Query idBuildQuery = buildDAO.createIdQuery(buildId); - Datastore datastore = buildDAO.getDatastore(); - return datastore.findAndDelete(idBuildQuery); + @DELETE + @Path("agent/{agentId}") + @Produces(MediaType.APPLICATION_JSON) + public Response deleteAgent(final @PathParam("agentId") String agentId) { + agentRepository.deleteById(agentId); + broadcastMessage(MODIFIED_AGENTS_COUNT, agentRepository.count()); + return Response.ok(Entity.json(agentId)).build(); } - private Job performDeleteJob(String jobId) { - Query idJobQuery = jobDAO.createIdQuery(jobId); - Datastore datastore = jobDAO.getDatastore(); - return datastore.findAndDelete(idJobQuery); + @GET + @Path("crypto/public-key") + @Produces(MediaType.TEXT_PLAIN) + public Response getPublicKey() { + try { + String keysDir = System.getProperty("newman.keys.dir", "../keys"); + String publicKey = SSHUtils.readPublicKey(keysDir); + return Response.ok(publicKey).build(); + } catch (IOException e) { + logger.error("Failed to read public key", e); + if (e.getMessage().contains("not found")) { + return Response.status(Response.Status.NOT_FOUND) + .entity("Public key not found. Run export-public-key.sh first.").build(); + } + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Failed to read public key: " + e.getMessage()).build(); + } } - private void performDeleteTests(String jobId) { - Query testQuery = testDAO.createQuery(); - testQuery.and(testQuery.criteria("jobId").equal(jobId)); - Datastore datastore = testDAO.getDatastore(); - datastore.delete(testQuery); - } + @POST + @Path("console") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.TEXT_PLAIN) + public Response getConsole(Map request) { + String host = (String) request.get("host"); + String encryptedKey = (String) request.get("encryptedKey"); + String encryptedPem = (String) request.get("encryptedPem"); + String iv = (String) request.get("iv"); + int lines = request.get("lines") != null ? ((Number) request.get("lines")).intValue() : 100; + String since = (String) request.get("since"); + String user = request.get("user") != null ? (String) request.get("user") : "root"; + String service = request.get("service") != null ? (String) request.get("service") : "newman-agent"; + String logFile = (String) request.get("logFile"); + String sinceDate = (String) request.get("sinceDate"); + + // Validate required fields + if (host == null || host.trim().isEmpty()) { + return Response.status(Response.Status.BAD_REQUEST) + .entity("Host is required").build(); + } + if (encryptedKey == null || encryptedPem == null || iv == null) { + return Response.status(Response.Status.BAD_REQUEST) + .entity("Encrypted PEM data is required").build(); + } + + String keysDir = System.getProperty("newman.keys.dir", "../keys"); + String keystorePassword = System.getProperty("newman.keystore.password", "password"); + + java.nio.file.Path tempPemFile = null; + try { + // Decrypt the PEM content + String pemContent = SSHUtils.decryptPemContent(encryptedKey, encryptedPem, iv, keysDir, keystorePassword); - @DELETE - @Path("agent/{agentId}") - @Produces(MediaType.APPLICATION_JSON) - public Response deleteAgent(final @PathParam("agentId") String agentId) { + // Write to temporary file + tempPemFile = SSHUtils.createTempPemFile(pemContent); - Query idAgentQuery = agentDAO.createIdQuery(agentId); - Datastore datastore = agentDAO.getDatastore(); - datastore.findAndDelete(idAgentQuery); - broadcastMessage(MODIFIED_AGENTS_COUNT, agentDAO.count()); - return Response.ok(Entity.json(agentId)).build(); + // Build remote command + String remoteCmd; + if (logFile != null && !logFile.trim().isEmpty()) { + remoteCmd = SSHUtils.buildLogFileCommand(logFile, sinceDate, lines); + } else { + remoteCmd = SSHUtils.buildJournalctlCommand(service, since, lines); + } + + // Execute SSH command + SSHUtils.SSHResult result = SSHUtils.executeSSHCommand(host, user, tempPemFile, remoteCmd, 30); + + if (result.isSuccess()) { + return Response.ok(result.getOutput()).build(); + } else { + if (result.getError().contains("timed out")) { + return Response.status(Response.Status.REQUEST_TIMEOUT) + .entity(result.getError()).build(); + } + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity(result.getError()).build(); + } + + } catch (Exception e) { + logger.error("Failed to execute SSH command for host " + host, e); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR) + .entity("Failed to execute SSH command: " + e.getMessage()).build(); + } finally { + SSHUtils.deleteTempPemFile(tempPemFile); + } } @DELETE @@ -2583,32 +3104,19 @@ public Response deleteOfflineAgent(final @PathParam("agentName") String agentNam return Response.ok(Entity.json(agentName)).build(); } - @DELETE - @Path("db/{collectionName}") - @Produces(MediaType.APPLICATION_JSON) - public Response deleteCollection(final @PathParam("collectionName") String collectionName) { - MongoDatabase db = mongoClient.getDatabase(config.getMongo().getDb()); - MongoCollection myCollection = db.getCollection(collectionName); - if (myCollection != null) { - myCollection.drop(); - return Response.ok(Entity.json(collectionName)).build(); - } - return Response.ok().build(); - } - @DELETE @Path("suite/{suiteId}") @Produces(MediaType.APPLICATION_JSON) public Response deleteSuite(final @PathParam("suiteId") String suite) { - Suite suiteToDelete = suiteDAO.getDatastore().findAndDelete(suiteDAO.createIdQuery(suite)); + Suite suiteToDelete = suiteRepository.findById(suite).orElse(null); if (suiteToDelete != null) { + suiteRepository.deleteById(suiteToDelete.getId()); broadcastMessage(DELETED_SUITE, suiteToDelete); + return Response.ok(Entity.json(suiteToDelete)).build(); } else { logger.info("The suite {} doesn't exist", suite); return Response.status(Response.Status.NOT_FOUND).build(); } - - return Response.ok(Entity.json(suiteToDelete)).build(); } @@ -2621,25 +3129,11 @@ public UserPrefs getCurrentUser(@Context SecurityContext sc) { return userPrefs; } - @GET - @Path("db") - @Produces(MediaType.APPLICATION_JSON) - public Response getCollections() { - MongoDatabase db = mongoClient.getDatabase(config.getMongo().getDb()); - List res = new ArrayList<>(); - for (String name : db.listCollectionNames()) { - if (!"system.indexes".equals(name)) { - res.add(name); - } - } - return Response.ok(Entity.json(res)).build(); - } - @GET @Path("config") @Produces(MediaType.APPLICATION_JSON) public Response getDb() throws JsonProcessingException { - return Response.ok(Entity.json(config.asJSON())).build(); + return Response.status(Response.Status.BAD_REQUEST).build(); } @POST @@ -2653,8 +3147,7 @@ public Response addSuite(final @PathParam("sourceSuiteId") String sourceSuiteId, return Response.status(Response.Status.NOT_FOUND).build(); } - Suite existingSuite = suiteDAO.findOne(suiteDAO.createQuery().field("name").equal(name)); - if (existingSuite != null) { + if (suiteRepository.existsByName(name)) { logger.info("Failed to create suite with name " + name); return Response.status(Response.Status.BAD_REQUEST).entity("Suite [" + name + "] already exists").build(); } @@ -2663,7 +3156,7 @@ public Response addSuite(final @PathParam("sourceSuiteId") String sourceSuiteId, duplicatedSuite.setName(name); duplicatedSuite.setId(null); - suiteDAO.save(duplicatedSuite); + suiteRepository.save(duplicatedSuite); logger.info("---addSuite---" + duplicatedSuite); broadcastMessage(CREATED_SUITE, duplicatedSuite); return Response.ok(duplicatedSuite).build(); @@ -2674,7 +3167,7 @@ public Response addSuite(final @PathParam("sourceSuiteId") String sourceSuiteId, @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Suite addSuite(Suite suite) { - suiteDAO.save(suite); + suiteRepository.save(suite); logger.info("---addSuite---" + suite); broadcastMessage(CREATED_SUITE, suite); return suite; @@ -2684,7 +3177,7 @@ public Suite addSuite(Suite suite) { @Path("suite/{id}") @Produces(MediaType.APPLICATION_JSON) public Suite getSuite(final @PathParam("id") String id) { - return suiteDAO.findOne(suiteDAO.createIdQuery(id)); + return suiteRepository.findById(id).orElse(null); } @GET @@ -2696,9 +3189,9 @@ public Batch getAllSuites(@DefaultValue("0") @QueryParam("offset") in , @QueryParam("orderBy") List orderBy , @Context UriInfo uriInfo) { - List suites = getAllThinSuites(true); + List suites = getThinSuites(true); List suiteViews = new ArrayList<>(suites.size()); - for (Suite suite : suites) { + for (PSuiteThin suite : suites) { suiteViews.add(new SuiteView(suite)); } @@ -2708,9 +3201,8 @@ public Batch getAllSuites(@DefaultValue("0") @QueryParam("offset") in @GET @Path("availableAgentGroups") @Produces(MediaType.APPLICATION_JSON) - public Set getAvailableAgentGroups() { - List agents = agentDAO.find(agentDAO.createQuery()).asList(); - Set availableAgentGroups = agents.stream().map(Agent::getGroupName).collect(Collectors.toSet()); + public List getAvailableAgentGroups() { + List availableAgentGroups = agentRepository.findDistinctAgentGroups(); return availableAgentGroups; } @@ -2719,7 +3211,7 @@ public Set getAvailableAgentGroups() { @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public JobConfig addJobConfig(JobConfig jobConfig) { - jobConfigDAO.save(jobConfig); + jobConfigRepository.save(jobConfig); logger.info("---addJobConfig---" + jobConfig); broadcastMessage(CREATED_JOB_CONFIG, jobConfig); return jobConfig; @@ -2729,7 +3221,7 @@ public JobConfig addJobConfig(JobConfig jobConfig) { @Path("job-config-by-id/{id}") @Produces(MediaType.APPLICATION_JSON) public JobConfig getJobConfigById(final @PathParam("id") String id) { - JobConfig jobConfig = jobConfigDAO.findOne(jobConfigDAO.createIdQuery(id)); + JobConfig jobConfig = jobConfigRepository.findById(id).orElse(null); return jobConfig; } @@ -2737,7 +3229,7 @@ public JobConfig getJobConfigById(final @PathParam("id") String id) { @Path("job-config/{name}") @Produces(MediaType.APPLICATION_JSON) public JobConfig getJobConfigByName(final @PathParam("name") String name) { - JobConfig jobConfig = jobConfigDAO.findOne(jobConfigDAO.createQuery().field("name").equal(name)); + JobConfig jobConfig = jobConfigRepository.findByName(name).orElse(null); return jobConfig; } @@ -2746,7 +3238,7 @@ public JobConfig getJobConfigByName(final @PathParam("name") String name) { @Produces(MediaType.APPLICATION_JSON) public List getAllJobConfig() { - List jobConfigs = jobConfigDAO.find(jobConfigDAO.createQuery()).asList(); + List jobConfigs = jobConfigRepository.findAll(); return jobConfigs; } @@ -2760,19 +3252,38 @@ public JobConfig addJobConfig(@QueryParam("name") String name, @QueryParam("java jobConfig.setJavaVersion(JavaVersion.valueOf(javaVersion)); jobConfig.setName(name); - jobConfigDAO.save(jobConfig); + jobConfigRepository.save(jobConfig); broadcastMessage(CREATED_JOB_CONFIG, jobConfig); return jobConfig; } + @PUT + @Path("job-config/{id}/set-default") + @Produces(MediaType.APPLICATION_JSON) + public Response setDefaultJobConfig(@PathParam("id") final String id) { + Optional opJobConfig = jobConfigRepository.findById(id); + if (!opJobConfig.isPresent()) { + logger.warn("JobConfig with id {} not found", id); + return Response.status(Response.Status.NOT_FOUND).entity("JobConfig not found").build(); + } + + jobConfigRepository.unsetAllDefaults(); + JobConfig jobConfig = opJobConfig.get(); + jobConfig.setDefault(true); + jobConfigRepository.save(jobConfig); + + logger.info("Set JobConfig {} as default", id); + broadcastMessage(CREATED_JOB_CONFIG, jobConfig); + + return Response.ok(jobConfig).build(); + } + @GET @Path("java-versions") @Produces(MediaType.APPLICATION_JSON) public List getAllJavaVersions() { - List javaVersions = Arrays.asList(JavaVersion.values()); - - return javaVersions; + return Arrays.asList(JavaVersion.values()); } /** @@ -2780,17 +3291,14 @@ public List getAllJavaVersions() { * * @return */ - private List getAllThinSuites(boolean withCustomVariables) { - - Query suitesQuery = suiteDAO.createQuery(); + private List getThinSuites(boolean withCustomVariables) { + List suites; if (withCustomVariables) { - suitesQuery.retrievedFields(true, "id", "name", "customVariables"); + suites = suiteRepository.findAllThinWithCustomVariablesOrderedByName(); } else { - suitesQuery.retrievedFields(true, "id", "name"); + suites = suiteRepository.findAllThinNoCustomVariablesOrderedByName(); } - suitesQuery.order("name"); - List suites = suiteDAO.find(suitesQuery).asList(); return suites; } @@ -2799,7 +3307,7 @@ private List getAllThinSuites(boolean withCustomVariables) { @Produces(MediaType.APPLICATION_JSON) public Response getAllSuitesWithJobs() { - List suites = getAllThinSuites(false);//suiteDAO.find(suitesQuery).asList(); + List suites = getThinSuites(false);//suiteDAO.find(suitesQuery).asList(); List suitesWithJobs = new ArrayList<>(suites.size()); suitesWithJobs.addAll(suites.stream().map(this::createSuiteWithJobs).collect(Collectors.toList())); @@ -2817,137 +3325,90 @@ public Batch getTests(@QueryParam("id") String id, @DefaultValue("0") @QueryParam("offset") int offset, @DefaultValue("50") @QueryParam("limit") int limit, @Context UriInfo uriInfo) { - Test thisTest = getTest(id); - - String testName = thisTest.getName(); - Date endTime = thisTest.getEndTime(); - List testArguments = thisTest.getArguments(); + Optional opThisTest = testRepository.findTestForHistoryById(id); + PTestForHistory thisTest = opThisTest.orElseThrow(() -> new RuntimeException("Test [" + id + "] does not exist")); - String jobId = thisTest.getJobId(); - Job job = getJob(jobId); - Suite suite = job.getSuite(); - //retrieve all jobs belong to this suite - List suiteJobs = getSuiteJobsIds(suite); - Build build = job.getBuild(); - String branch = build.getBranch(); - Set filterBranches = new HashSet<>(); - filterBranches.add(MASTER_BRANCH_NAME); - filterBranches.add(branch); if (logger.isDebugEnabled()) { logger.debug( - "--getTests() history, testId=" + id + ",jobId=" + jobId + ", buildId=" + build - .getId() + ", branch=" + branch + ", endTime=" + endTime); + "--getTests() history, testId=" + id + ",jobId=" + thisTest.getJobId() + ", buildId=" + thisTest.getBuildId() + + ", branch=" + thisTest.getBranch() + ", endTime=" + thisTest.getEndTime()); } - Query testsQuery = testDAO.createQuery(); - testsQuery.or(testsQuery.criteria("status").equal(Test.Status.FAIL), testsQuery.criteria("status").equal(Test.Status.SUCCESS)); // get only success or fail test - testsQuery.order("-endTime"); // order by end time - testsQuery.field("name").equal(testName).field("arguments").equal(testArguments); + String sha = thisTest.getBranch().equals(MASTER_BRANCH_NAME) ? thisTest.getSha() : null; + List arguments = Arrays.asList(thisTest.getArguments().split(" ")); + Specification spec = + TestSpecifications.findRecentTestsByNameArgsAndShaAndBranch(thisTest.getName(), arguments, sha, Arrays.asList(MASTER_BRANCH_NAME, thisTest.getBranch())); - //in order to improve query in the case of master branch - if (branch.equals(MASTER_BRANCH_NAME)) { - String sha = thisTest.getSha(); - testsQuery.field("sha").equal(sha); - } - testsQuery.limit(limit); + Pageable pageable = convertOffsetLimitToPage(offset, limit, Sort.by(Sort.Direction.DESC, "endTime")); + List tests = testRepository.findAll(spec, pageable).getContent(); - List tests = testDAO.find(testsQuery).asList(); if (logger.isDebugEnabled()) { logger.debug("--getTests() history, testId=" + id + ", tests size:" + tests.size()); } - //logger.info("DEBUG (getTests) get test history of testId: [{}], (thisTest: [{}])", id, thisTest); + List testHistoryItemsList = new ArrayList<>(tests.size()); - for (Test test : tests) { - if (logger.isDebugEnabled()) { - logger.debug( - "--getTests() history, test.getEndTime()=" + test.getEndTime() + ", tests size:" - + tests.size()); - } - String jobIdLocal = test.getJobId(); - //don't bring tests that were ran after this test on any branch - if (suiteJobs.contains(jobIdLocal) && (endTime == null || (test.getEndTime() != null && test.getEndTime().compareTo(endTime) <= 0))) { - //logger.info("DEBUG (getTests) ---- > create testHistoryItem to [{}]", test); - TestHistoryItem testHistoryItem = createTestHistoryItem(test, filterBranches); - if (testHistoryItem == null) { - continue; + if (!tests.isEmpty()) { + //logger.info("DEBUG (getTests) get test history of testId: [{}], (thisTest: [{}])", id, thisTest); + List suiteJobsIds = jobRepository.findJobIdsBySuiteId(thisTest.getSuiteId()); //retrieve all jobs that belong to same suite + for (Test test : tests) { + if (logger.isDebugEnabled()) { + logger.debug( + "--getTests() history, test.getEndTime()=" + test.getEndTime() + ", tests size:" + + tests.size()); + } + //don't bring tests that were ran after this test on any branch + if (suiteJobsIds.contains(test.getJobId()) + && (thisTest.getEndTime() == null || (test.getEndTime() != null && test.getEndTime().compareTo(thisTest.getEndTime()) <= 0))) { + //logger.info("DEBUG (getTests) ---- > create testHistoryItem to [{}]", test); + TestHistoryItem testHistoryItem = createTestHistoryItem(test); + if (testHistoryItem == null) { + continue; + } + //logger.info("DEBUG (getTests) ---- > testHistoryItem is: [{}]", testHistoryItem); + testHistoryItemsList.add(testHistoryItem); } - //logger.info("DEBUG (getTests) ---- > testHistoryItem is: [{}]", testHistoryItem); - testHistoryItemsList.add(testHistoryItem); } } return new Batch<>(testHistoryItemsList, offset, limit, false, Collections.emptyList(), uriInfo); } - //retrieve all jobs belong to this suite - private List getSuiteJobsIds(Suite suite) { - String suiteId = suite.getId(); - Query query = jobDAO.createQuery(); - query.field("suite.id").equal(suiteId); - List jobObjectOIds = jobDAO.findIds(query); - List retVal = new ArrayList<>(jobObjectOIds.size()); - for (ObjectId jobObjectId : jobObjectOIds) { - retVal.add(jobObjectId.toString()); - } - - return retVal; - } - - - private TestHistoryItem createTestHistoryItem(Test test, Collection filterBranches) { + private TestHistoryItem createTestHistoryItem(Test test) { Job job = getJob(test.getJobId()); if (job == null) { return null; } - String branch = job.getBuild().getBranch(); - if (!filterBranches.contains(branch)) { - return null; - } //logger.info("DEBUG (createTestHistoryItem) get job of test ---- > test: [{}], job: [{}])", test, job); return new TestHistoryItem(new TestView(test), new JobView(job)); } - private SuiteWithJobs createSuiteWithJobs(Suite suite) { + private SuiteWithJobs createSuiteWithJobs(PSuiteThin suite) { + Pageable pageable = PageRequest.of(0, maxJobsPerSuite, Sort.by(Sort.Direction.DESC, "endTime")); - String suiteId = suite.getId(); - Query jobsQuery = jobDAO.createQuery(); - jobsQuery.field("suite.id").equal(suiteId); - jobsQuery.criteria("state").equal(State.DONE); - jobsQuery.order("-endTime").limit(maxJobsPerSuite); + List jobsList = jobRepository.findTopJobsForSuiteDoneState(suite.getId(), pageable); - addRequiredJobTableColumns(jobsQuery); + // addRequiredJobTableColumns(jobsQuery); --> JobProjection - List jobsList = jobDAO.find(jobsQuery).asList(); return new SuiteWithJobs(suite, jobsList); } - private Map> createActiveJobsMap(List builds) { - Map> resultsMap = new HashMap<>(); + private Map> createActiveJobsMap(List builds) { + Map> resultsMap = new HashMap<>(); for (Build build : builds) { - resultsMap.put(build.getId(), getActiveBuildJobs(build)); + resultsMap.put(build.getId(), jobRepository.findByBuildIdAndState(build.getId(), State.RUNNING)); } return resultsMap; } - private List getActiveBuildJobs(Build build) { - - Query query = jobDAO.createQuery(); - query.retrievedFields(true, "id", "passedTests", "failedTests", "runningTests", "totalTests", - "failed3TimesTests", "numOfTestRetries", "suite.id", "suite.name"); - query.field("build.id").equal(build.getId()).field("state").equal(State.RUNNING); - return jobDAO.find(query).asList(); - } - @POST @Path("clearPaused") @Produces(MediaType.APPLICATION_JSON) - public Response clearPausedJobs() throws InterruptedException { - Query query = jobDAO.createQuery(); - query.criteria("state").equal(State.PAUSED); + public Response clearPausedJobs() { + List pausedJobs = jobRepository.findByState(State.PAUSED); try { - for (Job j : jobDAO.find(query).asList()) { + for (Job j : pausedJobs) { deleteJob(j.getId()); } } catch (Exception e) { @@ -2962,28 +3423,19 @@ public Response clearPausedJobs() throws InterruptedException { @Produces(MediaType.APPLICATION_JSON) @Deprecated public Response suspend() throws InterruptedException { - UpdateOperations jobUpdateOps = jobDAO.createUpdateOperations(); - jobUpdateOps.set("state", State.PAUSED); - try { - Query updateStateQuery = jobDAO.createQuery(); - updateStateQuery.or(updateStateQuery.criteria("state").equal(State.RUNNING), updateStateQuery.criteria("state").equal(State.READY)); - jobDAO.getDatastore().update(updateStateQuery, jobUpdateOps); + // PAUSE jobs that are in RUNNING or READY state + jobRepository.updateJobsState(State.PAUSED, State.RUNNING, State.READY); - final Query jobQuery = jobDAO.createQuery(); - jobQuery.criteria("state").equal(State.PAUSED); - final Query stillRunningJobsQuery = jobQuery.filter("runningTests >", 0); - - QueryResults runningJobsResult = jobDAO.find(stillRunningJobsQuery); - - while (!runningJobsResult.asList().isEmpty()) { - List jobList = runningJobsResult.asList(); + // repeatedly seek for those are still completing the tests even having PAUSED state + List jobList = jobRepository.findByStateAndRunningTestsGreaterThan(State.PAUSED, 0); + while (!jobList.isEmpty()) { logger.info("waiting for all agents to finish running tests, {} jobs are still running:", jobList.size()); for (Job job : jobList) { logger.info("{},", job.getId()); } Thread.sleep(10000); - runningJobsResult = jobDAO.find(stillRunningJobsQuery); + jobList = jobRepository.findByStateAndRunningTestsGreaterThan(State.PAUSED, 0); } } catch (Exception e) { logger.warn("failed to suspend server", e); @@ -3036,7 +3488,7 @@ public Response suspendServer() { serverSuspendThread = new Thread(() -> { try { while (true) { - List futureJobs = futureJobDAO.createQuery().asList(); + List futureJobs = futureJobRepository.findAll(); if (futureJobs.size() == 0) { synchronized (this.serverStatusLock) { serverStatus.setStatus(ServerStatus.Status.SUSPENDED); @@ -3047,7 +3499,6 @@ public Response suspendServer() { Thread.sleep(10000); } } - } catch (InterruptedException | MongoInterruptedException e) { } catch (Exception e) { logger.warn("failed to suspend server", e); synchronized (this.serverStatusLock) { @@ -3061,6 +3512,12 @@ public Response suspendServer() { return Response.ok().build(); } + private void copyTmpToFile(java.nio.file.Path tmp, String location) throws IOException { + java.nio.file.Path target = Paths.get(location); + Files.createDirectories(target.getParent()); + Files.copy(tmp, target, StandardCopyOption.REPLACE_EXISTING); + } + private java.nio.file.Path saveFile(InputStream is, String location) throws IOException { java.nio.file.Path path = Paths.get(location); Files.createDirectories(path.getParent()); @@ -3079,17 +3536,22 @@ private java.nio.file.Path saveFile(InputStream is, String location) throws IOEx public Agent setNumberOfRetries(@PathParam("setupRetries") final int numberOfRetries, final Agent agent) { int setupRetriesBefore = agent.getSetupRetries(); - UpdateOperations agentUpdateOps = agentDAO.createUpdateOperations(); - agentUpdateOps.set("setupRetries", numberOfRetries); - Agent updatedAgent = agentDAO.getDatastore().findAndModify(agentDAO.createIdQuery(agent.getId()), agentUpdateOps, false, false); - if (updatedAgent != null) { - broadcastMessage(MODIFIED_AGENT, updatedAgent); - if ((setupRetriesBefore == 0 && numberOfRetries > 0) || (setupRetriesBefore > 0 && numberOfRetries == 0)) { - long count = agentDAO.createQuery().filter("setupRetries >", 0).countAll(); - broadcastMessage(MODIFIED_FAILING_AGENTS, count); - } + Optional opAgent = agentRepository.findById(agent.getId()); + if (!opAgent.isPresent()) { + return null; + } + Agent existingAgent = opAgent.get(); + existingAgent.setSetupRetries(numberOfRetries); + agentRepository.save(existingAgent); + + broadcastMessage(MODIFIED_AGENT, existingAgent); + + if ((setupRetriesBefore == 0 && numberOfRetries > 0) || (setupRetriesBefore > 0 && numberOfRetries == 0)) { + long count = agentRepository.countBySetupRetriesGreaterThan(0); + broadcastMessage(MODIFIED_FAILING_AGENTS, count); } - return updatedAgent; + + return existingAgent; } private Suite createSuiteFromFailingTests(String jobId, String newSuiteName) throws Exception { @@ -3097,26 +3559,20 @@ private Suite createSuiteFromFailingTests(String jobId, String newSuiteName) thr throw new Exception("Required parameters are not valid"); } - Job job = jobDAO.findOne(jobDAO.createIdQuery(jobId)); + Optional opJob = jobRepository.findById(jobId); - if (job == null) { - throw new Exception("Job [" + jobId + "] does not exist"); - } + Job existingJob = opJob.orElseThrow(() -> new RuntimeException("Job [" + jobId + "] does not exist")); - Suite existingSuite = suiteDAO.findOne(suiteDAO.createQuery().field("name").equal(newSuiteName)); - if (existingSuite != null) { + if (suiteRepository.existsByName(newSuiteName)) { throw new Exception("Suite [" + newSuiteName + "] already exists"); } - Query failedTestsQuery = testDAO.createQuery().field("jobId").equal(jobId).field("status").equal(Test.Status.FAIL).field("runNumber").equal(1); - List failedTests = testDAO.find(failedTestsQuery).asList(); - + List failedTests = testRepository.findByJobIdAndStatusAndRunNumber(jobId, Test.Status.FAIL, 1); if (failedTests.size() == 0) { throw new Exception("Job [" + jobId + "] has no failed tests"); } - - Suite suite = job.getSuite(); + Suite suite = existingJob.getSuite(); String testType = getTestType(suite.getCriteria()); if (testType == null) { @@ -3200,6 +3656,7 @@ private String getTestType(Criteria criteria) { private void broadcastMessage(String type, Object value) { if (value != null) { + value = prepareEntityForBroadcasting(value); try { long time1 = System.currentTimeMillis(); EventSocket.broadcast(new Message(type, value)); @@ -3209,33 +3666,67 @@ private void broadcastMessage(String type, Object value) { "Broadcasting message [" + type + "] with value [" + value + "] took " + ( time2 - time1) + " ms"); } - } catch (Throwable ignored) { - logger.error("Invoking of broadcastMessage() failed"); + } catch (Throwable e) { + logger.error("Invoking of broadcastMessage() failed: ", e); } } } + private Object prepareEntityForBroadcasting(Object value) { + Object entity = value; + if (value instanceof Job) { // Job + Job job = (Job) value; + if (job.getBuild().getBuildStatus() != null) { + job.getBuild().getBuildStatus().setBuild(null); + } + if (job.getJobSetupLog() != null) { + job.getJobSetupLog().setJob(null); + } + } else if (value instanceof Test) { // Test + Test test = (Test) value; + if (test.getLogs() != null) { + test.getLogs().setTest(null); + } + } else if (value instanceof Build) { // Build + Build build = (Build) value; + if (build.getBuildStatus() != null) { + build.getBuildStatus().setBuild(null); + } + } + + return entity; + } + private List getAgentsNotSeenInLastMillis(long delay) { - return agentDAO.find(agentDAO.createQuery().field("state").notEqual(Agent.State.IDLING).field("lastTouchTime").lessThan(new Date(System.currentTimeMillis() - delay))).asList(); + Date timeThreshold = new Date(System.currentTimeMillis() - delay); + logger.info("[Automated Task] Check for non-idle agents that have not reported until: " + timeThreshold); + return agentRepository.findAgentsNotSeenInLastMillis(Agent.State.IDLING, timeThreshold); } private List getZombieAgents(long delay) { - return agentDAO.find(agentDAO.createQuery().field("state").equal(Agent.State.IDLING).field("lastTouchTime").lessThan(new Date(System.currentTimeMillis() - delay))).asList(); + Date timeThreshold = new Date(System.currentTimeMillis() - delay); + return agentRepository.findZombieAgents(Agent.State.IDLING, timeThreshold); } - private void handleZombieAgent(Agent agent) { - logger.warn("Agent {} did not report on time while he was IDLING and will be deleted", agent.getName()); - final Agent toDelete = agentDAO.findOne(agentDAO.createQuery().field("name").equal(agent.getName())); - if (toDelete != null) { - String agentIp = agent.getHostAddress(); - offlineAgents.put(agentIp, new OfflineAgent(agentIp, agent.getHost(), agent.getHostAddress(), agent.getLastTouchTime())); - agentDAO.getDatastore().findAndDelete(agentDAO.createIdQuery(toDelete.getId())); - broadcastMessage(DELETED_AGENT, toDelete); - broadcastMessage(CREATED_OFFLINE_AGENT, createAgentFromOfflineAgent(offlineAgents.get(agentIp))); - broadcastMessage(MODIFIED_AGENTS_COUNT, agentDAO.count()); - //Delete agent from preparing agents in jobs - UpdateOperations jobUpdate = jobDAO.createUpdateOperations().removeAll("preparingAgents", toDelete.getName()); - jobDAO.getDatastore().findAndModify(jobDAO.createQuery().field("id").equal(agent.getJobId()), jobUpdate); + private void handleZombieAgent(Agent agentToDelete) { + logger.warn("Agent {} did not report on time while he was IDLING and will be deleted", agentToDelete.getName()); + + String agentIp = agentToDelete.getHostAddress(); + offlineAgents.put(agentIp, new OfflineAgent(agentIp, agentToDelete.getHost(), agentToDelete.getHostAddress(), agentToDelete.getLastTouchTime())); + agentRepository.deleteById(agentToDelete.getId()); + + broadcastMessage(DELETED_AGENT, agentToDelete); + broadcastMessage(CREATED_OFFLINE_AGENT, createAgentFromOfflineAgent(offlineAgents.get(agentIp))); + broadcastMessage(MODIFIED_AGENTS_COUNT, agentRepository.count()); + //Delete agent from preparing agents in jobs + if (StringUtils.notEmpty(agentToDelete.getJobId())) { + Optional opJob = jobRepository.findById(agentToDelete.getJobId()); + if (opJob.isPresent()) { + getUpdater(Job.class) + .remove("preparing_agents", agentToDelete.getName()) + .whereId(agentToDelete.getJobId()) + .execute(); + } } } @@ -3251,46 +3742,70 @@ private void handleUnseenAgent(Agent agent) { * @param agent the agent in hand. */ private void returnTests(Agent agent) { - Set tests = new HashSet<>(); + Set currentTestsOfAgent = new HashSet<>(); + int testsActuallyReset = 0; + + // reset tests - use AtomicUpdater to ensure test is still RUNNING when we reset it for (String testId : agent.getCurrentTests()) { - Test found = testDAO.getDatastore().findAndModify(testDAO.createIdQuery(testId).field("status").equal(Test.Status.RUNNING) - .field("assignedAgent").equal(agent.getName()), - testDAO.createUpdateOperations().unset("assignedAgent").unset("agentGroup").unset("startTime").set("status", Test.Status.PENDING)); - if (found != null) { - logger.warn("test {} was released since agent {} not seen for a long time", found.getId(), agent.getName()); - tests.add(found); + // Use AtomicUpdater to atomically check status and update + // This prevents race with finishTest() which might be processing the same test + int updated = getUpdater(Test.class) + .set("status", Test.Status.PENDING) + .set("assignedAgent", null) + .set("agentGroup", null) + .set("startTime", null) + .where("id = ? AND status = ? AND assignedAgent = ?", testId, Test.Status.RUNNING, agent.getName()) + .execute(); + + if (updated > 0) { + // Test was successfully reset (it was still RUNNING) + testsActuallyReset++; + Optional opTest = testRepository.findById(testId); + if (opTest.isPresent()) { + logger.warn("test {} was released since agent {} not seen for a long time", testId, agent.getName()); + currentTestsOfAgent.add(opTest.get()); + } + } else { + // Test was NOT reset - it was already finished by finishTest() or not found + logger.debug("test {} was not reset (already finished or not RUNNING)", testId); } } - Job job = null; + + // reset job - only decrement counter by the number of tests we ACTUALLY reset + int jobUpdated = 0; if (agent.getJobId() != null) { - UpdateOperations jobUpdateOps = jobDAO.createUpdateOperations(); + AtomicUpdater jobUpdater = getUpdater(Job.class).whereId(agent.getJobId()); if (agent.getState() == Agent.State.PREPARING) { - jobUpdateOps.removeAll("preparingAgents", agent.getName()); - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(agent.getJobId()), jobUpdateOps); - } else if (agent.getState() == Agent.State.RUNNING && !tests.isEmpty()) { - int runningTests = 0 - tests.size(); - logger.info("returnTests for agent [{}], jobId [{}], running tests size [{}]", - agent.getName(), agent.getJobId(), runningTests); - jobUpdateOps.inc("runningTests", runningTests); - job = jobDAO.getDatastore().findAndModify(jobDAO.createIdQuery(agent.getJobId()), jobUpdateOps); + jobUpdated = jobUpdater + .remove("preparing_agents", agent.getName()).execute(); + } else if (agent.getState() == Agent.State.RUNNING && testsActuallyReset > 0) { + logger.info("returnTests for agent [{}], jobId [{}], amount of tests actually reset [{}]", agent.getName(), agent.getJobId(), testsActuallyReset); + jobUpdated = jobUpdater + .dec("runningTests", testsActuallyReset).execute(); } } - Agent ag = agentDAO.getDatastore().findAndModify(agentDAO.createIdQuery(agent.getId()), - agentDAO.createUpdateOperations().set("currentTests", new HashSet<>()).set("state", Agent.State.IDLING)); - ag.setJob(job); + Optional opAgent = agentRepository.findById(agent.getId()); + // reset agent + Agent existingAgent = opAgent.orElseThrow(() -> new RuntimeException("Agent [" + agent.getId() + "] does not exist"));; + existingAgent.setCurrentTests(new HashSet<>()); + existingAgent.setState(Agent.State.IDLING); - if (ag != null && ag.getState().equals(Agent.State.IDLING)) { - logger.warn("agent [{}] is idling while returning tests to pool", ag.getName()); + existingAgent = agentRepository.saveAndFlush(existingAgent); + + if (existingAgent.getState().equals(Agent.State.IDLING)) { + logger.warn("agent [{}] is idling while returning tests to pool", existingAgent.getName()); } - for (Test test : tests) { + for (Test test : currentTestsOfAgent) { broadcastMessage(MODIFIED_TEST, test); } - if (job != null) { + Job job = null; + if (jobUpdated != 0) { + job = jobRepository.findById(agent.getJobId()).get(); broadcastMessage(MODIFIED_JOB, job); } - if (ag != null) { - broadcastMessage(MODIFIED_AGENT, ag); - } + + existingAgent.setJob(job); // add job for the broadcasting + broadcastMessage(MODIFIED_AGENT, existingAgent); } private void checkServerStatus() { diff --git a/newman-server/src/main/java/com/gigaspaces/newman/NewmanServer.java b/newman-server/src/main/java/com/gigaspaces/newman/NewmanServer.java index 0f972a2d..1573a4e8 100644 --- a/newman-server/src/main/java/com/gigaspaces/newman/NewmanServer.java +++ b/newman-server/src/main/java/com/gigaspaces/newman/NewmanServer.java @@ -1,11 +1,14 @@ package com.gigaspaces.newman; -import com.gigaspaces.newman.config.Config; +import com.gigaspaces.newman.config.JpaConfig; import com.gigaspaces.newman.filters.FrontendRoutingFilter; import com.gigaspaces.newman.filters.RootBasicLoginFilter; import com.gigaspaces.newman.usermanagment.UserService; -import org.eclipse.jetty.security.*; +import org.eclipse.jetty.security.ConstraintMapping; +import org.eclipse.jetty.security.ConstraintSecurityHandler; +import org.eclipse.jetty.security.HashLoginService; +import org.eclipse.jetty.security.PropertyUserStore; import org.eclipse.jetty.security.authentication.BasicAuthenticator; import org.eclipse.jetty.server.Connector; import org.eclipse.jetty.server.Server; @@ -13,18 +16,18 @@ import org.eclipse.jetty.servlet.DefaultServlet; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; -import org.eclipse.jetty.util.resource.*; +import org.eclipse.jetty.util.resource.Resource; import org.eclipse.jetty.util.security.Constraint; import org.eclipse.jetty.util.ssl.SslContextFactory; -import org.mongodb.morphia.logging.MorphiaLoggerFactory; -import org.mongodb.morphia.logging.slf4j.SLF4JLoggerImplFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.bridge.SLF4JBridgeHandler; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.io.File; import java.io.IOException; - +import java.net.URI; +import java.net.URISyntaxException; import java.util.Arrays; import java.util.Optional; @@ -43,10 +46,6 @@ public static void main(String[] args) throws Exception { SLF4JBridgeHandler.removeHandlersForRootLogger(); SLF4JBridgeHandler.install(); - MorphiaLoggerFactory.registerLogger(SLF4JLoggerImplFactory.class); - - Config config = Config.fromArgs(args); - Server server = new Server(8080); /* security */ @@ -58,7 +57,9 @@ public static void main(String[] args) throws Exception { loginService.setUserStore(userStore); server.addBean(loginService); - final UserService userService = new UserService(userStore, config); + AnnotationConfigApplicationContext springContext = new AnnotationConfigApplicationContext(JpaConfig.class); + final UserService userService = springContext.getBean(UserService.class); + userService.updateUsers(userStore); // === USERS roles ConstraintSecurityHandler security = new ConstraintSecurityHandler(); @@ -68,9 +69,7 @@ public static void main(String[] args) throws Exception { ConstraintMapping allowResourcesMapping = createConstraintMapping("auth2", false, "/api/newman/resource/*"); ConstraintMapping allowMetadataMapping = createConstraintMapping("auth3", false, "/api/newman/metadata/*"); - security.setConstraintMappings(Arrays.asList(new ConstraintMapping[]{ - mapping, allowMetadataMapping, allowResourcesMapping - })); + security.setConstraintMappings(Arrays.asList(mapping, allowMetadataMapping, allowResourcesMapping)); security.setAuthenticator(new BasicAuthenticator()); security.setLoginService(loginService); @@ -78,7 +77,6 @@ public static void main(String[] args) throws Exception { // === Main page(root) Newman access configuration ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); - context.setInitParameter("config", config.asJSON()); context.setContextPath("/"); // security context.setSecurityHandler(security); @@ -86,16 +84,21 @@ public static void main(String[] args) throws Exception { DefaultServlet defaultServlet = new DefaultServlet(); ServletHolder holderPwd = new ServletHolder("default", defaultServlet); // locate where web files are stored - vue.js project - String webPath = getNonEmptySystemProperty(WEB_FOLDER_PATH, DEFAULT_WEB_FOLDER_PATH); - File webDir = new File(webPath); - if (!webDir.exists()) { - logger.info("File {} not found", webDir.getAbsolutePath()); - String webDirInJar = NewmanServer.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm(); - if (webDirInJar.toLowerCase().endsWith(".jar")) { - webPath = "jar:" + webDirInJar + "!/web"; + String webPath = locateExternalWebFolder(); + if (webPath == null) { + webPath = getNonEmptySystemProperty(WEB_FOLDER_PATH, DEFAULT_WEB_FOLDER_PATH); + File webDir = new File(webPath); + if (!webDir.exists()) { + logger.info("File {} not found", webDir.getAbsolutePath()); + String webDirInJar = NewmanServer.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm(); + if (webDirInJar.toLowerCase().endsWith(".jar")) { + webPath = "jar:" + webDirInJar + "!/web"; + } else { + logger.error("can't find webdir, either set web dir using system property {} or run newman with java -jar newman-server-1.0.jar", WEB_FOLDER_PATH); + System.exit(1); + } } else { - logger.error("can't find webdir, either set web dir using system property {} or run newman with java -jar newman-server-1.0.jar", WEB_FOLDER_PATH); - System.exit(1); + logger.info("Web directory has been found: {}", webDir.getAbsolutePath()); } } logger.info("Using {} to serve static content", webPath); @@ -150,6 +153,35 @@ public static void main(String[] args) throws Exception { } } + private static String locateExternalWebFolder() { + String jarLocation = NewmanServer.class.getProtectionDomain().getCodeSource().getLocation().toExternalForm(); + // Check if the JAR is indeed a .jar file + if (jarLocation.toLowerCase().endsWith(".jar")) { + try { + // Convert the JAR file URL to a File object and get the parent directory + File jarFile = new File(new URI(jarLocation)); + File jarDir = jarFile.getParentFile(); // This is the directory containing the JAR + + // Now construct the path to the 'web' folder next to the JAR + File webDir = new File(jarDir, "web"); + + // Check if the 'web' folder exists now + if (!webDir.exists()) { + logger.info("The web directory could not be found next to the JAR."); + return null; + } else { + logger.info("Found external web directory: {}", webDir.getAbsolutePath()); + return webDir.getAbsolutePath(); + } + } catch (URISyntaxException e) { + logger.error("Error parsing JAR file location", e); + System.exit(1); + } + } + + return null; + } + private static ConstraintMapping createConstraintMapping(String name, boolean authenticate, String pathSpec, String... roles) { Constraint constraint = new Constraint(); constraint.setName(name); diff --git a/newman-server/src/main/java/com/gigaspaces/newman/SSHUtils.java b/newman-server/src/main/java/com/gigaspaces/newman/SSHUtils.java new file mode 100644 index 00000000..88bf9669 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/SSHUtils.java @@ -0,0 +1,199 @@ +package com.gigaspaces.newman; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.BufferedReader; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Base64; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Utility class for SSH-based console output operations. + */ +public class SSHUtils { + + private static final Logger logger = LoggerFactory.getLogger(SSHUtils.class); + + /** + * Result of an SSH command execution. + */ + public static class SSHResult { + private final boolean success; + private final String output; + private final String error; + + public SSHResult(boolean success, String output, String error) { + this.success = success; + this.output = output; + this.error = error; + } + + public boolean isSuccess() { return success; } + public String getOutput() { return output; } + public String getError() { return error; } + } + + /** + * Reads the public key from the keys directory. + */ + public static String readPublicKey(String keysDir) throws IOException { + Path publicKeyPath = Paths.get(keysDir, "server-public.pem"); + + if (!Files.exists(publicKeyPath)) { + throw new IOException("Public key file not found: " + publicKeyPath); + } + + return new String(Files.readAllBytes(publicKeyPath)); + } + + /** + * Decrypts PEM content that was encrypted by the frontend using hybrid RSA/AES encryption. + */ + public static String decryptPemContent(String encryptedKeyBase64, String encryptedPemBase64, + String ivBase64, String keysDir, String keystorePassword) throws Exception { + + Path keystorePath = Paths.get(keysDir, "server.keystore"); + + // Load private key from keystore + java.security.KeyStore keyStore = java.security.KeyStore.getInstance("JKS"); + try (FileInputStream fis = new FileInputStream(keystorePath.toFile())) { + keyStore.load(fis, keystorePassword.toCharArray()); + } + java.security.PrivateKey privateKey = (java.security.PrivateKey) keyStore.getKey("server", keystorePassword.toCharArray()); + + // Decrypt AES key with RSA-OAEP (SHA-256 for both hash and MGF1 to match JavaScript Web Crypto) + javax.crypto.Cipher rsaCipher = javax.crypto.Cipher.getInstance("RSA/ECB/OAEPPadding"); + java.security.spec.MGF1ParameterSpec mgf1Spec = java.security.spec.MGF1ParameterSpec.SHA256; + javax.crypto.spec.OAEPParameterSpec oaepSpec = new javax.crypto.spec.OAEPParameterSpec( + "SHA-256", "MGF1", mgf1Spec, javax.crypto.spec.PSource.PSpecified.DEFAULT); + rsaCipher.init(javax.crypto.Cipher.DECRYPT_MODE, privateKey, oaepSpec); + byte[] aesKeyBytes = rsaCipher.doFinal(Base64.getDecoder().decode(encryptedKeyBase64)); + + // Decrypt PEM content with AES-GCM + javax.crypto.spec.SecretKeySpec aesKey = new javax.crypto.spec.SecretKeySpec(aesKeyBytes, "AES"); + byte[] ivBytes = Base64.getDecoder().decode(ivBase64); + javax.crypto.spec.GCMParameterSpec gcmSpec = new javax.crypto.spec.GCMParameterSpec(128, ivBytes); + + javax.crypto.Cipher aesCipher = javax.crypto.Cipher.getInstance("AES/GCM/NoPadding"); + aesCipher.init(javax.crypto.Cipher.DECRYPT_MODE, aesKey, gcmSpec); + byte[] pemBytes = aesCipher.doFinal(Base64.getDecoder().decode(encryptedPemBase64)); + + return new String(pemBytes, java.nio.charset.StandardCharsets.UTF_8); + } + + /** + * Builds the remote command for fetching log file content. + * Uses awk for date filtering when sinceDate is provided. + */ + public static String buildLogFileCommand(String logFile, String sinceDate, int lines) { + if (sinceDate != null && !sinceDate.trim().isEmpty()) { + // Filter from sinceDate, then limit lines (head for first N lines from that date) + // Use first char of sinceDate to identify timestamp lines (adapts to any date format) + // Non-timestamp lines included only if previous timestamp matched + int len = sinceDate.length(); + String escapedDate = sinceDate.replace("\"", "\\\""); + String firstChar = sinceDate.substring(0, 1).replace("\"", "\\\""); + return "awk 'substr($0,1,1)==\"" + firstChar + "\" { inc=(substr($0,1," + len + ")>=\"" + escapedDate + "\") } inc' " + logFile + " | head -n " + lines; + } else { + // Use tail for file-based logs without date filtering + return "tail -n " + lines + " " + logFile; + } + } + + /** + * Builds the remote command for fetching journalctl service logs. + */ + public static String buildJournalctlCommand(String service, String since, int lines) { + StringBuilder journalCmd = new StringBuilder(); + journalCmd.append("journalctl -u ").append(service).append(" -n ").append(lines); + if (since != null && !since.trim().isEmpty()) { + journalCmd.append(" --since '").append(since.replace("'", "\\'")).append("'"); + } + return journalCmd.toString(); + } + + /** + * Creates a temporary PEM file with proper permissions. + */ + public static Path createTempPemFile(String pemContent) throws IOException { + Path tempPemFile = Files.createTempFile("newman-ssh-", ".pem"); + Files.write(tempPemFile, pemContent.getBytes()); + // Set proper permissions (owner read only) + tempPemFile.toFile().setReadable(false, false); + tempPemFile.toFile().setReadable(true, true); + tempPemFile.toFile().setWritable(false, false); + return tempPemFile; + } + + /** + * Deletes a temporary PEM file safely. + */ + public static void deleteTempPemFile(Path tempPemFile) { + if (tempPemFile != null) { + try { + Files.deleteIfExists(tempPemFile); + } catch (IOException e) { + logger.warn("Failed to delete temp PEM file: " + tempPemFile, e); + } + } + } + + /** + * Executes an SSH command on a remote host. + */ + public static SSHResult executeSSHCommand(String host, String user, Path pemFile, + String remoteCommand, int timeoutSeconds) { + + List command = new ArrayList<>(); + command.add("ssh"); + command.add(host); + command.add("-l"); + command.add(user); + command.add("-i"); + command.add(pemFile.toString()); + command.add("-o"); + command.add("StrictHostKeyChecking=no"); + command.add("-o"); + command.add("ConnectTimeout=10"); + command.add(remoteCommand); + + try { + ProcessBuilder processBuilder = new ProcessBuilder(command); + processBuilder.redirectErrorStream(true); + Process process = processBuilder.start(); + + StringBuilder output = new StringBuilder(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { + String line; + while ((line = reader.readLine()) != null) { + output.append(line).append("\n"); + } + } + + boolean finished = process.waitFor(timeoutSeconds, TimeUnit.SECONDS); + if (!finished) { + process.destroyForcibly(); + return new SSHResult(false, null, "SSH command timed out after " + timeoutSeconds + " seconds"); + } + + int exitCode = process.exitValue(); + if (exitCode != 0 && output.length() == 0) { + return new SSHResult(false, null, "SSH command failed with exit code: " + exitCode); + } + + return new SSHResult(true, output.toString(), null); + + } catch (Exception e) { + logger.error("Failed to execute SSH command for host " + host, e); + return new SSHResult(false, null, "Failed to execute SSH command: " + e.getMessage()); + } + } +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/SpotinstResource.java b/newman-server/src/main/java/com/gigaspaces/newman/SpotinstResource.java index 2cf80fb9..25f52b11 100644 --- a/newman-server/src/main/java/com/gigaspaces/newman/SpotinstResource.java +++ b/newman-server/src/main/java/com/gigaspaces/newman/SpotinstResource.java @@ -1,15 +1,11 @@ package com.gigaspaces.newman; -import com.gigaspaces.newman.beans.Agent; -import com.gigaspaces.newman.config.Config; -import com.gigaspaces.newman.dao.AgentDAO; +import com.gigaspaces.newman.beans.repository.AgentRepository; +import com.gigaspaces.newman.config.JpaConfig; import com.gigaspaces.newman.spotinst.ElasticGroup; -import com.mongodb.MongoClient; -import org.mongodb.morphia.Morphia; -import org.mongodb.morphia.query.Query; -import org.mongodb.morphia.query.QueryResults; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import javax.inject.Singleton; import javax.servlet.ServletContext; @@ -27,28 +23,15 @@ public class SpotinstResource { private static final Logger logger = LoggerFactory.getLogger(SpotinstResource.class); private final SpotinstClient spotinstClient; - private final MongoClient mongoClient; - private final AgentDAO agentDAO; - private final Config config; + private final AgentRepository agentRepository; + private final AnnotationConfigApplicationContext context; public SpotinstResource(@Context ServletContext servletContext) { - this.config = Config.fromString(servletContext.getInitParameter("config")); - spotinstClient = new SpotinstClient(); - mongoClient = new MongoClient(config.getMongo().getHost()); - Morphia morphia = initMorphia(); - agentDAO = new AgentDAO(morphia, mongoClient, config.getMongo().getDb()); - } + this.context = new AnnotationConfigApplicationContext(JpaConfig.class); + spotinstClient = new SpotinstClient(); - private Morphia initMorphia() { - Morphia morphia; - try { - morphia = new Morphia().mapPackage("com.gigaspaces.newman.beans.criteria").mapPackage("com.gigaspaces.newman.beans"); - } catch (Exception e) { - logger.error("failed to init morphia", e); - throw e; - } - return morphia; + agentRepository = context.getBean(AgentRepository.class); } // // @GET @@ -64,9 +47,8 @@ private Morphia initMorphia() { public List getElasticGroups() throws IOException { - return spotinstClient.getAgentsElasticGroups().stream().map(elasticGroup -> { - QueryResults res = agentDAO.find(agentDAO.createQuery().field("groupName").equal(elasticGroup.getTags().getName())); - elasticGroup.setConnectedAgents(res.asList().size()); + return spotinstClient.getAgentsElasticGroups().stream().map(elasticGroup -> { + elasticGroup.setConnectedAgents(agentRepository.countAgentsByGroupName(elasticGroup.getTags().getName())); try { elasticGroup.setRunningVMs(spotinstClient.getInstancesCountForElasticGroup(elasticGroup.getId())); } catch (IOException ignored) { diff --git a/newman-server/src/main/java/com/gigaspaces/newman/TestScoreUtils.java b/newman-server/src/main/java/com/gigaspaces/newman/TestScoreUtils.java index ae0926af..c6a0c073 100644 --- a/newman-server/src/main/java/com/gigaspaces/newman/TestScoreUtils.java +++ b/newman-server/src/main/java/com/gigaspaces/newman/TestScoreUtils.java @@ -1,7 +1,7 @@ package com.gigaspaces.newman; -import com.gigaspaces.newman.beans.Build; -import com.gigaspaces.newman.beans.Test; +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.entities.Test; import com.gigaspaces.newman.beans.TestHistoryItem; import org.slf4j.Logger; diff --git a/newman-server/src/main/java/com/gigaspaces/newman/TransactionUtils.java b/newman-server/src/main/java/com/gigaspaces/newman/TransactionUtils.java new file mode 100644 index 00000000..8a53b628 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/TransactionUtils.java @@ -0,0 +1,21 @@ +package com.gigaspaces.newman; + +import org.springframework.transaction.support.TransactionSynchronization; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +public class TransactionUtils { + + public static void runAfterCommit(Runnable action) { + if (TransactionSynchronizationManager.isSynchronizationActive()) { + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { + @Override + public void afterCommit() { + action.run(); + } + }); + } else { + // exec immediately = + action.run(); + } + } +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/atomic/AtomicUpdater.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/atomic/AtomicUpdater.java new file mode 100644 index 00000000..f66eaeed --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/atomic/AtomicUpdater.java @@ -0,0 +1,237 @@ +package com.gigaspaces.newman.beans.atomic; + +import io.hypersistence.utils.hibernate.type.array.StringArrayType; +import org.hibernate.query.NativeQuery; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import javax.persistence.*; +import javax.transaction.Transactional; +import java.util.*; + +@Component +@Scope("prototype") +@Transactional +public class AtomicUpdater { + private static final Logger logger = LoggerFactory.getLogger(AtomicUpdater.class); + private Class entityClass; + + private final Map sets = new LinkedHashMap<>(); + private final Map incs = new LinkedHashMap<>(); + private final Map decs = new LinkedHashMap<>(); + private final Map removes = new HashMap<>(); + private final Map adds = new HashMap<>(); + + private String whereClause; + private final Map params = new LinkedHashMap<>(); + private final EntityManager entityManager; + private int paramCounter = 0; + private String id; + private final Map updatesKeyValue = new HashMap<>(); + + public AtomicUpdater(Class entityClass, EntityManager entityManager) { + this.entityClass = entityClass; + this.entityManager = entityManager; + } + + public AtomicUpdater add(String field, Object value) { + adds.put(field, value); + return this; + } + + public AtomicUpdater remove(String field, Object value) { + removes.put(field, value); + return this; + } + + public AtomicUpdater set(String field, Object value) { + sets.put(field, value); + return this; + } + + public AtomicUpdater inc(String field, Number value) { + incs.put(field, value); + return this; + } + + public AtomicUpdater inc(String field) { + incs.put(field, 1); + return this; + } + + public AtomicUpdater dec(String field, Number value) { + decs.put(field, value); + return this; + } + + public AtomicUpdater dec(String field) { + decs.put(field, 1); + return this; + } + + // key = JSON object key, value = JSON object value + public AtomicUpdater putKeyValue(String fieldName, String key, Object value) { + String pKeyIndex = "p" + (paramCounter++); + String pValIndex = "p" + (paramCounter++); + String sqlExpr = String.format( + "%s = COALESCE(%s, '{}') || jsonb_build_object(:%s, :%s)", + toColumnName(fieldName), // column name + toColumnName(fieldName), // column name + pKeyIndex, pValIndex + ); + updatesKeyValue.put(sqlExpr, new Object[]{pKeyIndex, pValIndex, key, value}); + return this; + } + + // ---------- WHERE ---------- + // e.g.: update.where("field1 = ? AND field2 > ? AND status = ?", 123, 10, "ACTIVE"); + public AtomicUpdater where(String clause, Object... values) { + whereClause = clause; + for (Object v : values) { + String pName = "p" + (paramCounter++); + whereClause = whereClause.replaceFirst("\\?", ":" + pName); + params.put(pName, v); + } + return this; + } + + public AtomicUpdater whereId(Object id) { + this.id = String.valueOf(id); + return where("id = ?", id); + } + + private String toColumnName(String fieldName) { + return fieldName.toLowerCase(); + } + + private String getTableName(Class entityClass) { + return entityClass.getSimpleName().replaceAll("([a-z])([A-Z])", "$1_$2") // insert underscore before uppercase + .toLowerCase(); + } + + private void printSQL(StringBuilder sql) { + String result = sql.toString(); + for (Map.Entry e : params.entrySet()) { + result = result.replace(":" + e.getKey(), String.valueOf(e.getValue())); + } + if (entityManager != null) { + if (logger.isDebugEnabled()) { + logger.debug("Executing update: {}", result); + } + } else { + System.out.println("Executing update: " + result); + } + } + + private void convertType(String name, Object value, Query query) { + if (value instanceof java.util.Date && !(value instanceof java.sql.Timestamp)) { + query.setParameter(name, new java.sql.Timestamp(((java.util.Date) value).getTime())); + } else if (value instanceof Enum) { + query.setParameter(name, ((Enum) value).name()); + } else if (value instanceof Collection) { + Collection collect = (Collection) value; + String[] array = collect.stream() + .map(Object::toString) + .toArray(String[]::new); + query.unwrap(NativeQuery.class) + .setParameter(name, array, StringArrayType.INSTANCE); + } else { + query.setParameter(name, value); + } + } + + // ---------- EXECUTE ---------- + public int execute() { + if (sets.isEmpty() && incs.isEmpty() && decs.isEmpty() && removes.isEmpty() && adds.isEmpty() && updatesKeyValue.isEmpty()) { + throw new IllegalStateException("Nothing to update"); + } + + // Build native SQL + StringBuilder sql = new StringBuilder("UPDATE " + getTableName(entityClass) + " SET "); + List updates = new ArrayList<>(); + + // Simple assignments + sets.forEach((f, v) -> { + if (v == null) { + updates.add(toColumnName(f) + " = NULL"); + } else { + String p = "p" + (paramCounter++); + updates.add(toColumnName(f) + " = :" + p); + params.put(p, v); + } + }); + + // Increments + incs.forEach((f, v) -> { + String p = "p" + (paramCounter++); + updates.add(toColumnName(f) + " = " + toColumnName(f) + " + :" + p); + params.put(p, v); + }); + + // Decrements + decs.forEach((f, v) -> { + String p = "p" + (paramCounter++); + updates.add(toColumnName(f) + " = " + toColumnName(f) + " - :" + p); + params.put(p, v); + }); + + removes.forEach((f, v) -> { + String p = "p" + (paramCounter++); + updates.add(toColumnName(f) + " = array_remove(" + toColumnName(f) + ", :" + p + ")"); + params.put(p, v); + }); + + adds.forEach((f, v) -> { + String p = "p" + (paramCounter++); + updates.add(toColumnName(f) + " = array_append(" + toColumnName(f) + ", :" + p + ")"); + params.put(p, v); + }); + + updatesKeyValue.forEach((expr, kv) -> { + updates.add(expr); + String pKeyIndex = (String) kv[0]; + String pValIndex = (String) kv[1]; + Object key = kv[2]; + Object val = kv[3]; + + params.put(pKeyIndex, key); + params.put(pValIndex, val); + }); + + sql.append(String.join(", ", updates)); + + // WHERE clause + if (whereClause != null && !whereClause.isEmpty()) { + sql.append(" WHERE ").append(whereClause); + } + + if (entityManager != null) { + printSQL(sql); + + EntityTransaction tx = entityManager.getTransaction(); + try { + tx.begin(); + + Query query = entityManager.createNativeQuery(sql.toString()); + params.forEach((name, value) -> convertType(name, value, query)); + + int rowsUpdated = query.executeUpdate(); // no entity mapping, just affected rows return + tx.commit(); + return rowsUpdated; // return number of rows updated instead of entity + } catch (Exception e) { + if (tx.isActive()) tx.rollback(); + logger.warn("Failed to execute update", e); + throw e; + } finally { + entityManager.close(); + } + } else { + printSQL(sql); + } + + return 0; + } +} + diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/AgentRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/AgentRepository.java new file mode 100644 index 00000000..d8a26c1b --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/AgentRepository.java @@ -0,0 +1,46 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.entities.Agent; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.*; + +@Repository +public interface AgentRepository extends CrudRepository, JpaRepository, JpaSpecificationExecutor, PagingAndSortingRepository { + @Query("SELECT DISTINCT a.groupName FROM Agent a") + List findDistinctAgentGroups(); + + long countBySetupRetriesGreaterThan(int zero); + + Optional findByName(String name); + + @Query("SELECT a FROM Agent a WHERE a.state <> :idling AND a.lastTouchTime < :timeThreshold") + List findAgentsNotSeenInLastMillis(@Param("idling") Agent.State idling, @Param("timeThreshold") Date timeThreshold); + + @Query("SELECT a FROM Agent a WHERE a.state = :idling AND a.lastTouchTime < :timeThreshold") + List findZombieAgents(@Param("idling") Agent.State idling, @Param("timeThreshold") Date timeThreshold); + + @Query("SELECT a FROM Agent a WHERE a.setupRetries > 0") + Page findAllWithPositiveSetupRetries(Pageable pageable); + + @Query("SELECT a FROM Agent a WHERE a.setupRetries > 0") + List findAllWithPositiveSetupRetries(Sort sort); + + @Transactional + @Modifying + @Query("UPDATE Agent a SET a.jobId = null WHERE a.name = :name") + int unsetJobIdByName(@Param("name") String name); + + int countAgentsByGroupName(String groupName); +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/BuildRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/BuildRepository.java new file mode 100644 index 00000000..46398b8d --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/BuildRepository.java @@ -0,0 +1,58 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.projections.PBuildForView; +import com.gigaspaces.newman.projections.PBuildThin; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import java.util.Date; +import java.util.List; + +@Repository +public interface BuildRepository extends CrudRepository, JpaRepository, JpaSpecificationExecutor, PagingAndSortingRepository { + + @Query("SELECT b FROM Build b") + Page findThinBuilds(Pageable pageable); + + @Query("SELECT b FROM Build b") + Page findAllForViewList(Pageable pageable); + + @Query("SELECT b FROM Build b WHERE b.branch = :branch ORDER BY b.buildTime DESC") + Build findLatestBuildByBranch(@Param("branch") String branch); + + Build findTopByNameOrderByBuildTimeDesc(String name); + + @Query("SELECT b FROM Build b " + + "WHERE :tag1 MEMBER OF b.tags AND " + + ":tag2 MEMBER OF b.tags " + + "ORDER BY b.buildTime DESC") + List findBuildsWithTags(@Param("tag1") String tag1, @Param("tag2") String tag2); + + List findByBuildTimeBefore(Date beforeDate); + + @Query("SELECT b FROM Build b WHERE b.buildStatus.runningJobs > 0 " + + "AND b.buildStatus.totalJobs > 0 " + + "AND (b.buildStatus.doneJobs + b.buildStatus.brokenJobs) < b.buildStatus.totalJobs " + + "ORDER BY b.buildTime DESC") + List findActiveBuildsDescByBuildTime(); + + @Query("SELECT b FROM Build b WHERE b.buildStatus.pendingJobs > 0 " + + "AND b.buildStatus.runningJobs <= 0 " + + "AND b.buildStatus.totalJobs > 0 " + + "AND (b.buildStatus.doneJobs + b.buildStatus.brokenJobs) < b.buildStatus.totalJobs " + + "ORDER BY b.buildTime DESC") + List findPendingBuildsDescByBuildTime(Pageable pageable); + + @Query("SELECT b FROM Build b WHERE b.buildStatus.totalJobs > 0 " + + "AND (b.buildStatus.doneJobs + b.buildStatus.brokenJobs) = b.buildStatus.totalJobs " + + "ORDER BY b.buildTime DESC") + List findRecentlyCompletedBuildsDescByBuildTime(Pageable pageable); +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/BuildsCacheRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/BuildsCacheRepository.java new file mode 100644 index 00000000..08a9cfeb --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/BuildsCacheRepository.java @@ -0,0 +1,26 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.entities.BuildsCache; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Repository +public interface BuildsCacheRepository extends CrudRepository { + + long count(); + + BuildsCache findTopBy(); + + @Transactional + @Modifying + @Query("UPDATE BuildsCache b SET b.cache = :cache, b.index = :index, b.size = :size WHERE b.id = :id") + void updateBuildCache(@Param("id") String id, @Param("cache") List cache, + @Param("index") int index, @Param("size") int size); +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/FutureJobRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/FutureJobRepository.java new file mode 100644 index 00000000..fd0cc08d --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/FutureJobRepository.java @@ -0,0 +1,17 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.entities.FutureJob; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface FutureJobRepository extends CrudRepository, JpaRepository { + + Optional findFirstByOrderBySubmitTimeAsc(); + + List findAll(); +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/JobConfigRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/JobConfigRepository.java new file mode 100644 index 00000000..275a0d18 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/JobConfigRepository.java @@ -0,0 +1,23 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.entities.JobConfig; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import javax.transaction.Transactional; +import java.util.List; +import java.util.Optional; + +@Repository +public interface JobConfigRepository extends CrudRepository { + Optional findByName(String name); + + List findAll(); + + @Modifying + @Transactional + @Query("UPDATE JobConfig j SET j.isDefault = false WHERE j.isDefault = true") + void unsetAllDefaults(); +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/JobRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/JobRepository.java new file mode 100644 index 00000000..b71ad21b --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/JobRepository.java @@ -0,0 +1,75 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.beans.State; +import com.gigaspaces.newman.entities.Job; +import com.gigaspaces.newman.projections.PJobForDashboard; +import com.gigaspaces.newman.projections.PJobThin; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Optional; + +@Repository +public interface JobRepository extends CrudRepository, JpaSpecificationExecutor, PagingAndSortingRepository, JpaRepository { + + @Query("SELECT j.id AS id, j.suite.id AS suiteId, j.suite.name AS suiteName, " + + "j.build.id AS buildId, j.build.name AS buildName, j.build.branch AS buildBranch " + + "FROM Job j WHERE j.id = :jobId") + PJobThin findOneThinJobById(@Param("jobId") String jobId); + + Page findByBuildId(String buildId, Pageable pageable); + + @Query("SELECT j FROM Job j WHERE FUNCTION('DATE',j.submitTime) <= :fromDate") + Page findAllFromDate(@Param("fromDate") Date fromDate, Pageable pageable); + + @Query("SELECT COUNT(j) FROM Job j WHERE (j.state = 'READY' OR j.state = 'RUNNING') AND j.totalTests > 0") + Long countReadyAndRunningJobs(); + + @Query("SELECT j FROM Job j " + + "WHERE j.suite.id = :suiteId AND j.state = 'DONE'") + List findTopJobsForSuiteDoneState(@Param("suiteId") String suiteId, Pageable pageable); + + @Query("SELECT j.id AS id FROM Job j WHERE j.suite.id = :suiteId") + List findJobIdsBySuiteId(@Param("suiteId") String suiteId); + + List findByState(State paused); + + @Transactional + @Modifying + @Query("UPDATE Job j " + + "SET j.state = 'READY', j.startPrepareTime = NULL " + + "WHERE j.id = :jobId AND j.state = 'RUNNING' AND j.runningTests <= 0 ") + int updateJobToReadyIfNoTestsRunning(@Param("jobId") String jobId); + + @Query("SELECT j FROM Job j WHERE j.submittedBy = :submittedBy AND FUNCTION('DATE',j.submitTime) = :requestedDate") + List findBySubmittedByAndSubmitTime(@Param("submittedBy") String submittedBy, + @Param("requestedDate") Date requestedDate); + + List findBySubmitTimeBeforeAndStateNot(Date deleteUntilDate, State state); + + List findAllByBuildId(String buildId); + + @Transactional + @Modifying + @Query("UPDATE Job j SET j.state = :newState WHERE j.state = :currState1 OR j.state = :currState2") + int updateJobsState(@Param("newState") State newState, + @Param("currState1") State currState1, + @Param("currState2") State currState2); + + List findByStateAndRunningTestsGreaterThan(State state, int runningTestsThreshold); + + Optional findByIdAndStateNot(String jobId, State state); + + List findByBuildIdAndState(String buildId, State state); +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/PrioritizedJobRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/PrioritizedJobRepository.java new file mode 100644 index 00000000..b571b3d0 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/PrioritizedJobRepository.java @@ -0,0 +1,24 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.entities.PrioritizedJob; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface PrioritizedJobRepository extends CrudRepository, JpaRepository { + + Optional findTopByIsPausedFalseOrderByPriorityDesc(); + + List findByIsPausedFalseOrderByPriorityDesc(); + + @Transactional + Long deleteByJobId(String jobId); + + Optional findByJobId(String jobId); +} \ No newline at end of file diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/SuiteRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/SuiteRepository.java new file mode 100644 index 00000000..8beca0d0 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/SuiteRepository.java @@ -0,0 +1,25 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.entities.Suite; +import com.gigaspaces.newman.projections.PSuiteThin; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Set; + +@Repository +public interface SuiteRepository extends CrudRepository { + @Query(value = "SELECT DISTINCT unnest(requirements) FROM suite", nativeQuery = true) + Set findAllRequirements(); + + boolean existsByName(String name); + + @Query("SELECT s.id AS id, s.name AS name, s.customVariables AS customVariables FROM Suite s ORDER BY s.name") + List findAllThinWithCustomVariablesOrderedByName(); + + @Query("SELECT s.id AS id, s.name AS name FROM Suite s ORDER BY s.name") + List findAllThinNoCustomVariablesOrderedByName(); + +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/TestRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/TestRepository.java new file mode 100644 index 00000000..d586b1d3 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/repository/TestRepository.java @@ -0,0 +1,63 @@ +package com.gigaspaces.newman.beans.repository; + +import com.gigaspaces.newman.entities.Test; +import com.gigaspaces.newman.projections.PTest; +import com.gigaspaces.newman.projections.PTestForHistory; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.*; +import org.springframework.data.repository.CrudRepository; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.LockModeType; +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +@Repository +public interface TestRepository extends CrudRepository, JpaSpecificationExecutor, JpaRepository { + + @Query("SELECT DISTINCT t.assignedAgent FROM Test t WHERE t.jobId = :jobId") + Set findDistinctAssignedAgentByJobId(@Param("jobId") String jobId); + + @Transactional + void deleteByJobId(String jobId); + + List findByJobIdAndStatusAndRunNumber(String jobId, Test.Status status, int runNumber); + + boolean existsByJobIdAndStatusIn(String jobId, Collection status); + + @Transactional + @Modifying + @Query("UPDATE Test t SET t.status = :newStatus WHERE t.jobId = :jobId AND t.status = :currentStatus") + int updateStatusByJobIdAndCurrentStatus(@Param("jobId") String jobId, + @Param("currentStatus") Test.Status currentStatus, + @Param("newStatus") Test.Status newStatus); + + Optional findFirstByJobIdAndStatus(String jobId, Test.Status status); + + @Query("SELECT t FROM Test t WHERE t.assignedAgent = :assignedAgent") + List findAllByAssignedAgent(@Param("assignedAgent") String assignedAgent, Pageable pageable); + + @Query("SELECT t FROM Test t WHERE t.jobId = :jobId") + List findAllByJobId(@Param("jobId") String jobId, Pageable pageable); + + @Query(value = "SELECT " + + "t.name AS name, " + + "t.endtime AS endTime, " + + "array_to_string(t.arguments, ' ') AS arguments, " + + "t.sha AS sha, " + + "b.branch AS branch, " + + "j.id as jobId, " + + "b.id AS buildId, " + + "s.id AS suiteId " + + "FROM test t " + + "LEFT JOIN job j ON j.id = t.jobid " + + "JOIN suite s ON s.id = j.suite_id " + + "JOIN build b ON b.id = j.build_id " + + "WHERE t.id = :id", nativeQuery = true) + Optional findTestForHistoryById(@Param("id") String id); +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/BuildSpecifications.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/BuildSpecifications.java new file mode 100644 index 00000000..91983bcc --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/BuildSpecifications.java @@ -0,0 +1,70 @@ +package com.gigaspaces.newman.beans.specification; + +import com.gigaspaces.newman.entities.Build; +import javax.persistence.criteria.Expression; +import javax.persistence.criteria.Predicate; +import org.springframework.data.jpa.domain.Specification; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class BuildSpecifications { + + public static Specification hasAllTags(Set tags) { + return (root, query, cb) -> { + List predicates = new ArrayList<>(); + for (String tag : tags) { + predicates.add(cb.isMember(tag, root.get("tags"))); + } + return cb.and(predicates.toArray(new Predicate[0])); // check for ALL tags FULL match + }; + } + + public static Specification hasBranch(String branch) { + return (root, query, cb) -> cb.equal(root.get("branch"), branch); + } + + public static Specification hasAllJobsCompleted() { + return (root, query, cb) -> { + Expression totalJobs = root.get("buildStatus").get("totalJobs"); + Expression doneJobs = root.get("buildStatus").get("doneJobs"); + Expression brokenJobs = root.get("buildStatus").get("brokenJobs"); + + Predicate hasJobs = cb.greaterThan(totalJobs, 0); + Predicate allCompleted = cb.equal(cb.sum(doneJobs, brokenJobs), totalJobs); + + return cb.and(hasJobs, allCompleted); + }; + } + /* ==================================================================================== */ + public static Specification matchesBranch(String branchStr) { + return (root, query, cb) -> cb.equal(root.get("branch"), branchStr); + } + + public static Specification hasNoTags(Set excludeTags) { + return (root, query, cb) -> { + if (excludeTags == null || excludeTags.isEmpty()) return cb.conjunction(); + + // Subquery style exclusion: no tag in the set should exist in b.tags + return cb.not(root.join("tags").in(excludeTags)); + }; + } + + public static Specification hasTags(Set tagsSet) { + return (root, query, cb) -> { + if (tagsSet == null || tagsSet.isEmpty()) return cb.conjunction(); + + // Build has all of the tags in the set + Predicate[] predicates = tagsSet.stream() + .map(tag -> cb.isMember(tag, root.get("tags"))) + .toArray(Predicate[]::new); + return cb.and(predicates); + }; + } + + public static Specification hasNoJobsInBuildStatus() { + return (root, query, cb) -> cb.equal(root.get("buildStatus").get("totalJobs"), 0); + } +} + diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/JobSpecifications.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/JobSpecifications.java new file mode 100644 index 00000000..d09c8e34 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/JobSpecifications.java @@ -0,0 +1,161 @@ +package com.gigaspaces.newman.beans.specification; + +import com.gigaspaces.newman.beans.State; +import com.gigaspaces.newman.entities.Job; +import com.gigaspaces.newman.entities.Suite; + +import javax.persistence.criteria.*; + +import org.springframework.data.jpa.domain.Specification; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class JobSpecifications { + + public static Specification isReadyOrRunning() { + return (root, query, cb) -> cb.and( + cb.or( + cb.equal(root.get("state"), State.READY), + cb.equal(root.get("state"), State.RUNNING) + ), + cb.notEqual( + cb.sum(root.get("totalTests"), root.get("numOfTestRetries")), + cb.sum(cb.sum(root.get("passedTests"), root.get("failedTests")), root.get("runningTests")) + ) + ); + } + + public static Specification whereJobId(String jobId) { + return (root, query, cb) -> cb.equal(root.get("id"), jobId); + } + + public static Specification hasPreparingAgents() { + return (root, query, cb) -> { + // array_length(preparing_agents, 1) + Expression preparingAgentsLength = getArraySize(cb, root.get("preparingAgents")); + + // totalTests + numOfTestRetries - passedTests - failedTests - runningTests + Expression neededAgentsCount = cb.sum( + cb.sum(root.get("totalTests"), root.get("numOfTestRetries")), // this.totalTests + this.numOfTestRetries + cb.neg(cb.sum( // minus + cb.sum(root.get("passedTests"), root.get("failedTests")), // this.passedTests + this.failedTests + this.runningTests + root.get("runningTests") + )) + ); + + // CASE 1: preparingAgents exists AND its preparingAgents.length < neededAgentsCount + Predicate preparingAgentsExistsAndLessThanNeeded = cb.lessThan(preparingAgentsLength, neededAgentsCount); + + // CASE 2: preparingAgents does not exist => represented by empty array or null in SQL + Predicate preparingAgentsIsEmpty = cb.equal(getArraySize(cb, root.get("preparingAgents")), 0); + + // totalTests != 0 + Predicate totalTestsNonZero = cb.notEqual(root.get("totalTests"), 0); + + return cb.and( + cb.or(preparingAgentsIsEmpty, preparingAgentsExistsAndLessThanNeeded), // less than needed or no agents at all + totalTestsNonZero // and has tests to run + ); + }; + } + + public static Specification hasAnyOfCapabilitiesInRequirements(Set capabilities) { + return (root, query, cb) -> { + // Join with suite + Join suiteJoin = root.join("suite"); + + // Now, let's use cb.function("any", ...) for the "any" Postgres operator. + // This checks if the `requirements` array contains any of the `capabilities` + + List> predicates = new ArrayList<>(); + + for (String capability : capabilities) { + // This is the Postgres expression using `any` function + Expression condition = cb.equal( + cb.literal(capability), + cb.function("ANY", String.class, suiteJoin.get("requirements")) + ); + + predicates.add(condition); + } + + // Combine all predicates with OR (you want to match if ANY of the capabilities is present) + return cb.or(predicates.toArray(new Predicate[0])); + }; + } + + public static Specification hasNoRequirements() { + return (root, query, cb) -> { + Join suiteJoin = root.join("suite"); + return cb.or( + cb.isNull(suiteJoin.get("requirements")), // array is null + cb.equal(getArraySize(cb, suiteJoin.get("requirements")), 0) // array is empty (length is 0) + ); + }; + } + + public static Specification hasAgentGroup(String agentGroup) { + return (root, query, cb) -> cb.equal( + cb.literal(agentGroup), + cb.function("ANY", String.class, root.get("agentGroups")) + ); + } + + // Specification to check if preparingAgents exists and its size is less than the required number + private static Specification preparingAgentsLessThanRequired(int agentWorkersCount) { + return (root, query, cb) -> { + Expression totalPlannedTests = cb.sum(root.get("totalTests"), root.get("numOfTestRetries")); + Expression alreadyProcessedTests = cb.sum( + root.get("passedTests"), + cb.sum(root.get("failedTests"), root.get("runningTests")) + ); + Expression remainingTests = cb.diff(totalPlannedTests, alreadyProcessedTests); + + // join Suite to get workersAllowed + Join suiteJoin = root.join("suite"); + Expression suiteWorkersAllowed = suiteJoin.get("workersAllowed"); + + // determine effective workers per agent: min(agentWorkersCount, suiteWorkersAllowed) + Expression effectiveWorkers = cb.selectCase() // if-else goes below + .when(cb.lessThan(cb.literal(agentWorkersCount), suiteWorkersAllowed), cb.literal(agentWorkersCount)) + .otherwise(suiteWorkersAllowed); + + // ceil division: (remaining + effectiveWorkers - 1) / effectiveWorkers + Expression numerator = cb.sum(remainingTests, cb.diff(effectiveWorkers, cb.literal(1))); + Expression requiredAgents = cb.quot(numerator, effectiveWorkers).as(Integer.class); + + // get current preparing agents count + Expression preparingAgentsCount = getArraySize(cb, root.get("preparingAgents")); + + // final predicate: preparingAgents.size < requiredAgents + return cb.lessThan(preparingAgentsCount, requiredAgents); + }; + } + + // Specification to check if preparingAgents does not exist (is null or empty) + private static Specification preparingAgentsDoesNotExist() { + return (root, query, cb) -> cb.or( + cb.isNull(root.get("preparingAgents")), // array is null + cb.equal(getArraySize(cb, root.get("preparingAgents")), 0) // array is empty (length is 0) + ); + } + + // Combined Specification for preparingAgents (either exists and size is less or doesn't exist) + public static Specification preparingAgentsCondition(int agentWorkersCount) { + return Specification.where(preparingAgentsLessThanRequired(agentWorkersCount)).or(preparingAgentsDoesNotExist()); + } + + private static Expression getArraySize(CriteriaBuilder cb, Path arrayField) { + Expression arrayLength = cb.function( + "array_length", // PostgreSQL function to get the array length + Integer.class, // The return type + arrayField, // The array field + cb.literal(1) // The dimension of the array (1 for single-dimensional arrays) + ); + return cb.coalesce(arrayLength, cb.literal(0)); // array_length requires coalesce for empty arrays + } + +} + diff --git a/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/TestSpecifications.java b/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/TestSpecifications.java new file mode 100644 index 00000000..b5c46f63 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/beans/specification/TestSpecifications.java @@ -0,0 +1,67 @@ +package com.gigaspaces.newman.beans.specification; + +import com.gigaspaces.newman.entities.Build; +import com.gigaspaces.newman.entities.Job; +import com.gigaspaces.newman.entities.Test; +import org.springframework.data.jpa.domain.Specification; + +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.ArrayList; +import java.util.List; + +public class TestSpecifications { + + public static Specification findRecentTestsByNameArgsAndShaAndBranch( + String testName, + List testArguments, + String sha, // pass null if not filtering by sha + List branches + ) { + return (testRoot, query, cb) -> { + // Declare roots manually for each table + //Root testRoot = testRoot; // same as query.from(Test.class); + Root jobRoot = query.from(Job.class); + Root buildRoot = query.from(Build.class); + + List predicates = new ArrayList<>(); + + // manual join via predicates + predicates.add(cb.equal(testRoot.get("jobId"), jobRoot.get("id"))); + predicates.add(cb.equal(jobRoot.get("build").get("id"), buildRoot.get("id"))); + + predicates.add(cb.or( + cb.equal(testRoot.get("status"), Test.Status.FAIL), + cb.equal(testRoot.get("status"), Test.Status.SUCCESS) + )); + + predicates.add(cb.equal(testRoot.get("name"), testName)); + + if (testArguments != null && !testArguments.isEmpty()) { + for (String argument : testArguments) { + // This is the Postgres expression using `any` function + predicates.add( + cb.equal( + cb.literal(argument), + cb.function("ANY", String.class, testRoot.get("arguments")) + ) + ); + } + } + + // filtering by branch + if (branches != null && !branches.isEmpty()) { + predicates.add(buildRoot.get("branch").in(branches)); + } + + if (sha != null) { + predicates.add(cb.equal(testRoot.get("sha"), sha)); + } + + query.orderBy(cb.desc(testRoot.get("endTime"))); + return cb.and(predicates.toArray(new Predicate[0])); + }; + } +} + + diff --git a/newman-server/src/main/java/com/gigaspaces/newman/config/Config.java b/newman-server/src/main/java/com/gigaspaces/newman/config/Config.java deleted file mode 100644 index a88c8ff4..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/config/Config.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.gigaspaces.newman.config; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gigaspaces.newman.NewmanApp; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; - -/** - * Created by Barak Bar Orion - * 4/29/15. - */ -public class Config { - private static final Logger logger = LoggerFactory.getLogger(NewmanApp.class); - private static final ObjectMapper mapper = new ObjectMapper(); - - private Mongo mongo; - - public Config() { - this.mongo = new Mongo(); - } - - - public Mongo getMongo() { - return mongo; - } - - public void setMongo(Mongo mongo) { - this.mongo = mongo; - } - - @Override - public String toString() { - try { - return asJSON(); - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public String asJSON() throws JsonProcessingException { - return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(this); - } - - public static Config fromArgs(String[] args) { - try { - if (args != null && 0 < args.length) { - File file = new File(args[0]); - if (file.exists()) { - return fromFile(file); - } - } - } catch (Exception e) { - logger.error("error while trying to get configuration using args {}", Arrays.asList(args), e); - Config res = new Config(); - logger.warn("Using default config {}", res); - } - Config res = new Config(); - logger.info("Using default config {}", res); - return res; - - } - - private static Config fromFile(File file) throws IOException { - return mapper.readValue(file, Config.class); - } - - - public static Config fromString(String config){ - try { - return mapper.readValue(config, Config.class); - }catch(Exception e){ - Config res = new Config(); - logger.warn("Error while reading config from string '{}' using default configuration {}", config, res, e); - return res; - } - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/config/JpaConfig.java b/newman-server/src/main/java/com/gigaspaces/newman/config/JpaConfig.java new file mode 100644 index 00000000..b92731d4 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/config/JpaConfig.java @@ -0,0 +1,66 @@ +package com.gigaspaces.newman.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.sql.DataSource; +import java.util.Objects; +import java.util.Properties; + +@Configuration +@ComponentScan(basePackages = {"com.gigaspaces.newman"}) +@EnableJpaRepositories(basePackages = {"com.gigaspaces.newman"}) +public class JpaConfig { + + @Bean + public DataSource dataSource() { + String username = System.getProperty("newman.postgres.username", "admin"); + String password = System.getProperty("newman.postgres.password", "password"); + + String host = System.getProperty("newman.postgres.db.host", "localhost:5432"); + String dbName = System.getProperty("newman.postgres.db.name", "newman-db"); + + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("org.postgresql.Driver"); + dataSource.setUrl(String.format("jdbc:postgresql://%s/%s", host, dbName)); + dataSource.setUsername(username); + dataSource.setPassword(password); + return dataSource; + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory() { + LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); + factoryBean.setDataSource(dataSource()); + factoryBean.setPackagesToScan( + "com.gigaspaces.newman.entities", + "com.gigaspaces.newman.beans", + "com.gigaspaces.newman.usermanagment" + ); + factoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); + factoryBean.setJpaProperties(jpaProperties()); + return factoryBean; + } + + @Bean + public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) { + return new JpaTransactionManager(Objects.requireNonNull(emf.getObject())); + } + + private Properties jpaProperties() { + Properties properties = new Properties(); + properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect"); + properties.put("hibernate.hbm2ddl.auto", "update"); // Or 'create'/'validate' + properties.put("hibernate.show_sql", "false"); + properties.put("hibernate.format_sql", "false"); + properties.put("hibernate.use_sql_comments", "false"); + return properties; + } +} \ No newline at end of file diff --git a/newman-server/src/main/java/com/gigaspaces/newman/config/Mongo.java b/newman-server/src/main/java/com/gigaspaces/newman/config/Mongo.java deleted file mode 100644 index 5babf4b7..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/config/Mongo.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.gigaspaces.newman.config; - -import static com.gigaspaces.newman.utils.StringUtils.getNonEmptySystemProperty; - -/** - * Created by Barak Bar Orion - * 4/29/15. - */ -public class Mongo { - private String host; - private String db; - - public Mongo() { - this.host = getNonEmptySystemProperty("newman.mongo.db.host", "localhost"); - this.db = getNonEmptySystemProperty("newman.mongo.db.name", System.getProperty("user.name")); - } - - public String getHost() { - return host; - } - - public void setHost(String host) { - this.host = host; - } - - public String getDb() { - return db; - } - - public void setDb(String db) { - this.db = db; - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/AbstractObjectIdDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/AbstractObjectIdDAO.java deleted file mode 100644 index a0bbe760..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/AbstractObjectIdDAO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.mongodb.MongoClient; -import org.bson.types.ObjectId; -import org.mongodb.morphia.Morphia; -import org.mongodb.morphia.dao.BasicDAO; -import org.mongodb.morphia.query.Query; - -/** - * Created by Barak Bar Orion - * 5/14/15. - */ -public abstract class AbstractObjectIdDAO extends BasicDAO { - public AbstractObjectIdDAO(Morphia morphia, MongoClient mongo, String db) { - super(mongo, morphia, db); - } - public Query createIdQuery(String id){ - return createQuery().field("_id").equal(new ObjectId(id)); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/AgentDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/AgentDAO.java deleted file mode 100644 index 2461cad6..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/AgentDAO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.Agent; -import com.gigaspaces.newman.beans.Build; -import com.mongodb.MongoClient; -import org.bson.types.ObjectId; -import org.mongodb.morphia.Morphia; -import org.mongodb.morphia.dao.BasicDAO; - -/** - * Created by Barak Bar Orion - * 4/11/15. - */ -public class AgentDAO extends AbstractObjectIdDAO { - public AgentDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/BuildDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/BuildDAO.java deleted file mode 100644 index 52ba7650..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/BuildDAO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.Build; -import com.gigaspaces.newman.beans.Test; -import com.mongodb.MongoClient; -import org.bson.types.ObjectId; -import org.mongodb.morphia.Morphia; -import org.mongodb.morphia.dao.BasicDAO; - -/** - * Created by Barak Bar Orion - * 4/11/15. - */ -public class BuildDAO extends AbstractObjectIdDAO { - public BuildDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/BuildsCacheDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/BuildsCacheDAO.java deleted file mode 100644 index 60cbba4f..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/BuildsCacheDAO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.BuildsCache; -import com.mongodb.MongoClient; -import org.mongodb.morphia.Morphia; - -/** - * Created by Boris - * on 28/12/15. - */ -public class BuildsCacheDAO extends AbstractObjectIdDAO { - public BuildsCacheDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/FutureJobDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/FutureJobDAO.java deleted file mode 100644 index c12552a5..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/FutureJobDAO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.FutureJob; -import com.mongodb.MongoClient; -import org.mongodb.morphia.Morphia; - -/** - * Created by tamirs - * on 10/19/15. - */ -public class FutureJobDAO extends AbstractObjectIdDAO { - public FutureJobDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/JobConfigDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/JobConfigDAO.java deleted file mode 100644 index 504458b4..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/JobConfigDAO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.JobConfig; -import com.mongodb.MongoClient; -import org.mongodb.morphia.Morphia; - -public class JobConfigDAO extends AbstractObjectIdDAO { - public JobConfigDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/JobDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/JobDAO.java deleted file mode 100644 index bc7e3416..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/JobDAO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.Job; -import com.mongodb.MongoClient; -import org.mongodb.morphia.Morphia; - -/** - * Created by Barak Bar Orion - * 4/11/15. - */ -public class JobDAO extends AbstractObjectIdDAO { - public JobDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/PrioritizedJobDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/PrioritizedJobDAO.java deleted file mode 100644 index c273bce6..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/PrioritizedJobDAO.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.PrioritizedJob; -import com.mongodb.MongoClient; -import org.mongodb.morphia.Morphia; - - -public class PrioritizedJobDAO extends AbstractObjectIdDAO { - public PrioritizedJobDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} \ No newline at end of file diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/SuiteDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/SuiteDAO.java deleted file mode 100644 index cf5f0b07..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/SuiteDAO.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.Suite; -import com.mongodb.MongoClient; -import org.bson.types.ObjectId; -import org.mongodb.morphia.Morphia; -import org.mongodb.morphia.dao.BasicDAO; - -/** - * Created by Barak Bar Orion - * 4/11/15. - */ -public class SuiteDAO extends AbstractObjectIdDAO { - public SuiteDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/dao/TestDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/dao/TestDAO.java deleted file mode 100644 index c646353b..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/dao/TestDAO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gigaspaces.newman.dao; - -import com.gigaspaces.newman.beans.Test; -import com.mongodb.MongoClient; -import org.mongodb.morphia.Morphia; - -/** - * Created by Barak Bar Orion - * 4/11/15. - */ -public class TestDAO extends AbstractObjectIdDAO { - public TestDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/filters/FrontendRoutingFilter.java b/newman-server/src/main/java/com/gigaspaces/newman/filters/FrontendRoutingFilter.java index 3b856f0a..bf4fe282 100644 --- a/newman-server/src/main/java/com/gigaspaces/newman/filters/FrontendRoutingFilter.java +++ b/newman-server/src/main/java/com/gigaspaces/newman/filters/FrontendRoutingFilter.java @@ -16,12 +16,13 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha HttpServletRequest httpRequest = (HttpServletRequest) request; String path = httpRequest.getRequestURI(); - // Skip API calls and other file paths (e.g., images, CSS, JS) - if (!path.startsWith("/api") && !path.contains(".")) { + if (!path.startsWith("/api") // Send API calls to the backend + && !path.startsWith("/events") // Send WebSocket calls to the backend + && !path.contains(".")) { // Not sure what this is for (likely file names delimiter) // Forward all other requests to index.html for Vue.js to handle request.getRequestDispatcher("/index.html").forward(request, response); } else { - // Proceed with static file requests or API requests + // Proceed with static file requests, API requests and WebSocket requests chain.doFilter(request, response); } } diff --git a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/User.java b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/User.java index fdee7bad..e279cd94 100644 --- a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/User.java +++ b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/User.java @@ -1,19 +1,22 @@ package com.gigaspaces.newman.usermanagment; -import org.mongodb.morphia.annotations.Entity; -import org.mongodb.morphia.annotations.Id; -import org.mongodb.morphia.annotations.Indexed; +import javax.persistence.*; import java.util.Base64; import java.util.Objects; +import java.util.UUID; @Entity +@Table(name = "users") public class User { @Id private String id; - @Indexed(unique=true) + + @Column(unique = true, nullable = false) private String username; + + @Column(nullable = false) private String password; private String role; @@ -23,9 +26,7 @@ public User() { public User(String username, String password, String role) { this.username = username; this.role = role; - - Base64.Encoder encoder = Base64.getEncoder(); - this.password = encoder.encodeToString(password.getBytes()); + this.password = Base64.getEncoder().encodeToString(password.getBytes()); } public String getUsername() { @@ -49,7 +50,7 @@ public String getPassword() { } public void setPassword(String password) { - this.password = password; + this.password = Base64.getEncoder().encodeToString(password.getBytes()); } public String getId() { @@ -60,6 +61,13 @@ public void setId(String id) { this.id = id; } + @PrePersist + public void generateId() { + if (this.id == null) { + this.id = UUID.randomUUID().toString(); + } + } + public String getDecodedPassword() { Base64.Decoder decoder = Base64.getDecoder(); byte[] decodedBytes = decoder.decode(this.password); diff --git a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserController.java b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserController.java index ad441d56..3ce69233 100644 --- a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserController.java +++ b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserController.java @@ -1,7 +1,5 @@ package com.gigaspaces.newman.usermanagment; -import org.eclipse.jetty.security.PropertyUserStore; - import javax.inject.Singleton; import javax.servlet.ServletContext; import javax.ws.rs.*; @@ -18,38 +16,32 @@ public class UserController { private final UserService userService; - public UserController(@Context ServletContext servletContext) throws Exception { + public UserController(@Context ServletContext servletContext) { this.userService = (UserService) servletContext.getAttribute("userService"); - - PropertyUserStore userStore = (PropertyUserStore) servletContext.getAttribute("userStore"); - userStore.start(); } @POST @Path("/add") @Consumes(MediaType.APPLICATION_JSON) public Response addUser(UserDTO userDTO) { - userService.addUser(userDTO.toEntity()); - - // Return a response indicating success - return Response.status(Response.Status.CREATED).build(); + if (userService.addUser(userDTO.toEntity())) { + // Return a response indicating success + return Response.status(Response.Status.CREATED).build(); + } + return Response.status(Response.Status.BAD_REQUEST).build(); } @DELETE @Path("/{username}") public Response removeUser(@PathParam("username") String username) { // Call UserService to remove the user - boolean success = userService.deleteUser(username); - - if (success) { - // Return 204 No Content if user was successfully removed + if (userService.deleteUser(username)) { return Response.status(Response.Status.NO_CONTENT).build(); - } else { - // Return 404 Not Found if user doesn't exist - return Response.status(Response.Status.NOT_FOUND) - .entity("User not found with username: " + username) - .build(); } + + return Response.status(Response.Status.NOT_FOUND) + .entity("User not found with username: " + username) + .build(); } @GET diff --git a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserDAO.java b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserDAO.java deleted file mode 100644 index 2d89cf41..00000000 --- a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserDAO.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gigaspaces.newman.usermanagment; - -import com.gigaspaces.newman.dao.AbstractObjectIdDAO; -import com.mongodb.MongoClient; -import org.mongodb.morphia.Morphia; - -public class UserDAO extends AbstractObjectIdDAO { - public UserDAO(Morphia morphia, MongoClient mongo, String db) { - super(morphia, mongo, db); - } -} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserRepository.java b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserRepository.java new file mode 100644 index 00000000..411f6894 --- /dev/null +++ b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserRepository.java @@ -0,0 +1,22 @@ +package com.gigaspaces.newman.usermanagment; + +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Repository +public interface UserRepository extends CrudRepository { + + List findByUsernameNot(String username); + + User findByUsername(String username); + + @Transactional + @Modifying + void deleteByUsername(String username); + + boolean existsByUsername(String username); +} diff --git a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserService.java b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserService.java index 43db6338..b8e1fd5f 100644 --- a/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserService.java +++ b/newman-server/src/main/java/com/gigaspaces/newman/usermanagment/UserService.java @@ -1,14 +1,10 @@ package com.gigaspaces.newman.usermanagment; -import com.gigaspaces.newman.config.Config; -import com.mongodb.MongoClient; import org.eclipse.jetty.security.PropertyUserStore; import org.eclipse.jetty.util.security.Password; -import org.mongodb.morphia.Datastore; -import org.mongodb.morphia.Morphia; -import org.mongodb.morphia.query.Query; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; import java.security.Principal; import java.util.LinkedList; @@ -16,31 +12,23 @@ import java.util.Optional; import java.util.stream.Collectors; +@Service public class UserService { private static final Logger logger = LoggerFactory.getLogger(UserService.class); - private final PropertyUserStore propertyUserStore; - private final UserDAO userDAO; + private final UserRepository userRepository; + private PropertyUserStore propertyUserStore; - public UserService(PropertyUserStore userStore, Config config) throws Exception { - logger.info("> mongoHost: " + config.getMongo().getHost()); - logger.info("> mongoDb: " + config.getMongo().getDb()); + public UserService(UserRepository userRepository) { + this.userRepository = userRepository; + } - MongoClient mongoClient = new MongoClient(config.getMongo().getHost()); + public void updateUsers(PropertyUserStore userStore) throws Exception { this.propertyUserStore = userStore; - Morphia morphia = new Morphia(); - morphia.map(User.class); - - Datastore datastore = morphia.createDatastore(mongoClient, config.getMongo().getDb()); - datastore.ensureIndexes(); - datastore.ensureCaps(); - - this.userDAO = new UserDAO(morphia, mongoClient, config.getMongo().getDb()); - if (!containsUsersInDatastore()) { this.propertyUserStore.start(); - saveUsersToMongo(this.propertyUserStore); + saveUsersToDB(this.propertyUserStore); logger.info("> users are now saved to MongoDB datastore"); } else { propertyUserStore.setConfig(null); @@ -53,24 +41,26 @@ public UserService(PropertyUserStore userStore, Config config) throws Exception } } - public void addUser(User user) { + public boolean addUser(User user) { logger.info("> adding user: " + user.getUsername()); - userDAO.save(user); + if (userRepository.existsByUsername(user.getUsername())) { + logger.info("> user with name '" + user.getUsername() + "' already exists"); + return false; + } + userRepository.save(user); propertyUserStore.addUser(user.getUsername(), new Password(user.getDecodedPassword()),new String[]{user.getRole()}); + return true; } public Optional getUserByUsername(String username) { - User user = userDAO.find(userDAO.createIdQuery(username)).get(); + User user = userRepository.findByUsername(username); return Optional.ofNullable(user); } public List getAllUsers(boolean includeRoot) { try { logger.info("> requesting all users"); - Query query = userDAO.createQuery(); - return userDAO.find(query).asList().stream() - .filter(u -> includeRoot || !"root".equals(u.getUsername())) // 'root' is a system account. Don't show it up - .collect(Collectors.toList()); + return includeRoot ? (List)userRepository.findAll() : userRepository.findByUsernameNot("root"); } catch (Throwable t) { logger.info(t.getMessage()); } @@ -90,23 +80,18 @@ public boolean deleteUser(String username) { logger.info("> not allowed to delete '" + username + "'"); return false; } - Query query = userDAO.createQuery().field("username").equal(username); - User user = userDAO.findOne(query); - if (user != null) { - Datastore datastore = userDAO.getDatastore(); - datastore.findAndDelete(query); - logger.info("> user has been deleted"); - return true; - } else { - return false; - } + + userRepository.deleteByUsername(username); + logger.info("> user has been deleted"); + + return true; } private boolean containsUsersInDatastore() { return getAllUsers(true).size()-1 > 0; // exclude 'root' } - private void saveUsersToMongo(PropertyUserStore inputStore) { + private void saveUsersToDB(PropertyUserStore inputStore) { inputStore.getKnownUserIdentities().forEach((username, userIdentity) -> { // Get roles for the user String role = userIdentity.getSubject().getPrincipals() @@ -119,7 +104,7 @@ private void saveUsersToMongo(PropertyUserStore inputStore) { User user = new User(username, userData[0].trim(), userData[1].trim()); logger.info("user: " + user); // Save User to MongoDB - userDAO.save(user); + userRepository.save(user); }); } } diff --git a/newman-server/src/main/resources/log4j2.xml b/newman-server/src/main/resources/log4j2.xml index 06e41f81..c10b43d8 100644 --- a/newman-server/src/main/resources/log4j2.xml +++ b/newman-server/src/main/resources/log4j2.xml @@ -12,11 +12,24 @@ + + + + + + \ No newline at end of file diff --git a/newman-server/src/main/resources/version.properties b/newman-server/src/main/resources/version.properties new file mode 100644 index 00000000..9b9343d1 --- /dev/null +++ b/newman-server/src/main/resources/version.properties @@ -0,0 +1 @@ +version=${build.version} \ No newline at end of file diff --git a/newman-server/web/vue/assets/gigaspaces-Dmn4sIH5.png b/newman-server/web/assets/gigaspaces-Dmn4sIH5.png similarity index 100% rename from newman-server/web/vue/assets/gigaspaces-Dmn4sIH5.png rename to newman-server/web/assets/gigaspaces-Dmn4sIH5.png diff --git a/newman-server/web/assets/index-BL4YWNef.css b/newman-server/web/assets/index-BL4YWNef.css new file mode 100644 index 00000000..a529b93a --- /dev/null +++ b/newman-server/web/assets/index-BL4YWNef.css @@ -0,0 +1,57519 @@ +/* @import './base.css'; */ + +#app { + width: 100%; + margin: 0 auto; + padding: 1rem 1rem 1rem 4rem; + font-weight: normal; + border-width: 2px; +} + +a{text-decoration: none;} + +.route, .route:visited{ + text-decoration: none; + color: white; +} + +.ml-sidepanel-size { + margin-left: 200px; +}@keyframes v-shake { + 59% { + margin-left: 0; + } + 60%, 80% { + margin-left: 2px; + } + 70%, 90% { + margin-left: -2px; + } +} +.bg-black { + background-color: #000000 !important; +} +.bg-black { + color: #FFFFFF !important; +} + +.bg-white { + background-color: #FFFFFF !important; +} +.bg-white { + color: #000000 !important; +} + +.bg-transparent { + background-color: transparent !important; +} +.bg-transparent { + color: currentColor !important; +} + +.bg-red { + background-color: #F44336 !important; +} +.bg-red { + color: #FFFFFF !important; +} + +.bg-red-lighten-5 { + background-color: #FFEBEE !important; +} +.bg-red-lighten-5 { + color: #000000 !important; +} + +.bg-red-lighten-4 { + background-color: #FFCDD2 !important; +} +.bg-red-lighten-4 { + color: #000000 !important; +} + +.bg-red-lighten-3 { + background-color: #EF9A9A !important; +} +.bg-red-lighten-3 { + color: #000000 !important; +} + +.bg-red-lighten-2 { + background-color: #E57373 !important; +} +.bg-red-lighten-2 { + color: #FFFFFF !important; +} + +.bg-red-lighten-1 { + background-color: #EF5350 !important; +} +.bg-red-lighten-1 { + color: #FFFFFF !important; +} + +.bg-red-darken-1 { + background-color: #E53935 !important; +} +.bg-red-darken-1 { + color: #FFFFFF !important; +} + +.bg-red-darken-2 { + background-color: #D32F2F !important; +} +.bg-red-darken-2 { + color: #FFFFFF !important; +} + +.bg-red-darken-3 { + background-color: #C62828 !important; +} +.bg-red-darken-3 { + color: #FFFFFF !important; +} + +.bg-red-darken-4 { + background-color: #B71C1C !important; +} +.bg-red-darken-4 { + color: #FFFFFF !important; +} + +.bg-red-accent-1 { + background-color: #FF8A80 !important; +} +.bg-red-accent-1 { + color: #000000 !important; +} + +.bg-red-accent-2 { + background-color: #FF5252 !important; +} +.bg-red-accent-2 { + color: #FFFFFF !important; +} + +.bg-red-accent-3 { + background-color: #FF1744 !important; +} +.bg-red-accent-3 { + color: #FFFFFF !important; +} + +.bg-red-accent-4 { + background-color: #D50000 !important; +} +.bg-red-accent-4 { + color: #FFFFFF !important; +} + +.bg-pink { + background-color: #e91e63 !important; +} +.bg-pink { + color: #FFFFFF !important; +} + +.bg-pink-lighten-5 { + background-color: #fce4ec !important; +} +.bg-pink-lighten-5 { + color: #000000 !important; +} + +.bg-pink-lighten-4 { + background-color: #f8bbd0 !important; +} +.bg-pink-lighten-4 { + color: #000000 !important; +} + +.bg-pink-lighten-3 { + background-color: #f48fb1 !important; +} +.bg-pink-lighten-3 { + color: #000000 !important; +} + +.bg-pink-lighten-2 { + background-color: #f06292 !important; +} +.bg-pink-lighten-2 { + color: #FFFFFF !important; +} + +.bg-pink-lighten-1 { + background-color: #ec407a !important; +} +.bg-pink-lighten-1 { + color: #FFFFFF !important; +} + +.bg-pink-darken-1 { + background-color: #d81b60 !important; +} +.bg-pink-darken-1 { + color: #FFFFFF !important; +} + +.bg-pink-darken-2 { + background-color: #c2185b !important; +} +.bg-pink-darken-2 { + color: #FFFFFF !important; +} + +.bg-pink-darken-3 { + background-color: #ad1457 !important; +} +.bg-pink-darken-3 { + color: #FFFFFF !important; +} + +.bg-pink-darken-4 { + background-color: #880e4f !important; +} +.bg-pink-darken-4 { + color: #FFFFFF !important; +} + +.bg-pink-accent-1 { + background-color: #ff80ab !important; +} +.bg-pink-accent-1 { + color: #FFFFFF !important; +} + +.bg-pink-accent-2 { + background-color: #ff4081 !important; +} +.bg-pink-accent-2 { + color: #FFFFFF !important; +} + +.bg-pink-accent-3 { + background-color: #f50057 !important; +} +.bg-pink-accent-3 { + color: #FFFFFF !important; +} + +.bg-pink-accent-4 { + background-color: #c51162 !important; +} +.bg-pink-accent-4 { + color: #FFFFFF !important; +} + +.bg-purple { + background-color: #9c27b0 !important; +} +.bg-purple { + color: #FFFFFF !important; +} + +.bg-purple-lighten-5 { + background-color: #f3e5f5 !important; +} +.bg-purple-lighten-5 { + color: #000000 !important; +} + +.bg-purple-lighten-4 { + background-color: #e1bee7 !important; +} +.bg-purple-lighten-4 { + color: #000000 !important; +} + +.bg-purple-lighten-3 { + background-color: #ce93d8 !important; +} +.bg-purple-lighten-3 { + color: #FFFFFF !important; +} + +.bg-purple-lighten-2 { + background-color: #ba68c8 !important; +} +.bg-purple-lighten-2 { + color: #FFFFFF !important; +} + +.bg-purple-lighten-1 { + background-color: #ab47bc !important; +} +.bg-purple-lighten-1 { + color: #FFFFFF !important; +} + +.bg-purple-darken-1 { + background-color: #8e24aa !important; +} +.bg-purple-darken-1 { + color: #FFFFFF !important; +} + +.bg-purple-darken-2 { + background-color: #7b1fa2 !important; +} +.bg-purple-darken-2 { + color: #FFFFFF !important; +} + +.bg-purple-darken-3 { + background-color: #6a1b9a !important; +} +.bg-purple-darken-3 { + color: #FFFFFF !important; +} + +.bg-purple-darken-4 { + background-color: #4a148c !important; +} +.bg-purple-darken-4 { + color: #FFFFFF !important; +} + +.bg-purple-accent-1 { + background-color: #ea80fc !important; +} +.bg-purple-accent-1 { + color: #FFFFFF !important; +} + +.bg-purple-accent-2 { + background-color: #e040fb !important; +} +.bg-purple-accent-2 { + color: #FFFFFF !important; +} + +.bg-purple-accent-3 { + background-color: #d500f9 !important; +} +.bg-purple-accent-3 { + color: #FFFFFF !important; +} + +.bg-purple-accent-4 { + background-color: #aa00ff !important; +} +.bg-purple-accent-4 { + color: #FFFFFF !important; +} + +.bg-deep-purple { + background-color: #673ab7 !important; +} +.bg-deep-purple { + color: #FFFFFF !important; +} + +.bg-deep-purple-lighten-5 { + background-color: #ede7f6 !important; +} +.bg-deep-purple-lighten-5 { + color: #000000 !important; +} + +.bg-deep-purple-lighten-4 { + background-color: #d1c4e9 !important; +} +.bg-deep-purple-lighten-4 { + color: #000000 !important; +} + +.bg-deep-purple-lighten-3 { + background-color: #b39ddb !important; +} +.bg-deep-purple-lighten-3 { + color: #FFFFFF !important; +} + +.bg-deep-purple-lighten-2 { + background-color: #9575cd !important; +} +.bg-deep-purple-lighten-2 { + color: #FFFFFF !important; +} + +.bg-deep-purple-lighten-1 { + background-color: #7e57c2 !important; +} +.bg-deep-purple-lighten-1 { + color: #FFFFFF !important; +} + +.bg-deep-purple-darken-1 { + background-color: #5e35b1 !important; +} +.bg-deep-purple-darken-1 { + color: #FFFFFF !important; +} + +.bg-deep-purple-darken-2 { + background-color: #512da8 !important; +} +.bg-deep-purple-darken-2 { + color: #FFFFFF !important; +} + +.bg-deep-purple-darken-3 { + background-color: #4527a0 !important; +} +.bg-deep-purple-darken-3 { + color: #FFFFFF !important; +} + +.bg-deep-purple-darken-4 { + background-color: #311b92 !important; +} +.bg-deep-purple-darken-4 { + color: #FFFFFF !important; +} + +.bg-deep-purple-accent-1 { + background-color: #b388ff !important; +} +.bg-deep-purple-accent-1 { + color: #FFFFFF !important; +} + +.bg-deep-purple-accent-2 { + background-color: #7c4dff !important; +} +.bg-deep-purple-accent-2 { + color: #FFFFFF !important; +} + +.bg-deep-purple-accent-3 { + background-color: #651fff !important; +} +.bg-deep-purple-accent-3 { + color: #FFFFFF !important; +} + +.bg-deep-purple-accent-4 { + background-color: #6200ea !important; +} +.bg-deep-purple-accent-4 { + color: #FFFFFF !important; +} + +.bg-indigo { + background-color: #3f51b5 !important; +} +.bg-indigo { + color: #FFFFFF !important; +} + +.bg-indigo-lighten-5 { + background-color: #e8eaf6 !important; +} +.bg-indigo-lighten-5 { + color: #000000 !important; +} + +.bg-indigo-lighten-4 { + background-color: #c5cae9 !important; +} +.bg-indigo-lighten-4 { + color: #000000 !important; +} + +.bg-indigo-lighten-3 { + background-color: #9fa8da !important; +} +.bg-indigo-lighten-3 { + color: #FFFFFF !important; +} + +.bg-indigo-lighten-2 { + background-color: #7986cb !important; +} +.bg-indigo-lighten-2 { + color: #FFFFFF !important; +} + +.bg-indigo-lighten-1 { + background-color: #5c6bc0 !important; +} +.bg-indigo-lighten-1 { + color: #FFFFFF !important; +} + +.bg-indigo-darken-1 { + background-color: #3949ab !important; +} +.bg-indigo-darken-1 { + color: #FFFFFF !important; +} + +.bg-indigo-darken-2 { + background-color: #303f9f !important; +} +.bg-indigo-darken-2 { + color: #FFFFFF !important; +} + +.bg-indigo-darken-3 { + background-color: #283593 !important; +} +.bg-indigo-darken-3 { + color: #FFFFFF !important; +} + +.bg-indigo-darken-4 { + background-color: #1a237e !important; +} +.bg-indigo-darken-4 { + color: #FFFFFF !important; +} + +.bg-indigo-accent-1 { + background-color: #8c9eff !important; +} +.bg-indigo-accent-1 { + color: #FFFFFF !important; +} + +.bg-indigo-accent-2 { + background-color: #536dfe !important; +} +.bg-indigo-accent-2 { + color: #FFFFFF !important; +} + +.bg-indigo-accent-3 { + background-color: #3d5afe !important; +} +.bg-indigo-accent-3 { + color: #FFFFFF !important; +} + +.bg-indigo-accent-4 { + background-color: #304ffe !important; +} +.bg-indigo-accent-4 { + color: #FFFFFF !important; +} + +.bg-blue { + background-color: #2196F3 !important; +} +.bg-blue { + color: #FFFFFF !important; +} + +.bg-blue-lighten-5 { + background-color: #E3F2FD !important; +} +.bg-blue-lighten-5 { + color: #000000 !important; +} + +.bg-blue-lighten-4 { + background-color: #BBDEFB !important; +} +.bg-blue-lighten-4 { + color: #000000 !important; +} + +.bg-blue-lighten-3 { + background-color: #90CAF9 !important; +} +.bg-blue-lighten-3 { + color: #000000 !important; +} + +.bg-blue-lighten-2 { + background-color: #64B5F6 !important; +} +.bg-blue-lighten-2 { + color: #000000 !important; +} + +.bg-blue-lighten-1 { + background-color: #42A5F5 !important; +} +.bg-blue-lighten-1 { + color: #FFFFFF !important; +} + +.bg-blue-darken-1 { + background-color: #1E88E5 !important; +} +.bg-blue-darken-1 { + color: #FFFFFF !important; +} + +.bg-blue-darken-2 { + background-color: #1976D2 !important; +} +.bg-blue-darken-2 { + color: #FFFFFF !important; +} + +.bg-blue-darken-3 { + background-color: #1565C0 !important; +} +.bg-blue-darken-3 { + color: #FFFFFF !important; +} + +.bg-blue-darken-4 { + background-color: #0D47A1 !important; +} +.bg-blue-darken-4 { + color: #FFFFFF !important; +} + +.bg-blue-accent-1 { + background-color: #82B1FF !important; +} +.bg-blue-accent-1 { + color: #000000 !important; +} + +.bg-blue-accent-2 { + background-color: #448AFF !important; +} +.bg-blue-accent-2 { + color: #FFFFFF !important; +} + +.bg-blue-accent-3 { + background-color: #2979FF !important; +} +.bg-blue-accent-3 { + color: #FFFFFF !important; +} + +.bg-blue-accent-4 { + background-color: #2962FF !important; +} +.bg-blue-accent-4 { + color: #FFFFFF !important; +} + +.bg-light-blue { + background-color: #03a9f4 !important; +} +.bg-light-blue { + color: #FFFFFF !important; +} + +.bg-light-blue-lighten-5 { + background-color: #e1f5fe !important; +} +.bg-light-blue-lighten-5 { + color: #000000 !important; +} + +.bg-light-blue-lighten-4 { + background-color: #b3e5fc !important; +} +.bg-light-blue-lighten-4 { + color: #000000 !important; +} + +.bg-light-blue-lighten-3 { + background-color: #81d4fa !important; +} +.bg-light-blue-lighten-3 { + color: #000000 !important; +} + +.bg-light-blue-lighten-2 { + background-color: #4fc3f7 !important; +} +.bg-light-blue-lighten-2 { + color: #000000 !important; +} + +.bg-light-blue-lighten-1 { + background-color: #29b6f6 !important; +} +.bg-light-blue-lighten-1 { + color: #000000 !important; +} + +.bg-light-blue-darken-1 { + background-color: #039be5 !important; +} +.bg-light-blue-darken-1 { + color: #FFFFFF !important; +} + +.bg-light-blue-darken-2 { + background-color: #0288d1 !important; +} +.bg-light-blue-darken-2 { + color: #FFFFFF !important; +} + +.bg-light-blue-darken-3 { + background-color: #0277bd !important; +} +.bg-light-blue-darken-3 { + color: #FFFFFF !important; +} + +.bg-light-blue-darken-4 { + background-color: #01579b !important; +} +.bg-light-blue-darken-4 { + color: #FFFFFF !important; +} + +.bg-light-blue-accent-1 { + background-color: #80d8ff !important; +} +.bg-light-blue-accent-1 { + color: #000000 !important; +} + +.bg-light-blue-accent-2 { + background-color: #40c4ff !important; +} +.bg-light-blue-accent-2 { + color: #000000 !important; +} + +.bg-light-blue-accent-3 { + background-color: #00b0ff !important; +} +.bg-light-blue-accent-3 { + color: #FFFFFF !important; +} + +.bg-light-blue-accent-4 { + background-color: #0091ea !important; +} +.bg-light-blue-accent-4 { + color: #FFFFFF !important; +} + +.bg-cyan { + background-color: #00bcd4 !important; +} +.bg-cyan { + color: #000000 !important; +} + +.bg-cyan-lighten-5 { + background-color: #e0f7fa !important; +} +.bg-cyan-lighten-5 { + color: #000000 !important; +} + +.bg-cyan-lighten-4 { + background-color: #b2ebf2 !important; +} +.bg-cyan-lighten-4 { + color: #000000 !important; +} + +.bg-cyan-lighten-3 { + background-color: #80deea !important; +} +.bg-cyan-lighten-3 { + color: #000000 !important; +} + +.bg-cyan-lighten-2 { + background-color: #4dd0e1 !important; +} +.bg-cyan-lighten-2 { + color: #000000 !important; +} + +.bg-cyan-lighten-1 { + background-color: #26c6da !important; +} +.bg-cyan-lighten-1 { + color: #000000 !important; +} + +.bg-cyan-darken-1 { + background-color: #00acc1 !important; +} +.bg-cyan-darken-1 { + color: #FFFFFF !important; +} + +.bg-cyan-darken-2 { + background-color: #0097a7 !important; +} +.bg-cyan-darken-2 { + color: #FFFFFF !important; +} + +.bg-cyan-darken-3 { + background-color: #00838f !important; +} +.bg-cyan-darken-3 { + color: #FFFFFF !important; +} + +.bg-cyan-darken-4 { + background-color: #006064 !important; +} +.bg-cyan-darken-4 { + color: #FFFFFF !important; +} + +.bg-cyan-accent-1 { + background-color: #84ffff !important; +} +.bg-cyan-accent-1 { + color: #000000 !important; +} + +.bg-cyan-accent-2 { + background-color: #18ffff !important; +} +.bg-cyan-accent-2 { + color: #000000 !important; +} + +.bg-cyan-accent-3 { + background-color: #00e5ff !important; +} +.bg-cyan-accent-3 { + color: #000000 !important; +} + +.bg-cyan-accent-4 { + background-color: #00b8d4 !important; +} +.bg-cyan-accent-4 { + color: #FFFFFF !important; +} + +.bg-teal { + background-color: #009688 !important; +} +.bg-teal { + color: #FFFFFF !important; +} + +.bg-teal-lighten-5 { + background-color: #e0f2f1 !important; +} +.bg-teal-lighten-5 { + color: #000000 !important; +} + +.bg-teal-lighten-4 { + background-color: #b2dfdb !important; +} +.bg-teal-lighten-4 { + color: #000000 !important; +} + +.bg-teal-lighten-3 { + background-color: #80cbc4 !important; +} +.bg-teal-lighten-3 { + color: #000000 !important; +} + +.bg-teal-lighten-2 { + background-color: #4db6ac !important; +} +.bg-teal-lighten-2 { + color: #FFFFFF !important; +} + +.bg-teal-lighten-1 { + background-color: #26a69a !important; +} +.bg-teal-lighten-1 { + color: #FFFFFF !important; +} + +.bg-teal-darken-1 { + background-color: #00897b !important; +} +.bg-teal-darken-1 { + color: #FFFFFF !important; +} + +.bg-teal-darken-2 { + background-color: #00796b !important; +} +.bg-teal-darken-2 { + color: #FFFFFF !important; +} + +.bg-teal-darken-3 { + background-color: #00695c !important; +} +.bg-teal-darken-3 { + color: #FFFFFF !important; +} + +.bg-teal-darken-4 { + background-color: #004d40 !important; +} +.bg-teal-darken-4 { + color: #FFFFFF !important; +} + +.bg-teal-accent-1 { + background-color: #a7ffeb !important; +} +.bg-teal-accent-1 { + color: #000000 !important; +} + +.bg-teal-accent-2 { + background-color: #64ffda !important; +} +.bg-teal-accent-2 { + color: #000000 !important; +} + +.bg-teal-accent-3 { + background-color: #1de9b6 !important; +} +.bg-teal-accent-3 { + color: #000000 !important; +} + +.bg-teal-accent-4 { + background-color: #00bfa5 !important; +} +.bg-teal-accent-4 { + color: #FFFFFF !important; +} + +.bg-green { + background-color: #4CAF50 !important; +} +.bg-green { + color: #FFFFFF !important; +} + +.bg-green-lighten-5 { + background-color: #E8F5E9 !important; +} +.bg-green-lighten-5 { + color: #000000 !important; +} + +.bg-green-lighten-4 { + background-color: #C8E6C9 !important; +} +.bg-green-lighten-4 { + color: #000000 !important; +} + +.bg-green-lighten-3 { + background-color: #A5D6A7 !important; +} +.bg-green-lighten-3 { + color: #000000 !important; +} + +.bg-green-lighten-2 { + background-color: #81C784 !important; +} +.bg-green-lighten-2 { + color: #000000 !important; +} + +.bg-green-lighten-1 { + background-color: #66BB6A !important; +} +.bg-green-lighten-1 { + color: #FFFFFF !important; +} + +.bg-green-darken-1 { + background-color: #43A047 !important; +} +.bg-green-darken-1 { + color: #FFFFFF !important; +} + +.bg-green-darken-2 { + background-color: #388E3C !important; +} +.bg-green-darken-2 { + color: #FFFFFF !important; +} + +.bg-green-darken-3 { + background-color: #2E7D32 !important; +} +.bg-green-darken-3 { + color: #FFFFFF !important; +} + +.bg-green-darken-4 { + background-color: #1B5E20 !important; +} +.bg-green-darken-4 { + color: #FFFFFF !important; +} + +.bg-green-accent-1 { + background-color: #B9F6CA !important; +} +.bg-green-accent-1 { + color: #000000 !important; +} + +.bg-green-accent-2 { + background-color: #69F0AE !important; +} +.bg-green-accent-2 { + color: #000000 !important; +} + +.bg-green-accent-3 { + background-color: #00E676 !important; +} +.bg-green-accent-3 { + color: #000000 !important; +} + +.bg-green-accent-4 { + background-color: #00C853 !important; +} +.bg-green-accent-4 { + color: #000000 !important; +} + +.bg-light-green { + background-color: #8bc34a !important; +} +.bg-light-green { + color: #000000 !important; +} + +.bg-light-green-lighten-5 { + background-color: #f1f8e9 !important; +} +.bg-light-green-lighten-5 { + color: #000000 !important; +} + +.bg-light-green-lighten-4 { + background-color: #dcedc8 !important; +} +.bg-light-green-lighten-4 { + color: #000000 !important; +} + +.bg-light-green-lighten-3 { + background-color: #c5e1a5 !important; +} +.bg-light-green-lighten-3 { + color: #000000 !important; +} + +.bg-light-green-lighten-2 { + background-color: #aed581 !important; +} +.bg-light-green-lighten-2 { + color: #000000 !important; +} + +.bg-light-green-lighten-1 { + background-color: #9ccc65 !important; +} +.bg-light-green-lighten-1 { + color: #000000 !important; +} + +.bg-light-green-darken-1 { + background-color: #7cb342 !important; +} +.bg-light-green-darken-1 { + color: #FFFFFF !important; +} + +.bg-light-green-darken-2 { + background-color: #689f38 !important; +} +.bg-light-green-darken-2 { + color: #FFFFFF !important; +} + +.bg-light-green-darken-3 { + background-color: #558b2f !important; +} +.bg-light-green-darken-3 { + color: #FFFFFF !important; +} + +.bg-light-green-darken-4 { + background-color: #33691e !important; +} +.bg-light-green-darken-4 { + color: #FFFFFF !important; +} + +.bg-light-green-accent-1 { + background-color: #ccff90 !important; +} +.bg-light-green-accent-1 { + color: #000000 !important; +} + +.bg-light-green-accent-2 { + background-color: #b2ff59 !important; +} +.bg-light-green-accent-2 { + color: #000000 !important; +} + +.bg-light-green-accent-3 { + background-color: #76ff03 !important; +} +.bg-light-green-accent-3 { + color: #000000 !important; +} + +.bg-light-green-accent-4 { + background-color: #64dd17 !important; +} +.bg-light-green-accent-4 { + color: #000000 !important; +} + +.bg-lime { + background-color: #cddc39 !important; +} +.bg-lime { + color: #000000 !important; +} + +.bg-lime-lighten-5 { + background-color: #f9fbe7 !important; +} +.bg-lime-lighten-5 { + color: #000000 !important; +} + +.bg-lime-lighten-4 { + background-color: #f0f4c3 !important; +} +.bg-lime-lighten-4 { + color: #000000 !important; +} + +.bg-lime-lighten-3 { + background-color: #e6ee9c !important; +} +.bg-lime-lighten-3 { + color: #000000 !important; +} + +.bg-lime-lighten-2 { + background-color: #dce775 !important; +} +.bg-lime-lighten-2 { + color: #000000 !important; +} + +.bg-lime-lighten-1 { + background-color: #d4e157 !important; +} +.bg-lime-lighten-1 { + color: #000000 !important; +} + +.bg-lime-darken-1 { + background-color: #c0ca33 !important; +} +.bg-lime-darken-1 { + color: #000000 !important; +} + +.bg-lime-darken-2 { + background-color: #afb42b !important; +} +.bg-lime-darken-2 { + color: #000000 !important; +} + +.bg-lime-darken-3 { + background-color: #9e9d24 !important; +} +.bg-lime-darken-3 { + color: #FFFFFF !important; +} + +.bg-lime-darken-4 { + background-color: #827717 !important; +} +.bg-lime-darken-4 { + color: #FFFFFF !important; +} + +.bg-lime-accent-1 { + background-color: #f4ff81 !important; +} +.bg-lime-accent-1 { + color: #000000 !important; +} + +.bg-lime-accent-2 { + background-color: #eeff41 !important; +} +.bg-lime-accent-2 { + color: #000000 !important; +} + +.bg-lime-accent-3 { + background-color: #c6ff00 !important; +} +.bg-lime-accent-3 { + color: #000000 !important; +} + +.bg-lime-accent-4 { + background-color: #aeea00 !important; +} +.bg-lime-accent-4 { + color: #000000 !important; +} + +.bg-yellow { + background-color: #ffeb3b !important; +} +.bg-yellow { + color: #000000 !important; +} + +.bg-yellow-lighten-5 { + background-color: #fffde7 !important; +} +.bg-yellow-lighten-5 { + color: #000000 !important; +} + +.bg-yellow-lighten-4 { + background-color: #fff9c4 !important; +} +.bg-yellow-lighten-4 { + color: #000000 !important; +} + +.bg-yellow-lighten-3 { + background-color: #fff59d !important; +} +.bg-yellow-lighten-3 { + color: #000000 !important; +} + +.bg-yellow-lighten-2 { + background-color: #fff176 !important; +} +.bg-yellow-lighten-2 { + color: #000000 !important; +} + +.bg-yellow-lighten-1 { + background-color: #ffee58 !important; +} +.bg-yellow-lighten-1 { + color: #000000 !important; +} + +.bg-yellow-darken-1 { + background-color: #fdd835 !important; +} +.bg-yellow-darken-1 { + color: #000000 !important; +} + +.bg-yellow-darken-2 { + background-color: #fbc02d !important; +} +.bg-yellow-darken-2 { + color: #000000 !important; +} + +.bg-yellow-darken-3 { + background-color: #f9a825 !important; +} +.bg-yellow-darken-3 { + color: #000000 !important; +} + +.bg-yellow-darken-4 { + background-color: #f57f17 !important; +} +.bg-yellow-darken-4 { + color: #FFFFFF !important; +} + +.bg-yellow-accent-1 { + background-color: #ffff8d !important; +} +.bg-yellow-accent-1 { + color: #000000 !important; +} + +.bg-yellow-accent-2 { + background-color: #ffff00 !important; +} +.bg-yellow-accent-2 { + color: #000000 !important; +} + +.bg-yellow-accent-3 { + background-color: #ffea00 !important; +} +.bg-yellow-accent-3 { + color: #000000 !important; +} + +.bg-yellow-accent-4 { + background-color: #ffd600 !important; +} +.bg-yellow-accent-4 { + color: #000000 !important; +} + +.bg-amber { + background-color: #ffc107 !important; +} +.bg-amber { + color: #000000 !important; +} + +.bg-amber-lighten-5 { + background-color: #fff8e1 !important; +} +.bg-amber-lighten-5 { + color: #000000 !important; +} + +.bg-amber-lighten-4 { + background-color: #ffecb3 !important; +} +.bg-amber-lighten-4 { + color: #000000 !important; +} + +.bg-amber-lighten-3 { + background-color: #ffe082 !important; +} +.bg-amber-lighten-3 { + color: #000000 !important; +} + +.bg-amber-lighten-2 { + background-color: #ffd54f !important; +} +.bg-amber-lighten-2 { + color: #000000 !important; +} + +.bg-amber-lighten-1 { + background-color: #ffca28 !important; +} +.bg-amber-lighten-1 { + color: #000000 !important; +} + +.bg-amber-darken-1 { + background-color: #ffb300 !important; +} +.bg-amber-darken-1 { + color: #000000 !important; +} + +.bg-amber-darken-2 { + background-color: #ffa000 !important; +} +.bg-amber-darken-2 { + color: #000000 !important; +} + +.bg-amber-darken-3 { + background-color: #ff8f00 !important; +} +.bg-amber-darken-3 { + color: #000000 !important; +} + +.bg-amber-darken-4 { + background-color: #ff6f00 !important; +} +.bg-amber-darken-4 { + color: #FFFFFF !important; +} + +.bg-amber-accent-1 { + background-color: #ffe57f !important; +} +.bg-amber-accent-1 { + color: #000000 !important; +} + +.bg-amber-accent-2 { + background-color: #ffd740 !important; +} +.bg-amber-accent-2 { + color: #000000 !important; +} + +.bg-amber-accent-3 { + background-color: #ffc400 !important; +} +.bg-amber-accent-3 { + color: #000000 !important; +} + +.bg-amber-accent-4 { + background-color: #ffab00 !important; +} +.bg-amber-accent-4 { + color: #000000 !important; +} + +.bg-orange { + background-color: #ff9800 !important; +} +.bg-orange { + color: #000000 !important; +} + +.bg-orange-lighten-5 { + background-color: #fff3e0 !important; +} +.bg-orange-lighten-5 { + color: #000000 !important; +} + +.bg-orange-lighten-4 { + background-color: #ffe0b2 !important; +} +.bg-orange-lighten-4 { + color: #000000 !important; +} + +.bg-orange-lighten-3 { + background-color: #ffcc80 !important; +} +.bg-orange-lighten-3 { + color: #000000 !important; +} + +.bg-orange-lighten-2 { + background-color: #ffb74d !important; +} +.bg-orange-lighten-2 { + color: #000000 !important; +} + +.bg-orange-lighten-1 { + background-color: #ffa726 !important; +} +.bg-orange-lighten-1 { + color: #000000 !important; +} + +.bg-orange-darken-1 { + background-color: #fb8c00 !important; +} +.bg-orange-darken-1 { + color: #FFFFFF !important; +} + +.bg-orange-darken-2 { + background-color: #f57c00 !important; +} +.bg-orange-darken-2 { + color: #FFFFFF !important; +} + +.bg-orange-darken-3 { + background-color: #ef6c00 !important; +} +.bg-orange-darken-3 { + color: #FFFFFF !important; +} + +.bg-orange-darken-4 { + background-color: #e65100 !important; +} +.bg-orange-darken-4 { + color: #FFFFFF !important; +} + +.bg-orange-accent-1 { + background-color: #ffd180 !important; +} +.bg-orange-accent-1 { + color: #000000 !important; +} + +.bg-orange-accent-2 { + background-color: #ffab40 !important; +} +.bg-orange-accent-2 { + color: #000000 !important; +} + +.bg-orange-accent-3 { + background-color: #ff9100 !important; +} +.bg-orange-accent-3 { + color: #000000 !important; +} + +.bg-orange-accent-4 { + background-color: #ff6d00 !important; +} +.bg-orange-accent-4 { + color: #FFFFFF !important; +} + +.bg-deep-orange { + background-color: #ff5722 !important; +} +.bg-deep-orange { + color: #FFFFFF !important; +} + +.bg-deep-orange-lighten-5 { + background-color: #fbe9e7 !important; +} +.bg-deep-orange-lighten-5 { + color: #000000 !important; +} + +.bg-deep-orange-lighten-4 { + background-color: #ffccbc !important; +} +.bg-deep-orange-lighten-4 { + color: #000000 !important; +} + +.bg-deep-orange-lighten-3 { + background-color: #ffab91 !important; +} +.bg-deep-orange-lighten-3 { + color: #000000 !important; +} + +.bg-deep-orange-lighten-2 { + background-color: #ff8a65 !important; +} +.bg-deep-orange-lighten-2 { + color: #000000 !important; +} + +.bg-deep-orange-lighten-1 { + background-color: #ff7043 !important; +} +.bg-deep-orange-lighten-1 { + color: #FFFFFF !important; +} + +.bg-deep-orange-darken-1 { + background-color: #f4511e !important; +} +.bg-deep-orange-darken-1 { + color: #FFFFFF !important; +} + +.bg-deep-orange-darken-2 { + background-color: #e64a19 !important; +} +.bg-deep-orange-darken-2 { + color: #FFFFFF !important; +} + +.bg-deep-orange-darken-3 { + background-color: #d84315 !important; +} +.bg-deep-orange-darken-3 { + color: #FFFFFF !important; +} + +.bg-deep-orange-darken-4 { + background-color: #bf360c !important; +} +.bg-deep-orange-darken-4 { + color: #FFFFFF !important; +} + +.bg-deep-orange-accent-1 { + background-color: #ff9e80 !important; +} +.bg-deep-orange-accent-1 { + color: #000000 !important; +} + +.bg-deep-orange-accent-2 { + background-color: #ff6e40 !important; +} +.bg-deep-orange-accent-2 { + color: #FFFFFF !important; +} + +.bg-deep-orange-accent-3 { + background-color: #ff3d00 !important; +} +.bg-deep-orange-accent-3 { + color: #FFFFFF !important; +} + +.bg-deep-orange-accent-4 { + background-color: #dd2c00 !important; +} +.bg-deep-orange-accent-4 { + color: #FFFFFF !important; +} + +.bg-brown { + background-color: #795548 !important; +} +.bg-brown { + color: #FFFFFF !important; +} + +.bg-brown-lighten-5 { + background-color: #efebe9 !important; +} +.bg-brown-lighten-5 { + color: #000000 !important; +} + +.bg-brown-lighten-4 { + background-color: #d7ccc8 !important; +} +.bg-brown-lighten-4 { + color: #000000 !important; +} + +.bg-brown-lighten-3 { + background-color: #bcaaa4 !important; +} +.bg-brown-lighten-3 { + color: #000000 !important; +} + +.bg-brown-lighten-2 { + background-color: #a1887f !important; +} +.bg-brown-lighten-2 { + color: #FFFFFF !important; +} + +.bg-brown-lighten-1 { + background-color: #8d6e63 !important; +} +.bg-brown-lighten-1 { + color: #FFFFFF !important; +} + +.bg-brown-darken-1 { + background-color: #6d4c41 !important; +} +.bg-brown-darken-1 { + color: #FFFFFF !important; +} + +.bg-brown-darken-2 { + background-color: #5d4037 !important; +} +.bg-brown-darken-2 { + color: #FFFFFF !important; +} + +.bg-brown-darken-3 { + background-color: #4e342e !important; +} +.bg-brown-darken-3 { + color: #FFFFFF !important; +} + +.bg-brown-darken-4 { + background-color: #3e2723 !important; +} +.bg-brown-darken-4 { + color: #FFFFFF !important; +} + +.bg-blue-grey { + background-color: #607d8b !important; +} +.bg-blue-grey { + color: #FFFFFF !important; +} + +.bg-blue-grey-lighten-5 { + background-color: #eceff1 !important; +} +.bg-blue-grey-lighten-5 { + color: #000000 !important; +} + +.bg-blue-grey-lighten-4 { + background-color: #cfd8dc !important; +} +.bg-blue-grey-lighten-4 { + color: #000000 !important; +} + +.bg-blue-grey-lighten-3 { + background-color: #b0bec5 !important; +} +.bg-blue-grey-lighten-3 { + color: #000000 !important; +} + +.bg-blue-grey-lighten-2 { + background-color: #90a4ae !important; +} +.bg-blue-grey-lighten-2 { + color: #FFFFFF !important; +} + +.bg-blue-grey-lighten-1 { + background-color: #78909c !important; +} +.bg-blue-grey-lighten-1 { + color: #FFFFFF !important; +} + +.bg-blue-grey-darken-1 { + background-color: #546e7a !important; +} +.bg-blue-grey-darken-1 { + color: #FFFFFF !important; +} + +.bg-blue-grey-darken-2 { + background-color: #455a64 !important; +} +.bg-blue-grey-darken-2 { + color: #FFFFFF !important; +} + +.bg-blue-grey-darken-3 { + background-color: #37474f !important; +} +.bg-blue-grey-darken-3 { + color: #FFFFFF !important; +} + +.bg-blue-grey-darken-4 { + background-color: #263238 !important; +} +.bg-blue-grey-darken-4 { + color: #FFFFFF !important; +} + +.bg-grey { + background-color: #9e9e9e !important; +} +.bg-grey { + color: #FFFFFF !important; +} + +.bg-grey-lighten-5 { + background-color: #fafafa !important; +} +.bg-grey-lighten-5 { + color: #000000 !important; +} + +.bg-grey-lighten-4 { + background-color: #f5f5f5 !important; +} +.bg-grey-lighten-4 { + color: #000000 !important; +} + +.bg-grey-lighten-3 { + background-color: #eeeeee !important; +} +.bg-grey-lighten-3 { + color: #000000 !important; +} + +.bg-grey-lighten-2 { + background-color: #e0e0e0 !important; +} +.bg-grey-lighten-2 { + color: #000000 !important; +} + +.bg-grey-lighten-1 { + background-color: #bdbdbd !important; +} +.bg-grey-lighten-1 { + color: #000000 !important; +} + +.bg-grey-darken-1 { + background-color: #757575 !important; +} +.bg-grey-darken-1 { + color: #FFFFFF !important; +} + +.bg-grey-darken-2 { + background-color: #616161 !important; +} +.bg-grey-darken-2 { + color: #FFFFFF !important; +} + +.bg-grey-darken-3 { + background-color: #424242 !important; +} +.bg-grey-darken-3 { + color: #FFFFFF !important; +} + +.bg-grey-darken-4 { + background-color: #212121 !important; +} +.bg-grey-darken-4 { + color: #FFFFFF !important; +} + +.bg-shades-black { + background-color: #000000 !important; +} +.bg-shades-black { + color: #FFFFFF !important; +} + +.bg-shades-white { + background-color: #FFFFFF !important; +} +.bg-shades-white { + color: #000000 !important; +} + +.bg-shades-transparent { + background-color: transparent !important; +} +.bg-shades-transparent { + color: currentColor !important; +} + +.text-black { + color: #000000 !important; +} + +.text-white { + color: #FFFFFF !important; +} + +.text-transparent { + color: transparent !important; +} + +.text-red { + color: #F44336 !important; +} + +.text-red-lighten-5 { + color: #FFEBEE !important; +} + +.text-red-lighten-4 { + color: #FFCDD2 !important; +} + +.text-red-lighten-3 { + color: #EF9A9A !important; +} + +.text-red-lighten-2 { + color: #E57373 !important; +} + +.text-red-lighten-1 { + color: #EF5350 !important; +} + +.text-red-darken-1 { + color: #E53935 !important; +} + +.text-red-darken-2 { + color: #D32F2F !important; +} + +.text-red-darken-3 { + color: #C62828 !important; +} + +.text-red-darken-4 { + color: #B71C1C !important; +} + +.text-red-accent-1 { + color: #FF8A80 !important; +} + +.text-red-accent-2 { + color: #FF5252 !important; +} + +.text-red-accent-3 { + color: #FF1744 !important; +} + +.text-red-accent-4 { + color: #D50000 !important; +} + +.text-pink { + color: #e91e63 !important; +} + +.text-pink-lighten-5 { + color: #fce4ec !important; +} + +.text-pink-lighten-4 { + color: #f8bbd0 !important; +} + +.text-pink-lighten-3 { + color: #f48fb1 !important; +} + +.text-pink-lighten-2 { + color: #f06292 !important; +} + +.text-pink-lighten-1 { + color: #ec407a !important; +} + +.text-pink-darken-1 { + color: #d81b60 !important; +} + +.text-pink-darken-2 { + color: #c2185b !important; +} + +.text-pink-darken-3 { + color: #ad1457 !important; +} + +.text-pink-darken-4 { + color: #880e4f !important; +} + +.text-pink-accent-1 { + color: #ff80ab !important; +} + +.text-pink-accent-2 { + color: #ff4081 !important; +} + +.text-pink-accent-3 { + color: #f50057 !important; +} + +.text-pink-accent-4 { + color: #c51162 !important; +} + +.text-purple { + color: #9c27b0 !important; +} + +.text-purple-lighten-5 { + color: #f3e5f5 !important; +} + +.text-purple-lighten-4 { + color: #e1bee7 !important; +} + +.text-purple-lighten-3 { + color: #ce93d8 !important; +} + +.text-purple-lighten-2 { + color: #ba68c8 !important; +} + +.text-purple-lighten-1 { + color: #ab47bc !important; +} + +.text-purple-darken-1 { + color: #8e24aa !important; +} + +.text-purple-darken-2 { + color: #7b1fa2 !important; +} + +.text-purple-darken-3 { + color: #6a1b9a !important; +} + +.text-purple-darken-4 { + color: #4a148c !important; +} + +.text-purple-accent-1 { + color: #ea80fc !important; +} + +.text-purple-accent-2 { + color: #e040fb !important; +} + +.text-purple-accent-3 { + color: #d500f9 !important; +} + +.text-purple-accent-4 { + color: #aa00ff !important; +} + +.text-deep-purple { + color: #673ab7 !important; +} + +.text-deep-purple-lighten-5 { + color: #ede7f6 !important; +} + +.text-deep-purple-lighten-4 { + color: #d1c4e9 !important; +} + +.text-deep-purple-lighten-3 { + color: #b39ddb !important; +} + +.text-deep-purple-lighten-2 { + color: #9575cd !important; +} + +.text-deep-purple-lighten-1 { + color: #7e57c2 !important; +} + +.text-deep-purple-darken-1 { + color: #5e35b1 !important; +} + +.text-deep-purple-darken-2 { + color: #512da8 !important; +} + +.text-deep-purple-darken-3 { + color: #4527a0 !important; +} + +.text-deep-purple-darken-4 { + color: #311b92 !important; +} + +.text-deep-purple-accent-1 { + color: #b388ff !important; +} + +.text-deep-purple-accent-2 { + color: #7c4dff !important; +} + +.text-deep-purple-accent-3 { + color: #651fff !important; +} + +.text-deep-purple-accent-4 { + color: #6200ea !important; +} + +.text-indigo { + color: #3f51b5 !important; +} + +.text-indigo-lighten-5 { + color: #e8eaf6 !important; +} + +.text-indigo-lighten-4 { + color: #c5cae9 !important; +} + +.text-indigo-lighten-3 { + color: #9fa8da !important; +} + +.text-indigo-lighten-2 { + color: #7986cb !important; +} + +.text-indigo-lighten-1 { + color: #5c6bc0 !important; +} + +.text-indigo-darken-1 { + color: #3949ab !important; +} + +.text-indigo-darken-2 { + color: #303f9f !important; +} + +.text-indigo-darken-3 { + color: #283593 !important; +} + +.text-indigo-darken-4 { + color: #1a237e !important; +} + +.text-indigo-accent-1 { + color: #8c9eff !important; +} + +.text-indigo-accent-2 { + color: #536dfe !important; +} + +.text-indigo-accent-3 { + color: #3d5afe !important; +} + +.text-indigo-accent-4 { + color: #304ffe !important; +} + +.text-blue { + color: #2196F3 !important; +} + +.text-blue-lighten-5 { + color: #E3F2FD !important; +} + +.text-blue-lighten-4 { + color: #BBDEFB !important; +} + +.text-blue-lighten-3 { + color: #90CAF9 !important; +} + +.text-blue-lighten-2 { + color: #64B5F6 !important; +} + +.text-blue-lighten-1 { + color: #42A5F5 !important; +} + +.text-blue-darken-1 { + color: #1E88E5 !important; +} + +.text-blue-darken-2 { + color: #1976D2 !important; +} + +.text-blue-darken-3 { + color: #1565C0 !important; +} + +.text-blue-darken-4 { + color: #0D47A1 !important; +} + +.text-blue-accent-1 { + color: #82B1FF !important; +} + +.text-blue-accent-2 { + color: #448AFF !important; +} + +.text-blue-accent-3 { + color: #2979FF !important; +} + +.text-blue-accent-4 { + color: #2962FF !important; +} + +.text-light-blue { + color: #03a9f4 !important; +} + +.text-light-blue-lighten-5 { + color: #e1f5fe !important; +} + +.text-light-blue-lighten-4 { + color: #b3e5fc !important; +} + +.text-light-blue-lighten-3 { + color: #81d4fa !important; +} + +.text-light-blue-lighten-2 { + color: #4fc3f7 !important; +} + +.text-light-blue-lighten-1 { + color: #29b6f6 !important; +} + +.text-light-blue-darken-1 { + color: #039be5 !important; +} + +.text-light-blue-darken-2 { + color: #0288d1 !important; +} + +.text-light-blue-darken-3 { + color: #0277bd !important; +} + +.text-light-blue-darken-4 { + color: #01579b !important; +} + +.text-light-blue-accent-1 { + color: #80d8ff !important; +} + +.text-light-blue-accent-2 { + color: #40c4ff !important; +} + +.text-light-blue-accent-3 { + color: #00b0ff !important; +} + +.text-light-blue-accent-4 { + color: #0091ea !important; +} + +.text-cyan { + color: #00bcd4 !important; +} + +.text-cyan-lighten-5 { + color: #e0f7fa !important; +} + +.text-cyan-lighten-4 { + color: #b2ebf2 !important; +} + +.text-cyan-lighten-3 { + color: #80deea !important; +} + +.text-cyan-lighten-2 { + color: #4dd0e1 !important; +} + +.text-cyan-lighten-1 { + color: #26c6da !important; +} + +.text-cyan-darken-1 { + color: #00acc1 !important; +} + +.text-cyan-darken-2 { + color: #0097a7 !important; +} + +.text-cyan-darken-3 { + color: #00838f !important; +} + +.text-cyan-darken-4 { + color: #006064 !important; +} + +.text-cyan-accent-1 { + color: #84ffff !important; +} + +.text-cyan-accent-2 { + color: #18ffff !important; +} + +.text-cyan-accent-3 { + color: #00e5ff !important; +} + +.text-cyan-accent-4 { + color: #00b8d4 !important; +} + +.text-teal { + color: #009688 !important; +} + +.text-teal-lighten-5 { + color: #e0f2f1 !important; +} + +.text-teal-lighten-4 { + color: #b2dfdb !important; +} + +.text-teal-lighten-3 { + color: #80cbc4 !important; +} + +.text-teal-lighten-2 { + color: #4db6ac !important; +} + +.text-teal-lighten-1 { + color: #26a69a !important; +} + +.text-teal-darken-1 { + color: #00897b !important; +} + +.text-teal-darken-2 { + color: #00796b !important; +} + +.text-teal-darken-3 { + color: #00695c !important; +} + +.text-teal-darken-4 { + color: #004d40 !important; +} + +.text-teal-accent-1 { + color: #a7ffeb !important; +} + +.text-teal-accent-2 { + color: #64ffda !important; +} + +.text-teal-accent-3 { + color: #1de9b6 !important; +} + +.text-teal-accent-4 { + color: #00bfa5 !important; +} + +.text-green { + color: #4CAF50 !important; +} + +.text-green-lighten-5 { + color: #E8F5E9 !important; +} + +.text-green-lighten-4 { + color: #C8E6C9 !important; +} + +.text-green-lighten-3 { + color: #A5D6A7 !important; +} + +.text-green-lighten-2 { + color: #81C784 !important; +} + +.text-green-lighten-1 { + color: #66BB6A !important; +} + +.text-green-darken-1 { + color: #43A047 !important; +} + +.text-green-darken-2 { + color: #388E3C !important; +} + +.text-green-darken-3 { + color: #2E7D32 !important; +} + +.text-green-darken-4 { + color: #1B5E20 !important; +} + +.text-green-accent-1 { + color: #B9F6CA !important; +} + +.text-green-accent-2 { + color: #69F0AE !important; +} + +.text-green-accent-3 { + color: #00E676 !important; +} + +.text-green-accent-4 { + color: #00C853 !important; +} + +.text-light-green { + color: #8bc34a !important; +} + +.text-light-green-lighten-5 { + color: #f1f8e9 !important; +} + +.text-light-green-lighten-4 { + color: #dcedc8 !important; +} + +.text-light-green-lighten-3 { + color: #c5e1a5 !important; +} + +.text-light-green-lighten-2 { + color: #aed581 !important; +} + +.text-light-green-lighten-1 { + color: #9ccc65 !important; +} + +.text-light-green-darken-1 { + color: #7cb342 !important; +} + +.text-light-green-darken-2 { + color: #689f38 !important; +} + +.text-light-green-darken-3 { + color: #558b2f !important; +} + +.text-light-green-darken-4 { + color: #33691e !important; +} + +.text-light-green-accent-1 { + color: #ccff90 !important; +} + +.text-light-green-accent-2 { + color: #b2ff59 !important; +} + +.text-light-green-accent-3 { + color: #76ff03 !important; +} + +.text-light-green-accent-4 { + color: #64dd17 !important; +} + +.text-lime { + color: #cddc39 !important; +} + +.text-lime-lighten-5 { + color: #f9fbe7 !important; +} + +.text-lime-lighten-4 { + color: #f0f4c3 !important; +} + +.text-lime-lighten-3 { + color: #e6ee9c !important; +} + +.text-lime-lighten-2 { + color: #dce775 !important; +} + +.text-lime-lighten-1 { + color: #d4e157 !important; +} + +.text-lime-darken-1 { + color: #c0ca33 !important; +} + +.text-lime-darken-2 { + color: #afb42b !important; +} + +.text-lime-darken-3 { + color: #9e9d24 !important; +} + +.text-lime-darken-4 { + color: #827717 !important; +} + +.text-lime-accent-1 { + color: #f4ff81 !important; +} + +.text-lime-accent-2 { + color: #eeff41 !important; +} + +.text-lime-accent-3 { + color: #c6ff00 !important; +} + +.text-lime-accent-4 { + color: #aeea00 !important; +} + +.text-yellow { + color: #ffeb3b !important; +} + +.text-yellow-lighten-5 { + color: #fffde7 !important; +} + +.text-yellow-lighten-4 { + color: #fff9c4 !important; +} + +.text-yellow-lighten-3 { + color: #fff59d !important; +} + +.text-yellow-lighten-2 { + color: #fff176 !important; +} + +.text-yellow-lighten-1 { + color: #ffee58 !important; +} + +.text-yellow-darken-1 { + color: #fdd835 !important; +} + +.text-yellow-darken-2 { + color: #fbc02d !important; +} + +.text-yellow-darken-3 { + color: #f9a825 !important; +} + +.text-yellow-darken-4 { + color: #f57f17 !important; +} + +.text-yellow-accent-1 { + color: #ffff8d !important; +} + +.text-yellow-accent-2 { + color: #ffff00 !important; +} + +.text-yellow-accent-3 { + color: #ffea00 !important; +} + +.text-yellow-accent-4 { + color: #ffd600 !important; +} + +.text-amber { + color: #ffc107 !important; +} + +.text-amber-lighten-5 { + color: #fff8e1 !important; +} + +.text-amber-lighten-4 { + color: #ffecb3 !important; +} + +.text-amber-lighten-3 { + color: #ffe082 !important; +} + +.text-amber-lighten-2 { + color: #ffd54f !important; +} + +.text-amber-lighten-1 { + color: #ffca28 !important; +} + +.text-amber-darken-1 { + color: #ffb300 !important; +} + +.text-amber-darken-2 { + color: #ffa000 !important; +} + +.text-amber-darken-3 { + color: #ff8f00 !important; +} + +.text-amber-darken-4 { + color: #ff6f00 !important; +} + +.text-amber-accent-1 { + color: #ffe57f !important; +} + +.text-amber-accent-2 { + color: #ffd740 !important; +} + +.text-amber-accent-3 { + color: #ffc400 !important; +} + +.text-amber-accent-4 { + color: #ffab00 !important; +} + +.text-orange { + color: #ff9800 !important; +} + +.text-orange-lighten-5 { + color: #fff3e0 !important; +} + +.text-orange-lighten-4 { + color: #ffe0b2 !important; +} + +.text-orange-lighten-3 { + color: #ffcc80 !important; +} + +.text-orange-lighten-2 { + color: #ffb74d !important; +} + +.text-orange-lighten-1 { + color: #ffa726 !important; +} + +.text-orange-darken-1 { + color: #fb8c00 !important; +} + +.text-orange-darken-2 { + color: #f57c00 !important; +} + +.text-orange-darken-3 { + color: #ef6c00 !important; +} + +.text-orange-darken-4 { + color: #e65100 !important; +} + +.text-orange-accent-1 { + color: #ffd180 !important; +} + +.text-orange-accent-2 { + color: #ffab40 !important; +} + +.text-orange-accent-3 { + color: #ff9100 !important; +} + +.text-orange-accent-4 { + color: #ff6d00 !important; +} + +.text-deep-orange { + color: #ff5722 !important; +} + +.text-deep-orange-lighten-5 { + color: #fbe9e7 !important; +} + +.text-deep-orange-lighten-4 { + color: #ffccbc !important; +} + +.text-deep-orange-lighten-3 { + color: #ffab91 !important; +} + +.text-deep-orange-lighten-2 { + color: #ff8a65 !important; +} + +.text-deep-orange-lighten-1 { + color: #ff7043 !important; +} + +.text-deep-orange-darken-1 { + color: #f4511e !important; +} + +.text-deep-orange-darken-2 { + color: #e64a19 !important; +} + +.text-deep-orange-darken-3 { + color: #d84315 !important; +} + +.text-deep-orange-darken-4 { + color: #bf360c !important; +} + +.text-deep-orange-accent-1 { + color: #ff9e80 !important; +} + +.text-deep-orange-accent-2 { + color: #ff6e40 !important; +} + +.text-deep-orange-accent-3 { + color: #ff3d00 !important; +} + +.text-deep-orange-accent-4 { + color: #dd2c00 !important; +} + +.text-brown { + color: #795548 !important; +} + +.text-brown-lighten-5 { + color: #efebe9 !important; +} + +.text-brown-lighten-4 { + color: #d7ccc8 !important; +} + +.text-brown-lighten-3 { + color: #bcaaa4 !important; +} + +.text-brown-lighten-2 { + color: #a1887f !important; +} + +.text-brown-lighten-1 { + color: #8d6e63 !important; +} + +.text-brown-darken-1 { + color: #6d4c41 !important; +} + +.text-brown-darken-2 { + color: #5d4037 !important; +} + +.text-brown-darken-3 { + color: #4e342e !important; +} + +.text-brown-darken-4 { + color: #3e2723 !important; +} + +.text-blue-grey { + color: #607d8b !important; +} + +.text-blue-grey-lighten-5 { + color: #eceff1 !important; +} + +.text-blue-grey-lighten-4 { + color: #cfd8dc !important; +} + +.text-blue-grey-lighten-3 { + color: #b0bec5 !important; +} + +.text-blue-grey-lighten-2 { + color: #90a4ae !important; +} + +.text-blue-grey-lighten-1 { + color: #78909c !important; +} + +.text-blue-grey-darken-1 { + color: #546e7a !important; +} + +.text-blue-grey-darken-2 { + color: #455a64 !important; +} + +.text-blue-grey-darken-3 { + color: #37474f !important; +} + +.text-blue-grey-darken-4 { + color: #263238 !important; +} + +.text-grey { + color: #9e9e9e !important; +} + +.text-grey-lighten-5 { + color: #fafafa !important; +} + +.text-grey-lighten-4 { + color: #f5f5f5 !important; +} + +.text-grey-lighten-3 { + color: #eeeeee !important; +} + +.text-grey-lighten-2 { + color: #e0e0e0 !important; +} + +.text-grey-lighten-1 { + color: #bdbdbd !important; +} + +.text-grey-darken-1 { + color: #757575 !important; +} + +.text-grey-darken-2 { + color: #616161 !important; +} + +.text-grey-darken-3 { + color: #424242 !important; +} + +.text-grey-darken-4 { + color: #212121 !important; +} + +.text-shades-black { + color: #000000 !important; +} + +.text-shades-white { + color: #FFFFFF !important; +} + +.text-shades-transparent { + color: transparent !important; +} + +/*! + * ress.css • v2.0.4 + * MIT License + * github.com/filipelinhares/ress + */ +/* # ================================================================= + # Global selectors + # ================================================================= */ +html { + box-sizing: border-box; + overflow-y: scroll; /* All browsers without overlaying scrollbars */ + -webkit-text-size-adjust: 100%; /* Prevent adjustments of font size after orientation changes in iOS */ + word-break: normal; + -moz-tab-size: 4; + tab-size: 4; +} + +*, +::before, +::after { + background-repeat: no-repeat; /* Set `background-repeat: no-repeat` to all elements and pseudo elements */ + box-sizing: inherit; +} + +::before, +::after { + text-decoration: inherit; /* Inherit text-decoration and vertical align to ::before and ::after pseudo elements */ + vertical-align: inherit; +} + +* { + padding: 0; /* Reset `padding` and `margin` of all elements */ + margin: 0; +} + +/* # ================================================================= + # General elements + # ================================================================= */ +hr { + overflow: visible; /* Show the overflow in Edge and IE */ + height: 0; /* Add the correct box sizing in Firefox */ +} + +details, +main { + display: block; /* Render the `main` element consistently in IE. */ +} + +summary { + display: list-item; /* Add the correct display in all browsers */ +} + +small { + font-size: 80%; /* Set font-size to 80% in `small` elements */ +} + +[hidden] { + display: none; /* Add the correct display in IE */ +} + +abbr[title] { + border-bottom: none; /* Remove the bottom border in Chrome 57 */ + /* Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari */ + text-decoration: underline; + text-decoration: underline dotted; +} + +a { + background-color: transparent; /* Remove the gray background on active links in IE 10 */ +} + +a:active, +a:hover { + outline-width: 0; /* Remove the outline when hovering in all browsers */ +} + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; /* Specify the font family of code elements */ +} + +pre { + font-size: 1em; /* Correct the odd `em` font sizing in all browsers */ +} + +b, +strong { + font-weight: bolder; /* Add the correct font weight in Chrome, Edge, and Safari */ +} + +/* https://gist.github.com/unruthless/413930 */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* # ================================================================= + # Forms + # ================================================================= */ +input { + border-radius: 0; +} + +/* Replace pointer cursor in disabled elements */ +[disabled] { + cursor: default; +} + +[type=number]::-webkit-inner-spin-button, +[type=number]::-webkit-outer-spin-button { + height: auto; /* Correct the cursor style of increment and decrement buttons in Chrome */ +} + +[type=search] { + -webkit-appearance: textfield; /* Correct the odd appearance in Chrome and Safari */ + outline-offset: -2px; /* Correct the outline style in Safari */ +} + +[type=search]::-webkit-search-cancel-button, +[type=search]::-webkit-search-decoration { + -webkit-appearance: none; /* Remove the inner padding in Chrome and Safari on macOS */ +} + +textarea { + overflow: auto; /* Internet Explorer 11+ */ + resize: vertical; /* Specify textarea resizability */ +} + +button, +input, +optgroup, +select, +textarea { + font: inherit; /* Specify font inheritance of form elements */ +} + +optgroup { + font-weight: bold; /* Restore the font weight unset by the previous rule */ +} + +button { + overflow: visible; /* Address `overflow` set to `hidden` in IE 8/9/10/11 */ +} + +button, +select { + text-transform: none; /* Firefox 40+, Internet Explorer 11- */ +} + +/* Apply cursor pointer to button elements */ +button, +[type=button], +[type=reset], +[type=submit], +[role=button] { + cursor: pointer; + color: inherit; +} + +/* Remove inner padding and border in Firefox 4+ */ +button::-moz-focus-inner, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/* Replace focus style removed in the border reset above */ +button:-moz-focusring, +[type=button]::-moz-focus-inner, +[type=reset]::-moz-focus-inner, +[type=submit]::-moz-focus-inner { + outline: 1px dotted ButtonText; +} + +button, +html [type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; /* Correct the inability to style clickable types in iOS */ +} + +/* Remove the default button styling in all browsers */ +button, +input, +select, +textarea { + background-color: transparent; + border-style: none; +} + +/* Style select like a standard input */ +select { + -moz-appearance: none; /* Firefox 36+ */ + -webkit-appearance: none; /* Chrome 41+ */ +} + +select::-ms-expand { + display: none; /* Internet Explorer 11+ */ +} + +select::-ms-value { + color: currentColor; /* Internet Explorer 11+ */ +} + +legend { + border: 0; /* Correct `color` not being inherited in IE 8/9/10/11 */ + color: inherit; /* Correct the color inheritance from `fieldset` elements in IE */ + display: table; /* Correct the text wrapping in Edge and IE */ + max-width: 100%; /* Correct the text wrapping in Edge and IE */ + white-space: normal; /* Correct the text wrapping in Edge and IE */ + max-width: 100%; /* Correct the text wrapping in Edge 18- and IE */ +} + +::-webkit-file-upload-button { + /* Correct the inability to style clickable types in iOS and Safari */ + -webkit-appearance: button; + color: inherit; + font: inherit; /* Change font properties to `inherit` in Chrome and Safari */ +} + +::-ms-clear, +::-ms-reveal { + display: none; +} + +/* # ================================================================= + # Specify media element style + # ================================================================= */ +img { + border-style: none; /* Remove border when inside `a` element in IE 8/9/10 */ +} + +/* Add the correct vertical alignment in Chrome, Firefox, and Opera */ +progress { + vertical-align: baseline; +} + +/* # ================================================================= + # Accessibility + # ================================================================= */ +/* Hide content from screens but not screenreaders */ +@media screen { + [hidden~=screen] { + display: inherit; + } + [hidden~=screen]:not(:active):not(:focus):not(:target) { + position: absolute !important; + clip: rect(0 0 0 0) !important; + } +} +/* Specify the progress cursor of updating elements */ +[aria-busy=true] { + cursor: progress; +} + +/* Specify the pointer cursor of trigger elements */ +[aria-controls] { + cursor: pointer; +} + +/* Specify the unstyled cursor of disabled, not-editable, or otherwise inoperable elements */ +[aria-disabled=true] { + cursor: default; +} + +.dialog-transition-enter-active, +.dialog-bottom-transition-enter-active, +.dialog-top-transition-enter-active { + transition-duration: 225ms !important; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1) !important; +} +.dialog-transition-leave-active, +.dialog-bottom-transition-leave-active, +.dialog-top-transition-leave-active { + transition-duration: 125ms !important; + transition-timing-function: cubic-bezier(0.4, 0, 1, 1) !important; +} +.dialog-transition-enter-active, .dialog-transition-leave-active, +.dialog-bottom-transition-enter-active, +.dialog-bottom-transition-leave-active, +.dialog-top-transition-enter-active, +.dialog-top-transition-leave-active { + transition-property: transform, opacity !important; + pointer-events: none; +} + +.dialog-transition-enter-from, .dialog-transition-leave-to { + transform: scale(0.9); + opacity: 0; +} +.dialog-transition-enter-to, .dialog-transition-leave-from { + opacity: 1; +} + +.dialog-bottom-transition-enter-from, .dialog-bottom-transition-leave-to { + transform: translateY(calc(50vh + 50%)); +} + +.dialog-top-transition-enter-from, .dialog-top-transition-leave-to { + transform: translateY(calc(-50vh - 50%)); +} + +.picker-transition-enter-active, +.picker-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-leave-active, +.picker-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-move, +.picker-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-enter-from, .picker-transition-leave-to, +.picker-reverse-transition-enter-from, +.picker-reverse-transition-leave-to { + opacity: 0; +} +.picker-transition-leave-from, .picker-transition-leave-active, .picker-transition-leave-to, +.picker-reverse-transition-leave-from, +.picker-reverse-transition-leave-active, +.picker-reverse-transition-leave-to { + position: absolute !important; +} +.picker-transition-enter-active, .picker-transition-leave-active, +.picker-reverse-transition-enter-active, +.picker-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.picker-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-transition-enter-from { + transform: translate(100%, 0); +} +.picker-transition-leave-to { + transform: translate(-100%, 0); +} + +.picker-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.picker-reverse-transition-enter-from { + transform: translate(-100%, 0); +} +.picker-reverse-transition-leave-to { + transform: translate(100%, 0); +} + +.expand-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-transition-enter-active, .expand-transition-leave-active { + transition-property: height !important; +} + +.expand-x-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-x-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-x-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.expand-x-transition-enter-active, .expand-x-transition-leave-active { + transition-property: width !important; +} + +.scale-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-transition-leave-to { + opacity: 0; +} +.scale-transition-leave-active { + transition-duration: 100ms !important; +} +.scale-transition-enter-from { + opacity: 0; + transform: scale(0); +} +.scale-transition-enter-active, .scale-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scale-rotate-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-transition-leave-to { + opacity: 0; +} +.scale-rotate-transition-leave-active { + transition-duration: 100ms !important; +} +.scale-rotate-transition-enter-from { + opacity: 0; + transform: scale(0) rotate(-45deg); +} +.scale-rotate-transition-enter-active, .scale-rotate-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scale-rotate-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scale-rotate-reverse-transition-leave-to { + opacity: 0; +} +.scale-rotate-reverse-transition-leave-active { + transition-duration: 100ms !important; +} +.scale-rotate-reverse-transition-enter-from { + opacity: 0; + transform: scale(0) rotate(45deg); +} +.scale-rotate-reverse-transition-enter-active, .scale-rotate-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.message-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.message-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.message-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.message-transition-enter-from, .message-transition-leave-to { + opacity: 0; + transform: translateY(-15px); +} +.message-transition-leave-from, .message-transition-leave-active { + position: absolute; +} +.message-transition-enter-active, .message-transition-leave-active { + transition-property: transform, opacity !important; +} + +.slide-y-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-transition-enter-from, .slide-y-transition-leave-to { + opacity: 0; + transform: translateY(-15px); +} +.slide-y-transition-enter-active, .slide-y-transition-leave-active { + transition-property: transform, opacity !important; +} + +.slide-y-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-y-reverse-transition-enter-from, .slide-y-reverse-transition-leave-to { + opacity: 0; + transform: translateY(15px); +} +.slide-y-reverse-transition-enter-active, .slide-y-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scroll-y-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-transition-enter-from, .scroll-y-transition-leave-to { + opacity: 0; +} +.scroll-y-transition-enter-from { + transform: translateY(-15px); +} +.scroll-y-transition-leave-to { + transform: translateY(15px); +} +.scroll-y-transition-enter-active, .scroll-y-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scroll-y-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-y-reverse-transition-enter-from, .scroll-y-reverse-transition-leave-to { + opacity: 0; +} +.scroll-y-reverse-transition-enter-from { + transform: translateY(15px); +} +.scroll-y-reverse-transition-leave-to { + transform: translateY(-15px); +} +.scroll-y-reverse-transition-enter-active, .scroll-y-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scroll-x-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-transition-enter-from, .scroll-x-transition-leave-to { + opacity: 0; +} +.scroll-x-transition-enter-from { + transform: translateX(-15px); +} +.scroll-x-transition-leave-to { + transform: translateX(15px); +} +.scroll-x-transition-enter-active, .scroll-x-transition-leave-active { + transition-property: transform, opacity !important; +} + +.scroll-x-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.scroll-x-reverse-transition-enter-from, .scroll-x-reverse-transition-leave-to { + opacity: 0; +} +.scroll-x-reverse-transition-enter-from { + transform: translateX(15px); +} +.scroll-x-reverse-transition-leave-to { + transform: translateX(-15px); +} +.scroll-x-reverse-transition-enter-active, .scroll-x-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.slide-x-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-transition-enter-from, .slide-x-transition-leave-to { + opacity: 0; + transform: translateX(-15px); +} +.slide-x-transition-enter-active, .slide-x-transition-leave-active { + transition-property: transform, opacity !important; +} + +.slide-x-reverse-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-reverse-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-reverse-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.slide-x-reverse-transition-enter-from, .slide-x-reverse-transition-leave-to { + opacity: 0; + transform: translateX(15px); +} +.slide-x-reverse-transition-enter-active, .slide-x-reverse-transition-leave-active { + transition-property: transform, opacity !important; +} + +.fade-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fade-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fade-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fade-transition-enter-from, .fade-transition-leave-to { + opacity: 0 !important; +} +.fade-transition-enter-active, .fade-transition-leave-active { + transition-property: opacity !important; +} + +.fab-transition-enter-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fab-transition-leave-active { + transition-duration: 0.3s !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fab-transition-move { + transition-duration: 0.5s !important; + transition-property: transform !important; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1) !important; +} +.fab-transition-enter-from, .fab-transition-leave-to { + transform: scale(0) rotate(-45deg); +} +.fab-transition-enter-active, .fab-transition-leave-active { + transition-property: transform !important; +} + +.v-locale--is-rtl { + direction: rtl; +} +.v-locale--is-ltr { + direction: ltr; +} + +.blockquote { + padding: 16px 0 16px 24px; + font-size: 18px; + font-weight: 300; +} + +html { + font-family: "Roboto", sans-serif; + line-height: 1.5; + font-size: 1rem; + overflow-x: hidden; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +html.overflow-y-hidden { + overflow-y: hidden !important; +} + +:root { + --v-theme-overlay-multiplier: 1; + --v-scrollbar-offset: 0px; +} + +@supports (-webkit-touch-callout: none) { + body { + cursor: pointer; + } +} +@media only print { + .hidden-print-only { + display: none !important; + } +} + +@media only screen { + .hidden-screen-only { + display: none !important; + } +} + +@media (max-width: 599.98px) { + .hidden-xs { + display: none !important; + } +} + +@media (min-width: 600px) and (max-width: 959.98px) { + .hidden-sm { + display: none !important; + } +} + +@media (min-width: 960px) and (max-width: 1279.98px) { + .hidden-md { + display: none !important; + } +} + +@media (min-width: 1280px) and (max-width: 1919.98px) { + .hidden-lg { + display: none !important; + } +} + +@media (min-width: 1920px) and (max-width: 2559.98px) { + .hidden-xl { + display: none !important; + } +} + +@media (min-width: 2560px) { + .hidden-xxl { + display: none !important; + } +} + +@media (min-width: 600px) { + .hidden-sm-and-up { + display: none !important; + } +} + +@media (min-width: 960px) { + .hidden-md-and-up { + display: none !important; + } +} + +@media (min-width: 1280px) { + .hidden-lg-and-up { + display: none !important; + } +} + +@media (min-width: 1920px) { + .hidden-xl-and-up { + display: none !important; + } +} + +@media (max-width: 959.98px) { + .hidden-sm-and-down { + display: none !important; + } +} + +@media (max-width: 1279.98px) { + .hidden-md-and-down { + display: none !important; + } +} + +@media (max-width: 1919.98px) { + .hidden-lg-and-down { + display: none !important; + } +} + +@media (max-width: 2559.98px) { + .hidden-xl-and-down { + display: none !important; + } +} + +.elevation-24 { + box-shadow: 0px 11px 15px -7px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 24px 38px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 9px 46px 8px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-23 { + box-shadow: 0px 11px 14px -7px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 23px 36px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 9px 44px 8px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-22 { + box-shadow: 0px 10px 14px -6px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 22px 35px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 8px 42px 7px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-21 { + box-shadow: 0px 10px 13px -6px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 21px 33px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 8px 40px 7px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-20 { + box-shadow: 0px 10px 13px -6px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 20px 31px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 8px 38px 7px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-19 { + box-shadow: 0px 9px 12px -6px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 19px 29px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 7px 36px 6px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-18 { + box-shadow: 0px 9px 11px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 18px 28px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 7px 34px 6px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-17 { + box-shadow: 0px 8px 11px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 17px 26px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 6px 32px 5px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-16 { + box-shadow: 0px 8px 10px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 16px 24px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 6px 30px 5px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-15 { + box-shadow: 0px 8px 9px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 15px 22px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 6px 28px 5px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-14 { + box-shadow: 0px 7px 9px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 14px 21px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 5px 26px 4px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-13 { + box-shadow: 0px 7px 8px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 13px 19px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 5px 24px 4px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-12 { + box-shadow: 0px 7px 8px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 12px 17px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 5px 22px 4px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-11 { + box-shadow: 0px 6px 7px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 11px 15px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 4px 20px 3px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-10 { + box-shadow: 0px 6px 6px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 10px 14px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 4px 18px 3px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-9 { + box-shadow: 0px 5px 6px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 9px 12px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 3px 16px 2px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-8 { + box-shadow: 0px 5px 5px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 8px 10px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 3px 14px 2px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-7 { + box-shadow: 0px 4px 5px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 7px 10px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 2px 16px 1px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-6 { + box-shadow: 0px 3px 5px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 6px 10px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 18px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-5 { + box-shadow: 0px 3px 5px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 5px 8px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 14px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-4 { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-3 { + box-shadow: 0px 3px 3px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 3px 4px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 8px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-2 { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-1 { + box-shadow: 0px 2px 1px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 1px 1px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 3px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.elevation-0 { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)) !important; +} + +.d-sr-only, +.d-sr-only-focusable:not(:focus) { + border: 0 !important; + clip: rect(0, 0, 0, 0) !important; + height: 1px !important; + margin: -1px !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 1px !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.overflow-x-auto { + overflow-x: auto !important; +} + +.overflow-x-hidden { + overflow-x: hidden !important; +} + +.overflow-x-scroll { + overflow-x: scroll !important; +} + +.overflow-y-auto { + overflow-y: auto !important; +} + +.overflow-y-hidden { + overflow-y: hidden !important; +} + +.overflow-y-scroll { + overflow-y: scroll !important; +} + +.d-none { + display: none !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.float-none { + float: none !important; +} + +.float-left { + float: left !important; +} + +.float-right { + float: right !important; +} + +.v-locale--is-rtl .float-end { + float: left !important; +} + +.v-locale--is-rtl .float-start { + float: right !important; +} + +.v-locale--is-ltr .float-end { + float: right !important; +} + +.v-locale--is-ltr .float-start { + float: left !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-1-1 { + flex: 1 1 auto !important; +} + +.flex-1-0 { + flex: 1 0 auto !important; +} + +.flex-0-1 { + flex: 0 1 auto !important; +} + +.flex-0-0 { + flex: 0 0 auto !important; +} + +.flex-1-1-100 { + flex: 1 1 100% !important; +} + +.flex-1-0-100 { + flex: 1 0 100% !important; +} + +.flex-0-1-100 { + flex: 0 1 100% !important; +} + +.flex-0-0-100 { + flex: 0 0 100% !important; +} + +.flex-1-1-0 { + flex: 1 1 0 !important; +} + +.flex-1-0-0 { + flex: 1 0 0 !important; +} + +.flex-0-1-0 { + flex: 0 1 0 !important; +} + +.flex-0-0-0 { + flex: 0 0 0 !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-start { + justify-content: flex-start !important; +} + +.justify-end { + justify-content: flex-end !important; +} + +.justify-center { + justify-content: center !important; +} + +.justify-space-between { + justify-content: space-between !important; +} + +.justify-space-around { + justify-content: space-around !important; +} + +.justify-space-evenly { + justify-content: space-evenly !important; +} + +.align-start { + align-items: flex-start !important; +} + +.align-end { + align-items: flex-end !important; +} + +.align-center { + align-items: center !important; +} + +.align-baseline { + align-items: baseline !important; +} + +.align-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-space-between { + align-content: space-between !important; +} + +.align-content-space-around { + align-content: space-around !important; +} + +.align-content-space-evenly { + align-content: space-evenly !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-6 { + order: 6 !important; +} + +.order-7 { + order: 7 !important; +} + +.order-8 { + order: 8 !important; +} + +.order-9 { + order: 9 !important; +} + +.order-10 { + order: 10 !important; +} + +.order-11 { + order: 11 !important; +} + +.order-12 { + order: 12 !important; +} + +.order-last { + order: 13 !important; +} + +.ga-0 { + gap: 0px !important; +} + +.ga-1 { + gap: 4px !important; +} + +.ga-2 { + gap: 8px !important; +} + +.ga-3 { + gap: 12px !important; +} + +.ga-4 { + gap: 16px !important; +} + +.ga-5 { + gap: 20px !important; +} + +.ga-6 { + gap: 24px !important; +} + +.ga-7 { + gap: 28px !important; +} + +.ga-8 { + gap: 32px !important; +} + +.ga-9 { + gap: 36px !important; +} + +.ga-10 { + gap: 40px !important; +} + +.ga-11 { + gap: 44px !important; +} + +.ga-12 { + gap: 48px !important; +} + +.ga-13 { + gap: 52px !important; +} + +.ga-14 { + gap: 56px !important; +} + +.ga-15 { + gap: 60px !important; +} + +.ga-16 { + gap: 64px !important; +} + +.ga-auto { + gap: auto !important; +} + +.gr-0 { + row-gap: 0px !important; +} + +.gr-1 { + row-gap: 4px !important; +} + +.gr-2 { + row-gap: 8px !important; +} + +.gr-3 { + row-gap: 12px !important; +} + +.gr-4 { + row-gap: 16px !important; +} + +.gr-5 { + row-gap: 20px !important; +} + +.gr-6 { + row-gap: 24px !important; +} + +.gr-7 { + row-gap: 28px !important; +} + +.gr-8 { + row-gap: 32px !important; +} + +.gr-9 { + row-gap: 36px !important; +} + +.gr-10 { + row-gap: 40px !important; +} + +.gr-11 { + row-gap: 44px !important; +} + +.gr-12 { + row-gap: 48px !important; +} + +.gr-13 { + row-gap: 52px !important; +} + +.gr-14 { + row-gap: 56px !important; +} + +.gr-15 { + row-gap: 60px !important; +} + +.gr-16 { + row-gap: 64px !important; +} + +.gr-auto { + row-gap: auto !important; +} + +.gc-0 { + column-gap: 0px !important; +} + +.gc-1 { + column-gap: 4px !important; +} + +.gc-2 { + column-gap: 8px !important; +} + +.gc-3 { + column-gap: 12px !important; +} + +.gc-4 { + column-gap: 16px !important; +} + +.gc-5 { + column-gap: 20px !important; +} + +.gc-6 { + column-gap: 24px !important; +} + +.gc-7 { + column-gap: 28px !important; +} + +.gc-8 { + column-gap: 32px !important; +} + +.gc-9 { + column-gap: 36px !important; +} + +.gc-10 { + column-gap: 40px !important; +} + +.gc-11 { + column-gap: 44px !important; +} + +.gc-12 { + column-gap: 48px !important; +} + +.gc-13 { + column-gap: 52px !important; +} + +.gc-14 { + column-gap: 56px !important; +} + +.gc-15 { + column-gap: 60px !important; +} + +.gc-16 { + column-gap: 64px !important; +} + +.gc-auto { + column-gap: auto !important; +} + +.ma-0 { + margin: 0px !important; +} + +.ma-1 { + margin: 4px !important; +} + +.ma-2 { + margin: 8px !important; +} + +.ma-3 { + margin: 12px !important; +} + +.ma-4 { + margin: 16px !important; +} + +.ma-5 { + margin: 20px !important; +} + +.ma-6 { + margin: 24px !important; +} + +.ma-7 { + margin: 28px !important; +} + +.ma-8 { + margin: 32px !important; +} + +.ma-9 { + margin: 36px !important; +} + +.ma-10 { + margin: 40px !important; +} + +.ma-11 { + margin: 44px !important; +} + +.ma-12 { + margin: 48px !important; +} + +.ma-13 { + margin: 52px !important; +} + +.ma-14 { + margin: 56px !important; +} + +.ma-15 { + margin: 60px !important; +} + +.ma-16 { + margin: 64px !important; +} + +.ma-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0px !important; + margin-left: 0px !important; +} + +.mx-1 { + margin-right: 4px !important; + margin-left: 4px !important; +} + +.mx-2 { + margin-right: 8px !important; + margin-left: 8px !important; +} + +.mx-3 { + margin-right: 12px !important; + margin-left: 12px !important; +} + +.mx-4 { + margin-right: 16px !important; + margin-left: 16px !important; +} + +.mx-5 { + margin-right: 20px !important; + margin-left: 20px !important; +} + +.mx-6 { + margin-right: 24px !important; + margin-left: 24px !important; +} + +.mx-7 { + margin-right: 28px !important; + margin-left: 28px !important; +} + +.mx-8 { + margin-right: 32px !important; + margin-left: 32px !important; +} + +.mx-9 { + margin-right: 36px !important; + margin-left: 36px !important; +} + +.mx-10 { + margin-right: 40px !important; + margin-left: 40px !important; +} + +.mx-11 { + margin-right: 44px !important; + margin-left: 44px !important; +} + +.mx-12 { + margin-right: 48px !important; + margin-left: 48px !important; +} + +.mx-13 { + margin-right: 52px !important; + margin-left: 52px !important; +} + +.mx-14 { + margin-right: 56px !important; + margin-left: 56px !important; +} + +.mx-15 { + margin-right: 60px !important; + margin-left: 60px !important; +} + +.mx-16 { + margin-right: 64px !important; + margin-left: 64px !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; +} + +.my-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; +} + +.my-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; +} + +.my-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; +} + +.my-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; +} + +.my-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; +} + +.my-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; +} + +.my-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; +} + +.my-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; +} + +.my-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; +} + +.my-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; +} + +.my-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; +} + +.my-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; +} + +.my-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; +} + +.my-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; +} + +.my-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; +} + +.my-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0px !important; +} + +.mt-1 { + margin-top: 4px !important; +} + +.mt-2 { + margin-top: 8px !important; +} + +.mt-3 { + margin-top: 12px !important; +} + +.mt-4 { + margin-top: 16px !important; +} + +.mt-5 { + margin-top: 20px !important; +} + +.mt-6 { + margin-top: 24px !important; +} + +.mt-7 { + margin-top: 28px !important; +} + +.mt-8 { + margin-top: 32px !important; +} + +.mt-9 { + margin-top: 36px !important; +} + +.mt-10 { + margin-top: 40px !important; +} + +.mt-11 { + margin-top: 44px !important; +} + +.mt-12 { + margin-top: 48px !important; +} + +.mt-13 { + margin-top: 52px !important; +} + +.mt-14 { + margin-top: 56px !important; +} + +.mt-15 { + margin-top: 60px !important; +} + +.mt-16 { + margin-top: 64px !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.mr-0 { + margin-right: 0px !important; +} + +.mr-1 { + margin-right: 4px !important; +} + +.mr-2 { + margin-right: 8px !important; +} + +.mr-3 { + margin-right: 12px !important; +} + +.mr-4 { + margin-right: 16px !important; +} + +.mr-5 { + margin-right: 20px !important; +} + +.mr-6 { + margin-right: 24px !important; +} + +.mr-7 { + margin-right: 28px !important; +} + +.mr-8 { + margin-right: 32px !important; +} + +.mr-9 { + margin-right: 36px !important; +} + +.mr-10 { + margin-right: 40px !important; +} + +.mr-11 { + margin-right: 44px !important; +} + +.mr-12 { + margin-right: 48px !important; +} + +.mr-13 { + margin-right: 52px !important; +} + +.mr-14 { + margin-right: 56px !important; +} + +.mr-15 { + margin-right: 60px !important; +} + +.mr-16 { + margin-right: 64px !important; +} + +.mr-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0px !important; +} + +.mb-1 { + margin-bottom: 4px !important; +} + +.mb-2 { + margin-bottom: 8px !important; +} + +.mb-3 { + margin-bottom: 12px !important; +} + +.mb-4 { + margin-bottom: 16px !important; +} + +.mb-5 { + margin-bottom: 20px !important; +} + +.mb-6 { + margin-bottom: 24px !important; +} + +.mb-7 { + margin-bottom: 28px !important; +} + +.mb-8 { + margin-bottom: 32px !important; +} + +.mb-9 { + margin-bottom: 36px !important; +} + +.mb-10 { + margin-bottom: 40px !important; +} + +.mb-11 { + margin-bottom: 44px !important; +} + +.mb-12 { + margin-bottom: 48px !important; +} + +.mb-13 { + margin-bottom: 52px !important; +} + +.mb-14 { + margin-bottom: 56px !important; +} + +.mb-15 { + margin-bottom: 60px !important; +} + +.mb-16 { + margin-bottom: 64px !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ml-0 { + margin-left: 0px !important; +} + +.ml-1 { + margin-left: 4px !important; +} + +.ml-2 { + margin-left: 8px !important; +} + +.ml-3 { + margin-left: 12px !important; +} + +.ml-4 { + margin-left: 16px !important; +} + +.ml-5 { + margin-left: 20px !important; +} + +.ml-6 { + margin-left: 24px !important; +} + +.ml-7 { + margin-left: 28px !important; +} + +.ml-8 { + margin-left: 32px !important; +} + +.ml-9 { + margin-left: 36px !important; +} + +.ml-10 { + margin-left: 40px !important; +} + +.ml-11 { + margin-left: 44px !important; +} + +.ml-12 { + margin-left: 48px !important; +} + +.ml-13 { + margin-left: 52px !important; +} + +.ml-14 { + margin-left: 56px !important; +} + +.ml-15 { + margin-left: 60px !important; +} + +.ml-16 { + margin-left: 64px !important; +} + +.ml-auto { + margin-left: auto !important; +} + +.ms-0 { + margin-inline-start: 0px !important; +} + +.ms-1 { + margin-inline-start: 4px !important; +} + +.ms-2 { + margin-inline-start: 8px !important; +} + +.ms-3 { + margin-inline-start: 12px !important; +} + +.ms-4 { + margin-inline-start: 16px !important; +} + +.ms-5 { + margin-inline-start: 20px !important; +} + +.ms-6 { + margin-inline-start: 24px !important; +} + +.ms-7 { + margin-inline-start: 28px !important; +} + +.ms-8 { + margin-inline-start: 32px !important; +} + +.ms-9 { + margin-inline-start: 36px !important; +} + +.ms-10 { + margin-inline-start: 40px !important; +} + +.ms-11 { + margin-inline-start: 44px !important; +} + +.ms-12 { + margin-inline-start: 48px !important; +} + +.ms-13 { + margin-inline-start: 52px !important; +} + +.ms-14 { + margin-inline-start: 56px !important; +} + +.ms-15 { + margin-inline-start: 60px !important; +} + +.ms-16 { + margin-inline-start: 64px !important; +} + +.ms-auto { + margin-inline-start: auto !important; +} + +.me-0 { + margin-inline-end: 0px !important; +} + +.me-1 { + margin-inline-end: 4px !important; +} + +.me-2 { + margin-inline-end: 8px !important; +} + +.me-3 { + margin-inline-end: 12px !important; +} + +.me-4 { + margin-inline-end: 16px !important; +} + +.me-5 { + margin-inline-end: 20px !important; +} + +.me-6 { + margin-inline-end: 24px !important; +} + +.me-7 { + margin-inline-end: 28px !important; +} + +.me-8 { + margin-inline-end: 32px !important; +} + +.me-9 { + margin-inline-end: 36px !important; +} + +.me-10 { + margin-inline-end: 40px !important; +} + +.me-11 { + margin-inline-end: 44px !important; +} + +.me-12 { + margin-inline-end: 48px !important; +} + +.me-13 { + margin-inline-end: 52px !important; +} + +.me-14 { + margin-inline-end: 56px !important; +} + +.me-15 { + margin-inline-end: 60px !important; +} + +.me-16 { + margin-inline-end: 64px !important; +} + +.me-auto { + margin-inline-end: auto !important; +} + +.ma-n1 { + margin: -4px !important; +} + +.ma-n2 { + margin: -8px !important; +} + +.ma-n3 { + margin: -12px !important; +} + +.ma-n4 { + margin: -16px !important; +} + +.ma-n5 { + margin: -20px !important; +} + +.ma-n6 { + margin: -24px !important; +} + +.ma-n7 { + margin: -28px !important; +} + +.ma-n8 { + margin: -32px !important; +} + +.ma-n9 { + margin: -36px !important; +} + +.ma-n10 { + margin: -40px !important; +} + +.ma-n11 { + margin: -44px !important; +} + +.ma-n12 { + margin: -48px !important; +} + +.ma-n13 { + margin: -52px !important; +} + +.ma-n14 { + margin: -56px !important; +} + +.ma-n15 { + margin: -60px !important; +} + +.ma-n16 { + margin: -64px !important; +} + +.mx-n1 { + margin-right: -4px !important; + margin-left: -4px !important; +} + +.mx-n2 { + margin-right: -8px !important; + margin-left: -8px !important; +} + +.mx-n3 { + margin-right: -12px !important; + margin-left: -12px !important; +} + +.mx-n4 { + margin-right: -16px !important; + margin-left: -16px !important; +} + +.mx-n5 { + margin-right: -20px !important; + margin-left: -20px !important; +} + +.mx-n6 { + margin-right: -24px !important; + margin-left: -24px !important; +} + +.mx-n7 { + margin-right: -28px !important; + margin-left: -28px !important; +} + +.mx-n8 { + margin-right: -32px !important; + margin-left: -32px !important; +} + +.mx-n9 { + margin-right: -36px !important; + margin-left: -36px !important; +} + +.mx-n10 { + margin-right: -40px !important; + margin-left: -40px !important; +} + +.mx-n11 { + margin-right: -44px !important; + margin-left: -44px !important; +} + +.mx-n12 { + margin-right: -48px !important; + margin-left: -48px !important; +} + +.mx-n13 { + margin-right: -52px !important; + margin-left: -52px !important; +} + +.mx-n14 { + margin-right: -56px !important; + margin-left: -56px !important; +} + +.mx-n15 { + margin-right: -60px !important; + margin-left: -60px !important; +} + +.mx-n16 { + margin-right: -64px !important; + margin-left: -64px !important; +} + +.my-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; +} + +.my-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; +} + +.my-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; +} + +.my-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; +} + +.my-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; +} + +.my-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; +} + +.my-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; +} + +.my-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; +} + +.my-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; +} + +.my-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; +} + +.my-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; +} + +.my-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; +} + +.my-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; +} + +.my-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; +} + +.my-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; +} + +.my-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; +} + +.mt-n1 { + margin-top: -4px !important; +} + +.mt-n2 { + margin-top: -8px !important; +} + +.mt-n3 { + margin-top: -12px !important; +} + +.mt-n4 { + margin-top: -16px !important; +} + +.mt-n5 { + margin-top: -20px !important; +} + +.mt-n6 { + margin-top: -24px !important; +} + +.mt-n7 { + margin-top: -28px !important; +} + +.mt-n8 { + margin-top: -32px !important; +} + +.mt-n9 { + margin-top: -36px !important; +} + +.mt-n10 { + margin-top: -40px !important; +} + +.mt-n11 { + margin-top: -44px !important; +} + +.mt-n12 { + margin-top: -48px !important; +} + +.mt-n13 { + margin-top: -52px !important; +} + +.mt-n14 { + margin-top: -56px !important; +} + +.mt-n15 { + margin-top: -60px !important; +} + +.mt-n16 { + margin-top: -64px !important; +} + +.mr-n1 { + margin-right: -4px !important; +} + +.mr-n2 { + margin-right: -8px !important; +} + +.mr-n3 { + margin-right: -12px !important; +} + +.mr-n4 { + margin-right: -16px !important; +} + +.mr-n5 { + margin-right: -20px !important; +} + +.mr-n6 { + margin-right: -24px !important; +} + +.mr-n7 { + margin-right: -28px !important; +} + +.mr-n8 { + margin-right: -32px !important; +} + +.mr-n9 { + margin-right: -36px !important; +} + +.mr-n10 { + margin-right: -40px !important; +} + +.mr-n11 { + margin-right: -44px !important; +} + +.mr-n12 { + margin-right: -48px !important; +} + +.mr-n13 { + margin-right: -52px !important; +} + +.mr-n14 { + margin-right: -56px !important; +} + +.mr-n15 { + margin-right: -60px !important; +} + +.mr-n16 { + margin-right: -64px !important; +} + +.mb-n1 { + margin-bottom: -4px !important; +} + +.mb-n2 { + margin-bottom: -8px !important; +} + +.mb-n3 { + margin-bottom: -12px !important; +} + +.mb-n4 { + margin-bottom: -16px !important; +} + +.mb-n5 { + margin-bottom: -20px !important; +} + +.mb-n6 { + margin-bottom: -24px !important; +} + +.mb-n7 { + margin-bottom: -28px !important; +} + +.mb-n8 { + margin-bottom: -32px !important; +} + +.mb-n9 { + margin-bottom: -36px !important; +} + +.mb-n10 { + margin-bottom: -40px !important; +} + +.mb-n11 { + margin-bottom: -44px !important; +} + +.mb-n12 { + margin-bottom: -48px !important; +} + +.mb-n13 { + margin-bottom: -52px !important; +} + +.mb-n14 { + margin-bottom: -56px !important; +} + +.mb-n15 { + margin-bottom: -60px !important; +} + +.mb-n16 { + margin-bottom: -64px !important; +} + +.ml-n1 { + margin-left: -4px !important; +} + +.ml-n2 { + margin-left: -8px !important; +} + +.ml-n3 { + margin-left: -12px !important; +} + +.ml-n4 { + margin-left: -16px !important; +} + +.ml-n5 { + margin-left: -20px !important; +} + +.ml-n6 { + margin-left: -24px !important; +} + +.ml-n7 { + margin-left: -28px !important; +} + +.ml-n8 { + margin-left: -32px !important; +} + +.ml-n9 { + margin-left: -36px !important; +} + +.ml-n10 { + margin-left: -40px !important; +} + +.ml-n11 { + margin-left: -44px !important; +} + +.ml-n12 { + margin-left: -48px !important; +} + +.ml-n13 { + margin-left: -52px !important; +} + +.ml-n14 { + margin-left: -56px !important; +} + +.ml-n15 { + margin-left: -60px !important; +} + +.ml-n16 { + margin-left: -64px !important; +} + +.ms-n1 { + margin-inline-start: -4px !important; +} + +.ms-n2 { + margin-inline-start: -8px !important; +} + +.ms-n3 { + margin-inline-start: -12px !important; +} + +.ms-n4 { + margin-inline-start: -16px !important; +} + +.ms-n5 { + margin-inline-start: -20px !important; +} + +.ms-n6 { + margin-inline-start: -24px !important; +} + +.ms-n7 { + margin-inline-start: -28px !important; +} + +.ms-n8 { + margin-inline-start: -32px !important; +} + +.ms-n9 { + margin-inline-start: -36px !important; +} + +.ms-n10 { + margin-inline-start: -40px !important; +} + +.ms-n11 { + margin-inline-start: -44px !important; +} + +.ms-n12 { + margin-inline-start: -48px !important; +} + +.ms-n13 { + margin-inline-start: -52px !important; +} + +.ms-n14 { + margin-inline-start: -56px !important; +} + +.ms-n15 { + margin-inline-start: -60px !important; +} + +.ms-n16 { + margin-inline-start: -64px !important; +} + +.me-n1 { + margin-inline-end: -4px !important; +} + +.me-n2 { + margin-inline-end: -8px !important; +} + +.me-n3 { + margin-inline-end: -12px !important; +} + +.me-n4 { + margin-inline-end: -16px !important; +} + +.me-n5 { + margin-inline-end: -20px !important; +} + +.me-n6 { + margin-inline-end: -24px !important; +} + +.me-n7 { + margin-inline-end: -28px !important; +} + +.me-n8 { + margin-inline-end: -32px !important; +} + +.me-n9 { + margin-inline-end: -36px !important; +} + +.me-n10 { + margin-inline-end: -40px !important; +} + +.me-n11 { + margin-inline-end: -44px !important; +} + +.me-n12 { + margin-inline-end: -48px !important; +} + +.me-n13 { + margin-inline-end: -52px !important; +} + +.me-n14 { + margin-inline-end: -56px !important; +} + +.me-n15 { + margin-inline-end: -60px !important; +} + +.me-n16 { + margin-inline-end: -64px !important; +} + +.pa-0 { + padding: 0px !important; +} + +.pa-1 { + padding: 4px !important; +} + +.pa-2 { + padding: 8px !important; +} + +.pa-3 { + padding: 12px !important; +} + +.pa-4 { + padding: 16px !important; +} + +.pa-5 { + padding: 20px !important; +} + +.pa-6 { + padding: 24px !important; +} + +.pa-7 { + padding: 28px !important; +} + +.pa-8 { + padding: 32px !important; +} + +.pa-9 { + padding: 36px !important; +} + +.pa-10 { + padding: 40px !important; +} + +.pa-11 { + padding: 44px !important; +} + +.pa-12 { + padding: 48px !important; +} + +.pa-13 { + padding: 52px !important; +} + +.pa-14 { + padding: 56px !important; +} + +.pa-15 { + padding: 60px !important; +} + +.pa-16 { + padding: 64px !important; +} + +.px-0 { + padding-right: 0px !important; + padding-left: 0px !important; +} + +.px-1 { + padding-right: 4px !important; + padding-left: 4px !important; +} + +.px-2 { + padding-right: 8px !important; + padding-left: 8px !important; +} + +.px-3 { + padding-right: 12px !important; + padding-left: 12px !important; +} + +.px-4 { + padding-right: 16px !important; + padding-left: 16px !important; +} + +.px-5 { + padding-right: 20px !important; + padding-left: 20px !important; +} + +.px-6 { + padding-right: 24px !important; + padding-left: 24px !important; +} + +.px-7 { + padding-right: 28px !important; + padding-left: 28px !important; +} + +.px-8 { + padding-right: 32px !important; + padding-left: 32px !important; +} + +.px-9 { + padding-right: 36px !important; + padding-left: 36px !important; +} + +.px-10 { + padding-right: 40px !important; + padding-left: 40px !important; +} + +.px-11 { + padding-right: 44px !important; + padding-left: 44px !important; +} + +.px-12 { + padding-right: 48px !important; + padding-left: 48px !important; +} + +.px-13 { + padding-right: 52px !important; + padding-left: 52px !important; +} + +.px-14 { + padding-right: 56px !important; + padding-left: 56px !important; +} + +.px-15 { + padding-right: 60px !important; + padding-left: 60px !important; +} + +.px-16 { + padding-right: 64px !important; + padding-left: 64px !important; +} + +.py-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; +} + +.py-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; +} + +.py-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; +} + +.py-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; +} + +.py-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; +} + +.py-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; +} + +.py-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; +} + +.py-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; +} + +.py-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; +} + +.py-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; +} + +.py-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; +} + +.py-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; +} + +.py-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; +} + +.py-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; +} + +.py-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; +} + +.py-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; +} + +.py-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; +} + +.pt-0 { + padding-top: 0px !important; +} + +.pt-1 { + padding-top: 4px !important; +} + +.pt-2 { + padding-top: 8px !important; +} + +.pt-3 { + padding-top: 12px !important; +} + +.pt-4 { + padding-top: 16px !important; +} + +.pt-5 { + padding-top: 20px !important; +} + +.pt-6 { + padding-top: 24px !important; +} + +.pt-7 { + padding-top: 28px !important; +} + +.pt-8 { + padding-top: 32px !important; +} + +.pt-9 { + padding-top: 36px !important; +} + +.pt-10 { + padding-top: 40px !important; +} + +.pt-11 { + padding-top: 44px !important; +} + +.pt-12 { + padding-top: 48px !important; +} + +.pt-13 { + padding-top: 52px !important; +} + +.pt-14 { + padding-top: 56px !important; +} + +.pt-15 { + padding-top: 60px !important; +} + +.pt-16 { + padding-top: 64px !important; +} + +.pr-0 { + padding-right: 0px !important; +} + +.pr-1 { + padding-right: 4px !important; +} + +.pr-2 { + padding-right: 8px !important; +} + +.pr-3 { + padding-right: 12px !important; +} + +.pr-4 { + padding-right: 16px !important; +} + +.pr-5 { + padding-right: 20px !important; +} + +.pr-6 { + padding-right: 24px !important; +} + +.pr-7 { + padding-right: 28px !important; +} + +.pr-8 { + padding-right: 32px !important; +} + +.pr-9 { + padding-right: 36px !important; +} + +.pr-10 { + padding-right: 40px !important; +} + +.pr-11 { + padding-right: 44px !important; +} + +.pr-12 { + padding-right: 48px !important; +} + +.pr-13 { + padding-right: 52px !important; +} + +.pr-14 { + padding-right: 56px !important; +} + +.pr-15 { + padding-right: 60px !important; +} + +.pr-16 { + padding-right: 64px !important; +} + +.pb-0 { + padding-bottom: 0px !important; +} + +.pb-1 { + padding-bottom: 4px !important; +} + +.pb-2 { + padding-bottom: 8px !important; +} + +.pb-3 { + padding-bottom: 12px !important; +} + +.pb-4 { + padding-bottom: 16px !important; +} + +.pb-5 { + padding-bottom: 20px !important; +} + +.pb-6 { + padding-bottom: 24px !important; +} + +.pb-7 { + padding-bottom: 28px !important; +} + +.pb-8 { + padding-bottom: 32px !important; +} + +.pb-9 { + padding-bottom: 36px !important; +} + +.pb-10 { + padding-bottom: 40px !important; +} + +.pb-11 { + padding-bottom: 44px !important; +} + +.pb-12 { + padding-bottom: 48px !important; +} + +.pb-13 { + padding-bottom: 52px !important; +} + +.pb-14 { + padding-bottom: 56px !important; +} + +.pb-15 { + padding-bottom: 60px !important; +} + +.pb-16 { + padding-bottom: 64px !important; +} + +.pl-0 { + padding-left: 0px !important; +} + +.pl-1 { + padding-left: 4px !important; +} + +.pl-2 { + padding-left: 8px !important; +} + +.pl-3 { + padding-left: 12px !important; +} + +.pl-4 { + padding-left: 16px !important; +} + +.pl-5 { + padding-left: 20px !important; +} + +.pl-6 { + padding-left: 24px !important; +} + +.pl-7 { + padding-left: 28px !important; +} + +.pl-8 { + padding-left: 32px !important; +} + +.pl-9 { + padding-left: 36px !important; +} + +.pl-10 { + padding-left: 40px !important; +} + +.pl-11 { + padding-left: 44px !important; +} + +.pl-12 { + padding-left: 48px !important; +} + +.pl-13 { + padding-left: 52px !important; +} + +.pl-14 { + padding-left: 56px !important; +} + +.pl-15 { + padding-left: 60px !important; +} + +.pl-16 { + padding-left: 64px !important; +} + +.ps-0 { + padding-inline-start: 0px !important; +} + +.ps-1 { + padding-inline-start: 4px !important; +} + +.ps-2 { + padding-inline-start: 8px !important; +} + +.ps-3 { + padding-inline-start: 12px !important; +} + +.ps-4 { + padding-inline-start: 16px !important; +} + +.ps-5 { + padding-inline-start: 20px !important; +} + +.ps-6 { + padding-inline-start: 24px !important; +} + +.ps-7 { + padding-inline-start: 28px !important; +} + +.ps-8 { + padding-inline-start: 32px !important; +} + +.ps-9 { + padding-inline-start: 36px !important; +} + +.ps-10 { + padding-inline-start: 40px !important; +} + +.ps-11 { + padding-inline-start: 44px !important; +} + +.ps-12 { + padding-inline-start: 48px !important; +} + +.ps-13 { + padding-inline-start: 52px !important; +} + +.ps-14 { + padding-inline-start: 56px !important; +} + +.ps-15 { + padding-inline-start: 60px !important; +} + +.ps-16 { + padding-inline-start: 64px !important; +} + +.pe-0 { + padding-inline-end: 0px !important; +} + +.pe-1 { + padding-inline-end: 4px !important; +} + +.pe-2 { + padding-inline-end: 8px !important; +} + +.pe-3 { + padding-inline-end: 12px !important; +} + +.pe-4 { + padding-inline-end: 16px !important; +} + +.pe-5 { + padding-inline-end: 20px !important; +} + +.pe-6 { + padding-inline-end: 24px !important; +} + +.pe-7 { + padding-inline-end: 28px !important; +} + +.pe-8 { + padding-inline-end: 32px !important; +} + +.pe-9 { + padding-inline-end: 36px !important; +} + +.pe-10 { + padding-inline-end: 40px !important; +} + +.pe-11 { + padding-inline-end: 44px !important; +} + +.pe-12 { + padding-inline-end: 48px !important; +} + +.pe-13 { + padding-inline-end: 52px !important; +} + +.pe-14 { + padding-inline-end: 56px !important; +} + +.pe-15 { + padding-inline-end: 60px !important; +} + +.pe-16 { + padding-inline-end: 64px !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-sm { + border-radius: 2px !important; +} + +.rounded { + border-radius: 4px !important; +} + +.rounded-lg { + border-radius: 8px !important; +} + +.rounded-xl { + border-radius: 24px !important; +} + +.rounded-pill { + border-radius: 9999px !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-shaped { + border-radius: 24px 0 !important; +} + +.rounded-t-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.rounded-t-sm { + border-top-left-radius: 2px !important; + border-top-right-radius: 2px !important; +} + +.rounded-t { + border-top-left-radius: 4px !important; + border-top-right-radius: 4px !important; +} + +.rounded-t-lg { + border-top-left-radius: 8px !important; + border-top-right-radius: 8px !important; +} + +.rounded-t-xl { + border-top-left-radius: 24px !important; + border-top-right-radius: 24px !important; +} + +.rounded-t-pill { + border-top-left-radius: 9999px !important; + border-top-right-radius: 9999px !important; +} + +.rounded-t-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} + +.rounded-t-shaped { + border-top-left-radius: 24px !important; + border-top-right-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-e-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.v-locale--is-rtl .rounded-e-0 { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-e-sm { + border-top-right-radius: 2px !important; + border-bottom-right-radius: 2px !important; +} + +.v-locale--is-rtl .rounded-e-sm { + border-top-left-radius: 2px !important; + border-bottom-left-radius: 2px !important; +} + +.v-locale--is-ltr .rounded-e { + border-top-right-radius: 4px !important; + border-bottom-right-radius: 4px !important; +} + +.v-locale--is-rtl .rounded-e { + border-top-left-radius: 4px !important; + border-bottom-left-radius: 4px !important; +} + +.v-locale--is-ltr .rounded-e-lg { + border-top-right-radius: 8px !important; + border-bottom-right-radius: 8px !important; +} + +.v-locale--is-rtl .rounded-e-lg { + border-top-left-radius: 8px !important; + border-bottom-left-radius: 8px !important; +} + +.v-locale--is-ltr .rounded-e-xl { + border-top-right-radius: 24px !important; + border-bottom-right-radius: 24px !important; +} + +.v-locale--is-rtl .rounded-e-xl { + border-top-left-radius: 24px !important; + border-bottom-left-radius: 24px !important; +} + +.v-locale--is-ltr .rounded-e-pill { + border-top-right-radius: 9999px !important; + border-bottom-right-radius: 9999px !important; +} + +.v-locale--is-rtl .rounded-e-pill { + border-top-left-radius: 9999px !important; + border-bottom-left-radius: 9999px !important; +} + +.v-locale--is-ltr .rounded-e-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} + +.v-locale--is-rtl .rounded-e-circle { + border-top-left-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} + +.v-locale--is-ltr .rounded-e-shaped { + border-top-right-radius: 24px !important; + border-bottom-right-radius: 0 !important; +} + +.v-locale--is-rtl .rounded-e-shaped { + border-top-left-radius: 24px !important; + border-bottom-left-radius: 0 !important; +} + +.rounded-b-0 { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.rounded-b-sm { + border-bottom-left-radius: 2px !important; + border-bottom-right-radius: 2px !important; +} + +.rounded-b { + border-bottom-left-radius: 4px !important; + border-bottom-right-radius: 4px !important; +} + +.rounded-b-lg { + border-bottom-left-radius: 8px !important; + border-bottom-right-radius: 8px !important; +} + +.rounded-b-xl { + border-bottom-left-radius: 24px !important; + border-bottom-right-radius: 24px !important; +} + +.rounded-b-pill { + border-bottom-left-radius: 9999px !important; + border-bottom-right-radius: 9999px !important; +} + +.rounded-b-circle { + border-bottom-left-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} + +.rounded-b-shaped { + border-bottom-left-radius: 24px !important; + border-bottom-right-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-s-0 { + border-top-left-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.v-locale--is-rtl .rounded-s-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-s-sm { + border-top-left-radius: 2px !important; + border-bottom-left-radius: 2px !important; +} + +.v-locale--is-rtl .rounded-s-sm { + border-top-right-radius: 2px !important; + border-bottom-right-radius: 2px !important; +} + +.v-locale--is-ltr .rounded-s { + border-top-left-radius: 4px !important; + border-bottom-left-radius: 4px !important; +} + +.v-locale--is-rtl .rounded-s { + border-top-right-radius: 4px !important; + border-bottom-right-radius: 4px !important; +} + +.v-locale--is-ltr .rounded-s-lg { + border-top-left-radius: 8px !important; + border-bottom-left-radius: 8px !important; +} + +.v-locale--is-rtl .rounded-s-lg { + border-top-right-radius: 8px !important; + border-bottom-right-radius: 8px !important; +} + +.v-locale--is-ltr .rounded-s-xl { + border-top-left-radius: 24px !important; + border-bottom-left-radius: 24px !important; +} + +.v-locale--is-rtl .rounded-s-xl { + border-top-right-radius: 24px !important; + border-bottom-right-radius: 24px !important; +} + +.v-locale--is-ltr .rounded-s-pill { + border-top-left-radius: 9999px !important; + border-bottom-left-radius: 9999px !important; +} + +.v-locale--is-rtl .rounded-s-pill { + border-top-right-radius: 9999px !important; + border-bottom-right-radius: 9999px !important; +} + +.v-locale--is-ltr .rounded-s-circle { + border-top-left-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} + +.v-locale--is-rtl .rounded-s-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} + +.v-locale--is-ltr .rounded-s-shaped { + border-top-left-radius: 24px !important; + border-bottom-left-radius: 0 !important; +} + +.v-locale--is-rtl .rounded-s-shaped { + border-top-right-radius: 24px !important; + border-bottom-right-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-ts-0 { + border-top-left-radius: 0 !important; +} + +.v-locale--is-rtl .rounded-ts-0 { + border-top-right-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-ts-sm { + border-top-left-radius: 2px !important; +} + +.v-locale--is-rtl .rounded-ts-sm { + border-top-right-radius: 2px !important; +} + +.v-locale--is-ltr .rounded-ts { + border-top-left-radius: 4px !important; +} + +.v-locale--is-rtl .rounded-ts { + border-top-right-radius: 4px !important; +} + +.v-locale--is-ltr .rounded-ts-lg { + border-top-left-radius: 8px !important; +} + +.v-locale--is-rtl .rounded-ts-lg { + border-top-right-radius: 8px !important; +} + +.v-locale--is-ltr .rounded-ts-xl { + border-top-left-radius: 24px !important; +} + +.v-locale--is-rtl .rounded-ts-xl { + border-top-right-radius: 24px !important; +} + +.v-locale--is-ltr .rounded-ts-pill { + border-top-left-radius: 9999px !important; +} + +.v-locale--is-rtl .rounded-ts-pill { + border-top-right-radius: 9999px !important; +} + +.v-locale--is-ltr .rounded-ts-circle { + border-top-left-radius: 50% !important; +} + +.v-locale--is-rtl .rounded-ts-circle { + border-top-right-radius: 50% !important; +} + +.v-locale--is-ltr .rounded-ts-shaped { + border-top-left-radius: 24px 0 !important; +} + +.v-locale--is-rtl .rounded-ts-shaped { + border-top-right-radius: 24px 0 !important; +} + +.v-locale--is-ltr .rounded-te-0 { + border-top-right-radius: 0 !important; +} + +.v-locale--is-rtl .rounded-te-0 { + border-top-left-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-te-sm { + border-top-right-radius: 2px !important; +} + +.v-locale--is-rtl .rounded-te-sm { + border-top-left-radius: 2px !important; +} + +.v-locale--is-ltr .rounded-te { + border-top-right-radius: 4px !important; +} + +.v-locale--is-rtl .rounded-te { + border-top-left-radius: 4px !important; +} + +.v-locale--is-ltr .rounded-te-lg { + border-top-right-radius: 8px !important; +} + +.v-locale--is-rtl .rounded-te-lg { + border-top-left-radius: 8px !important; +} + +.v-locale--is-ltr .rounded-te-xl { + border-top-right-radius: 24px !important; +} + +.v-locale--is-rtl .rounded-te-xl { + border-top-left-radius: 24px !important; +} + +.v-locale--is-ltr .rounded-te-pill { + border-top-right-radius: 9999px !important; +} + +.v-locale--is-rtl .rounded-te-pill { + border-top-left-radius: 9999px !important; +} + +.v-locale--is-ltr .rounded-te-circle { + border-top-right-radius: 50% !important; +} + +.v-locale--is-rtl .rounded-te-circle { + border-top-left-radius: 50% !important; +} + +.v-locale--is-ltr .rounded-te-shaped { + border-top-right-radius: 24px 0 !important; +} + +.v-locale--is-rtl .rounded-te-shaped { + border-top-left-radius: 24px 0 !important; +} + +.v-locale--is-ltr .rounded-be-0 { + border-bottom-right-radius: 0 !important; +} + +.v-locale--is-rtl .rounded-be-0 { + border-bottom-left-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-be-sm { + border-bottom-right-radius: 2px !important; +} + +.v-locale--is-rtl .rounded-be-sm { + border-bottom-left-radius: 2px !important; +} + +.v-locale--is-ltr .rounded-be { + border-bottom-right-radius: 4px !important; +} + +.v-locale--is-rtl .rounded-be { + border-bottom-left-radius: 4px !important; +} + +.v-locale--is-ltr .rounded-be-lg { + border-bottom-right-radius: 8px !important; +} + +.v-locale--is-rtl .rounded-be-lg { + border-bottom-left-radius: 8px !important; +} + +.v-locale--is-ltr .rounded-be-xl { + border-bottom-right-radius: 24px !important; +} + +.v-locale--is-rtl .rounded-be-xl { + border-bottom-left-radius: 24px !important; +} + +.v-locale--is-ltr .rounded-be-pill { + border-bottom-right-radius: 9999px !important; +} + +.v-locale--is-rtl .rounded-be-pill { + border-bottom-left-radius: 9999px !important; +} + +.v-locale--is-ltr .rounded-be-circle { + border-bottom-right-radius: 50% !important; +} + +.v-locale--is-rtl .rounded-be-circle { + border-bottom-left-radius: 50% !important; +} + +.v-locale--is-ltr .rounded-be-shaped { + border-bottom-right-radius: 24px 0 !important; +} + +.v-locale--is-rtl .rounded-be-shaped { + border-bottom-left-radius: 24px 0 !important; +} + +.v-locale--is-ltr .rounded-bs-0 { + border-bottom-left-radius: 0 !important; +} + +.v-locale--is-rtl .rounded-bs-0 { + border-bottom-right-radius: 0 !important; +} + +.v-locale--is-ltr .rounded-bs-sm { + border-bottom-left-radius: 2px !important; +} + +.v-locale--is-rtl .rounded-bs-sm { + border-bottom-right-radius: 2px !important; +} + +.v-locale--is-ltr .rounded-bs { + border-bottom-left-radius: 4px !important; +} + +.v-locale--is-rtl .rounded-bs { + border-bottom-right-radius: 4px !important; +} + +.v-locale--is-ltr .rounded-bs-lg { + border-bottom-left-radius: 8px !important; +} + +.v-locale--is-rtl .rounded-bs-lg { + border-bottom-right-radius: 8px !important; +} + +.v-locale--is-ltr .rounded-bs-xl { + border-bottom-left-radius: 24px !important; +} + +.v-locale--is-rtl .rounded-bs-xl { + border-bottom-right-radius: 24px !important; +} + +.v-locale--is-ltr .rounded-bs-pill { + border-bottom-left-radius: 9999px !important; +} + +.v-locale--is-rtl .rounded-bs-pill { + border-bottom-right-radius: 9999px !important; +} + +.v-locale--is-ltr .rounded-bs-circle { + border-bottom-left-radius: 50% !important; +} + +.v-locale--is-rtl .rounded-bs-circle { + border-bottom-right-radius: 50% !important; +} + +.v-locale--is-ltr .rounded-bs-shaped { + border-bottom-left-radius: 24px 0 !important; +} + +.v-locale--is-rtl .rounded-bs-shaped { + border-bottom-right-radius: 24px 0 !important; +} + +.border-0 { + border-width: 0 !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border { + border-width: thin !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-thin { + border-width: thin !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-sm { + border-width: 1px !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-md { + border-width: 2px !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-lg { + border-width: 4px !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-xl { + border-width: 8px !important; + border-style: solid !important; + border-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-current { + border-color: currentColor !important; +} + +.border-opacity-0 { + --v-border-opacity: 0 !important; +} + +.border-opacity { + --v-border-opacity: 0.12 !important; +} + +.border-opacity-25 { + --v-border-opacity: 0.25 !important; +} + +.border-opacity-50 { + --v-border-opacity: 0.5 !important; +} + +.border-opacity-75 { + --v-border-opacity: 0.75 !important; +} + +.border-opacity-100 { + --v-border-opacity: 1 !important; +} + +.border-t-0 { + border-block-start-width: 0 !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t { + border-block-start-width: thin !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-thin { + border-block-start-width: thin !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-sm { + border-block-start-width: 1px !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-md { + border-block-start-width: 2px !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-lg { + border-block-start-width: 4px !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-t-xl { + border-block-start-width: 8px !important; + border-block-start-style: solid !important; + border-block-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-0 { + border-inline-end-width: 0 !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e { + border-inline-end-width: thin !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-thin { + border-inline-end-width: thin !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-sm { + border-inline-end-width: 1px !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-md { + border-inline-end-width: 2px !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-lg { + border-inline-end-width: 4px !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-e-xl { + border-inline-end-width: 8px !important; + border-inline-end-style: solid !important; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-0 { + border-block-end-width: 0 !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b { + border-block-end-width: thin !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-thin { + border-block-end-width: thin !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-sm { + border-block-end-width: 1px !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-md { + border-block-end-width: 2px !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-lg { + border-block-end-width: 4px !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-b-xl { + border-block-end-width: 8px !important; + border-block-end-style: solid !important; + border-block-end-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-0 { + border-inline-start-width: 0 !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s { + border-inline-start-width: thin !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-thin { + border-inline-start-width: thin !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-sm { + border-inline-start-width: 1px !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-md { + border-inline-start-width: 2px !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-lg { + border-inline-start-width: 4px !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-s-xl { + border-inline-start-width: 8px !important; + border-inline-start-style: solid !important; + border-inline-start-color: rgba(var(--v-border-color), var(--v-border-opacity)) !important; +} + +.border-solid { + border-style: solid !important; +} + +.border-dashed { + border-style: dashed !important; +} + +.border-dotted { + border-style: dotted !important; +} + +.border-double { + border-style: double !important; +} + +.border-none { + border-style: none !important; +} + +.text-left { + text-align: left !important; +} + +.text-right { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-justify { + text-align: justify !important; +} + +.text-start { + text-align: start !important; +} + +.text-end { + text-align: end !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-overline { + text-decoration: overline !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-no-wrap { + white-space: nowrap !important; +} + +.text-pre { + white-space: pre !important; +} + +.text-pre-line { + white-space: pre-line !important; +} + +.text-pre-wrap { + white-space: pre-wrap !important; +} + +.text-break { + overflow-wrap: break-word !important; + word-break: break-word !important; +} + +.opacity-hover { + opacity: var(--v-hover-opacity) !important; +} + +.opacity-focus { + opacity: var(--v-focus-opacity) !important; +} + +.opacity-selected { + opacity: var(--v-selected-opacity) !important; +} + +.opacity-activated { + opacity: var(--v-activated-opacity) !important; +} + +.opacity-pressed { + opacity: var(--v-pressed-opacity) !important; +} + +.opacity-dragged { + opacity: var(--v-dragged-opacity) !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-10 { + opacity: 0.1 !important; +} + +.opacity-20 { + opacity: 0.2 !important; +} + +.opacity-30 { + opacity: 0.3 !important; +} + +.opacity-40 { + opacity: 0.4 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-60 { + opacity: 0.6 !important; +} + +.opacity-70 { + opacity: 0.7 !important; +} + +.opacity-80 { + opacity: 0.8 !important; +} + +.opacity-90 { + opacity: 0.9 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.text-high-emphasis { + color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity)) !important; +} + +.text-medium-emphasis { + color: rgba(var(--v-theme-on-background), var(--v-medium-emphasis-opacity)) !important; +} + +.text-disabled { + color: rgba(var(--v-theme-on-background), var(--v-disabled-opacity)) !important; +} + +.text-truncate { + white-space: nowrap !important; + overflow: hidden !important; + text-overflow: ellipsis !important; +} + +.text-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; +} + +.text-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; +} + +.text-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; +} + +.text-none { + text-transform: none !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.font-weight-thin { + font-weight: 100 !important; +} + +.font-weight-light { + font-weight: 300 !important; +} + +.font-weight-regular { + font-weight: 400 !important; +} + +.font-weight-medium { + font-weight: 500 !important; +} + +.font-weight-bold { + font-weight: 700 !important; +} + +.font-weight-black { + font-weight: 900 !important; +} + +.font-italic { + font-style: italic !important; +} + +.text-mono { + font-family: monospace !important; +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-sticky { + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.right-0 { + right: 0 !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.left-0 { + left: 0 !important; +} + +.cursor-auto { + cursor: auto !important; +} + +.cursor-default { + cursor: default !important; +} + +.cursor-pointer { + cursor: pointer !important; +} + +.cursor-wait { + cursor: wait !important; +} + +.cursor-text { + cursor: text !important; +} + +.cursor-move { + cursor: move !important; +} + +.cursor-help { + cursor: help !important; +} + +.cursor-not-allowed { + cursor: not-allowed !important; +} + +.cursor-progress { + cursor: progress !important; +} + +.cursor-grab { + cursor: grab !important; +} + +.cursor-grabbing { + cursor: grabbing !important; +} + +.cursor-none { + cursor: none !important; +} + +.fill-height { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.h-screen { + height: 100vh !important; +} + +.h-0 { + height: 0 !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-screen { + height: 100dvh !important; +} + +.w-auto { + width: auto !important; +} + +.w-0 { + width: 0 !important; +} + +.w-25 { + width: 25% !important; +} + +.w-33 { + width: 33% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-66 { + width: 66% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +@media (min-width: 600px) { + .d-sm-none { + display: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .float-sm-none { + float: none !important; + } + .float-sm-left { + float: left !important; + } + .float-sm-right { + float: right !important; + } + .v-locale--is-rtl .float-sm-end { + float: left !important; + } + .v-locale--is-rtl .float-sm-start { + float: right !important; + } + .v-locale--is-ltr .float-sm-end { + float: right !important; + } + .v-locale--is-ltr .float-sm-start { + float: left !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-1-1 { + flex: 1 1 auto !important; + } + .flex-sm-1-0 { + flex: 1 0 auto !important; + } + .flex-sm-0-1 { + flex: 0 1 auto !important; + } + .flex-sm-0-0 { + flex: 0 0 auto !important; + } + .flex-sm-1-1-100 { + flex: 1 1 100% !important; + } + .flex-sm-1-0-100 { + flex: 1 0 100% !important; + } + .flex-sm-0-1-100 { + flex: 0 1 100% !important; + } + .flex-sm-0-0-100 { + flex: 0 0 100% !important; + } + .flex-sm-1-1-0 { + flex: 1 1 0 !important; + } + .flex-sm-1-0-0 { + flex: 1 0 0 !important; + } + .flex-sm-0-1-0 { + flex: 0 1 0 !important; + } + .flex-sm-0-0-0 { + flex: 0 0 0 !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-sm-start { + justify-content: flex-start !important; + } + .justify-sm-end { + justify-content: flex-end !important; + } + .justify-sm-center { + justify-content: center !important; + } + .justify-sm-space-between { + justify-content: space-between !important; + } + .justify-sm-space-around { + justify-content: space-around !important; + } + .justify-sm-space-evenly { + justify-content: space-evenly !important; + } + .align-sm-start { + align-items: flex-start !important; + } + .align-sm-end { + align-items: flex-end !important; + } + .align-sm-center { + align-items: center !important; + } + .align-sm-baseline { + align-items: baseline !important; + } + .align-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-space-between { + align-content: space-between !important; + } + .align-content-sm-space-around { + align-content: space-around !important; + } + .align-content-sm-space-evenly { + align-content: space-evenly !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-6 { + order: 6 !important; + } + .order-sm-7 { + order: 7 !important; + } + .order-sm-8 { + order: 8 !important; + } + .order-sm-9 { + order: 9 !important; + } + .order-sm-10 { + order: 10 !important; + } + .order-sm-11 { + order: 11 !important; + } + .order-sm-12 { + order: 12 !important; + } + .order-sm-last { + order: 13 !important; + } + .ga-sm-0 { + gap: 0px !important; + } + .ga-sm-1 { + gap: 4px !important; + } + .ga-sm-2 { + gap: 8px !important; + } + .ga-sm-3 { + gap: 12px !important; + } + .ga-sm-4 { + gap: 16px !important; + } + .ga-sm-5 { + gap: 20px !important; + } + .ga-sm-6 { + gap: 24px !important; + } + .ga-sm-7 { + gap: 28px !important; + } + .ga-sm-8 { + gap: 32px !important; + } + .ga-sm-9 { + gap: 36px !important; + } + .ga-sm-10 { + gap: 40px !important; + } + .ga-sm-11 { + gap: 44px !important; + } + .ga-sm-12 { + gap: 48px !important; + } + .ga-sm-13 { + gap: 52px !important; + } + .ga-sm-14 { + gap: 56px !important; + } + .ga-sm-15 { + gap: 60px !important; + } + .ga-sm-16 { + gap: 64px !important; + } + .ga-sm-auto { + gap: auto !important; + } + .gr-sm-0 { + row-gap: 0px !important; + } + .gr-sm-1 { + row-gap: 4px !important; + } + .gr-sm-2 { + row-gap: 8px !important; + } + .gr-sm-3 { + row-gap: 12px !important; + } + .gr-sm-4 { + row-gap: 16px !important; + } + .gr-sm-5 { + row-gap: 20px !important; + } + .gr-sm-6 { + row-gap: 24px !important; + } + .gr-sm-7 { + row-gap: 28px !important; + } + .gr-sm-8 { + row-gap: 32px !important; + } + .gr-sm-9 { + row-gap: 36px !important; + } + .gr-sm-10 { + row-gap: 40px !important; + } + .gr-sm-11 { + row-gap: 44px !important; + } + .gr-sm-12 { + row-gap: 48px !important; + } + .gr-sm-13 { + row-gap: 52px !important; + } + .gr-sm-14 { + row-gap: 56px !important; + } + .gr-sm-15 { + row-gap: 60px !important; + } + .gr-sm-16 { + row-gap: 64px !important; + } + .gr-sm-auto { + row-gap: auto !important; + } + .gc-sm-0 { + column-gap: 0px !important; + } + .gc-sm-1 { + column-gap: 4px !important; + } + .gc-sm-2 { + column-gap: 8px !important; + } + .gc-sm-3 { + column-gap: 12px !important; + } + .gc-sm-4 { + column-gap: 16px !important; + } + .gc-sm-5 { + column-gap: 20px !important; + } + .gc-sm-6 { + column-gap: 24px !important; + } + .gc-sm-7 { + column-gap: 28px !important; + } + .gc-sm-8 { + column-gap: 32px !important; + } + .gc-sm-9 { + column-gap: 36px !important; + } + .gc-sm-10 { + column-gap: 40px !important; + } + .gc-sm-11 { + column-gap: 44px !important; + } + .gc-sm-12 { + column-gap: 48px !important; + } + .gc-sm-13 { + column-gap: 52px !important; + } + .gc-sm-14 { + column-gap: 56px !important; + } + .gc-sm-15 { + column-gap: 60px !important; + } + .gc-sm-16 { + column-gap: 64px !important; + } + .gc-sm-auto { + column-gap: auto !important; + } + .ma-sm-0 { + margin: 0px !important; + } + .ma-sm-1 { + margin: 4px !important; + } + .ma-sm-2 { + margin: 8px !important; + } + .ma-sm-3 { + margin: 12px !important; + } + .ma-sm-4 { + margin: 16px !important; + } + .ma-sm-5 { + margin: 20px !important; + } + .ma-sm-6 { + margin: 24px !important; + } + .ma-sm-7 { + margin: 28px !important; + } + .ma-sm-8 { + margin: 32px !important; + } + .ma-sm-9 { + margin: 36px !important; + } + .ma-sm-10 { + margin: 40px !important; + } + .ma-sm-11 { + margin: 44px !important; + } + .ma-sm-12 { + margin: 48px !important; + } + .ma-sm-13 { + margin: 52px !important; + } + .ma-sm-14 { + margin: 56px !important; + } + .ma-sm-15 { + margin: 60px !important; + } + .ma-sm-16 { + margin: 64px !important; + } + .ma-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-sm-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-sm-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-sm-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-sm-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-sm-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-sm-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-sm-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-sm-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-sm-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-sm-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-sm-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-sm-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-sm-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-sm-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-sm-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-sm-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-sm-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-sm-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-sm-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-sm-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-sm-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-sm-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-sm-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-sm-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-sm-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-sm-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-sm-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-sm-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-sm-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-sm-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-sm-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-sm-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0px !important; + } + .mt-sm-1 { + margin-top: 4px !important; + } + .mt-sm-2 { + margin-top: 8px !important; + } + .mt-sm-3 { + margin-top: 12px !important; + } + .mt-sm-4 { + margin-top: 16px !important; + } + .mt-sm-5 { + margin-top: 20px !important; + } + .mt-sm-6 { + margin-top: 24px !important; + } + .mt-sm-7 { + margin-top: 28px !important; + } + .mt-sm-8 { + margin-top: 32px !important; + } + .mt-sm-9 { + margin-top: 36px !important; + } + .mt-sm-10 { + margin-top: 40px !important; + } + .mt-sm-11 { + margin-top: 44px !important; + } + .mt-sm-12 { + margin-top: 48px !important; + } + .mt-sm-13 { + margin-top: 52px !important; + } + .mt-sm-14 { + margin-top: 56px !important; + } + .mt-sm-15 { + margin-top: 60px !important; + } + .mt-sm-16 { + margin-top: 64px !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .mr-sm-0 { + margin-right: 0px !important; + } + .mr-sm-1 { + margin-right: 4px !important; + } + .mr-sm-2 { + margin-right: 8px !important; + } + .mr-sm-3 { + margin-right: 12px !important; + } + .mr-sm-4 { + margin-right: 16px !important; + } + .mr-sm-5 { + margin-right: 20px !important; + } + .mr-sm-6 { + margin-right: 24px !important; + } + .mr-sm-7 { + margin-right: 28px !important; + } + .mr-sm-8 { + margin-right: 32px !important; + } + .mr-sm-9 { + margin-right: 36px !important; + } + .mr-sm-10 { + margin-right: 40px !important; + } + .mr-sm-11 { + margin-right: 44px !important; + } + .mr-sm-12 { + margin-right: 48px !important; + } + .mr-sm-13 { + margin-right: 52px !important; + } + .mr-sm-14 { + margin-right: 56px !important; + } + .mr-sm-15 { + margin-right: 60px !important; + } + .mr-sm-16 { + margin-right: 64px !important; + } + .mr-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0px !important; + } + .mb-sm-1 { + margin-bottom: 4px !important; + } + .mb-sm-2 { + margin-bottom: 8px !important; + } + .mb-sm-3 { + margin-bottom: 12px !important; + } + .mb-sm-4 { + margin-bottom: 16px !important; + } + .mb-sm-5 { + margin-bottom: 20px !important; + } + .mb-sm-6 { + margin-bottom: 24px !important; + } + .mb-sm-7 { + margin-bottom: 28px !important; + } + .mb-sm-8 { + margin-bottom: 32px !important; + } + .mb-sm-9 { + margin-bottom: 36px !important; + } + .mb-sm-10 { + margin-bottom: 40px !important; + } + .mb-sm-11 { + margin-bottom: 44px !important; + } + .mb-sm-12 { + margin-bottom: 48px !important; + } + .mb-sm-13 { + margin-bottom: 52px !important; + } + .mb-sm-14 { + margin-bottom: 56px !important; + } + .mb-sm-15 { + margin-bottom: 60px !important; + } + .mb-sm-16 { + margin-bottom: 64px !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ml-sm-0 { + margin-left: 0px !important; + } + .ml-sm-1 { + margin-left: 4px !important; + } + .ml-sm-2 { + margin-left: 8px !important; + } + .ml-sm-3 { + margin-left: 12px !important; + } + .ml-sm-4 { + margin-left: 16px !important; + } + .ml-sm-5 { + margin-left: 20px !important; + } + .ml-sm-6 { + margin-left: 24px !important; + } + .ml-sm-7 { + margin-left: 28px !important; + } + .ml-sm-8 { + margin-left: 32px !important; + } + .ml-sm-9 { + margin-left: 36px !important; + } + .ml-sm-10 { + margin-left: 40px !important; + } + .ml-sm-11 { + margin-left: 44px !important; + } + .ml-sm-12 { + margin-left: 48px !important; + } + .ml-sm-13 { + margin-left: 52px !important; + } + .ml-sm-14 { + margin-left: 56px !important; + } + .ml-sm-15 { + margin-left: 60px !important; + } + .ml-sm-16 { + margin-left: 64px !important; + } + .ml-sm-auto { + margin-left: auto !important; + } + .ms-sm-0 { + margin-inline-start: 0px !important; + } + .ms-sm-1 { + margin-inline-start: 4px !important; + } + .ms-sm-2 { + margin-inline-start: 8px !important; + } + .ms-sm-3 { + margin-inline-start: 12px !important; + } + .ms-sm-4 { + margin-inline-start: 16px !important; + } + .ms-sm-5 { + margin-inline-start: 20px !important; + } + .ms-sm-6 { + margin-inline-start: 24px !important; + } + .ms-sm-7 { + margin-inline-start: 28px !important; + } + .ms-sm-8 { + margin-inline-start: 32px !important; + } + .ms-sm-9 { + margin-inline-start: 36px !important; + } + .ms-sm-10 { + margin-inline-start: 40px !important; + } + .ms-sm-11 { + margin-inline-start: 44px !important; + } + .ms-sm-12 { + margin-inline-start: 48px !important; + } + .ms-sm-13 { + margin-inline-start: 52px !important; + } + .ms-sm-14 { + margin-inline-start: 56px !important; + } + .ms-sm-15 { + margin-inline-start: 60px !important; + } + .ms-sm-16 { + margin-inline-start: 64px !important; + } + .ms-sm-auto { + margin-inline-start: auto !important; + } + .me-sm-0 { + margin-inline-end: 0px !important; + } + .me-sm-1 { + margin-inline-end: 4px !important; + } + .me-sm-2 { + margin-inline-end: 8px !important; + } + .me-sm-3 { + margin-inline-end: 12px !important; + } + .me-sm-4 { + margin-inline-end: 16px !important; + } + .me-sm-5 { + margin-inline-end: 20px !important; + } + .me-sm-6 { + margin-inline-end: 24px !important; + } + .me-sm-7 { + margin-inline-end: 28px !important; + } + .me-sm-8 { + margin-inline-end: 32px !important; + } + .me-sm-9 { + margin-inline-end: 36px !important; + } + .me-sm-10 { + margin-inline-end: 40px !important; + } + .me-sm-11 { + margin-inline-end: 44px !important; + } + .me-sm-12 { + margin-inline-end: 48px !important; + } + .me-sm-13 { + margin-inline-end: 52px !important; + } + .me-sm-14 { + margin-inline-end: 56px !important; + } + .me-sm-15 { + margin-inline-end: 60px !important; + } + .me-sm-16 { + margin-inline-end: 64px !important; + } + .me-sm-auto { + margin-inline-end: auto !important; + } + .ma-sm-n1 { + margin: -4px !important; + } + .ma-sm-n2 { + margin: -8px !important; + } + .ma-sm-n3 { + margin: -12px !important; + } + .ma-sm-n4 { + margin: -16px !important; + } + .ma-sm-n5 { + margin: -20px !important; + } + .ma-sm-n6 { + margin: -24px !important; + } + .ma-sm-n7 { + margin: -28px !important; + } + .ma-sm-n8 { + margin: -32px !important; + } + .ma-sm-n9 { + margin: -36px !important; + } + .ma-sm-n10 { + margin: -40px !important; + } + .ma-sm-n11 { + margin: -44px !important; + } + .ma-sm-n12 { + margin: -48px !important; + } + .ma-sm-n13 { + margin: -52px !important; + } + .ma-sm-n14 { + margin: -56px !important; + } + .ma-sm-n15 { + margin: -60px !important; + } + .ma-sm-n16 { + margin: -64px !important; + } + .mx-sm-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-sm-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-sm-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-sm-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-sm-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-sm-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-sm-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-sm-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-sm-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-sm-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-sm-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-sm-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-sm-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-sm-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-sm-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-sm-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-sm-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-sm-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-sm-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-sm-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-sm-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-sm-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-sm-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-sm-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-sm-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-sm-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-sm-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-sm-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-sm-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-sm-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-sm-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-sm-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-sm-n1 { + margin-top: -4px !important; + } + .mt-sm-n2 { + margin-top: -8px !important; + } + .mt-sm-n3 { + margin-top: -12px !important; + } + .mt-sm-n4 { + margin-top: -16px !important; + } + .mt-sm-n5 { + margin-top: -20px !important; + } + .mt-sm-n6 { + margin-top: -24px !important; + } + .mt-sm-n7 { + margin-top: -28px !important; + } + .mt-sm-n8 { + margin-top: -32px !important; + } + .mt-sm-n9 { + margin-top: -36px !important; + } + .mt-sm-n10 { + margin-top: -40px !important; + } + .mt-sm-n11 { + margin-top: -44px !important; + } + .mt-sm-n12 { + margin-top: -48px !important; + } + .mt-sm-n13 { + margin-top: -52px !important; + } + .mt-sm-n14 { + margin-top: -56px !important; + } + .mt-sm-n15 { + margin-top: -60px !important; + } + .mt-sm-n16 { + margin-top: -64px !important; + } + .mr-sm-n1 { + margin-right: -4px !important; + } + .mr-sm-n2 { + margin-right: -8px !important; + } + .mr-sm-n3 { + margin-right: -12px !important; + } + .mr-sm-n4 { + margin-right: -16px !important; + } + .mr-sm-n5 { + margin-right: -20px !important; + } + .mr-sm-n6 { + margin-right: -24px !important; + } + .mr-sm-n7 { + margin-right: -28px !important; + } + .mr-sm-n8 { + margin-right: -32px !important; + } + .mr-sm-n9 { + margin-right: -36px !important; + } + .mr-sm-n10 { + margin-right: -40px !important; + } + .mr-sm-n11 { + margin-right: -44px !important; + } + .mr-sm-n12 { + margin-right: -48px !important; + } + .mr-sm-n13 { + margin-right: -52px !important; + } + .mr-sm-n14 { + margin-right: -56px !important; + } + .mr-sm-n15 { + margin-right: -60px !important; + } + .mr-sm-n16 { + margin-right: -64px !important; + } + .mb-sm-n1 { + margin-bottom: -4px !important; + } + .mb-sm-n2 { + margin-bottom: -8px !important; + } + .mb-sm-n3 { + margin-bottom: -12px !important; + } + .mb-sm-n4 { + margin-bottom: -16px !important; + } + .mb-sm-n5 { + margin-bottom: -20px !important; + } + .mb-sm-n6 { + margin-bottom: -24px !important; + } + .mb-sm-n7 { + margin-bottom: -28px !important; + } + .mb-sm-n8 { + margin-bottom: -32px !important; + } + .mb-sm-n9 { + margin-bottom: -36px !important; + } + .mb-sm-n10 { + margin-bottom: -40px !important; + } + .mb-sm-n11 { + margin-bottom: -44px !important; + } + .mb-sm-n12 { + margin-bottom: -48px !important; + } + .mb-sm-n13 { + margin-bottom: -52px !important; + } + .mb-sm-n14 { + margin-bottom: -56px !important; + } + .mb-sm-n15 { + margin-bottom: -60px !important; + } + .mb-sm-n16 { + margin-bottom: -64px !important; + } + .ml-sm-n1 { + margin-left: -4px !important; + } + .ml-sm-n2 { + margin-left: -8px !important; + } + .ml-sm-n3 { + margin-left: -12px !important; + } + .ml-sm-n4 { + margin-left: -16px !important; + } + .ml-sm-n5 { + margin-left: -20px !important; + } + .ml-sm-n6 { + margin-left: -24px !important; + } + .ml-sm-n7 { + margin-left: -28px !important; + } + .ml-sm-n8 { + margin-left: -32px !important; + } + .ml-sm-n9 { + margin-left: -36px !important; + } + .ml-sm-n10 { + margin-left: -40px !important; + } + .ml-sm-n11 { + margin-left: -44px !important; + } + .ml-sm-n12 { + margin-left: -48px !important; + } + .ml-sm-n13 { + margin-left: -52px !important; + } + .ml-sm-n14 { + margin-left: -56px !important; + } + .ml-sm-n15 { + margin-left: -60px !important; + } + .ml-sm-n16 { + margin-left: -64px !important; + } + .ms-sm-n1 { + margin-inline-start: -4px !important; + } + .ms-sm-n2 { + margin-inline-start: -8px !important; + } + .ms-sm-n3 { + margin-inline-start: -12px !important; + } + .ms-sm-n4 { + margin-inline-start: -16px !important; + } + .ms-sm-n5 { + margin-inline-start: -20px !important; + } + .ms-sm-n6 { + margin-inline-start: -24px !important; + } + .ms-sm-n7 { + margin-inline-start: -28px !important; + } + .ms-sm-n8 { + margin-inline-start: -32px !important; + } + .ms-sm-n9 { + margin-inline-start: -36px !important; + } + .ms-sm-n10 { + margin-inline-start: -40px !important; + } + .ms-sm-n11 { + margin-inline-start: -44px !important; + } + .ms-sm-n12 { + margin-inline-start: -48px !important; + } + .ms-sm-n13 { + margin-inline-start: -52px !important; + } + .ms-sm-n14 { + margin-inline-start: -56px !important; + } + .ms-sm-n15 { + margin-inline-start: -60px !important; + } + .ms-sm-n16 { + margin-inline-start: -64px !important; + } + .me-sm-n1 { + margin-inline-end: -4px !important; + } + .me-sm-n2 { + margin-inline-end: -8px !important; + } + .me-sm-n3 { + margin-inline-end: -12px !important; + } + .me-sm-n4 { + margin-inline-end: -16px !important; + } + .me-sm-n5 { + margin-inline-end: -20px !important; + } + .me-sm-n6 { + margin-inline-end: -24px !important; + } + .me-sm-n7 { + margin-inline-end: -28px !important; + } + .me-sm-n8 { + margin-inline-end: -32px !important; + } + .me-sm-n9 { + margin-inline-end: -36px !important; + } + .me-sm-n10 { + margin-inline-end: -40px !important; + } + .me-sm-n11 { + margin-inline-end: -44px !important; + } + .me-sm-n12 { + margin-inline-end: -48px !important; + } + .me-sm-n13 { + margin-inline-end: -52px !important; + } + .me-sm-n14 { + margin-inline-end: -56px !important; + } + .me-sm-n15 { + margin-inline-end: -60px !important; + } + .me-sm-n16 { + margin-inline-end: -64px !important; + } + .pa-sm-0 { + padding: 0px !important; + } + .pa-sm-1 { + padding: 4px !important; + } + .pa-sm-2 { + padding: 8px !important; + } + .pa-sm-3 { + padding: 12px !important; + } + .pa-sm-4 { + padding: 16px !important; + } + .pa-sm-5 { + padding: 20px !important; + } + .pa-sm-6 { + padding: 24px !important; + } + .pa-sm-7 { + padding: 28px !important; + } + .pa-sm-8 { + padding: 32px !important; + } + .pa-sm-9 { + padding: 36px !important; + } + .pa-sm-10 { + padding: 40px !important; + } + .pa-sm-11 { + padding: 44px !important; + } + .pa-sm-12 { + padding: 48px !important; + } + .pa-sm-13 { + padding: 52px !important; + } + .pa-sm-14 { + padding: 56px !important; + } + .pa-sm-15 { + padding: 60px !important; + } + .pa-sm-16 { + padding: 64px !important; + } + .px-sm-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-sm-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-sm-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-sm-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-sm-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-sm-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-sm-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-sm-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-sm-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-sm-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-sm-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-sm-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-sm-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-sm-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-sm-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-sm-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-sm-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-sm-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-sm-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-sm-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-sm-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-sm-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-sm-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-sm-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-sm-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-sm-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-sm-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-sm-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-sm-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-sm-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-sm-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-sm-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-sm-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-sm-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-sm-0 { + padding-top: 0px !important; + } + .pt-sm-1 { + padding-top: 4px !important; + } + .pt-sm-2 { + padding-top: 8px !important; + } + .pt-sm-3 { + padding-top: 12px !important; + } + .pt-sm-4 { + padding-top: 16px !important; + } + .pt-sm-5 { + padding-top: 20px !important; + } + .pt-sm-6 { + padding-top: 24px !important; + } + .pt-sm-7 { + padding-top: 28px !important; + } + .pt-sm-8 { + padding-top: 32px !important; + } + .pt-sm-9 { + padding-top: 36px !important; + } + .pt-sm-10 { + padding-top: 40px !important; + } + .pt-sm-11 { + padding-top: 44px !important; + } + .pt-sm-12 { + padding-top: 48px !important; + } + .pt-sm-13 { + padding-top: 52px !important; + } + .pt-sm-14 { + padding-top: 56px !important; + } + .pt-sm-15 { + padding-top: 60px !important; + } + .pt-sm-16 { + padding-top: 64px !important; + } + .pr-sm-0 { + padding-right: 0px !important; + } + .pr-sm-1 { + padding-right: 4px !important; + } + .pr-sm-2 { + padding-right: 8px !important; + } + .pr-sm-3 { + padding-right: 12px !important; + } + .pr-sm-4 { + padding-right: 16px !important; + } + .pr-sm-5 { + padding-right: 20px !important; + } + .pr-sm-6 { + padding-right: 24px !important; + } + .pr-sm-7 { + padding-right: 28px !important; + } + .pr-sm-8 { + padding-right: 32px !important; + } + .pr-sm-9 { + padding-right: 36px !important; + } + .pr-sm-10 { + padding-right: 40px !important; + } + .pr-sm-11 { + padding-right: 44px !important; + } + .pr-sm-12 { + padding-right: 48px !important; + } + .pr-sm-13 { + padding-right: 52px !important; + } + .pr-sm-14 { + padding-right: 56px !important; + } + .pr-sm-15 { + padding-right: 60px !important; + } + .pr-sm-16 { + padding-right: 64px !important; + } + .pb-sm-0 { + padding-bottom: 0px !important; + } + .pb-sm-1 { + padding-bottom: 4px !important; + } + .pb-sm-2 { + padding-bottom: 8px !important; + } + .pb-sm-3 { + padding-bottom: 12px !important; + } + .pb-sm-4 { + padding-bottom: 16px !important; + } + .pb-sm-5 { + padding-bottom: 20px !important; + } + .pb-sm-6 { + padding-bottom: 24px !important; + } + .pb-sm-7 { + padding-bottom: 28px !important; + } + .pb-sm-8 { + padding-bottom: 32px !important; + } + .pb-sm-9 { + padding-bottom: 36px !important; + } + .pb-sm-10 { + padding-bottom: 40px !important; + } + .pb-sm-11 { + padding-bottom: 44px !important; + } + .pb-sm-12 { + padding-bottom: 48px !important; + } + .pb-sm-13 { + padding-bottom: 52px !important; + } + .pb-sm-14 { + padding-bottom: 56px !important; + } + .pb-sm-15 { + padding-bottom: 60px !important; + } + .pb-sm-16 { + padding-bottom: 64px !important; + } + .pl-sm-0 { + padding-left: 0px !important; + } + .pl-sm-1 { + padding-left: 4px !important; + } + .pl-sm-2 { + padding-left: 8px !important; + } + .pl-sm-3 { + padding-left: 12px !important; + } + .pl-sm-4 { + padding-left: 16px !important; + } + .pl-sm-5 { + padding-left: 20px !important; + } + .pl-sm-6 { + padding-left: 24px !important; + } + .pl-sm-7 { + padding-left: 28px !important; + } + .pl-sm-8 { + padding-left: 32px !important; + } + .pl-sm-9 { + padding-left: 36px !important; + } + .pl-sm-10 { + padding-left: 40px !important; + } + .pl-sm-11 { + padding-left: 44px !important; + } + .pl-sm-12 { + padding-left: 48px !important; + } + .pl-sm-13 { + padding-left: 52px !important; + } + .pl-sm-14 { + padding-left: 56px !important; + } + .pl-sm-15 { + padding-left: 60px !important; + } + .pl-sm-16 { + padding-left: 64px !important; + } + .ps-sm-0 { + padding-inline-start: 0px !important; + } + .ps-sm-1 { + padding-inline-start: 4px !important; + } + .ps-sm-2 { + padding-inline-start: 8px !important; + } + .ps-sm-3 { + padding-inline-start: 12px !important; + } + .ps-sm-4 { + padding-inline-start: 16px !important; + } + .ps-sm-5 { + padding-inline-start: 20px !important; + } + .ps-sm-6 { + padding-inline-start: 24px !important; + } + .ps-sm-7 { + padding-inline-start: 28px !important; + } + .ps-sm-8 { + padding-inline-start: 32px !important; + } + .ps-sm-9 { + padding-inline-start: 36px !important; + } + .ps-sm-10 { + padding-inline-start: 40px !important; + } + .ps-sm-11 { + padding-inline-start: 44px !important; + } + .ps-sm-12 { + padding-inline-start: 48px !important; + } + .ps-sm-13 { + padding-inline-start: 52px !important; + } + .ps-sm-14 { + padding-inline-start: 56px !important; + } + .ps-sm-15 { + padding-inline-start: 60px !important; + } + .ps-sm-16 { + padding-inline-start: 64px !important; + } + .pe-sm-0 { + padding-inline-end: 0px !important; + } + .pe-sm-1 { + padding-inline-end: 4px !important; + } + .pe-sm-2 { + padding-inline-end: 8px !important; + } + .pe-sm-3 { + padding-inline-end: 12px !important; + } + .pe-sm-4 { + padding-inline-end: 16px !important; + } + .pe-sm-5 { + padding-inline-end: 20px !important; + } + .pe-sm-6 { + padding-inline-end: 24px !important; + } + .pe-sm-7 { + padding-inline-end: 28px !important; + } + .pe-sm-8 { + padding-inline-end: 32px !important; + } + .pe-sm-9 { + padding-inline-end: 36px !important; + } + .pe-sm-10 { + padding-inline-end: 40px !important; + } + .pe-sm-11 { + padding-inline-end: 44px !important; + } + .pe-sm-12 { + padding-inline-end: 48px !important; + } + .pe-sm-13 { + padding-inline-end: 52px !important; + } + .pe-sm-14 { + padding-inline-end: 56px !important; + } + .pe-sm-15 { + padding-inline-end: 60px !important; + } + .pe-sm-16 { + padding-inline-end: 64px !important; + } + .text-sm-left { + text-align: left !important; + } + .text-sm-right { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } + .text-sm-justify { + text-align: justify !important; + } + .text-sm-start { + text-align: start !important; + } + .text-sm-end { + text-align: end !important; + } + .text-sm-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-sm-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-sm-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-sm-auto { + height: auto !important; + } + .h-sm-screen { + height: 100vh !important; + } + .h-sm-0 { + height: 0 !important; + } + .h-sm-25 { + height: 25% !important; + } + .h-sm-50 { + height: 50% !important; + } + .h-sm-75 { + height: 75% !important; + } + .h-sm-100 { + height: 100% !important; + } + .w-sm-auto { + width: auto !important; + } + .w-sm-0 { + width: 0 !important; + } + .w-sm-25 { + width: 25% !important; + } + .w-sm-33 { + width: 33% !important; + } + .w-sm-50 { + width: 50% !important; + } + .w-sm-66 { + width: 66% !important; + } + .w-sm-75 { + width: 75% !important; + } + .w-sm-100 { + width: 100% !important; + } +} +@media (min-width: 960px) { + .d-md-none { + display: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .float-md-none { + float: none !important; + } + .float-md-left { + float: left !important; + } + .float-md-right { + float: right !important; + } + .v-locale--is-rtl .float-md-end { + float: left !important; + } + .v-locale--is-rtl .float-md-start { + float: right !important; + } + .v-locale--is-ltr .float-md-end { + float: right !important; + } + .v-locale--is-ltr .float-md-start { + float: left !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-1-1 { + flex: 1 1 auto !important; + } + .flex-md-1-0 { + flex: 1 0 auto !important; + } + .flex-md-0-1 { + flex: 0 1 auto !important; + } + .flex-md-0-0 { + flex: 0 0 auto !important; + } + .flex-md-1-1-100 { + flex: 1 1 100% !important; + } + .flex-md-1-0-100 { + flex: 1 0 100% !important; + } + .flex-md-0-1-100 { + flex: 0 1 100% !important; + } + .flex-md-0-0-100 { + flex: 0 0 100% !important; + } + .flex-md-1-1-0 { + flex: 1 1 0 !important; + } + .flex-md-1-0-0 { + flex: 1 0 0 !important; + } + .flex-md-0-1-0 { + flex: 0 1 0 !important; + } + .flex-md-0-0-0 { + flex: 0 0 0 !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-md-start { + justify-content: flex-start !important; + } + .justify-md-end { + justify-content: flex-end !important; + } + .justify-md-center { + justify-content: center !important; + } + .justify-md-space-between { + justify-content: space-between !important; + } + .justify-md-space-around { + justify-content: space-around !important; + } + .justify-md-space-evenly { + justify-content: space-evenly !important; + } + .align-md-start { + align-items: flex-start !important; + } + .align-md-end { + align-items: flex-end !important; + } + .align-md-center { + align-items: center !important; + } + .align-md-baseline { + align-items: baseline !important; + } + .align-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-space-between { + align-content: space-between !important; + } + .align-content-md-space-around { + align-content: space-around !important; + } + .align-content-md-space-evenly { + align-content: space-evenly !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-6 { + order: 6 !important; + } + .order-md-7 { + order: 7 !important; + } + .order-md-8 { + order: 8 !important; + } + .order-md-9 { + order: 9 !important; + } + .order-md-10 { + order: 10 !important; + } + .order-md-11 { + order: 11 !important; + } + .order-md-12 { + order: 12 !important; + } + .order-md-last { + order: 13 !important; + } + .ga-md-0 { + gap: 0px !important; + } + .ga-md-1 { + gap: 4px !important; + } + .ga-md-2 { + gap: 8px !important; + } + .ga-md-3 { + gap: 12px !important; + } + .ga-md-4 { + gap: 16px !important; + } + .ga-md-5 { + gap: 20px !important; + } + .ga-md-6 { + gap: 24px !important; + } + .ga-md-7 { + gap: 28px !important; + } + .ga-md-8 { + gap: 32px !important; + } + .ga-md-9 { + gap: 36px !important; + } + .ga-md-10 { + gap: 40px !important; + } + .ga-md-11 { + gap: 44px !important; + } + .ga-md-12 { + gap: 48px !important; + } + .ga-md-13 { + gap: 52px !important; + } + .ga-md-14 { + gap: 56px !important; + } + .ga-md-15 { + gap: 60px !important; + } + .ga-md-16 { + gap: 64px !important; + } + .ga-md-auto { + gap: auto !important; + } + .gr-md-0 { + row-gap: 0px !important; + } + .gr-md-1 { + row-gap: 4px !important; + } + .gr-md-2 { + row-gap: 8px !important; + } + .gr-md-3 { + row-gap: 12px !important; + } + .gr-md-4 { + row-gap: 16px !important; + } + .gr-md-5 { + row-gap: 20px !important; + } + .gr-md-6 { + row-gap: 24px !important; + } + .gr-md-7 { + row-gap: 28px !important; + } + .gr-md-8 { + row-gap: 32px !important; + } + .gr-md-9 { + row-gap: 36px !important; + } + .gr-md-10 { + row-gap: 40px !important; + } + .gr-md-11 { + row-gap: 44px !important; + } + .gr-md-12 { + row-gap: 48px !important; + } + .gr-md-13 { + row-gap: 52px !important; + } + .gr-md-14 { + row-gap: 56px !important; + } + .gr-md-15 { + row-gap: 60px !important; + } + .gr-md-16 { + row-gap: 64px !important; + } + .gr-md-auto { + row-gap: auto !important; + } + .gc-md-0 { + column-gap: 0px !important; + } + .gc-md-1 { + column-gap: 4px !important; + } + .gc-md-2 { + column-gap: 8px !important; + } + .gc-md-3 { + column-gap: 12px !important; + } + .gc-md-4 { + column-gap: 16px !important; + } + .gc-md-5 { + column-gap: 20px !important; + } + .gc-md-6 { + column-gap: 24px !important; + } + .gc-md-7 { + column-gap: 28px !important; + } + .gc-md-8 { + column-gap: 32px !important; + } + .gc-md-9 { + column-gap: 36px !important; + } + .gc-md-10 { + column-gap: 40px !important; + } + .gc-md-11 { + column-gap: 44px !important; + } + .gc-md-12 { + column-gap: 48px !important; + } + .gc-md-13 { + column-gap: 52px !important; + } + .gc-md-14 { + column-gap: 56px !important; + } + .gc-md-15 { + column-gap: 60px !important; + } + .gc-md-16 { + column-gap: 64px !important; + } + .gc-md-auto { + column-gap: auto !important; + } + .ma-md-0 { + margin: 0px !important; + } + .ma-md-1 { + margin: 4px !important; + } + .ma-md-2 { + margin: 8px !important; + } + .ma-md-3 { + margin: 12px !important; + } + .ma-md-4 { + margin: 16px !important; + } + .ma-md-5 { + margin: 20px !important; + } + .ma-md-6 { + margin: 24px !important; + } + .ma-md-7 { + margin: 28px !important; + } + .ma-md-8 { + margin: 32px !important; + } + .ma-md-9 { + margin: 36px !important; + } + .ma-md-10 { + margin: 40px !important; + } + .ma-md-11 { + margin: 44px !important; + } + .ma-md-12 { + margin: 48px !important; + } + .ma-md-13 { + margin: 52px !important; + } + .ma-md-14 { + margin: 56px !important; + } + .ma-md-15 { + margin: 60px !important; + } + .ma-md-16 { + margin: 64px !important; + } + .ma-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-md-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-md-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-md-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-md-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-md-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-md-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-md-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-md-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-md-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-md-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-md-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-md-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-md-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-md-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-md-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-md-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-md-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-md-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-md-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-md-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-md-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-md-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-md-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-md-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-md-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-md-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-md-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-md-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-md-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-md-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-md-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-md-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0px !important; + } + .mt-md-1 { + margin-top: 4px !important; + } + .mt-md-2 { + margin-top: 8px !important; + } + .mt-md-3 { + margin-top: 12px !important; + } + .mt-md-4 { + margin-top: 16px !important; + } + .mt-md-5 { + margin-top: 20px !important; + } + .mt-md-6 { + margin-top: 24px !important; + } + .mt-md-7 { + margin-top: 28px !important; + } + .mt-md-8 { + margin-top: 32px !important; + } + .mt-md-9 { + margin-top: 36px !important; + } + .mt-md-10 { + margin-top: 40px !important; + } + .mt-md-11 { + margin-top: 44px !important; + } + .mt-md-12 { + margin-top: 48px !important; + } + .mt-md-13 { + margin-top: 52px !important; + } + .mt-md-14 { + margin-top: 56px !important; + } + .mt-md-15 { + margin-top: 60px !important; + } + .mt-md-16 { + margin-top: 64px !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .mr-md-0 { + margin-right: 0px !important; + } + .mr-md-1 { + margin-right: 4px !important; + } + .mr-md-2 { + margin-right: 8px !important; + } + .mr-md-3 { + margin-right: 12px !important; + } + .mr-md-4 { + margin-right: 16px !important; + } + .mr-md-5 { + margin-right: 20px !important; + } + .mr-md-6 { + margin-right: 24px !important; + } + .mr-md-7 { + margin-right: 28px !important; + } + .mr-md-8 { + margin-right: 32px !important; + } + .mr-md-9 { + margin-right: 36px !important; + } + .mr-md-10 { + margin-right: 40px !important; + } + .mr-md-11 { + margin-right: 44px !important; + } + .mr-md-12 { + margin-right: 48px !important; + } + .mr-md-13 { + margin-right: 52px !important; + } + .mr-md-14 { + margin-right: 56px !important; + } + .mr-md-15 { + margin-right: 60px !important; + } + .mr-md-16 { + margin-right: 64px !important; + } + .mr-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0px !important; + } + .mb-md-1 { + margin-bottom: 4px !important; + } + .mb-md-2 { + margin-bottom: 8px !important; + } + .mb-md-3 { + margin-bottom: 12px !important; + } + .mb-md-4 { + margin-bottom: 16px !important; + } + .mb-md-5 { + margin-bottom: 20px !important; + } + .mb-md-6 { + margin-bottom: 24px !important; + } + .mb-md-7 { + margin-bottom: 28px !important; + } + .mb-md-8 { + margin-bottom: 32px !important; + } + .mb-md-9 { + margin-bottom: 36px !important; + } + .mb-md-10 { + margin-bottom: 40px !important; + } + .mb-md-11 { + margin-bottom: 44px !important; + } + .mb-md-12 { + margin-bottom: 48px !important; + } + .mb-md-13 { + margin-bottom: 52px !important; + } + .mb-md-14 { + margin-bottom: 56px !important; + } + .mb-md-15 { + margin-bottom: 60px !important; + } + .mb-md-16 { + margin-bottom: 64px !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ml-md-0 { + margin-left: 0px !important; + } + .ml-md-1 { + margin-left: 4px !important; + } + .ml-md-2 { + margin-left: 8px !important; + } + .ml-md-3 { + margin-left: 12px !important; + } + .ml-md-4 { + margin-left: 16px !important; + } + .ml-md-5 { + margin-left: 20px !important; + } + .ml-md-6 { + margin-left: 24px !important; + } + .ml-md-7 { + margin-left: 28px !important; + } + .ml-md-8 { + margin-left: 32px !important; + } + .ml-md-9 { + margin-left: 36px !important; + } + .ml-md-10 { + margin-left: 40px !important; + } + .ml-md-11 { + margin-left: 44px !important; + } + .ml-md-12 { + margin-left: 48px !important; + } + .ml-md-13 { + margin-left: 52px !important; + } + .ml-md-14 { + margin-left: 56px !important; + } + .ml-md-15 { + margin-left: 60px !important; + } + .ml-md-16 { + margin-left: 64px !important; + } + .ml-md-auto { + margin-left: auto !important; + } + .ms-md-0 { + margin-inline-start: 0px !important; + } + .ms-md-1 { + margin-inline-start: 4px !important; + } + .ms-md-2 { + margin-inline-start: 8px !important; + } + .ms-md-3 { + margin-inline-start: 12px !important; + } + .ms-md-4 { + margin-inline-start: 16px !important; + } + .ms-md-5 { + margin-inline-start: 20px !important; + } + .ms-md-6 { + margin-inline-start: 24px !important; + } + .ms-md-7 { + margin-inline-start: 28px !important; + } + .ms-md-8 { + margin-inline-start: 32px !important; + } + .ms-md-9 { + margin-inline-start: 36px !important; + } + .ms-md-10 { + margin-inline-start: 40px !important; + } + .ms-md-11 { + margin-inline-start: 44px !important; + } + .ms-md-12 { + margin-inline-start: 48px !important; + } + .ms-md-13 { + margin-inline-start: 52px !important; + } + .ms-md-14 { + margin-inline-start: 56px !important; + } + .ms-md-15 { + margin-inline-start: 60px !important; + } + .ms-md-16 { + margin-inline-start: 64px !important; + } + .ms-md-auto { + margin-inline-start: auto !important; + } + .me-md-0 { + margin-inline-end: 0px !important; + } + .me-md-1 { + margin-inline-end: 4px !important; + } + .me-md-2 { + margin-inline-end: 8px !important; + } + .me-md-3 { + margin-inline-end: 12px !important; + } + .me-md-4 { + margin-inline-end: 16px !important; + } + .me-md-5 { + margin-inline-end: 20px !important; + } + .me-md-6 { + margin-inline-end: 24px !important; + } + .me-md-7 { + margin-inline-end: 28px !important; + } + .me-md-8 { + margin-inline-end: 32px !important; + } + .me-md-9 { + margin-inline-end: 36px !important; + } + .me-md-10 { + margin-inline-end: 40px !important; + } + .me-md-11 { + margin-inline-end: 44px !important; + } + .me-md-12 { + margin-inline-end: 48px !important; + } + .me-md-13 { + margin-inline-end: 52px !important; + } + .me-md-14 { + margin-inline-end: 56px !important; + } + .me-md-15 { + margin-inline-end: 60px !important; + } + .me-md-16 { + margin-inline-end: 64px !important; + } + .me-md-auto { + margin-inline-end: auto !important; + } + .ma-md-n1 { + margin: -4px !important; + } + .ma-md-n2 { + margin: -8px !important; + } + .ma-md-n3 { + margin: -12px !important; + } + .ma-md-n4 { + margin: -16px !important; + } + .ma-md-n5 { + margin: -20px !important; + } + .ma-md-n6 { + margin: -24px !important; + } + .ma-md-n7 { + margin: -28px !important; + } + .ma-md-n8 { + margin: -32px !important; + } + .ma-md-n9 { + margin: -36px !important; + } + .ma-md-n10 { + margin: -40px !important; + } + .ma-md-n11 { + margin: -44px !important; + } + .ma-md-n12 { + margin: -48px !important; + } + .ma-md-n13 { + margin: -52px !important; + } + .ma-md-n14 { + margin: -56px !important; + } + .ma-md-n15 { + margin: -60px !important; + } + .ma-md-n16 { + margin: -64px !important; + } + .mx-md-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-md-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-md-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-md-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-md-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-md-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-md-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-md-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-md-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-md-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-md-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-md-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-md-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-md-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-md-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-md-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-md-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-md-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-md-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-md-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-md-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-md-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-md-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-md-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-md-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-md-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-md-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-md-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-md-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-md-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-md-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-md-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-md-n1 { + margin-top: -4px !important; + } + .mt-md-n2 { + margin-top: -8px !important; + } + .mt-md-n3 { + margin-top: -12px !important; + } + .mt-md-n4 { + margin-top: -16px !important; + } + .mt-md-n5 { + margin-top: -20px !important; + } + .mt-md-n6 { + margin-top: -24px !important; + } + .mt-md-n7 { + margin-top: -28px !important; + } + .mt-md-n8 { + margin-top: -32px !important; + } + .mt-md-n9 { + margin-top: -36px !important; + } + .mt-md-n10 { + margin-top: -40px !important; + } + .mt-md-n11 { + margin-top: -44px !important; + } + .mt-md-n12 { + margin-top: -48px !important; + } + .mt-md-n13 { + margin-top: -52px !important; + } + .mt-md-n14 { + margin-top: -56px !important; + } + .mt-md-n15 { + margin-top: -60px !important; + } + .mt-md-n16 { + margin-top: -64px !important; + } + .mr-md-n1 { + margin-right: -4px !important; + } + .mr-md-n2 { + margin-right: -8px !important; + } + .mr-md-n3 { + margin-right: -12px !important; + } + .mr-md-n4 { + margin-right: -16px !important; + } + .mr-md-n5 { + margin-right: -20px !important; + } + .mr-md-n6 { + margin-right: -24px !important; + } + .mr-md-n7 { + margin-right: -28px !important; + } + .mr-md-n8 { + margin-right: -32px !important; + } + .mr-md-n9 { + margin-right: -36px !important; + } + .mr-md-n10 { + margin-right: -40px !important; + } + .mr-md-n11 { + margin-right: -44px !important; + } + .mr-md-n12 { + margin-right: -48px !important; + } + .mr-md-n13 { + margin-right: -52px !important; + } + .mr-md-n14 { + margin-right: -56px !important; + } + .mr-md-n15 { + margin-right: -60px !important; + } + .mr-md-n16 { + margin-right: -64px !important; + } + .mb-md-n1 { + margin-bottom: -4px !important; + } + .mb-md-n2 { + margin-bottom: -8px !important; + } + .mb-md-n3 { + margin-bottom: -12px !important; + } + .mb-md-n4 { + margin-bottom: -16px !important; + } + .mb-md-n5 { + margin-bottom: -20px !important; + } + .mb-md-n6 { + margin-bottom: -24px !important; + } + .mb-md-n7 { + margin-bottom: -28px !important; + } + .mb-md-n8 { + margin-bottom: -32px !important; + } + .mb-md-n9 { + margin-bottom: -36px !important; + } + .mb-md-n10 { + margin-bottom: -40px !important; + } + .mb-md-n11 { + margin-bottom: -44px !important; + } + .mb-md-n12 { + margin-bottom: -48px !important; + } + .mb-md-n13 { + margin-bottom: -52px !important; + } + .mb-md-n14 { + margin-bottom: -56px !important; + } + .mb-md-n15 { + margin-bottom: -60px !important; + } + .mb-md-n16 { + margin-bottom: -64px !important; + } + .ml-md-n1 { + margin-left: -4px !important; + } + .ml-md-n2 { + margin-left: -8px !important; + } + .ml-md-n3 { + margin-left: -12px !important; + } + .ml-md-n4 { + margin-left: -16px !important; + } + .ml-md-n5 { + margin-left: -20px !important; + } + .ml-md-n6 { + margin-left: -24px !important; + } + .ml-md-n7 { + margin-left: -28px !important; + } + .ml-md-n8 { + margin-left: -32px !important; + } + .ml-md-n9 { + margin-left: -36px !important; + } + .ml-md-n10 { + margin-left: -40px !important; + } + .ml-md-n11 { + margin-left: -44px !important; + } + .ml-md-n12 { + margin-left: -48px !important; + } + .ml-md-n13 { + margin-left: -52px !important; + } + .ml-md-n14 { + margin-left: -56px !important; + } + .ml-md-n15 { + margin-left: -60px !important; + } + .ml-md-n16 { + margin-left: -64px !important; + } + .ms-md-n1 { + margin-inline-start: -4px !important; + } + .ms-md-n2 { + margin-inline-start: -8px !important; + } + .ms-md-n3 { + margin-inline-start: -12px !important; + } + .ms-md-n4 { + margin-inline-start: -16px !important; + } + .ms-md-n5 { + margin-inline-start: -20px !important; + } + .ms-md-n6 { + margin-inline-start: -24px !important; + } + .ms-md-n7 { + margin-inline-start: -28px !important; + } + .ms-md-n8 { + margin-inline-start: -32px !important; + } + .ms-md-n9 { + margin-inline-start: -36px !important; + } + .ms-md-n10 { + margin-inline-start: -40px !important; + } + .ms-md-n11 { + margin-inline-start: -44px !important; + } + .ms-md-n12 { + margin-inline-start: -48px !important; + } + .ms-md-n13 { + margin-inline-start: -52px !important; + } + .ms-md-n14 { + margin-inline-start: -56px !important; + } + .ms-md-n15 { + margin-inline-start: -60px !important; + } + .ms-md-n16 { + margin-inline-start: -64px !important; + } + .me-md-n1 { + margin-inline-end: -4px !important; + } + .me-md-n2 { + margin-inline-end: -8px !important; + } + .me-md-n3 { + margin-inline-end: -12px !important; + } + .me-md-n4 { + margin-inline-end: -16px !important; + } + .me-md-n5 { + margin-inline-end: -20px !important; + } + .me-md-n6 { + margin-inline-end: -24px !important; + } + .me-md-n7 { + margin-inline-end: -28px !important; + } + .me-md-n8 { + margin-inline-end: -32px !important; + } + .me-md-n9 { + margin-inline-end: -36px !important; + } + .me-md-n10 { + margin-inline-end: -40px !important; + } + .me-md-n11 { + margin-inline-end: -44px !important; + } + .me-md-n12 { + margin-inline-end: -48px !important; + } + .me-md-n13 { + margin-inline-end: -52px !important; + } + .me-md-n14 { + margin-inline-end: -56px !important; + } + .me-md-n15 { + margin-inline-end: -60px !important; + } + .me-md-n16 { + margin-inline-end: -64px !important; + } + .pa-md-0 { + padding: 0px !important; + } + .pa-md-1 { + padding: 4px !important; + } + .pa-md-2 { + padding: 8px !important; + } + .pa-md-3 { + padding: 12px !important; + } + .pa-md-4 { + padding: 16px !important; + } + .pa-md-5 { + padding: 20px !important; + } + .pa-md-6 { + padding: 24px !important; + } + .pa-md-7 { + padding: 28px !important; + } + .pa-md-8 { + padding: 32px !important; + } + .pa-md-9 { + padding: 36px !important; + } + .pa-md-10 { + padding: 40px !important; + } + .pa-md-11 { + padding: 44px !important; + } + .pa-md-12 { + padding: 48px !important; + } + .pa-md-13 { + padding: 52px !important; + } + .pa-md-14 { + padding: 56px !important; + } + .pa-md-15 { + padding: 60px !important; + } + .pa-md-16 { + padding: 64px !important; + } + .px-md-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-md-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-md-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-md-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-md-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-md-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-md-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-md-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-md-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-md-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-md-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-md-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-md-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-md-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-md-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-md-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-md-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-md-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-md-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-md-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-md-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-md-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-md-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-md-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-md-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-md-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-md-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-md-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-md-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-md-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-md-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-md-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-md-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-md-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-md-0 { + padding-top: 0px !important; + } + .pt-md-1 { + padding-top: 4px !important; + } + .pt-md-2 { + padding-top: 8px !important; + } + .pt-md-3 { + padding-top: 12px !important; + } + .pt-md-4 { + padding-top: 16px !important; + } + .pt-md-5 { + padding-top: 20px !important; + } + .pt-md-6 { + padding-top: 24px !important; + } + .pt-md-7 { + padding-top: 28px !important; + } + .pt-md-8 { + padding-top: 32px !important; + } + .pt-md-9 { + padding-top: 36px !important; + } + .pt-md-10 { + padding-top: 40px !important; + } + .pt-md-11 { + padding-top: 44px !important; + } + .pt-md-12 { + padding-top: 48px !important; + } + .pt-md-13 { + padding-top: 52px !important; + } + .pt-md-14 { + padding-top: 56px !important; + } + .pt-md-15 { + padding-top: 60px !important; + } + .pt-md-16 { + padding-top: 64px !important; + } + .pr-md-0 { + padding-right: 0px !important; + } + .pr-md-1 { + padding-right: 4px !important; + } + .pr-md-2 { + padding-right: 8px !important; + } + .pr-md-3 { + padding-right: 12px !important; + } + .pr-md-4 { + padding-right: 16px !important; + } + .pr-md-5 { + padding-right: 20px !important; + } + .pr-md-6 { + padding-right: 24px !important; + } + .pr-md-7 { + padding-right: 28px !important; + } + .pr-md-8 { + padding-right: 32px !important; + } + .pr-md-9 { + padding-right: 36px !important; + } + .pr-md-10 { + padding-right: 40px !important; + } + .pr-md-11 { + padding-right: 44px !important; + } + .pr-md-12 { + padding-right: 48px !important; + } + .pr-md-13 { + padding-right: 52px !important; + } + .pr-md-14 { + padding-right: 56px !important; + } + .pr-md-15 { + padding-right: 60px !important; + } + .pr-md-16 { + padding-right: 64px !important; + } + .pb-md-0 { + padding-bottom: 0px !important; + } + .pb-md-1 { + padding-bottom: 4px !important; + } + .pb-md-2 { + padding-bottom: 8px !important; + } + .pb-md-3 { + padding-bottom: 12px !important; + } + .pb-md-4 { + padding-bottom: 16px !important; + } + .pb-md-5 { + padding-bottom: 20px !important; + } + .pb-md-6 { + padding-bottom: 24px !important; + } + .pb-md-7 { + padding-bottom: 28px !important; + } + .pb-md-8 { + padding-bottom: 32px !important; + } + .pb-md-9 { + padding-bottom: 36px !important; + } + .pb-md-10 { + padding-bottom: 40px !important; + } + .pb-md-11 { + padding-bottom: 44px !important; + } + .pb-md-12 { + padding-bottom: 48px !important; + } + .pb-md-13 { + padding-bottom: 52px !important; + } + .pb-md-14 { + padding-bottom: 56px !important; + } + .pb-md-15 { + padding-bottom: 60px !important; + } + .pb-md-16 { + padding-bottom: 64px !important; + } + .pl-md-0 { + padding-left: 0px !important; + } + .pl-md-1 { + padding-left: 4px !important; + } + .pl-md-2 { + padding-left: 8px !important; + } + .pl-md-3 { + padding-left: 12px !important; + } + .pl-md-4 { + padding-left: 16px !important; + } + .pl-md-5 { + padding-left: 20px !important; + } + .pl-md-6 { + padding-left: 24px !important; + } + .pl-md-7 { + padding-left: 28px !important; + } + .pl-md-8 { + padding-left: 32px !important; + } + .pl-md-9 { + padding-left: 36px !important; + } + .pl-md-10 { + padding-left: 40px !important; + } + .pl-md-11 { + padding-left: 44px !important; + } + .pl-md-12 { + padding-left: 48px !important; + } + .pl-md-13 { + padding-left: 52px !important; + } + .pl-md-14 { + padding-left: 56px !important; + } + .pl-md-15 { + padding-left: 60px !important; + } + .pl-md-16 { + padding-left: 64px !important; + } + .ps-md-0 { + padding-inline-start: 0px !important; + } + .ps-md-1 { + padding-inline-start: 4px !important; + } + .ps-md-2 { + padding-inline-start: 8px !important; + } + .ps-md-3 { + padding-inline-start: 12px !important; + } + .ps-md-4 { + padding-inline-start: 16px !important; + } + .ps-md-5 { + padding-inline-start: 20px !important; + } + .ps-md-6 { + padding-inline-start: 24px !important; + } + .ps-md-7 { + padding-inline-start: 28px !important; + } + .ps-md-8 { + padding-inline-start: 32px !important; + } + .ps-md-9 { + padding-inline-start: 36px !important; + } + .ps-md-10 { + padding-inline-start: 40px !important; + } + .ps-md-11 { + padding-inline-start: 44px !important; + } + .ps-md-12 { + padding-inline-start: 48px !important; + } + .ps-md-13 { + padding-inline-start: 52px !important; + } + .ps-md-14 { + padding-inline-start: 56px !important; + } + .ps-md-15 { + padding-inline-start: 60px !important; + } + .ps-md-16 { + padding-inline-start: 64px !important; + } + .pe-md-0 { + padding-inline-end: 0px !important; + } + .pe-md-1 { + padding-inline-end: 4px !important; + } + .pe-md-2 { + padding-inline-end: 8px !important; + } + .pe-md-3 { + padding-inline-end: 12px !important; + } + .pe-md-4 { + padding-inline-end: 16px !important; + } + .pe-md-5 { + padding-inline-end: 20px !important; + } + .pe-md-6 { + padding-inline-end: 24px !important; + } + .pe-md-7 { + padding-inline-end: 28px !important; + } + .pe-md-8 { + padding-inline-end: 32px !important; + } + .pe-md-9 { + padding-inline-end: 36px !important; + } + .pe-md-10 { + padding-inline-end: 40px !important; + } + .pe-md-11 { + padding-inline-end: 44px !important; + } + .pe-md-12 { + padding-inline-end: 48px !important; + } + .pe-md-13 { + padding-inline-end: 52px !important; + } + .pe-md-14 { + padding-inline-end: 56px !important; + } + .pe-md-15 { + padding-inline-end: 60px !important; + } + .pe-md-16 { + padding-inline-end: 64px !important; + } + .text-md-left { + text-align: left !important; + } + .text-md-right { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } + .text-md-justify { + text-align: justify !important; + } + .text-md-start { + text-align: start !important; + } + .text-md-end { + text-align: end !important; + } + .text-md-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-md-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-md-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-md-auto { + height: auto !important; + } + .h-md-screen { + height: 100vh !important; + } + .h-md-0 { + height: 0 !important; + } + .h-md-25 { + height: 25% !important; + } + .h-md-50 { + height: 50% !important; + } + .h-md-75 { + height: 75% !important; + } + .h-md-100 { + height: 100% !important; + } + .w-md-auto { + width: auto !important; + } + .w-md-0 { + width: 0 !important; + } + .w-md-25 { + width: 25% !important; + } + .w-md-33 { + width: 33% !important; + } + .w-md-50 { + width: 50% !important; + } + .w-md-66 { + width: 66% !important; + } + .w-md-75 { + width: 75% !important; + } + .w-md-100 { + width: 100% !important; + } +} +@media (min-width: 1280px) { + .d-lg-none { + display: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .float-lg-none { + float: none !important; + } + .float-lg-left { + float: left !important; + } + .float-lg-right { + float: right !important; + } + .v-locale--is-rtl .float-lg-end { + float: left !important; + } + .v-locale--is-rtl .float-lg-start { + float: right !important; + } + .v-locale--is-ltr .float-lg-end { + float: right !important; + } + .v-locale--is-ltr .float-lg-start { + float: left !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-1-1 { + flex: 1 1 auto !important; + } + .flex-lg-1-0 { + flex: 1 0 auto !important; + } + .flex-lg-0-1 { + flex: 0 1 auto !important; + } + .flex-lg-0-0 { + flex: 0 0 auto !important; + } + .flex-lg-1-1-100 { + flex: 1 1 100% !important; + } + .flex-lg-1-0-100 { + flex: 1 0 100% !important; + } + .flex-lg-0-1-100 { + flex: 0 1 100% !important; + } + .flex-lg-0-0-100 { + flex: 0 0 100% !important; + } + .flex-lg-1-1-0 { + flex: 1 1 0 !important; + } + .flex-lg-1-0-0 { + flex: 1 0 0 !important; + } + .flex-lg-0-1-0 { + flex: 0 1 0 !important; + } + .flex-lg-0-0-0 { + flex: 0 0 0 !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-lg-start { + justify-content: flex-start !important; + } + .justify-lg-end { + justify-content: flex-end !important; + } + .justify-lg-center { + justify-content: center !important; + } + .justify-lg-space-between { + justify-content: space-between !important; + } + .justify-lg-space-around { + justify-content: space-around !important; + } + .justify-lg-space-evenly { + justify-content: space-evenly !important; + } + .align-lg-start { + align-items: flex-start !important; + } + .align-lg-end { + align-items: flex-end !important; + } + .align-lg-center { + align-items: center !important; + } + .align-lg-baseline { + align-items: baseline !important; + } + .align-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-space-between { + align-content: space-between !important; + } + .align-content-lg-space-around { + align-content: space-around !important; + } + .align-content-lg-space-evenly { + align-content: space-evenly !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-6 { + order: 6 !important; + } + .order-lg-7 { + order: 7 !important; + } + .order-lg-8 { + order: 8 !important; + } + .order-lg-9 { + order: 9 !important; + } + .order-lg-10 { + order: 10 !important; + } + .order-lg-11 { + order: 11 !important; + } + .order-lg-12 { + order: 12 !important; + } + .order-lg-last { + order: 13 !important; + } + .ga-lg-0 { + gap: 0px !important; + } + .ga-lg-1 { + gap: 4px !important; + } + .ga-lg-2 { + gap: 8px !important; + } + .ga-lg-3 { + gap: 12px !important; + } + .ga-lg-4 { + gap: 16px !important; + } + .ga-lg-5 { + gap: 20px !important; + } + .ga-lg-6 { + gap: 24px !important; + } + .ga-lg-7 { + gap: 28px !important; + } + .ga-lg-8 { + gap: 32px !important; + } + .ga-lg-9 { + gap: 36px !important; + } + .ga-lg-10 { + gap: 40px !important; + } + .ga-lg-11 { + gap: 44px !important; + } + .ga-lg-12 { + gap: 48px !important; + } + .ga-lg-13 { + gap: 52px !important; + } + .ga-lg-14 { + gap: 56px !important; + } + .ga-lg-15 { + gap: 60px !important; + } + .ga-lg-16 { + gap: 64px !important; + } + .ga-lg-auto { + gap: auto !important; + } + .gr-lg-0 { + row-gap: 0px !important; + } + .gr-lg-1 { + row-gap: 4px !important; + } + .gr-lg-2 { + row-gap: 8px !important; + } + .gr-lg-3 { + row-gap: 12px !important; + } + .gr-lg-4 { + row-gap: 16px !important; + } + .gr-lg-5 { + row-gap: 20px !important; + } + .gr-lg-6 { + row-gap: 24px !important; + } + .gr-lg-7 { + row-gap: 28px !important; + } + .gr-lg-8 { + row-gap: 32px !important; + } + .gr-lg-9 { + row-gap: 36px !important; + } + .gr-lg-10 { + row-gap: 40px !important; + } + .gr-lg-11 { + row-gap: 44px !important; + } + .gr-lg-12 { + row-gap: 48px !important; + } + .gr-lg-13 { + row-gap: 52px !important; + } + .gr-lg-14 { + row-gap: 56px !important; + } + .gr-lg-15 { + row-gap: 60px !important; + } + .gr-lg-16 { + row-gap: 64px !important; + } + .gr-lg-auto { + row-gap: auto !important; + } + .gc-lg-0 { + column-gap: 0px !important; + } + .gc-lg-1 { + column-gap: 4px !important; + } + .gc-lg-2 { + column-gap: 8px !important; + } + .gc-lg-3 { + column-gap: 12px !important; + } + .gc-lg-4 { + column-gap: 16px !important; + } + .gc-lg-5 { + column-gap: 20px !important; + } + .gc-lg-6 { + column-gap: 24px !important; + } + .gc-lg-7 { + column-gap: 28px !important; + } + .gc-lg-8 { + column-gap: 32px !important; + } + .gc-lg-9 { + column-gap: 36px !important; + } + .gc-lg-10 { + column-gap: 40px !important; + } + .gc-lg-11 { + column-gap: 44px !important; + } + .gc-lg-12 { + column-gap: 48px !important; + } + .gc-lg-13 { + column-gap: 52px !important; + } + .gc-lg-14 { + column-gap: 56px !important; + } + .gc-lg-15 { + column-gap: 60px !important; + } + .gc-lg-16 { + column-gap: 64px !important; + } + .gc-lg-auto { + column-gap: auto !important; + } + .ma-lg-0 { + margin: 0px !important; + } + .ma-lg-1 { + margin: 4px !important; + } + .ma-lg-2 { + margin: 8px !important; + } + .ma-lg-3 { + margin: 12px !important; + } + .ma-lg-4 { + margin: 16px !important; + } + .ma-lg-5 { + margin: 20px !important; + } + .ma-lg-6 { + margin: 24px !important; + } + .ma-lg-7 { + margin: 28px !important; + } + .ma-lg-8 { + margin: 32px !important; + } + .ma-lg-9 { + margin: 36px !important; + } + .ma-lg-10 { + margin: 40px !important; + } + .ma-lg-11 { + margin: 44px !important; + } + .ma-lg-12 { + margin: 48px !important; + } + .ma-lg-13 { + margin: 52px !important; + } + .ma-lg-14 { + margin: 56px !important; + } + .ma-lg-15 { + margin: 60px !important; + } + .ma-lg-16 { + margin: 64px !important; + } + .ma-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-lg-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-lg-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-lg-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-lg-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-lg-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-lg-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-lg-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-lg-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-lg-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-lg-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-lg-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-lg-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-lg-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-lg-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-lg-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-lg-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-lg-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-lg-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-lg-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-lg-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-lg-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-lg-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-lg-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-lg-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-lg-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-lg-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-lg-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-lg-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-lg-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-lg-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-lg-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-lg-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0px !important; + } + .mt-lg-1 { + margin-top: 4px !important; + } + .mt-lg-2 { + margin-top: 8px !important; + } + .mt-lg-3 { + margin-top: 12px !important; + } + .mt-lg-4 { + margin-top: 16px !important; + } + .mt-lg-5 { + margin-top: 20px !important; + } + .mt-lg-6 { + margin-top: 24px !important; + } + .mt-lg-7 { + margin-top: 28px !important; + } + .mt-lg-8 { + margin-top: 32px !important; + } + .mt-lg-9 { + margin-top: 36px !important; + } + .mt-lg-10 { + margin-top: 40px !important; + } + .mt-lg-11 { + margin-top: 44px !important; + } + .mt-lg-12 { + margin-top: 48px !important; + } + .mt-lg-13 { + margin-top: 52px !important; + } + .mt-lg-14 { + margin-top: 56px !important; + } + .mt-lg-15 { + margin-top: 60px !important; + } + .mt-lg-16 { + margin-top: 64px !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .mr-lg-0 { + margin-right: 0px !important; + } + .mr-lg-1 { + margin-right: 4px !important; + } + .mr-lg-2 { + margin-right: 8px !important; + } + .mr-lg-3 { + margin-right: 12px !important; + } + .mr-lg-4 { + margin-right: 16px !important; + } + .mr-lg-5 { + margin-right: 20px !important; + } + .mr-lg-6 { + margin-right: 24px !important; + } + .mr-lg-7 { + margin-right: 28px !important; + } + .mr-lg-8 { + margin-right: 32px !important; + } + .mr-lg-9 { + margin-right: 36px !important; + } + .mr-lg-10 { + margin-right: 40px !important; + } + .mr-lg-11 { + margin-right: 44px !important; + } + .mr-lg-12 { + margin-right: 48px !important; + } + .mr-lg-13 { + margin-right: 52px !important; + } + .mr-lg-14 { + margin-right: 56px !important; + } + .mr-lg-15 { + margin-right: 60px !important; + } + .mr-lg-16 { + margin-right: 64px !important; + } + .mr-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0px !important; + } + .mb-lg-1 { + margin-bottom: 4px !important; + } + .mb-lg-2 { + margin-bottom: 8px !important; + } + .mb-lg-3 { + margin-bottom: 12px !important; + } + .mb-lg-4 { + margin-bottom: 16px !important; + } + .mb-lg-5 { + margin-bottom: 20px !important; + } + .mb-lg-6 { + margin-bottom: 24px !important; + } + .mb-lg-7 { + margin-bottom: 28px !important; + } + .mb-lg-8 { + margin-bottom: 32px !important; + } + .mb-lg-9 { + margin-bottom: 36px !important; + } + .mb-lg-10 { + margin-bottom: 40px !important; + } + .mb-lg-11 { + margin-bottom: 44px !important; + } + .mb-lg-12 { + margin-bottom: 48px !important; + } + .mb-lg-13 { + margin-bottom: 52px !important; + } + .mb-lg-14 { + margin-bottom: 56px !important; + } + .mb-lg-15 { + margin-bottom: 60px !important; + } + .mb-lg-16 { + margin-bottom: 64px !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ml-lg-0 { + margin-left: 0px !important; + } + .ml-lg-1 { + margin-left: 4px !important; + } + .ml-lg-2 { + margin-left: 8px !important; + } + .ml-lg-3 { + margin-left: 12px !important; + } + .ml-lg-4 { + margin-left: 16px !important; + } + .ml-lg-5 { + margin-left: 20px !important; + } + .ml-lg-6 { + margin-left: 24px !important; + } + .ml-lg-7 { + margin-left: 28px !important; + } + .ml-lg-8 { + margin-left: 32px !important; + } + .ml-lg-9 { + margin-left: 36px !important; + } + .ml-lg-10 { + margin-left: 40px !important; + } + .ml-lg-11 { + margin-left: 44px !important; + } + .ml-lg-12 { + margin-left: 48px !important; + } + .ml-lg-13 { + margin-left: 52px !important; + } + .ml-lg-14 { + margin-left: 56px !important; + } + .ml-lg-15 { + margin-left: 60px !important; + } + .ml-lg-16 { + margin-left: 64px !important; + } + .ml-lg-auto { + margin-left: auto !important; + } + .ms-lg-0 { + margin-inline-start: 0px !important; + } + .ms-lg-1 { + margin-inline-start: 4px !important; + } + .ms-lg-2 { + margin-inline-start: 8px !important; + } + .ms-lg-3 { + margin-inline-start: 12px !important; + } + .ms-lg-4 { + margin-inline-start: 16px !important; + } + .ms-lg-5 { + margin-inline-start: 20px !important; + } + .ms-lg-6 { + margin-inline-start: 24px !important; + } + .ms-lg-7 { + margin-inline-start: 28px !important; + } + .ms-lg-8 { + margin-inline-start: 32px !important; + } + .ms-lg-9 { + margin-inline-start: 36px !important; + } + .ms-lg-10 { + margin-inline-start: 40px !important; + } + .ms-lg-11 { + margin-inline-start: 44px !important; + } + .ms-lg-12 { + margin-inline-start: 48px !important; + } + .ms-lg-13 { + margin-inline-start: 52px !important; + } + .ms-lg-14 { + margin-inline-start: 56px !important; + } + .ms-lg-15 { + margin-inline-start: 60px !important; + } + .ms-lg-16 { + margin-inline-start: 64px !important; + } + .ms-lg-auto { + margin-inline-start: auto !important; + } + .me-lg-0 { + margin-inline-end: 0px !important; + } + .me-lg-1 { + margin-inline-end: 4px !important; + } + .me-lg-2 { + margin-inline-end: 8px !important; + } + .me-lg-3 { + margin-inline-end: 12px !important; + } + .me-lg-4 { + margin-inline-end: 16px !important; + } + .me-lg-5 { + margin-inline-end: 20px !important; + } + .me-lg-6 { + margin-inline-end: 24px !important; + } + .me-lg-7 { + margin-inline-end: 28px !important; + } + .me-lg-8 { + margin-inline-end: 32px !important; + } + .me-lg-9 { + margin-inline-end: 36px !important; + } + .me-lg-10 { + margin-inline-end: 40px !important; + } + .me-lg-11 { + margin-inline-end: 44px !important; + } + .me-lg-12 { + margin-inline-end: 48px !important; + } + .me-lg-13 { + margin-inline-end: 52px !important; + } + .me-lg-14 { + margin-inline-end: 56px !important; + } + .me-lg-15 { + margin-inline-end: 60px !important; + } + .me-lg-16 { + margin-inline-end: 64px !important; + } + .me-lg-auto { + margin-inline-end: auto !important; + } + .ma-lg-n1 { + margin: -4px !important; + } + .ma-lg-n2 { + margin: -8px !important; + } + .ma-lg-n3 { + margin: -12px !important; + } + .ma-lg-n4 { + margin: -16px !important; + } + .ma-lg-n5 { + margin: -20px !important; + } + .ma-lg-n6 { + margin: -24px !important; + } + .ma-lg-n7 { + margin: -28px !important; + } + .ma-lg-n8 { + margin: -32px !important; + } + .ma-lg-n9 { + margin: -36px !important; + } + .ma-lg-n10 { + margin: -40px !important; + } + .ma-lg-n11 { + margin: -44px !important; + } + .ma-lg-n12 { + margin: -48px !important; + } + .ma-lg-n13 { + margin: -52px !important; + } + .ma-lg-n14 { + margin: -56px !important; + } + .ma-lg-n15 { + margin: -60px !important; + } + .ma-lg-n16 { + margin: -64px !important; + } + .mx-lg-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-lg-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-lg-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-lg-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-lg-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-lg-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-lg-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-lg-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-lg-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-lg-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-lg-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-lg-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-lg-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-lg-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-lg-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-lg-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-lg-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-lg-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-lg-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-lg-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-lg-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-lg-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-lg-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-lg-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-lg-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-lg-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-lg-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-lg-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-lg-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-lg-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-lg-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-lg-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-lg-n1 { + margin-top: -4px !important; + } + .mt-lg-n2 { + margin-top: -8px !important; + } + .mt-lg-n3 { + margin-top: -12px !important; + } + .mt-lg-n4 { + margin-top: -16px !important; + } + .mt-lg-n5 { + margin-top: -20px !important; + } + .mt-lg-n6 { + margin-top: -24px !important; + } + .mt-lg-n7 { + margin-top: -28px !important; + } + .mt-lg-n8 { + margin-top: -32px !important; + } + .mt-lg-n9 { + margin-top: -36px !important; + } + .mt-lg-n10 { + margin-top: -40px !important; + } + .mt-lg-n11 { + margin-top: -44px !important; + } + .mt-lg-n12 { + margin-top: -48px !important; + } + .mt-lg-n13 { + margin-top: -52px !important; + } + .mt-lg-n14 { + margin-top: -56px !important; + } + .mt-lg-n15 { + margin-top: -60px !important; + } + .mt-lg-n16 { + margin-top: -64px !important; + } + .mr-lg-n1 { + margin-right: -4px !important; + } + .mr-lg-n2 { + margin-right: -8px !important; + } + .mr-lg-n3 { + margin-right: -12px !important; + } + .mr-lg-n4 { + margin-right: -16px !important; + } + .mr-lg-n5 { + margin-right: -20px !important; + } + .mr-lg-n6 { + margin-right: -24px !important; + } + .mr-lg-n7 { + margin-right: -28px !important; + } + .mr-lg-n8 { + margin-right: -32px !important; + } + .mr-lg-n9 { + margin-right: -36px !important; + } + .mr-lg-n10 { + margin-right: -40px !important; + } + .mr-lg-n11 { + margin-right: -44px !important; + } + .mr-lg-n12 { + margin-right: -48px !important; + } + .mr-lg-n13 { + margin-right: -52px !important; + } + .mr-lg-n14 { + margin-right: -56px !important; + } + .mr-lg-n15 { + margin-right: -60px !important; + } + .mr-lg-n16 { + margin-right: -64px !important; + } + .mb-lg-n1 { + margin-bottom: -4px !important; + } + .mb-lg-n2 { + margin-bottom: -8px !important; + } + .mb-lg-n3 { + margin-bottom: -12px !important; + } + .mb-lg-n4 { + margin-bottom: -16px !important; + } + .mb-lg-n5 { + margin-bottom: -20px !important; + } + .mb-lg-n6 { + margin-bottom: -24px !important; + } + .mb-lg-n7 { + margin-bottom: -28px !important; + } + .mb-lg-n8 { + margin-bottom: -32px !important; + } + .mb-lg-n9 { + margin-bottom: -36px !important; + } + .mb-lg-n10 { + margin-bottom: -40px !important; + } + .mb-lg-n11 { + margin-bottom: -44px !important; + } + .mb-lg-n12 { + margin-bottom: -48px !important; + } + .mb-lg-n13 { + margin-bottom: -52px !important; + } + .mb-lg-n14 { + margin-bottom: -56px !important; + } + .mb-lg-n15 { + margin-bottom: -60px !important; + } + .mb-lg-n16 { + margin-bottom: -64px !important; + } + .ml-lg-n1 { + margin-left: -4px !important; + } + .ml-lg-n2 { + margin-left: -8px !important; + } + .ml-lg-n3 { + margin-left: -12px !important; + } + .ml-lg-n4 { + margin-left: -16px !important; + } + .ml-lg-n5 { + margin-left: -20px !important; + } + .ml-lg-n6 { + margin-left: -24px !important; + } + .ml-lg-n7 { + margin-left: -28px !important; + } + .ml-lg-n8 { + margin-left: -32px !important; + } + .ml-lg-n9 { + margin-left: -36px !important; + } + .ml-lg-n10 { + margin-left: -40px !important; + } + .ml-lg-n11 { + margin-left: -44px !important; + } + .ml-lg-n12 { + margin-left: -48px !important; + } + .ml-lg-n13 { + margin-left: -52px !important; + } + .ml-lg-n14 { + margin-left: -56px !important; + } + .ml-lg-n15 { + margin-left: -60px !important; + } + .ml-lg-n16 { + margin-left: -64px !important; + } + .ms-lg-n1 { + margin-inline-start: -4px !important; + } + .ms-lg-n2 { + margin-inline-start: -8px !important; + } + .ms-lg-n3 { + margin-inline-start: -12px !important; + } + .ms-lg-n4 { + margin-inline-start: -16px !important; + } + .ms-lg-n5 { + margin-inline-start: -20px !important; + } + .ms-lg-n6 { + margin-inline-start: -24px !important; + } + .ms-lg-n7 { + margin-inline-start: -28px !important; + } + .ms-lg-n8 { + margin-inline-start: -32px !important; + } + .ms-lg-n9 { + margin-inline-start: -36px !important; + } + .ms-lg-n10 { + margin-inline-start: -40px !important; + } + .ms-lg-n11 { + margin-inline-start: -44px !important; + } + .ms-lg-n12 { + margin-inline-start: -48px !important; + } + .ms-lg-n13 { + margin-inline-start: -52px !important; + } + .ms-lg-n14 { + margin-inline-start: -56px !important; + } + .ms-lg-n15 { + margin-inline-start: -60px !important; + } + .ms-lg-n16 { + margin-inline-start: -64px !important; + } + .me-lg-n1 { + margin-inline-end: -4px !important; + } + .me-lg-n2 { + margin-inline-end: -8px !important; + } + .me-lg-n3 { + margin-inline-end: -12px !important; + } + .me-lg-n4 { + margin-inline-end: -16px !important; + } + .me-lg-n5 { + margin-inline-end: -20px !important; + } + .me-lg-n6 { + margin-inline-end: -24px !important; + } + .me-lg-n7 { + margin-inline-end: -28px !important; + } + .me-lg-n8 { + margin-inline-end: -32px !important; + } + .me-lg-n9 { + margin-inline-end: -36px !important; + } + .me-lg-n10 { + margin-inline-end: -40px !important; + } + .me-lg-n11 { + margin-inline-end: -44px !important; + } + .me-lg-n12 { + margin-inline-end: -48px !important; + } + .me-lg-n13 { + margin-inline-end: -52px !important; + } + .me-lg-n14 { + margin-inline-end: -56px !important; + } + .me-lg-n15 { + margin-inline-end: -60px !important; + } + .me-lg-n16 { + margin-inline-end: -64px !important; + } + .pa-lg-0 { + padding: 0px !important; + } + .pa-lg-1 { + padding: 4px !important; + } + .pa-lg-2 { + padding: 8px !important; + } + .pa-lg-3 { + padding: 12px !important; + } + .pa-lg-4 { + padding: 16px !important; + } + .pa-lg-5 { + padding: 20px !important; + } + .pa-lg-6 { + padding: 24px !important; + } + .pa-lg-7 { + padding: 28px !important; + } + .pa-lg-8 { + padding: 32px !important; + } + .pa-lg-9 { + padding: 36px !important; + } + .pa-lg-10 { + padding: 40px !important; + } + .pa-lg-11 { + padding: 44px !important; + } + .pa-lg-12 { + padding: 48px !important; + } + .pa-lg-13 { + padding: 52px !important; + } + .pa-lg-14 { + padding: 56px !important; + } + .pa-lg-15 { + padding: 60px !important; + } + .pa-lg-16 { + padding: 64px !important; + } + .px-lg-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-lg-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-lg-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-lg-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-lg-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-lg-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-lg-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-lg-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-lg-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-lg-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-lg-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-lg-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-lg-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-lg-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-lg-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-lg-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-lg-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-lg-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-lg-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-lg-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-lg-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-lg-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-lg-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-lg-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-lg-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-lg-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-lg-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-lg-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-lg-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-lg-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-lg-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-lg-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-lg-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-lg-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-lg-0 { + padding-top: 0px !important; + } + .pt-lg-1 { + padding-top: 4px !important; + } + .pt-lg-2 { + padding-top: 8px !important; + } + .pt-lg-3 { + padding-top: 12px !important; + } + .pt-lg-4 { + padding-top: 16px !important; + } + .pt-lg-5 { + padding-top: 20px !important; + } + .pt-lg-6 { + padding-top: 24px !important; + } + .pt-lg-7 { + padding-top: 28px !important; + } + .pt-lg-8 { + padding-top: 32px !important; + } + .pt-lg-9 { + padding-top: 36px !important; + } + .pt-lg-10 { + padding-top: 40px !important; + } + .pt-lg-11 { + padding-top: 44px !important; + } + .pt-lg-12 { + padding-top: 48px !important; + } + .pt-lg-13 { + padding-top: 52px !important; + } + .pt-lg-14 { + padding-top: 56px !important; + } + .pt-lg-15 { + padding-top: 60px !important; + } + .pt-lg-16 { + padding-top: 64px !important; + } + .pr-lg-0 { + padding-right: 0px !important; + } + .pr-lg-1 { + padding-right: 4px !important; + } + .pr-lg-2 { + padding-right: 8px !important; + } + .pr-lg-3 { + padding-right: 12px !important; + } + .pr-lg-4 { + padding-right: 16px !important; + } + .pr-lg-5 { + padding-right: 20px !important; + } + .pr-lg-6 { + padding-right: 24px !important; + } + .pr-lg-7 { + padding-right: 28px !important; + } + .pr-lg-8 { + padding-right: 32px !important; + } + .pr-lg-9 { + padding-right: 36px !important; + } + .pr-lg-10 { + padding-right: 40px !important; + } + .pr-lg-11 { + padding-right: 44px !important; + } + .pr-lg-12 { + padding-right: 48px !important; + } + .pr-lg-13 { + padding-right: 52px !important; + } + .pr-lg-14 { + padding-right: 56px !important; + } + .pr-lg-15 { + padding-right: 60px !important; + } + .pr-lg-16 { + padding-right: 64px !important; + } + .pb-lg-0 { + padding-bottom: 0px !important; + } + .pb-lg-1 { + padding-bottom: 4px !important; + } + .pb-lg-2 { + padding-bottom: 8px !important; + } + .pb-lg-3 { + padding-bottom: 12px !important; + } + .pb-lg-4 { + padding-bottom: 16px !important; + } + .pb-lg-5 { + padding-bottom: 20px !important; + } + .pb-lg-6 { + padding-bottom: 24px !important; + } + .pb-lg-7 { + padding-bottom: 28px !important; + } + .pb-lg-8 { + padding-bottom: 32px !important; + } + .pb-lg-9 { + padding-bottom: 36px !important; + } + .pb-lg-10 { + padding-bottom: 40px !important; + } + .pb-lg-11 { + padding-bottom: 44px !important; + } + .pb-lg-12 { + padding-bottom: 48px !important; + } + .pb-lg-13 { + padding-bottom: 52px !important; + } + .pb-lg-14 { + padding-bottom: 56px !important; + } + .pb-lg-15 { + padding-bottom: 60px !important; + } + .pb-lg-16 { + padding-bottom: 64px !important; + } + .pl-lg-0 { + padding-left: 0px !important; + } + .pl-lg-1 { + padding-left: 4px !important; + } + .pl-lg-2 { + padding-left: 8px !important; + } + .pl-lg-3 { + padding-left: 12px !important; + } + .pl-lg-4 { + padding-left: 16px !important; + } + .pl-lg-5 { + padding-left: 20px !important; + } + .pl-lg-6 { + padding-left: 24px !important; + } + .pl-lg-7 { + padding-left: 28px !important; + } + .pl-lg-8 { + padding-left: 32px !important; + } + .pl-lg-9 { + padding-left: 36px !important; + } + .pl-lg-10 { + padding-left: 40px !important; + } + .pl-lg-11 { + padding-left: 44px !important; + } + .pl-lg-12 { + padding-left: 48px !important; + } + .pl-lg-13 { + padding-left: 52px !important; + } + .pl-lg-14 { + padding-left: 56px !important; + } + .pl-lg-15 { + padding-left: 60px !important; + } + .pl-lg-16 { + padding-left: 64px !important; + } + .ps-lg-0 { + padding-inline-start: 0px !important; + } + .ps-lg-1 { + padding-inline-start: 4px !important; + } + .ps-lg-2 { + padding-inline-start: 8px !important; + } + .ps-lg-3 { + padding-inline-start: 12px !important; + } + .ps-lg-4 { + padding-inline-start: 16px !important; + } + .ps-lg-5 { + padding-inline-start: 20px !important; + } + .ps-lg-6 { + padding-inline-start: 24px !important; + } + .ps-lg-7 { + padding-inline-start: 28px !important; + } + .ps-lg-8 { + padding-inline-start: 32px !important; + } + .ps-lg-9 { + padding-inline-start: 36px !important; + } + .ps-lg-10 { + padding-inline-start: 40px !important; + } + .ps-lg-11 { + padding-inline-start: 44px !important; + } + .ps-lg-12 { + padding-inline-start: 48px !important; + } + .ps-lg-13 { + padding-inline-start: 52px !important; + } + .ps-lg-14 { + padding-inline-start: 56px !important; + } + .ps-lg-15 { + padding-inline-start: 60px !important; + } + .ps-lg-16 { + padding-inline-start: 64px !important; + } + .pe-lg-0 { + padding-inline-end: 0px !important; + } + .pe-lg-1 { + padding-inline-end: 4px !important; + } + .pe-lg-2 { + padding-inline-end: 8px !important; + } + .pe-lg-3 { + padding-inline-end: 12px !important; + } + .pe-lg-4 { + padding-inline-end: 16px !important; + } + .pe-lg-5 { + padding-inline-end: 20px !important; + } + .pe-lg-6 { + padding-inline-end: 24px !important; + } + .pe-lg-7 { + padding-inline-end: 28px !important; + } + .pe-lg-8 { + padding-inline-end: 32px !important; + } + .pe-lg-9 { + padding-inline-end: 36px !important; + } + .pe-lg-10 { + padding-inline-end: 40px !important; + } + .pe-lg-11 { + padding-inline-end: 44px !important; + } + .pe-lg-12 { + padding-inline-end: 48px !important; + } + .pe-lg-13 { + padding-inline-end: 52px !important; + } + .pe-lg-14 { + padding-inline-end: 56px !important; + } + .pe-lg-15 { + padding-inline-end: 60px !important; + } + .pe-lg-16 { + padding-inline-end: 64px !important; + } + .text-lg-left { + text-align: left !important; + } + .text-lg-right { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } + .text-lg-justify { + text-align: justify !important; + } + .text-lg-start { + text-align: start !important; + } + .text-lg-end { + text-align: end !important; + } + .text-lg-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-lg-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-lg-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-lg-auto { + height: auto !important; + } + .h-lg-screen { + height: 100vh !important; + } + .h-lg-0 { + height: 0 !important; + } + .h-lg-25 { + height: 25% !important; + } + .h-lg-50 { + height: 50% !important; + } + .h-lg-75 { + height: 75% !important; + } + .h-lg-100 { + height: 100% !important; + } + .w-lg-auto { + width: auto !important; + } + .w-lg-0 { + width: 0 !important; + } + .w-lg-25 { + width: 25% !important; + } + .w-lg-33 { + width: 33% !important; + } + .w-lg-50 { + width: 50% !important; + } + .w-lg-66 { + width: 66% !important; + } + .w-lg-75 { + width: 75% !important; + } + .w-lg-100 { + width: 100% !important; + } +} +@media (min-width: 1920px) { + .d-xl-none { + display: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .float-xl-none { + float: none !important; + } + .float-xl-left { + float: left !important; + } + .float-xl-right { + float: right !important; + } + .v-locale--is-rtl .float-xl-end { + float: left !important; + } + .v-locale--is-rtl .float-xl-start { + float: right !important; + } + .v-locale--is-ltr .float-xl-end { + float: right !important; + } + .v-locale--is-ltr .float-xl-start { + float: left !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-1-1 { + flex: 1 1 auto !important; + } + .flex-xl-1-0 { + flex: 1 0 auto !important; + } + .flex-xl-0-1 { + flex: 0 1 auto !important; + } + .flex-xl-0-0 { + flex: 0 0 auto !important; + } + .flex-xl-1-1-100 { + flex: 1 1 100% !important; + } + .flex-xl-1-0-100 { + flex: 1 0 100% !important; + } + .flex-xl-0-1-100 { + flex: 0 1 100% !important; + } + .flex-xl-0-0-100 { + flex: 0 0 100% !important; + } + .flex-xl-1-1-0 { + flex: 1 1 0 !important; + } + .flex-xl-1-0-0 { + flex: 1 0 0 !important; + } + .flex-xl-0-1-0 { + flex: 0 1 0 !important; + } + .flex-xl-0-0-0 { + flex: 0 0 0 !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-xl-start { + justify-content: flex-start !important; + } + .justify-xl-end { + justify-content: flex-end !important; + } + .justify-xl-center { + justify-content: center !important; + } + .justify-xl-space-between { + justify-content: space-between !important; + } + .justify-xl-space-around { + justify-content: space-around !important; + } + .justify-xl-space-evenly { + justify-content: space-evenly !important; + } + .align-xl-start { + align-items: flex-start !important; + } + .align-xl-end { + align-items: flex-end !important; + } + .align-xl-center { + align-items: center !important; + } + .align-xl-baseline { + align-items: baseline !important; + } + .align-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-space-between { + align-content: space-between !important; + } + .align-content-xl-space-around { + align-content: space-around !important; + } + .align-content-xl-space-evenly { + align-content: space-evenly !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-6 { + order: 6 !important; + } + .order-xl-7 { + order: 7 !important; + } + .order-xl-8 { + order: 8 !important; + } + .order-xl-9 { + order: 9 !important; + } + .order-xl-10 { + order: 10 !important; + } + .order-xl-11 { + order: 11 !important; + } + .order-xl-12 { + order: 12 !important; + } + .order-xl-last { + order: 13 !important; + } + .ga-xl-0 { + gap: 0px !important; + } + .ga-xl-1 { + gap: 4px !important; + } + .ga-xl-2 { + gap: 8px !important; + } + .ga-xl-3 { + gap: 12px !important; + } + .ga-xl-4 { + gap: 16px !important; + } + .ga-xl-5 { + gap: 20px !important; + } + .ga-xl-6 { + gap: 24px !important; + } + .ga-xl-7 { + gap: 28px !important; + } + .ga-xl-8 { + gap: 32px !important; + } + .ga-xl-9 { + gap: 36px !important; + } + .ga-xl-10 { + gap: 40px !important; + } + .ga-xl-11 { + gap: 44px !important; + } + .ga-xl-12 { + gap: 48px !important; + } + .ga-xl-13 { + gap: 52px !important; + } + .ga-xl-14 { + gap: 56px !important; + } + .ga-xl-15 { + gap: 60px !important; + } + .ga-xl-16 { + gap: 64px !important; + } + .ga-xl-auto { + gap: auto !important; + } + .gr-xl-0 { + row-gap: 0px !important; + } + .gr-xl-1 { + row-gap: 4px !important; + } + .gr-xl-2 { + row-gap: 8px !important; + } + .gr-xl-3 { + row-gap: 12px !important; + } + .gr-xl-4 { + row-gap: 16px !important; + } + .gr-xl-5 { + row-gap: 20px !important; + } + .gr-xl-6 { + row-gap: 24px !important; + } + .gr-xl-7 { + row-gap: 28px !important; + } + .gr-xl-8 { + row-gap: 32px !important; + } + .gr-xl-9 { + row-gap: 36px !important; + } + .gr-xl-10 { + row-gap: 40px !important; + } + .gr-xl-11 { + row-gap: 44px !important; + } + .gr-xl-12 { + row-gap: 48px !important; + } + .gr-xl-13 { + row-gap: 52px !important; + } + .gr-xl-14 { + row-gap: 56px !important; + } + .gr-xl-15 { + row-gap: 60px !important; + } + .gr-xl-16 { + row-gap: 64px !important; + } + .gr-xl-auto { + row-gap: auto !important; + } + .gc-xl-0 { + column-gap: 0px !important; + } + .gc-xl-1 { + column-gap: 4px !important; + } + .gc-xl-2 { + column-gap: 8px !important; + } + .gc-xl-3 { + column-gap: 12px !important; + } + .gc-xl-4 { + column-gap: 16px !important; + } + .gc-xl-5 { + column-gap: 20px !important; + } + .gc-xl-6 { + column-gap: 24px !important; + } + .gc-xl-7 { + column-gap: 28px !important; + } + .gc-xl-8 { + column-gap: 32px !important; + } + .gc-xl-9 { + column-gap: 36px !important; + } + .gc-xl-10 { + column-gap: 40px !important; + } + .gc-xl-11 { + column-gap: 44px !important; + } + .gc-xl-12 { + column-gap: 48px !important; + } + .gc-xl-13 { + column-gap: 52px !important; + } + .gc-xl-14 { + column-gap: 56px !important; + } + .gc-xl-15 { + column-gap: 60px !important; + } + .gc-xl-16 { + column-gap: 64px !important; + } + .gc-xl-auto { + column-gap: auto !important; + } + .ma-xl-0 { + margin: 0px !important; + } + .ma-xl-1 { + margin: 4px !important; + } + .ma-xl-2 { + margin: 8px !important; + } + .ma-xl-3 { + margin: 12px !important; + } + .ma-xl-4 { + margin: 16px !important; + } + .ma-xl-5 { + margin: 20px !important; + } + .ma-xl-6 { + margin: 24px !important; + } + .ma-xl-7 { + margin: 28px !important; + } + .ma-xl-8 { + margin: 32px !important; + } + .ma-xl-9 { + margin: 36px !important; + } + .ma-xl-10 { + margin: 40px !important; + } + .ma-xl-11 { + margin: 44px !important; + } + .ma-xl-12 { + margin: 48px !important; + } + .ma-xl-13 { + margin: 52px !important; + } + .ma-xl-14 { + margin: 56px !important; + } + .ma-xl-15 { + margin: 60px !important; + } + .ma-xl-16 { + margin: 64px !important; + } + .ma-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-xl-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-xl-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-xl-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-xl-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-xl-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-xl-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-xl-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-xl-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-xl-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-xl-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-xl-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-xl-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-xl-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-xl-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-xl-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-xl-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-xl-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-xl-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-xl-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-xl-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-xl-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-xl-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-xl-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-xl-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-xl-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-xl-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-xl-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-xl-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-xl-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-xl-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-xl-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-xl-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0px !important; + } + .mt-xl-1 { + margin-top: 4px !important; + } + .mt-xl-2 { + margin-top: 8px !important; + } + .mt-xl-3 { + margin-top: 12px !important; + } + .mt-xl-4 { + margin-top: 16px !important; + } + .mt-xl-5 { + margin-top: 20px !important; + } + .mt-xl-6 { + margin-top: 24px !important; + } + .mt-xl-7 { + margin-top: 28px !important; + } + .mt-xl-8 { + margin-top: 32px !important; + } + .mt-xl-9 { + margin-top: 36px !important; + } + .mt-xl-10 { + margin-top: 40px !important; + } + .mt-xl-11 { + margin-top: 44px !important; + } + .mt-xl-12 { + margin-top: 48px !important; + } + .mt-xl-13 { + margin-top: 52px !important; + } + .mt-xl-14 { + margin-top: 56px !important; + } + .mt-xl-15 { + margin-top: 60px !important; + } + .mt-xl-16 { + margin-top: 64px !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .mr-xl-0 { + margin-right: 0px !important; + } + .mr-xl-1 { + margin-right: 4px !important; + } + .mr-xl-2 { + margin-right: 8px !important; + } + .mr-xl-3 { + margin-right: 12px !important; + } + .mr-xl-4 { + margin-right: 16px !important; + } + .mr-xl-5 { + margin-right: 20px !important; + } + .mr-xl-6 { + margin-right: 24px !important; + } + .mr-xl-7 { + margin-right: 28px !important; + } + .mr-xl-8 { + margin-right: 32px !important; + } + .mr-xl-9 { + margin-right: 36px !important; + } + .mr-xl-10 { + margin-right: 40px !important; + } + .mr-xl-11 { + margin-right: 44px !important; + } + .mr-xl-12 { + margin-right: 48px !important; + } + .mr-xl-13 { + margin-right: 52px !important; + } + .mr-xl-14 { + margin-right: 56px !important; + } + .mr-xl-15 { + margin-right: 60px !important; + } + .mr-xl-16 { + margin-right: 64px !important; + } + .mr-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0px !important; + } + .mb-xl-1 { + margin-bottom: 4px !important; + } + .mb-xl-2 { + margin-bottom: 8px !important; + } + .mb-xl-3 { + margin-bottom: 12px !important; + } + .mb-xl-4 { + margin-bottom: 16px !important; + } + .mb-xl-5 { + margin-bottom: 20px !important; + } + .mb-xl-6 { + margin-bottom: 24px !important; + } + .mb-xl-7 { + margin-bottom: 28px !important; + } + .mb-xl-8 { + margin-bottom: 32px !important; + } + .mb-xl-9 { + margin-bottom: 36px !important; + } + .mb-xl-10 { + margin-bottom: 40px !important; + } + .mb-xl-11 { + margin-bottom: 44px !important; + } + .mb-xl-12 { + margin-bottom: 48px !important; + } + .mb-xl-13 { + margin-bottom: 52px !important; + } + .mb-xl-14 { + margin-bottom: 56px !important; + } + .mb-xl-15 { + margin-bottom: 60px !important; + } + .mb-xl-16 { + margin-bottom: 64px !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ml-xl-0 { + margin-left: 0px !important; + } + .ml-xl-1 { + margin-left: 4px !important; + } + .ml-xl-2 { + margin-left: 8px !important; + } + .ml-xl-3 { + margin-left: 12px !important; + } + .ml-xl-4 { + margin-left: 16px !important; + } + .ml-xl-5 { + margin-left: 20px !important; + } + .ml-xl-6 { + margin-left: 24px !important; + } + .ml-xl-7 { + margin-left: 28px !important; + } + .ml-xl-8 { + margin-left: 32px !important; + } + .ml-xl-9 { + margin-left: 36px !important; + } + .ml-xl-10 { + margin-left: 40px !important; + } + .ml-xl-11 { + margin-left: 44px !important; + } + .ml-xl-12 { + margin-left: 48px !important; + } + .ml-xl-13 { + margin-left: 52px !important; + } + .ml-xl-14 { + margin-left: 56px !important; + } + .ml-xl-15 { + margin-left: 60px !important; + } + .ml-xl-16 { + margin-left: 64px !important; + } + .ml-xl-auto { + margin-left: auto !important; + } + .ms-xl-0 { + margin-inline-start: 0px !important; + } + .ms-xl-1 { + margin-inline-start: 4px !important; + } + .ms-xl-2 { + margin-inline-start: 8px !important; + } + .ms-xl-3 { + margin-inline-start: 12px !important; + } + .ms-xl-4 { + margin-inline-start: 16px !important; + } + .ms-xl-5 { + margin-inline-start: 20px !important; + } + .ms-xl-6 { + margin-inline-start: 24px !important; + } + .ms-xl-7 { + margin-inline-start: 28px !important; + } + .ms-xl-8 { + margin-inline-start: 32px !important; + } + .ms-xl-9 { + margin-inline-start: 36px !important; + } + .ms-xl-10 { + margin-inline-start: 40px !important; + } + .ms-xl-11 { + margin-inline-start: 44px !important; + } + .ms-xl-12 { + margin-inline-start: 48px !important; + } + .ms-xl-13 { + margin-inline-start: 52px !important; + } + .ms-xl-14 { + margin-inline-start: 56px !important; + } + .ms-xl-15 { + margin-inline-start: 60px !important; + } + .ms-xl-16 { + margin-inline-start: 64px !important; + } + .ms-xl-auto { + margin-inline-start: auto !important; + } + .me-xl-0 { + margin-inline-end: 0px !important; + } + .me-xl-1 { + margin-inline-end: 4px !important; + } + .me-xl-2 { + margin-inline-end: 8px !important; + } + .me-xl-3 { + margin-inline-end: 12px !important; + } + .me-xl-4 { + margin-inline-end: 16px !important; + } + .me-xl-5 { + margin-inline-end: 20px !important; + } + .me-xl-6 { + margin-inline-end: 24px !important; + } + .me-xl-7 { + margin-inline-end: 28px !important; + } + .me-xl-8 { + margin-inline-end: 32px !important; + } + .me-xl-9 { + margin-inline-end: 36px !important; + } + .me-xl-10 { + margin-inline-end: 40px !important; + } + .me-xl-11 { + margin-inline-end: 44px !important; + } + .me-xl-12 { + margin-inline-end: 48px !important; + } + .me-xl-13 { + margin-inline-end: 52px !important; + } + .me-xl-14 { + margin-inline-end: 56px !important; + } + .me-xl-15 { + margin-inline-end: 60px !important; + } + .me-xl-16 { + margin-inline-end: 64px !important; + } + .me-xl-auto { + margin-inline-end: auto !important; + } + .ma-xl-n1 { + margin: -4px !important; + } + .ma-xl-n2 { + margin: -8px !important; + } + .ma-xl-n3 { + margin: -12px !important; + } + .ma-xl-n4 { + margin: -16px !important; + } + .ma-xl-n5 { + margin: -20px !important; + } + .ma-xl-n6 { + margin: -24px !important; + } + .ma-xl-n7 { + margin: -28px !important; + } + .ma-xl-n8 { + margin: -32px !important; + } + .ma-xl-n9 { + margin: -36px !important; + } + .ma-xl-n10 { + margin: -40px !important; + } + .ma-xl-n11 { + margin: -44px !important; + } + .ma-xl-n12 { + margin: -48px !important; + } + .ma-xl-n13 { + margin: -52px !important; + } + .ma-xl-n14 { + margin: -56px !important; + } + .ma-xl-n15 { + margin: -60px !important; + } + .ma-xl-n16 { + margin: -64px !important; + } + .mx-xl-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-xl-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-xl-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-xl-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-xl-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-xl-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-xl-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-xl-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-xl-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-xl-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-xl-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-xl-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-xl-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-xl-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-xl-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-xl-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-xl-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-xl-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-xl-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-xl-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-xl-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-xl-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-xl-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-xl-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-xl-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-xl-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-xl-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-xl-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-xl-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-xl-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-xl-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-xl-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-xl-n1 { + margin-top: -4px !important; + } + .mt-xl-n2 { + margin-top: -8px !important; + } + .mt-xl-n3 { + margin-top: -12px !important; + } + .mt-xl-n4 { + margin-top: -16px !important; + } + .mt-xl-n5 { + margin-top: -20px !important; + } + .mt-xl-n6 { + margin-top: -24px !important; + } + .mt-xl-n7 { + margin-top: -28px !important; + } + .mt-xl-n8 { + margin-top: -32px !important; + } + .mt-xl-n9 { + margin-top: -36px !important; + } + .mt-xl-n10 { + margin-top: -40px !important; + } + .mt-xl-n11 { + margin-top: -44px !important; + } + .mt-xl-n12 { + margin-top: -48px !important; + } + .mt-xl-n13 { + margin-top: -52px !important; + } + .mt-xl-n14 { + margin-top: -56px !important; + } + .mt-xl-n15 { + margin-top: -60px !important; + } + .mt-xl-n16 { + margin-top: -64px !important; + } + .mr-xl-n1 { + margin-right: -4px !important; + } + .mr-xl-n2 { + margin-right: -8px !important; + } + .mr-xl-n3 { + margin-right: -12px !important; + } + .mr-xl-n4 { + margin-right: -16px !important; + } + .mr-xl-n5 { + margin-right: -20px !important; + } + .mr-xl-n6 { + margin-right: -24px !important; + } + .mr-xl-n7 { + margin-right: -28px !important; + } + .mr-xl-n8 { + margin-right: -32px !important; + } + .mr-xl-n9 { + margin-right: -36px !important; + } + .mr-xl-n10 { + margin-right: -40px !important; + } + .mr-xl-n11 { + margin-right: -44px !important; + } + .mr-xl-n12 { + margin-right: -48px !important; + } + .mr-xl-n13 { + margin-right: -52px !important; + } + .mr-xl-n14 { + margin-right: -56px !important; + } + .mr-xl-n15 { + margin-right: -60px !important; + } + .mr-xl-n16 { + margin-right: -64px !important; + } + .mb-xl-n1 { + margin-bottom: -4px !important; + } + .mb-xl-n2 { + margin-bottom: -8px !important; + } + .mb-xl-n3 { + margin-bottom: -12px !important; + } + .mb-xl-n4 { + margin-bottom: -16px !important; + } + .mb-xl-n5 { + margin-bottom: -20px !important; + } + .mb-xl-n6 { + margin-bottom: -24px !important; + } + .mb-xl-n7 { + margin-bottom: -28px !important; + } + .mb-xl-n8 { + margin-bottom: -32px !important; + } + .mb-xl-n9 { + margin-bottom: -36px !important; + } + .mb-xl-n10 { + margin-bottom: -40px !important; + } + .mb-xl-n11 { + margin-bottom: -44px !important; + } + .mb-xl-n12 { + margin-bottom: -48px !important; + } + .mb-xl-n13 { + margin-bottom: -52px !important; + } + .mb-xl-n14 { + margin-bottom: -56px !important; + } + .mb-xl-n15 { + margin-bottom: -60px !important; + } + .mb-xl-n16 { + margin-bottom: -64px !important; + } + .ml-xl-n1 { + margin-left: -4px !important; + } + .ml-xl-n2 { + margin-left: -8px !important; + } + .ml-xl-n3 { + margin-left: -12px !important; + } + .ml-xl-n4 { + margin-left: -16px !important; + } + .ml-xl-n5 { + margin-left: -20px !important; + } + .ml-xl-n6 { + margin-left: -24px !important; + } + .ml-xl-n7 { + margin-left: -28px !important; + } + .ml-xl-n8 { + margin-left: -32px !important; + } + .ml-xl-n9 { + margin-left: -36px !important; + } + .ml-xl-n10 { + margin-left: -40px !important; + } + .ml-xl-n11 { + margin-left: -44px !important; + } + .ml-xl-n12 { + margin-left: -48px !important; + } + .ml-xl-n13 { + margin-left: -52px !important; + } + .ml-xl-n14 { + margin-left: -56px !important; + } + .ml-xl-n15 { + margin-left: -60px !important; + } + .ml-xl-n16 { + margin-left: -64px !important; + } + .ms-xl-n1 { + margin-inline-start: -4px !important; + } + .ms-xl-n2 { + margin-inline-start: -8px !important; + } + .ms-xl-n3 { + margin-inline-start: -12px !important; + } + .ms-xl-n4 { + margin-inline-start: -16px !important; + } + .ms-xl-n5 { + margin-inline-start: -20px !important; + } + .ms-xl-n6 { + margin-inline-start: -24px !important; + } + .ms-xl-n7 { + margin-inline-start: -28px !important; + } + .ms-xl-n8 { + margin-inline-start: -32px !important; + } + .ms-xl-n9 { + margin-inline-start: -36px !important; + } + .ms-xl-n10 { + margin-inline-start: -40px !important; + } + .ms-xl-n11 { + margin-inline-start: -44px !important; + } + .ms-xl-n12 { + margin-inline-start: -48px !important; + } + .ms-xl-n13 { + margin-inline-start: -52px !important; + } + .ms-xl-n14 { + margin-inline-start: -56px !important; + } + .ms-xl-n15 { + margin-inline-start: -60px !important; + } + .ms-xl-n16 { + margin-inline-start: -64px !important; + } + .me-xl-n1 { + margin-inline-end: -4px !important; + } + .me-xl-n2 { + margin-inline-end: -8px !important; + } + .me-xl-n3 { + margin-inline-end: -12px !important; + } + .me-xl-n4 { + margin-inline-end: -16px !important; + } + .me-xl-n5 { + margin-inline-end: -20px !important; + } + .me-xl-n6 { + margin-inline-end: -24px !important; + } + .me-xl-n7 { + margin-inline-end: -28px !important; + } + .me-xl-n8 { + margin-inline-end: -32px !important; + } + .me-xl-n9 { + margin-inline-end: -36px !important; + } + .me-xl-n10 { + margin-inline-end: -40px !important; + } + .me-xl-n11 { + margin-inline-end: -44px !important; + } + .me-xl-n12 { + margin-inline-end: -48px !important; + } + .me-xl-n13 { + margin-inline-end: -52px !important; + } + .me-xl-n14 { + margin-inline-end: -56px !important; + } + .me-xl-n15 { + margin-inline-end: -60px !important; + } + .me-xl-n16 { + margin-inline-end: -64px !important; + } + .pa-xl-0 { + padding: 0px !important; + } + .pa-xl-1 { + padding: 4px !important; + } + .pa-xl-2 { + padding: 8px !important; + } + .pa-xl-3 { + padding: 12px !important; + } + .pa-xl-4 { + padding: 16px !important; + } + .pa-xl-5 { + padding: 20px !important; + } + .pa-xl-6 { + padding: 24px !important; + } + .pa-xl-7 { + padding: 28px !important; + } + .pa-xl-8 { + padding: 32px !important; + } + .pa-xl-9 { + padding: 36px !important; + } + .pa-xl-10 { + padding: 40px !important; + } + .pa-xl-11 { + padding: 44px !important; + } + .pa-xl-12 { + padding: 48px !important; + } + .pa-xl-13 { + padding: 52px !important; + } + .pa-xl-14 { + padding: 56px !important; + } + .pa-xl-15 { + padding: 60px !important; + } + .pa-xl-16 { + padding: 64px !important; + } + .px-xl-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-xl-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-xl-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-xl-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-xl-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-xl-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-xl-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-xl-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-xl-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-xl-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-xl-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-xl-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-xl-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-xl-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-xl-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-xl-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-xl-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-xl-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-xl-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-xl-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-xl-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-xl-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-xl-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-xl-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-xl-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-xl-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-xl-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-xl-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-xl-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-xl-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-xl-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-xl-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-xl-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-xl-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-xl-0 { + padding-top: 0px !important; + } + .pt-xl-1 { + padding-top: 4px !important; + } + .pt-xl-2 { + padding-top: 8px !important; + } + .pt-xl-3 { + padding-top: 12px !important; + } + .pt-xl-4 { + padding-top: 16px !important; + } + .pt-xl-5 { + padding-top: 20px !important; + } + .pt-xl-6 { + padding-top: 24px !important; + } + .pt-xl-7 { + padding-top: 28px !important; + } + .pt-xl-8 { + padding-top: 32px !important; + } + .pt-xl-9 { + padding-top: 36px !important; + } + .pt-xl-10 { + padding-top: 40px !important; + } + .pt-xl-11 { + padding-top: 44px !important; + } + .pt-xl-12 { + padding-top: 48px !important; + } + .pt-xl-13 { + padding-top: 52px !important; + } + .pt-xl-14 { + padding-top: 56px !important; + } + .pt-xl-15 { + padding-top: 60px !important; + } + .pt-xl-16 { + padding-top: 64px !important; + } + .pr-xl-0 { + padding-right: 0px !important; + } + .pr-xl-1 { + padding-right: 4px !important; + } + .pr-xl-2 { + padding-right: 8px !important; + } + .pr-xl-3 { + padding-right: 12px !important; + } + .pr-xl-4 { + padding-right: 16px !important; + } + .pr-xl-5 { + padding-right: 20px !important; + } + .pr-xl-6 { + padding-right: 24px !important; + } + .pr-xl-7 { + padding-right: 28px !important; + } + .pr-xl-8 { + padding-right: 32px !important; + } + .pr-xl-9 { + padding-right: 36px !important; + } + .pr-xl-10 { + padding-right: 40px !important; + } + .pr-xl-11 { + padding-right: 44px !important; + } + .pr-xl-12 { + padding-right: 48px !important; + } + .pr-xl-13 { + padding-right: 52px !important; + } + .pr-xl-14 { + padding-right: 56px !important; + } + .pr-xl-15 { + padding-right: 60px !important; + } + .pr-xl-16 { + padding-right: 64px !important; + } + .pb-xl-0 { + padding-bottom: 0px !important; + } + .pb-xl-1 { + padding-bottom: 4px !important; + } + .pb-xl-2 { + padding-bottom: 8px !important; + } + .pb-xl-3 { + padding-bottom: 12px !important; + } + .pb-xl-4 { + padding-bottom: 16px !important; + } + .pb-xl-5 { + padding-bottom: 20px !important; + } + .pb-xl-6 { + padding-bottom: 24px !important; + } + .pb-xl-7 { + padding-bottom: 28px !important; + } + .pb-xl-8 { + padding-bottom: 32px !important; + } + .pb-xl-9 { + padding-bottom: 36px !important; + } + .pb-xl-10 { + padding-bottom: 40px !important; + } + .pb-xl-11 { + padding-bottom: 44px !important; + } + .pb-xl-12 { + padding-bottom: 48px !important; + } + .pb-xl-13 { + padding-bottom: 52px !important; + } + .pb-xl-14 { + padding-bottom: 56px !important; + } + .pb-xl-15 { + padding-bottom: 60px !important; + } + .pb-xl-16 { + padding-bottom: 64px !important; + } + .pl-xl-0 { + padding-left: 0px !important; + } + .pl-xl-1 { + padding-left: 4px !important; + } + .pl-xl-2 { + padding-left: 8px !important; + } + .pl-xl-3 { + padding-left: 12px !important; + } + .pl-xl-4 { + padding-left: 16px !important; + } + .pl-xl-5 { + padding-left: 20px !important; + } + .pl-xl-6 { + padding-left: 24px !important; + } + .pl-xl-7 { + padding-left: 28px !important; + } + .pl-xl-8 { + padding-left: 32px !important; + } + .pl-xl-9 { + padding-left: 36px !important; + } + .pl-xl-10 { + padding-left: 40px !important; + } + .pl-xl-11 { + padding-left: 44px !important; + } + .pl-xl-12 { + padding-left: 48px !important; + } + .pl-xl-13 { + padding-left: 52px !important; + } + .pl-xl-14 { + padding-left: 56px !important; + } + .pl-xl-15 { + padding-left: 60px !important; + } + .pl-xl-16 { + padding-left: 64px !important; + } + .ps-xl-0 { + padding-inline-start: 0px !important; + } + .ps-xl-1 { + padding-inline-start: 4px !important; + } + .ps-xl-2 { + padding-inline-start: 8px !important; + } + .ps-xl-3 { + padding-inline-start: 12px !important; + } + .ps-xl-4 { + padding-inline-start: 16px !important; + } + .ps-xl-5 { + padding-inline-start: 20px !important; + } + .ps-xl-6 { + padding-inline-start: 24px !important; + } + .ps-xl-7 { + padding-inline-start: 28px !important; + } + .ps-xl-8 { + padding-inline-start: 32px !important; + } + .ps-xl-9 { + padding-inline-start: 36px !important; + } + .ps-xl-10 { + padding-inline-start: 40px !important; + } + .ps-xl-11 { + padding-inline-start: 44px !important; + } + .ps-xl-12 { + padding-inline-start: 48px !important; + } + .ps-xl-13 { + padding-inline-start: 52px !important; + } + .ps-xl-14 { + padding-inline-start: 56px !important; + } + .ps-xl-15 { + padding-inline-start: 60px !important; + } + .ps-xl-16 { + padding-inline-start: 64px !important; + } + .pe-xl-0 { + padding-inline-end: 0px !important; + } + .pe-xl-1 { + padding-inline-end: 4px !important; + } + .pe-xl-2 { + padding-inline-end: 8px !important; + } + .pe-xl-3 { + padding-inline-end: 12px !important; + } + .pe-xl-4 { + padding-inline-end: 16px !important; + } + .pe-xl-5 { + padding-inline-end: 20px !important; + } + .pe-xl-6 { + padding-inline-end: 24px !important; + } + .pe-xl-7 { + padding-inline-end: 28px !important; + } + .pe-xl-8 { + padding-inline-end: 32px !important; + } + .pe-xl-9 { + padding-inline-end: 36px !important; + } + .pe-xl-10 { + padding-inline-end: 40px !important; + } + .pe-xl-11 { + padding-inline-end: 44px !important; + } + .pe-xl-12 { + padding-inline-end: 48px !important; + } + .pe-xl-13 { + padding-inline-end: 52px !important; + } + .pe-xl-14 { + padding-inline-end: 56px !important; + } + .pe-xl-15 { + padding-inline-end: 60px !important; + } + .pe-xl-16 { + padding-inline-end: 64px !important; + } + .text-xl-left { + text-align: left !important; + } + .text-xl-right { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } + .text-xl-justify { + text-align: justify !important; + } + .text-xl-start { + text-align: start !important; + } + .text-xl-end { + text-align: end !important; + } + .text-xl-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-xl-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xl-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-xl-auto { + height: auto !important; + } + .h-xl-screen { + height: 100vh !important; + } + .h-xl-0 { + height: 0 !important; + } + .h-xl-25 { + height: 25% !important; + } + .h-xl-50 { + height: 50% !important; + } + .h-xl-75 { + height: 75% !important; + } + .h-xl-100 { + height: 100% !important; + } + .w-xl-auto { + width: auto !important; + } + .w-xl-0 { + width: 0 !important; + } + .w-xl-25 { + width: 25% !important; + } + .w-xl-33 { + width: 33% !important; + } + .w-xl-50 { + width: 50% !important; + } + .w-xl-66 { + width: 66% !important; + } + .w-xl-75 { + width: 75% !important; + } + .w-xl-100 { + width: 100% !important; + } +} +@media (min-width: 2560px) { + .d-xxl-none { + display: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .float-xxl-none { + float: none !important; + } + .float-xxl-left { + float: left !important; + } + .float-xxl-right { + float: right !important; + } + .v-locale--is-rtl .float-xxl-end { + float: left !important; + } + .v-locale--is-rtl .float-xxl-start { + float: right !important; + } + .v-locale--is-ltr .float-xxl-end { + float: right !important; + } + .v-locale--is-ltr .float-xxl-start { + float: left !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-1-1 { + flex: 1 1 auto !important; + } + .flex-xxl-1-0 { + flex: 1 0 auto !important; + } + .flex-xxl-0-1 { + flex: 0 1 auto !important; + } + .flex-xxl-0-0 { + flex: 0 0 auto !important; + } + .flex-xxl-1-1-100 { + flex: 1 1 100% !important; + } + .flex-xxl-1-0-100 { + flex: 1 0 100% !important; + } + .flex-xxl-0-1-100 { + flex: 0 1 100% !important; + } + .flex-xxl-0-0-100 { + flex: 0 0 100% !important; + } + .flex-xxl-1-1-0 { + flex: 1 1 0 !important; + } + .flex-xxl-1-0-0 { + flex: 1 0 0 !important; + } + .flex-xxl-0-1-0 { + flex: 0 1 0 !important; + } + .flex-xxl-0-0-0 { + flex: 0 0 0 !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-xxl-start { + justify-content: flex-start !important; + } + .justify-xxl-end { + justify-content: flex-end !important; + } + .justify-xxl-center { + justify-content: center !important; + } + .justify-xxl-space-between { + justify-content: space-between !important; + } + .justify-xxl-space-around { + justify-content: space-around !important; + } + .justify-xxl-space-evenly { + justify-content: space-evenly !important; + } + .align-xxl-start { + align-items: flex-start !important; + } + .align-xxl-end { + align-items: flex-end !important; + } + .align-xxl-center { + align-items: center !important; + } + .align-xxl-baseline { + align-items: baseline !important; + } + .align-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-space-between { + align-content: space-between !important; + } + .align-content-xxl-space-around { + align-content: space-around !important; + } + .align-content-xxl-space-evenly { + align-content: space-evenly !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-6 { + order: 6 !important; + } + .order-xxl-7 { + order: 7 !important; + } + .order-xxl-8 { + order: 8 !important; + } + .order-xxl-9 { + order: 9 !important; + } + .order-xxl-10 { + order: 10 !important; + } + .order-xxl-11 { + order: 11 !important; + } + .order-xxl-12 { + order: 12 !important; + } + .order-xxl-last { + order: 13 !important; + } + .ga-xxl-0 { + gap: 0px !important; + } + .ga-xxl-1 { + gap: 4px !important; + } + .ga-xxl-2 { + gap: 8px !important; + } + .ga-xxl-3 { + gap: 12px !important; + } + .ga-xxl-4 { + gap: 16px !important; + } + .ga-xxl-5 { + gap: 20px !important; + } + .ga-xxl-6 { + gap: 24px !important; + } + .ga-xxl-7 { + gap: 28px !important; + } + .ga-xxl-8 { + gap: 32px !important; + } + .ga-xxl-9 { + gap: 36px !important; + } + .ga-xxl-10 { + gap: 40px !important; + } + .ga-xxl-11 { + gap: 44px !important; + } + .ga-xxl-12 { + gap: 48px !important; + } + .ga-xxl-13 { + gap: 52px !important; + } + .ga-xxl-14 { + gap: 56px !important; + } + .ga-xxl-15 { + gap: 60px !important; + } + .ga-xxl-16 { + gap: 64px !important; + } + .ga-xxl-auto { + gap: auto !important; + } + .gr-xxl-0 { + row-gap: 0px !important; + } + .gr-xxl-1 { + row-gap: 4px !important; + } + .gr-xxl-2 { + row-gap: 8px !important; + } + .gr-xxl-3 { + row-gap: 12px !important; + } + .gr-xxl-4 { + row-gap: 16px !important; + } + .gr-xxl-5 { + row-gap: 20px !important; + } + .gr-xxl-6 { + row-gap: 24px !important; + } + .gr-xxl-7 { + row-gap: 28px !important; + } + .gr-xxl-8 { + row-gap: 32px !important; + } + .gr-xxl-9 { + row-gap: 36px !important; + } + .gr-xxl-10 { + row-gap: 40px !important; + } + .gr-xxl-11 { + row-gap: 44px !important; + } + .gr-xxl-12 { + row-gap: 48px !important; + } + .gr-xxl-13 { + row-gap: 52px !important; + } + .gr-xxl-14 { + row-gap: 56px !important; + } + .gr-xxl-15 { + row-gap: 60px !important; + } + .gr-xxl-16 { + row-gap: 64px !important; + } + .gr-xxl-auto { + row-gap: auto !important; + } + .gc-xxl-0 { + column-gap: 0px !important; + } + .gc-xxl-1 { + column-gap: 4px !important; + } + .gc-xxl-2 { + column-gap: 8px !important; + } + .gc-xxl-3 { + column-gap: 12px !important; + } + .gc-xxl-4 { + column-gap: 16px !important; + } + .gc-xxl-5 { + column-gap: 20px !important; + } + .gc-xxl-6 { + column-gap: 24px !important; + } + .gc-xxl-7 { + column-gap: 28px !important; + } + .gc-xxl-8 { + column-gap: 32px !important; + } + .gc-xxl-9 { + column-gap: 36px !important; + } + .gc-xxl-10 { + column-gap: 40px !important; + } + .gc-xxl-11 { + column-gap: 44px !important; + } + .gc-xxl-12 { + column-gap: 48px !important; + } + .gc-xxl-13 { + column-gap: 52px !important; + } + .gc-xxl-14 { + column-gap: 56px !important; + } + .gc-xxl-15 { + column-gap: 60px !important; + } + .gc-xxl-16 { + column-gap: 64px !important; + } + .gc-xxl-auto { + column-gap: auto !important; + } + .ma-xxl-0 { + margin: 0px !important; + } + .ma-xxl-1 { + margin: 4px !important; + } + .ma-xxl-2 { + margin: 8px !important; + } + .ma-xxl-3 { + margin: 12px !important; + } + .ma-xxl-4 { + margin: 16px !important; + } + .ma-xxl-5 { + margin: 20px !important; + } + .ma-xxl-6 { + margin: 24px !important; + } + .ma-xxl-7 { + margin: 28px !important; + } + .ma-xxl-8 { + margin: 32px !important; + } + .ma-xxl-9 { + margin: 36px !important; + } + .ma-xxl-10 { + margin: 40px !important; + } + .ma-xxl-11 { + margin: 44px !important; + } + .ma-xxl-12 { + margin: 48px !important; + } + .ma-xxl-13 { + margin: 52px !important; + } + .ma-xxl-14 { + margin: 56px !important; + } + .ma-xxl-15 { + margin: 60px !important; + } + .ma-xxl-16 { + margin: 64px !important; + } + .ma-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0px !important; + margin-left: 0px !important; + } + .mx-xxl-1 { + margin-right: 4px !important; + margin-left: 4px !important; + } + .mx-xxl-2 { + margin-right: 8px !important; + margin-left: 8px !important; + } + .mx-xxl-3 { + margin-right: 12px !important; + margin-left: 12px !important; + } + .mx-xxl-4 { + margin-right: 16px !important; + margin-left: 16px !important; + } + .mx-xxl-5 { + margin-right: 20px !important; + margin-left: 20px !important; + } + .mx-xxl-6 { + margin-right: 24px !important; + margin-left: 24px !important; + } + .mx-xxl-7 { + margin-right: 28px !important; + margin-left: 28px !important; + } + .mx-xxl-8 { + margin-right: 32px !important; + margin-left: 32px !important; + } + .mx-xxl-9 { + margin-right: 36px !important; + margin-left: 36px !important; + } + .mx-xxl-10 { + margin-right: 40px !important; + margin-left: 40px !important; + } + .mx-xxl-11 { + margin-right: 44px !important; + margin-left: 44px !important; + } + .mx-xxl-12 { + margin-right: 48px !important; + margin-left: 48px !important; + } + .mx-xxl-13 { + margin-right: 52px !important; + margin-left: 52px !important; + } + .mx-xxl-14 { + margin-right: 56px !important; + margin-left: 56px !important; + } + .mx-xxl-15 { + margin-right: 60px !important; + margin-left: 60px !important; + } + .mx-xxl-16 { + margin-right: 64px !important; + margin-left: 64px !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0px !important; + margin-bottom: 0px !important; + } + .my-xxl-1 { + margin-top: 4px !important; + margin-bottom: 4px !important; + } + .my-xxl-2 { + margin-top: 8px !important; + margin-bottom: 8px !important; + } + .my-xxl-3 { + margin-top: 12px !important; + margin-bottom: 12px !important; + } + .my-xxl-4 { + margin-top: 16px !important; + margin-bottom: 16px !important; + } + .my-xxl-5 { + margin-top: 20px !important; + margin-bottom: 20px !important; + } + .my-xxl-6 { + margin-top: 24px !important; + margin-bottom: 24px !important; + } + .my-xxl-7 { + margin-top: 28px !important; + margin-bottom: 28px !important; + } + .my-xxl-8 { + margin-top: 32px !important; + margin-bottom: 32px !important; + } + .my-xxl-9 { + margin-top: 36px !important; + margin-bottom: 36px !important; + } + .my-xxl-10 { + margin-top: 40px !important; + margin-bottom: 40px !important; + } + .my-xxl-11 { + margin-top: 44px !important; + margin-bottom: 44px !important; + } + .my-xxl-12 { + margin-top: 48px !important; + margin-bottom: 48px !important; + } + .my-xxl-13 { + margin-top: 52px !important; + margin-bottom: 52px !important; + } + .my-xxl-14 { + margin-top: 56px !important; + margin-bottom: 56px !important; + } + .my-xxl-15 { + margin-top: 60px !important; + margin-bottom: 60px !important; + } + .my-xxl-16 { + margin-top: 64px !important; + margin-bottom: 64px !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0px !important; + } + .mt-xxl-1 { + margin-top: 4px !important; + } + .mt-xxl-2 { + margin-top: 8px !important; + } + .mt-xxl-3 { + margin-top: 12px !important; + } + .mt-xxl-4 { + margin-top: 16px !important; + } + .mt-xxl-5 { + margin-top: 20px !important; + } + .mt-xxl-6 { + margin-top: 24px !important; + } + .mt-xxl-7 { + margin-top: 28px !important; + } + .mt-xxl-8 { + margin-top: 32px !important; + } + .mt-xxl-9 { + margin-top: 36px !important; + } + .mt-xxl-10 { + margin-top: 40px !important; + } + .mt-xxl-11 { + margin-top: 44px !important; + } + .mt-xxl-12 { + margin-top: 48px !important; + } + .mt-xxl-13 { + margin-top: 52px !important; + } + .mt-xxl-14 { + margin-top: 56px !important; + } + .mt-xxl-15 { + margin-top: 60px !important; + } + .mt-xxl-16 { + margin-top: 64px !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .mr-xxl-0 { + margin-right: 0px !important; + } + .mr-xxl-1 { + margin-right: 4px !important; + } + .mr-xxl-2 { + margin-right: 8px !important; + } + .mr-xxl-3 { + margin-right: 12px !important; + } + .mr-xxl-4 { + margin-right: 16px !important; + } + .mr-xxl-5 { + margin-right: 20px !important; + } + .mr-xxl-6 { + margin-right: 24px !important; + } + .mr-xxl-7 { + margin-right: 28px !important; + } + .mr-xxl-8 { + margin-right: 32px !important; + } + .mr-xxl-9 { + margin-right: 36px !important; + } + .mr-xxl-10 { + margin-right: 40px !important; + } + .mr-xxl-11 { + margin-right: 44px !important; + } + .mr-xxl-12 { + margin-right: 48px !important; + } + .mr-xxl-13 { + margin-right: 52px !important; + } + .mr-xxl-14 { + margin-right: 56px !important; + } + .mr-xxl-15 { + margin-right: 60px !important; + } + .mr-xxl-16 { + margin-right: 64px !important; + } + .mr-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0px !important; + } + .mb-xxl-1 { + margin-bottom: 4px !important; + } + .mb-xxl-2 { + margin-bottom: 8px !important; + } + .mb-xxl-3 { + margin-bottom: 12px !important; + } + .mb-xxl-4 { + margin-bottom: 16px !important; + } + .mb-xxl-5 { + margin-bottom: 20px !important; + } + .mb-xxl-6 { + margin-bottom: 24px !important; + } + .mb-xxl-7 { + margin-bottom: 28px !important; + } + .mb-xxl-8 { + margin-bottom: 32px !important; + } + .mb-xxl-9 { + margin-bottom: 36px !important; + } + .mb-xxl-10 { + margin-bottom: 40px !important; + } + .mb-xxl-11 { + margin-bottom: 44px !important; + } + .mb-xxl-12 { + margin-bottom: 48px !important; + } + .mb-xxl-13 { + margin-bottom: 52px !important; + } + .mb-xxl-14 { + margin-bottom: 56px !important; + } + .mb-xxl-15 { + margin-bottom: 60px !important; + } + .mb-xxl-16 { + margin-bottom: 64px !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ml-xxl-0 { + margin-left: 0px !important; + } + .ml-xxl-1 { + margin-left: 4px !important; + } + .ml-xxl-2 { + margin-left: 8px !important; + } + .ml-xxl-3 { + margin-left: 12px !important; + } + .ml-xxl-4 { + margin-left: 16px !important; + } + .ml-xxl-5 { + margin-left: 20px !important; + } + .ml-xxl-6 { + margin-left: 24px !important; + } + .ml-xxl-7 { + margin-left: 28px !important; + } + .ml-xxl-8 { + margin-left: 32px !important; + } + .ml-xxl-9 { + margin-left: 36px !important; + } + .ml-xxl-10 { + margin-left: 40px !important; + } + .ml-xxl-11 { + margin-left: 44px !important; + } + .ml-xxl-12 { + margin-left: 48px !important; + } + .ml-xxl-13 { + margin-left: 52px !important; + } + .ml-xxl-14 { + margin-left: 56px !important; + } + .ml-xxl-15 { + margin-left: 60px !important; + } + .ml-xxl-16 { + margin-left: 64px !important; + } + .ml-xxl-auto { + margin-left: auto !important; + } + .ms-xxl-0 { + margin-inline-start: 0px !important; + } + .ms-xxl-1 { + margin-inline-start: 4px !important; + } + .ms-xxl-2 { + margin-inline-start: 8px !important; + } + .ms-xxl-3 { + margin-inline-start: 12px !important; + } + .ms-xxl-4 { + margin-inline-start: 16px !important; + } + .ms-xxl-5 { + margin-inline-start: 20px !important; + } + .ms-xxl-6 { + margin-inline-start: 24px !important; + } + .ms-xxl-7 { + margin-inline-start: 28px !important; + } + .ms-xxl-8 { + margin-inline-start: 32px !important; + } + .ms-xxl-9 { + margin-inline-start: 36px !important; + } + .ms-xxl-10 { + margin-inline-start: 40px !important; + } + .ms-xxl-11 { + margin-inline-start: 44px !important; + } + .ms-xxl-12 { + margin-inline-start: 48px !important; + } + .ms-xxl-13 { + margin-inline-start: 52px !important; + } + .ms-xxl-14 { + margin-inline-start: 56px !important; + } + .ms-xxl-15 { + margin-inline-start: 60px !important; + } + .ms-xxl-16 { + margin-inline-start: 64px !important; + } + .ms-xxl-auto { + margin-inline-start: auto !important; + } + .me-xxl-0 { + margin-inline-end: 0px !important; + } + .me-xxl-1 { + margin-inline-end: 4px !important; + } + .me-xxl-2 { + margin-inline-end: 8px !important; + } + .me-xxl-3 { + margin-inline-end: 12px !important; + } + .me-xxl-4 { + margin-inline-end: 16px !important; + } + .me-xxl-5 { + margin-inline-end: 20px !important; + } + .me-xxl-6 { + margin-inline-end: 24px !important; + } + .me-xxl-7 { + margin-inline-end: 28px !important; + } + .me-xxl-8 { + margin-inline-end: 32px !important; + } + .me-xxl-9 { + margin-inline-end: 36px !important; + } + .me-xxl-10 { + margin-inline-end: 40px !important; + } + .me-xxl-11 { + margin-inline-end: 44px !important; + } + .me-xxl-12 { + margin-inline-end: 48px !important; + } + .me-xxl-13 { + margin-inline-end: 52px !important; + } + .me-xxl-14 { + margin-inline-end: 56px !important; + } + .me-xxl-15 { + margin-inline-end: 60px !important; + } + .me-xxl-16 { + margin-inline-end: 64px !important; + } + .me-xxl-auto { + margin-inline-end: auto !important; + } + .ma-xxl-n1 { + margin: -4px !important; + } + .ma-xxl-n2 { + margin: -8px !important; + } + .ma-xxl-n3 { + margin: -12px !important; + } + .ma-xxl-n4 { + margin: -16px !important; + } + .ma-xxl-n5 { + margin: -20px !important; + } + .ma-xxl-n6 { + margin: -24px !important; + } + .ma-xxl-n7 { + margin: -28px !important; + } + .ma-xxl-n8 { + margin: -32px !important; + } + .ma-xxl-n9 { + margin: -36px !important; + } + .ma-xxl-n10 { + margin: -40px !important; + } + .ma-xxl-n11 { + margin: -44px !important; + } + .ma-xxl-n12 { + margin: -48px !important; + } + .ma-xxl-n13 { + margin: -52px !important; + } + .ma-xxl-n14 { + margin: -56px !important; + } + .ma-xxl-n15 { + margin: -60px !important; + } + .ma-xxl-n16 { + margin: -64px !important; + } + .mx-xxl-n1 { + margin-right: -4px !important; + margin-left: -4px !important; + } + .mx-xxl-n2 { + margin-right: -8px !important; + margin-left: -8px !important; + } + .mx-xxl-n3 { + margin-right: -12px !important; + margin-left: -12px !important; + } + .mx-xxl-n4 { + margin-right: -16px !important; + margin-left: -16px !important; + } + .mx-xxl-n5 { + margin-right: -20px !important; + margin-left: -20px !important; + } + .mx-xxl-n6 { + margin-right: -24px !important; + margin-left: -24px !important; + } + .mx-xxl-n7 { + margin-right: -28px !important; + margin-left: -28px !important; + } + .mx-xxl-n8 { + margin-right: -32px !important; + margin-left: -32px !important; + } + .mx-xxl-n9 { + margin-right: -36px !important; + margin-left: -36px !important; + } + .mx-xxl-n10 { + margin-right: -40px !important; + margin-left: -40px !important; + } + .mx-xxl-n11 { + margin-right: -44px !important; + margin-left: -44px !important; + } + .mx-xxl-n12 { + margin-right: -48px !important; + margin-left: -48px !important; + } + .mx-xxl-n13 { + margin-right: -52px !important; + margin-left: -52px !important; + } + .mx-xxl-n14 { + margin-right: -56px !important; + margin-left: -56px !important; + } + .mx-xxl-n15 { + margin-right: -60px !important; + margin-left: -60px !important; + } + .mx-xxl-n16 { + margin-right: -64px !important; + margin-left: -64px !important; + } + .my-xxl-n1 { + margin-top: -4px !important; + margin-bottom: -4px !important; + } + .my-xxl-n2 { + margin-top: -8px !important; + margin-bottom: -8px !important; + } + .my-xxl-n3 { + margin-top: -12px !important; + margin-bottom: -12px !important; + } + .my-xxl-n4 { + margin-top: -16px !important; + margin-bottom: -16px !important; + } + .my-xxl-n5 { + margin-top: -20px !important; + margin-bottom: -20px !important; + } + .my-xxl-n6 { + margin-top: -24px !important; + margin-bottom: -24px !important; + } + .my-xxl-n7 { + margin-top: -28px !important; + margin-bottom: -28px !important; + } + .my-xxl-n8 { + margin-top: -32px !important; + margin-bottom: -32px !important; + } + .my-xxl-n9 { + margin-top: -36px !important; + margin-bottom: -36px !important; + } + .my-xxl-n10 { + margin-top: -40px !important; + margin-bottom: -40px !important; + } + .my-xxl-n11 { + margin-top: -44px !important; + margin-bottom: -44px !important; + } + .my-xxl-n12 { + margin-top: -48px !important; + margin-bottom: -48px !important; + } + .my-xxl-n13 { + margin-top: -52px !important; + margin-bottom: -52px !important; + } + .my-xxl-n14 { + margin-top: -56px !important; + margin-bottom: -56px !important; + } + .my-xxl-n15 { + margin-top: -60px !important; + margin-bottom: -60px !important; + } + .my-xxl-n16 { + margin-top: -64px !important; + margin-bottom: -64px !important; + } + .mt-xxl-n1 { + margin-top: -4px !important; + } + .mt-xxl-n2 { + margin-top: -8px !important; + } + .mt-xxl-n3 { + margin-top: -12px !important; + } + .mt-xxl-n4 { + margin-top: -16px !important; + } + .mt-xxl-n5 { + margin-top: -20px !important; + } + .mt-xxl-n6 { + margin-top: -24px !important; + } + .mt-xxl-n7 { + margin-top: -28px !important; + } + .mt-xxl-n8 { + margin-top: -32px !important; + } + .mt-xxl-n9 { + margin-top: -36px !important; + } + .mt-xxl-n10 { + margin-top: -40px !important; + } + .mt-xxl-n11 { + margin-top: -44px !important; + } + .mt-xxl-n12 { + margin-top: -48px !important; + } + .mt-xxl-n13 { + margin-top: -52px !important; + } + .mt-xxl-n14 { + margin-top: -56px !important; + } + .mt-xxl-n15 { + margin-top: -60px !important; + } + .mt-xxl-n16 { + margin-top: -64px !important; + } + .mr-xxl-n1 { + margin-right: -4px !important; + } + .mr-xxl-n2 { + margin-right: -8px !important; + } + .mr-xxl-n3 { + margin-right: -12px !important; + } + .mr-xxl-n4 { + margin-right: -16px !important; + } + .mr-xxl-n5 { + margin-right: -20px !important; + } + .mr-xxl-n6 { + margin-right: -24px !important; + } + .mr-xxl-n7 { + margin-right: -28px !important; + } + .mr-xxl-n8 { + margin-right: -32px !important; + } + .mr-xxl-n9 { + margin-right: -36px !important; + } + .mr-xxl-n10 { + margin-right: -40px !important; + } + .mr-xxl-n11 { + margin-right: -44px !important; + } + .mr-xxl-n12 { + margin-right: -48px !important; + } + .mr-xxl-n13 { + margin-right: -52px !important; + } + .mr-xxl-n14 { + margin-right: -56px !important; + } + .mr-xxl-n15 { + margin-right: -60px !important; + } + .mr-xxl-n16 { + margin-right: -64px !important; + } + .mb-xxl-n1 { + margin-bottom: -4px !important; + } + .mb-xxl-n2 { + margin-bottom: -8px !important; + } + .mb-xxl-n3 { + margin-bottom: -12px !important; + } + .mb-xxl-n4 { + margin-bottom: -16px !important; + } + .mb-xxl-n5 { + margin-bottom: -20px !important; + } + .mb-xxl-n6 { + margin-bottom: -24px !important; + } + .mb-xxl-n7 { + margin-bottom: -28px !important; + } + .mb-xxl-n8 { + margin-bottom: -32px !important; + } + .mb-xxl-n9 { + margin-bottom: -36px !important; + } + .mb-xxl-n10 { + margin-bottom: -40px !important; + } + .mb-xxl-n11 { + margin-bottom: -44px !important; + } + .mb-xxl-n12 { + margin-bottom: -48px !important; + } + .mb-xxl-n13 { + margin-bottom: -52px !important; + } + .mb-xxl-n14 { + margin-bottom: -56px !important; + } + .mb-xxl-n15 { + margin-bottom: -60px !important; + } + .mb-xxl-n16 { + margin-bottom: -64px !important; + } + .ml-xxl-n1 { + margin-left: -4px !important; + } + .ml-xxl-n2 { + margin-left: -8px !important; + } + .ml-xxl-n3 { + margin-left: -12px !important; + } + .ml-xxl-n4 { + margin-left: -16px !important; + } + .ml-xxl-n5 { + margin-left: -20px !important; + } + .ml-xxl-n6 { + margin-left: -24px !important; + } + .ml-xxl-n7 { + margin-left: -28px !important; + } + .ml-xxl-n8 { + margin-left: -32px !important; + } + .ml-xxl-n9 { + margin-left: -36px !important; + } + .ml-xxl-n10 { + margin-left: -40px !important; + } + .ml-xxl-n11 { + margin-left: -44px !important; + } + .ml-xxl-n12 { + margin-left: -48px !important; + } + .ml-xxl-n13 { + margin-left: -52px !important; + } + .ml-xxl-n14 { + margin-left: -56px !important; + } + .ml-xxl-n15 { + margin-left: -60px !important; + } + .ml-xxl-n16 { + margin-left: -64px !important; + } + .ms-xxl-n1 { + margin-inline-start: -4px !important; + } + .ms-xxl-n2 { + margin-inline-start: -8px !important; + } + .ms-xxl-n3 { + margin-inline-start: -12px !important; + } + .ms-xxl-n4 { + margin-inline-start: -16px !important; + } + .ms-xxl-n5 { + margin-inline-start: -20px !important; + } + .ms-xxl-n6 { + margin-inline-start: -24px !important; + } + .ms-xxl-n7 { + margin-inline-start: -28px !important; + } + .ms-xxl-n8 { + margin-inline-start: -32px !important; + } + .ms-xxl-n9 { + margin-inline-start: -36px !important; + } + .ms-xxl-n10 { + margin-inline-start: -40px !important; + } + .ms-xxl-n11 { + margin-inline-start: -44px !important; + } + .ms-xxl-n12 { + margin-inline-start: -48px !important; + } + .ms-xxl-n13 { + margin-inline-start: -52px !important; + } + .ms-xxl-n14 { + margin-inline-start: -56px !important; + } + .ms-xxl-n15 { + margin-inline-start: -60px !important; + } + .ms-xxl-n16 { + margin-inline-start: -64px !important; + } + .me-xxl-n1 { + margin-inline-end: -4px !important; + } + .me-xxl-n2 { + margin-inline-end: -8px !important; + } + .me-xxl-n3 { + margin-inline-end: -12px !important; + } + .me-xxl-n4 { + margin-inline-end: -16px !important; + } + .me-xxl-n5 { + margin-inline-end: -20px !important; + } + .me-xxl-n6 { + margin-inline-end: -24px !important; + } + .me-xxl-n7 { + margin-inline-end: -28px !important; + } + .me-xxl-n8 { + margin-inline-end: -32px !important; + } + .me-xxl-n9 { + margin-inline-end: -36px !important; + } + .me-xxl-n10 { + margin-inline-end: -40px !important; + } + .me-xxl-n11 { + margin-inline-end: -44px !important; + } + .me-xxl-n12 { + margin-inline-end: -48px !important; + } + .me-xxl-n13 { + margin-inline-end: -52px !important; + } + .me-xxl-n14 { + margin-inline-end: -56px !important; + } + .me-xxl-n15 { + margin-inline-end: -60px !important; + } + .me-xxl-n16 { + margin-inline-end: -64px !important; + } + .pa-xxl-0 { + padding: 0px !important; + } + .pa-xxl-1 { + padding: 4px !important; + } + .pa-xxl-2 { + padding: 8px !important; + } + .pa-xxl-3 { + padding: 12px !important; + } + .pa-xxl-4 { + padding: 16px !important; + } + .pa-xxl-5 { + padding: 20px !important; + } + .pa-xxl-6 { + padding: 24px !important; + } + .pa-xxl-7 { + padding: 28px !important; + } + .pa-xxl-8 { + padding: 32px !important; + } + .pa-xxl-9 { + padding: 36px !important; + } + .pa-xxl-10 { + padding: 40px !important; + } + .pa-xxl-11 { + padding: 44px !important; + } + .pa-xxl-12 { + padding: 48px !important; + } + .pa-xxl-13 { + padding: 52px !important; + } + .pa-xxl-14 { + padding: 56px !important; + } + .pa-xxl-15 { + padding: 60px !important; + } + .pa-xxl-16 { + padding: 64px !important; + } + .px-xxl-0 { + padding-right: 0px !important; + padding-left: 0px !important; + } + .px-xxl-1 { + padding-right: 4px !important; + padding-left: 4px !important; + } + .px-xxl-2 { + padding-right: 8px !important; + padding-left: 8px !important; + } + .px-xxl-3 { + padding-right: 12px !important; + padding-left: 12px !important; + } + .px-xxl-4 { + padding-right: 16px !important; + padding-left: 16px !important; + } + .px-xxl-5 { + padding-right: 20px !important; + padding-left: 20px !important; + } + .px-xxl-6 { + padding-right: 24px !important; + padding-left: 24px !important; + } + .px-xxl-7 { + padding-right: 28px !important; + padding-left: 28px !important; + } + .px-xxl-8 { + padding-right: 32px !important; + padding-left: 32px !important; + } + .px-xxl-9 { + padding-right: 36px !important; + padding-left: 36px !important; + } + .px-xxl-10 { + padding-right: 40px !important; + padding-left: 40px !important; + } + .px-xxl-11 { + padding-right: 44px !important; + padding-left: 44px !important; + } + .px-xxl-12 { + padding-right: 48px !important; + padding-left: 48px !important; + } + .px-xxl-13 { + padding-right: 52px !important; + padding-left: 52px !important; + } + .px-xxl-14 { + padding-right: 56px !important; + padding-left: 56px !important; + } + .px-xxl-15 { + padding-right: 60px !important; + padding-left: 60px !important; + } + .px-xxl-16 { + padding-right: 64px !important; + padding-left: 64px !important; + } + .py-xxl-0 { + padding-top: 0px !important; + padding-bottom: 0px !important; + } + .py-xxl-1 { + padding-top: 4px !important; + padding-bottom: 4px !important; + } + .py-xxl-2 { + padding-top: 8px !important; + padding-bottom: 8px !important; + } + .py-xxl-3 { + padding-top: 12px !important; + padding-bottom: 12px !important; + } + .py-xxl-4 { + padding-top: 16px !important; + padding-bottom: 16px !important; + } + .py-xxl-5 { + padding-top: 20px !important; + padding-bottom: 20px !important; + } + .py-xxl-6 { + padding-top: 24px !important; + padding-bottom: 24px !important; + } + .py-xxl-7 { + padding-top: 28px !important; + padding-bottom: 28px !important; + } + .py-xxl-8 { + padding-top: 32px !important; + padding-bottom: 32px !important; + } + .py-xxl-9 { + padding-top: 36px !important; + padding-bottom: 36px !important; + } + .py-xxl-10 { + padding-top: 40px !important; + padding-bottom: 40px !important; + } + .py-xxl-11 { + padding-top: 44px !important; + padding-bottom: 44px !important; + } + .py-xxl-12 { + padding-top: 48px !important; + padding-bottom: 48px !important; + } + .py-xxl-13 { + padding-top: 52px !important; + padding-bottom: 52px !important; + } + .py-xxl-14 { + padding-top: 56px !important; + padding-bottom: 56px !important; + } + .py-xxl-15 { + padding-top: 60px !important; + padding-bottom: 60px !important; + } + .py-xxl-16 { + padding-top: 64px !important; + padding-bottom: 64px !important; + } + .pt-xxl-0 { + padding-top: 0px !important; + } + .pt-xxl-1 { + padding-top: 4px !important; + } + .pt-xxl-2 { + padding-top: 8px !important; + } + .pt-xxl-3 { + padding-top: 12px !important; + } + .pt-xxl-4 { + padding-top: 16px !important; + } + .pt-xxl-5 { + padding-top: 20px !important; + } + .pt-xxl-6 { + padding-top: 24px !important; + } + .pt-xxl-7 { + padding-top: 28px !important; + } + .pt-xxl-8 { + padding-top: 32px !important; + } + .pt-xxl-9 { + padding-top: 36px !important; + } + .pt-xxl-10 { + padding-top: 40px !important; + } + .pt-xxl-11 { + padding-top: 44px !important; + } + .pt-xxl-12 { + padding-top: 48px !important; + } + .pt-xxl-13 { + padding-top: 52px !important; + } + .pt-xxl-14 { + padding-top: 56px !important; + } + .pt-xxl-15 { + padding-top: 60px !important; + } + .pt-xxl-16 { + padding-top: 64px !important; + } + .pr-xxl-0 { + padding-right: 0px !important; + } + .pr-xxl-1 { + padding-right: 4px !important; + } + .pr-xxl-2 { + padding-right: 8px !important; + } + .pr-xxl-3 { + padding-right: 12px !important; + } + .pr-xxl-4 { + padding-right: 16px !important; + } + .pr-xxl-5 { + padding-right: 20px !important; + } + .pr-xxl-6 { + padding-right: 24px !important; + } + .pr-xxl-7 { + padding-right: 28px !important; + } + .pr-xxl-8 { + padding-right: 32px !important; + } + .pr-xxl-9 { + padding-right: 36px !important; + } + .pr-xxl-10 { + padding-right: 40px !important; + } + .pr-xxl-11 { + padding-right: 44px !important; + } + .pr-xxl-12 { + padding-right: 48px !important; + } + .pr-xxl-13 { + padding-right: 52px !important; + } + .pr-xxl-14 { + padding-right: 56px !important; + } + .pr-xxl-15 { + padding-right: 60px !important; + } + .pr-xxl-16 { + padding-right: 64px !important; + } + .pb-xxl-0 { + padding-bottom: 0px !important; + } + .pb-xxl-1 { + padding-bottom: 4px !important; + } + .pb-xxl-2 { + padding-bottom: 8px !important; + } + .pb-xxl-3 { + padding-bottom: 12px !important; + } + .pb-xxl-4 { + padding-bottom: 16px !important; + } + .pb-xxl-5 { + padding-bottom: 20px !important; + } + .pb-xxl-6 { + padding-bottom: 24px !important; + } + .pb-xxl-7 { + padding-bottom: 28px !important; + } + .pb-xxl-8 { + padding-bottom: 32px !important; + } + .pb-xxl-9 { + padding-bottom: 36px !important; + } + .pb-xxl-10 { + padding-bottom: 40px !important; + } + .pb-xxl-11 { + padding-bottom: 44px !important; + } + .pb-xxl-12 { + padding-bottom: 48px !important; + } + .pb-xxl-13 { + padding-bottom: 52px !important; + } + .pb-xxl-14 { + padding-bottom: 56px !important; + } + .pb-xxl-15 { + padding-bottom: 60px !important; + } + .pb-xxl-16 { + padding-bottom: 64px !important; + } + .pl-xxl-0 { + padding-left: 0px !important; + } + .pl-xxl-1 { + padding-left: 4px !important; + } + .pl-xxl-2 { + padding-left: 8px !important; + } + .pl-xxl-3 { + padding-left: 12px !important; + } + .pl-xxl-4 { + padding-left: 16px !important; + } + .pl-xxl-5 { + padding-left: 20px !important; + } + .pl-xxl-6 { + padding-left: 24px !important; + } + .pl-xxl-7 { + padding-left: 28px !important; + } + .pl-xxl-8 { + padding-left: 32px !important; + } + .pl-xxl-9 { + padding-left: 36px !important; + } + .pl-xxl-10 { + padding-left: 40px !important; + } + .pl-xxl-11 { + padding-left: 44px !important; + } + .pl-xxl-12 { + padding-left: 48px !important; + } + .pl-xxl-13 { + padding-left: 52px !important; + } + .pl-xxl-14 { + padding-left: 56px !important; + } + .pl-xxl-15 { + padding-left: 60px !important; + } + .pl-xxl-16 { + padding-left: 64px !important; + } + .ps-xxl-0 { + padding-inline-start: 0px !important; + } + .ps-xxl-1 { + padding-inline-start: 4px !important; + } + .ps-xxl-2 { + padding-inline-start: 8px !important; + } + .ps-xxl-3 { + padding-inline-start: 12px !important; + } + .ps-xxl-4 { + padding-inline-start: 16px !important; + } + .ps-xxl-5 { + padding-inline-start: 20px !important; + } + .ps-xxl-6 { + padding-inline-start: 24px !important; + } + .ps-xxl-7 { + padding-inline-start: 28px !important; + } + .ps-xxl-8 { + padding-inline-start: 32px !important; + } + .ps-xxl-9 { + padding-inline-start: 36px !important; + } + .ps-xxl-10 { + padding-inline-start: 40px !important; + } + .ps-xxl-11 { + padding-inline-start: 44px !important; + } + .ps-xxl-12 { + padding-inline-start: 48px !important; + } + .ps-xxl-13 { + padding-inline-start: 52px !important; + } + .ps-xxl-14 { + padding-inline-start: 56px !important; + } + .ps-xxl-15 { + padding-inline-start: 60px !important; + } + .ps-xxl-16 { + padding-inline-start: 64px !important; + } + .pe-xxl-0 { + padding-inline-end: 0px !important; + } + .pe-xxl-1 { + padding-inline-end: 4px !important; + } + .pe-xxl-2 { + padding-inline-end: 8px !important; + } + .pe-xxl-3 { + padding-inline-end: 12px !important; + } + .pe-xxl-4 { + padding-inline-end: 16px !important; + } + .pe-xxl-5 { + padding-inline-end: 20px !important; + } + .pe-xxl-6 { + padding-inline-end: 24px !important; + } + .pe-xxl-7 { + padding-inline-end: 28px !important; + } + .pe-xxl-8 { + padding-inline-end: 32px !important; + } + .pe-xxl-9 { + padding-inline-end: 36px !important; + } + .pe-xxl-10 { + padding-inline-end: 40px !important; + } + .pe-xxl-11 { + padding-inline-end: 44px !important; + } + .pe-xxl-12 { + padding-inline-end: 48px !important; + } + .pe-xxl-13 { + padding-inline-end: 52px !important; + } + .pe-xxl-14 { + padding-inline-end: 56px !important; + } + .pe-xxl-15 { + padding-inline-end: 60px !important; + } + .pe-xxl-16 { + padding-inline-end: 64px !important; + } + .text-xxl-left { + text-align: left !important; + } + .text-xxl-right { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } + .text-xxl-justify { + text-align: justify !important; + } + .text-xxl-start { + text-align: start !important; + } + .text-xxl-end { + text-align: end !important; + } + .text-xxl-h1 { + font-size: 6rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.015625em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h2 { + font-size: 3.75rem !important; + font-weight: 300; + line-height: 1; + letter-spacing: -0.0083333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h3 { + font-size: 3rem !important; + font-weight: 400; + line-height: 1.05; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h4 { + font-size: 2.125rem !important; + font-weight: 400; + line-height: 1.175; + letter-spacing: 0.0073529412em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h5 { + font-size: 1.5rem !important; + font-weight: 400; + line-height: 1.333; + letter-spacing: normal !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-h6 { + font-size: 1.25rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-subtitle-1 { + font-size: 1rem !important; + font-weight: normal; + line-height: 1.75; + letter-spacing: 0.009375em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-subtitle-2 { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 1.6; + letter-spacing: 0.0071428571em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-body-1 { + font-size: 1rem !important; + font-weight: 400; + line-height: 1.5; + letter-spacing: 0.03125em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-body-2 { + font-size: 0.875rem !important; + font-weight: 400; + line-height: 1.425; + letter-spacing: 0.0178571429em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-button { + font-size: 0.875rem !important; + font-weight: 500; + line-height: 2.6; + letter-spacing: 0.0892857143em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .text-xxl-caption { + font-size: 0.75rem !important; + font-weight: 400; + line-height: 1.667; + letter-spacing: 0.0333333333em !important; + font-family: "Roboto", sans-serif; + text-transform: none !important; + } + .text-xxl-overline { + font-size: 0.75rem !important; + font-weight: 500; + line-height: 2.667; + letter-spacing: 0.1666666667em !important; + font-family: "Roboto", sans-serif; + text-transform: uppercase !important; + } + .h-xxl-auto { + height: auto !important; + } + .h-xxl-screen { + height: 100vh !important; + } + .h-xxl-0 { + height: 0 !important; + } + .h-xxl-25 { + height: 25% !important; + } + .h-xxl-50 { + height: 50% !important; + } + .h-xxl-75 { + height: 75% !important; + } + .h-xxl-100 { + height: 100% !important; + } + .w-xxl-auto { + width: auto !important; + } + .w-xxl-0 { + width: 0 !important; + } + .w-xxl-25 { + width: 25% !important; + } + .w-xxl-33 { + width: 33% !important; + } + .w-xxl-50 { + width: 50% !important; + } + .w-xxl-66 { + width: 66% !important; + } + .w-xxl-75 { + width: 75% !important; + } + .w-xxl-100 { + width: 100% !important; + } +} +@media print { + .d-print-none { + display: none !important; + } + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .float-print-none { + float: none !important; + } + .float-print-left { + float: left !important; + } + .float-print-right { + float: right !important; + } + .v-locale--is-rtl .float-print-end { + float: left !important; + } + .v-locale--is-rtl .float-print-start { + float: right !important; + } + .v-locale--is-ltr .float-print-end { + float: right !important; + } + .v-locale--is-ltr .float-print-start { + float: left !important; + } +}.v-application { + display: flex; + background: rgb(var(--v-theme-background)); + color: rgba(var(--v-theme-on-background), var(--v-high-emphasis-opacity)); +} + +.v-application__wrap { + backface-visibility: hidden; + display: flex; + flex-direction: column; + flex: 1 1 auto; + max-width: 100%; + min-height: 100vh; + min-height: 100dvh; + position: relative; +}.v-app-bar { + display: flex; +} +.v-app-bar.v-toolbar { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-app-bar.v-toolbar:not(.v-toolbar--flat) { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-app-bar:not(.v-toolbar--absolute) { + padding-inline-end: var(--v-scrollbar-offset); +}.v-toolbar { + align-items: flex-start; + display: flex; + flex: none; + flex-direction: column; + justify-content: space-between; + max-width: 100%; + position: relative; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition-property: height, width, transform, max-width, left, right, top, bottom, box-shadow; + width: 100%; +} +.v-toolbar { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-toolbar--border { + border-width: thin; + box-shadow: none; +} +.v-toolbar { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-toolbar { + border-radius: 0; +} +.v-toolbar { + background: rgb(var(--v-theme-surface-light)); + color: rgba(var(--v-theme-on-surface-light), var(--v-high-emphasis-opacity)); +} +.v-toolbar--absolute { + position: absolute; +} +.v-toolbar--collapse { + max-width: 112px; + overflow: hidden; + border-end-end-radius: 24px; +} +.v-toolbar--collapse .v-toolbar-title { + display: none; +} +.v-toolbar--flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-toolbar--floating { + display: inline-flex; + width: auto; +} +.v-toolbar--rounded { + border-radius: 4px; +} + +.v-toolbar__content, +.v-toolbar__extension { + align-items: center; + display: flex; + flex: 0 0 auto; + position: relative; + transition: inherit; + width: 100%; +} + +.v-toolbar__content { + overflow: hidden; +} +.v-toolbar__content > .v-btn:first-child { + margin-inline-start: 4px; +} +.v-toolbar__content > .v-btn:last-child { + margin-inline-end: 4px; +} +.v-toolbar__content > .v-toolbar-title { + margin-inline-start: 20px; +} +.v-toolbar--density-prominent .v-toolbar__content { + align-items: flex-start; +} + +.v-toolbar__image { + display: flex; + opacity: var(--v-toolbar-image-opacity, 1); + transition-property: opacity; +} +.v-toolbar__image { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.v-toolbar__prepend, +.v-toolbar__append { + align-items: center; + align-self: stretch; + display: flex; +} + +.v-toolbar__prepend { + margin-inline: 4px auto; +} + +.v-toolbar__append { + margin-inline: auto 4px; +} + +.v-toolbar-title { + flex: 1 1; + font-size: 1.25rem; + min-width: 0; +} +.v-toolbar-title { + font-size: 1.25rem; + font-weight: 400; + letter-spacing: 0; + line-height: 1.75rem; + text-transform: none; +} +.v-toolbar--density-prominent .v-toolbar-title { + align-self: flex-end; + padding-bottom: 6px; +} +.v-toolbar--density-prominent .v-toolbar-title { + font-size: 1.5rem; + font-weight: 400; + letter-spacing: 0; + line-height: 2.25rem; + text-transform: none; +} + +.v-toolbar-title__placeholder { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.v-toolbar-items { + display: flex; + height: inherit; + align-self: stretch; +} +.v-toolbar-items > .v-btn { + border-radius: 0; +}.v-img { + --v-theme-overlay-multiplier: 3; + z-index: 0; +} +.v-img.v-img--absolute { + height: 100%; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; + z-index: -1; +} +.v-img--booting .v-responsive__sizer { + transition: none; +} +.v-img--rounded { + border-radius: 4px; +} + +.v-img__img, +.v-img__picture, +.v-img__gradient, +.v-img__placeholder, +.v-img__error { + z-index: -1; +} +.v-img__img, +.v-img__picture, +.v-img__gradient, +.v-img__placeholder, +.v-img__error { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.v-img__img--preload { + filter: blur(4px); +} +.v-img__img--contain { + object-fit: contain; +} +.v-img__img--cover { + object-fit: cover; +} + +.v-img__gradient { + background-repeat: no-repeat; +}.v-responsive { + display: flex; + flex: 1 0 auto; + max-height: 100%; + max-width: 100%; + overflow: hidden; + position: relative; +} +.v-responsive--inline { + display: inline-flex; + flex: 0 0 auto; +} + +.v-responsive__content { + flex: 1 0 0px; + max-width: 100%; +} + +.v-responsive__sizer ~ .v-responsive__content { + margin-inline-start: -100%; +} + +.v-responsive__sizer { + flex: 1 0 0px; + transition: padding-bottom 0.2s cubic-bezier(0.4, 0, 0.2, 1); + pointer-events: none; +}.v-btn { + align-items: center; + border-radius: 4px; + display: inline-grid; + grid-template-areas: "prepend content append"; + grid-template-columns: max-content auto max-content; + font-weight: 500; + justify-content: center; + letter-spacing: 0.0892857143em; + line-height: normal; + max-width: 100%; + outline: none; + position: relative; + text-decoration: none; + text-indent: 0.0892857143em; + text-transform: uppercase; + transition-property: box-shadow, transform, opacity, background; + transition-duration: 0.28s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + user-select: none; + vertical-align: middle; + flex-shrink: 0; +} +.v-btn--size-x-small { + --v-btn-size: 0.625rem; + --v-btn-height: 20px; + font-size: var(--v-btn-size); + min-width: 36px; + padding: 0 8px; +} + +.v-btn--size-small { + --v-btn-size: 0.75rem; + --v-btn-height: 28px; + font-size: var(--v-btn-size); + min-width: 50px; + padding: 0 12px; +} + +.v-btn--size-default { + --v-btn-size: 0.875rem; + --v-btn-height: 36px; + font-size: var(--v-btn-size); + min-width: 64px; + padding: 0 16px; +} + +.v-btn--size-large { + --v-btn-size: 1rem; + --v-btn-height: 44px; + font-size: var(--v-btn-size); + min-width: 78px; + padding: 0 20px; +} + +.v-btn--size-x-large { + --v-btn-size: 1.125rem; + --v-btn-height: 52px; + font-size: var(--v-btn-size); + min-width: 92px; + padding: 0 24px; +} + +.v-btn.v-btn--density-default { + height: calc(var(--v-btn-height) + 0px); +} + +.v-btn.v-btn--density-comfortable { + height: calc(var(--v-btn-height) + -8px); +} + +.v-btn.v-btn--density-compact { + height: calc(var(--v-btn-height) + -12px); +} + +.v-btn { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-btn--border { + border-width: thin; + box-shadow: none; +} +.v-btn--absolute { + position: absolute; +} +.v-btn--fixed { + position: fixed; +} +.v-btn:hover > .v-btn__overlay { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-btn:focus-visible > .v-btn__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-btn:focus > .v-btn__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} +.v-btn--active > .v-btn__overlay, .v-btn[aria-haspopup=menu][aria-expanded=true] > .v-btn__overlay { + opacity: calc(var(--v-activated-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-btn--active:hover > .v-btn__overlay, .v-btn[aria-haspopup=menu][aria-expanded=true]:hover > .v-btn__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); +} +.v-btn--active:focus-visible > .v-btn__overlay, .v-btn[aria-haspopup=menu][aria-expanded=true]:focus-visible > .v-btn__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-btn--active:focus > .v-btn__overlay, .v-btn[aria-haspopup=menu][aria-expanded=true]:focus > .v-btn__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-btn--variant-plain, .v-btn--variant-outlined, .v-btn--variant-text, .v-btn--variant-tonal { + background: transparent; + color: inherit; +} +.v-btn--variant-plain { + opacity: 0.62; +} +.v-btn--variant-plain:focus, .v-btn--variant-plain:hover { + opacity: 1; +} +.v-btn--variant-plain .v-btn__overlay { + display: none; +} +.v-btn--variant-elevated, .v-btn--variant-flat { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-btn--variant-elevated { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-btn--variant-flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-btn--variant-outlined { + border: thin solid currentColor; +} +.v-btn--variant-text .v-btn__overlay { + background: currentColor; +} +.v-btn--variant-tonal .v-btn__underlay { + background: currentColor; + opacity: var(--v-activated-opacity); + border-radius: inherit; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} +.v-btn .v-btn__underlay { + position: absolute; +} +@supports selector(:focus-visible) { + .v-btn::after { + pointer-events: none; + border: 2px solid currentColor; + border-radius: inherit; + opacity: 0; + transition: opacity 0.2s ease-in-out; + } + .v-btn::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + .v-btn:focus-visible::after { + opacity: calc(0.25 * var(--v-theme-overlay-multiplier)); + } +} +.v-btn--icon { + border-radius: 50%; + min-width: 0; + padding: 0; +} +.v-btn--icon.v-btn--size-default { + --v-btn-size: 1rem; +} +.v-btn--icon.v-btn--density-default { + width: calc(var(--v-btn-height) + 12px); + height: calc(var(--v-btn-height) + 12px); +} +.v-btn--icon.v-btn--density-comfortable { + width: calc(var(--v-btn-height) + 0px); + height: calc(var(--v-btn-height) + 0px); +} +.v-btn--icon.v-btn--density-compact { + width: calc(var(--v-btn-height) + -8px); + height: calc(var(--v-btn-height) + -8px); +} + +.v-btn--elevated:hover, .v-btn--elevated:focus { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-btn--elevated:active { + box-shadow: 0px 5px 5px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 8px 10px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 3px 14px 2px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-btn--flat { + box-shadow: none; +} +.v-btn--block { + display: flex; + flex: 1 0 auto; + min-width: 100%; +} +.v-btn--disabled { + pointer-events: none; + opacity: 0.26; +} +.v-btn--disabled:hover { + opacity: 0.26; +} +.v-btn--disabled.v-btn--variant-elevated, .v-btn--disabled.v-btn--variant-flat { + box-shadow: none; + opacity: 1; + color: rgba(var(--v-theme-on-surface), 0.26); + background: rgb(var(--v-theme-surface)); +} +.v-btn--disabled.v-btn--variant-elevated .v-btn__overlay, .v-btn--disabled.v-btn--variant-flat .v-btn__overlay { + opacity: 0.4615384615; +} +.v-btn--loading { + pointer-events: none; +} +.v-btn--loading .v-btn__content, +.v-btn--loading .v-btn__prepend, +.v-btn--loading .v-btn__append { + opacity: 0; +} +.v-btn--stacked { + grid-template-areas: "prepend" "content" "append"; + grid-template-columns: auto; + grid-template-rows: max-content max-content max-content; + justify-items: center; + align-content: center; +} +.v-btn--stacked .v-btn__content { + flex-direction: column; + line-height: 1.25; +} +.v-btn--stacked .v-btn__prepend, +.v-btn--stacked .v-btn__append, +.v-btn--stacked .v-btn__content > .v-icon--start, +.v-btn--stacked .v-btn__content > .v-icon--end { + margin-inline: 0; +} +.v-btn--stacked .v-btn__prepend, +.v-btn--stacked .v-btn__content > .v-icon--start { + margin-bottom: 4px; +} +.v-btn--stacked .v-btn__append, +.v-btn--stacked .v-btn__content > .v-icon--end { + margin-top: 4px; +} +.v-btn--stacked.v-btn--size-x-small { + --v-btn-size: 0.625rem; + --v-btn-height: 56px; + font-size: var(--v-btn-size); + min-width: 56px; + padding: 0 12px; +} + +.v-btn--stacked.v-btn--size-small { + --v-btn-size: 0.75rem; + --v-btn-height: 64px; + font-size: var(--v-btn-size); + min-width: 64px; + padding: 0 14px; +} + +.v-btn--stacked.v-btn--size-default { + --v-btn-size: 0.875rem; + --v-btn-height: 72px; + font-size: var(--v-btn-size); + min-width: 72px; + padding: 0 16px; +} + +.v-btn--stacked.v-btn--size-large { + --v-btn-size: 1rem; + --v-btn-height: 80px; + font-size: var(--v-btn-size); + min-width: 80px; + padding: 0 18px; +} + +.v-btn--stacked.v-btn--size-x-large { + --v-btn-size: 1.125rem; + --v-btn-height: 88px; + font-size: var(--v-btn-size); + min-width: 88px; + padding: 0 20px; +} + +.v-btn--stacked.v-btn--density-default { + height: calc(var(--v-btn-height) + 0px); +} + +.v-btn--stacked.v-btn--density-comfortable { + height: calc(var(--v-btn-height) + -16px); +} + +.v-btn--stacked.v-btn--density-compact { + height: calc(var(--v-btn-height) + -24px); +} + +.v-btn--slim { + padding: 0 8px; +} +.v-btn--readonly { + pointer-events: none; +} +.v-btn--rounded { + border-radius: 24px; +} +.v-btn--rounded.v-btn--icon { + border-radius: 4px; +} +.v-btn .v-icon { + --v-icon-size-multiplier: 0.8571428571; +} +.v-btn--icon .v-icon { + --v-icon-size-multiplier: 1; +} +.v-btn--stacked .v-icon { + --v-icon-size-multiplier: 1.1428571429; +} +.v-btn--stacked.v-btn--block { + min-width: 100%; +} + +.v-btn__loader { + align-items: center; + display: flex; + height: 100%; + justify-content: center; + left: 0; + position: absolute; + top: 0; + width: 100%; +} +.v-btn__loader > .v-progress-circular { + width: 1.5em; + height: 1.5em; +} + +.v-btn__content, +.v-btn__prepend, +.v-btn__append { + align-items: center; + display: flex; + transition: transform, opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.v-btn__prepend { + grid-area: prepend; + margin-inline: calc(var(--v-btn-height) / -9) calc(var(--v-btn-height) / 4.5); +} +.v-btn--slim .v-btn__prepend { + margin-inline-start: 0; +} + +.v-btn__append { + grid-area: append; + margin-inline: calc(var(--v-btn-height) / 4.5) calc(var(--v-btn-height) / -9); +} +.v-btn--slim .v-btn__append { + margin-inline-end: 0; +} + +.v-btn__content { + grid-area: content; + justify-content: center; + white-space: nowrap; +} +.v-btn__content > .v-icon--start { + margin-inline: calc(var(--v-btn-height) / -9) calc(var(--v-btn-height) / 4.5); +} +.v-btn__content > .v-icon--end { + margin-inline: calc(var(--v-btn-height) / 4.5) calc(var(--v-btn-height) / -9); +} +.v-btn--stacked .v-btn__content { + white-space: normal; +} + +.v-btn__overlay { + background-color: currentColor; + border-radius: inherit; + opacity: 0; + transition: opacity 0.2s ease-in-out; +} + +.v-btn__overlay, +.v-btn__underlay { + pointer-events: none; +} +.v-btn__overlay, +.v-btn__underlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.v-pagination .v-btn { + width: auto; + padding-inline: 5px; +} +.v-pagination .v-btn.v-btn--density-default { + min-width: calc(var(--v-btn-height) + 12px); +} +.v-pagination .v-btn.v-btn--density-comfortable { + min-width: calc(var(--v-btn-height) + 0px); +} +.v-pagination .v-btn.v-btn--density-compact { + min-width: calc(var(--v-btn-height) + -8px); +} +.v-pagination .v-btn { + border-radius: 4px; +} +.v-pagination .v-btn--rounded { + border-radius: 50%; +} +.v-pagination .v-btn__overlay { + transition: none; +} +.v-pagination__prev .v-btn, .v-pagination__next .v-btn { + padding-inline: 0; +} +.v-pagination__prev .v-btn.v-btn--density-default, .v-pagination__next .v-btn.v-btn--density-default { + width: calc(var(--v-btn-height) + 12px); +} +.v-pagination__prev .v-btn.v-btn--density-comfortable, .v-pagination__next .v-btn.v-btn--density-comfortable { + width: calc(var(--v-btn-height) + 0px); +} +.v-pagination__prev .v-btn.v-btn--density-compact, .v-pagination__next .v-btn.v-btn--density-compact { + width: calc(var(--v-btn-height) + -8px); +} +.v-pagination .v-pagination__item--is-active .v-btn__overlay { + opacity: var(--v-border-opacity); +}.v-btn-toggle > .v-btn.v-btn--active:not(.v-btn--disabled) > .v-btn__overlay { + opacity: calc(var(--v-activated-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-btn-toggle > .v-btn.v-btn--active:not(.v-btn--disabled):hover > .v-btn__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); +} +.v-btn-toggle > .v-btn.v-btn--active:not(.v-btn--disabled):focus-visible > .v-btn__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-btn-toggle > .v-btn.v-btn--active:not(.v-btn--disabled):focus > .v-btn__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-btn-toggle > .v-btn.v-btn--active:not(.v-btn--disabled).v-btn--variant-plain { + opacity: 1; +}.v-btn-group { + display: inline-flex; + flex-wrap: nowrap; + max-width: 100%; + min-width: 0; + overflow: hidden; + vertical-align: middle; +} +.v-btn-group { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-btn-group--border { + border-width: thin; + box-shadow: none; +} +.v-btn-group { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-btn-group { + border-radius: 4px; +} +.v-btn-group { + background: transparent; + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-btn-group--density-default.v-btn-group { + height: 48px; +} + +.v-btn-group--density-comfortable.v-btn-group { + height: 40px; +} + +.v-btn-group--density-compact.v-btn-group { + height: 36px; +} + +.v-btn-group .v-btn { + border-radius: 0; + border-color: inherit; +} +.v-btn-group .v-btn:not(:last-child) { + border-inline-end: none; +} +.v-btn-group .v-btn:not(:first-child) { + border-inline-start: none; +} +.v-btn-group .v-btn:first-child { + border-start-start-radius: inherit; + border-end-start-radius: inherit; +} +.v-btn-group .v-btn:last-child { + border-start-end-radius: inherit; + border-end-end-radius: inherit; +} +.v-btn-group--divided .v-btn:not(:last-child) { + border-inline-end-width: thin; + border-inline-end-style: solid; + border-inline-end-color: rgba(var(--v-border-color), var(--v-border-opacity)); +} +.v-btn-group--tile { + border-radius: 0; +}.v-icon { + --v-icon-size-multiplier: 1; + align-items: center; + display: inline-flex; + font-feature-settings: "liga"; + height: 1em; + justify-content: center; + letter-spacing: normal; + line-height: 1; + position: relative; + opacity: var(--v-icon-opacity, 1); + text-indent: 0; + text-align: center; + user-select: none; + vertical-align: middle; + width: 1em; + min-width: 1em; +} +.v-icon--clickable { + cursor: pointer; +} +.v-icon--disabled { + pointer-events: none; + opacity: 0.38; +} +.v-icon--size-x-small { + font-size: calc(var(--v-icon-size-multiplier) * 1em); +} +.v-icon--size-small { + font-size: calc(var(--v-icon-size-multiplier) * 1.25em); +} +.v-icon--size-default { + font-size: calc(var(--v-icon-size-multiplier) * 1.5em); +} +.v-icon--size-large { + font-size: calc(var(--v-icon-size-multiplier) * 1.75em); +} +.v-icon--size-x-large { + font-size: calc(var(--v-icon-size-multiplier) * 2em); +} + +.v-icon__svg { + fill: currentColor; + width: 100%; + height: 100%; +} + +.v-icon--start { + margin-inline-end: 8px; +} + +.v-icon--end { + margin-inline-start: 8px; +}.v-progress-circular { + align-items: center; + display: inline-flex; + justify-content: center; + position: relative; + vertical-align: middle; +} +.v-progress-circular > svg { + width: 100%; + height: 100%; + margin: auto; + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 0; +} + +.v-progress-circular__content { + align-items: center; + display: flex; + justify-content: center; +} + +.v-progress-circular__underlay { + color: rgba(var(--v-border-color), var(--v-border-opacity)); + stroke: currentColor; + z-index: 1; +} + +.v-progress-circular__overlay { + stroke: currentColor; + transition: all 0.2s ease-in-out, stroke-width 0s; + z-index: 2; +} + +.v-progress-circular--size-x-small { + height: 16px; + width: 16px; +} +.v-progress-circular--size-small { + height: 24px; + width: 24px; +} +.v-progress-circular--size-default { + height: 32px; + width: 32px; +} +.v-progress-circular--size-large { + height: 48px; + width: 48px; +} +.v-progress-circular--size-x-large { + height: 64px; + width: 64px; +} + +.v-progress-circular--indeterminate > svg { + animation: progress-circular-rotate 1.4s linear infinite; + transform-origin: center center; + transition: all 0.2s ease-in-out; +} +.v-progress-circular--indeterminate .v-progress-circular__overlay { + animation: progress-circular-dash 1.4s ease-in-out infinite, progress-circular-rotate 1.4s linear infinite; + stroke-dasharray: 25, 200; + stroke-dashoffset: 0; + stroke-linecap: round; + transform-origin: center center; + transform: rotate(-90deg); +} + +.v-progress-circular--disable-shrink > svg { + animation-duration: 0.7s; +} +.v-progress-circular--disable-shrink .v-progress-circular__overlay { + animation: none; +} + +.v-progress-circular--indeterminate:not(.v-progress-circular--visible) > svg, +.v-progress-circular--indeterminate:not(.v-progress-circular--visible) .v-progress-circular__overlay { + animation-play-state: paused !important; +} + +@keyframes progress-circular-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0px; + } + 50% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -15px; + } + 100% { + stroke-dasharray: 100, 200; + stroke-dashoffset: -124px; + } +} +@keyframes progress-circular-rotate { + 100% { + transform: rotate(270deg); + } +}.v-progress-linear { + background: transparent; + overflow: hidden; + position: relative; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + width: 100%; +} +.v-progress-linear--rounded { + border-radius: 9999px; +} +@media (forced-colors: active) { + .v-progress-linear { + border: thin solid buttontext; + } +} + +.v-progress-linear__background, +.v-progress-linear__buffer { + background: currentColor; + bottom: 0; + left: 0; + opacity: var(--v-border-opacity); + position: absolute; + top: 0; + width: 100%; + transition-property: width, left, right; + transition: inherit; +} + +@media (forced-colors: active) { + .v-progress-linear__buffer { + background-color: highlight; + opacity: 0.3; + } +} +.v-progress-linear__content { + align-items: center; + display: flex; + height: 100%; + justify-content: center; + left: 0; + pointer-events: none; + position: absolute; + top: 0; + width: 100%; +} + +.v-progress-linear__determinate, +.v-progress-linear__indeterminate { + background: currentColor; +} +@media (forced-colors: active) { + .v-progress-linear__determinate, + .v-progress-linear__indeterminate { + background-color: highlight; + } +} + +.v-progress-linear__determinate { + height: inherit; + left: 0; + position: absolute; + transition: inherit; + transition-property: width, left, right; +} + +.v-progress-linear__indeterminate .long, .v-progress-linear__indeterminate .short { + animation-play-state: paused; + animation-duration: 2.2s; + animation-iteration-count: infinite; + bottom: 0; + height: inherit; + left: 0; + position: absolute; + right: auto; + top: 0; + width: auto; +} +.v-progress-linear__indeterminate .long { + animation-name: indeterminate-ltr; +} +.v-progress-linear__indeterminate .short { + animation-name: indeterminate-short-ltr; +} + +.v-progress-linear__stream { + animation: stream 0.25s infinite linear; + animation-play-state: paused; + bottom: 0; + left: auto; + opacity: 0.3; + pointer-events: none; + position: absolute; + transition: inherit; + transition-property: width, left, right; +} + +.v-progress-linear--reverse .v-progress-linear__background, +.v-progress-linear--reverse .v-progress-linear__determinate, +.v-progress-linear--reverse .v-progress-linear__content { + left: auto; + right: 0; +} +.v-progress-linear--reverse .v-progress-linear__indeterminate .long, .v-progress-linear--reverse .v-progress-linear__indeterminate .short { + left: auto; + right: 0; +} +.v-progress-linear--reverse .v-progress-linear__indeterminate .long { + animation-name: indeterminate-rtl; +} +.v-progress-linear--reverse .v-progress-linear__indeterminate .short { + animation-name: indeterminate-short-rtl; +} +.v-progress-linear--reverse .v-progress-linear__stream { + right: auto; +} + +.v-progress-linear--absolute, +.v-progress-linear--fixed { + left: 0; + z-index: 1; +} + +.v-progress-linear--absolute { + position: absolute; +} + +.v-progress-linear--fixed { + position: fixed; +} + +.v-progress-linear--rounded { + border-radius: 9999px; +} +.v-progress-linear--rounded.v-progress-linear--rounded-bar .v-progress-linear__determinate, +.v-progress-linear--rounded.v-progress-linear--rounded-bar .v-progress-linear__indeterminate { + border-radius: inherit; +} + +.v-progress-linear--striped .v-progress-linear__determinate { + animation: progress-linear-stripes 1s infinite linear; + background-image: linear-gradient(135deg, hsla(0, 0%, 100%, 0.25) 25%, transparent 0, transparent 50%, hsla(0, 0%, 100%, 0.25) 0, hsla(0, 0%, 100%, 0.25) 75%, transparent 0, transparent); + background-repeat: repeat; + background-size: var(--v-progress-linear-height); +} + +.v-progress-linear--active .v-progress-linear__indeterminate .long, .v-progress-linear--active .v-progress-linear__indeterminate .short { + animation-play-state: running; +} +.v-progress-linear--active .v-progress-linear__stream { + animation-play-state: running; +} + +.v-progress-linear--rounded-bar .v-progress-linear__determinate, +.v-progress-linear--rounded-bar .v-progress-linear__indeterminate, +.v-progress-linear--rounded-bar .v-progress-linear__stream + .v-progress-linear__background { + border-radius: 9999px; +} +.v-progress-linear--rounded-bar .v-progress-linear__determinate { + border-start-start-radius: 0; + border-end-start-radius: 0; +} + +@keyframes indeterminate-ltr { + 0% { + left: -90%; + right: 100%; + } + 60% { + left: -90%; + right: 100%; + } + 100% { + left: 100%; + right: -35%; + } +} +@keyframes indeterminate-rtl { + 0% { + left: 100%; + right: -90%; + } + 60% { + left: 100%; + right: -90%; + } + 100% { + left: -35%; + right: 100%; + } +} +@keyframes indeterminate-short-ltr { + 0% { + left: -200%; + right: 100%; + } + 60% { + left: 107%; + right: -8%; + } + 100% { + left: 107%; + right: -8%; + } +} +@keyframes indeterminate-short-rtl { + 0% { + left: 100%; + right: -200%; + } + 60% { + left: -8%; + right: 107%; + } + 100% { + left: -8%; + right: 107%; + } +} +@keyframes stream { + to { + transform: translateX(var(--v-progress-linear-stream-to)); + } +} +@keyframes progress-linear-stripes { + 0% { + background-position-x: var(--v-progress-linear-height); + } +}.v-ripple__container { + color: inherit; + border-radius: inherit; + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + overflow: hidden; + z-index: 0; + pointer-events: none; + contain: strict; +} +.v-ripple__animation { + color: inherit; + position: absolute; + top: 0; + left: 0; + border-radius: 50%; + background: currentColor; + opacity: 0; + pointer-events: none; + overflow: hidden; + will-change: transform, opacity; +} +.v-ripple__animation--enter { + transition: none; + opacity: 0; +} +.v-ripple__animation--in { + transition: transform 0.25s cubic-bezier(0, 0, 0.2, 1), opacity 0.1s cubic-bezier(0, 0, 0.2, 1); + opacity: calc(0.25 * var(--v-theme-overlay-multiplier)); +} +.v-ripple__animation--out { + transition: opacity 0.3s cubic-bezier(0, 0, 0.2, 1); + opacity: 0; +}.v-alert { + display: grid; + flex: 1 1; + grid-template-areas: "prepend content append close" ". content . ."; + grid-template-columns: max-content auto max-content max-content; + position: relative; + padding: 16px; + overflow: hidden; + --v-border-color: currentColor; +} +.v-alert--absolute { + position: absolute; +} +.v-alert--fixed { + position: fixed; +} +.v-alert--sticky { + position: sticky; +} +.v-alert { + border-radius: 4px; +} +.v-alert--variant-plain, .v-alert--variant-outlined, .v-alert--variant-text, .v-alert--variant-tonal { + background: transparent; + color: inherit; +} +.v-alert--variant-plain { + opacity: 0.62; +} +.v-alert--variant-plain:focus, .v-alert--variant-plain:hover { + opacity: 1; +} +.v-alert--variant-plain .v-alert__overlay { + display: none; +} +.v-alert--variant-elevated, .v-alert--variant-flat { + background: rgb(var(--v-theme-surface-light)); + color: rgba(var(--v-theme-on-surface-light), var(--v-high-emphasis-opacity)); +} +.v-alert--variant-elevated { + box-shadow: 0px 2px 1px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 1px 1px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 3px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-alert--variant-flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-alert--variant-outlined { + border: thin solid currentColor; +} +.v-alert--variant-text .v-alert__overlay { + background: currentColor; +} +.v-alert--variant-tonal .v-alert__underlay { + background: currentColor; + opacity: var(--v-activated-opacity); + border-radius: inherit; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} +.v-alert .v-alert__underlay { + position: absolute; +} +.v-alert--prominent { + grid-template-areas: "prepend content append close" "prepend content . ."; +} +.v-alert.v-alert--border { + --v-border-opacity: 0.38; +} +.v-alert.v-alert--border.v-alert--border-start { + padding-inline-start: 24px; +} +.v-alert.v-alert--border.v-alert--border-end { + padding-inline-end: 24px; +} +.v-alert--variant-plain { + transition: 0.2s opacity cubic-bezier(0.4, 0, 0.2, 1); +} +.v-alert--density-default { + padding-bottom: 16px; + padding-top: 16px; +} +.v-alert--density-default.v-alert--border-top { + padding-top: 24px; +} +.v-alert--density-default.v-alert--border-bottom { + padding-bottom: 24px; +} + +.v-alert--density-comfortable { + padding-bottom: 12px; + padding-top: 12px; +} +.v-alert--density-comfortable.v-alert--border-top { + padding-top: 20px; +} +.v-alert--density-comfortable.v-alert--border-bottom { + padding-bottom: 20px; +} + +.v-alert--density-compact { + padding-bottom: 8px; + padding-top: 8px; +} +.v-alert--density-compact.v-alert--border-top { + padding-top: 16px; +} +.v-alert--density-compact.v-alert--border-bottom { + padding-bottom: 16px; +} + +.v-alert__border { + border-radius: inherit; + bottom: 0; + left: 0; + opacity: var(--v-border-opacity); + position: absolute; + pointer-events: none; + right: 0; + top: 0; + width: 100%; +} +.v-alert__border { + border-color: currentColor; + border-style: solid; + border-width: 0; +} +.v-alert__border--border { + border-width: 8px; + box-shadow: none; +} +.v-alert--border-start .v-alert__border { + border-inline-start-width: 8px; +} +.v-alert--border-end .v-alert__border { + border-inline-end-width: 8px; +} +.v-alert--border-top .v-alert__border { + border-top-width: 8px; +} +.v-alert--border-bottom .v-alert__border { + border-bottom-width: 8px; +} + +.v-alert__close { + flex: 0 1 auto; + grid-area: close; +} + +.v-alert__content { + align-self: center; + grid-area: content; + overflow: hidden; +} + +.v-alert__append, +.v-alert__close { + align-self: flex-start; + margin-inline-start: 16px; +} + +.v-alert__append { + align-self: flex-start; + grid-area: append; +} +.v-alert__append + .v-alert__close { + margin-inline-start: 16px; +} + +.v-alert__prepend { + align-self: flex-start; + display: flex; + align-items: center; + grid-area: prepend; + margin-inline-end: 16px; +} +.v-alert--prominent .v-alert__prepend { + align-self: center; +} + +.v-alert__underlay { + grid-area: none; + position: absolute; +} +.v-alert--border-start .v-alert__underlay { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.v-alert--border-end .v-alert__underlay { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.v-alert--border-top .v-alert__underlay { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.v-alert--border-bottom .v-alert__underlay { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.v-alert-title { + align-items: center; + align-self: center; + display: flex; + font-size: 1.25rem; + font-weight: 500; + hyphens: auto; + letter-spacing: 0.0125em; + line-height: 1.75rem; + overflow-wrap: normal; + text-transform: none; + word-break: normal; + word-wrap: break-word; +}.v-autocomplete .v-field .v-text-field__prefix, +.v-autocomplete .v-field .v-text-field__suffix, +.v-autocomplete .v-field .v-field__input, .v-autocomplete .v-field.v-field { + cursor: text; +} +.v-autocomplete .v-field .v-field__input > input { + flex: 1 1; +} +.v-autocomplete .v-field input { + min-width: 64px; +} +.v-autocomplete .v-field:not(.v-field--focused) input { + min-width: 0; +} +.v-autocomplete .v-field--dirty .v-autocomplete__selection { + margin-inline-end: 2px; +} +.v-autocomplete .v-autocomplete__selection-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.v-autocomplete__content { + overflow: hidden; +} +.v-autocomplete__content { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-autocomplete__content { + border-radius: 4px; +} +.v-autocomplete__mask { + background: rgb(var(--v-theme-surface-light)); +} +.v-autocomplete__selection { + display: inline-flex; + align-items: center; + height: 1.5rem; + letter-spacing: inherit; + line-height: inherit; + max-width: calc(100% - 2px - 2px); +} +.v-autocomplete__selection:first-child { + margin-inline-start: 0; +} +.v-autocomplete--chips.v-input--density-compact .v-field--variant-solo .v-label.v-field-label--floating, +.v-autocomplete--chips.v-input--density-compact .v-field--variant-solo-inverted .v-label.v-field-label--floating, +.v-autocomplete--chips.v-input--density-compact .v-field--variant-filled .v-label.v-field-label--floating, +.v-autocomplete--chips.v-input--density-compact .v-field--variant-solo-filled .v-label.v-field-label--floating { + top: 0px; +} +.v-autocomplete--selecting-index .v-autocomplete__selection { + opacity: var(--v-medium-emphasis-opacity); +} +.v-autocomplete--selecting-index .v-autocomplete__selection--selected { + opacity: 1; +} +.v-autocomplete--selecting-index .v-field__input > input { + caret-color: transparent; +} +.v-autocomplete--single:not(.v-autocomplete--selection-slot).v-text-field input { + flex: 1 1; + position: absolute; + left: 0; + right: 0; + width: 100%; + padding-inline: inherit; +} +.v-autocomplete--single:not(.v-autocomplete--selection-slot) .v-field--active input { + transition: none; +} +.v-autocomplete--single:not(.v-autocomplete--selection-slot) .v-field--dirty:not(.v-field--focused) input { + opacity: 0; +} +.v-autocomplete--single:not(.v-autocomplete--selection-slot) .v-field--focused .v-autocomplete__selection { + opacity: 0; +} +.v-autocomplete__menu-icon { + margin-inline-start: 4px; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} +.v-autocomplete--active-menu .v-autocomplete__menu-icon { + transform: rotate(180deg); +}.v-avatar { + flex: none; + align-items: center; + display: inline-flex; + justify-content: center; + line-height: normal; + overflow: hidden; + position: relative; + text-align: center; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition-property: width, height; + vertical-align: middle; +} +.v-avatar.v-avatar--size-x-small { + --v-avatar-height: 24px; +} +.v-avatar.v-avatar--size-small { + --v-avatar-height: 32px; +} +.v-avatar.v-avatar--size-default { + --v-avatar-height: 40px; +} +.v-avatar.v-avatar--size-large { + --v-avatar-height: 48px; +} +.v-avatar.v-avatar--size-x-large { + --v-avatar-height: 56px; +} +.v-avatar.v-avatar--density-default { + height: calc(var(--v-avatar-height) + 0px); + width: calc(var(--v-avatar-height) + 0px); +} +.v-avatar.v-avatar--density-comfortable { + height: calc(var(--v-avatar-height) + -4px); + width: calc(var(--v-avatar-height) + -4px); +} +.v-avatar.v-avatar--density-compact { + height: calc(var(--v-avatar-height) + -8px); + width: calc(var(--v-avatar-height) + -8px); +} +.v-avatar { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-avatar--border { + border-width: thin; + box-shadow: none; +} +.v-avatar { + border-radius: 50%; +} +.v-avatar--variant-plain, .v-avatar--variant-outlined, .v-avatar--variant-text, .v-avatar--variant-tonal { + background: transparent; + color: inherit; +} +.v-avatar--variant-plain { + opacity: 0.62; +} +.v-avatar--variant-plain:focus, .v-avatar--variant-plain:hover { + opacity: 1; +} +.v-avatar--variant-plain .v-avatar__overlay { + display: none; +} +.v-avatar--variant-elevated, .v-avatar--variant-flat { + background: var(--v-theme-surface); + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); +} +.v-avatar--variant-elevated { + box-shadow: 0px 2px 1px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 1px 1px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 3px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-avatar--variant-flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-avatar--variant-outlined { + border: thin solid currentColor; +} +.v-avatar--variant-text .v-avatar__overlay { + background: currentColor; +} +.v-avatar--variant-tonal .v-avatar__underlay { + background: currentColor; + opacity: var(--v-activated-opacity); + border-radius: inherit; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} +.v-avatar .v-avatar__underlay { + position: absolute; +} +.v-avatar--rounded { + border-radius: 4px; +} +.v-avatar--start { + margin-inline-end: 8px; +} +.v-avatar--end { + margin-inline-start: 8px; +} +.v-avatar .v-img { + height: 100%; + width: 100%; +}.v-checkbox.v-input { + flex: 0 1 auto; +} +.v-checkbox .v-selection-control { + min-height: var(--v-input-control-height); +}.v-selection-control { + align-items: center; + contain: layout; + display: flex; + flex: 1 0; + grid-area: control; + position: relative; + user-select: none; +} +.v-selection-control .v-label { + white-space: normal; + word-break: break-word; + height: 100%; + opacity: 1; +} +.v-selection-control--disabled { + opacity: var(--v-disabled-opacity); + pointer-events: none; +} +.v-selection-control--error:not(.v-selection-control--disabled) .v-label { + color: rgb(var(--v-theme-error)); +} +.v-selection-control--inline { + display: inline-flex; + flex: 0 0 auto; + min-width: 0; + max-width: 100%; +} +.v-selection-control--inline .v-label { + width: auto; +} +.v-selection-control--density-default { + --v-selection-control-size: 40px; +} + +.v-selection-control--density-comfortable { + --v-selection-control-size: 36px; +} + +.v-selection-control--density-compact { + --v-selection-control-size: 28px; +} + +.v-selection-control__wrapper { + width: var(--v-selection-control-size); + height: var(--v-selection-control-size); + display: inline-flex; + align-items: center; + position: relative; + justify-content: center; + flex: none; +} + +.v-selection-control__input { + width: var(--v-selection-control-size); + height: var(--v-selection-control-size); + align-items: center; + display: flex; + flex: none; + justify-content: center; + position: relative; + border-radius: 50%; +} +.v-selection-control__input input { + cursor: pointer; + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + opacity: 0; +} +.v-selection-control__input::before { + border-radius: 100%; + background-color: currentColor; + opacity: 0; + pointer-events: none; +} +.v-selection-control__input::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.v-selection-control__input:hover::before { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-selection-control__input > .v-icon { + opacity: var(--v-medium-emphasis-opacity); +} +.v-selection-control--disabled .v-selection-control__input > .v-icon, .v-selection-control--dirty .v-selection-control__input > .v-icon, .v-selection-control--error .v-selection-control__input > .v-icon { + opacity: 1; +} +.v-selection-control--error:not(.v-selection-control--disabled) .v-selection-control__input > .v-icon { + color: rgb(var(--v-theme-error)); +} +.v-selection-control--focus-visible .v-selection-control__input::before { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +}.v-label { + align-items: center; + color: inherit; + display: inline-flex; + font-size: 1rem; + letter-spacing: 0.009375em; + min-width: 0; + opacity: var(--v-medium-emphasis-opacity); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.v-label--clickable { + cursor: pointer; +}.v-selection-control-group { + grid-area: control; + display: flex; + flex-direction: column; +} +.v-selection-control-group--inline { + flex-direction: row; + flex-wrap: wrap; +}.v-input { + display: grid; + flex: 1 1 auto; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; +} +.v-input--disabled { + pointer-events: none; +} +.v-input--density-default { + --v-input-control-height: 56px; + --v-input-padding-top: 16px; +} + +.v-input--density-comfortable { + --v-input-control-height: 48px; + --v-input-padding-top: 12px; +} + +.v-input--density-compact { + --v-input-control-height: 40px; + --v-input-padding-top: 8px; +} + +.v-input--vertical { + grid-template-areas: "append" "control" "prepend"; + grid-template-rows: max-content auto max-content; + grid-template-columns: min-content; +} +.v-input--vertical .v-input__prepend { + margin-block-start: 16px; +} +.v-input--vertical .v-input__append { + margin-block-end: 16px; +} + +.v-input--horizontal { + grid-template-areas: "prepend control append" "a messages b"; + grid-template-columns: max-content minmax(0, 1fr) max-content; + grid-template-rows: 1fr auto; +} +.v-input--horizontal .v-input__prepend { + margin-inline-end: 16px; +} +.v-input--horizontal .v-input__append { + margin-inline-start: 16px; +} + +.v-input__details { + align-items: flex-end; + display: flex; + font-size: 0.75rem; + font-weight: 400; + grid-area: messages; + letter-spacing: 0.0333333333em; + line-height: normal; + min-height: 22px; + padding-top: 6px; + overflow: hidden; + justify-content: space-between; +} + +.v-input__details > .v-icon, +.v-input__prepend > .v-icon, +.v-input__append > .v-icon { + opacity: var(--v-medium-emphasis-opacity); +} +.v-input--disabled .v-input__details > .v-icon, +.v-input--disabled .v-input__details .v-messages, .v-input--error .v-input__details > .v-icon, +.v-input--error .v-input__details .v-messages, +.v-input--disabled .v-input__prepend > .v-icon, +.v-input--disabled .v-input__prepend .v-messages, +.v-input--error .v-input__prepend > .v-icon, +.v-input--error .v-input__prepend .v-messages, +.v-input--disabled .v-input__append > .v-icon, +.v-input--disabled .v-input__append .v-messages, +.v-input--error .v-input__append > .v-icon, +.v-input--error .v-input__append .v-messages { + opacity: 1; +} +.v-input--glow.v-input--focused .v-input__details > .v-icon, +.v-input--glow.v-input--focused .v-input__prepend > .v-icon, +.v-input--glow.v-input--focused .v-input__append > .v-icon { + opacity: 1; +} +.v-input--disabled .v-input__details, +.v-input--disabled .v-input__prepend, +.v-input--disabled .v-input__append { + opacity: var(--v-disabled-opacity); +} +.v-input--error:not(.v-input--disabled) .v-input__details > .v-icon, +.v-input--error:not(.v-input--disabled) .v-input__details .v-messages, +.v-input--error:not(.v-input--disabled) .v-input__prepend > .v-icon, +.v-input--error:not(.v-input--disabled) .v-input__prepend .v-messages, +.v-input--error:not(.v-input--disabled) .v-input__append > .v-icon, +.v-input--error:not(.v-input--disabled) .v-input__append .v-messages { + color: rgb(var(--v-theme-error)); +} + +.v-input__prepend, +.v-input__append { + display: flex; + align-items: flex-start; + padding-top: var(--v-input-padding-top); +} +.v-input--center-affix .v-input__prepend, +.v-input--center-affix .v-input__append { + align-items: center; + padding-top: 0; +} + +.v-input__prepend { + grid-area: prepend; +} + +.v-input__append { + grid-area: append; +} + +.v-input__control { + display: flex; + grid-area: control; +} + +.v-input--hide-spin-buttons input::-webkit-outer-spin-button, +.v-input--hide-spin-buttons input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} +.v-input--hide-spin-buttons input[type=number] { + -moz-appearance: textfield; +} +.v-input--plain-underlined .v-input__prepend, +.v-input--plain-underlined .v-input__append { + align-items: flex-start; +} +.v-input--density-default.v-input--plain-underlined .v-input__prepend, .v-input--density-default.v-input--plain-underlined .v-input__append { + padding-top: calc(var(--v-input-padding-top) + 4px); +} + +.v-input--density-comfortable.v-input--plain-underlined .v-input__prepend, .v-input--density-comfortable.v-input--plain-underlined .v-input__append { + padding-top: calc(var(--v-input-padding-top) + 2px); +} + +.v-input--density-compact.v-input--plain-underlined .v-input__prepend, .v-input--density-compact.v-input--plain-underlined .v-input__append { + padding-top: calc(var(--v-input-padding-top) + 0px); +}.v-messages { + flex: 1 1 auto; + font-size: 12px; + min-height: 14px; + min-width: 1px; + opacity: var(--v-medium-emphasis-opacity); + position: relative; +} +.v-messages__message { + line-height: 12px; + word-break: break-word; + overflow-wrap: break-word; + word-wrap: break-word; + hyphens: auto; + transition-duration: 150ms; +}.v-chip { + align-items: center; + display: inline-flex; + font-weight: 400; + max-width: 100%; + min-width: 0; + overflow: hidden; + position: relative; + text-decoration: none; + white-space: nowrap; + vertical-align: middle; +} +.v-chip .v-icon { + --v-icon-size-multiplier: 0.8571428571; +} +.v-chip.v-chip--size-x-small { + --v-chip-size: 0.625rem; + --v-chip-height: 20px; + font-size: 0.625rem; + padding: 0 8px; +} +.v-chip.v-chip--size-x-small .v-avatar { + --v-avatar-height: 14px; +} +.v-chip--pill.v-chip.v-chip--size-x-small .v-avatar { + --v-avatar-height: 20px; +} + +.v-chip.v-chip--size-x-small .v-avatar--start { + margin-inline-start: -5.6px; + margin-inline-end: 4px; +} +.v-chip--pill.v-chip.v-chip--size-x-small .v-avatar--start { + margin-inline-start: -8px; +} + +.v-chip.v-chip--size-x-small .v-avatar--end { + margin-inline-start: 4px; + margin-inline-end: -5.6px; +} +.v-chip--pill.v-chip.v-chip--size-x-small .v-avatar--end { + margin-inline-end: -8px; +} + +.v-chip--pill.v-chip.v-chip--size-x-small .v-avatar--end + .v-chip__close { + margin-inline-start: 12px; +} + +.v-chip.v-chip--size-x-small .v-icon--start, +.v-chip.v-chip--size-x-small .v-chip__filter { + margin-inline-start: -4px; + margin-inline-end: 4px; +} +.v-chip.v-chip--size-x-small .v-icon--end, +.v-chip.v-chip--size-x-small .v-chip__close { + margin-inline-start: 4px; + margin-inline-end: -4px; +} +.v-chip.v-chip--size-x-small .v-icon--end + .v-chip__close, +.v-chip.v-chip--size-x-small .v-avatar--end + .v-chip__close, +.v-chip.v-chip--size-x-small .v-chip__append + .v-chip__close { + margin-inline-start: 8px; +} + +.v-chip.v-chip--size-small { + --v-chip-size: 0.75rem; + --v-chip-height: 26px; + font-size: 0.75rem; + padding: 0 10px; +} +.v-chip.v-chip--size-small .v-avatar { + --v-avatar-height: 20px; +} +.v-chip--pill.v-chip.v-chip--size-small .v-avatar { + --v-avatar-height: 26px; +} + +.v-chip.v-chip--size-small .v-avatar--start { + margin-inline-start: -7px; + margin-inline-end: 5px; +} +.v-chip--pill.v-chip.v-chip--size-small .v-avatar--start { + margin-inline-start: -10px; +} + +.v-chip.v-chip--size-small .v-avatar--end { + margin-inline-start: 5px; + margin-inline-end: -7px; +} +.v-chip--pill.v-chip.v-chip--size-small .v-avatar--end { + margin-inline-end: -10px; +} + +.v-chip--pill.v-chip.v-chip--size-small .v-avatar--end + .v-chip__close { + margin-inline-start: 15px; +} + +.v-chip.v-chip--size-small .v-icon--start, +.v-chip.v-chip--size-small .v-chip__filter { + margin-inline-start: -5px; + margin-inline-end: 5px; +} +.v-chip.v-chip--size-small .v-icon--end, +.v-chip.v-chip--size-small .v-chip__close { + margin-inline-start: 5px; + margin-inline-end: -5px; +} +.v-chip.v-chip--size-small .v-icon--end + .v-chip__close, +.v-chip.v-chip--size-small .v-avatar--end + .v-chip__close, +.v-chip.v-chip--size-small .v-chip__append + .v-chip__close { + margin-inline-start: 10px; +} + +.v-chip.v-chip--size-default { + --v-chip-size: 0.875rem; + --v-chip-height: 32px; + font-size: 0.875rem; + padding: 0 12px; +} +.v-chip.v-chip--size-default .v-avatar { + --v-avatar-height: 26px; +} +.v-chip--pill.v-chip.v-chip--size-default .v-avatar { + --v-avatar-height: 32px; +} + +.v-chip.v-chip--size-default .v-avatar--start { + margin-inline-start: -8.4px; + margin-inline-end: 6px; +} +.v-chip--pill.v-chip.v-chip--size-default .v-avatar--start { + margin-inline-start: -12px; +} + +.v-chip.v-chip--size-default .v-avatar--end { + margin-inline-start: 6px; + margin-inline-end: -8.4px; +} +.v-chip--pill.v-chip.v-chip--size-default .v-avatar--end { + margin-inline-end: -12px; +} + +.v-chip--pill.v-chip.v-chip--size-default .v-avatar--end + .v-chip__close { + margin-inline-start: 18px; +} + +.v-chip.v-chip--size-default .v-icon--start, +.v-chip.v-chip--size-default .v-chip__filter { + margin-inline-start: -6px; + margin-inline-end: 6px; +} +.v-chip.v-chip--size-default .v-icon--end, +.v-chip.v-chip--size-default .v-chip__close { + margin-inline-start: 6px; + margin-inline-end: -6px; +} +.v-chip.v-chip--size-default .v-icon--end + .v-chip__close, +.v-chip.v-chip--size-default .v-avatar--end + .v-chip__close, +.v-chip.v-chip--size-default .v-chip__append + .v-chip__close { + margin-inline-start: 12px; +} + +.v-chip.v-chip--size-large { + --v-chip-size: 1rem; + --v-chip-height: 38px; + font-size: 1rem; + padding: 0 14px; +} +.v-chip.v-chip--size-large .v-avatar { + --v-avatar-height: 32px; +} +.v-chip--pill.v-chip.v-chip--size-large .v-avatar { + --v-avatar-height: 38px; +} + +.v-chip.v-chip--size-large .v-avatar--start { + margin-inline-start: -9.8px; + margin-inline-end: 7px; +} +.v-chip--pill.v-chip.v-chip--size-large .v-avatar--start { + margin-inline-start: -14px; +} + +.v-chip.v-chip--size-large .v-avatar--end { + margin-inline-start: 7px; + margin-inline-end: -9.8px; +} +.v-chip--pill.v-chip.v-chip--size-large .v-avatar--end { + margin-inline-end: -14px; +} + +.v-chip--pill.v-chip.v-chip--size-large .v-avatar--end + .v-chip__close { + margin-inline-start: 21px; +} + +.v-chip.v-chip--size-large .v-icon--start, +.v-chip.v-chip--size-large .v-chip__filter { + margin-inline-start: -7px; + margin-inline-end: 7px; +} +.v-chip.v-chip--size-large .v-icon--end, +.v-chip.v-chip--size-large .v-chip__close { + margin-inline-start: 7px; + margin-inline-end: -7px; +} +.v-chip.v-chip--size-large .v-icon--end + .v-chip__close, +.v-chip.v-chip--size-large .v-avatar--end + .v-chip__close, +.v-chip.v-chip--size-large .v-chip__append + .v-chip__close { + margin-inline-start: 14px; +} + +.v-chip.v-chip--size-x-large { + --v-chip-size: 1.125rem; + --v-chip-height: 44px; + font-size: 1.125rem; + padding: 0 17px; +} +.v-chip.v-chip--size-x-large .v-avatar { + --v-avatar-height: 38px; +} +.v-chip--pill.v-chip.v-chip--size-x-large .v-avatar { + --v-avatar-height: 44px; +} + +.v-chip.v-chip--size-x-large .v-avatar--start { + margin-inline-start: -11.9px; + margin-inline-end: 8.5px; +} +.v-chip--pill.v-chip.v-chip--size-x-large .v-avatar--start { + margin-inline-start: -17px; +} + +.v-chip.v-chip--size-x-large .v-avatar--end { + margin-inline-start: 8.5px; + margin-inline-end: -11.9px; +} +.v-chip--pill.v-chip.v-chip--size-x-large .v-avatar--end { + margin-inline-end: -17px; +} + +.v-chip--pill.v-chip.v-chip--size-x-large .v-avatar--end + .v-chip__close { + margin-inline-start: 25.5px; +} + +.v-chip.v-chip--size-x-large .v-icon--start, +.v-chip.v-chip--size-x-large .v-chip__filter { + margin-inline-start: -8.5px; + margin-inline-end: 8.5px; +} +.v-chip.v-chip--size-x-large .v-icon--end, +.v-chip.v-chip--size-x-large .v-chip__close { + margin-inline-start: 8.5px; + margin-inline-end: -8.5px; +} +.v-chip.v-chip--size-x-large .v-icon--end + .v-chip__close, +.v-chip.v-chip--size-x-large .v-avatar--end + .v-chip__close, +.v-chip.v-chip--size-x-large .v-chip__append + .v-chip__close { + margin-inline-start: 17px; +} + +.v-chip.v-chip--density-default { + height: calc(var(--v-chip-height) + 0px); +} + +.v-chip.v-chip--density-comfortable { + height: calc(var(--v-chip-height) + -4px); +} + +.v-chip.v-chip--density-compact { + height: calc(var(--v-chip-height) + -8px); +} + +.v-chip { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-chip:hover > .v-chip__overlay { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-chip:focus-visible > .v-chip__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-chip:focus > .v-chip__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} +.v-chip--active > .v-chip__overlay, .v-chip[aria-haspopup=menu][aria-expanded=true] > .v-chip__overlay { + opacity: calc(var(--v-activated-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-chip--active:hover > .v-chip__overlay, .v-chip[aria-haspopup=menu][aria-expanded=true]:hover > .v-chip__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); +} +.v-chip--active:focus-visible > .v-chip__overlay, .v-chip[aria-haspopup=menu][aria-expanded=true]:focus-visible > .v-chip__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-chip--active:focus > .v-chip__overlay, .v-chip[aria-haspopup=menu][aria-expanded=true]:focus > .v-chip__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-chip { + border-radius: 9999px; +} +.v-chip--variant-plain, .v-chip--variant-outlined, .v-chip--variant-text, .v-chip--variant-tonal { + background: transparent; + color: inherit; +} +.v-chip--variant-plain { + opacity: 0.26; +} +.v-chip--variant-plain:focus, .v-chip--variant-plain:hover { + opacity: 1; +} +.v-chip--variant-plain .v-chip__overlay { + display: none; +} +.v-chip--variant-elevated, .v-chip--variant-flat { + background: rgb(var(--v-theme-surface-variant)); + color: rgb(var(--v-theme-on-surface-variant)); +} +.v-chip--variant-elevated { + box-shadow: 0px 2px 1px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 1px 1px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 3px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-chip--variant-flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-chip--variant-outlined { + border: thin solid currentColor; +} +.v-chip--variant-text .v-chip__overlay { + background: currentColor; +} +.v-chip--variant-tonal .v-chip__underlay { + background: currentColor; + opacity: var(--v-activated-opacity); + border-radius: inherit; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} +.v-chip .v-chip__underlay { + position: absolute; +} +.v-chip--border { + border-width: thin; +} +.v-chip--link { + cursor: pointer; +} +.v-chip--link, .v-chip--filter { + user-select: none; +} +.v-chip--label { + border-radius: 4px; +} + +.v-chip__content { + align-items: center; + display: inline-flex; +} +.v-autocomplete__selection .v-chip__content, .v-combobox__selection .v-chip__content, .v-select__selection .v-chip__content { + overflow: hidden; +} + +.v-chip__filter, +.v-chip__prepend, +.v-chip__append, +.v-chip__close { + align-items: center; + display: inline-flex; +} + +.v-chip__close { + cursor: pointer; + flex: 0 1 auto; + font-size: 18px; + max-height: 18px; + max-width: 18px; + user-select: none; +} +.v-chip__close .v-icon { + font-size: inherit; +} + +.v-chip__filter { + transition: 0.15s cubic-bezier(0.4, 0, 0.2, 1); +} + +.v-chip__overlay { + background-color: currentColor; + border-radius: inherit; + pointer-events: none; + opacity: 0; + transition: opacity 0.2s ease-in-out; +} +.v-chip__overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.v-chip--disabled { + opacity: 0.3; + pointer-events: none; + user-select: none; +} + +.v-chip--label { + border-radius: 4px; +}.v-chip-group { + display: flex; + max-width: 100%; + min-width: 0; + overflow-x: auto; + padding: 4px 0; +} +.v-chip-group .v-chip { + margin: 4px 8px 4px 0; +} +.v-chip-group .v-chip.v-chip--selected:not(.v-chip--disabled) .v-chip__overlay { + opacity: var(--v-activated-opacity); +} + +.v-chip-group--column .v-slide-group__content { + white-space: normal; + flex-wrap: wrap; + max-width: 100%; +}.v-slide-group { + display: flex; + overflow: hidden; +} + +.v-slide-group__next, +.v-slide-group__prev { + align-items: center; + display: flex; + flex: 0 1 52px; + justify-content: center; + min-width: 52px; + cursor: pointer; +} +.v-slide-group__next--disabled, +.v-slide-group__prev--disabled { + pointer-events: none; + opacity: var(--v-disabled-opacity); +} + +.v-slide-group__content { + display: flex; + flex: 1 0 auto; + position: relative; + transition: 0.2s all cubic-bezier(0.4, 0, 0.2, 1); + white-space: nowrap; +} +.v-slide-group__content > * { + white-space: initial; +} + +.v-slide-group__container { + contain: content; + display: flex; + flex: 1 1 auto; + overflow-x: auto; + overflow-y: hidden; + scrollbar-width: none; + scrollbar-color: rgba(0, 0, 0, 0); +} +.v-slide-group__container::-webkit-scrollbar { + display: none; +} + +.v-slide-group--vertical { + max-height: inherit; +} +.v-slide-group--vertical, +.v-slide-group--vertical .v-slide-group__container, +.v-slide-group--vertical .v-slide-group__content { + flex-direction: column; +} +.v-slide-group--vertical .v-slide-group__container { + overflow-x: hidden; + overflow-y: auto; +}.v-list { + overflow: auto; + padding: 8px 0; + position: relative; + outline: none; +} +.v-list { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-list--border { + border-width: thin; + box-shadow: none; +} +.v-list { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-list { + border-radius: 0; +} +.v-list { + background: rgba(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-list--disabled { + pointer-events: none; + user-select: none; +} +.v-list--nav { + padding-inline: 8px; +} +.v-list--rounded { + border-radius: 4px; +} +.v-list--subheader { + padding-top: 0; +} + +.v-list-img { + border-radius: inherit; + display: flex; + height: 100%; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; + z-index: -1; +} + +.v-list-subheader { + align-items: center; + background: inherit; + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); + display: flex; + font-size: 0.875rem; + font-weight: 400; + line-height: 1.375rem; + padding-inline-end: 16px; + min-height: 40px; + transition: 0.2s min-height cubic-bezier(0.4, 0, 0.2, 1); +} +.v-list-subheader__text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.v-list--density-default .v-list-subheader { + min-height: 40px; + padding-inline-start: calc(16px + var(--indent-padding)) !important; +} + +.v-list--density-comfortable .v-list-subheader { + min-height: 36px; + padding-inline-start: calc(16px + var(--indent-padding)) !important; +} + +.v-list--density-compact .v-list-subheader { + min-height: 32px; + padding-inline-start: calc(16px + var(--indent-padding)) !important; +} + +.v-list-subheader--inset { + --indent-padding: 56px; +} +.v-list--nav .v-list-subheader { + font-size: 0.75rem; +} +.v-list-subheader--sticky { + background: inherit; + left: 0; + position: sticky; + top: 0; + z-index: 1; +} + +.v-list__overlay { + background-color: currentColor; + border-radius: inherit; + bottom: 0; + left: 0; + opacity: 0; + pointer-events: none; + position: absolute; + right: 0; + top: 0; + transition: opacity 0.2s ease-in-out; +}.v-list-item { + align-items: center; + display: grid; + flex: none; + grid-template-areas: "prepend content append"; + grid-template-columns: max-content 1fr auto; + outline: none; + max-width: 100%; + padding: 4px 16px; + position: relative; + text-decoration: none; +} +.v-list-item { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-list-item--border { + border-width: thin; + box-shadow: none; +} +.v-list-item:hover > .v-list-item__overlay { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-list-item:focus-visible > .v-list-item__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-list-item:focus > .v-list-item__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} +.v-list-item--active > .v-list-item__overlay, .v-list-item[aria-haspopup=menu][aria-expanded=true] > .v-list-item__overlay { + opacity: calc(var(--v-activated-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-list-item--active:hover > .v-list-item__overlay, .v-list-item[aria-haspopup=menu][aria-expanded=true]:hover > .v-list-item__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); +} +.v-list-item--active:focus-visible > .v-list-item__overlay, .v-list-item[aria-haspopup=menu][aria-expanded=true]:focus-visible > .v-list-item__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-list-item--active:focus > .v-list-item__overlay, .v-list-item[aria-haspopup=menu][aria-expanded=true]:focus > .v-list-item__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-list-item { + border-radius: 0; +} +.v-list-item--variant-plain, .v-list-item--variant-outlined, .v-list-item--variant-text, .v-list-item--variant-tonal { + background: transparent; + color: inherit; +} +.v-list-item--variant-plain { + opacity: 0.62; +} +.v-list-item--variant-plain:focus, .v-list-item--variant-plain:hover { + opacity: 1; +} +.v-list-item--variant-plain .v-list-item__overlay { + display: none; +} +.v-list-item--variant-elevated, .v-list-item--variant-flat { + background: rgba(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-list-item--variant-elevated { + box-shadow: 0px 2px 1px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 1px 1px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 3px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-list-item--variant-flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-list-item--variant-outlined { + border: thin solid currentColor; +} +.v-list-item--variant-text .v-list-item__overlay { + background: currentColor; +} +.v-list-item--variant-tonal .v-list-item__underlay { + background: currentColor; + opacity: var(--v-activated-opacity); + border-radius: inherit; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} +.v-list-item .v-list-item__underlay { + position: absolute; +} +@supports selector(:focus-visible) { + .v-list-item::after { + pointer-events: none; + border: 2px solid currentColor; + border-radius: 4px; + opacity: 0; + transition: opacity 0.2s ease-in-out; + } + .v-list-item::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + } + .v-list-item:focus-visible::after { + opacity: calc(0.15 * var(--v-theme-overlay-multiplier)); + } +} +.v-list-item__prepend > .v-badge .v-icon, +.v-list-item__prepend > .v-icon, .v-list-item__append > .v-badge .v-icon, +.v-list-item__append > .v-icon { + opacity: var(--v-medium-emphasis-opacity); +} +.v-list-item--active .v-list-item__prepend > .v-badge .v-icon, +.v-list-item--active .v-list-item__prepend > .v-icon, +.v-list-item--active .v-list-item__append > .v-badge .v-icon, +.v-list-item--active .v-list-item__append > .v-icon { + opacity: 1; +} +.v-list-item--active:not(.v-list-item--link) .v-list-item__overlay { + opacity: calc(var(--v-activated-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-list-item--rounded { + border-radius: 4px; +} +.v-list-item--disabled { + pointer-events: none; + user-select: none; + opacity: 0.6; +} +.v-list-item--link { + cursor: pointer; +} +.v-navigation-drawer--rail:not(.v-navigation-drawer--expand-on-hover) .v-list-item .v-avatar, .v-navigation-drawer--rail.v-navigation-drawer--expand-on-hover:not(.v-navigation-drawer--is-hovering) .v-list-item .v-avatar { + --v-avatar-height: 24px; +} + +.v-list-item__prepend { + align-items: center; + align-self: center; + display: flex; + grid-area: prepend; +} +.v-list-item__prepend > .v-badge ~ .v-list-item__spacer, +.v-list-item__prepend > .v-icon ~ .v-list-item__spacer, +.v-list-item__prepend > .v-tooltip ~ .v-list-item__spacer { + width: 32px; +} +.v-list-item__prepend > .v-avatar ~ .v-list-item__spacer, +.v-list-item__prepend > .v-badge:is(:has(.v-avatar)) ~ .v-list-item__spacer { + width: 16px; +} +.v-list-item--slim .v-list-item__prepend > .v-badge ~ .v-list-item__spacer, +.v-list-item--slim .v-list-item__prepend > .v-icon ~ .v-list-item__spacer, +.v-list-item--slim .v-list-item__prepend > .v-tooltip ~ .v-list-item__spacer { + width: 20px; +} +.v-list-item--slim .v-list-item__prepend > .v-avatar ~ .v-list-item__spacer, +.v-list-item--slim .v-list-item__prepend > .v-badge:is(:has(.v-avatar)) ~ .v-list-item__spacer { + width: 4px; +} +.v-list-item--slim .v-list-item__prepend > .v-list-item-action ~ .v-list-item__spacer { + width: 4px; +} +.v-list-item--three-line .v-list-item__prepend { + align-self: start; +} + +.v-list-item__append { + align-self: center; + display: flex; + align-items: center; + grid-area: append; +} +.v-list-item__append .v-list-item__spacer { + order: -1; + transition: 150ms width cubic-bezier(0.4, 0, 0.2, 1); +} +.v-list-item__append > .v-badge ~ .v-list-item__spacer, +.v-list-item__append > .v-icon ~ .v-list-item__spacer, +.v-list-item__append > .v-tooltip ~ .v-list-item__spacer { + width: 32px; +} +.v-list-item__append > .v-avatar ~ .v-list-item__spacer, +.v-list-item__append > .v-badge:is(:has(.v-avatar)) ~ .v-list-item__spacer { + width: 16px; +} +.v-list-item__append > .v-list-item-action ~ .v-list-item__spacer { + width: 16px; +} +.v-list-item--slim .v-list-item__append > .v-badge ~ .v-list-item__spacer, +.v-list-item--slim .v-list-item__append > .v-icon ~ .v-list-item__spacer, +.v-list-item--slim .v-list-item__append > .v-tooltip ~ .v-list-item__spacer { + width: 20px; +} +.v-list-item--slim .v-list-item__append > .v-avatar ~ .v-list-item__spacer, +.v-list-item--slim .v-list-item__append > .v-badge:is(:has(.v-avatar)) ~ .v-list-item__spacer { + width: 4px; +} +.v-list-item--slim .v-list-item__append > .v-list-item-action ~ .v-list-item__spacer { + width: 4px; +} +.v-list-item--three-line .v-list-item__append { + align-self: start; +} + +.v-list-item__content { + align-self: center; + grid-area: content; + overflow: hidden; +} + +.v-list-item-action { + align-self: center; + display: flex; + align-items: center; + flex: none; + transition: inherit; + transition-property: height, width; +} +.v-list-item-action--start { + margin-inline-end: 8px; + margin-inline-start: -8px; +} +.v-list-item-action--end { + margin-inline-start: 8px; + margin-inline-end: -8px; +} + +.v-list-item-media { + margin-top: 0; + margin-bottom: 0; +} +.v-list-item-media--start { + margin-inline-end: 16px; +} +.v-list-item-media--end { + margin-inline-start: 16px; +} +.v-list-item--two-line .v-list-item-media { + margin-top: -4px; + margin-bottom: -4px; +} +.v-list-item--three-line .v-list-item-media { + margin-top: 0; + margin-bottom: 0; +} + +.v-list-item-subtitle { + -webkit-box-orient: vertical; + display: -webkit-box; + opacity: var(--v-list-item-subtitle-opacity, var(--v-medium-emphasis-opacity)); + overflow: hidden; + padding: 0; + text-overflow: ellipsis; + overflow-wrap: break-word; + word-break: initial; +} +.v-list-item--one-line .v-list-item-subtitle { + -webkit-line-clamp: 1; +} +.v-list-item--two-line .v-list-item-subtitle { + -webkit-line-clamp: 2; +} +.v-list-item--three-line .v-list-item-subtitle { + -webkit-line-clamp: 3; +} +.v-list-item-subtitle { + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 0.0178571429em; + line-height: 1rem; + text-transform: none; +} +.v-list-item--nav .v-list-item-subtitle { + font-size: 0.75rem; + font-weight: 400; + letter-spacing: 0.0178571429em; + line-height: 1rem; +} + +.v-list-item-title { + hyphens: auto; + overflow-wrap: normal; + overflow: hidden; + padding: 0; + white-space: nowrap; + text-overflow: ellipsis; + word-break: normal; + word-wrap: break-word; +} +.v-list-item-title { + font-size: 1rem; + font-weight: 400; + letter-spacing: 0.009375em; + line-height: 1.5; + text-transform: none; +} +.v-list-item--nav .v-list-item-title { + font-size: 0.8125rem; + font-weight: 500; + letter-spacing: normal; + line-height: 1rem; +} + +.v-list-item--density-default { + min-height: 40px; +} +.v-list-item--density-default.v-list-item--one-line { + min-height: 48px; + padding-top: 4px; + padding-bottom: 4px; +} +.v-list-item--density-default.v-list-item--two-line { + min-height: 64px; + padding-top: 12px; + padding-bottom: 12px; +} +.v-list-item--density-default.v-list-item--three-line { + min-height: 88px; + padding-top: 16px; + padding-bottom: 16px; +} +.v-list-item--density-default.v-list-item--three-line .v-list-item__prepend, +.v-list-item--density-default.v-list-item--three-line .v-list-item__append { + padding-top: 8px; +} +.v-list-item--density-default:not(.v-list-item--nav).v-list-item--one-line { + padding-inline: 16px; +} +.v-list-item--density-default:not(.v-list-item--nav).v-list-item--two-line { + padding-inline: 16px; +} +.v-list-item--density-default:not(.v-list-item--nav).v-list-item--three-line { + padding-inline: 16px; +} + +.v-list-item--density-comfortable { + min-height: 36px; +} +.v-list-item--density-comfortable.v-list-item--one-line { + min-height: 44px; +} +.v-list-item--density-comfortable.v-list-item--two-line { + min-height: 60px; + padding-top: 8px; + padding-bottom: 8px; +} +.v-list-item--density-comfortable.v-list-item--three-line { + min-height: 84px; + padding-top: 12px; + padding-bottom: 12px; +} +.v-list-item--density-comfortable.v-list-item--three-line .v-list-item__prepend, +.v-list-item--density-comfortable.v-list-item--three-line .v-list-item__append { + padding-top: 6px; +} +.v-list-item--density-comfortable:not(.v-list-item--nav).v-list-item--one-line { + padding-inline: 16px; +} +.v-list-item--density-comfortable:not(.v-list-item--nav).v-list-item--two-line { + padding-inline: 16px; +} +.v-list-item--density-comfortable:not(.v-list-item--nav).v-list-item--three-line { + padding-inline: 16px; +} + +.v-list-item--density-compact { + min-height: 32px; +} +.v-list-item--density-compact.v-list-item--one-line { + min-height: 40px; +} +.v-list-item--density-compact.v-list-item--two-line { + min-height: 56px; + padding-top: 4px; + padding-bottom: 4px; +} +.v-list-item--density-compact.v-list-item--three-line { + min-height: 80px; + padding-top: 8px; + padding-bottom: 8px; +} +.v-list-item--density-compact.v-list-item--three-line .v-list-item__prepend, +.v-list-item--density-compact.v-list-item--three-line .v-list-item__append { + padding-top: 4px; +} +.v-list-item--density-compact:not(.v-list-item--nav).v-list-item--one-line { + padding-inline: 16px; +} +.v-list-item--density-compact:not(.v-list-item--nav).v-list-item--two-line { + padding-inline: 16px; +} +.v-list-item--density-compact:not(.v-list-item--nav).v-list-item--three-line { + padding-inline: 16px; +} + +.v-list-item--nav { + padding-inline: 8px; +} +.v-list .v-list-item--nav:not(:only-child) { + margin-bottom: 4px; +} + +.v-list-item__underlay { + position: absolute; +} + +.v-list-item__overlay { + background-color: currentColor; + border-radius: inherit; + bottom: 0; + left: 0; + opacity: 0; + pointer-events: none; + position: absolute; + right: 0; + top: 0; + transition: opacity 0.2s ease-in-out; +} +.v-list-item--active.v-list-item--variant-elevated .v-list-item__overlay { + --v-theme-overlay-multiplier: 0; +} + +.v-list { + --indent-padding: 0px; +} +.v-list--nav { + --indent-padding: -8px; +} + +.v-list-group { + --list-indent-size: 16px; + --parent-padding: var(--indent-padding); + --prepend-width: 40px; +} +.v-list--slim .v-list-group { + --prepend-width: 28px; +} +.v-list-group--fluid { + --list-indent-size: 0px; +} +.v-list-group--prepend { + --parent-padding: calc(var(--indent-padding) + var(--prepend-width)); +} +.v-list-group--fluid.v-list-group--prepend { + --parent-padding: var(--indent-padding); +} + +.v-list-group__items { + --indent-padding: calc(var(--parent-padding) + var(--list-indent-size)); +} + +.v-list-group__items .v-list-item { + padding-inline-start: calc(16px + var(--indent-padding)) !important; +} + +.v-list-group__header:not(.v-treeview-item--activatable-group-activator).v-list-item--active:not(:focus-visible) .v-list-item__overlay { + opacity: 0; +} +.v-list-group__header:not(.v-treeview-item--activatable-group-activator).v-list-item--active:hover .v-list-item__overlay { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +}.v-divider { + display: block; + flex: 1 1 100%; + height: 0px; + max-height: 0px; + opacity: var(--v-border-opacity); + transition: inherit; +} +.v-divider { + border-style: solid; + border-width: thin 0 0 0; +} +.v-divider--vertical { + align-self: stretch; + border-width: 0 thin 0 0; + display: inline-flex; + height: auto; + margin-left: -1px; + max-height: 100%; + max-width: 0px; + vertical-align: text-bottom; + width: 0px; +} +.v-divider--inset:not(.v-divider--vertical) { + max-width: calc(100% - 72px); + margin-inline-start: 72px; +} +.v-divider--inset.v-divider--vertical { + margin-bottom: 8px; + margin-top: 8px; + max-height: calc(100% - 16px); +} + +.v-divider__content { + padding: 0 16px; + text-wrap: nowrap; +} +.v-divider__wrapper--vertical .v-divider__content { + padding: 4px 0; +} + +.v-divider__wrapper { + display: flex; + align-items: center; + justify-content: center; +} +.v-divider__wrapper--vertical { + flex-direction: column; + height: 100%; +} +.v-divider__wrapper--vertical .v-divider { + margin: 0 auto; +}.v-menu > .v-overlay__content { + display: flex; + flex-direction: column; +} +.v-menu > .v-overlay__content { + border-radius: 4px; +} +.v-menu > .v-overlay__content > .v-card, +.v-menu > .v-overlay__content > .v-sheet, +.v-menu > .v-overlay__content > .v-list { + background: rgb(var(--v-theme-surface)); + border-radius: inherit; + overflow: auto; + height: 100%; +} +.v-menu > .v-overlay__content > .v-card, +.v-menu > .v-overlay__content > .v-sheet, +.v-menu > .v-overlay__content > .v-list { + box-shadow: 0px 5px 5px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 8px 10px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 3px 14px 2px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +}.v-overlay-container { + contain: layout; + left: 0; + pointer-events: none; + position: absolute; + top: 0; + display: contents; +} + +.v-overlay-scroll-blocked { + padding-inline-end: var(--v-scrollbar-offset); +} +.v-overlay-scroll-blocked:not(html) { + overflow-y: hidden !important; +} +html.v-overlay-scroll-blocked { + position: fixed; + top: var(--v-body-scroll-y); + left: var(--v-body-scroll-x); + width: 100%; + height: 100%; +} + +.v-overlay { + --v-overlay-opacity: 0.32; + border-radius: inherit; + display: flex; + left: 0; + pointer-events: none; + position: fixed; + top: 0; + bottom: 0; + right: 0; +} + +.v-overlay__content { + outline: none; + position: absolute; + pointer-events: auto; + contain: layout; +} + +.v-overlay__scrim { + pointer-events: auto; + background: rgb(var(--v-theme-on-surface)); + border-radius: inherit; + bottom: 0; + left: 0; + opacity: var(--v-overlay-opacity); + position: fixed; + right: 0; + top: 0; +} + +.v-overlay--absolute { + position: absolute; +} + +.v-overlay--contained .v-overlay__scrim { + position: absolute; +} + +.v-overlay--scroll-blocked { + padding-inline-end: var(--v-scrollbar-offset); +}.v-select .v-field .v-text-field__prefix, +.v-select .v-field .v-text-field__suffix, +.v-select .v-field .v-field__input, .v-select .v-field.v-field { + cursor: pointer; +} +.v-select .v-field .v-field__input > input { + align-self: flex-start; + opacity: 1; + flex: 0 0; + position: absolute; + width: 100%; + transition: none; + pointer-events: none; + caret-color: transparent; +} +.v-select .v-field--dirty .v-select__selection { + margin-inline-end: 2px; +} +.v-select .v-select__selection-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.v-select__content { + overflow: hidden; +} +.v-select__content { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-select__content { + border-radius: 4px; +} +.v-select__selection { + display: inline-flex; + align-items: center; + letter-spacing: inherit; + line-height: inherit; + max-width: 100%; +} +.v-select .v-select__selection:first-child { + margin-inline-start: 0; +} +.v-select--selected .v-field .v-field__input > input { + opacity: 0; +} +.v-select__menu-icon { + margin-inline-start: 4px; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} +.v-select--active-menu .v-select__menu-icon { + transform: rotate(180deg); +}/* region BLOCK */ +.v-text-field input { + color: inherit; + opacity: 0; + flex: 1; + transition: 0.15s opacity cubic-bezier(0.4, 0, 0.2, 1); + min-width: 0; +} +.v-text-field input:focus, .v-text-field input:active { + outline: none; +} +.v-text-field input:invalid { + box-shadow: none; +} +.v-text-field .v-field { + cursor: text; +} +.v-text-field--prefixed.v-text-field .v-field:not(.v-field--reverse) .v-field__input { + --v-field-padding-start: 6px; +} + +.v-text-field--suffixed.v-text-field .v-field:not(.v-field--reverse) .v-field__input { + --v-field-padding-end: 0; +} + +.v-text-field--prefixed.v-text-field .v-field.v-field--reverse .v-field__input { + --v-field-padding-end: 6px; +} + +.v-text-field--suffixed.v-text-field .v-field.v-field--reverse .v-field__input { + --v-field-padding-start: 0; +} + +.v-text-field .v-input__details { + padding-inline: 16px; +} +.v-input--plain-underlined.v-text-field .v-input__details { + padding-inline: 0; +} + +.v-text-field .v-field--no-label input, +.v-text-field .v-field--active input { + opacity: 1; +} +.v-text-field .v-field--single-line input { + transition: none; +} + +/* endregion */ +/* region ELEMENTS */ +.v-text-field__prefix, .v-text-field__suffix { + align-items: center; + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); + cursor: default; + display: flex; + opacity: 0; + transition: inherit; + white-space: nowrap; + min-height: max(var(--v-input-control-height, 56px), 1.5rem + var(--v-field-input-padding-top) + var(--v-field-input-padding-bottom)); + padding-top: calc(var(--v-field-padding-top, 4px) + var(--v-input-padding-top, 0)); + padding-bottom: var(--v-field-padding-bottom, 6px); +} +.v-field--active .v-text-field__prefix, .v-field--active .v-text-field__suffix { + opacity: 1; +} +.v-field--disabled .v-text-field__prefix, .v-field--disabled .v-text-field__suffix { + color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)); +} +.v-field:not(.v-field--reverse) .v-text-field__prefix { + padding-inline-start: var(--v-field-padding-start); +} + +.v-field.v-field--reverse .v-text-field__prefix { + padding-inline-end: var(--v-field-padding-end); +} + +.v-field:not(.v-field--reverse) .v-text-field__suffix { + padding-inline-end: var(--v-field-padding-end); +} + +.v-field.v-field--reverse .v-text-field__suffix { + padding-inline-start: var(--v-field-padding-start); +} + +/* endregion */.v-counter { + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); + flex: 0 1 auto; + font-size: 12px; + transition-duration: 150ms; +}/* region INPUT */ +.v-field { + display: grid; + grid-template-areas: "prepend-inner field clear append-inner"; + grid-template-columns: min-content minmax(0, 1fr) min-content min-content; + font-size: 16px; + letter-spacing: 0.009375em; + max-width: 100%; + border-radius: 4px; + contain: layout; + flex: 1 0; + grid-area: control; + position: relative; + --v-theme-overlay-multiplier: 1; + --v-field-padding-start: 16px; + --v-field-padding-end: 16px; + --v-field-padding-top: 8px; + --v-field-padding-bottom: 4px; + --v-field-input-padding-top: calc(var(--v-field-padding-top, 8px) + var(--v-input-padding-top, 0px)); + --v-field-input-padding-bottom: var(--v-field-padding-bottom, 4px); +} +.v-field--disabled { + opacity: var(--v-disabled-opacity); + pointer-events: none; +} +.v-field .v-chip { + --v-chip-height: 24px; +} + +/* endregion */ +/* region MODIFIERS */ +.v-field--prepended { + padding-inline-start: 12px; +} +.v-field--appended { + padding-inline-end: 12px; +} +.v-field--variant-solo, .v-field--variant-solo-filled { + background: rgb(var(--v-theme-surface)); + border-color: transparent; + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-field--variant-solo, .v-field--variant-solo-filled { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-field--variant-solo-inverted { + background: rgb(var(--v-theme-surface)); + border-color: transparent; + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-field--variant-solo-inverted { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-field--variant-solo-inverted.v-field--focused { + color: rgb(var(--v-theme-on-surface-variant)); +} +.v-field--variant-filled { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.v-input--density-default .v-field--variant-solo, .v-input--density-default .v-field--variant-solo-inverted, .v-input--density-default .v-field--variant-solo-filled, .v-input--density-default .v-field--variant-filled { + --v-input-control-height: 56px; + --v-field-padding-bottom: 4px; +} + +.v-input--density-comfortable .v-field--variant-solo, .v-input--density-comfortable .v-field--variant-solo-inverted, .v-input--density-comfortable .v-field--variant-solo-filled, .v-input--density-comfortable .v-field--variant-filled { + --v-input-control-height: 48px; + --v-field-padding-bottom: 0px; +} + +.v-input--density-compact .v-field--variant-solo, .v-input--density-compact .v-field--variant-solo-inverted, .v-input--density-compact .v-field--variant-solo-filled, .v-input--density-compact .v-field--variant-filled { + --v-input-control-height: 40px; + --v-field-padding-bottom: 0px; +} + +.v-field--variant-outlined, .v-field--single-line, .v-field--no-label { + --v-field-padding-top: 0px; +} +.v-input--density-default .v-field--variant-outlined, .v-input--density-default .v-field--single-line, .v-input--density-default .v-field--no-label { + --v-field-padding-bottom: 16px; +} + +.v-input--density-comfortable .v-field--variant-outlined, .v-input--density-comfortable .v-field--single-line, .v-input--density-comfortable .v-field--no-label { + --v-field-padding-bottom: 12px; +} + +.v-input--density-compact .v-field--variant-outlined, .v-input--density-compact .v-field--single-line, .v-input--density-compact .v-field--no-label { + --v-field-padding-bottom: 8px; +} + +.v-field--variant-plain, .v-field--variant-underlined { + border-radius: 0; + padding: 0; +} +.v-field--variant-plain.v-field, .v-field--variant-underlined.v-field { + --v-field-padding-start: 0px; + --v-field-padding-end: 0px; +} +.v-input--density-default .v-field--variant-plain, .v-input--density-default .v-field--variant-underlined { + --v-input-control-height: 48px; + --v-field-padding-top: 4px; + --v-field-padding-bottom: 4px; +} + +.v-input--density-comfortable .v-field--variant-plain, .v-input--density-comfortable .v-field--variant-underlined { + --v-input-control-height: 40px; + --v-field-padding-top: 2px; + --v-field-padding-bottom: 0px; +} + +.v-input--density-compact .v-field--variant-plain, .v-input--density-compact .v-field--variant-underlined { + --v-input-control-height: 32px; + --v-field-padding-top: 0px; + --v-field-padding-bottom: 0px; +} + +.v-field--flat { + box-shadow: none; +} +.v-field--rounded { + border-radius: 24px; +} +.v-field.v-field--prepended { + --v-field-padding-start: 6px; +} +.v-field.v-field--appended { + --v-field-padding-end: 6px; +} + +/* endregion */ +/* region ELEMENTS */ +.v-field__input { + align-items: center; + color: inherit; + column-gap: 2px; + display: flex; + flex-wrap: wrap; + letter-spacing: 0.009375em; + opacity: var(--v-high-emphasis-opacity); + min-height: max(var(--v-input-control-height, 56px), 1.5rem + var(--v-field-input-padding-top) + var(--v-field-input-padding-bottom)); + min-width: 0; + padding-inline: var(--v-field-padding-start) var(--v-field-padding-end); + padding-top: var(--v-field-input-padding-top); + padding-bottom: var(--v-field-input-padding-bottom); + position: relative; + width: 100%; +} +.v-input--density-default .v-field__input { + row-gap: 8px; +} + +.v-input--density-comfortable .v-field__input { + row-gap: 6px; +} + +.v-input--density-compact .v-field__input { + row-gap: 4px; +} + +.v-field__input input { + letter-spacing: inherit; +} +.v-field__input input::placeholder, +input.v-field__input::placeholder, +textarea.v-field__input::placeholder { + color: currentColor; + opacity: var(--v-disabled-opacity); +} + +.v-field__input:focus, .v-field__input:active { + outline: none; +} +.v-field__input:invalid { + box-shadow: none; +} + +.v-field__field { + flex: 1 0; + grid-area: field; + position: relative; + align-items: flex-start; + display: flex; +} + +/* endregion */ +/* region AFFIXES */ +.v-field__prepend-inner { + grid-area: prepend-inner; + padding-inline-end: var(--v-field-padding-after); +} + +.v-field__clearable { + grid-area: clear; +} + +.v-field__append-inner { + grid-area: append-inner; + padding-inline-start: var(--v-field-padding-after); +} + +.v-field__append-inner, +.v-field__clearable, +.v-field__prepend-inner { + display: flex; + align-items: flex-start; + padding-top: var(--v-input-padding-top, 8px); +} +.v-field--center-affix .v-field__append-inner, +.v-field--center-affix .v-field__clearable, +.v-field--center-affix .v-field__prepend-inner { + align-items: center; + padding-top: 0; +} + +.v-field.v-field--variant-underlined .v-field__append-inner, +.v-field.v-field--variant-underlined .v-field__clearable, +.v-field.v-field--variant-underlined .v-field__prepend-inner, +.v-field.v-field--variant-plain .v-field__append-inner, +.v-field.v-field--variant-plain .v-field__clearable, +.v-field.v-field--variant-plain .v-field__prepend-inner { + align-items: flex-start; + padding-top: calc(var(--v-field-padding-top, 8px) + var(--v-input-padding-top, 0px)); + padding-bottom: var(--v-field-padding-bottom, 4px); +} + +.v-field--focused .v-field__prepend-inner, +.v-field--focused .v-field__append-inner { + opacity: 1; +} + +.v-field__prepend-inner > .v-icon, +.v-field__append-inner > .v-icon, +.v-field__clearable > .v-icon { + opacity: var(--v-medium-emphasis-opacity); +} +.v-field--disabled .v-field__prepend-inner > .v-icon, .v-field--error .v-field__prepend-inner > .v-icon, .v-field--glow.v-field--focused .v-field__prepend-inner > .v-icon, +.v-field--disabled .v-field__append-inner > .v-icon, +.v-field--error .v-field__append-inner > .v-icon, +.v-field--glow.v-field--focused .v-field__append-inner > .v-icon, +.v-field--disabled .v-field__clearable > .v-icon, +.v-field--error .v-field__clearable > .v-icon, +.v-field--glow.v-field--focused .v-field__clearable > .v-icon { + opacity: 1; +} +.v-field--error:not(.v-field--disabled) .v-field__prepend-inner > .v-icon, +.v-field--error:not(.v-field--disabled) .v-field__append-inner > .v-icon, +.v-field--error:not(.v-field--disabled) .v-field__clearable > .v-icon { + color: rgb(var(--v-theme-error)); +} + +.v-field__clearable { + cursor: pointer; + opacity: 0; + overflow: hidden; + margin-inline: 4px; + transition: 0.15s cubic-bezier(0.4, 0, 0.2, 1); + transition-property: opacity, transform, width; +} +.v-field--focused .v-field__clearable, .v-field--persistent-clear .v-field__clearable { + opacity: 1; +} +@media (hover: hover) { + .v-field:hover .v-field__clearable { + opacity: 1; + } +} +@media (hover: none) { + .v-field__clearable { + opacity: 1; + } +} + +/* endregion */ +/* region LABEL */ +.v-label.v-field-label { + contain: layout paint; + display: block; + margin-inline-start: var(--v-field-padding-start); + margin-inline-end: var(--v-field-padding-end); + max-width: calc(100% - var(--v-field-padding-start) - var(--v-field-padding-end)); + pointer-events: none; + position: absolute; + top: var(--v-input-padding-top); + transform-origin: left center; + transition: 0.15s cubic-bezier(0.4, 0, 0.2, 1); + transition-property: opacity, transform; + z-index: 1; +} +.v-field--variant-underlined .v-label.v-field-label, .v-field--variant-plain .v-label.v-field-label { + top: calc(var(--v-input-padding-top) + var(--v-field-padding-top)); +} +.v-field--center-affix .v-label.v-field-label { + top: 50%; + transform: translateY(-50%); +} +.v-field--active .v-label.v-field-label { + visibility: hidden; +} +.v-field--focused .v-label.v-field-label, .v-field--error .v-label.v-field-label { + opacity: 1; +} +.v-field--error:not(.v-field--disabled) .v-label.v-field-label { + color: rgb(var(--v-theme-error)); +} +.v-label.v-field-label--floating { + --v-field-label-scale: 0.75em; + font-size: var(--v-field-label-scale); + visibility: hidden; +} +.v-field--variant-outlined .v-label.v-field-label--floating { + max-width: 100%; +} +.v-field--center-affix .v-label.v-field-label--floating { + transform: none; +} +.v-field.v-field--active .v-label.v-field-label--floating { + visibility: unset; +} +.v-input--density-default .v-field--variant-solo .v-label.v-field-label--floating, .v-input--density-default .v-field--variant-solo-inverted .v-label.v-field-label--floating, .v-input--density-default .v-field--variant-filled .v-label.v-field-label--floating, .v-input--density-default .v-field--variant-solo-filled .v-label.v-field-label--floating { + top: 7px; +} + +.v-input--density-comfortable .v-field--variant-solo .v-label.v-field-label--floating, .v-input--density-comfortable .v-field--variant-solo-inverted .v-label.v-field-label--floating, .v-input--density-comfortable .v-field--variant-filled .v-label.v-field-label--floating, .v-input--density-comfortable .v-field--variant-solo-filled .v-label.v-field-label--floating { + top: 5px; +} + +.v-input--density-compact .v-field--variant-solo .v-label.v-field-label--floating, .v-input--density-compact .v-field--variant-solo-inverted .v-label.v-field-label--floating, .v-input--density-compact .v-field--variant-filled .v-label.v-field-label--floating, .v-input--density-compact .v-field--variant-solo-filled .v-label.v-field-label--floating { + top: 3px; +} + +.v-field--variant-plain .v-label.v-field-label--floating, .v-field--variant-underlined .v-label.v-field-label--floating { + transform: translateY(-16px); + margin: 0; + top: var(--v-input-padding-top); +} +.v-field--variant-outlined .v-label.v-field-label--floating { + transform: translateY(-50%); + transform-origin: center; + position: static; + margin: 0 4px; +} + +/* endregion */ +/* region OUTLINE */ +.v-field__outline { + --v-field-border-width: 1px; + --v-field-border-opacity: 0.38; + align-items: stretch; + contain: layout; + display: flex; + height: 100%; + left: 0; + pointer-events: none; + position: absolute; + right: 0; + width: 100%; +} +@media (hover: hover) { + .v-field:hover .v-field__outline { + --v-field-border-opacity: var(--v-high-emphasis-opacity); + } +} +.v-field--error:not(.v-field--disabled) .v-field__outline { + color: rgb(var(--v-theme-error)); +} +.v-field.v-field--focused .v-field__outline, .v-input.v-input--error .v-field__outline { + --v-field-border-opacity: 1; +} +.v-field--variant-outlined.v-field--focused .v-field__outline { + --v-field-border-width: 2px; +} +.v-field--variant-filled .v-field__outline::before, .v-field--variant-underlined .v-field__outline::before { + border-color: currentColor; + border-style: solid; + border-width: 0 0 var(--v-field-border-width); + opacity: var(--v-field-border-opacity); + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.v-field--variant-filled .v-field__outline::before, .v-field--variant-underlined .v-field__outline::before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.v-field--variant-filled .v-field__outline::after, .v-field--variant-underlined .v-field__outline::after { + border-color: currentColor; + border-style: solid; + border-width: 0 0 2px; + transform: scaleX(0); + transition: transform 0.15s cubic-bezier(0.4, 0, 0.2, 1); +} +.v-field--variant-filled .v-field__outline::after, .v-field--variant-underlined .v-field__outline::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.v-field--focused.v-field--variant-filled .v-field__outline::after, .v-field--focused.v-field--variant-underlined .v-field__outline::after { + transform: scaleX(1); +} + +.v-field--variant-outlined .v-field__outline { + border-radius: inherit; +} +.v-field--variant-outlined .v-field__outline__start, .v-field--variant-outlined .v-field__outline__notch::before, .v-field--variant-outlined .v-field__outline__notch::after, .v-field--variant-outlined .v-field__outline__end { + border: 0 solid currentColor; + opacity: var(--v-field-border-opacity); + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.v-field--variant-outlined .v-field__outline__start { + flex: 0 0 12px; + border-top-width: var(--v-field-border-width); + border-bottom-width: var(--v-field-border-width); + border-inline-start-width: var(--v-field-border-width); + border-start-start-radius: inherit; + border-start-end-radius: 0; + border-end-end-radius: 0; + border-end-start-radius: inherit; +} +.v-field--rounded.v-field--variant-outlined .v-field__outline__start, +[class^=rounded-].v-field--variant-outlined .v-field__outline__start, +[class*=" rounded-"].v-field--variant-outlined .v-field__outline__start { + flex-basis: calc(var(--v-input-control-height) / 2 + 2px); +} + +.v-field--reverse.v-field--variant-outlined .v-field__outline__start { + border-start-start-radius: 0; + border-start-end-radius: inherit; + border-end-end-radius: inherit; + border-end-start-radius: 0; + border-inline-end-width: var(--v-field-border-width); + border-inline-start-width: 0; +} + +.v-field--variant-outlined .v-field__outline__notch { + flex: none; + position: relative; + max-width: calc(100% - 24px); +} +.v-field--rounded.v-field--variant-outlined .v-field__outline__notch, +[class^=rounded-].v-field--variant-outlined .v-field__outline__notch, +[class*=" rounded-"].v-field--variant-outlined .v-field__outline__notch { + max-width: calc(100% - var(--v-input-control-height)); +} + +.v-field--variant-outlined .v-field__outline__notch::before, .v-field--variant-outlined .v-field__outline__notch::after { + opacity: var(--v-field-border-opacity); + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.v-field--variant-outlined .v-field__outline__notch::before, .v-field--variant-outlined .v-field__outline__notch::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.v-field--variant-outlined .v-field__outline__notch::before { + border-width: var(--v-field-border-width) 0 0; +} +.v-field--variant-outlined .v-field__outline__notch::after { + bottom: 0; + border-width: 0 0 var(--v-field-border-width); +} +.v-field--active.v-field--variant-outlined .v-field__outline__notch::before { + opacity: 0; +} + +.v-field--variant-outlined .v-field__outline__end { + flex: 1; + border-top-width: var(--v-field-border-width); + border-bottom-width: var(--v-field-border-width); + border-inline-end-width: var(--v-field-border-width); + border-start-start-radius: 0; + border-start-end-radius: inherit; + border-end-end-radius: inherit; + border-end-start-radius: 0; +} +.v-field--reverse.v-field--variant-outlined .v-field__outline__end { + border-start-start-radius: inherit; + border-start-end-radius: 0; + border-end-end-radius: 0; + border-end-start-radius: inherit; + border-inline-end-width: 0; + border-inline-start-width: var(--v-field-border-width); +} + +/* endregion */ +/* region LOADER */ +.v-field__loader { + top: calc(100% - 2px); + left: 0; + position: absolute; + right: 0; + width: 100%; + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-left-radius: inherit; + border-bottom-right-radius: inherit; + overflow: hidden; +} +.v-field--variant-outlined .v-field__loader { + top: calc(100% - 3px); + width: calc(100% - 1px * 2); + left: 1px; +} + +/* endregion */ +/* region OVERLAY */ +.v-field__overlay { + border-radius: inherit; + pointer-events: none; +} +.v-field__overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.v-field--variant-filled .v-field__overlay { + background-color: currentColor; + opacity: 0.04; + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.v-field--variant-filled.v-field--has-background .v-field__overlay { + opacity: 0; +} +@media (hover: hover) { + .v-field--variant-filled:hover .v-field__overlay { + opacity: calc((0.04 + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-field--variant-filled.v-field--focused .v-field__overlay { + opacity: calc((0.04 + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} + +.v-field--variant-solo-filled .v-field__overlay { + background-color: currentColor; + opacity: 0.04; + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +@media (hover: hover) { + .v-field--variant-solo-filled:hover .v-field__overlay { + opacity: calc((0.04 + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-field--variant-solo-filled.v-field--focused .v-field__overlay { + opacity: calc((0.04 + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} + +.v-field--variant-solo-inverted .v-field__overlay { + transition: opacity 250ms cubic-bezier(0.4, 0, 0.2, 1); +} +.v-field--variant-solo-inverted.v-field--has-background .v-field__overlay { + opacity: 0; +} +@media (hover: hover) { + .v-field--variant-solo-inverted:hover .v-field__overlay { + opacity: calc((0.04 + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-field--variant-solo-inverted.v-field--focused .v-field__overlay { + background-color: rgb(var(--v-theme-surface-variant)); + opacity: 1; +} + +/* endregion */ +/* region MODIFIERS */ +.v-field--reverse .v-field__field, +.v-field--reverse .v-field__input, +.v-field--reverse .v-field__outline { + flex-direction: row-reverse; +} +.v-field--reverse .v-field__input, .v-field--reverse input { + text-align: end; +} + +.v-input--disabled .v-field--variant-filled .v-field__outline::before, +.v-input--disabled .v-field--variant-underlined .v-field__outline::before { + border-image: repeating-linear-gradient(to right, rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)) 0px, rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)) 2px, transparent 2px, transparent 4px) 1 repeat; +} + +.v-field--loading .v-field__outline::after, +.v-field--loading .v-field__outline::before { + opacity: 0; +} + +/* endregion */.v-virtual-scroll { + display: block; + flex: 1 1 auto; + max-width: 100%; + overflow: auto; + position: relative; +} +.v-virtual-scroll__container { + display: block; +}.v-badge { + display: inline-block; + line-height: 1; +} + +.v-badge__badge { + align-items: center; + display: inline-flex; + border-radius: 10px; + font-family: "Roboto", sans-serif; + font-size: 0.75rem; + font-weight: 500; + height: 1.25rem; + justify-content: center; + min-width: 20px; + padding: 4px 6px; + pointer-events: auto; + position: absolute; + text-align: center; + text-indent: 0; + transition: 0.225s cubic-bezier(0.4, 0, 0.2, 1); + white-space: nowrap; +} +.v-badge__badge { + background: rgb(var(--v-theme-surface-variant)); + color: rgba(var(--v-theme-on-surface-variant), var(--v-high-emphasis-opacity)); +} +.v-badge__badge:has(.v-icon) { + padding: 4px 6px; +} +.v-badge--bordered .v-badge__badge::after { + border-radius: inherit; + border-style: solid; + border-width: 2px; + bottom: 0; + color: rgb(var(--v-theme-background)); + content: ""; + left: 0; + position: absolute; + right: 0; + top: 0; + transform: scale(1.05); +} +.v-badge--dot .v-badge__badge { + border-radius: 4.5px; + height: 9px; + min-width: 0; + padding: 0; + width: 9px; +} +.v-badge--dot .v-badge__badge::after { + border-width: 1.5px; +} +.v-badge--inline .v-badge__badge { + position: relative; + vertical-align: middle; +} +.v-badge__badge .v-icon { + color: inherit; + font-size: 0.75rem; + margin: 0 -2px; +} +.v-badge__badge img, +.v-badge__badge .v-img { + height: 100%; + width: 100%; +} + +.v-badge__wrapper { + display: flex; + position: relative; +} +.v-badge--inline .v-badge__wrapper { + align-items: center; + display: inline-flex; + justify-content: center; + margin: 0 4px; +}.v-banner { + display: grid; + flex: 1 1; + font-size: 0.875rem; + grid-template-areas: "prepend content actions"; + grid-template-columns: max-content auto max-content; + grid-template-rows: max-content max-content; + line-height: 1.6; + overflow: hidden; + padding-inline: 16px 8px; + padding-top: 16px; + padding-bottom: 16px; + position: relative; + width: 100%; +} +.v-banner { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0 0 thin 0; +} +.v-banner--border { + border-width: thin; + box-shadow: none; +} +.v-banner { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-banner--absolute { + position: absolute; +} +.v-banner--fixed { + position: fixed; +} +.v-banner--sticky { + position: sticky; +} +.v-banner { + border-radius: 0; +} +.v-banner { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-banner--rounded { + border-radius: 4px; +} +.v-banner--stacked:not(.v-banner--one-line) { + grid-template-areas: "prepend content" ". actions"; +} +.v-banner--stacked .v-banner-text { + padding-inline-end: 36px; +} +.v-banner--density-default .v-banner-actions { + margin-bottom: -8px; +} +.v-banner--density-default.v-banner--one-line { + padding-top: 8px; + padding-bottom: 8px; +} +.v-banner--density-default.v-banner--one-line .v-banner-actions { + margin-bottom: 0; +} +.v-banner--density-default.v-banner--one-line { + padding-top: 10px; +} +.v-banner--density-default.v-banner--two-line { + padding-top: 16px; + padding-bottom: 16px; +} +.v-banner--density-default.v-banner--three-line { + padding-top: 24px; + padding-bottom: 16px; +} +.v-banner--density-default:not(.v-banner--one-line) .v-banner-actions, .v-banner--density-default.v-banner--two-line .v-banner-actions, .v-banner--density-default.v-banner--three-line .v-banner-actions { + margin-top: 20px; +} + +.v-banner--density-comfortable .v-banner-actions { + margin-bottom: -4px; +} +.v-banner--density-comfortable.v-banner--one-line { + padding-top: 4px; + padding-bottom: 4px; +} +.v-banner--density-comfortable.v-banner--one-line .v-banner-actions { + margin-bottom: 0; +} +.v-banner--density-comfortable.v-banner--two-line { + padding-top: 12px; + padding-bottom: 12px; +} +.v-banner--density-comfortable.v-banner--three-line { + padding-top: 20px; + padding-bottom: 12px; +} +.v-banner--density-comfortable:not(.v-banner--one-line) .v-banner-actions, .v-banner--density-comfortable.v-banner--two-line .v-banner-actions, .v-banner--density-comfortable.v-banner--three-line .v-banner-actions { + margin-top: 16px; +} + +.v-banner--density-compact .v-banner-actions { + margin-bottom: 0px; +} +.v-banner--density-compact.v-banner--one-line { + padding-top: 0px; + padding-bottom: 0px; +} +.v-banner--density-compact.v-banner--one-line .v-banner-actions { + margin-bottom: 0; +} +.v-banner--density-compact.v-banner--two-line { + padding-top: 8px; + padding-bottom: 8px; +} +.v-banner--density-compact.v-banner--three-line { + padding-top: 16px; + padding-bottom: 8px; +} +.v-banner--density-compact:not(.v-banner--one-line) .v-banner-actions, .v-banner--density-compact.v-banner--two-line .v-banner-actions, .v-banner--density-compact.v-banner--three-line .v-banner-actions { + margin-top: 12px; +} + +.v-banner--sticky { + top: 0; + z-index: 1; +} + +.v-banner__content { + align-items: center; + display: flex; + grid-area: content; +} + +.v-banner__prepend { + align-self: flex-start; + grid-area: prepend; + margin-inline-end: 24px; +} + +.v-banner-actions { + align-self: flex-end; + display: flex; + flex: 0 1; + grid-area: actions; + justify-content: flex-end; +} +.v-banner--two-line .v-banner-actions, .v-banner--three-line .v-banner-actions { + margin-top: 20px; +} + +.v-banner-text { + -webkit-box-orient: vertical; + display: -webkit-box; + padding-inline-end: 90px; + overflow: hidden; +} +.v-banner--one-line .v-banner-text { + -webkit-line-clamp: 1; +} +.v-banner--two-line .v-banner-text { + -webkit-line-clamp: 2; +} +.v-banner--three-line .v-banner-text { + -webkit-line-clamp: 3; +} +.v-banner--two-line .v-banner-text, .v-banner--three-line .v-banner-text { + align-self: flex-start; +}.v-bottom-navigation { + display: flex; + max-width: 100%; + overflow: hidden; + position: absolute; + transition: transform, color, 0.2s, 0.1s cubic-bezier(0.4, 0, 0.2, 1); +} +.v-bottom-navigation { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-bottom-navigation--border { + border-width: thin; + box-shadow: none; +} +.v-bottom-navigation { + border-radius: 0; +} +.v-bottom-navigation { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-bottom-navigation--active { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} + +.v-bottom-navigation__content { + display: flex; + flex: none; + font-size: 0.75rem; + justify-content: center; + transition: inherit; + width: 100%; +} +.v-bottom-navigation .v-bottom-navigation__content > .v-btn { + font-size: inherit; + height: 100%; + max-width: 168px; + min-width: 80px; + text-transform: none; + transition: inherit; + width: auto; +} +.v-bottom-navigation .v-bottom-navigation__content > .v-btn { + border-radius: 0; +} +.v-bottom-navigation .v-bottom-navigation__content > .v-btn .v-btn__content, +.v-bottom-navigation .v-bottom-navigation__content > .v-btn .v-btn__icon { + transition: inherit; +} +.v-bottom-navigation .v-bottom-navigation__content > .v-btn .v-btn__icon { + font-size: 1.5rem; +} +.v-bottom-navigation--grow .v-bottom-navigation__content > .v-btn { + flex-basis: 0; + flex-grow: 1; +} +.v-bottom-navigation--shift .v-bottom-navigation__content .v-btn:not(.v-btn--selected) .v-btn__content > span { + transition: inherit; + opacity: 0; +} +.v-bottom-navigation--shift .v-bottom-navigation__content .v-btn:not(.v-btn--selected) .v-btn__content { + transform: translateY(0.5rem); +}.bottom-sheet-transition-enter-from { + transform: translateY(100%); +} +.bottom-sheet-transition-leave-to { + transform: translateY(100%); +} + +.v-bottom-sheet > .v-bottom-sheet__content.v-overlay__content { + align-self: flex-end; + border-radius: 0; + flex: 0 1 auto; + left: 0; + right: 0; + margin-inline: auto; + margin-bottom: 0; + transition-duration: 0.2s; + width: 100%; + max-width: 100%; + overflow: visible; +} +.v-bottom-sheet > .v-bottom-sheet__content.v-overlay__content { + box-shadow: 0px 7px 8px -4px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 12px 17px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 5px 22px 4px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-bottom-sheet > .v-bottom-sheet__content.v-overlay__content > .v-card, +.v-bottom-sheet > .v-bottom-sheet__content.v-overlay__content > .v-sheet { + border-radius: 0; +} +.v-bottom-sheet.v-bottom-sheet--inset { + max-width: none; +} +@media (min-width: 600px) { + .v-bottom-sheet.v-bottom-sheet--inset { + max-width: 70%; + } +}.v-dialog { + align-items: center; + justify-content: center; + margin: auto; +} +.v-dialog > .v-overlay__content { + max-height: calc(100% - 48px); + width: calc(100% - 48px); + max-width: calc(100% - 48px); + margin: 24px; +} +.v-dialog > .v-overlay__content, +.v-dialog > .v-overlay__content > form { + display: flex; + flex-direction: column; + min-height: 0; +} +.v-dialog > .v-overlay__content > .v-card, +.v-dialog > .v-overlay__content > .v-sheet, +.v-dialog > .v-overlay__content > form > .v-card, +.v-dialog > .v-overlay__content > form > .v-sheet { + --v-scrollbar-offset: 0px; + border-radius: 4px; + overflow-y: auto; + flex: 1 1 100%; +} +.v-dialog > .v-overlay__content > .v-card, +.v-dialog > .v-overlay__content > .v-sheet, +.v-dialog > .v-overlay__content > form > .v-card, +.v-dialog > .v-overlay__content > form > .v-sheet { + box-shadow: 0px 11px 15px -7px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 24px 38px 3px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 9px 46px 8px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-dialog > .v-overlay__content > .v-card, +.v-dialog > .v-overlay__content > form > .v-card { + display: flex; + flex-direction: column; +} +.v-dialog > .v-overlay__content > .v-card > .v-card-item, +.v-dialog > .v-overlay__content > form > .v-card > .v-card-item { + padding: 16px 24px; +} +.v-dialog > .v-overlay__content > .v-card > .v-card-item + .v-card-text, +.v-dialog > .v-overlay__content > form > .v-card > .v-card-item + .v-card-text { + padding-top: 0; +} +.v-dialog > .v-overlay__content > .v-card > .v-card-text, +.v-dialog > .v-overlay__content > form > .v-card > .v-card-text { + font-size: inherit; + letter-spacing: 0.03125em; + line-height: inherit; + padding: 16px 24px 24px; +} +.v-dialog > .v-overlay__content > .v-card > .v-card-actions, +.v-dialog > .v-overlay__content > form > .v-card > .v-card-actions { + justify-content: flex-end; +} + +.v-dialog--fullscreen { + --v-scrollbar-offset: 0px; +} +.v-dialog--fullscreen > .v-overlay__content { + border-radius: 0; + margin: 0; + padding: 0; + width: 100%; + height: 100%; + max-width: 100%; + max-height: 100%; + overflow-y: auto; + top: 0; + left: 0; +} +.v-dialog--fullscreen > .v-overlay__content > .v-card, +.v-dialog--fullscreen > .v-overlay__content > .v-sheet, +.v-dialog--fullscreen > .v-overlay__content > form > .v-card, +.v-dialog--fullscreen > .v-overlay__content > form > .v-sheet { + min-height: 100%; + min-width: 100%; + border-radius: 0; +} + +.v-dialog--scrollable > .v-overlay__content > form, +.v-dialog--scrollable > .v-overlay__content > form > .v-card { + max-height: 100%; + max-width: 100%; +} +.v-dialog--scrollable > .v-overlay__content, +.v-dialog--scrollable > .v-overlay__content > .v-card, +.v-dialog--scrollable > .v-overlay__content > form, +.v-dialog--scrollable > .v-overlay__content > form > .v-card { + display: flex; + flex: 1 1 100%; + flex-direction: column; +} +.v-dialog--scrollable > .v-overlay__content > .v-card > .v-card-text, +.v-dialog--scrollable > .v-overlay__content > form > .v-card > .v-card-text { + backface-visibility: hidden; + overflow-y: auto; +}.v-breadcrumbs { + display: flex; + align-items: center; + line-height: 1.6; + padding: 16px 12px; +} +.v-breadcrumbs--rounded { + border-radius: 4px; +} +.v-breadcrumbs--density-default { + padding-top: 16px; + padding-bottom: 16px; +} + +.v-breadcrumbs--density-comfortable { + padding-top: 12px; + padding-bottom: 12px; +} + +.v-breadcrumbs--density-compact { + padding-top: 8px; + padding-bottom: 8px; +} + +.v-breadcrumbs__prepend { + align-items: center; + display: inline-flex; +} + +.v-breadcrumbs-item { + align-items: center; + color: inherit; + display: inline-flex; + padding: 0 4px; + text-decoration: none; + vertical-align: middle; +} +.v-breadcrumbs-item--disabled { + opacity: var(--v-disabled-opacity); + pointer-events: none; +} +.v-breadcrumbs-item--link { + color: inherit; + text-decoration: none; +} +.v-breadcrumbs-item--link:hover { + text-decoration: underline; +} +.v-breadcrumbs-item .v-icon { + font-size: 1rem; + margin-inline: -4px 2px; +} + +.v-breadcrumbs-divider { + display: inline-block; + padding: 0 8px; + vertical-align: middle; +}.v-card { + display: block; + overflow: hidden; + overflow-wrap: break-word; + position: relative; + padding: 0; + text-decoration: none; + transition-duration: 0.28s; + transition-property: box-shadow, opacity, background; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + z-index: 0; +} +.v-card { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-card--border { + border-width: thin; + box-shadow: none; +} +.v-card--absolute { + position: absolute; +} +.v-card--fixed { + position: fixed; +} +.v-card { + border-radius: 4px; +} +.v-card:hover > .v-card__overlay { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-card:focus-visible > .v-card__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-card:focus > .v-card__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} +.v-card--active > .v-card__overlay, .v-card[aria-haspopup=menu][aria-expanded=true] > .v-card__overlay { + opacity: calc(var(--v-activated-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-card--active:hover > .v-card__overlay, .v-card[aria-haspopup=menu][aria-expanded=true]:hover > .v-card__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); +} +.v-card--active:focus-visible > .v-card__overlay, .v-card[aria-haspopup=menu][aria-expanded=true]:focus-visible > .v-card__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-card--active:focus > .v-card__overlay, .v-card[aria-haspopup=menu][aria-expanded=true]:focus > .v-card__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-card--variant-plain, .v-card--variant-outlined, .v-card--variant-text, .v-card--variant-tonal { + background: transparent; + color: inherit; +} +.v-card--variant-plain { + opacity: 0.62; +} +.v-card--variant-plain:focus, .v-card--variant-plain:hover { + opacity: 1; +} +.v-card--variant-plain .v-card__overlay { + display: none; +} +.v-card--variant-elevated, .v-card--variant-flat { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-card--variant-elevated { + box-shadow: 0px 2px 1px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 1px 1px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 3px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-card--variant-flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-card--variant-outlined { + border: thin solid currentColor; +} +.v-card--variant-text .v-card__overlay { + background: currentColor; +} +.v-card--variant-tonal .v-card__underlay { + background: currentColor; + opacity: var(--v-activated-opacity); + border-radius: inherit; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} +.v-card .v-card__underlay { + position: absolute; +} +.v-card--disabled { + pointer-events: none; + user-select: none; +} +.v-card--disabled > :not(.v-card__loader) { + opacity: 0.6; +} +.v-card--flat { + box-shadow: none; +} +.v-card--hover { + cursor: pointer; +} +.v-card--hover::before, .v-card--hover::after { + border-radius: inherit; + bottom: 0; + content: ""; + display: block; + left: 0; + pointer-events: none; + position: absolute; + right: 0; + top: 0; + transition: inherit; +} +.v-card--hover::before { + opacity: 1; + z-index: -1; +} +.v-card--hover::before { + box-shadow: 0px 2px 1px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 1px 1px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 3px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-card--hover::after { + z-index: 1; + opacity: 0; +} +.v-card--hover::after { + box-shadow: 0px 5px 5px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 8px 10px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 3px 14px 2px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-card--hover:hover::after { + opacity: 1; +} +.v-card--hover:hover::before { + opacity: 0; +} +.v-card--hover:hover { + box-shadow: 0px 5px 5px -3px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 8px 10px 1px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 3px 14px 2px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-card--link { + cursor: pointer; +} + +.v-card-actions { + align-items: center; + display: flex; + flex: none; + min-height: 52px; + padding: 0.5rem; + gap: 0.5rem; +} + +.v-card-item { + align-items: center; + display: grid; + flex: none; + grid-template-areas: "prepend content append"; + grid-template-columns: max-content auto max-content; + padding: 0.625rem 1rem; +} +.v-card-item + .v-card-text { + padding-top: 0; +} +.v-card-item__prepend, .v-card-item__append { + align-items: center; + display: flex; +} +.v-card-item__prepend { + grid-area: prepend; + padding-inline-end: 0.5rem; +} +.v-card-item__append { + grid-area: append; + padding-inline-start: 0.5rem; +} + +.v-card-item__content { + align-self: center; + grid-area: content; + overflow: hidden; +} + +.v-card-title { + display: block; + flex: none; + font-size: 1.25rem; + font-weight: 500; + hyphens: auto; + letter-spacing: 0.0125em; + min-width: 0; + overflow-wrap: normal; + overflow: hidden; + padding: 0.5rem 1rem; + text-overflow: ellipsis; + text-transform: none; + white-space: nowrap; + word-break: normal; + word-wrap: break-word; +} +.v-card .v-card-title { + line-height: 1.6; +} +.v-card--density-comfortable .v-card-title { + line-height: 1.75rem; +} +.v-card--density-compact .v-card-title { + line-height: 1.55rem; +} +.v-card-item .v-card-title { + padding: 0; +} +.v-card-title + .v-card-text, +.v-card-title + .v-card-actions { + padding-top: 0; +} + +.v-card-subtitle { + display: block; + flex: none; + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 0.0178571429em; + opacity: var(--v-card-subtitle-opacity, var(--v-medium-emphasis-opacity)); + overflow: hidden; + padding: 0 1rem; + text-overflow: ellipsis; + text-transform: none; + white-space: nowrap; +} +.v-card .v-card-subtitle { + line-height: 1.425; +} +.v-card--density-comfortable .v-card-subtitle { + line-height: 1.125rem; +} +.v-card--density-compact .v-card-subtitle { + line-height: 1rem; +} +.v-card-item .v-card-subtitle { + padding: 0 0 0.25rem; +} + +.v-card-text { + flex: 1 1 auto; + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 0.0178571429em; + opacity: var(--v-card-text-opacity, 1); + padding: 1rem; + text-transform: none; +} +.v-card .v-card-text { + line-height: 1.425; +} +.v-card--density-comfortable .v-card-text { + line-height: 1.2rem; +} +.v-card--density-compact .v-card-text { + line-height: 1.15rem; +} + +.v-card__image { + display: flex; + height: 100%; + flex: 1 1 auto; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; + z-index: -1; +} + +.v-card__content { + border-radius: inherit; + overflow: hidden; + position: relative; +} + +.v-card__loader { + bottom: auto; + top: 0; + left: 0; + position: absolute; + right: 0; + width: 100%; + z-index: 1; +} + +.v-card__overlay { + background-color: currentColor; + border-radius: inherit; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; + opacity: 0; + transition: opacity 0.2s ease-in-out; +}.v-carousel { + overflow: hidden; + position: relative; + width: 100%; +} +.v-carousel__controls { + align-items: center; + bottom: 0; + display: flex; + height: 50px; + justify-content: center; + list-style-type: none; + position: absolute; + width: 100%; + z-index: 1; +} +.v-carousel__controls { + background: rgba(var(--v-theme-surface-variant), 0.3); + color: rgb(var(--v-theme-on-surface-variant)); +} +.v-carousel__controls > .v-item-group { + flex: 0 1 auto; +} +.v-carousel__controls__item { + margin: 0 8px; +} +.v-carousel__controls__item .v-icon { + opacity: 0.5; +} +.v-carousel__controls__item--active .v-icon { + opacity: 1; + vertical-align: middle; +} +.v-carousel__controls__item:hover { + background: none; +} +.v-carousel__controls__item:hover .v-icon { + opacity: 0.8; +} + +.v-carousel__progress { + margin: 0; + position: absolute; + bottom: 0; + left: 0; + right: 0; +} + +.v-carousel-item { + display: block; + height: inherit; + text-decoration: none; +} +.v-carousel-item > .v-img { + height: inherit; +} + +.v-carousel--hide-delimiter-background .v-carousel__controls { + background: transparent; +} + +.v-carousel--vertical-delimiters .v-carousel__controls { + flex-direction: column; + height: 100% !important; + width: 50px; +}.v-window { + overflow: hidden; +} +.v-window__container { + display: flex; + flex-direction: column; + height: inherit; + position: relative; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); +} +.v-window__controls { + position: absolute; + left: 0; + top: 0; + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 16px; + pointer-events: none; +} +.v-window__controls > * { + pointer-events: auto; +} +.v-window--show-arrows-on-hover { + overflow: hidden; +} +.v-window--show-arrows-on-hover .v-window__left { + transform: translateX(-200%); +} +.v-window--show-arrows-on-hover .v-window__right { + transform: translateX(200%); +} +.v-window--show-arrows-on-hover:hover .v-window__left, +.v-window--show-arrows-on-hover:hover .v-window__right { + transform: translateX(0); +} + +.v-window-x-transition-enter-active, .v-window-x-transition-leave-active, .v-window-x-reverse-transition-enter-active, .v-window-x-reverse-transition-leave-active, .v-window-y-transition-enter-active, .v-window-y-transition-leave-active, .v-window-y-reverse-transition-enter-active, .v-window-y-reverse-transition-leave-active { + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); +} +.v-window-x-transition-leave-from, .v-window-x-transition-leave-to, .v-window-x-reverse-transition-leave-from, .v-window-x-reverse-transition-leave-to, .v-window-y-transition-leave-from, .v-window-y-transition-leave-to, .v-window-y-reverse-transition-leave-from, .v-window-y-reverse-transition-leave-to { + position: absolute !important; + top: 0; + width: 100%; +} +.v-window-x-transition-enter-from { + transform: translateX(100%); +} +.v-window-x-transition-leave-to { + transform: translateX(-100%); +} +.v-window-x-reverse-transition-enter-from { + transform: translateX(-100%); +} +.v-window-x-reverse-transition-leave-to { + transform: translateX(100%); +} +.v-window-y-transition-enter-from { + transform: translateY(100%); +} +.v-window-y-transition-leave-to { + transform: translateY(-100%); +} +.v-window-y-reverse-transition-enter-from { + transform: translateY(-100%); +} +.v-window-y-reverse-transition-leave-to { + transform: translateY(100%); +}.v-code { + background-color: rgb(var(--v-theme-code)); + color: rgb(var(--v-theme-on-code)); + border-radius: 4px; + line-height: 1.8; + font-size: 0.9em; + font-weight: normal; + padding: 0.2em 0.4em; +} +.v-code:has(> pre) { + display: inline-block; +}.v-color-picker { + align-self: flex-start; + contain: content; + width: 300px; +} +.v-color-picker.v-sheet.v-picker { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-color-picker.v-sheet.v-picker { + border-radius: 4px; +} + +.v-color-picker__controls { + display: flex; + flex-direction: column; + padding: 16px; +} + +.v-color-picker--flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-color-picker--flat .v-color-picker__track:not(.v-input--is-disabled) .v-slider__thumb { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +}.v-color-picker-canvas { + display: flex; + position: relative; + overflow: hidden; + contain: content; + touch-action: none; +} +.v-color-picker-canvas__dot { + position: absolute; + top: 0; + left: 0; + width: 15px; + height: 15px; + background: transparent; + border-radius: 50%; + box-shadow: 0px 0px 0px 1.5px rgb(255, 255, 255), inset 0px 0px 1px 1.5px rgba(0, 0, 0, 0.3); +} +.v-color-picker-canvas__dot--disabled { + box-shadow: 0px 0px 0px 1.5px rgba(255, 255, 255, 0.7), inset 0px 0px 1px 1.5px rgba(0, 0, 0, 0.3); +} +.v-color-picker-canvas:hover .v-color-picker-canvas__dot { + will-change: transform; +}.v-color-picker-edit { + display: flex; + margin-top: 24px; +} + +.v-color-picker-edit__input { + width: 100%; + display: flex; + flex-wrap: wrap; + justify-content: center; + text-align: center; +} +.v-color-picker-edit__input:not(:last-child) { + margin-inline-end: 8px; +} +.v-color-picker-edit__input input { + border-radius: 4px; + margin-bottom: 8px; + min-width: 0; + outline: none; + text-align: center; + width: 100%; + height: 32px; + background: rgba(var(--v-theme-surface-variant), 0.2); + color: rgba(var(--v-theme-on-surface)); +} +.v-color-picker-edit__input span { + font-size: 0.75rem; +}.v-color-picker-preview__alpha .v-slider-track__background { + background-color: transparent !important; +} +.v-locale--is-ltr.v-color-picker-preview__alpha .v-slider-track__background, .v-locale--is-ltr .v-color-picker-preview__alpha .v-slider-track__background { + background-image: linear-gradient(to right, transparent, var(--v-color-picker-color-hsv)); +} + +.v-locale--is-rtl.v-color-picker-preview__alpha .v-slider-track__background, .v-locale--is-rtl .v-color-picker-preview__alpha .v-slider-track__background { + background-image: linear-gradient(to left, transparent, var(--v-color-picker-color-hsv)); +} + +.v-color-picker-preview__alpha .v-slider-track__background::after { + content: ""; + z-index: -1; + left: 0; + top: 0; + width: 100%; + height: 100%; + position: absolute; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAACRJREFUKFNjPHTo0H8GJGBnZ8eIzGekgwJk+0BsdCtRHEQbBQBbbh0dIGKknQAAAABJRU5ErkJggg==) repeat; + border-radius: inherit; +} + +.v-color-picker-preview__sliders { + display: flex; + flex: 1 0 auto; + flex-direction: column; + padding-inline-end: 16px; +} + +.v-color-picker-preview__dot { + position: relative; + height: 30px; + width: 30px; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAACRJREFUKFNjPHTo0H8GJGBnZ8eIzGekgwJk+0BsdCtRHEQbBQBbbh0dIGKknQAAAABJRU5ErkJggg==) repeat; + border-radius: 50%; + overflow: hidden; + margin-inline-end: 24px; +} +.v-color-picker-preview__dot > div { + width: 100%; + height: 100%; +} + +.v-locale--is-ltr.v-color-picker-preview__hue:not(.v-input--is-disabled) .v-slider-track__background, .v-locale--is-ltr .v-color-picker-preview__hue:not(.v-input--is-disabled) .v-slider-track__background { + background: linear-gradient(to right, #F00 0%, #FF0 16.66%, #0F0 33.33%, #0FF 50%, #00F 66.66%, #F0F 83.33%, #F00 100%); +} + +.v-locale--is-rtl.v-color-picker-preview__hue:not(.v-input--is-disabled) .v-slider-track__background, .v-locale--is-rtl .v-color-picker-preview__hue:not(.v-input--is-disabled) .v-slider-track__background { + background: linear-gradient(to left, #F00 0%, #FF0 16.66%, #0F0 33.33%, #0FF 50%, #00F 66.66%, #F0F 83.33%, #F00 100%); +} + +.v-color-picker-preview__track { + position: relative; + width: 100%; + margin: 0 !important; +} +.v-color-picker-preview__track .v-slider-track__fill { + display: none; +} + +.v-color-picker-preview { + align-items: center; + display: flex; + margin-bottom: 0; +} + +.v-color-picker-preview__eye-dropper { + position: relative; + margin-right: 12px; +}.v-slider .v-slider__container input { + cursor: default; + padding: 0; + width: 100%; + display: none; +} +.v-slider > .v-input__append, +.v-slider > .v-input__prepend { + padding: 0; +} + +.v-slider__container { + position: relative; + min-height: inherit; + width: 100%; + height: 100%; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; +} +.v-input--disabled .v-slider__container { + opacity: var(--v-disabled-opacity); +} +.v-input--error:not(.v-input--disabled) .v-slider__container { + color: rgb(var(--v-theme-error)); +} + +.v-slider.v-input--horizontal { + align-items: center; + margin-inline: 8px 8px; +} +.v-slider.v-input--horizontal > .v-input__control { + min-height: 32px; + display: flex; + align-items: center; +} + +.v-slider.v-input--vertical { + justify-content: center; + margin-top: 12px; + margin-bottom: 12px; +} +.v-slider.v-input--vertical > .v-input__control { + min-height: 300px; +} + +.v-slider.v-input--disabled { + pointer-events: none; +} + +.v-slider--has-labels > .v-input__control { + margin-bottom: 4px; +} + +.v-slider__label { + margin-inline-end: 12px; +}.v-slider-thumb { + touch-action: none; + color: rgb(var(--v-theme-surface-variant)); +} +.v-input--error:not(.v-input--disabled) .v-slider-thumb { + color: inherit; +} + +.v-slider-thumb__label { + background: rgba(var(--v-theme-surface-variant), 0.7); + color: rgb(var(--v-theme-on-surface-variant)); +} +.v-slider-thumb__label::before { + color: rgba(var(--v-theme-surface-variant), 0.7); +} + +.v-slider-thumb { + outline: none; + position: absolute; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); +} + +.v-slider-thumb__surface { + cursor: pointer; + width: var(--v-slider-thumb-size); + height: var(--v-slider-thumb-size); + border-radius: 50%; + user-select: none; + background-color: currentColor; +} +@media (forced-colors: active) { + .v-slider-thumb__surface { + background-color: highlight; + } +} +.v-slider-thumb__surface::before { + transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1); + content: ""; + color: inherit; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: 50%; + background: currentColor; + position: absolute; + pointer-events: none; + opacity: 0; +} +.v-slider-thumb__surface::after { + content: ""; + width: 42px; + height: 42px; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.v-slider-thumb__label-container { + position: absolute; + transition: 0.2s cubic-bezier(0.4, 0, 1, 1); +} + +.v-slider-thumb__label { + display: flex; + align-items: center; + justify-content: center; + font-size: 0.75rem; + min-width: 35px; + height: 25px; + border-radius: 4px; + padding: 6px; + position: absolute; + user-select: none; + transition: 0.2s cubic-bezier(0.4, 0, 1, 1); +} +.v-slider-thumb__label::before { + content: ""; + width: 0; + height: 0; + position: absolute; +} + +.v-slider-thumb__ripple { + position: absolute; + left: calc(var(--v-slider-thumb-size) / -2); + top: calc(var(--v-slider-thumb-size) / -2); + width: calc(var(--v-slider-thumb-size) * 2); + height: calc(var(--v-slider-thumb-size) * 2); + background: inherit; +} + +.v-slider.v-input--horizontal .v-slider-thumb { + top: 50%; + transform: translateY(-50%); + inset-inline-start: calc(var(--v-slider-thumb-position) - var(--v-slider-thumb-size) / 2); +} +.v-slider.v-input--horizontal .v-slider-thumb__label-container { + left: calc(var(--v-slider-thumb-size) / 2); + top: 0; +} +.v-slider.v-input--horizontal .v-slider-thumb__label { + bottom: calc(var(--v-slider-thumb-size) / 2); +} +.v-locale--is-ltr.v-slider.v-input--horizontal .v-slider-thumb__label, .v-locale--is-ltr .v-slider.v-input--horizontal .v-slider-thumb__label { + transform: translateX(-50%); +} + +.v-locale--is-rtl.v-slider.v-input--horizontal .v-slider-thumb__label, .v-locale--is-rtl .v-slider.v-input--horizontal .v-slider-thumb__label { + transform: translateX(50%); +} + +.v-slider.v-input--horizontal .v-slider-thumb__label::before { + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid currentColor; + bottom: -6px; +} + +.v-slider.v-input--vertical .v-slider-thumb { + top: calc(var(--v-slider-thumb-position) - var(--v-slider-thumb-size) / 2); +} +.v-slider.v-input--vertical .v-slider-thumb__label-container { + top: calc(var(--v-slider-thumb-size) / 2); + right: 0; +} +.v-slider.v-input--vertical .v-slider-thumb__label { + top: -12.5px; + left: calc(var(--v-slider-thumb-size) / 2); +} +.v-slider.v-input--vertical .v-slider-thumb__label::before { + border-right: 6px solid currentColor; + border-top: 6px solid transparent; + border-bottom: 6px solid transparent; + left: -6px; +} + +.v-slider-thumb--focused .v-slider-thumb__surface::before { + transform: scale(2); + opacity: var(--v-focus-opacity); +} + +.v-slider-thumb--pressed { + transition: none; +} +.v-slider-thumb--pressed .v-slider-thumb__surface::before { + opacity: var(--v-pressed-opacity); +} + +@media (hover: hover) { + .v-slider-thumb:hover .v-slider-thumb__surface::before { + transform: scale(2); + } + .v-slider-thumb:hover:not(.v-slider-thumb--focused) .v-slider-thumb__surface::before { + opacity: var(--v-hover-opacity); + } +}.v-slider-track__background { + background-color: rgb(var(--v-theme-surface-variant)); +} +@media (forced-colors: active) { + .v-slider-track__background { + background-color: highlight; + } +} + +.v-slider-track__fill { + background-color: rgb(var(--v-theme-surface-variant)); +} +@media (forced-colors: active) { + .v-slider-track__fill { + background-color: highlight; + } +} + +.v-slider-track__tick { + background-color: rgb(var(--v-theme-surface-variant)); +} +.v-slider-track__tick--filled { + background-color: rgb(var(--v-theme-surface-light)); +} + +.v-slider-track { + border-radius: 6px; +} +@media (forced-colors: active) { + .v-slider-track { + border: thin solid buttontext; + } +} + +.v-slider-track__background, .v-slider-track__fill { + position: absolute; + transition: 0.3s cubic-bezier(0.25, 0.8, 0.5, 1); + border-radius: inherit; +} +.v-slider--pressed .v-slider-track__background, .v-slider--pressed .v-slider-track__fill { + transition: none; +} +.v-input--error:not(.v-input--disabled) .v-slider-track__background, .v-input--error:not(.v-input--disabled) .v-slider-track__fill { + background-color: currentColor; +} + +.v-slider-track__ticks { + height: 100%; + width: 100%; + position: relative; +} + +.v-slider-track__tick { + position: absolute; + opacity: 0; + transition: 0.2s opacity cubic-bezier(0.4, 0, 0.2, 1); + border-radius: 2px; + width: var(--v-slider-tick-size); + height: var(--v-slider-tick-size); + transform: translate(calc(var(--v-slider-tick-size) / -2), calc(var(--v-slider-tick-size) / -2)); +} +.v-locale--is-ltr.v-slider-track__tick--first .v-slider-track__tick-label, .v-locale--is-ltr .v-slider-track__tick--first .v-slider-track__tick-label { + transform: none; +} + +.v-locale--is-rtl.v-slider-track__tick--first .v-slider-track__tick-label, .v-locale--is-rtl .v-slider-track__tick--first .v-slider-track__tick-label { + transform: translateX(100%); +} + +.v-locale--is-ltr.v-slider-track__tick--last .v-slider-track__tick-label, .v-locale--is-ltr .v-slider-track__tick--last .v-slider-track__tick-label { + transform: translateX(-100%); +} + +.v-locale--is-rtl.v-slider-track__tick--last .v-slider-track__tick-label, .v-locale--is-rtl .v-slider-track__tick--last .v-slider-track__tick-label { + transform: none; +} + +.v-slider-track__tick-label { + position: absolute; + user-select: none; + white-space: nowrap; +} + +.v-slider.v-input--horizontal .v-slider-track { + display: flex; + align-items: center; + width: 100%; + height: calc(var(--v-slider-track-size) + 2px); + touch-action: pan-y; +} +.v-slider.v-input--horizontal .v-slider-track__background { + height: var(--v-slider-track-size); +} +.v-slider.v-input--horizontal .v-slider-track__fill { + height: inherit; +} +.v-slider.v-input--horizontal .v-slider-track__tick { + margin-top: calc(calc(var(--v-slider-track-size) + 2px) / 2); +} +.v-locale--is-rtl.v-slider.v-input--horizontal .v-slider-track__tick, .v-locale--is-rtl .v-slider.v-input--horizontal .v-slider-track__tick { + transform: translate(calc(var(--v-slider-tick-size) / 2), calc(var(--v-slider-tick-size) / -2)); +} + +.v-slider.v-input--horizontal .v-slider-track__tick .v-slider-track__tick-label { + margin-top: calc(var(--v-slider-track-size) / 2 + 8px); +} +.v-locale--is-ltr.v-slider.v-input--horizontal .v-slider-track__tick .v-slider-track__tick-label, .v-locale--is-ltr .v-slider.v-input--horizontal .v-slider-track__tick .v-slider-track__tick-label { + transform: translateX(-50%); +} + +.v-locale--is-rtl.v-slider.v-input--horizontal .v-slider-track__tick .v-slider-track__tick-label, .v-locale--is-rtl .v-slider.v-input--horizontal .v-slider-track__tick .v-slider-track__tick-label { + transform: translateX(50%); +} + +.v-slider.v-input--horizontal .v-slider-track__tick--first { + margin-inline-start: calc(var(--v-slider-tick-size) + 1px); +} +.v-locale--is-ltr.v-slider.v-input--horizontal .v-slider-track__tick--first .v-slider-track__tick-label, .v-locale--is-ltr .v-slider.v-input--horizontal .v-slider-track__tick--first .v-slider-track__tick-label { + transform: translateX(0%); +} + +.v-locale--is-rtl.v-slider.v-input--horizontal .v-slider-track__tick--first .v-slider-track__tick-label, .v-locale--is-rtl .v-slider.v-input--horizontal .v-slider-track__tick--first .v-slider-track__tick-label { + transform: translateX(0%); +} + +.v-slider.v-input--horizontal .v-slider-track__tick--last { + margin-inline-start: calc(100% - var(--v-slider-tick-size) - 1px); +} +.v-locale--is-ltr.v-slider.v-input--horizontal .v-slider-track__tick--last .v-slider-track__tick-label, .v-locale--is-ltr .v-slider.v-input--horizontal .v-slider-track__tick--last .v-slider-track__tick-label { + transform: translateX(-100%); +} + +.v-locale--is-rtl.v-slider.v-input--horizontal .v-slider-track__tick--last .v-slider-track__tick-label, .v-locale--is-rtl .v-slider.v-input--horizontal .v-slider-track__tick--last .v-slider-track__tick-label { + transform: translateX(100%); +} + +.v-slider.v-input--vertical .v-slider-track { + height: 100%; + display: flex; + justify-content: center; + width: calc(var(--v-slider-track-size) + 2px); + touch-action: pan-x; +} +.v-slider.v-input--vertical .v-slider-track__background { + width: var(--v-slider-track-size); +} +.v-slider.v-input--vertical .v-slider-track__fill { + width: inherit; +} +.v-slider.v-input--vertical .v-slider-track__ticks { + height: 100%; +} +.v-slider.v-input--vertical .v-slider-track__tick { + margin-inline-start: calc(calc(var(--v-slider-track-size) + 2px) / 2); + transform: translate(calc(var(--v-slider-tick-size) / -2), calc(var(--v-slider-tick-size) / 2)); +} +.v-locale--is-rtl.v-slider.v-input--vertical .v-slider-track__tick, .v-locale--is-rtl .v-slider.v-input--vertical .v-slider-track__tick { + transform: translate(calc(var(--v-slider-tick-size) / 2), calc(var(--v-slider-tick-size) / 2)); +} + +.v-slider.v-input--vertical .v-slider-track__tick--first { + bottom: calc(0% + var(--v-slider-tick-size) + 1px); +} +.v-slider.v-input--vertical .v-slider-track__tick--last { + bottom: calc(100% - var(--v-slider-tick-size) - 1px); +} +.v-slider.v-input--vertical .v-slider-track__tick .v-slider-track__tick-label { + margin-inline-start: calc(var(--v-slider-track-size) / 2 + 12px); + transform: translateY(-50%); +} + +.v-slider-track__ticks--always-show .v-slider-track__tick, .v-slider--focused .v-slider-track__tick { + opacity: 1; +} + +.v-slider-track__background--opacity { + opacity: 0.38; +}.v-color-picker-swatches { + overflow-y: auto; +} +.v-color-picker-swatches > div { + display: flex; + flex-wrap: wrap; + justify-content: center; + padding: 8px; +} + +.v-color-picker-swatches__swatch { + display: flex; + flex-direction: column; + margin-bottom: 10px; +} + +.v-color-picker-swatches__color { + position: relative; + height: 18px; + max-height: 18px; + width: 45px; + margin: 2px 4px; + border-radius: 2px; + user-select: none; + overflow: hidden; + background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAAAXNSR0IArs4c6QAAACRJREFUKFNjPHTo0H8GJGBnZ8eIzGekgwJk+0BsdCtRHEQbBQBbbh0dIGKknQAAAABJRU5ErkJggg==) repeat; + cursor: pointer; +} +.v-color-picker-swatches__color > div { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; +}.v-picker.v-sheet { + display: grid; + grid-auto-rows: min-content; + grid-template-areas: "title" "header" "body"; + overflow: hidden; +} +.v-picker.v-sheet { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-picker.v-sheet { + border-radius: 4px; +} +.v-picker.v-sheet.v-picker--with-actions { + grid-template-areas: "title" "header" "body" "actions"; +} + +.v-picker__body { + grid-area: body; + overflow: hidden; + position: relative; +} + +.v-picker__header { + grid-area: header; +} + +.v-picker__actions { + grid-area: actions; + padding: 0 12px 12px; + display: flex; + align-items: center; + justify-content: flex-end; +} +.v-picker__actions .v-btn { + min-width: 48px; +} +.v-picker__actions .v-btn:not(:last-child) { + margin-inline-end: 8px; +} + +.v-picker--divided .v-picker__header { + border-bottom-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-bottom-style: solid; + border-bottom-width: thin; +} + +.v-picker--landscape { + grid-template-areas: "title" "header body" "header body"; +} + +.v-picker--landscape.v-picker--with-actions { + grid-template-areas: "title" "header body" "header actions"; +} + +.v-picker-title { + text-transform: uppercase; + font-size: 0.75rem; + grid-area: title; + padding-inline: 24px 12px; + padding-top: 16px; + padding-bottom: 16px; + font-weight: 400; + letter-spacing: 0.1666666667em; +}.v-sheet { + display: block; +} +.v-sheet { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-sheet--border { + border-width: thin; + box-shadow: none; +} +.v-sheet { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-sheet--absolute { + position: absolute; +} +.v-sheet--fixed { + position: fixed; +} +.v-sheet--relative { + position: relative; +} +.v-sheet--sticky { + position: sticky; +} +.v-sheet { + border-radius: 0; +} +.v-sheet { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-sheet--rounded { + border-radius: 4px; +}.v-combobox .v-field .v-text-field__prefix, +.v-combobox .v-field .v-text-field__suffix, +.v-combobox .v-field .v-field__input, .v-combobox .v-field.v-field { + cursor: text; +} +.v-combobox .v-field .v-field__input > input { + flex: 1 1; +} +.v-combobox .v-field input { + min-width: 64px; +} +.v-combobox .v-field:not(.v-field--focused) input { + min-width: 0; +} +.v-combobox .v-field--dirty .v-combobox__selection { + margin-inline-end: 2px; +} +.v-combobox .v-combobox__selection-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.v-combobox__content { + overflow: hidden; +} +.v-combobox__content { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-combobox__content { + border-radius: 4px; +} +.v-combobox__mask { + background: rgb(var(--v-theme-surface-light)); +} +.v-combobox__selection { + display: inline-flex; + align-items: center; + height: 1.5rem; + letter-spacing: inherit; + line-height: inherit; + max-width: calc(100% - 2px - 2px); +} +.v-combobox__selection:first-child { + margin-inline-start: 0; +} +.v-combobox--chips.v-input--density-compact .v-field--variant-solo .v-label.v-field-label--floating, +.v-combobox--chips.v-input--density-compact .v-field--variant-solo-inverted .v-label.v-field-label--floating, +.v-combobox--chips.v-input--density-compact .v-field--variant-filled .v-label.v-field-label--floating, +.v-combobox--chips.v-input--density-compact .v-field--variant-solo-filled .v-label.v-field-label--floating { + top: 0px; +} +.v-combobox--selecting-index .v-combobox__selection { + opacity: var(--v-medium-emphasis-opacity); +} +.v-combobox--selecting-index .v-combobox__selection--selected { + opacity: 1; +} +.v-combobox--selecting-index .v-field__input > input { + caret-color: transparent; +} +.v-combobox--single:not(.v-combobox--selection-slot).v-text-field input { + flex: 1 1; + position: absolute; + left: 0; + right: 0; + width: 100%; + padding-inline: inherit; +} +.v-combobox--single:not(.v-combobox--selection-slot) .v-field--active input { + transition: none; +} +.v-combobox--single:not(.v-combobox--selection-slot) .v-field--dirty:not(.v-field--focused) input { + opacity: 0; +} +.v-combobox--single:not(.v-combobox--selection-slot) .v-field--focused .v-combobox__selection { + opacity: 0; +} +.v-combobox__menu-icon { + margin-inline-start: 4px; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} +.v-combobox--active-menu .v-combobox__menu-icon { + transform: rotate(180deg); +}.v-data-table { + width: 100%; +} + +.v-data-table__table { + width: 100%; + border-collapse: separate; + border-spacing: 0; +} + +.v-data-table__tr--focus { + border: 1px dotted black; +} +.v-data-table__tr--clickable { + cursor: pointer; +} + +.v-data-table .v-table__wrapper > table > thead > tr > td.v-data-table-column--align-end, +.v-data-table .v-table__wrapper > table > thead > tr th.v-data-table-column--align-end, +.v-data-table .v-table__wrapper > table tbody > tr > td.v-data-table-column--align-end, +.v-data-table .v-table__wrapper > table tbody > tr th.v-data-table-column--align-end { + text-align: end; +} +.v-data-table .v-table__wrapper > table > thead > tr > td.v-data-table-column--align-end .v-data-table-header__content, +.v-data-table .v-table__wrapper > table > thead > tr th.v-data-table-column--align-end .v-data-table-header__content, +.v-data-table .v-table__wrapper > table tbody > tr > td.v-data-table-column--align-end .v-data-table-header__content, +.v-data-table .v-table__wrapper > table tbody > tr th.v-data-table-column--align-end .v-data-table-header__content { + flex-direction: row-reverse; +} +.v-data-table .v-table__wrapper > table > thead > tr > td.v-data-table-column--align-center, +.v-data-table .v-table__wrapper > table > thead > tr th.v-data-table-column--align-center, +.v-data-table .v-table__wrapper > table tbody > tr > td.v-data-table-column--align-center, +.v-data-table .v-table__wrapper > table tbody > tr th.v-data-table-column--align-center { + text-align: center; +} +.v-data-table .v-table__wrapper > table > thead > tr > td.v-data-table-column--align-center .v-data-table-header__content, +.v-data-table .v-table__wrapper > table > thead > tr th.v-data-table-column--align-center .v-data-table-header__content, +.v-data-table .v-table__wrapper > table tbody > tr > td.v-data-table-column--align-center .v-data-table-header__content, +.v-data-table .v-table__wrapper > table tbody > tr th.v-data-table-column--align-center .v-data-table-header__content { + justify-content: center; +} +.v-data-table .v-table__wrapper > table > thead > tr > td.v-data-table-column--no-padding, +.v-data-table .v-table__wrapper > table > thead > tr th.v-data-table-column--no-padding, +.v-data-table .v-table__wrapper > table tbody > tr > td.v-data-table-column--no-padding, +.v-data-table .v-table__wrapper > table tbody > tr th.v-data-table-column--no-padding { + padding: 0 8px; +} +.v-data-table .v-table__wrapper > table > thead > tr > td.v-data-table-column--nowrap, +.v-data-table .v-table__wrapper > table > thead > tr th.v-data-table-column--nowrap, +.v-data-table .v-table__wrapper > table tbody > tr > td.v-data-table-column--nowrap, +.v-data-table .v-table__wrapper > table tbody > tr th.v-data-table-column--nowrap { + text-overflow: ellipsis; + text-wrap: nowrap; + overflow: hidden; +} +.v-data-table .v-table__wrapper > table > thead > tr > td.v-data-table-column--nowrap .v-data-table-header__content, +.v-data-table .v-table__wrapper > table > thead > tr th.v-data-table-column--nowrap .v-data-table-header__content, +.v-data-table .v-table__wrapper > table tbody > tr > td.v-data-table-column--nowrap .v-data-table-header__content, +.v-data-table .v-table__wrapper > table tbody > tr th.v-data-table-column--nowrap .v-data-table-header__content { + display: contents; +} +.v-data-table .v-table__wrapper > table > thead > tr > th, +.v-data-table .v-table__wrapper > table tbody > tr > th { + align-items: center; +} +.v-data-table .v-table__wrapper > table > thead > tr > th.v-data-table__th--fixed, +.v-data-table .v-table__wrapper > table tbody > tr > th.v-data-table__th--fixed { + position: sticky; +} +.v-data-table .v-table__wrapper > table > thead > tr > th.v-data-table__th--sortable:hover, +.v-data-table .v-table__wrapper > table tbody > tr > th.v-data-table__th--sortable:hover { + cursor: pointer; + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-data-table .v-table__wrapper > table > thead > tr > th:not(.v-data-table__th--sorted) .v-data-table-header__sort-icon, +.v-data-table .v-table__wrapper > table tbody > tr > th:not(.v-data-table__th--sorted) .v-data-table-header__sort-icon { + opacity: 0; +} +.v-data-table .v-table__wrapper > table > thead > tr > th:not(.v-data-table__th--sorted):hover .v-data-table-header__sort-icon, +.v-data-table .v-table__wrapper > table tbody > tr > th:not(.v-data-table__th--sorted):hover .v-data-table-header__sort-icon { + opacity: 0.5; +} +.v-data-table .v-table__wrapper > table > thead > tr.v-data-table__tr--mobile > td, +.v-data-table .v-table__wrapper > table tbody > tr.v-data-table__tr--mobile > td { + height: fit-content; +} + +.v-data-table-column--fixed, +.v-data-table__th--sticky { + background: rgb(var(--v-theme-surface)); + position: sticky !important; + left: 0; + z-index: 1; +} + +.v-data-table-column--last-fixed { + border-right: 1px solid rgba(var(--v-border-color), var(--v-border-opacity)); +} + +.v-data-table.v-table--fixed-header > .v-table__wrapper > table > thead > tr > th.v-data-table-column--fixed { + z-index: 2; +} + +.v-data-table-group-header-row td { + background: rgba(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface)); +} +.v-data-table-group-header-row td > span { + padding-left: 5px; +} + +.v-data-table--loading .v-data-table__td { + opacity: var(--v-disabled-opacity); +} + +.v-data-table-group-header-row__column { + padding-left: calc(var(--v-data-table-group-header-row-depth) * 16px) !important; +} + +.v-data-table-header__content { + display: flex; + align-items: center; +} + +.v-data-table-header__sort-badge { + display: inline-flex; + justify-content: center; + align-items: center; + font-size: 0.875rem; + padding: 4px; + border-radius: 50%; + background: rgba(var(--v-border-color), var(--v-border-opacity)); + min-width: 20px; + min-height: 20px; + width: 20px; + height: 20px; +} + +.v-data-table-progress > th { + border: none !important; + height: auto !important; + padding: 0 !important; +} + +.v-data-table-progress__loader { + position: relative; +} + +.v-data-table-rows-loading, +.v-data-table-rows-no-data { + text-align: center; +} + +.v-data-table__tr--mobile > .v-data-table__td--expanded-row { + grid-template-columns: auto; + justify-content: center; +} +.v-data-table__tr--mobile > .v-data-table__td--select-row { + grid-template-columns: 0; + justify-content: end; +} +.v-data-table__tr--mobile > td { + align-items: center; + column-gap: 4px; + display: grid; + grid-template-columns: repeat(2, 1fr); + min-height: var(--v-table-row-height); +} +.v-data-table__tr--mobile > td:not(:last-child) { + border-bottom: 0 !important; +} + +.v-data-table__td-title { + font-weight: 500; + text-align: start; +} + +.v-data-table__td-value { + text-align: end; +} + +.v-data-table__td-sort-icon { + color: rgba(var(--v-theme-on-surface), var(--v-disabled-opacity)); +} +.v-data-table__td-sort-icon-active { + color: rgba(var(--v-theme-on-surface)); +}.v-data-table-footer { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + padding: 8px 4px; +} +.v-data-table-footer__items-per-page { + align-items: center; + display: flex; + justify-content: center; +} +.v-data-table-footer__items-per-page > span { + padding-inline-end: 8px; +} +.v-data-table-footer__items-per-page > .v-select { + width: 90px; +} +.v-data-table-footer__info { + display: flex; + justify-content: flex-end; + min-width: 116px; + padding: 0 16px; +} +.v-data-table-footer__paginationz { + align-items: center; + display: flex; + margin-inline-start: 16px; +} +.v-data-table-footer__page { + padding: 0 8px; +}.v-pagination__list { + display: inline-flex; + list-style-type: none; + justify-content: center; + width: 100%; +} +.v-pagination__item, .v-pagination__first, .v-pagination__prev, .v-pagination__next, .v-pagination__last { + margin: 0.3rem; +}.v-table { + font-size: 0.875rem; + transition-duration: 0.28s; + transition-property: box-shadow, opacity, background, height; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.v-table { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-table .v-table-divider { + border-right: thin solid rgba(var(--v-border-color), var(--v-border-opacity)); +} +.v-table .v-table__wrapper > table > thead > tr > th { + border-bottom: thin solid rgba(var(--v-border-color), var(--v-border-opacity)); +} +.v-table .v-table__wrapper > table > tbody > tr:not(:last-child) > td, +.v-table .v-table__wrapper > table > tbody > tr:not(:last-child) > th { + border-bottom: thin solid rgba(var(--v-border-color), var(--v-border-opacity)); +} +.v-table .v-table__wrapper > table > tfoot > tr > td, +.v-table .v-table__wrapper > table > tfoot > tr > th { + border-top: thin solid rgba(var(--v-border-color), var(--v-border-opacity)); +} +.v-table.v-table--hover > .v-table__wrapper > table > tbody > tr > td { + position: relative; +} +.v-table.v-table--hover > .v-table__wrapper > table > tbody > tr:hover > td::after { + background: rgba(var(--v-border-color), var(--v-hover-opacity)); + pointer-events: none; +} +.v-table.v-table--hover > .v-table__wrapper > table > tbody > tr:hover > td::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.v-table.v-table--fixed-header > .v-table__wrapper > table > thead > tr > th { + background: rgb(var(--v-theme-surface)); + box-shadow: inset 0 -1px 0 rgba(var(--v-border-color), var(--v-border-opacity)); + z-index: 1; +} +.v-table.v-table--fixed-footer > tfoot > tr > th, +.v-table.v-table--fixed-footer > tfoot > tr > td { + background: rgb(var(--v-theme-surface)); + box-shadow: inset 0 1px 0 rgba(var(--v-border-color), var(--v-border-opacity)); +} + +.v-table { + border-radius: inherit; + line-height: 1.5; + max-width: 100%; + display: flex; + flex-direction: column; +} +.v-table > .v-table__wrapper > table { + width: 100%; + border-spacing: 0; +} +.v-table > .v-table__wrapper > table > tbody > tr > td, +.v-table > .v-table__wrapper > table > tbody > tr > th, +.v-table > .v-table__wrapper > table > thead > tr > td, +.v-table > .v-table__wrapper > table > thead > tr > th, +.v-table > .v-table__wrapper > table > tfoot > tr > td, +.v-table > .v-table__wrapper > table > tfoot > tr > th { + padding: 0 16px; + transition-duration: 0.28s; + transition-property: box-shadow, opacity, background, height; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.v-table > .v-table__wrapper > table > tbody > tr > td, +.v-table > .v-table__wrapper > table > thead > tr > td, +.v-table > .v-table__wrapper > table > tfoot > tr > td { + height: var(--v-table-row-height); +} +.v-table > .v-table__wrapper > table > tbody > tr > th, +.v-table > .v-table__wrapper > table > thead > tr > th, +.v-table > .v-table__wrapper > table > tfoot > tr > th { + height: var(--v-table-header-height); + font-weight: 500; + user-select: none; + text-align: start; +} +.v-table--density-default { + --v-table-header-height: 56px; + --v-table-row-height: 52px; +} + +.v-table--density-comfortable { + --v-table-header-height: 48px; + --v-table-row-height: 44px; +} + +.v-table--density-compact { + --v-table-header-height: 40px; + --v-table-row-height: 36px; +} + +.v-table__wrapper { + border-radius: inherit; + overflow: auto; + flex: 1 1 auto; +} + +.v-table--has-top > .v-table__wrapper { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.v-table--has-bottom > .v-table__wrapper { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +.v-table--fixed-height > .v-table__wrapper { + overflow-y: auto; +} + +.v-table--fixed-header > .v-table__wrapper > table > thead { + position: sticky; + top: 0; + z-index: 2; +} +.v-table--fixed-header > .v-table__wrapper > table > thead > tr > th { + border-bottom: 0px !important; +} + +.v-table--fixed-footer > .v-table__wrapper > table > tfoot > tr { + position: sticky; + bottom: 0; + z-index: 1; +} +.v-table--fixed-footer > .v-table__wrapper > table > tfoot > tr > td, +.v-table--fixed-footer > .v-table__wrapper > table > tfoot > tr > th { + border-top: 0px !important; +}.v-date-picker { + overflow: hidden; + width: 328px; +} +.v-date-picker--show-week { + width: 368px; +}.v-date-picker-controls { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 0.875rem; + height: var(--v-date-picker-controls-height, 56px); + padding-top: 4px; + padding-bottom: 4px; + padding-inline-start: 6px; + padding-inline-end: 12px; +} +.v-date-picker-controls > .v-btn:first-child { + text-transform: none; + font-weight: 400; + line-height: initial; + letter-spacing: initial; +} +.v-date-picker-controls--variant-classic { + padding-inline-start: 12px; +} +.v-date-picker-controls--variant-modern .v-date-picker__title:not(:hover) { + opacity: 0.7; +} +.v-date-picker--month .v-date-picker-controls--variant-modern .v-date-picker__title { + cursor: pointer; +} +.v-date-picker--year .v-date-picker-controls--variant-modern .v-date-picker__title { + opacity: 1; +} +.v-date-picker-controls .v-btn:last-child { + margin-inline-start: 4px; +} +.v-date-picker--year .v-date-picker-controls .v-date-picker-controls__mode-btn { + transform: rotate(180deg); +} + +.v-date-picker-controls__date { + margin-inline-end: 4px; +} +.v-date-picker-controls--variant-classic .v-date-picker-controls__date { + margin: auto; + text-align: center; +} + +.v-date-picker-controls__month { + display: flex; +} +.v-locale--is-rtl.v-date-picker-controls__month, .v-locale--is-rtl .v-date-picker-controls__month { + flex-direction: row-reverse; +} + +.v-date-picker-controls--variant-classic .v-date-picker-controls__month { + flex: 1 0 auto; +} + +.v-date-picker__title { + display: inline-block; +}.v-container { + width: 100%; + padding: 16px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 960px) { + .v-container { + max-width: 900px; + } +} +@media (min-width: 1280px) { + .v-container { + max-width: 1200px; + } +} +@media (min-width: 1920px) { + .v-container { + max-width: 1800px; + } +} +@media (min-width: 2560px) { + .v-container { + max-width: 2400px; + } +} +.v-container--fluid { + max-width: 100%; +} +.v-container.fill-height { + align-items: center; + display: flex; + flex-wrap: wrap; +} + +.v-row { + display: flex; + flex-wrap: wrap; + flex: 1 1 auto; + margin: -12px; +} +.v-row + .v-row { + margin-top: 12px; +} +.v-row + .v-row--dense { + margin-top: 4px; +} +.v-row--dense { + margin: -4px; +} +.v-row--dense > .v-col, +.v-row--dense > [class*=v-col-] { + padding: 4px; +} +.v-row.v-row--no-gutters { + margin: 0; +} +.v-row.v-row--no-gutters > .v-col, +.v-row.v-row--no-gutters > [class*=v-col-] { + padding: 0; +} + +.v-spacer { + flex-grow: 1; +} + +.v-col-xxl, +.v-col-xxl-auto, .v-col-xxl-12, .v-col-xxl-11, .v-col-xxl-10, .v-col-xxl-9, .v-col-xxl-8, .v-col-xxl-7, .v-col-xxl-6, .v-col-xxl-5, .v-col-xxl-4, .v-col-xxl-3, .v-col-xxl-2, .v-col-xxl-1, .v-col-xl, +.v-col-xl-auto, .v-col-xl-12, .v-col-xl-11, .v-col-xl-10, .v-col-xl-9, .v-col-xl-8, .v-col-xl-7, .v-col-xl-6, .v-col-xl-5, .v-col-xl-4, .v-col-xl-3, .v-col-xl-2, .v-col-xl-1, .v-col-lg, +.v-col-lg-auto, .v-col-lg-12, .v-col-lg-11, .v-col-lg-10, .v-col-lg-9, .v-col-lg-8, .v-col-lg-7, .v-col-lg-6, .v-col-lg-5, .v-col-lg-4, .v-col-lg-3, .v-col-lg-2, .v-col-lg-1, .v-col-md, +.v-col-md-auto, .v-col-md-12, .v-col-md-11, .v-col-md-10, .v-col-md-9, .v-col-md-8, .v-col-md-7, .v-col-md-6, .v-col-md-5, .v-col-md-4, .v-col-md-3, .v-col-md-2, .v-col-md-1, .v-col-sm, +.v-col-sm-auto, .v-col-sm-12, .v-col-sm-11, .v-col-sm-10, .v-col-sm-9, .v-col-sm-8, .v-col-sm-7, .v-col-sm-6, .v-col-sm-5, .v-col-sm-4, .v-col-sm-3, .v-col-sm-2, .v-col-sm-1, .v-col, +.v-col-auto, .v-col-12, .v-col-11, .v-col-10, .v-col-9, .v-col-8, .v-col-7, .v-col-6, .v-col-5, .v-col-4, .v-col-3, .v-col-2, .v-col-1 { + width: 100%; + padding: 12px; +} + +.v-col { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; +} + +.v-col-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.v-col-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; +} + +.v-col-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; +} + +.v-col-3 { + flex: 0 0 25%; + max-width: 25%; +} + +.v-col-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; +} + +.v-col-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; +} + +.v-col-6 { + flex: 0 0 50%; + max-width: 50%; +} + +.v-col-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; +} + +.v-col-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; +} + +.v-col-9 { + flex: 0 0 75%; + max-width: 75%; +} + +.v-col-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; +} + +.v-col-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; +} + +.v-col-12 { + flex: 0 0 100%; + max-width: 100%; +} + +.offset-1 { + margin-inline-start: 8.3333333333%; +} + +.offset-2 { + margin-inline-start: 16.6666666667%; +} + +.offset-3 { + margin-inline-start: 25%; +} + +.offset-4 { + margin-inline-start: 33.3333333333%; +} + +.offset-5 { + margin-inline-start: 41.6666666667%; +} + +.offset-6 { + margin-inline-start: 50%; +} + +.offset-7 { + margin-inline-start: 58.3333333333%; +} + +.offset-8 { + margin-inline-start: 66.6666666667%; +} + +.offset-9 { + margin-inline-start: 75%; +} + +.offset-10 { + margin-inline-start: 83.3333333333%; +} + +.offset-11 { + margin-inline-start: 91.6666666667%; +} + +@media (min-width: 600px) { + .v-col-sm { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .v-col-sm-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .v-col-sm-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + .v-col-sm-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .v-col-sm-3 { + flex: 0 0 25%; + max-width: 25%; + } + .v-col-sm-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .v-col-sm-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + .v-col-sm-6 { + flex: 0 0 50%; + max-width: 50%; + } + .v-col-sm-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + .v-col-sm-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + .v-col-sm-9 { + flex: 0 0 75%; + max-width: 75%; + } + .v-col-sm-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + .v-col-sm-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + .v-col-sm-12 { + flex: 0 0 100%; + max-width: 100%; + } + .offset-sm-0 { + margin-inline-start: 0; + } + .offset-sm-1 { + margin-inline-start: 8.3333333333%; + } + .offset-sm-2 { + margin-inline-start: 16.6666666667%; + } + .offset-sm-3 { + margin-inline-start: 25%; + } + .offset-sm-4 { + margin-inline-start: 33.3333333333%; + } + .offset-sm-5 { + margin-inline-start: 41.6666666667%; + } + .offset-sm-6 { + margin-inline-start: 50%; + } + .offset-sm-7 { + margin-inline-start: 58.3333333333%; + } + .offset-sm-8 { + margin-inline-start: 66.6666666667%; + } + .offset-sm-9 { + margin-inline-start: 75%; + } + .offset-sm-10 { + margin-inline-start: 83.3333333333%; + } + .offset-sm-11 { + margin-inline-start: 91.6666666667%; + } +} +@media (min-width: 960px) { + .v-col-md { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .v-col-md-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .v-col-md-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + .v-col-md-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .v-col-md-3 { + flex: 0 0 25%; + max-width: 25%; + } + .v-col-md-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .v-col-md-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + .v-col-md-6 { + flex: 0 0 50%; + max-width: 50%; + } + .v-col-md-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + .v-col-md-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + .v-col-md-9 { + flex: 0 0 75%; + max-width: 75%; + } + .v-col-md-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + .v-col-md-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + .v-col-md-12 { + flex: 0 0 100%; + max-width: 100%; + } + .offset-md-0 { + margin-inline-start: 0; + } + .offset-md-1 { + margin-inline-start: 8.3333333333%; + } + .offset-md-2 { + margin-inline-start: 16.6666666667%; + } + .offset-md-3 { + margin-inline-start: 25%; + } + .offset-md-4 { + margin-inline-start: 33.3333333333%; + } + .offset-md-5 { + margin-inline-start: 41.6666666667%; + } + .offset-md-6 { + margin-inline-start: 50%; + } + .offset-md-7 { + margin-inline-start: 58.3333333333%; + } + .offset-md-8 { + margin-inline-start: 66.6666666667%; + } + .offset-md-9 { + margin-inline-start: 75%; + } + .offset-md-10 { + margin-inline-start: 83.3333333333%; + } + .offset-md-11 { + margin-inline-start: 91.6666666667%; + } +} +@media (min-width: 1280px) { + .v-col-lg { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .v-col-lg-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .v-col-lg-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + .v-col-lg-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .v-col-lg-3 { + flex: 0 0 25%; + max-width: 25%; + } + .v-col-lg-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .v-col-lg-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + .v-col-lg-6 { + flex: 0 0 50%; + max-width: 50%; + } + .v-col-lg-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + .v-col-lg-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + .v-col-lg-9 { + flex: 0 0 75%; + max-width: 75%; + } + .v-col-lg-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + .v-col-lg-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + .v-col-lg-12 { + flex: 0 0 100%; + max-width: 100%; + } + .offset-lg-0 { + margin-inline-start: 0; + } + .offset-lg-1 { + margin-inline-start: 8.3333333333%; + } + .offset-lg-2 { + margin-inline-start: 16.6666666667%; + } + .offset-lg-3 { + margin-inline-start: 25%; + } + .offset-lg-4 { + margin-inline-start: 33.3333333333%; + } + .offset-lg-5 { + margin-inline-start: 41.6666666667%; + } + .offset-lg-6 { + margin-inline-start: 50%; + } + .offset-lg-7 { + margin-inline-start: 58.3333333333%; + } + .offset-lg-8 { + margin-inline-start: 66.6666666667%; + } + .offset-lg-9 { + margin-inline-start: 75%; + } + .offset-lg-10 { + margin-inline-start: 83.3333333333%; + } + .offset-lg-11 { + margin-inline-start: 91.6666666667%; + } +} +@media (min-width: 1920px) { + .v-col-xl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .v-col-xl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .v-col-xl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + .v-col-xl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .v-col-xl-3 { + flex: 0 0 25%; + max-width: 25%; + } + .v-col-xl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .v-col-xl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + .v-col-xl-6 { + flex: 0 0 50%; + max-width: 50%; + } + .v-col-xl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + .v-col-xl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + .v-col-xl-9 { + flex: 0 0 75%; + max-width: 75%; + } + .v-col-xl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + .v-col-xl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + .v-col-xl-12 { + flex: 0 0 100%; + max-width: 100%; + } + .offset-xl-0 { + margin-inline-start: 0; + } + .offset-xl-1 { + margin-inline-start: 8.3333333333%; + } + .offset-xl-2 { + margin-inline-start: 16.6666666667%; + } + .offset-xl-3 { + margin-inline-start: 25%; + } + .offset-xl-4 { + margin-inline-start: 33.3333333333%; + } + .offset-xl-5 { + margin-inline-start: 41.6666666667%; + } + .offset-xl-6 { + margin-inline-start: 50%; + } + .offset-xl-7 { + margin-inline-start: 58.3333333333%; + } + .offset-xl-8 { + margin-inline-start: 66.6666666667%; + } + .offset-xl-9 { + margin-inline-start: 75%; + } + .offset-xl-10 { + margin-inline-start: 83.3333333333%; + } + .offset-xl-11 { + margin-inline-start: 91.6666666667%; + } +} +@media (min-width: 2560px) { + .v-col-xxl { + flex-basis: 0; + flex-grow: 1; + max-width: 100%; + } + .v-col-xxl-auto { + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .v-col-xxl-1 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333%; + } + .v-col-xxl-2 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667%; + } + .v-col-xxl-3 { + flex: 0 0 25%; + max-width: 25%; + } + .v-col-xxl-4 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333%; + } + .v-col-xxl-5 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667%; + } + .v-col-xxl-6 { + flex: 0 0 50%; + max-width: 50%; + } + .v-col-xxl-7 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333%; + } + .v-col-xxl-8 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667%; + } + .v-col-xxl-9 { + flex: 0 0 75%; + max-width: 75%; + } + .v-col-xxl-10 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333%; + } + .v-col-xxl-11 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667%; + } + .v-col-xxl-12 { + flex: 0 0 100%; + max-width: 100%; + } + .offset-xxl-0 { + margin-inline-start: 0; + } + .offset-xxl-1 { + margin-inline-start: 8.3333333333%; + } + .offset-xxl-2 { + margin-inline-start: 16.6666666667%; + } + .offset-xxl-3 { + margin-inline-start: 25%; + } + .offset-xxl-4 { + margin-inline-start: 33.3333333333%; + } + .offset-xxl-5 { + margin-inline-start: 41.6666666667%; + } + .offset-xxl-6 { + margin-inline-start: 50%; + } + .offset-xxl-7 { + margin-inline-start: 58.3333333333%; + } + .offset-xxl-8 { + margin-inline-start: 66.6666666667%; + } + .offset-xxl-9 { + margin-inline-start: 75%; + } + .offset-xxl-10 { + margin-inline-start: 83.3333333333%; + } + .offset-xxl-11 { + margin-inline-start: 91.6666666667%; + } +}.v-date-picker-header { + align-items: flex-end; + height: 70px; + display: grid; + grid-template-areas: "prepend content append"; + grid-template-columns: min-content minmax(0, 1fr) min-content; + overflow: hidden; + padding-inline: 24px 12px; + padding-bottom: 12px; +} + +.v-date-picker-header__append { + grid-area: append; +} + +.v-date-picker-header__prepend { + grid-area: prepend; + padding-inline-start: 8px; +} + +.v-date-picker-header__content { + align-items: center; + display: inline-flex; + font-size: 32px; + line-height: 40px; + grid-area: content; + justify-content: space-between; +} +.v-date-picker-header--clickable .v-date-picker-header__content { + cursor: pointer; +} +.v-date-picker-header--clickable .v-date-picker-header__content:not(:hover) { + opacity: 0.7; +} + +.date-picker-header-transition-enter-active, +.date-picker-header-reverse-transition-enter-active { + transition-duration: 0.3s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.date-picker-header-transition-leave-active, +.date-picker-header-reverse-transition-leave-active { + transition-duration: 0.3s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.date-picker-header-transition-enter-from { + transform: translate(0, 100%); +} +.date-picker-header-transition-leave-to { + opacity: 0; + transform: translate(0, -100%); +} + +.date-picker-header-reverse-transition-enter-from { + transform: translate(0, -100%); +} +.date-picker-header-reverse-transition-leave-to { + opacity: 0; + transform: translate(0, 100%); +}.v-date-picker-month { + display: flex; + justify-content: center; + padding: 0 12px 8px; + --v-date-picker-month-day-diff: 4px; +} + +.v-date-picker-month__weeks { + display: grid; + grid-template-rows: min-content min-content min-content min-content min-content min-content min-content; + column-gap: 4px; + font-size: 0.85rem; +} +.v-date-picker-month__weeks + .v-date-picker-month__days { + grid-row-gap: 0; +} + +.v-date-picker-month__weekday { + font-size: 0.85rem; +} + +.v-date-picker-month__days { + display: grid; + grid-template-columns: min-content min-content min-content min-content min-content min-content min-content; + column-gap: 4px; + flex: 1 1; + justify-content: space-around; +} + +.v-date-picker-month__day { + align-items: center; + display: flex; + justify-content: center; + position: relative; + height: 40px; + width: 40px; +} +.v-date-picker-month__day--selected .v-btn { + background-color: rgb(var(--v-theme-surface-variant)); + color: rgb(var(--v-theme-on-surface-variant)); +} +.v-date-picker-month__day .v-btn.v-date-picker-month__day-btn { + --v-btn-height: 24px; + --v-btn-size: 0.85rem; +} +.v-date-picker-month__day--week { + font-size: var(--v-btn-size); +} + +.v-date-picker-month__day--adjacent { + opacity: 0.5; +} + +.v-date-picker-month__day--hide-adjacent { + opacity: 0; +}.v-date-picker-months { + height: 288px; +} + +.v-date-picker-months__content { + align-items: center; + display: grid; + flex: 1 1; + height: inherit; + justify-content: space-around; + grid-template-columns: repeat(2, 1fr); + grid-gap: 0px 24px; + padding-inline-start: 36px; + padding-inline-end: 36px; +} +.v-date-picker-months__content .v-btn { + text-transform: none; + padding-inline-start: 8px; + padding-inline-end: 8px; +}.v-date-picker-years { + height: 288px; + overflow-y: scroll; +} + +.v-date-picker-years__content { + display: grid; + flex: 1 1; + justify-content: space-around; + grid-template-columns: repeat(3, 1fr); + gap: 8px 24px; + padding-inline: 32px; +} +.v-date-picker-years__content .v-btn { + padding-inline: 8px; +}.v-empty-state { + align-items: center; + display: flex; + flex-direction: column; + justify-content: center; + min-height: 100%; + padding: 16px; +} +.v-empty-state--start { + align-items: flex-start; +} +.v-empty-state--center { + align-items: center; +} +.v-empty-state--end { + align-items: flex-end; +} + +.v-empty-state__media { + text-align: center; + width: 100%; +} +.v-empty-state__media .v-icon { + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); +} + +.v-empty-state__headline { + color: rgba(var(--v-theme-on-surface), var(--v-medium-emphasis-opacity)); + font-size: 3.75rem; + font-weight: 300; + line-height: 1; + text-align: center; + margin-bottom: 8px; +} +.v-empty-state--mobile .v-empty-state__headline { + font-size: 2.125rem; +} + +.v-empty-state__title { + font-size: 1.25rem; + font-weight: 500; + line-height: 1.6; + margin-bottom: 4px; + text-align: center; +} + +.v-empty-state__text { + font-size: 0.875rem; + font-weight: 400; + line-height: 1.425; + padding: 0 16px; + text-align: center; +} + +.v-empty-state__content { + padding: 24px 0; +} + +.v-empty-state__actions { + display: flex; + gap: 8px; + padding: 16px; +} + +.v-empty-state__action-btn.v-btn { + background-color: initial; + color: initial; +}.v-expansion-panel { + background-color: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-expansion-panel:not(:first-child)::after { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); +} +.v-expansion-panel--disabled .v-expansion-panel-title { + color: rgba(var(--v-theme-on-surface), 0.26); +} +.v-expansion-panel--disabled .v-expansion-panel-title .v-expansion-panel-title__overlay { + opacity: 0.4615384615; +} + +.v-expansion-panels { + display: flex; + flex-wrap: wrap; + justify-content: center; + list-style-type: none; + padding: 0; + width: 100%; + position: relative; + z-index: 1; +} +.v-expansion-panels:not(.v-expansion-panels--variant-accordion) > :not(:first-child):not(:last-child):not(.v-expansion-panel--active):not(.v-expansion-panel--before-active) { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.v-expansion-panels:not(.v-expansion-panels--variant-accordion) > :not(:first-child):not(:last-child):not(.v-expansion-panel--active):not(.v-expansion-panel--after-active) { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} +.v-expansion-panels:not(.v-expansion-panels--variant-accordion) > :first-child:not(:last-child):not(.v-expansion-panel--active):not(.v-expansion-panel--before-active) { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.v-expansion-panels:not(.v-expansion-panels--variant-accordion) > :last-child:not(:first-child):not(.v-expansion-panel--active):not(.v-expansion-panel--after-active) { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} +.v-expansion-panels--variant-accordion > :first-child:not(:last-child) { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} +.v-expansion-panels--variant-accordion > :last-child:not(:first-child) { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} +.v-expansion-panels--variant-accordion > :last-child:not(:first-child) .v-expansion-panel-title--active { + border-bottom-left-radius: initial; + border-bottom-right-radius: initial; +} +.v-expansion-panels--variant-accordion > :not(:first-child):not(:last-child) { + border-radius: 0 !important; +} +.v-expansion-panels--variant-accordion .v-expansion-panel-title__overlay { + transition: 0.3s border-radius cubic-bezier(0.4, 0, 0.2, 1); +} + +.v-expansion-panel { + flex: 1 0 100%; + max-width: 100%; + position: relative; + transition: 0.3s all cubic-bezier(0.4, 0, 0.2, 1); + transition-property: margin-top, border-radius, border, max-width; + border-radius: 4px; +} +.v-expansion-panel:not(:first-child)::after { + border-top-style: solid; + border-top-width: thin; + content: ""; + left: 0; + position: absolute; + right: 0; + top: 0; + transition: 0.3s opacity cubic-bezier(0.4, 0, 0.2, 1); +} +.v-expansion-panel--disabled .v-expansion-panel-title { + pointer-events: none; +} +.v-expansion-panel--active:not(:first-child), +.v-expansion-panel--active + .v-expansion-panel { + margin-top: 16px; +} +.v-expansion-panel--active:not(:first-child)::after, +.v-expansion-panel--active + .v-expansion-panel::after { + opacity: 0; +} +.v-expansion-panel--active > .v-expansion-panel-title { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} +.v-expansion-panel--active > .v-expansion-panel-title:not(.v-expansion-panel-title--static) { + min-height: 64px; +} + +.v-expansion-panel__shadow { + border-radius: inherit; + z-index: -1; +} +.v-expansion-panel__shadow { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.v-expansion-panel__shadow { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} + +.v-expansion-panel-title { + align-items: center; + text-align: start; + border-radius: inherit; + display: flex; + font-size: 0.9375rem; + line-height: 1; + min-height: 48px; + outline: none; + padding: 16px 24px; + position: relative; + transition: 0.3s min-height cubic-bezier(0.4, 0, 0.2, 1); + width: 100%; + justify-content: space-between; +} +.v-expansion-panel-title:hover > .v-expansion-panel-title__overlay { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-expansion-panel-title:focus-visible > .v-expansion-panel-title__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-expansion-panel-title:focus > .v-expansion-panel-title__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} +.v-expansion-panel-title--focusable.v-expansion-panel-title--active .v-expansion-panel-title__overlay { + opacity: calc(var(--v-activated-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-expansion-panel-title--focusable.v-expansion-panel-title--active:hover .v-expansion-panel-title__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); +} +.v-expansion-panel-title--focusable.v-expansion-panel-title--active:focus-visible .v-expansion-panel-title__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-expansion-panel-title--focusable.v-expansion-panel-title--active:focus .v-expansion-panel-title__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); + } +} + +.v-expansion-panel-title__overlay { + background-color: currentColor; + border-radius: inherit; + opacity: 0; +} +.v-expansion-panel-title__overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.v-expansion-panel-title__icon { + display: inline-flex; + margin-bottom: -4px; + margin-top: -4px; + user-select: none; + margin-inline-start: auto; +} + +.v-expansion-panel-text { + display: flex; +} +.v-expansion-panel-text__wrapper { + padding: 8px 24px 16px; + flex: 1 1 auto; + max-width: 100%; +} + +.v-expansion-panels--variant-accordion > .v-expansion-panel { + margin-top: 0; +} +.v-expansion-panels--variant-accordion > .v-expansion-panel::after { + opacity: 1; +} + +.v-expansion-panels--variant-popout > .v-expansion-panel { + max-width: calc(100% - 32px); +} +.v-expansion-panels--variant-popout > .v-expansion-panel--active { + max-width: calc(100% + 16px); +} + +.v-expansion-panels--variant-inset > .v-expansion-panel { + max-width: 100%; +} +.v-expansion-panels--variant-inset > .v-expansion-panel--active { + max-width: calc(100% - 32px); +} + +.v-expansion-panels--flat > .v-expansion-panel::after { + border-top: none; +} +.v-expansion-panels--flat > .v-expansion-panel .v-expansion-panel__shadow { + display: none; +} + +.v-expansion-panels--tile { + border-radius: 0; +} +.v-expansion-panels--tile > .v-expansion-panel { + border-radius: 0; +}.v-fab { + align-items: center; + display: inline-flex; + flex: 1 1 auto; + pointer-events: none; + position: relative; + transition-duration: 0.2s; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + vertical-align: middle; +} +.v-fab .v-btn { + pointer-events: auto; +} +.v-fab .v-btn--variant-elevated { + box-shadow: 0px 3px 3px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 3px 4px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 8px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-fab--app, .v-fab--absolute { + display: flex; +} +.v-fab--absolute { + position: absolute; + inset: 0; +} +.v-fab--start, .v-fab--left { + justify-content: flex-start; +} +.v-fab--center { + align-items: center; + justify-content: center; +} +.v-fab--end, .v-fab--right { + justify-content: flex-end; +} +.v-fab--bottom { + align-items: flex-end; +} +.v-fab--top { + align-items: flex-start; +} +.v-fab--extended .v-btn { + border-radius: 9999px !important; +} + +.v-fab__container { + align-self: center; + display: inline-flex; + vertical-align: middle; +} +.v-fab--app .v-fab__container { + margin: 12px; + position: fixed; +} +.v-fab--absolute .v-fab__container { + position: absolute; + z-index: 4; +} +.v-fab--offset.v-fab--top .v-fab__container { + transform: translateY(-50%); +} +.v-fab--offset.v-fab--bottom .v-fab__container { + transform: translateY(50%); +} +.v-fab--top .v-fab__container { + top: 0; +} +.v-fab--bottom .v-fab__container { + bottom: 0; +} +.v-fab--left .v-fab__container, .v-fab--start .v-fab__container { + left: 0; +} +.v-fab--right .v-fab__container, .v-fab--end .v-fab__container { + right: 0; +}.v-file-input--hide.v-input .v-field, +.v-file-input--hide.v-input .v-input__control, +.v-file-input--hide.v-input .v-input__details { + display: none; +} +.v-file-input--hide.v-input .v-input__prepend { + grid-area: control; + margin: 0 auto; +} +.v-file-input--chips.v-input--density-compact .v-field--variant-solo .v-label.v-field-label--floating, +.v-file-input--chips.v-input--density-compact .v-field--variant-solo-inverted .v-label.v-field-label--floating, +.v-file-input--chips.v-input--density-compact .v-field--variant-filled .v-label.v-field-label--floating, +.v-file-input--chips.v-input--density-compact .v-field--variant-solo-filled .v-label.v-field-label--floating { + top: 0px; +} +.v-file-input input[type=file] { + height: 100%; + left: 0; + opacity: 0; + position: absolute; + top: 0; + width: 100%; + z-index: 0; +} +.v-file-input--dragging input[type=file] { + z-index: 1; +} +.v-file-input .v-input__details { + padding-inline: 16px; +} +.v-input--plain-underlined.v-file-input .v-input__details { + padding-inline: 0; +}.v-footer { + align-items: center; + display: flex; + flex: 1 1 auto; + padding: 8px 16px; + position: relative; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + transition-property: height, width, transform, max-width, left, right, top, bottom; +} +.v-footer { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-footer--border { + border-width: thin; + box-shadow: none; +} +.v-footer { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-footer--absolute { + position: absolute; +} +.v-footer--fixed { + position: fixed; +} +.v-footer { + border-radius: 0; +} +.v-footer { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-footer--rounded { + border-radius: 4px; +}.v-infinite-scroll--horizontal { + display: flex; + flex-direction: row; + overflow-x: auto; +} +.v-infinite-scroll--horizontal .v-infinite-scroll-intersect { + height: 100%; + width: var(--v-infinite-margin-size, 1px); +} + +.v-infinite-scroll--vertical { + display: flex; + flex-direction: column; + overflow-y: auto; +} +.v-infinite-scroll--vertical .v-infinite-scroll-intersect { + height: 1px; + width: 100%; +} + +.v-infinite-scroll-intersect { + pointer-events: none; + margin-top: var(--v-infinite-margin); + margin-bottom: calc(var(--v-infinite-margin) * -1); +} +.v-infinite-scroll-intersect:nth-child(2) { + --v-infinite-margin: var(--v-infinite-margin-size, 1px); +} +.v-infinite-scroll-intersect:nth-last-child(2) { + --v-infinite-margin: calc(var(--v-infinite-margin-size, 1px) * -1); +} + +.v-infinite-scroll__side { + align-items: center; + display: flex; + justify-content: center; + padding: 8px; +}.v-item-group { + flex: 0 1 auto; + max-width: 100%; + position: relative; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); +}.v-kbd { + background: rgb(var(--v-theme-kbd)); + color: rgb(var(--v-theme-on-kbd)); + border-radius: 3px; + display: inline; + font-size: 85%; + font-weight: normal; + padding: 0.2em 0.4rem; +} +.v-kbd { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +}.v-layout { + --v-scrollbar-offset: 0px; + display: flex; + flex: 1 1 auto; +} +.v-layout--full-height { + --v-scrollbar-offset: inherit; + height: 100%; +}.v-layout-item { + position: absolute; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); +} + +.v-layout-item--absolute { + position: absolute; +}.v-locale-provider { + display: contents; +}.v-main { + flex: 1 0 auto; + max-width: 100%; + transition: 0.2s cubic-bezier(0.4, 0, 0.2, 1); + padding-left: var(--v-layout-left); + padding-right: var(--v-layout-right); + padding-top: var(--v-layout-top); + padding-bottom: var(--v-layout-bottom); +} +.v-main__scroller { + max-width: 100%; + position: relative; +} +.v-main--scrollable { + display: flex; +} +.v-main--scrollable { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.v-main--scrollable > .v-main__scroller { + flex: 1 1 auto; + overflow-y: auto; + --v-layout-left: 0px; + --v-layout-right: 0px; + --v-layout-top: 0px; + --v-layout-bottom: 0px; +}.v-navigation-drawer { + -webkit-overflow-scrolling: touch; + background: rgb(var(--v-theme-surface)); + display: flex; + flex-direction: column; + height: 100%; + max-width: 100%; + pointer-events: auto; + transition-duration: 0.2s; + transition-property: box-shadow, transform, visibility, width, height, left, right, top, bottom; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + position: absolute; +} +.v-navigation-drawer { + border-color: rgba(var(--v-border-color), var(--v-border-opacity)); + border-style: solid; + border-width: 0; +} +.v-navigation-drawer--border { + border-width: thin; + box-shadow: none; +} +.v-navigation-drawer { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-navigation-drawer { + background: rgb(var(--v-theme-surface)); + color: rgba(var(--v-theme-on-surface), var(--v-high-emphasis-opacity)); +} +.v-navigation-drawer--rounded { + border-radius: 4px; +} +.v-navigation-drawer--top { + top: 0; + border-bottom-width: thin; +} +.v-navigation-drawer--bottom { + left: 0; + border-top-width: thin; +} +.v-navigation-drawer--left { + top: 0; + left: 0; + right: auto; + border-right-width: thin; +} +.v-navigation-drawer--right { + top: 0; + left: auto; + right: 0; + border-left-width: thin; +} +.v-navigation-drawer--floating { + border: none; +} +.v-navigation-drawer--temporary.v-navigation-drawer--active { + box-shadow: 0px 8px 10px -5px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 16px 24px 2px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 6px 30px 5px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-navigation-drawer--sticky { + height: auto; + transition: box-shadow, transform, visibility, width, height, left, right; +} +.v-navigation-drawer .v-list { + overflow: hidden; +} + +.v-navigation-drawer__content { + flex: 0 1 auto; + height: 100%; + max-width: 100%; + overflow-x: hidden; + overflow-y: auto; +} + +.v-navigation-drawer__img { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; + z-index: -1; +} +.v-navigation-drawer__img img:not(.v-img__img) { + height: inherit; + object-fit: cover; + width: inherit; +} + +.v-navigation-drawer__scrim { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: black; + opacity: 0.2; + transition: opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1); + z-index: 1; +} + +.v-navigation-drawer__prepend, +.v-navigation-drawer__append { + flex: none; + overflow: hidden; +}.v-number-input input[type=number] { + -moz-appearance: textfield; +} +.v-number-input input[type=number]::-webkit-outer-spin-button, .v-number-input input[type=number]::-webkit-inner-spin-button { + -webkit-appearance: none; +} +.v-number-input .v-field:not(:has(.v-field__prepend-inner > .v-icon)) { + padding-inline-start: 0; +} +.v-number-input .v-field:not(:has(.v-field__append-inner > .v-icon)) { + padding-inline-end: 0; +} +.v-number-input .v-field__prepend-inner:has(.v-number-input__control) > .v-icon { + margin-inline-end: 12px; +} +.v-number-input .v-field__append-inner:has(.v-number-input__control) > .v-icon { + margin-inline-start: 12px; +} +.v-number-input--inset .v-divider { + height: 55%; + width: 55%; + align-self: center; +} +.v-number-input--split .v-field__input { + text-align: center; +} +.v-number-input--stacked .v-number-input__control { + flex-direction: column-reverse; +} +.v-number-input--stacked .v-number-input__control .v-btn { + flex: 1; +} +.v-number-input--hide-input .v-field { + flex: none; +} +.v-number-input--hide-input .v-field__input { + width: 0; + padding-inline: 0; +} +.v-number-input__control { + display: flex; + height: 100%; +} +.v-number-input__control .v-btn { + background-color: transparent; + border-radius: 0; +}.v-otp-input { + align-items: center; + display: flex; + justify-content: center; + padding: 0.5rem 0; + position: relative; +} +.v-otp-input { + border-radius: 4px; +} +.v-otp-input .v-field { + height: 100%; +} + +.v-otp-input__divider { + margin: 0 8px; +} + +.v-otp-input__content { + align-items: center; + display: flex; + gap: 0.5rem; + height: 64px; + padding: 0.5rem; + justify-content: center; + max-width: 320px; + position: relative; + border-radius: inherit; +} +.v-otp-input--divided .v-otp-input__content { + max-width: 360px; +} + +.v-otp-input__field { + color: inherit; + font-size: 1.25rem; + height: 100%; + outline: none; + text-align: center; + width: 100%; +} +.v-otp-input__field[type=number]::-webkit-outer-spin-button, .v-otp-input__field[type=number]::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} +.v-otp-input__field[type=number] { + -moz-appearance: textfield; +} + +.v-otp-input__loader { + align-items: center; + display: flex; + height: 100%; + justify-content: center; + width: 100%; +} +.v-otp-input__loader .v-progress-linear { + position: absolute; +}.v-parallax { + position: relative; + overflow: hidden; +} +.v-parallax--active > .v-img__img { + will-change: transform; +}.v-radio-group > .v-input__control { + flex-direction: column; +} +.v-radio-group > .v-input__control > .v-label { + margin-inline-start: 16px; +} +.v-radio-group > .v-input__control > .v-label + .v-selection-control-group { + padding-inline-start: 6px; + margin-top: 8px; +} +.v-radio-group .v-input__details { + padding-inline: 16px; +}.v-rating { + max-width: 100%; + display: inline-flex; + white-space: nowrap; +} +.v-rating--readonly { + pointer-events: none; +} + +.v-rating__wrapper { + align-items: center; + display: inline-flex; + flex-direction: column; +} +.v-rating__wrapper--bottom { + flex-direction: column-reverse; +} + +.v-rating__item { + display: inline-flex; + position: relative; +} +.v-rating__item label { + cursor: pointer; +} +.v-rating__item .v-btn--variant-plain { + opacity: 1; +} +.v-rating__item .v-btn { + transition-property: transform; +} +.v-rating__item .v-btn .v-icon { + transition: inherit; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} +.v-rating--hover .v-rating__item:hover:not(.v-rating__item--focused) .v-btn { + transform: scale(1.25); +} +.v-rating__item--half { + overflow: hidden; + position: absolute; + clip-path: polygon(0 0, 50% 0, 50% 100%, 0 100%); + z-index: 1; +} +.v-rating__item--half .v-btn__overlay, .v-rating__item--half:hover .v-btn__overlay { + opacity: 0; +} + +.v-rating__hidden { + height: 0; + opacity: 0; + position: absolute; + width: 0; +}.v-skeleton-loader { + align-items: center; + background: rgb(var(--v-theme-surface)); + border-radius: 4px; + display: flex; + flex-wrap: wrap; + position: relative; + vertical-align: top; +} +.v-skeleton-loader__actions { + justify-content: end; +} +.v-skeleton-loader .v-skeleton-loader__ossein { + height: 100%; +} +.v-skeleton-loader .v-skeleton-loader__avatar, +.v-skeleton-loader .v-skeleton-loader__button, +.v-skeleton-loader .v-skeleton-loader__chip, +.v-skeleton-loader .v-skeleton-loader__divider, +.v-skeleton-loader .v-skeleton-loader__heading, +.v-skeleton-loader .v-skeleton-loader__image, +.v-skeleton-loader .v-skeleton-loader__ossein, +.v-skeleton-loader .v-skeleton-loader__text { + background: rgba(var(--v-theme-on-surface), var(--v-border-opacity)); +} +.v-skeleton-loader .v-skeleton-loader__list-item, +.v-skeleton-loader .v-skeleton-loader__list-item-avatar, +.v-skeleton-loader .v-skeleton-loader__list-item-text, +.v-skeleton-loader .v-skeleton-loader__list-item-two-line, +.v-skeleton-loader .v-skeleton-loader__list-item-avatar-two-line, +.v-skeleton-loader .v-skeleton-loader__list-item-three-line, +.v-skeleton-loader .v-skeleton-loader__list-item-avatar-three-line { + border-radius: 4px; +} +.v-skeleton-loader__bone { + align-items: center; + border-radius: inherit; + display: flex; + flex: 1 1 100%; + flex-wrap: wrap; + overflow: hidden; + position: relative; +} +.v-skeleton-loader__bone::after { + animation: loading 1.5s infinite; + background: linear-gradient(90deg, rgba(var(--v-theme-surface), 0), rgba(var(--v-theme-surface), 0.3), rgba(var(--v-theme-surface), 0)); + transform: translateX(-100%); + z-index: 1; +} +.v-skeleton-loader__bone::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.v-skeleton-loader__avatar { + border-radius: 50%; + flex: 0 1 auto; + margin: 8px 16px; + max-height: 48px; + min-height: 48px; + height: 48px; + max-width: 48px; + min-width: 48px; + width: 48px; +} +.v-skeleton-loader__avatar + .v-skeleton-loader__bone { + flex: 1 1 auto; + margin-inline-start: 0; +} +.v-skeleton-loader__avatar + .v-skeleton-loader__sentences > .v-skeleton-loader__text, +.v-skeleton-loader__avatar + .v-skeleton-loader__paragraph > .v-skeleton-loader__text { + margin-inline-start: 0; +} +.v-skeleton-loader__button { + border-radius: 4px; + height: 36px; + margin: 16px; + max-width: 64px; +} +.v-skeleton-loader__button + .v-skeleton-loader__bone { + flex: 1 1 auto; + margin-inline-start: 0; +} +.v-skeleton-loader__button + .v-skeleton-loader__sentences > .v-skeleton-loader__text, +.v-skeleton-loader__button + .v-skeleton-loader__paragraph > .v-skeleton-loader__text { + margin-inline-start: 0; +} +.v-skeleton-loader__chip { + border-radius: 16px; + margin: 16px; + height: 32px; + max-width: 96px; +} +.v-skeleton-loader__chip + .v-skeleton-loader__bone { + flex: 1 1 auto; + margin-inline-start: 0; +} +.v-skeleton-loader__chip + .v-skeleton-loader__sentences > .v-skeleton-loader__text, +.v-skeleton-loader__chip + .v-skeleton-loader__paragraph > .v-skeleton-loader__text { + margin-inline-start: 0; +} +.v-skeleton-loader__date-picker { + border-radius: inherit; +} +.v-skeleton-loader__date-picker .v-skeleton-loader__list-item:first-child .v-skeleton-loader__text { + max-width: 88px; + width: 20%; +} +.v-skeleton-loader__date-picker .v-skeleton-loader__heading { + max-width: 256px; + width: 40%; +} +.v-skeleton-loader__date-picker-days { + flex-wrap: wrap; + margin: 16px; +} +.v-skeleton-loader__date-picker-days .v-skeleton-loader__avatar { + border-radius: 4px; + margin: 4px; + max-width: 100%; +} +.v-skeleton-loader__date-picker-options { + flex-wrap: nowrap; +} +.v-skeleton-loader__date-picker-options .v-skeleton-loader__text { + flex: 1 1 auto; +} +.v-skeleton-loader__divider { + border-radius: 1px; + height: 2px; +} +.v-skeleton-loader__heading { + border-radius: 12px; + margin: 16px; + height: 24px; +} +.v-skeleton-loader__heading + .v-skeleton-loader__subtitle { + margin-top: -16px; +} +.v-skeleton-loader__image { + height: 150px; + border-radius: 0; +} +.v-skeleton-loader__card .v-skeleton-loader__image { + border-radius: 0; +} +.v-skeleton-loader__list-item { + margin: 16px; +} +.v-skeleton-loader__list-item .v-skeleton-loader__text { + margin: 0; +} +.v-skeleton-loader__table-thead { + justify-content: space-between; +} +.v-skeleton-loader__table-thead .v-skeleton-loader__heading { + margin-top: 16px; + max-width: 16px; +} +.v-skeleton-loader__table-tfoot { + flex-wrap: nowrap; +} +.v-skeleton-loader__table-tfoot > .v-skeleton-loader__text.v-skeleton-loader__bone { + margin-top: 16px; +} +.v-skeleton-loader__table-row { + align-items: baseline; + margin: 0 8px; + justify-content: space-evenly; + flex-wrap: nowrap; +} +.v-skeleton-loader__table-row > .v-skeleton-loader__text.v-skeleton-loader__bone { + margin-inline: 8px; +} +.v-skeleton-loader__table-row + .v-skeleton-loader__divider { + margin: 0 16px; +} +.v-skeleton-loader__table-cell { + align-items: center; + display: flex; + height: 48px; + width: 88px; +} +.v-skeleton-loader__table-cell .v-skeleton-loader__text { + margin-bottom: 0; +} +.v-skeleton-loader__subtitle { + max-width: 70%; +} +.v-skeleton-loader__subtitle > .v-skeleton-loader__text { + height: 16px; + border-radius: 8px; +} +.v-skeleton-loader__text { + border-radius: 6px; + margin: 16px; + height: 12px; +} +.v-skeleton-loader__text + .v-skeleton-loader__text { + margin-top: -8px; + max-width: 50%; +} +.v-skeleton-loader__text + .v-skeleton-loader__text + .v-skeleton-loader__text { + max-width: 70%; +} +.v-skeleton-loader--boilerplate .v-skeleton-loader__bone:after { + display: none; +} +.v-skeleton-loader--is-loading { + overflow: hidden; +} +.v-skeleton-loader--tile { + border-radius: 0; +} +.v-skeleton-loader--tile .v-skeleton-loader__bone { + border-radius: 0; +} + +@keyframes loading { + 100% { + transform: translateX(100%); + } +}.v-snackbar { + justify-content: center; + z-index: 10000; + margin: 8px; + margin-inline-end: calc(8px + var(--v-scrollbar-offset)); + padding: var(--v-layout-top) var(--v-layout-right) var(--v-layout-bottom) var(--v-layout-left); +} +.v-snackbar:not(.v-snackbar--center):not(.v-snackbar--top) { + align-items: flex-end; +} +.v-snackbar__wrapper { + align-items: center; + display: flex; + max-width: 672px; + min-height: 48px; + min-width: 344px; + overflow: hidden; + padding: 0; +} +.v-snackbar__wrapper { + border-radius: 4px; +} +.v-snackbar--variant-plain, .v-snackbar--variant-outlined, .v-snackbar--variant-text, .v-snackbar--variant-tonal { + background: transparent; + color: inherit; +} +.v-snackbar--variant-plain { + opacity: 0.62; +} +.v-snackbar--variant-plain:focus, .v-snackbar--variant-plain:hover { + opacity: 1; +} +.v-snackbar--variant-plain .v-snackbar__overlay { + display: none; +} +.v-snackbar--variant-elevated, .v-snackbar--variant-flat { + background: rgb(var(--v-theme-surface-variant)); + color: rgb(var(--v-theme-on-surface-variant)); +} +.v-snackbar--variant-elevated { + box-shadow: 0px 3px 5px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 6px 10px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 18px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-snackbar--variant-flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-snackbar--variant-outlined { + border: thin solid currentColor; +} +.v-snackbar--variant-text .v-snackbar__overlay { + background: currentColor; +} +.v-snackbar--variant-tonal .v-snackbar__underlay { + background: currentColor; + opacity: var(--v-activated-opacity); + border-radius: inherit; + top: 0; + right: 0; + bottom: 0; + left: 0; + pointer-events: none; +} +.v-snackbar .v-snackbar__underlay { + position: absolute; +} + +.v-snackbar__content { + flex-grow: 1; + font-size: 0.875rem; + font-weight: 400; + letter-spacing: 0.0178571429em; + line-height: 1.425; + margin-right: auto; + padding: 14px 16px; + text-align: initial; +} +.v-snackbar__actions { + align-items: center; + align-self: center; + display: flex; + margin-inline-end: 8px; +} +.v-snackbar__actions > .v-btn { + padding: 0 8px; + min-width: auto; +} +.v-snackbar__timer { + width: 100%; + position: absolute; + top: 0; +} +.v-snackbar__timer .v-progress-linear { + transition: 0.2s linear; +} +.v-snackbar--absolute { + position: absolute; + z-index: 1; +} +.v-snackbar--multi-line .v-snackbar__wrapper { + min-height: 68px; +} +.v-snackbar--vertical .v-snackbar__wrapper { + flex-direction: column; +} +.v-snackbar--vertical .v-snackbar__wrapper .v-snackbar__actions { + align-self: flex-end; + margin-bottom: 8px; +} +.v-snackbar--center { + align-items: center; + justify-content: center; +} +.v-snackbar--top { + align-items: flex-start; +} +.v-snackbar--bottom { + align-items: flex-end; +} +.v-snackbar--left, .v-snackbar--start { + justify-content: flex-start; +} +.v-snackbar--right, .v-snackbar--end { + justify-content: flex-end; +} + +.v-snackbar-transition-enter-active, .v-snackbar-transition-leave-active { + transition-duration: 0.15s; + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); +} +.v-snackbar-transition-enter-active { + transition-property: opacity, transform; +} +.v-snackbar-transition-enter-from { + opacity: 0; + transform: scale(0.8); +} +.v-snackbar-transition-leave-active { + transition-property: opacity; +} +.v-snackbar-transition-leave-to { + opacity: 0; +}.v-speed-dial__content { + gap: 8px; +} +.v-speed-dial__content.v-overlay__content.v-speed-dial__content--end, .v-speed-dial__content.v-overlay__content.v-speed-dial__content--end-center, .v-speed-dial__content.v-overlay__content.v-speed-dial__content--right, .v-speed-dial__content.v-overlay__content.v-speed-dial__content--right-center { + flex-direction: row; +} +.v-speed-dial__content.v-overlay__content.v-speed-dial__content--left, .v-speed-dial__content.v-overlay__content.v-speed-dial__content--left-center, .v-speed-dial__content.v-overlay__content.v-speed-dial__content--start, .v-speed-dial__content.v-overlay__content.v-speed-dial__content--start-center { + flex-direction: row-reverse; +} +.v-speed-dial__content.v-overlay__content.v-speed-dial__content--top, .v-speed-dial__content.v-overlay__content.v-speed-dial__content--top-center { + flex-direction: column-reverse; +} +.v-speed-dial__content > *:nth-child(1) { + transition-delay: 0s; +} +.v-speed-dial__content > *:nth-child(2) { + transition-delay: 0.05s; +} +.v-speed-dial__content > *:nth-child(3) { + transition-delay: 0.1s; +} +.v-speed-dial__content > *:nth-child(4) { + transition-delay: 0.15s; +} +.v-speed-dial__content > *:nth-child(5) { + transition-delay: 0.2s; +} +.v-speed-dial__content > *:nth-child(6) { + transition-delay: 0.25s; +} +.v-speed-dial__content > *:nth-child(7) { + transition-delay: 0.3s; +} +.v-speed-dial__content > *:nth-child(8) { + transition-delay: 0.35s; +} +.v-speed-dial__content > *:nth-child(9) { + transition-delay: 0.4s; +} +.v-speed-dial__content > *:nth-child(10) { + transition-delay: 0.45s; +}.v-stepper.v-sheet { + overflow: hidden; +} +.v-stepper.v-sheet { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-stepper.v-sheet { + border-radius: 4px; +} +.v-stepper.v-sheet.v-stepper--flat { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} + +.v-stepper-header { + align-items: center; + display: flex; + position: relative; + overflow-x: auto; + justify-content: space-between; + z-index: 1; +} +.v-stepper-header { + box-shadow: 0px 3px 1px -2px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 2px 2px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 5px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-stepper-header .v-divider { + margin: 0 -16px; +} +.v-stepper-header .v-divider:last-child { + margin-inline-end: 0; +} +.v-stepper-header .v-divider:first-child { + margin-inline-start: 0; +} +.v-stepper--alt-labels .v-stepper-header { + height: auto; +} +.v-stepper--alt-labels .v-stepper-header .v-divider { + align-self: flex-start; + margin: 35px -67px 0; +} + +.v-stepper-window { + margin: 1.5rem; +} + +.v-stepper-actions { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem; +} +.v-stepper .v-stepper-actions { + padding: 0 1.5rem 1rem; +} +.v-stepper-window-item .v-stepper-actions { + padding: 1.5rem 0 0; +}.v-stepper-item { + align-items: center; + align-self: stretch; + display: inline-flex; + flex: none; + outline: none; + opacity: var(--v-medium-emphasis-opacity); + padding: 1.5rem; + position: relative; + transition-duration: 0.2s; + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} +.v-stepper-item:hover > .v-stepper-item__overlay { + opacity: calc(var(--v-hover-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-stepper-item:focus-visible > .v-stepper-item__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-stepper-item:focus > .v-stepper-item__overlay { + opacity: calc(var(--v-focus-opacity) * var(--v-theme-overlay-multiplier)); + } +} +.v-stepper-item--active > .v-stepper-item__overlay, .v-stepper-item[aria-haspopup=menu][aria-expanded=true] > .v-stepper-item__overlay { + opacity: calc(var(--v-activated-opacity) * var(--v-theme-overlay-multiplier)); +} +.v-stepper-item--active:hover > .v-stepper-item__overlay, .v-stepper-item[aria-haspopup=menu][aria-expanded=true]:hover > .v-stepper-item__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-hover-opacity)) * var(--v-theme-overlay-multiplier)); +} +.v-stepper-item--active:focus-visible > .v-stepper-item__overlay, .v-stepper-item[aria-haspopup=menu][aria-expanded=true]:focus-visible > .v-stepper-item__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); +} +@supports not selector(:focus-visible) { + .v-stepper-item--active:focus > .v-stepper-item__overlay, .v-stepper-item[aria-haspopup=menu][aria-expanded=true]:focus > .v-stepper-item__overlay { + opacity: calc((var(--v-activated-opacity) + var(--v-focus-opacity)) * var(--v-theme-overlay-multiplier)); + } +} +.v-stepper--non-linear .v-stepper-item { + opacity: var(--v-high-emphasis-opacity); +} +.v-stepper-item--selected { + opacity: 1; +} +.v-stepper-item--error { + color: rgb(var(--v-theme-error)); +} +.v-stepper-item--disabled { + opacity: var(--v-medium-emphasis-opacity); + pointer-events: none; +} +.v-stepper--alt-labels .v-stepper-item { + flex-direction: column; + justify-content: flex-start; + align-items: center; + flex-basis: 175px; +} + +.v-stepper-item__avatar.v-avatar { + background: rgba(var(--v-theme-surface-variant), var(--v-medium-emphasis-opacity)); + color: rgb(var(--v-theme-on-surface-variant)); + font-size: 0.75rem; + margin-inline-end: 8px; +} +.v-stepper--mobile .v-stepper-item__avatar.v-avatar { + margin-inline-end: 0; +} +.v-stepper-item__avatar.v-avatar .v-icon { + font-size: 0.875rem; +} +.v-stepper-item--selected .v-stepper-item__avatar.v-avatar, .v-stepper-item--complete .v-stepper-item__avatar.v-avatar { + background: rgb(var(--v-theme-surface-variant)); +} +.v-stepper-item--error .v-stepper-item__avatar.v-avatar { + background: rgb(var(--v-theme-error)); +} +.v-stepper--alt-labels .v-stepper-item__avatar.v-avatar { + margin-bottom: 16px; + margin-inline-end: 0; +} + +.v-stepper-item__title { + line-height: 1; +} +.v-stepper--mobile .v-stepper-item__title { + display: none; +} + +.v-stepper-item__subtitle { + font-size: 0.75rem; + text-align: left; + line-height: 1; + opacity: var(--v-medium-emphasis-opacity); +} +.v-stepper--alt-labels .v-stepper-item__subtitle { + text-align: center; +} +.v-stepper--mobile .v-stepper-item__subtitle { + display: none; +} + +.v-stepper-item__overlay { + background-color: currentColor; + border-radius: inherit; + opacity: 0; + transition: opacity 0.2s ease-in-out; +} + +.v-stepper-item__overlay, +.v-stepper-item__underlay { + pointer-events: none; +} +.v-stepper-item__overlay, +.v-stepper-item__underlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +}.v-switch .v-label { + padding-inline-start: 10px; +} + +.v-switch__loader { + display: flex; +} +.v-switch__loader .v-progress-circular { + color: rgb(var(--v-theme-surface)); +} + +.v-switch__track, +.v-switch__thumb { + transition: none; +} +.v-selection-control--error:not(.v-selection-control--disabled) .v-switch__track, +.v-selection-control--error:not(.v-selection-control--disabled) .v-switch__thumb { + background-color: rgb(var(--v-theme-error)); + color: rgb(var(--v-theme-on-error)); +} + +.v-switch__track-true { + margin-inline-end: auto; +} +.v-selection-control:not(.v-selection-control--dirty) .v-switch__track-true { + opacity: 0; +} + +.v-switch__track-false { + margin-inline-start: auto; +} +.v-selection-control--dirty .v-switch__track-false { + opacity: 0; +} + +.v-switch__track { + display: inline-flex; + align-items: center; + font-size: 0.5rem; + padding: 0 5px; + background-color: rgb(var(--v-theme-surface-variant)); + border-radius: 9999px; + height: 14px; + opacity: 0.6; + min-width: 36px; + cursor: pointer; + transition: 0.2s background-color cubic-bezier(0.4, 0, 0.2, 1); +} +.v-switch--inset .v-switch__track { + border-radius: 9999px; + font-size: 0.75rem; + height: 32px; + min-width: 52px; +} + +.v-switch__thumb { + align-items: center; + background-color: rgb(var(--v-theme-surface-bright)); + color: rgb(var(--v-theme-on-surface-bright)); + border-radius: 50%; + display: flex; + font-size: 0.75rem; + height: 20px; + justify-content: center; + width: 20px; + pointer-events: none; + transition: 0.15s 0.05s transform cubic-bezier(0, 0, 0.2, 1), 0.2s color cubic-bezier(0.4, 0, 0.2, 1), 0.2s background-color cubic-bezier(0.4, 0, 0.2, 1); + position: relative; + overflow: hidden; +} +.v-switch:not(.v-switch--inset) .v-switch__thumb { + box-shadow: 0px 2px 4px -1px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 4px 5px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 1px 10px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-switch.v-switch--flat:not(.v-switch--inset) .v-switch__thumb { + background: rgb(var(--v-theme-surface-variant)); + color: rgb(var(--v-theme-on-surface-variant)); +} +.v-switch.v-switch--flat:not(.v-switch--inset) .v-switch__thumb { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-switch--inset .v-switch__thumb { + height: 24px; + width: 24px; + transform: scale(0.6666666667); +} +.v-switch--inset .v-switch__thumb--filled { + transform: none; +} +.v-switch--inset .v-selection-control--dirty .v-switch__thumb { + transform: none; + transition: 0.15s 0.05s transform cubic-bezier(0, 0, 0.2, 1); +} + +.v-switch.v-input { + flex: 0 1 auto; +} +.v-switch .v-selection-control { + min-height: var(--v-input-control-height); +} +.v-switch .v-selection-control__input { + border-radius: 50%; + transition: 0.2s transform cubic-bezier(0.4, 0, 0.2, 1); + position: absolute; +} +.v-locale--is-ltr.v-switch .v-selection-control__input, .v-locale--is-ltr .v-switch .v-selection-control__input { + transform: translateX(-10px); +} + +.v-locale--is-rtl.v-switch .v-selection-control__input, .v-locale--is-rtl .v-switch .v-selection-control__input { + transform: translateX(10px); +} + +.v-switch .v-selection-control__input .v-icon { + position: absolute; +} +.v-locale--is-ltr.v-switch .v-selection-control--dirty .v-selection-control__input, .v-locale--is-ltr .v-switch .v-selection-control--dirty .v-selection-control__input { + transform: translateX(10px); +} + +.v-locale--is-rtl.v-switch .v-selection-control--dirty .v-selection-control__input, .v-locale--is-rtl .v-switch .v-selection-control--dirty .v-selection-control__input { + transform: translateX(-10px); +} + +.v-switch.v-switch--indeterminate .v-selection-control__input { + transform: scale(0.8); +} +.v-switch.v-switch--indeterminate .v-switch__thumb { + transform: scale(0.75); + box-shadow: none; +} +.v-switch.v-switch--inset .v-selection-control__wrapper { + width: auto; +} +.v-switch.v-input--vertical .v-label { + min-width: max-content; +} +.v-switch.v-input--vertical .v-selection-control__wrapper { + transform: rotate(-90deg); +} + +@media (forced-colors: active) { + .v-switch .v-switch__loader .v-progress-circular { + color: currentColor; + } + .v-switch .v-switch__thumb { + background-color: buttontext; + } + .v-switch .v-switch__track, + .v-switch .v-switch__thumb { + border: 1px solid; + color: buttontext; + } + .v-switch:not(.v-switch--loading):not(.v-input--disabled) .v-selection-control--dirty .v-switch__thumb { + background-color: highlight; + } + .v-switch:not(.v-input--disabled) .v-selection-control--dirty .v-switch__track { + background-color: highlight; + } + .v-switch:not(.v-input--disabled) .v-selection-control--dirty .v-switch__track, + .v-switch:not(.v-input--disabled) .v-selection-control--dirty .v-switch__thumb { + color: highlight; + } + .v-switch.v-switch--inset .v-switch__track { + border-width: 2px; + } + .v-switch.v-switch--inset:not(.v-switch--loading):not(.v-input--disabled) .v-selection-control--dirty .v-switch__thumb { + background-color: highlighttext; + color: highlighttext; + } + .v-switch.v-input--disabled .v-switch__thumb { + background-color: graytext; + } + .v-switch.v-input--disabled .v-switch__track, + .v-switch.v-input--disabled .v-switch__thumb { + color: graytext; + } + .v-switch.v-switch--loading .v-switch__thumb { + background-color: canvas; + } + .v-switch.v-switch--loading.v-switch--inset .v-switch__thumb, .v-switch.v-switch--loading.v-switch--indeterminate .v-switch__thumb { + border-width: 0; + } +}.v-system-bar { + align-items: center; + display: flex; + flex: 1 1 auto; + height: 24px; + justify-content: flex-end; + max-width: 100%; + padding-inline: 8px; + position: relative; + text-align: end; + width: 100%; +} +.v-system-bar .v-icon { + opacity: var(--v-medium-emphasis-opacity); +} +.v-system-bar { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-system-bar--absolute { + position: absolute; +} +.v-system-bar--fixed { + position: fixed; +} +.v-system-bar { + background: rgba(var(--v-theme-surface-light)); + color: rgba(var(--v-theme-on-surface-light), var(--v-high-emphasis-opacity)); +} +.v-system-bar { + font-size: 0.75rem; + font-weight: 400; + letter-spacing: 0.0333333333em; + line-height: 1.667; + text-transform: none; +} +.v-system-bar--rounded { + border-radius: 0; +} +.v-system-bar--window { + height: 32px; +} +.v-system-bar:not(.v-system-bar--absolute) { + padding-inline-end: calc(var(--v-scrollbar-offset) + 8px); +}.v-tab.v-tab.v-btn { + height: var(--v-tabs-height); + border-radius: 0; + min-width: 90px; +} +.v-slide-group--horizontal .v-tab { + max-width: 360px; +} +.v-slide-group--vertical .v-tab { + justify-content: start; +} + +.v-tab__slider { + position: absolute; + bottom: 0; + left: 0; + height: 2px; + width: 100%; + background: currentColor; + pointer-events: none; + opacity: 0; +} +.v-tab--selected .v-tab__slider { + opacity: 1; +} +.v-slide-group--vertical .v-tab__slider { + top: 0; + height: 100%; + width: 2px; +}.v-tabs { + display: flex; + height: var(--v-tabs-height); +} +.v-tabs--density-default { + --v-tabs-height: 48px; +} +.v-tabs--density-default.v-tabs--stacked { + --v-tabs-height: 72px; +} + +.v-tabs--density-comfortable { + --v-tabs-height: 44px; +} +.v-tabs--density-comfortable.v-tabs--stacked { + --v-tabs-height: 68px; +} + +.v-tabs--density-compact { + --v-tabs-height: 36px; +} +.v-tabs--density-compact.v-tabs--stacked { + --v-tabs-height: 60px; +} + +.v-tabs.v-slide-group--vertical { + height: auto; + flex: none; + --v-tabs-height: 48px; +} + +.v-tabs--align-tabs-title:not(.v-slide-group--has-affixes) .v-tab:first-child { + margin-inline-start: 42px; +} + +.v-tabs--fixed-tabs .v-slide-group__content > *:last-child, +.v-tabs--align-tabs-center .v-slide-group__content > *:last-child { + margin-inline-end: auto; +} +.v-tabs--fixed-tabs .v-slide-group__content > *:first-child, +.v-tabs--align-tabs-center .v-slide-group__content > *:first-child { + margin-inline-start: auto; +} + +.v-tabs--grow { + flex-grow: 1; +} +.v-tabs--grow .v-tab { + flex: 1 0 auto; + max-width: none; +} + +.v-tabs--align-tabs-end .v-tab:first-child { + margin-inline-start: auto; +} +.v-tabs--align-tabs-end .v-tab:last-child { + margin-inline-end: 0; +} + +@media (max-width: 1279.98px) { + .v-tabs.v-slide-group--is-overflowing.v-slide-group--horizontal:not(.v-slide-group--has-affixes) .v-tab:first-child { + margin-inline-start: 52px; + } + .v-tabs.v-slide-group--is-overflowing.v-slide-group--horizontal:not(.v-slide-group--has-affixes) .v-tab:last-child { + margin-inline-end: 52px; + } +}.v-textarea .v-field { + --v-textarea-control-height: var(--v-input-control-height); +} +.v-textarea .v-field__field { + --v-input-control-height: var(--v-textarea-control-height); +} +.v-textarea .v-field__input { + flex: 1 1 auto; + outline: none; + -webkit-mask-image: linear-gradient(to bottom, transparent, transparent calc(var(--v-field-padding-top, 0) + var(--v-input-padding-top, 0) - 6px), black calc(var(--v-field-padding-top, 0) + var(--v-input-padding-top, 0) + 4px)); + mask-image: linear-gradient(to bottom, transparent, transparent calc(var(--v-field-padding-top, 0) + var(--v-input-padding-top, 0) - 6px), black calc(var(--v-field-padding-top, 0) + var(--v-input-padding-top, 0) + 4px)); +} +.v-textarea .v-field__input.v-textarea__sizer { + visibility: hidden; + position: absolute; + top: 0; + left: 0; + height: 0 !important; + min-height: 0 !important; + pointer-events: none; +} +.v-textarea--no-resize .v-field__input { + resize: none; +} +.v-textarea .v-field--no-label textarea, +.v-textarea .v-field--active textarea { + opacity: 1; +} +.v-textarea textarea { + opacity: 0; + flex: 1; + min-width: 0; + height: 100%; + transition: 0.15s opacity cubic-bezier(0.4, 0, 0.2, 1); +} +.v-textarea textarea:focus, .v-textarea textarea:active { + outline: none; +} +.v-textarea textarea:invalid { + box-shadow: none; +}.v-theme-provider { + background: rgb(var(--v-theme-background)); + color: rgb(var(--v-theme-on-background)); +}.v-timeline .v-timeline-divider__dot { + background: rgb(var(--v-theme-surface-light)); +} +.v-timeline .v-timeline-divider__inner-dot { + background: rgb(var(--v-theme-on-surface)); +} + +.v-timeline { + display: grid; + grid-auto-flow: dense; + position: relative; +} +.v-timeline--horizontal.v-timeline { + grid-column-gap: 24px; + width: 100%; +} +.v-timeline--horizontal.v-timeline .v-timeline--side-end > .v-timeline-item .v-timeline-item__body, .v-timeline--horizontal.v-timeline:not(.v-timeline--side-start) > .v-timeline-item--side-end .v-timeline-item__body, .v-timeline--horizontal.v-timeline:not(.v-timeline--side-start) > .v-timeline-item:nth-child(2n+1):not(.v-timeline-item--side-start) .v-timeline-item__body { + grid-row: 3; + align-self: flex-start; + padding-block-start: 24px; +} +.v-timeline--horizontal.v-timeline .v-timeline--side-end > .v-timeline-item .v-timeline-item__opposite, .v-timeline--horizontal.v-timeline:not(.v-timeline--side-start) > .v-timeline-item--side-end .v-timeline-item__opposite, .v-timeline--horizontal.v-timeline:not(.v-timeline--side-start) > .v-timeline-item:nth-child(2n+1):not(.v-timeline-item--side-start) .v-timeline-item__opposite { + grid-row: 1; + align-self: flex-end; + padding-block-end: 24px; +} +.v-timeline--horizontal.v-timeline .v-timeline--side-start > .v-timeline-item .v-timeline-item__body, .v-timeline--horizontal.v-timeline:not(.v-timeline--side-end) > .v-timeline-item--side-start .v-timeline-item__body, .v-timeline--horizontal.v-timeline:not(.v-timeline--side-end) > .v-timeline-item:nth-child(2n):not(.v-timeline-item--side-end) .v-timeline-item__body { + grid-row: 1; + align-self: flex-end; + padding-block-end: 24px; +} +.v-timeline--horizontal.v-timeline .v-timeline--side-start > .v-timeline-item .v-timeline-item__opposite, .v-timeline--horizontal.v-timeline:not(.v-timeline--side-end) > .v-timeline-item--side-start .v-timeline-item__opposite, .v-timeline--horizontal.v-timeline:not(.v-timeline--side-end) > .v-timeline-item:nth-child(2n):not(.v-timeline-item--side-end) .v-timeline-item__opposite { + grid-row: 3; + align-self: flex-start; + padding-block-start: 24px; +} + +.v-timeline--vertical.v-timeline { + row-gap: 24px; + height: 100%; +} +.v-timeline--vertical.v-timeline .v-timeline-item:first-child .v-timeline-divider, .v-timeline--vertical.v-timeline .v-timeline-item:first-child .v-timeline-item__body, .v-timeline--vertical.v-timeline .v-timeline-item:first-child .v-timeline-item__opposite { + padding-block-start: 24px; +} +.v-timeline--vertical.v-timeline .v-timeline-item:last-child .v-timeline-divider, .v-timeline--vertical.v-timeline .v-timeline-item:last-child .v-timeline-item__body, .v-timeline--vertical.v-timeline .v-timeline-item:last-child .v-timeline-item__opposite { + padding-block-end: 24px; +} +.v-timeline--vertical.v-timeline .v-timeline--side-start > .v-timeline-item .v-timeline-item__body, .v-timeline--vertical.v-timeline:not(.v-timeline--side-end) > .v-timeline-item--side-start .v-timeline-item__body, .v-timeline--vertical.v-timeline:not(.v-timeline--side-end) > .v-timeline-item:nth-child(2n):not(.v-timeline-item--side-end) .v-timeline-item__body { + grid-column: 1; + justify-self: flex-end; + padding-inline-end: 24px; +} +.v-timeline--vertical.v-timeline .v-timeline--side-start > .v-timeline-item .v-timeline-item__opposite, .v-timeline--vertical.v-timeline:not(.v-timeline--side-end) > .v-timeline-item--side-start .v-timeline-item__opposite, .v-timeline--vertical.v-timeline:not(.v-timeline--side-end) > .v-timeline-item:nth-child(2n):not(.v-timeline-item--side-end) .v-timeline-item__opposite { + grid-column: 3; + justify-self: flex-start; + padding-inline-start: 24px; +} +.v-timeline--vertical.v-timeline .v-timeline--side-end > .v-timeline-item .v-timeline-item__body, .v-timeline--vertical.v-timeline:not(.v-timeline--side-start) > .v-timeline-item--side-end .v-timeline-item__body, .v-timeline--vertical.v-timeline:not(.v-timeline--side-start) > .v-timeline-item:nth-child(2n+1):not(.v-timeline-item--side-start) .v-timeline-item__body { + grid-column: 3; + justify-self: flex-start; + padding-inline-start: 24px; +} +.v-timeline--vertical.v-timeline .v-timeline--side-end > .v-timeline-item .v-timeline-item__opposite, .v-timeline--vertical.v-timeline:not(.v-timeline--side-start) > .v-timeline-item--side-end .v-timeline-item__opposite, .v-timeline--vertical.v-timeline:not(.v-timeline--side-start) > .v-timeline-item:nth-child(2n+1):not(.v-timeline-item--side-start) .v-timeline-item__opposite { + grid-column: 1; + justify-self: flex-end; + padding-inline-end: 24px; +} + +.v-timeline-item { + display: contents; +} + +.v-timeline-divider { + position: relative; + display: flex; + align-items: center; +} +.v-timeline--horizontal .v-timeline-divider { + flex-direction: row; + grid-row: 2; + width: 100%; +} + +.v-timeline--vertical .v-timeline-divider { + height: 100%; + flex-direction: column; + grid-column: 2; +} + +.v-timeline-divider__before { + background: rgba(var(--v-border-color), var(--v-border-opacity)); + position: absolute; +} +.v-timeline--horizontal .v-timeline-divider__before { + height: var(--v-timeline-line-thickness); + width: calc(var(--v-timeline-line-size-base) + 12px - var(--v-timeline-line-inset)); + inset-inline-start: -12px; + inset-inline-end: initial; +} + +.v-timeline--vertical .v-timeline-divider__before { + height: calc(var(--v-timeline-line-size-base) + 12px - var(--v-timeline-line-inset)); + width: var(--v-timeline-line-thickness); + top: -12px; +} + +.v-timeline-divider__after { + background: rgba(var(--v-border-color), var(--v-border-opacity)); + position: absolute; +} +.v-timeline--horizontal .v-timeline-divider__after { + height: var(--v-timeline-line-thickness); + width: calc(var(--v-timeline-line-size-base) + 12px - var(--v-timeline-line-inset)); + inset-inline-end: -12px; + inset-inline-start: initial; +} + +.v-timeline--vertical .v-timeline-divider__after { + height: calc(var(--v-timeline-line-size-base) + 12px - var(--v-timeline-line-inset)); + width: var(--v-timeline-line-thickness); + bottom: -12px; +} + +.v-timeline--vertical .v-timeline-item:first-child .v-timeline-divider__before { + height: calc(var(--v-timeline-line-size-base) + 12px - var(--v-timeline-line-inset)); + top: 0; +} + +.v-timeline--horizontal .v-timeline-item:first-child .v-timeline-divider__before { + width: calc(var(--v-timeline-line-size-base) + 12px - var(--v-timeline-line-inset)); + inset-inline-start: 0; + inset-inline-end: initial; +} + +.v-timeline--vertical .v-timeline-item:first-child .v-timeline-divider__after { + height: calc(var(--v-timeline-line-size-base) - var(--v-timeline-line-inset) + var(--v-timeline-line-size-offset)); +} + +.v-timeline--horizontal .v-timeline-item:first-child .v-timeline-divider__after { + width: calc(var(--v-timeline-line-size-base) - var(--v-timeline-line-inset) + var(--v-timeline-line-size-offset)); + inset-inline-end: -12px; + inset-inline-start: initial; +} + +.v-timeline--vertical .v-timeline-item:last-child .v-timeline-divider__before { + height: calc(var(--v-timeline-line-size-base) - var(--v-timeline-line-inset) + var(--v-timeline-line-size-offset)); +} + +.v-timeline--horizontal .v-timeline-item:last-child .v-timeline-divider__before { + width: calc(var(--v-timeline-line-size-base) - var(--v-timeline-line-inset) + var(--v-timeline-line-size-offset)); +} + +.v-timeline--vertical .v-timeline-item:last-child .v-timeline-divider__after { + height: calc(var(--v-timeline-line-size-base) + 12px - var(--v-timeline-line-inset)); + bottom: 0; +} + +.v-timeline--horizontal .v-timeline-item:last-child .v-timeline-divider__after { + width: calc(var(--v-timeline-line-size-base) + 12px - var(--v-timeline-line-inset)); + inset-inline-end: 0; + inset-inline-start: initial; +} + +.v-timeline--vertical .v-timeline-item:only-child .v-timeline-divider__after { + height: calc(var(--v-timeline-line-size-base) - var(--v-timeline-line-inset)); +} + +.v-timeline-divider__dot { + z-index: 1; + flex-shrink: 0; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; +} +.v-timeline-divider__dot { + box-shadow: 0px 0px 0px 0px var(--v-shadow-key-umbra-opacity, rgba(0, 0, 0, 0.2)), 0px 0px 0px 0px var(--v-shadow-key-penumbra-opacity, rgba(0, 0, 0, 0.14)), 0px 0px 0px 0px var(--v-shadow-key-ambient-opacity, rgba(0, 0, 0, 0.12)); +} +.v-timeline-divider__dot--size-x-small { + height: 22px; + width: 22px; +} +.v-timeline-divider__dot--size-x-small .v-timeline-divider__inner-dot { + height: calc(100% - 6px); + width: calc(100% - 6px); +} +.v-timeline-divider__dot--size-small { + height: 30px; + width: 30px; +} +.v-timeline-divider__dot--size-small .v-timeline-divider__inner-dot { + height: calc(100% - 8px); + width: calc(100% - 8px); +} +.v-timeline-divider__dot--size-default { + height: 38px; + width: 38px; +} +.v-timeline-divider__dot--size-default .v-timeline-divider__inner-dot { + height: calc(100% - 8px); + width: calc(100% - 8px); +} +.v-timeline-divider__dot--size-large { + height: 46px; + width: 46px; +} +.v-timeline-divider__dot--size-large .v-timeline-divider__inner-dot { + height: calc(100% - 8px); + width: calc(100% - 8px); +} +.v-timeline-divider__dot--size-x-large { + height: 54px; + width: 54px; +} +.v-timeline-divider__dot--size-x-large .v-timeline-divider__inner-dot { + height: calc(100% - 10px); + width: calc(100% - 10px); +} + +.v-timeline-divider__inner-dot { + align-items: center; + border-radius: 50%; + display: flex; + justify-content: center; +} + +/** Modifiers **/ +.v-timeline--horizontal.v-timeline--justify-center { + grid-template-rows: minmax(auto, 50%) min-content minmax(auto, 50%); +} + +.v-timeline--vertical.v-timeline--justify-center { + grid-template-columns: minmax(auto, 50%) min-content minmax(auto, 50%); +} + +.v-timeline--horizontal.v-timeline--justify-auto { + grid-template-rows: auto min-content auto; +} + +.v-timeline--vertical.v-timeline--justify-auto { + grid-template-columns: auto min-content auto; +} + +.v-timeline--horizontal.v-timeline--density-comfortable { + height: 100%; +} +.v-timeline--horizontal.v-timeline--density-comfortable.v-timeline--side-end { + grid-template-rows: min-content min-content auto; +} +.v-timeline--horizontal.v-timeline--density-comfortable.v-timeline--side-start { + grid-template-rows: auto min-content min-content; +} + +.v-timeline--vertical.v-timeline--density-comfortable { + width: 100%; +} +.v-timeline--vertical.v-timeline--density-comfortable.v-timeline--side-end { + grid-template-columns: min-content min-content auto; +} +.v-timeline--vertical.v-timeline--density-comfortable.v-timeline--side-start { + grid-template-columns: auto min-content min-content; +} + +.v-timeline--horizontal.v-timeline--density-compact.v-timeline--side-end { + grid-template-rows: 0 min-content auto; +} +.v-timeline--horizontal.v-timeline--density-compact.v-timeline--side-start { + grid-template-rows: auto min-content 0; +} +.v-timeline--horizontal.v-timeline--density-compact .v-timeline-item__body { + grid-row: 1; +} + +.v-timeline--vertical.v-timeline--density-compact.v-timeline--side-end { + grid-template-columns: 0 min-content auto; +} +.v-timeline--vertical.v-timeline--density-compact.v-timeline--side-start { + grid-template-columns: auto min-content 0; +} +.v-timeline--vertical.v-timeline--density-compact .v-timeline-item__body { + grid-column: 3; +} + +.v-timeline--horizontal.v-timeline.v-timeline--side-end .v-timeline-item .v-timeline-item__body { + grid-row: 3; + align-self: flex-start; + padding-block-end: initial; + padding-block-start: 24px; +} +.v-timeline--horizontal.v-timeline.v-timeline--side-end .v-timeline-item .v-timeline-item__opposite { + grid-row: 1; + align-self: flex-end; + padding-block-end: 24px; + padding-block-start: initial; +} + +.v-timeline--vertical.v-timeline.v-timeline--side-end .v-timeline-item .v-timeline-item__body { + grid-column: 3; + justify-self: flex-start; + padding-inline-start: 24px; + padding-inline-end: initial; +} +.v-timeline--vertical.v-timeline.v-timeline--side-end .v-timeline-item .v-timeline-item__opposite { + grid-column: 1; + justify-self: flex-end; + padding-inline-end: 24px; + padding-inline-start: initial; +} + +.v-timeline--horizontal.v-timeline.v-timeline--side-start .v-timeline-item .v-timeline-item__body { + grid-row: 1; + align-self: flex-end; + padding-block-end: 24px; + padding-block-start: initial; +} +.v-timeline--horizontal.v-timeline.v-timeline--side-start .v-timeline-item .v-timeline-item__opposite { + grid-row: 3; + align-self: flex-start; + padding-block-end: initial; + padding-block-start: 24px; +} + +.v-timeline--vertical.v-timeline.v-timeline--side-start .v-timeline-item .v-timeline-item__body { + grid-column: 1; + justify-self: flex-end; + padding-inline-end: 24px; +} +.v-timeline--vertical.v-timeline.v-timeline--side-start .v-timeline-item .v-timeline-item__opposite { + grid-column: 3; + justify-self: flex-start; + padding-inline-start: 24px; +} + +.v-timeline-divider--fill-dot .v-timeline-divider__inner-dot { + height: inherit; + width: inherit; +} + +.v-timeline--align-center { + --v-timeline-line-size-base: 50%; + --v-timeline-line-size-offset: 0px; +} +.v-timeline--horizontal.v-timeline--align-center { + justify-items: center; +} +.v-timeline--horizontal.v-timeline--align-center .v-timeline-item__body { + padding-inline: 12px; +} +.v-timeline--horizontal.v-timeline--align-center .v-timeline-item__opposite { + padding-inline: 12px; +} +.v-timeline--horizontal.v-timeline--align-center .v-timeline-divider { + justify-content: center; +} + +.v-timeline--vertical.v-timeline--align-center { + align-items: center; +} +.v-timeline--vertical.v-timeline--align-center .v-timeline-divider { + justify-content: center; +} + +.v-timeline--align-start { + --v-timeline-line-size-base: 100%; + --v-timeline-line-size-offset: 12px; +} +.v-timeline--align-start .v-timeline-item:first-child .v-timeline-divider__before { + --v-timeline-line-size-offset: 24px; +} +.v-timeline--align-start .v-timeline-item:first-child .v-timeline-divider__after { + --v-timeline-line-size-offset: -12px; +} +.v-timeline--align-start .v-timeline-item:last-child .v-timeline-divider__after { + --v-timeline-line-size-offset: 0px; +} +.v-timeline--horizontal.v-timeline--align-start { + justify-items: flex-start; +} +.v-timeline--horizontal.v-timeline--align-start .v-timeline-divider { + justify-content: flex-start; +} +.v-timeline--horizontal.v-timeline--align-start .v-timeline-divider .v-timeline-divider__before { + width: calc(var(--v-timeline-line-size-offset) + var(--v-timeline-dot-size) / 2 - var(--v-timeline-line-inset)); +} +.v-timeline--horizontal.v-timeline--align-start .v-timeline-divider .v-timeline-divider__after { + width: calc(var(--v-timeline-line-size-base) - var(--v-timeline-dot-size) / 2 + var(--v-timeline-line-size-offset) - var(--v-timeline-line-inset)); +} + +.v-timeline--vertical.v-timeline--align-start { + align-items: flex-start; +} +.v-timeline--vertical.v-timeline--align-start .v-timeline-divider { + justify-content: flex-start; +} +.v-timeline--vertical.v-timeline--align-start .v-timeline-divider .v-timeline-divider__before { + height: calc(var(--v-timeline-line-size-offset) + var(--v-timeline-dot-size) / 2 - var(--v-timeline-line-inset)); +} +.v-timeline--vertical.v-timeline--align-start .v-timeline-divider .v-timeline-divider__after { + height: calc(var(--v-timeline-line-size-base) - var(--v-timeline-dot-size) / 2 + var(--v-timeline-line-size-offset) - var(--v-timeline-line-inset)); +} + +.v-timeline--truncate-line-start .v-timeline-item:first-child .v-timeline-divider__before { + display: none; +} +.v-timeline--truncate-line-start .v-timeline-item:first-child .v-timeline-divider__after { + --v-timeline-line-size-offset: 12px; +} +.v-timeline--vertical.v-timeline--truncate-line-start .v-timeline-item:first-child .v-timeline-divider, .v-timeline--vertical.v-timeline--truncate-line-start .v-timeline-item:first-child .v-timeline-item__body, .v-timeline--vertical.v-timeline--truncate-line-start .v-timeline-item:first-child .v-timeline-item__opposite { + padding-block-start: 0; +} + +.v-timeline--horizontal.v-timeline--truncate-line-start .v-timeline-item:first-child .v-timeline-divider, .v-timeline--horizontal.v-timeline--truncate-line-start .v-timeline-item:first-child .v-timeline-item__body, .v-timeline--horizontal.v-timeline--truncate-line-start .v-timeline-item:first-child .v-timeline-item__opposite { + padding-inline-start: 0; +} + +.v-timeline--truncate-line-end .v-timeline-item:last-child .v-timeline-divider__after { + display: none; +} +.v-timeline--truncate-line-end .v-timeline-item:last-child .v-timeline-divider__before { + --v-timeline-line-size-offset: 12px; +} +.v-timeline--vertical.v-timeline--truncate-line-end .v-timeline-item:last-child .v-timeline-divider, .v-timeline--vertical.v-timeline--truncate-line-end .v-timeline-item:last-child .v-timeline-item__body, .v-timeline--vertical.v-timeline--truncate-line-end .v-timeline-item:last-child .v-timeline-item__opposite { + padding-block-end: 0; +} + +.v-timeline--horizontal.v-timeline--truncate-line-end .v-timeline-item:last-child .v-timeline-divider, .v-timeline--horizontal.v-timeline--truncate-line-end .v-timeline-item:last-child .v-timeline-item__body, .v-timeline--horizontal.v-timeline--truncate-line-end .v-timeline-item:last-child .v-timeline-item__opposite { + padding-inline-end: 0; +}.v-tooltip > .v-overlay__content { + background: rgb(var(--v-theme-surface-variant)); + color: rgb(var(--v-theme-on-surface-variant)); + border-radius: 4px; + font-size: 0.875rem; + line-height: 1.6; + display: inline-block; + padding: 5px 16px; + text-transform: initial; + width: auto; + opacity: 1; + transition-property: opacity, transform; + overflow-wrap: break-word; +} +.v-tooltip > .v-overlay__content[class*=enter-active] { + transition-timing-function: cubic-bezier(0, 0, 0.2, 1); + transition-duration: 150ms; +} +.v-tooltip > .v-overlay__content[class*=leave-active] { + transition-timing-function: cubic-bezier(0.4, 0, 1, 1); + transition-duration: 75ms; +} +.v-tooltip:not(.v-tooltip--interactive) > .v-overlay__content { + pointer-events: none; +} +.col-header[data-v-7f23634f] { + background-color: rgb(var(--v-theme-surface)); + height: 40px; + display: flex; + align-items: center; + justify-content: center; +} +.font-medium[data-v-7f23634f] { + font-size: 1.2em; +} +.chip-button[data-v-7f23634f] { + font-size: 1.2em; + font-weight: bolder !important; + height: 35px !important; + width: 50px; + min-width: 32px; /* Prevents button from expanding */ + padding: 0; /* Removes default padding for a snug fit */ + margin-left: 1px; + margin-right: 1px; +} +.inactive-button-success[data-v-7f23634f] { + border: 2px solid #5cb85c; + color: #5cb85c; +} +.inactive-button-fail[data-v-7f23634f] { + border: 2px solid #d9534f; + color: #d9534f; +} +.inactive-button-fail3[data-v-7f23634f] { + border: 2px solid #8b0000; + color: #8b0000; +} +.inactive-button-total[data-v-7f23634f] { + border: 2px solid grey; + color: grey; +} + +.job-submit-container[data-v-d657c101] { + width: 40%; +} +@media (max-width: 1200px) { +.job-submit-container[data-v-d657c101] { + width: 70% !important; + margin: 1rem !important; +} +} +.v-menu > .v-overlay__content > .v-list > .v-list-item[data-v-d657c101] { + display: flex; + flex-direction: row; + min-height: 30px; + max-height: 30px; +} +.nightly-build[data-v-d657c101] { + font-weight: 500; + color: rgb(33, 150, 243) !important; +} +.nightly-build[data-v-d657c101] .v-list-item-title { + font-weight: 500; + color: rgb(33, 150, 243) !important; +} +.warning-icon[data-v-d657c101] { + position: absolute; + right: -40px; + top: 50%; + transform: translateY(-50%); +} +.tooltip-text[data-v-d657c101] { + font-size: 16px; + line-height: 1.5; +} + +.v-btn-group--density-default.v-btn-group[data-v-6a0c4c4e] { + height: unset !important; /* Override the default height */ +} +.chip-button[data-v-6a0c4c4e] { + font-size: 1em; + font-weight: bolder !important; + height: 40px !important; + width: 60px; + min-width: 32px; /* Prevents button from expanding */ + padding: 0; /* Removes default padding for a snug fit */ +} +.inactive-button-running[data-v-6a0c4c4e] { + border: 2px solid #5bc0de; + color: #5bc0de; +} +.inactive-button-success[data-v-6a0c4c4e] { + border: 2px solid #5cb85c; + color: #5cb85c; +} +.inactive-button-fail[data-v-6a0c4c4e] { + border: 2px solid #d9534f; + color: #d9534f; +} +.inactive-button-fail3[data-v-6a0c4c4e] { + border: 2px solid #8b0000; + color: #8b0000; +} +.inactive-button-total[data-v-6a0c4c4e] { + border: 2px solid grey; + color: grey; +} +.active-button-font[data-v-6a0c4c4e] { + color: white !important; + background: red; +} + +[data-v-5fe19820] .chip-button { + color: white !important; + width: 50px; + height: 30px !important; +} +.builds-wrapper[data-v-5fe19820] { + width: 80%; +} + +/* Mobile responsiveness */ +@media (max-width: 1200px) { +.builds-wrapper[data-v-5fe19820] { + width: 100% !important; + padding: 0 8px; +} +} + +/* NIGHTLY label styling */ +.nightly-label[data-v-5fe19820] { + font-size: 0.75rem; + background-color: hsl(0, 100%, 77%); + transition: background-color 0.2s ease; +} + +.buildsTable > .v-table__wrapper > table > thead > tr > th > .v-data-table-header__content{ + font-weight: bold; + text-align: center; + display: block; +} +.buildsTable > .v-table__wrapper > table > tbody > .v-data-table__tr { + font-size: 1rem; + font-weight: 500; +} +.buildsTable > .v-table__wrapper > table > tbody > tr > td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.buildsTable { + width: 100% !important; +} +.buildsTable tbody tr:nth-child(even) { + background: hsla(230, 86%, 73%, 0.075); +} + +.btn-confirm { + color: white; + font-weight: bold; + border: none; + background-color: rgb(33, 150, 243) +} + +.v-row[data-v-4d26336b] { + /* border: 1px solid red; */ + margin-top: 10px; + margin-bottom: 10px; + font-size: 1.2rem; +} + +.tasksTable > .v-table__wrapper > table > thead > tr > th > .v-data-table-header__content{ + font-weight: bold; + text-align: center; + display: block; +} +.tasksTable > .v-table__wrapper > table > tbody > .v-data-table__tr { + font-size: 1rem; + font-weight: 500; +} +.tasksTable > .v-table__wrapper > table > tbody > tr > td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.v-expansion-panel > .v-expansion-panel-text > .v-expansion-panel-text__wrapper { + padding: 0; + padding-bottom: 8px; +} + +.left-col-info[data-v-09e1654d] { + font-weight: normal; + font-size: 1.2em; + text-align: right; +} +.right-col-info[data-v-09e1654d] { + font-weight: normal; + font-size: 1.2em; + margin-left: 40px; +} + + +.preserve-whitespace[data-v-88a6a502] { + white-space: pre-wrap; +} +.log-tab[data-v-88a6a502] { + margin-left: 20px; +} +.log-tab a[data-v-88a6a502] { + color: #1976d2; + text-decoration: none; +} +.log-tab a[data-v-88a6a502]:hover { + text-decoration: underline; +} + +.suites-wrapper[data-v-461752a0] { + width: 80%; +} + +/* Mobile responsiveness */ +@media (max-width: 1200px) { +.suites-wrapper[data-v-461752a0] { + width: 100% !important; + padding: 0 8px; +} +} + +.suitesTable > .v-table__wrapper > table > thead > tr > th > .v-data-table-header__content{ + font-weight: bold; + text-align: center; + display: block; +} +.suitesTable > .v-table__wrapper > table > tbody > .v-data-table__tr { + font-size: 1rem; + font-weight: 500; +} +.suitesTable > .v-table__wrapper > table > tbody > tr > td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.suitesTable tbody tr:nth-child(even) { + background: hsla(230, 86%, 73%, 0.075); +} + +.custom-textarea { + width: 75%; /* Full-width by default */ + padding: 8px; /* Compact padding */ + font-size: 16px; /* Adjust font size for compact density */ + font-weight: 500; + line-height: 1.3; /* Ensure good readability */ + border: 1px solid #ccc; /* Outlined border */ + border-radius: 4px; /* Rounded corners */ + resize: both; /* Allow resizing horizontally and vertically */ + box-shadow: none; /* Remove default shadow */ + outline: none; /* Remove blue outline on focus */ + font-family: Monaco, Consolas, monospace; + overflow: auto; /* Handle overflow gracefully */ +} +.custom-textarea:focus { + border: 2px solid #1976d2; /* Highlight border on focus (Vuetify blue) */ + padding: 7px; +} + + +.nightly-label { + font-size: 0.75rem; + background-color: hsl(0, 100%, 77%); + transition: background-color 0.2s ease; +} +.historyTable > .v-table__wrapper > table > thead > tr > th > .v-data-table-header__content{ + font-weight: bold; + text-align: center; + display: block; +} +.historyTable > .v-table__wrapper > table > tbody > .v-data-table__tr { + font-size: 1rem; + font-weight: 500; +} +.historyTable > .v-table__wrapper > table > tbody > tr > td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.console-container[data-v-2b60f7d0] { + background-color: #1e1e1e; + border-radius: 4px; + overflow: hidden; + height: calc(85vh - 300px); + display: flex; + flex-direction: column; +} +.console-output[data-v-2b60f7d0] { + background-color: #1e1e1e; + color: #d4d4d4; + font-family: 'Consolas', 'Monaco', 'Courier New', monospace; + font-size: 12px; + line-height: 1.4; + padding: 12px; + margin: 0; + overflow: auto; + flex: 1; + white-space: pre-wrap; + word-wrap: break-word; +} + +.agentsTable > .v-table__wrapper > table > thead > tr > th > .v-data-table-header__content{ + font-weight: bold; + text-align: center; + display: block; +} +.agentsTable > .v-table__wrapper > table > thead > tr > th, +.agentsTable > .v-table__wrapper > table > tbody > tr > td { + padding-right: 6px; + padding-left: 6px; +} +.agentsTable > .v-table__wrapper > table > tbody > .v-data-table__tr { + font-size: 1rem; + font-weight: 500; +} +.agentsTable > .v-table__wrapper > table > tbody > tr > td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 0px; +} + +/* Never crop host column - always show full hostname */ +.agentsTable > .v-table__wrapper > table > tbody > tr > td:nth-child(4) { + max-width: none !important; + overflow: visible; + white-space: nowrap; +} + +/* Never crop state column - always show full status chip */ +.agentsTable > .v-table__wrapper > table > tbody > tr > td:nth-child(3) { + max-width: none !important; + overflow: visible; + white-space: nowrap; +} +.agentsTable { + width: 100% !important; +} +.agentsTable tbody tr:nth-child(even) { + background: hsla(230, 86%, 73%, 0.075); +} +.capabilities-container { + display: flex; + gap: 0; + align-items: center; + justify-content: center; + flex-wrap: wrap; +} +.capability-icon { + flex-shrink: 0; +} + +/* Mobile responsiveness */ +@media (max-width: 1200px) { +.v-card { + width: 100% !important; + padding: 0; + overflow-x: auto; +} +.agentsTable { + min-width: 1200px; +} +.agentsTable > .v-table__wrapper { + overflow-x: auto; +} +.agentsTable > .v-table__wrapper > table > thead > tr > th, + .agentsTable > .v-table__wrapper > table > tbody > tr > td { + padding-right: 4px; + padding-left: 4px; + font-size: 0.875rem; +} + + /* Keep host column always visible on mobile */ +.agentsTable > .v-table__wrapper > table > tbody > tr > td:nth-child(4) { + max-width: none !important; +} + + /* Keep state column always visible on mobile */ +.agentsTable > .v-table__wrapper > table > tbody > tr > td:nth-child(3) { + max-width: none !important; +} +.v-card-title { + padding: 8px 4px !important; +} +.v-text-field { + font-size: 0.875rem; +} + + /* Compact chips for mobile */ +.v-chip { + font-size: 0.7rem !important; + padding: 0 6px !important; + height: 22px !important; +} + + /* Compact buttons for mobile */ +.v-btn { + min-width: 26px !important; + height: 26px !important; +} +} + +.users-list .v-list-subheader { + font-size: 24px; + font-weight: 500; + color: #1976d2; /* Custom color */ + text-transform: uppercase; + padding: 10px 0; + margin-left: 20px; + margin-bottom: 10px; + border-bottom: 1px solid #1976d2; +} + +.v-row[data-v-1c840940] { + margin-top: 10px; + margin-bottom: 10px; + font-size: 1.2rem; +} + +.jdkConfigTable > .v-table__wrapper > table > thead > tr > th > .v-data-table-header__content{ + font-weight: bold; + text-align: center; + display: block; +} +.jdkConfigTable > .v-table__wrapper > table > tbody > .v-data-table__tr { + font-size: 1rem; + font-weight: 500; +} +.jdkConfigTable > .v-table__wrapper > table > tbody > tr > td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.jdkConfigTable tbody tr:nth-child(even) { + background: hsla(230, 86%, 73%, 0.075); +} +/* MaterialDesignIcons.com */ +@font-face { + font-family: "Material Design Icons"; + src: url("/assets/materialdesignicons-webfont-CSr8KVlo.eot?v=7.4.47"); + src: url("/assets/materialdesignicons-webfont-CSr8KVlo.eot?#iefix&v=7.4.47") format("embedded-opentype"), url("/assets/materialdesignicons-webfont-Dp5v-WZN.woff2?v=7.4.47") format("woff2"), url("/assets/materialdesignicons-webfont-PXm3-2wK.woff?v=7.4.47") format("woff"), url("/assets/materialdesignicons-webfont-B7mPwVP_.ttf?v=7.4.47") format("truetype"); + font-weight: normal; + font-style: normal; +} + +.mdi:before, +.mdi-set { + display: inline-block; + font: normal normal normal 24px/1 "Material Design Icons"; + font-size: inherit; + text-rendering: auto; + line-height: inherit; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.mdi-ab-testing::before { + content: "\F01C9"; +} + +.mdi-abacus::before { + content: "\F16E0"; +} + +.mdi-abjad-arabic::before { + content: "\F1328"; +} + +.mdi-abjad-hebrew::before { + content: "\F1329"; +} + +.mdi-abugida-devanagari::before { + content: "\F132A"; +} + +.mdi-abugida-thai::before { + content: "\F132B"; +} + +.mdi-access-point::before { + content: "\F0003"; +} + +.mdi-access-point-check::before { + content: "\F1538"; +} + +.mdi-access-point-minus::before { + content: "\F1539"; +} + +.mdi-access-point-network::before { + content: "\F0002"; +} + +.mdi-access-point-network-off::before { + content: "\F0BE1"; +} + +.mdi-access-point-off::before { + content: "\F1511"; +} + +.mdi-access-point-plus::before { + content: "\F153A"; +} + +.mdi-access-point-remove::before { + content: "\F153B"; +} + +.mdi-account::before { + content: "\F0004"; +} + +.mdi-account-alert::before { + content: "\F0005"; +} + +.mdi-account-alert-outline::before { + content: "\F0B50"; +} + +.mdi-account-arrow-down::before { + content: "\F1868"; +} + +.mdi-account-arrow-down-outline::before { + content: "\F1869"; +} + +.mdi-account-arrow-left::before { + content: "\F0B51"; +} + +.mdi-account-arrow-left-outline::before { + content: "\F0B52"; +} + +.mdi-account-arrow-right::before { + content: "\F0B53"; +} + +.mdi-account-arrow-right-outline::before { + content: "\F0B54"; +} + +.mdi-account-arrow-up::before { + content: "\F1867"; +} + +.mdi-account-arrow-up-outline::before { + content: "\F186A"; +} + +.mdi-account-badge::before { + content: "\F1B0A"; +} + +.mdi-account-badge-outline::before { + content: "\F1B0B"; +} + +.mdi-account-box::before { + content: "\F0006"; +} + +.mdi-account-box-edit-outline::before { + content: "\F1CC8"; +} + +.mdi-account-box-minus-outline::before { + content: "\F1CC9"; +} + +.mdi-account-box-multiple::before { + content: "\F0934"; +} + +.mdi-account-box-multiple-outline::before { + content: "\F100A"; +} + +.mdi-account-box-outline::before { + content: "\F0007"; +} + +.mdi-account-box-plus-outline::before { + content: "\F1CCA"; +} + +.mdi-account-cancel::before { + content: "\F12DF"; +} + +.mdi-account-cancel-outline::before { + content: "\F12E0"; +} + +.mdi-account-card::before { + content: "\F1BA4"; +} + +.mdi-account-card-outline::before { + content: "\F1BA5"; +} + +.mdi-account-cash::before { + content: "\F1097"; +} + +.mdi-account-cash-outline::before { + content: "\F1098"; +} + +.mdi-account-check::before { + content: "\F0008"; +} + +.mdi-account-check-outline::before { + content: "\F0BE2"; +} + +.mdi-account-child::before { + content: "\F0A89"; +} + +.mdi-account-child-circle::before { + content: "\F0A8A"; +} + +.mdi-account-child-outline::before { + content: "\F10C8"; +} + +.mdi-account-circle::before { + content: "\F0009"; +} + +.mdi-account-circle-outline::before { + content: "\F0B55"; +} + +.mdi-account-clock::before { + content: "\F0B56"; +} + +.mdi-account-clock-outline::before { + content: "\F0B57"; +} + +.mdi-account-cog::before { + content: "\F1370"; +} + +.mdi-account-cog-outline::before { + content: "\F1371"; +} + +.mdi-account-convert::before { + content: "\F000A"; +} + +.mdi-account-convert-outline::before { + content: "\F1301"; +} + +.mdi-account-cowboy-hat::before { + content: "\F0E9B"; +} + +.mdi-account-cowboy-hat-outline::before { + content: "\F17F3"; +} + +.mdi-account-credit-card::before { + content: "\F1BA6"; +} + +.mdi-account-credit-card-outline::before { + content: "\F1BA7"; +} + +.mdi-account-details::before { + content: "\F0631"; +} + +.mdi-account-details-outline::before { + content: "\F1372"; +} + +.mdi-account-edit::before { + content: "\F06BC"; +} + +.mdi-account-edit-outline::before { + content: "\F0FFB"; +} + +.mdi-account-eye::before { + content: "\F0420"; +} + +.mdi-account-eye-outline::before { + content: "\F127B"; +} + +.mdi-account-file::before { + content: "\F1CA7"; +} + +.mdi-account-file-outline::before { + content: "\F1CA8"; +} + +.mdi-account-file-text::before { + content: "\F1CA9"; +} + +.mdi-account-file-text-outline::before { + content: "\F1CAA"; +} + +.mdi-account-filter::before { + content: "\F0936"; +} + +.mdi-account-filter-outline::before { + content: "\F0F9D"; +} + +.mdi-account-group::before { + content: "\F0849"; +} + +.mdi-account-group-outline::before { + content: "\F0B58"; +} + +.mdi-account-hard-hat::before { + content: "\F05B5"; +} + +.mdi-account-hard-hat-outline::before { + content: "\F1A1F"; +} + +.mdi-account-heart::before { + content: "\F0899"; +} + +.mdi-account-heart-outline::before { + content: "\F0BE3"; +} + +.mdi-account-injury::before { + content: "\F1815"; +} + +.mdi-account-injury-outline::before { + content: "\F1816"; +} + +.mdi-account-key::before { + content: "\F000B"; +} + +.mdi-account-key-outline::before { + content: "\F0BE4"; +} + +.mdi-account-lock::before { + content: "\F115E"; +} + +.mdi-account-lock-open::before { + content: "\F1960"; +} + +.mdi-account-lock-open-outline::before { + content: "\F1961"; +} + +.mdi-account-lock-outline::before { + content: "\F115F"; +} + +.mdi-account-minus::before { + content: "\F000D"; +} + +.mdi-account-minus-outline::before { + content: "\F0AEC"; +} + +.mdi-account-multiple::before { + content: "\F000E"; +} + +.mdi-account-multiple-check::before { + content: "\F08C5"; +} + +.mdi-account-multiple-check-outline::before { + content: "\F11FE"; +} + +.mdi-account-multiple-minus::before { + content: "\F05D3"; +} + +.mdi-account-multiple-minus-outline::before { + content: "\F0BE5"; +} + +.mdi-account-multiple-outline::before { + content: "\F000F"; +} + +.mdi-account-multiple-plus::before { + content: "\F0010"; +} + +.mdi-account-multiple-plus-outline::before { + content: "\F0800"; +} + +.mdi-account-multiple-remove::before { + content: "\F120A"; +} + +.mdi-account-multiple-remove-outline::before { + content: "\F120B"; +} + +.mdi-account-music::before { + content: "\F0803"; +} + +.mdi-account-music-outline::before { + content: "\F0CE9"; +} + +.mdi-account-network::before { + content: "\F0011"; +} + +.mdi-account-network-off::before { + content: "\F1AF1"; +} + +.mdi-account-network-off-outline::before { + content: "\F1AF2"; +} + +.mdi-account-network-outline::before { + content: "\F0BE6"; +} + +.mdi-account-off::before { + content: "\F0012"; +} + +.mdi-account-off-outline::before { + content: "\F0BE7"; +} + +.mdi-account-outline::before { + content: "\F0013"; +} + +.mdi-account-plus::before { + content: "\F0014"; +} + +.mdi-account-plus-outline::before { + content: "\F0801"; +} + +.mdi-account-question::before { + content: "\F0B59"; +} + +.mdi-account-question-outline::before { + content: "\F0B5A"; +} + +.mdi-account-reactivate::before { + content: "\F152B"; +} + +.mdi-account-reactivate-outline::before { + content: "\F152C"; +} + +.mdi-account-remove::before { + content: "\F0015"; +} + +.mdi-account-remove-outline::before { + content: "\F0AED"; +} + +.mdi-account-school::before { + content: "\F1A20"; +} + +.mdi-account-school-outline::before { + content: "\F1A21"; +} + +.mdi-account-search::before { + content: "\F0016"; +} + +.mdi-account-search-outline::before { + content: "\F0935"; +} + +.mdi-account-settings::before { + content: "\F0630"; +} + +.mdi-account-settings-outline::before { + content: "\F10C9"; +} + +.mdi-account-star::before { + content: "\F0017"; +} + +.mdi-account-star-outline::before { + content: "\F0BE8"; +} + +.mdi-account-supervisor::before { + content: "\F0A8B"; +} + +.mdi-account-supervisor-circle::before { + content: "\F0A8C"; +} + +.mdi-account-supervisor-circle-outline::before { + content: "\F14EC"; +} + +.mdi-account-supervisor-outline::before { + content: "\F112D"; +} + +.mdi-account-switch::before { + content: "\F0019"; +} + +.mdi-account-switch-outline::before { + content: "\F04CB"; +} + +.mdi-account-sync::before { + content: "\F191B"; +} + +.mdi-account-sync-outline::before { + content: "\F191C"; +} + +.mdi-account-tag::before { + content: "\F1C1B"; +} + +.mdi-account-tag-outline::before { + content: "\F1C1C"; +} + +.mdi-account-tie::before { + content: "\F0CE3"; +} + +.mdi-account-tie-hat::before { + content: "\F1898"; +} + +.mdi-account-tie-hat-outline::before { + content: "\F1899"; +} + +.mdi-account-tie-outline::before { + content: "\F10CA"; +} + +.mdi-account-tie-voice::before { + content: "\F1308"; +} + +.mdi-account-tie-voice-off::before { + content: "\F130A"; +} + +.mdi-account-tie-voice-off-outline::before { + content: "\F130B"; +} + +.mdi-account-tie-voice-outline::before { + content: "\F1309"; +} + +.mdi-account-tie-woman::before { + content: "\F1A8C"; +} + +.mdi-account-voice::before { + content: "\F05CB"; +} + +.mdi-account-voice-off::before { + content: "\F0ED4"; +} + +.mdi-account-wrench::before { + content: "\F189A"; +} + +.mdi-account-wrench-outline::before { + content: "\F189B"; +} + +.mdi-adjust::before { + content: "\F001A"; +} + +.mdi-advertisements::before { + content: "\F192A"; +} + +.mdi-advertisements-off::before { + content: "\F192B"; +} + +.mdi-air-conditioner::before { + content: "\F001B"; +} + +.mdi-air-filter::before { + content: "\F0D43"; +} + +.mdi-air-horn::before { + content: "\F0DAC"; +} + +.mdi-air-humidifier::before { + content: "\F1099"; +} + +.mdi-air-humidifier-off::before { + content: "\F1466"; +} + +.mdi-air-purifier::before { + content: "\F0D44"; +} + +.mdi-air-purifier-off::before { + content: "\F1B57"; +} + +.mdi-airbag::before { + content: "\F0BE9"; +} + +.mdi-airballoon::before { + content: "\F001C"; +} + +.mdi-airballoon-outline::before { + content: "\F100B"; +} + +.mdi-airplane::before { + content: "\F001D"; +} + +.mdi-airplane-alert::before { + content: "\F187A"; +} + +.mdi-airplane-check::before { + content: "\F187B"; +} + +.mdi-airplane-clock::before { + content: "\F187C"; +} + +.mdi-airplane-cog::before { + content: "\F187D"; +} + +.mdi-airplane-edit::before { + content: "\F187E"; +} + +.mdi-airplane-landing::before { + content: "\F05D4"; +} + +.mdi-airplane-marker::before { + content: "\F187F"; +} + +.mdi-airplane-minus::before { + content: "\F1880"; +} + +.mdi-airplane-off::before { + content: "\F001E"; +} + +.mdi-airplane-plus::before { + content: "\F1881"; +} + +.mdi-airplane-remove::before { + content: "\F1882"; +} + +.mdi-airplane-search::before { + content: "\F1883"; +} + +.mdi-airplane-settings::before { + content: "\F1884"; +} + +.mdi-airplane-takeoff::before { + content: "\F05D5"; +} + +.mdi-airport::before { + content: "\F084B"; +} + +.mdi-alarm::before { + content: "\F0020"; +} + +.mdi-alarm-bell::before { + content: "\F078E"; +} + +.mdi-alarm-check::before { + content: "\F0021"; +} + +.mdi-alarm-light::before { + content: "\F078F"; +} + +.mdi-alarm-light-off::before { + content: "\F171E"; +} + +.mdi-alarm-light-off-outline::before { + content: "\F171F"; +} + +.mdi-alarm-light-outline::before { + content: "\F0BEA"; +} + +.mdi-alarm-multiple::before { + content: "\F0022"; +} + +.mdi-alarm-note::before { + content: "\F0E71"; +} + +.mdi-alarm-note-off::before { + content: "\F0E72"; +} + +.mdi-alarm-off::before { + content: "\F0023"; +} + +.mdi-alarm-panel::before { + content: "\F15C4"; +} + +.mdi-alarm-panel-outline::before { + content: "\F15C5"; +} + +.mdi-alarm-plus::before { + content: "\F0024"; +} + +.mdi-alarm-snooze::before { + content: "\F068E"; +} + +.mdi-album::before { + content: "\F0025"; +} + +.mdi-alert::before { + content: "\F0026"; +} + +.mdi-alert-box::before { + content: "\F0027"; +} + +.mdi-alert-box-outline::before { + content: "\F0CE4"; +} + +.mdi-alert-circle::before { + content: "\F0028"; +} + +.mdi-alert-circle-check::before { + content: "\F11ED"; +} + +.mdi-alert-circle-check-outline::before { + content: "\F11EE"; +} + +.mdi-alert-circle-outline::before { + content: "\F05D6"; +} + +.mdi-alert-decagram::before { + content: "\F06BD"; +} + +.mdi-alert-decagram-outline::before { + content: "\F0CE5"; +} + +.mdi-alert-minus::before { + content: "\F14BB"; +} + +.mdi-alert-minus-outline::before { + content: "\F14BE"; +} + +.mdi-alert-octagon::before { + content: "\F0029"; +} + +.mdi-alert-octagon-outline::before { + content: "\F0CE6"; +} + +.mdi-alert-octagram::before { + content: "\F0767"; +} + +.mdi-alert-octagram-outline::before { + content: "\F0CE7"; +} + +.mdi-alert-outline::before { + content: "\F002A"; +} + +.mdi-alert-plus::before { + content: "\F14BA"; +} + +.mdi-alert-plus-outline::before { + content: "\F14BD"; +} + +.mdi-alert-remove::before { + content: "\F14BC"; +} + +.mdi-alert-remove-outline::before { + content: "\F14BF"; +} + +.mdi-alert-rhombus::before { + content: "\F11CE"; +} + +.mdi-alert-rhombus-outline::before { + content: "\F11CF"; +} + +.mdi-alien::before { + content: "\F089A"; +} + +.mdi-alien-outline::before { + content: "\F10CB"; +} + +.mdi-align-horizontal-center::before { + content: "\F11C3"; +} + +.mdi-align-horizontal-distribute::before { + content: "\F1962"; +} + +.mdi-align-horizontal-left::before { + content: "\F11C2"; +} + +.mdi-align-horizontal-right::before { + content: "\F11C4"; +} + +.mdi-align-vertical-bottom::before { + content: "\F11C5"; +} + +.mdi-align-vertical-center::before { + content: "\F11C6"; +} + +.mdi-align-vertical-distribute::before { + content: "\F1963"; +} + +.mdi-align-vertical-top::before { + content: "\F11C7"; +} + +.mdi-all-inclusive::before { + content: "\F06BE"; +} + +.mdi-all-inclusive-box::before { + content: "\F188D"; +} + +.mdi-all-inclusive-box-outline::before { + content: "\F188E"; +} + +.mdi-allergy::before { + content: "\F1258"; +} + +.mdi-alpha::before { + content: "\F002B"; +} + +.mdi-alpha-a::before { + content: "\F0AEE"; +} + +.mdi-alpha-a-box::before { + content: "\F0B08"; +} + +.mdi-alpha-a-box-outline::before { + content: "\F0BEB"; +} + +.mdi-alpha-a-circle::before { + content: "\F0BEC"; +} + +.mdi-alpha-a-circle-outline::before { + content: "\F0BED"; +} + +.mdi-alpha-b::before { + content: "\F0AEF"; +} + +.mdi-alpha-b-box::before { + content: "\F0B09"; +} + +.mdi-alpha-b-box-outline::before { + content: "\F0BEE"; +} + +.mdi-alpha-b-circle::before { + content: "\F0BEF"; +} + +.mdi-alpha-b-circle-outline::before { + content: "\F0BF0"; +} + +.mdi-alpha-c::before { + content: "\F0AF0"; +} + +.mdi-alpha-c-box::before { + content: "\F0B0A"; +} + +.mdi-alpha-c-box-outline::before { + content: "\F0BF1"; +} + +.mdi-alpha-c-circle::before { + content: "\F0BF2"; +} + +.mdi-alpha-c-circle-outline::before { + content: "\F0BF3"; +} + +.mdi-alpha-d::before { + content: "\F0AF1"; +} + +.mdi-alpha-d-box::before { + content: "\F0B0B"; +} + +.mdi-alpha-d-box-outline::before { + content: "\F0BF4"; +} + +.mdi-alpha-d-circle::before { + content: "\F0BF5"; +} + +.mdi-alpha-d-circle-outline::before { + content: "\F0BF6"; +} + +.mdi-alpha-e::before { + content: "\F0AF2"; +} + +.mdi-alpha-e-box::before { + content: "\F0B0C"; +} + +.mdi-alpha-e-box-outline::before { + content: "\F0BF7"; +} + +.mdi-alpha-e-circle::before { + content: "\F0BF8"; +} + +.mdi-alpha-e-circle-outline::before { + content: "\F0BF9"; +} + +.mdi-alpha-f::before { + content: "\F0AF3"; +} + +.mdi-alpha-f-box::before { + content: "\F0B0D"; +} + +.mdi-alpha-f-box-outline::before { + content: "\F0BFA"; +} + +.mdi-alpha-f-circle::before { + content: "\F0BFB"; +} + +.mdi-alpha-f-circle-outline::before { + content: "\F0BFC"; +} + +.mdi-alpha-g::before { + content: "\F0AF4"; +} + +.mdi-alpha-g-box::before { + content: "\F0B0E"; +} + +.mdi-alpha-g-box-outline::before { + content: "\F0BFD"; +} + +.mdi-alpha-g-circle::before { + content: "\F0BFE"; +} + +.mdi-alpha-g-circle-outline::before { + content: "\F0BFF"; +} + +.mdi-alpha-h::before { + content: "\F0AF5"; +} + +.mdi-alpha-h-box::before { + content: "\F0B0F"; +} + +.mdi-alpha-h-box-outline::before { + content: "\F0C00"; +} + +.mdi-alpha-h-circle::before { + content: "\F0C01"; +} + +.mdi-alpha-h-circle-outline::before { + content: "\F0C02"; +} + +.mdi-alpha-i::before { + content: "\F0AF6"; +} + +.mdi-alpha-i-box::before { + content: "\F0B10"; +} + +.mdi-alpha-i-box-outline::before { + content: "\F0C03"; +} + +.mdi-alpha-i-circle::before { + content: "\F0C04"; +} + +.mdi-alpha-i-circle-outline::before { + content: "\F0C05"; +} + +.mdi-alpha-j::before { + content: "\F0AF7"; +} + +.mdi-alpha-j-box::before { + content: "\F0B11"; +} + +.mdi-alpha-j-box-outline::before { + content: "\F0C06"; +} + +.mdi-alpha-j-circle::before { + content: "\F0C07"; +} + +.mdi-alpha-j-circle-outline::before { + content: "\F0C08"; +} + +.mdi-alpha-k::before { + content: "\F0AF8"; +} + +.mdi-alpha-k-box::before { + content: "\F0B12"; +} + +.mdi-alpha-k-box-outline::before { + content: "\F0C09"; +} + +.mdi-alpha-k-circle::before { + content: "\F0C0A"; +} + +.mdi-alpha-k-circle-outline::before { + content: "\F0C0B"; +} + +.mdi-alpha-l::before { + content: "\F0AF9"; +} + +.mdi-alpha-l-box::before { + content: "\F0B13"; +} + +.mdi-alpha-l-box-outline::before { + content: "\F0C0C"; +} + +.mdi-alpha-l-circle::before { + content: "\F0C0D"; +} + +.mdi-alpha-l-circle-outline::before { + content: "\F0C0E"; +} + +.mdi-alpha-m::before { + content: "\F0AFA"; +} + +.mdi-alpha-m-box::before { + content: "\F0B14"; +} + +.mdi-alpha-m-box-outline::before { + content: "\F0C0F"; +} + +.mdi-alpha-m-circle::before { + content: "\F0C10"; +} + +.mdi-alpha-m-circle-outline::before { + content: "\F0C11"; +} + +.mdi-alpha-n::before { + content: "\F0AFB"; +} + +.mdi-alpha-n-box::before { + content: "\F0B15"; +} + +.mdi-alpha-n-box-outline::before { + content: "\F0C12"; +} + +.mdi-alpha-n-circle::before { + content: "\F0C13"; +} + +.mdi-alpha-n-circle-outline::before { + content: "\F0C14"; +} + +.mdi-alpha-o::before { + content: "\F0AFC"; +} + +.mdi-alpha-o-box::before { + content: "\F0B16"; +} + +.mdi-alpha-o-box-outline::before { + content: "\F0C15"; +} + +.mdi-alpha-o-circle::before { + content: "\F0C16"; +} + +.mdi-alpha-o-circle-outline::before { + content: "\F0C17"; +} + +.mdi-alpha-p::before { + content: "\F0AFD"; +} + +.mdi-alpha-p-box::before { + content: "\F0B17"; +} + +.mdi-alpha-p-box-outline::before { + content: "\F0C18"; +} + +.mdi-alpha-p-circle::before { + content: "\F0C19"; +} + +.mdi-alpha-p-circle-outline::before { + content: "\F0C1A"; +} + +.mdi-alpha-q::before { + content: "\F0AFE"; +} + +.mdi-alpha-q-box::before { + content: "\F0B18"; +} + +.mdi-alpha-q-box-outline::before { + content: "\F0C1B"; +} + +.mdi-alpha-q-circle::before { + content: "\F0C1C"; +} + +.mdi-alpha-q-circle-outline::before { + content: "\F0C1D"; +} + +.mdi-alpha-r::before { + content: "\F0AFF"; +} + +.mdi-alpha-r-box::before { + content: "\F0B19"; +} + +.mdi-alpha-r-box-outline::before { + content: "\F0C1E"; +} + +.mdi-alpha-r-circle::before { + content: "\F0C1F"; +} + +.mdi-alpha-r-circle-outline::before { + content: "\F0C20"; +} + +.mdi-alpha-s::before { + content: "\F0B00"; +} + +.mdi-alpha-s-box::before { + content: "\F0B1A"; +} + +.mdi-alpha-s-box-outline::before { + content: "\F0C21"; +} + +.mdi-alpha-s-circle::before { + content: "\F0C22"; +} + +.mdi-alpha-s-circle-outline::before { + content: "\F0C23"; +} + +.mdi-alpha-t::before { + content: "\F0B01"; +} + +.mdi-alpha-t-box::before { + content: "\F0B1B"; +} + +.mdi-alpha-t-box-outline::before { + content: "\F0C24"; +} + +.mdi-alpha-t-circle::before { + content: "\F0C25"; +} + +.mdi-alpha-t-circle-outline::before { + content: "\F0C26"; +} + +.mdi-alpha-u::before { + content: "\F0B02"; +} + +.mdi-alpha-u-box::before { + content: "\F0B1C"; +} + +.mdi-alpha-u-box-outline::before { + content: "\F0C27"; +} + +.mdi-alpha-u-circle::before { + content: "\F0C28"; +} + +.mdi-alpha-u-circle-outline::before { + content: "\F0C29"; +} + +.mdi-alpha-v::before { + content: "\F0B03"; +} + +.mdi-alpha-v-box::before { + content: "\F0B1D"; +} + +.mdi-alpha-v-box-outline::before { + content: "\F0C2A"; +} + +.mdi-alpha-v-circle::before { + content: "\F0C2B"; +} + +.mdi-alpha-v-circle-outline::before { + content: "\F0C2C"; +} + +.mdi-alpha-w::before { + content: "\F0B04"; +} + +.mdi-alpha-w-box::before { + content: "\F0B1E"; +} + +.mdi-alpha-w-box-outline::before { + content: "\F0C2D"; +} + +.mdi-alpha-w-circle::before { + content: "\F0C2E"; +} + +.mdi-alpha-w-circle-outline::before { + content: "\F0C2F"; +} + +.mdi-alpha-x::before { + content: "\F0B05"; +} + +.mdi-alpha-x-box::before { + content: "\F0B1F"; +} + +.mdi-alpha-x-box-outline::before { + content: "\F0C30"; +} + +.mdi-alpha-x-circle::before { + content: "\F0C31"; +} + +.mdi-alpha-x-circle-outline::before { + content: "\F0C32"; +} + +.mdi-alpha-y::before { + content: "\F0B06"; +} + +.mdi-alpha-y-box::before { + content: "\F0B20"; +} + +.mdi-alpha-y-box-outline::before { + content: "\F0C33"; +} + +.mdi-alpha-y-circle::before { + content: "\F0C34"; +} + +.mdi-alpha-y-circle-outline::before { + content: "\F0C35"; +} + +.mdi-alpha-z::before { + content: "\F0B07"; +} + +.mdi-alpha-z-box::before { + content: "\F0B21"; +} + +.mdi-alpha-z-box-outline::before { + content: "\F0C36"; +} + +.mdi-alpha-z-circle::before { + content: "\F0C37"; +} + +.mdi-alpha-z-circle-outline::before { + content: "\F0C38"; +} + +.mdi-alphabet-aurebesh::before { + content: "\F132C"; +} + +.mdi-alphabet-cyrillic::before { + content: "\F132D"; +} + +.mdi-alphabet-greek::before { + content: "\F132E"; +} + +.mdi-alphabet-latin::before { + content: "\F132F"; +} + +.mdi-alphabet-piqad::before { + content: "\F1330"; +} + +.mdi-alphabet-tengwar::before { + content: "\F1337"; +} + +.mdi-alphabetical::before { + content: "\F002C"; +} + +.mdi-alphabetical-off::before { + content: "\F100C"; +} + +.mdi-alphabetical-variant::before { + content: "\F100D"; +} + +.mdi-alphabetical-variant-off::before { + content: "\F100E"; +} + +.mdi-altimeter::before { + content: "\F05D7"; +} + +.mdi-ambulance::before { + content: "\F002F"; +} + +.mdi-ammunition::before { + content: "\F0CE8"; +} + +.mdi-ampersand::before { + content: "\F0A8D"; +} + +.mdi-amplifier::before { + content: "\F0030"; +} + +.mdi-amplifier-off::before { + content: "\F11B5"; +} + +.mdi-anchor::before { + content: "\F0031"; +} + +.mdi-android::before { + content: "\F0032"; +} + +.mdi-android-studio::before { + content: "\F0034"; +} + +.mdi-angle-acute::before { + content: "\F0937"; +} + +.mdi-angle-obtuse::before { + content: "\F0938"; +} + +.mdi-angle-right::before { + content: "\F0939"; +} + +.mdi-angular::before { + content: "\F06B2"; +} + +.mdi-angularjs::before { + content: "\F06BF"; +} + +.mdi-animation::before { + content: "\F05D8"; +} + +.mdi-animation-outline::before { + content: "\F0A8F"; +} + +.mdi-animation-play::before { + content: "\F093A"; +} + +.mdi-animation-play-outline::before { + content: "\F0A90"; +} + +.mdi-ansible::before { + content: "\F109A"; +} + +.mdi-antenna::before { + content: "\F1119"; +} + +.mdi-anvil::before { + content: "\F089B"; +} + +.mdi-apache-kafka::before { + content: "\F100F"; +} + +.mdi-api::before { + content: "\F109B"; +} + +.mdi-api-off::before { + content: "\F1257"; +} + +.mdi-apple::before { + content: "\F0035"; +} + +.mdi-apple-finder::before { + content: "\F0036"; +} + +.mdi-apple-icloud::before { + content: "\F0038"; +} + +.mdi-apple-ios::before { + content: "\F0037"; +} + +.mdi-apple-keyboard-caps::before { + content: "\F0632"; +} + +.mdi-apple-keyboard-command::before { + content: "\F0633"; +} + +.mdi-apple-keyboard-control::before { + content: "\F0634"; +} + +.mdi-apple-keyboard-option::before { + content: "\F0635"; +} + +.mdi-apple-keyboard-shift::before { + content: "\F0636"; +} + +.mdi-apple-safari::before { + content: "\F0039"; +} + +.mdi-application::before { + content: "\F08C6"; +} + +.mdi-application-array::before { + content: "\F10F5"; +} + +.mdi-application-array-outline::before { + content: "\F10F6"; +} + +.mdi-application-braces::before { + content: "\F10F7"; +} + +.mdi-application-braces-outline::before { + content: "\F10F8"; +} + +.mdi-application-brackets::before { + content: "\F0C8B"; +} + +.mdi-application-brackets-outline::before { + content: "\F0C8C"; +} + +.mdi-application-cog::before { + content: "\F0675"; +} + +.mdi-application-cog-outline::before { + content: "\F1577"; +} + +.mdi-application-edit::before { + content: "\F00AE"; +} + +.mdi-application-edit-outline::before { + content: "\F0619"; +} + +.mdi-application-export::before { + content: "\F0DAD"; +} + +.mdi-application-import::before { + content: "\F0DAE"; +} + +.mdi-application-outline::before { + content: "\F0614"; +} + +.mdi-application-parentheses::before { + content: "\F10F9"; +} + +.mdi-application-parentheses-outline::before { + content: "\F10FA"; +} + +.mdi-application-settings::before { + content: "\F0B60"; +} + +.mdi-application-settings-outline::before { + content: "\F1555"; +} + +.mdi-application-variable::before { + content: "\F10FB"; +} + +.mdi-application-variable-outline::before { + content: "\F10FC"; +} + +.mdi-approximately-equal::before { + content: "\F0F9E"; +} + +.mdi-approximately-equal-box::before { + content: "\F0F9F"; +} + +.mdi-apps::before { + content: "\F003B"; +} + +.mdi-apps-box::before { + content: "\F0D46"; +} + +.mdi-arch::before { + content: "\F08C7"; +} + +.mdi-archive::before { + content: "\F003C"; +} + +.mdi-archive-alert::before { + content: "\F14FD"; +} + +.mdi-archive-alert-outline::before { + content: "\F14FE"; +} + +.mdi-archive-arrow-down::before { + content: "\F1259"; +} + +.mdi-archive-arrow-down-outline::before { + content: "\F125A"; +} + +.mdi-archive-arrow-up::before { + content: "\F125B"; +} + +.mdi-archive-arrow-up-outline::before { + content: "\F125C"; +} + +.mdi-archive-cancel::before { + content: "\F174B"; +} + +.mdi-archive-cancel-outline::before { + content: "\F174C"; +} + +.mdi-archive-check::before { + content: "\F174D"; +} + +.mdi-archive-check-outline::before { + content: "\F174E"; +} + +.mdi-archive-clock::before { + content: "\F174F"; +} + +.mdi-archive-clock-outline::before { + content: "\F1750"; +} + +.mdi-archive-cog::before { + content: "\F1751"; +} + +.mdi-archive-cog-outline::before { + content: "\F1752"; +} + +.mdi-archive-edit::before { + content: "\F1753"; +} + +.mdi-archive-edit-outline::before { + content: "\F1754"; +} + +.mdi-archive-eye::before { + content: "\F1755"; +} + +.mdi-archive-eye-outline::before { + content: "\F1756"; +} + +.mdi-archive-lock::before { + content: "\F1757"; +} + +.mdi-archive-lock-open::before { + content: "\F1758"; +} + +.mdi-archive-lock-open-outline::before { + content: "\F1759"; +} + +.mdi-archive-lock-outline::before { + content: "\F175A"; +} + +.mdi-archive-marker::before { + content: "\F175B"; +} + +.mdi-archive-marker-outline::before { + content: "\F175C"; +} + +.mdi-archive-minus::before { + content: "\F175D"; +} + +.mdi-archive-minus-outline::before { + content: "\F175E"; +} + +.mdi-archive-music::before { + content: "\F175F"; +} + +.mdi-archive-music-outline::before { + content: "\F1760"; +} + +.mdi-archive-off::before { + content: "\F1761"; +} + +.mdi-archive-off-outline::before { + content: "\F1762"; +} + +.mdi-archive-outline::before { + content: "\F120E"; +} + +.mdi-archive-plus::before { + content: "\F1763"; +} + +.mdi-archive-plus-outline::before { + content: "\F1764"; +} + +.mdi-archive-refresh::before { + content: "\F1765"; +} + +.mdi-archive-refresh-outline::before { + content: "\F1766"; +} + +.mdi-archive-remove::before { + content: "\F1767"; +} + +.mdi-archive-remove-outline::before { + content: "\F1768"; +} + +.mdi-archive-search::before { + content: "\F1769"; +} + +.mdi-archive-search-outline::before { + content: "\F176A"; +} + +.mdi-archive-settings::before { + content: "\F176B"; +} + +.mdi-archive-settings-outline::before { + content: "\F176C"; +} + +.mdi-archive-star::before { + content: "\F176D"; +} + +.mdi-archive-star-outline::before { + content: "\F176E"; +} + +.mdi-archive-sync::before { + content: "\F176F"; +} + +.mdi-archive-sync-outline::before { + content: "\F1770"; +} + +.mdi-arm-flex::before { + content: "\F0FD7"; +} + +.mdi-arm-flex-outline::before { + content: "\F0FD6"; +} + +.mdi-arrange-bring-forward::before { + content: "\F003D"; +} + +.mdi-arrange-bring-to-front::before { + content: "\F003E"; +} + +.mdi-arrange-send-backward::before { + content: "\F003F"; +} + +.mdi-arrange-send-to-back::before { + content: "\F0040"; +} + +.mdi-arrow-all::before { + content: "\F0041"; +} + +.mdi-arrow-bottom-left::before { + content: "\F0042"; +} + +.mdi-arrow-bottom-left-bold-box::before { + content: "\F1964"; +} + +.mdi-arrow-bottom-left-bold-box-outline::before { + content: "\F1965"; +} + +.mdi-arrow-bottom-left-bold-outline::before { + content: "\F09B7"; +} + +.mdi-arrow-bottom-left-thick::before { + content: "\F09B8"; +} + +.mdi-arrow-bottom-left-thin::before { + content: "\F19B6"; +} + +.mdi-arrow-bottom-left-thin-circle-outline::before { + content: "\F1596"; +} + +.mdi-arrow-bottom-right::before { + content: "\F0043"; +} + +.mdi-arrow-bottom-right-bold-box::before { + content: "\F1966"; +} + +.mdi-arrow-bottom-right-bold-box-outline::before { + content: "\F1967"; +} + +.mdi-arrow-bottom-right-bold-outline::before { + content: "\F09B9"; +} + +.mdi-arrow-bottom-right-thick::before { + content: "\F09BA"; +} + +.mdi-arrow-bottom-right-thin::before { + content: "\F19B7"; +} + +.mdi-arrow-bottom-right-thin-circle-outline::before { + content: "\F1595"; +} + +.mdi-arrow-collapse::before { + content: "\F0615"; +} + +.mdi-arrow-collapse-all::before { + content: "\F0044"; +} + +.mdi-arrow-collapse-down::before { + content: "\F0792"; +} + +.mdi-arrow-collapse-horizontal::before { + content: "\F084C"; +} + +.mdi-arrow-collapse-left::before { + content: "\F0793"; +} + +.mdi-arrow-collapse-right::before { + content: "\F0794"; +} + +.mdi-arrow-collapse-up::before { + content: "\F0795"; +} + +.mdi-arrow-collapse-vertical::before { + content: "\F084D"; +} + +.mdi-arrow-decision::before { + content: "\F09BB"; +} + +.mdi-arrow-decision-auto::before { + content: "\F09BC"; +} + +.mdi-arrow-decision-auto-outline::before { + content: "\F09BD"; +} + +.mdi-arrow-decision-outline::before { + content: "\F09BE"; +} + +.mdi-arrow-down::before { + content: "\F0045"; +} + +.mdi-arrow-down-bold::before { + content: "\F072E"; +} + +.mdi-arrow-down-bold-box::before { + content: "\F072F"; +} + +.mdi-arrow-down-bold-box-outline::before { + content: "\F0730"; +} + +.mdi-arrow-down-bold-circle::before { + content: "\F0047"; +} + +.mdi-arrow-down-bold-circle-outline::before { + content: "\F0048"; +} + +.mdi-arrow-down-bold-hexagon-outline::before { + content: "\F0049"; +} + +.mdi-arrow-down-bold-outline::before { + content: "\F09BF"; +} + +.mdi-arrow-down-box::before { + content: "\F06C0"; +} + +.mdi-arrow-down-circle::before { + content: "\F0CDB"; +} + +.mdi-arrow-down-circle-outline::before { + content: "\F0CDC"; +} + +.mdi-arrow-down-drop-circle::before { + content: "\F004A"; +} + +.mdi-arrow-down-drop-circle-outline::before { + content: "\F004B"; +} + +.mdi-arrow-down-left::before { + content: "\F17A1"; +} + +.mdi-arrow-down-left-bold::before { + content: "\F17A2"; +} + +.mdi-arrow-down-right::before { + content: "\F17A3"; +} + +.mdi-arrow-down-right-bold::before { + content: "\F17A4"; +} + +.mdi-arrow-down-thick::before { + content: "\F0046"; +} + +.mdi-arrow-down-thin::before { + content: "\F19B3"; +} + +.mdi-arrow-down-thin-circle-outline::before { + content: "\F1599"; +} + +.mdi-arrow-expand::before { + content: "\F0616"; +} + +.mdi-arrow-expand-all::before { + content: "\F004C"; +} + +.mdi-arrow-expand-down::before { + content: "\F0796"; +} + +.mdi-arrow-expand-horizontal::before { + content: "\F084E"; +} + +.mdi-arrow-expand-left::before { + content: "\F0797"; +} + +.mdi-arrow-expand-right::before { + content: "\F0798"; +} + +.mdi-arrow-expand-up::before { + content: "\F0799"; +} + +.mdi-arrow-expand-vertical::before { + content: "\F084F"; +} + +.mdi-arrow-horizontal-lock::before { + content: "\F115B"; +} + +.mdi-arrow-left::before { + content: "\F004D"; +} + +.mdi-arrow-left-bold::before { + content: "\F0731"; +} + +.mdi-arrow-left-bold-box::before { + content: "\F0732"; +} + +.mdi-arrow-left-bold-box-outline::before { + content: "\F0733"; +} + +.mdi-arrow-left-bold-circle::before { + content: "\F004F"; +} + +.mdi-arrow-left-bold-circle-outline::before { + content: "\F0050"; +} + +.mdi-arrow-left-bold-hexagon-outline::before { + content: "\F0051"; +} + +.mdi-arrow-left-bold-outline::before { + content: "\F09C0"; +} + +.mdi-arrow-left-bottom::before { + content: "\F17A5"; +} + +.mdi-arrow-left-bottom-bold::before { + content: "\F17A6"; +} + +.mdi-arrow-left-box::before { + content: "\F06C1"; +} + +.mdi-arrow-left-circle::before { + content: "\F0CDD"; +} + +.mdi-arrow-left-circle-outline::before { + content: "\F0CDE"; +} + +.mdi-arrow-left-drop-circle::before { + content: "\F0052"; +} + +.mdi-arrow-left-drop-circle-outline::before { + content: "\F0053"; +} + +.mdi-arrow-left-right::before { + content: "\F0E73"; +} + +.mdi-arrow-left-right-bold::before { + content: "\F0E74"; +} + +.mdi-arrow-left-right-bold-outline::before { + content: "\F09C1"; +} + +.mdi-arrow-left-thick::before { + content: "\F004E"; +} + +.mdi-arrow-left-thin::before { + content: "\F19B1"; +} + +.mdi-arrow-left-thin-circle-outline::before { + content: "\F159A"; +} + +.mdi-arrow-left-top::before { + content: "\F17A7"; +} + +.mdi-arrow-left-top-bold::before { + content: "\F17A8"; +} + +.mdi-arrow-oscillating::before { + content: "\F1C91"; +} + +.mdi-arrow-oscillating-off::before { + content: "\F1C92"; +} + +.mdi-arrow-projectile::before { + content: "\F1840"; +} + +.mdi-arrow-projectile-multiple::before { + content: "\F183F"; +} + +.mdi-arrow-right::before { + content: "\F0054"; +} + +.mdi-arrow-right-bold::before { + content: "\F0734"; +} + +.mdi-arrow-right-bold-box::before { + content: "\F0735"; +} + +.mdi-arrow-right-bold-box-outline::before { + content: "\F0736"; +} + +.mdi-arrow-right-bold-circle::before { + content: "\F0056"; +} + +.mdi-arrow-right-bold-circle-outline::before { + content: "\F0057"; +} + +.mdi-arrow-right-bold-hexagon-outline::before { + content: "\F0058"; +} + +.mdi-arrow-right-bold-outline::before { + content: "\F09C2"; +} + +.mdi-arrow-right-bottom::before { + content: "\F17A9"; +} + +.mdi-arrow-right-bottom-bold::before { + content: "\F17AA"; +} + +.mdi-arrow-right-box::before { + content: "\F06C2"; +} + +.mdi-arrow-right-circle::before { + content: "\F0CDF"; +} + +.mdi-arrow-right-circle-outline::before { + content: "\F0CE0"; +} + +.mdi-arrow-right-drop-circle::before { + content: "\F0059"; +} + +.mdi-arrow-right-drop-circle-outline::before { + content: "\F005A"; +} + +.mdi-arrow-right-thick::before { + content: "\F0055"; +} + +.mdi-arrow-right-thin::before { + content: "\F19B0"; +} + +.mdi-arrow-right-thin-circle-outline::before { + content: "\F1598"; +} + +.mdi-arrow-right-top::before { + content: "\F17AB"; +} + +.mdi-arrow-right-top-bold::before { + content: "\F17AC"; +} + +.mdi-arrow-split-horizontal::before { + content: "\F093B"; +} + +.mdi-arrow-split-vertical::before { + content: "\F093C"; +} + +.mdi-arrow-top-left::before { + content: "\F005B"; +} + +.mdi-arrow-top-left-bold-box::before { + content: "\F1968"; +} + +.mdi-arrow-top-left-bold-box-outline::before { + content: "\F1969"; +} + +.mdi-arrow-top-left-bold-outline::before { + content: "\F09C3"; +} + +.mdi-arrow-top-left-bottom-right::before { + content: "\F0E75"; +} + +.mdi-arrow-top-left-bottom-right-bold::before { + content: "\F0E76"; +} + +.mdi-arrow-top-left-thick::before { + content: "\F09C4"; +} + +.mdi-arrow-top-left-thin::before { + content: "\F19B5"; +} + +.mdi-arrow-top-left-thin-circle-outline::before { + content: "\F1593"; +} + +.mdi-arrow-top-right::before { + content: "\F005C"; +} + +.mdi-arrow-top-right-bold-box::before { + content: "\F196A"; +} + +.mdi-arrow-top-right-bold-box-outline::before { + content: "\F196B"; +} + +.mdi-arrow-top-right-bold-outline::before { + content: "\F09C5"; +} + +.mdi-arrow-top-right-bottom-left::before { + content: "\F0E77"; +} + +.mdi-arrow-top-right-bottom-left-bold::before { + content: "\F0E78"; +} + +.mdi-arrow-top-right-thick::before { + content: "\F09C6"; +} + +.mdi-arrow-top-right-thin::before { + content: "\F19B4"; +} + +.mdi-arrow-top-right-thin-circle-outline::before { + content: "\F1594"; +} + +.mdi-arrow-u-down-left::before { + content: "\F17AD"; +} + +.mdi-arrow-u-down-left-bold::before { + content: "\F17AE"; +} + +.mdi-arrow-u-down-right::before { + content: "\F17AF"; +} + +.mdi-arrow-u-down-right-bold::before { + content: "\F17B0"; +} + +.mdi-arrow-u-left-bottom::before { + content: "\F17B1"; +} + +.mdi-arrow-u-left-bottom-bold::before { + content: "\F17B2"; +} + +.mdi-arrow-u-left-top::before { + content: "\F17B3"; +} + +.mdi-arrow-u-left-top-bold::before { + content: "\F17B4"; +} + +.mdi-arrow-u-right-bottom::before { + content: "\F17B5"; +} + +.mdi-arrow-u-right-bottom-bold::before { + content: "\F17B6"; +} + +.mdi-arrow-u-right-top::before { + content: "\F17B7"; +} + +.mdi-arrow-u-right-top-bold::before { + content: "\F17B8"; +} + +.mdi-arrow-u-up-left::before { + content: "\F17B9"; +} + +.mdi-arrow-u-up-left-bold::before { + content: "\F17BA"; +} + +.mdi-arrow-u-up-right::before { + content: "\F17BB"; +} + +.mdi-arrow-u-up-right-bold::before { + content: "\F17BC"; +} + +.mdi-arrow-up::before { + content: "\F005D"; +} + +.mdi-arrow-up-bold::before { + content: "\F0737"; +} + +.mdi-arrow-up-bold-box::before { + content: "\F0738"; +} + +.mdi-arrow-up-bold-box-outline::before { + content: "\F0739"; +} + +.mdi-arrow-up-bold-circle::before { + content: "\F005F"; +} + +.mdi-arrow-up-bold-circle-outline::before { + content: "\F0060"; +} + +.mdi-arrow-up-bold-hexagon-outline::before { + content: "\F0061"; +} + +.mdi-arrow-up-bold-outline::before { + content: "\F09C7"; +} + +.mdi-arrow-up-box::before { + content: "\F06C3"; +} + +.mdi-arrow-up-circle::before { + content: "\F0CE1"; +} + +.mdi-arrow-up-circle-outline::before { + content: "\F0CE2"; +} + +.mdi-arrow-up-down::before { + content: "\F0E79"; +} + +.mdi-arrow-up-down-bold::before { + content: "\F0E7A"; +} + +.mdi-arrow-up-down-bold-outline::before { + content: "\F09C8"; +} + +.mdi-arrow-up-drop-circle::before { + content: "\F0062"; +} + +.mdi-arrow-up-drop-circle-outline::before { + content: "\F0063"; +} + +.mdi-arrow-up-left::before { + content: "\F17BD"; +} + +.mdi-arrow-up-left-bold::before { + content: "\F17BE"; +} + +.mdi-arrow-up-right::before { + content: "\F17BF"; +} + +.mdi-arrow-up-right-bold::before { + content: "\F17C0"; +} + +.mdi-arrow-up-thick::before { + content: "\F005E"; +} + +.mdi-arrow-up-thin::before { + content: "\F19B2"; +} + +.mdi-arrow-up-thin-circle-outline::before { + content: "\F1597"; +} + +.mdi-arrow-vertical-lock::before { + content: "\F115C"; +} + +.mdi-artboard::before { + content: "\F1B9A"; +} + +.mdi-artstation::before { + content: "\F0B5B"; +} + +.mdi-aspect-ratio::before { + content: "\F0A24"; +} + +.mdi-assistant::before { + content: "\F0064"; +} + +.mdi-asterisk::before { + content: "\F06C4"; +} + +.mdi-asterisk-circle-outline::before { + content: "\F1A27"; +} + +.mdi-at::before { + content: "\F0065"; +} + +.mdi-atlassian::before { + content: "\F0804"; +} + +.mdi-atm::before { + content: "\F0D47"; +} + +.mdi-atom::before { + content: "\F0768"; +} + +.mdi-atom-variant::before { + content: "\F0E7B"; +} + +.mdi-attachment::before { + content: "\F0066"; +} + +.mdi-attachment-check::before { + content: "\F1AC1"; +} + +.mdi-attachment-lock::before { + content: "\F19C4"; +} + +.mdi-attachment-minus::before { + content: "\F1AC2"; +} + +.mdi-attachment-off::before { + content: "\F1AC3"; +} + +.mdi-attachment-plus::before { + content: "\F1AC4"; +} + +.mdi-attachment-remove::before { + content: "\F1AC5"; +} + +.mdi-atv::before { + content: "\F1B70"; +} + +.mdi-audio-input-rca::before { + content: "\F186B"; +} + +.mdi-audio-input-stereo-minijack::before { + content: "\F186C"; +} + +.mdi-audio-input-xlr::before { + content: "\F186D"; +} + +.mdi-audio-video::before { + content: "\F093D"; +} + +.mdi-audio-video-off::before { + content: "\F11B6"; +} + +.mdi-augmented-reality::before { + content: "\F0850"; +} + +.mdi-aurora::before { + content: "\F1BB9"; +} + +.mdi-auto-download::before { + content: "\F137E"; +} + +.mdi-auto-fix::before { + content: "\F0068"; +} + +.mdi-auto-mode::before { + content: "\F1C20"; +} + +.mdi-auto-upload::before { + content: "\F0069"; +} + +.mdi-autorenew::before { + content: "\F006A"; +} + +.mdi-autorenew-off::before { + content: "\F19E7"; +} + +.mdi-av-timer::before { + content: "\F006B"; +} + +.mdi-awning::before { + content: "\F1B87"; +} + +.mdi-awning-outline::before { + content: "\F1B88"; +} + +.mdi-aws::before { + content: "\F0E0F"; +} + +.mdi-axe::before { + content: "\F08C8"; +} + +.mdi-axe-battle::before { + content: "\F1842"; +} + +.mdi-axis::before { + content: "\F0D48"; +} + +.mdi-axis-arrow::before { + content: "\F0D49"; +} + +.mdi-axis-arrow-info::before { + content: "\F140E"; +} + +.mdi-axis-arrow-lock::before { + content: "\F0D4A"; +} + +.mdi-axis-lock::before { + content: "\F0D4B"; +} + +.mdi-axis-x-arrow::before { + content: "\F0D4C"; +} + +.mdi-axis-x-arrow-lock::before { + content: "\F0D4D"; +} + +.mdi-axis-x-rotate-clockwise::before { + content: "\F0D4E"; +} + +.mdi-axis-x-rotate-counterclockwise::before { + content: "\F0D4F"; +} + +.mdi-axis-x-y-arrow-lock::before { + content: "\F0D50"; +} + +.mdi-axis-y-arrow::before { + content: "\F0D51"; +} + +.mdi-axis-y-arrow-lock::before { + content: "\F0D52"; +} + +.mdi-axis-y-rotate-clockwise::before { + content: "\F0D53"; +} + +.mdi-axis-y-rotate-counterclockwise::before { + content: "\F0D54"; +} + +.mdi-axis-z-arrow::before { + content: "\F0D55"; +} + +.mdi-axis-z-arrow-lock::before { + content: "\F0D56"; +} + +.mdi-axis-z-rotate-clockwise::before { + content: "\F0D57"; +} + +.mdi-axis-z-rotate-counterclockwise::before { + content: "\F0D58"; +} + +.mdi-babel::before { + content: "\F0A25"; +} + +.mdi-baby::before { + content: "\F006C"; +} + +.mdi-baby-bottle::before { + content: "\F0F39"; +} + +.mdi-baby-bottle-outline::before { + content: "\F0F3A"; +} + +.mdi-baby-buggy::before { + content: "\F13E0"; +} + +.mdi-baby-buggy-off::before { + content: "\F1AF3"; +} + +.mdi-baby-carriage::before { + content: "\F068F"; +} + +.mdi-baby-carriage-off::before { + content: "\F0FA0"; +} + +.mdi-baby-face::before { + content: "\F0E7C"; +} + +.mdi-baby-face-outline::before { + content: "\F0E7D"; +} + +.mdi-backburger::before { + content: "\F006D"; +} + +.mdi-backspace::before { + content: "\F006E"; +} + +.mdi-backspace-outline::before { + content: "\F0B5C"; +} + +.mdi-backspace-reverse::before { + content: "\F0E7E"; +} + +.mdi-backspace-reverse-outline::before { + content: "\F0E7F"; +} + +.mdi-backup-restore::before { + content: "\F006F"; +} + +.mdi-bacteria::before { + content: "\F0ED5"; +} + +.mdi-bacteria-outline::before { + content: "\F0ED6"; +} + +.mdi-badge-account::before { + content: "\F0DA7"; +} + +.mdi-badge-account-alert::before { + content: "\F0DA8"; +} + +.mdi-badge-account-alert-outline::before { + content: "\F0DA9"; +} + +.mdi-badge-account-horizontal::before { + content: "\F0E0D"; +} + +.mdi-badge-account-horizontal-outline::before { + content: "\F0E0E"; +} + +.mdi-badge-account-outline::before { + content: "\F0DAA"; +} + +.mdi-badminton::before { + content: "\F0851"; +} + +.mdi-bag-carry-on::before { + content: "\F0F3B"; +} + +.mdi-bag-carry-on-check::before { + content: "\F0D65"; +} + +.mdi-bag-carry-on-off::before { + content: "\F0F3C"; +} + +.mdi-bag-checked::before { + content: "\F0F3D"; +} + +.mdi-bag-personal::before { + content: "\F0E10"; +} + +.mdi-bag-personal-off::before { + content: "\F0E11"; +} + +.mdi-bag-personal-off-outline::before { + content: "\F0E12"; +} + +.mdi-bag-personal-outline::before { + content: "\F0E13"; +} + +.mdi-bag-personal-plus::before { + content: "\F1CA4"; +} + +.mdi-bag-personal-plus-outline::before { + content: "\F1CA5"; +} + +.mdi-bag-personal-tag::before { + content: "\F1B0C"; +} + +.mdi-bag-personal-tag-outline::before { + content: "\F1B0D"; +} + +.mdi-bag-suitcase::before { + content: "\F158B"; +} + +.mdi-bag-suitcase-off::before { + content: "\F158D"; +} + +.mdi-bag-suitcase-off-outline::before { + content: "\F158E"; +} + +.mdi-bag-suitcase-outline::before { + content: "\F158C"; +} + +.mdi-baguette::before { + content: "\F0F3E"; +} + +.mdi-balcony::before { + content: "\F1817"; +} + +.mdi-balloon::before { + content: "\F0A26"; +} + +.mdi-ballot::before { + content: "\F09C9"; +} + +.mdi-ballot-outline::before { + content: "\F09CA"; +} + +.mdi-ballot-recount::before { + content: "\F0C39"; +} + +.mdi-ballot-recount-outline::before { + content: "\F0C3A"; +} + +.mdi-bandage::before { + content: "\F0DAF"; +} + +.mdi-bank::before { + content: "\F0070"; +} + +.mdi-bank-check::before { + content: "\F1655"; +} + +.mdi-bank-circle::before { + content: "\F1C03"; +} + +.mdi-bank-circle-outline::before { + content: "\F1C04"; +} + +.mdi-bank-minus::before { + content: "\F0DB0"; +} + +.mdi-bank-off::before { + content: "\F1656"; +} + +.mdi-bank-off-outline::before { + content: "\F1657"; +} + +.mdi-bank-outline::before { + content: "\F0E80"; +} + +.mdi-bank-plus::before { + content: "\F0DB1"; +} + +.mdi-bank-remove::before { + content: "\F0DB2"; +} + +.mdi-bank-transfer::before { + content: "\F0A27"; +} + +.mdi-bank-transfer-in::before { + content: "\F0A28"; +} + +.mdi-bank-transfer-out::before { + content: "\F0A29"; +} + +.mdi-barcode::before { + content: "\F0071"; +} + +.mdi-barcode-off::before { + content: "\F1236"; +} + +.mdi-barcode-scan::before { + content: "\F0072"; +} + +.mdi-barley::before { + content: "\F0073"; +} + +.mdi-barley-off::before { + content: "\F0B5D"; +} + +.mdi-barn::before { + content: "\F0B5E"; +} + +.mdi-barrel::before { + content: "\F0074"; +} + +.mdi-barrel-outline::before { + content: "\F1A28"; +} + +.mdi-baseball::before { + content: "\F0852"; +} + +.mdi-baseball-bat::before { + content: "\F0853"; +} + +.mdi-baseball-diamond::before { + content: "\F15EC"; +} + +.mdi-baseball-diamond-outline::before { + content: "\F15ED"; +} + +.mdi-baseball-outline::before { + content: "\F1C5A"; +} + +.mdi-bash::before { + content: "\F1183"; +} + +.mdi-basket::before { + content: "\F0076"; +} + +.mdi-basket-check::before { + content: "\F18E5"; +} + +.mdi-basket-check-outline::before { + content: "\F18E6"; +} + +.mdi-basket-fill::before { + content: "\F0077"; +} + +.mdi-basket-minus::before { + content: "\F1523"; +} + +.mdi-basket-minus-outline::before { + content: "\F1524"; +} + +.mdi-basket-off::before { + content: "\F1525"; +} + +.mdi-basket-off-outline::before { + content: "\F1526"; +} + +.mdi-basket-outline::before { + content: "\F1181"; +} + +.mdi-basket-plus::before { + content: "\F1527"; +} + +.mdi-basket-plus-outline::before { + content: "\F1528"; +} + +.mdi-basket-remove::before { + content: "\F1529"; +} + +.mdi-basket-remove-outline::before { + content: "\F152A"; +} + +.mdi-basket-unfill::before { + content: "\F0078"; +} + +.mdi-basketball::before { + content: "\F0806"; +} + +.mdi-basketball-hoop::before { + content: "\F0C3B"; +} + +.mdi-basketball-hoop-outline::before { + content: "\F0C3C"; +} + +.mdi-bat::before { + content: "\F0B5F"; +} + +.mdi-bathtub::before { + content: "\F1818"; +} + +.mdi-bathtub-outline::before { + content: "\F1819"; +} + +.mdi-battery::before { + content: "\F0079"; +} + +.mdi-battery-10::before { + content: "\F007A"; +} + +.mdi-battery-10-bluetooth::before { + content: "\F093E"; +} + +.mdi-battery-20::before { + content: "\F007B"; +} + +.mdi-battery-20-bluetooth::before { + content: "\F093F"; +} + +.mdi-battery-30::before { + content: "\F007C"; +} + +.mdi-battery-30-bluetooth::before { + content: "\F0940"; +} + +.mdi-battery-40::before { + content: "\F007D"; +} + +.mdi-battery-40-bluetooth::before { + content: "\F0941"; +} + +.mdi-battery-50::before { + content: "\F007E"; +} + +.mdi-battery-50-bluetooth::before { + content: "\F0942"; +} + +.mdi-battery-60::before { + content: "\F007F"; +} + +.mdi-battery-60-bluetooth::before { + content: "\F0943"; +} + +.mdi-battery-70::before { + content: "\F0080"; +} + +.mdi-battery-70-bluetooth::before { + content: "\F0944"; +} + +.mdi-battery-80::before { + content: "\F0081"; +} + +.mdi-battery-80-bluetooth::before { + content: "\F0945"; +} + +.mdi-battery-90::before { + content: "\F0082"; +} + +.mdi-battery-90-bluetooth::before { + content: "\F0946"; +} + +.mdi-battery-alert::before { + content: "\F0083"; +} + +.mdi-battery-alert-bluetooth::before { + content: "\F0947"; +} + +.mdi-battery-alert-variant::before { + content: "\F10CC"; +} + +.mdi-battery-alert-variant-outline::before { + content: "\F10CD"; +} + +.mdi-battery-arrow-down::before { + content: "\F17DE"; +} + +.mdi-battery-arrow-down-outline::before { + content: "\F17DF"; +} + +.mdi-battery-arrow-up::before { + content: "\F17E0"; +} + +.mdi-battery-arrow-up-outline::before { + content: "\F17E1"; +} + +.mdi-battery-bluetooth::before { + content: "\F0948"; +} + +.mdi-battery-bluetooth-variant::before { + content: "\F0949"; +} + +.mdi-battery-charging::before { + content: "\F0084"; +} + +.mdi-battery-charging-10::before { + content: "\F089C"; +} + +.mdi-battery-charging-100::before { + content: "\F0085"; +} + +.mdi-battery-charging-20::before { + content: "\F0086"; +} + +.mdi-battery-charging-30::before { + content: "\F0087"; +} + +.mdi-battery-charging-40::before { + content: "\F0088"; +} + +.mdi-battery-charging-50::before { + content: "\F089D"; +} + +.mdi-battery-charging-60::before { + content: "\F0089"; +} + +.mdi-battery-charging-70::before { + content: "\F089E"; +} + +.mdi-battery-charging-80::before { + content: "\F008A"; +} + +.mdi-battery-charging-90::before { + content: "\F008B"; +} + +.mdi-battery-charging-high::before { + content: "\F12A6"; +} + +.mdi-battery-charging-low::before { + content: "\F12A4"; +} + +.mdi-battery-charging-medium::before { + content: "\F12A5"; +} + +.mdi-battery-charging-outline::before { + content: "\F089F"; +} + +.mdi-battery-charging-wireless::before { + content: "\F0807"; +} + +.mdi-battery-charging-wireless-10::before { + content: "\F0808"; +} + +.mdi-battery-charging-wireless-20::before { + content: "\F0809"; +} + +.mdi-battery-charging-wireless-30::before { + content: "\F080A"; +} + +.mdi-battery-charging-wireless-40::before { + content: "\F080B"; +} + +.mdi-battery-charging-wireless-50::before { + content: "\F080C"; +} + +.mdi-battery-charging-wireless-60::before { + content: "\F080D"; +} + +.mdi-battery-charging-wireless-70::before { + content: "\F080E"; +} + +.mdi-battery-charging-wireless-80::before { + content: "\F080F"; +} + +.mdi-battery-charging-wireless-90::before { + content: "\F0810"; +} + +.mdi-battery-charging-wireless-alert::before { + content: "\F0811"; +} + +.mdi-battery-charging-wireless-outline::before { + content: "\F0812"; +} + +.mdi-battery-check::before { + content: "\F17E2"; +} + +.mdi-battery-check-outline::before { + content: "\F17E3"; +} + +.mdi-battery-clock::before { + content: "\F19E5"; +} + +.mdi-battery-clock-outline::before { + content: "\F19E6"; +} + +.mdi-battery-heart::before { + content: "\F120F"; +} + +.mdi-battery-heart-outline::before { + content: "\F1210"; +} + +.mdi-battery-heart-variant::before { + content: "\F1211"; +} + +.mdi-battery-high::before { + content: "\F12A3"; +} + +.mdi-battery-lock::before { + content: "\F179C"; +} + +.mdi-battery-lock-open::before { + content: "\F179D"; +} + +.mdi-battery-low::before { + content: "\F12A1"; +} + +.mdi-battery-medium::before { + content: "\F12A2"; +} + +.mdi-battery-minus::before { + content: "\F17E4"; +} + +.mdi-battery-minus-outline::before { + content: "\F17E5"; +} + +.mdi-battery-minus-variant::before { + content: "\F008C"; +} + +.mdi-battery-negative::before { + content: "\F008D"; +} + +.mdi-battery-off::before { + content: "\F125D"; +} + +.mdi-battery-off-outline::before { + content: "\F125E"; +} + +.mdi-battery-outline::before { + content: "\F008E"; +} + +.mdi-battery-plus::before { + content: "\F17E6"; +} + +.mdi-battery-plus-outline::before { + content: "\F17E7"; +} + +.mdi-battery-plus-variant::before { + content: "\F008F"; +} + +.mdi-battery-positive::before { + content: "\F0090"; +} + +.mdi-battery-remove::before { + content: "\F17E8"; +} + +.mdi-battery-remove-outline::before { + content: "\F17E9"; +} + +.mdi-battery-sync::before { + content: "\F1834"; +} + +.mdi-battery-sync-outline::before { + content: "\F1835"; +} + +.mdi-battery-unknown::before { + content: "\F0091"; +} + +.mdi-battery-unknown-bluetooth::before { + content: "\F094A"; +} + +.mdi-beach::before { + content: "\F0092"; +} + +.mdi-beaker::before { + content: "\F0CEA"; +} + +.mdi-beaker-alert::before { + content: "\F1229"; +} + +.mdi-beaker-alert-outline::before { + content: "\F122A"; +} + +.mdi-beaker-check::before { + content: "\F122B"; +} + +.mdi-beaker-check-outline::before { + content: "\F122C"; +} + +.mdi-beaker-minus::before { + content: "\F122D"; +} + +.mdi-beaker-minus-outline::before { + content: "\F122E"; +} + +.mdi-beaker-outline::before { + content: "\F0690"; +} + +.mdi-beaker-plus::before { + content: "\F122F"; +} + +.mdi-beaker-plus-outline::before { + content: "\F1230"; +} + +.mdi-beaker-question::before { + content: "\F1231"; +} + +.mdi-beaker-question-outline::before { + content: "\F1232"; +} + +.mdi-beaker-remove::before { + content: "\F1233"; +} + +.mdi-beaker-remove-outline::before { + content: "\F1234"; +} + +.mdi-bed::before { + content: "\F02E3"; +} + +.mdi-bed-clock::before { + content: "\F1B94"; +} + +.mdi-bed-double::before { + content: "\F0FD4"; +} + +.mdi-bed-double-outline::before { + content: "\F0FD3"; +} + +.mdi-bed-empty::before { + content: "\F08A0"; +} + +.mdi-bed-king::before { + content: "\F0FD2"; +} + +.mdi-bed-king-outline::before { + content: "\F0FD1"; +} + +.mdi-bed-outline::before { + content: "\F0099"; +} + +.mdi-bed-queen::before { + content: "\F0FD0"; +} + +.mdi-bed-queen-outline::before { + content: "\F0FDB"; +} + +.mdi-bed-single::before { + content: "\F106D"; +} + +.mdi-bed-single-outline::before { + content: "\F106E"; +} + +.mdi-bee::before { + content: "\F0FA1"; +} + +.mdi-bee-flower::before { + content: "\F0FA2"; +} + +.mdi-beehive-off-outline::before { + content: "\F13ED"; +} + +.mdi-beehive-outline::before { + content: "\F10CE"; +} + +.mdi-beekeeper::before { + content: "\F14E2"; +} + +.mdi-beer::before { + content: "\F0098"; +} + +.mdi-beer-outline::before { + content: "\F130C"; +} + +.mdi-bell::before { + content: "\F009A"; +} + +.mdi-bell-alert::before { + content: "\F0D59"; +} + +.mdi-bell-alert-outline::before { + content: "\F0E81"; +} + +.mdi-bell-badge::before { + content: "\F116B"; +} + +.mdi-bell-badge-outline::before { + content: "\F0178"; +} + +.mdi-bell-cancel::before { + content: "\F13E7"; +} + +.mdi-bell-cancel-outline::before { + content: "\F13E8"; +} + +.mdi-bell-check::before { + content: "\F11E5"; +} + +.mdi-bell-check-outline::before { + content: "\F11E6"; +} + +.mdi-bell-circle::before { + content: "\F0D5A"; +} + +.mdi-bell-circle-outline::before { + content: "\F0D5B"; +} + +.mdi-bell-cog::before { + content: "\F1A29"; +} + +.mdi-bell-cog-outline::before { + content: "\F1A2A"; +} + +.mdi-bell-minus::before { + content: "\F13E9"; +} + +.mdi-bell-minus-outline::before { + content: "\F13EA"; +} + +.mdi-bell-off::before { + content: "\F009B"; +} + +.mdi-bell-off-outline::before { + content: "\F0A91"; +} + +.mdi-bell-outline::before { + content: "\F009C"; +} + +.mdi-bell-plus::before { + content: "\F009D"; +} + +.mdi-bell-plus-outline::before { + content: "\F0A92"; +} + +.mdi-bell-remove::before { + content: "\F13EB"; +} + +.mdi-bell-remove-outline::before { + content: "\F13EC"; +} + +.mdi-bell-ring::before { + content: "\F009E"; +} + +.mdi-bell-ring-outline::before { + content: "\F009F"; +} + +.mdi-bell-sleep::before { + content: "\F00A0"; +} + +.mdi-bell-sleep-outline::before { + content: "\F0A93"; +} + +.mdi-bench::before { + content: "\F1C21"; +} + +.mdi-bench-back::before { + content: "\F1C22"; +} + +.mdi-beta::before { + content: "\F00A1"; +} + +.mdi-betamax::before { + content: "\F09CB"; +} + +.mdi-biathlon::before { + content: "\F0E14"; +} + +.mdi-bicycle::before { + content: "\F109C"; +} + +.mdi-bicycle-basket::before { + content: "\F1235"; +} + +.mdi-bicycle-cargo::before { + content: "\F189C"; +} + +.mdi-bicycle-electric::before { + content: "\F15B4"; +} + +.mdi-bicycle-penny-farthing::before { + content: "\F15E9"; +} + +.mdi-bike::before { + content: "\F00A3"; +} + +.mdi-bike-fast::before { + content: "\F111F"; +} + +.mdi-bike-pedal::before { + content: "\F1C23"; +} + +.mdi-bike-pedal-clipless::before { + content: "\F1C24"; +} + +.mdi-bike-pedal-mountain::before { + content: "\F1C25"; +} + +.mdi-billboard::before { + content: "\F1010"; +} + +.mdi-billiards::before { + content: "\F0B61"; +} + +.mdi-billiards-rack::before { + content: "\F0B62"; +} + +.mdi-binoculars::before { + content: "\F00A5"; +} + +.mdi-bio::before { + content: "\F00A6"; +} + +.mdi-biohazard::before { + content: "\F00A7"; +} + +.mdi-bird::before { + content: "\F15C6"; +} + +.mdi-bitbucket::before { + content: "\F00A8"; +} + +.mdi-bitcoin::before { + content: "\F0813"; +} + +.mdi-black-mesa::before { + content: "\F00A9"; +} + +.mdi-blender::before { + content: "\F0CEB"; +} + +.mdi-blender-outline::before { + content: "\F181A"; +} + +.mdi-blender-software::before { + content: "\F00AB"; +} + +.mdi-blinds::before { + content: "\F00AC"; +} + +.mdi-blinds-horizontal::before { + content: "\F1A2B"; +} + +.mdi-blinds-horizontal-closed::before { + content: "\F1A2C"; +} + +.mdi-blinds-open::before { + content: "\F1011"; +} + +.mdi-blinds-vertical::before { + content: "\F1A2D"; +} + +.mdi-blinds-vertical-closed::before { + content: "\F1A2E"; +} + +.mdi-block-helper::before { + content: "\F00AD"; +} + +.mdi-blood-bag::before { + content: "\F0CEC"; +} + +.mdi-bluetooth::before { + content: "\F00AF"; +} + +.mdi-bluetooth-audio::before { + content: "\F00B0"; +} + +.mdi-bluetooth-connect::before { + content: "\F00B1"; +} + +.mdi-bluetooth-off::before { + content: "\F00B2"; +} + +.mdi-bluetooth-settings::before { + content: "\F00B3"; +} + +.mdi-bluetooth-transfer::before { + content: "\F00B4"; +} + +.mdi-blur::before { + content: "\F00B5"; +} + +.mdi-blur-linear::before { + content: "\F00B6"; +} + +.mdi-blur-off::before { + content: "\F00B7"; +} + +.mdi-blur-radial::before { + content: "\F00B8"; +} + +.mdi-bolt::before { + content: "\F0DB3"; +} + +.mdi-bomb::before { + content: "\F0691"; +} + +.mdi-bomb-off::before { + content: "\F06C5"; +} + +.mdi-bone::before { + content: "\F00B9"; +} + +.mdi-bone-off::before { + content: "\F19E0"; +} + +.mdi-book::before { + content: "\F00BA"; +} + +.mdi-book-account::before { + content: "\F13AD"; +} + +.mdi-book-account-outline::before { + content: "\F13AE"; +} + +.mdi-book-alert::before { + content: "\F167C"; +} + +.mdi-book-alert-outline::before { + content: "\F167D"; +} + +.mdi-book-alphabet::before { + content: "\F061D"; +} + +.mdi-book-arrow-down::before { + content: "\F167E"; +} + +.mdi-book-arrow-down-outline::before { + content: "\F167F"; +} + +.mdi-book-arrow-left::before { + content: "\F1680"; +} + +.mdi-book-arrow-left-outline::before { + content: "\F1681"; +} + +.mdi-book-arrow-right::before { + content: "\F1682"; +} + +.mdi-book-arrow-right-outline::before { + content: "\F1683"; +} + +.mdi-book-arrow-up::before { + content: "\F1684"; +} + +.mdi-book-arrow-up-outline::before { + content: "\F1685"; +} + +.mdi-book-cancel::before { + content: "\F1686"; +} + +.mdi-book-cancel-outline::before { + content: "\F1687"; +} + +.mdi-book-check::before { + content: "\F14F3"; +} + +.mdi-book-check-outline::before { + content: "\F14F4"; +} + +.mdi-book-clock::before { + content: "\F1688"; +} + +.mdi-book-clock-outline::before { + content: "\F1689"; +} + +.mdi-book-cog::before { + content: "\F168A"; +} + +.mdi-book-cog-outline::before { + content: "\F168B"; +} + +.mdi-book-cross::before { + content: "\F00A2"; +} + +.mdi-book-edit::before { + content: "\F168C"; +} + +.mdi-book-edit-outline::before { + content: "\F168D"; +} + +.mdi-book-education::before { + content: "\F16C9"; +} + +.mdi-book-education-outline::before { + content: "\F16CA"; +} + +.mdi-book-heart::before { + content: "\F1A1D"; +} + +.mdi-book-heart-outline::before { + content: "\F1A1E"; +} + +.mdi-book-information-variant::before { + content: "\F106F"; +} + +.mdi-book-lock::before { + content: "\F079A"; +} + +.mdi-book-lock-open::before { + content: "\F079B"; +} + +.mdi-book-lock-open-outline::before { + content: "\F168E"; +} + +.mdi-book-lock-outline::before { + content: "\F168F"; +} + +.mdi-book-marker::before { + content: "\F1690"; +} + +.mdi-book-marker-outline::before { + content: "\F1691"; +} + +.mdi-book-minus::before { + content: "\F05D9"; +} + +.mdi-book-minus-multiple::before { + content: "\F0A94"; +} + +.mdi-book-minus-multiple-outline::before { + content: "\F090B"; +} + +.mdi-book-minus-outline::before { + content: "\F1692"; +} + +.mdi-book-multiple::before { + content: "\F00BB"; +} + +.mdi-book-multiple-outline::before { + content: "\F0436"; +} + +.mdi-book-music::before { + content: "\F0067"; +} + +.mdi-book-music-outline::before { + content: "\F1693"; +} + +.mdi-book-off::before { + content: "\F1694"; +} + +.mdi-book-off-outline::before { + content: "\F1695"; +} + +.mdi-book-open::before { + content: "\F00BD"; +} + +.mdi-book-open-blank-variant::before { + content: "\F00BE"; +} + +.mdi-book-open-blank-variant-outline::before { + content: "\F1CCB"; +} + +.mdi-book-open-outline::before { + content: "\F0B63"; +} + +.mdi-book-open-page-variant::before { + content: "\F05DA"; +} + +.mdi-book-open-page-variant-outline::before { + content: "\F15D6"; +} + +.mdi-book-open-variant::before { + content: "\F14F7"; +} + +.mdi-book-open-variant-outline::before { + content: "\F1CCC"; +} + +.mdi-book-outline::before { + content: "\F0B64"; +} + +.mdi-book-play::before { + content: "\F0E82"; +} + +.mdi-book-play-outline::before { + content: "\F0E83"; +} + +.mdi-book-plus::before { + content: "\F05DB"; +} + +.mdi-book-plus-multiple::before { + content: "\F0A95"; +} + +.mdi-book-plus-multiple-outline::before { + content: "\F0ADE"; +} + +.mdi-book-plus-outline::before { + content: "\F1696"; +} + +.mdi-book-refresh::before { + content: "\F1697"; +} + +.mdi-book-refresh-outline::before { + content: "\F1698"; +} + +.mdi-book-remove::before { + content: "\F0A97"; +} + +.mdi-book-remove-multiple::before { + content: "\F0A96"; +} + +.mdi-book-remove-multiple-outline::before { + content: "\F04CA"; +} + +.mdi-book-remove-outline::before { + content: "\F1699"; +} + +.mdi-book-search::before { + content: "\F0E84"; +} + +.mdi-book-search-outline::before { + content: "\F0E85"; +} + +.mdi-book-settings::before { + content: "\F169A"; +} + +.mdi-book-settings-outline::before { + content: "\F169B"; +} + +.mdi-book-sync::before { + content: "\F169C"; +} + +.mdi-book-sync-outline::before { + content: "\F16C8"; +} + +.mdi-book-variant::before { + content: "\F00BF"; +} + +.mdi-bookmark::before { + content: "\F00C0"; +} + +.mdi-bookmark-box::before { + content: "\F1B75"; +} + +.mdi-bookmark-box-multiple::before { + content: "\F196C"; +} + +.mdi-bookmark-box-multiple-outline::before { + content: "\F196D"; +} + +.mdi-bookmark-box-outline::before { + content: "\F1B76"; +} + +.mdi-bookmark-check::before { + content: "\F00C1"; +} + +.mdi-bookmark-check-outline::before { + content: "\F137B"; +} + +.mdi-bookmark-minus::before { + content: "\F09CC"; +} + +.mdi-bookmark-minus-outline::before { + content: "\F09CD"; +} + +.mdi-bookmark-multiple::before { + content: "\F0E15"; +} + +.mdi-bookmark-multiple-outline::before { + content: "\F0E16"; +} + +.mdi-bookmark-music::before { + content: "\F00C2"; +} + +.mdi-bookmark-music-outline::before { + content: "\F1379"; +} + +.mdi-bookmark-off::before { + content: "\F09CE"; +} + +.mdi-bookmark-off-outline::before { + content: "\F09CF"; +} + +.mdi-bookmark-outline::before { + content: "\F00C3"; +} + +.mdi-bookmark-plus::before { + content: "\F00C5"; +} + +.mdi-bookmark-plus-outline::before { + content: "\F00C4"; +} + +.mdi-bookmark-remove::before { + content: "\F00C6"; +} + +.mdi-bookmark-remove-outline::before { + content: "\F137A"; +} + +.mdi-bookshelf::before { + content: "\F125F"; +} + +.mdi-boom-gate::before { + content: "\F0E86"; +} + +.mdi-boom-gate-alert::before { + content: "\F0E87"; +} + +.mdi-boom-gate-alert-outline::before { + content: "\F0E88"; +} + +.mdi-boom-gate-arrow-down::before { + content: "\F0E89"; +} + +.mdi-boom-gate-arrow-down-outline::before { + content: "\F0E8A"; +} + +.mdi-boom-gate-arrow-up::before { + content: "\F0E8C"; +} + +.mdi-boom-gate-arrow-up-outline::before { + content: "\F0E8D"; +} + +.mdi-boom-gate-outline::before { + content: "\F0E8B"; +} + +.mdi-boom-gate-up::before { + content: "\F17F9"; +} + +.mdi-boom-gate-up-outline::before { + content: "\F17FA"; +} + +.mdi-boombox::before { + content: "\F05DC"; +} + +.mdi-boomerang::before { + content: "\F10CF"; +} + +.mdi-bootstrap::before { + content: "\F06C6"; +} + +.mdi-border-all::before { + content: "\F00C7"; +} + +.mdi-border-all-variant::before { + content: "\F08A1"; +} + +.mdi-border-bottom::before { + content: "\F00C8"; +} + +.mdi-border-bottom-variant::before { + content: "\F08A2"; +} + +.mdi-border-color::before { + content: "\F00C9"; +} + +.mdi-border-horizontal::before { + content: "\F00CA"; +} + +.mdi-border-inside::before { + content: "\F00CB"; +} + +.mdi-border-left::before { + content: "\F00CC"; +} + +.mdi-border-left-variant::before { + content: "\F08A3"; +} + +.mdi-border-none::before { + content: "\F00CD"; +} + +.mdi-border-none-variant::before { + content: "\F08A4"; +} + +.mdi-border-outside::before { + content: "\F00CE"; +} + +.mdi-border-radius::before { + content: "\F1AF4"; +} + +.mdi-border-right::before { + content: "\F00CF"; +} + +.mdi-border-right-variant::before { + content: "\F08A5"; +} + +.mdi-border-style::before { + content: "\F00D0"; +} + +.mdi-border-top::before { + content: "\F00D1"; +} + +.mdi-border-top-variant::before { + content: "\F08A6"; +} + +.mdi-border-vertical::before { + content: "\F00D2"; +} + +.mdi-bottle-soda::before { + content: "\F1070"; +} + +.mdi-bottle-soda-classic::before { + content: "\F1071"; +} + +.mdi-bottle-soda-classic-outline::before { + content: "\F1363"; +} + +.mdi-bottle-soda-outline::before { + content: "\F1072"; +} + +.mdi-bottle-tonic::before { + content: "\F112E"; +} + +.mdi-bottle-tonic-outline::before { + content: "\F112F"; +} + +.mdi-bottle-tonic-plus::before { + content: "\F1130"; +} + +.mdi-bottle-tonic-plus-outline::before { + content: "\F1131"; +} + +.mdi-bottle-tonic-skull::before { + content: "\F1132"; +} + +.mdi-bottle-tonic-skull-outline::before { + content: "\F1133"; +} + +.mdi-bottle-wine::before { + content: "\F0854"; +} + +.mdi-bottle-wine-outline::before { + content: "\F1310"; +} + +.mdi-bow-arrow::before { + content: "\F1841"; +} + +.mdi-bow-tie::before { + content: "\F0678"; +} + +.mdi-bowl::before { + content: "\F028E"; +} + +.mdi-bowl-mix::before { + content: "\F0617"; +} + +.mdi-bowl-mix-outline::before { + content: "\F02E4"; +} + +.mdi-bowl-outline::before { + content: "\F02A9"; +} + +.mdi-bowling::before { + content: "\F00D3"; +} + +.mdi-box::before { + content: "\F00D4"; +} + +.mdi-box-cutter::before { + content: "\F00D5"; +} + +.mdi-box-cutter-off::before { + content: "\F0B4A"; +} + +.mdi-box-shadow::before { + content: "\F0637"; +} + +.mdi-boxing-glove::before { + content: "\F0B65"; +} + +.mdi-braille::before { + content: "\F09D0"; +} + +.mdi-brain::before { + content: "\F09D1"; +} + +.mdi-bread-slice::before { + content: "\F0CEE"; +} + +.mdi-bread-slice-outline::before { + content: "\F0CEF"; +} + +.mdi-bridge::before { + content: "\F0618"; +} + +.mdi-briefcase::before { + content: "\F00D6"; +} + +.mdi-briefcase-account::before { + content: "\F0CF0"; +} + +.mdi-briefcase-account-outline::before { + content: "\F0CF1"; +} + +.mdi-briefcase-arrow-left-right::before { + content: "\F1A8D"; +} + +.mdi-briefcase-arrow-left-right-outline::before { + content: "\F1A8E"; +} + +.mdi-briefcase-arrow-up-down::before { + content: "\F1A8F"; +} + +.mdi-briefcase-arrow-up-down-outline::before { + content: "\F1A90"; +} + +.mdi-briefcase-check::before { + content: "\F00D7"; +} + +.mdi-briefcase-check-outline::before { + content: "\F131E"; +} + +.mdi-briefcase-clock::before { + content: "\F10D0"; +} + +.mdi-briefcase-clock-outline::before { + content: "\F10D1"; +} + +.mdi-briefcase-download::before { + content: "\F00D8"; +} + +.mdi-briefcase-download-outline::before { + content: "\F0C3D"; +} + +.mdi-briefcase-edit::before { + content: "\F0A98"; +} + +.mdi-briefcase-edit-outline::before { + content: "\F0C3E"; +} + +.mdi-briefcase-eye::before { + content: "\F17D9"; +} + +.mdi-briefcase-eye-outline::before { + content: "\F17DA"; +} + +.mdi-briefcase-minus::before { + content: "\F0A2A"; +} + +.mdi-briefcase-minus-outline::before { + content: "\F0C3F"; +} + +.mdi-briefcase-off::before { + content: "\F1658"; +} + +.mdi-briefcase-off-outline::before { + content: "\F1659"; +} + +.mdi-briefcase-outline::before { + content: "\F0814"; +} + +.mdi-briefcase-plus::before { + content: "\F0A2B"; +} + +.mdi-briefcase-plus-outline::before { + content: "\F0C40"; +} + +.mdi-briefcase-remove::before { + content: "\F0A2C"; +} + +.mdi-briefcase-remove-outline::before { + content: "\F0C41"; +} + +.mdi-briefcase-search::before { + content: "\F0A2D"; +} + +.mdi-briefcase-search-outline::before { + content: "\F0C42"; +} + +.mdi-briefcase-upload::before { + content: "\F00D9"; +} + +.mdi-briefcase-upload-outline::before { + content: "\F0C43"; +} + +.mdi-briefcase-variant::before { + content: "\F1494"; +} + +.mdi-briefcase-variant-off::before { + content: "\F165A"; +} + +.mdi-briefcase-variant-off-outline::before { + content: "\F165B"; +} + +.mdi-briefcase-variant-outline::before { + content: "\F1495"; +} + +.mdi-brightness-1::before { + content: "\F00DA"; +} + +.mdi-brightness-2::before { + content: "\F00DB"; +} + +.mdi-brightness-3::before { + content: "\F00DC"; +} + +.mdi-brightness-4::before { + content: "\F00DD"; +} + +.mdi-brightness-5::before { + content: "\F00DE"; +} + +.mdi-brightness-6::before { + content: "\F00DF"; +} + +.mdi-brightness-7::before { + content: "\F00E0"; +} + +.mdi-brightness-auto::before { + content: "\F00E1"; +} + +.mdi-brightness-percent::before { + content: "\F0CF2"; +} + +.mdi-broadcast::before { + content: "\F1720"; +} + +.mdi-broadcast-off::before { + content: "\F1721"; +} + +.mdi-broom::before { + content: "\F00E2"; +} + +.mdi-brush::before { + content: "\F00E3"; +} + +.mdi-brush-off::before { + content: "\F1771"; +} + +.mdi-brush-outline::before { + content: "\F1A0D"; +} + +.mdi-brush-variant::before { + content: "\F1813"; +} + +.mdi-bucket::before { + content: "\F1415"; +} + +.mdi-bucket-outline::before { + content: "\F1416"; +} + +.mdi-buffet::before { + content: "\F0578"; +} + +.mdi-bug::before { + content: "\F00E4"; +} + +.mdi-bug-check::before { + content: "\F0A2E"; +} + +.mdi-bug-check-outline::before { + content: "\F0A2F"; +} + +.mdi-bug-outline::before { + content: "\F0A30"; +} + +.mdi-bug-pause::before { + content: "\F1AF5"; +} + +.mdi-bug-pause-outline::before { + content: "\F1AF6"; +} + +.mdi-bug-play::before { + content: "\F1AF7"; +} + +.mdi-bug-play-outline::before { + content: "\F1AF8"; +} + +.mdi-bug-stop::before { + content: "\F1AF9"; +} + +.mdi-bug-stop-outline::before { + content: "\F1AFA"; +} + +.mdi-bugle::before { + content: "\F0DB4"; +} + +.mdi-bulkhead-light::before { + content: "\F1A2F"; +} + +.mdi-bulldozer::before { + content: "\F0B22"; +} + +.mdi-bullet::before { + content: "\F0CF3"; +} + +.mdi-bulletin-board::before { + content: "\F00E5"; +} + +.mdi-bullhorn::before { + content: "\F00E6"; +} + +.mdi-bullhorn-outline::before { + content: "\F0B23"; +} + +.mdi-bullhorn-variant::before { + content: "\F196E"; +} + +.mdi-bullhorn-variant-outline::before { + content: "\F196F"; +} + +.mdi-bullseye::before { + content: "\F05DD"; +} + +.mdi-bullseye-arrow::before { + content: "\F08C9"; +} + +.mdi-bulma::before { + content: "\F12E7"; +} + +.mdi-bunk-bed::before { + content: "\F1302"; +} + +.mdi-bunk-bed-outline::before { + content: "\F0097"; +} + +.mdi-bus::before { + content: "\F00E7"; +} + +.mdi-bus-alert::before { + content: "\F0A99"; +} + +.mdi-bus-articulated-end::before { + content: "\F079C"; +} + +.mdi-bus-articulated-front::before { + content: "\F079D"; +} + +.mdi-bus-clock::before { + content: "\F08CA"; +} + +.mdi-bus-double-decker::before { + content: "\F079E"; +} + +.mdi-bus-electric::before { + content: "\F191D"; +} + +.mdi-bus-marker::before { + content: "\F1212"; +} + +.mdi-bus-multiple::before { + content: "\F0F3F"; +} + +.mdi-bus-school::before { + content: "\F079F"; +} + +.mdi-bus-side::before { + content: "\F07A0"; +} + +.mdi-bus-sign::before { + content: "\F1CC1"; +} + +.mdi-bus-stop::before { + content: "\F1012"; +} + +.mdi-bus-stop-covered::before { + content: "\F1013"; +} + +.mdi-bus-stop-uncovered::before { + content: "\F1014"; +} + +.mdi-bus-wrench::before { + content: "\F1CC2"; +} + +.mdi-butterfly::before { + content: "\F1589"; +} + +.mdi-butterfly-outline::before { + content: "\F158A"; +} + +.mdi-button-cursor::before { + content: "\F1B4F"; +} + +.mdi-button-pointer::before { + content: "\F1B50"; +} + +.mdi-cabin-a-frame::before { + content: "\F188C"; +} + +.mdi-cable-data::before { + content: "\F1394"; +} + +.mdi-cached::before { + content: "\F00E8"; +} + +.mdi-cactus::before { + content: "\F0DB5"; +} + +.mdi-cake::before { + content: "\F00E9"; +} + +.mdi-cake-layered::before { + content: "\F00EA"; +} + +.mdi-cake-variant::before { + content: "\F00EB"; +} + +.mdi-cake-variant-outline::before { + content: "\F17F0"; +} + +.mdi-calculator::before { + content: "\F00EC"; +} + +.mdi-calculator-variant::before { + content: "\F0A9A"; +} + +.mdi-calculator-variant-outline::before { + content: "\F15A6"; +} + +.mdi-calendar::before { + content: "\F00ED"; +} + +.mdi-calendar-account::before { + content: "\F0ED7"; +} + +.mdi-calendar-account-outline::before { + content: "\F0ED8"; +} + +.mdi-calendar-alert::before { + content: "\F0A31"; +} + +.mdi-calendar-alert-outline::before { + content: "\F1B62"; +} + +.mdi-calendar-arrow-left::before { + content: "\F1134"; +} + +.mdi-calendar-arrow-right::before { + content: "\F1135"; +} + +.mdi-calendar-badge::before { + content: "\F1B9D"; +} + +.mdi-calendar-badge-outline::before { + content: "\F1B9E"; +} + +.mdi-calendar-blank::before { + content: "\F00EE"; +} + +.mdi-calendar-blank-multiple::before { + content: "\F1073"; +} + +.mdi-calendar-blank-outline::before { + content: "\F0B66"; +} + +.mdi-calendar-check::before { + content: "\F00EF"; +} + +.mdi-calendar-check-outline::before { + content: "\F0C44"; +} + +.mdi-calendar-clock::before { + content: "\F00F0"; +} + +.mdi-calendar-clock-outline::before { + content: "\F16E1"; +} + +.mdi-calendar-collapse-horizontal::before { + content: "\F189D"; +} + +.mdi-calendar-collapse-horizontal-outline::before { + content: "\F1B63"; +} + +.mdi-calendar-cursor::before { + content: "\F157B"; +} + +.mdi-calendar-cursor-outline::before { + content: "\F1B64"; +} + +.mdi-calendar-edit::before { + content: "\F08A7"; +} + +.mdi-calendar-edit-outline::before { + content: "\F1B65"; +} + +.mdi-calendar-end::before { + content: "\F166C"; +} + +.mdi-calendar-end-outline::before { + content: "\F1B66"; +} + +.mdi-calendar-expand-horizontal::before { + content: "\F189E"; +} + +.mdi-calendar-expand-horizontal-outline::before { + content: "\F1B67"; +} + +.mdi-calendar-export::before { + content: "\F0B24"; +} + +.mdi-calendar-export-outline::before { + content: "\F1B68"; +} + +.mdi-calendar-filter::before { + content: "\F1A32"; +} + +.mdi-calendar-filter-outline::before { + content: "\F1A33"; +} + +.mdi-calendar-heart::before { + content: "\F09D2"; +} + +.mdi-calendar-heart-outline::before { + content: "\F1B69"; +} + +.mdi-calendar-import::before { + content: "\F0B25"; +} + +.mdi-calendar-import-outline::before { + content: "\F1B6A"; +} + +.mdi-calendar-lock::before { + content: "\F1641"; +} + +.mdi-calendar-lock-open::before { + content: "\F1B5B"; +} + +.mdi-calendar-lock-open-outline::before { + content: "\F1B5C"; +} + +.mdi-calendar-lock-outline::before { + content: "\F1642"; +} + +.mdi-calendar-minus::before { + content: "\F0D5C"; +} + +.mdi-calendar-minus-outline::before { + content: "\F1B6B"; +} + +.mdi-calendar-month::before { + content: "\F0E17"; +} + +.mdi-calendar-month-outline::before { + content: "\F0E18"; +} + +.mdi-calendar-multiple::before { + content: "\F00F1"; +} + +.mdi-calendar-multiple-check::before { + content: "\F00F2"; +} + +.mdi-calendar-multiselect::before { + content: "\F0A32"; +} + +.mdi-calendar-multiselect-outline::before { + content: "\F1B55"; +} + +.mdi-calendar-outline::before { + content: "\F0B67"; +} + +.mdi-calendar-plus::before { + content: "\F00F3"; +} + +.mdi-calendar-plus-outline::before { + content: "\F1B6C"; +} + +.mdi-calendar-question::before { + content: "\F0692"; +} + +.mdi-calendar-question-outline::before { + content: "\F1B6D"; +} + +.mdi-calendar-range::before { + content: "\F0679"; +} + +.mdi-calendar-range-outline::before { + content: "\F0B68"; +} + +.mdi-calendar-refresh::before { + content: "\F01E1"; +} + +.mdi-calendar-refresh-outline::before { + content: "\F0203"; +} + +.mdi-calendar-remove::before { + content: "\F00F4"; +} + +.mdi-calendar-remove-outline::before { + content: "\F0C45"; +} + +.mdi-calendar-search::before { + content: "\F094C"; +} + +.mdi-calendar-search-outline::before { + content: "\F1B6E"; +} + +.mdi-calendar-star::before { + content: "\F09D3"; +} + +.mdi-calendar-star-four-points::before { + content: "\F1C1F"; +} + +.mdi-calendar-star-outline::before { + content: "\F1B53"; +} + +.mdi-calendar-start::before { + content: "\F166D"; +} + +.mdi-calendar-start-outline::before { + content: "\F1B6F"; +} + +.mdi-calendar-sync::before { + content: "\F0E8E"; +} + +.mdi-calendar-sync-outline::before { + content: "\F0E8F"; +} + +.mdi-calendar-text::before { + content: "\F00F5"; +} + +.mdi-calendar-text-outline::before { + content: "\F0C46"; +} + +.mdi-calendar-today::before { + content: "\F00F6"; +} + +.mdi-calendar-today-outline::before { + content: "\F1A30"; +} + +.mdi-calendar-week::before { + content: "\F0A33"; +} + +.mdi-calendar-week-begin::before { + content: "\F0A34"; +} + +.mdi-calendar-week-begin-outline::before { + content: "\F1A31"; +} + +.mdi-calendar-week-outline::before { + content: "\F1A34"; +} + +.mdi-calendar-weekend::before { + content: "\F0ED9"; +} + +.mdi-calendar-weekend-outline::before { + content: "\F0EDA"; +} + +.mdi-call-made::before { + content: "\F00F7"; +} + +.mdi-call-merge::before { + content: "\F00F8"; +} + +.mdi-call-missed::before { + content: "\F00F9"; +} + +.mdi-call-received::before { + content: "\F00FA"; +} + +.mdi-call-split::before { + content: "\F00FB"; +} + +.mdi-camcorder::before { + content: "\F00FC"; +} + +.mdi-camcorder-off::before { + content: "\F00FF"; +} + +.mdi-camera::before { + content: "\F0100"; +} + +.mdi-camera-account::before { + content: "\F08CB"; +} + +.mdi-camera-burst::before { + content: "\F0693"; +} + +.mdi-camera-control::before { + content: "\F0B69"; +} + +.mdi-camera-document::before { + content: "\F1871"; +} + +.mdi-camera-document-off::before { + content: "\F1872"; +} + +.mdi-camera-enhance::before { + content: "\F0101"; +} + +.mdi-camera-enhance-outline::before { + content: "\F0B6A"; +} + +.mdi-camera-flip::before { + content: "\F15D9"; +} + +.mdi-camera-flip-outline::before { + content: "\F15DA"; +} + +.mdi-camera-front::before { + content: "\F0102"; +} + +.mdi-camera-front-variant::before { + content: "\F0103"; +} + +.mdi-camera-gopro::before { + content: "\F07A1"; +} + +.mdi-camera-image::before { + content: "\F08CC"; +} + +.mdi-camera-iris::before { + content: "\F0104"; +} + +.mdi-camera-lock::before { + content: "\F1A14"; +} + +.mdi-camera-lock-open::before { + content: "\F1C0D"; +} + +.mdi-camera-lock-open-outline::before { + content: "\F1C0E"; +} + +.mdi-camera-lock-outline::before { + content: "\F1A15"; +} + +.mdi-camera-marker::before { + content: "\F19A7"; +} + +.mdi-camera-marker-outline::before { + content: "\F19A8"; +} + +.mdi-camera-metering-center::before { + content: "\F07A2"; +} + +.mdi-camera-metering-matrix::before { + content: "\F07A3"; +} + +.mdi-camera-metering-partial::before { + content: "\F07A4"; +} + +.mdi-camera-metering-spot::before { + content: "\F07A5"; +} + +.mdi-camera-off::before { + content: "\F05DF"; +} + +.mdi-camera-off-outline::before { + content: "\F19BF"; +} + +.mdi-camera-outline::before { + content: "\F0D5D"; +} + +.mdi-camera-party-mode::before { + content: "\F0105"; +} + +.mdi-camera-plus::before { + content: "\F0EDB"; +} + +.mdi-camera-plus-outline::before { + content: "\F0EDC"; +} + +.mdi-camera-rear::before { + content: "\F0106"; +} + +.mdi-camera-rear-variant::before { + content: "\F0107"; +} + +.mdi-camera-retake::before { + content: "\F0E19"; +} + +.mdi-camera-retake-outline::before { + content: "\F0E1A"; +} + +.mdi-camera-switch::before { + content: "\F0108"; +} + +.mdi-camera-switch-outline::before { + content: "\F084A"; +} + +.mdi-camera-timer::before { + content: "\F0109"; +} + +.mdi-camera-wireless::before { + content: "\F0DB6"; +} + +.mdi-camera-wireless-outline::before { + content: "\F0DB7"; +} + +.mdi-campfire::before { + content: "\F0EDD"; +} + +.mdi-cancel::before { + content: "\F073A"; +} + +.mdi-candelabra::before { + content: "\F17D2"; +} + +.mdi-candelabra-fire::before { + content: "\F17D3"; +} + +.mdi-candle::before { + content: "\F05E2"; +} + +.mdi-candy::before { + content: "\F1970"; +} + +.mdi-candy-off::before { + content: "\F1971"; +} + +.mdi-candy-off-outline::before { + content: "\F1972"; +} + +.mdi-candy-outline::before { + content: "\F1973"; +} + +.mdi-candycane::before { + content: "\F010A"; +} + +.mdi-cannabis::before { + content: "\F07A6"; +} + +.mdi-cannabis-off::before { + content: "\F166E"; +} + +.mdi-caps-lock::before { + content: "\F0A9B"; +} + +.mdi-car::before { + content: "\F010B"; +} + +.mdi-car-2-plus::before { + content: "\F1015"; +} + +.mdi-car-3-plus::before { + content: "\F1016"; +} + +.mdi-car-arrow-left::before { + content: "\F13B2"; +} + +.mdi-car-arrow-right::before { + content: "\F13B3"; +} + +.mdi-car-back::before { + content: "\F0E1B"; +} + +.mdi-car-battery::before { + content: "\F010C"; +} + +.mdi-car-brake-abs::before { + content: "\F0C47"; +} + +.mdi-car-brake-alert::before { + content: "\F0C48"; +} + +.mdi-car-brake-fluid-level::before { + content: "\F1909"; +} + +.mdi-car-brake-hold::before { + content: "\F0D5E"; +} + +.mdi-car-brake-low-pressure::before { + content: "\F190A"; +} + +.mdi-car-brake-parking::before { + content: "\F0D5F"; +} + +.mdi-car-brake-retarder::before { + content: "\F1017"; +} + +.mdi-car-brake-temperature::before { + content: "\F190B"; +} + +.mdi-car-brake-worn-linings::before { + content: "\F190C"; +} + +.mdi-car-child-seat::before { + content: "\F0FA3"; +} + +.mdi-car-clock::before { + content: "\F1974"; +} + +.mdi-car-clutch::before { + content: "\F1018"; +} + +.mdi-car-cog::before { + content: "\F13CC"; +} + +.mdi-car-connected::before { + content: "\F010D"; +} + +.mdi-car-convertible::before { + content: "\F07A7"; +} + +.mdi-car-coolant-level::before { + content: "\F1019"; +} + +.mdi-car-cruise-control::before { + content: "\F0D60"; +} + +.mdi-car-defrost-front::before { + content: "\F0D61"; +} + +.mdi-car-defrost-rear::before { + content: "\F0D62"; +} + +.mdi-car-door::before { + content: "\F0B6B"; +} + +.mdi-car-door-lock::before { + content: "\F109D"; +} + +.mdi-car-door-lock-open::before { + content: "\F1C81"; +} + +.mdi-car-electric::before { + content: "\F0B6C"; +} + +.mdi-car-electric-outline::before { + content: "\F15B5"; +} + +.mdi-car-emergency::before { + content: "\F160F"; +} + +.mdi-car-esp::before { + content: "\F0C49"; +} + +.mdi-car-estate::before { + content: "\F07A8"; +} + +.mdi-car-hatchback::before { + content: "\F07A9"; +} + +.mdi-car-info::before { + content: "\F11BE"; +} + +.mdi-car-key::before { + content: "\F0B6D"; +} + +.mdi-car-lifted-pickup::before { + content: "\F152D"; +} + +.mdi-car-light-alert::before { + content: "\F190D"; +} + +.mdi-car-light-dimmed::before { + content: "\F0C4A"; +} + +.mdi-car-light-fog::before { + content: "\F0C4B"; +} + +.mdi-car-light-high::before { + content: "\F0C4C"; +} + +.mdi-car-limousine::before { + content: "\F08CD"; +} + +.mdi-car-multiple::before { + content: "\F0B6E"; +} + +.mdi-car-off::before { + content: "\F0E1C"; +} + +.mdi-car-outline::before { + content: "\F14ED"; +} + +.mdi-car-parking-lights::before { + content: "\F0D63"; +} + +.mdi-car-pickup::before { + content: "\F07AA"; +} + +.mdi-car-search::before { + content: "\F1B8D"; +} + +.mdi-car-search-outline::before { + content: "\F1B8E"; +} + +.mdi-car-seat::before { + content: "\F0FA4"; +} + +.mdi-car-seat-cooler::before { + content: "\F0FA5"; +} + +.mdi-car-seat-heater::before { + content: "\F0FA6"; +} + +.mdi-car-select::before { + content: "\F1879"; +} + +.mdi-car-settings::before { + content: "\F13CD"; +} + +.mdi-car-shift-pattern::before { + content: "\F0F40"; +} + +.mdi-car-side::before { + content: "\F07AB"; +} + +.mdi-car-speed-limiter::before { + content: "\F190E"; +} + +.mdi-car-sports::before { + content: "\F07AC"; +} + +.mdi-car-tire-alert::before { + content: "\F0C4D"; +} + +.mdi-car-traction-control::before { + content: "\F0D64"; +} + +.mdi-car-turbocharger::before { + content: "\F101A"; +} + +.mdi-car-wash::before { + content: "\F010E"; +} + +.mdi-car-windshield::before { + content: "\F101B"; +} + +.mdi-car-windshield-outline::before { + content: "\F101C"; +} + +.mdi-car-wireless::before { + content: "\F1878"; +} + +.mdi-car-wrench::before { + content: "\F1814"; +} + +.mdi-carabiner::before { + content: "\F14C0"; +} + +.mdi-caravan::before { + content: "\F07AD"; +} + +.mdi-card::before { + content: "\F0B6F"; +} + +.mdi-card-account-details::before { + content: "\F05D2"; +} + +.mdi-card-account-details-outline::before { + content: "\F0DAB"; +} + +.mdi-card-account-details-star::before { + content: "\F02A3"; +} + +.mdi-card-account-details-star-outline::before { + content: "\F06DB"; +} + +.mdi-card-account-mail::before { + content: "\F018E"; +} + +.mdi-card-account-mail-outline::before { + content: "\F0E98"; +} + +.mdi-card-account-phone::before { + content: "\F0E99"; +} + +.mdi-card-account-phone-outline::before { + content: "\F0E9A"; +} + +.mdi-card-bulleted::before { + content: "\F0B70"; +} + +.mdi-card-bulleted-off::before { + content: "\F0B71"; +} + +.mdi-card-bulleted-off-outline::before { + content: "\F0B72"; +} + +.mdi-card-bulleted-outline::before { + content: "\F0B73"; +} + +.mdi-card-bulleted-settings::before { + content: "\F0B74"; +} + +.mdi-card-bulleted-settings-outline::before { + content: "\F0B75"; +} + +.mdi-card-minus::before { + content: "\F1600"; +} + +.mdi-card-minus-outline::before { + content: "\F1601"; +} + +.mdi-card-multiple::before { + content: "\F17F1"; +} + +.mdi-card-multiple-outline::before { + content: "\F17F2"; +} + +.mdi-card-off::before { + content: "\F1602"; +} + +.mdi-card-off-outline::before { + content: "\F1603"; +} + +.mdi-card-outline::before { + content: "\F0B76"; +} + +.mdi-card-plus::before { + content: "\F11FF"; +} + +.mdi-card-plus-outline::before { + content: "\F1200"; +} + +.mdi-card-remove::before { + content: "\F1604"; +} + +.mdi-card-remove-outline::before { + content: "\F1605"; +} + +.mdi-card-search::before { + content: "\F1074"; +} + +.mdi-card-search-outline::before { + content: "\F1075"; +} + +.mdi-card-text::before { + content: "\F0B77"; +} + +.mdi-card-text-outline::before { + content: "\F0B78"; +} + +.mdi-cards::before { + content: "\F0638"; +} + +.mdi-cards-club::before { + content: "\F08CE"; +} + +.mdi-cards-club-outline::before { + content: "\F189F"; +} + +.mdi-cards-diamond::before { + content: "\F08CF"; +} + +.mdi-cards-diamond-outline::before { + content: "\F101D"; +} + +.mdi-cards-heart::before { + content: "\F08D0"; +} + +.mdi-cards-heart-outline::before { + content: "\F18A0"; +} + +.mdi-cards-outline::before { + content: "\F0639"; +} + +.mdi-cards-playing::before { + content: "\F18A1"; +} + +.mdi-cards-playing-club::before { + content: "\F18A2"; +} + +.mdi-cards-playing-club-multiple::before { + content: "\F18A3"; +} + +.mdi-cards-playing-club-multiple-outline::before { + content: "\F18A4"; +} + +.mdi-cards-playing-club-outline::before { + content: "\F18A5"; +} + +.mdi-cards-playing-diamond::before { + content: "\F18A6"; +} + +.mdi-cards-playing-diamond-multiple::before { + content: "\F18A7"; +} + +.mdi-cards-playing-diamond-multiple-outline::before { + content: "\F18A8"; +} + +.mdi-cards-playing-diamond-outline::before { + content: "\F18A9"; +} + +.mdi-cards-playing-heart::before { + content: "\F18AA"; +} + +.mdi-cards-playing-heart-multiple::before { + content: "\F18AB"; +} + +.mdi-cards-playing-heart-multiple-outline::before { + content: "\F18AC"; +} + +.mdi-cards-playing-heart-outline::before { + content: "\F18AD"; +} + +.mdi-cards-playing-outline::before { + content: "\F063A"; +} + +.mdi-cards-playing-spade::before { + content: "\F18AE"; +} + +.mdi-cards-playing-spade-multiple::before { + content: "\F18AF"; +} + +.mdi-cards-playing-spade-multiple-outline::before { + content: "\F18B0"; +} + +.mdi-cards-playing-spade-outline::before { + content: "\F18B1"; +} + +.mdi-cards-spade::before { + content: "\F08D1"; +} + +.mdi-cards-spade-outline::before { + content: "\F18B2"; +} + +.mdi-cards-variant::before { + content: "\F06C7"; +} + +.mdi-carrot::before { + content: "\F010F"; +} + +.mdi-cart::before { + content: "\F0110"; +} + +.mdi-cart-arrow-down::before { + content: "\F0D66"; +} + +.mdi-cart-arrow-right::before { + content: "\F0C4E"; +} + +.mdi-cart-arrow-up::before { + content: "\F0D67"; +} + +.mdi-cart-check::before { + content: "\F15EA"; +} + +.mdi-cart-heart::before { + content: "\F18E0"; +} + +.mdi-cart-minus::before { + content: "\F0D68"; +} + +.mdi-cart-off::before { + content: "\F066B"; +} + +.mdi-cart-outline::before { + content: "\F0111"; +} + +.mdi-cart-percent::before { + content: "\F1BAE"; +} + +.mdi-cart-plus::before { + content: "\F0112"; +} + +.mdi-cart-remove::before { + content: "\F0D69"; +} + +.mdi-cart-variant::before { + content: "\F15EB"; +} + +.mdi-case-sensitive-alt::before { + content: "\F0113"; +} + +.mdi-cash::before { + content: "\F0114"; +} + +.mdi-cash-100::before { + content: "\F0115"; +} + +.mdi-cash-check::before { + content: "\F14EE"; +} + +.mdi-cash-clock::before { + content: "\F1A91"; +} + +.mdi-cash-edit::before { + content: "\F1CAB"; +} + +.mdi-cash-fast::before { + content: "\F185C"; +} + +.mdi-cash-lock::before { + content: "\F14EA"; +} + +.mdi-cash-lock-open::before { + content: "\F14EB"; +} + +.mdi-cash-marker::before { + content: "\F0DB8"; +} + +.mdi-cash-minus::before { + content: "\F1260"; +} + +.mdi-cash-multiple::before { + content: "\F0116"; +} + +.mdi-cash-off::before { + content: "\F1C79"; +} + +.mdi-cash-plus::before { + content: "\F1261"; +} + +.mdi-cash-refund::before { + content: "\F0A9C"; +} + +.mdi-cash-register::before { + content: "\F0CF4"; +} + +.mdi-cash-remove::before { + content: "\F1262"; +} + +.mdi-cash-sync::before { + content: "\F1A92"; +} + +.mdi-cassette::before { + content: "\F09D4"; +} + +.mdi-cast::before { + content: "\F0118"; +} + +.mdi-cast-audio::before { + content: "\F101E"; +} + +.mdi-cast-audio-variant::before { + content: "\F1749"; +} + +.mdi-cast-connected::before { + content: "\F0119"; +} + +.mdi-cast-education::before { + content: "\F0E1D"; +} + +.mdi-cast-off::before { + content: "\F078A"; +} + +.mdi-cast-variant::before { + content: "\F001F"; +} + +.mdi-castle::before { + content: "\F011A"; +} + +.mdi-cat::before { + content: "\F011B"; +} + +.mdi-cctv::before { + content: "\F07AE"; +} + +.mdi-cctv-off::before { + content: "\F185F"; +} + +.mdi-ceiling-fan::before { + content: "\F1797"; +} + +.mdi-ceiling-fan-light::before { + content: "\F1798"; +} + +.mdi-ceiling-light::before { + content: "\F0769"; +} + +.mdi-ceiling-light-multiple::before { + content: "\F18DD"; +} + +.mdi-ceiling-light-multiple-outline::before { + content: "\F18DE"; +} + +.mdi-ceiling-light-outline::before { + content: "\F17C7"; +} + +.mdi-cellphone::before { + content: "\F011C"; +} + +.mdi-cellphone-arrow-down::before { + content: "\F09D5"; +} + +.mdi-cellphone-arrow-down-variant::before { + content: "\F19C5"; +} + +.mdi-cellphone-basic::before { + content: "\F011E"; +} + +.mdi-cellphone-charging::before { + content: "\F1397"; +} + +.mdi-cellphone-check::before { + content: "\F17FD"; +} + +.mdi-cellphone-cog::before { + content: "\F0951"; +} + +.mdi-cellphone-dock::before { + content: "\F011F"; +} + +.mdi-cellphone-information::before { + content: "\F0F41"; +} + +.mdi-cellphone-key::before { + content: "\F094E"; +} + +.mdi-cellphone-link::before { + content: "\F0121"; +} + +.mdi-cellphone-link-off::before { + content: "\F0122"; +} + +.mdi-cellphone-lock::before { + content: "\F094F"; +} + +.mdi-cellphone-marker::before { + content: "\F183A"; +} + +.mdi-cellphone-message::before { + content: "\F08D3"; +} + +.mdi-cellphone-message-off::before { + content: "\F10D2"; +} + +.mdi-cellphone-nfc::before { + content: "\F0E90"; +} + +.mdi-cellphone-nfc-off::before { + content: "\F12D8"; +} + +.mdi-cellphone-off::before { + content: "\F0950"; +} + +.mdi-cellphone-play::before { + content: "\F101F"; +} + +.mdi-cellphone-remove::before { + content: "\F094D"; +} + +.mdi-cellphone-screenshot::before { + content: "\F0A35"; +} + +.mdi-cellphone-settings::before { + content: "\F0123"; +} + +.mdi-cellphone-sound::before { + content: "\F0952"; +} + +.mdi-cellphone-text::before { + content: "\F08D2"; +} + +.mdi-cellphone-wireless::before { + content: "\F0815"; +} + +.mdi-centos::before { + content: "\F111A"; +} + +.mdi-certificate::before { + content: "\F0124"; +} + +.mdi-certificate-outline::before { + content: "\F1188"; +} + +.mdi-chair-rolling::before { + content: "\F0F48"; +} + +.mdi-chair-school::before { + content: "\F0125"; +} + +.mdi-chandelier::before { + content: "\F1793"; +} + +.mdi-charity::before { + content: "\F0C4F"; +} + +.mdi-charity-search::before { + content: "\F1C82"; +} + +.mdi-chart-arc::before { + content: "\F0126"; +} + +.mdi-chart-areaspline::before { + content: "\F0127"; +} + +.mdi-chart-areaspline-variant::before { + content: "\F0E91"; +} + +.mdi-chart-bar::before { + content: "\F0128"; +} + +.mdi-chart-bar-stacked::before { + content: "\F076A"; +} + +.mdi-chart-bell-curve::before { + content: "\F0C50"; +} + +.mdi-chart-bell-curve-cumulative::before { + content: "\F0FA7"; +} + +.mdi-chart-box::before { + content: "\F154D"; +} + +.mdi-chart-box-multiple::before { + content: "\F1CCD"; +} + +.mdi-chart-box-multiple-outline::before { + content: "\F1CCE"; +} + +.mdi-chart-box-outline::before { + content: "\F154E"; +} + +.mdi-chart-box-plus-outline::before { + content: "\F154F"; +} + +.mdi-chart-bubble::before { + content: "\F05E3"; +} + +.mdi-chart-donut::before { + content: "\F07AF"; +} + +.mdi-chart-donut-variant::before { + content: "\F07B0"; +} + +.mdi-chart-gantt::before { + content: "\F066C"; +} + +.mdi-chart-histogram::before { + content: "\F0129"; +} + +.mdi-chart-line::before { + content: "\F012A"; +} + +.mdi-chart-line-stacked::before { + content: "\F076B"; +} + +.mdi-chart-line-variant::before { + content: "\F07B1"; +} + +.mdi-chart-multiline::before { + content: "\F08D4"; +} + +.mdi-chart-multiple::before { + content: "\F1213"; +} + +.mdi-chart-pie::before { + content: "\F012B"; +} + +.mdi-chart-pie-outline::before { + content: "\F1BDF"; +} + +.mdi-chart-ppf::before { + content: "\F1380"; +} + +.mdi-chart-sankey::before { + content: "\F11DF"; +} + +.mdi-chart-sankey-variant::before { + content: "\F11E0"; +} + +.mdi-chart-scatter-plot::before { + content: "\F0E92"; +} + +.mdi-chart-scatter-plot-hexbin::before { + content: "\F066D"; +} + +.mdi-chart-timeline::before { + content: "\F066E"; +} + +.mdi-chart-timeline-variant::before { + content: "\F0E93"; +} + +.mdi-chart-timeline-variant-shimmer::before { + content: "\F15B6"; +} + +.mdi-chart-tree::before { + content: "\F0E94"; +} + +.mdi-chart-waterfall::before { + content: "\F1918"; +} + +.mdi-chat::before { + content: "\F0B79"; +} + +.mdi-chat-alert::before { + content: "\F0B7A"; +} + +.mdi-chat-alert-outline::before { + content: "\F12C9"; +} + +.mdi-chat-minus::before { + content: "\F1410"; +} + +.mdi-chat-minus-outline::before { + content: "\F1413"; +} + +.mdi-chat-outline::before { + content: "\F0EDE"; +} + +.mdi-chat-plus::before { + content: "\F140F"; +} + +.mdi-chat-plus-outline::before { + content: "\F1412"; +} + +.mdi-chat-processing::before { + content: "\F0B7B"; +} + +.mdi-chat-processing-outline::before { + content: "\F12CA"; +} + +.mdi-chat-question::before { + content: "\F1738"; +} + +.mdi-chat-question-outline::before { + content: "\F1739"; +} + +.mdi-chat-remove::before { + content: "\F1411"; +} + +.mdi-chat-remove-outline::before { + content: "\F1414"; +} + +.mdi-chat-sleep::before { + content: "\F12D1"; +} + +.mdi-chat-sleep-outline::before { + content: "\F12D2"; +} + +.mdi-check::before { + content: "\F012C"; +} + +.mdi-check-all::before { + content: "\F012D"; +} + +.mdi-check-bold::before { + content: "\F0E1E"; +} + +.mdi-check-circle::before { + content: "\F05E0"; +} + +.mdi-check-circle-outline::before { + content: "\F05E1"; +} + +.mdi-check-decagram::before { + content: "\F0791"; +} + +.mdi-check-decagram-outline::before { + content: "\F1740"; +} + +.mdi-check-network::before { + content: "\F0C53"; +} + +.mdi-check-network-outline::before { + content: "\F0C54"; +} + +.mdi-check-outline::before { + content: "\F0855"; +} + +.mdi-check-underline::before { + content: "\F0E1F"; +} + +.mdi-check-underline-circle::before { + content: "\F0E20"; +} + +.mdi-check-underline-circle-outline::before { + content: "\F0E21"; +} + +.mdi-checkbook::before { + content: "\F0A9D"; +} + +.mdi-checkbook-arrow-left::before { + content: "\F1C1D"; +} + +.mdi-checkbook-arrow-right::before { + content: "\F1C1E"; +} + +.mdi-checkbox-blank::before { + content: "\F012E"; +} + +.mdi-checkbox-blank-badge::before { + content: "\F1176"; +} + +.mdi-checkbox-blank-badge-outline::before { + content: "\F0117"; +} + +.mdi-checkbox-blank-circle::before { + content: "\F012F"; +} + +.mdi-checkbox-blank-circle-outline::before { + content: "\F0130"; +} + +.mdi-checkbox-blank-off::before { + content: "\F12EC"; +} + +.mdi-checkbox-blank-off-outline::before { + content: "\F12ED"; +} + +.mdi-checkbox-blank-outline::before { + content: "\F0131"; +} + +.mdi-checkbox-intermediate::before { + content: "\F0856"; +} + +.mdi-checkbox-intermediate-variant::before { + content: "\F1B54"; +} + +.mdi-checkbox-marked::before { + content: "\F0132"; +} + +.mdi-checkbox-marked-circle::before { + content: "\F0133"; +} + +.mdi-checkbox-marked-circle-auto-outline::before { + content: "\F1C26"; +} + +.mdi-checkbox-marked-circle-minus-outline::before { + content: "\F1C27"; +} + +.mdi-checkbox-marked-circle-outline::before { + content: "\F0134"; +} + +.mdi-checkbox-marked-circle-plus-outline::before { + content: "\F1927"; +} + +.mdi-checkbox-marked-outline::before { + content: "\F0135"; +} + +.mdi-checkbox-multiple-blank::before { + content: "\F0136"; +} + +.mdi-checkbox-multiple-blank-circle::before { + content: "\F063B"; +} + +.mdi-checkbox-multiple-blank-circle-outline::before { + content: "\F063C"; +} + +.mdi-checkbox-multiple-blank-outline::before { + content: "\F0137"; +} + +.mdi-checkbox-multiple-marked::before { + content: "\F0138"; +} + +.mdi-checkbox-multiple-marked-circle::before { + content: "\F063D"; +} + +.mdi-checkbox-multiple-marked-circle-outline::before { + content: "\F063E"; +} + +.mdi-checkbox-multiple-marked-outline::before { + content: "\F0139"; +} + +.mdi-checkbox-multiple-outline::before { + content: "\F0C51"; +} + +.mdi-checkbox-outline::before { + content: "\F0C52"; +} + +.mdi-checkerboard::before { + content: "\F013A"; +} + +.mdi-checkerboard-minus::before { + content: "\F1202"; +} + +.mdi-checkerboard-plus::before { + content: "\F1201"; +} + +.mdi-checkerboard-remove::before { + content: "\F1203"; +} + +.mdi-cheese::before { + content: "\F12B9"; +} + +.mdi-cheese-off::before { + content: "\F13EE"; +} + +.mdi-chef-hat::before { + content: "\F0B7C"; +} + +.mdi-chemical-weapon::before { + content: "\F013B"; +} + +.mdi-chess-bishop::before { + content: "\F085C"; +} + +.mdi-chess-king::before { + content: "\F0857"; +} + +.mdi-chess-knight::before { + content: "\F0858"; +} + +.mdi-chess-pawn::before { + content: "\F0859"; +} + +.mdi-chess-queen::before { + content: "\F085A"; +} + +.mdi-chess-rook::before { + content: "\F085B"; +} + +.mdi-chevron-double-down::before { + content: "\F013C"; +} + +.mdi-chevron-double-left::before { + content: "\F013D"; +} + +.mdi-chevron-double-right::before { + content: "\F013E"; +} + +.mdi-chevron-double-up::before { + content: "\F013F"; +} + +.mdi-chevron-down::before { + content: "\F0140"; +} + +.mdi-chevron-down-box::before { + content: "\F09D6"; +} + +.mdi-chevron-down-box-outline::before { + content: "\F09D7"; +} + +.mdi-chevron-down-circle::before { + content: "\F0B26"; +} + +.mdi-chevron-down-circle-outline::before { + content: "\F0B27"; +} + +.mdi-chevron-left::before { + content: "\F0141"; +} + +.mdi-chevron-left-box::before { + content: "\F09D8"; +} + +.mdi-chevron-left-box-outline::before { + content: "\F09D9"; +} + +.mdi-chevron-left-circle::before { + content: "\F0B28"; +} + +.mdi-chevron-left-circle-outline::before { + content: "\F0B29"; +} + +.mdi-chevron-right::before { + content: "\F0142"; +} + +.mdi-chevron-right-box::before { + content: "\F09DA"; +} + +.mdi-chevron-right-box-outline::before { + content: "\F09DB"; +} + +.mdi-chevron-right-circle::before { + content: "\F0B2A"; +} + +.mdi-chevron-right-circle-outline::before { + content: "\F0B2B"; +} + +.mdi-chevron-triple-down::before { + content: "\F0DB9"; +} + +.mdi-chevron-triple-left::before { + content: "\F0DBA"; +} + +.mdi-chevron-triple-right::before { + content: "\F0DBB"; +} + +.mdi-chevron-triple-up::before { + content: "\F0DBC"; +} + +.mdi-chevron-up::before { + content: "\F0143"; +} + +.mdi-chevron-up-box::before { + content: "\F09DC"; +} + +.mdi-chevron-up-box-outline::before { + content: "\F09DD"; +} + +.mdi-chevron-up-circle::before { + content: "\F0B2C"; +} + +.mdi-chevron-up-circle-outline::before { + content: "\F0B2D"; +} + +.mdi-chili-alert::before { + content: "\F17EA"; +} + +.mdi-chili-alert-outline::before { + content: "\F17EB"; +} + +.mdi-chili-hot::before { + content: "\F07B2"; +} + +.mdi-chili-hot-outline::before { + content: "\F17EC"; +} + +.mdi-chili-medium::before { + content: "\F07B3"; +} + +.mdi-chili-medium-outline::before { + content: "\F17ED"; +} + +.mdi-chili-mild::before { + content: "\F07B4"; +} + +.mdi-chili-mild-outline::before { + content: "\F17EE"; +} + +.mdi-chili-off::before { + content: "\F1467"; +} + +.mdi-chili-off-outline::before { + content: "\F17EF"; +} + +.mdi-chip::before { + content: "\F061A"; +} + +.mdi-church::before { + content: "\F0144"; +} + +.mdi-church-outline::before { + content: "\F1B02"; +} + +.mdi-cigar::before { + content: "\F1189"; +} + +.mdi-cigar-off::before { + content: "\F141B"; +} + +.mdi-circle::before { + content: "\F0765"; +} + +.mdi-circle-box::before { + content: "\F15DC"; +} + +.mdi-circle-box-outline::before { + content: "\F15DD"; +} + +.mdi-circle-double::before { + content: "\F0E95"; +} + +.mdi-circle-edit-outline::before { + content: "\F08D5"; +} + +.mdi-circle-expand::before { + content: "\F0E96"; +} + +.mdi-circle-half::before { + content: "\F1395"; +} + +.mdi-circle-half-full::before { + content: "\F1396"; +} + +.mdi-circle-medium::before { + content: "\F09DE"; +} + +.mdi-circle-multiple::before { + content: "\F0B38"; +} + +.mdi-circle-multiple-outline::before { + content: "\F0695"; +} + +.mdi-circle-off-outline::before { + content: "\F10D3"; +} + +.mdi-circle-opacity::before { + content: "\F1853"; +} + +.mdi-circle-outline::before { + content: "\F0766"; +} + +.mdi-circle-slice-1::before { + content: "\F0A9E"; +} + +.mdi-circle-slice-2::before { + content: "\F0A9F"; +} + +.mdi-circle-slice-3::before { + content: "\F0AA0"; +} + +.mdi-circle-slice-4::before { + content: "\F0AA1"; +} + +.mdi-circle-slice-5::before { + content: "\F0AA2"; +} + +.mdi-circle-slice-6::before { + content: "\F0AA3"; +} + +.mdi-circle-slice-7::before { + content: "\F0AA4"; +} + +.mdi-circle-slice-8::before { + content: "\F0AA5"; +} + +.mdi-circle-small::before { + content: "\F09DF"; +} + +.mdi-circular-saw::before { + content: "\F0E22"; +} + +.mdi-city::before { + content: "\F0146"; +} + +.mdi-city-switch::before { + content: "\F1C28"; +} + +.mdi-city-variant::before { + content: "\F0A36"; +} + +.mdi-city-variant-outline::before { + content: "\F0A37"; +} + +.mdi-clipboard::before { + content: "\F0147"; +} + +.mdi-clipboard-account::before { + content: "\F0148"; +} + +.mdi-clipboard-account-outline::before { + content: "\F0C55"; +} + +.mdi-clipboard-alert::before { + content: "\F0149"; +} + +.mdi-clipboard-alert-outline::before { + content: "\F0CF7"; +} + +.mdi-clipboard-arrow-down::before { + content: "\F014A"; +} + +.mdi-clipboard-arrow-down-outline::before { + content: "\F0C56"; +} + +.mdi-clipboard-arrow-left::before { + content: "\F014B"; +} + +.mdi-clipboard-arrow-left-outline::before { + content: "\F0CF8"; +} + +.mdi-clipboard-arrow-right::before { + content: "\F0CF9"; +} + +.mdi-clipboard-arrow-right-outline::before { + content: "\F0CFA"; +} + +.mdi-clipboard-arrow-up::before { + content: "\F0C57"; +} + +.mdi-clipboard-arrow-up-outline::before { + content: "\F0C58"; +} + +.mdi-clipboard-check::before { + content: "\F014E"; +} + +.mdi-clipboard-check-multiple::before { + content: "\F1263"; +} + +.mdi-clipboard-check-multiple-outline::before { + content: "\F1264"; +} + +.mdi-clipboard-check-outline::before { + content: "\F08A8"; +} + +.mdi-clipboard-clock::before { + content: "\F16E2"; +} + +.mdi-clipboard-clock-outline::before { + content: "\F16E3"; +} + +.mdi-clipboard-edit::before { + content: "\F14E5"; +} + +.mdi-clipboard-edit-outline::before { + content: "\F14E6"; +} + +.mdi-clipboard-file::before { + content: "\F1265"; +} + +.mdi-clipboard-file-outline::before { + content: "\F1266"; +} + +.mdi-clipboard-flow::before { + content: "\F06C8"; +} + +.mdi-clipboard-flow-outline::before { + content: "\F1117"; +} + +.mdi-clipboard-list::before { + content: "\F10D4"; +} + +.mdi-clipboard-list-outline::before { + content: "\F10D5"; +} + +.mdi-clipboard-minus::before { + content: "\F1618"; +} + +.mdi-clipboard-minus-outline::before { + content: "\F1619"; +} + +.mdi-clipboard-multiple::before { + content: "\F1267"; +} + +.mdi-clipboard-multiple-outline::before { + content: "\F1268"; +} + +.mdi-clipboard-off::before { + content: "\F161A"; +} + +.mdi-clipboard-off-outline::before { + content: "\F161B"; +} + +.mdi-clipboard-outline::before { + content: "\F014C"; +} + +.mdi-clipboard-play::before { + content: "\F0C59"; +} + +.mdi-clipboard-play-multiple::before { + content: "\F1269"; +} + +.mdi-clipboard-play-multiple-outline::before { + content: "\F126A"; +} + +.mdi-clipboard-play-outline::before { + content: "\F0C5A"; +} + +.mdi-clipboard-plus::before { + content: "\F0751"; +} + +.mdi-clipboard-plus-outline::before { + content: "\F131F"; +} + +.mdi-clipboard-pulse::before { + content: "\F085D"; +} + +.mdi-clipboard-pulse-outline::before { + content: "\F085E"; +} + +.mdi-clipboard-remove::before { + content: "\F161C"; +} + +.mdi-clipboard-remove-outline::before { + content: "\F161D"; +} + +.mdi-clipboard-search::before { + content: "\F161E"; +} + +.mdi-clipboard-search-outline::before { + content: "\F161F"; +} + +.mdi-clipboard-text::before { + content: "\F014D"; +} + +.mdi-clipboard-text-clock::before { + content: "\F18F9"; +} + +.mdi-clipboard-text-clock-outline::before { + content: "\F18FA"; +} + +.mdi-clipboard-text-multiple::before { + content: "\F126B"; +} + +.mdi-clipboard-text-multiple-outline::before { + content: "\F126C"; +} + +.mdi-clipboard-text-off::before { + content: "\F1620"; +} + +.mdi-clipboard-text-off-outline::before { + content: "\F1621"; +} + +.mdi-clipboard-text-outline::before { + content: "\F0A38"; +} + +.mdi-clipboard-text-play::before { + content: "\F0C5B"; +} + +.mdi-clipboard-text-play-outline::before { + content: "\F0C5C"; +} + +.mdi-clipboard-text-search::before { + content: "\F1622"; +} + +.mdi-clipboard-text-search-outline::before { + content: "\F1623"; +} + +.mdi-clippy::before { + content: "\F014F"; +} + +.mdi-clock::before { + content: "\F0954"; +} + +.mdi-clock-alert::before { + content: "\F0955"; +} + +.mdi-clock-alert-outline::before { + content: "\F05CE"; +} + +.mdi-clock-check::before { + content: "\F0FA8"; +} + +.mdi-clock-check-outline::before { + content: "\F0FA9"; +} + +.mdi-clock-digital::before { + content: "\F0E97"; +} + +.mdi-clock-edit::before { + content: "\F19BA"; +} + +.mdi-clock-edit-outline::before { + content: "\F19BB"; +} + +.mdi-clock-end::before { + content: "\F0151"; +} + +.mdi-clock-fast::before { + content: "\F0152"; +} + +.mdi-clock-in::before { + content: "\F0153"; +} + +.mdi-clock-minus::before { + content: "\F1863"; +} + +.mdi-clock-minus-outline::before { + content: "\F1864"; +} + +.mdi-clock-out::before { + content: "\F0154"; +} + +.mdi-clock-outline::before { + content: "\F0150"; +} + +.mdi-clock-plus::before { + content: "\F1861"; +} + +.mdi-clock-plus-outline::before { + content: "\F1862"; +} + +.mdi-clock-remove::before { + content: "\F1865"; +} + +.mdi-clock-remove-outline::before { + content: "\F1866"; +} + +.mdi-clock-star-four-points::before { + content: "\F1C29"; +} + +.mdi-clock-star-four-points-outline::before { + content: "\F1C2A"; +} + +.mdi-clock-start::before { + content: "\F0155"; +} + +.mdi-clock-time-eight::before { + content: "\F1446"; +} + +.mdi-clock-time-eight-outline::before { + content: "\F1452"; +} + +.mdi-clock-time-eleven::before { + content: "\F1449"; +} + +.mdi-clock-time-eleven-outline::before { + content: "\F1455"; +} + +.mdi-clock-time-five::before { + content: "\F1443"; +} + +.mdi-clock-time-five-outline::before { + content: "\F144F"; +} + +.mdi-clock-time-four::before { + content: "\F1442"; +} + +.mdi-clock-time-four-outline::before { + content: "\F144E"; +} + +.mdi-clock-time-nine::before { + content: "\F1447"; +} + +.mdi-clock-time-nine-outline::before { + content: "\F1453"; +} + +.mdi-clock-time-one::before { + content: "\F143F"; +} + +.mdi-clock-time-one-outline::before { + content: "\F144B"; +} + +.mdi-clock-time-seven::before { + content: "\F1445"; +} + +.mdi-clock-time-seven-outline::before { + content: "\F1451"; +} + +.mdi-clock-time-six::before { + content: "\F1444"; +} + +.mdi-clock-time-six-outline::before { + content: "\F1450"; +} + +.mdi-clock-time-ten::before { + content: "\F1448"; +} + +.mdi-clock-time-ten-outline::before { + content: "\F1454"; +} + +.mdi-clock-time-three::before { + content: "\F1441"; +} + +.mdi-clock-time-three-outline::before { + content: "\F144D"; +} + +.mdi-clock-time-twelve::before { + content: "\F144A"; +} + +.mdi-clock-time-twelve-outline::before { + content: "\F1456"; +} + +.mdi-clock-time-two::before { + content: "\F1440"; +} + +.mdi-clock-time-two-outline::before { + content: "\F144C"; +} + +.mdi-close::before { + content: "\F0156"; +} + +.mdi-close-box::before { + content: "\F0157"; +} + +.mdi-close-box-multiple::before { + content: "\F0C5D"; +} + +.mdi-close-box-multiple-outline::before { + content: "\F0C5E"; +} + +.mdi-close-box-outline::before { + content: "\F0158"; +} + +.mdi-close-circle::before { + content: "\F0159"; +} + +.mdi-close-circle-multiple::before { + content: "\F062A"; +} + +.mdi-close-circle-multiple-outline::before { + content: "\F0883"; +} + +.mdi-close-circle-outline::before { + content: "\F015A"; +} + +.mdi-close-network::before { + content: "\F015B"; +} + +.mdi-close-network-outline::before { + content: "\F0C5F"; +} + +.mdi-close-octagon::before { + content: "\F015C"; +} + +.mdi-close-octagon-outline::before { + content: "\F015D"; +} + +.mdi-close-outline::before { + content: "\F06C9"; +} + +.mdi-close-thick::before { + content: "\F1398"; +} + +.mdi-closed-caption::before { + content: "\F015E"; +} + +.mdi-closed-caption-outline::before { + content: "\F0DBD"; +} + +.mdi-cloud::before { + content: "\F015F"; +} + +.mdi-cloud-alert::before { + content: "\F09E0"; +} + +.mdi-cloud-alert-outline::before { + content: "\F1BE0"; +} + +.mdi-cloud-arrow-down::before { + content: "\F1BE1"; +} + +.mdi-cloud-arrow-down-outline::before { + content: "\F1BE2"; +} + +.mdi-cloud-arrow-left::before { + content: "\F1BE3"; +} + +.mdi-cloud-arrow-left-outline::before { + content: "\F1BE4"; +} + +.mdi-cloud-arrow-right::before { + content: "\F1BE5"; +} + +.mdi-cloud-arrow-right-outline::before { + content: "\F1BE6"; +} + +.mdi-cloud-arrow-up::before { + content: "\F1BE7"; +} + +.mdi-cloud-arrow-up-outline::before { + content: "\F1BE8"; +} + +.mdi-cloud-braces::before { + content: "\F07B5"; +} + +.mdi-cloud-cancel::before { + content: "\F1BE9"; +} + +.mdi-cloud-cancel-outline::before { + content: "\F1BEA"; +} + +.mdi-cloud-check::before { + content: "\F1BEB"; +} + +.mdi-cloud-check-outline::before { + content: "\F1BEC"; +} + +.mdi-cloud-check-variant::before { + content: "\F0160"; +} + +.mdi-cloud-check-variant-outline::before { + content: "\F12CC"; +} + +.mdi-cloud-circle::before { + content: "\F0161"; +} + +.mdi-cloud-circle-outline::before { + content: "\F1BED"; +} + +.mdi-cloud-clock::before { + content: "\F1BEE"; +} + +.mdi-cloud-clock-outline::before { + content: "\F1BEF"; +} + +.mdi-cloud-cog::before { + content: "\F1BF0"; +} + +.mdi-cloud-cog-outline::before { + content: "\F1BF1"; +} + +.mdi-cloud-download::before { + content: "\F0162"; +} + +.mdi-cloud-download-outline::before { + content: "\F0B7D"; +} + +.mdi-cloud-key::before { + content: "\F1CA1"; +} + +.mdi-cloud-key-outline::before { + content: "\F1CA2"; +} + +.mdi-cloud-lock::before { + content: "\F11F1"; +} + +.mdi-cloud-lock-open::before { + content: "\F1BF2"; +} + +.mdi-cloud-lock-open-outline::before { + content: "\F1BF3"; +} + +.mdi-cloud-lock-outline::before { + content: "\F11F2"; +} + +.mdi-cloud-minus::before { + content: "\F1BF4"; +} + +.mdi-cloud-minus-outline::before { + content: "\F1BF5"; +} + +.mdi-cloud-off::before { + content: "\F1BF6"; +} + +.mdi-cloud-off-outline::before { + content: "\F0164"; +} + +.mdi-cloud-outline::before { + content: "\F0163"; +} + +.mdi-cloud-percent::before { + content: "\F1A35"; +} + +.mdi-cloud-percent-outline::before { + content: "\F1A36"; +} + +.mdi-cloud-plus::before { + content: "\F1BF7"; +} + +.mdi-cloud-plus-outline::before { + content: "\F1BF8"; +} + +.mdi-cloud-print::before { + content: "\F0165"; +} + +.mdi-cloud-print-outline::before { + content: "\F0166"; +} + +.mdi-cloud-question::before { + content: "\F0A39"; +} + +.mdi-cloud-question-outline::before { + content: "\F1BF9"; +} + +.mdi-cloud-refresh::before { + content: "\F1BFA"; +} + +.mdi-cloud-refresh-outline::before { + content: "\F1BFB"; +} + +.mdi-cloud-refresh-variant::before { + content: "\F052A"; +} + +.mdi-cloud-refresh-variant-outline::before { + content: "\F1BFC"; +} + +.mdi-cloud-remove::before { + content: "\F1BFD"; +} + +.mdi-cloud-remove-outline::before { + content: "\F1BFE"; +} + +.mdi-cloud-search::before { + content: "\F0956"; +} + +.mdi-cloud-search-outline::before { + content: "\F0957"; +} + +.mdi-cloud-sync::before { + content: "\F063F"; +} + +.mdi-cloud-sync-outline::before { + content: "\F12D6"; +} + +.mdi-cloud-tags::before { + content: "\F07B6"; +} + +.mdi-cloud-upload::before { + content: "\F0167"; +} + +.mdi-cloud-upload-outline::before { + content: "\F0B7E"; +} + +.mdi-clouds::before { + content: "\F1B95"; +} + +.mdi-clover::before { + content: "\F0816"; +} + +.mdi-clover-outline::before { + content: "\F1C62"; +} + +.mdi-coach-lamp::before { + content: "\F1020"; +} + +.mdi-coach-lamp-variant::before { + content: "\F1A37"; +} + +.mdi-coat-rack::before { + content: "\F109E"; +} + +.mdi-code-array::before { + content: "\F0168"; +} + +.mdi-code-block-braces::before { + content: "\F1C83"; +} + +.mdi-code-block-brackets::before { + content: "\F1C84"; +} + +.mdi-code-block-parentheses::before { + content: "\F1C85"; +} + +.mdi-code-block-tags::before { + content: "\F1C86"; +} + +.mdi-code-braces::before { + content: "\F0169"; +} + +.mdi-code-braces-box::before { + content: "\F10D6"; +} + +.mdi-code-brackets::before { + content: "\F016A"; +} + +.mdi-code-equal::before { + content: "\F016B"; +} + +.mdi-code-greater-than::before { + content: "\F016C"; +} + +.mdi-code-greater-than-or-equal::before { + content: "\F016D"; +} + +.mdi-code-json::before { + content: "\F0626"; +} + +.mdi-code-less-than::before { + content: "\F016E"; +} + +.mdi-code-less-than-or-equal::before { + content: "\F016F"; +} + +.mdi-code-not-equal::before { + content: "\F0170"; +} + +.mdi-code-not-equal-variant::before { + content: "\F0171"; +} + +.mdi-code-parentheses::before { + content: "\F0172"; +} + +.mdi-code-parentheses-box::before { + content: "\F10D7"; +} + +.mdi-code-string::before { + content: "\F0173"; +} + +.mdi-code-tags::before { + content: "\F0174"; +} + +.mdi-code-tags-check::before { + content: "\F0694"; +} + +.mdi-codepen::before { + content: "\F0175"; +} + +.mdi-coffee::before { + content: "\F0176"; +} + +.mdi-coffee-maker::before { + content: "\F109F"; +} + +.mdi-coffee-maker-check::before { + content: "\F1931"; +} + +.mdi-coffee-maker-check-outline::before { + content: "\F1932"; +} + +.mdi-coffee-maker-outline::before { + content: "\F181B"; +} + +.mdi-coffee-off::before { + content: "\F0FAA"; +} + +.mdi-coffee-off-outline::before { + content: "\F0FAB"; +} + +.mdi-coffee-outline::before { + content: "\F06CA"; +} + +.mdi-coffee-to-go::before { + content: "\F0177"; +} + +.mdi-coffee-to-go-outline::before { + content: "\F130E"; +} + +.mdi-coffin::before { + content: "\F0B7F"; +} + +.mdi-cog::before { + content: "\F0493"; +} + +.mdi-cog-box::before { + content: "\F0494"; +} + +.mdi-cog-clockwise::before { + content: "\F11DD"; +} + +.mdi-cog-counterclockwise::before { + content: "\F11DE"; +} + +.mdi-cog-off::before { + content: "\F13CE"; +} + +.mdi-cog-off-outline::before { + content: "\F13CF"; +} + +.mdi-cog-outline::before { + content: "\F08BB"; +} + +.mdi-cog-pause::before { + content: "\F1933"; +} + +.mdi-cog-pause-outline::before { + content: "\F1934"; +} + +.mdi-cog-play::before { + content: "\F1935"; +} + +.mdi-cog-play-outline::before { + content: "\F1936"; +} + +.mdi-cog-refresh::before { + content: "\F145E"; +} + +.mdi-cog-refresh-outline::before { + content: "\F145F"; +} + +.mdi-cog-stop::before { + content: "\F1937"; +} + +.mdi-cog-stop-outline::before { + content: "\F1938"; +} + +.mdi-cog-sync::before { + content: "\F1460"; +} + +.mdi-cog-sync-outline::before { + content: "\F1461"; +} + +.mdi-cog-transfer::before { + content: "\F105B"; +} + +.mdi-cog-transfer-outline::before { + content: "\F105C"; +} + +.mdi-cogs::before { + content: "\F08D6"; +} + +.mdi-collage::before { + content: "\F0640"; +} + +.mdi-collapse-all::before { + content: "\F0AA6"; +} + +.mdi-collapse-all-outline::before { + content: "\F0AA7"; +} + +.mdi-color-helper::before { + content: "\F0179"; +} + +.mdi-comma::before { + content: "\F0E23"; +} + +.mdi-comma-box::before { + content: "\F0E2B"; +} + +.mdi-comma-box-outline::before { + content: "\F0E24"; +} + +.mdi-comma-circle::before { + content: "\F0E25"; +} + +.mdi-comma-circle-outline::before { + content: "\F0E26"; +} + +.mdi-comment::before { + content: "\F017A"; +} + +.mdi-comment-account::before { + content: "\F017B"; +} + +.mdi-comment-account-outline::before { + content: "\F017C"; +} + +.mdi-comment-alert::before { + content: "\F017D"; +} + +.mdi-comment-alert-outline::before { + content: "\F017E"; +} + +.mdi-comment-arrow-left::before { + content: "\F09E1"; +} + +.mdi-comment-arrow-left-outline::before { + content: "\F09E2"; +} + +.mdi-comment-arrow-right::before { + content: "\F09E3"; +} + +.mdi-comment-arrow-right-outline::before { + content: "\F09E4"; +} + +.mdi-comment-bookmark::before { + content: "\F15AE"; +} + +.mdi-comment-bookmark-outline::before { + content: "\F15AF"; +} + +.mdi-comment-check::before { + content: "\F017F"; +} + +.mdi-comment-check-outline::before { + content: "\F0180"; +} + +.mdi-comment-edit::before { + content: "\F11BF"; +} + +.mdi-comment-edit-outline::before { + content: "\F12C4"; +} + +.mdi-comment-eye::before { + content: "\F0A3A"; +} + +.mdi-comment-eye-outline::before { + content: "\F0A3B"; +} + +.mdi-comment-flash::before { + content: "\F15B0"; +} + +.mdi-comment-flash-outline::before { + content: "\F15B1"; +} + +.mdi-comment-minus::before { + content: "\F15DF"; +} + +.mdi-comment-minus-outline::before { + content: "\F15E0"; +} + +.mdi-comment-multiple::before { + content: "\F085F"; +} + +.mdi-comment-multiple-outline::before { + content: "\F0181"; +} + +.mdi-comment-off::before { + content: "\F15E1"; +} + +.mdi-comment-off-outline::before { + content: "\F15E2"; +} + +.mdi-comment-outline::before { + content: "\F0182"; +} + +.mdi-comment-plus::before { + content: "\F09E5"; +} + +.mdi-comment-plus-outline::before { + content: "\F0183"; +} + +.mdi-comment-processing::before { + content: "\F0184"; +} + +.mdi-comment-processing-outline::before { + content: "\F0185"; +} + +.mdi-comment-question::before { + content: "\F0817"; +} + +.mdi-comment-question-outline::before { + content: "\F0186"; +} + +.mdi-comment-quote::before { + content: "\F1021"; +} + +.mdi-comment-quote-outline::before { + content: "\F1022"; +} + +.mdi-comment-remove::before { + content: "\F05DE"; +} + +.mdi-comment-remove-outline::before { + content: "\F0187"; +} + +.mdi-comment-search::before { + content: "\F0A3C"; +} + +.mdi-comment-search-outline::before { + content: "\F0A3D"; +} + +.mdi-comment-text::before { + content: "\F0188"; +} + +.mdi-comment-text-multiple::before { + content: "\F0860"; +} + +.mdi-comment-text-multiple-outline::before { + content: "\F0861"; +} + +.mdi-comment-text-outline::before { + content: "\F0189"; +} + +.mdi-compare::before { + content: "\F018A"; +} + +.mdi-compare-horizontal::before { + content: "\F1492"; +} + +.mdi-compare-remove::before { + content: "\F18B3"; +} + +.mdi-compare-vertical::before { + content: "\F1493"; +} + +.mdi-compass::before { + content: "\F018B"; +} + +.mdi-compass-off::before { + content: "\F0B80"; +} + +.mdi-compass-off-outline::before { + content: "\F0B81"; +} + +.mdi-compass-outline::before { + content: "\F018C"; +} + +.mdi-compass-rose::before { + content: "\F1382"; +} + +.mdi-compost::before { + content: "\F1A38"; +} + +.mdi-cone::before { + content: "\F194C"; +} + +.mdi-cone-off::before { + content: "\F194D"; +} + +.mdi-connection::before { + content: "\F1616"; +} + +.mdi-console::before { + content: "\F018D"; +} + +.mdi-console-line::before { + content: "\F07B7"; +} + +.mdi-console-network::before { + content: "\F08A9"; +} + +.mdi-console-network-outline::before { + content: "\F0C60"; +} + +.mdi-consolidate::before { + content: "\F10D8"; +} + +.mdi-contactless-payment::before { + content: "\F0D6A"; +} + +.mdi-contactless-payment-circle::before { + content: "\F0321"; +} + +.mdi-contactless-payment-circle-outline::before { + content: "\F0408"; +} + +.mdi-contacts::before { + content: "\F06CB"; +} + +.mdi-contacts-outline::before { + content: "\F05B8"; +} + +.mdi-contain::before { + content: "\F0A3E"; +} + +.mdi-contain-end::before { + content: "\F0A3F"; +} + +.mdi-contain-start::before { + content: "\F0A40"; +} + +.mdi-content-copy::before { + content: "\F018F"; +} + +.mdi-content-cut::before { + content: "\F0190"; +} + +.mdi-content-duplicate::before { + content: "\F0191"; +} + +.mdi-content-paste::before { + content: "\F0192"; +} + +.mdi-content-save::before { + content: "\F0193"; +} + +.mdi-content-save-alert::before { + content: "\F0F42"; +} + +.mdi-content-save-alert-outline::before { + content: "\F0F43"; +} + +.mdi-content-save-all::before { + content: "\F0194"; +} + +.mdi-content-save-all-outline::before { + content: "\F0F44"; +} + +.mdi-content-save-check::before { + content: "\F18EA"; +} + +.mdi-content-save-check-outline::before { + content: "\F18EB"; +} + +.mdi-content-save-cog::before { + content: "\F145B"; +} + +.mdi-content-save-cog-outline::before { + content: "\F145C"; +} + +.mdi-content-save-edit::before { + content: "\F0CFB"; +} + +.mdi-content-save-edit-outline::before { + content: "\F0CFC"; +} + +.mdi-content-save-minus::before { + content: "\F1B43"; +} + +.mdi-content-save-minus-outline::before { + content: "\F1B44"; +} + +.mdi-content-save-move::before { + content: "\F0E27"; +} + +.mdi-content-save-move-outline::before { + content: "\F0E28"; +} + +.mdi-content-save-off::before { + content: "\F1643"; +} + +.mdi-content-save-off-outline::before { + content: "\F1644"; +} + +.mdi-content-save-outline::before { + content: "\F0818"; +} + +.mdi-content-save-plus::before { + content: "\F1B41"; +} + +.mdi-content-save-plus-outline::before { + content: "\F1B42"; +} + +.mdi-content-save-settings::before { + content: "\F061B"; +} + +.mdi-content-save-settings-outline::before { + content: "\F0B2E"; +} + +.mdi-contrast::before { + content: "\F0195"; +} + +.mdi-contrast-box::before { + content: "\F0196"; +} + +.mdi-contrast-circle::before { + content: "\F0197"; +} + +.mdi-controller::before { + content: "\F02B4"; +} + +.mdi-controller-classic::before { + content: "\F0B82"; +} + +.mdi-controller-classic-outline::before { + content: "\F0B83"; +} + +.mdi-controller-off::before { + content: "\F02B5"; +} + +.mdi-cookie::before { + content: "\F0198"; +} + +.mdi-cookie-alert::before { + content: "\F16D0"; +} + +.mdi-cookie-alert-outline::before { + content: "\F16D1"; +} + +.mdi-cookie-check::before { + content: "\F16D2"; +} + +.mdi-cookie-check-outline::before { + content: "\F16D3"; +} + +.mdi-cookie-clock::before { + content: "\F16E4"; +} + +.mdi-cookie-clock-outline::before { + content: "\F16E5"; +} + +.mdi-cookie-cog::before { + content: "\F16D4"; +} + +.mdi-cookie-cog-outline::before { + content: "\F16D5"; +} + +.mdi-cookie-edit::before { + content: "\F16E6"; +} + +.mdi-cookie-edit-outline::before { + content: "\F16E7"; +} + +.mdi-cookie-lock::before { + content: "\F16E8"; +} + +.mdi-cookie-lock-outline::before { + content: "\F16E9"; +} + +.mdi-cookie-minus::before { + content: "\F16DA"; +} + +.mdi-cookie-minus-outline::before { + content: "\F16DB"; +} + +.mdi-cookie-off::before { + content: "\F16EA"; +} + +.mdi-cookie-off-outline::before { + content: "\F16EB"; +} + +.mdi-cookie-outline::before { + content: "\F16DE"; +} + +.mdi-cookie-plus::before { + content: "\F16D6"; +} + +.mdi-cookie-plus-outline::before { + content: "\F16D7"; +} + +.mdi-cookie-refresh::before { + content: "\F16EC"; +} + +.mdi-cookie-refresh-outline::before { + content: "\F16ED"; +} + +.mdi-cookie-remove::before { + content: "\F16D8"; +} + +.mdi-cookie-remove-outline::before { + content: "\F16D9"; +} + +.mdi-cookie-settings::before { + content: "\F16DC"; +} + +.mdi-cookie-settings-outline::before { + content: "\F16DD"; +} + +.mdi-coolant-temperature::before { + content: "\F03C8"; +} + +.mdi-copyleft::before { + content: "\F1939"; +} + +.mdi-copyright::before { + content: "\F05E6"; +} + +.mdi-cordova::before { + content: "\F0958"; +} + +.mdi-corn::before { + content: "\F07B8"; +} + +.mdi-corn-off::before { + content: "\F13EF"; +} + +.mdi-cosine-wave::before { + content: "\F1479"; +} + +.mdi-counter::before { + content: "\F0199"; +} + +.mdi-countertop::before { + content: "\F181C"; +} + +.mdi-countertop-outline::before { + content: "\F181D"; +} + +.mdi-cow::before { + content: "\F019A"; +} + +.mdi-cow-off::before { + content: "\F18FC"; +} + +.mdi-cpu-32-bit::before { + content: "\F0EDF"; +} + +.mdi-cpu-64-bit::before { + content: "\F0EE0"; +} + +.mdi-cradle::before { + content: "\F198B"; +} + +.mdi-cradle-outline::before { + content: "\F1991"; +} + +.mdi-crane::before { + content: "\F0862"; +} + +.mdi-creation::before { + content: "\F0674"; +} + +.mdi-creation-outline::before { + content: "\F1C2B"; +} + +.mdi-creative-commons::before { + content: "\F0D6B"; +} + +.mdi-credit-card::before { + content: "\F0FEF"; +} + +.mdi-credit-card-check::before { + content: "\F13D0"; +} + +.mdi-credit-card-check-outline::before { + content: "\F13D1"; +} + +.mdi-credit-card-chip::before { + content: "\F190F"; +} + +.mdi-credit-card-chip-outline::before { + content: "\F1910"; +} + +.mdi-credit-card-clock::before { + content: "\F0EE1"; +} + +.mdi-credit-card-clock-outline::before { + content: "\F0EE2"; +} + +.mdi-credit-card-edit::before { + content: "\F17D7"; +} + +.mdi-credit-card-edit-outline::before { + content: "\F17D8"; +} + +.mdi-credit-card-fast::before { + content: "\F1911"; +} + +.mdi-credit-card-fast-outline::before { + content: "\F1912"; +} + +.mdi-credit-card-lock::before { + content: "\F18E7"; +} + +.mdi-credit-card-lock-outline::before { + content: "\F18E8"; +} + +.mdi-credit-card-marker::before { + content: "\F06A8"; +} + +.mdi-credit-card-marker-outline::before { + content: "\F0DBE"; +} + +.mdi-credit-card-minus::before { + content: "\F0FAC"; +} + +.mdi-credit-card-minus-outline::before { + content: "\F0FAD"; +} + +.mdi-credit-card-multiple::before { + content: "\F0FF0"; +} + +.mdi-credit-card-multiple-outline::before { + content: "\F019C"; +} + +.mdi-credit-card-off::before { + content: "\F0FF1"; +} + +.mdi-credit-card-off-outline::before { + content: "\F05E4"; +} + +.mdi-credit-card-outline::before { + content: "\F019B"; +} + +.mdi-credit-card-plus::before { + content: "\F0FF2"; +} + +.mdi-credit-card-plus-outline::before { + content: "\F0676"; +} + +.mdi-credit-card-refresh::before { + content: "\F1645"; +} + +.mdi-credit-card-refresh-outline::before { + content: "\F1646"; +} + +.mdi-credit-card-refund::before { + content: "\F0FF3"; +} + +.mdi-credit-card-refund-outline::before { + content: "\F0AA8"; +} + +.mdi-credit-card-remove::before { + content: "\F0FAE"; +} + +.mdi-credit-card-remove-outline::before { + content: "\F0FAF"; +} + +.mdi-credit-card-scan::before { + content: "\F0FF4"; +} + +.mdi-credit-card-scan-outline::before { + content: "\F019D"; +} + +.mdi-credit-card-search::before { + content: "\F1647"; +} + +.mdi-credit-card-search-outline::before { + content: "\F1648"; +} + +.mdi-credit-card-settings::before { + content: "\F0FF5"; +} + +.mdi-credit-card-settings-outline::before { + content: "\F08D7"; +} + +.mdi-credit-card-sync::before { + content: "\F1649"; +} + +.mdi-credit-card-sync-outline::before { + content: "\F164A"; +} + +.mdi-credit-card-wireless::before { + content: "\F0802"; +} + +.mdi-credit-card-wireless-off::before { + content: "\F057A"; +} + +.mdi-credit-card-wireless-off-outline::before { + content: "\F057B"; +} + +.mdi-credit-card-wireless-outline::before { + content: "\F0D6C"; +} + +.mdi-cricket::before { + content: "\F0D6D"; +} + +.mdi-crop::before { + content: "\F019E"; +} + +.mdi-crop-free::before { + content: "\F019F"; +} + +.mdi-crop-landscape::before { + content: "\F01A0"; +} + +.mdi-crop-portrait::before { + content: "\F01A1"; +} + +.mdi-crop-rotate::before { + content: "\F0696"; +} + +.mdi-crop-square::before { + content: "\F01A2"; +} + +.mdi-cross::before { + content: "\F0953"; +} + +.mdi-cross-bolnisi::before { + content: "\F0CED"; +} + +.mdi-cross-celtic::before { + content: "\F0CF5"; +} + +.mdi-cross-outline::before { + content: "\F0CF6"; +} + +.mdi-crosshairs::before { + content: "\F01A3"; +} + +.mdi-crosshairs-gps::before { + content: "\F01A4"; +} + +.mdi-crosshairs-off::before { + content: "\F0F45"; +} + +.mdi-crosshairs-question::before { + content: "\F1136"; +} + +.mdi-crowd::before { + content: "\F1975"; +} + +.mdi-crown::before { + content: "\F01A5"; +} + +.mdi-crown-circle::before { + content: "\F17DC"; +} + +.mdi-crown-circle-outline::before { + content: "\F17DD"; +} + +.mdi-crown-outline::before { + content: "\F11D0"; +} + +.mdi-cryengine::before { + content: "\F0959"; +} + +.mdi-crystal-ball::before { + content: "\F0B2F"; +} + +.mdi-cube::before { + content: "\F01A6"; +} + +.mdi-cube-off::before { + content: "\F141C"; +} + +.mdi-cube-off-outline::before { + content: "\F141D"; +} + +.mdi-cube-outline::before { + content: "\F01A7"; +} + +.mdi-cube-scan::before { + content: "\F0B84"; +} + +.mdi-cube-send::before { + content: "\F01A8"; +} + +.mdi-cube-unfolded::before { + content: "\F01A9"; +} + +.mdi-cup::before { + content: "\F01AA"; +} + +.mdi-cup-off::before { + content: "\F05E5"; +} + +.mdi-cup-off-outline::before { + content: "\F137D"; +} + +.mdi-cup-outline::before { + content: "\F130F"; +} + +.mdi-cup-water::before { + content: "\F01AB"; +} + +.mdi-cupboard::before { + content: "\F0F46"; +} + +.mdi-cupboard-outline::before { + content: "\F0F47"; +} + +.mdi-cupcake::before { + content: "\F095A"; +} + +.mdi-curling::before { + content: "\F0863"; +} + +.mdi-currency-bdt::before { + content: "\F0864"; +} + +.mdi-currency-brl::before { + content: "\F0B85"; +} + +.mdi-currency-btc::before { + content: "\F01AC"; +} + +.mdi-currency-cny::before { + content: "\F07BA"; +} + +.mdi-currency-eth::before { + content: "\F07BB"; +} + +.mdi-currency-eur::before { + content: "\F01AD"; +} + +.mdi-currency-eur-off::before { + content: "\F1315"; +} + +.mdi-currency-fra::before { + content: "\F1A39"; +} + +.mdi-currency-gbp::before { + content: "\F01AE"; +} + +.mdi-currency-ils::before { + content: "\F0C61"; +} + +.mdi-currency-inr::before { + content: "\F01AF"; +} + +.mdi-currency-jpy::before { + content: "\F07BC"; +} + +.mdi-currency-krw::before { + content: "\F07BD"; +} + +.mdi-currency-kzt::before { + content: "\F0865"; +} + +.mdi-currency-mnt::before { + content: "\F1512"; +} + +.mdi-currency-ngn::before { + content: "\F01B0"; +} + +.mdi-currency-php::before { + content: "\F09E6"; +} + +.mdi-currency-rial::before { + content: "\F0E9C"; +} + +.mdi-currency-rub::before { + content: "\F01B1"; +} + +.mdi-currency-rupee::before { + content: "\F1976"; +} + +.mdi-currency-sign::before { + content: "\F07BE"; +} + +.mdi-currency-thb::before { + content: "\F1C05"; +} + +.mdi-currency-try::before { + content: "\F01B2"; +} + +.mdi-currency-twd::before { + content: "\F07BF"; +} + +.mdi-currency-uah::before { + content: "\F1B9B"; +} + +.mdi-currency-usd::before { + content: "\F01C1"; +} + +.mdi-currency-usd-off::before { + content: "\F067A"; +} + +.mdi-current-ac::before { + content: "\F1480"; +} + +.mdi-current-dc::before { + content: "\F095C"; +} + +.mdi-cursor-default::before { + content: "\F01C0"; +} + +.mdi-cursor-default-click::before { + content: "\F0CFD"; +} + +.mdi-cursor-default-click-outline::before { + content: "\F0CFE"; +} + +.mdi-cursor-default-gesture::before { + content: "\F1127"; +} + +.mdi-cursor-default-gesture-outline::before { + content: "\F1128"; +} + +.mdi-cursor-default-outline::before { + content: "\F01BF"; +} + +.mdi-cursor-move::before { + content: "\F01BE"; +} + +.mdi-cursor-pointer::before { + content: "\F01BD"; +} + +.mdi-cursor-text::before { + content: "\F05E7"; +} + +.mdi-curtains::before { + content: "\F1846"; +} + +.mdi-curtains-closed::before { + content: "\F1847"; +} + +.mdi-cylinder::before { + content: "\F194E"; +} + +.mdi-cylinder-off::before { + content: "\F194F"; +} + +.mdi-dance-ballroom::before { + content: "\F15FB"; +} + +.mdi-dance-pole::before { + content: "\F1578"; +} + +.mdi-data-matrix::before { + content: "\F153C"; +} + +.mdi-data-matrix-edit::before { + content: "\F153D"; +} + +.mdi-data-matrix-minus::before { + content: "\F153E"; +} + +.mdi-data-matrix-plus::before { + content: "\F153F"; +} + +.mdi-data-matrix-remove::before { + content: "\F1540"; +} + +.mdi-data-matrix-scan::before { + content: "\F1541"; +} + +.mdi-database::before { + content: "\F01BC"; +} + +.mdi-database-alert::before { + content: "\F163A"; +} + +.mdi-database-alert-outline::before { + content: "\F1624"; +} + +.mdi-database-arrow-down::before { + content: "\F163B"; +} + +.mdi-database-arrow-down-outline::before { + content: "\F1625"; +} + +.mdi-database-arrow-left::before { + content: "\F163C"; +} + +.mdi-database-arrow-left-outline::before { + content: "\F1626"; +} + +.mdi-database-arrow-right::before { + content: "\F163D"; +} + +.mdi-database-arrow-right-outline::before { + content: "\F1627"; +} + +.mdi-database-arrow-up::before { + content: "\F163E"; +} + +.mdi-database-arrow-up-outline::before { + content: "\F1628"; +} + +.mdi-database-check::before { + content: "\F0AA9"; +} + +.mdi-database-check-outline::before { + content: "\F1629"; +} + +.mdi-database-clock::before { + content: "\F163F"; +} + +.mdi-database-clock-outline::before { + content: "\F162A"; +} + +.mdi-database-cog::before { + content: "\F164B"; +} + +.mdi-database-cog-outline::before { + content: "\F164C"; +} + +.mdi-database-edit::before { + content: "\F0B86"; +} + +.mdi-database-edit-outline::before { + content: "\F162B"; +} + +.mdi-database-export::before { + content: "\F095E"; +} + +.mdi-database-export-outline::before { + content: "\F162C"; +} + +.mdi-database-eye::before { + content: "\F191F"; +} + +.mdi-database-eye-off::before { + content: "\F1920"; +} + +.mdi-database-eye-off-outline::before { + content: "\F1921"; +} + +.mdi-database-eye-outline::before { + content: "\F1922"; +} + +.mdi-database-import::before { + content: "\F095D"; +} + +.mdi-database-import-outline::before { + content: "\F162D"; +} + +.mdi-database-lock::before { + content: "\F0AAA"; +} + +.mdi-database-lock-outline::before { + content: "\F162E"; +} + +.mdi-database-marker::before { + content: "\F12F6"; +} + +.mdi-database-marker-outline::before { + content: "\F162F"; +} + +.mdi-database-minus::before { + content: "\F01BB"; +} + +.mdi-database-minus-outline::before { + content: "\F1630"; +} + +.mdi-database-off::before { + content: "\F1640"; +} + +.mdi-database-off-outline::before { + content: "\F1631"; +} + +.mdi-database-outline::before { + content: "\F1632"; +} + +.mdi-database-plus::before { + content: "\F01BA"; +} + +.mdi-database-plus-outline::before { + content: "\F1633"; +} + +.mdi-database-refresh::before { + content: "\F05C2"; +} + +.mdi-database-refresh-outline::before { + content: "\F1634"; +} + +.mdi-database-remove::before { + content: "\F0D00"; +} + +.mdi-database-remove-outline::before { + content: "\F1635"; +} + +.mdi-database-search::before { + content: "\F0866"; +} + +.mdi-database-search-outline::before { + content: "\F1636"; +} + +.mdi-database-settings::before { + content: "\F0D01"; +} + +.mdi-database-settings-outline::before { + content: "\F1637"; +} + +.mdi-database-sync::before { + content: "\F0CFF"; +} + +.mdi-database-sync-outline::before { + content: "\F1638"; +} + +.mdi-death-star::before { + content: "\F08D8"; +} + +.mdi-death-star-variant::before { + content: "\F08D9"; +} + +.mdi-deathly-hallows::before { + content: "\F0B87"; +} + +.mdi-debian::before { + content: "\F08DA"; +} + +.mdi-debug-step-into::before { + content: "\F01B9"; +} + +.mdi-debug-step-out::before { + content: "\F01B8"; +} + +.mdi-debug-step-over::before { + content: "\F01B7"; +} + +.mdi-decagram::before { + content: "\F076C"; +} + +.mdi-decagram-outline::before { + content: "\F076D"; +} + +.mdi-decimal::before { + content: "\F10A1"; +} + +.mdi-decimal-comma::before { + content: "\F10A2"; +} + +.mdi-decimal-comma-decrease::before { + content: "\F10A3"; +} + +.mdi-decimal-comma-increase::before { + content: "\F10A4"; +} + +.mdi-decimal-decrease::before { + content: "\F01B6"; +} + +.mdi-decimal-increase::before { + content: "\F01B5"; +} + +.mdi-delete::before { + content: "\F01B4"; +} + +.mdi-delete-alert::before { + content: "\F10A5"; +} + +.mdi-delete-alert-outline::before { + content: "\F10A6"; +} + +.mdi-delete-circle::before { + content: "\F0683"; +} + +.mdi-delete-circle-outline::before { + content: "\F0B88"; +} + +.mdi-delete-clock::before { + content: "\F1556"; +} + +.mdi-delete-clock-outline::before { + content: "\F1557"; +} + +.mdi-delete-empty::before { + content: "\F06CC"; +} + +.mdi-delete-empty-outline::before { + content: "\F0E9D"; +} + +.mdi-delete-forever::before { + content: "\F05E8"; +} + +.mdi-delete-forever-outline::before { + content: "\F0B89"; +} + +.mdi-delete-off::before { + content: "\F10A7"; +} + +.mdi-delete-off-outline::before { + content: "\F10A8"; +} + +.mdi-delete-outline::before { + content: "\F09E7"; +} + +.mdi-delete-restore::before { + content: "\F0819"; +} + +.mdi-delete-sweep::before { + content: "\F05E9"; +} + +.mdi-delete-sweep-outline::before { + content: "\F0C62"; +} + +.mdi-delete-variant::before { + content: "\F01B3"; +} + +.mdi-delta::before { + content: "\F01C2"; +} + +.mdi-desk::before { + content: "\F1239"; +} + +.mdi-desk-lamp::before { + content: "\F095F"; +} + +.mdi-desk-lamp-off::before { + content: "\F1B1F"; +} + +.mdi-desk-lamp-on::before { + content: "\F1B20"; +} + +.mdi-deskphone::before { + content: "\F01C3"; +} + +.mdi-desktop-classic::before { + content: "\F07C0"; +} + +.mdi-desktop-tower::before { + content: "\F01C5"; +} + +.mdi-desktop-tower-monitor::before { + content: "\F0AAB"; +} + +.mdi-details::before { + content: "\F01C6"; +} + +.mdi-dev-to::before { + content: "\F0D6E"; +} + +.mdi-developer-board::before { + content: "\F0697"; +} + +.mdi-deviantart::before { + content: "\F01C7"; +} + +.mdi-devices::before { + content: "\F0FB0"; +} + +.mdi-dharmachakra::before { + content: "\F094B"; +} + +.mdi-diabetes::before { + content: "\F1126"; +} + +.mdi-dialpad::before { + content: "\F061C"; +} + +.mdi-diameter::before { + content: "\F0C63"; +} + +.mdi-diameter-outline::before { + content: "\F0C64"; +} + +.mdi-diameter-variant::before { + content: "\F0C65"; +} + +.mdi-diamond::before { + content: "\F0B8A"; +} + +.mdi-diamond-outline::before { + content: "\F0B8B"; +} + +.mdi-diamond-stone::before { + content: "\F01C8"; +} + +.mdi-diaper-outline::before { + content: "\F1CCF"; +} + +.mdi-dice-1::before { + content: "\F01CA"; +} + +.mdi-dice-1-outline::before { + content: "\F114A"; +} + +.mdi-dice-2::before { + content: "\F01CB"; +} + +.mdi-dice-2-outline::before { + content: "\F114B"; +} + +.mdi-dice-3::before { + content: "\F01CC"; +} + +.mdi-dice-3-outline::before { + content: "\F114C"; +} + +.mdi-dice-4::before { + content: "\F01CD"; +} + +.mdi-dice-4-outline::before { + content: "\F114D"; +} + +.mdi-dice-5::before { + content: "\F01CE"; +} + +.mdi-dice-5-outline::before { + content: "\F114E"; +} + +.mdi-dice-6::before { + content: "\F01CF"; +} + +.mdi-dice-6-outline::before { + content: "\F114F"; +} + +.mdi-dice-d10::before { + content: "\F1153"; +} + +.mdi-dice-d10-outline::before { + content: "\F076F"; +} + +.mdi-dice-d12::before { + content: "\F1154"; +} + +.mdi-dice-d12-outline::before { + content: "\F0867"; +} + +.mdi-dice-d20::before { + content: "\F1155"; +} + +.mdi-dice-d20-outline::before { + content: "\F05EA"; +} + +.mdi-dice-d4::before { + content: "\F1150"; +} + +.mdi-dice-d4-outline::before { + content: "\F05EB"; +} + +.mdi-dice-d6::before { + content: "\F1151"; +} + +.mdi-dice-d6-outline::before { + content: "\F05ED"; +} + +.mdi-dice-d8::before { + content: "\F1152"; +} + +.mdi-dice-d8-outline::before { + content: "\F05EC"; +} + +.mdi-dice-multiple::before { + content: "\F076E"; +} + +.mdi-dice-multiple-outline::before { + content: "\F1156"; +} + +.mdi-digital-ocean::before { + content: "\F1237"; +} + +.mdi-dip-switch::before { + content: "\F07C1"; +} + +.mdi-directions::before { + content: "\F01D0"; +} + +.mdi-directions-fork::before { + content: "\F0641"; +} + +.mdi-disc::before { + content: "\F05EE"; +} + +.mdi-disc-alert::before { + content: "\F01D1"; +} + +.mdi-disc-player::before { + content: "\F0960"; +} + +.mdi-dishwasher::before { + content: "\F0AAC"; +} + +.mdi-dishwasher-alert::before { + content: "\F11B8"; +} + +.mdi-dishwasher-off::before { + content: "\F11B9"; +} + +.mdi-disqus::before { + content: "\F01D2"; +} + +.mdi-distribute-horizontal-center::before { + content: "\F11C9"; +} + +.mdi-distribute-horizontal-left::before { + content: "\F11C8"; +} + +.mdi-distribute-horizontal-right::before { + content: "\F11CA"; +} + +.mdi-distribute-vertical-bottom::before { + content: "\F11CB"; +} + +.mdi-distribute-vertical-center::before { + content: "\F11CC"; +} + +.mdi-distribute-vertical-top::before { + content: "\F11CD"; +} + +.mdi-diversify::before { + content: "\F1877"; +} + +.mdi-diving::before { + content: "\F1977"; +} + +.mdi-diving-flippers::before { + content: "\F0DBF"; +} + +.mdi-diving-helmet::before { + content: "\F0DC0"; +} + +.mdi-diving-scuba::before { + content: "\F1B77"; +} + +.mdi-diving-scuba-flag::before { + content: "\F0DC2"; +} + +.mdi-diving-scuba-mask::before { + content: "\F0DC1"; +} + +.mdi-diving-scuba-tank::before { + content: "\F0DC3"; +} + +.mdi-diving-scuba-tank-multiple::before { + content: "\F0DC4"; +} + +.mdi-diving-snorkel::before { + content: "\F0DC5"; +} + +.mdi-division::before { + content: "\F01D4"; +} + +.mdi-division-box::before { + content: "\F01D5"; +} + +.mdi-dlna::before { + content: "\F0A41"; +} + +.mdi-dna::before { + content: "\F0684"; +} + +.mdi-dns::before { + content: "\F01D6"; +} + +.mdi-dns-outline::before { + content: "\F0B8C"; +} + +.mdi-dock-bottom::before { + content: "\F10A9"; +} + +.mdi-dock-left::before { + content: "\F10AA"; +} + +.mdi-dock-right::before { + content: "\F10AB"; +} + +.mdi-dock-top::before { + content: "\F1513"; +} + +.mdi-dock-window::before { + content: "\F10AC"; +} + +.mdi-docker::before { + content: "\F0868"; +} + +.mdi-doctor::before { + content: "\F0A42"; +} + +.mdi-dog::before { + content: "\F0A43"; +} + +.mdi-dog-service::before { + content: "\F0AAD"; +} + +.mdi-dog-side::before { + content: "\F0A44"; +} + +.mdi-dog-side-off::before { + content: "\F16EE"; +} + +.mdi-dolby::before { + content: "\F06B3"; +} + +.mdi-dolly::before { + content: "\F0E9E"; +} + +.mdi-dolphin::before { + content: "\F18B4"; +} + +.mdi-domain::before { + content: "\F01D7"; +} + +.mdi-domain-off::before { + content: "\F0D6F"; +} + +.mdi-domain-plus::before { + content: "\F10AD"; +} + +.mdi-domain-remove::before { + content: "\F10AE"; +} + +.mdi-domain-switch::before { + content: "\F1C2C"; +} + +.mdi-dome-light::before { + content: "\F141E"; +} + +.mdi-domino-mask::before { + content: "\F1023"; +} + +.mdi-donkey::before { + content: "\F07C2"; +} + +.mdi-door::before { + content: "\F081A"; +} + +.mdi-door-closed::before { + content: "\F081B"; +} + +.mdi-door-closed-cancel::before { + content: "\F1C93"; +} + +.mdi-door-closed-lock::before { + content: "\F10AF"; +} + +.mdi-door-open::before { + content: "\F081C"; +} + +.mdi-door-sliding::before { + content: "\F181E"; +} + +.mdi-door-sliding-lock::before { + content: "\F181F"; +} + +.mdi-door-sliding-open::before { + content: "\F1820"; +} + +.mdi-doorbell::before { + content: "\F12E6"; +} + +.mdi-doorbell-video::before { + content: "\F0869"; +} + +.mdi-dot-net::before { + content: "\F0AAE"; +} + +.mdi-dots-circle::before { + content: "\F1978"; +} + +.mdi-dots-grid::before { + content: "\F15FC"; +} + +.mdi-dots-hexagon::before { + content: "\F15FF"; +} + +.mdi-dots-horizontal::before { + content: "\F01D8"; +} + +.mdi-dots-horizontal-circle::before { + content: "\F07C3"; +} + +.mdi-dots-horizontal-circle-outline::before { + content: "\F0B8D"; +} + +.mdi-dots-square::before { + content: "\F15FD"; +} + +.mdi-dots-triangle::before { + content: "\F15FE"; +} + +.mdi-dots-vertical::before { + content: "\F01D9"; +} + +.mdi-dots-vertical-circle::before { + content: "\F07C4"; +} + +.mdi-dots-vertical-circle-outline::before { + content: "\F0B8E"; +} + +.mdi-download::before { + content: "\F01DA"; +} + +.mdi-download-box::before { + content: "\F1462"; +} + +.mdi-download-box-outline::before { + content: "\F1463"; +} + +.mdi-download-circle::before { + content: "\F1464"; +} + +.mdi-download-circle-outline::before { + content: "\F1465"; +} + +.mdi-download-lock::before { + content: "\F1320"; +} + +.mdi-download-lock-outline::before { + content: "\F1321"; +} + +.mdi-download-multiple::before { + content: "\F09E9"; +} + +.mdi-download-multiple-outline::before { + content: "\F1CD0"; +} + +.mdi-download-network::before { + content: "\F06F4"; +} + +.mdi-download-network-outline::before { + content: "\F0C66"; +} + +.mdi-download-off::before { + content: "\F10B0"; +} + +.mdi-download-off-outline::before { + content: "\F10B1"; +} + +.mdi-download-outline::before { + content: "\F0B8F"; +} + +.mdi-drag::before { + content: "\F01DB"; +} + +.mdi-drag-horizontal::before { + content: "\F01DC"; +} + +.mdi-drag-horizontal-variant::before { + content: "\F12F0"; +} + +.mdi-drag-variant::before { + content: "\F0B90"; +} + +.mdi-drag-vertical::before { + content: "\F01DD"; +} + +.mdi-drag-vertical-variant::before { + content: "\F12F1"; +} + +.mdi-drama-masks::before { + content: "\F0D02"; +} + +.mdi-draw::before { + content: "\F0F49"; +} + +.mdi-draw-pen::before { + content: "\F19B9"; +} + +.mdi-drawing::before { + content: "\F01DE"; +} + +.mdi-drawing-box::before { + content: "\F01DF"; +} + +.mdi-dresser::before { + content: "\F0F4A"; +} + +.mdi-dresser-outline::before { + content: "\F0F4B"; +} + +.mdi-drone::before { + content: "\F01E2"; +} + +.mdi-dropbox::before { + content: "\F01E3"; +} + +.mdi-drupal::before { + content: "\F01E4"; +} + +.mdi-duck::before { + content: "\F01E5"; +} + +.mdi-dumbbell::before { + content: "\F01E6"; +} + +.mdi-dump-truck::before { + content: "\F0C67"; +} + +.mdi-ear-hearing::before { + content: "\F07C5"; +} + +.mdi-ear-hearing-loop::before { + content: "\F1AEE"; +} + +.mdi-ear-hearing-off::before { + content: "\F0A45"; +} + +.mdi-earbuds::before { + content: "\F184F"; +} + +.mdi-earbuds-off::before { + content: "\F1850"; +} + +.mdi-earbuds-off-outline::before { + content: "\F1851"; +} + +.mdi-earbuds-outline::before { + content: "\F1852"; +} + +.mdi-earth::before { + content: "\F01E7"; +} + +.mdi-earth-arrow-down::before { + content: "\F1C87"; +} + +.mdi-earth-arrow-left::before { + content: "\F1C88"; +} + +.mdi-earth-arrow-right::before { + content: "\F1311"; +} + +.mdi-earth-arrow-up::before { + content: "\F1C89"; +} + +.mdi-earth-box::before { + content: "\F06CD"; +} + +.mdi-earth-box-minus::before { + content: "\F1407"; +} + +.mdi-earth-box-off::before { + content: "\F06CE"; +} + +.mdi-earth-box-plus::before { + content: "\F1406"; +} + +.mdi-earth-box-remove::before { + content: "\F1408"; +} + +.mdi-earth-minus::before { + content: "\F1404"; +} + +.mdi-earth-off::before { + content: "\F01E8"; +} + +.mdi-earth-plus::before { + content: "\F1403"; +} + +.mdi-earth-remove::before { + content: "\F1405"; +} + +.mdi-egg::before { + content: "\F0AAF"; +} + +.mdi-egg-easter::before { + content: "\F0AB0"; +} + +.mdi-egg-fried::before { + content: "\F184A"; +} + +.mdi-egg-off::before { + content: "\F13F0"; +} + +.mdi-egg-off-outline::before { + content: "\F13F1"; +} + +.mdi-egg-outline::before { + content: "\F13F2"; +} + +.mdi-eiffel-tower::before { + content: "\F156B"; +} + +.mdi-eight-track::before { + content: "\F09EA"; +} + +.mdi-eject::before { + content: "\F01EA"; +} + +.mdi-eject-circle::before { + content: "\F1B23"; +} + +.mdi-eject-circle-outline::before { + content: "\F1B24"; +} + +.mdi-eject-outline::before { + content: "\F0B91"; +} + +.mdi-electric-switch::before { + content: "\F0E9F"; +} + +.mdi-electric-switch-closed::before { + content: "\F10D9"; +} + +.mdi-electron-framework::before { + content: "\F1024"; +} + +.mdi-elephant::before { + content: "\F07C6"; +} + +.mdi-elevation-decline::before { + content: "\F01EB"; +} + +.mdi-elevation-rise::before { + content: "\F01EC"; +} + +.mdi-elevator::before { + content: "\F01ED"; +} + +.mdi-elevator-down::before { + content: "\F12C2"; +} + +.mdi-elevator-passenger::before { + content: "\F1381"; +} + +.mdi-elevator-passenger-off::before { + content: "\F1979"; +} + +.mdi-elevator-passenger-off-outline::before { + content: "\F197A"; +} + +.mdi-elevator-passenger-outline::before { + content: "\F197B"; +} + +.mdi-elevator-up::before { + content: "\F12C1"; +} + +.mdi-ellipse::before { + content: "\F0EA0"; +} + +.mdi-ellipse-outline::before { + content: "\F0EA1"; +} + +.mdi-email::before { + content: "\F01EE"; +} + +.mdi-email-alert::before { + content: "\F06CF"; +} + +.mdi-email-alert-outline::before { + content: "\F0D42"; +} + +.mdi-email-arrow-left::before { + content: "\F10DA"; +} + +.mdi-email-arrow-left-outline::before { + content: "\F10DB"; +} + +.mdi-email-arrow-right::before { + content: "\F10DC"; +} + +.mdi-email-arrow-right-outline::before { + content: "\F10DD"; +} + +.mdi-email-box::before { + content: "\F0D03"; +} + +.mdi-email-check::before { + content: "\F0AB1"; +} + +.mdi-email-check-outline::before { + content: "\F0AB2"; +} + +.mdi-email-edit::before { + content: "\F0EE3"; +} + +.mdi-email-edit-outline::before { + content: "\F0EE4"; +} + +.mdi-email-fast::before { + content: "\F186F"; +} + +.mdi-email-fast-outline::before { + content: "\F1870"; +} + +.mdi-email-heart-outline::before { + content: "\F1C5B"; +} + +.mdi-email-lock::before { + content: "\F01F1"; +} + +.mdi-email-lock-outline::before { + content: "\F1B61"; +} + +.mdi-email-mark-as-unread::before { + content: "\F0B92"; +} + +.mdi-email-minus::before { + content: "\F0EE5"; +} + +.mdi-email-minus-outline::before { + content: "\F0EE6"; +} + +.mdi-email-multiple::before { + content: "\F0EE7"; +} + +.mdi-email-multiple-outline::before { + content: "\F0EE8"; +} + +.mdi-email-newsletter::before { + content: "\F0FB1"; +} + +.mdi-email-off::before { + content: "\F13E3"; +} + +.mdi-email-off-outline::before { + content: "\F13E4"; +} + +.mdi-email-open::before { + content: "\F01EF"; +} + +.mdi-email-open-heart-outline::before { + content: "\F1C5C"; +} + +.mdi-email-open-multiple::before { + content: "\F0EE9"; +} + +.mdi-email-open-multiple-outline::before { + content: "\F0EEA"; +} + +.mdi-email-open-outline::before { + content: "\F05EF"; +} + +.mdi-email-outline::before { + content: "\F01F0"; +} + +.mdi-email-plus::before { + content: "\F09EB"; +} + +.mdi-email-plus-outline::before { + content: "\F09EC"; +} + +.mdi-email-remove::before { + content: "\F1661"; +} + +.mdi-email-remove-outline::before { + content: "\F1662"; +} + +.mdi-email-seal::before { + content: "\F195B"; +} + +.mdi-email-seal-outline::before { + content: "\F195C"; +} + +.mdi-email-search::before { + content: "\F0961"; +} + +.mdi-email-search-outline::before { + content: "\F0962"; +} + +.mdi-email-sync::before { + content: "\F12C7"; +} + +.mdi-email-sync-outline::before { + content: "\F12C8"; +} + +.mdi-email-variant::before { + content: "\F05F0"; +} + +.mdi-ember::before { + content: "\F0B30"; +} + +.mdi-emby::before { + content: "\F06B4"; +} + +.mdi-emoticon::before { + content: "\F0C68"; +} + +.mdi-emoticon-angry::before { + content: "\F0C69"; +} + +.mdi-emoticon-angry-outline::before { + content: "\F0C6A"; +} + +.mdi-emoticon-confused::before { + content: "\F10DE"; +} + +.mdi-emoticon-confused-outline::before { + content: "\F10DF"; +} + +.mdi-emoticon-cool::before { + content: "\F0C6B"; +} + +.mdi-emoticon-cool-outline::before { + content: "\F01F3"; +} + +.mdi-emoticon-cry::before { + content: "\F0C6C"; +} + +.mdi-emoticon-cry-outline::before { + content: "\F0C6D"; +} + +.mdi-emoticon-dead::before { + content: "\F0C6E"; +} + +.mdi-emoticon-dead-outline::before { + content: "\F069B"; +} + +.mdi-emoticon-devil::before { + content: "\F0C6F"; +} + +.mdi-emoticon-devil-outline::before { + content: "\F01F4"; +} + +.mdi-emoticon-excited::before { + content: "\F0C70"; +} + +.mdi-emoticon-excited-outline::before { + content: "\F069C"; +} + +.mdi-emoticon-frown::before { + content: "\F0F4C"; +} + +.mdi-emoticon-frown-outline::before { + content: "\F0F4D"; +} + +.mdi-emoticon-happy::before { + content: "\F0C71"; +} + +.mdi-emoticon-happy-outline::before { + content: "\F01F5"; +} + +.mdi-emoticon-kiss::before { + content: "\F0C72"; +} + +.mdi-emoticon-kiss-outline::before { + content: "\F0C73"; +} + +.mdi-emoticon-lol::before { + content: "\F1214"; +} + +.mdi-emoticon-lol-outline::before { + content: "\F1215"; +} + +.mdi-emoticon-minus::before { + content: "\F1CB2"; +} + +.mdi-emoticon-minus-outline::before { + content: "\F1CB3"; +} + +.mdi-emoticon-neutral::before { + content: "\F0C74"; +} + +.mdi-emoticon-neutral-outline::before { + content: "\F01F6"; +} + +.mdi-emoticon-outline::before { + content: "\F01F2"; +} + +.mdi-emoticon-plus::before { + content: "\F1CB4"; +} + +.mdi-emoticon-plus-outline::before { + content: "\F1CB5"; +} + +.mdi-emoticon-poop::before { + content: "\F01F7"; +} + +.mdi-emoticon-poop-outline::before { + content: "\F0C75"; +} + +.mdi-emoticon-remove::before { + content: "\F1CB6"; +} + +.mdi-emoticon-remove-outline::before { + content: "\F1CB7"; +} + +.mdi-emoticon-sad::before { + content: "\F0C76"; +} + +.mdi-emoticon-sad-outline::before { + content: "\F01F8"; +} + +.mdi-emoticon-sick::before { + content: "\F157C"; +} + +.mdi-emoticon-sick-outline::before { + content: "\F157D"; +} + +.mdi-emoticon-tongue::before { + content: "\F01F9"; +} + +.mdi-emoticon-tongue-outline::before { + content: "\F0C77"; +} + +.mdi-emoticon-wink::before { + content: "\F0C78"; +} + +.mdi-emoticon-wink-outline::before { + content: "\F0C79"; +} + +.mdi-engine::before { + content: "\F01FA"; +} + +.mdi-engine-off::before { + content: "\F0A46"; +} + +.mdi-engine-off-outline::before { + content: "\F0A47"; +} + +.mdi-engine-outline::before { + content: "\F01FB"; +} + +.mdi-epsilon::before { + content: "\F10E0"; +} + +.mdi-equal::before { + content: "\F01FC"; +} + +.mdi-equal-box::before { + content: "\F01FD"; +} + +.mdi-equalizer::before { + content: "\F0EA2"; +} + +.mdi-equalizer-outline::before { + content: "\F0EA3"; +} + +.mdi-eraser::before { + content: "\F01FE"; +} + +.mdi-eraser-variant::before { + content: "\F0642"; +} + +.mdi-escalator::before { + content: "\F01FF"; +} + +.mdi-escalator-box::before { + content: "\F1399"; +} + +.mdi-escalator-down::before { + content: "\F12C0"; +} + +.mdi-escalator-up::before { + content: "\F12BF"; +} + +.mdi-eslint::before { + content: "\F0C7A"; +} + +.mdi-et::before { + content: "\F0AB3"; +} + +.mdi-ethereum::before { + content: "\F086A"; +} + +.mdi-ethernet::before { + content: "\F0200"; +} + +.mdi-ethernet-cable::before { + content: "\F0201"; +} + +.mdi-ethernet-cable-off::before { + content: "\F0202"; +} + +.mdi-ethernet-off::before { + content: "\F1CD1"; +} + +.mdi-ev-plug-ccs1::before { + content: "\F1519"; +} + +.mdi-ev-plug-ccs2::before { + content: "\F151A"; +} + +.mdi-ev-plug-chademo::before { + content: "\F151B"; +} + +.mdi-ev-plug-tesla::before { + content: "\F151C"; +} + +.mdi-ev-plug-type1::before { + content: "\F151D"; +} + +.mdi-ev-plug-type2::before { + content: "\F151E"; +} + +.mdi-ev-station::before { + content: "\F05F1"; +} + +.mdi-evernote::before { + content: "\F0204"; +} + +.mdi-excavator::before { + content: "\F1025"; +} + +.mdi-exclamation::before { + content: "\F0205"; +} + +.mdi-exclamation-thick::before { + content: "\F1238"; +} + +.mdi-exit-run::before { + content: "\F0A48"; +} + +.mdi-exit-to-app::before { + content: "\F0206"; +} + +.mdi-expand-all::before { + content: "\F0AB4"; +} + +.mdi-expand-all-outline::before { + content: "\F0AB5"; +} + +.mdi-expansion-card::before { + content: "\F08AE"; +} + +.mdi-expansion-card-variant::before { + content: "\F0FB2"; +} + +.mdi-exponent::before { + content: "\F0963"; +} + +.mdi-exponent-box::before { + content: "\F0964"; +} + +.mdi-export::before { + content: "\F0207"; +} + +.mdi-export-variant::before { + content: "\F0B93"; +} + +.mdi-eye::before { + content: "\F0208"; +} + +.mdi-eye-arrow-left::before { + content: "\F18FD"; +} + +.mdi-eye-arrow-left-outline::before { + content: "\F18FE"; +} + +.mdi-eye-arrow-right::before { + content: "\F18FF"; +} + +.mdi-eye-arrow-right-outline::before { + content: "\F1900"; +} + +.mdi-eye-check::before { + content: "\F0D04"; +} + +.mdi-eye-check-outline::before { + content: "\F0D05"; +} + +.mdi-eye-circle::before { + content: "\F0B94"; +} + +.mdi-eye-circle-outline::before { + content: "\F0B95"; +} + +.mdi-eye-closed::before { + content: "\F1CA3"; +} + +.mdi-eye-lock::before { + content: "\F1C06"; +} + +.mdi-eye-lock-open::before { + content: "\F1C07"; +} + +.mdi-eye-lock-open-outline::before { + content: "\F1C08"; +} + +.mdi-eye-lock-outline::before { + content: "\F1C09"; +} + +.mdi-eye-minus::before { + content: "\F1026"; +} + +.mdi-eye-minus-outline::before { + content: "\F1027"; +} + +.mdi-eye-off::before { + content: "\F0209"; +} + +.mdi-eye-off-outline::before { + content: "\F06D1"; +} + +.mdi-eye-outline::before { + content: "\F06D0"; +} + +.mdi-eye-plus::before { + content: "\F086B"; +} + +.mdi-eye-plus-outline::before { + content: "\F086C"; +} + +.mdi-eye-refresh::before { + content: "\F197C"; +} + +.mdi-eye-refresh-outline::before { + content: "\F197D"; +} + +.mdi-eye-remove::before { + content: "\F15E3"; +} + +.mdi-eye-remove-outline::before { + content: "\F15E4"; +} + +.mdi-eye-settings::before { + content: "\F086D"; +} + +.mdi-eye-settings-outline::before { + content: "\F086E"; +} + +.mdi-eyedropper::before { + content: "\F020A"; +} + +.mdi-eyedropper-minus::before { + content: "\F13DD"; +} + +.mdi-eyedropper-off::before { + content: "\F13DF"; +} + +.mdi-eyedropper-plus::before { + content: "\F13DC"; +} + +.mdi-eyedropper-remove::before { + content: "\F13DE"; +} + +.mdi-eyedropper-variant::before { + content: "\F020B"; +} + +.mdi-face-agent::before { + content: "\F0D70"; +} + +.mdi-face-man::before { + content: "\F0643"; +} + +.mdi-face-man-outline::before { + content: "\F0B96"; +} + +.mdi-face-man-profile::before { + content: "\F0644"; +} + +.mdi-face-man-shimmer::before { + content: "\F15CC"; +} + +.mdi-face-man-shimmer-outline::before { + content: "\F15CD"; +} + +.mdi-face-mask::before { + content: "\F1586"; +} + +.mdi-face-mask-outline::before { + content: "\F1587"; +} + +.mdi-face-recognition::before { + content: "\F0C7B"; +} + +.mdi-face-woman::before { + content: "\F1077"; +} + +.mdi-face-woman-outline::before { + content: "\F1078"; +} + +.mdi-face-woman-profile::before { + content: "\F1076"; +} + +.mdi-face-woman-shimmer::before { + content: "\F15CE"; +} + +.mdi-face-woman-shimmer-outline::before { + content: "\F15CF"; +} + +.mdi-facebook::before { + content: "\F020C"; +} + +.mdi-facebook-gaming::before { + content: "\F07DD"; +} + +.mdi-facebook-messenger::before { + content: "\F020E"; +} + +.mdi-facebook-workplace::before { + content: "\F0B31"; +} + +.mdi-factory::before { + content: "\F020F"; +} + +.mdi-family-tree::before { + content: "\F160E"; +} + +.mdi-fan::before { + content: "\F0210"; +} + +.mdi-fan-alert::before { + content: "\F146C"; +} + +.mdi-fan-auto::before { + content: "\F171D"; +} + +.mdi-fan-chevron-down::before { + content: "\F146D"; +} + +.mdi-fan-chevron-up::before { + content: "\F146E"; +} + +.mdi-fan-clock::before { + content: "\F1A3A"; +} + +.mdi-fan-minus::before { + content: "\F1470"; +} + +.mdi-fan-off::before { + content: "\F081D"; +} + +.mdi-fan-plus::before { + content: "\F146F"; +} + +.mdi-fan-remove::before { + content: "\F1471"; +} + +.mdi-fan-speed-1::before { + content: "\F1472"; +} + +.mdi-fan-speed-2::before { + content: "\F1473"; +} + +.mdi-fan-speed-3::before { + content: "\F1474"; +} + +.mdi-fast-forward::before { + content: "\F0211"; +} + +.mdi-fast-forward-10::before { + content: "\F0D71"; +} + +.mdi-fast-forward-15::before { + content: "\F193A"; +} + +.mdi-fast-forward-30::before { + content: "\F0D06"; +} + +.mdi-fast-forward-45::before { + content: "\F1B12"; +} + +.mdi-fast-forward-5::before { + content: "\F11F8"; +} + +.mdi-fast-forward-60::before { + content: "\F160B"; +} + +.mdi-fast-forward-outline::before { + content: "\F06D2"; +} + +.mdi-faucet::before { + content: "\F1B29"; +} + +.mdi-faucet-variant::before { + content: "\F1B2A"; +} + +.mdi-fax::before { + content: "\F0212"; +} + +.mdi-feather::before { + content: "\F06D3"; +} + +.mdi-feature-search::before { + content: "\F0A49"; +} + +.mdi-feature-search-outline::before { + content: "\F0A4A"; +} + +.mdi-fedora::before { + content: "\F08DB"; +} + +.mdi-fence::before { + content: "\F179A"; +} + +.mdi-fence-electric::before { + content: "\F17F6"; +} + +.mdi-fencing::before { + content: "\F14C1"; +} + +.mdi-ferris-wheel::before { + content: "\F0EA4"; +} + +.mdi-ferry::before { + content: "\F0213"; +} + +.mdi-file::before { + content: "\F0214"; +} + +.mdi-file-account::before { + content: "\F073B"; +} + +.mdi-file-account-outline::before { + content: "\F1028"; +} + +.mdi-file-alert::before { + content: "\F0A4B"; +} + +.mdi-file-alert-outline::before { + content: "\F0A4C"; +} + +.mdi-file-arrow-left-right::before { + content: "\F1A93"; +} + +.mdi-file-arrow-left-right-outline::before { + content: "\F1A94"; +} + +.mdi-file-arrow-up-down::before { + content: "\F1A95"; +} + +.mdi-file-arrow-up-down-outline::before { + content: "\F1A96"; +} + +.mdi-file-cabinet::before { + content: "\F0AB6"; +} + +.mdi-file-cad::before { + content: "\F0EEB"; +} + +.mdi-file-cad-box::before { + content: "\F0EEC"; +} + +.mdi-file-cancel::before { + content: "\F0DC6"; +} + +.mdi-file-cancel-outline::before { + content: "\F0DC7"; +} + +.mdi-file-certificate::before { + content: "\F1186"; +} + +.mdi-file-certificate-outline::before { + content: "\F1187"; +} + +.mdi-file-chart::before { + content: "\F0215"; +} + +.mdi-file-chart-check::before { + content: "\F19C6"; +} + +.mdi-file-chart-check-outline::before { + content: "\F19C7"; +} + +.mdi-file-chart-outline::before { + content: "\F1029"; +} + +.mdi-file-check::before { + content: "\F0216"; +} + +.mdi-file-check-outline::before { + content: "\F0E29"; +} + +.mdi-file-clock::before { + content: "\F12E1"; +} + +.mdi-file-clock-outline::before { + content: "\F12E2"; +} + +.mdi-file-cloud::before { + content: "\F0217"; +} + +.mdi-file-cloud-outline::before { + content: "\F102A"; +} + +.mdi-file-code::before { + content: "\F022E"; +} + +.mdi-file-code-outline::before { + content: "\F102B"; +} + +.mdi-file-cog::before { + content: "\F107B"; +} + +.mdi-file-cog-outline::before { + content: "\F107C"; +} + +.mdi-file-compare::before { + content: "\F08AA"; +} + +.mdi-file-delimited::before { + content: "\F0218"; +} + +.mdi-file-delimited-outline::before { + content: "\F0EA5"; +} + +.mdi-file-document::before { + content: "\F0219"; +} + +.mdi-file-document-alert::before { + content: "\F1A97"; +} + +.mdi-file-document-alert-outline::before { + content: "\F1A98"; +} + +.mdi-file-document-arrow-right::before { + content: "\F1C0F"; +} + +.mdi-file-document-arrow-right-outline::before { + content: "\F1C10"; +} + +.mdi-file-document-check::before { + content: "\F1A99"; +} + +.mdi-file-document-check-outline::before { + content: "\F1A9A"; +} + +.mdi-file-document-edit::before { + content: "\F0DC8"; +} + +.mdi-file-document-edit-outline::before { + content: "\F0DC9"; +} + +.mdi-file-document-minus::before { + content: "\F1A9B"; +} + +.mdi-file-document-minus-outline::before { + content: "\F1A9C"; +} + +.mdi-file-document-multiple::before { + content: "\F1517"; +} + +.mdi-file-document-multiple-outline::before { + content: "\F1518"; +} + +.mdi-file-document-outline::before { + content: "\F09EE"; +} + +.mdi-file-document-plus::before { + content: "\F1A9D"; +} + +.mdi-file-document-plus-outline::before { + content: "\F1A9E"; +} + +.mdi-file-document-refresh::before { + content: "\F1C7A"; +} + +.mdi-file-document-refresh-outline::before { + content: "\F1C7B"; +} + +.mdi-file-document-remove::before { + content: "\F1A9F"; +} + +.mdi-file-document-remove-outline::before { + content: "\F1AA0"; +} + +.mdi-file-download::before { + content: "\F0965"; +} + +.mdi-file-download-outline::before { + content: "\F0966"; +} + +.mdi-file-edit::before { + content: "\F11E7"; +} + +.mdi-file-edit-outline::before { + content: "\F11E8"; +} + +.mdi-file-excel::before { + content: "\F021B"; +} + +.mdi-file-excel-box::before { + content: "\F021C"; +} + +.mdi-file-excel-box-outline::before { + content: "\F102C"; +} + +.mdi-file-excel-outline::before { + content: "\F102D"; +} + +.mdi-file-export::before { + content: "\F021D"; +} + +.mdi-file-export-outline::before { + content: "\F102E"; +} + +.mdi-file-eye::before { + content: "\F0DCA"; +} + +.mdi-file-eye-outline::before { + content: "\F0DCB"; +} + +.mdi-file-find::before { + content: "\F021E"; +} + +.mdi-file-find-outline::before { + content: "\F0B97"; +} + +.mdi-file-gif-box::before { + content: "\F0D78"; +} + +.mdi-file-hidden::before { + content: "\F0613"; +} + +.mdi-file-image::before { + content: "\F021F"; +} + +.mdi-file-image-marker::before { + content: "\F1772"; +} + +.mdi-file-image-marker-outline::before { + content: "\F1773"; +} + +.mdi-file-image-minus::before { + content: "\F193B"; +} + +.mdi-file-image-minus-outline::before { + content: "\F193C"; +} + +.mdi-file-image-outline::before { + content: "\F0EB0"; +} + +.mdi-file-image-plus::before { + content: "\F193D"; +} + +.mdi-file-image-plus-outline::before { + content: "\F193E"; +} + +.mdi-file-image-remove::before { + content: "\F193F"; +} + +.mdi-file-image-remove-outline::before { + content: "\F1940"; +} + +.mdi-file-import::before { + content: "\F0220"; +} + +.mdi-file-import-outline::before { + content: "\F102F"; +} + +.mdi-file-jpg-box::before { + content: "\F0225"; +} + +.mdi-file-key::before { + content: "\F1184"; +} + +.mdi-file-key-outline::before { + content: "\F1185"; +} + +.mdi-file-link::before { + content: "\F1177"; +} + +.mdi-file-link-outline::before { + content: "\F1178"; +} + +.mdi-file-lock::before { + content: "\F0221"; +} + +.mdi-file-lock-open::before { + content: "\F19C8"; +} + +.mdi-file-lock-open-outline::before { + content: "\F19C9"; +} + +.mdi-file-lock-outline::before { + content: "\F1030"; +} + +.mdi-file-marker::before { + content: "\F1774"; +} + +.mdi-file-marker-outline::before { + content: "\F1775"; +} + +.mdi-file-minus::before { + content: "\F1AA1"; +} + +.mdi-file-minus-outline::before { + content: "\F1AA2"; +} + +.mdi-file-move::before { + content: "\F0AB9"; +} + +.mdi-file-move-outline::before { + content: "\F1031"; +} + +.mdi-file-multiple::before { + content: "\F0222"; +} + +.mdi-file-multiple-outline::before { + content: "\F1032"; +} + +.mdi-file-music::before { + content: "\F0223"; +} + +.mdi-file-music-outline::before { + content: "\F0E2A"; +} + +.mdi-file-outline::before { + content: "\F0224"; +} + +.mdi-file-pdf-box::before { + content: "\F0226"; +} + +.mdi-file-percent::before { + content: "\F081E"; +} + +.mdi-file-percent-outline::before { + content: "\F1033"; +} + +.mdi-file-phone::before { + content: "\F1179"; +} + +.mdi-file-phone-outline::before { + content: "\F117A"; +} + +.mdi-file-plus::before { + content: "\F0752"; +} + +.mdi-file-plus-outline::before { + content: "\F0EED"; +} + +.mdi-file-png-box::before { + content: "\F0E2D"; +} + +.mdi-file-powerpoint::before { + content: "\F0227"; +} + +.mdi-file-powerpoint-box::before { + content: "\F0228"; +} + +.mdi-file-powerpoint-box-outline::before { + content: "\F1034"; +} + +.mdi-file-powerpoint-outline::before { + content: "\F1035"; +} + +.mdi-file-presentation-box::before { + content: "\F0229"; +} + +.mdi-file-question::before { + content: "\F086F"; +} + +.mdi-file-question-outline::before { + content: "\F1036"; +} + +.mdi-file-refresh::before { + content: "\F0918"; +} + +.mdi-file-refresh-outline::before { + content: "\F0541"; +} + +.mdi-file-remove::before { + content: "\F0B98"; +} + +.mdi-file-remove-outline::before { + content: "\F1037"; +} + +.mdi-file-replace::before { + content: "\F0B32"; +} + +.mdi-file-replace-outline::before { + content: "\F0B33"; +} + +.mdi-file-restore::before { + content: "\F0670"; +} + +.mdi-file-restore-outline::before { + content: "\F1038"; +} + +.mdi-file-rotate-left::before { + content: "\F1A3B"; +} + +.mdi-file-rotate-left-outline::before { + content: "\F1A3C"; +} + +.mdi-file-rotate-right::before { + content: "\F1A3D"; +} + +.mdi-file-rotate-right-outline::before { + content: "\F1A3E"; +} + +.mdi-file-search::before { + content: "\F0C7C"; +} + +.mdi-file-search-outline::before { + content: "\F0C7D"; +} + +.mdi-file-send::before { + content: "\F022A"; +} + +.mdi-file-send-outline::before { + content: "\F1039"; +} + +.mdi-file-settings::before { + content: "\F1079"; +} + +.mdi-file-settings-outline::before { + content: "\F107A"; +} + +.mdi-file-sign::before { + content: "\F19C3"; +} + +.mdi-file-star::before { + content: "\F103A"; +} + +.mdi-file-star-four-points::before { + content: "\F1C2D"; +} + +.mdi-file-star-four-points-outline::before { + content: "\F1C2E"; +} + +.mdi-file-star-outline::before { + content: "\F103B"; +} + +.mdi-file-swap::before { + content: "\F0FB4"; +} + +.mdi-file-swap-outline::before { + content: "\F0FB5"; +} + +.mdi-file-sync::before { + content: "\F1216"; +} + +.mdi-file-sync-outline::before { + content: "\F1217"; +} + +.mdi-file-table::before { + content: "\F0C7E"; +} + +.mdi-file-table-box::before { + content: "\F10E1"; +} + +.mdi-file-table-box-multiple::before { + content: "\F10E2"; +} + +.mdi-file-table-box-multiple-outline::before { + content: "\F10E3"; +} + +.mdi-file-table-box-outline::before { + content: "\F10E4"; +} + +.mdi-file-table-outline::before { + content: "\F0C7F"; +} + +.mdi-file-tree::before { + content: "\F0645"; +} + +.mdi-file-tree-outline::before { + content: "\F13D2"; +} + +.mdi-file-undo::before { + content: "\F08DC"; +} + +.mdi-file-undo-outline::before { + content: "\F103C"; +} + +.mdi-file-upload::before { + content: "\F0A4D"; +} + +.mdi-file-upload-outline::before { + content: "\F0A4E"; +} + +.mdi-file-video::before { + content: "\F022B"; +} + +.mdi-file-video-outline::before { + content: "\F0E2C"; +} + +.mdi-file-word::before { + content: "\F022C"; +} + +.mdi-file-word-box::before { + content: "\F022D"; +} + +.mdi-file-word-box-outline::before { + content: "\F103D"; +} + +.mdi-file-word-outline::before { + content: "\F103E"; +} + +.mdi-file-xml-box::before { + content: "\F1B4B"; +} + +.mdi-film::before { + content: "\F022F"; +} + +.mdi-filmstrip::before { + content: "\F0230"; +} + +.mdi-filmstrip-box::before { + content: "\F0332"; +} + +.mdi-filmstrip-box-multiple::before { + content: "\F0D18"; +} + +.mdi-filmstrip-off::before { + content: "\F0231"; +} + +.mdi-filter::before { + content: "\F0232"; +} + +.mdi-filter-check::before { + content: "\F18EC"; +} + +.mdi-filter-check-outline::before { + content: "\F18ED"; +} + +.mdi-filter-cog::before { + content: "\F1AA3"; +} + +.mdi-filter-cog-outline::before { + content: "\F1AA4"; +} + +.mdi-filter-menu::before { + content: "\F10E5"; +} + +.mdi-filter-menu-outline::before { + content: "\F10E6"; +} + +.mdi-filter-minus::before { + content: "\F0EEE"; +} + +.mdi-filter-minus-outline::before { + content: "\F0EEF"; +} + +.mdi-filter-multiple::before { + content: "\F1A3F"; +} + +.mdi-filter-multiple-outline::before { + content: "\F1A40"; +} + +.mdi-filter-off::before { + content: "\F14EF"; +} + +.mdi-filter-off-outline::before { + content: "\F14F0"; +} + +.mdi-filter-outline::before { + content: "\F0233"; +} + +.mdi-filter-plus::before { + content: "\F0EF0"; +} + +.mdi-filter-plus-outline::before { + content: "\F0EF1"; +} + +.mdi-filter-remove::before { + content: "\F0234"; +} + +.mdi-filter-remove-outline::before { + content: "\F0235"; +} + +.mdi-filter-settings::before { + content: "\F1AA5"; +} + +.mdi-filter-settings-outline::before { + content: "\F1AA6"; +} + +.mdi-filter-variant::before { + content: "\F0236"; +} + +.mdi-filter-variant-minus::before { + content: "\F1112"; +} + +.mdi-filter-variant-plus::before { + content: "\F1113"; +} + +.mdi-filter-variant-remove::before { + content: "\F103F"; +} + +.mdi-finance::before { + content: "\F081F"; +} + +.mdi-find-replace::before { + content: "\F06D4"; +} + +.mdi-fingerprint::before { + content: "\F0237"; +} + +.mdi-fingerprint-off::before { + content: "\F0EB1"; +} + +.mdi-fire::before { + content: "\F0238"; +} + +.mdi-fire-alert::before { + content: "\F15D7"; +} + +.mdi-fire-circle::before { + content: "\F1807"; +} + +.mdi-fire-extinguisher::before { + content: "\F0EF2"; +} + +.mdi-fire-hydrant::before { + content: "\F1137"; +} + +.mdi-fire-hydrant-alert::before { + content: "\F1138"; +} + +.mdi-fire-hydrant-off::before { + content: "\F1139"; +} + +.mdi-fire-off::before { + content: "\F1722"; +} + +.mdi-fire-station::before { + content: "\F1CC3"; +} + +.mdi-fire-truck::before { + content: "\F08AB"; +} + +.mdi-firebase::before { + content: "\F0967"; +} + +.mdi-firefox::before { + content: "\F0239"; +} + +.mdi-fireplace::before { + content: "\F0E2E"; +} + +.mdi-fireplace-off::before { + content: "\F0E2F"; +} + +.mdi-firewire::before { + content: "\F05BE"; +} + +.mdi-firework::before { + content: "\F0E30"; +} + +.mdi-firework-off::before { + content: "\F1723"; +} + +.mdi-fish::before { + content: "\F023A"; +} + +.mdi-fish-off::before { + content: "\F13F3"; +} + +.mdi-fishbowl::before { + content: "\F0EF3"; +} + +.mdi-fishbowl-outline::before { + content: "\F0EF4"; +} + +.mdi-fit-to-page::before { + content: "\F0EF5"; +} + +.mdi-fit-to-page-outline::before { + content: "\F0EF6"; +} + +.mdi-fit-to-screen::before { + content: "\F18F4"; +} + +.mdi-fit-to-screen-outline::before { + content: "\F18F5"; +} + +.mdi-flag::before { + content: "\F023B"; +} + +.mdi-flag-checkered::before { + content: "\F023C"; +} + +.mdi-flag-minus::before { + content: "\F0B99"; +} + +.mdi-flag-minus-outline::before { + content: "\F10B2"; +} + +.mdi-flag-off::before { + content: "\F18EE"; +} + +.mdi-flag-off-outline::before { + content: "\F18EF"; +} + +.mdi-flag-outline::before { + content: "\F023D"; +} + +.mdi-flag-plus::before { + content: "\F0B9A"; +} + +.mdi-flag-plus-outline::before { + content: "\F10B3"; +} + +.mdi-flag-remove::before { + content: "\F0B9B"; +} + +.mdi-flag-remove-outline::before { + content: "\F10B4"; +} + +.mdi-flag-triangle::before { + content: "\F023F"; +} + +.mdi-flag-variant::before { + content: "\F0240"; +} + +.mdi-flag-variant-minus::before { + content: "\F1BB4"; +} + +.mdi-flag-variant-minus-outline::before { + content: "\F1BB5"; +} + +.mdi-flag-variant-off::before { + content: "\F1BB0"; +} + +.mdi-flag-variant-off-outline::before { + content: "\F1BB1"; +} + +.mdi-flag-variant-outline::before { + content: "\F023E"; +} + +.mdi-flag-variant-plus::before { + content: "\F1BB2"; +} + +.mdi-flag-variant-plus-outline::before { + content: "\F1BB3"; +} + +.mdi-flag-variant-remove::before { + content: "\F1BB6"; +} + +.mdi-flag-variant-remove-outline::before { + content: "\F1BB7"; +} + +.mdi-flare::before { + content: "\F0D72"; +} + +.mdi-flash::before { + content: "\F0241"; +} + +.mdi-flash-alert::before { + content: "\F0EF7"; +} + +.mdi-flash-alert-outline::before { + content: "\F0EF8"; +} + +.mdi-flash-auto::before { + content: "\F0242"; +} + +.mdi-flash-off::before { + content: "\F0243"; +} + +.mdi-flash-off-outline::before { + content: "\F1B45"; +} + +.mdi-flash-outline::before { + content: "\F06D5"; +} + +.mdi-flash-red-eye::before { + content: "\F067B"; +} + +.mdi-flash-triangle::before { + content: "\F1B1D"; +} + +.mdi-flash-triangle-outline::before { + content: "\F1B1E"; +} + +.mdi-flashlight::before { + content: "\F0244"; +} + +.mdi-flashlight-off::before { + content: "\F0245"; +} + +.mdi-flask::before { + content: "\F0093"; +} + +.mdi-flask-empty::before { + content: "\F0094"; +} + +.mdi-flask-empty-minus::before { + content: "\F123A"; +} + +.mdi-flask-empty-minus-outline::before { + content: "\F123B"; +} + +.mdi-flask-empty-off::before { + content: "\F13F4"; +} + +.mdi-flask-empty-off-outline::before { + content: "\F13F5"; +} + +.mdi-flask-empty-outline::before { + content: "\F0095"; +} + +.mdi-flask-empty-plus::before { + content: "\F123C"; +} + +.mdi-flask-empty-plus-outline::before { + content: "\F123D"; +} + +.mdi-flask-empty-remove::before { + content: "\F123E"; +} + +.mdi-flask-empty-remove-outline::before { + content: "\F123F"; +} + +.mdi-flask-minus::before { + content: "\F1240"; +} + +.mdi-flask-minus-outline::before { + content: "\F1241"; +} + +.mdi-flask-off::before { + content: "\F13F6"; +} + +.mdi-flask-off-outline::before { + content: "\F13F7"; +} + +.mdi-flask-outline::before { + content: "\F0096"; +} + +.mdi-flask-plus::before { + content: "\F1242"; +} + +.mdi-flask-plus-outline::before { + content: "\F1243"; +} + +.mdi-flask-remove::before { + content: "\F1244"; +} + +.mdi-flask-remove-outline::before { + content: "\F1245"; +} + +.mdi-flask-round-bottom::before { + content: "\F124B"; +} + +.mdi-flask-round-bottom-empty::before { + content: "\F124C"; +} + +.mdi-flask-round-bottom-empty-outline::before { + content: "\F124D"; +} + +.mdi-flask-round-bottom-outline::before { + content: "\F124E"; +} + +.mdi-fleur-de-lis::before { + content: "\F1303"; +} + +.mdi-flip-horizontal::before { + content: "\F10E7"; +} + +.mdi-flip-to-back::before { + content: "\F0247"; +} + +.mdi-flip-to-front::before { + content: "\F0248"; +} + +.mdi-flip-vertical::before { + content: "\F10E8"; +} + +.mdi-floor-lamp::before { + content: "\F08DD"; +} + +.mdi-floor-lamp-dual::before { + content: "\F1040"; +} + +.mdi-floor-lamp-dual-outline::before { + content: "\F17CE"; +} + +.mdi-floor-lamp-outline::before { + content: "\F17C8"; +} + +.mdi-floor-lamp-torchiere::before { + content: "\F1747"; +} + +.mdi-floor-lamp-torchiere-outline::before { + content: "\F17D6"; +} + +.mdi-floor-lamp-torchiere-variant::before { + content: "\F1041"; +} + +.mdi-floor-lamp-torchiere-variant-outline::before { + content: "\F17CF"; +} + +.mdi-floor-plan::before { + content: "\F0821"; +} + +.mdi-floppy::before { + content: "\F0249"; +} + +.mdi-floppy-variant::before { + content: "\F09EF"; +} + +.mdi-flower::before { + content: "\F024A"; +} + +.mdi-flower-outline::before { + content: "\F09F0"; +} + +.mdi-flower-pollen::before { + content: "\F1885"; +} + +.mdi-flower-pollen-outline::before { + content: "\F1886"; +} + +.mdi-flower-poppy::before { + content: "\F0D08"; +} + +.mdi-flower-tulip::before { + content: "\F09F1"; +} + +.mdi-flower-tulip-outline::before { + content: "\F09F2"; +} + +.mdi-focus-auto::before { + content: "\F0F4E"; +} + +.mdi-focus-field::before { + content: "\F0F4F"; +} + +.mdi-focus-field-horizontal::before { + content: "\F0F50"; +} + +.mdi-focus-field-vertical::before { + content: "\F0F51"; +} + +.mdi-folder::before { + content: "\F024B"; +} + +.mdi-folder-account::before { + content: "\F024C"; +} + +.mdi-folder-account-outline::before { + content: "\F0B9C"; +} + +.mdi-folder-alert::before { + content: "\F0DCC"; +} + +.mdi-folder-alert-outline::before { + content: "\F0DCD"; +} + +.mdi-folder-arrow-down::before { + content: "\F19E8"; +} + +.mdi-folder-arrow-down-outline::before { + content: "\F19E9"; +} + +.mdi-folder-arrow-left::before { + content: "\F19EA"; +} + +.mdi-folder-arrow-left-outline::before { + content: "\F19EB"; +} + +.mdi-folder-arrow-left-right::before { + content: "\F19EC"; +} + +.mdi-folder-arrow-left-right-outline::before { + content: "\F19ED"; +} + +.mdi-folder-arrow-right::before { + content: "\F19EE"; +} + +.mdi-folder-arrow-right-outline::before { + content: "\F19EF"; +} + +.mdi-folder-arrow-up::before { + content: "\F19F0"; +} + +.mdi-folder-arrow-up-down::before { + content: "\F19F1"; +} + +.mdi-folder-arrow-up-down-outline::before { + content: "\F19F2"; +} + +.mdi-folder-arrow-up-outline::before { + content: "\F19F3"; +} + +.mdi-folder-cancel::before { + content: "\F19F4"; +} + +.mdi-folder-cancel-outline::before { + content: "\F19F5"; +} + +.mdi-folder-check::before { + content: "\F197E"; +} + +.mdi-folder-check-outline::before { + content: "\F197F"; +} + +.mdi-folder-clock::before { + content: "\F0ABA"; +} + +.mdi-folder-clock-outline::before { + content: "\F0ABB"; +} + +.mdi-folder-cog::before { + content: "\F107F"; +} + +.mdi-folder-cog-outline::before { + content: "\F1080"; +} + +.mdi-folder-download::before { + content: "\F024D"; +} + +.mdi-folder-download-outline::before { + content: "\F10E9"; +} + +.mdi-folder-edit::before { + content: "\F08DE"; +} + +.mdi-folder-edit-outline::before { + content: "\F0DCE"; +} + +.mdi-folder-eye::before { + content: "\F178A"; +} + +.mdi-folder-eye-outline::before { + content: "\F178B"; +} + +.mdi-folder-file::before { + content: "\F19F6"; +} + +.mdi-folder-file-outline::before { + content: "\F19F7"; +} + +.mdi-folder-google-drive::before { + content: "\F024E"; +} + +.mdi-folder-heart::before { + content: "\F10EA"; +} + +.mdi-folder-heart-outline::before { + content: "\F10EB"; +} + +.mdi-folder-hidden::before { + content: "\F179E"; +} + +.mdi-folder-home::before { + content: "\F10B5"; +} + +.mdi-folder-home-outline::before { + content: "\F10B6"; +} + +.mdi-folder-image::before { + content: "\F024F"; +} + +.mdi-folder-information::before { + content: "\F10B7"; +} + +.mdi-folder-information-outline::before { + content: "\F10B8"; +} + +.mdi-folder-key::before { + content: "\F08AC"; +} + +.mdi-folder-key-network::before { + content: "\F08AD"; +} + +.mdi-folder-key-network-outline::before { + content: "\F0C80"; +} + +.mdi-folder-key-outline::before { + content: "\F10EC"; +} + +.mdi-folder-lock::before { + content: "\F0250"; +} + +.mdi-folder-lock-open::before { + content: "\F0251"; +} + +.mdi-folder-lock-open-outline::before { + content: "\F1AA7"; +} + +.mdi-folder-lock-outline::before { + content: "\F1AA8"; +} + +.mdi-folder-marker::before { + content: "\F126D"; +} + +.mdi-folder-marker-outline::before { + content: "\F126E"; +} + +.mdi-folder-minus::before { + content: "\F1B49"; +} + +.mdi-folder-minus-outline::before { + content: "\F1B4A"; +} + +.mdi-folder-move::before { + content: "\F0252"; +} + +.mdi-folder-move-outline::before { + content: "\F1246"; +} + +.mdi-folder-multiple::before { + content: "\F0253"; +} + +.mdi-folder-multiple-image::before { + content: "\F0254"; +} + +.mdi-folder-multiple-outline::before { + content: "\F0255"; +} + +.mdi-folder-multiple-plus::before { + content: "\F147E"; +} + +.mdi-folder-multiple-plus-outline::before { + content: "\F147F"; +} + +.mdi-folder-music::before { + content: "\F1359"; +} + +.mdi-folder-music-outline::before { + content: "\F135A"; +} + +.mdi-folder-network::before { + content: "\F0870"; +} + +.mdi-folder-network-outline::before { + content: "\F0C81"; +} + +.mdi-folder-off::before { + content: "\F19F8"; +} + +.mdi-folder-off-outline::before { + content: "\F19F9"; +} + +.mdi-folder-open::before { + content: "\F0770"; +} + +.mdi-folder-open-outline::before { + content: "\F0DCF"; +} + +.mdi-folder-outline::before { + content: "\F0256"; +} + +.mdi-folder-play::before { + content: "\F19FA"; +} + +.mdi-folder-play-outline::before { + content: "\F19FB"; +} + +.mdi-folder-plus::before { + content: "\F0257"; +} + +.mdi-folder-plus-outline::before { + content: "\F0B9D"; +} + +.mdi-folder-pound::before { + content: "\F0D09"; +} + +.mdi-folder-pound-outline::before { + content: "\F0D0A"; +} + +.mdi-folder-question::before { + content: "\F19CA"; +} + +.mdi-folder-question-outline::before { + content: "\F19CB"; +} + +.mdi-folder-refresh::before { + content: "\F0749"; +} + +.mdi-folder-refresh-outline::before { + content: "\F0542"; +} + +.mdi-folder-remove::before { + content: "\F0258"; +} + +.mdi-folder-remove-outline::before { + content: "\F0B9E"; +} + +.mdi-folder-search::before { + content: "\F0968"; +} + +.mdi-folder-search-outline::before { + content: "\F0969"; +} + +.mdi-folder-settings::before { + content: "\F107D"; +} + +.mdi-folder-settings-outline::before { + content: "\F107E"; +} + +.mdi-folder-star::before { + content: "\F069D"; +} + +.mdi-folder-star-multiple::before { + content: "\F13D3"; +} + +.mdi-folder-star-multiple-outline::before { + content: "\F13D4"; +} + +.mdi-folder-star-outline::before { + content: "\F0B9F"; +} + +.mdi-folder-swap::before { + content: "\F0FB6"; +} + +.mdi-folder-swap-outline::before { + content: "\F0FB7"; +} + +.mdi-folder-sync::before { + content: "\F0D0B"; +} + +.mdi-folder-sync-outline::before { + content: "\F0D0C"; +} + +.mdi-folder-table::before { + content: "\F12E3"; +} + +.mdi-folder-table-outline::before { + content: "\F12E4"; +} + +.mdi-folder-text::before { + content: "\F0C82"; +} + +.mdi-folder-text-outline::before { + content: "\F0C83"; +} + +.mdi-folder-upload::before { + content: "\F0259"; +} + +.mdi-folder-upload-outline::before { + content: "\F10ED"; +} + +.mdi-folder-wrench::before { + content: "\F19FC"; +} + +.mdi-folder-wrench-outline::before { + content: "\F19FD"; +} + +.mdi-folder-zip::before { + content: "\F06EB"; +} + +.mdi-folder-zip-outline::before { + content: "\F07B9"; +} + +.mdi-font-awesome::before { + content: "\F003A"; +} + +.mdi-food::before { + content: "\F025A"; +} + +.mdi-food-apple::before { + content: "\F025B"; +} + +.mdi-food-apple-outline::before { + content: "\F0C84"; +} + +.mdi-food-croissant::before { + content: "\F07C8"; +} + +.mdi-food-drumstick::before { + content: "\F141F"; +} + +.mdi-food-drumstick-off::before { + content: "\F1468"; +} + +.mdi-food-drumstick-off-outline::before { + content: "\F1469"; +} + +.mdi-food-drumstick-outline::before { + content: "\F1420"; +} + +.mdi-food-fork-drink::before { + content: "\F05F2"; +} + +.mdi-food-halal::before { + content: "\F1572"; +} + +.mdi-food-hot-dog::before { + content: "\F184B"; +} + +.mdi-food-kosher::before { + content: "\F1573"; +} + +.mdi-food-off::before { + content: "\F05F3"; +} + +.mdi-food-off-outline::before { + content: "\F1915"; +} + +.mdi-food-outline::before { + content: "\F1916"; +} + +.mdi-food-steak::before { + content: "\F146A"; +} + +.mdi-food-steak-off::before { + content: "\F146B"; +} + +.mdi-food-takeout-box::before { + content: "\F1836"; +} + +.mdi-food-takeout-box-outline::before { + content: "\F1837"; +} + +.mdi-food-turkey::before { + content: "\F171C"; +} + +.mdi-food-variant::before { + content: "\F025C"; +} + +.mdi-food-variant-off::before { + content: "\F13E5"; +} + +.mdi-foot-print::before { + content: "\F0F52"; +} + +.mdi-football::before { + content: "\F025D"; +} + +.mdi-football-australian::before { + content: "\F025E"; +} + +.mdi-football-helmet::before { + content: "\F025F"; +} + +.mdi-forest::before { + content: "\F1897"; +} + +.mdi-forest-outline::before { + content: "\F1C63"; +} + +.mdi-forklift::before { + content: "\F07C9"; +} + +.mdi-form-dropdown::before { + content: "\F1400"; +} + +.mdi-form-select::before { + content: "\F1401"; +} + +.mdi-form-textarea::before { + content: "\F1095"; +} + +.mdi-form-textbox::before { + content: "\F060E"; +} + +.mdi-form-textbox-lock::before { + content: "\F135D"; +} + +.mdi-form-textbox-password::before { + content: "\F07F5"; +} + +.mdi-format-align-bottom::before { + content: "\F0753"; +} + +.mdi-format-align-center::before { + content: "\F0260"; +} + +.mdi-format-align-justify::before { + content: "\F0261"; +} + +.mdi-format-align-left::before { + content: "\F0262"; +} + +.mdi-format-align-middle::before { + content: "\F0754"; +} + +.mdi-format-align-right::before { + content: "\F0263"; +} + +.mdi-format-align-top::before { + content: "\F0755"; +} + +.mdi-format-annotation-minus::before { + content: "\F0ABC"; +} + +.mdi-format-annotation-plus::before { + content: "\F0646"; +} + +.mdi-format-bold::before { + content: "\F0264"; +} + +.mdi-format-clear::before { + content: "\F0265"; +} + +.mdi-format-color-fill::before { + content: "\F0266"; +} + +.mdi-format-color-highlight::before { + content: "\F0E31"; +} + +.mdi-format-color-marker-cancel::before { + content: "\F1313"; +} + +.mdi-format-color-text::before { + content: "\F069E"; +} + +.mdi-format-columns::before { + content: "\F08DF"; +} + +.mdi-format-float-center::before { + content: "\F0267"; +} + +.mdi-format-float-left::before { + content: "\F0268"; +} + +.mdi-format-float-none::before { + content: "\F0269"; +} + +.mdi-format-float-right::before { + content: "\F026A"; +} + +.mdi-format-font::before { + content: "\F06D6"; +} + +.mdi-format-font-size-decrease::before { + content: "\F09F3"; +} + +.mdi-format-font-size-increase::before { + content: "\F09F4"; +} + +.mdi-format-header-1::before { + content: "\F026B"; +} + +.mdi-format-header-2::before { + content: "\F026C"; +} + +.mdi-format-header-3::before { + content: "\F026D"; +} + +.mdi-format-header-4::before { + content: "\F026E"; +} + +.mdi-format-header-5::before { + content: "\F026F"; +} + +.mdi-format-header-6::before { + content: "\F0270"; +} + +.mdi-format-header-decrease::before { + content: "\F0271"; +} + +.mdi-format-header-equal::before { + content: "\F0272"; +} + +.mdi-format-header-increase::before { + content: "\F0273"; +} + +.mdi-format-header-pound::before { + content: "\F0274"; +} + +.mdi-format-horizontal-align-center::before { + content: "\F061E"; +} + +.mdi-format-horizontal-align-left::before { + content: "\F061F"; +} + +.mdi-format-horizontal-align-right::before { + content: "\F0620"; +} + +.mdi-format-indent-decrease::before { + content: "\F0275"; +} + +.mdi-format-indent-increase::before { + content: "\F0276"; +} + +.mdi-format-italic::before { + content: "\F0277"; +} + +.mdi-format-letter-case::before { + content: "\F0B34"; +} + +.mdi-format-letter-case-lower::before { + content: "\F0B35"; +} + +.mdi-format-letter-case-upper::before { + content: "\F0B36"; +} + +.mdi-format-letter-ends-with::before { + content: "\F0FB8"; +} + +.mdi-format-letter-matches::before { + content: "\F0FB9"; +} + +.mdi-format-letter-spacing::before { + content: "\F1956"; +} + +.mdi-format-letter-spacing-variant::before { + content: "\F1AFB"; +} + +.mdi-format-letter-starts-with::before { + content: "\F0FBA"; +} + +.mdi-format-line-height::before { + content: "\F1AFC"; +} + +.mdi-format-line-spacing::before { + content: "\F0278"; +} + +.mdi-format-line-style::before { + content: "\F05C8"; +} + +.mdi-format-line-weight::before { + content: "\F05C9"; +} + +.mdi-format-list-bulleted::before { + content: "\F0279"; +} + +.mdi-format-list-bulleted-square::before { + content: "\F0DD0"; +} + +.mdi-format-list-bulleted-triangle::before { + content: "\F0EB2"; +} + +.mdi-format-list-bulleted-type::before { + content: "\F027A"; +} + +.mdi-format-list-checkbox::before { + content: "\F096A"; +} + +.mdi-format-list-checks::before { + content: "\F0756"; +} + +.mdi-format-list-group::before { + content: "\F1860"; +} + +.mdi-format-list-group-plus::before { + content: "\F1B56"; +} + +.mdi-format-list-numbered::before { + content: "\F027B"; +} + +.mdi-format-list-numbered-rtl::before { + content: "\F0D0D"; +} + +.mdi-format-list-text::before { + content: "\F126F"; +} + +.mdi-format-overline::before { + content: "\F0EB3"; +} + +.mdi-format-page-break::before { + content: "\F06D7"; +} + +.mdi-format-page-split::before { + content: "\F1917"; +} + +.mdi-format-paint::before { + content: "\F027C"; +} + +.mdi-format-paragraph::before { + content: "\F027D"; +} + +.mdi-format-paragraph-spacing::before { + content: "\F1AFD"; +} + +.mdi-format-pilcrow::before { + content: "\F06D8"; +} + +.mdi-format-pilcrow-arrow-left::before { + content: "\F0286"; +} + +.mdi-format-pilcrow-arrow-right::before { + content: "\F0285"; +} + +.mdi-format-quote-close::before { + content: "\F027E"; +} + +.mdi-format-quote-close-outline::before { + content: "\F11A8"; +} + +.mdi-format-quote-open::before { + content: "\F0757"; +} + +.mdi-format-quote-open-outline::before { + content: "\F11A7"; +} + +.mdi-format-rotate-90::before { + content: "\F06AA"; +} + +.mdi-format-section::before { + content: "\F069F"; +} + +.mdi-format-size::before { + content: "\F027F"; +} + +.mdi-format-strikethrough::before { + content: "\F0280"; +} + +.mdi-format-strikethrough-variant::before { + content: "\F0281"; +} + +.mdi-format-subscript::before { + content: "\F0282"; +} + +.mdi-format-superscript::before { + content: "\F0283"; +} + +.mdi-format-text::before { + content: "\F0284"; +} + +.mdi-format-text-rotation-angle-down::before { + content: "\F0FBB"; +} + +.mdi-format-text-rotation-angle-up::before { + content: "\F0FBC"; +} + +.mdi-format-text-rotation-down::before { + content: "\F0D73"; +} + +.mdi-format-text-rotation-down-vertical::before { + content: "\F0FBD"; +} + +.mdi-format-text-rotation-none::before { + content: "\F0D74"; +} + +.mdi-format-text-rotation-up::before { + content: "\F0FBE"; +} + +.mdi-format-text-rotation-vertical::before { + content: "\F0FBF"; +} + +.mdi-format-text-variant::before { + content: "\F0E32"; +} + +.mdi-format-text-variant-outline::before { + content: "\F150F"; +} + +.mdi-format-text-wrapping-clip::before { + content: "\F0D0E"; +} + +.mdi-format-text-wrapping-overflow::before { + content: "\F0D0F"; +} + +.mdi-format-text-wrapping-wrap::before { + content: "\F0D10"; +} + +.mdi-format-textbox::before { + content: "\F0D11"; +} + +.mdi-format-title::before { + content: "\F05F4"; +} + +.mdi-format-underline::before { + content: "\F0287"; +} + +.mdi-format-underline-wavy::before { + content: "\F18E9"; +} + +.mdi-format-vertical-align-bottom::before { + content: "\F0621"; +} + +.mdi-format-vertical-align-center::before { + content: "\F0622"; +} + +.mdi-format-vertical-align-top::before { + content: "\F0623"; +} + +.mdi-format-wrap-inline::before { + content: "\F0288"; +} + +.mdi-format-wrap-square::before { + content: "\F0289"; +} + +.mdi-format-wrap-tight::before { + content: "\F028A"; +} + +.mdi-format-wrap-top-bottom::before { + content: "\F028B"; +} + +.mdi-forum::before { + content: "\F028C"; +} + +.mdi-forum-minus::before { + content: "\F1AA9"; +} + +.mdi-forum-minus-outline::before { + content: "\F1AAA"; +} + +.mdi-forum-outline::before { + content: "\F0822"; +} + +.mdi-forum-plus::before { + content: "\F1AAB"; +} + +.mdi-forum-plus-outline::before { + content: "\F1AAC"; +} + +.mdi-forum-remove::before { + content: "\F1AAD"; +} + +.mdi-forum-remove-outline::before { + content: "\F1AAE"; +} + +.mdi-forward::before { + content: "\F028D"; +} + +.mdi-forwardburger::before { + content: "\F0D75"; +} + +.mdi-fountain::before { + content: "\F096B"; +} + +.mdi-fountain-pen::before { + content: "\F0D12"; +} + +.mdi-fountain-pen-tip::before { + content: "\F0D13"; +} + +.mdi-fraction-one-half::before { + content: "\F1992"; +} + +.mdi-freebsd::before { + content: "\F08E0"; +} + +.mdi-french-fries::before { + content: "\F1957"; +} + +.mdi-frequently-asked-questions::before { + content: "\F0EB4"; +} + +.mdi-fridge::before { + content: "\F0290"; +} + +.mdi-fridge-alert::before { + content: "\F11B1"; +} + +.mdi-fridge-alert-outline::before { + content: "\F11B2"; +} + +.mdi-fridge-bottom::before { + content: "\F0292"; +} + +.mdi-fridge-industrial::before { + content: "\F15EE"; +} + +.mdi-fridge-industrial-alert::before { + content: "\F15EF"; +} + +.mdi-fridge-industrial-alert-outline::before { + content: "\F15F0"; +} + +.mdi-fridge-industrial-off::before { + content: "\F15F1"; +} + +.mdi-fridge-industrial-off-outline::before { + content: "\F15F2"; +} + +.mdi-fridge-industrial-outline::before { + content: "\F15F3"; +} + +.mdi-fridge-off::before { + content: "\F11AF"; +} + +.mdi-fridge-off-outline::before { + content: "\F11B0"; +} + +.mdi-fridge-outline::before { + content: "\F028F"; +} + +.mdi-fridge-top::before { + content: "\F0291"; +} + +.mdi-fridge-variant::before { + content: "\F15F4"; +} + +.mdi-fridge-variant-alert::before { + content: "\F15F5"; +} + +.mdi-fridge-variant-alert-outline::before { + content: "\F15F6"; +} + +.mdi-fridge-variant-off::before { + content: "\F15F7"; +} + +.mdi-fridge-variant-off-outline::before { + content: "\F15F8"; +} + +.mdi-fridge-variant-outline::before { + content: "\F15F9"; +} + +.mdi-fruit-cherries::before { + content: "\F1042"; +} + +.mdi-fruit-cherries-off::before { + content: "\F13F8"; +} + +.mdi-fruit-citrus::before { + content: "\F1043"; +} + +.mdi-fruit-citrus-off::before { + content: "\F13F9"; +} + +.mdi-fruit-grapes::before { + content: "\F1044"; +} + +.mdi-fruit-grapes-outline::before { + content: "\F1045"; +} + +.mdi-fruit-pear::before { + content: "\F1A0E"; +} + +.mdi-fruit-pineapple::before { + content: "\F1046"; +} + +.mdi-fruit-watermelon::before { + content: "\F1047"; +} + +.mdi-fuel::before { + content: "\F07CA"; +} + +.mdi-fuel-cell::before { + content: "\F18B5"; +} + +.mdi-fullscreen::before { + content: "\F0293"; +} + +.mdi-fullscreen-exit::before { + content: "\F0294"; +} + +.mdi-function::before { + content: "\F0295"; +} + +.mdi-function-variant::before { + content: "\F0871"; +} + +.mdi-furigana-horizontal::before { + content: "\F1081"; +} + +.mdi-furigana-vertical::before { + content: "\F1082"; +} + +.mdi-fuse::before { + content: "\F0C85"; +} + +.mdi-fuse-alert::before { + content: "\F142D"; +} + +.mdi-fuse-blade::before { + content: "\F0C86"; +} + +.mdi-fuse-off::before { + content: "\F142C"; +} + +.mdi-gamepad::before { + content: "\F0296"; +} + +.mdi-gamepad-circle::before { + content: "\F0E33"; +} + +.mdi-gamepad-circle-down::before { + content: "\F0E34"; +} + +.mdi-gamepad-circle-left::before { + content: "\F0E35"; +} + +.mdi-gamepad-circle-outline::before { + content: "\F0E36"; +} + +.mdi-gamepad-circle-right::before { + content: "\F0E37"; +} + +.mdi-gamepad-circle-up::before { + content: "\F0E38"; +} + +.mdi-gamepad-down::before { + content: "\F0E39"; +} + +.mdi-gamepad-left::before { + content: "\F0E3A"; +} + +.mdi-gamepad-outline::before { + content: "\F1919"; +} + +.mdi-gamepad-right::before { + content: "\F0E3B"; +} + +.mdi-gamepad-round::before { + content: "\F0E3C"; +} + +.mdi-gamepad-round-down::before { + content: "\F0E3D"; +} + +.mdi-gamepad-round-left::before { + content: "\F0E3E"; +} + +.mdi-gamepad-round-outline::before { + content: "\F0E3F"; +} + +.mdi-gamepad-round-right::before { + content: "\F0E40"; +} + +.mdi-gamepad-round-up::before { + content: "\F0E41"; +} + +.mdi-gamepad-square::before { + content: "\F0EB5"; +} + +.mdi-gamepad-square-outline::before { + content: "\F0EB6"; +} + +.mdi-gamepad-up::before { + content: "\F0E42"; +} + +.mdi-gamepad-variant::before { + content: "\F0297"; +} + +.mdi-gamepad-variant-outline::before { + content: "\F0EB7"; +} + +.mdi-gamma::before { + content: "\F10EE"; +} + +.mdi-gantry-crane::before { + content: "\F0DD1"; +} + +.mdi-garage::before { + content: "\F06D9"; +} + +.mdi-garage-alert::before { + content: "\F0872"; +} + +.mdi-garage-alert-variant::before { + content: "\F12D5"; +} + +.mdi-garage-lock::before { + content: "\F17FB"; +} + +.mdi-garage-open::before { + content: "\F06DA"; +} + +.mdi-garage-open-variant::before { + content: "\F12D4"; +} + +.mdi-garage-variant::before { + content: "\F12D3"; +} + +.mdi-garage-variant-lock::before { + content: "\F17FC"; +} + +.mdi-gas-burner::before { + content: "\F1A1B"; +} + +.mdi-gas-cylinder::before { + content: "\F0647"; +} + +.mdi-gas-station::before { + content: "\F0298"; +} + +.mdi-gas-station-in-use::before { + content: "\F1CC4"; +} + +.mdi-gas-station-in-use-outline::before { + content: "\F1CC5"; +} + +.mdi-gas-station-off::before { + content: "\F1409"; +} + +.mdi-gas-station-off-outline::before { + content: "\F140A"; +} + +.mdi-gas-station-outline::before { + content: "\F0EB8"; +} + +.mdi-gate::before { + content: "\F0299"; +} + +.mdi-gate-alert::before { + content: "\F17F8"; +} + +.mdi-gate-and::before { + content: "\F08E1"; +} + +.mdi-gate-arrow-left::before { + content: "\F17F7"; +} + +.mdi-gate-arrow-right::before { + content: "\F1169"; +} + +.mdi-gate-buffer::before { + content: "\F1AFE"; +} + +.mdi-gate-nand::before { + content: "\F08E2"; +} + +.mdi-gate-nor::before { + content: "\F08E3"; +} + +.mdi-gate-not::before { + content: "\F08E4"; +} + +.mdi-gate-open::before { + content: "\F116A"; +} + +.mdi-gate-or::before { + content: "\F08E5"; +} + +.mdi-gate-xnor::before { + content: "\F08E6"; +} + +.mdi-gate-xor::before { + content: "\F08E7"; +} + +.mdi-gatsby::before { + content: "\F0E43"; +} + +.mdi-gauge::before { + content: "\F029A"; +} + +.mdi-gauge-empty::before { + content: "\F0873"; +} + +.mdi-gauge-full::before { + content: "\F0874"; +} + +.mdi-gauge-low::before { + content: "\F0875"; +} + +.mdi-gavel::before { + content: "\F029B"; +} + +.mdi-gender-female::before { + content: "\F029C"; +} + +.mdi-gender-male::before { + content: "\F029D"; +} + +.mdi-gender-male-female::before { + content: "\F029E"; +} + +.mdi-gender-male-female-variant::before { + content: "\F113F"; +} + +.mdi-gender-non-binary::before { + content: "\F1140"; +} + +.mdi-gender-transgender::before { + content: "\F029F"; +} + +.mdi-generator-mobile::before { + content: "\F1C8A"; +} + +.mdi-generator-portable::before { + content: "\F1C8B"; +} + +.mdi-generator-stationary::before { + content: "\F1C8C"; +} + +.mdi-gentoo::before { + content: "\F08E8"; +} + +.mdi-gesture::before { + content: "\F07CB"; +} + +.mdi-gesture-double-tap::before { + content: "\F073C"; +} + +.mdi-gesture-pinch::before { + content: "\F0ABD"; +} + +.mdi-gesture-spread::before { + content: "\F0ABE"; +} + +.mdi-gesture-swipe::before { + content: "\F0D76"; +} + +.mdi-gesture-swipe-down::before { + content: "\F073D"; +} + +.mdi-gesture-swipe-horizontal::before { + content: "\F0ABF"; +} + +.mdi-gesture-swipe-left::before { + content: "\F073E"; +} + +.mdi-gesture-swipe-right::before { + content: "\F073F"; +} + +.mdi-gesture-swipe-up::before { + content: "\F0740"; +} + +.mdi-gesture-swipe-vertical::before { + content: "\F0AC0"; +} + +.mdi-gesture-tap::before { + content: "\F0741"; +} + +.mdi-gesture-tap-box::before { + content: "\F12A9"; +} + +.mdi-gesture-tap-button::before { + content: "\F12A8"; +} + +.mdi-gesture-tap-hold::before { + content: "\F0D77"; +} + +.mdi-gesture-two-double-tap::before { + content: "\F0742"; +} + +.mdi-gesture-two-tap::before { + content: "\F0743"; +} + +.mdi-ghost::before { + content: "\F02A0"; +} + +.mdi-ghost-off::before { + content: "\F09F5"; +} + +.mdi-ghost-off-outline::before { + content: "\F165C"; +} + +.mdi-ghost-outline::before { + content: "\F165D"; +} + +.mdi-gift::before { + content: "\F0E44"; +} + +.mdi-gift-off::before { + content: "\F16EF"; +} + +.mdi-gift-off-outline::before { + content: "\F16F0"; +} + +.mdi-gift-open::before { + content: "\F16F1"; +} + +.mdi-gift-open-outline::before { + content: "\F16F2"; +} + +.mdi-gift-outline::before { + content: "\F02A1"; +} + +.mdi-git::before { + content: "\F02A2"; +} + +.mdi-github::before { + content: "\F02A4"; +} + +.mdi-gitlab::before { + content: "\F0BA0"; +} + +.mdi-glass-cocktail::before { + content: "\F0356"; +} + +.mdi-glass-cocktail-off::before { + content: "\F15E6"; +} + +.mdi-glass-flute::before { + content: "\F02A5"; +} + +.mdi-glass-fragile::before { + content: "\F1873"; +} + +.mdi-glass-mug::before { + content: "\F02A6"; +} + +.mdi-glass-mug-off::before { + content: "\F15E7"; +} + +.mdi-glass-mug-variant::before { + content: "\F1116"; +} + +.mdi-glass-mug-variant-off::before { + content: "\F15E8"; +} + +.mdi-glass-pint-outline::before { + content: "\F130D"; +} + +.mdi-glass-stange::before { + content: "\F02A7"; +} + +.mdi-glass-tulip::before { + content: "\F02A8"; +} + +.mdi-glass-wine::before { + content: "\F0876"; +} + +.mdi-glasses::before { + content: "\F02AA"; +} + +.mdi-globe-light::before { + content: "\F066F"; +} + +.mdi-globe-light-outline::before { + content: "\F12D7"; +} + +.mdi-globe-model::before { + content: "\F08E9"; +} + +.mdi-gmail::before { + content: "\F02AB"; +} + +.mdi-gnome::before { + content: "\F02AC"; +} + +.mdi-go-kart::before { + content: "\F0D79"; +} + +.mdi-go-kart-track::before { + content: "\F0D7A"; +} + +.mdi-gog::before { + content: "\F0BA1"; +} + +.mdi-gold::before { + content: "\F124F"; +} + +.mdi-golf::before { + content: "\F0823"; +} + +.mdi-golf-cart::before { + content: "\F11A4"; +} + +.mdi-golf-tee::before { + content: "\F1083"; +} + +.mdi-gondola::before { + content: "\F0686"; +} + +.mdi-goodreads::before { + content: "\F0D7B"; +} + +.mdi-google::before { + content: "\F02AD"; +} + +.mdi-google-ads::before { + content: "\F0C87"; +} + +.mdi-google-analytics::before { + content: "\F07CC"; +} + +.mdi-google-assistant::before { + content: "\F07CD"; +} + +.mdi-google-cardboard::before { + content: "\F02AE"; +} + +.mdi-google-chrome::before { + content: "\F02AF"; +} + +.mdi-google-circles::before { + content: "\F02B0"; +} + +.mdi-google-circles-communities::before { + content: "\F02B1"; +} + +.mdi-google-circles-extended::before { + content: "\F02B2"; +} + +.mdi-google-circles-group::before { + content: "\F02B3"; +} + +.mdi-google-classroom::before { + content: "\F02C0"; +} + +.mdi-google-cloud::before { + content: "\F11F6"; +} + +.mdi-google-downasaur::before { + content: "\F1362"; +} + +.mdi-google-drive::before { + content: "\F02B6"; +} + +.mdi-google-earth::before { + content: "\F02B7"; +} + +.mdi-google-fit::before { + content: "\F096C"; +} + +.mdi-google-glass::before { + content: "\F02B8"; +} + +.mdi-google-hangouts::before { + content: "\F02C9"; +} + +.mdi-google-keep::before { + content: "\F06DC"; +} + +.mdi-google-lens::before { + content: "\F09F6"; +} + +.mdi-google-maps::before { + content: "\F05F5"; +} + +.mdi-google-my-business::before { + content: "\F1048"; +} + +.mdi-google-nearby::before { + content: "\F02B9"; +} + +.mdi-google-play::before { + content: "\F02BC"; +} + +.mdi-google-plus::before { + content: "\F02BD"; +} + +.mdi-google-podcast::before { + content: "\F0EB9"; +} + +.mdi-google-spreadsheet::before { + content: "\F09F7"; +} + +.mdi-google-street-view::before { + content: "\F0C88"; +} + +.mdi-google-translate::before { + content: "\F02BF"; +} + +.mdi-gradient-horizontal::before { + content: "\F174A"; +} + +.mdi-gradient-vertical::before { + content: "\F06A0"; +} + +.mdi-grain::before { + content: "\F0D7C"; +} + +.mdi-graph::before { + content: "\F1049"; +} + +.mdi-graph-outline::before { + content: "\F104A"; +} + +.mdi-graphql::before { + content: "\F0877"; +} + +.mdi-grass::before { + content: "\F1510"; +} + +.mdi-grave-stone::before { + content: "\F0BA2"; +} + +.mdi-grease-pencil::before { + content: "\F0648"; +} + +.mdi-greater-than::before { + content: "\F096D"; +} + +.mdi-greater-than-or-equal::before { + content: "\F096E"; +} + +.mdi-greenhouse::before { + content: "\F002D"; +} + +.mdi-grid::before { + content: "\F02C1"; +} + +.mdi-grid-large::before { + content: "\F0758"; +} + +.mdi-grid-off::before { + content: "\F02C2"; +} + +.mdi-grill::before { + content: "\F0E45"; +} + +.mdi-grill-outline::before { + content: "\F118A"; +} + +.mdi-group::before { + content: "\F02C3"; +} + +.mdi-guitar-acoustic::before { + content: "\F0771"; +} + +.mdi-guitar-electric::before { + content: "\F02C4"; +} + +.mdi-guitar-pick::before { + content: "\F02C5"; +} + +.mdi-guitar-pick-outline::before { + content: "\F02C6"; +} + +.mdi-guy-fawkes-mask::before { + content: "\F0825"; +} + +.mdi-gymnastics::before { + content: "\F1A41"; +} + +.mdi-hail::before { + content: "\F0AC1"; +} + +.mdi-hair-dryer::before { + content: "\F10EF"; +} + +.mdi-hair-dryer-outline::before { + content: "\F10F0"; +} + +.mdi-halloween::before { + content: "\F0BA3"; +} + +.mdi-hamburger::before { + content: "\F0685"; +} + +.mdi-hamburger-check::before { + content: "\F1776"; +} + +.mdi-hamburger-minus::before { + content: "\F1777"; +} + +.mdi-hamburger-off::before { + content: "\F1778"; +} + +.mdi-hamburger-plus::before { + content: "\F1779"; +} + +.mdi-hamburger-remove::before { + content: "\F177A"; +} + +.mdi-hammer::before { + content: "\F08EA"; +} + +.mdi-hammer-screwdriver::before { + content: "\F1322"; +} + +.mdi-hammer-sickle::before { + content: "\F1887"; +} + +.mdi-hammer-wrench::before { + content: "\F1323"; +} + +.mdi-hand-back-left::before { + content: "\F0E46"; +} + +.mdi-hand-back-left-off::before { + content: "\F1830"; +} + +.mdi-hand-back-left-off-outline::before { + content: "\F1832"; +} + +.mdi-hand-back-left-outline::before { + content: "\F182C"; +} + +.mdi-hand-back-right::before { + content: "\F0E47"; +} + +.mdi-hand-back-right-off::before { + content: "\F1831"; +} + +.mdi-hand-back-right-off-outline::before { + content: "\F1833"; +} + +.mdi-hand-back-right-outline::before { + content: "\F182D"; +} + +.mdi-hand-clap::before { + content: "\F194B"; +} + +.mdi-hand-clap-off::before { + content: "\F1A42"; +} + +.mdi-hand-coin::before { + content: "\F188F"; +} + +.mdi-hand-coin-outline::before { + content: "\F1890"; +} + +.mdi-hand-cycle::before { + content: "\F1B9C"; +} + +.mdi-hand-extended::before { + content: "\F18B6"; +} + +.mdi-hand-extended-outline::before { + content: "\F18B7"; +} + +.mdi-hand-front-left::before { + content: "\F182B"; +} + +.mdi-hand-front-left-outline::before { + content: "\F182E"; +} + +.mdi-hand-front-right::before { + content: "\F0A4F"; +} + +.mdi-hand-front-right-outline::before { + content: "\F182F"; +} + +.mdi-hand-heart::before { + content: "\F10F1"; +} + +.mdi-hand-heart-outline::before { + content: "\F157E"; +} + +.mdi-hand-okay::before { + content: "\F0A50"; +} + +.mdi-hand-peace::before { + content: "\F0A51"; +} + +.mdi-hand-peace-variant::before { + content: "\F0A52"; +} + +.mdi-hand-pointing-down::before { + content: "\F0A53"; +} + +.mdi-hand-pointing-left::before { + content: "\F0A54"; +} + +.mdi-hand-pointing-right::before { + content: "\F02C7"; +} + +.mdi-hand-pointing-up::before { + content: "\F0A55"; +} + +.mdi-hand-saw::before { + content: "\F0E48"; +} + +.mdi-hand-wash::before { + content: "\F157F"; +} + +.mdi-hand-wash-outline::before { + content: "\F1580"; +} + +.mdi-hand-water::before { + content: "\F139F"; +} + +.mdi-hand-wave::before { + content: "\F1821"; +} + +.mdi-hand-wave-outline::before { + content: "\F1822"; +} + +.mdi-handball::before { + content: "\F0F53"; +} + +.mdi-handcuffs::before { + content: "\F113E"; +} + +.mdi-hands-pray::before { + content: "\F0579"; +} + +.mdi-handshake::before { + content: "\F1218"; +} + +.mdi-handshake-outline::before { + content: "\F15A1"; +} + +.mdi-hanger::before { + content: "\F02C8"; +} + +.mdi-hard-hat::before { + content: "\F096F"; +} + +.mdi-harddisk::before { + content: "\F02CA"; +} + +.mdi-harddisk-plus::before { + content: "\F104B"; +} + +.mdi-harddisk-remove::before { + content: "\F104C"; +} + +.mdi-hat-fedora::before { + content: "\F0BA4"; +} + +.mdi-hazard-lights::before { + content: "\F0C89"; +} + +.mdi-hdmi-port::before { + content: "\F1BB8"; +} + +.mdi-hdr::before { + content: "\F0D7D"; +} + +.mdi-hdr-off::before { + content: "\F0D7E"; +} + +.mdi-head::before { + content: "\F135E"; +} + +.mdi-head-alert::before { + content: "\F1338"; +} + +.mdi-head-alert-outline::before { + content: "\F1339"; +} + +.mdi-head-check::before { + content: "\F133A"; +} + +.mdi-head-check-outline::before { + content: "\F133B"; +} + +.mdi-head-cog::before { + content: "\F133C"; +} + +.mdi-head-cog-outline::before { + content: "\F133D"; +} + +.mdi-head-dots-horizontal::before { + content: "\F133E"; +} + +.mdi-head-dots-horizontal-outline::before { + content: "\F133F"; +} + +.mdi-head-flash::before { + content: "\F1340"; +} + +.mdi-head-flash-outline::before { + content: "\F1341"; +} + +.mdi-head-heart::before { + content: "\F1342"; +} + +.mdi-head-heart-outline::before { + content: "\F1343"; +} + +.mdi-head-lightbulb::before { + content: "\F1344"; +} + +.mdi-head-lightbulb-outline::before { + content: "\F1345"; +} + +.mdi-head-minus::before { + content: "\F1346"; +} + +.mdi-head-minus-outline::before { + content: "\F1347"; +} + +.mdi-head-outline::before { + content: "\F135F"; +} + +.mdi-head-plus::before { + content: "\F1348"; +} + +.mdi-head-plus-outline::before { + content: "\F1349"; +} + +.mdi-head-question::before { + content: "\F134A"; +} + +.mdi-head-question-outline::before { + content: "\F134B"; +} + +.mdi-head-remove::before { + content: "\F134C"; +} + +.mdi-head-remove-outline::before { + content: "\F134D"; +} + +.mdi-head-snowflake::before { + content: "\F134E"; +} + +.mdi-head-snowflake-outline::before { + content: "\F134F"; +} + +.mdi-head-sync::before { + content: "\F1350"; +} + +.mdi-head-sync-outline::before { + content: "\F1351"; +} + +.mdi-headphones::before { + content: "\F02CB"; +} + +.mdi-headphones-bluetooth::before { + content: "\F0970"; +} + +.mdi-headphones-box::before { + content: "\F02CC"; +} + +.mdi-headphones-off::before { + content: "\F07CE"; +} + +.mdi-headphones-settings::before { + content: "\F02CD"; +} + +.mdi-headset::before { + content: "\F02CE"; +} + +.mdi-headset-dock::before { + content: "\F02CF"; +} + +.mdi-headset-off::before { + content: "\F02D0"; +} + +.mdi-heart::before { + content: "\F02D1"; +} + +.mdi-heart-box::before { + content: "\F02D2"; +} + +.mdi-heart-box-outline::before { + content: "\F02D3"; +} + +.mdi-heart-broken::before { + content: "\F02D4"; +} + +.mdi-heart-broken-outline::before { + content: "\F0D14"; +} + +.mdi-heart-circle::before { + content: "\F0971"; +} + +.mdi-heart-circle-outline::before { + content: "\F0972"; +} + +.mdi-heart-cog::before { + content: "\F1663"; +} + +.mdi-heart-cog-outline::before { + content: "\F1664"; +} + +.mdi-heart-flash::before { + content: "\F0EF9"; +} + +.mdi-heart-half::before { + content: "\F06DF"; +} + +.mdi-heart-half-full::before { + content: "\F06DE"; +} + +.mdi-heart-half-outline::before { + content: "\F06E0"; +} + +.mdi-heart-minus::before { + content: "\F142F"; +} + +.mdi-heart-minus-outline::before { + content: "\F1432"; +} + +.mdi-heart-multiple::before { + content: "\F0A56"; +} + +.mdi-heart-multiple-outline::before { + content: "\F0A57"; +} + +.mdi-heart-off::before { + content: "\F0759"; +} + +.mdi-heart-off-outline::before { + content: "\F1434"; +} + +.mdi-heart-outline::before { + content: "\F02D5"; +} + +.mdi-heart-plus::before { + content: "\F142E"; +} + +.mdi-heart-plus-outline::before { + content: "\F1431"; +} + +.mdi-heart-pulse::before { + content: "\F05F6"; +} + +.mdi-heart-remove::before { + content: "\F1430"; +} + +.mdi-heart-remove-outline::before { + content: "\F1433"; +} + +.mdi-heart-search::before { + content: "\F1C8D"; +} + +.mdi-heart-settings::before { + content: "\F1665"; +} + +.mdi-heart-settings-outline::before { + content: "\F1666"; +} + +.mdi-heat-pump::before { + content: "\F1A43"; +} + +.mdi-heat-pump-outline::before { + content: "\F1A44"; +} + +.mdi-heat-wave::before { + content: "\F1A45"; +} + +.mdi-heating-coil::before { + content: "\F1AAF"; +} + +.mdi-helicopter::before { + content: "\F0AC2"; +} + +.mdi-help::before { + content: "\F02D6"; +} + +.mdi-help-box::before { + content: "\F078B"; +} + +.mdi-help-box-multiple::before { + content: "\F1C0A"; +} + +.mdi-help-box-multiple-outline::before { + content: "\F1C0B"; +} + +.mdi-help-box-outline::before { + content: "\F1C0C"; +} + +.mdi-help-circle::before { + content: "\F02D7"; +} + +.mdi-help-circle-outline::before { + content: "\F0625"; +} + +.mdi-help-network::before { + content: "\F06F5"; +} + +.mdi-help-network-outline::before { + content: "\F0C8A"; +} + +.mdi-help-rhombus::before { + content: "\F0BA5"; +} + +.mdi-help-rhombus-outline::before { + content: "\F0BA6"; +} + +.mdi-hexadecimal::before { + content: "\F12A7"; +} + +.mdi-hexagon::before { + content: "\F02D8"; +} + +.mdi-hexagon-multiple::before { + content: "\F06E1"; +} + +.mdi-hexagon-multiple-outline::before { + content: "\F10F2"; +} + +.mdi-hexagon-outline::before { + content: "\F02D9"; +} + +.mdi-hexagon-slice-1::before { + content: "\F0AC3"; +} + +.mdi-hexagon-slice-2::before { + content: "\F0AC4"; +} + +.mdi-hexagon-slice-3::before { + content: "\F0AC5"; +} + +.mdi-hexagon-slice-4::before { + content: "\F0AC6"; +} + +.mdi-hexagon-slice-5::before { + content: "\F0AC7"; +} + +.mdi-hexagon-slice-6::before { + content: "\F0AC8"; +} + +.mdi-hexagram::before { + content: "\F0AC9"; +} + +.mdi-hexagram-outline::before { + content: "\F0ACA"; +} + +.mdi-high-definition::before { + content: "\F07CF"; +} + +.mdi-high-definition-box::before { + content: "\F0878"; +} + +.mdi-highway::before { + content: "\F05F7"; +} + +.mdi-hiking::before { + content: "\F0D7F"; +} + +.mdi-history::before { + content: "\F02DA"; +} + +.mdi-hockey-puck::before { + content: "\F0879"; +} + +.mdi-hockey-sticks::before { + content: "\F087A"; +} + +.mdi-hololens::before { + content: "\F02DB"; +} + +.mdi-home::before { + content: "\F02DC"; +} + +.mdi-home-account::before { + content: "\F0826"; +} + +.mdi-home-alert::before { + content: "\F087B"; +} + +.mdi-home-alert-outline::before { + content: "\F15D0"; +} + +.mdi-home-analytics::before { + content: "\F0EBA"; +} + +.mdi-home-assistant::before { + content: "\F07D0"; +} + +.mdi-home-automation::before { + content: "\F07D1"; +} + +.mdi-home-battery::before { + content: "\F1901"; +} + +.mdi-home-battery-outline::before { + content: "\F1902"; +} + +.mdi-home-circle::before { + content: "\F07D2"; +} + +.mdi-home-circle-outline::before { + content: "\F104D"; +} + +.mdi-home-city::before { + content: "\F0D15"; +} + +.mdi-home-city-outline::before { + content: "\F0D16"; +} + +.mdi-home-clock::before { + content: "\F1A12"; +} + +.mdi-home-clock-outline::before { + content: "\F1A13"; +} + +.mdi-home-edit::before { + content: "\F1159"; +} + +.mdi-home-edit-outline::before { + content: "\F115A"; +} + +.mdi-home-export-outline::before { + content: "\F0F9B"; +} + +.mdi-home-flood::before { + content: "\F0EFA"; +} + +.mdi-home-floor-0::before { + content: "\F0DD2"; +} + +.mdi-home-floor-1::before { + content: "\F0D80"; +} + +.mdi-home-floor-2::before { + content: "\F0D81"; +} + +.mdi-home-floor-3::before { + content: "\F0D82"; +} + +.mdi-home-floor-a::before { + content: "\F0D83"; +} + +.mdi-home-floor-b::before { + content: "\F0D84"; +} + +.mdi-home-floor-g::before { + content: "\F0D85"; +} + +.mdi-home-floor-l::before { + content: "\F0D86"; +} + +.mdi-home-floor-negative-1::before { + content: "\F0DD3"; +} + +.mdi-home-group::before { + content: "\F0DD4"; +} + +.mdi-home-group-minus::before { + content: "\F19C1"; +} + +.mdi-home-group-plus::before { + content: "\F19C0"; +} + +.mdi-home-group-remove::before { + content: "\F19C2"; +} + +.mdi-home-heart::before { + content: "\F0827"; +} + +.mdi-home-import-outline::before { + content: "\F0F9C"; +} + +.mdi-home-lightbulb::before { + content: "\F1251"; +} + +.mdi-home-lightbulb-outline::before { + content: "\F1252"; +} + +.mdi-home-lightning-bolt::before { + content: "\F1903"; +} + +.mdi-home-lightning-bolt-outline::before { + content: "\F1904"; +} + +.mdi-home-lock::before { + content: "\F08EB"; +} + +.mdi-home-lock-open::before { + content: "\F08EC"; +} + +.mdi-home-map-marker::before { + content: "\F05F8"; +} + +.mdi-home-minus::before { + content: "\F0974"; +} + +.mdi-home-minus-outline::before { + content: "\F13D5"; +} + +.mdi-home-modern::before { + content: "\F02DD"; +} + +.mdi-home-off::before { + content: "\F1A46"; +} + +.mdi-home-off-outline::before { + content: "\F1A47"; +} + +.mdi-home-outline::before { + content: "\F06A1"; +} + +.mdi-home-percent::before { + content: "\F1C7C"; +} + +.mdi-home-percent-outline::before { + content: "\F1C7D"; +} + +.mdi-home-plus::before { + content: "\F0975"; +} + +.mdi-home-plus-outline::before { + content: "\F13D6"; +} + +.mdi-home-remove::before { + content: "\F1247"; +} + +.mdi-home-remove-outline::before { + content: "\F13D7"; +} + +.mdi-home-roof::before { + content: "\F112B"; +} + +.mdi-home-search::before { + content: "\F13B0"; +} + +.mdi-home-search-outline::before { + content: "\F13B1"; +} + +.mdi-home-silo::before { + content: "\F1BA0"; +} + +.mdi-home-silo-outline::before { + content: "\F1BA1"; +} + +.mdi-home-sound-in::before { + content: "\F1C2F"; +} + +.mdi-home-sound-in-outline::before { + content: "\F1C30"; +} + +.mdi-home-sound-out::before { + content: "\F1C31"; +} + +.mdi-home-sound-out-outline::before { + content: "\F1C32"; +} + +.mdi-home-switch::before { + content: "\F1794"; +} + +.mdi-home-switch-outline::before { + content: "\F1795"; +} + +.mdi-home-thermometer::before { + content: "\F0F54"; +} + +.mdi-home-thermometer-outline::before { + content: "\F0F55"; +} + +.mdi-home-variant::before { + content: "\F02DE"; +} + +.mdi-home-variant-outline::before { + content: "\F0BA7"; +} + +.mdi-hook::before { + content: "\F06E2"; +} + +.mdi-hook-off::before { + content: "\F06E3"; +} + +.mdi-hoop-house::before { + content: "\F0E56"; +} + +.mdi-hops::before { + content: "\F02DF"; +} + +.mdi-horizontal-rotate-clockwise::before { + content: "\F10F3"; +} + +.mdi-horizontal-rotate-counterclockwise::before { + content: "\F10F4"; +} + +.mdi-horse::before { + content: "\F15BF"; +} + +.mdi-horse-human::before { + content: "\F15C0"; +} + +.mdi-horse-variant::before { + content: "\F15C1"; +} + +.mdi-horse-variant-fast::before { + content: "\F186E"; +} + +.mdi-horseshoe::before { + content: "\F0A58"; +} + +.mdi-hospital::before { + content: "\F0FF6"; +} + +.mdi-hospital-box::before { + content: "\F02E0"; +} + +.mdi-hospital-box-outline::before { + content: "\F0FF7"; +} + +.mdi-hospital-building::before { + content: "\F02E1"; +} + +.mdi-hospital-marker::before { + content: "\F02E2"; +} + +.mdi-hot-tub::before { + content: "\F0828"; +} + +.mdi-hours-12::before { + content: "\F1C94"; +} + +.mdi-hours-24::before { + content: "\F1478"; +} + +.mdi-hub::before { + content: "\F1C95"; +} + +.mdi-hub-outline::before { + content: "\F1C96"; +} + +.mdi-hubspot::before { + content: "\F0D17"; +} + +.mdi-hulu::before { + content: "\F0829"; +} + +.mdi-human::before { + content: "\F02E6"; +} + +.mdi-human-baby-changing-table::before { + content: "\F138B"; +} + +.mdi-human-cane::before { + content: "\F1581"; +} + +.mdi-human-capacity-decrease::before { + content: "\F159B"; +} + +.mdi-human-capacity-increase::before { + content: "\F159C"; +} + +.mdi-human-child::before { + content: "\F02E7"; +} + +.mdi-human-dolly::before { + content: "\F1980"; +} + +.mdi-human-edit::before { + content: "\F14E8"; +} + +.mdi-human-female::before { + content: "\F0649"; +} + +.mdi-human-female-boy::before { + content: "\F0A59"; +} + +.mdi-human-female-dance::before { + content: "\F15C9"; +} + +.mdi-human-female-female::before { + content: "\F0A5A"; +} + +.mdi-human-female-female-child::before { + content: "\F1C8E"; +} + +.mdi-human-female-girl::before { + content: "\F0A5B"; +} + +.mdi-human-greeting::before { + content: "\F17C4"; +} + +.mdi-human-greeting-proximity::before { + content: "\F159D"; +} + +.mdi-human-greeting-variant::before { + content: "\F064A"; +} + +.mdi-human-handsdown::before { + content: "\F064B"; +} + +.mdi-human-handsup::before { + content: "\F064C"; +} + +.mdi-human-male::before { + content: "\F064D"; +} + +.mdi-human-male-board::before { + content: "\F0890"; +} + +.mdi-human-male-board-poll::before { + content: "\F0846"; +} + +.mdi-human-male-boy::before { + content: "\F0A5C"; +} + +.mdi-human-male-child::before { + content: "\F138C"; +} + +.mdi-human-male-female::before { + content: "\F02E8"; +} + +.mdi-human-male-female-child::before { + content: "\F1823"; +} + +.mdi-human-male-girl::before { + content: "\F0A5D"; +} + +.mdi-human-male-height::before { + content: "\F0EFB"; +} + +.mdi-human-male-height-variant::before { + content: "\F0EFC"; +} + +.mdi-human-male-male::before { + content: "\F0A5E"; +} + +.mdi-human-male-male-child::before { + content: "\F1C8F"; +} + +.mdi-human-non-binary::before { + content: "\F1848"; +} + +.mdi-human-pregnant::before { + content: "\F05CF"; +} + +.mdi-human-queue::before { + content: "\F1571"; +} + +.mdi-human-scooter::before { + content: "\F11E9"; +} + +.mdi-human-walker::before { + content: "\F1B71"; +} + +.mdi-human-wheelchair::before { + content: "\F138D"; +} + +.mdi-human-white-cane::before { + content: "\F1981"; +} + +.mdi-humble-bundle::before { + content: "\F0744"; +} + +.mdi-hvac::before { + content: "\F1352"; +} + +.mdi-hvac-off::before { + content: "\F159E"; +} + +.mdi-hydraulic-oil-level::before { + content: "\F1324"; +} + +.mdi-hydraulic-oil-temperature::before { + content: "\F1325"; +} + +.mdi-hydro-power::before { + content: "\F12E5"; +} + +.mdi-hydrogen-station::before { + content: "\F1894"; +} + +.mdi-ice-cream::before { + content: "\F082A"; +} + +.mdi-ice-cream-off::before { + content: "\F0E52"; +} + +.mdi-ice-pop::before { + content: "\F0EFD"; +} + +.mdi-id-card::before { + content: "\F0FC0"; +} + +.mdi-identifier::before { + content: "\F0EFE"; +} + +.mdi-ideogram-cjk::before { + content: "\F1331"; +} + +.mdi-ideogram-cjk-variant::before { + content: "\F1332"; +} + +.mdi-image::before { + content: "\F02E9"; +} + +.mdi-image-album::before { + content: "\F02EA"; +} + +.mdi-image-area::before { + content: "\F02EB"; +} + +.mdi-image-area-close::before { + content: "\F02EC"; +} + +.mdi-image-auto-adjust::before { + content: "\F0FC1"; +} + +.mdi-image-broken::before { + content: "\F02ED"; +} + +.mdi-image-broken-variant::before { + content: "\F02EE"; +} + +.mdi-image-check::before { + content: "\F1B25"; +} + +.mdi-image-check-outline::before { + content: "\F1B26"; +} + +.mdi-image-edit::before { + content: "\F11E3"; +} + +.mdi-image-edit-outline::before { + content: "\F11E4"; +} + +.mdi-image-filter-black-white::before { + content: "\F02F0"; +} + +.mdi-image-filter-center-focus::before { + content: "\F02F1"; +} + +.mdi-image-filter-center-focus-strong::before { + content: "\F0EFF"; +} + +.mdi-image-filter-center-focus-strong-outline::before { + content: "\F0F00"; +} + +.mdi-image-filter-center-focus-weak::before { + content: "\F02F2"; +} + +.mdi-image-filter-drama::before { + content: "\F02F3"; +} + +.mdi-image-filter-drama-outline::before { + content: "\F1BFF"; +} + +.mdi-image-filter-frames::before { + content: "\F02F4"; +} + +.mdi-image-filter-hdr::before { + content: "\F02F5"; +} + +.mdi-image-filter-hdr-outline::before { + content: "\F1C64"; +} + +.mdi-image-filter-none::before { + content: "\F02F6"; +} + +.mdi-image-filter-tilt-shift::before { + content: "\F02F7"; +} + +.mdi-image-filter-vintage::before { + content: "\F02F8"; +} + +.mdi-image-frame::before { + content: "\F0E49"; +} + +.mdi-image-lock::before { + content: "\F1AB0"; +} + +.mdi-image-lock-outline::before { + content: "\F1AB1"; +} + +.mdi-image-marker::before { + content: "\F177B"; +} + +.mdi-image-marker-outline::before { + content: "\F177C"; +} + +.mdi-image-minus::before { + content: "\F1419"; +} + +.mdi-image-minus-outline::before { + content: "\F1B47"; +} + +.mdi-image-move::before { + content: "\F09F8"; +} + +.mdi-image-multiple::before { + content: "\F02F9"; +} + +.mdi-image-multiple-outline::before { + content: "\F02EF"; +} + +.mdi-image-off::before { + content: "\F082B"; +} + +.mdi-image-off-outline::before { + content: "\F11D1"; +} + +.mdi-image-outline::before { + content: "\F0976"; +} + +.mdi-image-plus::before { + content: "\F087C"; +} + +.mdi-image-plus-outline::before { + content: "\F1B46"; +} + +.mdi-image-refresh::before { + content: "\F19FE"; +} + +.mdi-image-refresh-outline::before { + content: "\F19FF"; +} + +.mdi-image-remove::before { + content: "\F1418"; +} + +.mdi-image-remove-outline::before { + content: "\F1B48"; +} + +.mdi-image-search::before { + content: "\F0977"; +} + +.mdi-image-search-outline::before { + content: "\F0978"; +} + +.mdi-image-size-select-actual::before { + content: "\F0C8D"; +} + +.mdi-image-size-select-large::before { + content: "\F0C8E"; +} + +.mdi-image-size-select-small::before { + content: "\F0C8F"; +} + +.mdi-image-sync::before { + content: "\F1A00"; +} + +.mdi-image-sync-outline::before { + content: "\F1A01"; +} + +.mdi-image-text::before { + content: "\F160D"; +} + +.mdi-import::before { + content: "\F02FA"; +} + +.mdi-inbox::before { + content: "\F0687"; +} + +.mdi-inbox-arrow-down::before { + content: "\F02FB"; +} + +.mdi-inbox-arrow-down-outline::before { + content: "\F1270"; +} + +.mdi-inbox-arrow-up::before { + content: "\F03D1"; +} + +.mdi-inbox-arrow-up-outline::before { + content: "\F1271"; +} + +.mdi-inbox-full::before { + content: "\F1272"; +} + +.mdi-inbox-full-outline::before { + content: "\F1273"; +} + +.mdi-inbox-multiple::before { + content: "\F08B0"; +} + +.mdi-inbox-multiple-outline::before { + content: "\F0BA8"; +} + +.mdi-inbox-outline::before { + content: "\F1274"; +} + +.mdi-inbox-remove::before { + content: "\F159F"; +} + +.mdi-inbox-remove-outline::before { + content: "\F15A0"; +} + +.mdi-incognito::before { + content: "\F05F9"; +} + +.mdi-incognito-circle::before { + content: "\F1421"; +} + +.mdi-incognito-circle-off::before { + content: "\F1422"; +} + +.mdi-incognito-off::before { + content: "\F0075"; +} + +.mdi-induction::before { + content: "\F184C"; +} + +.mdi-infinity::before { + content: "\F06E4"; +} + +.mdi-information::before { + content: "\F02FC"; +} + +.mdi-information-box::before { + content: "\F1C65"; +} + +.mdi-information-box-outline::before { + content: "\F1C66"; +} + +.mdi-information-off::before { + content: "\F178C"; +} + +.mdi-information-off-outline::before { + content: "\F178D"; +} + +.mdi-information-outline::before { + content: "\F02FD"; +} + +.mdi-information-slab-box::before { + content: "\F1C67"; +} + +.mdi-information-slab-box-outline::before { + content: "\F1C68"; +} + +.mdi-information-slab-circle::before { + content: "\F1C69"; +} + +.mdi-information-slab-circle-outline::before { + content: "\F1C6A"; +} + +.mdi-information-slab-symbol::before { + content: "\F1C6B"; +} + +.mdi-information-symbol::before { + content: "\F1C6C"; +} + +.mdi-information-variant::before { + content: "\F064E"; +} + +.mdi-information-variant-box::before { + content: "\F1C6D"; +} + +.mdi-information-variant-box-outline::before { + content: "\F1C6E"; +} + +.mdi-information-variant-circle::before { + content: "\F1C6F"; +} + +.mdi-information-variant-circle-outline::before { + content: "\F1C70"; +} + +.mdi-instagram::before { + content: "\F02FE"; +} + +.mdi-instrument-triangle::before { + content: "\F104E"; +} + +.mdi-integrated-circuit-chip::before { + content: "\F1913"; +} + +.mdi-invert-colors::before { + content: "\F0301"; +} + +.mdi-invert-colors-off::before { + content: "\F0E4A"; +} + +.mdi-invoice::before { + content: "\F1CD2"; +} + +.mdi-invoice-arrow-left::before { + content: "\F1CD3"; +} + +.mdi-invoice-arrow-left-outline::before { + content: "\F1CD4"; +} + +.mdi-invoice-arrow-right::before { + content: "\F1CD5"; +} + +.mdi-invoice-arrow-right-outline::before { + content: "\F1CD6"; +} + +.mdi-invoice-check::before { + content: "\F1CD7"; +} + +.mdi-invoice-check-outline::before { + content: "\F1CD8"; +} + +.mdi-invoice-clock::before { + content: "\F1CD9"; +} + +.mdi-invoice-clock-outline::before { + content: "\F1CDA"; +} + +.mdi-invoice-edit::before { + content: "\F1CDB"; +} + +.mdi-invoice-edit-outline::before { + content: "\F1CDC"; +} + +.mdi-invoice-export-outline::before { + content: "\F1CDD"; +} + +.mdi-invoice-fast::before { + content: "\F1CDE"; +} + +.mdi-invoice-fast-outline::before { + content: "\F1CDF"; +} + +.mdi-invoice-import::before { + content: "\F1CE0"; +} + +.mdi-invoice-import-outline::before { + content: "\F1CE1"; +} + +.mdi-invoice-list::before { + content: "\F1CE2"; +} + +.mdi-invoice-list-outline::before { + content: "\F1CE3"; +} + +.mdi-invoice-minus::before { + content: "\F1CE4"; +} + +.mdi-invoice-minus-outline::before { + content: "\F1CE5"; +} + +.mdi-invoice-multiple::before { + content: "\F1CE6"; +} + +.mdi-invoice-multiple-outline::before { + content: "\F1CE7"; +} + +.mdi-invoice-outline::before { + content: "\F1CE8"; +} + +.mdi-invoice-plus::before { + content: "\F1CE9"; +} + +.mdi-invoice-plus-outline::before { + content: "\F1CEA"; +} + +.mdi-invoice-remove::before { + content: "\F1CEB"; +} + +.mdi-invoice-remove-outline::before { + content: "\F1CEC"; +} + +.mdi-invoice-send::before { + content: "\F1CED"; +} + +.mdi-invoice-send-outline::before { + content: "\F1CEE"; +} + +.mdi-invoice-text::before { + content: "\F1CEF"; +} + +.mdi-invoice-text-arrow-left::before { + content: "\F1CF0"; +} + +.mdi-invoice-text-arrow-left-outline::before { + content: "\F1CF1"; +} + +.mdi-invoice-text-arrow-right::before { + content: "\F1CF2"; +} + +.mdi-invoice-text-arrow-right-outline::before { + content: "\F1CF3"; +} + +.mdi-invoice-text-check::before { + content: "\F1CF4"; +} + +.mdi-invoice-text-check-outline::before { + content: "\F1CF5"; +} + +.mdi-invoice-text-clock::before { + content: "\F1CF6"; +} + +.mdi-invoice-text-clock-outline::before { + content: "\F1CF7"; +} + +.mdi-invoice-text-edit::before { + content: "\F1CF8"; +} + +.mdi-invoice-text-edit-outline::before { + content: "\F1CF9"; +} + +.mdi-invoice-text-fast::before { + content: "\F1CFA"; +} + +.mdi-invoice-text-fast-outline::before { + content: "\F1CFB"; +} + +.mdi-invoice-text-minus::before { + content: "\F1CFC"; +} + +.mdi-invoice-text-minus-outline::before { + content: "\F1CFD"; +} + +.mdi-invoice-text-multiple::before { + content: "\F1CFE"; +} + +.mdi-invoice-text-multiple-outline::before { + content: "\F1CFF"; +} + +.mdi-invoice-text-outline::before { + content: "\F1D00"; +} + +.mdi-invoice-text-plus::before { + content: "\F1D01"; +} + +.mdi-invoice-text-plus-outline::before { + content: "\F1D02"; +} + +.mdi-invoice-text-remove::before { + content: "\F1D03"; +} + +.mdi-invoice-text-remove-outline::before { + content: "\F1D04"; +} + +.mdi-invoice-text-send::before { + content: "\F1D05"; +} + +.mdi-invoice-text-send-outline::before { + content: "\F1D06"; +} + +.mdi-iobroker::before { + content: "\F12E8"; +} + +.mdi-ip::before { + content: "\F0A5F"; +} + +.mdi-ip-network::before { + content: "\F0A60"; +} + +.mdi-ip-network-outline::before { + content: "\F0C90"; +} + +.mdi-ip-outline::before { + content: "\F1982"; +} + +.mdi-ipod::before { + content: "\F0C91"; +} + +.mdi-iron::before { + content: "\F1824"; +} + +.mdi-iron-board::before { + content: "\F1838"; +} + +.mdi-iron-outline::before { + content: "\F1825"; +} + +.mdi-island::before { + content: "\F104F"; +} + +.mdi-island-variant::before { + content: "\F1CC6"; +} + +.mdi-iv-bag::before { + content: "\F10B9"; +} + +.mdi-jabber::before { + content: "\F0DD5"; +} + +.mdi-jeepney::before { + content: "\F0302"; +} + +.mdi-jellyfish::before { + content: "\F0F01"; +} + +.mdi-jellyfish-outline::before { + content: "\F0F02"; +} + +.mdi-jira::before { + content: "\F0303"; +} + +.mdi-jquery::before { + content: "\F087D"; +} + +.mdi-jsfiddle::before { + content: "\F0304"; +} + +.mdi-jump-rope::before { + content: "\F12FF"; +} + +.mdi-kabaddi::before { + content: "\F0D87"; +} + +.mdi-kangaroo::before { + content: "\F1558"; +} + +.mdi-karate::before { + content: "\F082C"; +} + +.mdi-kayaking::before { + content: "\F08AF"; +} + +.mdi-keg::before { + content: "\F0305"; +} + +.mdi-kettle::before { + content: "\F05FA"; +} + +.mdi-kettle-alert::before { + content: "\F1317"; +} + +.mdi-kettle-alert-outline::before { + content: "\F1318"; +} + +.mdi-kettle-off::before { + content: "\F131B"; +} + +.mdi-kettle-off-outline::before { + content: "\F131C"; +} + +.mdi-kettle-outline::before { + content: "\F0F56"; +} + +.mdi-kettle-pour-over::before { + content: "\F173C"; +} + +.mdi-kettle-steam::before { + content: "\F1319"; +} + +.mdi-kettle-steam-outline::before { + content: "\F131A"; +} + +.mdi-kettlebell::before { + content: "\F1300"; +} + +.mdi-key::before { + content: "\F0306"; +} + +.mdi-key-alert::before { + content: "\F1983"; +} + +.mdi-key-alert-outline::before { + content: "\F1984"; +} + +.mdi-key-arrow-right::before { + content: "\F1312"; +} + +.mdi-key-chain::before { + content: "\F1574"; +} + +.mdi-key-chain-variant::before { + content: "\F1575"; +} + +.mdi-key-change::before { + content: "\F0307"; +} + +.mdi-key-link::before { + content: "\F119F"; +} + +.mdi-key-minus::before { + content: "\F0308"; +} + +.mdi-key-outline::before { + content: "\F0DD6"; +} + +.mdi-key-plus::before { + content: "\F0309"; +} + +.mdi-key-remove::before { + content: "\F030A"; +} + +.mdi-key-star::before { + content: "\F119E"; +} + +.mdi-key-variant::before { + content: "\F030B"; +} + +.mdi-key-wireless::before { + content: "\F0FC2"; +} + +.mdi-keyboard::before { + content: "\F030C"; +} + +.mdi-keyboard-backspace::before { + content: "\F030D"; +} + +.mdi-keyboard-caps::before { + content: "\F030E"; +} + +.mdi-keyboard-close::before { + content: "\F030F"; +} + +.mdi-keyboard-close-outline::before { + content: "\F1C00"; +} + +.mdi-keyboard-esc::before { + content: "\F12B7"; +} + +.mdi-keyboard-f1::before { + content: "\F12AB"; +} + +.mdi-keyboard-f10::before { + content: "\F12B4"; +} + +.mdi-keyboard-f11::before { + content: "\F12B5"; +} + +.mdi-keyboard-f12::before { + content: "\F12B6"; +} + +.mdi-keyboard-f2::before { + content: "\F12AC"; +} + +.mdi-keyboard-f3::before { + content: "\F12AD"; +} + +.mdi-keyboard-f4::before { + content: "\F12AE"; +} + +.mdi-keyboard-f5::before { + content: "\F12AF"; +} + +.mdi-keyboard-f6::before { + content: "\F12B0"; +} + +.mdi-keyboard-f7::before { + content: "\F12B1"; +} + +.mdi-keyboard-f8::before { + content: "\F12B2"; +} + +.mdi-keyboard-f9::before { + content: "\F12B3"; +} + +.mdi-keyboard-off::before { + content: "\F0310"; +} + +.mdi-keyboard-off-outline::before { + content: "\F0E4B"; +} + +.mdi-keyboard-outline::before { + content: "\F097B"; +} + +.mdi-keyboard-return::before { + content: "\F0311"; +} + +.mdi-keyboard-settings::before { + content: "\F09F9"; +} + +.mdi-keyboard-settings-outline::before { + content: "\F09FA"; +} + +.mdi-keyboard-space::before { + content: "\F1050"; +} + +.mdi-keyboard-tab::before { + content: "\F0312"; +} + +.mdi-keyboard-tab-reverse::before { + content: "\F0325"; +} + +.mdi-keyboard-variant::before { + content: "\F0313"; +} + +.mdi-khanda::before { + content: "\F10FD"; +} + +.mdi-kickstarter::before { + content: "\F0745"; +} + +.mdi-kite::before { + content: "\F1985"; +} + +.mdi-kite-outline::before { + content: "\F1986"; +} + +.mdi-kitesurfing::before { + content: "\F1744"; +} + +.mdi-klingon::before { + content: "\F135B"; +} + +.mdi-knife::before { + content: "\F09FB"; +} + +.mdi-knife-military::before { + content: "\F09FC"; +} + +.mdi-knob::before { + content: "\F1B96"; +} + +.mdi-koala::before { + content: "\F173F"; +} + +.mdi-kodi::before { + content: "\F0314"; +} + +.mdi-kubernetes::before { + content: "\F10FE"; +} + +.mdi-label::before { + content: "\F0315"; +} + +.mdi-label-multiple::before { + content: "\F1375"; +} + +.mdi-label-multiple-outline::before { + content: "\F1376"; +} + +.mdi-label-off::before { + content: "\F0ACB"; +} + +.mdi-label-off-outline::before { + content: "\F0ACC"; +} + +.mdi-label-outline::before { + content: "\F0316"; +} + +.mdi-label-percent::before { + content: "\F12EA"; +} + +.mdi-label-percent-outline::before { + content: "\F12EB"; +} + +.mdi-label-variant::before { + content: "\F0ACD"; +} + +.mdi-label-variant-outline::before { + content: "\F0ACE"; +} + +.mdi-ladder::before { + content: "\F15A2"; +} + +.mdi-ladybug::before { + content: "\F082D"; +} + +.mdi-lambda::before { + content: "\F0627"; +} + +.mdi-lamp::before { + content: "\F06B5"; +} + +.mdi-lamp-outline::before { + content: "\F17D0"; +} + +.mdi-lamps::before { + content: "\F1576"; +} + +.mdi-lamps-outline::before { + content: "\F17D1"; +} + +.mdi-lan::before { + content: "\F0317"; +} + +.mdi-lan-check::before { + content: "\F12AA"; +} + +.mdi-lan-connect::before { + content: "\F0318"; +} + +.mdi-lan-disconnect::before { + content: "\F0319"; +} + +.mdi-lan-pending::before { + content: "\F031A"; +} + +.mdi-land-fields::before { + content: "\F1AB2"; +} + +.mdi-land-plots::before { + content: "\F1AB3"; +} + +.mdi-land-plots-circle::before { + content: "\F1AB4"; +} + +.mdi-land-plots-circle-variant::before { + content: "\F1AB5"; +} + +.mdi-land-plots-marker::before { + content: "\F1C5D"; +} + +.mdi-land-rows-horizontal::before { + content: "\F1AB6"; +} + +.mdi-land-rows-vertical::before { + content: "\F1AB7"; +} + +.mdi-landslide::before { + content: "\F1A48"; +} + +.mdi-landslide-outline::before { + content: "\F1A49"; +} + +.mdi-language-c::before { + content: "\F0671"; +} + +.mdi-language-cpp::before { + content: "\F0672"; +} + +.mdi-language-csharp::before { + content: "\F031B"; +} + +.mdi-language-css3::before { + content: "\F031C"; +} + +.mdi-language-fortran::before { + content: "\F121A"; +} + +.mdi-language-go::before { + content: "\F07D3"; +} + +.mdi-language-haskell::before { + content: "\F0C92"; +} + +.mdi-language-html5::before { + content: "\F031D"; +} + +.mdi-language-java::before { + content: "\F0B37"; +} + +.mdi-language-javascript::before { + content: "\F031E"; +} + +.mdi-language-kotlin::before { + content: "\F1219"; +} + +.mdi-language-lua::before { + content: "\F08B1"; +} + +.mdi-language-markdown::before { + content: "\F0354"; +} + +.mdi-language-markdown-outline::before { + content: "\F0F5B"; +} + +.mdi-language-php::before { + content: "\F031F"; +} + +.mdi-language-python::before { + content: "\F0320"; +} + +.mdi-language-r::before { + content: "\F07D4"; +} + +.mdi-language-ruby::before { + content: "\F0D2D"; +} + +.mdi-language-ruby-on-rails::before { + content: "\F0ACF"; +} + +.mdi-language-rust::before { + content: "\F1617"; +} + +.mdi-language-swift::before { + content: "\F06E5"; +} + +.mdi-language-typescript::before { + content: "\F06E6"; +} + +.mdi-language-xaml::before { + content: "\F0673"; +} + +.mdi-laptop::before { + content: "\F0322"; +} + +.mdi-laptop-account::before { + content: "\F1A4A"; +} + +.mdi-laptop-off::before { + content: "\F06E7"; +} + +.mdi-laravel::before { + content: "\F0AD0"; +} + +.mdi-laser-pointer::before { + content: "\F1484"; +} + +.mdi-lasso::before { + content: "\F0F03"; +} + +.mdi-lastpass::before { + content: "\F0446"; +} + +.mdi-latitude::before { + content: "\F0F57"; +} + +.mdi-launch::before { + content: "\F0327"; +} + +.mdi-lava-lamp::before { + content: "\F07D5"; +} + +.mdi-layers::before { + content: "\F0328"; +} + +.mdi-layers-edit::before { + content: "\F1892"; +} + +.mdi-layers-minus::before { + content: "\F0E4C"; +} + +.mdi-layers-off::before { + content: "\F0329"; +} + +.mdi-layers-off-outline::before { + content: "\F09FD"; +} + +.mdi-layers-outline::before { + content: "\F09FE"; +} + +.mdi-layers-plus::before { + content: "\F0E4D"; +} + +.mdi-layers-remove::before { + content: "\F0E4E"; +} + +.mdi-layers-search::before { + content: "\F1206"; +} + +.mdi-layers-search-outline::before { + content: "\F1207"; +} + +.mdi-layers-triple::before { + content: "\F0F58"; +} + +.mdi-layers-triple-outline::before { + content: "\F0F59"; +} + +.mdi-lead-pencil::before { + content: "\F064F"; +} + +.mdi-leaf::before { + content: "\F032A"; +} + +.mdi-leaf-circle::before { + content: "\F1905"; +} + +.mdi-leaf-circle-outline::before { + content: "\F1906"; +} + +.mdi-leaf-maple::before { + content: "\F0C93"; +} + +.mdi-leaf-maple-off::before { + content: "\F12DA"; +} + +.mdi-leaf-off::before { + content: "\F12D9"; +} + +.mdi-leak::before { + content: "\F0DD7"; +} + +.mdi-leak-off::before { + content: "\F0DD8"; +} + +.mdi-lectern::before { + content: "\F1AF0"; +} + +.mdi-led-off::before { + content: "\F032B"; +} + +.mdi-led-on::before { + content: "\F032C"; +} + +.mdi-led-outline::before { + content: "\F032D"; +} + +.mdi-led-strip::before { + content: "\F07D6"; +} + +.mdi-led-strip-variant::before { + content: "\F1051"; +} + +.mdi-led-strip-variant-off::before { + content: "\F1A4B"; +} + +.mdi-led-variant-off::before { + content: "\F032E"; +} + +.mdi-led-variant-on::before { + content: "\F032F"; +} + +.mdi-led-variant-outline::before { + content: "\F0330"; +} + +.mdi-leek::before { + content: "\F117D"; +} + +.mdi-less-than::before { + content: "\F097C"; +} + +.mdi-less-than-or-equal::before { + content: "\F097D"; +} + +.mdi-library::before { + content: "\F0331"; +} + +.mdi-library-outline::before { + content: "\F1A22"; +} + +.mdi-library-shelves::before { + content: "\F0BA9"; +} + +.mdi-license::before { + content: "\F0FC3"; +} + +.mdi-lifebuoy::before { + content: "\F087E"; +} + +.mdi-light-flood-down::before { + content: "\F1987"; +} + +.mdi-light-flood-up::before { + content: "\F1988"; +} + +.mdi-light-recessed::before { + content: "\F179B"; +} + +.mdi-light-switch::before { + content: "\F097E"; +} + +.mdi-light-switch-off::before { + content: "\F1A24"; +} + +.mdi-lightbulb::before { + content: "\F0335"; +} + +.mdi-lightbulb-alert::before { + content: "\F19E1"; +} + +.mdi-lightbulb-alert-outline::before { + content: "\F19E2"; +} + +.mdi-lightbulb-auto::before { + content: "\F1800"; +} + +.mdi-lightbulb-auto-outline::before { + content: "\F1801"; +} + +.mdi-lightbulb-cfl::before { + content: "\F1208"; +} + +.mdi-lightbulb-cfl-off::before { + content: "\F1209"; +} + +.mdi-lightbulb-cfl-spiral::before { + content: "\F1275"; +} + +.mdi-lightbulb-cfl-spiral-off::before { + content: "\F12C3"; +} + +.mdi-lightbulb-fluorescent-tube::before { + content: "\F1804"; +} + +.mdi-lightbulb-fluorescent-tube-outline::before { + content: "\F1805"; +} + +.mdi-lightbulb-group::before { + content: "\F1253"; +} + +.mdi-lightbulb-group-off::before { + content: "\F12CD"; +} + +.mdi-lightbulb-group-off-outline::before { + content: "\F12CE"; +} + +.mdi-lightbulb-group-outline::before { + content: "\F1254"; +} + +.mdi-lightbulb-multiple::before { + content: "\F1255"; +} + +.mdi-lightbulb-multiple-off::before { + content: "\F12CF"; +} + +.mdi-lightbulb-multiple-off-outline::before { + content: "\F12D0"; +} + +.mdi-lightbulb-multiple-outline::before { + content: "\F1256"; +} + +.mdi-lightbulb-night::before { + content: "\F1A4C"; +} + +.mdi-lightbulb-night-outline::before { + content: "\F1A4D"; +} + +.mdi-lightbulb-off::before { + content: "\F0E4F"; +} + +.mdi-lightbulb-off-outline::before { + content: "\F0E50"; +} + +.mdi-lightbulb-on::before { + content: "\F06E8"; +} + +.mdi-lightbulb-on-10::before { + content: "\F1A4E"; +} + +.mdi-lightbulb-on-20::before { + content: "\F1A4F"; +} + +.mdi-lightbulb-on-30::before { + content: "\F1A50"; +} + +.mdi-lightbulb-on-40::before { + content: "\F1A51"; +} + +.mdi-lightbulb-on-50::before { + content: "\F1A52"; +} + +.mdi-lightbulb-on-60::before { + content: "\F1A53"; +} + +.mdi-lightbulb-on-70::before { + content: "\F1A54"; +} + +.mdi-lightbulb-on-80::before { + content: "\F1A55"; +} + +.mdi-lightbulb-on-90::before { + content: "\F1A56"; +} + +.mdi-lightbulb-on-outline::before { + content: "\F06E9"; +} + +.mdi-lightbulb-outline::before { + content: "\F0336"; +} + +.mdi-lightbulb-question::before { + content: "\F19E3"; +} + +.mdi-lightbulb-question-outline::before { + content: "\F19E4"; +} + +.mdi-lightbulb-spot::before { + content: "\F17F4"; +} + +.mdi-lightbulb-spot-off::before { + content: "\F17F5"; +} + +.mdi-lightbulb-variant::before { + content: "\F1802"; +} + +.mdi-lightbulb-variant-outline::before { + content: "\F1803"; +} + +.mdi-lighthouse::before { + content: "\F09FF"; +} + +.mdi-lighthouse-on::before { + content: "\F0A00"; +} + +.mdi-lightning-bolt::before { + content: "\F140B"; +} + +.mdi-lightning-bolt-circle::before { + content: "\F0820"; +} + +.mdi-lightning-bolt-outline::before { + content: "\F140C"; +} + +.mdi-line-scan::before { + content: "\F0624"; +} + +.mdi-lingerie::before { + content: "\F1476"; +} + +.mdi-link::before { + content: "\F0337"; +} + +.mdi-link-box::before { + content: "\F0D1A"; +} + +.mdi-link-box-outline::before { + content: "\F0D1B"; +} + +.mdi-link-box-variant::before { + content: "\F0D1C"; +} + +.mdi-link-box-variant-outline::before { + content: "\F0D1D"; +} + +.mdi-link-circle::before { + content: "\F1CAC"; +} + +.mdi-link-circle-outline::before { + content: "\F1CAD"; +} + +.mdi-link-edit::before { + content: "\F1CAE"; +} + +.mdi-link-lock::before { + content: "\F10BA"; +} + +.mdi-link-off::before { + content: "\F0338"; +} + +.mdi-link-plus::before { + content: "\F0C94"; +} + +.mdi-link-variant::before { + content: "\F0339"; +} + +.mdi-link-variant-minus::before { + content: "\F10FF"; +} + +.mdi-link-variant-off::before { + content: "\F033A"; +} + +.mdi-link-variant-plus::before { + content: "\F1100"; +} + +.mdi-link-variant-remove::before { + content: "\F1101"; +} + +.mdi-linkedin::before { + content: "\F033B"; +} + +.mdi-linux::before { + content: "\F033D"; +} + +.mdi-linux-mint::before { + content: "\F08ED"; +} + +.mdi-lipstick::before { + content: "\F13B5"; +} + +.mdi-liquid-spot::before { + content: "\F1826"; +} + +.mdi-liquor::before { + content: "\F191E"; +} + +.mdi-list-box::before { + content: "\F1B7B"; +} + +.mdi-list-box-outline::before { + content: "\F1B7C"; +} + +.mdi-list-status::before { + content: "\F15AB"; +} + +.mdi-litecoin::before { + content: "\F0A61"; +} + +.mdi-loading::before { + content: "\F0772"; +} + +.mdi-location-enter::before { + content: "\F0FC4"; +} + +.mdi-location-exit::before { + content: "\F0FC5"; +} + +.mdi-lock::before { + content: "\F033E"; +} + +.mdi-lock-alert::before { + content: "\F08EE"; +} + +.mdi-lock-alert-outline::before { + content: "\F15D1"; +} + +.mdi-lock-check::before { + content: "\F139A"; +} + +.mdi-lock-check-outline::before { + content: "\F16A8"; +} + +.mdi-lock-clock::before { + content: "\F097F"; +} + +.mdi-lock-minus::before { + content: "\F16A9"; +} + +.mdi-lock-minus-outline::before { + content: "\F16AA"; +} + +.mdi-lock-off::before { + content: "\F1671"; +} + +.mdi-lock-off-outline::before { + content: "\F1672"; +} + +.mdi-lock-open::before { + content: "\F033F"; +} + +.mdi-lock-open-alert::before { + content: "\F139B"; +} + +.mdi-lock-open-alert-outline::before { + content: "\F15D2"; +} + +.mdi-lock-open-check::before { + content: "\F139C"; +} + +.mdi-lock-open-check-outline::before { + content: "\F16AB"; +} + +.mdi-lock-open-minus::before { + content: "\F16AC"; +} + +.mdi-lock-open-minus-outline::before { + content: "\F16AD"; +} + +.mdi-lock-open-outline::before { + content: "\F0340"; +} + +.mdi-lock-open-plus::before { + content: "\F16AE"; +} + +.mdi-lock-open-plus-outline::before { + content: "\F16AF"; +} + +.mdi-lock-open-remove::before { + content: "\F16B0"; +} + +.mdi-lock-open-remove-outline::before { + content: "\F16B1"; +} + +.mdi-lock-open-variant::before { + content: "\F0FC6"; +} + +.mdi-lock-open-variant-outline::before { + content: "\F0FC7"; +} + +.mdi-lock-outline::before { + content: "\F0341"; +} + +.mdi-lock-pattern::before { + content: "\F06EA"; +} + +.mdi-lock-percent::before { + content: "\F1C12"; +} + +.mdi-lock-percent-open::before { + content: "\F1C13"; +} + +.mdi-lock-percent-open-outline::before { + content: "\F1C14"; +} + +.mdi-lock-percent-open-variant::before { + content: "\F1C15"; +} + +.mdi-lock-percent-open-variant-outline::before { + content: "\F1C16"; +} + +.mdi-lock-percent-outline::before { + content: "\F1C17"; +} + +.mdi-lock-plus::before { + content: "\F05FB"; +} + +.mdi-lock-plus-outline::before { + content: "\F16B2"; +} + +.mdi-lock-question::before { + content: "\F08EF"; +} + +.mdi-lock-remove::before { + content: "\F16B3"; +} + +.mdi-lock-remove-outline::before { + content: "\F16B4"; +} + +.mdi-lock-reset::before { + content: "\F0773"; +} + +.mdi-lock-smart::before { + content: "\F08B2"; +} + +.mdi-locker::before { + content: "\F07D7"; +} + +.mdi-locker-multiple::before { + content: "\F07D8"; +} + +.mdi-login::before { + content: "\F0342"; +} + +.mdi-login-variant::before { + content: "\F05FC"; +} + +.mdi-logout::before { + content: "\F0343"; +} + +.mdi-logout-variant::before { + content: "\F05FD"; +} + +.mdi-longitude::before { + content: "\F0F5A"; +} + +.mdi-looks::before { + content: "\F0344"; +} + +.mdi-lotion::before { + content: "\F1582"; +} + +.mdi-lotion-outline::before { + content: "\F1583"; +} + +.mdi-lotion-plus::before { + content: "\F1584"; +} + +.mdi-lotion-plus-outline::before { + content: "\F1585"; +} + +.mdi-loupe::before { + content: "\F0345"; +} + +.mdi-lumx::before { + content: "\F0346"; +} + +.mdi-lungs::before { + content: "\F1084"; +} + +.mdi-mace::before { + content: "\F1843"; +} + +.mdi-magazine-pistol::before { + content: "\F0324"; +} + +.mdi-magazine-rifle::before { + content: "\F0323"; +} + +.mdi-magic-staff::before { + content: "\F1844"; +} + +.mdi-magnet::before { + content: "\F0347"; +} + +.mdi-magnet-on::before { + content: "\F0348"; +} + +.mdi-magnify::before { + content: "\F0349"; +} + +.mdi-magnify-close::before { + content: "\F0980"; +} + +.mdi-magnify-expand::before { + content: "\F1874"; +} + +.mdi-magnify-minus::before { + content: "\F034A"; +} + +.mdi-magnify-minus-cursor::before { + content: "\F0A62"; +} + +.mdi-magnify-minus-outline::before { + content: "\F06EC"; +} + +.mdi-magnify-plus::before { + content: "\F034B"; +} + +.mdi-magnify-plus-cursor::before { + content: "\F0A63"; +} + +.mdi-magnify-plus-outline::before { + content: "\F06ED"; +} + +.mdi-magnify-remove-cursor::before { + content: "\F120C"; +} + +.mdi-magnify-remove-outline::before { + content: "\F120D"; +} + +.mdi-magnify-scan::before { + content: "\F1276"; +} + +.mdi-mail::before { + content: "\F0EBB"; +} + +.mdi-mailbox::before { + content: "\F06EE"; +} + +.mdi-mailbox-open::before { + content: "\F0D88"; +} + +.mdi-mailbox-open-outline::before { + content: "\F0D89"; +} + +.mdi-mailbox-open-up::before { + content: "\F0D8A"; +} + +.mdi-mailbox-open-up-outline::before { + content: "\F0D8B"; +} + +.mdi-mailbox-outline::before { + content: "\F0D8C"; +} + +.mdi-mailbox-up::before { + content: "\F0D8D"; +} + +.mdi-mailbox-up-outline::before { + content: "\F0D8E"; +} + +.mdi-manjaro::before { + content: "\F160A"; +} + +.mdi-map::before { + content: "\F034D"; +} + +.mdi-map-check::before { + content: "\F0EBC"; +} + +.mdi-map-check-outline::before { + content: "\F0EBD"; +} + +.mdi-map-clock::before { + content: "\F0D1E"; +} + +.mdi-map-clock-outline::before { + content: "\F0D1F"; +} + +.mdi-map-legend::before { + content: "\F0A01"; +} + +.mdi-map-marker::before { + content: "\F034E"; +} + +.mdi-map-marker-account::before { + content: "\F18E3"; +} + +.mdi-map-marker-account-outline::before { + content: "\F18E4"; +} + +.mdi-map-marker-alert::before { + content: "\F0F05"; +} + +.mdi-map-marker-alert-outline::before { + content: "\F0F06"; +} + +.mdi-map-marker-check::before { + content: "\F0C95"; +} + +.mdi-map-marker-check-outline::before { + content: "\F12FB"; +} + +.mdi-map-marker-circle::before { + content: "\F034F"; +} + +.mdi-map-marker-distance::before { + content: "\F08F0"; +} + +.mdi-map-marker-down::before { + content: "\F1102"; +} + +.mdi-map-marker-left::before { + content: "\F12DB"; +} + +.mdi-map-marker-left-outline::before { + content: "\F12DD"; +} + +.mdi-map-marker-minus::before { + content: "\F0650"; +} + +.mdi-map-marker-minus-outline::before { + content: "\F12F9"; +} + +.mdi-map-marker-multiple::before { + content: "\F0350"; +} + +.mdi-map-marker-multiple-outline::before { + content: "\F1277"; +} + +.mdi-map-marker-off::before { + content: "\F0351"; +} + +.mdi-map-marker-off-outline::before { + content: "\F12FD"; +} + +.mdi-map-marker-outline::before { + content: "\F07D9"; +} + +.mdi-map-marker-path::before { + content: "\F0D20"; +} + +.mdi-map-marker-plus::before { + content: "\F0651"; +} + +.mdi-map-marker-plus-outline::before { + content: "\F12F8"; +} + +.mdi-map-marker-question::before { + content: "\F0F07"; +} + +.mdi-map-marker-question-outline::before { + content: "\F0F08"; +} + +.mdi-map-marker-radius::before { + content: "\F0352"; +} + +.mdi-map-marker-radius-outline::before { + content: "\F12FC"; +} + +.mdi-map-marker-remove::before { + content: "\F0F09"; +} + +.mdi-map-marker-remove-outline::before { + content: "\F12FA"; +} + +.mdi-map-marker-remove-variant::before { + content: "\F0F0A"; +} + +.mdi-map-marker-right::before { + content: "\F12DC"; +} + +.mdi-map-marker-right-outline::before { + content: "\F12DE"; +} + +.mdi-map-marker-star::before { + content: "\F1608"; +} + +.mdi-map-marker-star-outline::before { + content: "\F1609"; +} + +.mdi-map-marker-up::before { + content: "\F1103"; +} + +.mdi-map-minus::before { + content: "\F0981"; +} + +.mdi-map-outline::before { + content: "\F0982"; +} + +.mdi-map-plus::before { + content: "\F0983"; +} + +.mdi-map-search::before { + content: "\F0984"; +} + +.mdi-map-search-outline::before { + content: "\F0985"; +} + +.mdi-mapbox::before { + content: "\F0BAA"; +} + +.mdi-margin::before { + content: "\F0353"; +} + +.mdi-marker::before { + content: "\F0652"; +} + +.mdi-marker-cancel::before { + content: "\F0DD9"; +} + +.mdi-marker-check::before { + content: "\F0355"; +} + +.mdi-mastodon::before { + content: "\F0AD1"; +} + +.mdi-material-design::before { + content: "\F0986"; +} + +.mdi-material-ui::before { + content: "\F0357"; +} + +.mdi-math-compass::before { + content: "\F0358"; +} + +.mdi-math-cos::before { + content: "\F0C96"; +} + +.mdi-math-integral::before { + content: "\F0FC8"; +} + +.mdi-math-integral-box::before { + content: "\F0FC9"; +} + +.mdi-math-log::before { + content: "\F1085"; +} + +.mdi-math-norm::before { + content: "\F0FCA"; +} + +.mdi-math-norm-box::before { + content: "\F0FCB"; +} + +.mdi-math-sin::before { + content: "\F0C97"; +} + +.mdi-math-tan::before { + content: "\F0C98"; +} + +.mdi-matrix::before { + content: "\F0628"; +} + +.mdi-medal::before { + content: "\F0987"; +} + +.mdi-medal-outline::before { + content: "\F1326"; +} + +.mdi-medical-bag::before { + content: "\F06EF"; +} + +.mdi-medical-cotton-swab::before { + content: "\F1AB8"; +} + +.mdi-medication::before { + content: "\F1B14"; +} + +.mdi-medication-outline::before { + content: "\F1B15"; +} + +.mdi-meditation::before { + content: "\F117B"; +} + +.mdi-memory::before { + content: "\F035B"; +} + +.mdi-memory-arrow-down::before { + content: "\F1CA6"; +} + +.mdi-menorah::before { + content: "\F17D4"; +} + +.mdi-menorah-fire::before { + content: "\F17D5"; +} + +.mdi-menu::before { + content: "\F035C"; +} + +.mdi-menu-close::before { + content: "\F1C90"; +} + +.mdi-menu-down::before { + content: "\F035D"; +} + +.mdi-menu-down-outline::before { + content: "\F06B6"; +} + +.mdi-menu-left::before { + content: "\F035E"; +} + +.mdi-menu-left-outline::before { + content: "\F0A02"; +} + +.mdi-menu-open::before { + content: "\F0BAB"; +} + +.mdi-menu-right::before { + content: "\F035F"; +} + +.mdi-menu-right-outline::before { + content: "\F0A03"; +} + +.mdi-menu-swap::before { + content: "\F0A64"; +} + +.mdi-menu-swap-outline::before { + content: "\F0A65"; +} + +.mdi-menu-up::before { + content: "\F0360"; +} + +.mdi-menu-up-outline::before { + content: "\F06B7"; +} + +.mdi-merge::before { + content: "\F0F5C"; +} + +.mdi-message::before { + content: "\F0361"; +} + +.mdi-message-alert::before { + content: "\F0362"; +} + +.mdi-message-alert-outline::before { + content: "\F0A04"; +} + +.mdi-message-arrow-left::before { + content: "\F12F2"; +} + +.mdi-message-arrow-left-outline::before { + content: "\F12F3"; +} + +.mdi-message-arrow-right::before { + content: "\F12F4"; +} + +.mdi-message-arrow-right-outline::before { + content: "\F12F5"; +} + +.mdi-message-badge::before { + content: "\F1941"; +} + +.mdi-message-badge-outline::before { + content: "\F1942"; +} + +.mdi-message-bookmark::before { + content: "\F15AC"; +} + +.mdi-message-bookmark-outline::before { + content: "\F15AD"; +} + +.mdi-message-bulleted::before { + content: "\F06A2"; +} + +.mdi-message-bulleted-off::before { + content: "\F06A3"; +} + +.mdi-message-check::before { + content: "\F1B8A"; +} + +.mdi-message-check-outline::before { + content: "\F1B8B"; +} + +.mdi-message-cog::before { + content: "\F06F1"; +} + +.mdi-message-cog-outline::before { + content: "\F1172"; +} + +.mdi-message-draw::before { + content: "\F0363"; +} + +.mdi-message-fast::before { + content: "\F19CC"; +} + +.mdi-message-fast-outline::before { + content: "\F19CD"; +} + +.mdi-message-flash::before { + content: "\F15A9"; +} + +.mdi-message-flash-outline::before { + content: "\F15AA"; +} + +.mdi-message-image::before { + content: "\F0364"; +} + +.mdi-message-image-outline::before { + content: "\F116C"; +} + +.mdi-message-lock::before { + content: "\F0FCC"; +} + +.mdi-message-lock-outline::before { + content: "\F116D"; +} + +.mdi-message-minus::before { + content: "\F116E"; +} + +.mdi-message-minus-outline::before { + content: "\F116F"; +} + +.mdi-message-off::before { + content: "\F164D"; +} + +.mdi-message-off-outline::before { + content: "\F164E"; +} + +.mdi-message-outline::before { + content: "\F0365"; +} + +.mdi-message-plus::before { + content: "\F0653"; +} + +.mdi-message-plus-outline::before { + content: "\F10BB"; +} + +.mdi-message-processing::before { + content: "\F0366"; +} + +.mdi-message-processing-outline::before { + content: "\F1170"; +} + +.mdi-message-question::before { + content: "\F173A"; +} + +.mdi-message-question-outline::before { + content: "\F173B"; +} + +.mdi-message-reply::before { + content: "\F0367"; +} + +.mdi-message-reply-outline::before { + content: "\F173D"; +} + +.mdi-message-reply-text::before { + content: "\F0368"; +} + +.mdi-message-reply-text-outline::before { + content: "\F173E"; +} + +.mdi-message-settings::before { + content: "\F06F0"; +} + +.mdi-message-settings-outline::before { + content: "\F1171"; +} + +.mdi-message-star::before { + content: "\F069A"; +} + +.mdi-message-star-outline::before { + content: "\F1250"; +} + +.mdi-message-text::before { + content: "\F0369"; +} + +.mdi-message-text-clock::before { + content: "\F1173"; +} + +.mdi-message-text-clock-outline::before { + content: "\F1174"; +} + +.mdi-message-text-fast::before { + content: "\F19CE"; +} + +.mdi-message-text-fast-outline::before { + content: "\F19CF"; +} + +.mdi-message-text-lock::before { + content: "\F0FCD"; +} + +.mdi-message-text-lock-outline::before { + content: "\F1175"; +} + +.mdi-message-text-outline::before { + content: "\F036A"; +} + +.mdi-message-video::before { + content: "\F036B"; +} + +.mdi-meteor::before { + content: "\F0629"; +} + +.mdi-meter-electric::before { + content: "\F1A57"; +} + +.mdi-meter-electric-outline::before { + content: "\F1A58"; +} + +.mdi-meter-gas::before { + content: "\F1A59"; +} + +.mdi-meter-gas-outline::before { + content: "\F1A5A"; +} + +.mdi-metronome::before { + content: "\F07DA"; +} + +.mdi-metronome-tick::before { + content: "\F07DB"; +} + +.mdi-micro-sd::before { + content: "\F07DC"; +} + +.mdi-microphone::before { + content: "\F036C"; +} + +.mdi-microphone-message::before { + content: "\F050A"; +} + +.mdi-microphone-message-off::before { + content: "\F050B"; +} + +.mdi-microphone-minus::before { + content: "\F08B3"; +} + +.mdi-microphone-off::before { + content: "\F036D"; +} + +.mdi-microphone-outline::before { + content: "\F036E"; +} + +.mdi-microphone-plus::before { + content: "\F08B4"; +} + +.mdi-microphone-question::before { + content: "\F1989"; +} + +.mdi-microphone-question-outline::before { + content: "\F198A"; +} + +.mdi-microphone-settings::before { + content: "\F036F"; +} + +.mdi-microphone-variant::before { + content: "\F0370"; +} + +.mdi-microphone-variant-off::before { + content: "\F0371"; +} + +.mdi-microscope::before { + content: "\F0654"; +} + +.mdi-microsoft::before { + content: "\F0372"; +} + +.mdi-microsoft-access::before { + content: "\F138E"; +} + +.mdi-microsoft-azure::before { + content: "\F0805"; +} + +.mdi-microsoft-azure-devops::before { + content: "\F0FD5"; +} + +.mdi-microsoft-bing::before { + content: "\F00A4"; +} + +.mdi-microsoft-dynamics-365::before { + content: "\F0988"; +} + +.mdi-microsoft-edge::before { + content: "\F01E9"; +} + +.mdi-microsoft-excel::before { + content: "\F138F"; +} + +.mdi-microsoft-internet-explorer::before { + content: "\F0300"; +} + +.mdi-microsoft-office::before { + content: "\F03C6"; +} + +.mdi-microsoft-onedrive::before { + content: "\F03CA"; +} + +.mdi-microsoft-onenote::before { + content: "\F0747"; +} + +.mdi-microsoft-outlook::before { + content: "\F0D22"; +} + +.mdi-microsoft-powerpoint::before { + content: "\F1390"; +} + +.mdi-microsoft-sharepoint::before { + content: "\F1391"; +} + +.mdi-microsoft-teams::before { + content: "\F02BB"; +} + +.mdi-microsoft-visual-studio::before { + content: "\F0610"; +} + +.mdi-microsoft-visual-studio-code::before { + content: "\F0A1E"; +} + +.mdi-microsoft-windows::before { + content: "\F05B3"; +} + +.mdi-microsoft-windows-classic::before { + content: "\F0A21"; +} + +.mdi-microsoft-word::before { + content: "\F1392"; +} + +.mdi-microsoft-xbox::before { + content: "\F05B9"; +} + +.mdi-microsoft-xbox-controller::before { + content: "\F05BA"; +} + +.mdi-microsoft-xbox-controller-battery-alert::before { + content: "\F074B"; +} + +.mdi-microsoft-xbox-controller-battery-charging::before { + content: "\F0A22"; +} + +.mdi-microsoft-xbox-controller-battery-empty::before { + content: "\F074C"; +} + +.mdi-microsoft-xbox-controller-battery-full::before { + content: "\F074D"; +} + +.mdi-microsoft-xbox-controller-battery-low::before { + content: "\F074E"; +} + +.mdi-microsoft-xbox-controller-battery-medium::before { + content: "\F074F"; +} + +.mdi-microsoft-xbox-controller-battery-unknown::before { + content: "\F0750"; +} + +.mdi-microsoft-xbox-controller-menu::before { + content: "\F0E6F"; +} + +.mdi-microsoft-xbox-controller-off::before { + content: "\F05BB"; +} + +.mdi-microsoft-xbox-controller-view::before { + content: "\F0E70"; +} + +.mdi-microwave::before { + content: "\F0C99"; +} + +.mdi-microwave-off::before { + content: "\F1423"; +} + +.mdi-middleware::before { + content: "\F0F5D"; +} + +.mdi-middleware-outline::before { + content: "\F0F5E"; +} + +.mdi-midi::before { + content: "\F08F1"; +} + +.mdi-midi-port::before { + content: "\F08F2"; +} + +.mdi-mine::before { + content: "\F0DDA"; +} + +.mdi-minecraft::before { + content: "\F0373"; +} + +.mdi-mini-sd::before { + content: "\F0A05"; +} + +.mdi-minidisc::before { + content: "\F0A06"; +} + +.mdi-minus::before { + content: "\F0374"; +} + +.mdi-minus-box::before { + content: "\F0375"; +} + +.mdi-minus-box-multiple::before { + content: "\F1141"; +} + +.mdi-minus-box-multiple-outline::before { + content: "\F1142"; +} + +.mdi-minus-box-outline::before { + content: "\F06F2"; +} + +.mdi-minus-circle::before { + content: "\F0376"; +} + +.mdi-minus-circle-multiple::before { + content: "\F035A"; +} + +.mdi-minus-circle-multiple-outline::before { + content: "\F0AD3"; +} + +.mdi-minus-circle-off::before { + content: "\F1459"; +} + +.mdi-minus-circle-off-outline::before { + content: "\F145A"; +} + +.mdi-minus-circle-outline::before { + content: "\F0377"; +} + +.mdi-minus-network::before { + content: "\F0378"; +} + +.mdi-minus-network-outline::before { + content: "\F0C9A"; +} + +.mdi-minus-thick::before { + content: "\F1639"; +} + +.mdi-mirror::before { + content: "\F11FD"; +} + +.mdi-mirror-rectangle::before { + content: "\F179F"; +} + +.mdi-mirror-variant::before { + content: "\F17A0"; +} + +.mdi-mixed-martial-arts::before { + content: "\F0D8F"; +} + +.mdi-mixed-reality::before { + content: "\F087F"; +} + +.mdi-molecule::before { + content: "\F0BAC"; +} + +.mdi-molecule-co::before { + content: "\F12FE"; +} + +.mdi-molecule-co2::before { + content: "\F07E4"; +} + +.mdi-monitor::before { + content: "\F0379"; +} + +.mdi-monitor-account::before { + content: "\F1A5B"; +} + +.mdi-monitor-arrow-down::before { + content: "\F19D0"; +} + +.mdi-monitor-arrow-down-variant::before { + content: "\F19D1"; +} + +.mdi-monitor-cellphone::before { + content: "\F0989"; +} + +.mdi-monitor-cellphone-star::before { + content: "\F098A"; +} + +.mdi-monitor-dashboard::before { + content: "\F0A07"; +} + +.mdi-monitor-edit::before { + content: "\F12C6"; +} + +.mdi-monitor-eye::before { + content: "\F13B4"; +} + +.mdi-monitor-lock::before { + content: "\F0DDB"; +} + +.mdi-monitor-multiple::before { + content: "\F037A"; +} + +.mdi-monitor-off::before { + content: "\F0D90"; +} + +.mdi-monitor-screenshot::before { + content: "\F0E51"; +} + +.mdi-monitor-share::before { + content: "\F1483"; +} + +.mdi-monitor-shimmer::before { + content: "\F1104"; +} + +.mdi-monitor-small::before { + content: "\F1876"; +} + +.mdi-monitor-speaker::before { + content: "\F0F5F"; +} + +.mdi-monitor-speaker-off::before { + content: "\F0F60"; +} + +.mdi-monitor-star::before { + content: "\F0DDC"; +} + +.mdi-monitor-vertical::before { + content: "\F1C33"; +} + +.mdi-moon-first-quarter::before { + content: "\F0F61"; +} + +.mdi-moon-full::before { + content: "\F0F62"; +} + +.mdi-moon-last-quarter::before { + content: "\F0F63"; +} + +.mdi-moon-new::before { + content: "\F0F64"; +} + +.mdi-moon-waning-crescent::before { + content: "\F0F65"; +} + +.mdi-moon-waning-gibbous::before { + content: "\F0F66"; +} + +.mdi-moon-waxing-crescent::before { + content: "\F0F67"; +} + +.mdi-moon-waxing-gibbous::before { + content: "\F0F68"; +} + +.mdi-moped::before { + content: "\F1086"; +} + +.mdi-moped-electric::before { + content: "\F15B7"; +} + +.mdi-moped-electric-outline::before { + content: "\F15B8"; +} + +.mdi-moped-outline::before { + content: "\F15B9"; +} + +.mdi-more::before { + content: "\F037B"; +} + +.mdi-mortar-pestle::before { + content: "\F1748"; +} + +.mdi-mortar-pestle-plus::before { + content: "\F03F1"; +} + +.mdi-mosque::before { + content: "\F0D45"; +} + +.mdi-mosque-outline::before { + content: "\F1827"; +} + +.mdi-mother-heart::before { + content: "\F1314"; +} + +.mdi-mother-nurse::before { + content: "\F0D21"; +} + +.mdi-motion::before { + content: "\F15B2"; +} + +.mdi-motion-outline::before { + content: "\F15B3"; +} + +.mdi-motion-pause::before { + content: "\F1590"; +} + +.mdi-motion-pause-outline::before { + content: "\F1592"; +} + +.mdi-motion-play::before { + content: "\F158F"; +} + +.mdi-motion-play-outline::before { + content: "\F1591"; +} + +.mdi-motion-sensor::before { + content: "\F0D91"; +} + +.mdi-motion-sensor-off::before { + content: "\F1435"; +} + +.mdi-motorbike::before { + content: "\F037C"; +} + +.mdi-motorbike-electric::before { + content: "\F15BA"; +} + +.mdi-motorbike-off::before { + content: "\F1B16"; +} + +.mdi-mouse::before { + content: "\F037D"; +} + +.mdi-mouse-bluetooth::before { + content: "\F098B"; +} + +.mdi-mouse-left-click::before { + content: "\F1D07"; +} + +.mdi-mouse-left-click-outline::before { + content: "\F1D08"; +} + +.mdi-mouse-move-down::before { + content: "\F1550"; +} + +.mdi-mouse-move-up::before { + content: "\F1551"; +} + +.mdi-mouse-move-vertical::before { + content: "\F1552"; +} + +.mdi-mouse-off::before { + content: "\F037E"; +} + +.mdi-mouse-outline::before { + content: "\F1D09"; +} + +.mdi-mouse-right-click::before { + content: "\F1D0A"; +} + +.mdi-mouse-right-click-outline::before { + content: "\F1D0B"; +} + +.mdi-mouse-scroll-wheel::before { + content: "\F1D0C"; +} + +.mdi-mouse-variant::before { + content: "\F037F"; +} + +.mdi-mouse-variant-off::before { + content: "\F0380"; +} + +.mdi-move-resize::before { + content: "\F0655"; +} + +.mdi-move-resize-variant::before { + content: "\F0656"; +} + +.mdi-movie::before { + content: "\F0381"; +} + +.mdi-movie-check::before { + content: "\F16F3"; +} + +.mdi-movie-check-outline::before { + content: "\F16F4"; +} + +.mdi-movie-cog::before { + content: "\F16F5"; +} + +.mdi-movie-cog-outline::before { + content: "\F16F6"; +} + +.mdi-movie-edit::before { + content: "\F1122"; +} + +.mdi-movie-edit-outline::before { + content: "\F1123"; +} + +.mdi-movie-filter::before { + content: "\F1124"; +} + +.mdi-movie-filter-outline::before { + content: "\F1125"; +} + +.mdi-movie-minus::before { + content: "\F16F7"; +} + +.mdi-movie-minus-outline::before { + content: "\F16F8"; +} + +.mdi-movie-off::before { + content: "\F16F9"; +} + +.mdi-movie-off-outline::before { + content: "\F16FA"; +} + +.mdi-movie-open::before { + content: "\F0FCE"; +} + +.mdi-movie-open-check::before { + content: "\F16FB"; +} + +.mdi-movie-open-check-outline::before { + content: "\F16FC"; +} + +.mdi-movie-open-cog::before { + content: "\F16FD"; +} + +.mdi-movie-open-cog-outline::before { + content: "\F16FE"; +} + +.mdi-movie-open-edit::before { + content: "\F16FF"; +} + +.mdi-movie-open-edit-outline::before { + content: "\F1700"; +} + +.mdi-movie-open-minus::before { + content: "\F1701"; +} + +.mdi-movie-open-minus-outline::before { + content: "\F1702"; +} + +.mdi-movie-open-off::before { + content: "\F1703"; +} + +.mdi-movie-open-off-outline::before { + content: "\F1704"; +} + +.mdi-movie-open-outline::before { + content: "\F0FCF"; +} + +.mdi-movie-open-play::before { + content: "\F1705"; +} + +.mdi-movie-open-play-outline::before { + content: "\F1706"; +} + +.mdi-movie-open-plus::before { + content: "\F1707"; +} + +.mdi-movie-open-plus-outline::before { + content: "\F1708"; +} + +.mdi-movie-open-remove::before { + content: "\F1709"; +} + +.mdi-movie-open-remove-outline::before { + content: "\F170A"; +} + +.mdi-movie-open-settings::before { + content: "\F170B"; +} + +.mdi-movie-open-settings-outline::before { + content: "\F170C"; +} + +.mdi-movie-open-star::before { + content: "\F170D"; +} + +.mdi-movie-open-star-outline::before { + content: "\F170E"; +} + +.mdi-movie-outline::before { + content: "\F0DDD"; +} + +.mdi-movie-play::before { + content: "\F170F"; +} + +.mdi-movie-play-outline::before { + content: "\F1710"; +} + +.mdi-movie-plus::before { + content: "\F1711"; +} + +.mdi-movie-plus-outline::before { + content: "\F1712"; +} + +.mdi-movie-remove::before { + content: "\F1713"; +} + +.mdi-movie-remove-outline::before { + content: "\F1714"; +} + +.mdi-movie-roll::before { + content: "\F07DE"; +} + +.mdi-movie-search::before { + content: "\F11D2"; +} + +.mdi-movie-search-outline::before { + content: "\F11D3"; +} + +.mdi-movie-settings::before { + content: "\F1715"; +} + +.mdi-movie-settings-outline::before { + content: "\F1716"; +} + +.mdi-movie-star::before { + content: "\F1717"; +} + +.mdi-movie-star-outline::before { + content: "\F1718"; +} + +.mdi-mower::before { + content: "\F166F"; +} + +.mdi-mower-bag::before { + content: "\F1670"; +} + +.mdi-mower-bag-on::before { + content: "\F1B60"; +} + +.mdi-mower-on::before { + content: "\F1B5F"; +} + +.mdi-muffin::before { + content: "\F098C"; +} + +.mdi-multicast::before { + content: "\F1893"; +} + +.mdi-multimedia::before { + content: "\F1B97"; +} + +.mdi-multiplication::before { + content: "\F0382"; +} + +.mdi-multiplication-box::before { + content: "\F0383"; +} + +.mdi-mushroom::before { + content: "\F07DF"; +} + +.mdi-mushroom-off::before { + content: "\F13FA"; +} + +.mdi-mushroom-off-outline::before { + content: "\F13FB"; +} + +.mdi-mushroom-outline::before { + content: "\F07E0"; +} + +.mdi-music::before { + content: "\F075A"; +} + +.mdi-music-accidental-double-flat::before { + content: "\F0F69"; +} + +.mdi-music-accidental-double-sharp::before { + content: "\F0F6A"; +} + +.mdi-music-accidental-flat::before { + content: "\F0F6B"; +} + +.mdi-music-accidental-natural::before { + content: "\F0F6C"; +} + +.mdi-music-accidental-sharp::before { + content: "\F0F6D"; +} + +.mdi-music-box::before { + content: "\F0384"; +} + +.mdi-music-box-multiple::before { + content: "\F0333"; +} + +.mdi-music-box-multiple-outline::before { + content: "\F0F04"; +} + +.mdi-music-box-outline::before { + content: "\F0385"; +} + +.mdi-music-circle::before { + content: "\F0386"; +} + +.mdi-music-circle-outline::before { + content: "\F0AD4"; +} + +.mdi-music-clef-alto::before { + content: "\F0F6E"; +} + +.mdi-music-clef-bass::before { + content: "\F0F6F"; +} + +.mdi-music-clef-treble::before { + content: "\F0F70"; +} + +.mdi-music-note::before { + content: "\F0387"; +} + +.mdi-music-note-bluetooth::before { + content: "\F05FE"; +} + +.mdi-music-note-bluetooth-off::before { + content: "\F05FF"; +} + +.mdi-music-note-eighth::before { + content: "\F0388"; +} + +.mdi-music-note-eighth-dotted::before { + content: "\F0F71"; +} + +.mdi-music-note-half::before { + content: "\F0389"; +} + +.mdi-music-note-half-dotted::before { + content: "\F0F72"; +} + +.mdi-music-note-minus::before { + content: "\F1B89"; +} + +.mdi-music-note-off::before { + content: "\F038A"; +} + +.mdi-music-note-off-outline::before { + content: "\F0F73"; +} + +.mdi-music-note-outline::before { + content: "\F0F74"; +} + +.mdi-music-note-plus::before { + content: "\F0DDE"; +} + +.mdi-music-note-quarter::before { + content: "\F038B"; +} + +.mdi-music-note-quarter-dotted::before { + content: "\F0F75"; +} + +.mdi-music-note-sixteenth::before { + content: "\F038C"; +} + +.mdi-music-note-sixteenth-dotted::before { + content: "\F0F76"; +} + +.mdi-music-note-whole::before { + content: "\F038D"; +} + +.mdi-music-note-whole-dotted::before { + content: "\F0F77"; +} + +.mdi-music-off::before { + content: "\F075B"; +} + +.mdi-music-rest-eighth::before { + content: "\F0F78"; +} + +.mdi-music-rest-half::before { + content: "\F0F79"; +} + +.mdi-music-rest-quarter::before { + content: "\F0F7A"; +} + +.mdi-music-rest-sixteenth::before { + content: "\F0F7B"; +} + +.mdi-music-rest-whole::before { + content: "\F0F7C"; +} + +.mdi-mustache::before { + content: "\F15DE"; +} + +.mdi-nail::before { + content: "\F0DDF"; +} + +.mdi-nas::before { + content: "\F08F3"; +} + +.mdi-nativescript::before { + content: "\F0880"; +} + +.mdi-nature::before { + content: "\F038E"; +} + +.mdi-nature-outline::before { + content: "\F1C71"; +} + +.mdi-nature-people::before { + content: "\F038F"; +} + +.mdi-nature-people-outline::before { + content: "\F1C72"; +} + +.mdi-navigation::before { + content: "\F0390"; +} + +.mdi-navigation-outline::before { + content: "\F1607"; +} + +.mdi-navigation-variant::before { + content: "\F18F0"; +} + +.mdi-navigation-variant-outline::before { + content: "\F18F1"; +} + +.mdi-near-me::before { + content: "\F05CD"; +} + +.mdi-necklace::before { + content: "\F0F0B"; +} + +.mdi-needle::before { + content: "\F0391"; +} + +.mdi-needle-off::before { + content: "\F19D2"; +} + +.mdi-netflix::before { + content: "\F0746"; +} + +.mdi-network::before { + content: "\F06F3"; +} + +.mdi-network-off::before { + content: "\F0C9B"; +} + +.mdi-network-off-outline::before { + content: "\F0C9C"; +} + +.mdi-network-outline::before { + content: "\F0C9D"; +} + +.mdi-network-pos::before { + content: "\F1ACB"; +} + +.mdi-network-strength-1::before { + content: "\F08F4"; +} + +.mdi-network-strength-1-alert::before { + content: "\F08F5"; +} + +.mdi-network-strength-2::before { + content: "\F08F6"; +} + +.mdi-network-strength-2-alert::before { + content: "\F08F7"; +} + +.mdi-network-strength-3::before { + content: "\F08F8"; +} + +.mdi-network-strength-3-alert::before { + content: "\F08F9"; +} + +.mdi-network-strength-4::before { + content: "\F08FA"; +} + +.mdi-network-strength-4-alert::before { + content: "\F08FB"; +} + +.mdi-network-strength-4-cog::before { + content: "\F191A"; +} + +.mdi-network-strength-off::before { + content: "\F08FC"; +} + +.mdi-network-strength-off-outline::before { + content: "\F08FD"; +} + +.mdi-network-strength-outline::before { + content: "\F08FE"; +} + +.mdi-new-box::before { + content: "\F0394"; +} + +.mdi-newspaper::before { + content: "\F0395"; +} + +.mdi-newspaper-check::before { + content: "\F1943"; +} + +.mdi-newspaper-minus::before { + content: "\F0F0C"; +} + +.mdi-newspaper-plus::before { + content: "\F0F0D"; +} + +.mdi-newspaper-remove::before { + content: "\F1944"; +} + +.mdi-newspaper-variant::before { + content: "\F1001"; +} + +.mdi-newspaper-variant-multiple::before { + content: "\F1002"; +} + +.mdi-newspaper-variant-multiple-outline::before { + content: "\F1003"; +} + +.mdi-newspaper-variant-outline::before { + content: "\F1004"; +} + +.mdi-nfc::before { + content: "\F0396"; +} + +.mdi-nfc-search-variant::before { + content: "\F0E53"; +} + +.mdi-nfc-tap::before { + content: "\F0397"; +} + +.mdi-nfc-variant::before { + content: "\F0398"; +} + +.mdi-nfc-variant-off::before { + content: "\F0E54"; +} + +.mdi-ninja::before { + content: "\F0774"; +} + +.mdi-nintendo-game-boy::before { + content: "\F1393"; +} + +.mdi-nintendo-switch::before { + content: "\F07E1"; +} + +.mdi-nintendo-wii::before { + content: "\F05AB"; +} + +.mdi-nintendo-wiiu::before { + content: "\F072D"; +} + +.mdi-nix::before { + content: "\F1105"; +} + +.mdi-nodejs::before { + content: "\F0399"; +} + +.mdi-noodles::before { + content: "\F117E"; +} + +.mdi-not-equal::before { + content: "\F098D"; +} + +.mdi-not-equal-variant::before { + content: "\F098E"; +} + +.mdi-note::before { + content: "\F039A"; +} + +.mdi-note-alert::before { + content: "\F177D"; +} + +.mdi-note-alert-outline::before { + content: "\F177E"; +} + +.mdi-note-check::before { + content: "\F177F"; +} + +.mdi-note-check-outline::before { + content: "\F1780"; +} + +.mdi-note-edit::before { + content: "\F1781"; +} + +.mdi-note-edit-outline::before { + content: "\F1782"; +} + +.mdi-note-minus::before { + content: "\F164F"; +} + +.mdi-note-minus-outline::before { + content: "\F1650"; +} + +.mdi-note-multiple::before { + content: "\F06B8"; +} + +.mdi-note-multiple-outline::before { + content: "\F06B9"; +} + +.mdi-note-off::before { + content: "\F1783"; +} + +.mdi-note-off-outline::before { + content: "\F1784"; +} + +.mdi-note-outline::before { + content: "\F039B"; +} + +.mdi-note-plus::before { + content: "\F039C"; +} + +.mdi-note-plus-outline::before { + content: "\F039D"; +} + +.mdi-note-remove::before { + content: "\F1651"; +} + +.mdi-note-remove-outline::before { + content: "\F1652"; +} + +.mdi-note-search::before { + content: "\F1653"; +} + +.mdi-note-search-outline::before { + content: "\F1654"; +} + +.mdi-note-text::before { + content: "\F039E"; +} + +.mdi-note-text-outline::before { + content: "\F11D7"; +} + +.mdi-notebook::before { + content: "\F082E"; +} + +.mdi-notebook-check::before { + content: "\F14F5"; +} + +.mdi-notebook-check-outline::before { + content: "\F14F6"; +} + +.mdi-notebook-edit::before { + content: "\F14E7"; +} + +.mdi-notebook-edit-outline::before { + content: "\F14E9"; +} + +.mdi-notebook-heart::before { + content: "\F1A0B"; +} + +.mdi-notebook-heart-outline::before { + content: "\F1A0C"; +} + +.mdi-notebook-minus::before { + content: "\F1610"; +} + +.mdi-notebook-minus-outline::before { + content: "\F1611"; +} + +.mdi-notebook-multiple::before { + content: "\F0E55"; +} + +.mdi-notebook-outline::before { + content: "\F0EBF"; +} + +.mdi-notebook-plus::before { + content: "\F1612"; +} + +.mdi-notebook-plus-outline::before { + content: "\F1613"; +} + +.mdi-notebook-remove::before { + content: "\F1614"; +} + +.mdi-notebook-remove-outline::before { + content: "\F1615"; +} + +.mdi-notification-clear-all::before { + content: "\F039F"; +} + +.mdi-npm::before { + content: "\F06F7"; +} + +.mdi-nuke::before { + content: "\F06A4"; +} + +.mdi-null::before { + content: "\F07E2"; +} + +.mdi-numeric::before { + content: "\F03A0"; +} + +.mdi-numeric-0::before { + content: "\F0B39"; +} + +.mdi-numeric-0-box::before { + content: "\F03A1"; +} + +.mdi-numeric-0-box-multiple::before { + content: "\F0F0E"; +} + +.mdi-numeric-0-box-multiple-outline::before { + content: "\F03A2"; +} + +.mdi-numeric-0-box-outline::before { + content: "\F03A3"; +} + +.mdi-numeric-0-circle::before { + content: "\F0C9E"; +} + +.mdi-numeric-0-circle-outline::before { + content: "\F0C9F"; +} + +.mdi-numeric-1::before { + content: "\F0B3A"; +} + +.mdi-numeric-1-box::before { + content: "\F03A4"; +} + +.mdi-numeric-1-box-multiple::before { + content: "\F0F0F"; +} + +.mdi-numeric-1-box-multiple-outline::before { + content: "\F03A5"; +} + +.mdi-numeric-1-box-outline::before { + content: "\F03A6"; +} + +.mdi-numeric-1-circle::before { + content: "\F0CA0"; +} + +.mdi-numeric-1-circle-outline::before { + content: "\F0CA1"; +} + +.mdi-numeric-10::before { + content: "\F0FE9"; +} + +.mdi-numeric-10-box::before { + content: "\F0F7D"; +} + +.mdi-numeric-10-box-multiple::before { + content: "\F0FEA"; +} + +.mdi-numeric-10-box-multiple-outline::before { + content: "\F0FEB"; +} + +.mdi-numeric-10-box-outline::before { + content: "\F0F7E"; +} + +.mdi-numeric-10-circle::before { + content: "\F0FEC"; +} + +.mdi-numeric-10-circle-outline::before { + content: "\F0FED"; +} + +.mdi-numeric-2::before { + content: "\F0B3B"; +} + +.mdi-numeric-2-box::before { + content: "\F03A7"; +} + +.mdi-numeric-2-box-multiple::before { + content: "\F0F10"; +} + +.mdi-numeric-2-box-multiple-outline::before { + content: "\F03A8"; +} + +.mdi-numeric-2-box-outline::before { + content: "\F03A9"; +} + +.mdi-numeric-2-circle::before { + content: "\F0CA2"; +} + +.mdi-numeric-2-circle-outline::before { + content: "\F0CA3"; +} + +.mdi-numeric-3::before { + content: "\F0B3C"; +} + +.mdi-numeric-3-box::before { + content: "\F03AA"; +} + +.mdi-numeric-3-box-multiple::before { + content: "\F0F11"; +} + +.mdi-numeric-3-box-multiple-outline::before { + content: "\F03AB"; +} + +.mdi-numeric-3-box-outline::before { + content: "\F03AC"; +} + +.mdi-numeric-3-circle::before { + content: "\F0CA4"; +} + +.mdi-numeric-3-circle-outline::before { + content: "\F0CA5"; +} + +.mdi-numeric-4::before { + content: "\F0B3D"; +} + +.mdi-numeric-4-box::before { + content: "\F03AD"; +} + +.mdi-numeric-4-box-multiple::before { + content: "\F0F12"; +} + +.mdi-numeric-4-box-multiple-outline::before { + content: "\F03B2"; +} + +.mdi-numeric-4-box-outline::before { + content: "\F03AE"; +} + +.mdi-numeric-4-circle::before { + content: "\F0CA6"; +} + +.mdi-numeric-4-circle-outline::before { + content: "\F0CA7"; +} + +.mdi-numeric-5::before { + content: "\F0B3E"; +} + +.mdi-numeric-5-box::before { + content: "\F03B1"; +} + +.mdi-numeric-5-box-multiple::before { + content: "\F0F13"; +} + +.mdi-numeric-5-box-multiple-outline::before { + content: "\F03AF"; +} + +.mdi-numeric-5-box-outline::before { + content: "\F03B0"; +} + +.mdi-numeric-5-circle::before { + content: "\F0CA8"; +} + +.mdi-numeric-5-circle-outline::before { + content: "\F0CA9"; +} + +.mdi-numeric-6::before { + content: "\F0B3F"; +} + +.mdi-numeric-6-box::before { + content: "\F03B3"; +} + +.mdi-numeric-6-box-multiple::before { + content: "\F0F14"; +} + +.mdi-numeric-6-box-multiple-outline::before { + content: "\F03B4"; +} + +.mdi-numeric-6-box-outline::before { + content: "\F03B5"; +} + +.mdi-numeric-6-circle::before { + content: "\F0CAA"; +} + +.mdi-numeric-6-circle-outline::before { + content: "\F0CAB"; +} + +.mdi-numeric-7::before { + content: "\F0B40"; +} + +.mdi-numeric-7-box::before { + content: "\F03B6"; +} + +.mdi-numeric-7-box-multiple::before { + content: "\F0F15"; +} + +.mdi-numeric-7-box-multiple-outline::before { + content: "\F03B7"; +} + +.mdi-numeric-7-box-outline::before { + content: "\F03B8"; +} + +.mdi-numeric-7-circle::before { + content: "\F0CAC"; +} + +.mdi-numeric-7-circle-outline::before { + content: "\F0CAD"; +} + +.mdi-numeric-8::before { + content: "\F0B41"; +} + +.mdi-numeric-8-box::before { + content: "\F03B9"; +} + +.mdi-numeric-8-box-multiple::before { + content: "\F0F16"; +} + +.mdi-numeric-8-box-multiple-outline::before { + content: "\F03BA"; +} + +.mdi-numeric-8-box-outline::before { + content: "\F03BB"; +} + +.mdi-numeric-8-circle::before { + content: "\F0CAE"; +} + +.mdi-numeric-8-circle-outline::before { + content: "\F0CAF"; +} + +.mdi-numeric-9::before { + content: "\F0B42"; +} + +.mdi-numeric-9-box::before { + content: "\F03BC"; +} + +.mdi-numeric-9-box-multiple::before { + content: "\F0F17"; +} + +.mdi-numeric-9-box-multiple-outline::before { + content: "\F03BD"; +} + +.mdi-numeric-9-box-outline::before { + content: "\F03BE"; +} + +.mdi-numeric-9-circle::before { + content: "\F0CB0"; +} + +.mdi-numeric-9-circle-outline::before { + content: "\F0CB1"; +} + +.mdi-numeric-9-plus::before { + content: "\F0FEE"; +} + +.mdi-numeric-9-plus-box::before { + content: "\F03BF"; +} + +.mdi-numeric-9-plus-box-multiple::before { + content: "\F0F18"; +} + +.mdi-numeric-9-plus-box-multiple-outline::before { + content: "\F03C0"; +} + +.mdi-numeric-9-plus-box-outline::before { + content: "\F03C1"; +} + +.mdi-numeric-9-plus-circle::before { + content: "\F0CB2"; +} + +.mdi-numeric-9-plus-circle-outline::before { + content: "\F0CB3"; +} + +.mdi-numeric-negative-1::before { + content: "\F1052"; +} + +.mdi-numeric-off::before { + content: "\F19D3"; +} + +.mdi-numeric-positive-1::before { + content: "\F15CB"; +} + +.mdi-nut::before { + content: "\F06F8"; +} + +.mdi-nutrition::before { + content: "\F03C2"; +} + +.mdi-nuxt::before { + content: "\F1106"; +} + +.mdi-oar::before { + content: "\F067C"; +} + +.mdi-ocarina::before { + content: "\F0DE0"; +} + +.mdi-oci::before { + content: "\F12E9"; +} + +.mdi-ocr::before { + content: "\F113A"; +} + +.mdi-octagon::before { + content: "\F03C3"; +} + +.mdi-octagon-outline::before { + content: "\F03C4"; +} + +.mdi-octagram::before { + content: "\F06F9"; +} + +.mdi-octagram-edit::before { + content: "\F1C34"; +} + +.mdi-octagram-edit-outline::before { + content: "\F1C35"; +} + +.mdi-octagram-minus::before { + content: "\F1C36"; +} + +.mdi-octagram-minus-outline::before { + content: "\F1C37"; +} + +.mdi-octagram-outline::before { + content: "\F0775"; +} + +.mdi-octagram-plus::before { + content: "\F1C38"; +} + +.mdi-octagram-plus-outline::before { + content: "\F1C39"; +} + +.mdi-octahedron::before { + content: "\F1950"; +} + +.mdi-octahedron-off::before { + content: "\F1951"; +} + +.mdi-odnoklassniki::before { + content: "\F03C5"; +} + +.mdi-offer::before { + content: "\F121B"; +} + +.mdi-office-building::before { + content: "\F0991"; +} + +.mdi-office-building-cog::before { + content: "\F1949"; +} + +.mdi-office-building-cog-outline::before { + content: "\F194A"; +} + +.mdi-office-building-marker::before { + content: "\F1520"; +} + +.mdi-office-building-marker-outline::before { + content: "\F1521"; +} + +.mdi-office-building-minus::before { + content: "\F1BAA"; +} + +.mdi-office-building-minus-outline::before { + content: "\F1BAB"; +} + +.mdi-office-building-outline::before { + content: "\F151F"; +} + +.mdi-office-building-plus::before { + content: "\F1BA8"; +} + +.mdi-office-building-plus-outline::before { + content: "\F1BA9"; +} + +.mdi-office-building-remove::before { + content: "\F1BAC"; +} + +.mdi-office-building-remove-outline::before { + content: "\F1BAD"; +} + +.mdi-oil::before { + content: "\F03C7"; +} + +.mdi-oil-lamp::before { + content: "\F0F19"; +} + +.mdi-oil-level::before { + content: "\F1053"; +} + +.mdi-oil-temperature::before { + content: "\F0FF8"; +} + +.mdi-om::before { + content: "\F0973"; +} + +.mdi-omega::before { + content: "\F03C9"; +} + +.mdi-one-up::before { + content: "\F0BAD"; +} + +.mdi-onepassword::before { + content: "\F0881"; +} + +.mdi-opacity::before { + content: "\F05CC"; +} + +.mdi-open-in-app::before { + content: "\F03CB"; +} + +.mdi-open-in-new::before { + content: "\F03CC"; +} + +.mdi-open-source-initiative::before { + content: "\F0BAE"; +} + +.mdi-openid::before { + content: "\F03CD"; +} + +.mdi-opera::before { + content: "\F03CE"; +} + +.mdi-orbit::before { + content: "\F0018"; +} + +.mdi-orbit-variant::before { + content: "\F15DB"; +} + +.mdi-order-alphabetical-ascending::before { + content: "\F020D"; +} + +.mdi-order-alphabetical-descending::before { + content: "\F0D07"; +} + +.mdi-order-bool-ascending::before { + content: "\F02BE"; +} + +.mdi-order-bool-ascending-variant::before { + content: "\F098F"; +} + +.mdi-order-bool-descending::before { + content: "\F1384"; +} + +.mdi-order-bool-descending-variant::before { + content: "\F0990"; +} + +.mdi-order-numeric-ascending::before { + content: "\F0545"; +} + +.mdi-order-numeric-descending::before { + content: "\F0546"; +} + +.mdi-origin::before { + content: "\F0B43"; +} + +.mdi-ornament::before { + content: "\F03CF"; +} + +.mdi-ornament-variant::before { + content: "\F03D0"; +} + +.mdi-outdoor-lamp::before { + content: "\F1054"; +} + +.mdi-overscan::before { + content: "\F1005"; +} + +.mdi-owl::before { + content: "\F03D2"; +} + +.mdi-pac-man::before { + content: "\F0BAF"; +} + +.mdi-package::before { + content: "\F03D3"; +} + +.mdi-package-check::before { + content: "\F1B51"; +} + +.mdi-package-down::before { + content: "\F03D4"; +} + +.mdi-package-up::before { + content: "\F03D5"; +} + +.mdi-package-variant::before { + content: "\F03D6"; +} + +.mdi-package-variant-closed::before { + content: "\F03D7"; +} + +.mdi-package-variant-closed-check::before { + content: "\F1B52"; +} + +.mdi-package-variant-closed-minus::before { + content: "\F19D4"; +} + +.mdi-package-variant-closed-plus::before { + content: "\F19D5"; +} + +.mdi-package-variant-closed-remove::before { + content: "\F19D6"; +} + +.mdi-package-variant-minus::before { + content: "\F19D7"; +} + +.mdi-package-variant-plus::before { + content: "\F19D8"; +} + +.mdi-package-variant-remove::before { + content: "\F19D9"; +} + +.mdi-page-first::before { + content: "\F0600"; +} + +.mdi-page-last::before { + content: "\F0601"; +} + +.mdi-page-layout-body::before { + content: "\F06FA"; +} + +.mdi-page-layout-footer::before { + content: "\F06FB"; +} + +.mdi-page-layout-header::before { + content: "\F06FC"; +} + +.mdi-page-layout-header-footer::before { + content: "\F0F7F"; +} + +.mdi-page-layout-sidebar-left::before { + content: "\F06FD"; +} + +.mdi-page-layout-sidebar-right::before { + content: "\F06FE"; +} + +.mdi-page-next::before { + content: "\F0BB0"; +} + +.mdi-page-next-outline::before { + content: "\F0BB1"; +} + +.mdi-page-previous::before { + content: "\F0BB2"; +} + +.mdi-page-previous-outline::before { + content: "\F0BB3"; +} + +.mdi-pail::before { + content: "\F1417"; +} + +.mdi-pail-minus::before { + content: "\F1437"; +} + +.mdi-pail-minus-outline::before { + content: "\F143C"; +} + +.mdi-pail-off::before { + content: "\F1439"; +} + +.mdi-pail-off-outline::before { + content: "\F143E"; +} + +.mdi-pail-outline::before { + content: "\F143A"; +} + +.mdi-pail-plus::before { + content: "\F1436"; +} + +.mdi-pail-plus-outline::before { + content: "\F143B"; +} + +.mdi-pail-remove::before { + content: "\F1438"; +} + +.mdi-pail-remove-outline::before { + content: "\F143D"; +} + +.mdi-palette::before { + content: "\F03D8"; +} + +.mdi-palette-advanced::before { + content: "\F03D9"; +} + +.mdi-palette-outline::before { + content: "\F0E0C"; +} + +.mdi-palette-swatch::before { + content: "\F08B5"; +} + +.mdi-palette-swatch-outline::before { + content: "\F135C"; +} + +.mdi-palette-swatch-variant::before { + content: "\F195A"; +} + +.mdi-palm-tree::before { + content: "\F1055"; +} + +.mdi-pan::before { + content: "\F0BB4"; +} + +.mdi-pan-bottom-left::before { + content: "\F0BB5"; +} + +.mdi-pan-bottom-right::before { + content: "\F0BB6"; +} + +.mdi-pan-down::before { + content: "\F0BB7"; +} + +.mdi-pan-horizontal::before { + content: "\F0BB8"; +} + +.mdi-pan-left::before { + content: "\F0BB9"; +} + +.mdi-pan-right::before { + content: "\F0BBA"; +} + +.mdi-pan-top-left::before { + content: "\F0BBB"; +} + +.mdi-pan-top-right::before { + content: "\F0BBC"; +} + +.mdi-pan-up::before { + content: "\F0BBD"; +} + +.mdi-pan-vertical::before { + content: "\F0BBE"; +} + +.mdi-panda::before { + content: "\F03DA"; +} + +.mdi-pandora::before { + content: "\F03DB"; +} + +.mdi-panorama::before { + content: "\F03DC"; +} + +.mdi-panorama-fisheye::before { + content: "\F03DD"; +} + +.mdi-panorama-horizontal::before { + content: "\F1928"; +} + +.mdi-panorama-horizontal-outline::before { + content: "\F03DE"; +} + +.mdi-panorama-outline::before { + content: "\F198C"; +} + +.mdi-panorama-sphere::before { + content: "\F198D"; +} + +.mdi-panorama-sphere-outline::before { + content: "\F198E"; +} + +.mdi-panorama-variant::before { + content: "\F198F"; +} + +.mdi-panorama-variant-outline::before { + content: "\F1990"; +} + +.mdi-panorama-vertical::before { + content: "\F1929"; +} + +.mdi-panorama-vertical-outline::before { + content: "\F03DF"; +} + +.mdi-panorama-wide-angle::before { + content: "\F195F"; +} + +.mdi-panorama-wide-angle-outline::before { + content: "\F03E0"; +} + +.mdi-paper-cut-vertical::before { + content: "\F03E1"; +} + +.mdi-paper-roll::before { + content: "\F1157"; +} + +.mdi-paper-roll-outline::before { + content: "\F1158"; +} + +.mdi-paperclip::before { + content: "\F03E2"; +} + +.mdi-paperclip-check::before { + content: "\F1AC6"; +} + +.mdi-paperclip-lock::before { + content: "\F19DA"; +} + +.mdi-paperclip-minus::before { + content: "\F1AC7"; +} + +.mdi-paperclip-off::before { + content: "\F1AC8"; +} + +.mdi-paperclip-plus::before { + content: "\F1AC9"; +} + +.mdi-paperclip-remove::before { + content: "\F1ACA"; +} + +.mdi-parachute::before { + content: "\F0CB4"; +} + +.mdi-parachute-outline::before { + content: "\F0CB5"; +} + +.mdi-paragliding::before { + content: "\F1745"; +} + +.mdi-parking::before { + content: "\F03E3"; +} + +.mdi-party-popper::before { + content: "\F1056"; +} + +.mdi-passport::before { + content: "\F07E3"; +} + +.mdi-passport-alert::before { + content: "\F1CB8"; +} + +.mdi-passport-biometric::before { + content: "\F0DE1"; +} + +.mdi-passport-cancel::before { + content: "\F1CB9"; +} + +.mdi-passport-check::before { + content: "\F1CBA"; +} + +.mdi-passport-minus::before { + content: "\F1CBB"; +} + +.mdi-passport-plus::before { + content: "\F1CBC"; +} + +.mdi-passport-remove::before { + content: "\F1CBD"; +} + +.mdi-pasta::before { + content: "\F1160"; +} + +.mdi-patio-heater::before { + content: "\F0F80"; +} + +.mdi-patreon::before { + content: "\F0882"; +} + +.mdi-pause::before { + content: "\F03E4"; +} + +.mdi-pause-box::before { + content: "\F00BC"; +} + +.mdi-pause-box-outline::before { + content: "\F1B7A"; +} + +.mdi-pause-circle::before { + content: "\F03E5"; +} + +.mdi-pause-circle-outline::before { + content: "\F03E6"; +} + +.mdi-pause-octagon::before { + content: "\F03E7"; +} + +.mdi-pause-octagon-outline::before { + content: "\F03E8"; +} + +.mdi-paw::before { + content: "\F03E9"; +} + +.mdi-paw-off::before { + content: "\F0657"; +} + +.mdi-paw-off-outline::before { + content: "\F1676"; +} + +.mdi-paw-outline::before { + content: "\F1675"; +} + +.mdi-peace::before { + content: "\F0884"; +} + +.mdi-peanut::before { + content: "\F0FFC"; +} + +.mdi-peanut-off::before { + content: "\F0FFD"; +} + +.mdi-peanut-off-outline::before { + content: "\F0FFF"; +} + +.mdi-peanut-outline::before { + content: "\F0FFE"; +} + +.mdi-pen::before { + content: "\F03EA"; +} + +.mdi-pen-lock::before { + content: "\F0DE2"; +} + +.mdi-pen-minus::before { + content: "\F0DE3"; +} + +.mdi-pen-off::before { + content: "\F0DE4"; +} + +.mdi-pen-plus::before { + content: "\F0DE5"; +} + +.mdi-pen-remove::before { + content: "\F0DE6"; +} + +.mdi-pencil::before { + content: "\F03EB"; +} + +.mdi-pencil-box::before { + content: "\F03EC"; +} + +.mdi-pencil-box-multiple::before { + content: "\F1144"; +} + +.mdi-pencil-box-multiple-outline::before { + content: "\F1145"; +} + +.mdi-pencil-box-outline::before { + content: "\F03ED"; +} + +.mdi-pencil-circle::before { + content: "\F06FF"; +} + +.mdi-pencil-circle-outline::before { + content: "\F0776"; +} + +.mdi-pencil-lock::before { + content: "\F03EE"; +} + +.mdi-pencil-lock-outline::before { + content: "\F0DE7"; +} + +.mdi-pencil-minus::before { + content: "\F0DE8"; +} + +.mdi-pencil-minus-outline::before { + content: "\F0DE9"; +} + +.mdi-pencil-off::before { + content: "\F03EF"; +} + +.mdi-pencil-off-outline::before { + content: "\F0DEA"; +} + +.mdi-pencil-outline::before { + content: "\F0CB6"; +} + +.mdi-pencil-plus::before { + content: "\F0DEB"; +} + +.mdi-pencil-plus-outline::before { + content: "\F0DEC"; +} + +.mdi-pencil-remove::before { + content: "\F0DED"; +} + +.mdi-pencil-remove-outline::before { + content: "\F0DEE"; +} + +.mdi-pencil-ruler::before { + content: "\F1353"; +} + +.mdi-pencil-ruler-outline::before { + content: "\F1C11"; +} + +.mdi-penguin::before { + content: "\F0EC0"; +} + +.mdi-pentagon::before { + content: "\F0701"; +} + +.mdi-pentagon-outline::before { + content: "\F0700"; +} + +.mdi-pentagram::before { + content: "\F1667"; +} + +.mdi-percent::before { + content: "\F03F0"; +} + +.mdi-percent-box::before { + content: "\F1A02"; +} + +.mdi-percent-box-outline::before { + content: "\F1A03"; +} + +.mdi-percent-circle::before { + content: "\F1A04"; +} + +.mdi-percent-circle-outline::before { + content: "\F1A05"; +} + +.mdi-percent-outline::before { + content: "\F1278"; +} + +.mdi-periodic-table::before { + content: "\F08B6"; +} + +.mdi-perspective-less::before { + content: "\F0D23"; +} + +.mdi-perspective-more::before { + content: "\F0D24"; +} + +.mdi-ph::before { + content: "\F17C5"; +} + +.mdi-phone::before { + content: "\F03F2"; +} + +.mdi-phone-alert::before { + content: "\F0F1A"; +} + +.mdi-phone-alert-outline::before { + content: "\F118E"; +} + +.mdi-phone-bluetooth::before { + content: "\F03F3"; +} + +.mdi-phone-bluetooth-outline::before { + content: "\F118F"; +} + +.mdi-phone-cancel::before { + content: "\F10BC"; +} + +.mdi-phone-cancel-outline::before { + content: "\F1190"; +} + +.mdi-phone-check::before { + content: "\F11A9"; +} + +.mdi-phone-check-outline::before { + content: "\F11AA"; +} + +.mdi-phone-classic::before { + content: "\F0602"; +} + +.mdi-phone-classic-off::before { + content: "\F1279"; +} + +.mdi-phone-clock::before { + content: "\F19DB"; +} + +.mdi-phone-dial::before { + content: "\F1559"; +} + +.mdi-phone-dial-outline::before { + content: "\F155A"; +} + +.mdi-phone-forward::before { + content: "\F03F4"; +} + +.mdi-phone-forward-outline::before { + content: "\F1191"; +} + +.mdi-phone-hangup::before { + content: "\F03F5"; +} + +.mdi-phone-hangup-outline::before { + content: "\F1192"; +} + +.mdi-phone-in-talk::before { + content: "\F03F6"; +} + +.mdi-phone-in-talk-outline::before { + content: "\F1182"; +} + +.mdi-phone-incoming::before { + content: "\F03F7"; +} + +.mdi-phone-incoming-outgoing::before { + content: "\F1B3F"; +} + +.mdi-phone-incoming-outgoing-outline::before { + content: "\F1B40"; +} + +.mdi-phone-incoming-outline::before { + content: "\F1193"; +} + +.mdi-phone-lock::before { + content: "\F03F8"; +} + +.mdi-phone-lock-outline::before { + content: "\F1194"; +} + +.mdi-phone-log::before { + content: "\F03F9"; +} + +.mdi-phone-log-outline::before { + content: "\F1195"; +} + +.mdi-phone-message::before { + content: "\F1196"; +} + +.mdi-phone-message-outline::before { + content: "\F1197"; +} + +.mdi-phone-minus::before { + content: "\F0658"; +} + +.mdi-phone-minus-outline::before { + content: "\F1198"; +} + +.mdi-phone-missed::before { + content: "\F03FA"; +} + +.mdi-phone-missed-outline::before { + content: "\F11A5"; +} + +.mdi-phone-off::before { + content: "\F0DEF"; +} + +.mdi-phone-off-outline::before { + content: "\F11A6"; +} + +.mdi-phone-outgoing::before { + content: "\F03FB"; +} + +.mdi-phone-outgoing-outline::before { + content: "\F1199"; +} + +.mdi-phone-outline::before { + content: "\F0DF0"; +} + +.mdi-phone-paused::before { + content: "\F03FC"; +} + +.mdi-phone-paused-outline::before { + content: "\F119A"; +} + +.mdi-phone-plus::before { + content: "\F0659"; +} + +.mdi-phone-plus-outline::before { + content: "\F119B"; +} + +.mdi-phone-refresh::before { + content: "\F1993"; +} + +.mdi-phone-refresh-outline::before { + content: "\F1994"; +} + +.mdi-phone-remove::before { + content: "\F152F"; +} + +.mdi-phone-remove-outline::before { + content: "\F1530"; +} + +.mdi-phone-return::before { + content: "\F082F"; +} + +.mdi-phone-return-outline::before { + content: "\F119C"; +} + +.mdi-phone-ring::before { + content: "\F11AB"; +} + +.mdi-phone-ring-outline::before { + content: "\F11AC"; +} + +.mdi-phone-rotate-landscape::before { + content: "\F0885"; +} + +.mdi-phone-rotate-portrait::before { + content: "\F0886"; +} + +.mdi-phone-settings::before { + content: "\F03FD"; +} + +.mdi-phone-settings-outline::before { + content: "\F119D"; +} + +.mdi-phone-sync::before { + content: "\F1995"; +} + +.mdi-phone-sync-outline::before { + content: "\F1996"; +} + +.mdi-phone-voip::before { + content: "\F03FE"; +} + +.mdi-pi::before { + content: "\F03FF"; +} + +.mdi-pi-box::before { + content: "\F0400"; +} + +.mdi-pi-hole::before { + content: "\F0DF1"; +} + +.mdi-piano::before { + content: "\F067D"; +} + +.mdi-piano-off::before { + content: "\F0698"; +} + +.mdi-pickaxe::before { + content: "\F08B7"; +} + +.mdi-picture-in-picture-bottom-right::before { + content: "\F0E57"; +} + +.mdi-picture-in-picture-bottom-right-outline::before { + content: "\F0E58"; +} + +.mdi-picture-in-picture-top-right::before { + content: "\F0E59"; +} + +.mdi-picture-in-picture-top-right-outline::before { + content: "\F0E5A"; +} + +.mdi-pier::before { + content: "\F0887"; +} + +.mdi-pier-crane::before { + content: "\F0888"; +} + +.mdi-pig::before { + content: "\F0401"; +} + +.mdi-pig-variant::before { + content: "\F1006"; +} + +.mdi-pig-variant-outline::before { + content: "\F1678"; +} + +.mdi-piggy-bank::before { + content: "\F1007"; +} + +.mdi-piggy-bank-outline::before { + content: "\F1679"; +} + +.mdi-pill::before { + content: "\F0402"; +} + +.mdi-pill-multiple::before { + content: "\F1B4C"; +} + +.mdi-pill-off::before { + content: "\F1A5C"; +} + +.mdi-pillar::before { + content: "\F0702"; +} + +.mdi-pin::before { + content: "\F0403"; +} + +.mdi-pin-off::before { + content: "\F0404"; +} + +.mdi-pin-off-outline::before { + content: "\F0930"; +} + +.mdi-pin-outline::before { + content: "\F0931"; +} + +.mdi-pine-tree::before { + content: "\F0405"; +} + +.mdi-pine-tree-box::before { + content: "\F0406"; +} + +.mdi-pine-tree-fire::before { + content: "\F141A"; +} + +.mdi-pine-tree-variant::before { + content: "\F1C73"; +} + +.mdi-pine-tree-variant-outline::before { + content: "\F1C74"; +} + +.mdi-pinterest::before { + content: "\F0407"; +} + +.mdi-pinwheel::before { + content: "\F0AD5"; +} + +.mdi-pinwheel-outline::before { + content: "\F0AD6"; +} + +.mdi-pipe::before { + content: "\F07E5"; +} + +.mdi-pipe-disconnected::before { + content: "\F07E6"; +} + +.mdi-pipe-leak::before { + content: "\F0889"; +} + +.mdi-pipe-valve::before { + content: "\F184D"; +} + +.mdi-pipe-wrench::before { + content: "\F1354"; +} + +.mdi-pirate::before { + content: "\F0A08"; +} + +.mdi-pistol::before { + content: "\F0703"; +} + +.mdi-piston::before { + content: "\F088A"; +} + +.mdi-pitchfork::before { + content: "\F1553"; +} + +.mdi-pizza::before { + content: "\F0409"; +} + +.mdi-plane-car::before { + content: "\F1AFF"; +} + +.mdi-plane-train::before { + content: "\F1B00"; +} + +.mdi-play::before { + content: "\F040A"; +} + +.mdi-play-box::before { + content: "\F127A"; +} + +.mdi-play-box-edit-outline::before { + content: "\F1C3A"; +} + +.mdi-play-box-lock::before { + content: "\F1A16"; +} + +.mdi-play-box-lock-open::before { + content: "\F1A17"; +} + +.mdi-play-box-lock-open-outline::before { + content: "\F1A18"; +} + +.mdi-play-box-lock-outline::before { + content: "\F1A19"; +} + +.mdi-play-box-multiple::before { + content: "\F0D19"; +} + +.mdi-play-box-multiple-outline::before { + content: "\F13E6"; +} + +.mdi-play-box-outline::before { + content: "\F040B"; +} + +.mdi-play-circle::before { + content: "\F040C"; +} + +.mdi-play-circle-outline::before { + content: "\F040D"; +} + +.mdi-play-network::before { + content: "\F088B"; +} + +.mdi-play-network-outline::before { + content: "\F0CB7"; +} + +.mdi-play-outline::before { + content: "\F0F1B"; +} + +.mdi-play-pause::before { + content: "\F040E"; +} + +.mdi-play-protected-content::before { + content: "\F040F"; +} + +.mdi-play-speed::before { + content: "\F08FF"; +} + +.mdi-playlist-check::before { + content: "\F05C7"; +} + +.mdi-playlist-edit::before { + content: "\F0900"; +} + +.mdi-playlist-minus::before { + content: "\F0410"; +} + +.mdi-playlist-music::before { + content: "\F0CB8"; +} + +.mdi-playlist-music-outline::before { + content: "\F0CB9"; +} + +.mdi-playlist-play::before { + content: "\F0411"; +} + +.mdi-playlist-plus::before { + content: "\F0412"; +} + +.mdi-playlist-remove::before { + content: "\F0413"; +} + +.mdi-playlist-star::before { + content: "\F0DF2"; +} + +.mdi-plex::before { + content: "\F06BA"; +} + +.mdi-pliers::before { + content: "\F19A4"; +} + +.mdi-plus::before { + content: "\F0415"; +} + +.mdi-plus-box::before { + content: "\F0416"; +} + +.mdi-plus-box-multiple::before { + content: "\F0334"; +} + +.mdi-plus-box-multiple-outline::before { + content: "\F1143"; +} + +.mdi-plus-box-outline::before { + content: "\F0704"; +} + +.mdi-plus-circle::before { + content: "\F0417"; +} + +.mdi-plus-circle-multiple::before { + content: "\F034C"; +} + +.mdi-plus-circle-multiple-outline::before { + content: "\F0418"; +} + +.mdi-plus-circle-outline::before { + content: "\F0419"; +} + +.mdi-plus-lock::before { + content: "\F1A5D"; +} + +.mdi-plus-lock-open::before { + content: "\F1A5E"; +} + +.mdi-plus-minus::before { + content: "\F0992"; +} + +.mdi-plus-minus-box::before { + content: "\F0993"; +} + +.mdi-plus-minus-variant::before { + content: "\F14C9"; +} + +.mdi-plus-network::before { + content: "\F041A"; +} + +.mdi-plus-network-outline::before { + content: "\F0CBA"; +} + +.mdi-plus-outline::before { + content: "\F0705"; +} + +.mdi-plus-thick::before { + content: "\F11EC"; +} + +.mdi-pocket::before { + content: "\F1CBE"; +} + +.mdi-podcast::before { + content: "\F0994"; +} + +.mdi-podium::before { + content: "\F0D25"; +} + +.mdi-podium-bronze::before { + content: "\F0D26"; +} + +.mdi-podium-gold::before { + content: "\F0D27"; +} + +.mdi-podium-silver::before { + content: "\F0D28"; +} + +.mdi-point-of-sale::before { + content: "\F0D92"; +} + +.mdi-pokeball::before { + content: "\F041D"; +} + +.mdi-pokemon-go::before { + content: "\F0A09"; +} + +.mdi-poker-chip::before { + content: "\F0830"; +} + +.mdi-polaroid::before { + content: "\F041E"; +} + +.mdi-police-badge::before { + content: "\F1167"; +} + +.mdi-police-badge-outline::before { + content: "\F1168"; +} + +.mdi-police-station::before { + content: "\F1839"; +} + +.mdi-poll::before { + content: "\F041F"; +} + +.mdi-polo::before { + content: "\F14C3"; +} + +.mdi-polymer::before { + content: "\F0421"; +} + +.mdi-pool::before { + content: "\F0606"; +} + +.mdi-pool-thermometer::before { + content: "\F1A5F"; +} + +.mdi-popcorn::before { + content: "\F0422"; +} + +.mdi-post::before { + content: "\F1008"; +} + +.mdi-post-lamp::before { + content: "\F1A60"; +} + +.mdi-post-outline::before { + content: "\F1009"; +} + +.mdi-postage-stamp::before { + content: "\F0CBB"; +} + +.mdi-pot::before { + content: "\F02E5"; +} + +.mdi-pot-mix::before { + content: "\F065B"; +} + +.mdi-pot-mix-outline::before { + content: "\F0677"; +} + +.mdi-pot-outline::before { + content: "\F02FF"; +} + +.mdi-pot-steam::before { + content: "\F065A"; +} + +.mdi-pot-steam-outline::before { + content: "\F0326"; +} + +.mdi-pound::before { + content: "\F0423"; +} + +.mdi-pound-box::before { + content: "\F0424"; +} + +.mdi-pound-box-outline::before { + content: "\F117F"; +} + +.mdi-power::before { + content: "\F0425"; +} + +.mdi-power-cycle::before { + content: "\F0901"; +} + +.mdi-power-off::before { + content: "\F0902"; +} + +.mdi-power-on::before { + content: "\F0903"; +} + +.mdi-power-plug::before { + content: "\F06A5"; +} + +.mdi-power-plug-battery::before { + content: "\F1C3B"; +} + +.mdi-power-plug-battery-outline::before { + content: "\F1C3C"; +} + +.mdi-power-plug-off::before { + content: "\F06A6"; +} + +.mdi-power-plug-off-outline::before { + content: "\F1424"; +} + +.mdi-power-plug-outline::before { + content: "\F1425"; +} + +.mdi-power-settings::before { + content: "\F0426"; +} + +.mdi-power-sleep::before { + content: "\F0904"; +} + +.mdi-power-socket::before { + content: "\F0427"; +} + +.mdi-power-socket-au::before { + content: "\F0905"; +} + +.mdi-power-socket-ch::before { + content: "\F0FB3"; +} + +.mdi-power-socket-de::before { + content: "\F1107"; +} + +.mdi-power-socket-eu::before { + content: "\F07E7"; +} + +.mdi-power-socket-fr::before { + content: "\F1108"; +} + +.mdi-power-socket-it::before { + content: "\F14FF"; +} + +.mdi-power-socket-jp::before { + content: "\F1109"; +} + +.mdi-power-socket-uk::before { + content: "\F07E8"; +} + +.mdi-power-socket-us::before { + content: "\F07E9"; +} + +.mdi-power-standby::before { + content: "\F0906"; +} + +.mdi-powershell::before { + content: "\F0A0A"; +} + +.mdi-prescription::before { + content: "\F0706"; +} + +.mdi-presentation::before { + content: "\F0428"; +} + +.mdi-presentation-play::before { + content: "\F0429"; +} + +.mdi-pretzel::before { + content: "\F1562"; +} + +.mdi-printer::before { + content: "\F042A"; +} + +.mdi-printer-3d::before { + content: "\F042B"; +} + +.mdi-printer-3d-nozzle::before { + content: "\F0E5B"; +} + +.mdi-printer-3d-nozzle-alert::before { + content: "\F11C0"; +} + +.mdi-printer-3d-nozzle-alert-outline::before { + content: "\F11C1"; +} + +.mdi-printer-3d-nozzle-heat::before { + content: "\F18B8"; +} + +.mdi-printer-3d-nozzle-heat-outline::before { + content: "\F18B9"; +} + +.mdi-printer-3d-nozzle-off::before { + content: "\F1B19"; +} + +.mdi-printer-3d-nozzle-off-outline::before { + content: "\F1B1A"; +} + +.mdi-printer-3d-nozzle-outline::before { + content: "\F0E5C"; +} + +.mdi-printer-3d-off::before { + content: "\F1B0E"; +} + +.mdi-printer-alert::before { + content: "\F042C"; +} + +.mdi-printer-check::before { + content: "\F1146"; +} + +.mdi-printer-eye::before { + content: "\F1458"; +} + +.mdi-printer-off::before { + content: "\F0E5D"; +} + +.mdi-printer-off-outline::before { + content: "\F1785"; +} + +.mdi-printer-outline::before { + content: "\F1786"; +} + +.mdi-printer-pos::before { + content: "\F1057"; +} + +.mdi-printer-pos-alert::before { + content: "\F1BBC"; +} + +.mdi-printer-pos-alert-outline::before { + content: "\F1BBD"; +} + +.mdi-printer-pos-cancel::before { + content: "\F1BBE"; +} + +.mdi-printer-pos-cancel-outline::before { + content: "\F1BBF"; +} + +.mdi-printer-pos-check::before { + content: "\F1BC0"; +} + +.mdi-printer-pos-check-outline::before { + content: "\F1BC1"; +} + +.mdi-printer-pos-cog::before { + content: "\F1BC2"; +} + +.mdi-printer-pos-cog-outline::before { + content: "\F1BC3"; +} + +.mdi-printer-pos-edit::before { + content: "\F1BC4"; +} + +.mdi-printer-pos-edit-outline::before { + content: "\F1BC5"; +} + +.mdi-printer-pos-minus::before { + content: "\F1BC6"; +} + +.mdi-printer-pos-minus-outline::before { + content: "\F1BC7"; +} + +.mdi-printer-pos-network::before { + content: "\F1BC8"; +} + +.mdi-printer-pos-network-outline::before { + content: "\F1BC9"; +} + +.mdi-printer-pos-off::before { + content: "\F1BCA"; +} + +.mdi-printer-pos-off-outline::before { + content: "\F1BCB"; +} + +.mdi-printer-pos-outline::before { + content: "\F1BCC"; +} + +.mdi-printer-pos-pause::before { + content: "\F1BCD"; +} + +.mdi-printer-pos-pause-outline::before { + content: "\F1BCE"; +} + +.mdi-printer-pos-play::before { + content: "\F1BCF"; +} + +.mdi-printer-pos-play-outline::before { + content: "\F1BD0"; +} + +.mdi-printer-pos-plus::before { + content: "\F1BD1"; +} + +.mdi-printer-pos-plus-outline::before { + content: "\F1BD2"; +} + +.mdi-printer-pos-refresh::before { + content: "\F1BD3"; +} + +.mdi-printer-pos-refresh-outline::before { + content: "\F1BD4"; +} + +.mdi-printer-pos-remove::before { + content: "\F1BD5"; +} + +.mdi-printer-pos-remove-outline::before { + content: "\F1BD6"; +} + +.mdi-printer-pos-star::before { + content: "\F1BD7"; +} + +.mdi-printer-pos-star-outline::before { + content: "\F1BD8"; +} + +.mdi-printer-pos-stop::before { + content: "\F1BD9"; +} + +.mdi-printer-pos-stop-outline::before { + content: "\F1BDA"; +} + +.mdi-printer-pos-sync::before { + content: "\F1BDB"; +} + +.mdi-printer-pos-sync-outline::before { + content: "\F1BDC"; +} + +.mdi-printer-pos-wrench::before { + content: "\F1BDD"; +} + +.mdi-printer-pos-wrench-outline::before { + content: "\F1BDE"; +} + +.mdi-printer-search::before { + content: "\F1457"; +} + +.mdi-printer-settings::before { + content: "\F0707"; +} + +.mdi-printer-wireless::before { + content: "\F0A0B"; +} + +.mdi-priority-high::before { + content: "\F0603"; +} + +.mdi-priority-low::before { + content: "\F0604"; +} + +.mdi-professional-hexagon::before { + content: "\F042D"; +} + +.mdi-progress-alert::before { + content: "\F0CBC"; +} + +.mdi-progress-check::before { + content: "\F0995"; +} + +.mdi-progress-clock::before { + content: "\F0996"; +} + +.mdi-progress-close::before { + content: "\F110A"; +} + +.mdi-progress-download::before { + content: "\F0997"; +} + +.mdi-progress-helper::before { + content: "\F1BA2"; +} + +.mdi-progress-pencil::before { + content: "\F1787"; +} + +.mdi-progress-question::before { + content: "\F1522"; +} + +.mdi-progress-star::before { + content: "\F1788"; +} + +.mdi-progress-star-four-points::before { + content: "\F1C3D"; +} + +.mdi-progress-tag::before { + content: "\F1D0D"; +} + +.mdi-progress-upload::before { + content: "\F0998"; +} + +.mdi-progress-wrench::before { + content: "\F0CBD"; +} + +.mdi-projector::before { + content: "\F042E"; +} + +.mdi-projector-off::before { + content: "\F1A23"; +} + +.mdi-projector-screen::before { + content: "\F042F"; +} + +.mdi-projector-screen-off::before { + content: "\F180D"; +} + +.mdi-projector-screen-off-outline::before { + content: "\F180E"; +} + +.mdi-projector-screen-outline::before { + content: "\F1724"; +} + +.mdi-projector-screen-variant::before { + content: "\F180F"; +} + +.mdi-projector-screen-variant-off::before { + content: "\F1810"; +} + +.mdi-projector-screen-variant-off-outline::before { + content: "\F1811"; +} + +.mdi-projector-screen-variant-outline::before { + content: "\F1812"; +} + +.mdi-propane-tank::before { + content: "\F1357"; +} + +.mdi-propane-tank-outline::before { + content: "\F1358"; +} + +.mdi-protocol::before { + content: "\F0FD8"; +} + +.mdi-publish::before { + content: "\F06A7"; +} + +.mdi-publish-off::before { + content: "\F1945"; +} + +.mdi-pulse::before { + content: "\F0430"; +} + +.mdi-pump::before { + content: "\F1402"; +} + +.mdi-pump-off::before { + content: "\F1B22"; +} + +.mdi-pumpkin::before { + content: "\F0BBF"; +} + +.mdi-purse::before { + content: "\F0F1C"; +} + +.mdi-purse-outline::before { + content: "\F0F1D"; +} + +.mdi-puzzle::before { + content: "\F0431"; +} + +.mdi-puzzle-check::before { + content: "\F1426"; +} + +.mdi-puzzle-check-outline::before { + content: "\F1427"; +} + +.mdi-puzzle-edit::before { + content: "\F14D3"; +} + +.mdi-puzzle-edit-outline::before { + content: "\F14D9"; +} + +.mdi-puzzle-heart::before { + content: "\F14D4"; +} + +.mdi-puzzle-heart-outline::before { + content: "\F14DA"; +} + +.mdi-puzzle-minus::before { + content: "\F14D1"; +} + +.mdi-puzzle-minus-outline::before { + content: "\F14D7"; +} + +.mdi-puzzle-outline::before { + content: "\F0A66"; +} + +.mdi-puzzle-plus::before { + content: "\F14D0"; +} + +.mdi-puzzle-plus-outline::before { + content: "\F14D6"; +} + +.mdi-puzzle-remove::before { + content: "\F14D2"; +} + +.mdi-puzzle-remove-outline::before { + content: "\F14D8"; +} + +.mdi-puzzle-star::before { + content: "\F14D5"; +} + +.mdi-puzzle-star-outline::before { + content: "\F14DB"; +} + +.mdi-pyramid::before { + content: "\F1952"; +} + +.mdi-pyramid-off::before { + content: "\F1953"; +} + +.mdi-qi::before { + content: "\F0999"; +} + +.mdi-qqchat::before { + content: "\F0605"; +} + +.mdi-qrcode::before { + content: "\F0432"; +} + +.mdi-qrcode-edit::before { + content: "\F08B8"; +} + +.mdi-qrcode-minus::before { + content: "\F118C"; +} + +.mdi-qrcode-plus::before { + content: "\F118B"; +} + +.mdi-qrcode-remove::before { + content: "\F118D"; +} + +.mdi-qrcode-scan::before { + content: "\F0433"; +} + +.mdi-quadcopter::before { + content: "\F0434"; +} + +.mdi-quality-high::before { + content: "\F0435"; +} + +.mdi-quality-low::before { + content: "\F0A0C"; +} + +.mdi-quality-medium::before { + content: "\F0A0D"; +} + +.mdi-queue-first-in-last-out::before { + content: "\F1CAF"; +} + +.mdi-quora::before { + content: "\F0D29"; +} + +.mdi-rabbit::before { + content: "\F0907"; +} + +.mdi-rabbit-variant::before { + content: "\F1A61"; +} + +.mdi-rabbit-variant-outline::before { + content: "\F1A62"; +} + +.mdi-racing-helmet::before { + content: "\F0D93"; +} + +.mdi-racquetball::before { + content: "\F0D94"; +} + +.mdi-radar::before { + content: "\F0437"; +} + +.mdi-radiator::before { + content: "\F0438"; +} + +.mdi-radiator-disabled::before { + content: "\F0AD7"; +} + +.mdi-radiator-off::before { + content: "\F0AD8"; +} + +.mdi-radio::before { + content: "\F0439"; +} + +.mdi-radio-am::before { + content: "\F0CBE"; +} + +.mdi-radio-fm::before { + content: "\F0CBF"; +} + +.mdi-radio-handheld::before { + content: "\F043A"; +} + +.mdi-radio-off::before { + content: "\F121C"; +} + +.mdi-radio-tower::before { + content: "\F043B"; +} + +.mdi-radioactive::before { + content: "\F043C"; +} + +.mdi-radioactive-circle::before { + content: "\F185D"; +} + +.mdi-radioactive-circle-outline::before { + content: "\F185E"; +} + +.mdi-radioactive-off::before { + content: "\F0EC1"; +} + +.mdi-radiobox-blank::before { + content: "\F043D"; +} + +.mdi-radiobox-indeterminate-variant::before { + content: "\F1C5E"; +} + +.mdi-radiobox-marked::before { + content: "\F043E"; +} + +.mdi-radiology-box::before { + content: "\F14C5"; +} + +.mdi-radiology-box-outline::before { + content: "\F14C6"; +} + +.mdi-radius::before { + content: "\F0CC0"; +} + +.mdi-radius-outline::before { + content: "\F0CC1"; +} + +.mdi-railroad-light::before { + content: "\F0F1E"; +} + +.mdi-rake::before { + content: "\F1544"; +} + +.mdi-raspberry-pi::before { + content: "\F043F"; +} + +.mdi-raw::before { + content: "\F1A0F"; +} + +.mdi-raw-off::before { + content: "\F1A10"; +} + +.mdi-ray-end::before { + content: "\F0440"; +} + +.mdi-ray-end-arrow::before { + content: "\F0441"; +} + +.mdi-ray-start::before { + content: "\F0442"; +} + +.mdi-ray-start-arrow::before { + content: "\F0443"; +} + +.mdi-ray-start-end::before { + content: "\F0444"; +} + +.mdi-ray-start-vertex-end::before { + content: "\F15D8"; +} + +.mdi-ray-vertex::before { + content: "\F0445"; +} + +.mdi-razor-double-edge::before { + content: "\F1997"; +} + +.mdi-razor-single-edge::before { + content: "\F1998"; +} + +.mdi-react::before { + content: "\F0708"; +} + +.mdi-read::before { + content: "\F0447"; +} + +.mdi-receipt::before { + content: "\F0824"; +} + +.mdi-receipt-clock::before { + content: "\F1C3E"; +} + +.mdi-receipt-clock-outline::before { + content: "\F1C3F"; +} + +.mdi-receipt-outline::before { + content: "\F04F7"; +} + +.mdi-receipt-send::before { + content: "\F1C40"; +} + +.mdi-receipt-send-outline::before { + content: "\F1C41"; +} + +.mdi-receipt-text::before { + content: "\F0449"; +} + +.mdi-receipt-text-arrow-left::before { + content: "\F1C42"; +} + +.mdi-receipt-text-arrow-left-outline::before { + content: "\F1C43"; +} + +.mdi-receipt-text-arrow-right::before { + content: "\F1C44"; +} + +.mdi-receipt-text-arrow-right-outline::before { + content: "\F1C45"; +} + +.mdi-receipt-text-check::before { + content: "\F1A63"; +} + +.mdi-receipt-text-check-outline::before { + content: "\F1A64"; +} + +.mdi-receipt-text-clock::before { + content: "\F1C46"; +} + +.mdi-receipt-text-clock-outline::before { + content: "\F1C47"; +} + +.mdi-receipt-text-edit::before { + content: "\F1C48"; +} + +.mdi-receipt-text-edit-outline::before { + content: "\F1C49"; +} + +.mdi-receipt-text-minus::before { + content: "\F1A65"; +} + +.mdi-receipt-text-minus-outline::before { + content: "\F1A66"; +} + +.mdi-receipt-text-outline::before { + content: "\F19DC"; +} + +.mdi-receipt-text-plus::before { + content: "\F1A67"; +} + +.mdi-receipt-text-plus-outline::before { + content: "\F1A68"; +} + +.mdi-receipt-text-remove::before { + content: "\F1A69"; +} + +.mdi-receipt-text-remove-outline::before { + content: "\F1A6A"; +} + +.mdi-receipt-text-send::before { + content: "\F1C4A"; +} + +.mdi-receipt-text-send-outline::before { + content: "\F1C4B"; +} + +.mdi-record::before { + content: "\F044A"; +} + +.mdi-record-circle::before { + content: "\F0EC2"; +} + +.mdi-record-circle-outline::before { + content: "\F0EC3"; +} + +.mdi-record-player::before { + content: "\F099A"; +} + +.mdi-record-rec::before { + content: "\F044B"; +} + +.mdi-rectangle::before { + content: "\F0E5E"; +} + +.mdi-rectangle-outline::before { + content: "\F0E5F"; +} + +.mdi-recycle::before { + content: "\F044C"; +} + +.mdi-recycle-variant::before { + content: "\F139D"; +} + +.mdi-reddit::before { + content: "\F044D"; +} + +.mdi-redhat::before { + content: "\F111B"; +} + +.mdi-redo::before { + content: "\F044E"; +} + +.mdi-redo-variant::before { + content: "\F044F"; +} + +.mdi-reflect-horizontal::before { + content: "\F0A0E"; +} + +.mdi-reflect-vertical::before { + content: "\F0A0F"; +} + +.mdi-refresh::before { + content: "\F0450"; +} + +.mdi-refresh-auto::before { + content: "\F18F2"; +} + +.mdi-refresh-circle::before { + content: "\F1377"; +} + +.mdi-regex::before { + content: "\F0451"; +} + +.mdi-registered-trademark::before { + content: "\F0A67"; +} + +.mdi-reiterate::before { + content: "\F1588"; +} + +.mdi-relation-many-to-many::before { + content: "\F1496"; +} + +.mdi-relation-many-to-one::before { + content: "\F1497"; +} + +.mdi-relation-many-to-one-or-many::before { + content: "\F1498"; +} + +.mdi-relation-many-to-only-one::before { + content: "\F1499"; +} + +.mdi-relation-many-to-zero-or-many::before { + content: "\F149A"; +} + +.mdi-relation-many-to-zero-or-one::before { + content: "\F149B"; +} + +.mdi-relation-one-or-many-to-many::before { + content: "\F149C"; +} + +.mdi-relation-one-or-many-to-one::before { + content: "\F149D"; +} + +.mdi-relation-one-or-many-to-one-or-many::before { + content: "\F149E"; +} + +.mdi-relation-one-or-many-to-only-one::before { + content: "\F149F"; +} + +.mdi-relation-one-or-many-to-zero-or-many::before { + content: "\F14A0"; +} + +.mdi-relation-one-or-many-to-zero-or-one::before { + content: "\F14A1"; +} + +.mdi-relation-one-to-many::before { + content: "\F14A2"; +} + +.mdi-relation-one-to-one::before { + content: "\F14A3"; +} + +.mdi-relation-one-to-one-or-many::before { + content: "\F14A4"; +} + +.mdi-relation-one-to-only-one::before { + content: "\F14A5"; +} + +.mdi-relation-one-to-zero-or-many::before { + content: "\F14A6"; +} + +.mdi-relation-one-to-zero-or-one::before { + content: "\F14A7"; +} + +.mdi-relation-only-one-to-many::before { + content: "\F14A8"; +} + +.mdi-relation-only-one-to-one::before { + content: "\F14A9"; +} + +.mdi-relation-only-one-to-one-or-many::before { + content: "\F14AA"; +} + +.mdi-relation-only-one-to-only-one::before { + content: "\F14AB"; +} + +.mdi-relation-only-one-to-zero-or-many::before { + content: "\F14AC"; +} + +.mdi-relation-only-one-to-zero-or-one::before { + content: "\F14AD"; +} + +.mdi-relation-zero-or-many-to-many::before { + content: "\F14AE"; +} + +.mdi-relation-zero-or-many-to-one::before { + content: "\F14AF"; +} + +.mdi-relation-zero-or-many-to-one-or-many::before { + content: "\F14B0"; +} + +.mdi-relation-zero-or-many-to-only-one::before { + content: "\F14B1"; +} + +.mdi-relation-zero-or-many-to-zero-or-many::before { + content: "\F14B2"; +} + +.mdi-relation-zero-or-many-to-zero-or-one::before { + content: "\F14B3"; +} + +.mdi-relation-zero-or-one-to-many::before { + content: "\F14B4"; +} + +.mdi-relation-zero-or-one-to-one::before { + content: "\F14B5"; +} + +.mdi-relation-zero-or-one-to-one-or-many::before { + content: "\F14B6"; +} + +.mdi-relation-zero-or-one-to-only-one::before { + content: "\F14B7"; +} + +.mdi-relation-zero-or-one-to-zero-or-many::before { + content: "\F14B8"; +} + +.mdi-relation-zero-or-one-to-zero-or-one::before { + content: "\F14B9"; +} + +.mdi-relative-scale::before { + content: "\F0452"; +} + +.mdi-reload::before { + content: "\F0453"; +} + +.mdi-reload-alert::before { + content: "\F110B"; +} + +.mdi-reminder::before { + content: "\F088C"; +} + +.mdi-remote::before { + content: "\F0454"; +} + +.mdi-remote-desktop::before { + content: "\F08B9"; +} + +.mdi-remote-off::before { + content: "\F0EC4"; +} + +.mdi-remote-tv::before { + content: "\F0EC5"; +} + +.mdi-remote-tv-off::before { + content: "\F0EC6"; +} + +.mdi-rename::before { + content: "\F1C18"; +} + +.mdi-rename-box::before { + content: "\F0455"; +} + +.mdi-rename-box-outline::before { + content: "\F1C19"; +} + +.mdi-rename-outline::before { + content: "\F1C1A"; +} + +.mdi-reorder-horizontal::before { + content: "\F0688"; +} + +.mdi-reorder-vertical::before { + content: "\F0689"; +} + +.mdi-repeat::before { + content: "\F0456"; +} + +.mdi-repeat-off::before { + content: "\F0457"; +} + +.mdi-repeat-once::before { + content: "\F0458"; +} + +.mdi-repeat-variant::before { + content: "\F0547"; +} + +.mdi-replay::before { + content: "\F0459"; +} + +.mdi-reply::before { + content: "\F045A"; +} + +.mdi-reply-all::before { + content: "\F045B"; +} + +.mdi-reply-all-outline::before { + content: "\F0F1F"; +} + +.mdi-reply-circle::before { + content: "\F11AE"; +} + +.mdi-reply-outline::before { + content: "\F0F20"; +} + +.mdi-reproduction::before { + content: "\F045C"; +} + +.mdi-resistor::before { + content: "\F0B44"; +} + +.mdi-resistor-nodes::before { + content: "\F0B45"; +} + +.mdi-resize::before { + content: "\F0A68"; +} + +.mdi-resize-bottom-right::before { + content: "\F045D"; +} + +.mdi-responsive::before { + content: "\F045E"; +} + +.mdi-restart::before { + content: "\F0709"; +} + +.mdi-restart-alert::before { + content: "\F110C"; +} + +.mdi-restart-off::before { + content: "\F0D95"; +} + +.mdi-restore::before { + content: "\F099B"; +} + +.mdi-restore-alert::before { + content: "\F110D"; +} + +.mdi-rewind::before { + content: "\F045F"; +} + +.mdi-rewind-10::before { + content: "\F0D2A"; +} + +.mdi-rewind-15::before { + content: "\F1946"; +} + +.mdi-rewind-30::before { + content: "\F0D96"; +} + +.mdi-rewind-45::before { + content: "\F1B13"; +} + +.mdi-rewind-5::before { + content: "\F11F9"; +} + +.mdi-rewind-60::before { + content: "\F160C"; +} + +.mdi-rewind-outline::before { + content: "\F070A"; +} + +.mdi-rhombus::before { + content: "\F070B"; +} + +.mdi-rhombus-medium::before { + content: "\F0A10"; +} + +.mdi-rhombus-medium-outline::before { + content: "\F14DC"; +} + +.mdi-rhombus-outline::before { + content: "\F070C"; +} + +.mdi-rhombus-split::before { + content: "\F0A11"; +} + +.mdi-rhombus-split-outline::before { + content: "\F14DD"; +} + +.mdi-ribbon::before { + content: "\F0460"; +} + +.mdi-rice::before { + content: "\F07EA"; +} + +.mdi-rickshaw::before { + content: "\F15BB"; +} + +.mdi-rickshaw-electric::before { + content: "\F15BC"; +} + +.mdi-ring::before { + content: "\F07EB"; +} + +.mdi-rivet::before { + content: "\F0E60"; +} + +.mdi-road::before { + content: "\F0461"; +} + +.mdi-road-variant::before { + content: "\F0462"; +} + +.mdi-robber::before { + content: "\F1058"; +} + +.mdi-robot::before { + content: "\F06A9"; +} + +.mdi-robot-angry::before { + content: "\F169D"; +} + +.mdi-robot-angry-outline::before { + content: "\F169E"; +} + +.mdi-robot-confused::before { + content: "\F169F"; +} + +.mdi-robot-confused-outline::before { + content: "\F16A0"; +} + +.mdi-robot-dead::before { + content: "\F16A1"; +} + +.mdi-robot-dead-outline::before { + content: "\F16A2"; +} + +.mdi-robot-excited::before { + content: "\F16A3"; +} + +.mdi-robot-excited-outline::before { + content: "\F16A4"; +} + +.mdi-robot-happy::before { + content: "\F1719"; +} + +.mdi-robot-happy-outline::before { + content: "\F171A"; +} + +.mdi-robot-industrial::before { + content: "\F0B46"; +} + +.mdi-robot-industrial-outline::before { + content: "\F1A1A"; +} + +.mdi-robot-love::before { + content: "\F16A5"; +} + +.mdi-robot-love-outline::before { + content: "\F16A6"; +} + +.mdi-robot-mower::before { + content: "\F11F7"; +} + +.mdi-robot-mower-outline::before { + content: "\F11F3"; +} + +.mdi-robot-off::before { + content: "\F16A7"; +} + +.mdi-robot-off-outline::before { + content: "\F167B"; +} + +.mdi-robot-outline::before { + content: "\F167A"; +} + +.mdi-robot-vacuum::before { + content: "\F070D"; +} + +.mdi-robot-vacuum-alert::before { + content: "\F1B5D"; +} + +.mdi-robot-vacuum-off::before { + content: "\F1C01"; +} + +.mdi-robot-vacuum-variant::before { + content: "\F0908"; +} + +.mdi-robot-vacuum-variant-alert::before { + content: "\F1B5E"; +} + +.mdi-robot-vacuum-variant-off::before { + content: "\F1C02"; +} + +.mdi-rocket::before { + content: "\F0463"; +} + +.mdi-rocket-launch::before { + content: "\F14DE"; +} + +.mdi-rocket-launch-outline::before { + content: "\F14DF"; +} + +.mdi-rocket-outline::before { + content: "\F13AF"; +} + +.mdi-rodent::before { + content: "\F1327"; +} + +.mdi-roller-shade::before { + content: "\F1A6B"; +} + +.mdi-roller-shade-closed::before { + content: "\F1A6C"; +} + +.mdi-roller-skate::before { + content: "\F0D2B"; +} + +.mdi-roller-skate-off::before { + content: "\F0145"; +} + +.mdi-rollerblade::before { + content: "\F0D2C"; +} + +.mdi-rollerblade-off::before { + content: "\F002E"; +} + +.mdi-rollupjs::before { + content: "\F0BC0"; +} + +.mdi-rolodex::before { + content: "\F1AB9"; +} + +.mdi-rolodex-outline::before { + content: "\F1ABA"; +} + +.mdi-roman-numeral-1::before { + content: "\F1088"; +} + +.mdi-roman-numeral-10::before { + content: "\F1091"; +} + +.mdi-roman-numeral-2::before { + content: "\F1089"; +} + +.mdi-roman-numeral-3::before { + content: "\F108A"; +} + +.mdi-roman-numeral-4::before { + content: "\F108B"; +} + +.mdi-roman-numeral-5::before { + content: "\F108C"; +} + +.mdi-roman-numeral-6::before { + content: "\F108D"; +} + +.mdi-roman-numeral-7::before { + content: "\F108E"; +} + +.mdi-roman-numeral-8::before { + content: "\F108F"; +} + +.mdi-roman-numeral-9::before { + content: "\F1090"; +} + +.mdi-room-service::before { + content: "\F088D"; +} + +.mdi-room-service-outline::before { + content: "\F0D97"; +} + +.mdi-rotate-360::before { + content: "\F1999"; +} + +.mdi-rotate-3d::before { + content: "\F0EC7"; +} + +.mdi-rotate-3d-variant::before { + content: "\F0464"; +} + +.mdi-rotate-left::before { + content: "\F0465"; +} + +.mdi-rotate-left-variant::before { + content: "\F0466"; +} + +.mdi-rotate-orbit::before { + content: "\F0D98"; +} + +.mdi-rotate-right::before { + content: "\F0467"; +} + +.mdi-rotate-right-variant::before { + content: "\F0468"; +} + +.mdi-rounded-corner::before { + content: "\F0607"; +} + +.mdi-router::before { + content: "\F11E2"; +} + +.mdi-router-network::before { + content: "\F1087"; +} + +.mdi-router-network-wireless::before { + content: "\F1C97"; +} + +.mdi-router-wireless::before { + content: "\F0469"; +} + +.mdi-router-wireless-off::before { + content: "\F15A3"; +} + +.mdi-router-wireless-settings::before { + content: "\F0A69"; +} + +.mdi-routes::before { + content: "\F046A"; +} + +.mdi-routes-clock::before { + content: "\F1059"; +} + +.mdi-rowing::before { + content: "\F0608"; +} + +.mdi-rss::before { + content: "\F046B"; +} + +.mdi-rss-box::before { + content: "\F046C"; +} + +.mdi-rss-off::before { + content: "\F0F21"; +} + +.mdi-rug::before { + content: "\F1475"; +} + +.mdi-rugby::before { + content: "\F0D99"; +} + +.mdi-ruler::before { + content: "\F046D"; +} + +.mdi-ruler-square::before { + content: "\F0CC2"; +} + +.mdi-ruler-square-compass::before { + content: "\F0EBE"; +} + +.mdi-run::before { + content: "\F070E"; +} + +.mdi-run-fast::before { + content: "\F046E"; +} + +.mdi-rv-truck::before { + content: "\F11D4"; +} + +.mdi-sack::before { + content: "\F0D2E"; +} + +.mdi-sack-outline::before { + content: "\F1C4C"; +} + +.mdi-sack-percent::before { + content: "\F0D2F"; +} + +.mdi-safe::before { + content: "\F0A6A"; +} + +.mdi-safe-square::before { + content: "\F127C"; +} + +.mdi-safe-square-outline::before { + content: "\F127D"; +} + +.mdi-safety-goggles::before { + content: "\F0D30"; +} + +.mdi-sail-boat::before { + content: "\F0EC8"; +} + +.mdi-sail-boat-sink::before { + content: "\F1AEF"; +} + +.mdi-sale::before { + content: "\F046F"; +} + +.mdi-sale-outline::before { + content: "\F1A06"; +} + +.mdi-salesforce::before { + content: "\F088E"; +} + +.mdi-sass::before { + content: "\F07EC"; +} + +.mdi-satellite::before { + content: "\F0470"; +} + +.mdi-satellite-uplink::before { + content: "\F0909"; +} + +.mdi-satellite-variant::before { + content: "\F0471"; +} + +.mdi-sausage::before { + content: "\F08BA"; +} + +.mdi-sausage-off::before { + content: "\F1789"; +} + +.mdi-saw-blade::before { + content: "\F0E61"; +} + +.mdi-sawtooth-wave::before { + content: "\F147A"; +} + +.mdi-saxophone::before { + content: "\F0609"; +} + +.mdi-scale::before { + content: "\F0472"; +} + +.mdi-scale-balance::before { + content: "\F05D1"; +} + +.mdi-scale-bathroom::before { + content: "\F0473"; +} + +.mdi-scale-off::before { + content: "\F105A"; +} + +.mdi-scale-unbalanced::before { + content: "\F19B8"; +} + +.mdi-scan-helper::before { + content: "\F13D8"; +} + +.mdi-scanner::before { + content: "\F06AB"; +} + +.mdi-scanner-off::before { + content: "\F090A"; +} + +.mdi-scatter-plot::before { + content: "\F0EC9"; +} + +.mdi-scatter-plot-outline::before { + content: "\F0ECA"; +} + +.mdi-scent::before { + content: "\F1958"; +} + +.mdi-scent-off::before { + content: "\F1959"; +} + +.mdi-school::before { + content: "\F0474"; +} + +.mdi-school-outline::before { + content: "\F1180"; +} + +.mdi-scissors-cutting::before { + content: "\F0A6B"; +} + +.mdi-scooter::before { + content: "\F15BD"; +} + +.mdi-scooter-electric::before { + content: "\F15BE"; +} + +.mdi-scoreboard::before { + content: "\F127E"; +} + +.mdi-scoreboard-outline::before { + content: "\F127F"; +} + +.mdi-screen-rotation::before { + content: "\F0475"; +} + +.mdi-screen-rotation-lock::before { + content: "\F0478"; +} + +.mdi-screw-flat-top::before { + content: "\F0DF3"; +} + +.mdi-screw-lag::before { + content: "\F0DF4"; +} + +.mdi-screw-machine-flat-top::before { + content: "\F0DF5"; +} + +.mdi-screw-machine-round-top::before { + content: "\F0DF6"; +} + +.mdi-screw-round-top::before { + content: "\F0DF7"; +} + +.mdi-screwdriver::before { + content: "\F0476"; +} + +.mdi-script::before { + content: "\F0BC1"; +} + +.mdi-script-outline::before { + content: "\F0477"; +} + +.mdi-script-text::before { + content: "\F0BC2"; +} + +.mdi-script-text-key::before { + content: "\F1725"; +} + +.mdi-script-text-key-outline::before { + content: "\F1726"; +} + +.mdi-script-text-outline::before { + content: "\F0BC3"; +} + +.mdi-script-text-play::before { + content: "\F1727"; +} + +.mdi-script-text-play-outline::before { + content: "\F1728"; +} + +.mdi-sd::before { + content: "\F0479"; +} + +.mdi-seal::before { + content: "\F047A"; +} + +.mdi-seal-variant::before { + content: "\F0FD9"; +} + +.mdi-search-web::before { + content: "\F070F"; +} + +.mdi-seat::before { + content: "\F0CC3"; +} + +.mdi-seat-flat::before { + content: "\F047B"; +} + +.mdi-seat-flat-angled::before { + content: "\F047C"; +} + +.mdi-seat-individual-suite::before { + content: "\F047D"; +} + +.mdi-seat-legroom-extra::before { + content: "\F047E"; +} + +.mdi-seat-legroom-normal::before { + content: "\F047F"; +} + +.mdi-seat-legroom-reduced::before { + content: "\F0480"; +} + +.mdi-seat-outline::before { + content: "\F0CC4"; +} + +.mdi-seat-passenger::before { + content: "\F1249"; +} + +.mdi-seat-recline-extra::before { + content: "\F0481"; +} + +.mdi-seat-recline-normal::before { + content: "\F0482"; +} + +.mdi-seatbelt::before { + content: "\F0CC5"; +} + +.mdi-security::before { + content: "\F0483"; +} + +.mdi-security-network::before { + content: "\F0484"; +} + +.mdi-seed::before { + content: "\F0E62"; +} + +.mdi-seed-off::before { + content: "\F13FD"; +} + +.mdi-seed-off-outline::before { + content: "\F13FE"; +} + +.mdi-seed-outline::before { + content: "\F0E63"; +} + +.mdi-seed-plus::before { + content: "\F1A6D"; +} + +.mdi-seed-plus-outline::before { + content: "\F1A6E"; +} + +.mdi-seesaw::before { + content: "\F15A4"; +} + +.mdi-segment::before { + content: "\F0ECB"; +} + +.mdi-select::before { + content: "\F0485"; +} + +.mdi-select-all::before { + content: "\F0486"; +} + +.mdi-select-arrow-down::before { + content: "\F1B59"; +} + +.mdi-select-arrow-up::before { + content: "\F1B58"; +} + +.mdi-select-color::before { + content: "\F0D31"; +} + +.mdi-select-compare::before { + content: "\F0AD9"; +} + +.mdi-select-drag::before { + content: "\F0A6C"; +} + +.mdi-select-group::before { + content: "\F0F82"; +} + +.mdi-select-inverse::before { + content: "\F0487"; +} + +.mdi-select-marker::before { + content: "\F1280"; +} + +.mdi-select-multiple::before { + content: "\F1281"; +} + +.mdi-select-multiple-marker::before { + content: "\F1282"; +} + +.mdi-select-off::before { + content: "\F0488"; +} + +.mdi-select-place::before { + content: "\F0FDA"; +} + +.mdi-select-remove::before { + content: "\F17C1"; +} + +.mdi-select-search::before { + content: "\F1204"; +} + +.mdi-selection::before { + content: "\F0489"; +} + +.mdi-selection-drag::before { + content: "\F0A6D"; +} + +.mdi-selection-ellipse::before { + content: "\F0D32"; +} + +.mdi-selection-ellipse-arrow-inside::before { + content: "\F0F22"; +} + +.mdi-selection-ellipse-remove::before { + content: "\F17C2"; +} + +.mdi-selection-marker::before { + content: "\F1283"; +} + +.mdi-selection-multiple::before { + content: "\F1285"; +} + +.mdi-selection-multiple-marker::before { + content: "\F1284"; +} + +.mdi-selection-off::before { + content: "\F0777"; +} + +.mdi-selection-remove::before { + content: "\F17C3"; +} + +.mdi-selection-search::before { + content: "\F1205"; +} + +.mdi-semantic-web::before { + content: "\F1316"; +} + +.mdi-send::before { + content: "\F048A"; +} + +.mdi-send-check::before { + content: "\F1161"; +} + +.mdi-send-check-outline::before { + content: "\F1162"; +} + +.mdi-send-circle::before { + content: "\F0DF8"; +} + +.mdi-send-circle-outline::before { + content: "\F0DF9"; +} + +.mdi-send-clock::before { + content: "\F1163"; +} + +.mdi-send-clock-outline::before { + content: "\F1164"; +} + +.mdi-send-lock::before { + content: "\F07ED"; +} + +.mdi-send-lock-outline::before { + content: "\F1166"; +} + +.mdi-send-outline::before { + content: "\F1165"; +} + +.mdi-send-variant::before { + content: "\F1C4D"; +} + +.mdi-send-variant-clock::before { + content: "\F1C7E"; +} + +.mdi-send-variant-clock-outline::before { + content: "\F1C7F"; +} + +.mdi-send-variant-outline::before { + content: "\F1C4E"; +} + +.mdi-serial-port::before { + content: "\F065C"; +} + +.mdi-server::before { + content: "\F048B"; +} + +.mdi-server-minus::before { + content: "\F048C"; +} + +.mdi-server-minus-outline::before { + content: "\F1C98"; +} + +.mdi-server-network::before { + content: "\F048D"; +} + +.mdi-server-network-off::before { + content: "\F048E"; +} + +.mdi-server-network-outline::before { + content: "\F1C99"; +} + +.mdi-server-off::before { + content: "\F048F"; +} + +.mdi-server-outline::before { + content: "\F1C9A"; +} + +.mdi-server-plus::before { + content: "\F0490"; +} + +.mdi-server-plus-outline::before { + content: "\F1C9B"; +} + +.mdi-server-remove::before { + content: "\F0491"; +} + +.mdi-server-security::before { + content: "\F0492"; +} + +.mdi-set-all::before { + content: "\F0778"; +} + +.mdi-set-center::before { + content: "\F0779"; +} + +.mdi-set-center-right::before { + content: "\F077A"; +} + +.mdi-set-left::before { + content: "\F077B"; +} + +.mdi-set-left-center::before { + content: "\F077C"; +} + +.mdi-set-left-right::before { + content: "\F077D"; +} + +.mdi-set-merge::before { + content: "\F14E0"; +} + +.mdi-set-none::before { + content: "\F077E"; +} + +.mdi-set-right::before { + content: "\F077F"; +} + +.mdi-set-split::before { + content: "\F14E1"; +} + +.mdi-set-square::before { + content: "\F145D"; +} + +.mdi-set-top-box::before { + content: "\F099F"; +} + +.mdi-settings-helper::before { + content: "\F0A6E"; +} + +.mdi-shaker::before { + content: "\F110E"; +} + +.mdi-shaker-outline::before { + content: "\F110F"; +} + +.mdi-shape::before { + content: "\F0831"; +} + +.mdi-shape-circle-plus::before { + content: "\F065D"; +} + +.mdi-shape-outline::before { + content: "\F0832"; +} + +.mdi-shape-oval-plus::before { + content: "\F11FA"; +} + +.mdi-shape-plus::before { + content: "\F0495"; +} + +.mdi-shape-plus-outline::before { + content: "\F1C4F"; +} + +.mdi-shape-polygon-plus::before { + content: "\F065E"; +} + +.mdi-shape-rectangle-plus::before { + content: "\F065F"; +} + +.mdi-shape-square-plus::before { + content: "\F0660"; +} + +.mdi-shape-square-rounded-plus::before { + content: "\F14FA"; +} + +.mdi-share::before { + content: "\F0496"; +} + +.mdi-share-all::before { + content: "\F11F4"; +} + +.mdi-share-all-outline::before { + content: "\F11F5"; +} + +.mdi-share-circle::before { + content: "\F11AD"; +} + +.mdi-share-off::before { + content: "\F0F23"; +} + +.mdi-share-off-outline::before { + content: "\F0F24"; +} + +.mdi-share-outline::before { + content: "\F0932"; +} + +.mdi-share-variant::before { + content: "\F0497"; +} + +.mdi-share-variant-outline::before { + content: "\F1514"; +} + +.mdi-shark::before { + content: "\F18BA"; +} + +.mdi-shark-fin::before { + content: "\F1673"; +} + +.mdi-shark-fin-outline::before { + content: "\F1674"; +} + +.mdi-shark-off::before { + content: "\F18BB"; +} + +.mdi-sheep::before { + content: "\F0CC6"; +} + +.mdi-shield::before { + content: "\F0498"; +} + +.mdi-shield-account::before { + content: "\F088F"; +} + +.mdi-shield-account-outline::before { + content: "\F0A12"; +} + +.mdi-shield-account-variant::before { + content: "\F15A7"; +} + +.mdi-shield-account-variant-outline::before { + content: "\F15A8"; +} + +.mdi-shield-airplane::before { + content: "\F06BB"; +} + +.mdi-shield-airplane-outline::before { + content: "\F0CC7"; +} + +.mdi-shield-alert::before { + content: "\F0ECC"; +} + +.mdi-shield-alert-outline::before { + content: "\F0ECD"; +} + +.mdi-shield-bug::before { + content: "\F13DA"; +} + +.mdi-shield-bug-outline::before { + content: "\F13DB"; +} + +.mdi-shield-car::before { + content: "\F0F83"; +} + +.mdi-shield-check::before { + content: "\F0565"; +} + +.mdi-shield-check-outline::before { + content: "\F0CC8"; +} + +.mdi-shield-cross::before { + content: "\F0CC9"; +} + +.mdi-shield-cross-outline::before { + content: "\F0CCA"; +} + +.mdi-shield-crown::before { + content: "\F18BC"; +} + +.mdi-shield-crown-outline::before { + content: "\F18BD"; +} + +.mdi-shield-edit::before { + content: "\F11A0"; +} + +.mdi-shield-edit-outline::before { + content: "\F11A1"; +} + +.mdi-shield-half::before { + content: "\F1360"; +} + +.mdi-shield-half-full::before { + content: "\F0780"; +} + +.mdi-shield-home::before { + content: "\F068A"; +} + +.mdi-shield-home-outline::before { + content: "\F0CCB"; +} + +.mdi-shield-key::before { + content: "\F0BC4"; +} + +.mdi-shield-key-outline::before { + content: "\F0BC5"; +} + +.mdi-shield-link-variant::before { + content: "\F0D33"; +} + +.mdi-shield-link-variant-outline::before { + content: "\F0D34"; +} + +.mdi-shield-lock::before { + content: "\F099D"; +} + +.mdi-shield-lock-open::before { + content: "\F199A"; +} + +.mdi-shield-lock-open-outline::before { + content: "\F199B"; +} + +.mdi-shield-lock-outline::before { + content: "\F0CCC"; +} + +.mdi-shield-moon::before { + content: "\F1828"; +} + +.mdi-shield-moon-outline::before { + content: "\F1829"; +} + +.mdi-shield-off::before { + content: "\F099E"; +} + +.mdi-shield-off-outline::before { + content: "\F099C"; +} + +.mdi-shield-outline::before { + content: "\F0499"; +} + +.mdi-shield-plus::before { + content: "\F0ADA"; +} + +.mdi-shield-plus-outline::before { + content: "\F0ADB"; +} + +.mdi-shield-refresh::before { + content: "\F00AA"; +} + +.mdi-shield-refresh-outline::before { + content: "\F01E0"; +} + +.mdi-shield-remove::before { + content: "\F0ADC"; +} + +.mdi-shield-remove-outline::before { + content: "\F0ADD"; +} + +.mdi-shield-search::before { + content: "\F0D9A"; +} + +.mdi-shield-star::before { + content: "\F113B"; +} + +.mdi-shield-star-outline::before { + content: "\F113C"; +} + +.mdi-shield-sun::before { + content: "\F105D"; +} + +.mdi-shield-sun-outline::before { + content: "\F105E"; +} + +.mdi-shield-sword::before { + content: "\F18BE"; +} + +.mdi-shield-sword-outline::before { + content: "\F18BF"; +} + +.mdi-shield-sync::before { + content: "\F11A2"; +} + +.mdi-shield-sync-outline::before { + content: "\F11A3"; +} + +.mdi-shimmer::before { + content: "\F1545"; +} + +.mdi-ship-wheel::before { + content: "\F0833"; +} + +.mdi-shipping-pallet::before { + content: "\F184E"; +} + +.mdi-shoe-ballet::before { + content: "\F15CA"; +} + +.mdi-shoe-cleat::before { + content: "\F15C7"; +} + +.mdi-shoe-formal::before { + content: "\F0B47"; +} + +.mdi-shoe-heel::before { + content: "\F0B48"; +} + +.mdi-shoe-print::before { + content: "\F0DFA"; +} + +.mdi-shoe-sneaker::before { + content: "\F15C8"; +} + +.mdi-shopping::before { + content: "\F049A"; +} + +.mdi-shopping-music::before { + content: "\F049B"; +} + +.mdi-shopping-outline::before { + content: "\F11D5"; +} + +.mdi-shopping-search::before { + content: "\F0F84"; +} + +.mdi-shopping-search-outline::before { + content: "\F1A6F"; +} + +.mdi-shore::before { + content: "\F14F9"; +} + +.mdi-shovel::before { + content: "\F0710"; +} + +.mdi-shovel-off::before { + content: "\F0711"; +} + +.mdi-shower::before { + content: "\F09A0"; +} + +.mdi-shower-head::before { + content: "\F09A1"; +} + +.mdi-shredder::before { + content: "\F049C"; +} + +.mdi-shuffle::before { + content: "\F049D"; +} + +.mdi-shuffle-disabled::before { + content: "\F049E"; +} + +.mdi-shuffle-variant::before { + content: "\F049F"; +} + +.mdi-shuriken::before { + content: "\F137F"; +} + +.mdi-sickle::before { + content: "\F18C0"; +} + +.mdi-sigma::before { + content: "\F04A0"; +} + +.mdi-sigma-lower::before { + content: "\F062B"; +} + +.mdi-sign-caution::before { + content: "\F04A1"; +} + +.mdi-sign-direction::before { + content: "\F0781"; +} + +.mdi-sign-direction-minus::before { + content: "\F1000"; +} + +.mdi-sign-direction-plus::before { + content: "\F0FDC"; +} + +.mdi-sign-direction-remove::before { + content: "\F0FDD"; +} + +.mdi-sign-language::before { + content: "\F1B4D"; +} + +.mdi-sign-language-outline::before { + content: "\F1B4E"; +} + +.mdi-sign-pole::before { + content: "\F14F8"; +} + +.mdi-sign-real-estate::before { + content: "\F1118"; +} + +.mdi-sign-text::before { + content: "\F0782"; +} + +.mdi-sign-yield::before { + content: "\F1BAF"; +} + +.mdi-signal::before { + content: "\F04A2"; +} + +.mdi-signal-2g::before { + content: "\F0712"; +} + +.mdi-signal-3g::before { + content: "\F0713"; +} + +.mdi-signal-4g::before { + content: "\F0714"; +} + +.mdi-signal-5g::before { + content: "\F0A6F"; +} + +.mdi-signal-cellular-1::before { + content: "\F08BC"; +} + +.mdi-signal-cellular-2::before { + content: "\F08BD"; +} + +.mdi-signal-cellular-3::before { + content: "\F08BE"; +} + +.mdi-signal-cellular-outline::before { + content: "\F08BF"; +} + +.mdi-signal-distance-variant::before { + content: "\F0E64"; +} + +.mdi-signal-hspa::before { + content: "\F0715"; +} + +.mdi-signal-hspa-plus::before { + content: "\F0716"; +} + +.mdi-signal-off::before { + content: "\F0783"; +} + +.mdi-signal-variant::before { + content: "\F060A"; +} + +.mdi-signature::before { + content: "\F0DFB"; +} + +.mdi-signature-freehand::before { + content: "\F0DFC"; +} + +.mdi-signature-image::before { + content: "\F0DFD"; +} + +.mdi-signature-text::before { + content: "\F0DFE"; +} + +.mdi-silo::before { + content: "\F1B9F"; +} + +.mdi-silo-outline::before { + content: "\F0B49"; +} + +.mdi-silverware::before { + content: "\F04A3"; +} + +.mdi-silverware-clean::before { + content: "\F0FDE"; +} + +.mdi-silverware-fork::before { + content: "\F04A4"; +} + +.mdi-silverware-fork-knife::before { + content: "\F0A70"; +} + +.mdi-silverware-spoon::before { + content: "\F04A5"; +} + +.mdi-silverware-variant::before { + content: "\F04A6"; +} + +.mdi-sim::before { + content: "\F04A7"; +} + +.mdi-sim-alert::before { + content: "\F04A8"; +} + +.mdi-sim-alert-outline::before { + content: "\F15D3"; +} + +.mdi-sim-off::before { + content: "\F04A9"; +} + +.mdi-sim-off-outline::before { + content: "\F15D4"; +} + +.mdi-sim-outline::before { + content: "\F15D5"; +} + +.mdi-simple-icons::before { + content: "\F131D"; +} + +.mdi-sina-weibo::before { + content: "\F0ADF"; +} + +.mdi-sine-wave::before { + content: "\F095B"; +} + +.mdi-sitemap::before { + content: "\F04AA"; +} + +.mdi-sitemap-outline::before { + content: "\F199C"; +} + +.mdi-size-l::before { + content: "\F13A6"; +} + +.mdi-size-m::before { + content: "\F13A5"; +} + +.mdi-size-s::before { + content: "\F13A4"; +} + +.mdi-size-xl::before { + content: "\F13A7"; +} + +.mdi-size-xs::before { + content: "\F13A3"; +} + +.mdi-size-xxl::before { + content: "\F13A8"; +} + +.mdi-size-xxs::before { + content: "\F13A2"; +} + +.mdi-size-xxxl::before { + content: "\F13A9"; +} + +.mdi-skate::before { + content: "\F0D35"; +} + +.mdi-skate-off::before { + content: "\F0699"; +} + +.mdi-skateboard::before { + content: "\F14C2"; +} + +.mdi-skateboarding::before { + content: "\F0501"; +} + +.mdi-skew-less::before { + content: "\F0D36"; +} + +.mdi-skew-more::before { + content: "\F0D37"; +} + +.mdi-ski::before { + content: "\F1304"; +} + +.mdi-ski-cross-country::before { + content: "\F1305"; +} + +.mdi-ski-water::before { + content: "\F1306"; +} + +.mdi-skip-backward::before { + content: "\F04AB"; +} + +.mdi-skip-backward-outline::before { + content: "\F0F25"; +} + +.mdi-skip-forward::before { + content: "\F04AC"; +} + +.mdi-skip-forward-outline::before { + content: "\F0F26"; +} + +.mdi-skip-next::before { + content: "\F04AD"; +} + +.mdi-skip-next-circle::before { + content: "\F0661"; +} + +.mdi-skip-next-circle-outline::before { + content: "\F0662"; +} + +.mdi-skip-next-outline::before { + content: "\F0F27"; +} + +.mdi-skip-previous::before { + content: "\F04AE"; +} + +.mdi-skip-previous-circle::before { + content: "\F0663"; +} + +.mdi-skip-previous-circle-outline::before { + content: "\F0664"; +} + +.mdi-skip-previous-outline::before { + content: "\F0F28"; +} + +.mdi-skull::before { + content: "\F068C"; +} + +.mdi-skull-crossbones::before { + content: "\F0BC6"; +} + +.mdi-skull-crossbones-outline::before { + content: "\F0BC7"; +} + +.mdi-skull-outline::before { + content: "\F0BC8"; +} + +.mdi-skull-scan::before { + content: "\F14C7"; +} + +.mdi-skull-scan-outline::before { + content: "\F14C8"; +} + +.mdi-skype::before { + content: "\F04AF"; +} + +.mdi-skype-business::before { + content: "\F04B0"; +} + +.mdi-slack::before { + content: "\F04B1"; +} + +.mdi-slash-forward::before { + content: "\F0FDF"; +} + +.mdi-slash-forward-box::before { + content: "\F0FE0"; +} + +.mdi-sledding::before { + content: "\F041B"; +} + +.mdi-sleep::before { + content: "\F04B2"; +} + +.mdi-sleep-off::before { + content: "\F04B3"; +} + +.mdi-slide::before { + content: "\F15A5"; +} + +.mdi-slope-downhill::before { + content: "\F0DFF"; +} + +.mdi-slope-uphill::before { + content: "\F0E00"; +} + +.mdi-slot-machine::before { + content: "\F1114"; +} + +.mdi-slot-machine-outline::before { + content: "\F1115"; +} + +.mdi-smart-card::before { + content: "\F10BD"; +} + +.mdi-smart-card-off::before { + content: "\F18F7"; +} + +.mdi-smart-card-off-outline::before { + content: "\F18F8"; +} + +.mdi-smart-card-outline::before { + content: "\F10BE"; +} + +.mdi-smart-card-reader::before { + content: "\F10BF"; +} + +.mdi-smart-card-reader-outline::before { + content: "\F10C0"; +} + +.mdi-smog::before { + content: "\F0A71"; +} + +.mdi-smoke::before { + content: "\F1799"; +} + +.mdi-smoke-detector::before { + content: "\F0392"; +} + +.mdi-smoke-detector-alert::before { + content: "\F192E"; +} + +.mdi-smoke-detector-alert-outline::before { + content: "\F192F"; +} + +.mdi-smoke-detector-off::before { + content: "\F1809"; +} + +.mdi-smoke-detector-off-outline::before { + content: "\F180A"; +} + +.mdi-smoke-detector-outline::before { + content: "\F1808"; +} + +.mdi-smoke-detector-variant::before { + content: "\F180B"; +} + +.mdi-smoke-detector-variant-alert::before { + content: "\F1930"; +} + +.mdi-smoke-detector-variant-off::before { + content: "\F180C"; +} + +.mdi-smoking::before { + content: "\F04B4"; +} + +.mdi-smoking-off::before { + content: "\F04B5"; +} + +.mdi-smoking-pipe::before { + content: "\F140D"; +} + +.mdi-smoking-pipe-off::before { + content: "\F1428"; +} + +.mdi-snail::before { + content: "\F1677"; +} + +.mdi-snake::before { + content: "\F150E"; +} + +.mdi-snapchat::before { + content: "\F04B6"; +} + +.mdi-snowboard::before { + content: "\F1307"; +} + +.mdi-snowflake::before { + content: "\F0717"; +} + +.mdi-snowflake-alert::before { + content: "\F0F29"; +} + +.mdi-snowflake-check::before { + content: "\F1A70"; +} + +.mdi-snowflake-melt::before { + content: "\F12CB"; +} + +.mdi-snowflake-off::before { + content: "\F14E3"; +} + +.mdi-snowflake-thermometer::before { + content: "\F1A71"; +} + +.mdi-snowflake-variant::before { + content: "\F0F2A"; +} + +.mdi-snowman::before { + content: "\F04B7"; +} + +.mdi-snowmobile::before { + content: "\F06DD"; +} + +.mdi-snowshoeing::before { + content: "\F1A72"; +} + +.mdi-soccer::before { + content: "\F04B8"; +} + +.mdi-soccer-field::before { + content: "\F0834"; +} + +.mdi-social-distance-2-meters::before { + content: "\F1579"; +} + +.mdi-social-distance-6-feet::before { + content: "\F157A"; +} + +.mdi-sofa::before { + content: "\F04B9"; +} + +.mdi-sofa-outline::before { + content: "\F156D"; +} + +.mdi-sofa-single::before { + content: "\F156E"; +} + +.mdi-sofa-single-outline::before { + content: "\F156F"; +} + +.mdi-solar-panel::before { + content: "\F0D9B"; +} + +.mdi-solar-panel-large::before { + content: "\F0D9C"; +} + +.mdi-solar-power::before { + content: "\F0A72"; +} + +.mdi-solar-power-variant::before { + content: "\F1A73"; +} + +.mdi-solar-power-variant-outline::before { + content: "\F1A74"; +} + +.mdi-soldering-iron::before { + content: "\F1092"; +} + +.mdi-solid::before { + content: "\F068D"; +} + +.mdi-sony-playstation::before { + content: "\F0414"; +} + +.mdi-sort::before { + content: "\F04BA"; +} + +.mdi-sort-alphabetical-ascending::before { + content: "\F05BD"; +} + +.mdi-sort-alphabetical-ascending-variant::before { + content: "\F1148"; +} + +.mdi-sort-alphabetical-descending::before { + content: "\F05BF"; +} + +.mdi-sort-alphabetical-descending-variant::before { + content: "\F1149"; +} + +.mdi-sort-alphabetical-variant::before { + content: "\F04BB"; +} + +.mdi-sort-ascending::before { + content: "\F04BC"; +} + +.mdi-sort-bool-ascending::before { + content: "\F1385"; +} + +.mdi-sort-bool-ascending-variant::before { + content: "\F1386"; +} + +.mdi-sort-bool-descending::before { + content: "\F1387"; +} + +.mdi-sort-bool-descending-variant::before { + content: "\F1388"; +} + +.mdi-sort-calendar-ascending::before { + content: "\F1547"; +} + +.mdi-sort-calendar-descending::before { + content: "\F1548"; +} + +.mdi-sort-clock-ascending::before { + content: "\F1549"; +} + +.mdi-sort-clock-ascending-outline::before { + content: "\F154A"; +} + +.mdi-sort-clock-descending::before { + content: "\F154B"; +} + +.mdi-sort-clock-descending-outline::before { + content: "\F154C"; +} + +.mdi-sort-descending::before { + content: "\F04BD"; +} + +.mdi-sort-numeric-ascending::before { + content: "\F1389"; +} + +.mdi-sort-numeric-ascending-variant::before { + content: "\F090D"; +} + +.mdi-sort-numeric-descending::before { + content: "\F138A"; +} + +.mdi-sort-numeric-descending-variant::before { + content: "\F0AD2"; +} + +.mdi-sort-numeric-variant::before { + content: "\F04BE"; +} + +.mdi-sort-reverse-variant::before { + content: "\F033C"; +} + +.mdi-sort-variant::before { + content: "\F04BF"; +} + +.mdi-sort-variant-lock::before { + content: "\F0CCD"; +} + +.mdi-sort-variant-lock-open::before { + content: "\F0CCE"; +} + +.mdi-sort-variant-off::before { + content: "\F1ABB"; +} + +.mdi-sort-variant-remove::before { + content: "\F1147"; +} + +.mdi-soundbar::before { + content: "\F17DB"; +} + +.mdi-soundcloud::before { + content: "\F04C0"; +} + +.mdi-source-branch::before { + content: "\F062C"; +} + +.mdi-source-branch-check::before { + content: "\F14CF"; +} + +.mdi-source-branch-minus::before { + content: "\F14CB"; +} + +.mdi-source-branch-plus::before { + content: "\F14CA"; +} + +.mdi-source-branch-refresh::before { + content: "\F14CD"; +} + +.mdi-source-branch-remove::before { + content: "\F14CC"; +} + +.mdi-source-branch-sync::before { + content: "\F14CE"; +} + +.mdi-source-commit::before { + content: "\F0718"; +} + +.mdi-source-commit-end::before { + content: "\F0719"; +} + +.mdi-source-commit-end-local::before { + content: "\F071A"; +} + +.mdi-source-commit-local::before { + content: "\F071B"; +} + +.mdi-source-commit-next-local::before { + content: "\F071C"; +} + +.mdi-source-commit-start::before { + content: "\F071D"; +} + +.mdi-source-commit-start-next-local::before { + content: "\F071E"; +} + +.mdi-source-fork::before { + content: "\F04C1"; +} + +.mdi-source-merge::before { + content: "\F062D"; +} + +.mdi-source-pull::before { + content: "\F04C2"; +} + +.mdi-source-repository::before { + content: "\F0CCF"; +} + +.mdi-source-repository-multiple::before { + content: "\F0CD0"; +} + +.mdi-soy-sauce::before { + content: "\F07EE"; +} + +.mdi-soy-sauce-off::before { + content: "\F13FC"; +} + +.mdi-spa::before { + content: "\F0CD1"; +} + +.mdi-spa-outline::before { + content: "\F0CD2"; +} + +.mdi-space-invaders::before { + content: "\F0BC9"; +} + +.mdi-space-station::before { + content: "\F1383"; +} + +.mdi-spade::before { + content: "\F0E65"; +} + +.mdi-speaker::before { + content: "\F04C3"; +} + +.mdi-speaker-bluetooth::before { + content: "\F09A2"; +} + +.mdi-speaker-message::before { + content: "\F1B11"; +} + +.mdi-speaker-multiple::before { + content: "\F0D38"; +} + +.mdi-speaker-off::before { + content: "\F04C4"; +} + +.mdi-speaker-pause::before { + content: "\F1B73"; +} + +.mdi-speaker-play::before { + content: "\F1B72"; +} + +.mdi-speaker-stop::before { + content: "\F1B74"; +} + +.mdi-speaker-wireless::before { + content: "\F071F"; +} + +.mdi-spear::before { + content: "\F1845"; +} + +.mdi-speedometer::before { + content: "\F04C5"; +} + +.mdi-speedometer-medium::before { + content: "\F0F85"; +} + +.mdi-speedometer-slow::before { + content: "\F0F86"; +} + +.mdi-spellcheck::before { + content: "\F04C6"; +} + +.mdi-sphere::before { + content: "\F1954"; +} + +.mdi-sphere-off::before { + content: "\F1955"; +} + +.mdi-spider::before { + content: "\F11EA"; +} + +.mdi-spider-outline::before { + content: "\F1C75"; +} + +.mdi-spider-thread::before { + content: "\F11EB"; +} + +.mdi-spider-web::before { + content: "\F0BCA"; +} + +.mdi-spirit-level::before { + content: "\F14F1"; +} + +.mdi-spoon-sugar::before { + content: "\F1429"; +} + +.mdi-spotify::before { + content: "\F04C7"; +} + +.mdi-spotlight::before { + content: "\F04C8"; +} + +.mdi-spotlight-beam::before { + content: "\F04C9"; +} + +.mdi-spray::before { + content: "\F0665"; +} + +.mdi-spray-bottle::before { + content: "\F0AE0"; +} + +.mdi-sprinkler::before { + content: "\F105F"; +} + +.mdi-sprinkler-fire::before { + content: "\F199D"; +} + +.mdi-sprinkler-variant::before { + content: "\F1060"; +} + +.mdi-sprout::before { + content: "\F0E66"; +} + +.mdi-sprout-outline::before { + content: "\F0E67"; +} + +.mdi-square::before { + content: "\F0764"; +} + +.mdi-square-circle::before { + content: "\F1500"; +} + +.mdi-square-circle-outline::before { + content: "\F1C50"; +} + +.mdi-square-edit-outline::before { + content: "\F090C"; +} + +.mdi-square-medium::before { + content: "\F0A13"; +} + +.mdi-square-medium-outline::before { + content: "\F0A14"; +} + +.mdi-square-off::before { + content: "\F12EE"; +} + +.mdi-square-off-outline::before { + content: "\F12EF"; +} + +.mdi-square-opacity::before { + content: "\F1854"; +} + +.mdi-square-outline::before { + content: "\F0763"; +} + +.mdi-square-root::before { + content: "\F0784"; +} + +.mdi-square-root-box::before { + content: "\F09A3"; +} + +.mdi-square-rounded::before { + content: "\F14FB"; +} + +.mdi-square-rounded-badge::before { + content: "\F1A07"; +} + +.mdi-square-rounded-badge-outline::before { + content: "\F1A08"; +} + +.mdi-square-rounded-outline::before { + content: "\F14FC"; +} + +.mdi-square-small::before { + content: "\F0A15"; +} + +.mdi-square-wave::before { + content: "\F147B"; +} + +.mdi-squeegee::before { + content: "\F0AE1"; +} + +.mdi-ssh::before { + content: "\F08C0"; +} + +.mdi-stack-exchange::before { + content: "\F060B"; +} + +.mdi-stack-overflow::before { + content: "\F04CC"; +} + +.mdi-stackpath::before { + content: "\F0359"; +} + +.mdi-stadium::before { + content: "\F0FF9"; +} + +.mdi-stadium-outline::before { + content: "\F1B03"; +} + +.mdi-stadium-variant::before { + content: "\F0720"; +} + +.mdi-stairs::before { + content: "\F04CD"; +} + +.mdi-stairs-box::before { + content: "\F139E"; +} + +.mdi-stairs-down::before { + content: "\F12BE"; +} + +.mdi-stairs-up::before { + content: "\F12BD"; +} + +.mdi-stamper::before { + content: "\F0D39"; +} + +.mdi-standard-definition::before { + content: "\F07EF"; +} + +.mdi-star::before { + content: "\F04CE"; +} + +.mdi-star-box::before { + content: "\F0A73"; +} + +.mdi-star-box-multiple::before { + content: "\F1286"; +} + +.mdi-star-box-multiple-outline::before { + content: "\F1287"; +} + +.mdi-star-box-outline::before { + content: "\F0A74"; +} + +.mdi-star-check::before { + content: "\F1566"; +} + +.mdi-star-check-outline::before { + content: "\F156A"; +} + +.mdi-star-circle::before { + content: "\F04CF"; +} + +.mdi-star-circle-outline::before { + content: "\F09A4"; +} + +.mdi-star-cog::before { + content: "\F1668"; +} + +.mdi-star-cog-outline::before { + content: "\F1669"; +} + +.mdi-star-crescent::before { + content: "\F0979"; +} + +.mdi-star-david::before { + content: "\F097A"; +} + +.mdi-star-face::before { + content: "\F09A5"; +} + +.mdi-star-four-points::before { + content: "\F0AE2"; +} + +.mdi-star-four-points-box::before { + content: "\F1C51"; +} + +.mdi-star-four-points-box-outline::before { + content: "\F1C52"; +} + +.mdi-star-four-points-circle::before { + content: "\F1C53"; +} + +.mdi-star-four-points-circle-outline::before { + content: "\F1C54"; +} + +.mdi-star-four-points-outline::before { + content: "\F0AE3"; +} + +.mdi-star-four-points-small::before { + content: "\F1C55"; +} + +.mdi-star-half::before { + content: "\F0246"; +} + +.mdi-star-half-full::before { + content: "\F04D0"; +} + +.mdi-star-minus::before { + content: "\F1564"; +} + +.mdi-star-minus-outline::before { + content: "\F1568"; +} + +.mdi-star-off::before { + content: "\F04D1"; +} + +.mdi-star-off-outline::before { + content: "\F155B"; +} + +.mdi-star-outline::before { + content: "\F04D2"; +} + +.mdi-star-plus::before { + content: "\F1563"; +} + +.mdi-star-plus-outline::before { + content: "\F1567"; +} + +.mdi-star-remove::before { + content: "\F1565"; +} + +.mdi-star-remove-outline::before { + content: "\F1569"; +} + +.mdi-star-settings::before { + content: "\F166A"; +} + +.mdi-star-settings-outline::before { + content: "\F166B"; +} + +.mdi-star-shooting::before { + content: "\F1741"; +} + +.mdi-star-shooting-outline::before { + content: "\F1742"; +} + +.mdi-star-three-points::before { + content: "\F0AE4"; +} + +.mdi-star-three-points-outline::before { + content: "\F0AE5"; +} + +.mdi-state-machine::before { + content: "\F11EF"; +} + +.mdi-steam::before { + content: "\F04D3"; +} + +.mdi-steering::before { + content: "\F04D4"; +} + +.mdi-steering-off::before { + content: "\F090E"; +} + +.mdi-step-backward::before { + content: "\F04D5"; +} + +.mdi-step-backward-2::before { + content: "\F04D6"; +} + +.mdi-step-forward::before { + content: "\F04D7"; +} + +.mdi-step-forward-2::before { + content: "\F04D8"; +} + +.mdi-stethoscope::before { + content: "\F04D9"; +} + +.mdi-sticker::before { + content: "\F1364"; +} + +.mdi-sticker-alert::before { + content: "\F1365"; +} + +.mdi-sticker-alert-outline::before { + content: "\F1366"; +} + +.mdi-sticker-check::before { + content: "\F1367"; +} + +.mdi-sticker-check-outline::before { + content: "\F1368"; +} + +.mdi-sticker-circle-outline::before { + content: "\F05D0"; +} + +.mdi-sticker-emoji::before { + content: "\F0785"; +} + +.mdi-sticker-minus::before { + content: "\F1369"; +} + +.mdi-sticker-minus-outline::before { + content: "\F136A"; +} + +.mdi-sticker-outline::before { + content: "\F136B"; +} + +.mdi-sticker-plus::before { + content: "\F136C"; +} + +.mdi-sticker-plus-outline::before { + content: "\F136D"; +} + +.mdi-sticker-remove::before { + content: "\F136E"; +} + +.mdi-sticker-remove-outline::before { + content: "\F136F"; +} + +.mdi-sticker-text::before { + content: "\F178E"; +} + +.mdi-sticker-text-outline::before { + content: "\F178F"; +} + +.mdi-stocking::before { + content: "\F04DA"; +} + +.mdi-stomach::before { + content: "\F1093"; +} + +.mdi-stool::before { + content: "\F195D"; +} + +.mdi-stool-outline::before { + content: "\F195E"; +} + +.mdi-stop::before { + content: "\F04DB"; +} + +.mdi-stop-circle::before { + content: "\F0666"; +} + +.mdi-stop-circle-outline::before { + content: "\F0667"; +} + +.mdi-storage-tank::before { + content: "\F1A75"; +} + +.mdi-storage-tank-outline::before { + content: "\F1A76"; +} + +.mdi-store::before { + content: "\F04DC"; +} + +.mdi-store-24-hour::before { + content: "\F04DD"; +} + +.mdi-store-alert::before { + content: "\F18C1"; +} + +.mdi-store-alert-outline::before { + content: "\F18C2"; +} + +.mdi-store-check::before { + content: "\F18C3"; +} + +.mdi-store-check-outline::before { + content: "\F18C4"; +} + +.mdi-store-clock::before { + content: "\F18C5"; +} + +.mdi-store-clock-outline::before { + content: "\F18C6"; +} + +.mdi-store-cog::before { + content: "\F18C7"; +} + +.mdi-store-cog-outline::before { + content: "\F18C8"; +} + +.mdi-store-edit::before { + content: "\F18C9"; +} + +.mdi-store-edit-outline::before { + content: "\F18CA"; +} + +.mdi-store-marker::before { + content: "\F18CB"; +} + +.mdi-store-marker-outline::before { + content: "\F18CC"; +} + +.mdi-store-minus::before { + content: "\F165E"; +} + +.mdi-store-minus-outline::before { + content: "\F18CD"; +} + +.mdi-store-off::before { + content: "\F18CE"; +} + +.mdi-store-off-outline::before { + content: "\F18CF"; +} + +.mdi-store-outline::before { + content: "\F1361"; +} + +.mdi-store-plus::before { + content: "\F165F"; +} + +.mdi-store-plus-outline::before { + content: "\F18D0"; +} + +.mdi-store-remove::before { + content: "\F1660"; +} + +.mdi-store-remove-outline::before { + content: "\F18D1"; +} + +.mdi-store-search::before { + content: "\F18D2"; +} + +.mdi-store-search-outline::before { + content: "\F18D3"; +} + +.mdi-store-settings::before { + content: "\F18D4"; +} + +.mdi-store-settings-outline::before { + content: "\F18D5"; +} + +.mdi-storefront::before { + content: "\F07C7"; +} + +.mdi-storefront-check::before { + content: "\F1B7D"; +} + +.mdi-storefront-check-outline::before { + content: "\F1B7E"; +} + +.mdi-storefront-edit::before { + content: "\F1B7F"; +} + +.mdi-storefront-edit-outline::before { + content: "\F1B80"; +} + +.mdi-storefront-minus::before { + content: "\F1B83"; +} + +.mdi-storefront-minus-outline::before { + content: "\F1B84"; +} + +.mdi-storefront-outline::before { + content: "\F10C1"; +} + +.mdi-storefront-plus::before { + content: "\F1B81"; +} + +.mdi-storefront-plus-outline::before { + content: "\F1B82"; +} + +.mdi-storefront-remove::before { + content: "\F1B85"; +} + +.mdi-storefront-remove-outline::before { + content: "\F1B86"; +} + +.mdi-stove::before { + content: "\F04DE"; +} + +.mdi-strategy::before { + content: "\F11D6"; +} + +.mdi-stretch-to-page::before { + content: "\F0F2B"; +} + +.mdi-stretch-to-page-outline::before { + content: "\F0F2C"; +} + +.mdi-string-lights::before { + content: "\F12BA"; +} + +.mdi-string-lights-off::before { + content: "\F12BB"; +} + +.mdi-subdirectory-arrow-left::before { + content: "\F060C"; +} + +.mdi-subdirectory-arrow-right::before { + content: "\F060D"; +} + +.mdi-submarine::before { + content: "\F156C"; +} + +.mdi-subtitles::before { + content: "\F0A16"; +} + +.mdi-subtitles-outline::before { + content: "\F0A17"; +} + +.mdi-subway::before { + content: "\F06AC"; +} + +.mdi-subway-alert-variant::before { + content: "\F0D9D"; +} + +.mdi-subway-variant::before { + content: "\F04DF"; +} + +.mdi-summit::before { + content: "\F0786"; +} + +.mdi-sun-angle::before { + content: "\F1B27"; +} + +.mdi-sun-angle-outline::before { + content: "\F1B28"; +} + +.mdi-sun-clock::before { + content: "\F1A77"; +} + +.mdi-sun-clock-outline::before { + content: "\F1A78"; +} + +.mdi-sun-compass::before { + content: "\F19A5"; +} + +.mdi-sun-snowflake::before { + content: "\F1796"; +} + +.mdi-sun-snowflake-variant::before { + content: "\F1A79"; +} + +.mdi-sun-thermometer::before { + content: "\F18D6"; +} + +.mdi-sun-thermometer-outline::before { + content: "\F18D7"; +} + +.mdi-sun-wireless::before { + content: "\F17FE"; +} + +.mdi-sun-wireless-outline::before { + content: "\F17FF"; +} + +.mdi-sunglasses::before { + content: "\F04E0"; +} + +.mdi-surfing::before { + content: "\F1746"; +} + +.mdi-surround-sound::before { + content: "\F05C5"; +} + +.mdi-surround-sound-2-0::before { + content: "\F07F0"; +} + +.mdi-surround-sound-2-1::before { + content: "\F1729"; +} + +.mdi-surround-sound-3-1::before { + content: "\F07F1"; +} + +.mdi-surround-sound-5-1::before { + content: "\F07F2"; +} + +.mdi-surround-sound-5-1-2::before { + content: "\F172A"; +} + +.mdi-surround-sound-7-1::before { + content: "\F07F3"; +} + +.mdi-svg::before { + content: "\F0721"; +} + +.mdi-swap-horizontal::before { + content: "\F04E1"; +} + +.mdi-swap-horizontal-bold::before { + content: "\F0BCD"; +} + +.mdi-swap-horizontal-circle::before { + content: "\F0FE1"; +} + +.mdi-swap-horizontal-circle-outline::before { + content: "\F0FE2"; +} + +.mdi-swap-horizontal-hidden::before { + content: "\F1D0E"; +} + +.mdi-swap-horizontal-variant::before { + content: "\F08C1"; +} + +.mdi-swap-vertical::before { + content: "\F04E2"; +} + +.mdi-swap-vertical-bold::before { + content: "\F0BCE"; +} + +.mdi-swap-vertical-circle::before { + content: "\F0FE3"; +} + +.mdi-swap-vertical-circle-outline::before { + content: "\F0FE4"; +} + +.mdi-swap-vertical-variant::before { + content: "\F08C2"; +} + +.mdi-swim::before { + content: "\F04E3"; +} + +.mdi-switch::before { + content: "\F04E4"; +} + +.mdi-sword::before { + content: "\F04E5"; +} + +.mdi-sword-cross::before { + content: "\F0787"; +} + +.mdi-syllabary-hangul::before { + content: "\F1333"; +} + +.mdi-syllabary-hiragana::before { + content: "\F1334"; +} + +.mdi-syllabary-katakana::before { + content: "\F1335"; +} + +.mdi-syllabary-katakana-halfwidth::before { + content: "\F1336"; +} + +.mdi-symbol::before { + content: "\F1501"; +} + +.mdi-symfony::before { + content: "\F0AE6"; +} + +.mdi-synagogue::before { + content: "\F1B04"; +} + +.mdi-synagogue-outline::before { + content: "\F1B05"; +} + +.mdi-sync::before { + content: "\F04E6"; +} + +.mdi-sync-alert::before { + content: "\F04E7"; +} + +.mdi-sync-circle::before { + content: "\F1378"; +} + +.mdi-sync-off::before { + content: "\F04E8"; +} + +.mdi-tab::before { + content: "\F04E9"; +} + +.mdi-tab-minus::before { + content: "\F0B4B"; +} + +.mdi-tab-plus::before { + content: "\F075C"; +} + +.mdi-tab-remove::before { + content: "\F0B4C"; +} + +.mdi-tab-search::before { + content: "\F199E"; +} + +.mdi-tab-unselected::before { + content: "\F04EA"; +} + +.mdi-table::before { + content: "\F04EB"; +} + +.mdi-table-account::before { + content: "\F13B9"; +} + +.mdi-table-alert::before { + content: "\F13BA"; +} + +.mdi-table-arrow-down::before { + content: "\F13BB"; +} + +.mdi-table-arrow-left::before { + content: "\F13BC"; +} + +.mdi-table-arrow-right::before { + content: "\F13BD"; +} + +.mdi-table-arrow-up::before { + content: "\F13BE"; +} + +.mdi-table-border::before { + content: "\F0A18"; +} + +.mdi-table-cancel::before { + content: "\F13BF"; +} + +.mdi-table-chair::before { + content: "\F1061"; +} + +.mdi-table-check::before { + content: "\F13C0"; +} + +.mdi-table-clock::before { + content: "\F13C1"; +} + +.mdi-table-cog::before { + content: "\F13C2"; +} + +.mdi-table-column::before { + content: "\F0835"; +} + +.mdi-table-column-plus-after::before { + content: "\F04EC"; +} + +.mdi-table-column-plus-before::before { + content: "\F04ED"; +} + +.mdi-table-column-remove::before { + content: "\F04EE"; +} + +.mdi-table-column-width::before { + content: "\F04EF"; +} + +.mdi-table-edit::before { + content: "\F04F0"; +} + +.mdi-table-eye::before { + content: "\F1094"; +} + +.mdi-table-eye-off::before { + content: "\F13C3"; +} + +.mdi-table-filter::before { + content: "\F1B8C"; +} + +.mdi-table-furniture::before { + content: "\F05BC"; +} + +.mdi-table-headers-eye::before { + content: "\F121D"; +} + +.mdi-table-headers-eye-off::before { + content: "\F121E"; +} + +.mdi-table-heart::before { + content: "\F13C4"; +} + +.mdi-table-key::before { + content: "\F13C5"; +} + +.mdi-table-large::before { + content: "\F04F1"; +} + +.mdi-table-large-plus::before { + content: "\F0F87"; +} + +.mdi-table-large-remove::before { + content: "\F0F88"; +} + +.mdi-table-lock::before { + content: "\F13C6"; +} + +.mdi-table-merge-cells::before { + content: "\F09A6"; +} + +.mdi-table-minus::before { + content: "\F13C7"; +} + +.mdi-table-multiple::before { + content: "\F13C8"; +} + +.mdi-table-network::before { + content: "\F13C9"; +} + +.mdi-table-of-contents::before { + content: "\F0836"; +} + +.mdi-table-off::before { + content: "\F13CA"; +} + +.mdi-table-picnic::before { + content: "\F1743"; +} + +.mdi-table-pivot::before { + content: "\F183C"; +} + +.mdi-table-plus::before { + content: "\F0A75"; +} + +.mdi-table-question::before { + content: "\F1B21"; +} + +.mdi-table-refresh::before { + content: "\F13A0"; +} + +.mdi-table-remove::before { + content: "\F0A76"; +} + +.mdi-table-row::before { + content: "\F0837"; +} + +.mdi-table-row-height::before { + content: "\F04F2"; +} + +.mdi-table-row-plus-after::before { + content: "\F04F3"; +} + +.mdi-table-row-plus-before::before { + content: "\F04F4"; +} + +.mdi-table-row-remove::before { + content: "\F04F5"; +} + +.mdi-table-search::before { + content: "\F090F"; +} + +.mdi-table-settings::before { + content: "\F0838"; +} + +.mdi-table-split-cell::before { + content: "\F142A"; +} + +.mdi-table-star::before { + content: "\F13CB"; +} + +.mdi-table-sync::before { + content: "\F13A1"; +} + +.mdi-table-tennis::before { + content: "\F0E68"; +} + +.mdi-tablet::before { + content: "\F04F6"; +} + +.mdi-tablet-cellphone::before { + content: "\F09A7"; +} + +.mdi-tablet-dashboard::before { + content: "\F0ECE"; +} + +.mdi-taco::before { + content: "\F0762"; +} + +.mdi-tag::before { + content: "\F04F9"; +} + +.mdi-tag-arrow-down::before { + content: "\F172B"; +} + +.mdi-tag-arrow-down-outline::before { + content: "\F172C"; +} + +.mdi-tag-arrow-left::before { + content: "\F172D"; +} + +.mdi-tag-arrow-left-outline::before { + content: "\F172E"; +} + +.mdi-tag-arrow-right::before { + content: "\F172F"; +} + +.mdi-tag-arrow-right-outline::before { + content: "\F1730"; +} + +.mdi-tag-arrow-up::before { + content: "\F1731"; +} + +.mdi-tag-arrow-up-outline::before { + content: "\F1732"; +} + +.mdi-tag-check::before { + content: "\F1A7A"; +} + +.mdi-tag-check-outline::before { + content: "\F1A7B"; +} + +.mdi-tag-edit::before { + content: "\F1C9C"; +} + +.mdi-tag-edit-outline::before { + content: "\F1C9D"; +} + +.mdi-tag-faces::before { + content: "\F04FA"; +} + +.mdi-tag-heart::before { + content: "\F068B"; +} + +.mdi-tag-heart-outline::before { + content: "\F0BCF"; +} + +.mdi-tag-hidden::before { + content: "\F1C76"; +} + +.mdi-tag-minus::before { + content: "\F0910"; +} + +.mdi-tag-minus-outline::before { + content: "\F121F"; +} + +.mdi-tag-multiple::before { + content: "\F04FB"; +} + +.mdi-tag-multiple-outline::before { + content: "\F12F7"; +} + +.mdi-tag-off::before { + content: "\F1220"; +} + +.mdi-tag-off-outline::before { + content: "\F1221"; +} + +.mdi-tag-outline::before { + content: "\F04FC"; +} + +.mdi-tag-plus::before { + content: "\F0722"; +} + +.mdi-tag-plus-outline::before { + content: "\F1222"; +} + +.mdi-tag-remove::before { + content: "\F0723"; +} + +.mdi-tag-remove-outline::before { + content: "\F1223"; +} + +.mdi-tag-search::before { + content: "\F1907"; +} + +.mdi-tag-search-outline::before { + content: "\F1908"; +} + +.mdi-tag-text::before { + content: "\F1224"; +} + +.mdi-tag-text-outline::before { + content: "\F04FD"; +} + +.mdi-tailwind::before { + content: "\F13FF"; +} + +.mdi-tally-mark-1::before { + content: "\F1ABC"; +} + +.mdi-tally-mark-2::before { + content: "\F1ABD"; +} + +.mdi-tally-mark-3::before { + content: "\F1ABE"; +} + +.mdi-tally-mark-4::before { + content: "\F1ABF"; +} + +.mdi-tally-mark-5::before { + content: "\F1AC0"; +} + +.mdi-tangram::before { + content: "\F04F8"; +} + +.mdi-tank::before { + content: "\F0D3A"; +} + +.mdi-tanker-truck::before { + content: "\F0FE5"; +} + +.mdi-tape-drive::before { + content: "\F16DF"; +} + +.mdi-tape-measure::before { + content: "\F0B4D"; +} + +.mdi-target::before { + content: "\F04FE"; +} + +.mdi-target-account::before { + content: "\F0BD0"; +} + +.mdi-target-variant::before { + content: "\F0A77"; +} + +.mdi-taxi::before { + content: "\F04FF"; +} + +.mdi-tea::before { + content: "\F0D9E"; +} + +.mdi-tea-outline::before { + content: "\F0D9F"; +} + +.mdi-teamviewer::before { + content: "\F0500"; +} + +.mdi-teddy-bear::before { + content: "\F18FB"; +} + +.mdi-telescope::before { + content: "\F0B4E"; +} + +.mdi-television::before { + content: "\F0502"; +} + +.mdi-television-ambient-light::before { + content: "\F1356"; +} + +.mdi-television-box::before { + content: "\F0839"; +} + +.mdi-television-classic::before { + content: "\F07F4"; +} + +.mdi-television-classic-off::before { + content: "\F083A"; +} + +.mdi-television-guide::before { + content: "\F0503"; +} + +.mdi-television-off::before { + content: "\F083B"; +} + +.mdi-television-pause::before { + content: "\F0F89"; +} + +.mdi-television-play::before { + content: "\F0ECF"; +} + +.mdi-television-shimmer::before { + content: "\F1110"; +} + +.mdi-television-speaker::before { + content: "\F1B1B"; +} + +.mdi-television-speaker-off::before { + content: "\F1B1C"; +} + +.mdi-television-stop::before { + content: "\F0F8A"; +} + +.mdi-temperature-celsius::before { + content: "\F0504"; +} + +.mdi-temperature-fahrenheit::before { + content: "\F0505"; +} + +.mdi-temperature-kelvin::before { + content: "\F0506"; +} + +.mdi-temple-buddhist::before { + content: "\F1B06"; +} + +.mdi-temple-buddhist-outline::before { + content: "\F1B07"; +} + +.mdi-temple-hindu::before { + content: "\F1B08"; +} + +.mdi-temple-hindu-outline::before { + content: "\F1B09"; +} + +.mdi-tennis::before { + content: "\F0DA0"; +} + +.mdi-tennis-ball::before { + content: "\F0507"; +} + +.mdi-tennis-ball-outline::before { + content: "\F1C5F"; +} + +.mdi-tent::before { + content: "\F0508"; +} + +.mdi-terraform::before { + content: "\F1062"; +} + +.mdi-terrain::before { + content: "\F0509"; +} + +.mdi-test-tube::before { + content: "\F0668"; +} + +.mdi-test-tube-empty::before { + content: "\F0911"; +} + +.mdi-test-tube-off::before { + content: "\F0912"; +} + +.mdi-text::before { + content: "\F09A8"; +} + +.mdi-text-account::before { + content: "\F1570"; +} + +.mdi-text-box::before { + content: "\F021A"; +} + +.mdi-text-box-check::before { + content: "\F0EA6"; +} + +.mdi-text-box-check-outline::before { + content: "\F0EA7"; +} + +.mdi-text-box-edit::before { + content: "\F1A7C"; +} + +.mdi-text-box-edit-outline::before { + content: "\F1A7D"; +} + +.mdi-text-box-minus::before { + content: "\F0EA8"; +} + +.mdi-text-box-minus-outline::before { + content: "\F0EA9"; +} + +.mdi-text-box-multiple::before { + content: "\F0AB7"; +} + +.mdi-text-box-multiple-outline::before { + content: "\F0AB8"; +} + +.mdi-text-box-outline::before { + content: "\F09ED"; +} + +.mdi-text-box-plus::before { + content: "\F0EAA"; +} + +.mdi-text-box-plus-outline::before { + content: "\F0EAB"; +} + +.mdi-text-box-remove::before { + content: "\F0EAC"; +} + +.mdi-text-box-remove-outline::before { + content: "\F0EAD"; +} + +.mdi-text-box-search::before { + content: "\F0EAE"; +} + +.mdi-text-box-search-outline::before { + content: "\F0EAF"; +} + +.mdi-text-long::before { + content: "\F09AA"; +} + +.mdi-text-recognition::before { + content: "\F113D"; +} + +.mdi-text-search::before { + content: "\F13B8"; +} + +.mdi-text-search-variant::before { + content: "\F1A7E"; +} + +.mdi-text-shadow::before { + content: "\F0669"; +} + +.mdi-text-short::before { + content: "\F09A9"; +} + +.mdi-texture::before { + content: "\F050C"; +} + +.mdi-texture-box::before { + content: "\F0FE6"; +} + +.mdi-theater::before { + content: "\F050D"; +} + +.mdi-theme-light-dark::before { + content: "\F050E"; +} + +.mdi-thermometer::before { + content: "\F050F"; +} + +.mdi-thermometer-alert::before { + content: "\F0E01"; +} + +.mdi-thermometer-auto::before { + content: "\F1B0F"; +} + +.mdi-thermometer-bluetooth::before { + content: "\F1895"; +} + +.mdi-thermometer-check::before { + content: "\F1A7F"; +} + +.mdi-thermometer-chevron-down::before { + content: "\F0E02"; +} + +.mdi-thermometer-chevron-up::before { + content: "\F0E03"; +} + +.mdi-thermometer-high::before { + content: "\F10C2"; +} + +.mdi-thermometer-lines::before { + content: "\F0510"; +} + +.mdi-thermometer-low::before { + content: "\F10C3"; +} + +.mdi-thermometer-minus::before { + content: "\F0E04"; +} + +.mdi-thermometer-off::before { + content: "\F1531"; +} + +.mdi-thermometer-plus::before { + content: "\F0E05"; +} + +.mdi-thermometer-probe::before { + content: "\F1B2B"; +} + +.mdi-thermometer-probe-off::before { + content: "\F1B2C"; +} + +.mdi-thermometer-water::before { + content: "\F1A80"; +} + +.mdi-thermostat::before { + content: "\F0393"; +} + +.mdi-thermostat-auto::before { + content: "\F1B17"; +} + +.mdi-thermostat-box::before { + content: "\F0891"; +} + +.mdi-thermostat-box-auto::before { + content: "\F1B18"; +} + +.mdi-thermostat-cog::before { + content: "\F1C80"; +} + +.mdi-thought-bubble::before { + content: "\F07F6"; +} + +.mdi-thought-bubble-outline::before { + content: "\F07F7"; +} + +.mdi-thumb-down::before { + content: "\F0511"; +} + +.mdi-thumb-down-outline::before { + content: "\F0512"; +} + +.mdi-thumb-up::before { + content: "\F0513"; +} + +.mdi-thumb-up-outline::before { + content: "\F0514"; +} + +.mdi-thumbs-up-down::before { + content: "\F0515"; +} + +.mdi-thumbs-up-down-outline::before { + content: "\F1914"; +} + +.mdi-ticket::before { + content: "\F0516"; +} + +.mdi-ticket-account::before { + content: "\F0517"; +} + +.mdi-ticket-confirmation::before { + content: "\F0518"; +} + +.mdi-ticket-confirmation-outline::before { + content: "\F13AA"; +} + +.mdi-ticket-outline::before { + content: "\F0913"; +} + +.mdi-ticket-percent::before { + content: "\F0724"; +} + +.mdi-ticket-percent-outline::before { + content: "\F142B"; +} + +.mdi-tie::before { + content: "\F0519"; +} + +.mdi-tilde::before { + content: "\F0725"; +} + +.mdi-tilde-off::before { + content: "\F18F3"; +} + +.mdi-timelapse::before { + content: "\F051A"; +} + +.mdi-timeline::before { + content: "\F0BD1"; +} + +.mdi-timeline-alert::before { + content: "\F0F95"; +} + +.mdi-timeline-alert-outline::before { + content: "\F0F98"; +} + +.mdi-timeline-check::before { + content: "\F1532"; +} + +.mdi-timeline-check-outline::before { + content: "\F1533"; +} + +.mdi-timeline-clock::before { + content: "\F11FB"; +} + +.mdi-timeline-clock-outline::before { + content: "\F11FC"; +} + +.mdi-timeline-minus::before { + content: "\F1534"; +} + +.mdi-timeline-minus-outline::before { + content: "\F1535"; +} + +.mdi-timeline-outline::before { + content: "\F0BD2"; +} + +.mdi-timeline-plus::before { + content: "\F0F96"; +} + +.mdi-timeline-plus-outline::before { + content: "\F0F97"; +} + +.mdi-timeline-question::before { + content: "\F0F99"; +} + +.mdi-timeline-question-outline::before { + content: "\F0F9A"; +} + +.mdi-timeline-remove::before { + content: "\F1536"; +} + +.mdi-timeline-remove-outline::before { + content: "\F1537"; +} + +.mdi-timeline-text::before { + content: "\F0BD3"; +} + +.mdi-timeline-text-outline::before { + content: "\F0BD4"; +} + +.mdi-timer::before { + content: "\F13AB"; +} + +.mdi-timer-10::before { + content: "\F051C"; +} + +.mdi-timer-3::before { + content: "\F051D"; +} + +.mdi-timer-alert::before { + content: "\F1ACC"; +} + +.mdi-timer-alert-outline::before { + content: "\F1ACD"; +} + +.mdi-timer-cancel::before { + content: "\F1ACE"; +} + +.mdi-timer-cancel-outline::before { + content: "\F1ACF"; +} + +.mdi-timer-check::before { + content: "\F1AD0"; +} + +.mdi-timer-check-outline::before { + content: "\F1AD1"; +} + +.mdi-timer-cog::before { + content: "\F1925"; +} + +.mdi-timer-cog-outline::before { + content: "\F1926"; +} + +.mdi-timer-edit::before { + content: "\F1AD2"; +} + +.mdi-timer-edit-outline::before { + content: "\F1AD3"; +} + +.mdi-timer-lock::before { + content: "\F1AD4"; +} + +.mdi-timer-lock-open::before { + content: "\F1AD5"; +} + +.mdi-timer-lock-open-outline::before { + content: "\F1AD6"; +} + +.mdi-timer-lock-outline::before { + content: "\F1AD7"; +} + +.mdi-timer-marker::before { + content: "\F1AD8"; +} + +.mdi-timer-marker-outline::before { + content: "\F1AD9"; +} + +.mdi-timer-minus::before { + content: "\F1ADA"; +} + +.mdi-timer-minus-outline::before { + content: "\F1ADB"; +} + +.mdi-timer-music::before { + content: "\F1ADC"; +} + +.mdi-timer-music-outline::before { + content: "\F1ADD"; +} + +.mdi-timer-off::before { + content: "\F13AC"; +} + +.mdi-timer-off-outline::before { + content: "\F051E"; +} + +.mdi-timer-outline::before { + content: "\F051B"; +} + +.mdi-timer-pause::before { + content: "\F1ADE"; +} + +.mdi-timer-pause-outline::before { + content: "\F1ADF"; +} + +.mdi-timer-play::before { + content: "\F1AE0"; +} + +.mdi-timer-play-outline::before { + content: "\F1AE1"; +} + +.mdi-timer-plus::before { + content: "\F1AE2"; +} + +.mdi-timer-plus-outline::before { + content: "\F1AE3"; +} + +.mdi-timer-refresh::before { + content: "\F1AE4"; +} + +.mdi-timer-refresh-outline::before { + content: "\F1AE5"; +} + +.mdi-timer-remove::before { + content: "\F1AE6"; +} + +.mdi-timer-remove-outline::before { + content: "\F1AE7"; +} + +.mdi-timer-sand::before { + content: "\F051F"; +} + +.mdi-timer-sand-complete::before { + content: "\F199F"; +} + +.mdi-timer-sand-empty::before { + content: "\F06AD"; +} + +.mdi-timer-sand-full::before { + content: "\F078C"; +} + +.mdi-timer-sand-paused::before { + content: "\F19A0"; +} + +.mdi-timer-settings::before { + content: "\F1923"; +} + +.mdi-timer-settings-outline::before { + content: "\F1924"; +} + +.mdi-timer-star::before { + content: "\F1AE8"; +} + +.mdi-timer-star-outline::before { + content: "\F1AE9"; +} + +.mdi-timer-stop::before { + content: "\F1AEA"; +} + +.mdi-timer-stop-outline::before { + content: "\F1AEB"; +} + +.mdi-timer-sync::before { + content: "\F1AEC"; +} + +.mdi-timer-sync-outline::before { + content: "\F1AED"; +} + +.mdi-timetable::before { + content: "\F0520"; +} + +.mdi-tire::before { + content: "\F1896"; +} + +.mdi-toaster::before { + content: "\F1063"; +} + +.mdi-toaster-off::before { + content: "\F11B7"; +} + +.mdi-toaster-oven::before { + content: "\F0CD3"; +} + +.mdi-toggle-switch::before { + content: "\F0521"; +} + +.mdi-toggle-switch-off::before { + content: "\F0522"; +} + +.mdi-toggle-switch-off-outline::before { + content: "\F0A19"; +} + +.mdi-toggle-switch-outline::before { + content: "\F0A1A"; +} + +.mdi-toggle-switch-variant::before { + content: "\F1A25"; +} + +.mdi-toggle-switch-variant-off::before { + content: "\F1A26"; +} + +.mdi-toilet::before { + content: "\F09AB"; +} + +.mdi-toolbox::before { + content: "\F09AC"; +} + +.mdi-toolbox-outline::before { + content: "\F09AD"; +} + +.mdi-tools::before { + content: "\F1064"; +} + +.mdi-tooltip::before { + content: "\F0523"; +} + +.mdi-tooltip-account::before { + content: "\F000C"; +} + +.mdi-tooltip-cellphone::before { + content: "\F183B"; +} + +.mdi-tooltip-check::before { + content: "\F155C"; +} + +.mdi-tooltip-check-outline::before { + content: "\F155D"; +} + +.mdi-tooltip-edit::before { + content: "\F0524"; +} + +.mdi-tooltip-edit-outline::before { + content: "\F12C5"; +} + +.mdi-tooltip-image::before { + content: "\F0525"; +} + +.mdi-tooltip-image-outline::before { + content: "\F0BD5"; +} + +.mdi-tooltip-minus::before { + content: "\F155E"; +} + +.mdi-tooltip-minus-outline::before { + content: "\F155F"; +} + +.mdi-tooltip-outline::before { + content: "\F0526"; +} + +.mdi-tooltip-plus::before { + content: "\F0BD6"; +} + +.mdi-tooltip-plus-outline::before { + content: "\F0527"; +} + +.mdi-tooltip-question::before { + content: "\F1BBA"; +} + +.mdi-tooltip-question-outline::before { + content: "\F1BBB"; +} + +.mdi-tooltip-remove::before { + content: "\F1560"; +} + +.mdi-tooltip-remove-outline::before { + content: "\F1561"; +} + +.mdi-tooltip-text::before { + content: "\F0528"; +} + +.mdi-tooltip-text-outline::before { + content: "\F0BD7"; +} + +.mdi-tooth::before { + content: "\F08C3"; +} + +.mdi-tooth-outline::before { + content: "\F0529"; +} + +.mdi-toothbrush::before { + content: "\F1129"; +} + +.mdi-toothbrush-electric::before { + content: "\F112C"; +} + +.mdi-toothbrush-paste::before { + content: "\F112A"; +} + +.mdi-torch::before { + content: "\F1606"; +} + +.mdi-tortoise::before { + content: "\F0D3B"; +} + +.mdi-toslink::before { + content: "\F12B8"; +} + +.mdi-touch-text-outline::before { + content: "\F1C60"; +} + +.mdi-tournament::before { + content: "\F09AE"; +} + +.mdi-tow-truck::before { + content: "\F083C"; +} + +.mdi-tower-beach::before { + content: "\F0681"; +} + +.mdi-tower-fire::before { + content: "\F0682"; +} + +.mdi-town-hall::before { + content: "\F1875"; +} + +.mdi-toy-brick::before { + content: "\F1288"; +} + +.mdi-toy-brick-marker::before { + content: "\F1289"; +} + +.mdi-toy-brick-marker-outline::before { + content: "\F128A"; +} + +.mdi-toy-brick-minus::before { + content: "\F128B"; +} + +.mdi-toy-brick-minus-outline::before { + content: "\F128C"; +} + +.mdi-toy-brick-outline::before { + content: "\F128D"; +} + +.mdi-toy-brick-plus::before { + content: "\F128E"; +} + +.mdi-toy-brick-plus-outline::before { + content: "\F128F"; +} + +.mdi-toy-brick-remove::before { + content: "\F1290"; +} + +.mdi-toy-brick-remove-outline::before { + content: "\F1291"; +} + +.mdi-toy-brick-search::before { + content: "\F1292"; +} + +.mdi-toy-brick-search-outline::before { + content: "\F1293"; +} + +.mdi-track-light::before { + content: "\F0914"; +} + +.mdi-track-light-off::before { + content: "\F1B01"; +} + +.mdi-trackpad::before { + content: "\F07F8"; +} + +.mdi-trackpad-lock::before { + content: "\F0933"; +} + +.mdi-tractor::before { + content: "\F0892"; +} + +.mdi-tractor-variant::before { + content: "\F14C4"; +} + +.mdi-trademark::before { + content: "\F0A78"; +} + +.mdi-traffic-cone::before { + content: "\F137C"; +} + +.mdi-traffic-light::before { + content: "\F052B"; +} + +.mdi-traffic-light-outline::before { + content: "\F182A"; +} + +.mdi-train::before { + content: "\F052C"; +} + +.mdi-train-bus::before { + content: "\F1CC7"; +} + +.mdi-train-car::before { + content: "\F0BD8"; +} + +.mdi-train-car-autorack::before { + content: "\F1B2D"; +} + +.mdi-train-car-box::before { + content: "\F1B2E"; +} + +.mdi-train-car-box-full::before { + content: "\F1B2F"; +} + +.mdi-train-car-box-open::before { + content: "\F1B30"; +} + +.mdi-train-car-caboose::before { + content: "\F1B31"; +} + +.mdi-train-car-centerbeam::before { + content: "\F1B32"; +} + +.mdi-train-car-centerbeam-full::before { + content: "\F1B33"; +} + +.mdi-train-car-container::before { + content: "\F1B34"; +} + +.mdi-train-car-flatbed::before { + content: "\F1B35"; +} + +.mdi-train-car-flatbed-car::before { + content: "\F1B36"; +} + +.mdi-train-car-flatbed-tank::before { + content: "\F1B37"; +} + +.mdi-train-car-gondola::before { + content: "\F1B38"; +} + +.mdi-train-car-gondola-full::before { + content: "\F1B39"; +} + +.mdi-train-car-hopper::before { + content: "\F1B3A"; +} + +.mdi-train-car-hopper-covered::before { + content: "\F1B3B"; +} + +.mdi-train-car-hopper-full::before { + content: "\F1B3C"; +} + +.mdi-train-car-intermodal::before { + content: "\F1B3D"; +} + +.mdi-train-car-passenger::before { + content: "\F1733"; +} + +.mdi-train-car-passenger-door::before { + content: "\F1734"; +} + +.mdi-train-car-passenger-door-open::before { + content: "\F1735"; +} + +.mdi-train-car-passenger-variant::before { + content: "\F1736"; +} + +.mdi-train-car-tank::before { + content: "\F1B3E"; +} + +.mdi-train-variant::before { + content: "\F08C4"; +} + +.mdi-tram::before { + content: "\F052D"; +} + +.mdi-tram-side::before { + content: "\F0FE7"; +} + +.mdi-transcribe::before { + content: "\F052E"; +} + +.mdi-transcribe-close::before { + content: "\F052F"; +} + +.mdi-transfer::before { + content: "\F1065"; +} + +.mdi-transfer-down::before { + content: "\F0DA1"; +} + +.mdi-transfer-left::before { + content: "\F0DA2"; +} + +.mdi-transfer-right::before { + content: "\F0530"; +} + +.mdi-transfer-up::before { + content: "\F0DA3"; +} + +.mdi-transit-connection::before { + content: "\F0D3C"; +} + +.mdi-transit-connection-horizontal::before { + content: "\F1546"; +} + +.mdi-transit-connection-variant::before { + content: "\F0D3D"; +} + +.mdi-transit-detour::before { + content: "\F0F8B"; +} + +.mdi-transit-skip::before { + content: "\F1515"; +} + +.mdi-transit-transfer::before { + content: "\F06AE"; +} + +.mdi-transition::before { + content: "\F0915"; +} + +.mdi-transition-masked::before { + content: "\F0916"; +} + +.mdi-translate::before { + content: "\F05CA"; +} + +.mdi-translate-off::before { + content: "\F0E06"; +} + +.mdi-translate-variant::before { + content: "\F1B99"; +} + +.mdi-transmission-tower::before { + content: "\F0D3E"; +} + +.mdi-transmission-tower-export::before { + content: "\F192C"; +} + +.mdi-transmission-tower-import::before { + content: "\F192D"; +} + +.mdi-transmission-tower-off::before { + content: "\F19DD"; +} + +.mdi-trash-can::before { + content: "\F0A79"; +} + +.mdi-trash-can-outline::before { + content: "\F0A7A"; +} + +.mdi-tray::before { + content: "\F1294"; +} + +.mdi-tray-alert::before { + content: "\F1295"; +} + +.mdi-tray-arrow-down::before { + content: "\F0120"; +} + +.mdi-tray-arrow-up::before { + content: "\F011D"; +} + +.mdi-tray-full::before { + content: "\F1296"; +} + +.mdi-tray-minus::before { + content: "\F1297"; +} + +.mdi-tray-plus::before { + content: "\F1298"; +} + +.mdi-tray-remove::before { + content: "\F1299"; +} + +.mdi-treasure-chest::before { + content: "\F0726"; +} + +.mdi-treasure-chest-outline::before { + content: "\F1C77"; +} + +.mdi-tree::before { + content: "\F0531"; +} + +.mdi-tree-outline::before { + content: "\F0E69"; +} + +.mdi-trello::before { + content: "\F0532"; +} + +.mdi-trending-down::before { + content: "\F0533"; +} + +.mdi-trending-neutral::before { + content: "\F0534"; +} + +.mdi-trending-up::before { + content: "\F0535"; +} + +.mdi-triangle::before { + content: "\F0536"; +} + +.mdi-triangle-down::before { + content: "\F1C56"; +} + +.mdi-triangle-down-outline::before { + content: "\F1C57"; +} + +.mdi-triangle-outline::before { + content: "\F0537"; +} + +.mdi-triangle-small-down::before { + content: "\F1A09"; +} + +.mdi-triangle-small-up::before { + content: "\F1A0A"; +} + +.mdi-triangle-wave::before { + content: "\F147C"; +} + +.mdi-triforce::before { + content: "\F0BD9"; +} + +.mdi-trophy::before { + content: "\F0538"; +} + +.mdi-trophy-award::before { + content: "\F0539"; +} + +.mdi-trophy-broken::before { + content: "\F0DA4"; +} + +.mdi-trophy-outline::before { + content: "\F053A"; +} + +.mdi-trophy-variant::before { + content: "\F053B"; +} + +.mdi-trophy-variant-outline::before { + content: "\F053C"; +} + +.mdi-truck::before { + content: "\F053D"; +} + +.mdi-truck-alert::before { + content: "\F19DE"; +} + +.mdi-truck-alert-outline::before { + content: "\F19DF"; +} + +.mdi-truck-cargo-container::before { + content: "\F18D8"; +} + +.mdi-truck-check::before { + content: "\F0CD4"; +} + +.mdi-truck-check-outline::before { + content: "\F129A"; +} + +.mdi-truck-delivery::before { + content: "\F053E"; +} + +.mdi-truck-delivery-outline::before { + content: "\F129B"; +} + +.mdi-truck-fast::before { + content: "\F0788"; +} + +.mdi-truck-fast-outline::before { + content: "\F129C"; +} + +.mdi-truck-flatbed::before { + content: "\F1891"; +} + +.mdi-truck-minus::before { + content: "\F19AE"; +} + +.mdi-truck-minus-outline::before { + content: "\F19BD"; +} + +.mdi-truck-off-road::before { + content: "\F1C9E"; +} + +.mdi-truck-off-road-off::before { + content: "\F1C9F"; +} + +.mdi-truck-outline::before { + content: "\F129D"; +} + +.mdi-truck-plus::before { + content: "\F19AD"; +} + +.mdi-truck-plus-outline::before { + content: "\F19BC"; +} + +.mdi-truck-remove::before { + content: "\F19AF"; +} + +.mdi-truck-remove-outline::before { + content: "\F19BE"; +} + +.mdi-truck-snowflake::before { + content: "\F19A6"; +} + +.mdi-truck-trailer::before { + content: "\F0727"; +} + +.mdi-trumpet::before { + content: "\F1096"; +} + +.mdi-tshirt-crew::before { + content: "\F0A7B"; +} + +.mdi-tshirt-crew-outline::before { + content: "\F053F"; +} + +.mdi-tshirt-v::before { + content: "\F0A7C"; +} + +.mdi-tshirt-v-outline::before { + content: "\F0540"; +} + +.mdi-tsunami::before { + content: "\F1A81"; +} + +.mdi-tumble-dryer::before { + content: "\F0917"; +} + +.mdi-tumble-dryer-alert::before { + content: "\F11BA"; +} + +.mdi-tumble-dryer-off::before { + content: "\F11BB"; +} + +.mdi-tune::before { + content: "\F062E"; +} + +.mdi-tune-variant::before { + content: "\F1542"; +} + +.mdi-tune-vertical::before { + content: "\F066A"; +} + +.mdi-tune-vertical-variant::before { + content: "\F1543"; +} + +.mdi-tunnel::before { + content: "\F183D"; +} + +.mdi-tunnel-outline::before { + content: "\F183E"; +} + +.mdi-turbine::before { + content: "\F1A82"; +} + +.mdi-turkey::before { + content: "\F171B"; +} + +.mdi-turnstile::before { + content: "\F0CD5"; +} + +.mdi-turnstile-outline::before { + content: "\F0CD6"; +} + +.mdi-turtle::before { + content: "\F0CD7"; +} + +.mdi-twitch::before { + content: "\F0543"; +} + +.mdi-twitter::before { + content: "\F0544"; +} + +.mdi-two-factor-authentication::before { + content: "\F09AF"; +} + +.mdi-typewriter::before { + content: "\F0F2D"; +} + +.mdi-ubisoft::before { + content: "\F0BDA"; +} + +.mdi-ubuntu::before { + content: "\F0548"; +} + +.mdi-ufo::before { + content: "\F10C4"; +} + +.mdi-ufo-outline::before { + content: "\F10C5"; +} + +.mdi-ultra-high-definition::before { + content: "\F07F9"; +} + +.mdi-umbraco::before { + content: "\F0549"; +} + +.mdi-umbrella::before { + content: "\F054A"; +} + +.mdi-umbrella-beach::before { + content: "\F188A"; +} + +.mdi-umbrella-beach-outline::before { + content: "\F188B"; +} + +.mdi-umbrella-closed::before { + content: "\F09B0"; +} + +.mdi-umbrella-closed-outline::before { + content: "\F13E2"; +} + +.mdi-umbrella-closed-variant::before { + content: "\F13E1"; +} + +.mdi-umbrella-outline::before { + content: "\F054B"; +} + +.mdi-underwear-outline::before { + content: "\F1D0F"; +} + +.mdi-undo::before { + content: "\F054C"; +} + +.mdi-undo-variant::before { + content: "\F054D"; +} + +.mdi-unfold-less-horizontal::before { + content: "\F054E"; +} + +.mdi-unfold-less-vertical::before { + content: "\F0760"; +} + +.mdi-unfold-more-horizontal::before { + content: "\F054F"; +} + +.mdi-unfold-more-vertical::before { + content: "\F0761"; +} + +.mdi-ungroup::before { + content: "\F0550"; +} + +.mdi-unicode::before { + content: "\F0ED0"; +} + +.mdi-unicorn::before { + content: "\F15C2"; +} + +.mdi-unicorn-variant::before { + content: "\F15C3"; +} + +.mdi-unicycle::before { + content: "\F15E5"; +} + +.mdi-unity::before { + content: "\F06AF"; +} + +.mdi-unreal::before { + content: "\F09B1"; +} + +.mdi-update::before { + content: "\F06B0"; +} + +.mdi-upload::before { + content: "\F0552"; +} + +.mdi-upload-box::before { + content: "\F1D10"; +} + +.mdi-upload-box-outline::before { + content: "\F1D11"; +} + +.mdi-upload-circle::before { + content: "\F1D12"; +} + +.mdi-upload-circle-outline::before { + content: "\F1D13"; +} + +.mdi-upload-lock::before { + content: "\F1373"; +} + +.mdi-upload-lock-outline::before { + content: "\F1374"; +} + +.mdi-upload-multiple::before { + content: "\F083D"; +} + +.mdi-upload-multiple-outline::before { + content: "\F1D14"; +} + +.mdi-upload-network::before { + content: "\F06F6"; +} + +.mdi-upload-network-outline::before { + content: "\F0CD8"; +} + +.mdi-upload-off::before { + content: "\F10C6"; +} + +.mdi-upload-off-outline::before { + content: "\F10C7"; +} + +.mdi-upload-outline::before { + content: "\F0E07"; +} + +.mdi-usb::before { + content: "\F0553"; +} + +.mdi-usb-c-port::before { + content: "\F1CBF"; +} + +.mdi-usb-flash-drive::before { + content: "\F129E"; +} + +.mdi-usb-flash-drive-outline::before { + content: "\F129F"; +} + +.mdi-usb-port::before { + content: "\F11F0"; +} + +.mdi-vacuum::before { + content: "\F19A1"; +} + +.mdi-vacuum-outline::before { + content: "\F19A2"; +} + +.mdi-valve::before { + content: "\F1066"; +} + +.mdi-valve-closed::before { + content: "\F1067"; +} + +.mdi-valve-open::before { + content: "\F1068"; +} + +.mdi-van-passenger::before { + content: "\F07FA"; +} + +.mdi-van-utility::before { + content: "\F07FB"; +} + +.mdi-vanish::before { + content: "\F07FC"; +} + +.mdi-vanish-quarter::before { + content: "\F1554"; +} + +.mdi-vanity-light::before { + content: "\F11E1"; +} + +.mdi-variable::before { + content: "\F0AE7"; +} + +.mdi-variable-box::before { + content: "\F1111"; +} + +.mdi-vector-arrange-above::before { + content: "\F0554"; +} + +.mdi-vector-arrange-below::before { + content: "\F0555"; +} + +.mdi-vector-bezier::before { + content: "\F0AE8"; +} + +.mdi-vector-circle::before { + content: "\F0556"; +} + +.mdi-vector-circle-variant::before { + content: "\F0557"; +} + +.mdi-vector-combine::before { + content: "\F0558"; +} + +.mdi-vector-curve::before { + content: "\F0559"; +} + +.mdi-vector-difference::before { + content: "\F055A"; +} + +.mdi-vector-difference-ab::before { + content: "\F055B"; +} + +.mdi-vector-difference-ba::before { + content: "\F055C"; +} + +.mdi-vector-ellipse::before { + content: "\F0893"; +} + +.mdi-vector-intersection::before { + content: "\F055D"; +} + +.mdi-vector-line::before { + content: "\F055E"; +} + +.mdi-vector-link::before { + content: "\F0FE8"; +} + +.mdi-vector-point::before { + content: "\F01C4"; +} + +.mdi-vector-point-edit::before { + content: "\F09E8"; +} + +.mdi-vector-point-minus::before { + content: "\F1B78"; +} + +.mdi-vector-point-plus::before { + content: "\F1B79"; +} + +.mdi-vector-point-select::before { + content: "\F055F"; +} + +.mdi-vector-polygon::before { + content: "\F0560"; +} + +.mdi-vector-polygon-variant::before { + content: "\F1856"; +} + +.mdi-vector-polyline::before { + content: "\F0561"; +} + +.mdi-vector-polyline-edit::before { + content: "\F1225"; +} + +.mdi-vector-polyline-minus::before { + content: "\F1226"; +} + +.mdi-vector-polyline-plus::before { + content: "\F1227"; +} + +.mdi-vector-polyline-remove::before { + content: "\F1228"; +} + +.mdi-vector-radius::before { + content: "\F074A"; +} + +.mdi-vector-rectangle::before { + content: "\F05C6"; +} + +.mdi-vector-selection::before { + content: "\F0562"; +} + +.mdi-vector-square::before { + content: "\F0001"; +} + +.mdi-vector-square-close::before { + content: "\F1857"; +} + +.mdi-vector-square-edit::before { + content: "\F18D9"; +} + +.mdi-vector-square-minus::before { + content: "\F18DA"; +} + +.mdi-vector-square-open::before { + content: "\F1858"; +} + +.mdi-vector-square-plus::before { + content: "\F18DB"; +} + +.mdi-vector-square-remove::before { + content: "\F18DC"; +} + +.mdi-vector-triangle::before { + content: "\F0563"; +} + +.mdi-vector-union::before { + content: "\F0564"; +} + +.mdi-vhs::before { + content: "\F0A1B"; +} + +.mdi-vibrate::before { + content: "\F0566"; +} + +.mdi-vibrate-off::before { + content: "\F0CD9"; +} + +.mdi-video::before { + content: "\F0567"; +} + +.mdi-video-2d::before { + content: "\F1A1C"; +} + +.mdi-video-3d::before { + content: "\F07FD"; +} + +.mdi-video-3d-off::before { + content: "\F13D9"; +} + +.mdi-video-3d-variant::before { + content: "\F0ED1"; +} + +.mdi-video-4k-box::before { + content: "\F083E"; +} + +.mdi-video-account::before { + content: "\F0919"; +} + +.mdi-video-box::before { + content: "\F00FD"; +} + +.mdi-video-box-off::before { + content: "\F00FE"; +} + +.mdi-video-check::before { + content: "\F1069"; +} + +.mdi-video-check-outline::before { + content: "\F106A"; +} + +.mdi-video-high-definition::before { + content: "\F152E"; +} + +.mdi-video-image::before { + content: "\F091A"; +} + +.mdi-video-input-antenna::before { + content: "\F083F"; +} + +.mdi-video-input-component::before { + content: "\F0840"; +} + +.mdi-video-input-hdmi::before { + content: "\F0841"; +} + +.mdi-video-input-scart::before { + content: "\F0F8C"; +} + +.mdi-video-input-svideo::before { + content: "\F0842"; +} + +.mdi-video-marker::before { + content: "\F19A9"; +} + +.mdi-video-marker-outline::before { + content: "\F19AA"; +} + +.mdi-video-minus::before { + content: "\F09B2"; +} + +.mdi-video-minus-outline::before { + content: "\F02BA"; +} + +.mdi-video-off::before { + content: "\F0568"; +} + +.mdi-video-off-outline::before { + content: "\F0BDB"; +} + +.mdi-video-outline::before { + content: "\F0BDC"; +} + +.mdi-video-plus::before { + content: "\F09B3"; +} + +.mdi-video-plus-outline::before { + content: "\F01D3"; +} + +.mdi-video-stabilization::before { + content: "\F091B"; +} + +.mdi-video-standard-definition::before { + content: "\F1CA0"; +} + +.mdi-video-switch::before { + content: "\F0569"; +} + +.mdi-video-switch-outline::before { + content: "\F0790"; +} + +.mdi-video-vintage::before { + content: "\F0A1C"; +} + +.mdi-video-wireless::before { + content: "\F0ED2"; +} + +.mdi-video-wireless-outline::before { + content: "\F0ED3"; +} + +.mdi-view-agenda::before { + content: "\F056A"; +} + +.mdi-view-agenda-outline::before { + content: "\F11D8"; +} + +.mdi-view-array::before { + content: "\F056B"; +} + +.mdi-view-array-outline::before { + content: "\F1485"; +} + +.mdi-view-carousel::before { + content: "\F056C"; +} + +.mdi-view-carousel-outline::before { + content: "\F1486"; +} + +.mdi-view-column::before { + content: "\F056D"; +} + +.mdi-view-column-outline::before { + content: "\F1487"; +} + +.mdi-view-comfy::before { + content: "\F0E6A"; +} + +.mdi-view-comfy-outline::before { + content: "\F1488"; +} + +.mdi-view-compact::before { + content: "\F0E6B"; +} + +.mdi-view-compact-outline::before { + content: "\F0E6C"; +} + +.mdi-view-dashboard::before { + content: "\F056E"; +} + +.mdi-view-dashboard-edit::before { + content: "\F1947"; +} + +.mdi-view-dashboard-edit-outline::before { + content: "\F1948"; +} + +.mdi-view-dashboard-outline::before { + content: "\F0A1D"; +} + +.mdi-view-dashboard-variant::before { + content: "\F0843"; +} + +.mdi-view-dashboard-variant-outline::before { + content: "\F1489"; +} + +.mdi-view-day::before { + content: "\F056F"; +} + +.mdi-view-day-outline::before { + content: "\F148A"; +} + +.mdi-view-gallery::before { + content: "\F1888"; +} + +.mdi-view-gallery-outline::before { + content: "\F1889"; +} + +.mdi-view-grid::before { + content: "\F0570"; +} + +.mdi-view-grid-compact::before { + content: "\F1C61"; +} + +.mdi-view-grid-outline::before { + content: "\F11D9"; +} + +.mdi-view-grid-plus::before { + content: "\F0F8D"; +} + +.mdi-view-grid-plus-outline::before { + content: "\F11DA"; +} + +.mdi-view-headline::before { + content: "\F0571"; +} + +.mdi-view-list::before { + content: "\F0572"; +} + +.mdi-view-list-outline::before { + content: "\F148B"; +} + +.mdi-view-module::before { + content: "\F0573"; +} + +.mdi-view-module-outline::before { + content: "\F148C"; +} + +.mdi-view-parallel::before { + content: "\F0728"; +} + +.mdi-view-parallel-outline::before { + content: "\F148D"; +} + +.mdi-view-quilt::before { + content: "\F0574"; +} + +.mdi-view-quilt-outline::before { + content: "\F148E"; +} + +.mdi-view-sequential::before { + content: "\F0729"; +} + +.mdi-view-sequential-outline::before { + content: "\F148F"; +} + +.mdi-view-split-horizontal::before { + content: "\F0BCB"; +} + +.mdi-view-split-vertical::before { + content: "\F0BCC"; +} + +.mdi-view-stream::before { + content: "\F0575"; +} + +.mdi-view-stream-outline::before { + content: "\F1490"; +} + +.mdi-view-week::before { + content: "\F0576"; +} + +.mdi-view-week-outline::before { + content: "\F1491"; +} + +.mdi-vimeo::before { + content: "\F0577"; +} + +.mdi-violin::before { + content: "\F060F"; +} + +.mdi-virtual-reality::before { + content: "\F0894"; +} + +.mdi-virus::before { + content: "\F13B6"; +} + +.mdi-virus-off::before { + content: "\F18E1"; +} + +.mdi-virus-off-outline::before { + content: "\F18E2"; +} + +.mdi-virus-outline::before { + content: "\F13B7"; +} + +.mdi-vlc::before { + content: "\F057C"; +} + +.mdi-voicemail::before { + content: "\F057D"; +} + +.mdi-volcano::before { + content: "\F1A83"; +} + +.mdi-volcano-outline::before { + content: "\F1A84"; +} + +.mdi-volleyball::before { + content: "\F09B4"; +} + +.mdi-volume-equal::before { + content: "\F1B10"; +} + +.mdi-volume-high::before { + content: "\F057E"; +} + +.mdi-volume-low::before { + content: "\F057F"; +} + +.mdi-volume-medium::before { + content: "\F0580"; +} + +.mdi-volume-minus::before { + content: "\F075E"; +} + +.mdi-volume-mute::before { + content: "\F075F"; +} + +.mdi-volume-off::before { + content: "\F0581"; +} + +.mdi-volume-plus::before { + content: "\F075D"; +} + +.mdi-volume-source::before { + content: "\F1120"; +} + +.mdi-volume-variant-off::before { + content: "\F0E08"; +} + +.mdi-volume-vibrate::before { + content: "\F1121"; +} + +.mdi-vote::before { + content: "\F0A1F"; +} + +.mdi-vote-outline::before { + content: "\F0A20"; +} + +.mdi-vpn::before { + content: "\F0582"; +} + +.mdi-vuejs::before { + content: "\F0844"; +} + +.mdi-vuetify::before { + content: "\F0E6D"; +} + +.mdi-walk::before { + content: "\F0583"; +} + +.mdi-wall::before { + content: "\F07FE"; +} + +.mdi-wall-fire::before { + content: "\F1A11"; +} + +.mdi-wall-sconce::before { + content: "\F091C"; +} + +.mdi-wall-sconce-flat::before { + content: "\F091D"; +} + +.mdi-wall-sconce-flat-outline::before { + content: "\F17C9"; +} + +.mdi-wall-sconce-flat-variant::before { + content: "\F041C"; +} + +.mdi-wall-sconce-flat-variant-outline::before { + content: "\F17CA"; +} + +.mdi-wall-sconce-outline::before { + content: "\F17CB"; +} + +.mdi-wall-sconce-round::before { + content: "\F0748"; +} + +.mdi-wall-sconce-round-outline::before { + content: "\F17CC"; +} + +.mdi-wall-sconce-round-variant::before { + content: "\F091E"; +} + +.mdi-wall-sconce-round-variant-outline::before { + content: "\F17CD"; +} + +.mdi-wallet::before { + content: "\F0584"; +} + +.mdi-wallet-bifold::before { + content: "\F1C58"; +} + +.mdi-wallet-bifold-outline::before { + content: "\F1C59"; +} + +.mdi-wallet-giftcard::before { + content: "\F0585"; +} + +.mdi-wallet-membership::before { + content: "\F0586"; +} + +.mdi-wallet-outline::before { + content: "\F0BDD"; +} + +.mdi-wallet-plus::before { + content: "\F0F8E"; +} + +.mdi-wallet-plus-outline::before { + content: "\F0F8F"; +} + +.mdi-wallet-travel::before { + content: "\F0587"; +} + +.mdi-wallpaper::before { + content: "\F0E09"; +} + +.mdi-wan::before { + content: "\F0588"; +} + +.mdi-wardrobe::before { + content: "\F0F90"; +} + +.mdi-wardrobe-outline::before { + content: "\F0F91"; +} + +.mdi-warehouse::before { + content: "\F0F81"; +} + +.mdi-washing-machine::before { + content: "\F072A"; +} + +.mdi-washing-machine-alert::before { + content: "\F11BC"; +} + +.mdi-washing-machine-off::before { + content: "\F11BD"; +} + +.mdi-watch::before { + content: "\F0589"; +} + +.mdi-watch-export::before { + content: "\F058A"; +} + +.mdi-watch-export-variant::before { + content: "\F0895"; +} + +.mdi-watch-import::before { + content: "\F058B"; +} + +.mdi-watch-import-variant::before { + content: "\F0896"; +} + +.mdi-watch-variant::before { + content: "\F0897"; +} + +.mdi-watch-vibrate::before { + content: "\F06B1"; +} + +.mdi-watch-vibrate-off::before { + content: "\F0CDA"; +} + +.mdi-water::before { + content: "\F058C"; +} + +.mdi-water-alert::before { + content: "\F1502"; +} + +.mdi-water-alert-outline::before { + content: "\F1503"; +} + +.mdi-water-boiler::before { + content: "\F0F92"; +} + +.mdi-water-boiler-alert::before { + content: "\F11B3"; +} + +.mdi-water-boiler-auto::before { + content: "\F1B98"; +} + +.mdi-water-boiler-off::before { + content: "\F11B4"; +} + +.mdi-water-check::before { + content: "\F1504"; +} + +.mdi-water-check-outline::before { + content: "\F1505"; +} + +.mdi-water-circle::before { + content: "\F1806"; +} + +.mdi-water-minus::before { + content: "\F1506"; +} + +.mdi-water-minus-outline::before { + content: "\F1507"; +} + +.mdi-water-off::before { + content: "\F058D"; +} + +.mdi-water-off-outline::before { + content: "\F1508"; +} + +.mdi-water-opacity::before { + content: "\F1855"; +} + +.mdi-water-outline::before { + content: "\F0E0A"; +} + +.mdi-water-percent::before { + content: "\F058E"; +} + +.mdi-water-percent-alert::before { + content: "\F1509"; +} + +.mdi-water-plus::before { + content: "\F150A"; +} + +.mdi-water-plus-outline::before { + content: "\F150B"; +} + +.mdi-water-polo::before { + content: "\F12A0"; +} + +.mdi-water-pump::before { + content: "\F058F"; +} + +.mdi-water-pump-off::before { + content: "\F0F93"; +} + +.mdi-water-remove::before { + content: "\F150C"; +} + +.mdi-water-remove-outline::before { + content: "\F150D"; +} + +.mdi-water-sync::before { + content: "\F17C6"; +} + +.mdi-water-thermometer::before { + content: "\F1A85"; +} + +.mdi-water-thermometer-outline::before { + content: "\F1A86"; +} + +.mdi-water-well::before { + content: "\F106B"; +} + +.mdi-water-well-outline::before { + content: "\F106C"; +} + +.mdi-waterfall::before { + content: "\F1849"; +} + +.mdi-watering-can::before { + content: "\F1481"; +} + +.mdi-watering-can-outline::before { + content: "\F1482"; +} + +.mdi-watermark::before { + content: "\F0612"; +} + +.mdi-wave::before { + content: "\F0F2E"; +} + +.mdi-wave-arrow-down::before { + content: "\F1CB0"; +} + +.mdi-wave-arrow-up::before { + content: "\F1CB1"; +} + +.mdi-wave-undercurrent::before { + content: "\F1CC0"; +} + +.mdi-waveform::before { + content: "\F147D"; +} + +.mdi-waves::before { + content: "\F078D"; +} + +.mdi-waves-arrow-left::before { + content: "\F1859"; +} + +.mdi-waves-arrow-right::before { + content: "\F185A"; +} + +.mdi-waves-arrow-up::before { + content: "\F185B"; +} + +.mdi-waze::before { + content: "\F0BDE"; +} + +.mdi-weather-cloudy::before { + content: "\F0590"; +} + +.mdi-weather-cloudy-alert::before { + content: "\F0F2F"; +} + +.mdi-weather-cloudy-arrow-right::before { + content: "\F0E6E"; +} + +.mdi-weather-cloudy-clock::before { + content: "\F18F6"; +} + +.mdi-weather-dust::before { + content: "\F1B5A"; +} + +.mdi-weather-fog::before { + content: "\F0591"; +} + +.mdi-weather-hail::before { + content: "\F0592"; +} + +.mdi-weather-hazy::before { + content: "\F0F30"; +} + +.mdi-weather-hurricane::before { + content: "\F0898"; +} + +.mdi-weather-hurricane-outline::before { + content: "\F1C78"; +} + +.mdi-weather-lightning::before { + content: "\F0593"; +} + +.mdi-weather-lightning-rainy::before { + content: "\F067E"; +} + +.mdi-weather-moonset::before { + content: "\F1D15"; +} + +.mdi-weather-moonset-down::before { + content: "\F1D16"; +} + +.mdi-weather-moonset-up::before { + content: "\F1D17"; +} + +.mdi-weather-night::before { + content: "\F0594"; +} + +.mdi-weather-night-partly-cloudy::before { + content: "\F0F31"; +} + +.mdi-weather-partly-cloudy::before { + content: "\F0595"; +} + +.mdi-weather-partly-lightning::before { + content: "\F0F32"; +} + +.mdi-weather-partly-rainy::before { + content: "\F0F33"; +} + +.mdi-weather-partly-snowy::before { + content: "\F0F34"; +} + +.mdi-weather-partly-snowy-rainy::before { + content: "\F0F35"; +} + +.mdi-weather-pouring::before { + content: "\F0596"; +} + +.mdi-weather-rainy::before { + content: "\F0597"; +} + +.mdi-weather-snowy::before { + content: "\F0598"; +} + +.mdi-weather-snowy-heavy::before { + content: "\F0F36"; +} + +.mdi-weather-snowy-rainy::before { + content: "\F067F"; +} + +.mdi-weather-sunny::before { + content: "\F0599"; +} + +.mdi-weather-sunny-alert::before { + content: "\F0F37"; +} + +.mdi-weather-sunny-off::before { + content: "\F14E4"; +} + +.mdi-weather-sunset::before { + content: "\F059A"; +} + +.mdi-weather-sunset-down::before { + content: "\F059B"; +} + +.mdi-weather-sunset-up::before { + content: "\F059C"; +} + +.mdi-weather-tornado::before { + content: "\F0F38"; +} + +.mdi-weather-windy::before { + content: "\F059D"; +} + +.mdi-weather-windy-variant::before { + content: "\F059E"; +} + +.mdi-web::before { + content: "\F059F"; +} + +.mdi-web-box::before { + content: "\F0F94"; +} + +.mdi-web-cancel::before { + content: "\F1790"; +} + +.mdi-web-check::before { + content: "\F0789"; +} + +.mdi-web-clock::before { + content: "\F124A"; +} + +.mdi-web-minus::before { + content: "\F10A0"; +} + +.mdi-web-off::before { + content: "\F0A8E"; +} + +.mdi-web-plus::before { + content: "\F0033"; +} + +.mdi-web-refresh::before { + content: "\F1791"; +} + +.mdi-web-remove::before { + content: "\F0551"; +} + +.mdi-web-sync::before { + content: "\F1792"; +} + +.mdi-webcam::before { + content: "\F05A0"; +} + +.mdi-webcam-off::before { + content: "\F1737"; +} + +.mdi-webhook::before { + content: "\F062F"; +} + +.mdi-webpack::before { + content: "\F072B"; +} + +.mdi-webrtc::before { + content: "\F1248"; +} + +.mdi-wechat::before { + content: "\F0611"; +} + +.mdi-weight::before { + content: "\F05A1"; +} + +.mdi-weight-gram::before { + content: "\F0D3F"; +} + +.mdi-weight-kilogram::before { + content: "\F05A2"; +} + +.mdi-weight-lifter::before { + content: "\F115D"; +} + +.mdi-weight-pound::before { + content: "\F09B5"; +} + +.mdi-whatsapp::before { + content: "\F05A3"; +} + +.mdi-wheel-barrow::before { + content: "\F14F2"; +} + +.mdi-wheelchair::before { + content: "\F1A87"; +} + +.mdi-wheelchair-accessibility::before { + content: "\F05A4"; +} + +.mdi-whistle::before { + content: "\F09B6"; +} + +.mdi-whistle-outline::before { + content: "\F12BC"; +} + +.mdi-white-balance-auto::before { + content: "\F05A5"; +} + +.mdi-white-balance-incandescent::before { + content: "\F05A6"; +} + +.mdi-white-balance-iridescent::before { + content: "\F05A7"; +} + +.mdi-white-balance-sunny::before { + content: "\F05A8"; +} + +.mdi-widgets::before { + content: "\F072C"; +} + +.mdi-widgets-outline::before { + content: "\F1355"; +} + +.mdi-wifi::before { + content: "\F05A9"; +} + +.mdi-wifi-alert::before { + content: "\F16B5"; +} + +.mdi-wifi-arrow-down::before { + content: "\F16B6"; +} + +.mdi-wifi-arrow-left::before { + content: "\F16B7"; +} + +.mdi-wifi-arrow-left-right::before { + content: "\F16B8"; +} + +.mdi-wifi-arrow-right::before { + content: "\F16B9"; +} + +.mdi-wifi-arrow-up::before { + content: "\F16BA"; +} + +.mdi-wifi-arrow-up-down::before { + content: "\F16BB"; +} + +.mdi-wifi-cancel::before { + content: "\F16BC"; +} + +.mdi-wifi-check::before { + content: "\F16BD"; +} + +.mdi-wifi-cog::before { + content: "\F16BE"; +} + +.mdi-wifi-lock::before { + content: "\F16BF"; +} + +.mdi-wifi-lock-open::before { + content: "\F16C0"; +} + +.mdi-wifi-marker::before { + content: "\F16C1"; +} + +.mdi-wifi-minus::before { + content: "\F16C2"; +} + +.mdi-wifi-off::before { + content: "\F05AA"; +} + +.mdi-wifi-plus::before { + content: "\F16C3"; +} + +.mdi-wifi-refresh::before { + content: "\F16C4"; +} + +.mdi-wifi-remove::before { + content: "\F16C5"; +} + +.mdi-wifi-settings::before { + content: "\F16C6"; +} + +.mdi-wifi-star::before { + content: "\F0E0B"; +} + +.mdi-wifi-strength-1::before { + content: "\F091F"; +} + +.mdi-wifi-strength-1-alert::before { + content: "\F0920"; +} + +.mdi-wifi-strength-1-lock::before { + content: "\F0921"; +} + +.mdi-wifi-strength-1-lock-open::before { + content: "\F16CB"; +} + +.mdi-wifi-strength-2::before { + content: "\F0922"; +} + +.mdi-wifi-strength-2-alert::before { + content: "\F0923"; +} + +.mdi-wifi-strength-2-lock::before { + content: "\F0924"; +} + +.mdi-wifi-strength-2-lock-open::before { + content: "\F16CC"; +} + +.mdi-wifi-strength-3::before { + content: "\F0925"; +} + +.mdi-wifi-strength-3-alert::before { + content: "\F0926"; +} + +.mdi-wifi-strength-3-lock::before { + content: "\F0927"; +} + +.mdi-wifi-strength-3-lock-open::before { + content: "\F16CD"; +} + +.mdi-wifi-strength-4::before { + content: "\F0928"; +} + +.mdi-wifi-strength-4-alert::before { + content: "\F0929"; +} + +.mdi-wifi-strength-4-lock::before { + content: "\F092A"; +} + +.mdi-wifi-strength-4-lock-open::before { + content: "\F16CE"; +} + +.mdi-wifi-strength-alert-outline::before { + content: "\F092B"; +} + +.mdi-wifi-strength-lock-open-outline::before { + content: "\F16CF"; +} + +.mdi-wifi-strength-lock-outline::before { + content: "\F092C"; +} + +.mdi-wifi-strength-off::before { + content: "\F092D"; +} + +.mdi-wifi-strength-off-outline::before { + content: "\F092E"; +} + +.mdi-wifi-strength-outline::before { + content: "\F092F"; +} + +.mdi-wifi-sync::before { + content: "\F16C7"; +} + +.mdi-wikipedia::before { + content: "\F05AC"; +} + +.mdi-wind-power::before { + content: "\F1A88"; +} + +.mdi-wind-power-outline::before { + content: "\F1A89"; +} + +.mdi-wind-turbine::before { + content: "\F0DA5"; +} + +.mdi-wind-turbine-alert::before { + content: "\F19AB"; +} + +.mdi-wind-turbine-check::before { + content: "\F19AC"; +} + +.mdi-window-close::before { + content: "\F05AD"; +} + +.mdi-window-closed::before { + content: "\F05AE"; +} + +.mdi-window-closed-variant::before { + content: "\F11DB"; +} + +.mdi-window-maximize::before { + content: "\F05AF"; +} + +.mdi-window-minimize::before { + content: "\F05B0"; +} + +.mdi-window-open::before { + content: "\F05B1"; +} + +.mdi-window-open-variant::before { + content: "\F11DC"; +} + +.mdi-window-restore::before { + content: "\F05B2"; +} + +.mdi-window-shutter::before { + content: "\F111C"; +} + +.mdi-window-shutter-alert::before { + content: "\F111D"; +} + +.mdi-window-shutter-auto::before { + content: "\F1BA3"; +} + +.mdi-window-shutter-cog::before { + content: "\F1A8A"; +} + +.mdi-window-shutter-open::before { + content: "\F111E"; +} + +.mdi-window-shutter-settings::before { + content: "\F1A8B"; +} + +.mdi-windsock::before { + content: "\F15FA"; +} + +.mdi-wiper::before { + content: "\F0AE9"; +} + +.mdi-wiper-wash::before { + content: "\F0DA6"; +} + +.mdi-wiper-wash-alert::before { + content: "\F18DF"; +} + +.mdi-wizard-hat::before { + content: "\F1477"; +} + +.mdi-wordpress::before { + content: "\F05B4"; +} + +.mdi-wrap::before { + content: "\F05B6"; +} + +.mdi-wrap-disabled::before { + content: "\F0BDF"; +} + +.mdi-wrench::before { + content: "\F05B7"; +} + +.mdi-wrench-check::before { + content: "\F1B8F"; +} + +.mdi-wrench-check-outline::before { + content: "\F1B90"; +} + +.mdi-wrench-clock::before { + content: "\F19A3"; +} + +.mdi-wrench-clock-outline::before { + content: "\F1B93"; +} + +.mdi-wrench-cog::before { + content: "\F1B91"; +} + +.mdi-wrench-cog-outline::before { + content: "\F1B92"; +} + +.mdi-wrench-outline::before { + content: "\F0BE0"; +} + +.mdi-xamarin::before { + content: "\F0845"; +} + +.mdi-xml::before { + content: "\F05C0"; +} + +.mdi-xmpp::before { + content: "\F07FF"; +} + +.mdi-yahoo::before { + content: "\F0B4F"; +} + +.mdi-yeast::before { + content: "\F05C1"; +} + +.mdi-yin-yang::before { + content: "\F0680"; +} + +.mdi-yoga::before { + content: "\F117C"; +} + +.mdi-youtube::before { + content: "\F05C3"; +} + +.mdi-youtube-gaming::before { + content: "\F0848"; +} + +.mdi-youtube-studio::before { + content: "\F0847"; +} + +.mdi-youtube-subscription::before { + content: "\F0D40"; +} + +.mdi-youtube-tv::before { + content: "\F0448"; +} + +.mdi-yurt::before { + content: "\F1516"; +} + +.mdi-z-wave::before { + content: "\F0AEA"; +} + +.mdi-zend::before { + content: "\F0AEB"; +} + +.mdi-zigbee::before { + content: "\F0D41"; +} + +.mdi-zip-box::before { + content: "\F05C4"; +} + +.mdi-zip-box-outline::before { + content: "\F0FFA"; +} + +.mdi-zip-disk::before { + content: "\F0A23"; +} + +.mdi-zodiac-aquarius::before { + content: "\F0A7D"; +} + +.mdi-zodiac-aries::before { + content: "\F0A7E"; +} + +.mdi-zodiac-cancer::before { + content: "\F0A7F"; +} + +.mdi-zodiac-capricorn::before { + content: "\F0A80"; +} + +.mdi-zodiac-gemini::before { + content: "\F0A81"; +} + +.mdi-zodiac-leo::before { + content: "\F0A82"; +} + +.mdi-zodiac-libra::before { + content: "\F0A83"; +} + +.mdi-zodiac-pisces::before { + content: "\F0A84"; +} + +.mdi-zodiac-sagittarius::before { + content: "\F0A85"; +} + +.mdi-zodiac-scorpio::before { + content: "\F0A86"; +} + +.mdi-zodiac-taurus::before { + content: "\F0A87"; +} + +.mdi-zodiac-virgo::before { + content: "\F0A88"; +} + +.mdi-blank::before { + content: "\F68C"; + visibility: hidden; +} + +.mdi-18px.mdi-set, .mdi-18px.mdi:before { + font-size: 18px; +} + +.mdi-24px.mdi-set, .mdi-24px.mdi:before { + font-size: 24px; +} + +.mdi-36px.mdi-set, .mdi-36px.mdi:before { + font-size: 36px; +} + +.mdi-48px.mdi-set, .mdi-48px.mdi:before { + font-size: 48px; +} + +.mdi-dark:before { + color: rgba(0, 0, 0, 0.54); +} + +.mdi-dark.mdi-inactive:before { + color: rgba(0, 0, 0, 0.26); +} + +.mdi-light:before { + color: white; +} + +.mdi-light.mdi-inactive:before { + color: rgba(255, 255, 255, 0.3); +} + +.mdi-rotate-45 { + /* + // Not included in production + &.mdi-flip-h:before { + -webkit-transform: scaleX(-1) rotate(45deg); + transform: scaleX(-1) rotate(45deg); + filter: FlipH; + -ms-filter: "FlipH"; + } + &.mdi-flip-v:before { + -webkit-transform: scaleY(-1) rotate(45deg); + -ms-transform: rotate(45deg); + transform: scaleY(-1) rotate(45deg); + filter: FlipV; + -ms-filter: "FlipV"; + } + */ +} + +.mdi-rotate-45:before { + -webkit-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); +} + +.mdi-rotate-90 { + /* + // Not included in production + &.mdi-flip-h:before { + -webkit-transform: scaleX(-1) rotate(90deg); + transform: scaleX(-1) rotate(90deg); + filter: FlipH; + -ms-filter: "FlipH"; + } + &.mdi-flip-v:before { + -webkit-transform: scaleY(-1) rotate(90deg); + -ms-transform: rotate(90deg); + transform: scaleY(-1) rotate(90deg); + filter: FlipV; + -ms-filter: "FlipV"; + } + */ +} + +.mdi-rotate-90:before { + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} + +.mdi-rotate-135 { + /* + // Not included in production + &.mdi-flip-h:before { + -webkit-transform: scaleX(-1) rotate(135deg); + transform: scaleX(-1) rotate(135deg); + filter: FlipH; + -ms-filter: "FlipH"; + } + &.mdi-flip-v:before { + -webkit-transform: scaleY(-1) rotate(135deg); + -ms-transform: rotate(135deg); + transform: scaleY(-1) rotate(135deg); + filter: FlipV; + -ms-filter: "FlipV"; + } + */ +} + +.mdi-rotate-135:before { + -webkit-transform: rotate(135deg); + -ms-transform: rotate(135deg); + transform: rotate(135deg); +} + +.mdi-rotate-180 { + /* + // Not included in production + &.mdi-flip-h:before { + -webkit-transform: scaleX(-1) rotate(180deg); + transform: scaleX(-1) rotate(180deg); + filter: FlipH; + -ms-filter: "FlipH"; + } + &.mdi-flip-v:before { + -webkit-transform: scaleY(-1) rotate(180deg); + -ms-transform: rotate(180deg); + transform: scaleY(-1) rotate(180deg); + filter: FlipV; + -ms-filter: "FlipV"; + } + */ +} + +.mdi-rotate-180:before { + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} + +.mdi-rotate-225 { + /* + // Not included in production + &.mdi-flip-h:before { + -webkit-transform: scaleX(-1) rotate(225deg); + transform: scaleX(-1) rotate(225deg); + filter: FlipH; + -ms-filter: "FlipH"; + } + &.mdi-flip-v:before { + -webkit-transform: scaleY(-1) rotate(225deg); + -ms-transform: rotate(225deg); + transform: scaleY(-1) rotate(225deg); + filter: FlipV; + -ms-filter: "FlipV"; + } + */ +} + +.mdi-rotate-225:before { + -webkit-transform: rotate(225deg); + -ms-transform: rotate(225deg); + transform: rotate(225deg); +} + +.mdi-rotate-270 { + /* + // Not included in production + &.mdi-flip-h:before { + -webkit-transform: scaleX(-1) rotate(270deg); + transform: scaleX(-1) rotate(270deg); + filter: FlipH; + -ms-filter: "FlipH"; + } + &.mdi-flip-v:before { + -webkit-transform: scaleY(-1) rotate(270deg); + -ms-transform: rotate(270deg); + transform: scaleY(-1) rotate(270deg); + filter: FlipV; + -ms-filter: "FlipV"; + } + */ +} + +.mdi-rotate-270:before { + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} + +.mdi-rotate-315 { + /* + // Not included in production + &.mdi-flip-h:before { + -webkit-transform: scaleX(-1) rotate(315deg); + transform: scaleX(-1) rotate(315deg); + filter: FlipH; + -ms-filter: "FlipH"; + } + &.mdi-flip-v:before { + -webkit-transform: scaleY(-1) rotate(315deg); + -ms-transform: rotate(315deg); + transform: scaleY(-1) rotate(315deg); + filter: FlipV; + -ms-filter: "FlipV"; + } + */ +} + +.mdi-rotate-315:before { + -webkit-transform: rotate(315deg); + -ms-transform: rotate(315deg); + transform: rotate(315deg); +} + +.mdi-flip-h:before { + -webkit-transform: scaleX(-1); + transform: scaleX(-1); + filter: FlipH; + -ms-filter: "FlipH"; +} + +.mdi-flip-v:before { + -webkit-transform: scaleY(-1); + transform: scaleY(-1); + filter: FlipV; + -ms-filter: "FlipV"; +} + +.mdi-spin:before { + -webkit-animation: mdi-spin 2s infinite linear; + animation: mdi-spin 2s infinite linear; +} + +@-webkit-keyframes mdi-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes mdi-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +/*# sourceMappingURL=materialdesignicons.css.map */ +.jobsTable > .v-table__wrapper > table > thead > tr > th > .v-data-table-header__content { + font-weight: bold; + text-align: center; + display: block; +} +.jobsTable > .v-table__wrapper > table > thead > tr > th, +.jobsTable > .v-table__wrapper > table > tbody > tr > td { + padding-right: 6px; + padding-left: 6px; +} +.jobsTable > .v-table__wrapper > table > tbody > tr > td { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} +.jobsTable > .v-table__wrapper > table > tbody > tr > td.v-data-table__td--select-row { + width: 0% !important; + max-width: 150px !important; +} +.jobsTable.v-table--hover > .v-table__wrapper > table > tbody > tr:hover { + background-color: hsla(207, 90%, 54%, 0.081); +} +.jobsTable > .v-table__wrapper > table > tbody > .v-data-table__tr > .v-data-table__td > .v-selection-control--density-default { + --v-selection-control-size: 0px; + margin-left: 20px; +} +.jobsTable > .v-table__wrapper > table > tbody > tr.v-data-table__selected { + background: #7d92f5; +} +.jobsTable tbody tr:nth-child(even) { + background: hsla(230, 86%, 73%, 0.075); +} +.font-bold { + font-size: 1rem; + font-weight: 500; + text-align: center; +} +.succeed-row-light { + background-color: #e0ffc4 !important; +} +.succeed-row-dark { + background-color: #183820 !important; +} +.select-list-item .v-list-item-title { + font-weight: 600; +} +.state-chip { + display: flex; + justify-content: center; + font-weight: bold; + color: white !important; +} + +[data-v-d0c36418] .chip-button { + color: white !important; + width: 38px; + height: 30px !important; +} +.nightly-label[data-v-d0c36418] { + font-size: 0.75rem; + background-color: hsl(0, 100%, 77%); + transition: background-color 0.2s ease; +} +.select-list-item[data-v-d0c36418]:hover { + background-color: hsla(207, 90%, 54%, 0.081); + transition: background-color 0.2s ease; +} +.select-list-item[data-v-d0c36418]:selected { + background-color: hsla(207, 90%, 54%, 0.081); + transition: background-color 0.2s ease; +} +.list-header[data-v-d0c36418] { + cursor: default; + text-align: center; + font-weight: bolder; + margin: auto; +} + +[data-v-ba34f52e] .v-list-item-title { + font-weight: bold; + font-size: 95%; +} +.user-mngmnt[data-v-ba34f52e] { + color: orange; +} +.v-navigation-drawer.v-theme--light[data-v-ba34f52e] { + background-color: #2196F3; +} + +.v-data-table .v-progress-linear__indeterminate { + background-color: #7d92f5; /* Replace with desired color */ +} + +.font-small[data-v-507e7f68] { + font-size: 0.8em; +} +.flashing[data-v-507e7f68] { + display: inline-block; + animation: blink-507e7f68 1.5s infinite; +} +@keyframes blink-507e7f68 { +0%, 100% { opacity: 0.3; +} +50% { opacity: 1; +} +} diff --git a/newman-server/web/assets/index-D6lX-z2N.js b/newman-server/web/assets/index-D6lX-z2N.js new file mode 100644 index 00000000..1e281371 --- /dev/null +++ b/newman-server/web/assets/index-D6lX-z2N.js @@ -0,0 +1,47232 @@ +var _a; +(function polyfill() { + const relList = document.createElement("link").relList; + if (relList && relList.supports && relList.supports("modulepreload")) { + return; + } + for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { + processPreload(link); + } + new MutationObserver((mutations) => { + for (const mutation of mutations) { + if (mutation.type !== "childList") { + continue; + } + for (const node of mutation.addedNodes) { + if (node.tagName === "LINK" && node.rel === "modulepreload") + processPreload(node); + } + } + }).observe(document, { childList: true, subtree: true }); + function getFetchOpts(link) { + const fetchOpts = {}; + if (link.integrity) fetchOpts.integrity = link.integrity; + if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy; + if (link.crossOrigin === "use-credentials") + fetchOpts.credentials = "include"; + else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit"; + else fetchOpts.credentials = "same-origin"; + return fetchOpts; + } + function processPreload(link) { + if (link.ep) + return; + link.ep = true; + const fetchOpts = getFetchOpts(link); + fetch(link.href, fetchOpts); + } +})(); +/** +* @vue/shared v3.5.14 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function makeMap(str) { + const map = /* @__PURE__ */ Object.create(null); + for (const key of str.split(",")) map[key] = 1; + return (val) => val in map; +} +const EMPTY_OBJ = {}; +const EMPTY_ARR = []; +const NOOP = () => { +}; +const NO = () => false; +const isOn$1 = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter +(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97); +const isModelListener = (key) => key.startsWith("onUpdate:"); +const extend$1 = Object.assign; +const remove = (arr, el) => { + const i = arr.indexOf(el); + if (i > -1) { + arr.splice(i, 1); + } +}; +const hasOwnProperty$2 = Object.prototype.hasOwnProperty; +const hasOwn = (val, key) => hasOwnProperty$2.call(val, key); +const isArray$2 = Array.isArray; +const isMap = (val) => toTypeString(val) === "[object Map]"; +const isSet = (val) => toTypeString(val) === "[object Set]"; +const isFunction$1 = (val) => typeof val === "function"; +const isString$1 = (val) => typeof val === "string"; +const isSymbol = (val) => typeof val === "symbol"; +const isObject$2 = (val) => val !== null && typeof val === "object"; +const isPromise = (val) => { + return (isObject$2(val) || isFunction$1(val)) && isFunction$1(val.then) && isFunction$1(val.catch); +}; +const objectToString = Object.prototype.toString; +const toTypeString = (value) => objectToString.call(value); +const toRawType = (value) => { + return toTypeString(value).slice(8, -1); +}; +const isPlainObject$2 = (val) => toTypeString(val) === "[object Object]"; +const isIntegerKey = (key) => isString$1(key) && key !== "NaN" && key[0] !== "-" && "" + parseInt(key, 10) === key; +const isReservedProp = /* @__PURE__ */ makeMap( + // the leading comma is intentional so empty string "" is also included + ",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted" +); +const cacheStringFunction = (fn) => { + const cache = /* @__PURE__ */ Object.create(null); + return (str) => { + const hit = cache[str]; + return hit || (cache[str] = fn(str)); + }; +}; +const camelizeRE = /-(\w)/g; +const camelize = cacheStringFunction( + (str) => { + return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); + } +); +const hyphenateRE = /\B([A-Z])/g; +const hyphenate = cacheStringFunction( + (str) => str.replace(hyphenateRE, "-$1").toLowerCase() +); +const capitalize = cacheStringFunction((str) => { + return str.charAt(0).toUpperCase() + str.slice(1); +}); +const toHandlerKey = cacheStringFunction( + (str) => { + const s = str ? `on${capitalize(str)}` : ``; + return s; + } +); +const hasChanged = (value, oldValue) => !Object.is(value, oldValue); +const invokeArrayFns = (fns, ...arg) => { + for (let i = 0; i < fns.length; i++) { + fns[i](...arg); + } +}; +const def = (obj, key, value, writable = false) => { + Object.defineProperty(obj, key, { + configurable: true, + enumerable: false, + writable, + value + }); +}; +const looseToNumber = (val) => { + const n = parseFloat(val); + return isNaN(n) ? val : n; +}; +const toNumber = (val) => { + const n = isString$1(val) ? Number(val) : NaN; + return isNaN(n) ? val : n; +}; +let _globalThis; +const getGlobalThis = () => { + return _globalThis || (_globalThis = typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : {}); +}; +function normalizeStyle(value) { + if (isArray$2(value)) { + const res = {}; + for (let i = 0; i < value.length; i++) { + const item = value[i]; + const normalized = isString$1(item) ? parseStringStyle(item) : normalizeStyle(item); + if (normalized) { + for (const key in normalized) { + res[key] = normalized[key]; + } + } + } + return res; + } else if (isString$1(value) || isObject$2(value)) { + return value; + } +} +const listDelimiterRE = /;(?![^(]*\))/g; +const propertyDelimiterRE = /:([^]+)/; +const styleCommentRE = /\/\*[^]*?\*\//g; +function parseStringStyle(cssText) { + const ret = {}; + cssText.replace(styleCommentRE, "").split(listDelimiterRE).forEach((item) => { + if (item) { + const tmp = item.split(propertyDelimiterRE); + tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim()); + } + }); + return ret; +} +function normalizeClass(value) { + let res = ""; + if (isString$1(value)) { + res = value; + } else if (isArray$2(value)) { + for (let i = 0; i < value.length; i++) { + const normalized = normalizeClass(value[i]); + if (normalized) { + res += normalized + " "; + } + } + } else if (isObject$2(value)) { + for (const name in value) { + if (value[name]) { + res += name + " "; + } + } + } + return res.trim(); +} +function normalizeProps(props) { + if (!props) return null; + let { class: klass, style } = props; + if (klass && !isString$1(klass)) { + props.class = normalizeClass(klass); + } + if (style) { + props.style = normalizeStyle(style); + } + return props; +} +const specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`; +const isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs); +function includeBooleanAttr(value) { + return !!value || value === ""; +} +const isRef$1 = (val) => { + return !!(val && val["__v_isRef"] === true); +}; +const toDisplayString = (val) => { + return isString$1(val) ? val : val == null ? "" : isArray$2(val) || isObject$2(val) && (val.toString === objectToString || !isFunction$1(val.toString)) ? isRef$1(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val); +}; +const replacer = (_key, val) => { + if (isRef$1(val)) { + return replacer(_key, val.value); + } else if (isMap(val)) { + return { + [`Map(${val.size})`]: [...val.entries()].reduce( + (entries, [key, val2], i) => { + entries[stringifySymbol(key, i) + " =>"] = val2; + return entries; + }, + {} + ) + }; + } else if (isSet(val)) { + return { + [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v)) + }; + } else if (isSymbol(val)) { + return stringifySymbol(val); + } else if (isObject$2(val) && !isArray$2(val) && !isPlainObject$2(val)) { + return String(val); + } + return val; +}; +const stringifySymbol = (v, i = "") => { + var _a2; + return ( + // Symbol.description in es2019+ so we need to cast here to pass + // the lib: es2016 check + isSymbol(v) ? `Symbol(${(_a2 = v.description) != null ? _a2 : i})` : v + ); +}; +/** +* @vue/reactivity v3.5.14 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +let activeEffectScope; +class EffectScope { + constructor(detached = false) { + this.detached = detached; + this._active = true; + this._on = 0; + this.effects = []; + this.cleanups = []; + this._isPaused = false; + this.parent = activeEffectScope; + if (!detached && activeEffectScope) { + this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push( + this + ) - 1; + } + } + get active() { + return this._active; + } + pause() { + if (this._active) { + this._isPaused = true; + let i, l; + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].pause(); + } + } + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].pause(); + } + } + } + /** + * Resumes the effect scope, including all child scopes and effects. + */ + resume() { + if (this._active) { + if (this._isPaused) { + this._isPaused = false; + let i, l; + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].resume(); + } + } + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].resume(); + } + } + } + } + run(fn) { + if (this._active) { + const currentEffectScope = activeEffectScope; + try { + activeEffectScope = this; + return fn(); + } finally { + activeEffectScope = currentEffectScope; + } + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + on() { + if (++this._on === 1) { + this.prevScope = activeEffectScope; + activeEffectScope = this; + } + } + /** + * This should only be called on non-detached scopes + * @internal + */ + off() { + if (this._on > 0 && --this._on === 0) { + activeEffectScope = this.prevScope; + this.prevScope = void 0; + } + } + stop(fromParent) { + if (this._active) { + this._active = false; + let i, l; + for (i = 0, l = this.effects.length; i < l; i++) { + this.effects[i].stop(); + } + this.effects.length = 0; + for (i = 0, l = this.cleanups.length; i < l; i++) { + this.cleanups[i](); + } + this.cleanups.length = 0; + if (this.scopes) { + for (i = 0, l = this.scopes.length; i < l; i++) { + this.scopes[i].stop(true); + } + this.scopes.length = 0; + } + if (!this.detached && this.parent && !fromParent) { + const last = this.parent.scopes.pop(); + if (last && last !== this) { + this.parent.scopes[this.index] = last; + last.index = this.index; + } + } + this.parent = void 0; + } + } +} +function effectScope(detached) { + return new EffectScope(detached); +} +function getCurrentScope() { + return activeEffectScope; +} +function onScopeDispose(fn, failSilently = false) { + if (activeEffectScope) { + activeEffectScope.cleanups.push(fn); + } +} +let activeSub; +const pausedQueueEffects = /* @__PURE__ */ new WeakSet(); +class ReactiveEffect { + constructor(fn) { + this.fn = fn; + this.deps = void 0; + this.depsTail = void 0; + this.flags = 1 | 4; + this.next = void 0; + this.cleanup = void 0; + this.scheduler = void 0; + if (activeEffectScope && activeEffectScope.active) { + activeEffectScope.effects.push(this); + } + } + pause() { + this.flags |= 64; + } + resume() { + if (this.flags & 64) { + this.flags &= -65; + if (pausedQueueEffects.has(this)) { + pausedQueueEffects.delete(this); + this.trigger(); + } + } + } + /** + * @internal + */ + notify() { + if (this.flags & 2 && !(this.flags & 32)) { + return; + } + if (!(this.flags & 8)) { + batch(this); + } + } + run() { + if (!(this.flags & 1)) { + return this.fn(); + } + this.flags |= 2; + cleanupEffect(this); + prepareDeps(this); + const prevEffect = activeSub; + const prevShouldTrack = shouldTrack; + activeSub = this; + shouldTrack = true; + try { + return this.fn(); + } finally { + cleanupDeps(this); + activeSub = prevEffect; + shouldTrack = prevShouldTrack; + this.flags &= -3; + } + } + stop() { + if (this.flags & 1) { + for (let link = this.deps; link; link = link.nextDep) { + removeSub(link); + } + this.deps = this.depsTail = void 0; + cleanupEffect(this); + this.onStop && this.onStop(); + this.flags &= -2; + } + } + trigger() { + if (this.flags & 64) { + pausedQueueEffects.add(this); + } else if (this.scheduler) { + this.scheduler(); + } else { + this.runIfDirty(); + } + } + /** + * @internal + */ + runIfDirty() { + if (isDirty(this)) { + this.run(); + } + } + get dirty() { + return isDirty(this); + } +} +let batchDepth = 0; +let batchedSub; +let batchedComputed; +function batch(sub, isComputed = false) { + sub.flags |= 8; + if (isComputed) { + sub.next = batchedComputed; + batchedComputed = sub; + return; + } + sub.next = batchedSub; + batchedSub = sub; +} +function startBatch() { + batchDepth++; +} +function endBatch() { + if (--batchDepth > 0) { + return; + } + if (batchedComputed) { + let e = batchedComputed; + batchedComputed = void 0; + while (e) { + const next = e.next; + e.next = void 0; + e.flags &= -9; + e = next; + } + } + let error; + while (batchedSub) { + let e = batchedSub; + batchedSub = void 0; + while (e) { + const next = e.next; + e.next = void 0; + e.flags &= -9; + if (e.flags & 1) { + try { + ; + e.trigger(); + } catch (err) { + if (!error) error = err; + } + } + e = next; + } + } + if (error) throw error; +} +function prepareDeps(sub) { + for (let link = sub.deps; link; link = link.nextDep) { + link.version = -1; + link.prevActiveLink = link.dep.activeLink; + link.dep.activeLink = link; + } +} +function cleanupDeps(sub) { + let head; + let tail = sub.depsTail; + let link = tail; + while (link) { + const prev = link.prevDep; + if (link.version === -1) { + if (link === tail) tail = prev; + removeSub(link); + removeDep(link); + } else { + head = link; + } + link.dep.activeLink = link.prevActiveLink; + link.prevActiveLink = void 0; + link = prev; + } + sub.deps = head; + sub.depsTail = tail; +} +function isDirty(sub) { + for (let link = sub.deps; link; link = link.nextDep) { + if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) { + return true; + } + } + if (sub._dirty) { + return true; + } + return false; +} +function refreshComputed(computed2) { + if (computed2.flags & 4 && !(computed2.flags & 16)) { + return; + } + computed2.flags &= -17; + if (computed2.globalVersion === globalVersion) { + return; + } + computed2.globalVersion = globalVersion; + if (!computed2.isSSR && computed2.flags & 128 && (!computed2.deps && !computed2._dirty || !isDirty(computed2))) { + return; + } + computed2.flags |= 2; + const dep = computed2.dep; + const prevSub = activeSub; + const prevShouldTrack = shouldTrack; + activeSub = computed2; + shouldTrack = true; + try { + prepareDeps(computed2); + const value = computed2.fn(computed2._value); + if (dep.version === 0 || hasChanged(value, computed2._value)) { + computed2.flags |= 128; + computed2._value = value; + dep.version++; + } + } catch (err) { + dep.version++; + throw err; + } finally { + activeSub = prevSub; + shouldTrack = prevShouldTrack; + cleanupDeps(computed2); + computed2.flags &= -3; + } +} +function removeSub(link, soft = false) { + const { dep, prevSub, nextSub } = link; + if (prevSub) { + prevSub.nextSub = nextSub; + link.prevSub = void 0; + } + if (nextSub) { + nextSub.prevSub = prevSub; + link.nextSub = void 0; + } + if (dep.subs === link) { + dep.subs = prevSub; + if (!prevSub && dep.computed) { + dep.computed.flags &= -5; + for (let l = dep.computed.deps; l; l = l.nextDep) { + removeSub(l, true); + } + } + } + if (!soft && !--dep.sc && dep.map) { + dep.map.delete(dep.key); + } +} +function removeDep(link) { + const { prevDep, nextDep } = link; + if (prevDep) { + prevDep.nextDep = nextDep; + link.prevDep = void 0; + } + if (nextDep) { + nextDep.prevDep = prevDep; + link.nextDep = void 0; + } +} +let shouldTrack = true; +const trackStack = []; +function pauseTracking() { + trackStack.push(shouldTrack); + shouldTrack = false; +} +function resetTracking() { + const last = trackStack.pop(); + shouldTrack = last === void 0 ? true : last; +} +function cleanupEffect(e) { + const { cleanup } = e; + e.cleanup = void 0; + if (cleanup) { + const prevSub = activeSub; + activeSub = void 0; + try { + cleanup(); + } finally { + activeSub = prevSub; + } + } +} +let globalVersion = 0; +class Link { + constructor(sub, dep) { + this.sub = sub; + this.dep = dep; + this.version = dep.version; + this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0; + } +} +class Dep { + constructor(computed2) { + this.computed = computed2; + this.version = 0; + this.activeLink = void 0; + this.subs = void 0; + this.map = void 0; + this.key = void 0; + this.sc = 0; + } + track(debugInfo) { + if (!activeSub || !shouldTrack || activeSub === this.computed) { + return; + } + let link = this.activeLink; + if (link === void 0 || link.sub !== activeSub) { + link = this.activeLink = new Link(activeSub, this); + if (!activeSub.deps) { + activeSub.deps = activeSub.depsTail = link; + } else { + link.prevDep = activeSub.depsTail; + activeSub.depsTail.nextDep = link; + activeSub.depsTail = link; + } + addSub(link); + } else if (link.version === -1) { + link.version = this.version; + if (link.nextDep) { + const next = link.nextDep; + next.prevDep = link.prevDep; + if (link.prevDep) { + link.prevDep.nextDep = next; + } + link.prevDep = activeSub.depsTail; + link.nextDep = void 0; + activeSub.depsTail.nextDep = link; + activeSub.depsTail = link; + if (activeSub.deps === link) { + activeSub.deps = next; + } + } + } + return link; + } + trigger(debugInfo) { + this.version++; + globalVersion++; + this.notify(debugInfo); + } + notify(debugInfo) { + startBatch(); + try { + if (false) ; + for (let link = this.subs; link; link = link.prevSub) { + if (link.sub.notify()) { + ; + link.sub.dep.notify(); + } + } + } finally { + endBatch(); + } + } +} +function addSub(link) { + link.dep.sc++; + if (link.sub.flags & 4) { + const computed2 = link.dep.computed; + if (computed2 && !link.dep.subs) { + computed2.flags |= 4 | 16; + for (let l = computed2.deps; l; l = l.nextDep) { + addSub(l); + } + } + const currentTail = link.dep.subs; + if (currentTail !== link) { + link.prevSub = currentTail; + if (currentTail) currentTail.nextSub = link; + } + link.dep.subs = link; + } +} +const targetMap = /* @__PURE__ */ new WeakMap(); +const ITERATE_KEY = Symbol( + "" +); +const MAP_KEY_ITERATE_KEY = Symbol( + "" +); +const ARRAY_ITERATE_KEY = Symbol( + "" +); +function track(target, type, key) { + if (shouldTrack && activeSub) { + let depsMap = targetMap.get(target); + if (!depsMap) { + targetMap.set(target, depsMap = /* @__PURE__ */ new Map()); + } + let dep = depsMap.get(key); + if (!dep) { + depsMap.set(key, dep = new Dep()); + dep.map = depsMap; + dep.key = key; + } + { + dep.track(); + } + } +} +function trigger(target, type, key, newValue, oldValue, oldTarget) { + const depsMap = targetMap.get(target); + if (!depsMap) { + globalVersion++; + return; + } + const run2 = (dep) => { + if (dep) { + { + dep.trigger(); + } + } + }; + startBatch(); + if (type === "clear") { + depsMap.forEach(run2); + } else { + const targetIsArray = isArray$2(target); + const isArrayIndex = targetIsArray && isIntegerKey(key); + if (targetIsArray && key === "length") { + const newLength = Number(newValue); + depsMap.forEach((dep, key2) => { + if (key2 === "length" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) { + run2(dep); + } + }); + } else { + if (key !== void 0 || depsMap.has(void 0)) { + run2(depsMap.get(key)); + } + if (isArrayIndex) { + run2(depsMap.get(ARRAY_ITERATE_KEY)); + } + switch (type) { + case "add": + if (!targetIsArray) { + run2(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + run2(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } else if (isArrayIndex) { + run2(depsMap.get("length")); + } + break; + case "delete": + if (!targetIsArray) { + run2(depsMap.get(ITERATE_KEY)); + if (isMap(target)) { + run2(depsMap.get(MAP_KEY_ITERATE_KEY)); + } + } + break; + case "set": + if (isMap(target)) { + run2(depsMap.get(ITERATE_KEY)); + } + break; + } + } + } + endBatch(); +} +function getDepFromReactive(object, key) { + const depMap = targetMap.get(object); + return depMap && depMap.get(key); +} +function reactiveReadArray(array) { + const raw = toRaw(array); + if (raw === array) return raw; + track(raw, "iterate", ARRAY_ITERATE_KEY); + return isShallow(array) ? raw : raw.map(toReactive); +} +function shallowReadArray(arr) { + track(arr = toRaw(arr), "iterate", ARRAY_ITERATE_KEY); + return arr; +} +const arrayInstrumentations = { + __proto__: null, + [Symbol.iterator]() { + return iterator$1(this, Symbol.iterator, toReactive); + }, + concat(...args) { + return reactiveReadArray(this).concat( + ...args.map((x) => isArray$2(x) ? reactiveReadArray(x) : x) + ); + }, + entries() { + return iterator$1(this, "entries", (value) => { + value[1] = toReactive(value[1]); + return value; + }); + }, + every(fn, thisArg) { + return apply(this, "every", fn, thisArg, void 0, arguments); + }, + filter(fn, thisArg) { + return apply(this, "filter", fn, thisArg, (v) => v.map(toReactive), arguments); + }, + find(fn, thisArg) { + return apply(this, "find", fn, thisArg, toReactive, arguments); + }, + findIndex(fn, thisArg) { + return apply(this, "findIndex", fn, thisArg, void 0, arguments); + }, + findLast(fn, thisArg) { + return apply(this, "findLast", fn, thisArg, toReactive, arguments); + }, + findLastIndex(fn, thisArg) { + return apply(this, "findLastIndex", fn, thisArg, void 0, arguments); + }, + // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement + forEach(fn, thisArg) { + return apply(this, "forEach", fn, thisArg, void 0, arguments); + }, + includes(...args) { + return searchProxy(this, "includes", args); + }, + indexOf(...args) { + return searchProxy(this, "indexOf", args); + }, + join(separator) { + return reactiveReadArray(this).join(separator); + }, + // keys() iterator only reads `length`, no optimisation required + lastIndexOf(...args) { + return searchProxy(this, "lastIndexOf", args); + }, + map(fn, thisArg) { + return apply(this, "map", fn, thisArg, void 0, arguments); + }, + pop() { + return noTracking(this, "pop"); + }, + push(...args) { + return noTracking(this, "push", args); + }, + reduce(fn, ...args) { + return reduce(this, "reduce", fn, args); + }, + reduceRight(fn, ...args) { + return reduce(this, "reduceRight", fn, args); + }, + shift() { + return noTracking(this, "shift"); + }, + // slice could use ARRAY_ITERATE but also seems to beg for range tracking + some(fn, thisArg) { + return apply(this, "some", fn, thisArg, void 0, arguments); + }, + splice(...args) { + return noTracking(this, "splice", args); + }, + toReversed() { + return reactiveReadArray(this).toReversed(); + }, + toSorted(comparer) { + return reactiveReadArray(this).toSorted(comparer); + }, + toSpliced(...args) { + return reactiveReadArray(this).toSpliced(...args); + }, + unshift(...args) { + return noTracking(this, "unshift", args); + }, + values() { + return iterator$1(this, "values", toReactive); + } +}; +function iterator$1(self2, method, wrapValue) { + const arr = shallowReadArray(self2); + const iter = arr[method](); + if (arr !== self2 && !isShallow(self2)) { + iter._next = iter.next; + iter.next = () => { + const result = iter._next(); + if (result.value) { + result.value = wrapValue(result.value); + } + return result; + }; + } + return iter; +} +const arrayProto = Array.prototype; +function apply(self2, method, fn, thisArg, wrappedRetFn, args) { + const arr = shallowReadArray(self2); + const needsWrap = arr !== self2 && !isShallow(self2); + const methodFn = arr[method]; + if (methodFn !== arrayProto[method]) { + const result2 = methodFn.apply(self2, args); + return needsWrap ? toReactive(result2) : result2; + } + let wrappedFn = fn; + if (arr !== self2) { + if (needsWrap) { + wrappedFn = function(item, index) { + return fn.call(this, toReactive(item), index, self2); + }; + } else if (fn.length > 2) { + wrappedFn = function(item, index) { + return fn.call(this, item, index, self2); + }; + } + } + const result = methodFn.call(arr, wrappedFn, thisArg); + return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result; +} +function reduce(self2, method, fn, args) { + const arr = shallowReadArray(self2); + let wrappedFn = fn; + if (arr !== self2) { + if (!isShallow(self2)) { + wrappedFn = function(acc, item, index) { + return fn.call(this, acc, toReactive(item), index, self2); + }; + } else if (fn.length > 3) { + wrappedFn = function(acc, item, index) { + return fn.call(this, acc, item, index, self2); + }; + } + } + return arr[method](wrappedFn, ...args); +} +function searchProxy(self2, method, args) { + const arr = toRaw(self2); + track(arr, "iterate", ARRAY_ITERATE_KEY); + const res = arr[method](...args); + if ((res === -1 || res === false) && isProxy(args[0])) { + args[0] = toRaw(args[0]); + return arr[method](...args); + } + return res; +} +function noTracking(self2, method, args = []) { + pauseTracking(); + startBatch(); + const res = toRaw(self2)[method].apply(self2, args); + endBatch(); + resetTracking(); + return res; +} +const isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`); +const builtInSymbols = new Set( + /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== "arguments" && key !== "caller").map((key) => Symbol[key]).filter(isSymbol) +); +function hasOwnProperty$1(key) { + if (!isSymbol(key)) key = String(key); + const obj = toRaw(this); + track(obj, "has", key); + return obj.hasOwnProperty(key); +} +class BaseReactiveHandler { + constructor(_isReadonly = false, _isShallow = false) { + this._isReadonly = _isReadonly; + this._isShallow = _isShallow; + } + get(target, key, receiver) { + if (key === "__v_skip") return target["__v_skip"]; + const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow; + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_isShallow") { + return isShallow2; + } else if (key === "__v_raw") { + if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype + // this means the receiver is a user proxy of the reactive proxy + Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) { + return target; + } + return; + } + const targetIsArray = isArray$2(target); + if (!isReadonly2) { + let fn; + if (targetIsArray && (fn = arrayInstrumentations[key])) { + return fn; + } + if (key === "hasOwnProperty") { + return hasOwnProperty$1; + } + } + const res = Reflect.get( + target, + key, + // if this is a proxy wrapping a ref, return methods using the raw ref + // as receiver so that we don't have to call `toRaw` on the ref in all + // its class methods + isRef(target) ? target : receiver + ); + if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) { + return res; + } + if (!isReadonly2) { + track(target, "get", key); + } + if (isShallow2) { + return res; + } + if (isRef(res)) { + return targetIsArray && isIntegerKey(key) ? res : res.value; + } + if (isObject$2(res)) { + return isReadonly2 ? readonly(res) : reactive(res); + } + return res; + } +} +class MutableReactiveHandler extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(false, isShallow2); + } + set(target, key, value, receiver) { + let oldValue = target[key]; + if (!this._isShallow) { + const isOldValueReadonly = isReadonly(oldValue); + if (!isShallow(value) && !isReadonly(value)) { + oldValue = toRaw(oldValue); + value = toRaw(value); + } + if (!isArray$2(target) && isRef(oldValue) && !isRef(value)) { + if (isOldValueReadonly) { + return false; + } else { + oldValue.value = value; + return true; + } + } + } + const hadKey = isArray$2(target) && isIntegerKey(key) ? Number(key) < target.length : hasOwn(target, key); + const result = Reflect.set( + target, + key, + value, + isRef(target) ? target : receiver + ); + if (target === toRaw(receiver)) { + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value); + } + } + return result; + } + deleteProperty(target, key) { + const hadKey = hasOwn(target, key); + target[key]; + const result = Reflect.deleteProperty(target, key); + if (result && hadKey) { + trigger(target, "delete", key, void 0); + } + return result; + } + has(target, key) { + const result = Reflect.has(target, key); + if (!isSymbol(key) || !builtInSymbols.has(key)) { + track(target, "has", key); + } + return result; + } + ownKeys(target) { + track( + target, + "iterate", + isArray$2(target) ? "length" : ITERATE_KEY + ); + return Reflect.ownKeys(target); + } +} +class ReadonlyReactiveHandler extends BaseReactiveHandler { + constructor(isShallow2 = false) { + super(true, isShallow2); + } + set(target, key) { + return true; + } + deleteProperty(target, key) { + return true; + } +} +const mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler(); +const readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(); +const shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true); +const shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true); +const toShallow = (value) => value; +const getProto = (v) => Reflect.getPrototypeOf(v); +function createIterableMethod(method, isReadonly2, isShallow2) { + return function(...args) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const targetIsMap = isMap(rawTarget); + const isPair = method === "entries" || method === Symbol.iterator && targetIsMap; + const isKeyOnly = method === "keys" && targetIsMap; + const innerIterator = target[method](...args); + const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive; + !isReadonly2 && track( + rawTarget, + "iterate", + isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY + ); + return { + // iterator protocol + next() { + const { value, done } = innerIterator.next(); + return done ? { value, done } : { + value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value), + done + }; + }, + // iterable protocol + [Symbol.iterator]() { + return this; + } + }; + }; +} +function createReadonlyMethod(type) { + return function(...args) { + return type === "delete" ? false : type === "clear" ? void 0 : this; + }; +} +function createInstrumentations(readonly2, shallow) { + const instrumentations = { + get(key) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!readonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "get", key); + } + track(rawTarget, "get", rawKey); + } + const { has: has2 } = getProto(rawTarget); + const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; + if (has2.call(rawTarget, key)) { + return wrap(target.get(key)); + } else if (has2.call(rawTarget, rawKey)) { + return wrap(target.get(rawKey)); + } else if (target !== rawTarget) { + target.get(key); + } + }, + get size() { + const target = this["__v_raw"]; + !readonly2 && track(toRaw(target), "iterate", ITERATE_KEY); + return Reflect.get(target, "size", target); + }, + has(key) { + const target = this["__v_raw"]; + const rawTarget = toRaw(target); + const rawKey = toRaw(key); + if (!readonly2) { + if (hasChanged(key, rawKey)) { + track(rawTarget, "has", key); + } + track(rawTarget, "has", rawKey); + } + return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey); + }, + forEach(callback, thisArg) { + const observed = this; + const target = observed["__v_raw"]; + const rawTarget = toRaw(target); + const wrap = shallow ? toShallow : readonly2 ? toReadonly : toReactive; + !readonly2 && track(rawTarget, "iterate", ITERATE_KEY); + return target.forEach((value, key) => { + return callback.call(thisArg, wrap(value), wrap(key), observed); + }); + } + }; + extend$1( + instrumentations, + readonly2 ? { + add: createReadonlyMethod("add"), + set: createReadonlyMethod("set"), + delete: createReadonlyMethod("delete"), + clear: createReadonlyMethod("clear") + } : { + add(value) { + if (!shallow && !isShallow(value) && !isReadonly(value)) { + value = toRaw(value); + } + const target = toRaw(this); + const proto = getProto(target); + const hadKey = proto.has.call(target, value); + if (!hadKey) { + target.add(value); + trigger(target, "add", value, value); + } + return this; + }, + set(key, value) { + if (!shallow && !isShallow(value) && !isReadonly(value)) { + value = toRaw(value); + } + const target = toRaw(this); + const { has: has2, get } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } + const oldValue = get.call(target, key); + target.set(key, value); + if (!hadKey) { + trigger(target, "add", key, value); + } else if (hasChanged(value, oldValue)) { + trigger(target, "set", key, value); + } + return this; + }, + delete(key) { + const target = toRaw(this); + const { has: has2, get } = getProto(target); + let hadKey = has2.call(target, key); + if (!hadKey) { + key = toRaw(key); + hadKey = has2.call(target, key); + } + get ? get.call(target, key) : void 0; + const result = target.delete(key); + if (hadKey) { + trigger(target, "delete", key, void 0); + } + return result; + }, + clear() { + const target = toRaw(this); + const hadItems = target.size !== 0; + const result = target.clear(); + if (hadItems) { + trigger( + target, + "clear", + void 0, + void 0 + ); + } + return result; + } + } + ); + const iteratorMethods = [ + "keys", + "values", + "entries", + Symbol.iterator + ]; + iteratorMethods.forEach((method) => { + instrumentations[method] = createIterableMethod(method, readonly2, shallow); + }); + return instrumentations; +} +function createInstrumentationGetter(isReadonly2, shallow) { + const instrumentations = createInstrumentations(isReadonly2, shallow); + return (target, key, receiver) => { + if (key === "__v_isReactive") { + return !isReadonly2; + } else if (key === "__v_isReadonly") { + return isReadonly2; + } else if (key === "__v_raw") { + return target; + } + return Reflect.get( + hasOwn(instrumentations, key) && key in target ? instrumentations : target, + key, + receiver + ); + }; +} +const mutableCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, false) +}; +const shallowCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(false, true) +}; +const readonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, false) +}; +const shallowReadonlyCollectionHandlers = { + get: /* @__PURE__ */ createInstrumentationGetter(true, true) +}; +const reactiveMap = /* @__PURE__ */ new WeakMap(); +const shallowReactiveMap = /* @__PURE__ */ new WeakMap(); +const readonlyMap = /* @__PURE__ */ new WeakMap(); +const shallowReadonlyMap = /* @__PURE__ */ new WeakMap(); +function targetTypeMap(rawType) { + switch (rawType) { + case "Object": + case "Array": + return 1; + case "Map": + case "Set": + case "WeakMap": + case "WeakSet": + return 2; + default: + return 0; + } +} +function getTargetType(value) { + return value["__v_skip"] || !Object.isExtensible(value) ? 0 : targetTypeMap(toRawType(value)); +} +function reactive(target) { + if (isReadonly(target)) { + return target; + } + return createReactiveObject( + target, + false, + mutableHandlers, + mutableCollectionHandlers, + reactiveMap + ); +} +function shallowReactive(target) { + return createReactiveObject( + target, + false, + shallowReactiveHandlers, + shallowCollectionHandlers, + shallowReactiveMap + ); +} +function readonly(target) { + return createReactiveObject( + target, + true, + readonlyHandlers, + readonlyCollectionHandlers, + readonlyMap + ); +} +function shallowReadonly(target) { + return createReactiveObject( + target, + true, + shallowReadonlyHandlers, + shallowReadonlyCollectionHandlers, + shallowReadonlyMap + ); +} +function createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) { + if (!isObject$2(target)) { + return target; + } + if (target["__v_raw"] && !(isReadonly2 && target["__v_isReactive"])) { + return target; + } + const targetType = getTargetType(target); + if (targetType === 0) { + return target; + } + const existingProxy = proxyMap.get(target); + if (existingProxy) { + return existingProxy; + } + const proxy = new Proxy( + target, + targetType === 2 ? collectionHandlers : baseHandlers + ); + proxyMap.set(target, proxy); + return proxy; +} +function isReactive(value) { + if (isReadonly(value)) { + return isReactive(value["__v_raw"]); + } + return !!(value && value["__v_isReactive"]); +} +function isReadonly(value) { + return !!(value && value["__v_isReadonly"]); +} +function isShallow(value) { + return !!(value && value["__v_isShallow"]); +} +function isProxy(value) { + return value ? !!value["__v_raw"] : false; +} +function toRaw(observed) { + const raw = observed && observed["__v_raw"]; + return raw ? toRaw(raw) : observed; +} +function markRaw(value) { + if (!hasOwn(value, "__v_skip") && Object.isExtensible(value)) { + def(value, "__v_skip", true); + } + return value; +} +const toReactive = (value) => isObject$2(value) ? reactive(value) : value; +const toReadonly = (value) => isObject$2(value) ? readonly(value) : value; +function isRef(r) { + return r ? r["__v_isRef"] === true : false; +} +function ref(value) { + return createRef(value, false); +} +function shallowRef(value) { + return createRef(value, true); +} +function createRef(rawValue, shallow) { + if (isRef(rawValue)) { + return rawValue; + } + return new RefImpl(rawValue, shallow); +} +class RefImpl { + constructor(value, isShallow2) { + this.dep = new Dep(); + this["__v_isRef"] = true; + this["__v_isShallow"] = false; + this._rawValue = isShallow2 ? value : toRaw(value); + this._value = isShallow2 ? value : toReactive(value); + this["__v_isShallow"] = isShallow2; + } + get value() { + { + this.dep.track(); + } + return this._value; + } + set value(newValue) { + const oldValue = this._rawValue; + const useDirectValue = this["__v_isShallow"] || isShallow(newValue) || isReadonly(newValue); + newValue = useDirectValue ? newValue : toRaw(newValue); + if (hasChanged(newValue, oldValue)) { + this._rawValue = newValue; + this._value = useDirectValue ? newValue : toReactive(newValue); + { + this.dep.trigger(); + } + } + } +} +function unref(ref2) { + return isRef(ref2) ? ref2.value : ref2; +} +function toValue(source) { + return isFunction$1(source) ? source() : unref(source); +} +const shallowUnwrapHandlers = { + get: (target, key, receiver) => key === "__v_raw" ? target : unref(Reflect.get(target, key, receiver)), + set: (target, key, value, receiver) => { + const oldValue = target[key]; + if (isRef(oldValue) && !isRef(value)) { + oldValue.value = value; + return true; + } else { + return Reflect.set(target, key, value, receiver); + } + } +}; +function proxyRefs(objectWithRefs) { + return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers); +} +function toRefs(object) { + const ret = isArray$2(object) ? new Array(object.length) : {}; + for (const key in object) { + ret[key] = propertyToRef(object, key); + } + return ret; +} +class ObjectRefImpl { + constructor(_object, _key, _defaultValue) { + this._object = _object; + this._key = _key; + this._defaultValue = _defaultValue; + this["__v_isRef"] = true; + this._value = void 0; + } + get value() { + const val = this._object[this._key]; + return this._value = val === void 0 ? this._defaultValue : val; + } + set value(newVal) { + this._object[this._key] = newVal; + } + get dep() { + return getDepFromReactive(toRaw(this._object), this._key); + } +} +class GetterRefImpl { + constructor(_getter) { + this._getter = _getter; + this["__v_isRef"] = true; + this["__v_isReadonly"] = true; + this._value = void 0; + } + get value() { + return this._value = this._getter(); + } +} +function toRef(source, key, defaultValue) { + if (isRef(source)) { + return source; + } else if (isFunction$1(source)) { + return new GetterRefImpl(source); + } else if (isObject$2(source) && arguments.length > 1) { + return propertyToRef(source, key, defaultValue); + } else { + return ref(source); + } +} +function propertyToRef(source, key, defaultValue) { + const val = source[key]; + return isRef(val) ? val : new ObjectRefImpl(source, key, defaultValue); +} +class ComputedRefImpl { + constructor(fn, setter, isSSR) { + this.fn = fn; + this.setter = setter; + this._value = void 0; + this.dep = new Dep(this); + this.__v_isRef = true; + this.deps = void 0; + this.depsTail = void 0; + this.flags = 16; + this.globalVersion = globalVersion - 1; + this.next = void 0; + this.effect = this; + this["__v_isReadonly"] = !setter; + this.isSSR = isSSR; + } + /** + * @internal + */ + notify() { + this.flags |= 16; + if (!(this.flags & 8) && // avoid infinite self recursion + activeSub !== this) { + batch(this, true); + return true; + } + } + get value() { + const link = this.dep.track(); + refreshComputed(this); + if (link) { + link.version = this.dep.version; + } + return this._value; + } + set value(newValue) { + if (this.setter) { + this.setter(newValue); + } + } +} +function computed$1(getterOrOptions, debugOptions, isSSR = false) { + let getter; + let setter; + if (isFunction$1(getterOrOptions)) { + getter = getterOrOptions; + } else { + getter = getterOrOptions.get; + setter = getterOrOptions.set; + } + const cRef = new ComputedRefImpl(getter, setter, isSSR); + return cRef; +} +const INITIAL_WATCHER_VALUE = {}; +const cleanupMap = /* @__PURE__ */ new WeakMap(); +let activeWatcher = void 0; +function onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) { + if (owner) { + let cleanups = cleanupMap.get(owner); + if (!cleanups) cleanupMap.set(owner, cleanups = []); + cleanups.push(cleanupFn); + } +} +function watch$1(source, cb, options = EMPTY_OBJ) { + const { immediate, deep, once, scheduler, augmentJob, call } = options; + const reactiveGetter = (source2) => { + if (deep) return source2; + if (isShallow(source2) || deep === false || deep === 0) + return traverse(source2, 1); + return traverse(source2); + }; + let effect2; + let getter; + let cleanup; + let boundCleanup; + let forceTrigger = false; + let isMultiSource = false; + if (isRef(source)) { + getter = () => source.value; + forceTrigger = isShallow(source); + } else if (isReactive(source)) { + getter = () => reactiveGetter(source); + forceTrigger = true; + } else if (isArray$2(source)) { + isMultiSource = true; + forceTrigger = source.some((s) => isReactive(s) || isShallow(s)); + getter = () => source.map((s) => { + if (isRef(s)) { + return s.value; + } else if (isReactive(s)) { + return reactiveGetter(s); + } else if (isFunction$1(s)) { + return call ? call(s, 2) : s(); + } else ; + }); + } else if (isFunction$1(source)) { + if (cb) { + getter = call ? () => call(source, 2) : source; + } else { + getter = () => { + if (cleanup) { + pauseTracking(); + try { + cleanup(); + } finally { + resetTracking(); + } + } + const currentEffect = activeWatcher; + activeWatcher = effect2; + try { + return call ? call(source, 3, [boundCleanup]) : source(boundCleanup); + } finally { + activeWatcher = currentEffect; + } + }; + } + } else { + getter = NOOP; + } + if (cb && deep) { + const baseGetter = getter; + const depth = deep === true ? Infinity : deep; + getter = () => traverse(baseGetter(), depth); + } + const scope = getCurrentScope(); + const watchHandle = () => { + effect2.stop(); + if (scope && scope.active) { + remove(scope.effects, effect2); + } + }; + if (once && cb) { + const _cb = cb; + cb = (...args) => { + _cb(...args); + watchHandle(); + }; + } + let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE; + const job = (immediateFirstRun) => { + if (!(effect2.flags & 1) || !effect2.dirty && !immediateFirstRun) { + return; + } + if (cb) { + const newValue = effect2.run(); + if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) { + if (cleanup) { + cleanup(); + } + const currentWatcher = activeWatcher; + activeWatcher = effect2; + try { + const args = [ + newValue, + // pass undefined as the old value when it's changed for the first time + oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue, + boundCleanup + ]; + call ? call(cb, 3, args) : ( + // @ts-expect-error + cb(...args) + ); + oldValue = newValue; + } finally { + activeWatcher = currentWatcher; + } + } + } else { + effect2.run(); + } + }; + if (augmentJob) { + augmentJob(job); + } + effect2 = new ReactiveEffect(getter); + effect2.scheduler = scheduler ? () => scheduler(job, false) : job; + boundCleanup = (fn) => onWatcherCleanup(fn, false, effect2); + cleanup = effect2.onStop = () => { + const cleanups = cleanupMap.get(effect2); + if (cleanups) { + if (call) { + call(cleanups, 4); + } else { + for (const cleanup2 of cleanups) cleanup2(); + } + cleanupMap.delete(effect2); + } + }; + if (cb) { + if (immediate) { + job(true); + } else { + oldValue = effect2.run(); + } + } else if (scheduler) { + scheduler(job.bind(null, true), true); + } else { + effect2.run(); + } + watchHandle.pause = effect2.pause.bind(effect2); + watchHandle.resume = effect2.resume.bind(effect2); + watchHandle.stop = watchHandle; + return watchHandle; +} +function traverse(value, depth = Infinity, seen) { + if (depth <= 0 || !isObject$2(value) || value["__v_skip"]) { + return value; + } + seen = seen || /* @__PURE__ */ new Set(); + if (seen.has(value)) { + return value; + } + seen.add(value); + depth--; + if (isRef(value)) { + traverse(value.value, depth, seen); + } else if (isArray$2(value)) { + for (let i = 0; i < value.length; i++) { + traverse(value[i], depth, seen); + } + } else if (isSet(value) || isMap(value)) { + value.forEach((v) => { + traverse(v, depth, seen); + }); + } else if (isPlainObject$2(value)) { + for (const key in value) { + traverse(value[key], depth, seen); + } + for (const key of Object.getOwnPropertySymbols(value)) { + if (Object.prototype.propertyIsEnumerable.call(value, key)) { + traverse(value[key], depth, seen); + } + } + } + return value; +} +/** +* @vue/runtime-core v3.5.14 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/ +const stack = []; +let isWarning = false; +function warn$1(msg, ...args) { + if (isWarning) return; + isWarning = true; + pauseTracking(); + const instance = stack.length ? stack[stack.length - 1].component : null; + const appWarnHandler = instance && instance.appContext.config.warnHandler; + const trace = getComponentTrace(); + if (appWarnHandler) { + callWithErrorHandling( + appWarnHandler, + instance, + 11, + [ + // eslint-disable-next-line no-restricted-syntax + msg + args.map((a) => { + var _a2, _b; + return (_b = (_a2 = a.toString) == null ? void 0 : _a2.call(a)) != null ? _b : JSON.stringify(a); + }).join(""), + instance && instance.proxy, + trace.map( + ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>` + ).join("\n"), + trace + ] + ); + } else { + const warnArgs = [`[Vue warn]: ${msg}`, ...args]; + if (trace.length && // avoid spamming console during tests + true) { + warnArgs.push(` +`, ...formatTrace(trace)); + } + console.warn(...warnArgs); + } + resetTracking(); + isWarning = false; +} +function getComponentTrace() { + let currentVNode = stack[stack.length - 1]; + if (!currentVNode) { + return []; + } + const normalizedStack = []; + while (currentVNode) { + const last = normalizedStack[0]; + if (last && last.vnode === currentVNode) { + last.recurseCount++; + } else { + normalizedStack.push({ + vnode: currentVNode, + recurseCount: 0 + }); + } + const parentInstance = currentVNode.component && currentVNode.component.parent; + currentVNode = parentInstance && parentInstance.vnode; + } + return normalizedStack; +} +function formatTrace(trace) { + const logs = []; + trace.forEach((entry, i) => { + logs.push(...i === 0 ? [] : [` +`], ...formatTraceEntry(entry)); + }); + return logs; +} +function formatTraceEntry({ vnode, recurseCount }) { + const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``; + const isRoot = vnode.component ? vnode.component.parent == null : false; + const open = ` at <${formatComponentName( + vnode.component, + vnode.type, + isRoot + )}`; + const close = `>` + postfix; + return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close]; +} +function formatProps(props) { + const res = []; + const keys2 = Object.keys(props); + keys2.slice(0, 3).forEach((key) => { + res.push(...formatProp(key, props[key])); + }); + if (keys2.length > 3) { + res.push(` ...`); + } + return res; +} +function formatProp(key, value, raw) { + if (isString$1(value)) { + value = JSON.stringify(value); + return raw ? value : [`${key}=${value}`]; + } else if (typeof value === "number" || typeof value === "boolean" || value == null) { + return raw ? value : [`${key}=${value}`]; + } else if (isRef(value)) { + value = formatProp(key, toRaw(value.value), true); + return raw ? value : [`${key}=Ref<`, value, `>`]; + } else if (isFunction$1(value)) { + return [`${key}=fn${value.name ? `<${value.name}>` : ``}`]; + } else { + value = toRaw(value); + return raw ? value : [`${key}=`, value]; + } +} +function callWithErrorHandling(fn, instance, type, args) { + try { + return args ? fn(...args) : fn(); + } catch (err) { + handleError(err, instance, type); + } +} +function callWithAsyncErrorHandling(fn, instance, type, args) { + if (isFunction$1(fn)) { + const res = callWithErrorHandling(fn, instance, type, args); + if (res && isPromise(res)) { + res.catch((err) => { + handleError(err, instance, type); + }); + } + return res; + } + if (isArray$2(fn)) { + const values = []; + for (let i = 0; i < fn.length; i++) { + values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)); + } + return values; + } +} +function handleError(err, instance, type, throwInDev = true) { + const contextVNode = instance ? instance.vnode : null; + const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ; + if (instance) { + let cur = instance.parent; + const exposedInstance = instance.proxy; + const errorInfo = `https://vuejs.org/error-reference/#runtime-${type}`; + while (cur) { + const errorCapturedHooks = cur.ec; + if (errorCapturedHooks) { + for (let i = 0; i < errorCapturedHooks.length; i++) { + if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) { + return; + } + } + } + cur = cur.parent; + } + if (errorHandler) { + pauseTracking(); + callWithErrorHandling(errorHandler, null, 10, [ + err, + exposedInstance, + errorInfo + ]); + resetTracking(); + return; + } + } + logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction); +} +function logError(err, type, contextVNode, throwInDev = true, throwInProd = false) { + if (throwInProd) { + throw err; + } else { + console.error(err); + } +} +const queue = []; +let flushIndex = -1; +const pendingPostFlushCbs = []; +let activePostFlushCbs = null; +let postFlushIndex = 0; +const resolvedPromise = /* @__PURE__ */ Promise.resolve(); +let currentFlushPromise = null; +function nextTick(fn) { + const p2 = currentFlushPromise || resolvedPromise; + return fn ? p2.then(this ? fn.bind(this) : fn) : p2; +} +function findInsertionIndex$1(id) { + let start = flushIndex + 1; + let end = queue.length; + while (start < end) { + const middle = start + end >>> 1; + const middleJob = queue[middle]; + const middleJobId = getId(middleJob); + if (middleJobId < id || middleJobId === id && middleJob.flags & 2) { + start = middle + 1; + } else { + end = middle; + } + } + return start; +} +function queueJob(job) { + if (!(job.flags & 1)) { + const jobId = getId(job); + const lastJob = queue[queue.length - 1]; + if (!lastJob || // fast path when the job id is larger than the tail + !(job.flags & 2) && jobId >= getId(lastJob)) { + queue.push(job); + } else { + queue.splice(findInsertionIndex$1(jobId), 0, job); + } + job.flags |= 1; + queueFlush(); + } +} +function queueFlush() { + if (!currentFlushPromise) { + currentFlushPromise = resolvedPromise.then(flushJobs); + } +} +function queuePostFlushCb(cb) { + if (!isArray$2(cb)) { + if (activePostFlushCbs && cb.id === -1) { + activePostFlushCbs.splice(postFlushIndex + 1, 0, cb); + } else if (!(cb.flags & 1)) { + pendingPostFlushCbs.push(cb); + cb.flags |= 1; + } + } else { + pendingPostFlushCbs.push(...cb); + } + queueFlush(); +} +function flushPreFlushCbs(instance, seen, i = flushIndex + 1) { + for (; i < queue.length; i++) { + const cb = queue[i]; + if (cb && cb.flags & 2) { + if (instance && cb.id !== instance.uid) { + continue; + } + queue.splice(i, 1); + i--; + if (cb.flags & 4) { + cb.flags &= -2; + } + cb(); + if (!(cb.flags & 4)) { + cb.flags &= -2; + } + } + } +} +function flushPostFlushCbs(seen) { + if (pendingPostFlushCbs.length) { + const deduped = [...new Set(pendingPostFlushCbs)].sort( + (a, b) => getId(a) - getId(b) + ); + pendingPostFlushCbs.length = 0; + if (activePostFlushCbs) { + activePostFlushCbs.push(...deduped); + return; + } + activePostFlushCbs = deduped; + for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) { + const cb = activePostFlushCbs[postFlushIndex]; + if (cb.flags & 4) { + cb.flags &= -2; + } + if (!(cb.flags & 8)) cb(); + cb.flags &= -2; + } + activePostFlushCbs = null; + postFlushIndex = 0; + } +} +const getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id; +function flushJobs(seen) { + try { + for (flushIndex = 0; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job && !(job.flags & 8)) { + if (false) ; + if (job.flags & 4) { + job.flags &= ~1; + } + callWithErrorHandling( + job, + job.i, + job.i ? 15 : 14 + ); + if (!(job.flags & 4)) { + job.flags &= ~1; + } + } + } + } finally { + for (; flushIndex < queue.length; flushIndex++) { + const job = queue[flushIndex]; + if (job) { + job.flags &= -2; + } + } + flushIndex = -1; + queue.length = 0; + flushPostFlushCbs(); + currentFlushPromise = null; + if (queue.length || pendingPostFlushCbs.length) { + flushJobs(); + } + } +} +let currentRenderingInstance = null; +let currentScopeId = null; +function setCurrentRenderingInstance(instance) { + const prev = currentRenderingInstance; + currentRenderingInstance = instance; + currentScopeId = instance && instance.type.__scopeId || null; + return prev; +} +function withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) { + if (!ctx) return fn; + if (fn._n) { + return fn; + } + const renderFnWithContext = (...args) => { + if (renderFnWithContext._d) { + setBlockTracking(-1); + } + const prevInstance = setCurrentRenderingInstance(ctx); + let res; + try { + res = fn(...args); + } finally { + setCurrentRenderingInstance(prevInstance); + if (renderFnWithContext._d) { + setBlockTracking(1); + } + } + return res; + }; + renderFnWithContext._n = true; + renderFnWithContext._c = true; + renderFnWithContext._d = true; + return renderFnWithContext; +} +function withDirectives(vnode, directives2) { + if (currentRenderingInstance === null) { + return vnode; + } + const instance = getComponentPublicInstance(currentRenderingInstance); + const bindings = vnode.dirs || (vnode.dirs = []); + for (let i = 0; i < directives2.length; i++) { + let [dir, value, arg, modifiers = EMPTY_OBJ] = directives2[i]; + if (dir) { + if (isFunction$1(dir)) { + dir = { + mounted: dir, + updated: dir + }; + } + if (dir.deep) { + traverse(value); + } + bindings.push({ + dir, + instance, + value, + oldValue: void 0, + arg, + modifiers + }); + } + } + return vnode; +} +function invokeDirectiveHook(vnode, prevVNode, instance, name) { + const bindings = vnode.dirs; + const oldBindings = prevVNode && prevVNode.dirs; + for (let i = 0; i < bindings.length; i++) { + const binding = bindings[i]; + if (oldBindings) { + binding.oldValue = oldBindings[i].value; + } + let hook = binding.dir[name]; + if (hook) { + pauseTracking(); + callWithAsyncErrorHandling(hook, instance, 8, [ + vnode.el, + binding, + vnode, + prevVNode + ]); + resetTracking(); + } + } +} +const TeleportEndKey = Symbol("_vte"); +const isTeleport = (type) => type.__isTeleport; +const isTeleportDisabled = (props) => props && (props.disabled || props.disabled === ""); +const isTeleportDeferred = (props) => props && (props.defer || props.defer === ""); +const isTargetSVG = (target) => typeof SVGElement !== "undefined" && target instanceof SVGElement; +const isTargetMathML = (target) => typeof MathMLElement === "function" && target instanceof MathMLElement; +const resolveTarget = (props, select) => { + const targetSelector = props && props.to; + if (isString$1(targetSelector)) { + if (!select) { + return null; + } else { + const target = select(targetSelector); + return target; + } + } else { + return targetSelector; + } +}; +const TeleportImpl = { + name: "Teleport", + __isTeleport: true, + process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) { + const { + mc: mountChildren, + pc: patchChildren, + pbc: patchBlockChildren, + o: { insert, querySelector, createText, createComment } + } = internals; + const disabled = isTeleportDisabled(n2.props); + let { shapeFlag, children, dynamicChildren } = n2; + if (n1 == null) { + const placeholder = n2.el = createText(""); + const mainAnchor = n2.anchor = createText(""); + insert(placeholder, container, anchor); + insert(mainAnchor, container, anchor); + const mount = (container2, anchor2) => { + if (shapeFlag & 16) { + if (parentComponent && parentComponent.isCE) { + parentComponent.ce._teleportTarget = container2; + } + mountChildren( + children, + container2, + anchor2, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + const mountToTarget = () => { + const target = n2.target = resolveTarget(n2.props, querySelector); + const targetAnchor = prepareAnchor(target, n2, createText, insert); + if (target) { + if (namespace !== "svg" && isTargetSVG(target)) { + namespace = "svg"; + } else if (namespace !== "mathml" && isTargetMathML(target)) { + namespace = "mathml"; + } + if (!disabled) { + mount(target, targetAnchor); + updateCssVars(n2, false); + } + } + }; + if (disabled) { + mount(container, mainAnchor); + updateCssVars(n2, true); + } + if (isTeleportDeferred(n2.props)) { + queuePostRenderEffect(() => { + mountToTarget(); + n2.el.__isMounted = true; + }, parentSuspense); + } else { + mountToTarget(); + } + } else { + if (isTeleportDeferred(n2.props) && !n1.el.__isMounted) { + queuePostRenderEffect(() => { + TeleportImpl.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + internals + ); + delete n1.el.__isMounted; + }, parentSuspense); + return; + } + n2.el = n1.el; + n2.targetStart = n1.targetStart; + const mainAnchor = n2.anchor = n1.anchor; + const target = n2.target = n1.target; + const targetAnchor = n2.targetAnchor = n1.targetAnchor; + const wasDisabled = isTeleportDisabled(n1.props); + const currentContainer = wasDisabled ? container : target; + const currentAnchor = wasDisabled ? mainAnchor : targetAnchor; + if (namespace === "svg" || isTargetSVG(target)) { + namespace = "svg"; + } else if (namespace === "mathml" || isTargetMathML(target)) { + namespace = "mathml"; + } + if (dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + currentContainer, + parentComponent, + parentSuspense, + namespace, + slotScopeIds + ); + traverseStaticChildren(n1, n2, true); + } else if (!optimized) { + patchChildren( + n1, + n2, + currentContainer, + currentAnchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + false + ); + } + if (disabled) { + if (!wasDisabled) { + moveTeleport( + n2, + container, + mainAnchor, + internals, + 1 + ); + } else { + if (n2.props && n1.props && n2.props.to !== n1.props.to) { + n2.props.to = n1.props.to; + } + } + } else { + if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) { + const nextTarget = n2.target = resolveTarget( + n2.props, + querySelector + ); + if (nextTarget) { + moveTeleport( + n2, + nextTarget, + null, + internals, + 0 + ); + } + } else if (wasDisabled) { + moveTeleport( + n2, + target, + targetAnchor, + internals, + 1 + ); + } + } + updateCssVars(n2, disabled); + } + }, + remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) { + const { + shapeFlag, + children, + anchor, + targetStart, + targetAnchor, + target, + props + } = vnode; + if (target) { + hostRemove(targetStart); + hostRemove(targetAnchor); + } + doRemove && hostRemove(anchor); + if (shapeFlag & 16) { + const shouldRemove = doRemove || !isTeleportDisabled(props); + for (let i = 0; i < children.length; i++) { + const child = children[i]; + unmount( + child, + parentComponent, + parentSuspense, + shouldRemove, + !!child.dynamicChildren + ); + } + } + }, + move: moveTeleport, + hydrate: hydrateTeleport +}; +function moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) { + if (moveType === 0) { + insert(vnode.targetAnchor, container, parentAnchor); + } + const { el, anchor, shapeFlag, children, props } = vnode; + const isReorder = moveType === 2; + if (isReorder) { + insert(el, container, parentAnchor); + } + if (!isReorder || isTeleportDisabled(props)) { + if (shapeFlag & 16) { + for (let i = 0; i < children.length; i++) { + move( + children[i], + container, + parentAnchor, + 2 + ); + } + } + } + if (isReorder) { + insert(anchor, container, parentAnchor); + } +} +function hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, { + o: { nextSibling, parentNode, querySelector, insert, createText } +}, hydrateChildren) { + const target = vnode.target = resolveTarget( + vnode.props, + querySelector + ); + if (target) { + const disabled = isTeleportDisabled(vnode.props); + const targetNode = target._lpa || target.firstChild; + if (vnode.shapeFlag & 16) { + if (disabled) { + vnode.anchor = hydrateChildren( + nextSibling(node), + vnode, + parentNode(node), + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + vnode.targetStart = targetNode; + vnode.targetAnchor = targetNode && nextSibling(targetNode); + } else { + vnode.anchor = nextSibling(node); + let targetAnchor = targetNode; + while (targetAnchor) { + if (targetAnchor && targetAnchor.nodeType === 8) { + if (targetAnchor.data === "teleport start anchor") { + vnode.targetStart = targetAnchor; + } else if (targetAnchor.data === "teleport anchor") { + vnode.targetAnchor = targetAnchor; + target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor); + break; + } + } + targetAnchor = nextSibling(targetAnchor); + } + if (!vnode.targetAnchor) { + prepareAnchor(target, vnode, createText, insert); + } + hydrateChildren( + targetNode && nextSibling(targetNode), + vnode, + target, + parentComponent, + parentSuspense, + slotScopeIds, + optimized + ); + } + } + updateCssVars(vnode, disabled); + } + return vnode.anchor && nextSibling(vnode.anchor); +} +const Teleport = TeleportImpl; +function updateCssVars(vnode, isDisabled) { + const ctx = vnode.ctx; + if (ctx && ctx.ut) { + let node, anchor; + if (isDisabled) { + node = vnode.el; + anchor = vnode.anchor; + } else { + node = vnode.targetStart; + anchor = vnode.targetAnchor; + } + while (node && node !== anchor) { + if (node.nodeType === 1) node.setAttribute("data-v-owner", ctx.uid); + node = node.nextSibling; + } + ctx.ut(); + } +} +function prepareAnchor(target, vnode, createText, insert) { + const targetStart = vnode.targetStart = createText(""); + const targetAnchor = vnode.targetAnchor = createText(""); + targetStart[TeleportEndKey] = targetAnchor; + if (target) { + insert(targetStart, target); + insert(targetAnchor, target); + } + return targetAnchor; +} +const leaveCbKey = Symbol("_leaveCb"); +const enterCbKey$1 = Symbol("_enterCb"); +function useTransitionState() { + const state = { + isMounted: false, + isLeaving: false, + isUnmounting: false, + leavingVNodes: /* @__PURE__ */ new Map() + }; + onMounted(() => { + state.isMounted = true; + }); + onBeforeUnmount(() => { + state.isUnmounting = true; + }); + return state; +} +const TransitionHookValidator = [Function, Array]; +const BaseTransitionPropsValidators = { + mode: String, + appear: Boolean, + persisted: Boolean, + // enter + onBeforeEnter: TransitionHookValidator, + onEnter: TransitionHookValidator, + onAfterEnter: TransitionHookValidator, + onEnterCancelled: TransitionHookValidator, + // leave + onBeforeLeave: TransitionHookValidator, + onLeave: TransitionHookValidator, + onAfterLeave: TransitionHookValidator, + onLeaveCancelled: TransitionHookValidator, + // appear + onBeforeAppear: TransitionHookValidator, + onAppear: TransitionHookValidator, + onAfterAppear: TransitionHookValidator, + onAppearCancelled: TransitionHookValidator +}; +const recursiveGetSubtree = (instance) => { + const subTree = instance.subTree; + return subTree.component ? recursiveGetSubtree(subTree.component) : subTree; +}; +const BaseTransitionImpl = { + name: `BaseTransition`, + props: BaseTransitionPropsValidators, + setup(props, { slots }) { + const instance = getCurrentInstance$1(); + const state = useTransitionState(); + return () => { + const children = slots.default && getTransitionRawChildren(slots.default(), true); + if (!children || !children.length) { + return; + } + const child = findNonCommentChild(children); + const rawProps = toRaw(props); + const { mode } = rawProps; + if (state.isLeaving) { + return emptyPlaceholder(child); + } + const innerChild = getInnerChild$1(child); + if (!innerChild) { + return emptyPlaceholder(child); + } + let enterHooks = resolveTransitionHooks( + innerChild, + rawProps, + state, + instance, + // #11061, ensure enterHooks is fresh after clone + (hooks) => enterHooks = hooks + ); + if (innerChild.type !== Comment) { + setTransitionHooks(innerChild, enterHooks); + } + let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree); + if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(innerChild, oldInnerChild) && recursiveGetSubtree(instance).type !== Comment) { + let leavingHooks = resolveTransitionHooks( + oldInnerChild, + rawProps, + state, + instance + ); + setTransitionHooks(oldInnerChild, leavingHooks); + if (mode === "out-in" && innerChild.type !== Comment) { + state.isLeaving = true; + leavingHooks.afterLeave = () => { + state.isLeaving = false; + if (!(instance.job.flags & 8)) { + instance.update(); + } + delete leavingHooks.afterLeave; + oldInnerChild = void 0; + }; + return emptyPlaceholder(child); + } else if (mode === "in-out" && innerChild.type !== Comment) { + leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => { + const leavingVNodesCache = getLeavingNodesForType( + state, + oldInnerChild + ); + leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild; + el[leaveCbKey] = () => { + earlyRemove(); + el[leaveCbKey] = void 0; + delete enterHooks.delayedLeave; + oldInnerChild = void 0; + }; + enterHooks.delayedLeave = () => { + delayedLeave(); + delete enterHooks.delayedLeave; + oldInnerChild = void 0; + }; + }; + } else { + oldInnerChild = void 0; + } + } else if (oldInnerChild) { + oldInnerChild = void 0; + } + return child; + }; + } +}; +function findNonCommentChild(children) { + let child = children[0]; + if (children.length > 1) { + for (const c of children) { + if (c.type !== Comment) { + child = c; + break; + } + } + } + return child; +} +const BaseTransition = BaseTransitionImpl; +function getLeavingNodesForType(state, vnode) { + const { leavingVNodes } = state; + let leavingVNodesCache = leavingVNodes.get(vnode.type); + if (!leavingVNodesCache) { + leavingVNodesCache = /* @__PURE__ */ Object.create(null); + leavingVNodes.set(vnode.type, leavingVNodesCache); + } + return leavingVNodesCache; +} +function resolveTransitionHooks(vnode, props, state, instance, postClone) { + const { + appear, + mode, + persisted = false, + onBeforeEnter, + onEnter, + onAfterEnter, + onEnterCancelled, + onBeforeLeave, + onLeave, + onAfterLeave, + onLeaveCancelled, + onBeforeAppear, + onAppear, + onAfterAppear, + onAppearCancelled + } = props; + const key = String(vnode.key); + const leavingVNodesCache = getLeavingNodesForType(state, vnode); + const callHook2 = (hook, args) => { + hook && callWithAsyncErrorHandling( + hook, + instance, + 9, + args + ); + }; + const callAsyncHook = (hook, args) => { + const done = args[1]; + callHook2(hook, args); + if (isArray$2(hook)) { + if (hook.every((hook2) => hook2.length <= 1)) done(); + } else if (hook.length <= 1) { + done(); + } + }; + const hooks = { + mode, + persisted, + beforeEnter(el) { + let hook = onBeforeEnter; + if (!state.isMounted) { + if (appear) { + hook = onBeforeAppear || onBeforeEnter; + } else { + return; + } + } + if (el[leaveCbKey]) { + el[leaveCbKey]( + true + /* cancelled */ + ); + } + const leavingVNode = leavingVNodesCache[key]; + if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) { + leavingVNode.el[leaveCbKey](); + } + callHook2(hook, [el]); + }, + enter(el) { + let hook = onEnter; + let afterHook = onAfterEnter; + let cancelHook = onEnterCancelled; + if (!state.isMounted) { + if (appear) { + hook = onAppear || onEnter; + afterHook = onAfterAppear || onAfterEnter; + cancelHook = onAppearCancelled || onEnterCancelled; + } else { + return; + } + } + let called = false; + const done = el[enterCbKey$1] = (cancelled) => { + if (called) return; + called = true; + if (cancelled) { + callHook2(cancelHook, [el]); + } else { + callHook2(afterHook, [el]); + } + if (hooks.delayedLeave) { + hooks.delayedLeave(); + } + el[enterCbKey$1] = void 0; + }; + if (hook) { + callAsyncHook(hook, [el, done]); + } else { + done(); + } + }, + leave(el, remove2) { + const key2 = String(vnode.key); + if (el[enterCbKey$1]) { + el[enterCbKey$1]( + true + /* cancelled */ + ); + } + if (state.isUnmounting) { + return remove2(); + } + callHook2(onBeforeLeave, [el]); + let called = false; + const done = el[leaveCbKey] = (cancelled) => { + if (called) return; + called = true; + remove2(); + if (cancelled) { + callHook2(onLeaveCancelled, [el]); + } else { + callHook2(onAfterLeave, [el]); + } + el[leaveCbKey] = void 0; + if (leavingVNodesCache[key2] === vnode) { + delete leavingVNodesCache[key2]; + } + }; + leavingVNodesCache[key2] = vnode; + if (onLeave) { + callAsyncHook(onLeave, [el, done]); + } else { + done(); + } + }, + clone(vnode2) { + const hooks2 = resolveTransitionHooks( + vnode2, + props, + state, + instance, + postClone + ); + if (postClone) postClone(hooks2); + return hooks2; + } + }; + return hooks; +} +function emptyPlaceholder(vnode) { + if (isKeepAlive(vnode)) { + vnode = cloneVNode(vnode); + vnode.children = null; + return vnode; + } +} +function getInnerChild$1(vnode) { + if (!isKeepAlive(vnode)) { + if (isTeleport(vnode.type) && vnode.children) { + return findNonCommentChild(vnode.children); + } + return vnode; + } + if (vnode.component) { + return vnode.component.subTree; + } + const { shapeFlag, children } = vnode; + if (children) { + if (shapeFlag & 16) { + return children[0]; + } + if (shapeFlag & 32 && isFunction$1(children.default)) { + return children.default(); + } + } +} +function setTransitionHooks(vnode, hooks) { + if (vnode.shapeFlag & 6 && vnode.component) { + vnode.transition = hooks; + setTransitionHooks(vnode.component.subTree, hooks); + } else if (vnode.shapeFlag & 128) { + vnode.ssContent.transition = hooks.clone(vnode.ssContent); + vnode.ssFallback.transition = hooks.clone(vnode.ssFallback); + } else { + vnode.transition = hooks; + } +} +function getTransitionRawChildren(children, keepComment = false, parentKey) { + let ret = []; + let keyedFragmentCount = 0; + for (let i = 0; i < children.length; i++) { + let child = children[i]; + const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i); + if (child.type === Fragment) { + if (child.patchFlag & 128) keyedFragmentCount++; + ret = ret.concat( + getTransitionRawChildren(child.children, keepComment, key) + ); + } else if (keepComment || child.type !== Comment) { + ret.push(key != null ? cloneVNode(child, { key }) : child); + } + } + if (keyedFragmentCount > 1) { + for (let i = 0; i < ret.length; i++) { + ret[i].patchFlag = -2; + } + } + return ret; +} +/*! #__NO_SIDE_EFFECTS__ */ +// @__NO_SIDE_EFFECTS__ +function defineComponent$1(options, extraOptions) { + return isFunction$1(options) ? ( + // #8236: extend call and options.name access are considered side-effects + // by Rollup, so we have to wrap it in a pure-annotated IIFE. + /* @__PURE__ */ (() => extend$1({ name: options.name }, extraOptions, { setup: options }))() + ) : options; +} +function useId() { + const i = getCurrentInstance$1(); + if (i) { + return (i.appContext.config.idPrefix || "v") + "-" + i.ids[0] + i.ids[1]++; + } + return ""; +} +function markAsyncBoundary(instance) { + instance.ids = [instance.ids[0] + instance.ids[2]++ + "-", 0, 0]; +} +function setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) { + if (isArray$2(rawRef)) { + rawRef.forEach( + (r, i) => setRef( + r, + oldRawRef && (isArray$2(oldRawRef) ? oldRawRef[i] : oldRawRef), + parentSuspense, + vnode, + isUnmount + ) + ); + return; + } + if (isAsyncWrapper(vnode) && !isUnmount) { + if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) { + setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree); + } + return; + } + const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el; + const value = isUnmount ? null : refValue; + const { i: owner, r: ref3 } = rawRef; + const oldRef = oldRawRef && oldRawRef.r; + const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs; + const setupState = owner.setupState; + const rawSetupState = toRaw(setupState); + const canSetSetupRef = setupState === EMPTY_OBJ ? () => false : (key) => { + return hasOwn(rawSetupState, key); + }; + if (oldRef != null && oldRef !== ref3) { + if (isString$1(oldRef)) { + refs[oldRef] = null; + if (canSetSetupRef(oldRef)) { + setupState[oldRef] = null; + } + } else if (isRef(oldRef)) { + oldRef.value = null; + } + } + if (isFunction$1(ref3)) { + callWithErrorHandling(ref3, owner, 12, [value, refs]); + } else { + const _isString = isString$1(ref3); + const _isRef = isRef(ref3); + if (_isString || _isRef) { + const doSet = () => { + if (rawRef.f) { + const existing = _isString ? canSetSetupRef(ref3) ? setupState[ref3] : refs[ref3] : ref3.value; + if (isUnmount) { + isArray$2(existing) && remove(existing, refValue); + } else { + if (!isArray$2(existing)) { + if (_isString) { + refs[ref3] = [refValue]; + if (canSetSetupRef(ref3)) { + setupState[ref3] = refs[ref3]; + } + } else { + ref3.value = [refValue]; + if (rawRef.k) refs[rawRef.k] = ref3.value; + } + } else if (!existing.includes(refValue)) { + existing.push(refValue); + } + } + } else if (_isString) { + refs[ref3] = value; + if (canSetSetupRef(ref3)) { + setupState[ref3] = value; + } + } else if (_isRef) { + ref3.value = value; + if (rawRef.k) refs[rawRef.k] = value; + } else ; + }; + if (value) { + doSet.id = -1; + queuePostRenderEffect(doSet, parentSuspense); + } else { + doSet(); + } + } + } +} +getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1)); +getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id)); +const isAsyncWrapper = (i) => !!i.type.__asyncLoader; +const isKeepAlive = (vnode) => vnode.type.__isKeepAlive; +function onActivated(hook, target) { + registerKeepAliveHook(hook, "a", target); +} +function onDeactivated(hook, target) { + registerKeepAliveHook(hook, "da", target); +} +function registerKeepAliveHook(hook, type, target = currentInstance) { + const wrappedHook = hook.__wdc || (hook.__wdc = () => { + let current = target; + while (current) { + if (current.isDeactivated) { + return; + } + current = current.parent; + } + return hook(); + }); + injectHook(type, wrappedHook, target); + if (target) { + let current = target.parent; + while (current && current.parent) { + if (isKeepAlive(current.parent.vnode)) { + injectToKeepAliveRoot(wrappedHook, type, target, current); + } + current = current.parent; + } + } +} +function injectToKeepAliveRoot(hook, type, target, keepAliveRoot) { + const injected = injectHook( + type, + hook, + keepAliveRoot, + true + /* prepend */ + ); + onUnmounted(() => { + remove(keepAliveRoot[type], injected); + }, target); +} +function injectHook(type, hook, target = currentInstance, prepend = false) { + if (target) { + const hooks = target[type] || (target[type] = []); + const wrappedHook = hook.__weh || (hook.__weh = (...args) => { + pauseTracking(); + const reset = setCurrentInstance(target); + const res = callWithAsyncErrorHandling(hook, target, type, args); + reset(); + resetTracking(); + return res; + }); + if (prepend) { + hooks.unshift(wrappedHook); + } else { + hooks.push(wrappedHook); + } + return wrappedHook; + } +} +const createHook = (lifecycle) => (hook, target = currentInstance) => { + if (!isInSSRComponentSetup || lifecycle === "sp") { + injectHook(lifecycle, (...args) => hook(...args), target); + } +}; +const onBeforeMount = createHook("bm"); +const onMounted = createHook("m"); +const onBeforeUpdate = createHook( + "bu" +); +const onUpdated = createHook("u"); +const onBeforeUnmount = createHook( + "bum" +); +const onUnmounted = createHook("um"); +const onServerPrefetch = createHook( + "sp" +); +const onRenderTriggered = createHook("rtg"); +const onRenderTracked = createHook("rtc"); +function onErrorCaptured(hook, target = currentInstance) { + injectHook("ec", hook, target); +} +const COMPONENTS = "components"; +const DIRECTIVES = "directives"; +function resolveComponent(name, maybeSelfReference) { + return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name; +} +const NULL_DYNAMIC_COMPONENT = Symbol.for("v-ndc"); +function resolveDynamicComponent(component) { + if (isString$1(component)) { + return resolveAsset(COMPONENTS, component, false) || component; + } else { + return component || NULL_DYNAMIC_COMPONENT; + } +} +function resolveDirective(name) { + return resolveAsset(DIRECTIVES, name); +} +function resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) { + const instance = currentRenderingInstance || currentInstance; + if (instance) { + const Component = instance.type; + if (type === COMPONENTS) { + const selfName = getComponentName( + Component, + false + ); + if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) { + return Component; + } + } + const res = ( + // local registration + // check instance[type] first which is resolved for options API + resolve(instance[type] || Component[type], name) || // global registration + resolve(instance.appContext[type], name) + ); + if (!res && maybeSelfReference) { + return Component; + } + return res; + } +} +function resolve(registry, name) { + return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]); +} +function renderList(source, renderItem, cache, index) { + let ret; + const cached = cache; + const sourceIsArray = isArray$2(source); + if (sourceIsArray || isString$1(source)) { + const sourceIsReactiveArray = sourceIsArray && isReactive(source); + let needsWrap = false; + let isReadonlySource = false; + if (sourceIsReactiveArray) { + needsWrap = !isShallow(source); + isReadonlySource = isReadonly(source); + source = shallowReadArray(source); + } + ret = new Array(source.length); + for (let i = 0, l = source.length; i < l; i++) { + ret[i] = renderItem( + needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i], + i, + void 0, + cached + ); + } + } else if (typeof source === "number") { + ret = new Array(source); + for (let i = 0; i < source; i++) { + ret[i] = renderItem(i + 1, i, void 0, cached); + } + } else if (isObject$2(source)) { + if (source[Symbol.iterator]) { + ret = Array.from( + source, + (item, i) => renderItem(item, i, void 0, cached) + ); + } else { + const keys2 = Object.keys(source); + ret = new Array(keys2.length); + for (let i = 0, l = keys2.length; i < l; i++) { + const key = keys2[i]; + ret[i] = renderItem(source[key], key, i, cached); + } + } + } else { + ret = []; + } + return ret; +} +function renderSlot(slots, name, props = {}, fallback, noSlotted) { + if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) { + if (name !== "default") props.name = name; + return openBlock(), createBlock( + Fragment, + null, + [createVNode("slot", props, fallback)], + 64 + ); + } + let slot = slots[name]; + if (slot && slot._c) { + slot._d = false; + } + openBlock(); + const validSlotContent = slot && ensureValidVNode$1(slot(props)); + const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch + // key attached in the `createSlots` helper, respect that + validSlotContent && validSlotContent.key; + const rendered = createBlock( + Fragment, + { + key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content + "" + }, + validSlotContent || [], + validSlotContent && slots._ === 1 ? 64 : -2 + ); + if (!noSlotted && rendered.scopeId) { + rendered.slotScopeIds = [rendered.scopeId + "-s"]; + } + if (slot && slot._c) { + slot._d = true; + } + return rendered; +} +function ensureValidVNode$1(vnodes) { + return vnodes.some((child) => { + if (!isVNode(child)) return true; + if (child.type === Comment) return false; + if (child.type === Fragment && !ensureValidVNode$1(child.children)) + return false; + return true; + }) ? vnodes : null; +} +const getPublicInstance = (i) => { + if (!i) return null; + if (isStatefulComponent(i)) return getComponentPublicInstance(i); + return getPublicInstance(i.parent); +}; +const publicPropertiesMap = ( + // Move PURE marker to new line to workaround compiler discarding it + // due to type annotation + /* @__PURE__ */ extend$1(/* @__PURE__ */ Object.create(null), { + $: (i) => i, + $el: (i) => i.vnode.el, + $data: (i) => i.data, + $props: (i) => i.props, + $attrs: (i) => i.attrs, + $slots: (i) => i.slots, + $refs: (i) => i.refs, + $parent: (i) => getPublicInstance(i.parent), + $root: (i) => getPublicInstance(i.root), + $host: (i) => i.ce, + $emit: (i) => i.emit, + $options: (i) => resolveMergedOptions(i), + $forceUpdate: (i) => i.f || (i.f = () => { + queueJob(i.update); + }), + $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)), + $watch: (i) => instanceWatch.bind(i) + }) +); +const hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key); +const PublicInstanceProxyHandlers = { + get({ _: instance }, key) { + if (key === "__v_skip") { + return true; + } + const { ctx, setupState, data, props, accessCache, type, appContext } = instance; + let normalizedProps; + if (key[0] !== "$") { + const n = accessCache[key]; + if (n !== void 0) { + switch (n) { + case 1: + return setupState[key]; + case 2: + return data[key]; + case 4: + return ctx[key]; + case 3: + return props[key]; + } + } else if (hasSetupBinding(setupState, key)) { + accessCache[key] = 1; + return setupState[key]; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + accessCache[key] = 2; + return data[key]; + } else if ( + // only cache other properties when instance has declared (thus stable) + // props + (normalizedProps = instance.propsOptions[0]) && hasOwn(normalizedProps, key) + ) { + accessCache[key] = 3; + return props[key]; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if (shouldCacheAccess) { + accessCache[key] = 0; + } + } + const publicGetter = publicPropertiesMap[key]; + let cssModule, globalProperties; + if (publicGetter) { + if (key === "$attrs") { + track(instance.attrs, "get", ""); + } + return publicGetter(instance); + } else if ( + // css module (injected by vue-loader) + (cssModule = type.__cssModules) && (cssModule = cssModule[key]) + ) { + return cssModule; + } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) { + accessCache[key] = 4; + return ctx[key]; + } else if ( + // global properties + globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key) + ) { + { + return globalProperties[key]; + } + } else ; + }, + set({ _: instance }, key, value) { + const { data, setupState, ctx } = instance; + if (hasSetupBinding(setupState, key)) { + setupState[key] = value; + return true; + } else if (data !== EMPTY_OBJ && hasOwn(data, key)) { + data[key] = value; + return true; + } else if (hasOwn(instance.props, key)) { + return false; + } + if (key[0] === "$" && key.slice(1) in instance) { + return false; + } else { + { + ctx[key] = value; + } + } + return true; + }, + has({ + _: { data, setupState, accessCache, ctx, appContext, propsOptions } + }, key) { + let normalizedProps; + return !!accessCache[key] || data !== EMPTY_OBJ && hasOwn(data, key) || hasSetupBinding(setupState, key) || (normalizedProps = propsOptions[0]) && hasOwn(normalizedProps, key) || hasOwn(ctx, key) || hasOwn(publicPropertiesMap, key) || hasOwn(appContext.config.globalProperties, key); + }, + defineProperty(target, key, descriptor) { + if (descriptor.get != null) { + target._.accessCache[key] = 0; + } else if (hasOwn(descriptor, "value")) { + this.set(target, key, descriptor.value, null); + } + return Reflect.defineProperty(target, key, descriptor); + } +}; +function normalizePropsOrEmits(props) { + return isArray$2(props) ? props.reduce( + (normalized, p2) => (normalized[p2] = null, normalized), + {} + ) : props; +} +let shouldCacheAccess = true; +function applyOptions(instance) { + const options = resolveMergedOptions(instance); + const publicThis = instance.proxy; + const ctx = instance.ctx; + shouldCacheAccess = false; + if (options.beforeCreate) { + callHook$1(options.beforeCreate, instance, "bc"); + } + const { + // state + data: dataOptions, + computed: computedOptions, + methods, + watch: watchOptions, + provide: provideOptions, + inject: injectOptions, + // lifecycle + created, + beforeMount, + mounted: mounted2, + beforeUpdate, + updated: updated2, + activated, + deactivated, + beforeDestroy, + beforeUnmount, + destroyed, + unmounted: unmounted2, + render: render2, + renderTracked, + renderTriggered, + errorCaptured, + serverPrefetch, + // public API + expose, + inheritAttrs, + // assets + components: components2, + directives: directives2, + filters + } = options; + const checkDuplicateProperties = null; + if (injectOptions) { + resolveInjections(injectOptions, ctx, checkDuplicateProperties); + } + if (methods) { + for (const key in methods) { + const methodHandler = methods[key]; + if (isFunction$1(methodHandler)) { + { + ctx[key] = methodHandler.bind(publicThis); + } + } + } + } + if (dataOptions) { + const data = dataOptions.call(publicThis, publicThis); + if (!isObject$2(data)) ; + else { + instance.data = reactive(data); + } + } + shouldCacheAccess = true; + if (computedOptions) { + for (const key in computedOptions) { + const opt = computedOptions[key]; + const get = isFunction$1(opt) ? opt.bind(publicThis, publicThis) : isFunction$1(opt.get) ? opt.get.bind(publicThis, publicThis) : NOOP; + const set = !isFunction$1(opt) && isFunction$1(opt.set) ? opt.set.bind(publicThis) : NOOP; + const c = computed({ + get, + set + }); + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => c.value, + set: (v) => c.value = v + }); + } + } + if (watchOptions) { + for (const key in watchOptions) { + createWatcher(watchOptions[key], ctx, publicThis, key); + } + } + if (provideOptions) { + const provides = isFunction$1(provideOptions) ? provideOptions.call(publicThis) : provideOptions; + Reflect.ownKeys(provides).forEach((key) => { + provide(key, provides[key]); + }); + } + if (created) { + callHook$1(created, instance, "c"); + } + function registerLifecycleHook(register, hook) { + if (isArray$2(hook)) { + hook.forEach((_hook) => register(_hook.bind(publicThis))); + } else if (hook) { + register(hook.bind(publicThis)); + } + } + registerLifecycleHook(onBeforeMount, beforeMount); + registerLifecycleHook(onMounted, mounted2); + registerLifecycleHook(onBeforeUpdate, beforeUpdate); + registerLifecycleHook(onUpdated, updated2); + registerLifecycleHook(onActivated, activated); + registerLifecycleHook(onDeactivated, deactivated); + registerLifecycleHook(onErrorCaptured, errorCaptured); + registerLifecycleHook(onRenderTracked, renderTracked); + registerLifecycleHook(onRenderTriggered, renderTriggered); + registerLifecycleHook(onBeforeUnmount, beforeUnmount); + registerLifecycleHook(onUnmounted, unmounted2); + registerLifecycleHook(onServerPrefetch, serverPrefetch); + if (isArray$2(expose)) { + if (expose.length) { + const exposed = instance.exposed || (instance.exposed = {}); + expose.forEach((key) => { + Object.defineProperty(exposed, key, { + get: () => publicThis[key], + set: (val) => publicThis[key] = val + }); + }); + } else if (!instance.exposed) { + instance.exposed = {}; + } + } + if (render2 && instance.render === NOOP) { + instance.render = render2; + } + if (inheritAttrs != null) { + instance.inheritAttrs = inheritAttrs; + } + if (components2) instance.components = components2; + if (directives2) instance.directives = directives2; + if (serverPrefetch) { + markAsyncBoundary(instance); + } +} +function resolveInjections(injectOptions, ctx, checkDuplicateProperties = NOOP) { + if (isArray$2(injectOptions)) { + injectOptions = normalizeInject(injectOptions); + } + for (const key in injectOptions) { + const opt = injectOptions[key]; + let injected; + if (isObject$2(opt)) { + if ("default" in opt) { + injected = inject$1( + opt.from || key, + opt.default, + true + ); + } else { + injected = inject$1(opt.from || key); + } + } else { + injected = inject$1(opt); + } + if (isRef(injected)) { + Object.defineProperty(ctx, key, { + enumerable: true, + configurable: true, + get: () => injected.value, + set: (v) => injected.value = v + }); + } else { + ctx[key] = injected; + } + } +} +function callHook$1(hook, instance, type) { + callWithAsyncErrorHandling( + isArray$2(hook) ? hook.map((h2) => h2.bind(instance.proxy)) : hook.bind(instance.proxy), + instance, + type + ); +} +function createWatcher(raw, ctx, publicThis, key) { + let getter = key.includes(".") ? createPathGetter(publicThis, key) : () => publicThis[key]; + if (isString$1(raw)) { + const handler = ctx[raw]; + if (isFunction$1(handler)) { + { + watch(getter, handler); + } + } + } else if (isFunction$1(raw)) { + { + watch(getter, raw.bind(publicThis)); + } + } else if (isObject$2(raw)) { + if (isArray$2(raw)) { + raw.forEach((r) => createWatcher(r, ctx, publicThis, key)); + } else { + const handler = isFunction$1(raw.handler) ? raw.handler.bind(publicThis) : ctx[raw.handler]; + if (isFunction$1(handler)) { + watch(getter, handler, raw); + } + } + } else ; +} +function resolveMergedOptions(instance) { + const base = instance.type; + const { mixins, extends: extendsOptions } = base; + const { + mixins: globalMixins, + optionsCache: cache, + config: { optionMergeStrategies } + } = instance.appContext; + const cached = cache.get(base); + let resolved; + if (cached) { + resolved = cached; + } else if (!globalMixins.length && !mixins && !extendsOptions) { + { + resolved = base; + } + } else { + resolved = {}; + if (globalMixins.length) { + globalMixins.forEach( + (m) => mergeOptions$1(resolved, m, optionMergeStrategies, true) + ); + } + mergeOptions$1(resolved, base, optionMergeStrategies); + } + if (isObject$2(base)) { + cache.set(base, resolved); + } + return resolved; +} +function mergeOptions$1(to, from, strats, asMixin = false) { + const { mixins, extends: extendsOptions } = from; + if (extendsOptions) { + mergeOptions$1(to, extendsOptions, strats, true); + } + if (mixins) { + mixins.forEach( + (m) => mergeOptions$1(to, m, strats, true) + ); + } + for (const key in from) { + if (asMixin && key === "expose") ; + else { + const strat = internalOptionMergeStrats[key] || strats && strats[key]; + to[key] = strat ? strat(to[key], from[key]) : from[key]; + } + } + return to; +} +const internalOptionMergeStrats = { + data: mergeDataFn, + props: mergeEmitsOrPropsOptions, + emits: mergeEmitsOrPropsOptions, + // objects + methods: mergeObjectOptions, + computed: mergeObjectOptions, + // lifecycle + beforeCreate: mergeAsArray, + created: mergeAsArray, + beforeMount: mergeAsArray, + mounted: mergeAsArray, + beforeUpdate: mergeAsArray, + updated: mergeAsArray, + beforeDestroy: mergeAsArray, + beforeUnmount: mergeAsArray, + destroyed: mergeAsArray, + unmounted: mergeAsArray, + activated: mergeAsArray, + deactivated: mergeAsArray, + errorCaptured: mergeAsArray, + serverPrefetch: mergeAsArray, + // assets + components: mergeObjectOptions, + directives: mergeObjectOptions, + // watch + watch: mergeWatchOptions, + // provide / inject + provide: mergeDataFn, + inject: mergeInject +}; +function mergeDataFn(to, from) { + if (!from) { + return to; + } + if (!to) { + return from; + } + return function mergedDataFn() { + return extend$1( + isFunction$1(to) ? to.call(this, this) : to, + isFunction$1(from) ? from.call(this, this) : from + ); + }; +} +function mergeInject(to, from) { + return mergeObjectOptions(normalizeInject(to), normalizeInject(from)); +} +function normalizeInject(raw) { + if (isArray$2(raw)) { + const res = {}; + for (let i = 0; i < raw.length; i++) { + res[raw[i]] = raw[i]; + } + return res; + } + return raw; +} +function mergeAsArray(to, from) { + return to ? [...new Set([].concat(to, from))] : from; +} +function mergeObjectOptions(to, from) { + return to ? extend$1(/* @__PURE__ */ Object.create(null), to, from) : from; +} +function mergeEmitsOrPropsOptions(to, from) { + if (to) { + if (isArray$2(to) && isArray$2(from)) { + return [.../* @__PURE__ */ new Set([...to, ...from])]; + } + return extend$1( + /* @__PURE__ */ Object.create(null), + normalizePropsOrEmits(to), + normalizePropsOrEmits(from != null ? from : {}) + ); + } else { + return from; + } +} +function mergeWatchOptions(to, from) { + if (!to) return from; + if (!from) return to; + const merged = extend$1(/* @__PURE__ */ Object.create(null), to); + for (const key in from) { + merged[key] = mergeAsArray(to[key], from[key]); + } + return merged; +} +function createAppContext() { + return { + app: null, + config: { + isNativeTag: NO, + performance: false, + globalProperties: {}, + optionMergeStrategies: {}, + errorHandler: void 0, + warnHandler: void 0, + compilerOptions: {} + }, + mixins: [], + components: {}, + directives: {}, + provides: /* @__PURE__ */ Object.create(null), + optionsCache: /* @__PURE__ */ new WeakMap(), + propsCache: /* @__PURE__ */ new WeakMap(), + emitsCache: /* @__PURE__ */ new WeakMap() + }; +} +let uid$1 = 0; +function createAppAPI(render2, hydrate) { + return function createApp2(rootComponent, rootProps = null) { + if (!isFunction$1(rootComponent)) { + rootComponent = extend$1({}, rootComponent); + } + if (rootProps != null && !isObject$2(rootProps)) { + rootProps = null; + } + const context = createAppContext(); + const installedPlugins = /* @__PURE__ */ new WeakSet(); + const pluginCleanupFns = []; + let isMounted = false; + const app2 = context.app = { + _uid: uid$1++, + _component: rootComponent, + _props: rootProps, + _container: null, + _context: context, + _instance: null, + version: version$1, + get config() { + return context.config; + }, + set config(v) { + }, + use(plugin, ...options) { + if (installedPlugins.has(plugin)) ; + else if (plugin && isFunction$1(plugin.install)) { + installedPlugins.add(plugin); + plugin.install(app2, ...options); + } else if (isFunction$1(plugin)) { + installedPlugins.add(plugin); + plugin(app2, ...options); + } else ; + return app2; + }, + mixin(mixin) { + { + if (!context.mixins.includes(mixin)) { + context.mixins.push(mixin); + } + } + return app2; + }, + component(name, component) { + if (!component) { + return context.components[name]; + } + context.components[name] = component; + return app2; + }, + directive(name, directive2) { + if (!directive2) { + return context.directives[name]; + } + context.directives[name] = directive2; + return app2; + }, + mount(rootContainer, isHydrate, namespace) { + if (!isMounted) { + const vnode = app2._ceVNode || createVNode(rootComponent, rootProps); + vnode.appContext = context; + if (namespace === true) { + namespace = "svg"; + } else if (namespace === false) { + namespace = void 0; + } + { + render2(vnode, rootContainer, namespace); + } + isMounted = true; + app2._container = rootContainer; + rootContainer.__vue_app__ = app2; + return getComponentPublicInstance(vnode.component); + } + }, + onUnmount(cleanupFn) { + pluginCleanupFns.push(cleanupFn); + }, + unmount() { + if (isMounted) { + callWithAsyncErrorHandling( + pluginCleanupFns, + app2._instance, + 16 + ); + render2(null, app2._container); + delete app2._container.__vue_app__; + } + }, + provide(key, value) { + context.provides[key] = value; + return app2; + }, + runWithContext(fn) { + const lastApp = currentApp; + currentApp = app2; + try { + return fn(); + } finally { + currentApp = lastApp; + } + } + }; + return app2; + }; +} +let currentApp = null; +function provide(key, value) { + if (!currentInstance) ; + else { + let provides = currentInstance.provides; + const parentProvides = currentInstance.parent && currentInstance.parent.provides; + if (parentProvides === provides) { + provides = currentInstance.provides = Object.create(parentProvides); + } + provides[key] = value; + } +} +function inject$1(key, defaultValue, treatDefaultAsFactory = false) { + const instance = currentInstance || currentRenderingInstance; + if (instance || currentApp) { + const provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0; + if (provides && key in provides) { + return provides[key]; + } else if (arguments.length > 1) { + return treatDefaultAsFactory && isFunction$1(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue; + } else ; + } +} +const internalObjectProto = {}; +const createInternalObject = () => Object.create(internalObjectProto); +const isInternalObject = (obj) => Object.getPrototypeOf(obj) === internalObjectProto; +function initProps(instance, rawProps, isStateful, isSSR = false) { + const props = {}; + const attrs = createInternalObject(); + instance.propsDefaults = /* @__PURE__ */ Object.create(null); + setFullProps(instance, rawProps, props, attrs); + for (const key in instance.propsOptions[0]) { + if (!(key in props)) { + props[key] = void 0; + } + } + if (isStateful) { + instance.props = isSSR ? props : shallowReactive(props); + } else { + if (!instance.type.props) { + instance.props = attrs; + } else { + instance.props = props; + } + } + instance.attrs = attrs; +} +function updateProps(instance, rawProps, rawPrevProps, optimized) { + const { + props, + attrs, + vnode: { patchFlag } + } = instance; + const rawCurrentProps = toRaw(props); + const [options] = instance.propsOptions; + let hasAttrsChanged = false; + if ( + // always force full diff in dev + // - #1942 if hmr is enabled with sfc component + // - vite#872 non-sfc component used by sfc component + (optimized || patchFlag > 0) && !(patchFlag & 16) + ) { + if (patchFlag & 8) { + const propsToUpdate = instance.vnode.dynamicProps; + for (let i = 0; i < propsToUpdate.length; i++) { + let key = propsToUpdate[i]; + if (isEmitListener(instance.emitsOptions, key)) { + continue; + } + const value = rawProps[key]; + if (options) { + if (hasOwn(attrs, key)) { + if (value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } else { + const camelizedKey = camelize(key); + props[camelizedKey] = resolvePropValue( + options, + rawCurrentProps, + camelizedKey, + value, + instance, + false + ); + } + } else { + if (value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } + } + } + } else { + if (setFullProps(instance, rawProps, props, attrs)) { + hasAttrsChanged = true; + } + let kebabKey; + for (const key in rawCurrentProps) { + if (!rawProps || // for camelCase + !hasOwn(rawProps, key) && // it's possible the original props was passed in as kebab-case + // and converted to camelCase (#955) + ((kebabKey = hyphenate(key)) === key || !hasOwn(rawProps, kebabKey))) { + if (options) { + if (rawPrevProps && // for camelCase + (rawPrevProps[key] !== void 0 || // for kebab-case + rawPrevProps[kebabKey] !== void 0)) { + props[key] = resolvePropValue( + options, + rawCurrentProps, + key, + void 0, + instance, + true + ); + } + } else { + delete props[key]; + } + } + } + if (attrs !== rawCurrentProps) { + for (const key in attrs) { + if (!rawProps || !hasOwn(rawProps, key) && true) { + delete attrs[key]; + hasAttrsChanged = true; + } + } + } + } + if (hasAttrsChanged) { + trigger(instance.attrs, "set", ""); + } +} +function setFullProps(instance, rawProps, props, attrs) { + const [options, needCastKeys] = instance.propsOptions; + let hasAttrsChanged = false; + let rawCastValues; + if (rawProps) { + for (let key in rawProps) { + if (isReservedProp(key)) { + continue; + } + const value = rawProps[key]; + let camelKey; + if (options && hasOwn(options, camelKey = camelize(key))) { + if (!needCastKeys || !needCastKeys.includes(camelKey)) { + props[camelKey] = value; + } else { + (rawCastValues || (rawCastValues = {}))[camelKey] = value; + } + } else if (!isEmitListener(instance.emitsOptions, key)) { + if (!(key in attrs) || value !== attrs[key]) { + attrs[key] = value; + hasAttrsChanged = true; + } + } + } + } + if (needCastKeys) { + const rawCurrentProps = toRaw(props); + const castValues = rawCastValues || EMPTY_OBJ; + for (let i = 0; i < needCastKeys.length; i++) { + const key = needCastKeys[i]; + props[key] = resolvePropValue( + options, + rawCurrentProps, + key, + castValues[key], + instance, + !hasOwn(castValues, key) + ); + } + } + return hasAttrsChanged; +} +function resolvePropValue(options, props, key, value, instance, isAbsent) { + const opt = options[key]; + if (opt != null) { + const hasDefault = hasOwn(opt, "default"); + if (hasDefault && value === void 0) { + const defaultValue = opt.default; + if (opt.type !== Function && !opt.skipFactory && isFunction$1(defaultValue)) { + const { propsDefaults } = instance; + if (key in propsDefaults) { + value = propsDefaults[key]; + } else { + const reset = setCurrentInstance(instance); + value = propsDefaults[key] = defaultValue.call( + null, + props + ); + reset(); + } + } else { + value = defaultValue; + } + if (instance.ce) { + instance.ce._setProp(key, value); + } + } + if (opt[ + 0 + /* shouldCast */ + ]) { + if (isAbsent && !hasDefault) { + value = false; + } else if (opt[ + 1 + /* shouldCastTrue */ + ] && (value === "" || value === hyphenate(key))) { + value = true; + } + } + } + return value; +} +const mixinPropsCache = /* @__PURE__ */ new WeakMap(); +function normalizePropsOptions(comp, appContext, asMixin = false) { + const cache = asMixin ? mixinPropsCache : appContext.propsCache; + const cached = cache.get(comp); + if (cached) { + return cached; + } + const raw = comp.props; + const normalized = {}; + const needCastKeys = []; + let hasExtends = false; + if (!isFunction$1(comp)) { + const extendProps = (raw2) => { + hasExtends = true; + const [props, keys2] = normalizePropsOptions(raw2, appContext, true); + extend$1(normalized, props); + if (keys2) needCastKeys.push(...keys2); + }; + if (!asMixin && appContext.mixins.length) { + appContext.mixins.forEach(extendProps); + } + if (comp.extends) { + extendProps(comp.extends); + } + if (comp.mixins) { + comp.mixins.forEach(extendProps); + } + } + if (!raw && !hasExtends) { + if (isObject$2(comp)) { + cache.set(comp, EMPTY_ARR); + } + return EMPTY_ARR; + } + if (isArray$2(raw)) { + for (let i = 0; i < raw.length; i++) { + const normalizedKey = camelize(raw[i]); + if (validatePropName(normalizedKey)) { + normalized[normalizedKey] = EMPTY_OBJ; + } + } + } else if (raw) { + for (const key in raw) { + const normalizedKey = camelize(key); + if (validatePropName(normalizedKey)) { + const opt = raw[key]; + const prop = normalized[normalizedKey] = isArray$2(opt) || isFunction$1(opt) ? { type: opt } : extend$1({}, opt); + const propType = prop.type; + let shouldCast = false; + let shouldCastTrue = true; + if (isArray$2(propType)) { + for (let index = 0; index < propType.length; ++index) { + const type = propType[index]; + const typeName = isFunction$1(type) && type.name; + if (typeName === "Boolean") { + shouldCast = true; + break; + } else if (typeName === "String") { + shouldCastTrue = false; + } + } + } else { + shouldCast = isFunction$1(propType) && propType.name === "Boolean"; + } + prop[ + 0 + /* shouldCast */ + ] = shouldCast; + prop[ + 1 + /* shouldCastTrue */ + ] = shouldCastTrue; + if (shouldCast || hasOwn(prop, "default")) { + needCastKeys.push(normalizedKey); + } + } + } + } + const res = [normalized, needCastKeys]; + if (isObject$2(comp)) { + cache.set(comp, res); + } + return res; +} +function validatePropName(key) { + if (key[0] !== "$" && !isReservedProp(key)) { + return true; + } + return false; +} +const isInternalKey = (key) => key[0] === "_" || key === "$stable"; +const normalizeSlotValue = (value) => isArray$2(value) ? value.map(normalizeVNode) : [normalizeVNode(value)]; +const normalizeSlot$1 = (key, rawSlot, ctx) => { + if (rawSlot._n) { + return rawSlot; + } + const normalized = withCtx((...args) => { + if (false) ; + return normalizeSlotValue(rawSlot(...args)); + }, ctx); + normalized._c = false; + return normalized; +}; +const normalizeObjectSlots = (rawSlots, slots, instance) => { + const ctx = rawSlots._ctx; + for (const key in rawSlots) { + if (isInternalKey(key)) continue; + const value = rawSlots[key]; + if (isFunction$1(value)) { + slots[key] = normalizeSlot$1(key, value, ctx); + } else if (value != null) { + const normalized = normalizeSlotValue(value); + slots[key] = () => normalized; + } + } +}; +const normalizeVNodeSlots = (instance, children) => { + const normalized = normalizeSlotValue(children); + instance.slots.default = () => normalized; +}; +const assignSlots = (slots, children, optimized) => { + for (const key in children) { + if (optimized || !isInternalKey(key)) { + slots[key] = children[key]; + } + } +}; +const initSlots = (instance, children, optimized) => { + const slots = instance.slots = createInternalObject(); + if (instance.vnode.shapeFlag & 32) { + const type = children._; + if (type) { + assignSlots(slots, children, optimized); + if (optimized) { + def(slots, "_", type, true); + } + } else { + normalizeObjectSlots(children, slots); + } + } else if (children) { + normalizeVNodeSlots(instance, children); + } +}; +const updateSlots = (instance, children, optimized) => { + const { vnode, slots } = instance; + let needDeletionCheck = true; + let deletionComparisonTarget = EMPTY_OBJ; + if (vnode.shapeFlag & 32) { + const type = children._; + if (type) { + if (optimized && type === 1) { + needDeletionCheck = false; + } else { + assignSlots(slots, children, optimized); + } + } else { + needDeletionCheck = !children.$stable; + normalizeObjectSlots(children, slots); + } + deletionComparisonTarget = children; + } else if (children) { + normalizeVNodeSlots(instance, children); + deletionComparisonTarget = { default: 1 }; + } + if (needDeletionCheck) { + for (const key in slots) { + if (!isInternalKey(key) && deletionComparisonTarget[key] == null) { + delete slots[key]; + } + } + } +}; +const queuePostRenderEffect = queueEffectWithSuspense; +function createRenderer(options) { + return baseCreateRenderer(options); +} +function baseCreateRenderer(options, createHydrationFns) { + const target = getGlobalThis(); + target.__VUE__ = true; + const { + insert: hostInsert, + remove: hostRemove, + patchProp: hostPatchProp, + createElement: hostCreateElement, + createText: hostCreateText, + createComment: hostCreateComment, + setText: hostSetText, + setElementText: hostSetElementText, + parentNode: hostParentNode, + nextSibling: hostNextSibling, + setScopeId: hostSetScopeId = NOOP, + insertStaticContent: hostInsertStaticContent + } = options; + const patch = (n1, n2, container, anchor = null, parentComponent = null, parentSuspense = null, namespace = void 0, slotScopeIds = null, optimized = !!n2.dynamicChildren) => { + if (n1 === n2) { + return; + } + if (n1 && !isSameVNodeType(n1, n2)) { + anchor = getNextHostNode(n1); + unmount(n1, parentComponent, parentSuspense, true); + n1 = null; + } + if (n2.patchFlag === -2) { + optimized = false; + n2.dynamicChildren = null; + } + const { type, ref: ref3, shapeFlag } = n2; + switch (type) { + case Text: + processText(n1, n2, container, anchor); + break; + case Comment: + processCommentNode(n1, n2, container, anchor); + break; + case Static: + if (n1 == null) { + mountStaticNode(n2, container, anchor, namespace); + } + break; + case Fragment: + processFragment( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + break; + default: + if (shapeFlag & 1) { + processElement( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else if (shapeFlag & 6) { + processComponent( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else if (shapeFlag & 64) { + type.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + internals + ); + } else if (shapeFlag & 128) { + type.process( + n1, + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized, + internals + ); + } else ; + } + if (ref3 != null && parentComponent) { + setRef(ref3, n1 && n1.ref, parentSuspense, n2 || n1, !n2); + } + }; + const processText = (n1, n2, container, anchor) => { + if (n1 == null) { + hostInsert( + n2.el = hostCreateText(n2.children), + container, + anchor + ); + } else { + const el = n2.el = n1.el; + if (n2.children !== n1.children) { + hostSetText(el, n2.children); + } + } + }; + const processCommentNode = (n1, n2, container, anchor) => { + if (n1 == null) { + hostInsert( + n2.el = hostCreateComment(n2.children || ""), + container, + anchor + ); + } else { + n2.el = n1.el; + } + }; + const mountStaticNode = (n2, container, anchor, namespace) => { + [n2.el, n2.anchor] = hostInsertStaticContent( + n2.children, + container, + anchor, + namespace, + n2.el, + n2.anchor + ); + }; + const moveStaticNode = ({ el, anchor }, container, nextSibling) => { + let next; + while (el && el !== anchor) { + next = hostNextSibling(el); + hostInsert(el, container, nextSibling); + el = next; + } + hostInsert(anchor, container, nextSibling); + }; + const removeStaticNode = ({ el, anchor }) => { + let next; + while (el && el !== anchor) { + next = hostNextSibling(el); + hostRemove(el); + el = next; + } + hostRemove(anchor); + }; + const processElement = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + if (n2.type === "svg") { + namespace = "svg"; + } else if (n2.type === "math") { + namespace = "mathml"; + } + if (n1 == null) { + mountElement( + n2, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + patchElement( + n1, + n2, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + const mountElement = (vnode, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + let el; + let vnodeHook; + const { props, shapeFlag, transition, dirs } = vnode; + el = vnode.el = hostCreateElement( + vnode.type, + namespace, + props && props.is, + props + ); + if (shapeFlag & 8) { + hostSetElementText(el, vnode.children); + } else if (shapeFlag & 16) { + mountChildren( + vnode.children, + el, + null, + parentComponent, + parentSuspense, + resolveChildrenNamespace(vnode, namespace), + slotScopeIds, + optimized + ); + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "created"); + } + setScopeId(el, vnode, vnode.scopeId, slotScopeIds, parentComponent); + if (props) { + for (const key in props) { + if (key !== "value" && !isReservedProp(key)) { + hostPatchProp(el, key, null, props[key], namespace, parentComponent); + } + } + if ("value" in props) { + hostPatchProp(el, "value", null, props.value, namespace); + } + if (vnodeHook = props.onVnodeBeforeMount) { + invokeVNodeHook(vnodeHook, parentComponent, vnode); + } + } + if (dirs) { + invokeDirectiveHook(vnode, null, parentComponent, "beforeMount"); + } + const needCallTransitionHooks = needTransition(parentSuspense, transition); + if (needCallTransitionHooks) { + transition.beforeEnter(el); + } + hostInsert(el, container, anchor); + if ((vnodeHook = props && props.onVnodeMounted) || needCallTransitionHooks || dirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, vnode); + needCallTransitionHooks && transition.enter(el); + dirs && invokeDirectiveHook(vnode, null, parentComponent, "mounted"); + }, parentSuspense); + } + }; + const setScopeId = (el, vnode, scopeId, slotScopeIds, parentComponent) => { + if (scopeId) { + hostSetScopeId(el, scopeId); + } + if (slotScopeIds) { + for (let i = 0; i < slotScopeIds.length; i++) { + hostSetScopeId(el, slotScopeIds[i]); + } + } + if (parentComponent) { + let subTree = parentComponent.subTree; + if (vnode === subTree || isSuspense(subTree.type) && (subTree.ssContent === vnode || subTree.ssFallback === vnode)) { + const parentVNode = parentComponent.vnode; + setScopeId( + el, + parentVNode, + parentVNode.scopeId, + parentVNode.slotScopeIds, + parentComponent.parent + ); + } + } + }; + const mountChildren = (children, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, start = 0) => { + for (let i = start; i < children.length; i++) { + const child = children[i] = optimized ? cloneIfMounted(children[i]) : normalizeVNode(children[i]); + patch( + null, + child, + container, + anchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } + }; + const patchElement = (n1, n2, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + const el = n2.el = n1.el; + let { patchFlag, dynamicChildren, dirs } = n2; + patchFlag |= n1.patchFlag & 16; + const oldProps = n1.props || EMPTY_OBJ; + const newProps = n2.props || EMPTY_OBJ; + let vnodeHook; + parentComponent && toggleRecurse(parentComponent, false); + if (vnodeHook = newProps.onVnodeBeforeUpdate) { + invokeVNodeHook(vnodeHook, parentComponent, n2, n1); + } + if (dirs) { + invokeDirectiveHook(n2, n1, parentComponent, "beforeUpdate"); + } + parentComponent && toggleRecurse(parentComponent, true); + if (oldProps.innerHTML && newProps.innerHTML == null || oldProps.textContent && newProps.textContent == null) { + hostSetElementText(el, ""); + } + if (dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + el, + parentComponent, + parentSuspense, + resolveChildrenNamespace(n2, namespace), + slotScopeIds + ); + } else if (!optimized) { + patchChildren( + n1, + n2, + el, + null, + parentComponent, + parentSuspense, + resolveChildrenNamespace(n2, namespace), + slotScopeIds, + false + ); + } + if (patchFlag > 0) { + if (patchFlag & 16) { + patchProps(el, oldProps, newProps, parentComponent, namespace); + } else { + if (patchFlag & 2) { + if (oldProps.class !== newProps.class) { + hostPatchProp(el, "class", null, newProps.class, namespace); + } + } + if (patchFlag & 4) { + hostPatchProp(el, "style", oldProps.style, newProps.style, namespace); + } + if (patchFlag & 8) { + const propsToUpdate = n2.dynamicProps; + for (let i = 0; i < propsToUpdate.length; i++) { + const key = propsToUpdate[i]; + const prev = oldProps[key]; + const next = newProps[key]; + if (next !== prev || key === "value") { + hostPatchProp(el, key, prev, next, namespace, parentComponent); + } + } + } + } + if (patchFlag & 1) { + if (n1.children !== n2.children) { + hostSetElementText(el, n2.children); + } + } + } else if (!optimized && dynamicChildren == null) { + patchProps(el, oldProps, newProps, parentComponent, namespace); + } + if ((vnodeHook = newProps.onVnodeUpdated) || dirs) { + queuePostRenderEffect(() => { + vnodeHook && invokeVNodeHook(vnodeHook, parentComponent, n2, n1); + dirs && invokeDirectiveHook(n2, n1, parentComponent, "updated"); + }, parentSuspense); + } + }; + const patchBlockChildren = (oldChildren, newChildren, fallbackContainer, parentComponent, parentSuspense, namespace, slotScopeIds) => { + for (let i = 0; i < newChildren.length; i++) { + const oldVNode = oldChildren[i]; + const newVNode = newChildren[i]; + const container = ( + // oldVNode may be an errored async setup() component inside Suspense + // which will not have a mounted element + oldVNode.el && // - In the case of a Fragment, we need to provide the actual parent + // of the Fragment itself so it can move its children. + (oldVNode.type === Fragment || // - In the case of different nodes, there is going to be a replacement + // which also requires the correct parent container + !isSameVNodeType(oldVNode, newVNode) || // - In the case of a component, it could contain anything. + oldVNode.shapeFlag & (6 | 64)) ? hostParentNode(oldVNode.el) : ( + // In other cases, the parent container is not actually used so we + // just pass the block element here to avoid a DOM parentNode call. + fallbackContainer + ) + ); + patch( + oldVNode, + newVNode, + container, + null, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + true + ); + } + }; + const patchProps = (el, oldProps, newProps, parentComponent, namespace) => { + if (oldProps !== newProps) { + if (oldProps !== EMPTY_OBJ) { + for (const key in oldProps) { + if (!isReservedProp(key) && !(key in newProps)) { + hostPatchProp( + el, + key, + oldProps[key], + null, + namespace, + parentComponent + ); + } + } + } + for (const key in newProps) { + if (isReservedProp(key)) continue; + const next = newProps[key]; + const prev = oldProps[key]; + if (next !== prev && key !== "value") { + hostPatchProp(el, key, prev, next, namespace, parentComponent); + } + } + if ("value" in newProps) { + hostPatchProp(el, "value", oldProps.value, newProps.value, namespace); + } + } + }; + const processFragment = (n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized) => { + const fragmentStartAnchor = n2.el = n1 ? n1.el : hostCreateText(""); + const fragmentEndAnchor = n2.anchor = n1 ? n1.anchor : hostCreateText(""); + let { patchFlag, dynamicChildren, slotScopeIds: fragmentSlotScopeIds } = n2; + if (fragmentSlotScopeIds) { + slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds; + } + if (n1 == null) { + hostInsert(fragmentStartAnchor, container, anchor); + hostInsert(fragmentEndAnchor, container, anchor); + mountChildren( + // #10007 + // such fragment like `<>` will be compiled into + // a fragment which doesn't have a children. + // In this case fallback to an empty array + n2.children || [], + container, + fragmentEndAnchor, + parentComponent, + parentSuspense, + namespace, + slotScopeIds, + optimized + ); + } else { + if (patchFlag > 0 && patchFlag & 64 && dynamicChildren && // #2715 the previous fragment could've been a BAILed one as a result + // of renderSlot() with no valid children + n1.dynamicChildren) { + patchBlockChildren( + n1.dynamicChildren, + dynamicChildren, + container, + parentComponent, + parentSuspense, + namespace, + slotScopeIds + ); + if ( + // #2080 if the stable fragment has a key, it's a