diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 95afdda..bddd66b 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,4 +1,4 @@
-## Description
+# Description
Please include a summary of the changes and the purpose of this pull request.
diff --git a/.github/workflows/api-dev-build-docker-push.yml b/.github/workflows/api-dev-build-docker-push.yml
deleted file mode 100644
index 4c9a93b..0000000
--- a/.github/workflows/api-dev-build-docker-push.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-name: API - DEV - Build and Docker Push
-
-on:
- push:
- branches:
- - development
- paths:
- - 'api/**'
- workflow_dispatch:
-
-env:
- DOCKER_IMAGE: prasadhonrao/devcamper-webapi
- AZURE_WEBAPP_NAME: devcamper-webapi
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
-
- - name: Log in to Docker Hub
- uses: docker/login-action@v1
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_PASSWORD }}
-
- - name: Build and push Docker image
- run: |
- docker build -t ${{ env.DOCKER_IMAGE }}:${{ github.sha }} -f api/Dockerfile api
- docker tag ${{ env.DOCKER_IMAGE }}:${{ github.sha }} ${{ env.DOCKER_IMAGE }}:latest
- docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }}
- docker push ${{ env.DOCKER_IMAGE }}:latest
diff --git a/.github/workflows/api-dev-ci.yml b/.github/workflows/api-dev-ci.yml
deleted file mode 100644
index c13a796..0000000
--- a/.github/workflows/api-dev-ci.yml
+++ /dev/null
@@ -1,124 +0,0 @@
-name: API - DEV - Continuous Integration
-
-on:
- push:
- branches:
- - development
- paths:
- - 'api/**'
- workflow_dispatch:
-
-jobs:
- lint:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
-
- - name: Install dependencies
- run: npm install --prefix api
-
- - name: Run linter
- run: |
- export PATH=$(pwd)/api/node_modules/.bin:$PATH
- npm run lint --prefix api
-
- dependency-check:
- runs-on: ubuntu-latest
- needs: lint
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
-
- - name: Install dependencies
- run: npm install --prefix api
-
- - name: Run dependency check
- run: npm audit --audit-level=high --prefix api
-
- security:
- runs-on: ubuntu-latest
- needs: dependency-check
- permissions:
- actions: read
- contents: read
- security-events: write
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
-
- - name: Install dependencies
- run: npm install --prefix api
-
- - name: Initialize CodeQL
- uses: github/codeql-action/init@v2
- with:
- languages: javascript
-
- - name: Autobuild
- uses: github/codeql-action/autobuild@v2
-
- - name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
-
- test:
- runs-on: ubuntu-latest
- needs: security
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
-
- - name: Install dependencies
- run: npm install --prefix api
-
- - name: Run tests
- run: npm test --prefix api
-
- code-coverage:
- runs-on: ubuntu-latest
- needs: test
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Set up Node.js
- uses: actions/setup-node@v4
- with:
- node-version: '20'
-
- - name: Install dependencies
- run: npm install --prefix api
-
- - name: Run tests with coverage
- run: npm run test --prefix api -- --coverage
-
- - name: Upload coverage report
- uses: actions/upload-artifact@v4
- with:
- name: coverage-report
- path: api/coverage
diff --git a/.github/workflows/api-dev-deploy-to-azure.yml b/.github/workflows/api-dev-deploy-to-azure.yml
deleted file mode 100644
index fd79edc..0000000
--- a/.github/workflows/api-dev-deploy-to-azure.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-name: API - DEV - Deploy to Azure
-
-on:
- workflow_dispatch:
-
-env:
- DOCKER_IMAGE: prasadhonrao/devcamper-webapi
- AZURE_WEBAPP_NAME: devcamper-webapi
-
-jobs:
- deploy:
- runs-on: ubuntu-latest
-
- steps:
- - name: Log in to Azure
- uses: azure/login@v2
- with:
- creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }}
-
- - name: Deploy to Azure Web App
- uses: azure/webapps-deploy@v2
- with:
- app-name: ${{ env.AZURE_WEBAPP_NAME }}
- images: '${{ env.DOCKER_IMAGE }}:latest'
-
- notify:
- runs-on: ubuntu-latest
- needs: deploy
- if: always()
-
- steps:
- - name: Send email notification
- uses: dawidd6/action-send-mail@v3
- with:
- server_address: smtp.gmail.com
- server_port: 587
- username: ${{ secrets.GMAIL_USERNAME }}
- password: ${{ secrets.GMAIL_PASSWORD }}
- subject: '${{ job.status }}: DevCamper API Deployment'
- body: |
- The deployment has ${{ job.status }}!
- Repository: ${{ github.repository }}
- Branch: ${{ github.ref }}
- Commit: ${{ github.sha }}
- Author: ${{ github.actor }}
- Workflow: ${{ github.workflow }}
- Job: ${{ github.job }}
- Run ID: ${{ github.run_id }}
- Run Number: ${{ github.run_number }}
- Logs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
- to: ${{ secrets.NOTIFY_EMAIL }}
- from: ${{ secrets.GMAIL_USERNAME }}
diff --git a/.github/workflows/api-prod-cd.yml b/.github/workflows/api-prod-cd.yml
deleted file mode 100644
index 6f5b361..0000000
--- a/.github/workflows/api-prod-cd.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-name: API - PROD - Continuous Deployment
-
-on:
- push:
- branches:
- - main
- paths:
- - 'api/**'
- workflow_dispatch:
-
-env:
- DOCKER_IMAGE: prasadhonrao/devcamper-webapi
- AZURE_WEBAPP_NAME: devcamper-webapi
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - name: Checkout code
- uses: actions/checkout@v4
-
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
-
- - name: Log in to Docker Hub
- uses: docker/login-action@v1
- with:
- username: ${{ secrets.DOCKER_USERNAME }}
- password: ${{ secrets.DOCKER_PASSWORD }}
-
- - name: Build and push Docker image
- run: |
- docker build -t ${{ env.DOCKER_IMAGE }}:${{ github.sha }} -f api/Dockerfile api
- docker tag ${{ env.DOCKER_IMAGE }}:${{ github.sha }} ${{ env.DOCKER_IMAGE }}:latest
- docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }}
- docker push ${{ env.DOCKER_IMAGE }}:latest
-
- deploy:
- runs-on: ubuntu-latest
- needs: build
-
- steps:
- - name: Log in to Azure
- uses: azure/login@v2
- with:
- creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }}
-
- - name: Deploy to Azure Web App
- uses: azure/webapps-deploy@v2
- with:
- app-name: ${{ env.AZURE_WEBAPP_NAME }}
- images: '${{ env.DOCKER_IMAGE }}:latest'
-
- notify:
- runs-on: ubuntu-latest
- needs: deploy
- if: always()
-
- steps:
- - name: Send email notification
- uses: dawidd6/action-send-mail@v3
- with:
- server_address: smtp.gmail.com
- server_port: 587
- username: ${{ secrets.GMAIL_USERNAME }}
- password: ${{ secrets.GMAIL_PASSWORD }}
- subject: '${{ job.status }}: Deployment Notification'
- body: |
- The deployment has ${{ job.status }}!
- Repository: ${{ github.repository }}
- Branch: ${{ github.ref }}
- Commit: ${{ github.sha }}
- Author: ${{ github.actor }}
- Workflow: ${{ github.workflow }}
- Job: ${{ github.job }}
- Run ID: ${{ github.run_id }}
- Run Number: ${{ github.run_number }}
- Logs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
- to: ${{ secrets.NOTIFY_EMAIL }}
- from: ${{ secrets.GMAIL_USERNAME }}
diff --git a/.github/workflows/ui-dev-ci-cd.yml b/.github/workflows/ui-dev-ci-cd.yml
deleted file mode 100644
index 498882e..0000000
--- a/.github/workflows/ui-dev-ci-cd.yml
+++ /dev/null
@@ -1,84 +0,0 @@
-name: UI - DEV - CI/CD
-
-on:
- push:
- branches:
- - development
- paths:
- - 'ui/**'
- workflow_dispatch:
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v4
-
- - name: Set up Node.js version
- uses: actions/setup-node@v3
- with:
- node-version: '20.x'
-
- - name: npm install, build, and test
- working-directory: ./ui
- run: |
- npm install
- npm run build --if-present
- npm run test --if-present
-
- - name: Zip artifact for deployment
- working-directory: ./ui
- run: |
- cd build
- zip -r ../release.zip ./*
-
- - name: Upload artifact for deployment job
- uses: actions/upload-artifact@v4
- with:
- name: node-app
- path: ./ui/release.zip
-
- deploy:
- runs-on: ubuntu-latest
- needs: build
- environment:
- name: 'dev'
-
- steps:
- - name: Download artifact from build job
- uses: actions/download-artifact@v4
- with:
- name: node-app
- path: .
-
- - name: List contents of the downloaded artifact directory
- run: ls -R .
-
- - name: Unzip artifact into wwwroot
- run: unzip ./release.zip -d wwwroot
-
- - name: List contents of wwwroot directory
- run: ls -R wwwroot
-
- - name: 'Login to Azure'
- uses: azure/login@v1
- with:
- creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }}
-
- - name: 'Deploy to Azure Web App'
- uses: azure/webapps-deploy@v3
- with:
- app-name: 'devcamper-webapp' # Replace with your Azure App Service name
- slot-name: 'dev' # Specify the slot name (e.g., 'dev' for development slot)
- package: wwwroot
-
- - name: 'Validate Deployment'
- run: |
- response=$(curl --write-out '%{http_code}' --silent --output /dev/null https://devcamper-webapp-dev.azurewebsites.net)
- if [ "$response" -ne 200 ]; then
- echo "Deployment validation failed with status code $response"
- exit 1
- else
- echo "Deployment validation succeeded with status code $response"
- fi
diff --git a/.github/workflows/ui-prod-ci-cd.yml b/.github/workflows/ui-prod-ci-cd.yml
deleted file mode 100644
index cd99b81..0000000
--- a/.github/workflows/ui-prod-ci-cd.yml
+++ /dev/null
@@ -1,91 +0,0 @@
-name: UI - PROD - CI/CD
-
-on:
- push:
- branches:
- - main
- paths:
- - 'ui/**'
- pull_request:
- branches:
- - main
- paths:
- - 'ui/**'
- workflow_dispatch:
-
-jobs:
- build:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v4
-
- - name: Set up Node.js version
- uses: actions/setup-node@v3
- with:
- node-version: '20.x'
-
- - name: npm install, build, and test
- working-directory: ./ui
- run: |
- npm install
- npm run build --if-present
- npm run test --if-present
-
- - name: Zip artifact for deployment
- working-directory: ./ui
- run: |
- cd build
- zip -r ../release.zip ./*
-
- - name: Upload artifact for deployment job
- uses: actions/upload-artifact@v4
- with:
- name: node-app
- path: ./ui/release.zip
-
- deploy:
- runs-on: ubuntu-latest
- needs: build
- environment:
- name: 'dev'
-
- steps:
- - name: Download artifact from build job
- uses: actions/download-artifact@v4
- with:
- name: node-app
- path: .
-
- - name: List contents of the downloaded artifact directory
- run: ls -R .
-
- - name: Unzip artifact into wwwroot
- run: unzip ./release.zip -d wwwroot
-
- - name: List contents of wwwroot directory
- run: ls -R wwwroot
-
- # - name: Delete artifact
- # run: rm ./ui/release.zip
-
- - name: 'Login to Azure'
- uses: azure/login@v1
- with:
- creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }}
-
- - name: 'Deploy to Azure Web App'
- uses: azure/webapps-deploy@v3
- with:
- app-name: 'devcamper-webapp' # Replace with your Azure App Service name
- package: wwwroot
-
- - name: 'Validate Deployment'
- run: |
- response=$(curl --write-out '%{http_code}' --silent --output /dev/null https://devcamper-webapp-dev.azurewebsites.net)
- if [ "$response" -ne 200 ]; then
- echo "Deployment validation failed with status code $response"
- exit 1
- else
- echo "Deployment validation succeeded with status code $response"
- fi
diff --git a/.github/workflows/webapi-ci.yml b/.github/workflows/webapi-ci.yml
new file mode 100644
index 0000000..695ef42
--- /dev/null
+++ b/.github/workflows/webapi-ci.yml
@@ -0,0 +1,196 @@
+name: WebAPI CI
+
+on:
+ push:
+ branches:
+ - development
+ paths:
+ - 'src/webapi/**'
+ workflow_dispatch:
+
+env:
+ DOCKER_IMAGE: prasadhonrao/devcamper-webapi
+ AZURE_WEBAPP_NAME: devcamper-webapi
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapi
+
+ - name: Run linter
+ run: |
+ export PATH=$(pwd)/src/webapi/node_modules/.bin:$PATH
+ npm run lint --prefix src/webapi
+
+ dependency-check:
+ runs-on: ubuntu-latest
+ needs: lint
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapi
+
+ - name: Run dependency check
+ run: npm audit --audit-level=high --prefix src/webapi
+
+ security:
+ runs-on: ubuntu-latest
+ needs: dependency-check
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapi
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: javascript
+
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v2
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
+
+ test:
+ runs-on: ubuntu-latest
+ needs: security
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapi
+
+ - name: Run tests
+ run: npm test --prefix src/webapi
+
+ code-coverage:
+ runs-on: ubuntu-latest
+ needs: test
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapi
+
+ - name: Run tests with coverage
+ run: npm run test --prefix src/webapi -- --coverage
+
+ - name: Upload coverage report
+ uses: actions/upload-artifact@v4
+ with:
+ name: coverage-report
+ path: src/webapi/coverage
+
+ build:
+ runs-on: ubuntu-latest
+ needs: code-coverage
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Build and push Docker image
+ run: |
+ docker build -t ${{ env.DOCKER_IMAGE }}:${{ github.sha }} -f src/webapi/Dockerfile src/webapi
+ docker tag ${{ env.DOCKER_IMAGE }}:${{ github.sha }} ${{ env.DOCKER_IMAGE }}:latest
+ docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }}
+ docker push ${{ env.DOCKER_IMAGE }}:latest
+
+ deploy:
+ runs-on: ubuntu-latest
+ needs: build
+
+ steps:
+ - name: Log in to Azure
+ uses: azure/login@v2
+ with:
+ creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }}
+
+ - name: Deploy to Azure Web App
+ uses: azure/webapps-deploy@v2
+ with:
+ app-name: ${{ env.AZURE_WEBAPP_NAME }}
+ images: '${{ env.DOCKER_IMAGE }}:latest'
+
+ notify:
+ runs-on: ubuntu-latest
+ needs: deploy
+ if: always()
+
+ steps:
+ - name: Send email notification
+ uses: dawidd6/action-send-mail@v3
+ with:
+ server_address: smtp.gmail.com
+ server_port: 587
+ username: ${{ secrets.GMAIL_USERNAME }}
+ password: ${{ secrets.GMAIL_PASSWORD }}
+ subject: '${{ job.status }}: DevCamper API Deployment'
+ body: |
+ The deployment has ${{ job.status }}!
+ Repository: ${{ github.repository }}
+ Branch: ${{ github.ref }}
+ Commit: ${{ github.sha }}
+ Author: ${{ github.actor }}
+ Workflow: ${{ github.workflow }}
+ Job: ${{ github.job }}
+ Run ID: ${{ github.run_id }}
+ Run Number: ${{ github.run_number }}
+ Logs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
+ to: ${{ secrets.NOTIFY_EMAIL }}
+ from: ${{ secrets.GMAIL_USERNAME }}
diff --git a/.github/workflows/webapp-ci.yml b/.github/workflows/webapp-ci.yml
new file mode 100644
index 0000000..08c1835
--- /dev/null
+++ b/.github/workflows/webapp-ci.yml
@@ -0,0 +1,197 @@
+name: WebApp CI
+
+on:
+ push:
+ branches:
+ - development
+ paths:
+ - 'src/webapp/**'
+ workflow_dispatch:
+
+env:
+ DOCKER_IMAGE: prasadhonrao/devcamper-webapp
+ AZURE_WEBAPP_NAME: devcamper-webapp
+
+jobs:
+ lint:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapp
+
+ - name: Run linter
+ run: |
+ export PATH=$(pwd)/src/webapp/node_modules/.bin:$PATH
+ npm run lint --prefix src/webapp
+
+ dependency-check:
+ runs-on: ubuntu-latest
+ needs: lint
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapp
+
+ # TODO: Analyze how to check for high severity vulnerabilities
+ # - name: Run dependency check
+ # run: npm audit --audit-level=high --prefix src/webapp
+
+ security:
+ runs-on: ubuntu-latest
+ needs: dependency-check
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapp
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: javascript
+
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v2
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
+
+ test:
+ runs-on: ubuntu-latest
+ needs: security
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapp
+
+ - name: Run tests
+ run: npm test --prefix src/webapp
+
+ code-coverage:
+ runs-on: ubuntu-latest
+ needs: test
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install dependencies
+ run: npm install --prefix src/webapp
+
+ - name: Run tests with coverage
+ run: npm run test --prefix src/webapp -- --coverage
+
+ - name: Upload coverage report
+ uses: actions/upload-artifact@v4
+ with:
+ name: coverage-report
+ path: src/webapp/coverage
+
+ build:
+ runs-on: ubuntu-latest
+ needs: code-coverage
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+
+ - name: Log in to Docker Hub
+ uses: docker/login-action@v1
+ with:
+ username: ${{ secrets.DOCKER_USERNAME }}
+ password: ${{ secrets.DOCKER_PASSWORD }}
+
+ - name: Build and push Docker image
+ run: |
+ docker build --build-arg REACT_APP_DEVCAMPER_BASE_API_URI=${{ secrets.REACT_APP_DEVCAMPER_BASE_API_URI }} -t ${{ env.DOCKER_IMAGE }}:${{ github.sha }} -f src/webapp/Dockerfile src/webapp
+ docker tag ${{ env.DOCKER_IMAGE }}:${{ github.sha }} ${{ env.DOCKER_IMAGE }}:latest
+ docker push ${{ env.DOCKER_IMAGE }}:${{ github.sha }}
+ docker push ${{ env.DOCKER_IMAGE }}:latest
+
+ deploy:
+ runs-on: ubuntu-latest
+ needs: build
+
+ steps:
+ - name: Log in to Azure
+ uses: azure/login@v2
+ with:
+ creds: ${{ secrets.AZURE_SERVICE_PRINCIPAL }}
+
+ - name: Deploy to Azure Web App
+ uses: azure/webapps-deploy@v2
+ with:
+ app-name: ${{ env.AZURE_WEBAPP_NAME }}
+ images: '${{ env.DOCKER_IMAGE }}:latest'
+
+ notify:
+ runs-on: ubuntu-latest
+ needs: deploy
+ if: always()
+
+ steps:
+ - name: Send email notification
+ uses: dawidd6/action-send-mail@v3
+ with:
+ server_address: smtp.gmail.com
+ server_port: 587
+ username: ${{ secrets.GMAIL_USERNAME }}
+ password: ${{ secrets.GMAIL_PASSWORD }}
+ subject: '${{ job.status }}: DevCamper APP Deployment'
+ body: |
+ The deployment has ${{ job.status }}!
+ Repository: ${{ github.repository }}
+ Branch: ${{ github.ref }}
+ Commit: ${{ github.sha }}
+ Author: ${{ github.actor }}
+ Workflow: ${{ github.workflow }}
+ Job: ${{ github.job }}
+ Run ID: ${{ github.run_id }}
+ Run Number: ${{ github.run_number }}
+ Logs: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
+ to: ${{ secrets.NOTIFY_EMAIL }}
+ from: ${{ secrets.GMAIL_USERNAME }}
diff --git a/.k8s/emptydir-volume/network/install.sh b/.k8s/emptydir-volume/network/install.sh
deleted file mode 100644
index 6ab0a3e..0000000
--- a/.k8s/emptydir-volume/network/install.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!bin/bash
-# Install an NGINX Ingress Controller
-kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
-kubectl apply -f ingress.yaml
\ No newline at end of file
diff --git a/.k8s/emptydir-volume/network/uninstall.sh b/.k8s/emptydir-volume/network/uninstall.sh
deleted file mode 100644
index 84d9ef5..0000000
--- a/.k8s/emptydir-volume/network/uninstall.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-#!bin/bash
-kubectl delete -f ingress.yaml
\ No newline at end of file
diff --git a/.k8s/emptydir-volume/webapp/configmap.yaml b/.k8s/emptydir-volume/webapp/configmap.yaml
deleted file mode 100644
index 1d23696..0000000
--- a/.k8s/emptydir-volume/webapp/configmap.yaml
+++ /dev/null
@@ -1,7 +0,0 @@
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: devcamper-webapp-configmap
- namespace: devcamper-namespace
-data:
- react_app_devcamper_base_api_uri: 'http://devcamper.webapi'
diff --git a/.k8s/without-volume/database/install.sh b/.k8s/without-volume/database/install.sh
deleted file mode 100644
index a08f6e9..0000000
--- a/.k8s/without-volume/database/install.sh
+++ /dev/null
@@ -1,6 +0,0 @@
-#!bin/bash
-kubectl apply -f configmap.yaml
-kubectl apply -f secret.yaml
-kubectl apply -f deployment.yaml
-kubectl apply -f service-nodeport.yaml
-kubectl apply -f service.yaml
\ No newline at end of file
diff --git a/.k8s/without-volume/database/secret.yaml b/.k8s/without-volume/database/secret.yaml
deleted file mode 100644
index 9dc04fb..0000000
--- a/.k8s/without-volume/database/secret.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-apiVersion: v1
-kind: Secret
-metadata:
- name: devcamper-db-secret
- namespace: devcamper-namespace
-data:
- mongodb_username: 'YWRtaW4=' # base64 encoded string for 'admin'
- mongodb_password: 'cGFzc3dvcmQ=' # base64 encoded string for 'password'
diff --git a/.k8s/without-volume/database/service-nodeport.yaml b/.k8s/without-volume/database/service-nodeport.yaml
deleted file mode 100644
index 38f5651..0000000
--- a/.k8s/without-volume/database/service-nodeport.yaml
+++ /dev/null
@@ -1,15 +0,0 @@
-# This service is created only to validate the connectivity to the database externally
-apiVersion: v1
-kind: Service
-metadata:
- name: devcamper-db-nodeport-service
- namespace: devcamper-namespace
-spec:
- type: NodePort
- selector:
- app: devcamper-db
- ports:
- - protocol: TCP
- port: 27017
- targetPort: 27017
- nodePort: 32017
diff --git a/.k8s/without-volume/database/service.yaml b/.k8s/without-volume/database/service.yaml
deleted file mode 100644
index d6fa98a..0000000
--- a/.k8s/without-volume/database/service.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: devcamper-db-clusterip-service
- namespace: devcamper-namespace
-spec:
- selector:
- app: devcamper-db
- ports:
- - name: mongodb
- port: 27017
- targetPort: 27017
- type: ClusterIP
diff --git a/.k8s/without-volume/install.sh b/.k8s/without-volume/install.sh
deleted file mode 100644
index 82a6fdd..0000000
--- a/.k8s/without-volume/install.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-
-# Function to run install script in a directory
-run_install() {
- local dir=$1
- cd "$dir" || { echo "Failed to change directory to $dir"; exit 1; }
- bash ./install.sh
- cd - > /dev/null || { echo "Failed to return to previous directory"; exit 1; }
-}
-
-# Set trap to ensure we return to the original directory on exit
-trap 'cd - > /dev/null' EXIT
-
-# Run install scripts in the specified directories
-run_install namespace
-run_install database
-run_install webapi
-run_install webapp
\ No newline at end of file
diff --git a/.k8s/without-volume/uninstall.sh b/.k8s/without-volume/uninstall.sh
deleted file mode 100644
index 3dd7216..0000000
--- a/.k8s/without-volume/uninstall.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-
-# Function to run uninstall script in a directory
-run_uninstall() {
- local dir=$1
- cd "$dir" || { echo "Failed to change directory to $dir"; exit 1; }
- bash ./uninstall.sh
- cd - > /dev/null || { echo "Failed to return to previous directory"; exit 1; }
-}
-
-# Set trap to ensure we return to the original directory on exit
-trap 'cd - > /dev/null' EXIT
-
-# Run uninstall scripts in the specified directories
-run_uninstall database
-run_uninstall webapi
-run_uninstall webapp
-run_uninstall namespace
diff --git a/.k8s/without-volume/webapi/install.sh b/.k8s/without-volume/webapi/install.sh
deleted file mode 100644
index e4e601b..0000000
--- a/.k8s/without-volume/webapi/install.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!bin/bash
-kubectl apply -f configmap.yaml
-kubectl apply -f secret.yaml
-kubectl apply -f deployment.yaml
-kubectl apply -f service-nodeport.yaml
\ No newline at end of file
diff --git a/.k8s/without-volume/webapi/secret.yaml b/.k8s/without-volume/webapi/secret.yaml
deleted file mode 100644
index 302f7b3..0000000
--- a/.k8s/without-volume/webapi/secret.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: v1
-kind: Secret
-metadata:
- name: devcamper-webapi-secret
- namespace: devcamper-namespace
-type: Opaque
-data:
- mongodb_username: YWRtaW4= # base64 encoded string for 'admin'
- mongodb_password: cGFzc3dvcmQ= # base64 encoded string for 'password'
- geocoder_api_key: ''
- smtp_host: ''
- smtp_port: ''
- smtp_email: ''
- smtp_password: ''
- from_email: ''
- from_name: ''
- jwt_secret: ''
diff --git a/.k8s/without-volume/webapp/install.sh b/.k8s/without-volume/webapp/install.sh
deleted file mode 100644
index bfeaf9d..0000000
--- a/.k8s/without-volume/webapp/install.sh
+++ /dev/null
@@ -1 +0,0 @@
-#!bin/bash
diff --git a/.k8s/without-volume/webapp/uninstall.sh b/.k8s/without-volume/webapp/uninstall.sh
deleted file mode 100644
index bfeaf9d..0000000
--- a/.k8s/without-volume/webapp/uninstall.sh
+++ /dev/null
@@ -1 +0,0 @@
-#!bin/bash
diff --git a/assets/html/add-bootcamp.html b/assets/html/add-bootcamp.html
deleted file mode 100644
index 43feae4..0000000
--- a/assets/html/add-bootcamp.html
+++ /dev/null
@@ -1,251 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
- Add Bootcamp
-
- Important: You must be affiliated with a bootcamp to add to DevCamper
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/add-course.html b/assets/html/add-course.html
deleted file mode 100644
index 253039d..0000000
--- a/assets/html/add-course.html
+++ /dev/null
@@ -1,177 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/add-review.html b/assets/html/add-review.html
deleted file mode 100644
index a8439c5..0000000
--- a/assets/html/add-review.html
+++ /dev/null
@@ -1,146 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
Bootcamp Info
-
DevWorks Bootcamp
-
Write a Review
-
- You must have attended and graduated this bootcamp to review
-
-
-
- Rating: 8
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/bootcamp.html b/assets/html/bootcamp.html
deleted file mode 100644
index f01a81a..0000000
--- a/assets/html/bootcamp.html
+++ /dev/null
@@ -1,136 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
DevWorks Bootcamp
-
-
Devworks is a full stack JavaScript Bootcamp located in the heart of Boston that focuses on the technologies you need to get a high paying job as a web developer
-
-
Average Course Cost: $10,000
-
-
-
-
-
Duration: 8 Weeks
-
This course will provide you with all of the essentials to become a successful frontend web developer. You will learn to master HTML, CSS and front end JavaScript, along with tools like Git, VSCode and front end frameworks like Vue
-
- Cost: $8,000 USD
- Skill Required: Beginner
- Scholarship Available:
-
-
-
-
-
-
-
-
Duration: 12 Weeks
-
In this course you will learn full stack web development, first learning all about the frontend with HTML/CSS/JS/Vue and then the backend with Node.js/Express/MongoDB
-
- Cost: $10,000 USD
- Skill Required: Intermediate
- Scholarship Available:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/bootcamps.html b/assets/html/bootcamps.html
deleted file mode 100644
index d1eca24..0000000
--- a/assets/html/bootcamps.html
+++ /dev/null
@@ -1,289 +0,0 @@
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Filter
-
-
-
-
- Rating
-
- Any
- 9+
- 8+
- 7+
- 6+
- 5+
- 4+
- 3+
- 2+
-
-
-
-
- Budget
-
- Any
- $20,000
- $15,000
- $10,000
- $8,000
- $6,000
- $4,000
- $2,000
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Boston, MA
-
- Web Development, UI/UX, Mobile Development
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Boston, MA
-
- Web Development, UI/UX, Mobile Development
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Burlington, VT
-
- Web Development, Data Science, Marketing
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Kingston, RI
-
- Web Development, UI/UX, Mobile Development, Marketing
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/css/bootstrap.css b/assets/html/css/bootstrap.css
deleted file mode 100644
index c5afe29..0000000
--- a/assets/html/css/bootstrap.css
+++ /dev/null
@@ -1,9707 +0,0 @@
-/*!
- * Bootstrap v4.3.1 (https://getbootstrap.com/)
- * Copyright 2011-2019 The Bootstrap Authors
- * Copyright 2011-2019 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-:root {
- --blue: #007bff;
- --indigo: #6610f2;
- --purple: #6f42c1;
- --pink: #e83e8c;
- --red: #dc3545;
- --orange: #e05433;
- --yellow: #ffc107;
- --green: #28a745;
- --teal: #20c997;
- --cyan: #17a2b8;
- --white: #fff;
- --gray: #6c757d;
- --gray-dark: #343a40;
- --primary: #e05433;
- --secondary: #6c757d;
- --success: #28a745;
- --info: #17a2b8;
- --warning: #ffc107;
- --danger: #dc3545;
- --light: #f8f9fa;
- --dark: #343a40;
- --breakpoint-xs: 0;
- --breakpoint-sm: 576px;
- --breakpoint-md: 768px;
- --breakpoint-lg: 992px;
- --breakpoint-xl: 1200px;
- --font-family-sans-serif: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans',
- sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
- --font-family-monospace: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
-}
-*,
-*::before,
-*::after {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
-}
-html {
- font-family: sans-serif;
- line-height: 1.15;
- -webkit-text-size-adjust: 100%;
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-article,
-aside,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-main,
-nav,
-section {
- display: block;
-}
-body {
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif,
- 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #212529;
- text-align: left;
- background-color: #f8f9fa;
-}
-[tabindex='-1']:focus {
- outline: 0 !important;
-}
-hr {
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
- height: 0;
- overflow: visible;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin-top: 0;
- margin-bottom: 0.5rem;
-}
-p {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-abbr[title],
-abbr[data-original-title] {
- text-decoration: underline;
- -webkit-text-decoration: underline dotted;
- text-decoration: underline dotted;
- cursor: help;
- border-bottom: 0;
- text-decoration-skip-ink: none;
-}
-address {
- margin-bottom: 1rem;
- font-style: normal;
- line-height: inherit;
-}
-ol,
-ul,
-dl {
- margin-top: 0;
- margin-bottom: 1rem;
-}
-ol ol,
-ul ul,
-ol ul,
-ul ol {
- margin-bottom: 0;
-}
-dt {
- font-weight: 700;
-}
-dd {
- margin-bottom: 0.5rem;
- margin-left: 0;
-}
-blockquote {
- margin: 0 0 1rem;
-}
-b,
-strong {
- font-weight: bolder;
-}
-small {
- font-size: 80%;
-}
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-sub {
- bottom: -0.25em;
-}
-sup {
- top: -0.5em;
-}
-a {
- color: #e05433;
- text-decoration: none;
- background-color: transparent;
-}
-a:hover {
- color: #ac361a;
- text-decoration: underline;
-}
-a:not([href]):not([tabindex]) {
- color: inherit;
- text-decoration: none;
-}
-a:not([href]):not([tabindex]):hover,
-a:not([href]):not([tabindex]):focus {
- color: inherit;
- text-decoration: none;
-}
-a:not([href]):not([tabindex]):focus {
- outline: 0;
-}
-pre,
-code,
-kbd,
-samp {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
- font-size: 1em;
-}
-pre {
- margin-top: 0;
- margin-bottom: 1rem;
- overflow: auto;
-}
-figure {
- margin: 0 0 1rem;
-}
-img {
- vertical-align: middle;
- border-style: none;
-}
-svg {
- overflow: hidden;
- vertical-align: middle;
-}
-table {
- border-collapse: collapse;
-}
-caption {
- padding-top: 0.75rem;
- padding-bottom: 0.75rem;
- color: #6c757d;
- text-align: left;
- caption-side: bottom;
-}
-th {
- text-align: inherit;
-}
-label {
- display: inline-block;
- margin-bottom: 0.5rem;
-}
-button {
- border-radius: 0;
-}
-button:focus {
- outline: 1px dotted;
- outline: 5px auto -webkit-focus-ring-color;
-}
-input,
-button,
-select,
-optgroup,
-textarea {
- margin: 0;
- font-family: inherit;
- font-size: inherit;
- line-height: inherit;
-}
-button,
-input {
- overflow: visible;
-}
-button,
-select {
- text-transform: none;
-}
-select {
- word-wrap: normal;
-}
-button,
-[type='button'],
-[type='reset'],
-[type='submit'] {
- -webkit-appearance: button;
-}
-button:not(:disabled),
-[type='button']:not(:disabled),
-[type='reset']:not(:disabled),
-[type='submit']:not(:disabled) {
- cursor: pointer;
-}
-button::-moz-focus-inner,
-[type='button']::-moz-focus-inner,
-[type='reset']::-moz-focus-inner,
-[type='submit']::-moz-focus-inner {
- padding: 0;
- border-style: none;
-}
-input[type='radio'],
-input[type='checkbox'] {
- -webkit-box-sizing: border-box;
- box-sizing: border-box;
- padding: 0;
-}
-input[type='date'],
-input[type='time'],
-input[type='datetime-local'],
-input[type='month'] {
- -webkit-appearance: listbox;
-}
-textarea {
- overflow: auto;
- resize: vertical;
-}
-fieldset {
- min-width: 0;
- padding: 0;
- margin: 0;
- border: 0;
-}
-legend {
- display: block;
- width: 100%;
- max-width: 100%;
- padding: 0;
- margin-bottom: 0.5rem;
- font-size: 1.5rem;
- line-height: inherit;
- color: inherit;
- white-space: normal;
-}
-progress {
- vertical-align: baseline;
-}
-[type='number']::-webkit-inner-spin-button,
-[type='number']::-webkit-outer-spin-button {
- height: auto;
-}
-[type='search'] {
- outline-offset: -2px;
- -webkit-appearance: none;
-}
-[type='search']::-webkit-search-decoration {
- -webkit-appearance: none;
-}
-::-webkit-file-upload-button {
- font: inherit;
- -webkit-appearance: button;
-}
-output {
- display: inline-block;
-}
-summary {
- display: list-item;
- cursor: pointer;
-}
-template {
- display: none;
-}
-[hidden] {
- display: none !important;
-}
-h1,
-h2,
-h3,
-h4,
-h5,
-h6,
-.h1,
-.h2,
-.h3,
-.h4,
-.h5,
-.h6 {
- margin-bottom: 0.5rem;
- font-weight: 500;
- line-height: 1.2;
-}
-h1,
-.h1 {
- font-size: 2.5rem;
-}
-h2,
-.h2 {
- font-size: 2rem;
-}
-h3,
-.h3 {
- font-size: 1.75rem;
-}
-h4,
-.h4 {
- font-size: 1.5rem;
-}
-h5,
-.h5 {
- font-size: 1.25rem;
-}
-h6,
-.h6 {
- font-size: 1rem;
-}
-.lead {
- font-size: 1.25rem;
- font-weight: 300;
-}
-.display-1 {
- font-size: 6rem;
- font-weight: 300;
- line-height: 1.2;
-}
-.display-2 {
- font-size: 5.5rem;
- font-weight: 300;
- line-height: 1.2;
-}
-.display-3 {
- font-size: 4.5rem;
- font-weight: 300;
- line-height: 1.2;
-}
-.display-4 {
- font-size: 3.5rem;
- font-weight: 300;
- line-height: 1.2;
-}
-hr {
- margin-top: 1rem;
- margin-bottom: 1rem;
- border: 0;
- border-top: 1px solid rgba(0, 0, 0, 0.1);
-}
-small,
-.small {
- font-size: 80%;
- font-weight: 400;
-}
-mark,
-.mark {
- padding: 0.2em;
- background-color: #fcf8e3;
-}
-.list-unstyled {
- padding-left: 0;
- list-style: none;
-}
-.list-inline {
- padding-left: 0;
- list-style: none;
-}
-.list-inline-item {
- display: inline-block;
-}
-.list-inline-item:not(:last-child) {
- margin-right: 0.5rem;
-}
-.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-.blockquote {
- margin-bottom: 1rem;
- font-size: 1.25rem;
-}
-.blockquote-footer {
- display: block;
- font-size: 80%;
- color: #6c757d;
-}
-.blockquote-footer::before {
- content: '\2014\00A0';
-}
-.img-fluid {
- max-width: 100%;
- height: auto;
-}
-.img-thumbnail {
- padding: 0.25rem;
- background-color: #f8f9fa;
- border: 1px solid #dee2e6;
- border-radius: 0;
- max-width: 100%;
- height: auto;
-}
-.figure {
- display: inline-block;
-}
-.figure-img {
- margin-bottom: 0.5rem;
- line-height: 1;
-}
-.figure-caption {
- font-size: 90%;
- color: #6c757d;
-}
-code {
- font-size: 87.5%;
- color: #e83e8c;
- word-break: break-word;
-}
-a > code {
- color: inherit;
-}
-kbd {
- padding: 0.2rem 0.4rem;
- font-size: 87.5%;
- color: #fff;
- background-color: #212529;
- border-radius: 0;
-}
-kbd kbd {
- padding: 0;
- font-size: 100%;
- font-weight: 700;
-}
-pre {
- display: block;
- font-size: 87.5%;
- color: #212529;
-}
-pre code {
- font-size: inherit;
- color: inherit;
- word-break: normal;
-}
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-.container {
- width: 100%;
- padding-right: 15px;
- padding-left: 15px;
- margin-right: auto;
- margin-left: auto;
-}
-@media (min-width: 576px) {
- .container {
- max-width: 540px;
- }
-}
-@media (min-width: 768px) {
- .container {
- max-width: 720px;
- }
-}
-@media (min-width: 992px) {
- .container {
- max-width: 960px;
- }
-}
-@media (min-width: 1200px) {
- .container {
- max-width: 1140px;
- }
-}
-.container-fluid {
- width: 100%;
- padding-right: 15px;
- padding-left: 15px;
- margin-right: auto;
- margin-left: auto;
-}
-.row {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- margin-right: -15px;
- margin-left: -15px;
-}
-.no-gutters {
- margin-right: 0;
- margin-left: 0;
-}
-.no-gutters > .col,
-.no-gutters > [class*='col-'] {
- padding-right: 0;
- padding-left: 0;
-}
-.col-1,
-.col-2,
-.col-3,
-.col-4,
-.col-5,
-.col-6,
-.col-7,
-.col-8,
-.col-9,
-.col-10,
-.col-11,
-.col-12,
-.col,
-.col-auto,
-.col-sm-1,
-.col-sm-2,
-.col-sm-3,
-.col-sm-4,
-.col-sm-5,
-.col-sm-6,
-.col-sm-7,
-.col-sm-8,
-.col-sm-9,
-.col-sm-10,
-.col-sm-11,
-.col-sm-12,
-.col-sm,
-.col-sm-auto,
-.col-md-1,
-.col-md-2,
-.col-md-3,
-.col-md-4,
-.col-md-5,
-.col-md-6,
-.col-md-7,
-.col-md-8,
-.col-md-9,
-.col-md-10,
-.col-md-11,
-.col-md-12,
-.col-md,
-.col-md-auto,
-.col-lg-1,
-.col-lg-2,
-.col-lg-3,
-.col-lg-4,
-.col-lg-5,
-.col-lg-6,
-.col-lg-7,
-.col-lg-8,
-.col-lg-9,
-.col-lg-10,
-.col-lg-11,
-.col-lg-12,
-.col-lg,
-.col-lg-auto,
-.col-xl-1,
-.col-xl-2,
-.col-xl-3,
-.col-xl-4,
-.col-xl-5,
-.col-xl-6,
-.col-xl-7,
-.col-xl-8,
-.col-xl-9,
-.col-xl-10,
-.col-xl-11,
-.col-xl-12,
-.col-xl,
-.col-xl-auto {
- position: relative;
- width: 100%;
- padding-right: 15px;
- padding-left: 15px;
-}
-.col {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
-}
-.col-auto {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
-}
-.col-1 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 8.33333%;
- flex: 0 0 8.33333%;
- max-width: 8.33333%;
-}
-.col-2 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 16.66667%;
- flex: 0 0 16.66667%;
- max-width: 16.66667%;
-}
-.col-3 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
-}
-.col-4 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 33.33333%;
- flex: 0 0 33.33333%;
- max-width: 33.33333%;
-}
-.col-5 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 41.66667%;
- flex: 0 0 41.66667%;
- max-width: 41.66667%;
-}
-.col-6 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
-}
-.col-7 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 58.33333%;
- flex: 0 0 58.33333%;
- max-width: 58.33333%;
-}
-.col-8 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 66.66667%;
- flex: 0 0 66.66667%;
- max-width: 66.66667%;
-}
-.col-9 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
-}
-.col-10 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 83.33333%;
- flex: 0 0 83.33333%;
- max-width: 83.33333%;
-}
-.col-11 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 91.66667%;
- flex: 0 0 91.66667%;
- max-width: 91.66667%;
-}
-.col-12 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
-}
-.order-first {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1;
-}
-.order-last {
- -webkit-box-ordinal-group: 14;
- -ms-flex-order: 13;
- order: 13;
-}
-.order-0 {
- -webkit-box-ordinal-group: 1;
- -ms-flex-order: 0;
- order: 0;
-}
-.order-1 {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1;
-}
-.order-2 {
- -webkit-box-ordinal-group: 3;
- -ms-flex-order: 2;
- order: 2;
-}
-.order-3 {
- -webkit-box-ordinal-group: 4;
- -ms-flex-order: 3;
- order: 3;
-}
-.order-4 {
- -webkit-box-ordinal-group: 5;
- -ms-flex-order: 4;
- order: 4;
-}
-.order-5 {
- -webkit-box-ordinal-group: 6;
- -ms-flex-order: 5;
- order: 5;
-}
-.order-6 {
- -webkit-box-ordinal-group: 7;
- -ms-flex-order: 6;
- order: 6;
-}
-.order-7 {
- -webkit-box-ordinal-group: 8;
- -ms-flex-order: 7;
- order: 7;
-}
-.order-8 {
- -webkit-box-ordinal-group: 9;
- -ms-flex-order: 8;
- order: 8;
-}
-.order-9 {
- -webkit-box-ordinal-group: 10;
- -ms-flex-order: 9;
- order: 9;
-}
-.order-10 {
- -webkit-box-ordinal-group: 11;
- -ms-flex-order: 10;
- order: 10;
-}
-.order-11 {
- -webkit-box-ordinal-group: 12;
- -ms-flex-order: 11;
- order: 11;
-}
-.order-12 {
- -webkit-box-ordinal-group: 13;
- -ms-flex-order: 12;
- order: 12;
-}
-.offset-1 {
- margin-left: 8.33333%;
-}
-.offset-2 {
- margin-left: 16.66667%;
-}
-.offset-3 {
- margin-left: 25%;
-}
-.offset-4 {
- margin-left: 33.33333%;
-}
-.offset-5 {
- margin-left: 41.66667%;
-}
-.offset-6 {
- margin-left: 50%;
-}
-.offset-7 {
- margin-left: 58.33333%;
-}
-.offset-8 {
- margin-left: 66.66667%;
-}
-.offset-9 {
- margin-left: 75%;
-}
-.offset-10 {
- margin-left: 83.33333%;
-}
-.offset-11 {
- margin-left: 91.66667%;
-}
-@media (min-width: 576px) {
- .col-sm {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
- }
- .col-sm-auto {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-sm-1 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 8.33333%;
- flex: 0 0 8.33333%;
- max-width: 8.33333%;
- }
- .col-sm-2 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 16.66667%;
- flex: 0 0 16.66667%;
- max-width: 16.66667%;
- }
- .col-sm-3 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-sm-4 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 33.33333%;
- flex: 0 0 33.33333%;
- max-width: 33.33333%;
- }
- .col-sm-5 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 41.66667%;
- flex: 0 0 41.66667%;
- max-width: 41.66667%;
- }
- .col-sm-6 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-sm-7 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 58.33333%;
- flex: 0 0 58.33333%;
- max-width: 58.33333%;
- }
- .col-sm-8 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 66.66667%;
- flex: 0 0 66.66667%;
- max-width: 66.66667%;
- }
- .col-sm-9 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-sm-10 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 83.33333%;
- flex: 0 0 83.33333%;
- max-width: 83.33333%;
- }
- .col-sm-11 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 91.66667%;
- flex: 0 0 91.66667%;
- max-width: 91.66667%;
- }
- .col-sm-12 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-sm-first {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-sm-last {
- -webkit-box-ordinal-group: 14;
- -ms-flex-order: 13;
- order: 13;
- }
- .order-sm-0 {
- -webkit-box-ordinal-group: 1;
- -ms-flex-order: 0;
- order: 0;
- }
- .order-sm-1 {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-sm-2 {
- -webkit-box-ordinal-group: 3;
- -ms-flex-order: 2;
- order: 2;
- }
- .order-sm-3 {
- -webkit-box-ordinal-group: 4;
- -ms-flex-order: 3;
- order: 3;
- }
- .order-sm-4 {
- -webkit-box-ordinal-group: 5;
- -ms-flex-order: 4;
- order: 4;
- }
- .order-sm-5 {
- -webkit-box-ordinal-group: 6;
- -ms-flex-order: 5;
- order: 5;
- }
- .order-sm-6 {
- -webkit-box-ordinal-group: 7;
- -ms-flex-order: 6;
- order: 6;
- }
- .order-sm-7 {
- -webkit-box-ordinal-group: 8;
- -ms-flex-order: 7;
- order: 7;
- }
- .order-sm-8 {
- -webkit-box-ordinal-group: 9;
- -ms-flex-order: 8;
- order: 8;
- }
- .order-sm-9 {
- -webkit-box-ordinal-group: 10;
- -ms-flex-order: 9;
- order: 9;
- }
- .order-sm-10 {
- -webkit-box-ordinal-group: 11;
- -ms-flex-order: 10;
- order: 10;
- }
- .order-sm-11 {
- -webkit-box-ordinal-group: 12;
- -ms-flex-order: 11;
- order: 11;
- }
- .order-sm-12 {
- -webkit-box-ordinal-group: 13;
- -ms-flex-order: 12;
- order: 12;
- }
- .offset-sm-0 {
- margin-left: 0;
- }
- .offset-sm-1 {
- margin-left: 8.33333%;
- }
- .offset-sm-2 {
- margin-left: 16.66667%;
- }
- .offset-sm-3 {
- margin-left: 25%;
- }
- .offset-sm-4 {
- margin-left: 33.33333%;
- }
- .offset-sm-5 {
- margin-left: 41.66667%;
- }
- .offset-sm-6 {
- margin-left: 50%;
- }
- .offset-sm-7 {
- margin-left: 58.33333%;
- }
- .offset-sm-8 {
- margin-left: 66.66667%;
- }
- .offset-sm-9 {
- margin-left: 75%;
- }
- .offset-sm-10 {
- margin-left: 83.33333%;
- }
- .offset-sm-11 {
- margin-left: 91.66667%;
- }
-}
-@media (min-width: 768px) {
- .col-md {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
- }
- .col-md-auto {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-md-1 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 8.33333%;
- flex: 0 0 8.33333%;
- max-width: 8.33333%;
- }
- .col-md-2 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 16.66667%;
- flex: 0 0 16.66667%;
- max-width: 16.66667%;
- }
- .col-md-3 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-md-4 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 33.33333%;
- flex: 0 0 33.33333%;
- max-width: 33.33333%;
- }
- .col-md-5 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 41.66667%;
- flex: 0 0 41.66667%;
- max-width: 41.66667%;
- }
- .col-md-6 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-md-7 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 58.33333%;
- flex: 0 0 58.33333%;
- max-width: 58.33333%;
- }
- .col-md-8 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 66.66667%;
- flex: 0 0 66.66667%;
- max-width: 66.66667%;
- }
- .col-md-9 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-md-10 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 83.33333%;
- flex: 0 0 83.33333%;
- max-width: 83.33333%;
- }
- .col-md-11 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 91.66667%;
- flex: 0 0 91.66667%;
- max-width: 91.66667%;
- }
- .col-md-12 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-md-first {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-md-last {
- -webkit-box-ordinal-group: 14;
- -ms-flex-order: 13;
- order: 13;
- }
- .order-md-0 {
- -webkit-box-ordinal-group: 1;
- -ms-flex-order: 0;
- order: 0;
- }
- .order-md-1 {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-md-2 {
- -webkit-box-ordinal-group: 3;
- -ms-flex-order: 2;
- order: 2;
- }
- .order-md-3 {
- -webkit-box-ordinal-group: 4;
- -ms-flex-order: 3;
- order: 3;
- }
- .order-md-4 {
- -webkit-box-ordinal-group: 5;
- -ms-flex-order: 4;
- order: 4;
- }
- .order-md-5 {
- -webkit-box-ordinal-group: 6;
- -ms-flex-order: 5;
- order: 5;
- }
- .order-md-6 {
- -webkit-box-ordinal-group: 7;
- -ms-flex-order: 6;
- order: 6;
- }
- .order-md-7 {
- -webkit-box-ordinal-group: 8;
- -ms-flex-order: 7;
- order: 7;
- }
- .order-md-8 {
- -webkit-box-ordinal-group: 9;
- -ms-flex-order: 8;
- order: 8;
- }
- .order-md-9 {
- -webkit-box-ordinal-group: 10;
- -ms-flex-order: 9;
- order: 9;
- }
- .order-md-10 {
- -webkit-box-ordinal-group: 11;
- -ms-flex-order: 10;
- order: 10;
- }
- .order-md-11 {
- -webkit-box-ordinal-group: 12;
- -ms-flex-order: 11;
- order: 11;
- }
- .order-md-12 {
- -webkit-box-ordinal-group: 13;
- -ms-flex-order: 12;
- order: 12;
- }
- .offset-md-0 {
- margin-left: 0;
- }
- .offset-md-1 {
- margin-left: 8.33333%;
- }
- .offset-md-2 {
- margin-left: 16.66667%;
- }
- .offset-md-3 {
- margin-left: 25%;
- }
- .offset-md-4 {
- margin-left: 33.33333%;
- }
- .offset-md-5 {
- margin-left: 41.66667%;
- }
- .offset-md-6 {
- margin-left: 50%;
- }
- .offset-md-7 {
- margin-left: 58.33333%;
- }
- .offset-md-8 {
- margin-left: 66.66667%;
- }
- .offset-md-9 {
- margin-left: 75%;
- }
- .offset-md-10 {
- margin-left: 83.33333%;
- }
- .offset-md-11 {
- margin-left: 91.66667%;
- }
-}
-@media (min-width: 992px) {
- .col-lg {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
- }
- .col-lg-auto {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-lg-1 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 8.33333%;
- flex: 0 0 8.33333%;
- max-width: 8.33333%;
- }
- .col-lg-2 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 16.66667%;
- flex: 0 0 16.66667%;
- max-width: 16.66667%;
- }
- .col-lg-3 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-lg-4 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 33.33333%;
- flex: 0 0 33.33333%;
- max-width: 33.33333%;
- }
- .col-lg-5 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 41.66667%;
- flex: 0 0 41.66667%;
- max-width: 41.66667%;
- }
- .col-lg-6 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-lg-7 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 58.33333%;
- flex: 0 0 58.33333%;
- max-width: 58.33333%;
- }
- .col-lg-8 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 66.66667%;
- flex: 0 0 66.66667%;
- max-width: 66.66667%;
- }
- .col-lg-9 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-lg-10 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 83.33333%;
- flex: 0 0 83.33333%;
- max-width: 83.33333%;
- }
- .col-lg-11 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 91.66667%;
- flex: 0 0 91.66667%;
- max-width: 91.66667%;
- }
- .col-lg-12 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-lg-first {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-lg-last {
- -webkit-box-ordinal-group: 14;
- -ms-flex-order: 13;
- order: 13;
- }
- .order-lg-0 {
- -webkit-box-ordinal-group: 1;
- -ms-flex-order: 0;
- order: 0;
- }
- .order-lg-1 {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-lg-2 {
- -webkit-box-ordinal-group: 3;
- -ms-flex-order: 2;
- order: 2;
- }
- .order-lg-3 {
- -webkit-box-ordinal-group: 4;
- -ms-flex-order: 3;
- order: 3;
- }
- .order-lg-4 {
- -webkit-box-ordinal-group: 5;
- -ms-flex-order: 4;
- order: 4;
- }
- .order-lg-5 {
- -webkit-box-ordinal-group: 6;
- -ms-flex-order: 5;
- order: 5;
- }
- .order-lg-6 {
- -webkit-box-ordinal-group: 7;
- -ms-flex-order: 6;
- order: 6;
- }
- .order-lg-7 {
- -webkit-box-ordinal-group: 8;
- -ms-flex-order: 7;
- order: 7;
- }
- .order-lg-8 {
- -webkit-box-ordinal-group: 9;
- -ms-flex-order: 8;
- order: 8;
- }
- .order-lg-9 {
- -webkit-box-ordinal-group: 10;
- -ms-flex-order: 9;
- order: 9;
- }
- .order-lg-10 {
- -webkit-box-ordinal-group: 11;
- -ms-flex-order: 10;
- order: 10;
- }
- .order-lg-11 {
- -webkit-box-ordinal-group: 12;
- -ms-flex-order: 11;
- order: 11;
- }
- .order-lg-12 {
- -webkit-box-ordinal-group: 13;
- -ms-flex-order: 12;
- order: 12;
- }
- .offset-lg-0 {
- margin-left: 0;
- }
- .offset-lg-1 {
- margin-left: 8.33333%;
- }
- .offset-lg-2 {
- margin-left: 16.66667%;
- }
- .offset-lg-3 {
- margin-left: 25%;
- }
- .offset-lg-4 {
- margin-left: 33.33333%;
- }
- .offset-lg-5 {
- margin-left: 41.66667%;
- }
- .offset-lg-6 {
- margin-left: 50%;
- }
- .offset-lg-7 {
- margin-left: 58.33333%;
- }
- .offset-lg-8 {
- margin-left: 66.66667%;
- }
- .offset-lg-9 {
- margin-left: 75%;
- }
- .offset-lg-10 {
- margin-left: 83.33333%;
- }
- .offset-lg-11 {
- margin-left: 91.66667%;
- }
-}
-@media (min-width: 1200px) {
- .col-xl {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- max-width: 100%;
- }
- .col-xl-auto {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- width: auto;
- max-width: 100%;
- }
- .col-xl-1 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 8.33333%;
- flex: 0 0 8.33333%;
- max-width: 8.33333%;
- }
- .col-xl-2 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 16.66667%;
- flex: 0 0 16.66667%;
- max-width: 16.66667%;
- }
- .col-xl-3 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 25%;
- flex: 0 0 25%;
- max-width: 25%;
- }
- .col-xl-4 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 33.33333%;
- flex: 0 0 33.33333%;
- max-width: 33.33333%;
- }
- .col-xl-5 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 41.66667%;
- flex: 0 0 41.66667%;
- max-width: 41.66667%;
- }
- .col-xl-6 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 50%;
- flex: 0 0 50%;
- max-width: 50%;
- }
- .col-xl-7 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 58.33333%;
- flex: 0 0 58.33333%;
- max-width: 58.33333%;
- }
- .col-xl-8 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 66.66667%;
- flex: 0 0 66.66667%;
- max-width: 66.66667%;
- }
- .col-xl-9 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 75%;
- flex: 0 0 75%;
- max-width: 75%;
- }
- .col-xl-10 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 83.33333%;
- flex: 0 0 83.33333%;
- max-width: 83.33333%;
- }
- .col-xl-11 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 91.66667%;
- flex: 0 0 91.66667%;
- max-width: 91.66667%;
- }
- .col-xl-12 {
- -webkit-box-flex: 0;
- -ms-flex: 0 0 100%;
- flex: 0 0 100%;
- max-width: 100%;
- }
- .order-xl-first {
- -webkit-box-ordinal-group: 0;
- -ms-flex-order: -1;
- order: -1;
- }
- .order-xl-last {
- -webkit-box-ordinal-group: 14;
- -ms-flex-order: 13;
- order: 13;
- }
- .order-xl-0 {
- -webkit-box-ordinal-group: 1;
- -ms-flex-order: 0;
- order: 0;
- }
- .order-xl-1 {
- -webkit-box-ordinal-group: 2;
- -ms-flex-order: 1;
- order: 1;
- }
- .order-xl-2 {
- -webkit-box-ordinal-group: 3;
- -ms-flex-order: 2;
- order: 2;
- }
- .order-xl-3 {
- -webkit-box-ordinal-group: 4;
- -ms-flex-order: 3;
- order: 3;
- }
- .order-xl-4 {
- -webkit-box-ordinal-group: 5;
- -ms-flex-order: 4;
- order: 4;
- }
- .order-xl-5 {
- -webkit-box-ordinal-group: 6;
- -ms-flex-order: 5;
- order: 5;
- }
- .order-xl-6 {
- -webkit-box-ordinal-group: 7;
- -ms-flex-order: 6;
- order: 6;
- }
- .order-xl-7 {
- -webkit-box-ordinal-group: 8;
- -ms-flex-order: 7;
- order: 7;
- }
- .order-xl-8 {
- -webkit-box-ordinal-group: 9;
- -ms-flex-order: 8;
- order: 8;
- }
- .order-xl-9 {
- -webkit-box-ordinal-group: 10;
- -ms-flex-order: 9;
- order: 9;
- }
- .order-xl-10 {
- -webkit-box-ordinal-group: 11;
- -ms-flex-order: 10;
- order: 10;
- }
- .order-xl-11 {
- -webkit-box-ordinal-group: 12;
- -ms-flex-order: 11;
- order: 11;
- }
- .order-xl-12 {
- -webkit-box-ordinal-group: 13;
- -ms-flex-order: 12;
- order: 12;
- }
- .offset-xl-0 {
- margin-left: 0;
- }
- .offset-xl-1 {
- margin-left: 8.33333%;
- }
- .offset-xl-2 {
- margin-left: 16.66667%;
- }
- .offset-xl-3 {
- margin-left: 25%;
- }
- .offset-xl-4 {
- margin-left: 33.33333%;
- }
- .offset-xl-5 {
- margin-left: 41.66667%;
- }
- .offset-xl-6 {
- margin-left: 50%;
- }
- .offset-xl-7 {
- margin-left: 58.33333%;
- }
- .offset-xl-8 {
- margin-left: 66.66667%;
- }
- .offset-xl-9 {
- margin-left: 75%;
- }
- .offset-xl-10 {
- margin-left: 83.33333%;
- }
- .offset-xl-11 {
- margin-left: 91.66667%;
- }
-}
-.table {
- width: 100%;
- margin-bottom: 1rem;
- color: #212529;
-}
-.table th,
-.table td {
- padding: 0.75rem;
- vertical-align: top;
- border-top: 1px solid #dee2e6;
-}
-.table thead th {
- vertical-align: bottom;
- border-bottom: 2px solid #dee2e6;
-}
-.table tbody + tbody {
- border-top: 2px solid #dee2e6;
-}
-.table-sm th,
-.table-sm td {
- padding: 0.3rem;
-}
-.table-bordered {
- border: 1px solid #dee2e6;
-}
-.table-bordered th,
-.table-bordered td {
- border: 1px solid #dee2e6;
-}
-.table-bordered thead th,
-.table-bordered thead td {
- border-bottom-width: 2px;
-}
-.table-borderless th,
-.table-borderless td,
-.table-borderless thead th,
-.table-borderless tbody + tbody {
- border: 0;
-}
-.table-striped tbody tr:nth-of-type(odd) {
- background-color: rgba(0, 0, 0, 0.05);
-}
-.table-hover tbody tr:hover {
- color: #212529;
- background-color: rgba(0, 0, 0, 0.075);
-}
-.table-primary,
-.table-primary > th,
-.table-primary > td {
- background-color: #f6cfc6;
-}
-.table-primary th,
-.table-primary td,
-.table-primary thead th,
-.table-primary tbody + tbody {
- border-color: #efa695;
-}
-.table-hover .table-primary:hover {
- background-color: #f3bcb0;
-}
-.table-hover .table-primary:hover > td,
-.table-hover .table-primary:hover > th {
- background-color: #f3bcb0;
-}
-.table-secondary,
-.table-secondary > th,
-.table-secondary > td {
- background-color: #d6d8db;
-}
-.table-secondary th,
-.table-secondary td,
-.table-secondary thead th,
-.table-secondary tbody + tbody {
- border-color: #b3b7bb;
-}
-.table-hover .table-secondary:hover {
- background-color: #c8cbcf;
-}
-.table-hover .table-secondary:hover > td,
-.table-hover .table-secondary:hover > th {
- background-color: #c8cbcf;
-}
-.table-success,
-.table-success > th,
-.table-success > td {
- background-color: #c3e6cb;
-}
-.table-success th,
-.table-success td,
-.table-success thead th,
-.table-success tbody + tbody {
- border-color: #8fd19e;
-}
-.table-hover .table-success:hover {
- background-color: #b1dfbb;
-}
-.table-hover .table-success:hover > td,
-.table-hover .table-success:hover > th {
- background-color: #b1dfbb;
-}
-.table-info,
-.table-info > th,
-.table-info > td {
- background-color: #bee5eb;
-}
-.table-info th,
-.table-info td,
-.table-info thead th,
-.table-info tbody + tbody {
- border-color: #86cfda;
-}
-.table-hover .table-info:hover {
- background-color: #abdde5;
-}
-.table-hover .table-info:hover > td,
-.table-hover .table-info:hover > th {
- background-color: #abdde5;
-}
-.table-warning,
-.table-warning > th,
-.table-warning > td {
- background-color: #ffeeba;
-}
-.table-warning th,
-.table-warning td,
-.table-warning thead th,
-.table-warning tbody + tbody {
- border-color: #ffdf7e;
-}
-.table-hover .table-warning:hover {
- background-color: #ffe8a1;
-}
-.table-hover .table-warning:hover > td,
-.table-hover .table-warning:hover > th {
- background-color: #ffe8a1;
-}
-.table-danger,
-.table-danger > th,
-.table-danger > td {
- background-color: #f5c6cb;
-}
-.table-danger th,
-.table-danger td,
-.table-danger thead th,
-.table-danger tbody + tbody {
- border-color: #ed969e;
-}
-.table-hover .table-danger:hover {
- background-color: #f1b0b7;
-}
-.table-hover .table-danger:hover > td,
-.table-hover .table-danger:hover > th {
- background-color: #f1b0b7;
-}
-.table-light,
-.table-light > th,
-.table-light > td {
- background-color: #fdfdfe;
-}
-.table-light th,
-.table-light td,
-.table-light thead th,
-.table-light tbody + tbody {
- border-color: #fbfcfc;
-}
-.table-hover .table-light:hover {
- background-color: #ececf6;
-}
-.table-hover .table-light:hover > td,
-.table-hover .table-light:hover > th {
- background-color: #ececf6;
-}
-.table-dark,
-.table-dark > th,
-.table-dark > td {
- background-color: #c6c8ca;
-}
-.table-dark th,
-.table-dark td,
-.table-dark thead th,
-.table-dark tbody + tbody {
- border-color: #95999c;
-}
-.table-hover .table-dark:hover {
- background-color: #b9bbbe;
-}
-.table-hover .table-dark:hover > td,
-.table-hover .table-dark:hover > th {
- background-color: #b9bbbe;
-}
-.table-active,
-.table-active > th,
-.table-active > td {
- background-color: rgba(0, 0, 0, 0.075);
-}
-.table-hover .table-active:hover {
- background-color: rgba(0, 0, 0, 0.075);
-}
-.table-hover .table-active:hover > td,
-.table-hover .table-active:hover > th {
- background-color: rgba(0, 0, 0, 0.075);
-}
-.table .thead-dark th {
- color: #fff;
- background-color: #343a40;
- border-color: #454d55;
-}
-.table .thead-light th {
- color: #495057;
- background-color: #e9ecef;
- border-color: #dee2e6;
-}
-.table-dark {
- color: #fff;
- background-color: #343a40;
-}
-.table-dark th,
-.table-dark td,
-.table-dark thead th {
- border-color: #454d55;
-}
-.table-dark.table-bordered {
- border: 0;
-}
-.table-dark.table-striped tbody tr:nth-of-type(odd) {
- background-color: rgba(255, 255, 255, 0.05);
-}
-.table-dark.table-hover tbody tr:hover {
- color: #fff;
- background-color: rgba(255, 255, 255, 0.075);
-}
-@media (max-width: 575.98px) {
- .table-responsive-sm {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-sm > .table-bordered {
- border: 0;
- }
-}
-@media (max-width: 767.98px) {
- .table-responsive-md {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-md > .table-bordered {
- border: 0;
- }
-}
-@media (max-width: 991.98px) {
- .table-responsive-lg {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-lg > .table-bordered {
- border: 0;
- }
-}
-@media (max-width: 1199.98px) {
- .table-responsive-xl {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
- }
- .table-responsive-xl > .table-bordered {
- border: 0;
- }
-}
-.table-responsive {
- display: block;
- width: 100%;
- overflow-x: auto;
- -webkit-overflow-scrolling: touch;
-}
-.table-responsive > .table-bordered {
- border: 0;
-}
-.form-control {
- display: block;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- padding: 0.375rem 0.75rem;
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid #ced4da;
- border-radius: 0;
- -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
- transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .form-control {
- -webkit-transition: none;
- transition: none;
- }
-}
-.form-control::-ms-expand {
- background-color: transparent;
- border: 0;
-}
-.form-control:focus {
- color: #495057;
- background-color: #fff;
- border-color: #f1b1a2;
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.form-control::-webkit-input-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-.form-control:-ms-input-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-.form-control::-ms-input-placeholder {
- color: #6c757d;
- opacity: 1;
-}
-.form-control::placeholder {
- color: #6c757d;
- opacity: 1;
-}
-.form-control:disabled,
-.form-control[readonly] {
- background-color: #e9ecef;
- opacity: 1;
-}
-select.form-control:focus::-ms-value {
- color: #495057;
- background-color: #fff;
-}
-.form-control-file,
-.form-control-range {
- display: block;
- width: 100%;
-}
-.col-form-label {
- padding-top: calc(0.375rem + 1px);
- padding-bottom: calc(0.375rem + 1px);
- margin-bottom: 0;
- font-size: inherit;
- line-height: 1.5;
-}
-.col-form-label-lg {
- padding-top: calc(0.5rem + 1px);
- padding-bottom: calc(0.5rem + 1px);
- font-size: 1.25rem;
- line-height: 1.5;
-}
-.col-form-label-sm {
- padding-top: calc(0.25rem + 1px);
- padding-bottom: calc(0.25rem + 1px);
- font-size: 0.875rem;
- line-height: 1.5;
-}
-.form-control-plaintext {
- display: block;
- width: 100%;
- padding-top: 0.375rem;
- padding-bottom: 0.375rem;
- margin-bottom: 0;
- line-height: 1.5;
- color: #212529;
- background-color: transparent;
- border: solid transparent;
- border-width: 1px 0;
-}
-.form-control-plaintext.form-control-sm,
-.form-control-plaintext.form-control-lg {
- padding-right: 0;
- padding-left: 0;
-}
-.form-control-sm {
- height: calc(1.5em + 0.5rem + 2px);
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
- border-radius: 0;
-}
-.form-control-lg {
- height: calc(1.5em + 1rem + 2px);
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- line-height: 1.5;
- border-radius: 0;
-}
-select.form-control[size],
-select.form-control[multiple] {
- height: auto;
-}
-textarea.form-control {
- height: auto;
-}
-.form-group {
- margin-bottom: 1rem;
-}
-.form-text {
- display: block;
- margin-top: 0.25rem;
-}
-.form-row {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- margin-right: -5px;
- margin-left: -5px;
-}
-.form-row > .col,
-.form-row > [class*='col-'] {
- padding-right: 5px;
- padding-left: 5px;
-}
-.form-check {
- position: relative;
- display: block;
- padding-left: 1.25rem;
-}
-.form-check-input {
- position: absolute;
- margin-top: 0.3rem;
- margin-left: -1.25rem;
-}
-.form-check-input:disabled ~ .form-check-label {
- color: #6c757d;
-}
-.form-check-label {
- margin-bottom: 0;
-}
-.form-check-inline {
- display: -webkit-inline-box;
- display: -ms-inline-flexbox;
- display: inline-flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- padding-left: 0;
- margin-right: 0.75rem;
-}
-.form-check-inline .form-check-input {
- position: static;
- margin-top: 0;
- margin-right: 0.3125rem;
- margin-left: 0;
-}
-.valid-feedback {
- display: none;
- width: 100%;
- margin-top: 0.25rem;
- font-size: 80%;
- color: #28a745;
-}
-.valid-tooltip {
- position: absolute;
- top: 100%;
- z-index: 5;
- display: none;
- max-width: 100%;
- padding: 0.25rem 0.5rem;
- margin-top: 0.1rem;
- font-size: 0.875rem;
- line-height: 1.5;
- color: #fff;
- background-color: rgba(40, 167, 69, 0.9);
- border-radius: 0;
-}
-.was-validated .form-control:valid,
-.form-control.is-valid {
- border-color: #28a745;
- padding-right: calc(1.5em + 0.75rem);
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");
- background-repeat: no-repeat;
- background-position: center right calc(0.375em + 0.1875rem);
- background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
-}
-.was-validated .form-control:valid:focus,
-.form-control.is-valid:focus {
- border-color: #28a745;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
-}
-.was-validated .form-control:valid ~ .valid-feedback,
-.was-validated .form-control:valid ~ .valid-tooltip,
-.form-control.is-valid ~ .valid-feedback,
-.form-control.is-valid ~ .valid-tooltip {
- display: block;
-}
-.was-validated textarea.form-control:valid,
-textarea.form-control.is-valid {
- padding-right: calc(1.5em + 0.75rem);
- background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
-}
-.was-validated .custom-select:valid,
-.custom-select.is-valid {
- border-color: #28a745;
- padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")
- no-repeat right 0.75rem center/8px 10px,
- url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2328a745' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e")
- #fff no-repeat center right 1.75rem / calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
-}
-.was-validated .custom-select:valid:focus,
-.custom-select.is-valid:focus {
- border-color: #28a745;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
-}
-.was-validated .custom-select:valid ~ .valid-feedback,
-.was-validated .custom-select:valid ~ .valid-tooltip,
-.custom-select.is-valid ~ .valid-feedback,
-.custom-select.is-valid ~ .valid-tooltip {
- display: block;
-}
-.was-validated .form-control-file:valid ~ .valid-feedback,
-.was-validated .form-control-file:valid ~ .valid-tooltip,
-.form-control-file.is-valid ~ .valid-feedback,
-.form-control-file.is-valid ~ .valid-tooltip {
- display: block;
-}
-.was-validated .form-check-input:valid ~ .form-check-label,
-.form-check-input.is-valid ~ .form-check-label {
- color: #28a745;
-}
-.was-validated .form-check-input:valid ~ .valid-feedback,
-.was-validated .form-check-input:valid ~ .valid-tooltip,
-.form-check-input.is-valid ~ .valid-feedback,
-.form-check-input.is-valid ~ .valid-tooltip {
- display: block;
-}
-.was-validated .custom-control-input:valid ~ .custom-control-label,
-.custom-control-input.is-valid ~ .custom-control-label {
- color: #28a745;
-}
-.was-validated .custom-control-input:valid ~ .custom-control-label::before,
-.custom-control-input.is-valid ~ .custom-control-label::before {
- border-color: #28a745;
-}
-.was-validated .custom-control-input:valid ~ .valid-feedback,
-.was-validated .custom-control-input:valid ~ .valid-tooltip,
-.custom-control-input.is-valid ~ .valid-feedback,
-.custom-control-input.is-valid ~ .valid-tooltip {
- display: block;
-}
-.was-validated .custom-control-input:valid:checked ~ .custom-control-label::before,
-.custom-control-input.is-valid:checked ~ .custom-control-label::before {
- border-color: #34ce57;
- background-color: #34ce57;
-}
-.was-validated .custom-control-input:valid:focus ~ .custom-control-label::before,
-.custom-control-input.is-valid:focus ~ .custom-control-label::before {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
-}
-.was-validated .custom-control-input:valid:focus:not(:checked) ~ .custom-control-label::before,
-.custom-control-input.is-valid:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #28a745;
-}
-.was-validated .custom-file-input:valid ~ .custom-file-label,
-.custom-file-input.is-valid ~ .custom-file-label {
- border-color: #28a745;
-}
-.was-validated .custom-file-input:valid ~ .valid-feedback,
-.was-validated .custom-file-input:valid ~ .valid-tooltip,
-.custom-file-input.is-valid ~ .valid-feedback,
-.custom-file-input.is-valid ~ .valid-tooltip {
- display: block;
-}
-.was-validated .custom-file-input:valid:focus ~ .custom-file-label,
-.custom-file-input.is-valid:focus ~ .custom-file-label {
- border-color: #28a745;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.25);
-}
-.invalid-feedback {
- display: none;
- width: 100%;
- margin-top: 0.25rem;
- font-size: 80%;
- color: #dc3545;
-}
-.invalid-tooltip {
- position: absolute;
- top: 100%;
- z-index: 5;
- display: none;
- max-width: 100%;
- padding: 0.25rem 0.5rem;
- margin-top: 0.1rem;
- font-size: 0.875rem;
- line-height: 1.5;
- color: #fff;
- background-color: rgba(220, 53, 69, 0.9);
- border-radius: 0;
-}
-.was-validated .form-control:invalid,
-.form-control.is-invalid {
- border-color: #dc3545;
- padding-right: calc(1.5em + 0.75rem);
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E");
- background-repeat: no-repeat;
- background-position: center right calc(0.375em + 0.1875rem);
- background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
-}
-.was-validated .form-control:invalid:focus,
-.form-control.is-invalid:focus {
- border-color: #dc3545;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
-}
-.was-validated .form-control:invalid ~ .invalid-feedback,
-.was-validated .form-control:invalid ~ .invalid-tooltip,
-.form-control.is-invalid ~ .invalid-feedback,
-.form-control.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-.was-validated textarea.form-control:invalid,
-textarea.form-control.is-invalid {
- padding-right: calc(1.5em + 0.75rem);
- background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);
-}
-.was-validated .custom-select:invalid,
-.custom-select.is-invalid {
- border-color: #dc3545;
- padding-right: calc((1em + 0.75rem) * 3 / 4 + 1.75rem);
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")
- no-repeat right 0.75rem center/8px 10px,
- url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc3545' viewBox='-2 -2 7 7'%3e%3cpath stroke='%23dc3545' d='M0 0l3 3m0-3L0 3'/%3e%3ccircle r='.5'/%3e%3ccircle cx='3' r='.5'/%3e%3ccircle cy='3' r='.5'/%3e%3ccircle cx='3' cy='3' r='.5'/%3e%3c/svg%3E")
- #fff no-repeat center right 1.75rem / calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);
-}
-.was-validated .custom-select:invalid:focus,
-.custom-select.is-invalid:focus {
- border-color: #dc3545;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
-}
-.was-validated .custom-select:invalid ~ .invalid-feedback,
-.was-validated .custom-select:invalid ~ .invalid-tooltip,
-.custom-select.is-invalid ~ .invalid-feedback,
-.custom-select.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-.was-validated .form-control-file:invalid ~ .invalid-feedback,
-.was-validated .form-control-file:invalid ~ .invalid-tooltip,
-.form-control-file.is-invalid ~ .invalid-feedback,
-.form-control-file.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-.was-validated .form-check-input:invalid ~ .form-check-label,
-.form-check-input.is-invalid ~ .form-check-label {
- color: #dc3545;
-}
-.was-validated .form-check-input:invalid ~ .invalid-feedback,
-.was-validated .form-check-input:invalid ~ .invalid-tooltip,
-.form-check-input.is-invalid ~ .invalid-feedback,
-.form-check-input.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-.was-validated .custom-control-input:invalid ~ .custom-control-label,
-.custom-control-input.is-invalid ~ .custom-control-label {
- color: #dc3545;
-}
-.was-validated .custom-control-input:invalid ~ .custom-control-label::before,
-.custom-control-input.is-invalid ~ .custom-control-label::before {
- border-color: #dc3545;
-}
-.was-validated .custom-control-input:invalid ~ .invalid-feedback,
-.was-validated .custom-control-input:invalid ~ .invalid-tooltip,
-.custom-control-input.is-invalid ~ .invalid-feedback,
-.custom-control-input.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-.was-validated .custom-control-input:invalid:checked ~ .custom-control-label::before,
-.custom-control-input.is-invalid:checked ~ .custom-control-label::before {
- border-color: #e4606d;
- background-color: #e4606d;
-}
-.was-validated .custom-control-input:invalid:focus ~ .custom-control-label::before,
-.custom-control-input.is-invalid:focus ~ .custom-control-label::before {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
-}
-.was-validated .custom-control-input:invalid:focus:not(:checked) ~ .custom-control-label::before,
-.custom-control-input.is-invalid:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #dc3545;
-}
-.was-validated .custom-file-input:invalid ~ .custom-file-label,
-.custom-file-input.is-invalid ~ .custom-file-label {
- border-color: #dc3545;
-}
-.was-validated .custom-file-input:invalid ~ .invalid-feedback,
-.was-validated .custom-file-input:invalid ~ .invalid-tooltip,
-.custom-file-input.is-invalid ~ .invalid-feedback,
-.custom-file-input.is-invalid ~ .invalid-tooltip {
- display: block;
-}
-.was-validated .custom-file-input:invalid:focus ~ .custom-file-label,
-.custom-file-input.is-invalid:focus ~ .custom-file-label {
- border-color: #dc3545;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.25);
-}
-.form-inline {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-.form-inline .form-check {
- width: 100%;
-}
-@media (min-width: 576px) {
- .form-inline label {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- margin-bottom: 0;
- }
- .form-inline .form-group {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-flex: 0;
- -ms-flex: 0 0 auto;
- flex: 0 0 auto;
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- margin-bottom: 0;
- }
- .form-inline .form-control {
- display: inline-block;
- width: auto;
- vertical-align: middle;
- }
- .form-inline .form-control-plaintext {
- display: inline-block;
- }
- .form-inline .input-group,
- .form-inline .custom-select {
- width: auto;
- }
- .form-inline .form-check {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- width: auto;
- padding-left: 0;
- }
- .form-inline .form-check-input {
- position: relative;
- -ms-flex-negative: 0;
- flex-shrink: 0;
- margin-top: 0;
- margin-right: 0.25rem;
- margin-left: 0;
- }
- .form-inline .custom-control {
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- }
- .form-inline .custom-control-label {
- margin-bottom: 0;
- }
-}
-.btn {
- display: inline-block;
- font-weight: 400;
- color: #212529;
- text-align: center;
- vertical-align: middle;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
- user-select: none;
- background-color: transparent;
- border: 1px solid transparent;
- padding: 0.375rem 0.75rem;
- font-size: 1rem;
- line-height: 1.5;
- border-radius: 0;
- -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- box-shadow 0.15s ease-in-out;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .btn {
- -webkit-transition: none;
- transition: none;
- }
-}
-.btn:hover {
- color: #212529;
- text-decoration: none;
-}
-.btn:focus,
-.btn.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.btn.disabled,
-.btn:disabled {
- opacity: 0.65;
-}
-a.btn.disabled,
-fieldset:disabled a.btn {
- pointer-events: none;
-}
-.btn-primary {
- color: #fff;
- background-color: #e05433;
- border-color: #e05433;
-}
-.btn-primary:hover {
- color: #fff;
- background-color: #ce401f;
- border-color: #c23d1e;
-}
-.btn-primary:focus,
-.btn-primary.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(229, 110, 82, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(229, 110, 82, 0.5);
-}
-.btn-primary.disabled,
-.btn-primary:disabled {
- color: #fff;
- background-color: #e05433;
- border-color: #e05433;
-}
-.btn-primary:not(:disabled):not(.disabled):active,
-.btn-primary:not(:disabled):not(.disabled).active,
-.show > .btn-primary.dropdown-toggle {
- color: #fff;
- background-color: #c23d1e;
- border-color: #b73a1c;
-}
-.btn-primary:not(:disabled):not(.disabled):active:focus,
-.btn-primary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-primary.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(229, 110, 82, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(229, 110, 82, 0.5);
-}
-.btn-secondary {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-.btn-secondary:hover {
- color: #fff;
- background-color: #5a6268;
- border-color: #545b62;
-}
-.btn-secondary:focus,
-.btn-secondary.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
-}
-.btn-secondary.disabled,
-.btn-secondary:disabled {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-.btn-secondary:not(:disabled):not(.disabled):active,
-.btn-secondary:not(:disabled):not(.disabled).active,
-.show > .btn-secondary.dropdown-toggle {
- color: #fff;
- background-color: #545b62;
- border-color: #4e555b;
-}
-.btn-secondary:not(:disabled):not(.disabled):active:focus,
-.btn-secondary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-secondary.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(130, 138, 145, 0.5);
-}
-.btn-success {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
-}
-.btn-success:hover {
- color: #fff;
- background-color: #218838;
- border-color: #1e7e34;
-}
-.btn-success:focus,
-.btn-success.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
-}
-.btn-success.disabled,
-.btn-success:disabled {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
-}
-.btn-success:not(:disabled):not(.disabled):active,
-.btn-success:not(:disabled):not(.disabled).active,
-.show > .btn-success.dropdown-toggle {
- color: #fff;
- background-color: #1e7e34;
- border-color: #1c7430;
-}
-.btn-success:not(:disabled):not(.disabled):active:focus,
-.btn-success:not(:disabled):not(.disabled).active:focus,
-.show > .btn-success.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(72, 180, 97, 0.5);
-}
-.btn-info {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-info:hover {
- color: #fff;
- background-color: #138496;
- border-color: #117a8b;
-}
-.btn-info:focus,
-.btn-info.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
-}
-.btn-info.disabled,
-.btn-info:disabled {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-info:not(:disabled):not(.disabled):active,
-.btn-info:not(:disabled):not(.disabled).active,
-.show > .btn-info.dropdown-toggle {
- color: #fff;
- background-color: #117a8b;
- border-color: #10707f;
-}
-.btn-info:not(:disabled):not(.disabled):active:focus,
-.btn-info:not(:disabled):not(.disabled).active:focus,
-.show > .btn-info.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(58, 176, 195, 0.5);
-}
-.btn-warning {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-.btn-warning:hover {
- color: #212529;
- background-color: #e0a800;
- border-color: #d39e00;
-}
-.btn-warning:focus,
-.btn-warning.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
-}
-.btn-warning.disabled,
-.btn-warning:disabled {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-.btn-warning:not(:disabled):not(.disabled):active,
-.btn-warning:not(:disabled):not(.disabled).active,
-.show > .btn-warning.dropdown-toggle {
- color: #212529;
- background-color: #d39e00;
- border-color: #c69500;
-}
-.btn-warning:not(:disabled):not(.disabled):active:focus,
-.btn-warning:not(:disabled):not(.disabled).active:focus,
-.show > .btn-warning.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(222, 170, 12, 0.5);
-}
-.btn-danger {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
-}
-.btn-danger:hover {
- color: #fff;
- background-color: #c82333;
- border-color: #bd2130;
-}
-.btn-danger:focus,
-.btn-danger.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
-}
-.btn-danger.disabled,
-.btn-danger:disabled {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
-}
-.btn-danger:not(:disabled):not(.disabled):active,
-.btn-danger:not(:disabled):not(.disabled).active,
-.show > .btn-danger.dropdown-toggle {
- color: #fff;
- background-color: #bd2130;
- border-color: #b21f2d;
-}
-.btn-danger:not(:disabled):not(.disabled):active:focus,
-.btn-danger:not(:disabled):not(.disabled).active:focus,
-.show > .btn-danger.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(225, 83, 97, 0.5);
-}
-.btn-light {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-light:hover {
- color: #212529;
- background-color: #e2e6ea;
- border-color: #dae0e5;
-}
-.btn-light:focus,
-.btn-light.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
-}
-.btn-light.disabled,
-.btn-light:disabled {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-light:not(:disabled):not(.disabled):active,
-.btn-light:not(:disabled):not(.disabled).active,
-.show > .btn-light.dropdown-toggle {
- color: #212529;
- background-color: #dae0e5;
- border-color: #d3d9df;
-}
-.btn-light:not(:disabled):not(.disabled):active:focus,
-.btn-light:not(:disabled):not(.disabled).active:focus,
-.show > .btn-light.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(216, 217, 219, 0.5);
-}
-.btn-dark {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
-}
-.btn-dark:hover {
- color: #fff;
- background-color: #23272b;
- border-color: #1d2124;
-}
-.btn-dark:focus,
-.btn-dark.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
-}
-.btn-dark.disabled,
-.btn-dark:disabled {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
-}
-.btn-dark:not(:disabled):not(.disabled):active,
-.btn-dark:not(:disabled):not(.disabled).active,
-.show > .btn-dark.dropdown-toggle {
- color: #fff;
- background-color: #1d2124;
- border-color: #171a1d;
-}
-.btn-dark:not(:disabled):not(.disabled):active:focus,
-.btn-dark:not(:disabled):not(.disabled).active:focus,
-.show > .btn-dark.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(82, 88, 93, 0.5);
-}
-.btn-outline-primary {
- color: #e05433;
- border-color: #e05433;
-}
-.btn-outline-primary:hover {
- color: #fff;
- background-color: #e05433;
- border-color: #e05433;
-}
-.btn-outline-primary:focus,
-.btn-outline-primary.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5);
-}
-.btn-outline-primary.disabled,
-.btn-outline-primary:disabled {
- color: #e05433;
- background-color: transparent;
-}
-.btn-outline-primary:not(:disabled):not(.disabled):active,
-.btn-outline-primary:not(:disabled):not(.disabled).active,
-.show > .btn-outline-primary.dropdown-toggle {
- color: #fff;
- background-color: #e05433;
- border-color: #e05433;
-}
-.btn-outline-primary:not(:disabled):not(.disabled):active:focus,
-.btn-outline-primary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-primary.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5);
-}
-.btn-outline-secondary {
- color: #6c757d;
- border-color: #6c757d;
-}
-.btn-outline-secondary:hover {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-.btn-outline-secondary:focus,
-.btn-outline-secondary.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-.btn-outline-secondary.disabled,
-.btn-outline-secondary:disabled {
- color: #6c757d;
- background-color: transparent;
-}
-.btn-outline-secondary:not(:disabled):not(.disabled):active,
-.btn-outline-secondary:not(:disabled):not(.disabled).active,
-.show > .btn-outline-secondary.dropdown-toggle {
- color: #fff;
- background-color: #6c757d;
- border-color: #6c757d;
-}
-.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,
-.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-secondary.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-.btn-outline-success {
- color: #28a745;
- border-color: #28a745;
-}
-.btn-outline-success:hover {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
-}
-.btn-outline-success:focus,
-.btn-outline-success.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
-}
-.btn-outline-success.disabled,
-.btn-outline-success:disabled {
- color: #28a745;
- background-color: transparent;
-}
-.btn-outline-success:not(:disabled):not(.disabled):active,
-.btn-outline-success:not(:disabled):not(.disabled).active,
-.show > .btn-outline-success.dropdown-toggle {
- color: #fff;
- background-color: #28a745;
- border-color: #28a745;
-}
-.btn-outline-success:not(:disabled):not(.disabled):active:focus,
-.btn-outline-success:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-success.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
-}
-.btn-outline-info {
- color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-outline-info:hover {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-outline-info:focus,
-.btn-outline-info.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
-}
-.btn-outline-info.disabled,
-.btn-outline-info:disabled {
- color: #17a2b8;
- background-color: transparent;
-}
-.btn-outline-info:not(:disabled):not(.disabled):active,
-.btn-outline-info:not(:disabled):not(.disabled).active,
-.show > .btn-outline-info.dropdown-toggle {
- color: #fff;
- background-color: #17a2b8;
- border-color: #17a2b8;
-}
-.btn-outline-info:not(:disabled):not(.disabled):active:focus,
-.btn-outline-info:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-info.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
-}
-.btn-outline-warning {
- color: #ffc107;
- border-color: #ffc107;
-}
-.btn-outline-warning:hover {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-.btn-outline-warning:focus,
-.btn-outline-warning.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-.btn-outline-warning.disabled,
-.btn-outline-warning:disabled {
- color: #ffc107;
- background-color: transparent;
-}
-.btn-outline-warning:not(:disabled):not(.disabled):active,
-.btn-outline-warning:not(:disabled):not(.disabled).active,
-.show > .btn-outline-warning.dropdown-toggle {
- color: #212529;
- background-color: #ffc107;
- border-color: #ffc107;
-}
-.btn-outline-warning:not(:disabled):not(.disabled):active:focus,
-.btn-outline-warning:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-warning.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-.btn-outline-danger {
- color: #dc3545;
- border-color: #dc3545;
-}
-.btn-outline-danger:hover {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
-}
-.btn-outline-danger:focus,
-.btn-outline-danger.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
-}
-.btn-outline-danger.disabled,
-.btn-outline-danger:disabled {
- color: #dc3545;
- background-color: transparent;
-}
-.btn-outline-danger:not(:disabled):not(.disabled):active,
-.btn-outline-danger:not(:disabled):not(.disabled).active,
-.show > .btn-outline-danger.dropdown-toggle {
- color: #fff;
- background-color: #dc3545;
- border-color: #dc3545;
-}
-.btn-outline-danger:not(:disabled):not(.disabled):active:focus,
-.btn-outline-danger:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-danger.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
-}
-.btn-outline-light {
- color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-outline-light:hover {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-outline-light:focus,
-.btn-outline-light.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
-}
-.btn-outline-light.disabled,
-.btn-outline-light:disabled {
- color: #f8f9fa;
- background-color: transparent;
-}
-.btn-outline-light:not(:disabled):not(.disabled):active,
-.btn-outline-light:not(:disabled):not(.disabled).active,
-.show > .btn-outline-light.dropdown-toggle {
- color: #212529;
- background-color: #f8f9fa;
- border-color: #f8f9fa;
-}
-.btn-outline-light:not(:disabled):not(.disabled):active:focus,
-.btn-outline-light:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-light.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
-}
-.btn-outline-dark {
- color: #343a40;
- border-color: #343a40;
-}
-.btn-outline-dark:hover {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
-}
-.btn-outline-dark:focus,
-.btn-outline-dark.focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
-}
-.btn-outline-dark.disabled,
-.btn-outline-dark:disabled {
- color: #343a40;
- background-color: transparent;
-}
-.btn-outline-dark:not(:disabled):not(.disabled):active,
-.btn-outline-dark:not(:disabled):not(.disabled).active,
-.show > .btn-outline-dark.dropdown-toggle {
- color: #fff;
- background-color: #343a40;
- border-color: #343a40;
-}
-.btn-outline-dark:not(:disabled):not(.disabled):active:focus,
-.btn-outline-dark:not(:disabled):not(.disabled).active:focus,
-.show > .btn-outline-dark.dropdown-toggle:focus {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
-}
-.btn-link {
- font-weight: 400;
- color: #e05433;
- text-decoration: none;
-}
-.btn-link:hover {
- color: #ac361a;
- text-decoration: underline;
-}
-.btn-link:focus,
-.btn-link.focus {
- text-decoration: underline;
- -webkit-box-shadow: none;
- box-shadow: none;
-}
-.btn-link:disabled,
-.btn-link.disabled {
- color: #6c757d;
- pointer-events: none;
-}
-.btn-lg,
-.btn-group-lg > .btn {
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- line-height: 1.5;
- border-radius: 0;
-}
-.btn-sm,
-.btn-group-sm > .btn {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
- border-radius: 0;
-}
-.btn-block {
- display: block;
- width: 100%;
-}
-.btn-block + .btn-block {
- margin-top: 0.5rem;
-}
-input[type='submit'].btn-block,
-input[type='reset'].btn-block,
-input[type='button'].btn-block {
- width: 100%;
-}
-.fade {
- -webkit-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
-}
-@media (prefers-reduced-motion: reduce) {
- .fade {
- -webkit-transition: none;
- transition: none;
- }
-}
-.fade:not(.show) {
- opacity: 0;
-}
-.collapse:not(.show) {
- display: none;
-}
-.collapsing {
- position: relative;
- height: 0;
- overflow: hidden;
- -webkit-transition: height 0.35s ease;
- transition: height 0.35s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .collapsing {
- -webkit-transition: none;
- transition: none;
- }
-}
-.dropup,
-.dropright,
-.dropdown,
-.dropleft {
- position: relative;
-}
-.dropdown-toggle {
- white-space: nowrap;
-}
-.dropdown-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: '';
- border-top: 0.3em solid;
- border-right: 0.3em solid transparent;
- border-bottom: 0;
- border-left: 0.3em solid transparent;
-}
-.dropdown-toggle:empty::after {
- margin-left: 0;
-}
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 10rem;
- padding: 0.5rem 0;
- margin: 0.125rem 0 0;
- font-size: 1rem;
- color: #212529;
- text-align: left;
- list-style: none;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.15);
- border-radius: 0;
-}
-.dropdown-menu-left {
- right: auto;
- left: 0;
-}
-.dropdown-menu-right {
- right: 0;
- left: auto;
-}
-@media (min-width: 576px) {
- .dropdown-menu-sm-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-sm-right {
- right: 0;
- left: auto;
- }
-}
-@media (min-width: 768px) {
- .dropdown-menu-md-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-md-right {
- right: 0;
- left: auto;
- }
-}
-@media (min-width: 992px) {
- .dropdown-menu-lg-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-lg-right {
- right: 0;
- left: auto;
- }
-}
-@media (min-width: 1200px) {
- .dropdown-menu-xl-left {
- right: auto;
- left: 0;
- }
- .dropdown-menu-xl-right {
- right: 0;
- left: auto;
- }
-}
-.dropup .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-top: 0;
- margin-bottom: 0.125rem;
-}
-.dropup .dropdown-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: '';
- border-top: 0;
- border-right: 0.3em solid transparent;
- border-bottom: 0.3em solid;
- border-left: 0.3em solid transparent;
-}
-.dropup .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-.dropright .dropdown-menu {
- top: 0;
- right: auto;
- left: 100%;
- margin-top: 0;
- margin-left: 0.125rem;
-}
-.dropright .dropdown-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: '';
- border-top: 0.3em solid transparent;
- border-right: 0;
- border-bottom: 0.3em solid transparent;
- border-left: 0.3em solid;
-}
-.dropright .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-.dropright .dropdown-toggle::after {
- vertical-align: 0;
-}
-.dropleft .dropdown-menu {
- top: 0;
- right: 100%;
- left: auto;
- margin-top: 0;
- margin-right: 0.125rem;
-}
-.dropleft .dropdown-toggle::after {
- display: inline-block;
- margin-left: 0.255em;
- vertical-align: 0.255em;
- content: '';
-}
-.dropleft .dropdown-toggle::after {
- display: none;
-}
-.dropleft .dropdown-toggle::before {
- display: inline-block;
- margin-right: 0.255em;
- vertical-align: 0.255em;
- content: '';
- border-top: 0.3em solid transparent;
- border-right: 0.3em solid;
- border-bottom: 0.3em solid transparent;
-}
-.dropleft .dropdown-toggle:empty::after {
- margin-left: 0;
-}
-.dropleft .dropdown-toggle::before {
- vertical-align: 0;
-}
-.dropdown-menu[x-placement^='top'],
-.dropdown-menu[x-placement^='right'],
-.dropdown-menu[x-placement^='bottom'],
-.dropdown-menu[x-placement^='left'] {
- right: auto;
- bottom: auto;
-}
-.dropdown-divider {
- height: 0;
- margin: 0.5rem 0;
- overflow: hidden;
- border-top: 1px solid #e9ecef;
-}
-.dropdown-item {
- display: block;
- width: 100%;
- padding: 0.25rem 1.5rem;
- clear: both;
- font-weight: 400;
- color: #212529;
- text-align: inherit;
- white-space: nowrap;
- background-color: transparent;
- border: 0;
-}
-.dropdown-item:hover,
-.dropdown-item:focus {
- color: #16181b;
- text-decoration: none;
- background-color: #f8f9fa;
-}
-.dropdown-item.active,
-.dropdown-item:active {
- color: #fff;
- text-decoration: none;
- background-color: #e05433;
-}
-.dropdown-item.disabled,
-.dropdown-item:disabled {
- color: #6c757d;
- pointer-events: none;
- background-color: transparent;
-}
-.dropdown-menu.show {
- display: block;
-}
-.dropdown-header {
- display: block;
- padding: 0.5rem 1.5rem;
- margin-bottom: 0;
- font-size: 0.875rem;
- color: #6c757d;
- white-space: nowrap;
-}
-.dropdown-item-text {
- display: block;
- padding: 0.25rem 1.5rem;
- color: #212529;
-}
-.btn-group,
-.btn-group-vertical {
- position: relative;
- display: -webkit-inline-box;
- display: -ms-inline-flexbox;
- display: inline-flex;
- vertical-align: middle;
-}
-.btn-group > .btn,
-.btn-group-vertical > .btn {
- position: relative;
- -webkit-box-flex: 1;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
-}
-.btn-group > .btn:hover,
-.btn-group-vertical > .btn:hover {
- z-index: 1;
-}
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active,
-.btn-group-vertical > .btn:focus,
-.btn-group-vertical > .btn:active,
-.btn-group-vertical > .btn.active {
- z-index: 1;
-}
-.btn-toolbar {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
-}
-.btn-toolbar .input-group {
- width: auto;
-}
-.btn-group > .btn:not(:first-child),
-.btn-group > .btn-group:not(:first-child) {
- margin-left: -1px;
-}
-.btn-group > .btn:not(:last-child):not(.dropdown-toggle),
-.btn-group > .btn-group:not(:last-child) > .btn {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.btn-group > .btn:not(:first-child),
-.btn-group > .btn-group:not(:first-child) > .btn {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.dropdown-toggle-split {
- padding-right: 0.5625rem;
- padding-left: 0.5625rem;
-}
-.dropdown-toggle-split::after,
-.dropup .dropdown-toggle-split::after,
-.dropright .dropdown-toggle-split::after {
- margin-left: 0;
-}
-.dropleft .dropdown-toggle-split::before {
- margin-right: 0;
-}
-.btn-sm + .dropdown-toggle-split,
-.btn-group-sm > .btn + .dropdown-toggle-split {
- padding-right: 0.375rem;
- padding-left: 0.375rem;
-}
-.btn-lg + .dropdown-toggle-split,
-.btn-group-lg > .btn + .dropdown-toggle-split {
- padding-right: 0.75rem;
- padding-left: 0.75rem;
-}
-.btn-group-vertical {
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
-}
-.btn-group-vertical > .btn,
-.btn-group-vertical > .btn-group {
- width: 100%;
-}
-.btn-group-vertical > .btn:not(:first-child),
-.btn-group-vertical > .btn-group:not(:first-child) {
- margin-top: -1px;
-}
-.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),
-.btn-group-vertical > .btn-group:not(:last-child) > .btn {
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-.btn-group-vertical > .btn:not(:first-child),
-.btn-group-vertical > .btn-group:not(:first-child) > .btn {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.btn-group-toggle > .btn,
-.btn-group-toggle > .btn-group > .btn {
- margin-bottom: 0;
-}
-.btn-group-toggle > .btn input[type='radio'],
-.btn-group-toggle > .btn input[type='checkbox'],
-.btn-group-toggle > .btn-group > .btn input[type='radio'],
-.btn-group-toggle > .btn-group > .btn input[type='checkbox'] {
- position: absolute;
- clip: rect(0, 0, 0, 0);
- pointer-events: none;
-}
-.input-group {
- position: relative;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-align: stretch;
- -ms-flex-align: stretch;
- align-items: stretch;
- width: 100%;
-}
-.input-group > .form-control,
-.input-group > .form-control-plaintext,
-.input-group > .custom-select,
-.input-group > .custom-file {
- position: relative;
- -webkit-box-flex: 1;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- width: 1%;
- margin-bottom: 0;
-}
-.input-group > .form-control + .form-control,
-.input-group > .form-control + .custom-select,
-.input-group > .form-control + .custom-file,
-.input-group > .form-control-plaintext + .form-control,
-.input-group > .form-control-plaintext + .custom-select,
-.input-group > .form-control-plaintext + .custom-file,
-.input-group > .custom-select + .form-control,
-.input-group > .custom-select + .custom-select,
-.input-group > .custom-select + .custom-file,
-.input-group > .custom-file + .form-control,
-.input-group > .custom-file + .custom-select,
-.input-group > .custom-file + .custom-file {
- margin-left: -1px;
-}
-.input-group > .form-control:focus,
-.input-group > .custom-select:focus,
-.input-group > .custom-file .custom-file-input:focus ~ .custom-file-label {
- z-index: 3;
-}
-.input-group > .custom-file .custom-file-input:focus {
- z-index: 4;
-}
-.input-group > .form-control:not(:last-child),
-.input-group > .custom-select:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.input-group > .form-control:not(:first-child),
-.input-group > .custom-select:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.input-group > .custom-file {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-.input-group > .custom-file:not(:last-child) .custom-file-label,
-.input-group > .custom-file:not(:last-child) .custom-file-label::after {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.input-group > .custom-file:not(:first-child) .custom-file-label {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.input-group-prepend,
-.input-group-append {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
-}
-.input-group-prepend .btn,
-.input-group-append .btn {
- position: relative;
- z-index: 2;
-}
-.input-group-prepend .btn:focus,
-.input-group-append .btn:focus {
- z-index: 3;
-}
-.input-group-prepend .btn + .btn,
-.input-group-prepend .btn + .input-group-text,
-.input-group-prepend .input-group-text + .input-group-text,
-.input-group-prepend .input-group-text + .btn,
-.input-group-append .btn + .btn,
-.input-group-append .btn + .input-group-text,
-.input-group-append .input-group-text + .input-group-text,
-.input-group-append .input-group-text + .btn {
- margin-left: -1px;
-}
-.input-group-prepend {
- margin-right: -1px;
-}
-.input-group-append {
- margin-left: -1px;
-}
-.input-group-text {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- padding: 0.375rem 0.75rem;
- margin-bottom: 0;
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- text-align: center;
- white-space: nowrap;
- background-color: #e9ecef;
- border: 1px solid #ced4da;
- border-radius: 0;
-}
-.input-group-text input[type='radio'],
-.input-group-text input[type='checkbox'] {
- margin-top: 0;
-}
-.input-group-lg > .form-control:not(textarea),
-.input-group-lg > .custom-select {
- height: calc(1.5em + 1rem + 2px);
-}
-.input-group-lg > .form-control,
-.input-group-lg > .custom-select,
-.input-group-lg > .input-group-prepend > .input-group-text,
-.input-group-lg > .input-group-append > .input-group-text,
-.input-group-lg > .input-group-prepend > .btn,
-.input-group-lg > .input-group-append > .btn {
- padding: 0.5rem 1rem;
- font-size: 1.25rem;
- line-height: 1.5;
- border-radius: 0;
-}
-.input-group-sm > .form-control:not(textarea),
-.input-group-sm > .custom-select {
- height: calc(1.5em + 0.5rem + 2px);
-}
-.input-group-sm > .form-control,
-.input-group-sm > .custom-select,
-.input-group-sm > .input-group-prepend > .input-group-text,
-.input-group-sm > .input-group-append > .input-group-text,
-.input-group-sm > .input-group-prepend > .btn,
-.input-group-sm > .input-group-append > .btn {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
- border-radius: 0;
-}
-.input-group-lg > .custom-select,
-.input-group-sm > .custom-select {
- padding-right: 1.75rem;
-}
-.input-group > .input-group-prepend > .btn,
-.input-group > .input-group-prepend > .input-group-text,
-.input-group > .input-group-append:not(:last-child) > .btn,
-.input-group > .input-group-append:not(:last-child) > .input-group-text,
-.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
-.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.input-group > .input-group-append > .btn,
-.input-group > .input-group-append > .input-group-text,
-.input-group > .input-group-prepend:not(:first-child) > .btn,
-.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
-.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
-.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.custom-control {
- position: relative;
- display: block;
- min-height: 1.5rem;
- padding-left: 1.5rem;
-}
-.custom-control-inline {
- display: -webkit-inline-box;
- display: -ms-inline-flexbox;
- display: inline-flex;
- margin-right: 1rem;
-}
-.custom-control-input {
- position: absolute;
- z-index: -1;
- opacity: 0;
-}
-.custom-control-input:checked ~ .custom-control-label::before {
- color: #fff;
- border-color: #e05433;
- background-color: #e05433;
-}
-.custom-control-input:focus ~ .custom-control-label::before {
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.custom-control-input:focus:not(:checked) ~ .custom-control-label::before {
- border-color: #f1b1a2;
-}
-.custom-control-input:not(:disabled):active ~ .custom-control-label::before {
- color: #fff;
- background-color: #f8d6ce;
- border-color: #f8d6ce;
-}
-.custom-control-input:disabled ~ .custom-control-label {
- color: #6c757d;
-}
-.custom-control-input:disabled ~ .custom-control-label::before {
- background-color: #e9ecef;
-}
-.custom-control-label {
- position: relative;
- margin-bottom: 0;
- vertical-align: top;
-}
-.custom-control-label::before {
- position: absolute;
- top: 0.25rem;
- left: -1.5rem;
- display: block;
- width: 1rem;
- height: 1rem;
- pointer-events: none;
- content: '';
- background-color: #fff;
- border: #adb5bd solid 1px;
-}
-.custom-control-label::after {
- position: absolute;
- top: 0.25rem;
- left: -1.5rem;
- display: block;
- width: 1rem;
- height: 1rem;
- content: '';
- background: no-repeat 50% / 50% 50%;
-}
-.custom-checkbox .custom-control-label::before {
- border-radius: 0;
-}
-.custom-checkbox .custom-control-input:checked ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3e%3c/svg%3e");
-}
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::before {
- border-color: #e05433;
- background-color: #e05433;
-}
-.custom-checkbox .custom-control-input:indeterminate ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3e%3cpath stroke='%23fff' d='M0 2h4'/%3e%3c/svg%3e");
-}
-.custom-checkbox .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(224, 84, 51, 0.5);
-}
-.custom-checkbox .custom-control-input:disabled:indeterminate ~ .custom-control-label::before {
- background-color: rgba(224, 84, 51, 0.5);
-}
-.custom-radio .custom-control-label::before {
- border-radius: 50%;
-}
-.custom-radio .custom-control-input:checked ~ .custom-control-label::after {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e");
-}
-.custom-radio .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(224, 84, 51, 0.5);
-}
-.custom-switch {
- padding-left: 2.25rem;
-}
-.custom-switch .custom-control-label::before {
- left: -2.25rem;
- width: 1.75rem;
- pointer-events: all;
- border-radius: 0.5rem;
-}
-.custom-switch .custom-control-label::after {
- top: calc(0.25rem + 2px);
- left: calc(-2.25rem + 2px);
- width: calc(1rem - 4px);
- height: calc(1rem - 4px);
- background-color: #adb5bd;
- border-radius: 0.5rem;
- -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- box-shadow 0.15s ease-in-out;
- transition: transform 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- box-shadow 0.15s ease-in-out, -webkit-transform 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-switch .custom-control-label::after {
- -webkit-transition: none;
- transition: none;
- }
-}
-.custom-switch .custom-control-input:checked ~ .custom-control-label::after {
- background-color: #fff;
- -webkit-transform: translateX(0.75rem);
- transform: translateX(0.75rem);
-}
-.custom-switch .custom-control-input:disabled:checked ~ .custom-control-label::before {
- background-color: rgba(224, 84, 51, 0.5);
-}
-.custom-select {
- display: inline-block;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- padding: 0.375rem 1.75rem 0.375rem 0.75rem;
- font-size: 1rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- vertical-align: middle;
- background: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3e%3cpath fill='%23343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")
- no-repeat right 0.75rem center/8px 10px;
- background-color: #fff;
- border: 1px solid #ced4da;
- border-radius: 0;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
-}
-.custom-select:focus {
- border-color: #f1b1a2;
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.custom-select:focus::-ms-value {
- color: #495057;
- background-color: #fff;
-}
-.custom-select[multiple],
-.custom-select[size]:not([size='1']) {
- height: auto;
- padding-right: 0.75rem;
- background-image: none;
-}
-.custom-select:disabled {
- color: #6c757d;
- background-color: #e9ecef;
-}
-.custom-select::-ms-expand {
- display: none;
-}
-.custom-select-sm {
- height: calc(1.5em + 0.5rem + 2px);
- padding-top: 0.25rem;
- padding-bottom: 0.25rem;
- padding-left: 0.5rem;
- font-size: 0.875rem;
-}
-.custom-select-lg {
- height: calc(1.5em + 1rem + 2px);
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
- padding-left: 1rem;
- font-size: 1.25rem;
-}
-.custom-file {
- position: relative;
- display: inline-block;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- margin-bottom: 0;
-}
-.custom-file-input {
- position: relative;
- z-index: 2;
- width: 100%;
- height: calc(1.5em + 0.75rem + 2px);
- margin: 0;
- opacity: 0;
-}
-.custom-file-input:focus ~ .custom-file-label {
- border-color: #f1b1a2;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.custom-file-input:disabled ~ .custom-file-label {
- background-color: #e9ecef;
-}
-.custom-file-input:lang(en) ~ .custom-file-label::after {
- content: 'Browse';
-}
-.custom-file-input ~ .custom-file-label[data-browse]::after {
- content: attr(data-browse);
-}
-.custom-file-label {
- position: absolute;
- top: 0;
- right: 0;
- left: 0;
- z-index: 1;
- height: calc(1.5em + 0.75rem + 2px);
- padding: 0.375rem 0.75rem;
- font-weight: 400;
- line-height: 1.5;
- color: #495057;
- background-color: #fff;
- border: 1px solid #ced4da;
- border-radius: 0;
-}
-.custom-file-label::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- z-index: 3;
- display: block;
- height: calc(1.5em + 0.75rem);
- padding: 0.375rem 0.75rem;
- line-height: 1.5;
- color: #495057;
- content: 'Browse';
- background-color: #e9ecef;
- border-left: inherit;
- border-radius: 0 0 0 0;
-}
-.custom-range {
- width: 100%;
- height: calc(1rem + 0.4rem);
- padding: 0;
- background-color: transparent;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
-}
-.custom-range:focus {
- outline: none;
-}
-.custom-range:focus::-webkit-slider-thumb {
- -webkit-box-shadow: 0 0 0 1px #f8f9fa, 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
- box-shadow: 0 0 0 1px #f8f9fa, 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.custom-range:focus::-moz-range-thumb {
- box-shadow: 0 0 0 1px #f8f9fa, 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.custom-range:focus::-ms-thumb {
- box-shadow: 0 0 0 1px #f8f9fa, 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.custom-range::-moz-focus-outer {
- border: 0;
-}
-.custom-range::-webkit-slider-thumb {
- width: 1rem;
- height: 1rem;
- margin-top: -0.25rem;
- background-color: #e05433;
- border: 0;
- border-radius: 1rem;
- -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- -webkit-appearance: none;
- appearance: none;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-webkit-slider-thumb {
- -webkit-transition: none;
- transition: none;
- }
-}
-.custom-range::-webkit-slider-thumb:active {
- background-color: #f8d6ce;
-}
-.custom-range::-webkit-slider-runnable-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: #dee2e6;
- border-color: transparent;
- border-radius: 1rem;
-}
-.custom-range::-moz-range-thumb {
- width: 1rem;
- height: 1rem;
- background-color: #e05433;
- border: 0;
- border-radius: 1rem;
- -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- -moz-appearance: none;
- appearance: none;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-moz-range-thumb {
- -webkit-transition: none;
- transition: none;
- }
-}
-.custom-range::-moz-range-thumb:active {
- background-color: #f8d6ce;
-}
-.custom-range::-moz-range-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: #dee2e6;
- border-color: transparent;
- border-radius: 1rem;
-}
-.custom-range::-ms-thumb {
- width: 1rem;
- height: 1rem;
- margin-top: 0;
- margin-right: 0.2rem;
- margin-left: 0.2rem;
- background-color: #e05433;
- border: 0;
- border-radius: 1rem;
- -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- appearance: none;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-range::-ms-thumb {
- -webkit-transition: none;
- transition: none;
- }
-}
-.custom-range::-ms-thumb:active {
- background-color: #f8d6ce;
-}
-.custom-range::-ms-track {
- width: 100%;
- height: 0.5rem;
- color: transparent;
- cursor: pointer;
- background-color: transparent;
- border-color: transparent;
- border-width: 0.5rem;
-}
-.custom-range::-ms-fill-lower {
- background-color: #dee2e6;
- border-radius: 1rem;
-}
-.custom-range::-ms-fill-upper {
- margin-right: 15px;
- background-color: #dee2e6;
- border-radius: 1rem;
-}
-.custom-range:disabled::-webkit-slider-thumb {
- background-color: #adb5bd;
-}
-.custom-range:disabled::-webkit-slider-runnable-track {
- cursor: default;
-}
-.custom-range:disabled::-moz-range-thumb {
- background-color: #adb5bd;
-}
-.custom-range:disabled::-moz-range-track {
- cursor: default;
-}
-.custom-range:disabled::-ms-thumb {
- background-color: #adb5bd;
-}
-.custom-control-label::before,
-.custom-file-label,
-.custom-select {
- -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
- transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .custom-control-label::before,
- .custom-file-label,
- .custom-select {
- -webkit-transition: none;
- transition: none;
- }
-}
-.nav {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-}
-.nav-link {
- display: block;
- padding: 0.5rem 1rem;
-}
-.nav-link:hover,
-.nav-link:focus {
- text-decoration: none;
-}
-.nav-link.disabled {
- color: #6c757d;
- pointer-events: none;
- cursor: default;
-}
-.nav-tabs {
- border-bottom: 1px solid #dee2e6;
-}
-.nav-tabs .nav-item {
- margin-bottom: -1px;
-}
-.nav-tabs .nav-link {
- border: 1px solid transparent;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.nav-tabs .nav-link:hover,
-.nav-tabs .nav-link:focus {
- border-color: #e9ecef #e9ecef #dee2e6;
-}
-.nav-tabs .nav-link.disabled {
- color: #6c757d;
- background-color: transparent;
- border-color: transparent;
-}
-.nav-tabs .nav-link.active,
-.nav-tabs .nav-item.show .nav-link {
- color: #495057;
- background-color: #f8f9fa;
- border-color: #dee2e6 #dee2e6 #f8f9fa;
-}
-.nav-tabs .dropdown-menu {
- margin-top: -1px;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.nav-pills .nav-link {
- border-radius: 0;
-}
-.nav-pills .nav-link.active,
-.nav-pills .show > .nav-link {
- color: #fff;
- background-color: #e05433;
-}
-.nav-fill .nav-item {
- -webkit-box-flex: 1;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- text-align: center;
-}
-.nav-justified .nav-item {
- -ms-flex-preferred-size: 0;
- flex-basis: 0;
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- text-align: center;
-}
-.tab-content > .tab-pane {
- display: none;
-}
-.tab-content > .active {
- display: block;
-}
-.navbar {
- position: relative;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between;
- padding: 0.5rem 1rem;
-}
-.navbar > .container,
-.navbar > .container-fluid {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between;
-}
-.navbar-brand {
- display: inline-block;
- padding-top: 0.3125rem;
- padding-bottom: 0.3125rem;
- margin-right: 1rem;
- font-size: 1.25rem;
- line-height: inherit;
- white-space: nowrap;
-}
-.navbar-brand:hover,
-.navbar-brand:focus {
- text-decoration: none;
-}
-.navbar-nav {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- padding-left: 0;
- margin-bottom: 0;
- list-style: none;
-}
-.navbar-nav .nav-link {
- padding-right: 0;
- padding-left: 0;
-}
-.navbar-nav .dropdown-menu {
- position: static;
- float: none;
-}
-.navbar-text {
- display: inline-block;
- padding-top: 0.5rem;
- padding-bottom: 0.5rem;
-}
-.navbar-collapse {
- -ms-flex-preferred-size: 100%;
- flex-basis: 100%;
- -webkit-box-flex: 1;
- -ms-flex-positive: 1;
- flex-grow: 1;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
-}
-.navbar-toggler {
- padding: 0.25rem 0.75rem;
- font-size: 1.25rem;
- line-height: 1;
- background-color: transparent;
- border: 1px solid transparent;
- border-radius: 0;
-}
-.navbar-toggler:hover,
-.navbar-toggler:focus {
- text-decoration: none;
-}
-.navbar-toggler-icon {
- display: inline-block;
- width: 1.5em;
- height: 1.5em;
- vertical-align: middle;
- content: '';
- background: no-repeat center center;
- background-size: 100% 100%;
-}
-@media (max-width: 575.98px) {
- .navbar-expand-sm > .container,
- .navbar-expand-sm > .container-fluid {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 576px) {
- .navbar-expand-sm {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-sm .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-sm .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-sm .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-sm > .container,
- .navbar-expand-sm > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-sm .navbar-collapse {
- display: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-sm .navbar-toggler {
- display: none;
- }
-}
-@media (max-width: 767.98px) {
- .navbar-expand-md > .container,
- .navbar-expand-md > .container-fluid {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 768px) {
- .navbar-expand-md {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-md .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-md .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-md .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-md > .container,
- .navbar-expand-md > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-md .navbar-collapse {
- display: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-md .navbar-toggler {
- display: none;
- }
-}
-@media (max-width: 991.98px) {
- .navbar-expand-lg > .container,
- .navbar-expand-lg > .container-fluid {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 992px) {
- .navbar-expand-lg {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-lg .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-lg .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-lg .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-lg > .container,
- .navbar-expand-lg > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-lg .navbar-collapse {
- display: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-lg .navbar-toggler {
- display: none;
- }
-}
-@media (max-width: 1199.98px) {
- .navbar-expand-xl > .container,
- .navbar-expand-xl > .container-fluid {
- padding-right: 0;
- padding-left: 0;
- }
-}
-@media (min-width: 1200px) {
- .navbar-expand-xl {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
- }
- .navbar-expand-xl .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .navbar-expand-xl .navbar-nav .dropdown-menu {
- position: absolute;
- }
- .navbar-expand-xl .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
- }
- .navbar-expand-xl > .container,
- .navbar-expand-xl > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
- }
- .navbar-expand-xl .navbar-collapse {
- display: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
- }
- .navbar-expand-xl .navbar-toggler {
- display: none;
- }
-}
-.navbar-expand {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row nowrap;
- flex-flow: row nowrap;
- -webkit-box-pack: start;
- -ms-flex-pack: start;
- justify-content: flex-start;
-}
-.navbar-expand > .container,
-.navbar-expand > .container-fluid {
- padding-right: 0;
- padding-left: 0;
-}
-.navbar-expand .navbar-nav {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
-}
-.navbar-expand .navbar-nav .dropdown-menu {
- position: absolute;
-}
-.navbar-expand .navbar-nav .nav-link {
- padding-right: 0.5rem;
- padding-left: 0.5rem;
-}
-.navbar-expand > .container,
-.navbar-expand > .container-fluid {
- -ms-flex-wrap: nowrap;
- flex-wrap: nowrap;
-}
-.navbar-expand .navbar-collapse {
- display: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- -ms-flex-preferred-size: auto;
- flex-basis: auto;
-}
-.navbar-expand .navbar-toggler {
- display: none;
-}
-.navbar-light .navbar-brand {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-light .navbar-brand:hover,
-.navbar-light .navbar-brand:focus {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-light .navbar-nav .nav-link {
- color: rgba(0, 0, 0, 0.5);
-}
-.navbar-light .navbar-nav .nav-link:hover,
-.navbar-light .navbar-nav .nav-link:focus {
- color: rgba(0, 0, 0, 0.7);
-}
-.navbar-light .navbar-nav .nav-link.disabled {
- color: rgba(0, 0, 0, 0.3);
-}
-.navbar-light .navbar-nav .show > .nav-link,
-.navbar-light .navbar-nav .active > .nav-link,
-.navbar-light .navbar-nav .nav-link.show,
-.navbar-light .navbar-nav .nav-link.active {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-light .navbar-toggler {
- color: rgba(0, 0, 0, 0.5);
- border-color: rgba(0, 0, 0, 0.1);
-}
-.navbar-light .navbar-toggler-icon {
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(0,0,0,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
-}
-.navbar-light .navbar-text {
- color: rgba(0, 0, 0, 0.5);
-}
-.navbar-light .navbar-text a {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-light .navbar-text a:hover,
-.navbar-light .navbar-text a:focus {
- color: rgba(0, 0, 0, 0.9);
-}
-.navbar-dark .navbar-brand {
- color: #fff;
-}
-.navbar-dark .navbar-brand:hover,
-.navbar-dark .navbar-brand:focus {
- color: #fff;
-}
-.navbar-dark .navbar-nav .nav-link {
- color: rgba(255, 255, 255, 0.5);
-}
-.navbar-dark .navbar-nav .nav-link:hover,
-.navbar-dark .navbar-nav .nav-link:focus {
- color: rgba(255, 255, 255, 0.75);
-}
-.navbar-dark .navbar-nav .nav-link.disabled {
- color: rgba(255, 255, 255, 0.25);
-}
-.navbar-dark .navbar-nav .show > .nav-link,
-.navbar-dark .navbar-nav .active > .nav-link,
-.navbar-dark .navbar-nav .nav-link.show,
-.navbar-dark .navbar-nav .nav-link.active {
- color: #fff;
-}
-.navbar-dark .navbar-toggler {
- color: rgba(255, 255, 255, 0.5);
- border-color: rgba(255, 255, 255, 0.1);
-}
-.navbar-dark .navbar-toggler-icon {
- background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3e%3cpath stroke='rgba(255,255,255,0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
-}
-.navbar-dark .navbar-text {
- color: rgba(255, 255, 255, 0.5);
-}
-.navbar-dark .navbar-text a {
- color: #fff;
-}
-.navbar-dark .navbar-text a:hover,
-.navbar-dark .navbar-text a:focus {
- color: #fff;
-}
-.card {
- position: relative;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- min-width: 0;
- word-wrap: break-word;
- background-color: #fff;
- background-clip: border-box;
- border: 1px solid rgba(0, 0, 0, 0.125);
- border-radius: 0;
-}
-.card > hr {
- margin-right: 0;
- margin-left: 0;
-}
-.card > .list-group:first-child .list-group-item:first-child {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.card > .list-group:last-child .list-group-item:last-child {
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-.card-body {
- -webkit-box-flex: 1;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- padding: 1.25rem;
-}
-.card-title {
- margin-bottom: 0.75rem;
-}
-.card-subtitle {
- margin-top: -0.375rem;
- margin-bottom: 0;
-}
-.card-text:last-child {
- margin-bottom: 0;
-}
-.card-link:hover {
- text-decoration: none;
-}
-.card-link + .card-link {
- margin-left: 1.25rem;
-}
-.card-header {
- padding: 0.75rem 1.25rem;
- margin-bottom: 0;
- background-color: rgba(0, 0, 0, 0.03);
- border-bottom: 1px solid rgba(0, 0, 0, 0.125);
-}
-.card-header:first-child {
- border-radius: calc(0 - 1px) calc(0 - 1px) 0 0;
-}
-.card-header + .list-group .list-group-item:first-child {
- border-top: 0;
-}
-.card-footer {
- padding: 0.75rem 1.25rem;
- background-color: rgba(0, 0, 0, 0.03);
- border-top: 1px solid rgba(0, 0, 0, 0.125);
-}
-.card-footer:last-child {
- border-radius: 0 0 calc(0 - 1px) calc(0 - 1px);
-}
-.card-header-tabs {
- margin-right: -0.625rem;
- margin-bottom: -0.75rem;
- margin-left: -0.625rem;
- border-bottom: 0;
-}
-.card-header-pills {
- margin-right: -0.625rem;
- margin-left: -0.625rem;
-}
-.card-img-overlay {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 1.25rem;
-}
-.card-img {
- width: 100%;
- border-radius: calc(0 - 1px);
-}
-.card-img-top {
- width: 100%;
- border-top-left-radius: calc(0 - 1px);
- border-top-right-radius: calc(0 - 1px);
-}
-.card-img-bottom {
- width: 100%;
- border-bottom-right-radius: calc(0 - 1px);
- border-bottom-left-radius: calc(0 - 1px);
-}
-.card-deck {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-.card-deck .card {
- margin-bottom: 15px;
-}
-@media (min-width: 576px) {
- .card-deck {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- margin-right: -15px;
- margin-left: -15px;
- }
- .card-deck .card {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-flex: 1;
- -ms-flex: 1 0 0%;
- flex: 1 0 0%;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- margin-right: 15px;
- margin-bottom: 0;
- margin-left: 15px;
- }
-}
-.card-group {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
-}
-.card-group > .card {
- margin-bottom: 15px;
-}
-@media (min-width: 576px) {
- .card-group {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-flow: row wrap;
- flex-flow: row wrap;
- }
- .card-group > .card {
- -webkit-box-flex: 1;
- -ms-flex: 1 0 0%;
- flex: 1 0 0%;
- margin-bottom: 0;
- }
- .card-group > .card + .card {
- margin-left: 0;
- border-left: 0;
- }
- .card-group > .card:not(:last-child) {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- }
- .card-group > .card:not(:last-child) .card-img-top,
- .card-group > .card:not(:last-child) .card-header {
- border-top-right-radius: 0;
- }
- .card-group > .card:not(:last-child) .card-img-bottom,
- .card-group > .card:not(:last-child) .card-footer {
- border-bottom-right-radius: 0;
- }
- .card-group > .card:not(:first-child) {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- }
- .card-group > .card:not(:first-child) .card-img-top,
- .card-group > .card:not(:first-child) .card-header {
- border-top-left-radius: 0;
- }
- .card-group > .card:not(:first-child) .card-img-bottom,
- .card-group > .card:not(:first-child) .card-footer {
- border-bottom-left-radius: 0;
- }
-}
-.card-columns .card {
- margin-bottom: 0.75rem;
-}
-@media (min-width: 576px) {
- .card-columns {
- -webkit-column-count: 3;
- column-count: 3;
- -webkit-column-gap: 1.25rem;
- column-gap: 1.25rem;
- orphans: 1;
- widows: 1;
- }
- .card-columns .card {
- display: inline-block;
- width: 100%;
- }
-}
-.accordion > .card {
- overflow: hidden;
-}
-.accordion > .card:not(:first-of-type) .card-header:first-child {
- border-radius: 0;
-}
-.accordion > .card:not(:first-of-type):not(:last-of-type) {
- border-bottom: 0;
- border-radius: 0;
-}
-.accordion > .card:first-of-type {
- border-bottom: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-.accordion > .card:last-of-type {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.accordion > .card .card-header {
- margin-bottom: -1px;
-}
-.breadcrumb {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -ms-flex-wrap: wrap;
- flex-wrap: wrap;
- padding: 0.75rem 1rem;
- margin-bottom: 1rem;
- list-style: none;
- background-color: #e9ecef;
- border-radius: 0;
-}
-.breadcrumb-item + .breadcrumb-item {
- padding-left: 0.5rem;
-}
-.breadcrumb-item + .breadcrumb-item::before {
- display: inline-block;
- padding-right: 0.5rem;
- color: #6c757d;
- content: '/';
-}
-.breadcrumb-item + .breadcrumb-item:hover::before {
- text-decoration: underline;
-}
-.breadcrumb-item + .breadcrumb-item:hover::before {
- text-decoration: none;
-}
-.breadcrumb-item.active {
- color: #6c757d;
-}
-.pagination {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- padding-left: 0;
- list-style: none;
- border-radius: 0;
-}
-.page-link {
- position: relative;
- display: block;
- padding: 0.5rem 0.75rem;
- margin-left: -1px;
- line-height: 1.25;
- color: #e05433;
- background-color: #fff;
- border: 1px solid #dee2e6;
-}
-.page-link:hover {
- z-index: 2;
- color: #ac361a;
- text-decoration: none;
- background-color: #e9ecef;
- border-color: #dee2e6;
-}
-.page-link:focus {
- z-index: 2;
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.25);
-}
-.page-item:first-child .page-link {
- margin-left: 0;
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.page-item:last-child .page-link {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.page-item.active .page-link {
- z-index: 1;
- color: #fff;
- background-color: #e05433;
- border-color: #e05433;
-}
-.page-item.disabled .page-link {
- color: #6c757d;
- pointer-events: none;
- cursor: auto;
- background-color: #fff;
- border-color: #dee2e6;
-}
-.pagination-lg .page-link {
- padding: 0.75rem 1.5rem;
- font-size: 1.25rem;
- line-height: 1.5;
-}
-.pagination-lg .page-item:first-child .page-link {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.pagination-lg .page-item:last-child .page-link {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.pagination-sm .page-link {
- padding: 0.25rem 0.5rem;
- font-size: 0.875rem;
- line-height: 1.5;
-}
-.pagination-sm .page-item:first-child .page-link {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
-}
-.pagination-sm .page-item:last-child .page-link {
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
-}
-.badge {
- display: inline-block;
- padding: 0.25em 0.4em;
- font-size: 75%;
- font-weight: 700;
- line-height: 1;
- text-align: center;
- white-space: nowrap;
- vertical-align: baseline;
- border-radius: 0;
- -webkit-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- -webkit-box-shadow 0.15s ease-in-out;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- box-shadow 0.15s ease-in-out;
- transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out,
- box-shadow 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .badge {
- -webkit-transition: none;
- transition: none;
- }
-}
-a.badge:hover,
-a.badge:focus {
- text-decoration: none;
-}
-.badge:empty {
- display: none;
-}
-.btn .badge {
- position: relative;
- top: -1px;
-}
-.badge-pill {
- padding-right: 0.6em;
- padding-left: 0.6em;
- border-radius: 10rem;
-}
-.badge-primary {
- color: #fff;
- background-color: #e05433;
-}
-a.badge-primary:hover,
-a.badge-primary:focus {
- color: #fff;
- background-color: #c23d1e;
-}
-a.badge-primary:focus,
-a.badge-primary.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(224, 84, 51, 0.5);
-}
-.badge-secondary {
- color: #fff;
- background-color: #6c757d;
-}
-a.badge-secondary:hover,
-a.badge-secondary:focus {
- color: #fff;
- background-color: #545b62;
-}
-a.badge-secondary:focus,
-a.badge-secondary.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(108, 117, 125, 0.5);
-}
-.badge-success {
- color: #fff;
- background-color: #28a745;
-}
-a.badge-success:hover,
-a.badge-success:focus {
- color: #fff;
- background-color: #1e7e34;
-}
-a.badge-success:focus,
-a.badge-success.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(40, 167, 69, 0.5);
-}
-.badge-info {
- color: #fff;
- background-color: #17a2b8;
-}
-a.badge-info:hover,
-a.badge-info:focus {
- color: #fff;
- background-color: #117a8b;
-}
-a.badge-info:focus,
-a.badge-info.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(23, 162, 184, 0.5);
-}
-.badge-warning {
- color: #212529;
- background-color: #ffc107;
-}
-a.badge-warning:hover,
-a.badge-warning:focus {
- color: #212529;
- background-color: #d39e00;
-}
-a.badge-warning:focus,
-a.badge-warning.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(255, 193, 7, 0.5);
-}
-.badge-danger {
- color: #fff;
- background-color: #dc3545;
-}
-a.badge-danger:hover,
-a.badge-danger:focus {
- color: #fff;
- background-color: #bd2130;
-}
-a.badge-danger:focus,
-a.badge-danger.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(220, 53, 69, 0.5);
-}
-.badge-light {
- color: #212529;
- background-color: #f8f9fa;
-}
-a.badge-light:hover,
-a.badge-light:focus {
- color: #212529;
- background-color: #dae0e5;
-}
-a.badge-light:focus,
-a.badge-light.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(248, 249, 250, 0.5);
-}
-.badge-dark {
- color: #fff;
- background-color: #343a40;
-}
-a.badge-dark:hover,
-a.badge-dark:focus {
- color: #fff;
- background-color: #1d2124;
-}
-a.badge-dark:focus,
-a.badge-dark.focus {
- outline: 0;
- -webkit-box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
- box-shadow: 0 0 0 0.2rem rgba(52, 58, 64, 0.5);
-}
-.jumbotron {
- padding: 2rem 1rem;
- margin-bottom: 2rem;
- background-color: #e9ecef;
- border-radius: 0;
-}
-@media (min-width: 576px) {
- .jumbotron {
- padding: 4rem 2rem;
- }
-}
-.jumbotron-fluid {
- padding-right: 0;
- padding-left: 0;
- border-radius: 0;
-}
-.alert {
- position: relative;
- padding: 0.75rem 1.25rem;
- margin-bottom: 1rem;
- border: 1px solid transparent;
- border-radius: 0;
-}
-.alert-heading {
- color: inherit;
-}
-.alert-link {
- font-weight: 700;
-}
-.alert-dismissible {
- padding-right: 4rem;
-}
-.alert-dismissible .close {
- position: absolute;
- top: 0;
- right: 0;
- padding: 0.75rem 1.25rem;
- color: inherit;
-}
-.alert-primary {
- color: #742c1b;
- background-color: #f9ddd6;
- border-color: #f6cfc6;
-}
-.alert-primary hr {
- border-top-color: #f3bcb0;
-}
-.alert-primary .alert-link {
- color: #4b1c11;
-}
-.alert-secondary {
- color: #383d41;
- background-color: #e2e3e5;
- border-color: #d6d8db;
-}
-.alert-secondary hr {
- border-top-color: #c8cbcf;
-}
-.alert-secondary .alert-link {
- color: #202326;
-}
-.alert-success {
- color: #155724;
- background-color: #d4edda;
- border-color: #c3e6cb;
-}
-.alert-success hr {
- border-top-color: #b1dfbb;
-}
-.alert-success .alert-link {
- color: #0b2e13;
-}
-.alert-info {
- color: #0c5460;
- background-color: #d1ecf1;
- border-color: #bee5eb;
-}
-.alert-info hr {
- border-top-color: #abdde5;
-}
-.alert-info .alert-link {
- color: #062c33;
-}
-.alert-warning {
- color: #856404;
- background-color: #fff3cd;
- border-color: #ffeeba;
-}
-.alert-warning hr {
- border-top-color: #ffe8a1;
-}
-.alert-warning .alert-link {
- color: #533f03;
-}
-.alert-danger {
- color: #721c24;
- background-color: #f8d7da;
- border-color: #f5c6cb;
-}
-.alert-danger hr {
- border-top-color: #f1b0b7;
-}
-.alert-danger .alert-link {
- color: #491217;
-}
-.alert-light {
- color: #818182;
- background-color: #fefefe;
- border-color: #fdfdfe;
-}
-.alert-light hr {
- border-top-color: #ececf6;
-}
-.alert-light .alert-link {
- color: #686868;
-}
-.alert-dark {
- color: #1b1e21;
- background-color: #d6d8d9;
- border-color: #c6c8ca;
-}
-.alert-dark hr {
- border-top-color: #b9bbbe;
-}
-.alert-dark .alert-link {
- color: #040505;
-}
-@-webkit-keyframes progress-bar-stripes {
- from {
- background-position: 1rem 0;
- }
- to {
- background-position: 0 0;
- }
-}
-@keyframes progress-bar-stripes {
- from {
- background-position: 1rem 0;
- }
- to {
- background-position: 0 0;
- }
-}
-.progress {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- height: 1rem;
- overflow: hidden;
- font-size: 0.75rem;
- background-color: #e9ecef;
- border-radius: 0;
-}
-.progress-bar {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- color: #fff;
- text-align: center;
- white-space: nowrap;
- background-color: #e05433;
- -webkit-transition: width 0.6s ease;
- transition: width 0.6s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .progress-bar {
- -webkit-transition: none;
- transition: none;
- }
-}
-.progress-bar-striped {
- background-image: linear-gradient(
- 45deg,
- rgba(255, 255, 255, 0.15) 25%,
- transparent 25%,
- transparent 50%,
- rgba(255, 255, 255, 0.15) 50%,
- rgba(255, 255, 255, 0.15) 75%,
- transparent 75%,
- transparent
- );
- background-size: 1rem 1rem;
-}
-.progress-bar-animated {
- -webkit-animation: progress-bar-stripes 1s linear infinite;
- animation: progress-bar-stripes 1s linear infinite;
-}
-@media (prefers-reduced-motion: reduce) {
- .progress-bar-animated {
- -webkit-animation: none;
- animation: none;
- }
-}
-.media {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start;
-}
-.media-body {
- -webkit-box-flex: 1;
- -ms-flex: 1;
- flex: 1;
-}
-.list-group {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- padding-left: 0;
- margin-bottom: 0;
-}
-.list-group-item-action {
- width: 100%;
- color: #495057;
- text-align: inherit;
-}
-.list-group-item-action:hover,
-.list-group-item-action:focus {
- z-index: 1;
- color: #495057;
- text-decoration: none;
- background-color: #f8f9fa;
-}
-.list-group-item-action:active {
- color: #212529;
- background-color: #e9ecef;
-}
-.list-group-item {
- position: relative;
- display: block;
- padding: 0.75rem 1.25rem;
- margin-bottom: -1px;
- background-color: #fff;
- border: 1px solid rgba(0, 0, 0, 0.125);
-}
-.list-group-item:first-child {
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.list-group-item:last-child {
- margin-bottom: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-.list-group-item.disabled,
-.list-group-item:disabled {
- color: #6c757d;
- pointer-events: none;
- background-color: #fff;
-}
-.list-group-item.active {
- z-index: 2;
- color: #fff;
- background-color: #e05433;
- border-color: #e05433;
-}
-.list-group-horizontal {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
-}
-.list-group-horizontal .list-group-item {
- margin-right: -1px;
- margin-bottom: 0;
-}
-.list-group-horizontal .list-group-item:first-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- border-top-right-radius: 0;
-}
-.list-group-horizontal .list-group-item:last-child {
- margin-right: 0;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-@media (min-width: 576px) {
- .list-group-horizontal-sm {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .list-group-horizontal-sm .list-group-item {
- margin-right: -1px;
- margin-bottom: 0;
- }
- .list-group-horizontal-sm .list-group-item:first-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-sm .list-group-item:last-child {
- margin-right: 0;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
- }
-}
-@media (min-width: 768px) {
- .list-group-horizontal-md {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .list-group-horizontal-md .list-group-item {
- margin-right: -1px;
- margin-bottom: 0;
- }
- .list-group-horizontal-md .list-group-item:first-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-md .list-group-item:last-child {
- margin-right: 0;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
- }
-}
-@media (min-width: 992px) {
- .list-group-horizontal-lg {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .list-group-horizontal-lg .list-group-item {
- margin-right: -1px;
- margin-bottom: 0;
- }
- .list-group-horizontal-lg .list-group-item:first-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-lg .list-group-item:last-child {
- margin-right: 0;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
- }
-}
-@media (min-width: 1200px) {
- .list-group-horizontal-xl {
- -webkit-box-orient: horizontal;
- -webkit-box-direction: normal;
- -ms-flex-direction: row;
- flex-direction: row;
- }
- .list-group-horizontal-xl .list-group-item {
- margin-right: -1px;
- margin-bottom: 0;
- }
- .list-group-horizontal-xl .list-group-item:first-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- border-top-right-radius: 0;
- }
- .list-group-horizontal-xl .list-group-item:last-child {
- margin-right: 0;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
- }
-}
-.list-group-flush .list-group-item {
- border-right: 0;
- border-left: 0;
- border-radius: 0;
-}
-.list-group-flush .list-group-item:last-child {
- margin-bottom: -1px;
-}
-.list-group-flush:first-child .list-group-item:first-child {
- border-top: 0;
-}
-.list-group-flush:last-child .list-group-item:last-child {
- margin-bottom: 0;
- border-bottom: 0;
-}
-.list-group-item-primary {
- color: #742c1b;
- background-color: #f6cfc6;
-}
-.list-group-item-primary.list-group-item-action:hover,
-.list-group-item-primary.list-group-item-action:focus {
- color: #742c1b;
- background-color: #f3bcb0;
-}
-.list-group-item-primary.list-group-item-action.active {
- color: #fff;
- background-color: #742c1b;
- border-color: #742c1b;
-}
-.list-group-item-secondary {
- color: #383d41;
- background-color: #d6d8db;
-}
-.list-group-item-secondary.list-group-item-action:hover,
-.list-group-item-secondary.list-group-item-action:focus {
- color: #383d41;
- background-color: #c8cbcf;
-}
-.list-group-item-secondary.list-group-item-action.active {
- color: #fff;
- background-color: #383d41;
- border-color: #383d41;
-}
-.list-group-item-success {
- color: #155724;
- background-color: #c3e6cb;
-}
-.list-group-item-success.list-group-item-action:hover,
-.list-group-item-success.list-group-item-action:focus {
- color: #155724;
- background-color: #b1dfbb;
-}
-.list-group-item-success.list-group-item-action.active {
- color: #fff;
- background-color: #155724;
- border-color: #155724;
-}
-.list-group-item-info {
- color: #0c5460;
- background-color: #bee5eb;
-}
-.list-group-item-info.list-group-item-action:hover,
-.list-group-item-info.list-group-item-action:focus {
- color: #0c5460;
- background-color: #abdde5;
-}
-.list-group-item-info.list-group-item-action.active {
- color: #fff;
- background-color: #0c5460;
- border-color: #0c5460;
-}
-.list-group-item-warning {
- color: #856404;
- background-color: #ffeeba;
-}
-.list-group-item-warning.list-group-item-action:hover,
-.list-group-item-warning.list-group-item-action:focus {
- color: #856404;
- background-color: #ffe8a1;
-}
-.list-group-item-warning.list-group-item-action.active {
- color: #fff;
- background-color: #856404;
- border-color: #856404;
-}
-.list-group-item-danger {
- color: #721c24;
- background-color: #f5c6cb;
-}
-.list-group-item-danger.list-group-item-action:hover,
-.list-group-item-danger.list-group-item-action:focus {
- color: #721c24;
- background-color: #f1b0b7;
-}
-.list-group-item-danger.list-group-item-action.active {
- color: #fff;
- background-color: #721c24;
- border-color: #721c24;
-}
-.list-group-item-light {
- color: #818182;
- background-color: #fdfdfe;
-}
-.list-group-item-light.list-group-item-action:hover,
-.list-group-item-light.list-group-item-action:focus {
- color: #818182;
- background-color: #ececf6;
-}
-.list-group-item-light.list-group-item-action.active {
- color: #fff;
- background-color: #818182;
- border-color: #818182;
-}
-.list-group-item-dark {
- color: #1b1e21;
- background-color: #c6c8ca;
-}
-.list-group-item-dark.list-group-item-action:hover,
-.list-group-item-dark.list-group-item-action:focus {
- color: #1b1e21;
- background-color: #b9bbbe;
-}
-.list-group-item-dark.list-group-item-action.active {
- color: #fff;
- background-color: #1b1e21;
- border-color: #1b1e21;
-}
-.close {
- float: right;
- font-size: 1.5rem;
- font-weight: 700;
- line-height: 1;
- color: #000;
- text-shadow: 0 1px 0 #fff;
- opacity: 0.5;
-}
-.close:hover {
- color: #000;
- text-decoration: none;
-}
-.close:not(:disabled):not(.disabled):hover,
-.close:not(:disabled):not(.disabled):focus {
- opacity: 0.75;
-}
-button.close {
- padding: 0;
- background-color: transparent;
- border: 0;
- -webkit-appearance: none;
- -moz-appearance: none;
- appearance: none;
-}
-a.close.disabled {
- pointer-events: none;
-}
-.toast {
- max-width: 350px;
- overflow: hidden;
- font-size: 0.875rem;
- background-color: rgba(255, 255, 255, 0.85);
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.1);
- -webkit-box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
- box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.1);
- -webkit-backdrop-filter: blur(10px);
- backdrop-filter: blur(10px);
- opacity: 0;
- border-radius: 0.25rem;
-}
-.toast:not(:last-child) {
- margin-bottom: 0.75rem;
-}
-.toast.showing {
- opacity: 1;
-}
-.toast.show {
- display: block;
- opacity: 1;
-}
-.toast.hide {
- display: none;
-}
-.toast-header {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- padding: 0.25rem 0.75rem;
- color: #6c757d;
- background-color: rgba(255, 255, 255, 0.85);
- background-clip: padding-box;
- border-bottom: 1px solid rgba(0, 0, 0, 0.05);
-}
-.toast-body {
- padding: 0.75rem;
-}
-.modal-open {
- overflow: hidden;
-}
-.modal-open .modal {
- overflow-x: hidden;
- overflow-y: auto;
-}
-.modal {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1050;
- display: none;
- width: 100%;
- height: 100%;
- overflow: hidden;
- outline: 0;
-}
-.modal-dialog {
- position: relative;
- width: auto;
- margin: 0.5rem;
- pointer-events: none;
-}
-.modal.fade .modal-dialog {
- -webkit-transition: -webkit-transform 0.3s ease-out;
- transition: -webkit-transform 0.3s ease-out;
- transition: transform 0.3s ease-out;
- transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out;
- -webkit-transform: translate(0, -50px);
- transform: translate(0, -50px);
-}
-@media (prefers-reduced-motion: reduce) {
- .modal.fade .modal-dialog {
- -webkit-transition: none;
- transition: none;
- }
-}
-.modal.show .modal-dialog {
- -webkit-transform: none;
- transform: none;
-}
-.modal-dialog-scrollable {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- max-height: calc(100% - 1rem);
-}
-.modal-dialog-scrollable .modal-content {
- max-height: calc(100vh - 1rem);
- overflow: hidden;
-}
-.modal-dialog-scrollable .modal-header,
-.modal-dialog-scrollable .modal-footer {
- -ms-flex-negative: 0;
- flex-shrink: 0;
-}
-.modal-dialog-scrollable .modal-body {
- overflow-y: auto;
-}
-.modal-dialog-centered {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- min-height: calc(100% - 1rem);
-}
-.modal-dialog-centered::before {
- display: block;
- height: calc(100vh - 1rem);
- content: '';
-}
-.modal-dialog-centered.modal-dialog-scrollable {
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- height: 100%;
-}
-.modal-dialog-centered.modal-dialog-scrollable .modal-content {
- max-height: none;
-}
-.modal-dialog-centered.modal-dialog-scrollable::before {
- content: none;
-}
-.modal-content {
- position: relative;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-orient: vertical;
- -webkit-box-direction: normal;
- -ms-flex-direction: column;
- flex-direction: column;
- width: 100%;
- pointer-events: auto;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 0;
- outline: 0;
-}
-.modal-backdrop {
- position: fixed;
- top: 0;
- left: 0;
- z-index: 1040;
- width: 100vw;
- height: 100vh;
- background-color: #000;
-}
-.modal-backdrop.fade {
- opacity: 0;
-}
-.modal-backdrop.show {
- opacity: 0.5;
-}
-.modal-header {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: start;
- -ms-flex-align: start;
- align-items: flex-start;
- -webkit-box-pack: justify;
- -ms-flex-pack: justify;
- justify-content: space-between;
- padding: 1rem 1rem;
- border-bottom: 1px solid #dee2e6;
- border-top-left-radius: 0;
- border-top-right-radius: 0;
-}
-.modal-header .close {
- padding: 1rem 1rem;
- margin: -1rem -1rem -1rem auto;
-}
-.modal-title {
- margin-bottom: 0;
- line-height: 1.5;
-}
-.modal-body {
- position: relative;
- -webkit-box-flex: 1;
- -ms-flex: 1 1 auto;
- flex: 1 1 auto;
- padding: 1rem;
-}
-.modal-footer {
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: end;
- -ms-flex-pack: end;
- justify-content: flex-end;
- padding: 1rem;
- border-top: 1px solid #dee2e6;
- border-bottom-right-radius: 0;
- border-bottom-left-radius: 0;
-}
-.modal-footer > :not(:first-child) {
- margin-left: 0.25rem;
-}
-.modal-footer > :not(:last-child) {
- margin-right: 0.25rem;
-}
-.modal-scrollbar-measure {
- position: absolute;
- top: -9999px;
- width: 50px;
- height: 50px;
- overflow: scroll;
-}
-@media (min-width: 576px) {
- .modal-dialog {
- max-width: 500px;
- margin: 1.75rem auto;
- }
- .modal-dialog-scrollable {
- max-height: calc(100% - 3.5rem);
- }
- .modal-dialog-scrollable .modal-content {
- max-height: calc(100vh - 3.5rem);
- }
- .modal-dialog-centered {
- min-height: calc(100% - 3.5rem);
- }
- .modal-dialog-centered::before {
- height: calc(100vh - 3.5rem);
- }
- .modal-sm {
- max-width: 300px;
- }
-}
-@media (min-width: 992px) {
- .modal-lg,
- .modal-xl {
- max-width: 800px;
- }
-}
-@media (min-width: 1200px) {
- .modal-xl {
- max-width: 1140px;
- }
-}
-.tooltip {
- position: absolute;
- z-index: 1070;
- display: block;
- margin: 0;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif,
- 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
- font-style: normal;
- font-weight: 400;
- line-height: 1.5;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- word-spacing: normal;
- white-space: normal;
- line-break: auto;
- font-size: 0.875rem;
- word-wrap: break-word;
- opacity: 0;
-}
-.tooltip.show {
- opacity: 0.9;
-}
-.tooltip .arrow {
- position: absolute;
- display: block;
- width: 0.8rem;
- height: 0.4rem;
-}
-.tooltip .arrow::before {
- position: absolute;
- content: '';
- border-color: transparent;
- border-style: solid;
-}
-.bs-tooltip-top,
-.bs-tooltip-auto[x-placement^='top'] {
- padding: 0.4rem 0;
-}
-.bs-tooltip-top .arrow,
-.bs-tooltip-auto[x-placement^='top'] .arrow {
- bottom: 0;
-}
-.bs-tooltip-top .arrow::before,
-.bs-tooltip-auto[x-placement^='top'] .arrow::before {
- top: 0;
- border-width: 0.4rem 0.4rem 0;
- border-top-color: #000;
-}
-.bs-tooltip-right,
-.bs-tooltip-auto[x-placement^='right'] {
- padding: 0 0.4rem;
-}
-.bs-tooltip-right .arrow,
-.bs-tooltip-auto[x-placement^='right'] .arrow {
- left: 0;
- width: 0.4rem;
- height: 0.8rem;
-}
-.bs-tooltip-right .arrow::before,
-.bs-tooltip-auto[x-placement^='right'] .arrow::before {
- right: 0;
- border-width: 0.4rem 0.4rem 0.4rem 0;
- border-right-color: #000;
-}
-.bs-tooltip-bottom,
-.bs-tooltip-auto[x-placement^='bottom'] {
- padding: 0.4rem 0;
-}
-.bs-tooltip-bottom .arrow,
-.bs-tooltip-auto[x-placement^='bottom'] .arrow {
- top: 0;
-}
-.bs-tooltip-bottom .arrow::before,
-.bs-tooltip-auto[x-placement^='bottom'] .arrow::before {
- bottom: 0;
- border-width: 0 0.4rem 0.4rem;
- border-bottom-color: #000;
-}
-.bs-tooltip-left,
-.bs-tooltip-auto[x-placement^='left'] {
- padding: 0 0.4rem;
-}
-.bs-tooltip-left .arrow,
-.bs-tooltip-auto[x-placement^='left'] .arrow {
- right: 0;
- width: 0.4rem;
- height: 0.8rem;
-}
-.bs-tooltip-left .arrow::before,
-.bs-tooltip-auto[x-placement^='left'] .arrow::before {
- left: 0;
- border-width: 0.4rem 0 0.4rem 0.4rem;
- border-left-color: #000;
-}
-.tooltip-inner {
- max-width: 200px;
- padding: 0.25rem 0.5rem;
- color: #fff;
- text-align: center;
- background-color: #000;
- border-radius: 0;
-}
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1060;
- display: block;
- max-width: 276px;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif,
- 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
- font-style: normal;
- font-weight: 400;
- line-height: 1.5;
- text-align: left;
- text-align: start;
- text-decoration: none;
- text-shadow: none;
- text-transform: none;
- letter-spacing: normal;
- word-break: normal;
- word-spacing: normal;
- white-space: normal;
- line-break: auto;
- font-size: 0.875rem;
- word-wrap: break-word;
- background-color: #fff;
- background-clip: padding-box;
- border: 1px solid rgba(0, 0, 0, 0.2);
- border-radius: 0;
-}
-.popover .arrow {
- position: absolute;
- display: block;
- width: 1rem;
- height: 0.5rem;
- margin: 0 0;
-}
-.popover .arrow::before,
-.popover .arrow::after {
- position: absolute;
- display: block;
- content: '';
- border-color: transparent;
- border-style: solid;
-}
-.bs-popover-top,
-.bs-popover-auto[x-placement^='top'] {
- margin-bottom: 0.5rem;
-}
-.bs-popover-top > .arrow,
-.bs-popover-auto[x-placement^='top'] > .arrow {
- bottom: calc((0.5rem + 1px) * -1);
-}
-.bs-popover-top > .arrow::before,
-.bs-popover-auto[x-placement^='top'] > .arrow::before {
- bottom: 0;
- border-width: 0.5rem 0.5rem 0;
- border-top-color: rgba(0, 0, 0, 0.25);
-}
-.bs-popover-top > .arrow::after,
-.bs-popover-auto[x-placement^='top'] > .arrow::after {
- bottom: 1px;
- border-width: 0.5rem 0.5rem 0;
- border-top-color: #fff;
-}
-.bs-popover-right,
-.bs-popover-auto[x-placement^='right'] {
- margin-left: 0.5rem;
-}
-.bs-popover-right > .arrow,
-.bs-popover-auto[x-placement^='right'] > .arrow {
- left: calc((0.5rem + 1px) * -1);
- width: 0.5rem;
- height: 1rem;
- margin: 0 0;
-}
-.bs-popover-right > .arrow::before,
-.bs-popover-auto[x-placement^='right'] > .arrow::before {
- left: 0;
- border-width: 0.5rem 0.5rem 0.5rem 0;
- border-right-color: rgba(0, 0, 0, 0.25);
-}
-.bs-popover-right > .arrow::after,
-.bs-popover-auto[x-placement^='right'] > .arrow::after {
- left: 1px;
- border-width: 0.5rem 0.5rem 0.5rem 0;
- border-right-color: #fff;
-}
-.bs-popover-bottom,
-.bs-popover-auto[x-placement^='bottom'] {
- margin-top: 0.5rem;
-}
-.bs-popover-bottom > .arrow,
-.bs-popover-auto[x-placement^='bottom'] > .arrow {
- top: calc((0.5rem + 1px) * -1);
-}
-.bs-popover-bottom > .arrow::before,
-.bs-popover-auto[x-placement^='bottom'] > .arrow::before {
- top: 0;
- border-width: 0 0.5rem 0.5rem 0.5rem;
- border-bottom-color: rgba(0, 0, 0, 0.25);
-}
-.bs-popover-bottom > .arrow::after,
-.bs-popover-auto[x-placement^='bottom'] > .arrow::after {
- top: 1px;
- border-width: 0 0.5rem 0.5rem 0.5rem;
- border-bottom-color: #fff;
-}
-.bs-popover-bottom .popover-header::before,
-.bs-popover-auto[x-placement^='bottom'] .popover-header::before {
- position: absolute;
- top: 0;
- left: 50%;
- display: block;
- width: 1rem;
- margin-left: -0.5rem;
- content: '';
- border-bottom: 1px solid #f7f7f7;
-}
-.bs-popover-left,
-.bs-popover-auto[x-placement^='left'] {
- margin-right: 0.5rem;
-}
-.bs-popover-left > .arrow,
-.bs-popover-auto[x-placement^='left'] > .arrow {
- right: calc((0.5rem + 1px) * -1);
- width: 0.5rem;
- height: 1rem;
- margin: 0 0;
-}
-.bs-popover-left > .arrow::before,
-.bs-popover-auto[x-placement^='left'] > .arrow::before {
- right: 0;
- border-width: 0.5rem 0 0.5rem 0.5rem;
- border-left-color: rgba(0, 0, 0, 0.25);
-}
-.bs-popover-left > .arrow::after,
-.bs-popover-auto[x-placement^='left'] > .arrow::after {
- right: 1px;
- border-width: 0.5rem 0 0.5rem 0.5rem;
- border-left-color: #fff;
-}
-.popover-header {
- padding: 0.5rem 0.75rem;
- margin-bottom: 0;
- font-size: 1rem;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
- border-top-left-radius: calc(0 - 1px);
- border-top-right-radius: calc(0 - 1px);
-}
-.popover-header:empty {
- display: none;
-}
-.popover-body {
- padding: 0.5rem 0.75rem;
- color: #212529;
-}
-.carousel {
- position: relative;
-}
-.carousel.pointer-event {
- -ms-touch-action: pan-y;
- touch-action: pan-y;
-}
-.carousel-inner {
- position: relative;
- width: 100%;
- overflow: hidden;
-}
-.carousel-inner::after {
- display: block;
- clear: both;
- content: '';
-}
-.carousel-item {
- position: relative;
- display: none;
- float: left;
- width: 100%;
- margin-right: -100%;
- -webkit-backface-visibility: hidden;
- backface-visibility: hidden;
- -webkit-transition: -webkit-transform 0.6s ease-in-out;
- transition: -webkit-transform 0.6s ease-in-out;
- transition: transform 0.6s ease-in-out;
- transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
-}
-@media (prefers-reduced-motion: reduce) {
- .carousel-item {
- -webkit-transition: none;
- transition: none;
- }
-}
-.carousel-item.active,
-.carousel-item-next,
-.carousel-item-prev {
- display: block;
-}
-.carousel-item-next:not(.carousel-item-left),
-.active.carousel-item-right {
- -webkit-transform: translateX(100%);
- transform: translateX(100%);
-}
-.carousel-item-prev:not(.carousel-item-right),
-.active.carousel-item-left {
- -webkit-transform: translateX(-100%);
- transform: translateX(-100%);
-}
-.carousel-fade .carousel-item {
- opacity: 0;
- -webkit-transition-property: opacity;
- transition-property: opacity;
- -webkit-transform: none;
- transform: none;
-}
-.carousel-fade .carousel-item.active,
-.carousel-fade .carousel-item-next.carousel-item-left,
-.carousel-fade .carousel-item-prev.carousel-item-right {
- z-index: 1;
- opacity: 1;
-}
-.carousel-fade .active.carousel-item-left,
-.carousel-fade .active.carousel-item-right {
- z-index: 0;
- opacity: 0;
- -webkit-transition: 0s 0.6s opacity;
- transition: 0s 0.6s opacity;
-}
-@media (prefers-reduced-motion: reduce) {
- .carousel-fade .active.carousel-item-left,
- .carousel-fade .active.carousel-item-right {
- -webkit-transition: none;
- transition: none;
- }
-}
-.carousel-control-prev,
-.carousel-control-next {
- position: absolute;
- top: 0;
- bottom: 0;
- z-index: 1;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-align: center;
- -ms-flex-align: center;
- align-items: center;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- width: 15%;
- color: #fff;
- text-align: center;
- opacity: 0.5;
- -webkit-transition: opacity 0.15s ease;
- transition: opacity 0.15s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .carousel-control-prev,
- .carousel-control-next {
- -webkit-transition: none;
- transition: none;
- }
-}
-.carousel-control-prev:hover,
-.carousel-control-prev:focus,
-.carousel-control-next:hover,
-.carousel-control-next:focus {
- color: #fff;
- text-decoration: none;
- outline: 0;
- opacity: 0.9;
-}
-.carousel-control-prev {
- left: 0;
-}
-.carousel-control-next {
- right: 0;
-}
-.carousel-control-prev-icon,
-.carousel-control-next-icon {
- display: inline-block;
- width: 20px;
- height: 20px;
- background: no-repeat 50% / 100% 100%;
-}
-.carousel-control-prev-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3e%3c/svg%3e");
-}
-.carousel-control-next-icon {
- background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3e%3c/svg%3e");
-}
-.carousel-indicators {
- position: absolute;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 15;
- display: -webkit-box;
- display: -ms-flexbox;
- display: flex;
- -webkit-box-pack: center;
- -ms-flex-pack: center;
- justify-content: center;
- padding-left: 0;
- margin-right: 15%;
- margin-left: 15%;
- list-style: none;
-}
-.carousel-indicators li {
- -webkit-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-box-flex: 0;
- -ms-flex: 0 1 auto;
- flex: 0 1 auto;
- width: 30px;
- height: 3px;
- margin-right: 3px;
- margin-left: 3px;
- text-indent: -999px;
- cursor: pointer;
- background-color: #fff;
- background-clip: padding-box;
- border-top: 10px solid transparent;
- border-bottom: 10px solid transparent;
- opacity: 0.5;
- -webkit-transition: opacity 0.6s ease;
- transition: opacity 0.6s ease;
-}
-@media (prefers-reduced-motion: reduce) {
- .carousel-indicators li {
- -webkit-transition: none;
- transition: none;
- }
-}
-.carousel-indicators .active {
- opacity: 1;
-}
-.carousel-caption {
- position: absolute;
- right: 15%;
- bottom: 20px;
- left: 15%;
- z-index: 10;
- padding-top: 20px;
- padding-bottom: 20px;
- color: #fff;
- text-align: center;
-}
-@-webkit-keyframes spinner-border {
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
-}
-@keyframes spinner-border {
- to {
- -webkit-transform: rotate(360deg);
- transform: rotate(360deg);
- }
-}
-.spinner-border {
- display: inline-block;
- width: 2rem;
- height: 2rem;
- vertical-align: text-bottom;
- border: 0.25em solid currentColor;
- border-right-color: transparent;
- border-radius: 50%;
- -webkit-animation: spinner-border 0.75s linear infinite;
- animation: spinner-border 0.75s linear infinite;
-}
-.spinner-border-sm {
- width: 1rem;
- height: 1rem;
- border-width: 0.2em;
-}
-@-webkit-keyframes spinner-grow {
- 0% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 50% {
- opacity: 1;
- }
-}
-@keyframes spinner-grow {
- 0% {
- -webkit-transform: scale(0);
- transform: scale(0);
- }
- 50% {
- opacity: 1;
- }
-}
-.spinner-grow {
- display: inline-block;
- width: 2rem;
- height: 2rem;
- vertical-align: text-bottom;
- background-color: currentColor;
- border-radius: 50%;
- opacity: 0;
- -webkit-animation: spinner-grow 0.75s linear infinite;
- animation: spinner-grow 0.75s linear infinite;
-}
-.spinner-grow-sm {
- width: 1rem;
- height: 1rem;
-}
-.align-baseline {
- vertical-align: baseline !important;
-}
-.align-top {
- vertical-align: top !important;
-}
-.align-middle {
- vertical-align: middle !important;
-}
-.align-bottom {
- vertical-align: bottom !important;
-}
-.align-text-bottom {
- vertical-align: text-bottom !important;
-}
-.align-text-top {
- vertical-align: text-top !important;
-}
-.bg-primary {
- background-color: #e05433 !important;
-}
-a.bg-primary:hover,
-a.bg-primary:focus,
-button.bg-primary:hover,
-button.bg-primary:focus {
- background-color: #c23d1e !important;
-}
-.bg-secondary {
- background-color: #6c757d !important;
-}
-a.bg-secondary:hover,
-a.bg-secondary:focus,
-button.bg-secondary:hover,
-button.bg-secondary:focus {
- background-color: #545b62 !important;
-}
-.bg-success {
- background-color: #28a745 !important;
-}
-a.bg-success:hover,
-a.bg-success:focus,
-button.bg-success:hover,
-button.bg-success:focus {
- background-color: #1e7e34 !important;
-}
-.bg-info {
- background-color: #17a2b8 !important;
-}
-a.bg-info:hover,
-a.bg-info:focus,
-button.bg-info:hover,
-button.bg-info:focus {
- background-color: #117a8b !important;
-}
-.bg-warning {
- background-color: #ffc107 !important;
-}
-a.bg-warning:hover,
-a.bg-warning:focus,
-button.bg-warning:hover,
-button.bg-warning:focus {
- background-color: #d39e00 !important;
-}
-.bg-danger {
- background-color: #dc3545 !important;
-}
-a.bg-danger:hover,
-a.bg-danger:focus,
-button.bg-danger:hover,
-button.bg-danger:focus {
- background-color: #bd2130 !important;
-}
-.bg-light {
- background-color: #f8f9fa !important;
-}
-a.bg-light:hover,
-a.bg-light:focus,
-button.bg-light:hover,
-button.bg-light:focus {
- background-color: #dae0e5 !important;
-}
-.bg-dark {
- background-color: #343a40 !important;
-}
-a.bg-dark:hover,
-a.bg-dark:focus,
-button.bg-dark:hover,
-button.bg-dark:focus {
- background-color: #1d2124 !important;
-}
-.bg-white {
- background-color: #fff !important;
-}
-.bg-transparent {
- background-color: transparent !important;
-}
-.border {
- border: 1px solid #dee2e6 !important;
-}
-.border-top {
- border-top: 1px solid #dee2e6 !important;
-}
-.border-right {
- border-right: 1px solid #dee2e6 !important;
-}
-.border-bottom {
- border-bottom: 1px solid #dee2e6 !important;
-}
-.border-left {
- border-left: 1px solid #dee2e6 !important;
-}
-.border-0 {
- border: 0 !important;
-}
-.border-top-0 {
- border-top: 0 !important;
-}
-.border-right-0 {
- border-right: 0 !important;
-}
-.border-bottom-0 {
- border-bottom: 0 !important;
-}
-.border-left-0 {
- border-left: 0 !important;
-}
-.border-primary {
- border-color: #e05433 !important;
-}
-.border-secondary {
- border-color: #6c757d !important;
-}
-.border-success {
- border-color: #28a745 !important;
-}
-.border-info {
- border-color: #17a2b8 !important;
-}
-.border-warning {
- border-color: #ffc107 !important;
-}
-.border-danger {
- border-color: #dc3545 !important;
-}
-.border-light {
- border-color: #f8f9fa !important;
-}
-.border-dark {
- border-color: #343a40 !important;
-}
-.border-white {
- border-color: #fff !important;
-}
-.rounded-sm {
- border-radius: 0 !important;
-}
-.rounded {
- border-radius: 0 !important;
-}
-.rounded-top {
- border-top-left-radius: 0 !important;
- border-top-right-radius: 0 !important;
-}
-.rounded-right {
- border-top-right-radius: 0 !important;
- border-bottom-right-radius: 0 !important;
-}
-.rounded-bottom {
- border-bottom-right-radius: 0 !important;
- border-bottom-left-radius: 0 !important;
-}
-.rounded-left {
- border-top-left-radius: 0 !important;
- border-bottom-left-radius: 0 !important;
-}
-.rounded-lg {
- border-radius: 0 !important;
-}
-.rounded-circle {
- border-radius: 50% !important;
-}
-.rounded-pill {
- border-radius: 50rem !important;
-}
-.rounded-0 {
- border-radius: 0 !important;
-}
-.clearfix::after {
- display: block;
- clear: both;
- content: '';
-}
-.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: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
-}
-.d-inline-flex {
- display: -webkit-inline-box !important;
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
-}
-@media (min-width: 576px) {
- .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: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-sm-inline-flex {
- display: -webkit-inline-box !important;
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-@media (min-width: 768px) {
- .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: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-md-inline-flex {
- display: -webkit-inline-box !important;
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-@media (min-width: 992px) {
- .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: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-lg-inline-flex {
- display: -webkit-inline-box !important;
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-@media (min-width: 1200px) {
- .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: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-xl-inline-flex {
- display: -webkit-inline-box !important;
- display: -ms-inline-flexbox !important;
- display: inline-flex !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: -webkit-box !important;
- display: -ms-flexbox !important;
- display: flex !important;
- }
- .d-print-inline-flex {
- display: -webkit-inline-box !important;
- display: -ms-inline-flexbox !important;
- display: inline-flex !important;
- }
-}
-.embed-responsive {
- position: relative;
- display: block;
- width: 100%;
- padding: 0;
- overflow: hidden;
-}
-.embed-responsive::before {
- display: block;
- content: '';
-}
-.embed-responsive .embed-responsive-item,
-.embed-responsive iframe,
-.embed-responsive embed,
-.embed-responsive object,
-.embed-responsive video {
- position: absolute;
- top: 0;
- bottom: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border: 0;
-}
-.embed-responsive-21by9::before {
- padding-top: 42.85714%;
-}
-.embed-responsive-16by9::before {
- padding-top: 56.25%;
-}
-.embed-responsive-4by3::before {
- padding-top: 75%;
-}
-.embed-responsive-1by1::before {
- padding-top: 100%;
-}
-.flex-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
-}
-.flex-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
-}
-.flex-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
-}
-.flex-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
-}
-.flex-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
-}
-.flex-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
-}
-.flex-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
-}
-.flex-fill {
- -webkit-box-flex: 1 !important;
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
-}
-.flex-grow-0 {
- -webkit-box-flex: 0 !important;
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
-}
-.flex-grow-1 {
- -webkit-box-flex: 1 !important;
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
-}
-.flex-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
-}
-.flex-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
-}
-.justify-content-start {
- -webkit-box-pack: start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
-}
-.justify-content-end {
- -webkit-box-pack: end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
-}
-.justify-content-center {
- -webkit-box-pack: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
-}
-.justify-content-between {
- -webkit-box-pack: justify !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
-}
-.justify-content-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
-}
-.align-items-start {
- -webkit-box-align: start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
-}
-.align-items-end {
- -webkit-box-align: end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
-}
-.align-items-center {
- -webkit-box-align: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
-}
-.align-items-baseline {
- -webkit-box-align: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
-}
-.align-items-stretch {
- -webkit-box-align: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
-}
-.align-content-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
-}
-.align-content-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
-}
-.align-content-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
-}
-.align-content-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
-}
-.align-content-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
-}
-.align-content-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
-}
-.align-self-auto {
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
-}
-.align-self-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
-}
-.align-self-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
-}
-.align-self-center {
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
-}
-.align-self-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
-}
-.align-self-stretch {
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
-}
-@media (min-width: 576px) {
- .flex-sm-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
- }
- .flex-sm-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
- }
- .flex-sm-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
- }
- .flex-sm-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
- }
- .flex-sm-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
- }
- .flex-sm-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
- }
- .flex-sm-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
- }
- .flex-sm-fill {
- -webkit-box-flex: 1 !important;
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
- }
- .flex-sm-grow-0 {
- -webkit-box-flex: 0 !important;
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
- }
- .flex-sm-grow-1 {
- -webkit-box-flex: 1 !important;
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
- }
- .flex-sm-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
- }
- .flex-sm-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
- }
- .justify-content-sm-start {
- -webkit-box-pack: start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
- }
- .justify-content-sm-end {
- -webkit-box-pack: end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
- }
- .justify-content-sm-center {
- -webkit-box-pack: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
- }
- .justify-content-sm-between {
- -webkit-box-pack: justify !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
- }
- .justify-content-sm-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
- }
- .align-items-sm-start {
- -webkit-box-align: start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
- }
- .align-items-sm-end {
- -webkit-box-align: end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
- }
- .align-items-sm-center {
- -webkit-box-align: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
- }
- .align-items-sm-baseline {
- -webkit-box-align: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
- }
- .align-items-sm-stretch {
- -webkit-box-align: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
- }
- .align-content-sm-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
- }
- .align-content-sm-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
- }
- .align-content-sm-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
- }
- .align-content-sm-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
- }
- .align-content-sm-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
- }
- .align-content-sm-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
- }
- .align-self-sm-auto {
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
- }
- .align-self-sm-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
- }
- .align-self-sm-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
- }
- .align-self-sm-center {
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
- }
- .align-self-sm-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
- }
- .align-self-sm-stretch {
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
- }
-}
-@media (min-width: 768px) {
- .flex-md-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
- }
- .flex-md-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
- }
- .flex-md-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
- }
- .flex-md-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
- }
- .flex-md-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
- }
- .flex-md-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
- }
- .flex-md-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
- }
- .flex-md-fill {
- -webkit-box-flex: 1 !important;
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
- }
- .flex-md-grow-0 {
- -webkit-box-flex: 0 !important;
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
- }
- .flex-md-grow-1 {
- -webkit-box-flex: 1 !important;
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
- }
- .flex-md-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
- }
- .flex-md-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
- }
- .justify-content-md-start {
- -webkit-box-pack: start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
- }
- .justify-content-md-end {
- -webkit-box-pack: end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
- }
- .justify-content-md-center {
- -webkit-box-pack: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
- }
- .justify-content-md-between {
- -webkit-box-pack: justify !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
- }
- .justify-content-md-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
- }
- .align-items-md-start {
- -webkit-box-align: start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
- }
- .align-items-md-end {
- -webkit-box-align: end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
- }
- .align-items-md-center {
- -webkit-box-align: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
- }
- .align-items-md-baseline {
- -webkit-box-align: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
- }
- .align-items-md-stretch {
- -webkit-box-align: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
- }
- .align-content-md-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
- }
- .align-content-md-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
- }
- .align-content-md-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
- }
- .align-content-md-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
- }
- .align-content-md-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
- }
- .align-content-md-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
- }
- .align-self-md-auto {
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
- }
- .align-self-md-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
- }
- .align-self-md-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
- }
- .align-self-md-center {
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
- }
- .align-self-md-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
- }
- .align-self-md-stretch {
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
- }
-}
-@media (min-width: 992px) {
- .flex-lg-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
- }
- .flex-lg-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
- }
- .flex-lg-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
- }
- .flex-lg-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
- }
- .flex-lg-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
- }
- .flex-lg-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
- }
- .flex-lg-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
- }
- .flex-lg-fill {
- -webkit-box-flex: 1 !important;
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
- }
- .flex-lg-grow-0 {
- -webkit-box-flex: 0 !important;
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
- }
- .flex-lg-grow-1 {
- -webkit-box-flex: 1 !important;
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
- }
- .flex-lg-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
- }
- .flex-lg-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
- }
- .justify-content-lg-start {
- -webkit-box-pack: start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
- }
- .justify-content-lg-end {
- -webkit-box-pack: end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
- }
- .justify-content-lg-center {
- -webkit-box-pack: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
- }
- .justify-content-lg-between {
- -webkit-box-pack: justify !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
- }
- .justify-content-lg-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
- }
- .align-items-lg-start {
- -webkit-box-align: start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
- }
- .align-items-lg-end {
- -webkit-box-align: end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
- }
- .align-items-lg-center {
- -webkit-box-align: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
- }
- .align-items-lg-baseline {
- -webkit-box-align: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
- }
- .align-items-lg-stretch {
- -webkit-box-align: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
- }
- .align-content-lg-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
- }
- .align-content-lg-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
- }
- .align-content-lg-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
- }
- .align-content-lg-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
- }
- .align-content-lg-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
- }
- .align-content-lg-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
- }
- .align-self-lg-auto {
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
- }
- .align-self-lg-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
- }
- .align-self-lg-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
- }
- .align-self-lg-center {
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
- }
- .align-self-lg-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
- }
- .align-self-lg-stretch {
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
- }
-}
-@media (min-width: 1200px) {
- .flex-xl-row {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: row !important;
- flex-direction: row !important;
- }
- .flex-xl-column {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: normal !important;
- -ms-flex-direction: column !important;
- flex-direction: column !important;
- }
- .flex-xl-row-reverse {
- -webkit-box-orient: horizontal !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: row-reverse !important;
- flex-direction: row-reverse !important;
- }
- .flex-xl-column-reverse {
- -webkit-box-orient: vertical !important;
- -webkit-box-direction: reverse !important;
- -ms-flex-direction: column-reverse !important;
- flex-direction: column-reverse !important;
- }
- .flex-xl-wrap {
- -ms-flex-wrap: wrap !important;
- flex-wrap: wrap !important;
- }
- .flex-xl-nowrap {
- -ms-flex-wrap: nowrap !important;
- flex-wrap: nowrap !important;
- }
- .flex-xl-wrap-reverse {
- -ms-flex-wrap: wrap-reverse !important;
- flex-wrap: wrap-reverse !important;
- }
- .flex-xl-fill {
- -webkit-box-flex: 1 !important;
- -ms-flex: 1 1 auto !important;
- flex: 1 1 auto !important;
- }
- .flex-xl-grow-0 {
- -webkit-box-flex: 0 !important;
- -ms-flex-positive: 0 !important;
- flex-grow: 0 !important;
- }
- .flex-xl-grow-1 {
- -webkit-box-flex: 1 !important;
- -ms-flex-positive: 1 !important;
- flex-grow: 1 !important;
- }
- .flex-xl-shrink-0 {
- -ms-flex-negative: 0 !important;
- flex-shrink: 0 !important;
- }
- .flex-xl-shrink-1 {
- -ms-flex-negative: 1 !important;
- flex-shrink: 1 !important;
- }
- .justify-content-xl-start {
- -webkit-box-pack: start !important;
- -ms-flex-pack: start !important;
- justify-content: flex-start !important;
- }
- .justify-content-xl-end {
- -webkit-box-pack: end !important;
- -ms-flex-pack: end !important;
- justify-content: flex-end !important;
- }
- .justify-content-xl-center {
- -webkit-box-pack: center !important;
- -ms-flex-pack: center !important;
- justify-content: center !important;
- }
- .justify-content-xl-between {
- -webkit-box-pack: justify !important;
- -ms-flex-pack: justify !important;
- justify-content: space-between !important;
- }
- .justify-content-xl-around {
- -ms-flex-pack: distribute !important;
- justify-content: space-around !important;
- }
- .align-items-xl-start {
- -webkit-box-align: start !important;
- -ms-flex-align: start !important;
- align-items: flex-start !important;
- }
- .align-items-xl-end {
- -webkit-box-align: end !important;
- -ms-flex-align: end !important;
- align-items: flex-end !important;
- }
- .align-items-xl-center {
- -webkit-box-align: center !important;
- -ms-flex-align: center !important;
- align-items: center !important;
- }
- .align-items-xl-baseline {
- -webkit-box-align: baseline !important;
- -ms-flex-align: baseline !important;
- align-items: baseline !important;
- }
- .align-items-xl-stretch {
- -webkit-box-align: stretch !important;
- -ms-flex-align: stretch !important;
- align-items: stretch !important;
- }
- .align-content-xl-start {
- -ms-flex-line-pack: start !important;
- align-content: flex-start !important;
- }
- .align-content-xl-end {
- -ms-flex-line-pack: end !important;
- align-content: flex-end !important;
- }
- .align-content-xl-center {
- -ms-flex-line-pack: center !important;
- align-content: center !important;
- }
- .align-content-xl-between {
- -ms-flex-line-pack: justify !important;
- align-content: space-between !important;
- }
- .align-content-xl-around {
- -ms-flex-line-pack: distribute !important;
- align-content: space-around !important;
- }
- .align-content-xl-stretch {
- -ms-flex-line-pack: stretch !important;
- align-content: stretch !important;
- }
- .align-self-xl-auto {
- -ms-flex-item-align: auto !important;
- -ms-grid-row-align: auto !important;
- align-self: auto !important;
- }
- .align-self-xl-start {
- -ms-flex-item-align: start !important;
- align-self: flex-start !important;
- }
- .align-self-xl-end {
- -ms-flex-item-align: end !important;
- align-self: flex-end !important;
- }
- .align-self-xl-center {
- -ms-flex-item-align: center !important;
- -ms-grid-row-align: center !important;
- align-self: center !important;
- }
- .align-self-xl-baseline {
- -ms-flex-item-align: baseline !important;
- align-self: baseline !important;
- }
- .align-self-xl-stretch {
- -ms-flex-item-align: stretch !important;
- -ms-grid-row-align: stretch !important;
- align-self: stretch !important;
- }
-}
-.float-left {
- float: left !important;
-}
-.float-right {
- float: right !important;
-}
-.float-none {
- float: none !important;
-}
-@media (min-width: 576px) {
- .float-sm-left {
- float: left !important;
- }
- .float-sm-right {
- float: right !important;
- }
- .float-sm-none {
- float: none !important;
- }
-}
-@media (min-width: 768px) {
- .float-md-left {
- float: left !important;
- }
- .float-md-right {
- float: right !important;
- }
- .float-md-none {
- float: none !important;
- }
-}
-@media (min-width: 992px) {
- .float-lg-left {
- float: left !important;
- }
- .float-lg-right {
- float: right !important;
- }
- .float-lg-none {
- float: none !important;
- }
-}
-@media (min-width: 1200px) {
- .float-xl-left {
- float: left !important;
- }
- .float-xl-right {
- float: right !important;
- }
- .float-xl-none {
- float: none !important;
- }
-}
-.overflow-auto {
- overflow: auto !important;
-}
-.overflow-hidden {
- overflow: hidden !important;
-}
-.position-static {
- position: static !important;
-}
-.position-relative {
- position: relative !important;
-}
-.position-absolute {
- position: absolute !important;
-}
-.position-fixed {
- position: fixed !important;
-}
-.position-sticky {
- position: -webkit-sticky !important;
- position: sticky !important;
-}
-.fixed-top {
- position: fixed;
- top: 0;
- right: 0;
- left: 0;
- z-index: 1030;
-}
-.fixed-bottom {
- position: fixed;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1030;
-}
-@supports ((position: -webkit-sticky) or (position: sticky)) {
- .sticky-top {
- position: -webkit-sticky;
- position: sticky;
- top: 0;
- z-index: 1020;
- }
-}
-.sr-only {
- position: absolute;
- width: 1px;
- height: 1px;
- padding: 0;
- overflow: hidden;
- clip: rect(0, 0, 0, 0);
- white-space: nowrap;
- border: 0;
-}
-.sr-only-focusable:active,
-.sr-only-focusable:focus {
- position: static;
- width: auto;
- height: auto;
- overflow: visible;
- clip: auto;
- white-space: normal;
-}
-.shadow-sm {
- -webkit-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
- box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;
-}
-.shadow {
- -webkit-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
- box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;
-}
-.shadow-lg {
- -webkit-box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
- box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;
-}
-.shadow-none {
- -webkit-box-shadow: none !important;
- box-shadow: none !important;
-}
-.w-25 {
- width: 25% !important;
-}
-.w-50 {
- width: 50% !important;
-}
-.w-75 {
- width: 75% !important;
-}
-.w-100 {
- width: 100% !important;
-}
-.w-auto {
- width: auto !important;
-}
-.h-25 {
- height: 25% !important;
-}
-.h-50 {
- height: 50% !important;
-}
-.h-75 {
- height: 75% !important;
-}
-.h-100 {
- height: 100% !important;
-}
-.h-auto {
- height: auto !important;
-}
-.mw-100 {
- max-width: 100% !important;
-}
-.mh-100 {
- max-height: 100% !important;
-}
-.min-vw-100 {
- min-width: 100vw !important;
-}
-.min-vh-100 {
- min-height: 100vh !important;
-}
-.vw-100 {
- width: 100vw !important;
-}
-.vh-100 {
- height: 100vh !important;
-}
-.stretched-link::after {
- position: absolute;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1;
- pointer-events: auto;
- content: '';
- background-color: rgba(0, 0, 0, 0);
-}
-.m-0 {
- margin: 0 !important;
-}
-.mt-0,
-.my-0 {
- margin-top: 0 !important;
-}
-.mr-0,
-.mx-0 {
- margin-right: 0 !important;
-}
-.mb-0,
-.my-0 {
- margin-bottom: 0 !important;
-}
-.ml-0,
-.mx-0 {
- margin-left: 0 !important;
-}
-.m-1 {
- margin: 0.25rem !important;
-}
-.mt-1,
-.my-1 {
- margin-top: 0.25rem !important;
-}
-.mr-1,
-.mx-1 {
- margin-right: 0.25rem !important;
-}
-.mb-1,
-.my-1 {
- margin-bottom: 0.25rem !important;
-}
-.ml-1,
-.mx-1 {
- margin-left: 0.25rem !important;
-}
-.m-2 {
- margin: 0.5rem !important;
-}
-.mt-2,
-.my-2 {
- margin-top: 0.5rem !important;
-}
-.mr-2,
-.mx-2 {
- margin-right: 0.5rem !important;
-}
-.mb-2,
-.my-2 {
- margin-bottom: 0.5rem !important;
-}
-.ml-2,
-.mx-2 {
- margin-left: 0.5rem !important;
-}
-.m-3 {
- margin: 1rem !important;
-}
-.mt-3,
-.my-3 {
- margin-top: 1rem !important;
-}
-.mr-3,
-.mx-3 {
- margin-right: 1rem !important;
-}
-.mb-3,
-.my-3 {
- margin-bottom: 1rem !important;
-}
-.ml-3,
-.mx-3 {
- margin-left: 1rem !important;
-}
-.m-4 {
- margin: 1.5rem !important;
-}
-.mt-4,
-.my-4 {
- margin-top: 1.5rem !important;
-}
-.mr-4,
-.mx-4 {
- margin-right: 1.5rem !important;
-}
-.mb-4,
-.my-4 {
- margin-bottom: 1.5rem !important;
-}
-.ml-4,
-.mx-4 {
- margin-left: 1.5rem !important;
-}
-.m-5 {
- margin: 3rem !important;
-}
-.mt-5,
-.my-5 {
- margin-top: 3rem !important;
-}
-.mr-5,
-.mx-5 {
- margin-right: 3rem !important;
-}
-.mb-5,
-.my-5 {
- margin-bottom: 3rem !important;
-}
-.ml-5,
-.mx-5 {
- margin-left: 3rem !important;
-}
-.p-0 {
- padding: 0 !important;
-}
-.pt-0,
-.py-0 {
- padding-top: 0 !important;
-}
-.pr-0,
-.px-0 {
- padding-right: 0 !important;
-}
-.pb-0,
-.py-0 {
- padding-bottom: 0 !important;
-}
-.pl-0,
-.px-0 {
- padding-left: 0 !important;
-}
-.p-1 {
- padding: 0.25rem !important;
-}
-.pt-1,
-.py-1 {
- padding-top: 0.25rem !important;
-}
-.pr-1,
-.px-1 {
- padding-right: 0.25rem !important;
-}
-.pb-1,
-.py-1 {
- padding-bottom: 0.25rem !important;
-}
-.pl-1,
-.px-1 {
- padding-left: 0.25rem !important;
-}
-.p-2 {
- padding: 0.5rem !important;
-}
-.pt-2,
-.py-2 {
- padding-top: 0.5rem !important;
-}
-.pr-2,
-.px-2 {
- padding-right: 0.5rem !important;
-}
-.pb-2,
-.py-2 {
- padding-bottom: 0.5rem !important;
-}
-.pl-2,
-.px-2 {
- padding-left: 0.5rem !important;
-}
-.p-3 {
- padding: 1rem !important;
-}
-.pt-3,
-.py-3 {
- padding-top: 1rem !important;
-}
-.pr-3,
-.px-3 {
- padding-right: 1rem !important;
-}
-.pb-3,
-.py-3 {
- padding-bottom: 1rem !important;
-}
-.pl-3,
-.px-3 {
- padding-left: 1rem !important;
-}
-.p-4 {
- padding: 1.5rem !important;
-}
-.pt-4,
-.py-4 {
- padding-top: 1.5rem !important;
-}
-.pr-4,
-.px-4 {
- padding-right: 1.5rem !important;
-}
-.pb-4,
-.py-4 {
- padding-bottom: 1.5rem !important;
-}
-.pl-4,
-.px-4 {
- padding-left: 1.5rem !important;
-}
-.p-5 {
- padding: 3rem !important;
-}
-.pt-5,
-.py-5 {
- padding-top: 3rem !important;
-}
-.pr-5,
-.px-5 {
- padding-right: 3rem !important;
-}
-.pb-5,
-.py-5 {
- padding-bottom: 3rem !important;
-}
-.pl-5,
-.px-5 {
- padding-left: 3rem !important;
-}
-.m-n1 {
- margin: -0.25rem !important;
-}
-.mt-n1,
-.my-n1 {
- margin-top: -0.25rem !important;
-}
-.mr-n1,
-.mx-n1 {
- margin-right: -0.25rem !important;
-}
-.mb-n1,
-.my-n1 {
- margin-bottom: -0.25rem !important;
-}
-.ml-n1,
-.mx-n1 {
- margin-left: -0.25rem !important;
-}
-.m-n2 {
- margin: -0.5rem !important;
-}
-.mt-n2,
-.my-n2 {
- margin-top: -0.5rem !important;
-}
-.mr-n2,
-.mx-n2 {
- margin-right: -0.5rem !important;
-}
-.mb-n2,
-.my-n2 {
- margin-bottom: -0.5rem !important;
-}
-.ml-n2,
-.mx-n2 {
- margin-left: -0.5rem !important;
-}
-.m-n3 {
- margin: -1rem !important;
-}
-.mt-n3,
-.my-n3 {
- margin-top: -1rem !important;
-}
-.mr-n3,
-.mx-n3 {
- margin-right: -1rem !important;
-}
-.mb-n3,
-.my-n3 {
- margin-bottom: -1rem !important;
-}
-.ml-n3,
-.mx-n3 {
- margin-left: -1rem !important;
-}
-.m-n4 {
- margin: -1.5rem !important;
-}
-.mt-n4,
-.my-n4 {
- margin-top: -1.5rem !important;
-}
-.mr-n4,
-.mx-n4 {
- margin-right: -1.5rem !important;
-}
-.mb-n4,
-.my-n4 {
- margin-bottom: -1.5rem !important;
-}
-.ml-n4,
-.mx-n4 {
- margin-left: -1.5rem !important;
-}
-.m-n5 {
- margin: -3rem !important;
-}
-.mt-n5,
-.my-n5 {
- margin-top: -3rem !important;
-}
-.mr-n5,
-.mx-n5 {
- margin-right: -3rem !important;
-}
-.mb-n5,
-.my-n5 {
- margin-bottom: -3rem !important;
-}
-.ml-n5,
-.mx-n5 {
- margin-left: -3rem !important;
-}
-.m-auto {
- margin: auto !important;
-}
-.mt-auto,
-.my-auto {
- margin-top: auto !important;
-}
-.mr-auto,
-.mx-auto {
- margin-right: auto !important;
-}
-.mb-auto,
-.my-auto {
- margin-bottom: auto !important;
-}
-.ml-auto,
-.mx-auto {
- margin-left: auto !important;
-}
-@media (min-width: 576px) {
- .m-sm-0 {
- margin: 0 !important;
- }
- .mt-sm-0,
- .my-sm-0 {
- margin-top: 0 !important;
- }
- .mr-sm-0,
- .mx-sm-0 {
- margin-right: 0 !important;
- }
- .mb-sm-0,
- .my-sm-0 {
- margin-bottom: 0 !important;
- }
- .ml-sm-0,
- .mx-sm-0 {
- margin-left: 0 !important;
- }
- .m-sm-1 {
- margin: 0.25rem !important;
- }
- .mt-sm-1,
- .my-sm-1 {
- margin-top: 0.25rem !important;
- }
- .mr-sm-1,
- .mx-sm-1 {
- margin-right: 0.25rem !important;
- }
- .mb-sm-1,
- .my-sm-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-sm-1,
- .mx-sm-1 {
- margin-left: 0.25rem !important;
- }
- .m-sm-2 {
- margin: 0.5rem !important;
- }
- .mt-sm-2,
- .my-sm-2 {
- margin-top: 0.5rem !important;
- }
- .mr-sm-2,
- .mx-sm-2 {
- margin-right: 0.5rem !important;
- }
- .mb-sm-2,
- .my-sm-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-sm-2,
- .mx-sm-2 {
- margin-left: 0.5rem !important;
- }
- .m-sm-3 {
- margin: 1rem !important;
- }
- .mt-sm-3,
- .my-sm-3 {
- margin-top: 1rem !important;
- }
- .mr-sm-3,
- .mx-sm-3 {
- margin-right: 1rem !important;
- }
- .mb-sm-3,
- .my-sm-3 {
- margin-bottom: 1rem !important;
- }
- .ml-sm-3,
- .mx-sm-3 {
- margin-left: 1rem !important;
- }
- .m-sm-4 {
- margin: 1.5rem !important;
- }
- .mt-sm-4,
- .my-sm-4 {
- margin-top: 1.5rem !important;
- }
- .mr-sm-4,
- .mx-sm-4 {
- margin-right: 1.5rem !important;
- }
- .mb-sm-4,
- .my-sm-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-sm-4,
- .mx-sm-4 {
- margin-left: 1.5rem !important;
- }
- .m-sm-5 {
- margin: 3rem !important;
- }
- .mt-sm-5,
- .my-sm-5 {
- margin-top: 3rem !important;
- }
- .mr-sm-5,
- .mx-sm-5 {
- margin-right: 3rem !important;
- }
- .mb-sm-5,
- .my-sm-5 {
- margin-bottom: 3rem !important;
- }
- .ml-sm-5,
- .mx-sm-5 {
- margin-left: 3rem !important;
- }
- .p-sm-0 {
- padding: 0 !important;
- }
- .pt-sm-0,
- .py-sm-0 {
- padding-top: 0 !important;
- }
- .pr-sm-0,
- .px-sm-0 {
- padding-right: 0 !important;
- }
- .pb-sm-0,
- .py-sm-0 {
- padding-bottom: 0 !important;
- }
- .pl-sm-0,
- .px-sm-0 {
- padding-left: 0 !important;
- }
- .p-sm-1 {
- padding: 0.25rem !important;
- }
- .pt-sm-1,
- .py-sm-1 {
- padding-top: 0.25rem !important;
- }
- .pr-sm-1,
- .px-sm-1 {
- padding-right: 0.25rem !important;
- }
- .pb-sm-1,
- .py-sm-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-sm-1,
- .px-sm-1 {
- padding-left: 0.25rem !important;
- }
- .p-sm-2 {
- padding: 0.5rem !important;
- }
- .pt-sm-2,
- .py-sm-2 {
- padding-top: 0.5rem !important;
- }
- .pr-sm-2,
- .px-sm-2 {
- padding-right: 0.5rem !important;
- }
- .pb-sm-2,
- .py-sm-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-sm-2,
- .px-sm-2 {
- padding-left: 0.5rem !important;
- }
- .p-sm-3 {
- padding: 1rem !important;
- }
- .pt-sm-3,
- .py-sm-3 {
- padding-top: 1rem !important;
- }
- .pr-sm-3,
- .px-sm-3 {
- padding-right: 1rem !important;
- }
- .pb-sm-3,
- .py-sm-3 {
- padding-bottom: 1rem !important;
- }
- .pl-sm-3,
- .px-sm-3 {
- padding-left: 1rem !important;
- }
- .p-sm-4 {
- padding: 1.5rem !important;
- }
- .pt-sm-4,
- .py-sm-4 {
- padding-top: 1.5rem !important;
- }
- .pr-sm-4,
- .px-sm-4 {
- padding-right: 1.5rem !important;
- }
- .pb-sm-4,
- .py-sm-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-sm-4,
- .px-sm-4 {
- padding-left: 1.5rem !important;
- }
- .p-sm-5 {
- padding: 3rem !important;
- }
- .pt-sm-5,
- .py-sm-5 {
- padding-top: 3rem !important;
- }
- .pr-sm-5,
- .px-sm-5 {
- padding-right: 3rem !important;
- }
- .pb-sm-5,
- .py-sm-5 {
- padding-bottom: 3rem !important;
- }
- .pl-sm-5,
- .px-sm-5 {
- padding-left: 3rem !important;
- }
- .m-sm-n1 {
- margin: -0.25rem !important;
- }
- .mt-sm-n1,
- .my-sm-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-sm-n1,
- .mx-sm-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-sm-n1,
- .my-sm-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-sm-n1,
- .mx-sm-n1 {
- margin-left: -0.25rem !important;
- }
- .m-sm-n2 {
- margin: -0.5rem !important;
- }
- .mt-sm-n2,
- .my-sm-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-sm-n2,
- .mx-sm-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-sm-n2,
- .my-sm-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-sm-n2,
- .mx-sm-n2 {
- margin-left: -0.5rem !important;
- }
- .m-sm-n3 {
- margin: -1rem !important;
- }
- .mt-sm-n3,
- .my-sm-n3 {
- margin-top: -1rem !important;
- }
- .mr-sm-n3,
- .mx-sm-n3 {
- margin-right: -1rem !important;
- }
- .mb-sm-n3,
- .my-sm-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-sm-n3,
- .mx-sm-n3 {
- margin-left: -1rem !important;
- }
- .m-sm-n4 {
- margin: -1.5rem !important;
- }
- .mt-sm-n4,
- .my-sm-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-sm-n4,
- .mx-sm-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-sm-n4,
- .my-sm-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-sm-n4,
- .mx-sm-n4 {
- margin-left: -1.5rem !important;
- }
- .m-sm-n5 {
- margin: -3rem !important;
- }
- .mt-sm-n5,
- .my-sm-n5 {
- margin-top: -3rem !important;
- }
- .mr-sm-n5,
- .mx-sm-n5 {
- margin-right: -3rem !important;
- }
- .mb-sm-n5,
- .my-sm-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-sm-n5,
- .mx-sm-n5 {
- margin-left: -3rem !important;
- }
- .m-sm-auto {
- margin: auto !important;
- }
- .mt-sm-auto,
- .my-sm-auto {
- margin-top: auto !important;
- }
- .mr-sm-auto,
- .mx-sm-auto {
- margin-right: auto !important;
- }
- .mb-sm-auto,
- .my-sm-auto {
- margin-bottom: auto !important;
- }
- .ml-sm-auto,
- .mx-sm-auto {
- margin-left: auto !important;
- }
-}
-@media (min-width: 768px) {
- .m-md-0 {
- margin: 0 !important;
- }
- .mt-md-0,
- .my-md-0 {
- margin-top: 0 !important;
- }
- .mr-md-0,
- .mx-md-0 {
- margin-right: 0 !important;
- }
- .mb-md-0,
- .my-md-0 {
- margin-bottom: 0 !important;
- }
- .ml-md-0,
- .mx-md-0 {
- margin-left: 0 !important;
- }
- .m-md-1 {
- margin: 0.25rem !important;
- }
- .mt-md-1,
- .my-md-1 {
- margin-top: 0.25rem !important;
- }
- .mr-md-1,
- .mx-md-1 {
- margin-right: 0.25rem !important;
- }
- .mb-md-1,
- .my-md-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-md-1,
- .mx-md-1 {
- margin-left: 0.25rem !important;
- }
- .m-md-2 {
- margin: 0.5rem !important;
- }
- .mt-md-2,
- .my-md-2 {
- margin-top: 0.5rem !important;
- }
- .mr-md-2,
- .mx-md-2 {
- margin-right: 0.5rem !important;
- }
- .mb-md-2,
- .my-md-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-md-2,
- .mx-md-2 {
- margin-left: 0.5rem !important;
- }
- .m-md-3 {
- margin: 1rem !important;
- }
- .mt-md-3,
- .my-md-3 {
- margin-top: 1rem !important;
- }
- .mr-md-3,
- .mx-md-3 {
- margin-right: 1rem !important;
- }
- .mb-md-3,
- .my-md-3 {
- margin-bottom: 1rem !important;
- }
- .ml-md-3,
- .mx-md-3 {
- margin-left: 1rem !important;
- }
- .m-md-4 {
- margin: 1.5rem !important;
- }
- .mt-md-4,
- .my-md-4 {
- margin-top: 1.5rem !important;
- }
- .mr-md-4,
- .mx-md-4 {
- margin-right: 1.5rem !important;
- }
- .mb-md-4,
- .my-md-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-md-4,
- .mx-md-4 {
- margin-left: 1.5rem !important;
- }
- .m-md-5 {
- margin: 3rem !important;
- }
- .mt-md-5,
- .my-md-5 {
- margin-top: 3rem !important;
- }
- .mr-md-5,
- .mx-md-5 {
- margin-right: 3rem !important;
- }
- .mb-md-5,
- .my-md-5 {
- margin-bottom: 3rem !important;
- }
- .ml-md-5,
- .mx-md-5 {
- margin-left: 3rem !important;
- }
- .p-md-0 {
- padding: 0 !important;
- }
- .pt-md-0,
- .py-md-0 {
- padding-top: 0 !important;
- }
- .pr-md-0,
- .px-md-0 {
- padding-right: 0 !important;
- }
- .pb-md-0,
- .py-md-0 {
- padding-bottom: 0 !important;
- }
- .pl-md-0,
- .px-md-0 {
- padding-left: 0 !important;
- }
- .p-md-1 {
- padding: 0.25rem !important;
- }
- .pt-md-1,
- .py-md-1 {
- padding-top: 0.25rem !important;
- }
- .pr-md-1,
- .px-md-1 {
- padding-right: 0.25rem !important;
- }
- .pb-md-1,
- .py-md-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-md-1,
- .px-md-1 {
- padding-left: 0.25rem !important;
- }
- .p-md-2 {
- padding: 0.5rem !important;
- }
- .pt-md-2,
- .py-md-2 {
- padding-top: 0.5rem !important;
- }
- .pr-md-2,
- .px-md-2 {
- padding-right: 0.5rem !important;
- }
- .pb-md-2,
- .py-md-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-md-2,
- .px-md-2 {
- padding-left: 0.5rem !important;
- }
- .p-md-3 {
- padding: 1rem !important;
- }
- .pt-md-3,
- .py-md-3 {
- padding-top: 1rem !important;
- }
- .pr-md-3,
- .px-md-3 {
- padding-right: 1rem !important;
- }
- .pb-md-3,
- .py-md-3 {
- padding-bottom: 1rem !important;
- }
- .pl-md-3,
- .px-md-3 {
- padding-left: 1rem !important;
- }
- .p-md-4 {
- padding: 1.5rem !important;
- }
- .pt-md-4,
- .py-md-4 {
- padding-top: 1.5rem !important;
- }
- .pr-md-4,
- .px-md-4 {
- padding-right: 1.5rem !important;
- }
- .pb-md-4,
- .py-md-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-md-4,
- .px-md-4 {
- padding-left: 1.5rem !important;
- }
- .p-md-5 {
- padding: 3rem !important;
- }
- .pt-md-5,
- .py-md-5 {
- padding-top: 3rem !important;
- }
- .pr-md-5,
- .px-md-5 {
- padding-right: 3rem !important;
- }
- .pb-md-5,
- .py-md-5 {
- padding-bottom: 3rem !important;
- }
- .pl-md-5,
- .px-md-5 {
- padding-left: 3rem !important;
- }
- .m-md-n1 {
- margin: -0.25rem !important;
- }
- .mt-md-n1,
- .my-md-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-md-n1,
- .mx-md-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-md-n1,
- .my-md-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-md-n1,
- .mx-md-n1 {
- margin-left: -0.25rem !important;
- }
- .m-md-n2 {
- margin: -0.5rem !important;
- }
- .mt-md-n2,
- .my-md-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-md-n2,
- .mx-md-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-md-n2,
- .my-md-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-md-n2,
- .mx-md-n2 {
- margin-left: -0.5rem !important;
- }
- .m-md-n3 {
- margin: -1rem !important;
- }
- .mt-md-n3,
- .my-md-n3 {
- margin-top: -1rem !important;
- }
- .mr-md-n3,
- .mx-md-n3 {
- margin-right: -1rem !important;
- }
- .mb-md-n3,
- .my-md-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-md-n3,
- .mx-md-n3 {
- margin-left: -1rem !important;
- }
- .m-md-n4 {
- margin: -1.5rem !important;
- }
- .mt-md-n4,
- .my-md-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-md-n4,
- .mx-md-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-md-n4,
- .my-md-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-md-n4,
- .mx-md-n4 {
- margin-left: -1.5rem !important;
- }
- .m-md-n5 {
- margin: -3rem !important;
- }
- .mt-md-n5,
- .my-md-n5 {
- margin-top: -3rem !important;
- }
- .mr-md-n5,
- .mx-md-n5 {
- margin-right: -3rem !important;
- }
- .mb-md-n5,
- .my-md-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-md-n5,
- .mx-md-n5 {
- margin-left: -3rem !important;
- }
- .m-md-auto {
- margin: auto !important;
- }
- .mt-md-auto,
- .my-md-auto {
- margin-top: auto !important;
- }
- .mr-md-auto,
- .mx-md-auto {
- margin-right: auto !important;
- }
- .mb-md-auto,
- .my-md-auto {
- margin-bottom: auto !important;
- }
- .ml-md-auto,
- .mx-md-auto {
- margin-left: auto !important;
- }
-}
-@media (min-width: 992px) {
- .m-lg-0 {
- margin: 0 !important;
- }
- .mt-lg-0,
- .my-lg-0 {
- margin-top: 0 !important;
- }
- .mr-lg-0,
- .mx-lg-0 {
- margin-right: 0 !important;
- }
- .mb-lg-0,
- .my-lg-0 {
- margin-bottom: 0 !important;
- }
- .ml-lg-0,
- .mx-lg-0 {
- margin-left: 0 !important;
- }
- .m-lg-1 {
- margin: 0.25rem !important;
- }
- .mt-lg-1,
- .my-lg-1 {
- margin-top: 0.25rem !important;
- }
- .mr-lg-1,
- .mx-lg-1 {
- margin-right: 0.25rem !important;
- }
- .mb-lg-1,
- .my-lg-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-lg-1,
- .mx-lg-1 {
- margin-left: 0.25rem !important;
- }
- .m-lg-2 {
- margin: 0.5rem !important;
- }
- .mt-lg-2,
- .my-lg-2 {
- margin-top: 0.5rem !important;
- }
- .mr-lg-2,
- .mx-lg-2 {
- margin-right: 0.5rem !important;
- }
- .mb-lg-2,
- .my-lg-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-lg-2,
- .mx-lg-2 {
- margin-left: 0.5rem !important;
- }
- .m-lg-3 {
- margin: 1rem !important;
- }
- .mt-lg-3,
- .my-lg-3 {
- margin-top: 1rem !important;
- }
- .mr-lg-3,
- .mx-lg-3 {
- margin-right: 1rem !important;
- }
- .mb-lg-3,
- .my-lg-3 {
- margin-bottom: 1rem !important;
- }
- .ml-lg-3,
- .mx-lg-3 {
- margin-left: 1rem !important;
- }
- .m-lg-4 {
- margin: 1.5rem !important;
- }
- .mt-lg-4,
- .my-lg-4 {
- margin-top: 1.5rem !important;
- }
- .mr-lg-4,
- .mx-lg-4 {
- margin-right: 1.5rem !important;
- }
- .mb-lg-4,
- .my-lg-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-lg-4,
- .mx-lg-4 {
- margin-left: 1.5rem !important;
- }
- .m-lg-5 {
- margin: 3rem !important;
- }
- .mt-lg-5,
- .my-lg-5 {
- margin-top: 3rem !important;
- }
- .mr-lg-5,
- .mx-lg-5 {
- margin-right: 3rem !important;
- }
- .mb-lg-5,
- .my-lg-5 {
- margin-bottom: 3rem !important;
- }
- .ml-lg-5,
- .mx-lg-5 {
- margin-left: 3rem !important;
- }
- .p-lg-0 {
- padding: 0 !important;
- }
- .pt-lg-0,
- .py-lg-0 {
- padding-top: 0 !important;
- }
- .pr-lg-0,
- .px-lg-0 {
- padding-right: 0 !important;
- }
- .pb-lg-0,
- .py-lg-0 {
- padding-bottom: 0 !important;
- }
- .pl-lg-0,
- .px-lg-0 {
- padding-left: 0 !important;
- }
- .p-lg-1 {
- padding: 0.25rem !important;
- }
- .pt-lg-1,
- .py-lg-1 {
- padding-top: 0.25rem !important;
- }
- .pr-lg-1,
- .px-lg-1 {
- padding-right: 0.25rem !important;
- }
- .pb-lg-1,
- .py-lg-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-lg-1,
- .px-lg-1 {
- padding-left: 0.25rem !important;
- }
- .p-lg-2 {
- padding: 0.5rem !important;
- }
- .pt-lg-2,
- .py-lg-2 {
- padding-top: 0.5rem !important;
- }
- .pr-lg-2,
- .px-lg-2 {
- padding-right: 0.5rem !important;
- }
- .pb-lg-2,
- .py-lg-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-lg-2,
- .px-lg-2 {
- padding-left: 0.5rem !important;
- }
- .p-lg-3 {
- padding: 1rem !important;
- }
- .pt-lg-3,
- .py-lg-3 {
- padding-top: 1rem !important;
- }
- .pr-lg-3,
- .px-lg-3 {
- padding-right: 1rem !important;
- }
- .pb-lg-3,
- .py-lg-3 {
- padding-bottom: 1rem !important;
- }
- .pl-lg-3,
- .px-lg-3 {
- padding-left: 1rem !important;
- }
- .p-lg-4 {
- padding: 1.5rem !important;
- }
- .pt-lg-4,
- .py-lg-4 {
- padding-top: 1.5rem !important;
- }
- .pr-lg-4,
- .px-lg-4 {
- padding-right: 1.5rem !important;
- }
- .pb-lg-4,
- .py-lg-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-lg-4,
- .px-lg-4 {
- padding-left: 1.5rem !important;
- }
- .p-lg-5 {
- padding: 3rem !important;
- }
- .pt-lg-5,
- .py-lg-5 {
- padding-top: 3rem !important;
- }
- .pr-lg-5,
- .px-lg-5 {
- padding-right: 3rem !important;
- }
- .pb-lg-5,
- .py-lg-5 {
- padding-bottom: 3rem !important;
- }
- .pl-lg-5,
- .px-lg-5 {
- padding-left: 3rem !important;
- }
- .m-lg-n1 {
- margin: -0.25rem !important;
- }
- .mt-lg-n1,
- .my-lg-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-lg-n1,
- .mx-lg-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-lg-n1,
- .my-lg-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-lg-n1,
- .mx-lg-n1 {
- margin-left: -0.25rem !important;
- }
- .m-lg-n2 {
- margin: -0.5rem !important;
- }
- .mt-lg-n2,
- .my-lg-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-lg-n2,
- .mx-lg-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-lg-n2,
- .my-lg-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-lg-n2,
- .mx-lg-n2 {
- margin-left: -0.5rem !important;
- }
- .m-lg-n3 {
- margin: -1rem !important;
- }
- .mt-lg-n3,
- .my-lg-n3 {
- margin-top: -1rem !important;
- }
- .mr-lg-n3,
- .mx-lg-n3 {
- margin-right: -1rem !important;
- }
- .mb-lg-n3,
- .my-lg-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-lg-n3,
- .mx-lg-n3 {
- margin-left: -1rem !important;
- }
- .m-lg-n4 {
- margin: -1.5rem !important;
- }
- .mt-lg-n4,
- .my-lg-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-lg-n4,
- .mx-lg-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-lg-n4,
- .my-lg-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-lg-n4,
- .mx-lg-n4 {
- margin-left: -1.5rem !important;
- }
- .m-lg-n5 {
- margin: -3rem !important;
- }
- .mt-lg-n5,
- .my-lg-n5 {
- margin-top: -3rem !important;
- }
- .mr-lg-n5,
- .mx-lg-n5 {
- margin-right: -3rem !important;
- }
- .mb-lg-n5,
- .my-lg-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-lg-n5,
- .mx-lg-n5 {
- margin-left: -3rem !important;
- }
- .m-lg-auto {
- margin: auto !important;
- }
- .mt-lg-auto,
- .my-lg-auto {
- margin-top: auto !important;
- }
- .mr-lg-auto,
- .mx-lg-auto {
- margin-right: auto !important;
- }
- .mb-lg-auto,
- .my-lg-auto {
- margin-bottom: auto !important;
- }
- .ml-lg-auto,
- .mx-lg-auto {
- margin-left: auto !important;
- }
-}
-@media (min-width: 1200px) {
- .m-xl-0 {
- margin: 0 !important;
- }
- .mt-xl-0,
- .my-xl-0 {
- margin-top: 0 !important;
- }
- .mr-xl-0,
- .mx-xl-0 {
- margin-right: 0 !important;
- }
- .mb-xl-0,
- .my-xl-0 {
- margin-bottom: 0 !important;
- }
- .ml-xl-0,
- .mx-xl-0 {
- margin-left: 0 !important;
- }
- .m-xl-1 {
- margin: 0.25rem !important;
- }
- .mt-xl-1,
- .my-xl-1 {
- margin-top: 0.25rem !important;
- }
- .mr-xl-1,
- .mx-xl-1 {
- margin-right: 0.25rem !important;
- }
- .mb-xl-1,
- .my-xl-1 {
- margin-bottom: 0.25rem !important;
- }
- .ml-xl-1,
- .mx-xl-1 {
- margin-left: 0.25rem !important;
- }
- .m-xl-2 {
- margin: 0.5rem !important;
- }
- .mt-xl-2,
- .my-xl-2 {
- margin-top: 0.5rem !important;
- }
- .mr-xl-2,
- .mx-xl-2 {
- margin-right: 0.5rem !important;
- }
- .mb-xl-2,
- .my-xl-2 {
- margin-bottom: 0.5rem !important;
- }
- .ml-xl-2,
- .mx-xl-2 {
- margin-left: 0.5rem !important;
- }
- .m-xl-3 {
- margin: 1rem !important;
- }
- .mt-xl-3,
- .my-xl-3 {
- margin-top: 1rem !important;
- }
- .mr-xl-3,
- .mx-xl-3 {
- margin-right: 1rem !important;
- }
- .mb-xl-3,
- .my-xl-3 {
- margin-bottom: 1rem !important;
- }
- .ml-xl-3,
- .mx-xl-3 {
- margin-left: 1rem !important;
- }
- .m-xl-4 {
- margin: 1.5rem !important;
- }
- .mt-xl-4,
- .my-xl-4 {
- margin-top: 1.5rem !important;
- }
- .mr-xl-4,
- .mx-xl-4 {
- margin-right: 1.5rem !important;
- }
- .mb-xl-4,
- .my-xl-4 {
- margin-bottom: 1.5rem !important;
- }
- .ml-xl-4,
- .mx-xl-4 {
- margin-left: 1.5rem !important;
- }
- .m-xl-5 {
- margin: 3rem !important;
- }
- .mt-xl-5,
- .my-xl-5 {
- margin-top: 3rem !important;
- }
- .mr-xl-5,
- .mx-xl-5 {
- margin-right: 3rem !important;
- }
- .mb-xl-5,
- .my-xl-5 {
- margin-bottom: 3rem !important;
- }
- .ml-xl-5,
- .mx-xl-5 {
- margin-left: 3rem !important;
- }
- .p-xl-0 {
- padding: 0 !important;
- }
- .pt-xl-0,
- .py-xl-0 {
- padding-top: 0 !important;
- }
- .pr-xl-0,
- .px-xl-0 {
- padding-right: 0 !important;
- }
- .pb-xl-0,
- .py-xl-0 {
- padding-bottom: 0 !important;
- }
- .pl-xl-0,
- .px-xl-0 {
- padding-left: 0 !important;
- }
- .p-xl-1 {
- padding: 0.25rem !important;
- }
- .pt-xl-1,
- .py-xl-1 {
- padding-top: 0.25rem !important;
- }
- .pr-xl-1,
- .px-xl-1 {
- padding-right: 0.25rem !important;
- }
- .pb-xl-1,
- .py-xl-1 {
- padding-bottom: 0.25rem !important;
- }
- .pl-xl-1,
- .px-xl-1 {
- padding-left: 0.25rem !important;
- }
- .p-xl-2 {
- padding: 0.5rem !important;
- }
- .pt-xl-2,
- .py-xl-2 {
- padding-top: 0.5rem !important;
- }
- .pr-xl-2,
- .px-xl-2 {
- padding-right: 0.5rem !important;
- }
- .pb-xl-2,
- .py-xl-2 {
- padding-bottom: 0.5rem !important;
- }
- .pl-xl-2,
- .px-xl-2 {
- padding-left: 0.5rem !important;
- }
- .p-xl-3 {
- padding: 1rem !important;
- }
- .pt-xl-3,
- .py-xl-3 {
- padding-top: 1rem !important;
- }
- .pr-xl-3,
- .px-xl-3 {
- padding-right: 1rem !important;
- }
- .pb-xl-3,
- .py-xl-3 {
- padding-bottom: 1rem !important;
- }
- .pl-xl-3,
- .px-xl-3 {
- padding-left: 1rem !important;
- }
- .p-xl-4 {
- padding: 1.5rem !important;
- }
- .pt-xl-4,
- .py-xl-4 {
- padding-top: 1.5rem !important;
- }
- .pr-xl-4,
- .px-xl-4 {
- padding-right: 1.5rem !important;
- }
- .pb-xl-4,
- .py-xl-4 {
- padding-bottom: 1.5rem !important;
- }
- .pl-xl-4,
- .px-xl-4 {
- padding-left: 1.5rem !important;
- }
- .p-xl-5 {
- padding: 3rem !important;
- }
- .pt-xl-5,
- .py-xl-5 {
- padding-top: 3rem !important;
- }
- .pr-xl-5,
- .px-xl-5 {
- padding-right: 3rem !important;
- }
- .pb-xl-5,
- .py-xl-5 {
- padding-bottom: 3rem !important;
- }
- .pl-xl-5,
- .px-xl-5 {
- padding-left: 3rem !important;
- }
- .m-xl-n1 {
- margin: -0.25rem !important;
- }
- .mt-xl-n1,
- .my-xl-n1 {
- margin-top: -0.25rem !important;
- }
- .mr-xl-n1,
- .mx-xl-n1 {
- margin-right: -0.25rem !important;
- }
- .mb-xl-n1,
- .my-xl-n1 {
- margin-bottom: -0.25rem !important;
- }
- .ml-xl-n1,
- .mx-xl-n1 {
- margin-left: -0.25rem !important;
- }
- .m-xl-n2 {
- margin: -0.5rem !important;
- }
- .mt-xl-n2,
- .my-xl-n2 {
- margin-top: -0.5rem !important;
- }
- .mr-xl-n2,
- .mx-xl-n2 {
- margin-right: -0.5rem !important;
- }
- .mb-xl-n2,
- .my-xl-n2 {
- margin-bottom: -0.5rem !important;
- }
- .ml-xl-n2,
- .mx-xl-n2 {
- margin-left: -0.5rem !important;
- }
- .m-xl-n3 {
- margin: -1rem !important;
- }
- .mt-xl-n3,
- .my-xl-n3 {
- margin-top: -1rem !important;
- }
- .mr-xl-n3,
- .mx-xl-n3 {
- margin-right: -1rem !important;
- }
- .mb-xl-n3,
- .my-xl-n3 {
- margin-bottom: -1rem !important;
- }
- .ml-xl-n3,
- .mx-xl-n3 {
- margin-left: -1rem !important;
- }
- .m-xl-n4 {
- margin: -1.5rem !important;
- }
- .mt-xl-n4,
- .my-xl-n4 {
- margin-top: -1.5rem !important;
- }
- .mr-xl-n4,
- .mx-xl-n4 {
- margin-right: -1.5rem !important;
- }
- .mb-xl-n4,
- .my-xl-n4 {
- margin-bottom: -1.5rem !important;
- }
- .ml-xl-n4,
- .mx-xl-n4 {
- margin-left: -1.5rem !important;
- }
- .m-xl-n5 {
- margin: -3rem !important;
- }
- .mt-xl-n5,
- .my-xl-n5 {
- margin-top: -3rem !important;
- }
- .mr-xl-n5,
- .mx-xl-n5 {
- margin-right: -3rem !important;
- }
- .mb-xl-n5,
- .my-xl-n5 {
- margin-bottom: -3rem !important;
- }
- .ml-xl-n5,
- .mx-xl-n5 {
- margin-left: -3rem !important;
- }
- .m-xl-auto {
- margin: auto !important;
- }
- .mt-xl-auto,
- .my-xl-auto {
- margin-top: auto !important;
- }
- .mr-xl-auto,
- .mx-xl-auto {
- margin-right: auto !important;
- }
- .mb-xl-auto,
- .my-xl-auto {
- margin-bottom: auto !important;
- }
- .ml-xl-auto,
- .mx-xl-auto {
- margin-left: auto !important;
- }
-}
-.text-monospace {
- font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace !important;
-}
-.text-justify {
- text-align: justify !important;
-}
-.text-wrap {
- white-space: normal !important;
-}
-.text-nowrap {
- white-space: nowrap !important;
-}
-.text-truncate {
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-.text-left {
- text-align: left !important;
-}
-.text-right {
- text-align: right !important;
-}
-.text-center {
- text-align: center !important;
-}
-@media (min-width: 576px) {
- .text-sm-left {
- text-align: left !important;
- }
- .text-sm-right {
- text-align: right !important;
- }
- .text-sm-center {
- text-align: center !important;
- }
-}
-@media (min-width: 768px) {
- .text-md-left {
- text-align: left !important;
- }
- .text-md-right {
- text-align: right !important;
- }
- .text-md-center {
- text-align: center !important;
- }
-}
-@media (min-width: 992px) {
- .text-lg-left {
- text-align: left !important;
- }
- .text-lg-right {
- text-align: right !important;
- }
- .text-lg-center {
- text-align: center !important;
- }
-}
-@media (min-width: 1200px) {
- .text-xl-left {
- text-align: left !important;
- }
- .text-xl-right {
- text-align: right !important;
- }
- .text-xl-center {
- text-align: center !important;
- }
-}
-.text-lowercase {
- text-transform: lowercase !important;
-}
-.text-uppercase {
- text-transform: uppercase !important;
-}
-.text-capitalize {
- text-transform: capitalize !important;
-}
-.font-weight-light {
- font-weight: 300 !important;
-}
-.font-weight-lighter {
- font-weight: lighter !important;
-}
-.font-weight-normal {
- font-weight: 400 !important;
-}
-.font-weight-bold {
- font-weight: 700 !important;
-}
-.font-weight-bolder {
- font-weight: bolder !important;
-}
-.font-italic {
- font-style: italic !important;
-}
-.text-white {
- color: #fff !important;
-}
-.text-primary {
- color: #e05433 !important;
-}
-a.text-primary:hover,
-a.text-primary:focus {
- color: #ac361a !important;
-}
-.text-secondary {
- color: #6c757d !important;
-}
-a.text-secondary:hover,
-a.text-secondary:focus {
- color: #494f54 !important;
-}
-.text-success {
- color: #28a745 !important;
-}
-a.text-success:hover,
-a.text-success:focus {
- color: #19692c !important;
-}
-.text-info {
- color: #17a2b8 !important;
-}
-a.text-info:hover,
-a.text-info:focus {
- color: #0f6674 !important;
-}
-.text-warning {
- color: #ffc107 !important;
-}
-a.text-warning:hover,
-a.text-warning:focus {
- color: #ba8b00 !important;
-}
-.text-danger {
- color: #dc3545 !important;
-}
-a.text-danger:hover,
-a.text-danger:focus {
- color: #a71d2a !important;
-}
-.text-light {
- color: #f8f9fa !important;
-}
-a.text-light:hover,
-a.text-light:focus {
- color: #cbd3da !important;
-}
-.text-dark {
- color: #343a40 !important;
-}
-a.text-dark:hover,
-a.text-dark:focus {
- color: #121416 !important;
-}
-.text-body {
- color: #212529 !important;
-}
-.text-muted {
- color: #6c757d !important;
-}
-.text-black-50 {
- color: rgba(0, 0, 0, 0.5) !important;
-}
-.text-white-50 {
- color: rgba(255, 255, 255, 0.5) !important;
-}
-.text-hide {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-.text-decoration-none {
- text-decoration: none !important;
-}
-.text-break {
- word-break: break-word !important;
- overflow-wrap: break-word !important;
-}
-.text-reset {
- color: inherit !important;
-}
-.visible {
- visibility: visible !important;
-}
-.invisible {
- visibility: hidden !important;
-}
-@media print {
- *,
- *::before,
- *::after {
- text-shadow: none !important;
- -webkit-box-shadow: none !important;
- box-shadow: none !important;
- }
- a:not(.btn) {
- text-decoration: underline;
- }
- abbr[title]::after {
- content: ' (' attr(title) ')';
- }
- pre {
- white-space: pre-wrap !important;
- }
- pre,
- blockquote {
- border: 1px solid #adb5bd;
- page-break-inside: avoid;
- }
- thead {
- display: table-header-group;
- }
- tr,
- img {
- page-break-inside: avoid;
- }
- p,
- h2,
- h3 {
- orphans: 3;
- widows: 3;
- }
- h2,
- h3 {
- page-break-after: avoid;
- }
- @page {
- size: a3;
- }
- body {
- min-width: 992px !important;
- }
- .container {
- min-width: 992px !important;
- }
- .navbar {
- display: none;
- }
- .badge {
- border: 1px solid #000;
- }
- .table {
- border-collapse: collapse !important;
- }
- .table td,
- .table th {
- background-color: #fff !important;
- }
- .table-bordered th,
- .table-bordered td {
- border: 1px solid #dee2e6 !important;
- }
- .table-dark {
- color: inherit;
- }
- .table-dark th,
- .table-dark td,
- .table-dark thead th,
- .table-dark tbody + tbody {
- border-color: #dee2e6;
- }
- .table .thead-dark th {
- color: inherit;
- border-color: #dee2e6;
- }
-}
diff --git a/assets/html/css/style.css b/assets/html/css/style.css
deleted file mode 100644
index deedf5a..0000000
--- a/assets/html/css/style.css
+++ /dev/null
@@ -1,24 +0,0 @@
-img {
- width: 100%;
-}
-.showcase {
- position: relative;
- background: url('../img/showcase.jpg') no-repeat center center/cover;
- min-height: 100vh;
- color: #fff;
-}
-.showcase-inner {
- text-align: center;
- padding-top: 20%;
- height: 100%;
- width: 80%;
- margin: auto;
-}
-.dark-overlay {
- background-color: rgba(0, 0, 0, 0.6);
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
-}
diff --git a/assets/html/index.html b/assets/html/index.html
deleted file mode 100644
index 55a0784..0000000
--- a/assets/html/index.html
+++ /dev/null
@@ -1,183 +0,0 @@
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
Find a Code Bootcamp
-
- Find, rate and read reviews on coding bootcamps
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/js/mapbox.js b/assets/html/js/mapbox.js
deleted file mode 100644
index 033c328..0000000
--- a/assets/html/js/mapbox.js
+++ /dev/null
@@ -1,53 +0,0 @@
-mapboxgl.accessToken =
- 'pk.eyJ1IjoiYnRyYXZlcnN5IiwiYSI6ImNqenY5MThjMDBqZ3YzY3A0N3ppZTA5Y2QifQ.LrFjedgw1wG34TkWCpNtFg';
-var map = new mapboxgl.Map({
- container: 'map',
- style: 'mapbox://styles/mapbox/streets-v11',
- zoom: 7,
- center: [-71.1054, 42.350498]
- // interactive: false
-});
-
-map.on('load', function() {
- map.addLayer({
- id: 'points',
- type: 'symbol',
- source: {
- type: 'geojson',
- data: {
- type: 'FeatureCollection',
- features: [
- {
- type: 'Feature',
- geometry: {
- type: 'Point',
- coordinates: [-71.1054, 42.350498]
- },
- properties: {
- title: 'DevWorks',
- icon: 'college'
- }
- },
- {
- type: 'Feature',
- geometry: {
- type: 'Point',
- coordinates: [-122.414, 37.776]
- },
- properties: {
- title: 'Mapbox SF',
- icon: 'harbor'
- }
- }
- ]
- }
- },
- layout: {
- 'icon-image': '{icon}-15',
- 'text-field': '{title}',
- 'text-font': ['Open Sans Semibold', 'Arial Unicode MS Bold'],
- 'text-offset': [0, 0.6],
- 'text-anchor': 'top'
- }
- });
-});
diff --git a/assets/html/login.html b/assets/html/login.html
deleted file mode 100644
index fb60bb9..0000000
--- a/assets/html/login.html
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/manage-account.html b/assets/html/manage-account.html
deleted file mode 100644
index 731fd14..0000000
--- a/assets/html/manage-account.html
+++ /dev/null
@@ -1,140 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/manage-bootcamp-none.html b/assets/html/manage-bootcamp-none.html
deleted file mode 100644
index 0c667d4..0000000
--- a/assets/html/manage-bootcamp-none.html
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
Manage Bootcamp
-
- You have not yet added a bootcamp
-
-
Add Bootcamp
-
- * You can only add one bootcamp per account.
-
-
- * You must be affiliated with the bootcamp in some way in order
- to add it to DevCamper.
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/manage-bootcamp.html b/assets/html/manage-bootcamp.html
deleted file mode 100644
index 9e6844d..0000000
--- a/assets/html/manage-bootcamp.html
+++ /dev/null
@@ -1,153 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
Manage Bootcamp
-
-
-
-
-
-
-
-
-
Boston, MA
-
- Web Development, UI/UX, Mobile Development
-
-
-
-
-
-
-
-
-
-
Edit Bootcamp Details
-
Manage Courses
-
Remove Bootcamp
-
- * You can only add one bootcamp per account.
-
-
- * You must be affiliated with the bootcamp in some way in order
- to add it to DevCamper.
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/manage-courses-none.html b/assets/html/manage-courses-none.html
deleted file mode 100644
index bb60e93..0000000
--- a/assets/html/manage-courses-none.html
+++ /dev/null
@@ -1,106 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/manage-courses.html b/assets/html/manage-courses.html
deleted file mode 100644
index 0f13898..0000000
--- a/assets/html/manage-courses.html
+++ /dev/null
@@ -1,164 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
Manage Bootcamp
-
Manage Courses
-
-
-
-
-
-
-
-
-
Boston, MA
-
- Web Development, UI/UX, Mobile Development
-
-
-
-
-
-
-
Add Bootcamp Course
-
-
-
- Title
-
-
-
-
-
- Front End Web Development
-
-
-
-
-
-
-
-
- Full Stack Web Development
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/manage-reviews.html b/assets/html/manage-reviews.html
deleted file mode 100644
index 38d9a46..0000000
--- a/assets/html/manage-reviews.html
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
Manage Reviews
-
-
-
- Bootcamp
- Rating
-
-
-
-
-
- DevWorks Bootcamp
- 10
-
-
-
-
-
-
-
-
- Codemasters
- 7
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/register.html b/assets/html/register.html
deleted file mode 100644
index 2305a71..0000000
--- a/assets/html/register.html
+++ /dev/null
@@ -1,166 +0,0 @@
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/reset-password.html b/assets/html/reset-password.html
deleted file mode 100644
index 4b6912b..0000000
--- a/assets/html/reset-password.html
+++ /dev/null
@@ -1,105 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
Back to login
-
Reset Password
-
Use this form to reset your password using the registered email address.
-
-
- Enter Email
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/reviews.html b/assets/html/reviews.html
deleted file mode 100644
index 1f51ebe..0000000
--- a/assets/html/reviews.html
+++ /dev/null
@@ -1,156 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
Bootcamp Info
-
DevWorks Bootcamp Reviews
-
-
-
-
-
- Rating: 10
-
-
- Lorem, ipsum dolor sit amet consectetur adipisicing elit.
- Commodi similique mollitia, praesentium, animi harum officia
- dolores corporis ex tempore consequuntur dolorem ullam dolorum
- magnam corrupti quaerat tempora repudiandae! Similique,
- molestiae. Iste, blanditiis recusandae unde tenetur eius
- exercitationem rerum a fuga.
-
-
Writtern By Kevin Smith
-
-
-
-
-
-
-
- Rating: 9
-
-
- Lorem, ipsum dolor sit amet consectetur adipisicing elit.
- Commodi similique mollitia, praesentium, animi harum officia
- dolores corporis ex tempore consequuntur dolorem ullam dolorum
- magnam corrupti quaerat tempora repudiandae! Similique,
- molestiae. Iste, blanditiis recusandae unde tenetur eius
- exercitationem rerum a fuga.
-
-
Writtern By Jill Samson
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/html/update-password.html b/assets/html/update-password.html
deleted file mode 100644
index 55599e7..0000000
--- a/assets/html/update-password.html
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- DevCamper | Find a coding bootcamp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/logos/Color_Logo/dc_color_logo_jpg.jpg b/assets/logos/Color_Logo/dc_color_logo_jpg.jpg
deleted file mode 100644
index 2729ec6..0000000
Binary files a/assets/logos/Color_Logo/dc_color_logo_jpg.jpg and /dev/null differ
diff --git a/assets/logos/Color_Logo/dc_color_logo_pdf.pdf b/assets/logos/Color_Logo/dc_color_logo_pdf.pdf
deleted file mode 100644
index 020aace..0000000
Binary files a/assets/logos/Color_Logo/dc_color_logo_pdf.pdf and /dev/null differ
diff --git a/assets/logos/Color_Logo/dc_color_logo_png.png b/assets/logos/Color_Logo/dc_color_logo_png.png
deleted file mode 100644
index 0ef313b..0000000
Binary files a/assets/logos/Color_Logo/dc_color_logo_png.png and /dev/null differ
diff --git a/assets/logos/Color_Logo/dc_color_logo_svg.svg b/assets/logos/Color_Logo/dc_color_logo_svg.svg
deleted file mode 100644
index e3857c0..0000000
--- a/assets/logos/Color_Logo/dc_color_logo_svg.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/assets/logos/Color_favicons/android-icon-144x144.png b/assets/logos/Color_favicons/android-icon-144x144.png
deleted file mode 100644
index db84fbc..0000000
Binary files a/assets/logos/Color_favicons/android-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/android-icon-192x192.png b/assets/logos/Color_favicons/android-icon-192x192.png
deleted file mode 100644
index e9e0a0b..0000000
Binary files a/assets/logos/Color_favicons/android-icon-192x192.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/android-icon-36x36.png b/assets/logos/Color_favicons/android-icon-36x36.png
deleted file mode 100644
index 6c2763d..0000000
Binary files a/assets/logos/Color_favicons/android-icon-36x36.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/android-icon-48x48.png b/assets/logos/Color_favicons/android-icon-48x48.png
deleted file mode 100644
index e3d7c2d..0000000
Binary files a/assets/logos/Color_favicons/android-icon-48x48.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/android-icon-72x72.png b/assets/logos/Color_favicons/android-icon-72x72.png
deleted file mode 100644
index 84dfb2f..0000000
Binary files a/assets/logos/Color_favicons/android-icon-72x72.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/android-icon-96x96.png b/assets/logos/Color_favicons/android-icon-96x96.png
deleted file mode 100644
index 9149e73..0000000
Binary files a/assets/logos/Color_favicons/android-icon-96x96.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-114x114.png b/assets/logos/Color_favicons/apple-icon-114x114.png
deleted file mode 100644
index 4c3ea5f..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-114x114.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-120x120.png b/assets/logos/Color_favicons/apple-icon-120x120.png
deleted file mode 100644
index 1bb6646..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-120x120.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-144x144.png b/assets/logos/Color_favicons/apple-icon-144x144.png
deleted file mode 100644
index db84fbc..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-152x152.png b/assets/logos/Color_favicons/apple-icon-152x152.png
deleted file mode 100644
index d7102c7..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-152x152.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-180x180.png b/assets/logos/Color_favicons/apple-icon-180x180.png
deleted file mode 100644
index aef86b0..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-180x180.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-57x57.png b/assets/logos/Color_favicons/apple-icon-57x57.png
deleted file mode 100644
index 1b94b57..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-57x57.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-60x60.png b/assets/logos/Color_favicons/apple-icon-60x60.png
deleted file mode 100644
index 59ac1af..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-60x60.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-72x72.png b/assets/logos/Color_favicons/apple-icon-72x72.png
deleted file mode 100644
index 84dfb2f..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-72x72.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-76x76.png b/assets/logos/Color_favicons/apple-icon-76x76.png
deleted file mode 100644
index 0addd29..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-76x76.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon-precomposed.png b/assets/logos/Color_favicons/apple-icon-precomposed.png
deleted file mode 100644
index b6e0489..0000000
Binary files a/assets/logos/Color_favicons/apple-icon-precomposed.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/apple-icon.png b/assets/logos/Color_favicons/apple-icon.png
deleted file mode 100644
index b6e0489..0000000
Binary files a/assets/logos/Color_favicons/apple-icon.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/browserconfig.xml b/assets/logos/Color_favicons/browserconfig.xml
deleted file mode 100644
index c554148..0000000
--- a/assets/logos/Color_favicons/browserconfig.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-#ffffff
\ No newline at end of file
diff --git a/assets/logos/Color_favicons/favicon-16x16.png b/assets/logos/Color_favicons/favicon-16x16.png
deleted file mode 100644
index 8bdc8d4..0000000
Binary files a/assets/logos/Color_favicons/favicon-16x16.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/favicon-32x32.png b/assets/logos/Color_favicons/favicon-32x32.png
deleted file mode 100644
index 84999b2..0000000
Binary files a/assets/logos/Color_favicons/favicon-32x32.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/favicon-96x96.png b/assets/logos/Color_favicons/favicon-96x96.png
deleted file mode 100644
index 9149e73..0000000
Binary files a/assets/logos/Color_favicons/favicon-96x96.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/favicon.ico b/assets/logos/Color_favicons/favicon.ico
deleted file mode 100644
index c0dbb06..0000000
Binary files a/assets/logos/Color_favicons/favicon.ico and /dev/null differ
diff --git a/assets/logos/Color_favicons/manifest.json b/assets/logos/Color_favicons/manifest.json
deleted file mode 100644
index 013d4a6..0000000
--- a/assets/logos/Color_favicons/manifest.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "App",
- "icons": [
- {
- "src": "\/android-icon-36x36.png",
- "sizes": "36x36",
- "type": "image\/png",
- "density": "0.75"
- },
- {
- "src": "\/android-icon-48x48.png",
- "sizes": "48x48",
- "type": "image\/png",
- "density": "1.0"
- },
- {
- "src": "\/android-icon-72x72.png",
- "sizes": "72x72",
- "type": "image\/png",
- "density": "1.5"
- },
- {
- "src": "\/android-icon-96x96.png",
- "sizes": "96x96",
- "type": "image\/png",
- "density": "2.0"
- },
- {
- "src": "\/android-icon-144x144.png",
- "sizes": "144x144",
- "type": "image\/png",
- "density": "3.0"
- },
- {
- "src": "\/android-icon-192x192.png",
- "sizes": "192x192",
- "type": "image\/png",
- "density": "4.0"
- }
- ]
-}
\ No newline at end of file
diff --git a/assets/logos/Color_favicons/ms-icon-144x144.png b/assets/logos/Color_favicons/ms-icon-144x144.png
deleted file mode 100644
index db84fbc..0000000
Binary files a/assets/logos/Color_favicons/ms-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/ms-icon-150x150.png b/assets/logos/Color_favicons/ms-icon-150x150.png
deleted file mode 100644
index 9c77e09..0000000
Binary files a/assets/logos/Color_favicons/ms-icon-150x150.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/ms-icon-310x310.png b/assets/logos/Color_favicons/ms-icon-310x310.png
deleted file mode 100644
index 8bfa2b2..0000000
Binary files a/assets/logos/Color_favicons/ms-icon-310x310.png and /dev/null differ
diff --git a/assets/logos/Color_favicons/ms-icon-70x70.png b/assets/logos/Color_favicons/ms-icon-70x70.png
deleted file mode 100644
index 6dfef83..0000000
Binary files a/assets/logos/Color_favicons/ms-icon-70x70.png and /dev/null differ
diff --git a/assets/logos/Dark_Logo/dc_dark_logo_jpg.jpg b/assets/logos/Dark_Logo/dc_dark_logo_jpg.jpg
deleted file mode 100644
index 9eddb39..0000000
Binary files a/assets/logos/Dark_Logo/dc_dark_logo_jpg.jpg and /dev/null differ
diff --git a/assets/logos/Dark_Logo/dc_dark_logo_pdf.pdf b/assets/logos/Dark_Logo/dc_dark_logo_pdf.pdf
deleted file mode 100644
index 1aa511f..0000000
Binary files a/assets/logos/Dark_Logo/dc_dark_logo_pdf.pdf and /dev/null differ
diff --git a/assets/logos/Dark_Logo/dc_dark_logo_png.png b/assets/logos/Dark_Logo/dc_dark_logo_png.png
deleted file mode 100644
index 6682072..0000000
Binary files a/assets/logos/Dark_Logo/dc_dark_logo_png.png and /dev/null differ
diff --git a/assets/logos/Dark_Logo/dc_dark_logo_svg.svg b/assets/logos/Dark_Logo/dc_dark_logo_svg.svg
deleted file mode 100644
index 539a619..0000000
--- a/assets/logos/Dark_Logo/dc_dark_logo_svg.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/assets/logos/Dark_favicons/android-icon-144x144.png b/assets/logos/Dark_favicons/android-icon-144x144.png
deleted file mode 100644
index 216c966..0000000
Binary files a/assets/logos/Dark_favicons/android-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/android-icon-192x192.png b/assets/logos/Dark_favicons/android-icon-192x192.png
deleted file mode 100644
index 2bac53f..0000000
Binary files a/assets/logos/Dark_favicons/android-icon-192x192.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/android-icon-36x36.png b/assets/logos/Dark_favicons/android-icon-36x36.png
deleted file mode 100644
index ff81e7f..0000000
Binary files a/assets/logos/Dark_favicons/android-icon-36x36.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/android-icon-48x48.png b/assets/logos/Dark_favicons/android-icon-48x48.png
deleted file mode 100644
index 139c0a3..0000000
Binary files a/assets/logos/Dark_favicons/android-icon-48x48.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/android-icon-72x72.png b/assets/logos/Dark_favicons/android-icon-72x72.png
deleted file mode 100644
index 074e22a..0000000
Binary files a/assets/logos/Dark_favicons/android-icon-72x72.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/android-icon-96x96.png b/assets/logos/Dark_favicons/android-icon-96x96.png
deleted file mode 100644
index 146d4c8..0000000
Binary files a/assets/logos/Dark_favicons/android-icon-96x96.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-114x114.png b/assets/logos/Dark_favicons/apple-icon-114x114.png
deleted file mode 100644
index 8394fe5..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-114x114.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-120x120.png b/assets/logos/Dark_favicons/apple-icon-120x120.png
deleted file mode 100644
index 09ec246..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-120x120.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-144x144.png b/assets/logos/Dark_favicons/apple-icon-144x144.png
deleted file mode 100644
index da0d621..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-152x152.png b/assets/logos/Dark_favicons/apple-icon-152x152.png
deleted file mode 100644
index 8fd65d0..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-152x152.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-180x180.png b/assets/logos/Dark_favicons/apple-icon-180x180.png
deleted file mode 100644
index b76c1dd..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-180x180.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-57x57.png b/assets/logos/Dark_favicons/apple-icon-57x57.png
deleted file mode 100644
index 96a7881..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-57x57.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-60x60.png b/assets/logos/Dark_favicons/apple-icon-60x60.png
deleted file mode 100644
index e8ef077..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-60x60.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-72x72.png b/assets/logos/Dark_favicons/apple-icon-72x72.png
deleted file mode 100644
index 2b34153..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-72x72.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-76x76.png b/assets/logos/Dark_favicons/apple-icon-76x76.png
deleted file mode 100644
index 92c6af5..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-76x76.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon-precomposed.png b/assets/logos/Dark_favicons/apple-icon-precomposed.png
deleted file mode 100644
index 89245d9..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon-precomposed.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/apple-icon.png b/assets/logos/Dark_favicons/apple-icon.png
deleted file mode 100644
index 89245d9..0000000
Binary files a/assets/logos/Dark_favicons/apple-icon.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/browserconfig.xml b/assets/logos/Dark_favicons/browserconfig.xml
deleted file mode 100644
index c554148..0000000
--- a/assets/logos/Dark_favicons/browserconfig.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-#ffffff
\ No newline at end of file
diff --git a/assets/logos/Dark_favicons/favicon-16x16.png b/assets/logos/Dark_favicons/favicon-16x16.png
deleted file mode 100644
index 847c9be..0000000
Binary files a/assets/logos/Dark_favicons/favicon-16x16.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/favicon-32x32.png b/assets/logos/Dark_favicons/favicon-32x32.png
deleted file mode 100644
index 1ce9784..0000000
Binary files a/assets/logos/Dark_favicons/favicon-32x32.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/favicon-96x96.png b/assets/logos/Dark_favicons/favicon-96x96.png
deleted file mode 100644
index 4023d24..0000000
Binary files a/assets/logos/Dark_favicons/favicon-96x96.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/favicon.ico b/assets/logos/Dark_favicons/favicon.ico
deleted file mode 100644
index c4ea209..0000000
Binary files a/assets/logos/Dark_favicons/favicon.ico and /dev/null differ
diff --git a/assets/logos/Dark_favicons/manifest.json b/assets/logos/Dark_favicons/manifest.json
deleted file mode 100644
index 013d4a6..0000000
--- a/assets/logos/Dark_favicons/manifest.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "App",
- "icons": [
- {
- "src": "\/android-icon-36x36.png",
- "sizes": "36x36",
- "type": "image\/png",
- "density": "0.75"
- },
- {
- "src": "\/android-icon-48x48.png",
- "sizes": "48x48",
- "type": "image\/png",
- "density": "1.0"
- },
- {
- "src": "\/android-icon-72x72.png",
- "sizes": "72x72",
- "type": "image\/png",
- "density": "1.5"
- },
- {
- "src": "\/android-icon-96x96.png",
- "sizes": "96x96",
- "type": "image\/png",
- "density": "2.0"
- },
- {
- "src": "\/android-icon-144x144.png",
- "sizes": "144x144",
- "type": "image\/png",
- "density": "3.0"
- },
- {
- "src": "\/android-icon-192x192.png",
- "sizes": "192x192",
- "type": "image\/png",
- "density": "4.0"
- }
- ]
-}
\ No newline at end of file
diff --git a/assets/logos/Dark_favicons/ms-icon-144x144.png b/assets/logos/Dark_favicons/ms-icon-144x144.png
deleted file mode 100644
index da0d621..0000000
Binary files a/assets/logos/Dark_favicons/ms-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/ms-icon-150x150.png b/assets/logos/Dark_favicons/ms-icon-150x150.png
deleted file mode 100644
index 3cc33bf..0000000
Binary files a/assets/logos/Dark_favicons/ms-icon-150x150.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/ms-icon-310x310.png b/assets/logos/Dark_favicons/ms-icon-310x310.png
deleted file mode 100644
index cc3814a..0000000
Binary files a/assets/logos/Dark_favicons/ms-icon-310x310.png and /dev/null differ
diff --git a/assets/logos/Dark_favicons/ms-icon-70x70.png b/assets/logos/Dark_favicons/ms-icon-70x70.png
deleted file mode 100644
index 8a9e223..0000000
Binary files a/assets/logos/Dark_favicons/ms-icon-70x70.png and /dev/null differ
diff --git a/assets/logos/Light_Logo/dc_light_logo_jpg.jpg b/assets/logos/Light_Logo/dc_light_logo_jpg.jpg
deleted file mode 100644
index 6595959..0000000
Binary files a/assets/logos/Light_Logo/dc_light_logo_jpg.jpg and /dev/null differ
diff --git a/assets/logos/Light_Logo/dc_light_logo_pdf.pdf b/assets/logos/Light_Logo/dc_light_logo_pdf.pdf
deleted file mode 100644
index 357420e..0000000
Binary files a/assets/logos/Light_Logo/dc_light_logo_pdf.pdf and /dev/null differ
diff --git a/assets/logos/Light_Logo/dc_light_logo_png.png b/assets/logos/Light_Logo/dc_light_logo_png.png
deleted file mode 100644
index 20c15a0..0000000
Binary files a/assets/logos/Light_Logo/dc_light_logo_png.png and /dev/null differ
diff --git a/assets/logos/Light_Logo/dc_light_logo_svg.svg b/assets/logos/Light_Logo/dc_light_logo_svg.svg
deleted file mode 100644
index fb7e78d..0000000
--- a/assets/logos/Light_Logo/dc_light_logo_svg.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/assets/logos/Light_favicons/android-icon-144x144.png b/assets/logos/Light_favicons/android-icon-144x144.png
deleted file mode 100644
index 1bd20cb..0000000
Binary files a/assets/logos/Light_favicons/android-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/android-icon-192x192.png b/assets/logos/Light_favicons/android-icon-192x192.png
deleted file mode 100644
index 2a89d29..0000000
Binary files a/assets/logos/Light_favicons/android-icon-192x192.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/android-icon-36x36.png b/assets/logos/Light_favicons/android-icon-36x36.png
deleted file mode 100644
index f89cbe7..0000000
Binary files a/assets/logos/Light_favicons/android-icon-36x36.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/android-icon-48x48.png b/assets/logos/Light_favicons/android-icon-48x48.png
deleted file mode 100644
index 97be490..0000000
Binary files a/assets/logos/Light_favicons/android-icon-48x48.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/android-icon-72x72.png b/assets/logos/Light_favicons/android-icon-72x72.png
deleted file mode 100644
index 154f430..0000000
Binary files a/assets/logos/Light_favicons/android-icon-72x72.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/android-icon-96x96.png b/assets/logos/Light_favicons/android-icon-96x96.png
deleted file mode 100644
index 9adc374..0000000
Binary files a/assets/logos/Light_favicons/android-icon-96x96.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-114x114.png b/assets/logos/Light_favicons/apple-icon-114x114.png
deleted file mode 100644
index de31ba7..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-114x114.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-120x120.png b/assets/logos/Light_favicons/apple-icon-120x120.png
deleted file mode 100644
index b264fbe..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-120x120.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-144x144.png b/assets/logos/Light_favicons/apple-icon-144x144.png
deleted file mode 100644
index 1bd20cb..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-152x152.png b/assets/logos/Light_favicons/apple-icon-152x152.png
deleted file mode 100644
index 2402853..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-152x152.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-180x180.png b/assets/logos/Light_favicons/apple-icon-180x180.png
deleted file mode 100644
index fbb6405..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-180x180.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-57x57.png b/assets/logos/Light_favicons/apple-icon-57x57.png
deleted file mode 100644
index eba1028..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-57x57.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-60x60.png b/assets/logos/Light_favicons/apple-icon-60x60.png
deleted file mode 100644
index 77d31fa..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-60x60.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-72x72.png b/assets/logos/Light_favicons/apple-icon-72x72.png
deleted file mode 100644
index 154f430..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-72x72.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-76x76.png b/assets/logos/Light_favicons/apple-icon-76x76.png
deleted file mode 100644
index 71bdc8c..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-76x76.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon-precomposed.png b/assets/logos/Light_favicons/apple-icon-precomposed.png
deleted file mode 100644
index 834120f..0000000
Binary files a/assets/logos/Light_favicons/apple-icon-precomposed.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/apple-icon.png b/assets/logos/Light_favicons/apple-icon.png
deleted file mode 100644
index 834120f..0000000
Binary files a/assets/logos/Light_favicons/apple-icon.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/browserconfig.xml b/assets/logos/Light_favicons/browserconfig.xml
deleted file mode 100644
index c554148..0000000
--- a/assets/logos/Light_favicons/browserconfig.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-#ffffff
\ No newline at end of file
diff --git a/assets/logos/Light_favicons/favicon-16x16.png b/assets/logos/Light_favicons/favicon-16x16.png
deleted file mode 100644
index 5d7a812..0000000
Binary files a/assets/logos/Light_favicons/favicon-16x16.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/favicon-32x32.png b/assets/logos/Light_favicons/favicon-32x32.png
deleted file mode 100644
index f65dcf3..0000000
Binary files a/assets/logos/Light_favicons/favicon-32x32.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/favicon-96x96.png b/assets/logos/Light_favicons/favicon-96x96.png
deleted file mode 100644
index 9adc374..0000000
Binary files a/assets/logos/Light_favicons/favicon-96x96.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/favicon.ico b/assets/logos/Light_favicons/favicon.ico
deleted file mode 100644
index a8dfcfa..0000000
Binary files a/assets/logos/Light_favicons/favicon.ico and /dev/null differ
diff --git a/assets/logos/Light_favicons/manifest.json b/assets/logos/Light_favicons/manifest.json
deleted file mode 100644
index 013d4a6..0000000
--- a/assets/logos/Light_favicons/manifest.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "name": "App",
- "icons": [
- {
- "src": "\/android-icon-36x36.png",
- "sizes": "36x36",
- "type": "image\/png",
- "density": "0.75"
- },
- {
- "src": "\/android-icon-48x48.png",
- "sizes": "48x48",
- "type": "image\/png",
- "density": "1.0"
- },
- {
- "src": "\/android-icon-72x72.png",
- "sizes": "72x72",
- "type": "image\/png",
- "density": "1.5"
- },
- {
- "src": "\/android-icon-96x96.png",
- "sizes": "96x96",
- "type": "image\/png",
- "density": "2.0"
- },
- {
- "src": "\/android-icon-144x144.png",
- "sizes": "144x144",
- "type": "image\/png",
- "density": "3.0"
- },
- {
- "src": "\/android-icon-192x192.png",
- "sizes": "192x192",
- "type": "image\/png",
- "density": "4.0"
- }
- ]
-}
\ No newline at end of file
diff --git a/assets/logos/Light_favicons/ms-icon-144x144.png b/assets/logos/Light_favicons/ms-icon-144x144.png
deleted file mode 100644
index 1bd20cb..0000000
Binary files a/assets/logos/Light_favicons/ms-icon-144x144.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/ms-icon-150x150.png b/assets/logos/Light_favicons/ms-icon-150x150.png
deleted file mode 100644
index a5f2d52..0000000
Binary files a/assets/logos/Light_favicons/ms-icon-150x150.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/ms-icon-310x310.png b/assets/logos/Light_favicons/ms-icon-310x310.png
deleted file mode 100644
index ac1e6cd..0000000
Binary files a/assets/logos/Light_favicons/ms-icon-310x310.png and /dev/null differ
diff --git a/assets/logos/Light_favicons/ms-icon-70x70.png b/assets/logos/Light_favicons/ms-icon-70x70.png
deleted file mode 100644
index b2b7eb2..0000000
Binary files a/assets/logos/Light_favicons/ms-icon-70x70.png and /dev/null differ
diff --git a/docker/.env.example b/deploy/docker/.env.example
similarity index 100%
rename from docker/.env.example
rename to deploy/docker/.env.example
diff --git a/docker/docker-compose.yml b/deploy/docker/docker-compose.yml
similarity index 100%
rename from docker/docker-compose.yml
rename to deploy/docker/docker-compose.yml
diff --git a/.k8s/without-volume/README.md b/deploy/k8s/emptydir-volume/README.md
similarity index 57%
rename from .k8s/without-volume/README.md
rename to deploy/k8s/emptydir-volume/README.md
index 9780e6d..0498150 100644
--- a/.k8s/without-volume/README.md
+++ b/deploy/k8s/emptydir-volume/README.md
@@ -1,8 +1,19 @@
-# Setup Instructions
+# Overview
-Follow the below instructions to setup the application in Kubernetes cluster without using Persistent Volume. Note that the data will be stored in the container and will be lost when the container restarts or when the pod is deleted.
+Follow the below instructions to understand data storage behavior in K8s cluster when `emptyDir` volume is defined and how to setup the application in Kubernetes cluster using EmptyDir Volume.
-## Database Secrets
+## Data Storage in Kubernetes without Volume
+
+- `emptyDir` Volume: The `emptyDir` volume is defined under the volumes section. This volume is created when the pod is assigned to a node and exists as long as the pod is running on that node.
+- Mount Path: The volume is mounted at /data/db inside the MongoDB container, which is the default data directory for MongoDB.
+- Pod Lifecycle: The data in the `emptyDir` volume is tied to the lifecycle of the pod. If the pod is deleted, the data in the `emptyDir` volume is also deleted. However, if the pod is simply restarted, the data persists.
+- Container Dependency: The data in the `emptyDir` volume is tied to the pod's lifecycle, not the individual container's lifecycle. If the pod is deleted, the data is lost. If the pod is restarted, the data persists.
+
+## Setup Instructions
+
+Follow the below instructions to setup the application in Kubernetes cluster using `emptyDir` Volume.
+
+### Database Secrets
1. Create Mongo database username and password in base64 format:
@@ -13,7 +24,7 @@ Follow the below instructions to setup the application in Kubernetes cluster wit
2. Provide the created username and password in the secrets file secrets.yaml
-## Web API Secrets
+### Web API Secrets
1. Provide database username and password created earlier in webapi/secret.yaml file
@@ -42,10 +53,10 @@ Follow the below instructions to setup the application in Kubernetes cluster wit
5. Create JWT secret and encode it in base64 format and provide it in webapi/secret.yaml file:
```bash
- echo -n 'JWT_SECRET' | base64
+ echo -n 'JWT_SECRET ' | base64
```
-## Deploy the Application
+### Deploy the Application
1. Deploy the application by running the following command:
@@ -53,7 +64,7 @@ Follow the below instructions to setup the application in Kubernetes cluster wit
install.sh
```
-## Test the Application
+### Test the Application
1. Navigate to the api folder and import data by running the following command. This will create devcamper database and insert data into it:
@@ -67,15 +78,17 @@ Follow the below instructions to setup the application in Kubernetes cluster wit
mongodb://admin:password@localhost:32017/
```
-3. Delete the database pod using the following command:
+3. Restart the container using Docker Desktop to see the data in the database.
+
+4. Delete the database pod using the following command:
```bash
kubectl delete pod -l app=devcamper-db -n devcamper-namespace
```
-4. Note that deployment creates a new pod but the data is lost as the data is stored in the container and not in the Persistent Volume.
+5. Note that deployment creates a new pod but the data is lost as the data is stored in the container and not in the Persistent Volume.
-## Uninstall the Application
+### Uninstall the Application
1. Uninstall the application by running the following command:
diff --git a/.k8s/emptydir-volume/database/configmap.yaml b/deploy/k8s/emptydir-volume/database/configmap.yaml
similarity index 100%
rename from .k8s/emptydir-volume/database/configmap.yaml
rename to deploy/k8s/emptydir-volume/database/configmap.yaml
diff --git a/.k8s/emptydir-volume/database/deployment.yaml b/deploy/k8s/emptydir-volume/database/deployment.yaml
similarity index 100%
rename from .k8s/emptydir-volume/database/deployment.yaml
rename to deploy/k8s/emptydir-volume/database/deployment.yaml
diff --git a/deploy/k8s/emptydir-volume/database/install.sh b/deploy/k8s/emptydir-volume/database/install.sh
new file mode 100644
index 0000000..3cb582c
--- /dev/null
+++ b/deploy/k8s/emptydir-volume/database/install.sh
@@ -0,0 +1,9 @@
+#!bin/bash
+kubectl apply -f configmap.yaml
+kubectl apply -f secret.yaml
+kubectl apply -f deployment.yaml
+kubectl apply -f service.yaml
+
+
+# Port foward deployment to test DB connectivity from local machine
+# kubectl port-forward deployment/devcamper-db-deployment 32017:27017 -n devcamper-namespace
\ No newline at end of file
diff --git a/.k8s/emptydir-volume/database/secret.yaml b/deploy/k8s/emptydir-volume/database/secret.yaml
similarity index 100%
rename from .k8s/emptydir-volume/database/secret.yaml
rename to deploy/k8s/emptydir-volume/database/secret.yaml
diff --git a/deploy/k8s/emptydir-volume/database/service.yaml b/deploy/k8s/emptydir-volume/database/service.yaml
new file mode 100644
index 0000000..4e619a7
--- /dev/null
+++ b/deploy/k8s/emptydir-volume/database/service.yaml
@@ -0,0 +1,31 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: devcamper-db-service
+ namespace: devcamper-namespace
+spec:
+ type: ClusterIP
+ selector:
+ app: devcamper-db
+ ports:
+ - protocol: TCP
+ port: 27017
+ targetPort: 27017
+
+---
+# Database Nodeport service was created just to access the database from the host machine. It is not recommended to use this service in production.
+
+apiVersion: v1
+kind: Service
+metadata:
+ name: devcamper-db-nodeport-service
+ namespace: devcamper-namespace
+spec:
+ type: NodePort
+ selector:
+ app: devcamper-db
+ ports:
+ - protocol: TCP
+ port: 27017
+ targetPort: 27017
+ nodePort: 32017
diff --git a/.k8s/emptydir-volume/database/uninstall.sh b/deploy/k8s/emptydir-volume/database/uninstall.sh
similarity index 100%
rename from .k8s/emptydir-volume/database/uninstall.sh
rename to deploy/k8s/emptydir-volume/database/uninstall.sh
diff --git a/.k8s/emptydir-volume/install.sh b/deploy/k8s/emptydir-volume/install.sh
similarity index 100%
rename from .k8s/emptydir-volume/install.sh
rename to deploy/k8s/emptydir-volume/install.sh
diff --git a/.k8s/emptydir-volume/namespace/install.sh b/deploy/k8s/emptydir-volume/namespace/install.sh
similarity index 100%
rename from .k8s/emptydir-volume/namespace/install.sh
rename to deploy/k8s/emptydir-volume/namespace/install.sh
diff --git a/.k8s/emptydir-volume/namespace/namespace.yaml b/deploy/k8s/emptydir-volume/namespace/namespace.yaml
similarity index 100%
rename from .k8s/emptydir-volume/namespace/namespace.yaml
rename to deploy/k8s/emptydir-volume/namespace/namespace.yaml
diff --git a/.k8s/emptydir-volume/namespace/uninstall.sh b/deploy/k8s/emptydir-volume/namespace/uninstall.sh
similarity index 100%
rename from .k8s/emptydir-volume/namespace/uninstall.sh
rename to deploy/k8s/emptydir-volume/namespace/uninstall.sh
diff --git a/.k8s/emptydir-volume/network/ingress.yaml b/deploy/k8s/emptydir-volume/network/ingress.yaml
similarity index 91%
rename from .k8s/emptydir-volume/network/ingress.yaml
rename to deploy/k8s/emptydir-volume/network/ingress.yaml
index 661c3c4..468b6fd 100644
--- a/.k8s/emptydir-volume/network/ingress.yaml
+++ b/deploy/k8s/emptydir-volume/network/ingress.yaml
@@ -17,7 +17,7 @@ spec:
service:
name: devcamper-webapp-service
port:
- number: 80
+ number: 3000
- host: devcamper.webapi
http:
paths:
@@ -27,4 +27,4 @@ spec:
service:
name: devcamper-webapi-service
port:
- number: 80
+ number: 5000
diff --git a/deploy/k8s/emptydir-volume/network/install.sh b/deploy/k8s/emptydir-volume/network/install.sh
new file mode 100644
index 0000000..b788010
--- /dev/null
+++ b/deploy/k8s/emptydir-volume/network/install.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+# Install an NGINX Ingress Controller
+kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
+
+# Wait for the NGINX Ingress Controller to be ready
+echo "Waiting for NGINX Ingress Controller to be ready..."
+kubectl wait --namespace ingress-nginx \
+ --for=condition=ready pod \
+ --selector=app.kubernetes.io/component=controller \
+ --timeout=90s
+
+# Apply the ingress configuration
+kubectl apply -f ingress.yaml
\ No newline at end of file
diff --git a/deploy/k8s/emptydir-volume/network/uninstall.sh b/deploy/k8s/emptydir-volume/network/uninstall.sh
new file mode 100644
index 0000000..a0ef770
--- /dev/null
+++ b/deploy/k8s/emptydir-volume/network/uninstall.sh
@@ -0,0 +1,3 @@
+#!bin/bash
+kubectl delete -f ingress.yaml
+kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
\ No newline at end of file
diff --git a/.k8s/emptydir-volume/uninstall.sh b/deploy/k8s/emptydir-volume/uninstall.sh
similarity index 100%
rename from .k8s/emptydir-volume/uninstall.sh
rename to deploy/k8s/emptydir-volume/uninstall.sh
diff --git a/.k8s/emptydir-volume/webapi/configmap.yaml b/deploy/k8s/emptydir-volume/webapi/configmap.yaml
similarity index 95%
rename from .k8s/emptydir-volume/webapi/configmap.yaml
rename to deploy/k8s/emptydir-volume/webapi/configmap.yaml
index b0f3f98..2b5b9a8 100644
--- a/.k8s/emptydir-volume/webapi/configmap.yaml
+++ b/deploy/k8s/emptydir-volume/webapi/configmap.yaml
@@ -9,6 +9,7 @@ data:
mongodb_db_name: 'devcamper-db'
mongodb_db_params: 'authSource=admin'
geocoder_provider: 'mapquest'
+ jwt_expire: '30d'
jwt_cookie_expire: '30'
file_upload_path: './public/uploads'
max_file_upload: '1000000'
diff --git a/.k8s/without-volume/webapi/deployment.yaml b/deploy/k8s/emptydir-volume/webapi/deployment.yaml
similarity index 94%
rename from .k8s/without-volume/webapi/deployment.yaml
rename to deploy/k8s/emptydir-volume/webapi/deployment.yaml
index 5ec2e8c..f2b775a 100644
--- a/.k8s/without-volume/webapi/deployment.yaml
+++ b/deploy/k8s/emptydir-volume/webapi/deployment.yaml
@@ -29,6 +29,8 @@ spec:
ports:
- containerPort: 5000
env:
+ - name: NODE_ENV
+ value: 'production'
- name: mongodb_host
valueFrom:
configMapKeyRef:
@@ -54,6 +56,11 @@ spec:
configMapKeyRef:
name: devcamper-webapi-configmap
key: geocoder_provider
+ - name: jwt_expire
+ valueFrom:
+ configMapKeyRef:
+ name: devcamper-webapi-configmap
+ key: jwt_expire
- name: jwt_cookie_expire
valueFrom:
configMapKeyRef:
diff --git a/deploy/k8s/emptydir-volume/webapi/install.sh b/deploy/k8s/emptydir-volume/webapi/install.sh
new file mode 100644
index 0000000..8e03034
--- /dev/null
+++ b/deploy/k8s/emptydir-volume/webapi/install.sh
@@ -0,0 +1,8 @@
+#!bin/bash
+kubectl apply -f configmap.yaml
+kubectl apply -f secret.yaml
+kubectl apply -f deployment.yaml
+kubectl apply -f service.yaml
+
+# Port forward service to test API connectivity from local machine
+# kubectl port-forward service/devcamper-webapi-service 5000:5000 -n devcamper-namespace
\ No newline at end of file
diff --git a/.k8s/emptydir-volume/webapi/secret.yaml b/deploy/k8s/emptydir-volume/webapi/secret.yaml
similarity index 91%
rename from .k8s/emptydir-volume/webapi/secret.yaml
rename to deploy/k8s/emptydir-volume/webapi/secret.yaml
index 0df93f3..8e1d2ad 100644
--- a/.k8s/emptydir-volume/webapi/secret.yaml
+++ b/deploy/k8s/emptydir-volume/webapi/secret.yaml
@@ -15,3 +15,5 @@ data:
from_email: YWRtaW5AZGV2Y2FtcGVyLmNvbQ==
from_name: RGV2Q2FtcGVyIEFkbWlu
jwt_secret: ZGV2Y2FtcGVyand0c2VjcmV0
+ rate_limit_window: MTAw
+ rate_limit_max: MTAwMA==
diff --git a/.k8s/emptydir-volume/webapi/service.yaml b/deploy/k8s/emptydir-volume/webapi/service.yaml
similarity index 92%
rename from .k8s/emptydir-volume/webapi/service.yaml
rename to deploy/k8s/emptydir-volume/webapi/service.yaml
index 6bb8d9e..f833e25 100644
--- a/.k8s/emptydir-volume/webapi/service.yaml
+++ b/deploy/k8s/emptydir-volume/webapi/service.yaml
@@ -6,7 +6,7 @@ metadata:
spec:
ports:
- protocol: TCP
- port: 80
+ port: 5000
targetPort: 5000
selector:
app: devcamper-webapi
diff --git a/.k8s/emptydir-volume/webapi/uninstall.sh b/deploy/k8s/emptydir-volume/webapi/uninstall.sh
similarity index 100%
rename from .k8s/emptydir-volume/webapi/uninstall.sh
rename to deploy/k8s/emptydir-volume/webapi/uninstall.sh
diff --git a/deploy/k8s/emptydir-volume/webapp/configmap.yaml b/deploy/k8s/emptydir-volume/webapp/configmap.yaml
new file mode 100644
index 0000000..608b029
--- /dev/null
+++ b/deploy/k8s/emptydir-volume/webapp/configmap.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: devcamper-webapp-configmap
+ namespace: devcamper-namespace
+data:
+ devcamper-config-json: |
+ {
+ "development": {
+ "react_app_devcamper_base_api_uri": "http://localhost:5000/api/v1"
+ },
+ "production": {
+ "react_app_devcamper_base_api_uri": "http://devcamper.webapi/api/v1"
+ }
+ }
diff --git a/deploy/k8s/emptydir-volume/webapp/deployment.yaml b/deploy/k8s/emptydir-volume/webapp/deployment.yaml
new file mode 100644
index 0000000..61c5655
--- /dev/null
+++ b/deploy/k8s/emptydir-volume/webapp/deployment.yaml
@@ -0,0 +1,38 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: devcamper-webapp-deployment
+ namespace: devcamper-namespace
+spec:
+ replicas: 1
+ selector:
+ matchLabels:
+ app: devcamper-webapp
+ template:
+ metadata:
+ labels:
+ app: devcamper-webapp
+ spec:
+ containers:
+ - name: devcamper-webapp-container
+ image: prasadhonrao/devcamper-webapp:latest
+ ports:
+ - containerPort: 3000
+ env:
+ - name: NODE_ENV
+ value: 'production'
+ resources:
+ limits:
+ memory: '2Gi'
+ cpu: '2'
+ requests:
+ memory: '1Gi'
+ cpu: '1'
+ volumeMounts:
+ - name: config-volume
+ mountPath: /app/build/config/config.json # /app/build is the path where the app is deployed. Check the Dockerfile of the webapp where node server is monitoring build folder and app is the working directory. Ensures that the mountPath is set to the full path where the config.json file should be placed.
+ subPath: devcamper-config-json # this is the key in the configmap data section
+ volumes:
+ - name: config-volume
+ configMap:
+ name: devcamper-webapp-configmap
diff --git a/.k8s/emptydir-volume/webapp/install.sh b/deploy/k8s/emptydir-volume/webapp/install.sh
similarity index 100%
rename from .k8s/emptydir-volume/webapp/install.sh
rename to deploy/k8s/emptydir-volume/webapp/install.sh
diff --git a/.k8s/emptydir-volume/webapp/service.yaml b/deploy/k8s/emptydir-volume/webapp/service.yaml
similarity index 92%
rename from .k8s/emptydir-volume/webapp/service.yaml
rename to deploy/k8s/emptydir-volume/webapp/service.yaml
index 0e8e168..e7c5834 100644
--- a/.k8s/emptydir-volume/webapp/service.yaml
+++ b/deploy/k8s/emptydir-volume/webapp/service.yaml
@@ -6,7 +6,7 @@ metadata:
spec:
ports:
- protocol: TCP
- port: 80
+ port: 3000
targetPort: 3000
selector:
app: devcamper-webapp
diff --git a/.k8s/emptydir-volume/webapp/uninstall.sh b/deploy/k8s/emptydir-volume/webapp/uninstall.sh
similarity index 100%
rename from .k8s/emptydir-volume/webapp/uninstall.sh
rename to deploy/k8s/emptydir-volume/webapp/uninstall.sh
diff --git a/.k8s/pv-pvc-azure-disk/README.md b/deploy/k8s/pv-pvc-azure-disk/README.md
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/README.md
rename to deploy/k8s/pv-pvc-azure-disk/README.md
diff --git a/.k8s/pv-pvc-azure-disk/database/configmap.yaml b/deploy/k8s/pv-pvc-azure-disk/database/configmap.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/configmap.yaml
rename to deploy/k8s/pv-pvc-azure-disk/database/configmap.yaml
diff --git a/.k8s/pv-pvc-azure-disk/database/deployment.yaml b/deploy/k8s/pv-pvc-azure-disk/database/deployment.yaml
similarity index 95%
rename from .k8s/pv-pvc-azure-disk/database/deployment.yaml
rename to deploy/k8s/pv-pvc-azure-disk/database/deployment.yaml
index 72dbc30..17372ab 100644
--- a/.k8s/pv-pvc-azure-disk/database/deployment.yaml
+++ b/deploy/k8s/pv-pvc-azure-disk/database/deployment.yaml
@@ -45,9 +45,9 @@ spec:
memory: '1Gi'
cpu: '1'
volumeMounts:
- - name: mongo-volume
+ - name: mongodb-volume
mountPath: /data/db
volumes:
- - name: mongo-volume
+ - name: mongodb-volume
persistentVolumeClaim:
claimName: devcamper-pvc
diff --git a/.k8s/pv-pvc-azure-disk/database/install.sh b/deploy/k8s/pv-pvc-azure-disk/database/install.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/install.sh
rename to deploy/k8s/pv-pvc-azure-disk/database/install.sh
diff --git a/.k8s/pv-pvc-azure-disk/database/pv.yaml b/deploy/k8s/pv-pvc-azure-disk/database/pv.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/pv.yaml
rename to deploy/k8s/pv-pvc-azure-disk/database/pv.yaml
diff --git a/.k8s/pv-pvc-azure-disk/database/pvc.yaml b/deploy/k8s/pv-pvc-azure-disk/database/pvc.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/pvc.yaml
rename to deploy/k8s/pv-pvc-azure-disk/database/pvc.yaml
diff --git a/.k8s/pv-pvc-azure-disk/database/secret.yaml b/deploy/k8s/pv-pvc-azure-disk/database/secret.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/secret.yaml
rename to deploy/k8s/pv-pvc-azure-disk/database/secret.yaml
diff --git a/.k8s/pv-pvc-azure-disk/database/service-clusterip.yaml b/deploy/k8s/pv-pvc-azure-disk/database/service-clusterip.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/service-clusterip.yaml
rename to deploy/k8s/pv-pvc-azure-disk/database/service-clusterip.yaml
diff --git a/.k8s/pv-pvc-azure-disk/database/service-loadbalancer.yaml b/deploy/k8s/pv-pvc-azure-disk/database/service-loadbalancer.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/service-loadbalancer.yaml
rename to deploy/k8s/pv-pvc-azure-disk/database/service-loadbalancer.yaml
diff --git a/.k8s/pv-pvc-azure-disk/database/service-nodeport.yaml b/deploy/k8s/pv-pvc-azure-disk/database/service-nodeport.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/service-nodeport.yaml
rename to deploy/k8s/pv-pvc-azure-disk/database/service-nodeport.yaml
diff --git a/.k8s/pv-pvc-azure-disk/database/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/database/uninstall.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/database/uninstall.sh
rename to deploy/k8s/pv-pvc-azure-disk/database/uninstall.sh
diff --git a/.k8s/pv-pvc-azure-disk/install.sh b/deploy/k8s/pv-pvc-azure-disk/install.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/install.sh
rename to deploy/k8s/pv-pvc-azure-disk/install.sh
diff --git a/.k8s/pv-pvc-azure-disk/namespace/install.sh b/deploy/k8s/pv-pvc-azure-disk/namespace/install.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/namespace/install.sh
rename to deploy/k8s/pv-pvc-azure-disk/namespace/install.sh
diff --git a/.k8s/pv-pvc-azure-disk/namespace/namespace.yaml b/deploy/k8s/pv-pvc-azure-disk/namespace/namespace.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/namespace/namespace.yaml
rename to deploy/k8s/pv-pvc-azure-disk/namespace/namespace.yaml
diff --git a/.k8s/pv-pvc-azure-disk/namespace/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/namespace/uninstall.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/namespace/uninstall.sh
rename to deploy/k8s/pv-pvc-azure-disk/namespace/uninstall.sh
diff --git a/.k8s/pv-pvc-azure-disk/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/uninstall.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/uninstall.sh
rename to deploy/k8s/pv-pvc-azure-disk/uninstall.sh
diff --git a/.k8s/pv-pvc-azure-disk/webapi/configmap.yaml b/deploy/k8s/pv-pvc-azure-disk/webapi/configmap.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/webapi/configmap.yaml
rename to deploy/k8s/pv-pvc-azure-disk/webapi/configmap.yaml
diff --git a/.k8s/emptydir-volume/webapi/deployment.yaml b/deploy/k8s/pv-pvc-azure-disk/webapi/deployment.yaml
similarity index 100%
rename from .k8s/emptydir-volume/webapi/deployment.yaml
rename to deploy/k8s/pv-pvc-azure-disk/webapi/deployment.yaml
diff --git a/.k8s/pv-pvc-azure-disk/webapi/install.sh b/deploy/k8s/pv-pvc-azure-disk/webapi/install.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/webapi/install.sh
rename to deploy/k8s/pv-pvc-azure-disk/webapi/install.sh
diff --git a/.k8s/pv-pvc-azure-disk/webapi/secret.yaml b/deploy/k8s/pv-pvc-azure-disk/webapi/secret.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/webapi/secret.yaml
rename to deploy/k8s/pv-pvc-azure-disk/webapi/secret.yaml
diff --git a/.k8s/pv-pvc-azure-disk/webapi/service-nodeport.yaml b/deploy/k8s/pv-pvc-azure-disk/webapi/service-nodeport.yaml
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/webapi/service-nodeport.yaml
rename to deploy/k8s/pv-pvc-azure-disk/webapi/service-nodeport.yaml
diff --git a/.k8s/pv-pvc-azure-disk/webapi/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/webapi/uninstall.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/webapi/uninstall.sh
rename to deploy/k8s/pv-pvc-azure-disk/webapi/uninstall.sh
diff --git a/.k8s/pv-pvc-azure-disk/webapp/install.sh b/deploy/k8s/pv-pvc-azure-disk/webapp/install.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/webapp/install.sh
rename to deploy/k8s/pv-pvc-azure-disk/webapp/install.sh
diff --git a/.k8s/pv-pvc-azure-disk/webapp/uninstall.sh b/deploy/k8s/pv-pvc-azure-disk/webapp/uninstall.sh
similarity index 100%
rename from .k8s/pv-pvc-azure-disk/webapp/uninstall.sh
rename to deploy/k8s/pv-pvc-azure-disk/webapp/uninstall.sh
diff --git a/.k8s/emptydir-volume/README.md b/deploy/k8s/without-volume/README.md
similarity index 69%
rename from .k8s/emptydir-volume/README.md
rename to deploy/k8s/without-volume/README.md
index fc25653..9cc602f 100644
--- a/.k8s/emptydir-volume/README.md
+++ b/deploy/k8s/without-volume/README.md
@@ -1,8 +1,21 @@
-# Setup Instructions
+# Overview
-Follow the below instructions to setup the application in Kubernetes cluster using EmptyDir Volume. Note that the data will be lost when the pod is deleted.
+Follow the below instructions to understand data storage behavior in K8s cluster when no volume is defined and how to setup the application in Kubernetes cluster without using any Volume.
-## Database Secrets
+## Data Storage in Kubernetes without Volume
+
+- Data Storage: The data is stored in the container's writable layer.
+- Ephemeral Storage: The data is ephemeral and tied to the container's lifecycle.
+- Container Dependency:
+ - Restart: If the container is restarted (e.g., stopped and started again), the data in the writable layer persists.
+ - Removal: If the container is deleted and a new container is created, the data in the writable layer is lost.
+- Isolation: Each container has its own writable layer, so data is isolated to that specific contai
+
+## Setup Instructions
+
+Follow the below instructions to setup the application in Kubernetes cluster using EmptyDir Volume.
+
+### Database Secrets
1. Create Mongo database username and password in base64 format:
@@ -13,7 +26,7 @@ Follow the below instructions to setup the application in Kubernetes cluster usi
2. Provide the created username and password in the secrets file secrets.yaml
-## Web API Secrets
+### Web API Secrets
1. Provide database username and password created earlier in webapi/secret.yaml file
@@ -45,7 +58,7 @@ Follow the below instructions to setup the application in Kubernetes cluster usi
echo -n 'JWT_SECRET ' | base64
```
-## Deploy the Application
+### Deploy the Application
1. Deploy the application by running the following command:
@@ -53,7 +66,7 @@ Follow the below instructions to setup the application in Kubernetes cluster usi
install.sh
```
-## Test the Application
+### Test the Application
1. Navigate to the api folder and import data by running the following command. This will create devcamper database and insert data into it:
@@ -77,7 +90,7 @@ Follow the below instructions to setup the application in Kubernetes cluster usi
5. Note that deployment creates a new pod but the data is lost as the data is stored in the container and not in the Persistent Volume.
-## Uninstall the Application
+### Uninstall the Application
1. Uninstall the application by running the following command:
diff --git a/.k8s/without-volume/database/configmap.yaml b/deploy/k8s/without-volume/database/configmap.yaml
similarity index 76%
rename from .k8s/without-volume/database/configmap.yaml
rename to deploy/k8s/without-volume/database/configmap.yaml
index 05e0a37..774403f 100644
--- a/.k8s/without-volume/database/configmap.yaml
+++ b/deploy/k8s/without-volume/database/configmap.yaml
@@ -4,4 +4,4 @@ metadata:
name: devcamper-db-configmap
namespace: devcamper-namespace
data:
- mongodb_db_name: 'devcamper-db'
+ mongodb_db_name: devcamper-db
diff --git a/.k8s/without-volume/database/deployment.yaml b/deploy/k8s/without-volume/database/deployment.yaml
similarity index 92%
rename from .k8s/without-volume/database/deployment.yaml
rename to deploy/k8s/without-volume/database/deployment.yaml
index 9067018..55dc37b 100644
--- a/.k8s/without-volume/database/deployment.yaml
+++ b/deploy/k8s/without-volume/database/deployment.yaml
@@ -16,11 +16,10 @@ spec:
app: devcamper-db
spec:
containers:
- - name: devcamper-db
+ - name: devcamper-db-container
image: mongo
ports:
- - name: mongodb
- containerPort: 27017
+ - containerPort: 27017
env:
- name: MONGO_INITDB_DATABASE
valueFrom:
diff --git a/.k8s/emptydir-volume/webapi/install.sh b/deploy/k8s/without-volume/database/install.sh
similarity index 100%
rename from .k8s/emptydir-volume/webapi/install.sh
rename to deploy/k8s/without-volume/database/install.sh
diff --git a/deploy/k8s/without-volume/database/secret.yaml b/deploy/k8s/without-volume/database/secret.yaml
new file mode 100644
index 0000000..8b8de8a
--- /dev/null
+++ b/deploy/k8s/without-volume/database/secret.yaml
@@ -0,0 +1,8 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ name: devcamper-db-secret
+ namespace: devcamper-namespace
+data:
+ mongodb_username: 'YWRtaW4='
+ mongodb_password: 'cGFzc3dvcmQ='
diff --git a/deploy/k8s/without-volume/database/service.yaml b/deploy/k8s/without-volume/database/service.yaml
new file mode 100644
index 0000000..4e619a7
--- /dev/null
+++ b/deploy/k8s/without-volume/database/service.yaml
@@ -0,0 +1,31 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: devcamper-db-service
+ namespace: devcamper-namespace
+spec:
+ type: ClusterIP
+ selector:
+ app: devcamper-db
+ ports:
+ - protocol: TCP
+ port: 27017
+ targetPort: 27017
+
+---
+# Database Nodeport service was created just to access the database from the host machine. It is not recommended to use this service in production.
+
+apiVersion: v1
+kind: Service
+metadata:
+ name: devcamper-db-nodeport-service
+ namespace: devcamper-namespace
+spec:
+ type: NodePort
+ selector:
+ app: devcamper-db
+ ports:
+ - protocol: TCP
+ port: 27017
+ targetPort: 27017
+ nodePort: 32017
diff --git a/.k8s/without-volume/webapi/uninstall.sh b/deploy/k8s/without-volume/database/uninstall.sh
similarity index 73%
rename from .k8s/without-volume/webapi/uninstall.sh
rename to deploy/k8s/without-volume/database/uninstall.sh
index 0a7fb30..398ae0c 100644
--- a/.k8s/without-volume/webapi/uninstall.sh
+++ b/deploy/k8s/without-volume/database/uninstall.sh
@@ -2,4 +2,5 @@
kubectl delete -f configmap.yaml
kubectl delete -f secret.yaml
kubectl delete -f deployment.yaml
-kubectl delete -f service-nodeport.yaml
\ No newline at end of file
+kubectl delete -f service.yaml
+
diff --git a/deploy/k8s/without-volume/install.sh b/deploy/k8s/without-volume/install.sh
new file mode 100644
index 0000000..153a8d9
--- /dev/null
+++ b/deploy/k8s/without-volume/install.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# Function to run install scripts in specified directories
+run_install() {
+ local dir=$1
+ echo -e "\033[1;34m==================== Installing $dir ====================\033[0m"
+ cd "$dir" || { echo -e "\033[1;31mFailed to change directory to $dir\033[0m"; exit 1; }
+ bash ./install.sh
+ cd - > /dev/null || { echo -e "\033[1;31mFailed to return to previous directory\033[0m"; exit 1; }
+ echo -e "\033[1;34m==================== Finished $dir ====================\033[0m"
+}
+
+# Set trap to ensure we return to the original directory on exit
+trap 'cd - > /dev/null' EXIT
+
+# Run install scripts in the specified directories
+run_install namespace
+run_install database
+run_install webapi
+run_install webapp
+run_install network
\ No newline at end of file
diff --git a/.k8s/without-volume/namespace/install.sh b/deploy/k8s/without-volume/namespace/install.sh
similarity index 100%
rename from .k8s/without-volume/namespace/install.sh
rename to deploy/k8s/without-volume/namespace/install.sh
diff --git a/.k8s/without-volume/namespace/namespace.yaml b/deploy/k8s/without-volume/namespace/namespace.yaml
similarity index 100%
rename from .k8s/without-volume/namespace/namespace.yaml
rename to deploy/k8s/without-volume/namespace/namespace.yaml
diff --git a/.k8s/without-volume/namespace/uninstall.sh b/deploy/k8s/without-volume/namespace/uninstall.sh
similarity index 100%
rename from .k8s/without-volume/namespace/uninstall.sh
rename to deploy/k8s/without-volume/namespace/uninstall.sh
diff --git a/deploy/k8s/without-volume/network/ingress.yaml b/deploy/k8s/without-volume/network/ingress.yaml
new file mode 100644
index 0000000..468b6fd
--- /dev/null
+++ b/deploy/k8s/without-volume/network/ingress.yaml
@@ -0,0 +1,30 @@
+apiVersion: networking.k8s.io/v1
+kind: Ingress
+metadata:
+ name: devcamper-ingress
+ namespace: devcamper-namespace
+ annotations:
+ nginx.ingress.kubernetes.io/rewrite-target: /
+spec:
+ ingressClassName: nginx
+ rules:
+ - host: devcamper.webapp
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: devcamper-webapp-service
+ port:
+ number: 3000
+ - host: devcamper.webapi
+ http:
+ paths:
+ - path: /
+ pathType: Prefix
+ backend:
+ service:
+ name: devcamper-webapi-service
+ port:
+ number: 5000
diff --git a/deploy/k8s/without-volume/network/install.sh b/deploy/k8s/without-volume/network/install.sh
new file mode 100644
index 0000000..b788010
--- /dev/null
+++ b/deploy/k8s/without-volume/network/install.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+# Install an NGINX Ingress Controller
+kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
+
+# Wait for the NGINX Ingress Controller to be ready
+echo "Waiting for NGINX Ingress Controller to be ready..."
+kubectl wait --namespace ingress-nginx \
+ --for=condition=ready pod \
+ --selector=app.kubernetes.io/component=controller \
+ --timeout=90s
+
+# Apply the ingress configuration
+kubectl apply -f ingress.yaml
\ No newline at end of file
diff --git a/deploy/k8s/without-volume/network/uninstall.sh b/deploy/k8s/without-volume/network/uninstall.sh
new file mode 100644
index 0000000..a0ef770
--- /dev/null
+++ b/deploy/k8s/without-volume/network/uninstall.sh
@@ -0,0 +1,3 @@
+#!bin/bash
+kubectl delete -f ingress.yaml
+kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
\ No newline at end of file
diff --git a/deploy/k8s/without-volume/uninstall.sh b/deploy/k8s/without-volume/uninstall.sh
new file mode 100644
index 0000000..69e7345
--- /dev/null
+++ b/deploy/k8s/without-volume/uninstall.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# Function to run uninstall script in a directory
+run_uninstall() {
+ local dir=$1
+ echo -e "\033[1;34m==================== Uninstalling $dir ====================\033[0m"
+ cd "$dir" || { echo -e "\033[1;31mFailed to change directory to $dir\033[0m"; exit 1; }
+ bash ./uninstall.sh
+ cd - > /dev/null || { echo -e "\033[1;31mFailed to return to previous directory\033[0m"; exit 1; }
+ echo -e "\033[1;34m==================== Finished $dir ====================\033[0m"
+}
+
+# Set trap to ensure we return to the original directory on exit
+trap 'cd - > /dev/null' EXIT
+
+# Run uninstall scripts in the specified directories
+run_uninstall database
+run_uninstall webapi
+run_uninstall webapp
+run_uninstall network
+run_uninstall namespace
\ No newline at end of file
diff --git a/.k8s/without-volume/webapi/configmap.yaml b/deploy/k8s/without-volume/webapi/configmap.yaml
similarity index 86%
rename from .k8s/without-volume/webapi/configmap.yaml
rename to deploy/k8s/without-volume/webapi/configmap.yaml
index 72c2e29..2b5b9a8 100644
--- a/.k8s/without-volume/webapi/configmap.yaml
+++ b/deploy/k8s/without-volume/webapi/configmap.yaml
@@ -4,13 +4,14 @@ metadata:
name: devcamper-webapi-configmap
namespace: devcamper-namespace
data:
- mongodb_host: 'devcamper-db-clusterip-service'
+ mongodb_host: 'devcamper-db-service'
mongodb_port: '27017'
mongodb_db_name: 'devcamper-db'
mongodb_db_params: 'authSource=admin'
geocoder_provider: 'mapquest'
- rate_limit_window: '100'
- rate_limit_max: '1000'
+ jwt_expire: '30d'
jwt_cookie_expire: '30'
file_upload_path: './public/uploads'
max_file_upload: '1000000'
+ rate_limit_window: '100'
+ rate_limit_max: '1000'
diff --git a/.k8s/pv-pvc-azure-disk/webapi/deployment.yaml b/deploy/k8s/without-volume/webapi/deployment.yaml
similarity index 94%
rename from .k8s/pv-pvc-azure-disk/webapi/deployment.yaml
rename to deploy/k8s/without-volume/webapi/deployment.yaml
index 5ec2e8c..f2b775a 100644
--- a/.k8s/pv-pvc-azure-disk/webapi/deployment.yaml
+++ b/deploy/k8s/without-volume/webapi/deployment.yaml
@@ -29,6 +29,8 @@ spec:
ports:
- containerPort: 5000
env:
+ - name: NODE_ENV
+ value: 'production'
- name: mongodb_host
valueFrom:
configMapKeyRef:
@@ -54,6 +56,11 @@ spec:
configMapKeyRef:
name: devcamper-webapi-configmap
key: geocoder_provider
+ - name: jwt_expire
+ valueFrom:
+ configMapKeyRef:
+ name: devcamper-webapi-configmap
+ key: jwt_expire
- name: jwt_cookie_expire
valueFrom:
configMapKeyRef:
diff --git a/deploy/k8s/without-volume/webapi/install.sh b/deploy/k8s/without-volume/webapi/install.sh
new file mode 100644
index 0000000..8e03034
--- /dev/null
+++ b/deploy/k8s/without-volume/webapi/install.sh
@@ -0,0 +1,8 @@
+#!bin/bash
+kubectl apply -f configmap.yaml
+kubectl apply -f secret.yaml
+kubectl apply -f deployment.yaml
+kubectl apply -f service.yaml
+
+# Port forward service to test API connectivity from local machine
+# kubectl port-forward service/devcamper-webapi-service 5000:5000 -n devcamper-namespace
\ No newline at end of file
diff --git a/deploy/k8s/without-volume/webapi/secret.yaml b/deploy/k8s/without-volume/webapi/secret.yaml
new file mode 100644
index 0000000..8e1d2ad
--- /dev/null
+++ b/deploy/k8s/without-volume/webapi/secret.yaml
@@ -0,0 +1,19 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ name: devcamper-webapi-secret
+ namespace: devcamper-namespace
+type: Opaque
+data:
+ mongodb_username: 'YWRtaW4=' # base64 encoded string for 'admin'
+ mongodb_password: 'cGFzc3dvcmQ=' # base64 encoded string for 'password'
+ geocoder_api_key: 'OGl4ZGpuSzJMRGpGNTZmdlpaUlZwYzNuYmxEV3p4WFE='
+ smtp_host: c2FuZGJveC5zbXRwLm1haWx0cmFwLmlv
+ smtp_port: MjUyNQ==
+ smtp_email: YTRhYjBlNDkzMWUzOWY=
+ smtp_password: MGQ5ZjljZDVlZTdlOGY=
+ from_email: YWRtaW5AZGV2Y2FtcGVyLmNvbQ==
+ from_name: RGV2Q2FtcGVyIEFkbWlu
+ jwt_secret: ZGV2Y2FtcGVyand0c2VjcmV0
+ rate_limit_window: MTAw
+ rate_limit_max: MTAwMA==
diff --git a/.k8s/without-volume/webapi/service-nodeport.yaml b/deploy/k8s/without-volume/webapi/service.yaml
similarity index 63%
rename from .k8s/without-volume/webapi/service-nodeport.yaml
rename to deploy/k8s/without-volume/webapi/service.yaml
index 7736107..f833e25 100644
--- a/.k8s/without-volume/webapi/service-nodeport.yaml
+++ b/deploy/k8s/without-volume/webapi/service.yaml
@@ -1,14 +1,12 @@
apiVersion: v1
kind: Service
metadata:
- name: devcamper-webapi-nodeport-service
+ name: devcamper-webapi-service
namespace: devcamper-namespace
spec:
- type: NodePort
ports:
- protocol: TCP
- port: 80
+ port: 5000
targetPort: 5000
- nodePort: 32018
selector:
app: devcamper-webapi
diff --git a/.k8s/without-volume/database/uninstall.sh b/deploy/k8s/without-volume/webapi/uninstall.sh
similarity index 60%
rename from .k8s/without-volume/database/uninstall.sh
rename to deploy/k8s/without-volume/webapi/uninstall.sh
index 66f9516..40249bd 100644
--- a/.k8s/without-volume/database/uninstall.sh
+++ b/deploy/k8s/without-volume/webapi/uninstall.sh
@@ -2,5 +2,4 @@
kubectl delete -f configmap.yaml
kubectl delete -f secret.yaml
kubectl delete -f deployment.yaml
-kubectl delete -f service-nodeport.yaml
-kubectl delete -f service.yaml
\ No newline at end of file
+kubectl delete -f service.yaml
diff --git a/deploy/k8s/without-volume/webapp/configmap.yaml b/deploy/k8s/without-volume/webapp/configmap.yaml
new file mode 100644
index 0000000..ee1eaa0
--- /dev/null
+++ b/deploy/k8s/without-volume/webapp/configmap.yaml
@@ -0,0 +1,15 @@
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: devcamper-webapp-configmap
+ namespace: devcamper-namespace
+data:
+ config.json: |
+ {
+ "development": {
+ "react_app_devcamper_base_api_uri": "http://localhost:5000/api/v1"
+ },
+ "production": {
+ "react_app_devcamper_base_api_uri": "http://devcamper.webapi/api/v1"
+ }
+ }
diff --git a/.k8s/emptydir-volume/webapp/deployment.yaml b/deploy/k8s/without-volume/webapp/deployment.yaml
similarity index 65%
rename from .k8s/emptydir-volume/webapp/deployment.yaml
rename to deploy/k8s/without-volume/webapp/deployment.yaml
index df86638..c871cf1 100644
--- a/.k8s/emptydir-volume/webapp/deployment.yaml
+++ b/deploy/k8s/without-volume/webapp/deployment.yaml
@@ -19,11 +19,12 @@ spec:
ports:
- containerPort: 3000
env:
- - name: REACT_APP_DEVCAMPER_BASE_API_URI
- valueFrom:
- configMapKeyRef:
- name: devcamper-webapp-configmap
- key: react_app_devcamper_base_api_uri
+ - name: NODE_ENV
+ value: 'production'
+ volumeMounts:
+ - name: config-volume
+ mountPath: /app/build/config/config.json
+ subPath: config.json
resources:
limits:
memory: '2Gi'
@@ -31,3 +32,7 @@ spec:
requests:
memory: '1Gi'
cpu: '1'
+ volumes:
+ - name: config-volume
+ configMap:
+ name: devcamper-webapp-configmap
diff --git a/.k8s/emptydir-volume/database/install.sh b/deploy/k8s/without-volume/webapp/install.sh
similarity index 77%
rename from .k8s/emptydir-volume/database/install.sh
rename to deploy/k8s/without-volume/webapp/install.sh
index f2cd6a6..13d4082 100644
--- a/.k8s/emptydir-volume/database/install.sh
+++ b/deploy/k8s/without-volume/webapp/install.sh
@@ -1,7 +1,4 @@
#!bin/bash
kubectl apply -f configmap.yaml
-kubectl apply -f secret.yaml
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
-
-
diff --git a/.k8s/emptydir-volume/database/service.yaml b/deploy/k8s/without-volume/webapp/service.yaml
similarity index 51%
rename from .k8s/emptydir-volume/database/service.yaml
rename to deploy/k8s/without-volume/webapp/service.yaml
index 6d7883c..e7c5834 100644
--- a/.k8s/emptydir-volume/database/service.yaml
+++ b/deploy/k8s/without-volume/webapp/service.yaml
@@ -1,13 +1,12 @@
apiVersion: v1
kind: Service
metadata:
- name: devcamper-db-service
+ name: devcamper-webapp-service
namespace: devcamper-namespace
spec:
- type: ClusterIP
- selector:
- app: devcamper-db
ports:
- protocol: TCP
- port: 27017
- targetPort: 27017
+ port: 3000
+ targetPort: 3000
+ selector:
+ app: devcamper-webapp
diff --git a/deploy/k8s/without-volume/webapp/uninstall.sh b/deploy/k8s/without-volume/webapp/uninstall.sh
new file mode 100644
index 0000000..1a6e510
--- /dev/null
+++ b/deploy/k8s/without-volume/webapp/uninstall.sh
@@ -0,0 +1,4 @@
+#!bin/bash
+kubectl delete -f configmap.yaml
+kubectl delete -f deployment.yaml
+kubectl delete -f service.yaml
diff --git a/docker/docker-compose-mongo.yml b/docker/docker-compose-mongo.yml
deleted file mode 100644
index 998e91a..0000000
--- a/docker/docker-compose-mongo.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-version: '3.8'
-
-services:
- mongo:
- image: mongo
- container_name: devcamper-db
- ports:
- - 27017:27017
- environment:
- - MONGO_INITDB_ROOT_USERNAME=admin
- - MONGO_INITDB_ROOT_PASSWORD=password
- volumes:
- - mongo-data:/data/db
-
-volumes:
- mongo-data:
diff --git a/api/_postman/dev-environment.json b/postman/dev-environment.json
similarity index 66%
rename from api/_postman/dev-environment.json
rename to postman/dev-environment.json
index 391b40d..6577fa9 100644
--- a/api/_postman/dev-environment.json
+++ b/postman/dev-environment.json
@@ -4,7 +4,7 @@
"values": [
{
"key": "url",
- "value": "http://localhost:5000",
+ "value": "http://localhost:5000/api/v1",
"type": "default",
"enabled": true
},
@@ -16,6 +16,6 @@
}
],
"_postman_variable_scope": "environment",
- "_postman_exported_at": "2024-08-20T08:22:16.787Z",
- "_postman_exported_using": "Postman/11.8.0"
+ "_postman_exported_at": "2024-10-25T18:53:43.208Z",
+ "_postman_exported_using": "Postman/11.18.0"
}
\ No newline at end of file
diff --git a/api/_postman/devcamper-api.json b/postman/devcamper-api.json
similarity index 97%
rename from api/_postman/devcamper-api.json
rename to postman/devcamper-api.json
index 0dbb216..c0a6106 100644
--- a/api/_postman/devcamper-api.json
+++ b/postman/devcamper-api.json
@@ -1,6 +1,6 @@
{
"info": {
- "_postman_id": "63d37a0b-5499-4f19-a0dc-5c45169d9ce9",
+ "_postman_id": "024b412f-725c-4c97-b466-da930f165606",
"name": "DevCamper",
"description": "This template contains a boilerplate for documentation that you can quickly customize and reuse.\n\n### How to use this template:\n\n- Replace the content given brackets (()) with your API's details.\n \n- Tips are formatted in `codespan` - feel free to read and remove them.\n \n\n---\n\n`Start with a brief overview of what your API offers.`\n\nThe ((product name)) provides many API products, tools, and resources that enable you to ((add product value here)).\n\n`You can also list the APIs you offer, link to the relevant pages, or do both in this section.`\n\n## **Getting started guide**\n\n`List the steps or points required to start using your APIs. Make sure to cover everything required to reach success with your API as quickly as possible.`\n\nTo start using the ((add APIs here)), you need to -\n\n`The points given below are from The Postman API's documentation. You can reference it to write your own getting started guide.`\n\n- You must use a valid API Key to send requests to the API endpoints. You can get your API key from Postman's [integrations dashboard](https://go.postman.co/settings/me/api-keys).\n \n- The API has [rate and usage limits](https://learning.postman.com/docs/developer/postman-api/postman-api-rate-limits/).\n \n- The API only responds to HTTPS-secured communications. Any requests sent via HTTP return an HTTP 301 redirect to the corresponding HTTPS resources.\n \n- The API returns request responses in JSON format. When an API request returns an error, it is sent in the JSON response as an error key.\n \n\n## Authentication\n\n`Add details on the authorization keys/tokens required, steps that cover how to get them, and the relevant error codes.`\n\nThe ((product name)) API uses ((add your API's authorization type)) for authentication.\n\n`The details given below are from the Postman API's documentation. You can reference it to write your own authentication section.`\n\nPostman uses API keys for authentication. You can generate a Postman API key in the [API keys](https://postman.postman.co/settings/me/api-keys) section of your Postman account settings.\n\nYou must include an API key in each request to the Postman API with the X-Api-Key request header.\n\n### Authentication error response\n\nIf an API key is missing, malformed, or invalid, you will receive an HTTP 401 Unauthorized response code.\n\n## Rate and usage limits\n\n`Use this section to cover your APIs' terms of use. Include API limits, constraints, and relevant error codes, so consumers understand the permitted API usage and practices.`\n\n`The example given below is from The Postman API's documentation. Use it as a reference to write your APIs' terms of use.`\n\nAPI access rate limits apply at a per-API key basis in unit time. The limit is 300 requests per minute. Also, depending on your plan, you may have usage limits. If you exceed either limit, your request will return an HTTP 429 Too Many Requests status code.\n\nEach API response returns the following set of headers to help you identify your use status:\n\n| Header | Description |\n| --- | --- |\n| `X-RateLimit-Limit` | The maximum number of requests that the consumer is permitted to make per minute. |\n| `X-RateLimit-Remaining` | The number of requests remaining in the current rate limit window. |\n| `X-RateLimit-Reset` | The time at which the current rate limit window resets in UTC epoch seconds. |\n\n### 503 response\n\nAn HTTP `503` response from our servers indicates there is an unexpected spike in API access traffic. The server is usually operational within the next five minutes. If the outage persists or you receive any other form of an HTTP `5XX` error, [contact support](https://support.postman.com/hc/en-us/requests/new/).\n\n### **Need some help?**\n\n`Add links that customers can refer to whenever they need help.`\n\nIn case you have questions, go through our tutorials ((link to your video or help documentation here)). Or visit our FAQ page ((link to the relevant page)).\n\nOr you can check out our community forum, there’s a good chance our community has an answer for you. Visit our developer forum ((link to developer forum)) to review topics, ask questions, and learn from others.\n\n`You can also document or add links to libraries, code examples, and other resources needed to make a request.`",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
@@ -16,13 +16,12 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1",
+ "raw": "{{url}}/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1"
+ ""
]
}
},
@@ -34,13 +33,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/status",
+ "raw": "{{url}}/status",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"status"
]
}
@@ -70,13 +67,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -228,13 +223,169 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/publisher/5c8a1d5b0190b214360dc032",
+ "raw": "{{url}}/bootcamps/publisher/5c8a1d5b0190b214360dc032",
+ "host": [
+ "{{url}}"
+ ],
+ "path": [
+ "bootcamps",
+ "publisher",
+ "5c8a1d5b0190b214360dc032"
+ ]
+ },
+ "description": "### Get All Bootcamps\n\nThis endpoint makes an HTTP GET request to retrieve a list of bootcamps.\n\n#### Request Body\n\nThis request does not require a request body.\n\n#### Response\n\n- Status: 429\n \n- Content-Type: text/html\n \n\n##### Example Response\n\n``` json\n{\n \"collections\": [\n {\n \"id\": \"\",\n \"name\": \"\",\n \"owner\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"uid\": \"\",\n \"isPublic\": true\n }\n ]\n}\n\n ```"
+ },
+ "response": [
+ {
+ "name": "Successful Response",
+ "originalRequest": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "https://api.getpostman.com/collections",
+ "protocol": "https",
+ "host": [
+ "api",
+ "getpostman",
+ "com"
+ ],
+ "path": [
+ "collections"
+ ],
+ "query": [
+ {
+ "key": "workspace",
+ "value": "1f0df51a-8658-4ee8-a2a1-d2567dfa09a9",
+ "description": "Optional. A workspace ID.",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "status": "OK",
+ "code": 200,
+ "_postman_previewlanguage": "json",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": {
+ "content": "",
+ "type": "text/plain"
+ }
+ }
+ ],
+ "cookie": [],
+ "body": "{\n \"collections\": [\n {\n \"id\": \"dac5eac9-148d-a32e-b76b-3edee9da28f7\",\n \"name\": \"Cloud API\",\n \"owner\": \"12345678\",\n \"createdAt\": \"2022-04-12T10:29:46.000Z\",\n \"updatedAt\": \"2022-04-12T10:29:56.000Z\",\n \"uid\": \"12345678-dac5eac9-148d-a32e-b76b-3edee9da28f7\",\n \"isPublic\": true\n },\n {\n \"id\": \"12ece9e1-2abf-4edc-8e34-de66e74114d2\",\n \"name\": \"Test Collection\",\n \"owner\": \"12345678\",\n \"createdAt\": \"2022-01-13T10:21:46.000Z\",\n \"updatedAt\": \"2022-02-12T11:29:56.000Z\",\n \"uid\": \"12345678-12ece9e1-2abf-4edc-8e34-de66e74114d2\",\n \"isPublic\": false,\n \"fork\": {\n \"label\": \"Test Fork\",\n \"createdAt\": \"2022-06-16T19:51:44.069Z\",\n \"from\": \"12345678-12ece9e1-2abf-4edc-8e34-de66e74114d2\"\n }\n },\n {\n \"id\": \"f695cab7-6878-eb55-7943-ad88e1ccfd65\",\n \"name\": \"Postman Echo\",\n \"owner\": \"12345678\",\n \"createdAt\": \"2021-04-11T09:18:26.000Z\",\n \"updatedAt\": \"2022-05-01T15:29:32.000Z\",\n \"uid\": \"12345678-f695cab7-6878-eb55-7943-ad88e1ccfd65\",\n \"isPublic\": true\n }\n ]\n}"
+ },
+ {
+ "name": "Filter by Workspace",
+ "originalRequest": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "https://api.getpostman.com/collections?workspace=1f0df51a-8658-4ee8-a2a1-d2567dfa09a9",
+ "protocol": "https",
+ "host": [
+ "api",
+ "getpostman",
+ "com"
+ ],
+ "path": [
+ "collections"
+ ],
+ "query": [
+ {
+ "key": "workspace",
+ "value": "1f0df51a-8658-4ee8-a2a1-d2567dfa09a9",
+ "description": "Optional. A workspace ID."
+ }
+ ]
+ }
+ },
+ "status": "OK",
+ "code": 200,
+ "_postman_previewlanguage": "json",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": {
+ "content": "",
+ "type": "text/plain"
+ }
+ }
+ ],
+ "cookie": [],
+ "body": "{\n \"collections\": [\n {\n \"id\": \"dac5eac9-148d-a32e-b76b-3edee9da28f7\",\n \"name\": \"Cloud API\",\n \"owner\": \"12345678\",\n \"createdAt\": \"2022-04-12T10:29:46.000Z\",\n \"updatedAt\": \"2022-04-12T10:29:56.000Z\",\n \"uid\": \"12345678-dac5eac9-148d-a32e-b76b-3edee9da28f7\",\n \"isPublic\": true\n }\n ]\n}"
+ },
+ {
+ "name": "Rate Limit Exceeded",
+ "originalRequest": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "https://api.getpostman.com/collections",
+ "protocol": "https",
+ "host": [
+ "api",
+ "getpostman",
+ "com"
+ ],
+ "path": [
+ "collections"
+ ],
+ "query": [
+ {
+ "key": "workspace",
+ "value": "1f0df51a-8658-4ee8-a2a1-d2567dfa09a9",
+ "description": "Optional. A workspace ID.",
+ "disabled": true
+ }
+ ]
+ }
+ },
+ "status": "Too Many Requests",
+ "code": 429,
+ "_postman_previewlanguage": "json",
+ "header": [
+ {
+ "key": "Content-Type",
+ "value": "application/json",
+ "description": {
+ "content": "",
+ "type": "text/plain"
+ }
+ }
+ ],
+ "cookie": [],
+ "body": "{\n \"error\": \"rateLimited\",\n \"message\": \"Rate limit exceeded. Please retry after 1669048687\"\n}"
+ }
+ ]
+ },
+ {
+ "name": "Get All Bootcamps Based on Search Text",
+ "event": [
+ {
+ "listen": "test",
+ "script": {
+ "exec": [
+ ""
+ ],
+ "type": "text/javascript",
+ "packages": {}
+ }
+ }
+ ],
+ "request": {
+ "method": "GET",
+ "header": [],
+ "url": {
+ "raw": "{{url}}/bootcamps/publisher/5c8a1d5b0190b214360dc032",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"publisher",
"5c8a1d5b0190b214360dc032"
@@ -388,13 +539,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d725a037b292f5f8ceff787",
+ "raw": "{{url}}/bootcamps/5d725a037b292f5f8ceff787",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d725a037b292f5f8ceff787"
]
@@ -550,13 +699,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/66abc78ccdbd47b705e949f1",
+ "raw": "{{url}}/bootcamps/66abc78ccdbd47b705e949f1",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"66abc78ccdbd47b705e949f1"
]
@@ -713,13 +860,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/66abc78ccdbd47b705e94xxx",
+ "raw": "{{url}}/bootcamps/66abc78ccdbd47b705e94xxx",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"66abc78ccdbd47b705e94xxx"
]
@@ -897,13 +1042,11 @@
"raw": "{\n \"name\": \"Test Bootcamp 12\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -1172,13 +1315,11 @@
"raw": "{\n \"name\": \"Bootcamp ;\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -1437,13 +1578,11 @@
"raw": ""
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -1702,13 +1841,11 @@
"raw": "{\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -1967,13 +2104,11 @@
"raw": "{\n \"name\": \"Dev\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -2232,13 +2367,11 @@
"raw": "{\n \"name\": \"DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps DevOps\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -2497,13 +2630,11 @@
"raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -2762,13 +2893,11 @@
"raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"description\": \"DevOps\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -3027,13 +3156,11 @@
"raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"description\": \"A DevOps boot camp is an intensive training program designed to equip participants with the skills and knowledge necessary to implement and manage DevOps practices in their organizations. It covers core concepts such as the DevOps culture, collaboration, and the benefits of integrating development and operations teams. Participants learn technical skills in version control with Git, continuous integration (CI) using tools like Jenkins or CircleCI, and continuous deployment (CD) practices to automate the deployment of code changes. The boot camp aims to foster a deep understanding of automation, monitoring, and cloud services, preparing individuals to streamline software delivery processes and enhance organizational efficiency.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -3292,13 +3419,11 @@
"raw": "{\n \"name\": \"Modern DevOps Bootcamp 4\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"dummy\",\n \"phone\": \"123-456-7896\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -3557,13 +3682,11 @@
"raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456\",\n \"email\": \"info7@example.com\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -3822,13 +3945,11 @@
"raw": "{\n \"name\": \"DevOps Bootcamp\",\n \"description\": \"Learn DevOps practices.\",\n \"website\": \"https://example7.com\",\n \"phone\": \"123-456-7890\",\n \"email\": \"this is not an email\",\n \"address\": \"129 Main St, Anytown, USA\",\n \"careers\": [\"DevOps\"],\n \"housing\": true,\n \"jobAssistance\": false,\n \"jobGuarantee\": true,\n \"acceptGi\": false\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps",
+ "raw": "{{url}}/bootcamps",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
]
},
@@ -4095,13 +4216,11 @@
"raw": "{\n \"name\": \"Full Stack Developer Bootcamp\",\n \"description\": \"An intensive program to become a full stack developer.\",\n \"website\": \"https://example.com\",\n \"phone\": \"123-456-7890\",\n \"email\": \"info@example.com\",\n \"address\": \"123 Main St, Anytown, USA\",\n \"careers\": [\n \"Web Development\",\n \"Full Stack Development\",\n \"MERN\"\n ],\n \"photo\": \"no-photo.png\",\n \"housing\": false,\n \"jobAssistance\": true,\n \"jobGuarantee\": false,\n \"acceptGi\": true\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/670fbb0f37abecfcd6f199e6",
+ "raw": "{{url}}/bootcamps/670fbb0f37abecfcd6f199e6",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"670fbb0f37abecfcd6f199e6"
]
@@ -4446,13 +4565,11 @@
"raw": "{\n \"name\": \"Devworks Bootcamp ***\",\n \"description\": \"Devworks is a full stack JavaScript Bootcamp located in the heart of Boston that focuses on the technologies you need to get a high paying job as a web developer\",\n \"website\": \"https://devworks.com\",\n \"phone\": \"(111) 111-1111\",\n \"email\": \"enroll@devworks.com\",\n \"address\": \"233 Bay State Rd Boston MA 02215\",\n \"careers\": [\"Web Development\", \"UI/UX\", \"Business\"],\n \"housing\": true,\n \"jobAssistance\": true,\n \"jobGuarantee\": false,\n \"acceptGi\": true\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d713995b721c3bb38c1f5d0",
+ "raw": "{{url}}/bootcamps/5d713995b721c3bb38c1f5d0",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d713995b721c3bb38c1f5d0"
]
@@ -4797,13 +4914,11 @@
"raw": "{\n \"housing\": true\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/670fbb0f37abecfcd6f199e6",
+ "raw": "{{url}}/bootcamps/670fbb0f37abecfcd6f199e6",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"670fbb0f37abecfcd6f199e6"
]
@@ -5138,13 +5253,11 @@
"raw": "{\n \"name\": \"Full Stack Developer Bootcamp\",\n \"description\": \"An intensive program to become a full stack developer.\",\n \"website\": \"https://example.com\",\n \"phone\": \"123-456-7890\",\n \"email\": \"info@example.com\",\n \"address\": \"123 Main St, Anytown, USA\",\n \"careers\": [\n \"Web Development\",\n \"Full Stack Development\"\n ],\n \"photo\": \"no-photo.png\",\n \"housing\": false,\n \"jobAssistance\": true,\n \"jobGuarantee\": false,\n \"acceptGi\": true\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/66abc78ccdbd47b705e949f1",
+ "raw": "{{url}}/bootcamps/66abc78ccdbd47b705e949f1",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"66abc78ccdbd47b705e949f1"
]
@@ -5479,13 +5592,11 @@
"raw": "{\n \"name\": \"Full Stack Developer Bootcamp\",\n \"description\": \"An intensive program to become a full stack developer.\",\n \"website\": \"https://example.com\",\n \"phone\": \"123-456-7890\",\n \"email\": \"info@example.com\",\n \"address\": \"123 Main St, Anytown, USA\",\n \"careers\": [\n \"Web Development\",\n \"Full Stack Development\"\n ],\n \"photo\": \"no-photo.png\",\n \"housing\": false,\n \"jobAssistance\": true,\n \"jobGuarantee\": false,\n \"acceptGi\": true\n}"
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/66abc78ccdbd47b705e9xxx",
+ "raw": "{{url}}/bootcamps/66abc78ccdbd47b705e9xxx",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"66abc78ccdbd47b705e9xxx"
]
@@ -5811,13 +5922,11 @@
"method": "DELETE",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/66ac8953cce31980156cf211",
+ "raw": "{{url}}/bootcamps/66ac8953cce31980156cf211",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"66ac8953cce31980156cf211"
]
@@ -5951,13 +6060,11 @@
"method": "DELETE",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d713995b721c3bb38c1f5d0",
+ "raw": "{{url}}/bootcamps/5d713995b721c3bb38c1f5d0",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d713995b721c3bb38c1f5d0"
]
@@ -6091,13 +6198,11 @@
"method": "DELETE",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/670fbae137abecfcd6f199d3",
+ "raw": "{{url}}/bootcamps/670fbae137abecfcd6f199d3",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"670fbae137abecfcd6f199d3"
]
@@ -6231,13 +6336,11 @@
"method": "DELETE",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/66ac8953cce31980156cfxxx",
+ "raw": "{{url}}/bootcamps/66ac8953cce31980156cfxxx",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"66ac8953cce31980156cfxxx"
]
@@ -6381,13 +6484,11 @@
"method": "DELETE",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d713995b721c3bb38c1f5d0",
+ "raw": "{{url}}/bootcamps/5d713995b721c3bb38c1f5d0",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d713995b721c3bb38c1f5d0"
]
@@ -6530,13 +6631,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/testgeocode",
+ "raw": "{{url}}/bootcamps/testgeocode",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"testgeocode"
]
@@ -6689,13 +6788,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/radius/02215/10",
+ "raw": "{{url}}/bootcamps/radius/02215/10",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"radius",
"02215",
@@ -6850,13 +6947,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?location.city=Boston",
+ "raw": "{{url}}/bootcamps?location.city=Boston",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -7014,13 +7109,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?careers[in]=Business",
+ "raw": "{{url}}/bootcamps?careers[in]=Business",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -7178,13 +7271,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?housing=true",
+ "raw": "{{url}}/bootcamps?housing=true",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -7342,13 +7433,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?averageCost[gt]=10000",
+ "raw": "{{url}}/bootcamps?averageCost[gt]=10000",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -7506,13 +7595,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?averageCost[lte]=5000",
+ "raw": "{{url}}/bootcamps?averageCost[lte]=5000",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -7670,13 +7757,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?select=name,description,housing",
+ "raw": "{{url}}/bootcamps?select=name,description,housing",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -7834,13 +7919,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?select=name,createdAt&sort=name",
+ "raw": "{{url}}/bootcamps?select=name,createdAt&sort=name",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -8002,13 +8085,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?select=name,createdAt&sort=-name",
+ "raw": "{{url}}/bootcamps?select=name,createdAt&sort=-name",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -8170,13 +8251,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?limit=2&select=name",
+ "raw": "{{url}}/bootcamps?limit=2&select=name",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -8338,13 +8417,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps?page=1&limit=2&select=name",
+ "raw": "{{url}}/bootcamps?page=1&limit=2&select=name",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps"
],
"query": [
@@ -8525,13 +8602,11 @@
]
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d725a1b7b292f5f8ceff788/photo",
+ "raw": "{{url}}/bootcamps/5d725a1b7b292f5f8ceff788/photo",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d725a1b7b292f5f8ceff788",
"photo"
@@ -8873,13 +8948,11 @@
]
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d725a1b7b292f5f8ceff788/photo",
+ "raw": "{{url}}/bootcamps/5d725a1b7b292f5f8ceff788/photo",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d725a1b7b292f5f8ceff788",
"photo"
@@ -9221,13 +9294,11 @@
]
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d725a1b7b292f5f8ceff788/photo",
+ "raw": "{{url}}/bootcamps/5d725a1b7b292f5f8ceff788/photo",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d725a1b7b292f5f8ceff788",
"photo"
@@ -9579,13 +9650,11 @@
]
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d725a1b7b292f5f8ceff788/photo",
+ "raw": "{{url}}/bootcamps/5d725a1b7b292f5f8ceff788/photo",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d725a1b7b292f5f8ceff788",
"photo"
@@ -9906,13 +9975,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/courses",
+ "raw": "{{url}}/courses",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"courses"
]
}
@@ -9925,15 +9992,13 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/670faa12c80944ccdbb62a2d/courses",
+ "raw": "{{url}}/bootcamps/5d726e9b7b292f5f8ceff800/courses",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
- "670faa12c80944ccdbb62a2d",
+ "5d726e9b7b292f5f8ceff800",
"courses"
]
}
@@ -9946,13 +10011,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/courses/5d725a4a7b292f5f8ceff789",
+ "raw": "{{url}}/courses/5d725a4a7b292f5f8ceff789",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"courses",
"5d725a4a7b292f5f8ceff789"
]
@@ -9966,13 +10029,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/courses/5d713995b721c3bb38c1f5d1",
+ "raw": "{{url}}/courses/5d713995b721c3bb38c1f5d1",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"courses",
"5d713995b721c3bb38c1f5d1"
]
@@ -10005,13 +10066,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/670faa12c80944ccdbb62a2d/courses",
+ "raw": "{{url}}/bootcamps/670faa12c80944ccdbb62a2d/courses",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"670faa12c80944ccdbb62a2d",
"courses"
@@ -10045,13 +10104,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/670faa12c80944ccdbb62a2d/courses/670fbcea285b3c23dd7857a3",
+ "raw": "{{url}}/bootcamps/670faa12c80944ccdbb62a2d/courses/670fbcea285b3c23dd7857a3",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"670faa12c80944ccdbb62a2d",
"courses",
@@ -10086,13 +10143,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d725a037b292f5f8ceff787/courses/670fbcea285b3c23dd7857a3",
+ "raw": "{{url}}/bootcamps/5d725a037b292f5f8ceff787/courses/670fbcea285b3c23dd7857a3",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d725a037b292f5f8ceff787",
"courses",
@@ -10108,13 +10163,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/courses/?select=title",
+ "raw": "{{url}}/courses/?select=title",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"courses",
""
],
@@ -10134,13 +10187,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/courses?page=2&limit=1",
+ "raw": "{{url}}/courses?page=2&limit=1",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"courses"
],
"query": [
@@ -10168,13 +10219,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/reviews",
+ "raw": "{{url}}/reviews",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"reviews"
]
},
@@ -10188,13 +10237,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d713a66ec8f2b88b8f830b8/reviews",
+ "raw": "{{url}}/bootcamps/5d713a66ec8f2b88b8f830b8/reviews",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d713a66ec8f2b88b8f830b8",
"reviews"
@@ -10210,18 +10257,16 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/reviews/5d7a514b5d2c12c7449be024",
+ "raw": "{{url}}/reviews/5d7a514b5d2c12c7449be024",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"reviews",
"5d7a514b5d2c12c7449be024"
]
},
- "description": "# Get Single Bootcamp Review\n\nThis endpoint retrieves a single review for a specific bootcamp by making an HTTP GET request to the endpoint `/api/v1/reviews/5d7a514b5d2c12c7449be024`.\n\n### Request Parameters\n\n- Path:\n \n - bootcampId (string, required) - The unique identifier of the bootcamp.\n \n\n### Response\n\n- success (boolean) - Indicates if the request was successful.\n \n- data (object) - An object containing the details of the review for the specified bootcamp, including:\n \n - _id (string) - The unique identifier of the review.\n \n - title (string) - The title of the review.\n \n - text (string) - The content of the review.\n \n - rating (number) - The rating given to the bootcamp.\n \n - bootcamp (object) - An object containing the details of the bootcamp for which the review is given, including:\n \n - _id (string) - The unique identifier of the bootcamp.\n \n - name (string) - The name of the bootcamp.\n \n - description (string) - The description of the bootcamp.\n \n - id (string) - The ID of the bootcamp.\n \n - user (string) - The user who submitted the review.\n \n - createdAt (string) - The date and time when the review was created.\n \n - updatedAt (string) - The date and time when the review was last updated.\n \n - __v (number) - Version key.\n \n\nExample Response:\n\n``` json\n{\n \"success\": true,\n \"data\": {\n \"_id\": \"\",\n \"title\": \"\",\n \"text\": \"\",\n \"rating\": 0,\n \"bootcamp\": {\n \"_id\": \"\",\n \"name\": \"\",\n \"description\": \"\",\n \"id\": \"\"\n },\n \"user\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"__v\": 0\n }\n}\n\n ```\n\nThis endpoint makes an HTTP GET request to retrieve the reviews for a specific bootcamp.\n\n### Request Parameters\n\n- Path:\n \n - bootcampId (string, required) - The unique identifier of the bootcamp.\n \n\n### Request Body\n\nThis request does not require a request body.\n\n### Response\n\nThe response returns a JSON object with the following properties:\n\n- success (boolean) - Indicates if the request was successful.\n \n- data (object) - An object containing the review details for the specified bootcamp. The properties include:\n \n - _id (string) - The unique identifier of the review.\n \n - title (string) - The title of the review.\n \n - text (string) - The text content of the review.\n \n - rating (number) - The rating given in the review.\n \n - bootcamp (object) - An object containing the details of the bootcamp for which the review is given. The properties include:\n \n - _id (string) - The unique identifier of the bootcamp.\n \n - name (string) - The name of the bootcamp.\n \n - description (string) - The description of the bootcamp.\n \n - id (string) - The ID of the bootcamp.\n \n - user (string) - The user associated with the review.\n \n - createdAt (string) - The date and time when the review was created.\n \n - updatedAt (string) - The date and time when the review was last updated.\n \n - __v (number) - Version key for optimistic concurrency control.\n \n\nExample Response:\n\n``` json\n{\n \"success\": true,\n \"data\": {\n \"_id\": \"\",\n \"title\": \"\",\n \"text\": \"\",\n \"rating\": 0,\n \"bootcamp\": {\n \"_id\": \"\",\n \"name\": \"\",\n \"description\": \"\",\n \"id\": \"\"\n },\n \"user\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"__v\": 0\n }\n}\n\n ```"
+ "description": "# Get Single Bootcamp Review\n\nThis endpoint retrieves a single review for a specific bootcamp by making an HTTP GET request to the endpoint `/reviews/5d7a514b5d2c12c7449be024`.\n\n### Request Parameters\n\n- Path:\n \n - bootcampId (string, required) - The unique identifier of the bootcamp.\n \n\n### Response\n\n- success (boolean) - Indicates if the request was successful.\n \n- data (object) - An object containing the details of the review for the specified bootcamp, including:\n \n - _id (string) - The unique identifier of the review.\n \n - title (string) - The title of the review.\n \n - text (string) - The content of the review.\n \n - rating (number) - The rating given to the bootcamp.\n \n - bootcamp (object) - An object containing the details of the bootcamp for which the review is given, including:\n \n - _id (string) - The unique identifier of the bootcamp.\n \n - name (string) - The name of the bootcamp.\n \n - description (string) - The description of the bootcamp.\n \n - id (string) - The ID of the bootcamp.\n \n - user (string) - The user who submitted the review.\n \n - createdAt (string) - The date and time when the review was created.\n \n - updatedAt (string) - The date and time when the review was last updated.\n \n - __v (number) - Version key.\n \n\nExample Response:\n\n``` json\n{\n \"success\": true,\n \"data\": {\n \"_id\": \"\",\n \"title\": \"\",\n \"text\": \"\",\n \"rating\": 0,\n \"bootcamp\": {\n \"_id\": \"\",\n \"name\": \"\",\n \"description\": \"\",\n \"id\": \"\"\n },\n \"user\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"__v\": 0\n }\n}\n\n ```\n\nThis endpoint makes an HTTP GET request to retrieve the reviews for a specific bootcamp.\n\n### Request Parameters\n\n- Path:\n \n - bootcampId (string, required) - The unique identifier of the bootcamp.\n \n\n### Request Body\n\nThis request does not require a request body.\n\n### Response\n\nThe response returns a JSON object with the following properties:\n\n- success (boolean) - Indicates if the request was successful.\n \n- data (object) - An object containing the review details for the specified bootcamp. The properties include:\n \n - _id (string) - The unique identifier of the review.\n \n - title (string) - The title of the review.\n \n - text (string) - The text content of the review.\n \n - rating (number) - The rating given in the review.\n \n - bootcamp (object) - An object containing the details of the bootcamp for which the review is given. The properties include:\n \n - _id (string) - The unique identifier of the bootcamp.\n \n - name (string) - The name of the bootcamp.\n \n - description (string) - The description of the bootcamp.\n \n - id (string) - The ID of the bootcamp.\n \n - user (string) - The user associated with the review.\n \n - createdAt (string) - The date and time when the review was created.\n \n - updatedAt (string) - The date and time when the review was last updated.\n \n - __v (number) - Version key for optimistic concurrency control.\n \n\nExample Response:\n\n``` json\n{\n \"success\": true,\n \"data\": {\n \"_id\": \"\",\n \"title\": \"\",\n \"text\": \"\",\n \"rating\": 0,\n \"bootcamp\": {\n \"_id\": \"\",\n \"name\": \"\",\n \"description\": \"\",\n \"id\": \"\"\n },\n \"user\": \"\",\n \"createdAt\": \"\",\n \"updatedAt\": \"\",\n \"__v\": 0\n }\n}\n\n ```"
},
"response": []
},
@@ -10231,13 +10276,11 @@
"method": "GET",
"header": [],
"url": {
- "raw": "{{url}}/api/v1/reviews/5d7a514b5d2c12c7449be111",
+ "raw": "{{url}}/reviews/5d7a514b5d2c12c7449be111",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"reviews",
"5d7a514b5d2c12c7449be111"
]
@@ -10261,13 +10304,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d713a66ec8f2b88b8f830b8/reviews",
+ "raw": "{{url}}/bootcamps/5d713a66ec8f2b88b8f830b8/reviews",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d713a66ec8f2b88b8f830b8",
"reviews"
@@ -10292,13 +10333,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d713a66ec8f2b88b8f830b8/reviews/66c3119794bb5dcce5537119",
+ "raw": "{{url}}/bootcamps/5d713a66ec8f2b88b8f830b8/reviews/66c3119794bb5dcce5537119",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d713a66ec8f2b88b8f830b8",
"reviews",
@@ -10324,13 +10363,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/bootcamps/5d713a66ec8f2b88b8f830b8/reviews/66c30fb28c8ea786fede63e4",
+ "raw": "{{url}}/bootcamps/5d713a66ec8f2b88b8f830b8/reviews/66c30fb28c8ea786fede63e4",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"bootcamps",
"5d713a66ec8f2b88b8f830b8",
"reviews",
@@ -10383,13 +10420,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/register/",
+ "raw": "{{url}}/user/register/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"register",
""
@@ -10413,13 +10448,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/register/",
+ "raw": "{{url}}/user/register/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"register",
""
@@ -10443,13 +10476,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/register/",
+ "raw": "{{url}}/user/register/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"register",
""
@@ -10473,13 +10504,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/register/",
+ "raw": "{{url}}/user/register/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"register",
""
@@ -10503,13 +10532,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/register/",
+ "raw": "{{url}}/user/register/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"register",
""
@@ -10533,13 +10560,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/register",
+ "raw": "{{url}}/user/register",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"register"
]
@@ -10562,13 +10587,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/register",
+ "raw": "{{url}}/user/register",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"register"
]
@@ -10613,13 +10636,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/login/",
+ "raw": "{{url}}/user/login/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"login",
""
@@ -10665,13 +10686,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/login/",
+ "raw": "{{url}}/user/login/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"login",
""
@@ -10717,13 +10736,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/login/",
+ "raw": "{{url}}/user/login/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"login",
""
@@ -10747,13 +10764,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/login/",
+ "raw": "{{url}}/user/login/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"login",
""
@@ -10777,13 +10792,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/login/",
+ "raw": "{{url}}/user/login/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"login",
""
@@ -10820,13 +10833,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/me",
+ "raw": "{{url}}/user/me",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"me"
]
@@ -10874,13 +10885,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/logout",
+ "raw": "{{url}}/user/logout",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"logout"
]
@@ -10913,13 +10922,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/forgotpassword",
+ "raw": "{{url}}/user/forgotpassword",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"forgotpassword"
]
@@ -10958,13 +10965,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/auth/resetpassword/b74159831f19b7f44727d76d6272e86f965286ff",
+ "raw": "{{url}}/auth/resetpassword/b74159831f19b7f44727d76d6272e86f965286ff",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"auth",
"resetpassword",
"b74159831f19b7f44727d76d6272e86f965286ff"
@@ -11011,13 +11016,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/updatedetails",
+ "raw": "{{url}}/user/updatedetails",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"updatedetails"
]
@@ -11063,13 +11066,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/updatepassword",
+ "raw": "{{url}}/user/updatepassword",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"updatepassword"
]
@@ -11115,13 +11116,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/user/updatepassword",
+ "raw": "{{url}}/user/updatepassword",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"user",
"updatepassword"
]
@@ -11184,13 +11183,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/admin/users/",
+ "raw": "{{url}}/admin/users/",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"admin",
"users",
""
@@ -11249,13 +11246,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/admin/users/5d7a514b5d2c12c7449be044",
+ "raw": "{{url}}/admin/users/5d7a514b5d2c12c7449be044",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"admin",
"users",
"5d7a514b5d2c12c7449be044"
@@ -11301,13 +11296,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/admin/users",
+ "raw": "{{url}}/admin/users",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"admin",
"users"
]
@@ -11362,13 +11355,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/admin/users/670fa412b59cda04e428d669",
+ "raw": "{{url}}/admin/users/670fa412b59cda04e428d669",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"admin",
"users",
"670fa412b59cda04e428d669"
@@ -11424,13 +11415,11 @@
}
},
"url": {
- "raw": "{{url}}/api/v1/admin/users/670fa412b59cda04e428d669",
+ "raw": "{{url}}/admin/users/670fa412b59cda04e428d669",
"host": [
"{{url}}"
],
"path": [
- "api",
- "v1",
"admin",
"users",
"670fa412b59cda04e428d669"
diff --git a/api/_postman/prod-environment.json b/postman/k8s-environment.json
similarity index 61%
rename from api/_postman/prod-environment.json
rename to postman/k8s-environment.json
index 3f36bec..5666a99 100644
--- a/api/_postman/prod-environment.json
+++ b/postman/k8s-environment.json
@@ -1,10 +1,10 @@
{
"id": "986d5e6f-e8c8-4471-a8da-0378cd92bf77",
- "name": "Production",
+ "name": "K8s",
"values": [
{
"key": "url",
- "value": "http://devcamper.io",
+ "value": "http://devcamper.webapi/api/v1",
"type": "default",
"enabled": true
},
@@ -16,6 +16,6 @@
}
],
"_postman_variable_scope": "environment",
- "_postman_exported_at": "2024-08-20T08:22:30.556Z",
- "_postman_exported_using": "Postman/11.8.0"
+ "_postman_exported_at": "2024-10-25T18:53:55.968Z",
+ "_postman_exported_using": "Postman/11.18.0"
}
\ No newline at end of file
diff --git a/api/.dockerignore b/src/webapi/.dockerignore
similarity index 100%
rename from api/.dockerignore
rename to src/webapi/.dockerignore
diff --git a/api/.env.example b/src/webapi/.env.example
similarity index 100%
rename from api/.env.example
rename to src/webapi/.env.example
diff --git a/api/Dockerfile b/src/webapi/Dockerfile
similarity index 100%
rename from api/Dockerfile
rename to src/webapi/Dockerfile
diff --git a/api/_data/bootcamps.json b/src/webapi/_data/bootcamps.json
similarity index 100%
rename from api/_data/bootcamps.json
rename to src/webapi/_data/bootcamps.json
diff --git a/api/_data/courses.json b/src/webapi/_data/courses.json
similarity index 100%
rename from api/_data/courses.json
rename to src/webapi/_data/courses.json
diff --git a/api/_data/reviews.json b/src/webapi/_data/reviews.json
similarity index 100%
rename from api/_data/reviews.json
rename to src/webapi/_data/reviews.json
diff --git a/api/_data/users.json b/src/webapi/_data/users.json
similarity index 100%
rename from api/_data/users.json
rename to src/webapi/_data/users.json
diff --git a/api/config/db.js b/src/webapi/config/db.js
similarity index 100%
rename from api/config/db.js
rename to src/webapi/config/db.js
diff --git a/api/config/env.js b/src/webapi/config/env.js
similarity index 100%
rename from api/config/env.js
rename to src/webapi/config/env.js
diff --git a/api/controllers/admin.js b/src/webapi/controllers/admin.js
similarity index 100%
rename from api/controllers/admin.js
rename to src/webapi/controllers/admin.js
diff --git a/api/controllers/bootcamps.js b/src/webapi/controllers/bootcamps.js
similarity index 100%
rename from api/controllers/bootcamps.js
rename to src/webapi/controllers/bootcamps.js
diff --git a/api/controllers/courses.js b/src/webapi/controllers/courses.js
similarity index 100%
rename from api/controllers/courses.js
rename to src/webapi/controllers/courses.js
diff --git a/api/controllers/reviews.js b/src/webapi/controllers/reviews.js
similarity index 100%
rename from api/controllers/reviews.js
rename to src/webapi/controllers/reviews.js
diff --git a/api/controllers/user.js b/src/webapi/controllers/user.js
similarity index 98%
rename from api/controllers/user.js
rename to src/webapi/controllers/user.js
index ff7110f..375e3ba 100644
--- a/api/controllers/user.js
+++ b/src/webapi/controllers/user.js
@@ -174,7 +174,7 @@ const sendTokenResponse = (user, statusCode, res) => {
// Cookie options
const options = {
- expires: new Date(Date.now() + process.env.JWT_COOKIE_EXPIRE * 24 * 60 * 60 * 1000), // Convert to days
+ expires: new Date(Date.now() + process.env.jwt_cookie_expire * 24 * 60 * 60 * 1000), // Convert to days
httpOnly: true,
};
diff --git a/src/webapi/dockerize.sh b/src/webapi/dockerize.sh
new file mode 100644
index 0000000..7e83fe6
--- /dev/null
+++ b/src/webapi/dockerize.sh
@@ -0,0 +1,2 @@
+docker build -t prasadhonrao/devcamper-webapi .
+docker push prasadhonrao/devcamper-webapi
\ No newline at end of file
diff --git a/api/eslint.config.js b/src/webapi/eslint.config.js
similarity index 100%
rename from api/eslint.config.js
rename to src/webapi/eslint.config.js
diff --git a/api/middleware/advancedResults.js b/src/webapi/middleware/advancedResults.js
similarity index 100%
rename from api/middleware/advancedResults.js
rename to src/webapi/middleware/advancedResults.js
diff --git a/api/middleware/asyncHandler.js b/src/webapi/middleware/asyncHandler.js
similarity index 100%
rename from api/middleware/asyncHandler.js
rename to src/webapi/middleware/asyncHandler.js
diff --git a/api/middleware/auth.js b/src/webapi/middleware/auth.js
similarity index 95%
rename from api/middleware/auth.js
rename to src/webapi/middleware/auth.js
index 2ce1bc4..8b295dd 100644
--- a/api/middleware/auth.js
+++ b/src/webapi/middleware/auth.js
@@ -20,7 +20,7 @@ const protect = asyncHandler(async (req, res, next) => {
try {
// Verify token
- const decoded = jwt.verify(token, process.env.JWT_SECRET);
+ const decoded = jwt.verify(token, process.env.jwt_secret);
// Find user by id and set it to req.user so that we can use it in the controller
req.user = await User.findById(decoded.id).select('-password'); // This is the id from JWT payload
diff --git a/api/middleware/errorHandler.js b/src/webapi/middleware/errorHandler.js
similarity index 92%
rename from api/middleware/errorHandler.js
rename to src/webapi/middleware/errorHandler.js
index 630ea02..e19f1e6 100644
--- a/api/middleware/errorHandler.js
+++ b/src/webapi/middleware/errorHandler.js
@@ -4,6 +4,9 @@ function errorHandler(err, req, res, next) {
let error = { ...err };
error.message = err.message;
+ // Log to console for dev
+ console.log(`Error: ${err.stack}`.red);
+
// Mongoose bad ObjectId
if (err.name === 'CastError') {
const message = `Resource not found with id of ${err.value}`;
diff --git a/api/models/Bootcamp.js b/src/webapi/models/Bootcamp.js
similarity index 100%
rename from api/models/Bootcamp.js
rename to src/webapi/models/Bootcamp.js
diff --git a/api/models/Course.js b/src/webapi/models/Course.js
similarity index 100%
rename from api/models/Course.js
rename to src/webapi/models/Course.js
diff --git a/api/models/Review.js b/src/webapi/models/Review.js
similarity index 100%
rename from api/models/Review.js
rename to src/webapi/models/Review.js
diff --git a/api/models/User.js b/src/webapi/models/User.js
similarity index 96%
rename from api/models/User.js
rename to src/webapi/models/User.js
index 38a6273..ec9414e 100644
--- a/api/models/User.js
+++ b/src/webapi/models/User.js
@@ -52,9 +52,9 @@ UserSchema.methods.getSignedJwtToken = function () {
{
id: this._id,
},
- process.env.JWT_SECRET,
+ process.env.jwt_secret,
{
- expiresIn: process.env.JWT_EXPIRE,
+ expiresIn: process.env.jwt_expire,
}
);
};
diff --git a/api/package-lock.json b/src/webapi/package-lock.json
similarity index 100%
rename from api/package-lock.json
rename to src/webapi/package-lock.json
diff --git a/api/package.json b/src/webapi/package.json
similarity index 100%
rename from api/package.json
rename to src/webapi/package.json
diff --git a/api/public/uploads/photo_5d725a1b7b292f5f8ceff788.jpg b/src/webapi/public/uploads/photo_5d725a1b7b292f5f8ceff788.jpg
similarity index 100%
rename from api/public/uploads/photo_5d725a1b7b292f5f8ceff788.jpg
rename to src/webapi/public/uploads/photo_5d725a1b7b292f5f8ceff788.jpg
diff --git a/api/routes/admin.js b/src/webapi/routes/admin.js
similarity index 100%
rename from api/routes/admin.js
rename to src/webapi/routes/admin.js
diff --git a/api/routes/bootcamps.js b/src/webapi/routes/bootcamps.js
similarity index 100%
rename from api/routes/bootcamps.js
rename to src/webapi/routes/bootcamps.js
diff --git a/api/routes/courses.js b/src/webapi/routes/courses.js
similarity index 100%
rename from api/routes/courses.js
rename to src/webapi/routes/courses.js
diff --git a/api/routes/home.js b/src/webapi/routes/home.js
similarity index 100%
rename from api/routes/home.js
rename to src/webapi/routes/home.js
diff --git a/api/routes/reviews.js b/src/webapi/routes/reviews.js
similarity index 100%
rename from api/routes/reviews.js
rename to src/webapi/routes/reviews.js
diff --git a/api/routes/user.js b/src/webapi/routes/user.js
similarity index 100%
rename from api/routes/user.js
rename to src/webapi/routes/user.js
diff --git a/api/seeder.js b/src/webapi/seeder.js
similarity index 100%
rename from api/seeder.js
rename to src/webapi/seeder.js
diff --git a/api/server.js b/src/webapi/server.js
similarity index 91%
rename from api/server.js
rename to src/webapi/server.js
index 7adb732..812ec42 100644
--- a/api/server.js
+++ b/src/webapi/server.js
@@ -36,8 +36,11 @@ app.use(mongoSanitize()); // Sanitize data
app.use(helmet()); // Set security headers
app.use(xss()); // Prevent cross site scripting attacks
-const rateLimitMax = process.env.RATE_LIMIT_MAX || 100;
-const rateLimitWindowMs = process.env.RATE_LIMIT_WINDOW_MS || 15 * 60 * 1000; // Default to 15 minutes
+// Trust the proxies
+app.set('trust proxy', 1);
+
+const rateLimitMax = process.env.rate_limit_max || 100;
+const rateLimitWindowMs = process.env.rate_limit_window || 15 * 60 * 1000; // Default to 15 minutes
const limiter = rateLimit({
windowMs: rateLimitWindowMs, // Use environment variable or default to 15 minutes
diff --git a/api/tests/unit/sample.unit.test.js b/src/webapi/tests/unit/sample.unit.test.js
similarity index 100%
rename from api/tests/unit/sample.unit.test.js
rename to src/webapi/tests/unit/sample.unit.test.js
diff --git a/api/utils/errorResponse.js b/src/webapi/utils/errorResponse.js
similarity index 100%
rename from api/utils/errorResponse.js
rename to src/webapi/utils/errorResponse.js
diff --git a/api/utils/geocoder.js b/src/webapi/utils/geocoder.js
similarity index 100%
rename from api/utils/geocoder.js
rename to src/webapi/utils/geocoder.js
diff --git a/api/utils/sendEmail.js b/src/webapi/utils/sendEmail.js
similarity index 71%
rename from api/utils/sendEmail.js
rename to src/webapi/utils/sendEmail.js
index 7a9c643..98bbc89 100644
--- a/api/utils/sendEmail.js
+++ b/src/webapi/utils/sendEmail.js
@@ -4,18 +4,18 @@ import loadEnvironmentConfig from '../config/env.js';
loadEnvironmentConfig();
const transporter = nodemailer.createTransport({
- host: process.env.SMTP_HOST,
- port: process.env.SMTP_PORT,
+ host: process.env.smtp_host,
+ port: process.env.smtp_port,
secure: false,
auth: {
- user: process.env.SMTP_EMAIL,
- pass: process.env.SMTP_PASSWORD,
+ user: process.env.smtp_email,
+ pass: process.env.smtp_password,
},
});
const sendEmail = async (options) => {
const message = {
- from: `${process.env.FROM_NAME}<${process.env.FROM_EMAIL}>`, // sender address
+ from: `${process.env.from_name}<${process.env.from_email}>`, // sender address
to: options.email, // list of receivers
subject: options.subject, // Subject line
text: options.message, // plain text body
diff --git a/ui/.gitignore b/src/webapp/.gitignore
similarity index 100%
rename from ui/.gitignore
rename to src/webapp/.gitignore
diff --git a/ui/Dockerfile b/src/webapp/Dockerfile
similarity index 62%
rename from ui/Dockerfile
rename to src/webapp/Dockerfile
index fbdedf5..1548e35 100644
--- a/ui/Dockerfile
+++ b/src/webapp/Dockerfile
@@ -1,5 +1,5 @@
-# Use the official Node.js image as the base image
-FROM node:14-alpine
+# Stage 1: Build the React application
+FROM node:14 AS build
# Set the working directory
WORKDIR /app
@@ -20,11 +20,20 @@ ENV REACT_APP_DEVCAMPER_BASE_API_URI=${REACT_APP_DEVCAMPER_BASE_API_URI}
# Build the React application
RUN npm run build
+# Stage 2: Serve the React application
+FROM node:14 AS serve
+
# Install a simple HTTP server to serve the static files
RUN npm install -g serve
+# Set the working directory
+WORKDIR /app
+
+# Copy the build artifacts from the previous stage
+COPY --from=build /app/build ./build
+
# Expose the port the app runs on
EXPOSE 3000
-# Start the application
-CMD ["serve", "-s", "build", "-l", "3000"]
\ No newline at end of file
+# Serve the React application
+CMD ["serve", "-s", "build"]
\ No newline at end of file
diff --git a/src/webapp/dockerize.sh b/src/webapp/dockerize.sh
new file mode 100644
index 0000000..ae4d952
--- /dev/null
+++ b/src/webapp/dockerize.sh
@@ -0,0 +1,2 @@
+docker build -t prasadhonrao/devcamper-webapp .
+docker push prasadhonrao/devcamper-webapp
\ No newline at end of file
diff --git a/ui/eslint.config.mjs b/src/webapp/eslint.config.mjs
similarity index 100%
rename from ui/eslint.config.mjs
rename to src/webapp/eslint.config.mjs
diff --git a/ui/package-lock.json b/src/webapp/package-lock.json
similarity index 99%
rename from ui/package-lock.json
rename to src/webapp/package-lock.json
index a9f6ee1..f337d9b 100644
--- a/ui/package-lock.json
+++ b/src/webapp/package-lock.json
@@ -1,11 +1,11 @@
{
- "name": "devcamper-ui",
+ "name": "devcamper-webapp",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "devcamper-ui",
+ "name": "devcamper-webapp",
"version": "1.0.0",
"dependencies": {
"bootstrap": "^5.3.3",
diff --git a/ui/package.json b/src/webapp/package.json
similarity index 97%
rename from ui/package.json
rename to src/webapp/package.json
index 2c33f40..9f7dab0 100644
--- a/ui/package.json
+++ b/src/webapp/package.json
@@ -1,5 +1,5 @@
{
- "name": "devcamper-ui",
+ "name": "devcamper-webapp",
"version": "1.0.0",
"private": true,
"dependencies": {
diff --git a/src/webapp/public/config/config.json b/src/webapp/public/config/config.json
new file mode 100644
index 0000000..33af519
--- /dev/null
+++ b/src/webapp/public/config/config.json
@@ -0,0 +1,8 @@
+{
+ "development": {
+ "react_app_devcamper_base_api_uri": "http://localhost:5000/api/v1"
+ },
+ "production": {
+ "react_app_devcamper_base_api_uri": "http://devcamper.webapi/api/v1"
+ }
+}
diff --git a/ui/public/favicon.ico b/src/webapp/public/favicon.ico
similarity index 100%
rename from ui/public/favicon.ico
rename to src/webapp/public/favicon.ico
diff --git a/assets/html/img/image_1.jpg b/src/webapp/public/images/image_1.jpg
similarity index 100%
rename from assets/html/img/image_1.jpg
rename to src/webapp/public/images/image_1.jpg
diff --git a/assets/html/img/image_2.jpg b/src/webapp/public/images/image_2.jpg
similarity index 100%
rename from assets/html/img/image_2.jpg
rename to src/webapp/public/images/image_2.jpg
diff --git a/assets/html/img/image_3.jpg b/src/webapp/public/images/image_3.jpg
similarity index 100%
rename from assets/html/img/image_3.jpg
rename to src/webapp/public/images/image_3.jpg
diff --git a/assets/html/img/image_4.jpg b/src/webapp/public/images/image_4.jpg
similarity index 100%
rename from assets/html/img/image_4.jpg
rename to src/webapp/public/images/image_4.jpg
diff --git a/ui/public/images/no-photo.png b/src/webapp/public/images/no-photo.png
similarity index 100%
rename from ui/public/images/no-photo.png
rename to src/webapp/public/images/no-photo.png
diff --git a/ui/public/images/photo_5d726e0b7b292f5f8ceff798.jpeg b/src/webapp/public/images/photo_5d726e0b7b292f5f8ceff798.jpeg
similarity index 100%
rename from ui/public/images/photo_5d726e0b7b292f5f8ceff798.jpeg
rename to src/webapp/public/images/photo_5d726e0b7b292f5f8ceff798.jpeg
diff --git a/ui/public/images/photo_5d726e9b7b292f5f8ceff800.jpeg b/src/webapp/public/images/photo_5d726e9b7b292f5f8ceff800.jpeg
similarity index 100%
rename from ui/public/images/photo_5d726e9b7b292f5f8ceff800.jpeg
rename to src/webapp/public/images/photo_5d726e9b7b292f5f8ceff800.jpeg
diff --git a/assets/html/img/showcase.jpg b/src/webapp/public/images/showcase.jpg
similarity index 100%
rename from assets/html/img/showcase.jpg
rename to src/webapp/public/images/showcase.jpg
diff --git a/ui/public/index.html b/src/webapp/public/index.html
similarity index 100%
rename from ui/public/index.html
rename to src/webapp/public/index.html
diff --git a/ui/public/logo.png b/src/webapp/public/logo.png
similarity index 100%
rename from ui/public/logo.png
rename to src/webapp/public/logo.png
diff --git a/ui/public/robots.txt b/src/webapp/public/robots.txt
similarity index 100%
rename from ui/public/robots.txt
rename to src/webapp/public/robots.txt
diff --git a/ui/src/App.js b/src/webapp/src/App.js
similarity index 100%
rename from ui/src/App.js
rename to src/webapp/src/App.js
diff --git a/ui/src/bootstrap.css b/src/webapp/src/bootstrap.css
similarity index 100%
rename from ui/src/bootstrap.css
rename to src/webapp/src/bootstrap.css
diff --git a/ui/src/components/Bootcamp.jsx b/src/webapp/src/components/Bootcamp.jsx
similarity index 100%
rename from ui/src/components/Bootcamp.jsx
rename to src/webapp/src/components/Bootcamp.jsx
diff --git a/ui/src/components/Footer.jsx b/src/webapp/src/components/Footer.jsx
similarity index 100%
rename from ui/src/components/Footer.jsx
rename to src/webapp/src/components/Footer.jsx
diff --git a/ui/src/components/Header.jsx b/src/webapp/src/components/Header.jsx
similarity index 100%
rename from ui/src/components/Header.jsx
rename to src/webapp/src/components/Header.jsx
diff --git a/ui/src/components/Layout.jsx b/src/webapp/src/components/Layout.jsx
similarity index 100%
rename from ui/src/components/Layout.jsx
rename to src/webapp/src/components/Layout.jsx
diff --git a/ui/src/components/Pagination.jsx b/src/webapp/src/components/Pagination.jsx
similarity index 100%
rename from ui/src/components/Pagination.jsx
rename to src/webapp/src/components/Pagination.jsx
diff --git a/ui/src/components/index.js b/src/webapp/src/components/index.js
similarity index 100%
rename from ui/src/components/index.js
rename to src/webapp/src/components/index.js
diff --git a/ui/src/contexts/AuthContext.js b/src/webapp/src/contexts/AuthContext.js
similarity index 100%
rename from ui/src/contexts/AuthContext.js
rename to src/webapp/src/contexts/AuthContext.js
diff --git a/ui/src/helpers/NumberFormat.js b/src/webapp/src/helpers/NumberFormat.js
similarity index 100%
rename from ui/src/helpers/NumberFormat.js
rename to src/webapp/src/helpers/NumberFormat.js
diff --git a/ui/src/helpers/auth.js b/src/webapp/src/helpers/auth.js
similarity index 100%
rename from ui/src/helpers/auth.js
rename to src/webapp/src/helpers/auth.js
diff --git a/ui/src/index.css b/src/webapp/src/index.css
similarity index 100%
rename from ui/src/index.css
rename to src/webapp/src/index.css
diff --git a/ui/src/index.js b/src/webapp/src/index.js
similarity index 100%
rename from ui/src/index.js
rename to src/webapp/src/index.js
diff --git a/ui/src/pages/AboutPage.jsx b/src/webapp/src/pages/AboutPage.jsx
similarity index 100%
rename from ui/src/pages/AboutPage.jsx
rename to src/webapp/src/pages/AboutPage.jsx
diff --git a/ui/src/pages/HomePage.jsx b/src/webapp/src/pages/HomePage.jsx
similarity index 100%
rename from ui/src/pages/HomePage.jsx
rename to src/webapp/src/pages/HomePage.jsx
diff --git a/ui/src/pages/NotFoundPage.jsx b/src/webapp/src/pages/NotFoundPage.jsx
similarity index 100%
rename from ui/src/pages/NotFoundPage.jsx
rename to src/webapp/src/pages/NotFoundPage.jsx
diff --git a/ui/src/pages/bootcamps/AddBootcampPage.jsx b/src/webapp/src/pages/bootcamps/AddBootcampPage.jsx
similarity index 100%
rename from ui/src/pages/bootcamps/AddBootcampPage.jsx
rename to src/webapp/src/pages/bootcamps/AddBootcampPage.jsx
diff --git a/ui/src/pages/bootcamps/AddCoursePage.jsx b/src/webapp/src/pages/bootcamps/AddCoursePage.jsx
similarity index 100%
rename from ui/src/pages/bootcamps/AddCoursePage.jsx
rename to src/webapp/src/pages/bootcamps/AddCoursePage.jsx
diff --git a/src/webapp/src/pages/bootcamps/AddReviewPage.jsx b/src/webapp/src/pages/bootcamps/AddReviewPage.jsx
new file mode 100644
index 0000000..cc3483b
--- /dev/null
+++ b/src/webapp/src/pages/bootcamps/AddReviewPage.jsx
@@ -0,0 +1,67 @@
+import React, { useState } from 'react';
+import { Link, useParams } from 'react-router-dom';
+import { Form, Button, Container, Row, Col, Card } from 'react-bootstrap';
+import { AiOutlineLeft } from 'react-icons/ai';
+
+const AddReviewPage = () => {
+ const { bootcampId } = useParams(); // Get bootcampId from URL parameters
+ const [rating, setRating] = useState(8);
+
+ const handleRatingChange = (event) => {
+ setRating(event.target.value);
+ };
+
+ return (
+
+
+
+
+
+
+
+ Bootcamp Info
+
+
+ DevWorks Bootcamp
+ Write a Review
+ You must have attended and graduated this bootcamp to review.
+
+
+
+
+ Rating: {rating}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Submit Review
+
+
+
+
+
+
+
+
+ );
+};
+
+export default AddReviewPage;
diff --git a/ui/src/pages/bootcamps/BootcampDetailsPage.jsx b/src/webapp/src/pages/bootcamps/BootcampDetailsPage.jsx
similarity index 100%
rename from ui/src/pages/bootcamps/BootcampDetailsPage.jsx
rename to src/webapp/src/pages/bootcamps/BootcampDetailsPage.jsx
diff --git a/ui/src/pages/bootcamps/BootcampReviewsPage.jsx b/src/webapp/src/pages/bootcamps/BootcampReviewsPage.jsx
similarity index 100%
rename from ui/src/pages/bootcamps/BootcampReviewsPage.jsx
rename to src/webapp/src/pages/bootcamps/BootcampReviewsPage.jsx
diff --git a/ui/src/pages/bootcamps/BootcampsPage.jsx b/src/webapp/src/pages/bootcamps/BootcampsPage.jsx
similarity index 100%
rename from ui/src/pages/bootcamps/BootcampsPage.jsx
rename to src/webapp/src/pages/bootcamps/BootcampsPage.jsx
diff --git a/ui/src/pages/bootcamps/ManageBootcampPage.jsx b/src/webapp/src/pages/bootcamps/ManageBootcampPage.jsx
similarity index 100%
rename from ui/src/pages/bootcamps/ManageBootcampPage.jsx
rename to src/webapp/src/pages/bootcamps/ManageBootcampPage.jsx
diff --git a/ui/src/pages/bootcamps/ManageBootcampsPage.jsx b/src/webapp/src/pages/bootcamps/ManageBootcampsPage.jsx
similarity index 100%
rename from ui/src/pages/bootcamps/ManageBootcampsPage.jsx
rename to src/webapp/src/pages/bootcamps/ManageBootcampsPage.jsx
diff --git a/ui/src/pages/bootcamps/ManageCoursesPage.jsx b/src/webapp/src/pages/bootcamps/ManageCoursesPage.jsx
similarity index 100%
rename from ui/src/pages/bootcamps/ManageCoursesPage.jsx
rename to src/webapp/src/pages/bootcamps/ManageCoursesPage.jsx
diff --git a/src/webapp/src/pages/bootcamps/ManageReviewsPage.jsx b/src/webapp/src/pages/bootcamps/ManageReviewsPage.jsx
new file mode 100644
index 0000000..019d075
--- /dev/null
+++ b/src/webapp/src/pages/bootcamps/ManageReviewsPage.jsx
@@ -0,0 +1,62 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { Table, Container, Row, Col, Card, Button } from 'react-bootstrap';
+import { GrEdit, GrClose } from 'react-icons/gr';
+
+const bootcamps = [
+ {
+ id: 1,
+ name: 'DevWorks Bootcamp',
+ rating: 10,
+ },
+ {
+ id: 2,
+ name: 'AI Bootcamp',
+ rating: 8,
+ },
+];
+
+const ManageReviewsPage = () => {
+ return (
+
+
+
+
+
+ Manage Reviews
+
+
+
+ Bootcamp
+ Rating
+
+
+
+
+ {bootcamps.map((b) => (
+
+ {b.name}
+ {b.rating}
+
+
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
+
+
+ );
+};
+
+export default ManageReviewsPage;
diff --git a/ui/src/pages/bootcamps/index.js b/src/webapp/src/pages/bootcamps/index.js
similarity index 100%
rename from ui/src/pages/bootcamps/index.js
rename to src/webapp/src/pages/bootcamps/index.js
diff --git a/ui/src/pages/index.js b/src/webapp/src/pages/index.js
similarity index 100%
rename from ui/src/pages/index.js
rename to src/webapp/src/pages/index.js
diff --git a/ui/src/pages/user/LoginPage.jsx b/src/webapp/src/pages/user/LoginPage.jsx
similarity index 100%
rename from ui/src/pages/user/LoginPage.jsx
rename to src/webapp/src/pages/user/LoginPage.jsx
diff --git a/ui/src/pages/user/ManageAccountPage.jsx b/src/webapp/src/pages/user/ManageAccountPage.jsx
similarity index 100%
rename from ui/src/pages/user/ManageAccountPage.jsx
rename to src/webapp/src/pages/user/ManageAccountPage.jsx
diff --git a/ui/src/pages/user/RegisterPage.jsx b/src/webapp/src/pages/user/RegisterPage.jsx
similarity index 100%
rename from ui/src/pages/user/RegisterPage.jsx
rename to src/webapp/src/pages/user/RegisterPage.jsx
diff --git a/src/webapp/src/pages/user/ResetPasswordPage.jsx b/src/webapp/src/pages/user/ResetPasswordPage.jsx
new file mode 100644
index 0000000..d4db4a1
--- /dev/null
+++ b/src/webapp/src/pages/user/ResetPasswordPage.jsx
@@ -0,0 +1,37 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+import { Form, Button, Container, Row, Col, Card } from 'react-bootstrap';
+
+const ResetPasswordPage = () => {
+ return (
+
+
+
+
+
+ Back to login
+
+ Reset Password
+ Use this form to reset your password using the registered email address.
+
+
+ {/* Email Input Section*/}
+
+ Enter Email
+
+
+
+ {/* Submit Button */}
+
+ Reset Password
+
+
+
+
+
+
+
+ );
+};
+
+export default ResetPasswordPage;
diff --git a/src/webapp/src/pages/user/UpdatePasswordPage.jsx b/src/webapp/src/pages/user/UpdatePasswordPage.jsx
new file mode 100644
index 0000000..c8c1963
--- /dev/null
+++ b/src/webapp/src/pages/user/UpdatePasswordPage.jsx
@@ -0,0 +1,46 @@
+import React from 'react';
+import { Form, Button, Container, Row, Col, Card } from 'react-bootstrap';
+
+const UpdatePasswordPage = () => {
+ return (
+
+
+
+
+
+ Update Password
+
+ {/* Current Password */}
+
+ Current Password
+
+
+
+ {/* New Password */}
+
+ New Password
+
+
+
+ {/* Confirm New Password */}
+
+ Confirm New Password
+
+
+
+ {/* Submit Button */}
+
+
+ Update Password
+
+
+
+
+
+
+
+
+ );
+};
+
+export default UpdatePasswordPage;
diff --git a/ui/src/pages/user/index.js b/src/webapp/src/pages/user/index.js
similarity index 100%
rename from ui/src/pages/user/index.js
rename to src/webapp/src/pages/user/index.js
diff --git a/ui/src/routes/ProtectedRoute.js b/src/webapp/src/routes/ProtectedRoute.js
similarity index 100%
rename from ui/src/routes/ProtectedRoute.js
rename to src/webapp/src/routes/ProtectedRoute.js
diff --git a/ui/src/services/adminService.js b/src/webapp/src/services/adminService.js
similarity index 65%
rename from ui/src/services/adminService.js
rename to src/webapp/src/services/adminService.js
index 74478d8..058d40d 100644
--- a/ui/src/services/adminService.js
+++ b/src/webapp/src/services/adminService.js
@@ -1,8 +1,9 @@
-const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI + '/admin';
+import { fetchApiEndPoint } from '../utils/configService';
const adminService = {
getUsers: async () => {
- const res = await fetch(`${API_BASE_URI}/users`);
+ const uri = await fetchApiEndPoint(`/admin/users`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch users');
}
@@ -10,7 +11,8 @@ const adminService = {
},
getUser: async (id) => {
- const res = await fetch(`${API_BASE_URI}/users/${id}`);
+ const uri = await fetchApiEndPoint(`/admin/users/${id}`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch user');
}
@@ -18,7 +20,8 @@ const adminService = {
},
createUser: async (user) => {
- const res = await fetch(`${API_BASE_URI}/users`, {
+ const uri = await fetchApiEndPoint(`/admin/users`);
+ const res = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -32,7 +35,8 @@ const adminService = {
},
updateUser: async (id, user) => {
- const res = await fetch(`${API_BASE_URI}/users/${id}`, {
+ const uri = await fetchApiEndPoint(`/admin/users/${id}`);
+ const res = await fetch(uri, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
@@ -46,7 +50,8 @@ const adminService = {
},
deleteUser: async (id) => {
- const res = await fetch(`${API_BASE_URI}/users/${id}`, {
+ const uri = await fetchApiEndPoint(`/admin/users/${id}`);
+ const res = await fetch(uri, {
method: 'DELETE',
});
if (!res.ok) {
diff --git a/ui/src/services/bootcampService.js b/src/webapp/src/services/bootcampService.js
similarity index 64%
rename from ui/src/services/bootcampService.js
rename to src/webapp/src/services/bootcampService.js
index 77718dd..2b48ba1 100644
--- a/ui/src/services/bootcampService.js
+++ b/src/webapp/src/services/bootcampService.js
@@ -1,19 +1,21 @@
import { getAuthHeaders } from '../helpers/auth';
-
-const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI;
+import { fetchApiEndPoint } from '../utils/configService';
const bootcampService = {
getBootcamps: async (fields) => {
const query = fields ? `?select=${fields.join(',')}` : '';
- const res = await fetch(`${API_BASE_URI}/bootcamps${query}`);
+ const uri = await fetchApiEndPoint(`/bootcamps${query}`);
+ const res = await fetch(uri);
if (!res.ok) {
+ console.log(`Failed to fetch bootcamps: ${res.status}`);
throw new Error('Failed to fetch bootcamps');
}
return res.json();
},
getBootcampsByPublisher: async (publisherId) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps/publisher/${publisherId}`, {
+ const uri = await fetchApiEndPoint(`/bootcamps/publisher/${publisherId}`);
+ const res = await fetch(uri, {
headers: getAuthHeaders(),
});
if (!res.ok) {
@@ -23,7 +25,8 @@ const bootcampService = {
},
getBootcamp: async (id) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps/${id}`);
+ const uri = await fetchApiEndPoint(`/bootcamps/${id}`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch bootcamp');
}
@@ -31,7 +34,8 @@ const bootcampService = {
},
createBootcamp: async (bootcamp) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps`, {
+ const uri = await fetchApiEndPoint(`/bootcamps`);
+ const res = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -45,7 +49,8 @@ const bootcampService = {
},
updateBootcamp: async (id, bootcamp) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps/${id}`, {
+ const uri = await fetchApiEndPoint(`/bootcamps/${id}`);
+ const res = await fetch(uri, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
@@ -59,7 +64,8 @@ const bootcampService = {
},
deleteBootcamp: async (id) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps/${id}`, {
+ const uri = await fetchApiEndPoint(`/bootcamps/${id}`);
+ const res = await fetch(uri, {
method: 'DELETE',
});
if (!res.ok) {
@@ -69,7 +75,8 @@ const bootcampService = {
},
getBootcampsInRadius: async (zipcode, distance) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps/radius/${zipcode}/${distance}`);
+ const uri = await fetchApiEndPoint(`/bootcamps/radius/${zipcode}/${distance}`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch bootcamps in radius');
}
@@ -77,7 +84,8 @@ const bootcampService = {
},
getCoursesByBootcampId: async (bootcampId) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps/${bootcampId}/courses`);
+ const uri = await fetchApiEndPoint(`/bootcamps/${bootcampId}/courses`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch bootcamp courses');
}
diff --git a/ui/src/services/courseService.js b/src/webapp/src/services/courseService.js
similarity index 67%
rename from ui/src/services/courseService.js
rename to src/webapp/src/services/courseService.js
index c2ba922..4107733 100644
--- a/ui/src/services/courseService.js
+++ b/src/webapp/src/services/courseService.js
@@ -1,8 +1,9 @@
-const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI + '/courses';
+import { fetchApiEndPoint } from '../utils/configService';
const courseService = {
getCourses: async () => {
- const res = await fetch(`${API_BASE_URI}/`);
+ const uri = await fetchApiEndPoint(`/courses`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch courses');
}
@@ -10,7 +11,8 @@ const courseService = {
},
getCourse: async (courseId) => {
- const res = await fetch(`${API_BASE_URI}/${courseId}`);
+ const uri = await fetchApiEndPoint(`/courses/${courseId}`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch course');
}
@@ -18,7 +20,8 @@ const courseService = {
},
createCourse: async (bootcampId, course, token) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps/${bootcampId}/`, {
+ const uri = await fetchApiEndPoint(`/courses/bootcamps/${bootcampId}/`);
+ const res = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -33,7 +36,8 @@ const courseService = {
},
updateCourse: async (courseId, course) => {
- const res = await fetch(`${API_BASE_URI}/${courseId}`, {
+ const uri = await fetchApiEndPoint(`/courses/${courseId}`);
+ const res = await fetch(uri, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
@@ -47,7 +51,8 @@ const courseService = {
},
deleteCourse: async (courseId) => {
- const res = await fetch(`${API_BASE_URI}/${courseId}`, {
+ const uri = await fetchApiEndPoint(`/courses/${courseId}`);
+ const res = await fetch(uri, {
method: 'DELETE',
});
if (!res.ok) {
diff --git a/ui/src/services/reviewService.js b/src/webapp/src/services/reviewService.js
similarity index 65%
rename from ui/src/services/reviewService.js
rename to src/webapp/src/services/reviewService.js
index ee59f5d..7235c9f 100644
--- a/ui/src/services/reviewService.js
+++ b/src/webapp/src/services/reviewService.js
@@ -1,8 +1,9 @@
-const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI;
+import { fetchApiEndPoint } from '../utils/configService';
const reviewService = {
getReviewsByBootcamp: async (bootcampId) => {
- const res = await fetch(`${API_BASE_URI}/bootcamps/${bootcampId}/reviews`);
+ const uri = await fetchApiEndPoint(`/bootcamps/${bootcampId}/reviews`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch reviews');
}
@@ -10,7 +11,8 @@ const reviewService = {
},
getReviews: async () => {
- const res = await fetch(`${API_BASE_URI}/reviews`);
+ const uri = await fetchApiEndPoint(`/reviews`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch reviews');
}
@@ -18,7 +20,8 @@ const reviewService = {
},
getReview: async (id) => {
- const res = await fetch(`${API_BASE_URI}/reviews/${id}`);
+ const uri = await fetchApiEndPoint(`/reviews/${id}`);
+ const res = await fetch(uri);
if (!res.ok) {
throw new Error('Failed to fetch review');
}
@@ -26,7 +29,8 @@ const reviewService = {
},
createReview: async (review) => {
- const res = await fetch(`${API_BASE_URI}/reviews`, {
+ const uri = await fetchApiEndPoint(`/reviews`);
+ const res = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -40,7 +44,8 @@ const reviewService = {
},
updateReview: async (id, review) => {
- const res = await fetch(`${API_BASE_URI}/reviews/${id}`, {
+ const uri = await fetchApiEndPoint(`/reviews/${id}`);
+ const res = await fetch(uri, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
@@ -54,7 +59,8 @@ const reviewService = {
},
deleteReview: async (id) => {
- const res = await fetch(`${API_BASE_URI}/reviews/${id}`, {
+ const uri = await fetchApiEndPoint(`/reviews/${id}`);
+ const res = await fetch(uri, {
method: 'DELETE',
});
if (!res.ok) {
diff --git a/ui/src/services/userService.js b/src/webapp/src/services/userService.js
similarity index 72%
rename from ui/src/services/userService.js
rename to src/webapp/src/services/userService.js
index cfe9fa1..b7a4362 100644
--- a/ui/src/services/userService.js
+++ b/src/webapp/src/services/userService.js
@@ -1,9 +1,10 @@
import { getToken } from '../helpers/auth';
-const API_BASE_URI = process.env.REACT_APP_DEVCAMPER_BASE_API_URI + '/user';
+import { fetchApiEndPoint } from '../utils/configService';
const userService = {
register: async (user) => {
- const res = await fetch(`${API_BASE_URI}/register`, {
+ const uri = await fetchApiEndPoint(`/user/register`);
+ const res = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -17,7 +18,8 @@ const userService = {
},
login: async (user) => {
- const res = await fetch(`${API_BASE_URI}/login`, {
+ const uri = await fetchApiEndPoint(`/user/login`);
+ const res = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -31,7 +33,8 @@ const userService = {
},
logout: async () => {
- const res = await fetch(`${API_BASE_URI}/logout`, {
+ const uri = await fetchApiEndPoint(`/user/logout`);
+ const res = await fetch(uri, {
method: 'GET',
});
if (!res.ok) {
@@ -41,8 +44,9 @@ const userService = {
},
getMe: async () => {
+ const uri = await fetchApiEndPoint(`/user/getMe`);
const token = getToken();
- const res = await fetch(`${API_BASE_URI}/me`, {
+ const res = await fetch(uri, {
method: 'GET',
headers: {
Authorization: `Bearer ${token}`,
@@ -55,7 +59,8 @@ const userService = {
},
forgotPassword: async (email) => {
- const res = await fetch(`${API_BASE_URI}/forgotpassword`, {
+ const uri = await fetchApiEndPoint(`/user/forgotpassword`);
+ const res = await fetch(uri, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -69,7 +74,8 @@ const userService = {
},
resetPassword: async (password) => {
- const res = await fetch(`${API_BASE_URI}/resetpassword`, {
+ const uri = await fetchApiEndPoint(`/user/resetpassword`);
+ const res = await fetch(uri, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
@@ -84,7 +90,8 @@ const userService = {
updateDetails: async (user) => {
const token = getToken();
- const res = await fetch(`${API_BASE_URI}/updatedetails`, {
+ const uri = await fetchApiEndPoint(`/user/updatedetails`);
+ const res = await fetch(uri, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
@@ -99,7 +106,8 @@ const userService = {
},
updatePassword: async (password) => {
- const res = await fetch(`${API_BASE_URI}/updatepassword`, {
+ const uri = await fetchApiEndPoint(`/user/updatepassword`);
+ const res = await fetch(uri, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
diff --git a/src/webapp/src/utils/configService.js b/src/webapp/src/utils/configService.js
new file mode 100644
index 0000000..0cc186d
--- /dev/null
+++ b/src/webapp/src/utils/configService.js
@@ -0,0 +1,27 @@
+let config = null;
+export const fetchConfig = async () => {
+ if (!config) {
+ const response = await fetch('/config/config.json');
+ if (!response.ok) {
+ throw new Error('Failed to fetch configuration');
+ }
+ const json = await response.json();
+ const env = process.env.NODE_ENV || 'development';
+ console.log(`Using configuration for environment: ${env}`);
+ console.log(`Configuration: ${JSON.stringify(json[env], null, 2)}`);
+ config = json[env];
+ }
+ return config;
+};
+
+export const getConfigValue = async (key) => {
+ const config = await fetchConfig();
+ return config[key];
+};
+
+export const fetchApiEndPoint = async (endpoint) => {
+ const config = await fetchConfig();
+ const api = config.react_app_devcamper_base_api_uri;
+ console.log(`fetchApi endpoint: ${api}${endpoint}`);
+ return `${api}${endpoint}`;
+};
diff --git a/ui/env.example b/ui/env.example
deleted file mode 100644
index fdc8557..0000000
--- a/ui/env.example
+++ /dev/null
@@ -1 +0,0 @@
-REACT_APP_DEVCAMPER_BASE_API_URI=http://localhost:5000
\ No newline at end of file
diff --git a/ui/public/images/image_1.jpg b/ui/public/images/image_1.jpg
deleted file mode 100644
index ab8e9d2..0000000
Binary files a/ui/public/images/image_1.jpg and /dev/null differ
diff --git a/ui/public/images/image_2.jpg b/ui/public/images/image_2.jpg
deleted file mode 100644
index 65a7cba..0000000
Binary files a/ui/public/images/image_2.jpg and /dev/null differ
diff --git a/ui/public/images/image_3.jpg b/ui/public/images/image_3.jpg
deleted file mode 100644
index 59778f7..0000000
Binary files a/ui/public/images/image_3.jpg and /dev/null differ
diff --git a/ui/public/images/image_4.jpg b/ui/public/images/image_4.jpg
deleted file mode 100644
index 789c7ba..0000000
Binary files a/ui/public/images/image_4.jpg and /dev/null differ
diff --git a/ui/public/images/showcase.jpg b/ui/public/images/showcase.jpg
deleted file mode 100644
index f23d4fc..0000000
Binary files a/ui/public/images/showcase.jpg and /dev/null differ
diff --git a/ui/src/pages/bootcamps/AddReviewPage.jsx b/ui/src/pages/bootcamps/AddReviewPage.jsx
deleted file mode 100644
index f4807dc..0000000
--- a/ui/src/pages/bootcamps/AddReviewPage.jsx
+++ /dev/null
@@ -1,67 +0,0 @@
-import { AiOutlineLeft } from 'react-icons/ai';
-import { Link, useParams } from 'react-router-dom'; // Import useParams to get bootcampId from URL
-import React, { useState } from 'react';
-
-const AddReviewPage = () => {
- const { bootcampId } = useParams(); // Get bootcampId from URL parameters
- const [rating, setRating] = useState(8);
-
- const handleRatingChange = (event) => {
- setRating(event.target.value);
- };
-
- return (
-
-
-
-
-
-
- {/* Update Link to go back to the specific bootcamp details */}
-
-
Bootcamp Info
-
-
-
DevWorks Bootcamp
-
Write a Review
-
You must have attended and graduated this bootcamp to review.
-
-
-
-
- Rating: {rating}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default AddReviewPage;
diff --git a/ui/src/pages/bootcamps/ManageReviewsPage.jsx b/ui/src/pages/bootcamps/ManageReviewsPage.jsx
deleted file mode 100644
index d33064f..0000000
--- a/ui/src/pages/bootcamps/ManageReviewsPage.jsx
+++ /dev/null
@@ -1,61 +0,0 @@
-import React from 'react';
-import { Link } from 'react-router-dom';
-import { GrEdit, GrClose } from 'react-icons/gr';
-
-const bootcamps = [
- {
- id: 1,
- name: 'DevWorks Bootcamp',
- rating: 10,
- },
- {
- id: 2,
- name: 'AI Bootcamp',
- rating: 8,
- },
-];
-
-const ManageReviewsPage = () => {
- return (
-
-
-
-
-
-
-
Manage Reviews
-
-
-
- Bootcamp
- Rating
-
-
-
-
- {bootcamps.map((b) => (
-
- {b.bootCampName}
- {b.bootCampRating}
-
-
-
-
-
-
-
-
-
- ))}
-
-
-
-
-
-
-
-
- );
-};
-
-export default ManageReviewsPage;
diff --git a/ui/src/pages/user/ResetPasswordPage.jsx b/ui/src/pages/user/ResetPasswordPage.jsx
deleted file mode 100644
index dc8ce54..0000000
--- a/ui/src/pages/user/ResetPasswordPage.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react';
-
-const ResetPasswordPage = () => {
- return ResetPasswordPage
;
-};
-
-export default ResetPasswordPage;
diff --git a/ui/src/pages/user/UpdatePasswordPage.jsx b/ui/src/pages/user/UpdatePasswordPage.jsx
deleted file mode 100644
index 356a632..0000000
--- a/ui/src/pages/user/UpdatePasswordPage.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-import React from 'react';
-
-const UpdatePasswordPage = () => {
- return UpdatePasswordPage
;
-};
-
-export default UpdatePasswordPage;