diff --git a/.github/workflows/README.md b/.github/workflows/README.md index bb1466fe5..053964d6a 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -68,14 +68,6 @@ workloads run using [GitHub self-hosted runners](https://help.github.com/en/acti - builds and pushes images to official GCR repo tagged with git commit - builds and pushes images to official GCR repo tagged as latest -### Update-Website.yaml - -#### Triggers -- release merged and commits pushed to main - -#### Actions -- push new prod version of the website to App Engine - ### Push-Tags.yaml #### Triggers @@ -164,12 +156,27 @@ workloads run using [GitHub self-hosted runners](https://help.github.com/en/acti - Checks kubernetes manifests to ensure develop is pinned to `latest`, and main is pinned to a version - Checks telemetry id to ensure develop is on `test` and main is on `prod` -### Staging-Website.yml +### Prod-Website.yaml + +#### Triggers +- release merged and commits pushed to main + +#### Actions +- push new prod version of the website to App Engine + +### Manual-Website.yml #### Triggers -- on each new push to develop - on manual trigger #### Actions - sets up a pre-prod GAE website deployment in `stackdriver-sandbox-230822` +### Develop-Website.yml + +#### Triggers +- on each new push to develop + +#### Actions +- sets up a pre-prod GAE website deployment in `stackdriver-sandbox-230822` + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d26c31dd7..4346e10dd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,15 @@ jobs: if [[ -n $(git status -s) ]]; then exit 1 fi + - name: Validate Schema of SRE Recipes Configs + run: | + set -x + # install dependencies + curl https://bootstrap.pypa.io/pip/3.5/get-pip.py -o get-pip.py + python3 get-pip.py + python3 -m pip install -r tests/requirements.txt + # run validations + python3 tests/recipes/validate_recipe_configs.py - name: Test Custom Cloud Shell Image Build run: | set -x diff --git a/sre-recipes/recipes/encoding_recipe/__init__.py b/.github/workflows/develop-website.yml similarity index 52% rename from sre-recipes/recipes/encoding_recipe/__init__.py rename to .github/workflows/develop-website.yml index 6913f02e3..571c6142c 100644 --- a/sre-recipes/recipes/encoding_recipe/__init__.py +++ b/.github/workflows/develop-website.yml @@ -11,3 +11,24 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. + +name: "Stage Website - Develop" +on: + push: + # run on pushes to develop + branches: + - develop +env: + PROJECT_ID: stackdriver-sandbox-230822 +jobs: + stage-website: + runs-on: [self-hosted, push-privilege] + steps: + - uses: actions/checkout@v2 + - name: Deploy Staged Website to App Engine + timeout-minutes: 20 + run: | + set -x + cp website/app.yaml website/staging.app.yaml + echo "service: develop" >> website/staging.app.yaml + gcloud app deploy website/staging.app.yaml diff --git a/.github/workflows/e2e-latest.yml b/.github/workflows/e2e-latest.yml index 01ea30c96..d19f9e730 100644 --- a/.github/workflows/e2e-latest.yml +++ b/.github/workflows/e2e-latest.yml @@ -73,6 +73,7 @@ jobs: docker run --rm \ -e project_id=${{ env.PROJECT_ID }} \ -e service_wait=1 \ + -e PYTHONDONTWRITEBYTECODE=1 \ -v ~/.config:/root/.config \ -v `pwd`:/sandbox-shared \ --entrypoint /sandbox-shared/.github/workflows/e2e_scripts/run_install.sh \ @@ -90,9 +91,22 @@ jobs: docker run --rm \ -e GOOGLE_CLOUD_PROJECT=${{ env.PROJECT_ID }} \ -e ZONE=$CLUSTER_ZONE \ + -e PYTHONDONTWRITEBYTECODE=1 \ -e LOADGEN_ZONE=$LOADGEN_ZONE \ -v ~/.config:/root/.config \ test-provisioning:$GITHUB_SHA + - name: Run SRE Recipes Tests + timeout-minutes: 30 + run: | + # build cloud shell image + docker build -t test-cloud-shell:$GITHUB_SHA ./cloud-shell + # run test script + docker run --rm \ + -v ~/.config:/root/.config \ + -v `pwd`:/sandbox-shared \ + -e PYTHONDONTWRITEBYTECODE=1 \ + --entrypoint /sandbox-shared/tests/recipes/test_recommendation_crash_recipe.sh \ + test-cloud-shell:$GITHUB_SHA - name: Run Monitoring Integration Tests timeout-minutes: 30 run: | diff --git a/.github/workflows/e2e-release.yml b/.github/workflows/e2e-release.yml index 7a552c35c..9f6833ce0 100644 --- a/.github/workflows/e2e-release.yml +++ b/.github/workflows/e2e-release.yml @@ -60,6 +60,7 @@ jobs: -e release_repo=${{ steps.website_variables.outputs.repo }} \ -e release_branch=${{ steps.website_variables.outputs.branch }} \ -e ISTIO_VERSION=1.7.1 \ + -e PYTHONDONTWRITEBYTECODE=1 \ -v ~/.config:/root/.config \ -v `pwd`:/sandbox-shared \ --entrypoint /sandbox-shared/.github/workflows/e2e_scripts/run_install.sh \ @@ -87,6 +88,7 @@ jobs: -e GOOGLE_CLOUD_PROJECT=${{ env.PROJECT_ID }} \ -e ZONE=$CLUSTER_ZONE \ -e LOADGEN_ZONE=$LOADGEN_ZONE \ + -e PYTHONDONTWRITEBYTECODE=1 \ -v ~/.config:/root/.config \ test-provisioning:$GITHUB_SHA-release - name: Run Monitoring Integration Tests @@ -115,6 +117,7 @@ jobs: -e release_dir=${{ steps.website_variables.outputs.dir }} \ -v ~/.config:/root/.config \ -v `pwd`:/sandbox-shared \ + -e PYTHONDONTWRITEBYTECODE=1 \ --entrypoint /sandbox-shared/.github/workflows/e2e_scripts/run_install.sh \ ${{ steps.website_variables.outputs.cloudshell_image }} - name: Clean Project State diff --git a/.github/workflows/e2e-upgrade.yml b/.github/workflows/e2e-upgrade.yml index ace27125c..f5f9bbf5c 100644 --- a/.github/workflows/e2e-upgrade.yml +++ b/.github/workflows/e2e-upgrade.yml @@ -64,6 +64,7 @@ jobs: -e release_repo=${{ steps.website_variables.outputs.repo }} \ -e release_branch=${{ steps.website_variables.outputs.branch }} \ -e ISTIO_VERSION=1.7.1 \ + -e PYTHONDONTWRITEBYTECODE=1 \ -v ~/.config:/root/.config \ -v `pwd`:/sandbox-shared \ --entrypoint /sandbox-shared/.github/workflows/e2e_scripts/run_install.sh \ @@ -103,6 +104,7 @@ jobs: docker run --rm \ -e project_id=${{ env.PROJECT_ID }} \ -e service_wait=1 \ + -e PYTHONDONTWRITEBYTECODE=1 \ -v ~/.config:/root/.config \ -v `pwd`:/sandbox-shared \ --entrypoint /sandbox-shared/.github/workflows/e2e_scripts/run_install.sh \ @@ -121,6 +123,7 @@ jobs: -e GOOGLE_CLOUD_PROJECT=${{ env.PROJECT_ID }} \ -e ZONE=$CLUSTER_ZONE \ -e LOADGEN_ZONE=$LOADGEN_ZONE \ + -e PYTHONDONTWRITEBYTECODE=1 \ -v ~/.config:/root/.config \ test-provisioning:$GITHUB_SHA - name: Run Monitoring Integration Tests diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 5cc721650..24a8bc73a 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -24,34 +24,32 @@ jobs: runs-on: ubuntu-latest if: github.ref == 'refs/heads/develop' steps: - - name: Validation + - name: Git Setup run: | set -x - export NEW_VERSION=${{ github.event.inputs.version }} + # clone repo + git clone https://github.com/GoogleCloudPlatform/cloud-ops-sandbox.git + cd cloud-ops-sandbox + git checkout develop + git config --global user.email "ci@cloud-ops-sandbox.dev" + git config --global user.name "CI" # validate version number (format: v0.0.0) + export NEW_VERSION=${{ github.event.inputs.version }} if [[ ! "${NEW_VERSION}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "${NEW_VERSION} argument must conform to regex string: ^v[0-9]+\.[0-9]+\.[0-9]+$ " echo "ex. v1.0.1" exit 1 fi # ensure not duplicate - if [[ "$NEW_VERSION" == $(git tag | grep $NEW_VERSION | cat) ]]; then + if [[ ! -z $(git tag | grep $NEW_VERSION | cat) ]]; then echo "$NEW_VERSION" tag already exists in project exit 1 fi - if [[ "$NEW_VERSION" == $(git branch | grep "release/$NEW_VERSION" | cat) ]]; then - echo "$NEW_VERSION" branch already exists in project + if [[ ! -z $(git branch -a | grep "release/$NEW_VERSION" | cat) ]]; then + echo "release/$NEW_VERSION" branch already exists in project exit 1 fi - - name: Git Setup - run: | - set -x - git clone https://github.com/daniel-sanche/cloud-ops-sandbox.git - cd cloud-ops-sandbox - git checkout develop - git config --global user.email "ci@cloud-ops-sandbox.dev" - git config --global user.name "CI" - + # create new release branch git fetch git checkout -b "release/${{ github.event.inputs.version }}" git merge --strategy-option theirs main @@ -76,6 +74,7 @@ jobs: sed -i -e "s/cloudshell_git_branch=v\([0-9\.]\+\)/cloudshell_git_branch=${NEW_VERSION}/g" ${REPO_ROOT}/website/deploy/index.html; sed -i -e "s/productVersion': 'v\([0-9\.]\+\)/productVersion': '${NEW_VERSION}/g" ${REPO_ROOT}/website/deploy/index.html; sed -i -e "s/uncertified:v\([0-9\.]\+\)/uncertified:${NEW_VERSION}/g" ${REPO_ROOT}/website/deploy/index.html; + sed -i -e "s/version = \"v\([0-9\.]\+\)\"/version = \"${NEW_VERSION}\"/g" ${REPO_ROOT}/website/config.toml; # update custom Cloud Shell image variable sed -i -e "s/VERSION=v\([0-9\.]\+\)/VERSION=${NEW_VERSION}/g" ${REPO_ROOT}/cloud-shell/Dockerfile; @@ -83,21 +82,12 @@ jobs: PROD_TOPIC="telemetry_prod" TEST_TOPIC="telemetry_test" sed -i -e "s/topic_id = \"${TEST_TOPIC}\"/topic_id = \"${PROD_TOPIC}\"/g" ${REPO_ROOT}/terraform/telemetry.py; - - name: Push changes - uses: ad-m/github-push-action@65392840bda2e774394d5cd38ca33e5918aec2d3 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - branch: "release/${{ github.event.inputs.version }}" - directory: cloud-ops-sandbox - tags: true - name: Build PR Body run: | cd cloud-ops-sandbox # find the changes commited to develop since last release PREV_HASH=$(git merge-base develop main) RECENT_HASH=$(git rev-parse develop) - DIFF=$(git log ${PREV_HASH}...${RECENT_HASH} --oneline) - echo -e $DIFF # print version number as title export NEW_VERSION=${{ github.event.inputs.version }} @@ -111,11 +101,11 @@ jobs: regexes=$(echo $i | tr "/" "\n" | tail -n 1) # create grep statements for each regex grep_formatted_regex=$(echo "--grep ^$regexes" | awk -F'|' -v OFS=" --grep ^" '$1=$1') - if [[ ! -z $(git log ${LAST_HASH}...${FIRST_HASH} $grep_formatted_regex) ]]; then + if [[ ! -z $(git log ${PREV_HASH}...${RECENT_HASH} $grep_formatted_regex) ]]; then # print the category title echo "### $title" >> PR.txt # print the commits in the category - git log ${LAST_HASH}...${FIRST_HASH} $grep_formatted_regex --oneline | cut -d " " -f2- | awk '{print "- " $0}' >> PR.txt + git log ${PREV_HASH}...${RECENT_HASH} $grep_formatted_regex --oneline | cut -d " " -f2- | awk '{print "- " $0}' >> PR.txt echo "" >> PR.txt fi done @@ -125,6 +115,7 @@ jobs: echo 'PULL_REQUEST_BODY<> $GITHUB_ENV cat PR.txt >> $GITHUB_ENV echo 'EOF' >> $GITHUB_ENV + rm PR.txt - name: Commit Changes run: | set -x @@ -134,6 +125,13 @@ jobs: git add . git commit -m "chore: update tags for release ${NEW_VERSION}" git tag "${NEW_VERSION}" + - name: Push changes + uses: ad-m/github-push-action@65392840bda2e774394d5cd38ca33e5918aec2d3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + branch: "release/${{ github.event.inputs.version }}" + directory: cloud-ops-sandbox + tags: true - name: Create Pull Request uses: vsoch/pull-request-action@29dbfc0acd2ac96b0ec14b9fd53fa12136130058 env: diff --git a/.github/workflows/manual-website-stage.yml b/.github/workflows/manual-website.yml similarity index 93% rename from .github/workflows/manual-website-stage.yml rename to .github/workflows/manual-website.yml index f37ab1e63..931437f62 100644 --- a/.github/workflows/manual-website-stage.yml +++ b/.github/workflows/manual-website.yml @@ -12,12 +12,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -name: "Stage Website" +name: "Stage Website - Manual" on: - push: - # run on pushes to develop - branches: - - develop workflow_dispatch: inputs: name: diff --git a/.github/workflows/update-website.yml b/.github/workflows/prod-website.yml similarity index 97% rename from .github/workflows/update-website.yml rename to .github/workflows/prod-website.yml index ab6cdcaea..60ca58273 100644 --- a/.github/workflows/update-website.yml +++ b/.github/workflows/prod-website.yml @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -name: "Update Website" +name: "Prod Website" on: push: # run on pushes to main (after merging release branches) diff --git a/.github/workflows/update-custom-image.yml b/.github/workflows/update-custom-image.yml index f23445176..34786ca99 100644 --- a/.github/workflows/update-custom-image.yml +++ b/.github/workflows/update-custom-image.yml @@ -30,9 +30,11 @@ on: jobs: build-trigger: runs-on: [self-hosted, push-privilege] - timeout-minutes: 30 + timeout-minutes: 100 steps: - uses: actions/checkout@v2 + with: + ref: develop - name: Run Cloud Build Trigger id: cloud_build run: | diff --git a/.gitignore b/.gitignore index d120fa29e..c28b45417 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,5 @@ terraform/istio/istioctl terraform/istio/istio-*/** .token skaffold -website/resources* \ No newline at end of file +website/resources* +srerecipes.log \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..46b2a08ea --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,43 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, +and in the interest of fostering an open and welcoming community, +we pledge to respect all people who contribute through reporting issues, +posting feature requests, updating documentation, +submitting pull requests or patches, and other activities. + +We are committed to making participation in this project +a harassment-free experience for everyone, +regardless of level of experience, gender, gender identity and expression, +sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, +such as physical or electronic +addresses, without explicit permission +* Other unethical or unprofessional conduct. + +Project maintainers have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct. +By adopting this Code of Conduct, +project maintainers commit themselves to fairly and consistently +applying these principles to every aspect of managing this project. +Project maintainers who do not follow or enforce the Code of Conduct +may be permanently removed from the project team. + +This code of conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior +may be reported by opening an issue +or contacting one or more of the project maintainers. + +This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, +available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/) diff --git a/README.md b/README.md index f6449a52a..1501e13dd 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ With Sandbox, we provide a tool that automatically provisions a new demo cluster Click the Cloud Shell button for automated one-click installation of a new Sandbox cluster in a new Google Cloud Project. -[![Open in Cloud Shell](http://www.gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https://github.com/GoogleCloudPlatform/cloud-ops-sandbox.git&cloudshell_git_branch=v0.7.0&shellonly=true&cloudshell_image=gcr.io/stackdriver-sandbox-230822/cloudshell-image/uncertified:v0.7.0&cloudshell_tutorial=docs/tutorial.md) +[![Open in Cloud Shell](http://www.gstatic.com/cloudssh/images/open-btn.svg)](https://console.cloud.google.com/cloudshell/editor?cloudshell_git_repo=https://github.com/GoogleCloudPlatform/cloud-ops-sandbox.git&cloudshell_git_branch=v0.7.1&shellonly=true&cloudshell_image=gcr.io/stackdriver-sandbox-230822/cloudshell-image/uncertified:v0.7.1&cloudshell_tutorial=docs/tutorial.md) __Note__: If installation stops due to billing account errors, set up the billing account and type: `sandboxctl create`. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..8b58ae9c0 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,7 @@ +# Security Policy + +To report a security issue, please use [g.co/vulnz](https://g.co/vulnz). + +The Google Security Team will respond within 5 working days of your report on g.co/vulnz. + +We use g.co/vulnz for our intake, and do coordination and disclosure here using GitHub Security Advisory to privately discuss and fix the issue. diff --git a/cloud-shell/Dockerfile b/cloud-shell/Dockerfile index e6a97a093..02674559d 100644 --- a/cloud-shell/Dockerfile +++ b/cloud-shell/Dockerfile @@ -24,12 +24,12 @@ RUN sudo apt-get install unzip && \ RUN sudo apt-get -y install postgresql-client jq # install python libraries -RUN python3 -m pip install google-cloud-pubsub -RUN python3 -m pip install click -RUN python3 -m pip install google-cloud-monitoring +RUN python3 -m pip install google-cloud-pubsub==2.6.0 +RUN python3 -m pip install click==8.0.1 +RUN python3 -m pip install google-cloud-monitoring==2.4.0 # set env var -RUN echo "VERSION=v0.7.0" >> /etc/environment +RUN echo "VERSION=v0.7.1" >> /etc/environment # Change "Open in Cloudshell" script to run `sandboxctl create` using local file and changing it COPY cloudshell_open_cp.sh /google/devshell/bashrc.google.d/cloudshell_open.sh diff --git a/cloud-shell/cloudbuild.yaml b/cloud-shell/cloudbuild.yaml index 5b243432e..f339321a4 100644 --- a/cloud-shell/cloudbuild.yaml +++ b/cloud-shell/cloudbuild.yaml @@ -18,7 +18,7 @@ steps: - name: 'gcr.io/cloud-builders/docker' entrypoint: 'bash' - timeout: 1800s + timeout: 6000s args: - '-c' - |- @@ -32,8 +32,8 @@ steps: git checkout develop docker build -t $$UNCERTIFIED_PATH:latest ./cloud-shell docker push $$UNCERTIFIED_PATH:latest - # build tags - for TAG in $(git tag | sort -V); do + # re-build recent tags + for TAG in $(git tag | sort -V | tail -3); do echo "checking out $$TAG" git checkout $$TAG # if cloud-build directory exists, build new container @@ -56,4 +56,4 @@ steps: docker push $$CERTIFIED_PATH:latest docker push $$CERTIFIED_PATH:$$LATEST_TAG logsBucket: 'gs://sandbox-cloud-build-logs' -timeout: 1800s +timeout: 6000s diff --git a/cloud-shell/cloudshell_open_cp.sh b/cloud-shell/cloudshell_open_cp.sh index 892882464..8f66fc38f 100644 --- a/cloud-shell/cloudshell_open_cp.sh +++ b/cloud-shell/cloudshell_open_cp.sh @@ -91,5 +91,7 @@ function cloudshell_open { # add terraform directory to path export PATH="~/cloudshell_open/cloud-ops-sandbox/terraform:$PATH" export PATH="~/cloudshell_open/stackdriver-sandbox/terraform:$PATH" + # ensure version environment variable is set + source /etc/environment sandboxctl create # This line automatically runs the install script when cloudshell button is pressed } diff --git a/kubernetes-manifests/adservice.yaml b/kubernetes-manifests/adservice.yaml index 3a57474a9..4dcd699c2 100644 --- a/kubernetes-manifests/adservice.yaml +++ b/kubernetes-manifests/adservice.yaml @@ -28,7 +28,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/adservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/adservice:v0.7.1 ports: - containerPort: 9555 env: diff --git a/kubernetes-manifests/cartservice.yaml b/kubernetes-manifests/cartservice.yaml index d4fe25c05..541307b99 100644 --- a/kubernetes-manifests/cartservice.yaml +++ b/kubernetes-manifests/cartservice.yaml @@ -32,7 +32,7 @@ spec: command: ['bin/sh', '-c', 'until nslookup redis-cart; do echo waiting for redis; sleep 2; done;'] containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/cartservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/cartservice:v0.7.1 ports: - containerPort: 7070 env: diff --git a/kubernetes-manifests/checkoutservice.yaml b/kubernetes-manifests/checkoutservice.yaml index 32a2510e1..63c2644ec 100644 --- a/kubernetes-manifests/checkoutservice.yaml +++ b/kubernetes-manifests/checkoutservice.yaml @@ -27,7 +27,7 @@ spec: spec: containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/checkoutservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/checkoutservice:v0.7.1 ports: - containerPort: 5050 readinessProbe: diff --git a/kubernetes-manifests/currencyservice.yaml b/kubernetes-manifests/currencyservice.yaml index a40a65f0f..39b26df08 100644 --- a/kubernetes-manifests/currencyservice.yaml +++ b/kubernetes-manifests/currencyservice.yaml @@ -28,7 +28,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/currencyservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/currencyservice:v0.7.1 ports: - name: grpc containerPort: 7000 diff --git a/kubernetes-manifests/emailservice.yaml b/kubernetes-manifests/emailservice.yaml index c5cc365fe..99df566eb 100644 --- a/kubernetes-manifests/emailservice.yaml +++ b/kubernetes-manifests/emailservice.yaml @@ -28,7 +28,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/emailservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/emailservice:v0.7.1 ports: - containerPort: 8080 readinessProbe: diff --git a/kubernetes-manifests/frontend.yaml b/kubernetes-manifests/frontend.yaml index 1d5af2939..24ea6a7a3 100644 --- a/kubernetes-manifests/frontend.yaml +++ b/kubernetes-manifests/frontend.yaml @@ -27,7 +27,7 @@ spec: spec: containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/frontend:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/frontend:v0.7.1 ports: - containerPort: 8080 readinessProbe: @@ -65,11 +65,11 @@ spec: value: "http://some.host" resources: requests: - cpu: 100m - memory: 64Mi - limits: cpu: 200m memory: 128Mi + limits: + cpu: 320m + memory: 256Mi --- apiVersion: v1 kind: Service diff --git a/kubernetes-manifests/paymentservice.yaml b/kubernetes-manifests/paymentservice.yaml index 8feb4c035..d1f0d1468 100644 --- a/kubernetes-manifests/paymentservice.yaml +++ b/kubernetes-manifests/paymentservice.yaml @@ -28,7 +28,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/paymentservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/paymentservice:v0.7.1 ports: - containerPort: 50051 readinessProbe: diff --git a/kubernetes-manifests/productcatalogservice.yaml b/kubernetes-manifests/productcatalogservice.yaml index 44ecf1144..e2cfceead 100644 --- a/kubernetes-manifests/productcatalogservice.yaml +++ b/kubernetes-manifests/productcatalogservice.yaml @@ -28,7 +28,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/productcatalogservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/productcatalogservice:v0.7.1 ports: - containerPort: 3550 readinessProbe: diff --git a/kubernetes-manifests/recommendationservice.yaml b/kubernetes-manifests/recommendationservice.yaml index cefedb853..4a02d033f 100644 --- a/kubernetes-manifests/recommendationservice.yaml +++ b/kubernetes-manifests/recommendationservice.yaml @@ -28,7 +28,7 @@ spec: terminationGracePeriodSeconds: 5 containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/recommendationservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/recommendationservice:v0.7.1 ports: - containerPort: 8080 env: diff --git a/kubernetes-manifests/shippingservice.yaml b/kubernetes-manifests/shippingservice.yaml index 988aa11df..a21021a7e 100644 --- a/kubernetes-manifests/shippingservice.yaml +++ b/kubernetes-manifests/shippingservice.yaml @@ -27,7 +27,7 @@ spec: spec: containers: - name: server - image: gcr.io/stackdriver-sandbox-230822/sandbox/shippingservice:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/shippingservice:v0.7.1 ports: - containerPort: 50051 readinessProbe: diff --git a/loadgenerator-manifests/loadgenerator.yaml b/loadgenerator-manifests/loadgenerator.yaml index 37737fdec..8e8562108 100644 --- a/loadgenerator-manifests/loadgenerator.yaml +++ b/loadgenerator-manifests/loadgenerator.yaml @@ -30,7 +30,7 @@ spec: spec: containers: - name: locust-main - image: gcr.io/stackdriver-sandbox-230822/sandbox/loadgenerator/gke:v0.7.0 + image: gcr.io/stackdriver-sandbox-230822/sandbox/loadgenerator/gke:v0.7.1 imagePullPolicy: Always env: - name: LOCUST_MODE diff --git a/src/currencyservice/package-lock.json b/src/currencyservice/package-lock.json index 774d49b83..b3111b5d2 100644 --- a/src/currencyservice/package-lock.json +++ b/src/currencyservice/package-lock.json @@ -1,8 +1,4826 @@ { "name": "grpc-currency-service", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "grpc-currency-service", + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "@google-cloud/debug-agent": "5.1.3", + "@google-cloud/opentelemetry-cloud-trace-exporter": "^0.10.0", + "@google-cloud/profiler": "4.1.2", + "@grpc/proto-loader": "0.6.2", + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/instrumentation-grpc": "^0.23.0", + "@opentelemetry/node": "^0.23.0", + "@opentelemetry/tracing": "^0.22.0", + "ajv": "^5.0.0", + "async": "3.2.0", + "google-protobuf": "3.13.0", + "grpc": "1.24.10", + "left-pad": "1.3.0", + "pino": "5.17.0", + "request": "2.88.2", + "xml2js": "0.4.23" + }, + "devDependencies": { + "semistandard": "^15.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz", + "integrity": "sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@eslint/eslintrc": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.2.tgz", + "integrity": "sha512-EfB5OHNYp1F4px/LI/FEnGylop7nOqkQ1LRzCM0KccA2U8tvV8w01KBv37LbO7nW4H+YhKyo2LcJhRwjjV17QQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/@eslint/eslintrc/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/@google-cloud/common": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.6.0.tgz", + "integrity": "sha512-aHIFTqJZmeTNO9md8XxV+ywuvXF3xBm5WNmgWeeCK+XN5X+kGW0WEX94wGwj+/MdOnrVf4dL2RvSIt9J5yJG6Q==", + "dependencies": { + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^7.0.2", + "retry-request": "^4.1.1", + "teeny-request": "^7.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/debug-agent": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@google-cloud/debug-agent/-/debug-agent-5.1.3.tgz", + "integrity": "sha512-WbzeEz4MvPlM7DX2QBsPcWgF62u7LSQv/oMYPl0L+TddTebqjDKiVXwxpzWk61NIfcKiet3dyCbPIt3N5o8XPQ==", + "dependencies": { + "@google-cloud/common": "^3.0.0", + "acorn": "^8.0.0", + "coffeescript": "^2.0.0", + "console-log-level": "^1.4.0", + "extend": "^3.0.2", + "findit2": "^2.2.3", + "gcp-metadata": "^4.0.0", + "p-limit": "^3.0.1", + "semver": "^7.0.0", + "source-map": "^0.6.1", + "split": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-0.10.0.tgz", + "integrity": "sha512-nbfFiWvxh0Ks/+QonczBNoE+w6aTpQ/+V54Z8KfOOvziQV9nCm7++4ILEejXF6W9w8I3vxaIF5XBxRRARF8vEQ==", + "dependencies": { + "@google-cloud/opentelemetry-resource-util": "^0.10.0", + "@grpc/grpc-js": "^1.1.8", + "@grpc/proto-loader": "^0.6.0", + "google-auth-library": "^7.0.0", + "google-proto-files": "^2.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/core": "^0.22.0", + "@opentelemetry/resources": "^0.22.0", + "@opentelemetry/tracing": "^0.22.0" + } + }, + "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter/node_modules/@google-cloud/opentelemetry-resource-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-0.10.0.tgz", + "integrity": "sha512-6o0vqrQVAFw0TyM/Hf7AgVHh2S4LHJxIxL3ITkPYA/00WlDlnwL+gg327olgqaG4hcEo0oluMvFnMMFAdS5VGA==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@opentelemetry/resources": "^0.22.0", + "@opentelemetry/semantic-conventions": "^0.22.0" + } + }, + "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.22.0.tgz", + "integrity": "sha512-t4fKikazahwNKmwD+CE/icHyuZldWvNMupJhjxdk9T/KxHFx3zCGjHT3MKavwYP6abzgAAm5WwzD1oHlmj7dyg==", + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@google-cloud/profiler": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@google-cloud/profiler/-/profiler-4.1.2.tgz", + "integrity": "sha512-h/UOb6vTm9ozKjdgA2OxV86Yk1GFS0Mq+29Eeo2rdovI5zK+139Yt+eYAgDQNBJxrAPmj4ZZKHb7G6gPIGJJeQ==", + "dependencies": { + "@google-cloud/common": "^3.0.0", + "@types/console-log-level": "^1.4.0", + "@types/semver": "^7.0.0", + "console-log-level": "^1.4.0", + "delay": "^5.0.0", + "extend": "^3.0.2", + "gcp-metadata": "^4.0.0", + "parse-duration": "^1.0.0", + "pprof": "3.1.0", + "pretty-ms": "^7.0.0", + "protobufjs": "~6.11.0", + "semver": "^7.0.0", + "teeny-request": "^7.0.0" + }, + "engines": { + "node": ">=10.4.1" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.1.0.tgz", + "integrity": "sha512-qbpidP/fOvQNz3nyabaVnZqcED1NNzf7qfeOlgtAZd9knTwY+KtsGRkYpiQzcATABy4gnGP2lousM3S0nuWVzA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", + "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.4.tgz", + "integrity": "sha512-AxtZcm0mArQhY9z8T3TynCYVEaSKxNCa9mVhVwBCUnsuUEe8Zn94bPYYKVQSLt+hJJ1y0ukr3mUvtWfcATL/IQ==", + "dependencies": { + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.2.tgz", + "integrity": "sha512-q2Qle60Ht2OQBCp9S5hv1JbI4uBBq6/mqSevFNK3ZEgRDBCAkWqZPUhD/K9gXOHrHKluliHiVq2L9sw1mVyAIg==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.1.1" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.5.tgz", + "integrity": "sha512-4srsKPXWlIxp5Vbqz5uLfBN+du2fJChBoYn/f2h991WLdk7jUvcSk/McVLSv/X+xQIPI8eGD5GjrnygdyHnhPA==", + "dependencies": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.1", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "rimraf": "^3.0.2", + "semver": "^7.3.4", + "tar": "^6.1.0" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.1.tgz", + "integrity": "sha512-H5Djcc2txGAINgf3TNaq4yFofYSIK3722PM89S/3R8FuI/eqi1UscajlXk7EBkG9s2pxss/q6SHlpturaavXaw==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-metrics": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.23.0.tgz", + "integrity": "sha512-MGfH9aMnVktRTagYHvhksrk42vPDjTIz5N6Cxu31t6dgJa6iUYR6MemnOdphyLk73DUaqmR5s2Fn6jg0Xd9gqA==", + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-0.23.0.tgz", + "integrity": "sha512-aM+sSnNe5GL66KaHx4QJFVOvK817LE32bhc29BW9KlamieqxfDnSelPoNPra85FWlxzLXPGowU7sW5rexSRAtA==", + "engines": { + "node": ">=8.1.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/core": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.22.0.tgz", + "integrity": "sha512-x6JxuQ4rY2x39GEXJSqMgyf8XZPNNiZrGcCMhZSrtypq/WXlsJuxMNnUAl2hj2rpSGGukhhWn5cMpCmMJJz1hw==", + "dependencies": { + "@opentelemetry/semantic-conventions": "0.22.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.22.0.tgz", + "integrity": "sha512-t4fKikazahwNKmwD+CE/icHyuZldWvNMupJhjxdk9T/KxHFx3zCGjHT3MKavwYP6abzgAAm5WwzD1oHlmj7dyg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.23.0.tgz", + "integrity": "sha512-1f6js0lIIPAWwR2EKPsUSowP2KloX+tv21QjWWp+BfFUcql+V6lh1RoNaxJWqFbe+BiZH7m+fD7UvJ2bWRQxdQ==", + "dependencies": { + "@opentelemetry/api-metrics": "0.23.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.23.0.tgz", + "integrity": "sha512-6KQ44TNXq7WH7U3EKFYRHPQ8TvhtEogcgGVM+Nipa57aD9EDvFkhIDYKKeVwfclzrE3dZ5QndnO2vElo0T0oWw==", + "dependencies": { + "@opentelemetry/api-metrics": "0.23.0", + "@opentelemetry/instrumentation": "0.23.0", + "@opentelemetry/semantic-conventions": "0.23.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/node": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/node/-/node-0.23.0.tgz", + "integrity": "sha512-StG3UQmcm/D6ZCoiAvNcFN1K9pm4zIf+uzS7L2HToOh83iwjvBYuMDwMPNTSH8eKM+2+OYOVtud4bn9wF5aLGA==", + "dependencies": { + "@opentelemetry/context-async-hooks": "0.23.0", + "@opentelemetry/core": "0.23.0", + "@opentelemetry/propagator-b3": "0.23.0", + "@opentelemetry/propagator-jaeger": "0.23.0", + "@opentelemetry/tracing": "0.23.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/node/node_modules/@opentelemetry/core": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.23.0.tgz", + "integrity": "sha512-7COVsnGEW96ITjc0waWYo/R27sFqjPUg4SCoP8XL48zAGr9zjzeuJoQe/xVchs7op//qOeeEEeBxiBvXy2QS0Q==", + "dependencies": { + "@opentelemetry/semantic-conventions": "0.23.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/node/node_modules/@opentelemetry/resources": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.23.0.tgz", + "integrity": "sha512-sAiaoQ0pOwjaaKySuwCUlvej/W9M5d+SxpcuBFUBUojqRlEAYDbx1FHClPnKtOysIb9rXJDQvM3xlH++7NQQzg==", + "dependencies": { + "@opentelemetry/core": "0.23.0", + "@opentelemetry/semantic-conventions": "0.23.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/node/node_modules/@opentelemetry/tracing": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.23.0.tgz", + "integrity": "sha512-3vNLS55bE0CG1RBDz7+wAAKpLjbl8fhQKqM4MvTy/LYHSolgyM5BNutSb/TcA9LtWvkdI0djgFXxeRig1OFqoQ==", + "dependencies": { + "@opentelemetry/core": "0.23.0", + "@opentelemetry/resources": "0.23.0", + "@opentelemetry/semantic-conventions": "0.23.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-0.23.0.tgz", + "integrity": "sha512-bXojPjqncbhZtsX1tmIMB/dVLXI8ByoLLTBSHd5z6vJQA66LYtJX89xlIVZfiwuWIePqUnBJTmGEK95bDem6uw==", + "dependencies": { + "@opentelemetry/core": "0.23.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/propagator-b3/node_modules/@opentelemetry/core": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.23.0.tgz", + "integrity": "sha512-7COVsnGEW96ITjc0waWYo/R27sFqjPUg4SCoP8XL48zAGr9zjzeuJoQe/xVchs7op//qOeeEEeBxiBvXy2QS0Q==", + "dependencies": { + "@opentelemetry/semantic-conventions": "0.23.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-0.23.0.tgz", + "integrity": "sha512-N94k3dwnA4KeTUp2BE2ytADp4XYU4EWreo1tVwBVDpowjXY9WkVsDsZD6QA/PUvJJQZCzexSS5ERnHGoVRcOmQ==", + "dependencies": { + "@opentelemetry/core": "0.23.0" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/propagator-jaeger/node_modules/@opentelemetry/core": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.23.0.tgz", + "integrity": "sha512-7COVsnGEW96ITjc0waWYo/R27sFqjPUg4SCoP8XL48zAGr9zjzeuJoQe/xVchs7op//qOeeEEeBxiBvXy2QS0Q==", + "dependencies": { + "@opentelemetry/semantic-conventions": "0.23.0", + "semver": "^7.1.3" + }, + "engines": { + "node": ">=8.5.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.1" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.22.0.tgz", + "integrity": "sha512-LiX6/JyuD2eHi7Ewrq/PUP79azDqshd0r2oksNTJ+VwgbGfMlq79ykd4FhiEEk23fFbajGt+9ginadXoRk17dg==", + "dependencies": { + "@opentelemetry/core": "0.22.0", + "@opentelemetry/semantic-conventions": "0.22.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.22.0.tgz", + "integrity": "sha512-t4fKikazahwNKmwD+CE/icHyuZldWvNMupJhjxdk9T/KxHFx3zCGjHT3MKavwYP6abzgAAm5WwzD1oHlmj7dyg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.23.0.tgz", + "integrity": "sha512-Tzo+VGR1zlzLbjVI+7mlDJ2xuaUsue4scWvFlK+fzcUfn9siF4NWbxoC2X6Br2B/g4dsq1OAwAYsPVYIEoY2rQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/tracing": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.22.0.tgz", + "integrity": "sha512-EFrKTFndiEdh/KnzwDgo/EcphG/5z/NyLck8oiUUY+YMP7hskXNYHjTWSAv9UxtYe1MzgLbjmAateTuMmFIVNw==", + "dependencies": { + "@opentelemetry/core": "0.22.0", + "@opentelemetry/resources": "0.22.0", + "@opentelemetry/semantic-conventions": "0.22.0", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/tracing/node_modules/@opentelemetry/semantic-conventions": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.22.0.tgz", + "integrity": "sha512-t4fKikazahwNKmwD+CE/icHyuZldWvNMupJhjxdk9T/KxHFx3zCGjHT3MKavwYP6abzgAAm5WwzD1oHlmj7dyg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/bytebuffer": { + "version": "5.0.42", + "resolved": "https://registry.npmjs.org/@types/bytebuffer/-/bytebuffer-5.0.42.tgz", + "integrity": "sha512-lEgKojWUAc/MG2t649oZS5AfYFP2xRNPoDuwDBlBMjHXd8MaGPgFgtCXUK7inZdBOygmVf10qxc1Us8GXC96aw==", + "dependencies": { + "@types/long": "*", + "@types/node": "*" + } + }, + "node_modules/@types/console-log-level": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.1.tgz", + "integrity": "sha512-Dm5OaenEl6wj6qn6EgLyN6kcdRPgov6BJehbid57kyjZuZpow/bghppdiyqTvxXiDIpxnuN58ZowimKW3qEPmA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/long": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" + }, + "node_modules/@types/node": { + "version": "15.12.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.5.tgz", + "integrity": "sha512-se3yX7UHv5Bscf8f1ERKvQOD6sTyycH3hdaoozvaLxgUiY5lIGEeH37AD0G0Qi9kPqihPn0HOfd2yaIEN9VwEg==" + }, + "node_modules/@types/semver": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.6.tgz", + "integrity": "sha512-0caWDWmpCp0uifxFh+FaqK3CuZ2SkRR/ZRxAV5+zNdC3QVUi6wyOJnefhPvtNt8NQWXB5OA93BUvZsXpWat2Xw==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/acorn": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz", + "integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", + "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", + "dev": true + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dependencies": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/are-we-there-yet/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/are-we-there-yet/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz", + "integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1", + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ascli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", + "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", + "dependencies": { + "colour": "~0.7.1", + "optjs": "~3.2.2" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", + "engines": { + "node": "*" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "node_modules/bytebuffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", + "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", + "dependencies": { + "long": "~3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bytebuffer/node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/coffeescript": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.5.1.tgz", + "integrity": "sha512-J2jRPX0eeFh5VKyVnoLrfVFgLZtnnmp96WQSLAS8OrLm2wtQLcnikYKe1gViJKDH7vucjuhHvBKKBP3rKcD1tQ==", + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colour": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", + "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/console-log-level": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/console-log-level/-/console-log-level-1.4.1.tgz", + "integrity": "sha512-VZzbIORbP+PPcN/gg3DXClTLPLg5Slwd5fL2MIc+o1qZ4BXBvWyc6QxPk6T/Mkr6IVjRpoAGf32XxP3ZWMVRcQ==" + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/debug-log": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/deglob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/deglob/-/deglob-4.0.1.tgz", + "integrity": "sha512-/g+RDZ7yf2HvoW+E5Cy+K94YhgcFgr6C8LuHZD1O5HoNPkf3KY6RfXJ0DBGlB/NkLi5gml+G9zqRzk9S0mHZCg==", + "dev": true, + "dependencies": { + "find-root": "^1.0.0", + "glob": "^7.0.5", + "ignore": "^5.0.0", + "pkg-config": "^1.1.0", + "run-parallel": "^1.1.2", + "uniq": "^1.0.1" + } + }, + "node_modules/deglob/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/delay": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", + "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz", + "integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.10.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.12.1.tgz", + "integrity": "sha512-HlMTEdr/LicJfN08LB3nM1rRYliDXOmfoO4vj39xN6BLpFzF00hbwBoqHk8UcJ2M/3nlARZWy/mslvGEuZFvsg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@eslint/eslintrc": "^0.2.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.0", + "esquery": "^1.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash": "^4.17.19", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/eslint-config-semistandard": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-15.0.1.tgz", + "integrity": "sha512-sfV+qNBWKOmF0kZJll1VH5XqOAdTmLlhbOl9WKI11d2eMEe+Kicxnpm24PQWHOqAfk5pAWU2An0LjNCXKa4Usg==", + "dev": true + }, + "node_modules/eslint-config-standard": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-15.0.1.tgz", + "integrity": "sha512-UGorkix49kBium7Y124o2U9Qy7Lpa+nO0FsaqQSIPeno5hGNxZtSBJbqJX6gtpYfDFWCtqCAN9wyK+oDd9jT7Q==", + "dev": true + }, + "node_modules/eslint-config-standard-jsx": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-9.0.0.tgz", + "integrity": "sha512-e9ezaClB5YdTYqGUd3wReKC1si8XRn234tmME+3qebQ+KHtH92B6dr4LE6qPjK9AYe9XfwDK/xgQSwyCKQwv5Q==", + "dev": true + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", + "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.21.5.tgz", + "integrity": "sha512-8MaEggC2et0wSF6bUeywF7qQ46ER81irOdWS4QWxnnlAEsnzeBevk1sWh7fhpCghPpXb+8Ks7hvaft6L/xsR6g==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flatmap": "^1.2.3", + "doctrine": "^2.1.0", + "has": "^1.0.3", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "object.entries": "^1.1.2", + "object.fromentries": "^2.0.2", + "object.values": "^1.1.1", + "prop-types": "^15.7.2", + "resolve": "^1.18.1", + "string.prototype.matchall": "^4.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-standard": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.2.tgz", + "integrity": "sha512-nKptN8l7jksXkwFk++PhJB3cCDTcXOEyhISIN86Ue2feJ1LFyY3PrY3/xT2keXlJSY5bpmbiTG0f885/YKAvTA==", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fast-redact": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.1.0.tgz", + "integrity": "sha512-0LkHpTLyadJavq9sRzzyqIoMZemWli77K2/MGOkafrR64B9ItrvZ9aT+jluvNDsv0YEHjSNhlMBtbokuoqii4A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" + }, + "node_modules/fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" + }, + "node_modules/file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "dev": true, + "dependencies": { + "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "dev": true + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", + "engines": { + "node": ">=0.8.22" + } + }, + "node_modules/flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "dev": true, + "dependencies": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/flatstr": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz", + "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" + }, + "node_modules/flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/gaxios": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.3.0.tgz", + "integrity": "sha512-pHplNbslpwCLMyII/lHPWFQbJWOX0B3R1hwBEOvzYi1GmdKZruuEHK4N9V6f7tf1EaPYyF80mui1+344p6SmLg==", + "dependencies": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gcp-metadata": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.3.0.tgz", + "integrity": "sha512-L9XQUpvKJCM76YRSmcxrR4mFPzPGsgZUH+GgHMxAET8qc6+BhRJq63RLhWakgEO2KKVgeSDVfyiNjkGSADwNTA==", + "dependencies": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "dev": true, + "dependencies": { + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/google-auth-library": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-7.1.2.tgz", + "integrity": "sha512-FMipHgfe2u1LzWsf2n9zEB9KsJ8M3n8OYTHbHtlkzPCyo7IknXQR5X99nfvwUHGuX+iEpihUZxDuPm7+qBYeXg==", + "dependencies": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-p12-pem": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.1.0.tgz", + "integrity": "sha512-JUtEHXL4DY/N+xhlm7TC3qL797RPAtk0ZGXNs3/gWyiDHYoA/8Rjes0pztkda+sZv4ej1EoO2KhWgW5V9KTrSQ==", + "dependencies": { + "node-forge": "^0.10.0" + }, + "bin": { + "gp12-pem": "build/src/bin/gp12-pem.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-proto-files": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-2.4.0.tgz", + "integrity": "sha512-M5u56EsADOnplBUHTBzqBcCtPNPoGtBBXefjtA7mt3KDsOnlRM75fwrW2rsPS3Am2vrf9I0/NlI0E3nKWo/Ipg==", + "dependencies": { + "protobufjs": "^6.8.0", + "walkdir": "^0.4.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/google-protobuf": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.13.0.tgz", + "integrity": "sha512-ZIf3qfLFayVrPvAjeKKxO5FRF1/NwRxt6Dko+fWEMuHwHbZx8/fcaAao9b0wCM6kr8qeg2te8XTpyuvKuD9aKw==" + }, + "node_modules/graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "node_modules/grpc": { + "version": "1.24.10", + "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.24.10.tgz", + "integrity": "sha512-mTR+P5IL3WO3oCgNwxKFE5ksXEJfCYP+dk0aIbjB494f7OnHTmssU5r9vznsSq3+cdLcxAzGFskOj5CaPwi8KA==", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.4", + "@types/bytebuffer": "^5.0.40", + "lodash.camelcase": "^4.3.0", + "lodash.clone": "^4.5.0", + "nan": "^2.13.2", + "protobufjs": "^5.0.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grpc/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/grpc/node_modules/protobufjs": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", + "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", + "dependencies": { + "ascli": "~1", + "bytebuffer": "~5", + "glob": "^7.0.5", + "yargs": "^3.10.0" + }, + "bin": { + "pbjs": "bin/pbjs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/grpc/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grpc/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/grpc/node_modules/yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "node_modules/gtoken": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.3.0.tgz", + "integrity": "sha512-mCcISYiaRZrJpfqOs0QWa6lfEM/C1V9ASkzFmuz43XBb5s1Vynh+CZy1ECeeJXVGx2PRByjYzb4Y4/zr1byr0w==", + "dependencies": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.0.3", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/har-validator/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/har-validator/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/har-validator/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", + "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==", + "dev": true + }, + "node_modules/is-boolean-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", + "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-callable": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", + "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-core-module": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-date-object": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", + "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-number-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", + "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-regex": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", + "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-string": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", + "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "node_modules/json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz", + "integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.2", + "object.assign": "^4.1.2" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, + "node_modules/lodash.clone": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", + "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/mime-db": { + "version": "1.48.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.48.0.tgz", + "integrity": "sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.31.tgz", + "integrity": "sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg==", + "dependencies": { + "mime-db": "1.48.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz", + "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==", + "dev": true + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz", + "integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz", + "integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/optjs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", + "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-duration": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-1.0.0.tgz", + "integrity": "sha512-X4kUkCTHU1N/kEbwK9FpUJ0UZQa90VzeczfS704frR30gljxDG0pSziws06XlK+CGRSo/1wtG1mFIdBFQTMQNw==" + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", + "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/pino": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-5.17.0.tgz", + "integrity": "sha512-LqrqmRcJz8etUjyV0ddqB6OTUutCgQULPFg2b4dtijRHUsucaAdBgSUW58vY6RFSX+NT8963F+q0tM6lNwGShA==", + "dependencies": { + "fast-redact": "^2.0.0", + "fast-safe-stringify": "^2.0.7", + "flatstr": "^1.0.12", + "pino-std-serializers": "^2.4.2", + "quick-format-unescaped": "^3.0.3", + "sonic-boom": "^0.7.5" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-std-serializers": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz", + "integrity": "sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg==" + }, + "node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-conf/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-config": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", + "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", + "dev": true, + "dependencies": { + "debug-log": "^1.0.0", + "find-root": "^1.0.0", + "xtend": "^4.0.1" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pprof": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pprof/-/pprof-3.1.0.tgz", + "integrity": "sha512-nbYfVzZYQ/TPV9QZFPMb59FRZrIe4M4FTruH11+vd4gR5cGUG3dfoXpXdfki50eeVeqWQrXuWdUsrRIZi2SteQ==", + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.0", + "bindings": "^1.2.1", + "delay": "^5.0.0", + "findit2": "^2.2.3", + "nan": "^2.14.0", + "p-limit": "^3.0.0", + "pify": "^5.0.0", + "protobufjs": "~6.10.0", + "source-map": "^0.7.3", + "split": "^1.0.1" + }, + "engines": { + "node": ">=10.4.1" + } + }, + "node_modules/pprof/node_modules/@types/node": { + "version": "13.13.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", + "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" + }, + "node_modules/pprof/node_modules/protobufjs": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/pprof/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-ms": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", + "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "dependencies": { + "parse-ms": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/protobufjs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "node_modules/quick-format-unescaped": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz", + "integrity": "sha512-dy1yjycmn9blucmJLXOfZDx1ikZJUi6E8bBZLnhPG5gBrVhHXx2xVyqqgKBubVNEXmx51dBACMHpoMQK/N/AXQ==" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", + "dependencies": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/retry-request": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.2.0.tgz", + "integrity": "sha512-rIwHm2pipUX7MFTpscNr9CNfOsW3gzcosqUOvS7MbuURgdDeIzNVjA/sNgs4BTt0g3L748hB7Q/Yt6StRFHD4w==", + "dependencies": { + "debug": "^4.1.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semistandard": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/semistandard/-/semistandard-15.0.0.tgz", + "integrity": "sha512-qWMJubk+WeTHXtdoe4Kh81SqwcVPwOsJcDFu1QbXqO3vh60PwEJ1VrlhaHXNwP3fjfGdFPJBYXlA8x4QRNIbdw==", + "dev": true, + "dependencies": { + "eslint": "~7.12.1", + "eslint-config-semistandard": "15.0.1", + "eslint-config-standard": "15.0.1", + "eslint-config-standard-jsx": "9.0.0", + "eslint-plugin-import": "~2.22.1", + "eslint-plugin-node": "~11.1.0", + "eslint-plugin-promise": "~4.2.1", + "eslint-plugin-react": "~7.21.5", + "eslint-plugin-standard": "~4.0.2", + "standard-engine": "^13.0.0" + }, + "bin": { + "semistandard": "bin/cmd.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sonic-boom": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.7.tgz", + "integrity": "sha512-Ei5YOo5J64GKClHIL/5evJPgASXFVpfVYbJV9PILZQytTK6/LCwHvsZJW2Ig4p9FMC2OrBrMnXKgRN/OEoAWfg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", + "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/standard-engine": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-13.0.0.tgz", + "integrity": "sha512-fQ8/0SQ84hRtxru3tsyhc8JDBDrUFzJc/lOxh5Of/wCEpMZ0J0j7XX5kymtgdZZEke0Lb1HxzvSYdnjmg05ewA==", + "dev": true, + "dependencies": { + "deglob": "^4.0.1", + "get-stdin": "^8.0.0", + "minimist": "^1.2.5", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8.10" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz", + "integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.3.1", + "side-channel": "^1.0.4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "dev": true, + "dependencies": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/teeny-request": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.1.0.tgz", + "integrity": "sha512-hPfSc05a7Mf3syqVhSkrVMb844sMiP60MrfGMts3ft6V6UlSkEIGQzgwf0dy1KjdE3FV2lJ5s7QCBFcaoQLA6g==", + "dependencies": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/write/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + } + } + }, "dependencies": { "@babel/code-frame": { "version": "7.14.5", @@ -146,24 +4964,28 @@ } }, "@google-cloud/opentelemetry-cloud-trace-exporter": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-0.9.0.tgz", - "integrity": "sha512-4tFC7dgLQIxeq/9jTqMLmoWJBn/72Hn5Eth60HJTsMNd/0oDV7+hdki2z0WS/0cc+bPthCpoppHCrWw1DYpTbw==", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-0.10.0.tgz", + "integrity": "sha512-nbfFiWvxh0Ks/+QonczBNoE+w6aTpQ/+V54Z8KfOOvziQV9nCm7++4ILEejXF6W9w8I3vxaIF5XBxRRARF8vEQ==", "requires": { + "@google-cloud/opentelemetry-resource-util": "^0.10.0", "@grpc/grpc-js": "^1.1.8", - "@grpc/proto-loader": "^0.5.5", + "@grpc/proto-loader": "^0.6.0", "google-auth-library": "^7.0.0", "google-proto-files": "^2.1.0" }, "dependencies": { - "@grpc/proto-loader": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.6.tgz", - "integrity": "sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==", - "requires": { - "lodash.camelcase": "^4.3.0", - "protobufjs": "^6.8.6" - } + "@google-cloud/opentelemetry-resource-util": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-0.10.0.tgz", + "integrity": "sha512-6o0vqrQVAFw0TyM/Hf7AgVHh2S4LHJxIxL3ITkPYA/00WlDlnwL+gg327olgqaG4hcEo0oluMvFnMMFAdS5VGA==", + "requires": {} + }, + "@opentelemetry/semantic-conventions": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.22.0.tgz", + "integrity": "sha512-t4fKikazahwNKmwD+CE/icHyuZldWvNMupJhjxdk9T/KxHFx3zCGjHT3MKavwYP6abzgAAm5WwzD1oHlmj7dyg==", + "peer": true } } }, @@ -234,109 +5056,178 @@ } }, "@opentelemetry/api": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.11.0.tgz", - "integrity": "sha512-K+1ADLMxduhsXoZ0GRfi9Pw162FvzBQLDQlHru1lg86rpIU+4XqdJkSGo6y3Kg+GmOWq1HNHOA/ydw/rzHQkRg==", - "requires": { - "@opentelemetry/context-base": "^0.11.0" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.1.tgz", + "integrity": "sha512-H5Djcc2txGAINgf3TNaq4yFofYSIK3722PM89S/3R8FuI/eqi1UscajlXk7EBkG9s2pxss/q6SHlpturaavXaw==" }, - "@opentelemetry/context-async-hooks": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-0.11.0.tgz", - "integrity": "sha512-4z0X9EfvoLNA6R5yi+2taUyaSCUiyi/ht1qBYZMgpWvWwARgc5hcgGkZo7bekPk1zWfE9NFIhW6ySOXOP9CXyQ==", - "requires": { - "@opentelemetry/context-base": "^0.11.0" - } + "@opentelemetry/api-metrics": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-metrics/-/api-metrics-0.23.0.tgz", + "integrity": "sha512-MGfH9aMnVktRTagYHvhksrk42vPDjTIz5N6Cxu31t6dgJa6iUYR6MemnOdphyLk73DUaqmR5s2Fn6jg0Xd9gqA==", + "requires": {} }, - "@opentelemetry/context-base": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-base/-/context-base-0.11.0.tgz", - "integrity": "sha512-ESRk+572bftles7CVlugAj5Azrz61VO0MO0TS2pE9MLVL/zGmWuUBQryART6/nsrFqo+v9HPt37GPNcECTZR1w==" + "@opentelemetry/context-async-hooks": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-0.23.0.tgz", + "integrity": "sha512-aM+sSnNe5GL66KaHx4QJFVOvK817LE32bhc29BW9KlamieqxfDnSelPoNPra85FWlxzLXPGowU7sW5rexSRAtA==", + "requires": {} }, "@opentelemetry/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.11.0.tgz", - "integrity": "sha512-ZEKjBXeDGBqzouz0uJmrbEKNExEsQOhsZ3tJDCLcz5dUNoVw642oIn2LYWdQK2YdIfZbEmltiF65/csGsaBtFA==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.22.0.tgz", + "integrity": "sha512-x6JxuQ4rY2x39GEXJSqMgyf8XZPNNiZrGcCMhZSrtypq/WXlsJuxMNnUAl2hj2rpSGGukhhWn5cMpCmMJJz1hw==", "requires": { - "@opentelemetry/api": "^0.11.0", - "@opentelemetry/context-base": "^0.11.0", + "@opentelemetry/semantic-conventions": "0.22.0", "semver": "^7.1.3" + }, + "dependencies": { + "@opentelemetry/semantic-conventions": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.22.0.tgz", + "integrity": "sha512-t4fKikazahwNKmwD+CE/icHyuZldWvNMupJhjxdk9T/KxHFx3zCGjHT3MKavwYP6abzgAAm5WwzD1oHlmj7dyg==" + } } }, - "@opentelemetry/node": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/node/-/node-0.11.0.tgz", - "integrity": "sha512-1SrZNbF7aBShySvsmWL+3bir6fVugjSnCyXsKMwclinhZIHd2cUfgjKdi42OCcA5G4Pp8TpO7/8ue8qI5yKX8w==", - "requires": { - "@opentelemetry/api": "^0.11.0", - "@opentelemetry/context-async-hooks": "^0.11.0", - "@opentelemetry/core": "^0.11.0", - "@opentelemetry/tracing": "^0.11.0", - "require-in-the-middle": "^5.0.0", - "semver": "^7.1.3" + "@opentelemetry/instrumentation": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.23.0.tgz", + "integrity": "sha512-1f6js0lIIPAWwR2EKPsUSowP2KloX+tv21QjWWp+BfFUcql+V6lh1RoNaxJWqFbe+BiZH7m+fD7UvJ2bWRQxdQ==", + "requires": { + "@opentelemetry/api-metrics": "0.23.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" } }, - "@opentelemetry/plugin-grpc": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/plugin-grpc/-/plugin-grpc-0.11.0.tgz", - "integrity": "sha512-9MmLROXWJrpNWhnizpIZZj9GzAoH4MSTcroZxcIcFM5H1lKpyBmnEXqwpkuZ2q4WM7YvCPRrMUqRwg+znK7q2g==", + "@opentelemetry/instrumentation-grpc": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.23.0.tgz", + "integrity": "sha512-6KQ44TNXq7WH7U3EKFYRHPQ8TvhtEogcgGVM+Nipa57aD9EDvFkhIDYKKeVwfclzrE3dZ5QndnO2vElo0T0oWw==", "requires": { - "@opentelemetry/api": "^0.11.0", - "@opentelemetry/core": "^0.11.0", - "@opentelemetry/semantic-conventions": "^0.11.0", - "shimmer": "^1.2.1" + "@opentelemetry/api-metrics": "0.23.0", + "@opentelemetry/instrumentation": "0.23.0", + "@opentelemetry/semantic-conventions": "0.23.0" + } + }, + "@opentelemetry/node": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/node/-/node-0.23.0.tgz", + "integrity": "sha512-StG3UQmcm/D6ZCoiAvNcFN1K9pm4zIf+uzS7L2HToOh83iwjvBYuMDwMPNTSH8eKM+2+OYOVtud4bn9wF5aLGA==", + "requires": { + "@opentelemetry/context-async-hooks": "0.23.0", + "@opentelemetry/core": "0.23.0", + "@opentelemetry/propagator-b3": "0.23.0", + "@opentelemetry/propagator-jaeger": "0.23.0", + "@opentelemetry/tracing": "0.23.0", + "semver": "^7.1.3" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.23.0.tgz", + "integrity": "sha512-7COVsnGEW96ITjc0waWYo/R27sFqjPUg4SCoP8XL48zAGr9zjzeuJoQe/xVchs7op//qOeeEEeBxiBvXy2QS0Q==", + "requires": { + "@opentelemetry/semantic-conventions": "0.23.0", + "semver": "^7.1.3" + } + }, + "@opentelemetry/resources": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.23.0.tgz", + "integrity": "sha512-sAiaoQ0pOwjaaKySuwCUlvej/W9M5d+SxpcuBFUBUojqRlEAYDbx1FHClPnKtOysIb9rXJDQvM3xlH++7NQQzg==", + "requires": { + "@opentelemetry/core": "0.23.0", + "@opentelemetry/semantic-conventions": "0.23.0" + } + }, + "@opentelemetry/tracing": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.23.0.tgz", + "integrity": "sha512-3vNLS55bE0CG1RBDz7+wAAKpLjbl8fhQKqM4MvTy/LYHSolgyM5BNutSb/TcA9LtWvkdI0djgFXxeRig1OFqoQ==", + "requires": { + "@opentelemetry/core": "0.23.0", + "@opentelemetry/resources": "0.23.0", + "@opentelemetry/semantic-conventions": "0.23.0", + "lodash.merge": "^4.6.2" + } + } } }, - "@opentelemetry/plugin-http": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/plugin-http/-/plugin-http-0.11.0.tgz", - "integrity": "sha512-oUBRNrmo8nhR6AuzTpW27rc6P7Jz4lfb3liQxiHTuqv9JHlBz2m5q3NfibImfxpiVVq8BMAg6FR264/LcynuUA==", + "@opentelemetry/propagator-b3": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-0.23.0.tgz", + "integrity": "sha512-bXojPjqncbhZtsX1tmIMB/dVLXI8ByoLLTBSHd5z6vJQA66LYtJX89xlIVZfiwuWIePqUnBJTmGEK95bDem6uw==", "requires": { - "@opentelemetry/api": "^0.11.0", - "@opentelemetry/core": "^0.11.0", - "@opentelemetry/semantic-conventions": "^0.11.0", - "semver": "^7.1.3", - "shimmer": "^1.2.1" + "@opentelemetry/core": "0.23.0" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.23.0.tgz", + "integrity": "sha512-7COVsnGEW96ITjc0waWYo/R27sFqjPUg4SCoP8XL48zAGr9zjzeuJoQe/xVchs7op//qOeeEEeBxiBvXy2QS0Q==", + "requires": { + "@opentelemetry/semantic-conventions": "0.23.0", + "semver": "^7.1.3" + } + } } }, - "@opentelemetry/plugin-https": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/plugin-https/-/plugin-https-0.11.0.tgz", - "integrity": "sha512-odUeyXAj6sRJSjXRytUIEtNsdNDZTPSn0AlHDI/H8saOb/eOXHKUCAJOfEoFFNg4QS/9tyTrr4d1q7+5AKBsFA==", + "@opentelemetry/propagator-jaeger": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-0.23.0.tgz", + "integrity": "sha512-N94k3dwnA4KeTUp2BE2ytADp4XYU4EWreo1tVwBVDpowjXY9WkVsDsZD6QA/PUvJJQZCzexSS5ERnHGoVRcOmQ==", "requires": { - "@opentelemetry/api": "^0.11.0", - "@opentelemetry/core": "^0.11.0", - "@opentelemetry/plugin-http": "^0.11.0", - "@opentelemetry/semantic-conventions": "^0.11.0", - "semver": "^7.1.3", - "shimmer": "^1.2.1" + "@opentelemetry/core": "0.23.0" + }, + "dependencies": { + "@opentelemetry/core": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-0.23.0.tgz", + "integrity": "sha512-7COVsnGEW96ITjc0waWYo/R27sFqjPUg4SCoP8XL48zAGr9zjzeuJoQe/xVchs7op//qOeeEEeBxiBvXy2QS0Q==", + "requires": { + "@opentelemetry/semantic-conventions": "0.23.0", + "semver": "^7.1.3" + } + } } }, "@opentelemetry/resources": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.11.0.tgz", - "integrity": "sha512-o7DwV1TcezqBtS5YW2AWBcn01nVpPptIbTr966PLlVBcS//w8LkjeOShiSZxQ0lmV4b2en0FiSouSDoXk/5qIQ==", + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-0.22.0.tgz", + "integrity": "sha512-LiX6/JyuD2eHi7Ewrq/PUP79azDqshd0r2oksNTJ+VwgbGfMlq79ykd4FhiEEk23fFbajGt+9ginadXoRk17dg==", "requires": { - "@opentelemetry/api": "^0.11.0", - "@opentelemetry/core": "^0.11.0" + "@opentelemetry/core": "0.22.0", + "@opentelemetry/semantic-conventions": "0.22.0" + }, + "dependencies": { + "@opentelemetry/semantic-conventions": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.22.0.tgz", + "integrity": "sha512-t4fKikazahwNKmwD+CE/icHyuZldWvNMupJhjxdk9T/KxHFx3zCGjHT3MKavwYP6abzgAAm5WwzD1oHlmj7dyg==" + } } }, "@opentelemetry/semantic-conventions": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.11.0.tgz", - "integrity": "sha512-xsthnI/J+Cx0YVDGgUzvrH0ZTtfNtl866M454NarYwDrc0JvC24sYw+XS5PJyk2KDzAHtb0vlrumUc1OAut/Fw==" + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.23.0.tgz", + "integrity": "sha512-Tzo+VGR1zlzLbjVI+7mlDJ2xuaUsue4scWvFlK+fzcUfn9siF4NWbxoC2X6Br2B/g4dsq1OAwAYsPVYIEoY2rQ==" }, "@opentelemetry/tracing": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.11.0.tgz", - "integrity": "sha512-QweFmxzl32BcyzwdWCNjVXZT1WeENNS/RWETq/ohqu+fAsTcMyGcr6cOq/yDdFmtBy+bm5WVVdeByEjNS+c4/w==", - "requires": { - "@opentelemetry/api": "^0.11.0", - "@opentelemetry/context-base": "^0.11.0", - "@opentelemetry/core": "^0.11.0", - "@opentelemetry/resources": "^0.11.0", - "@opentelemetry/semantic-conventions": "^0.11.0" + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.22.0.tgz", + "integrity": "sha512-EFrKTFndiEdh/KnzwDgo/EcphG/5z/NyLck8oiUUY+YMP7hskXNYHjTWSAv9UxtYe1MzgLbjmAateTuMmFIVNw==", + "requires": { + "@opentelemetry/core": "0.22.0", + "@opentelemetry/resources": "0.22.0", + "@opentelemetry/semantic-conventions": "0.22.0", + "lodash.merge": "^4.6.2" + }, + "dependencies": { + "@opentelemetry/semantic-conventions": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-0.22.0.tgz", + "integrity": "sha512-t4fKikazahwNKmwD+CE/icHyuZldWvNMupJhjxdk9T/KxHFx3zCGjHT3MKavwYP6abzgAAm5WwzD1oHlmj7dyg==" + } } }, "@protobufjs/aspromise": { @@ -2293,6 +7184,11 @@ "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, "long": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", @@ -3296,6 +8192,14 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -3342,14 +8246,6 @@ "define-properties": "^1.1.3" } }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", diff --git a/src/currencyservice/package.json b/src/currencyservice/package.json index a6923b147..b67b3e8c5 100644 --- a/src/currencyservice/package.json +++ b/src/currencyservice/package.json @@ -10,15 +10,13 @@ "license": "Apache-2.0", "dependencies": { "@google-cloud/debug-agent": "5.1.3", - "@google-cloud/opentelemetry-cloud-trace-exporter": "^0.9.0", + "@google-cloud/opentelemetry-cloud-trace-exporter": "^0.10.0", "@google-cloud/profiler": "4.1.2", "@grpc/proto-loader": "0.6.2", - "@opentelemetry/api": "^0.11.0", - "@opentelemetry/node": "^0.11.0", - "@opentelemetry/plugin-grpc": "^0.11.0", - "@opentelemetry/plugin-http": "^0.11.0", - "@opentelemetry/plugin-https": "^0.11.0", - "@opentelemetry/tracing": "^0.11.0", + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/instrumentation-grpc": "^0.23.0", + "@opentelemetry/node": "^0.23.0", + "@opentelemetry/tracing": "^0.22.0", "ajv": "^5.0.0", "async": "3.2.0", "google-protobuf": "3.13.0", diff --git a/src/currencyservice/server.js b/src/currencyservice/server.js index 167cb67d2..cd61c8101 100644 --- a/src/currencyservice/server.js +++ b/src/currencyservice/server.js @@ -29,16 +29,15 @@ const opentelemetry = require('@opentelemetry/api'); const {NodeTracerProvider} = require('@opentelemetry/node'); const {BatchSpanProcessor} = require('@opentelemetry/tracing'); const {TraceExporter} = require('@google-cloud/opentelemetry-cloud-trace-exporter'); +const { registerInstrumentations } = require('@opentelemetry/instrumentation'); +const { GrpcInstrumentation } = require('@opentelemetry/instrumentation-grpc'); // OpenTelemetry tracing with exporter to Google Cloud Trace -const provider = new NodeTracerProvider({ - // Use grpc plugin to receive trace contexts from clients. - plugins: { - grpc: { - enabled: true, - path: '@opentelemetry/plugin-grpc', - } - } +const provider = new NodeTracerProvider(); +provider.register(); + +registerInstrumentations({ + instrumentations: [new GrpcInstrumentation()] }); // Enable OpenTelemetry exporters to export traces to Google Cloud Trace. @@ -48,7 +47,6 @@ const provider = new NodeTracerProvider({ // you don't need to provide auth credentials or a project id. const exporter = new TraceExporter(); provider.addSpanProcessor(new BatchSpanProcessor(exporter)); -provider.register(); const tracer = opentelemetry.trace.getTracer('currency'); const path = require('path'); @@ -70,7 +68,7 @@ const healthProto = _loadProto(HEALTH_PROTO_PATH).grpc.health.v1; const logger = pino({ name: 'currencyservice-server', messageKey: 'message', - changeLevelName: 'severity', + levelKey: 'severity', useLevelLabels: true }); @@ -141,7 +139,7 @@ function _carry (amount) { function getSupportedCurrencies (call, callback) { // Extract the span context received from the gRPC client. // Create a child span and add an event. - const currentSpan = tracer.getCurrentSpan(); + const currentSpan = opentelemetry.trace.getSpan(opentelemetry.context.active()) const span = tracer.startSpan('currencyservice:GetSupportedCurrencies()', { parent: currentSpan, kind: 1, // server @@ -160,7 +158,7 @@ function getSupportedCurrencies (call, callback) { function convert (call, callback) { // Extract the span context received from the gRPC client. // Create a child span and add an event. - const currentSpan = tracer.getCurrentSpan(); + const currentSpan = opentelemetry.trace.getSpan(opentelemetry.context.active()) const span = tracer.startSpan('currencyservice:Convert()', { parent: currentSpan, kind: 1, // server diff --git a/src/recommendationservice/recommendation_server.py b/src/recommendationservice/recommendation_server.py index 6937201d4..1bbff21e2 100644 --- a/src/recommendationservice/recommendation_server.py +++ b/src/recommendationservice/recommendation_server.py @@ -52,23 +52,29 @@ class RecommendationService(demo_pb2_grpc.RecommendationServiceServicer): def ListRecommendations(self, request, context): - max_responses = 5 - # fetch list of products from product catalog stub - cat_response = product_catalog_stub.ListProducts(demo_pb2.Empty()) - product_ids = [x.id for x in cat_response.products] - filtered_products = list(set(product_ids)-set(request.product_ids)) - num_products = len(filtered_products) - num_return = min(max_responses, num_products) - # sample list of indicies to return - indices = random.sample(range(num_products), num_return) - # fetch product ids from indices - prod_list = [filtered_products[i] for i in indices] - logger.info( - "[Recv ListRecommendations] product_ids={}".format(prod_list)) - # build and return response - response = demo_pb2.ListRecommendationsResponse() - response.product_ids.extend(prod_list) - return response + try: + # number of responses configurable by env var. defaults to 5 + max_responses = int(os.environ.get("MAX_RESPONSES", 5)) + # fetch list of products from product catalog stub + cat_response = product_catalog_stub.ListProducts(demo_pb2.Empty()) + product_ids = [x.id for x in cat_response.products] + filtered_products = list(set(product_ids)-set(request.product_ids)) + num_products = len(filtered_products) + num_return = min(max_responses, num_products) + # sample list of indicies to return + indices = random.sample(range(num_products), num_return) + # fetch product ids from indices + prod_list = [filtered_products[i] for i in indices] + logger.info( + "[Recv ListRecommendations] product_ids={}".format(prod_list)) + # build and return response + response = demo_pb2.ListRecommendationsResponse() + response.product_ids.extend(prod_list) + return response + except Exception as e: + # if an exception occurred, make sure it is printed before raising + logger.error(e) + raise def Check(self, request, context): return health_pb2.HealthCheckResponse( diff --git a/sre-recipes/README.md b/sre-recipes/README.md index 283c51600..206b2a03f 100644 --- a/sre-recipes/README.md +++ b/sre-recipes/README.md @@ -7,25 +7,33 @@ SRE Recipes is a tool to help users familiarize themselves with finding the root To view which active recipes exist, run the command below in this directory: ``` -$ ./sandboxctl sre-recipes --help +./sandboxctl sre-recipes --help ``` To simulate a break in a specific recipe, run: ``` -$ ./sandboxctl sre-recipes break +./sandboxctl sre-recipes break ``` To restore the original condition after simulating a break in a specific recipe, run: ``` -$ ./sandboxctl sre-recipes restore +./sandboxctl sre-recipes restore ``` To verify the root cause of the breakage in specific recipe, run: ``` -$ ./sandboxctl sre-recipes verify +./sandboxctl sre-recipes verify ``` To receive a hint about the root cause of the breakage, run: ``` -$ ./sandboxctl sre-recipes hint +./sandboxctl sre-recipes hint ``` ## Contributing -To contribute a new recipe, create a new folder in the [recipes directory](./recipes). The directory must include a class that extends the abstract base class found in [recipe.py](recipe.py). +To contribute a new recipe, you can either: + +1. Create a simple config based SRE Recipe (Recommended) + + See `recipes/configs_based/README.md` for contribution instruction and usage. + +2. Create a implementation based SRE Recipe class + + See `recipes/impl_based/README.md` for contribution instruction and usage. diff --git a/sre-recipes/recipe.py b/sre-recipes/recipe.py deleted file mode 100644 index eb9786a35..000000000 --- a/sre-recipes/recipe.py +++ /dev/null @@ -1,163 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# -*- coding: utf-8 -*- -""" -This module contains an abstract base class that defines the required -behavior of each recipe. -""" - -import abc -import subprocess -import logging - - -class Recipe(abc.ABC): - """ - This abstract base class outlines the required behavior of a recipe. - """ - - @abc.abstractmethod - def get_name(self): - """Returns the name of the recipe""" - - def is_active(self): - """Determines whether the recipe shows up in sandboxctl""" - return True - - @abc.abstractmethod - def break_service(self): - """Deploys the broken service""" - - @abc.abstractmethod - def restore_service(self): - """Restores working condition""" - - @abc.abstractmethod - def verify(self): - """ - Verifies that the user of the recipe found the root cause - of the breakage - """ - - @abc.abstractmethod - def hint(self): - """ - Provides a hint about the root cause of the issue - """ - - @staticmethod - def _run_command(command): - """Runs the given command and returns any output and error""" - process = subprocess.Popen( - command.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE - ) - output, error = process.communicate() - return output, error - - @staticmethod - def _run_command_interactive(command): - """Runs the given interactive command that waits for user input and returns any output and error""" - process = subprocess.run(command.split()) - return - - - @staticmethod - def _get_project_id(): - get_project_command = "gcloud config list --format value(core.project)" - project_id, error = Recipe._run_command(get_project_command) - project_id = project_id.decode("utf-8").replace('"', "").strip() - if not project_id: - logging.error("Could not retrieve project id: " + error) - return project_id - - @staticmethod - def _get_external_ip(): - Recipe._auth_cluster() - external_ip_command = "kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'" - ip, error = Recipe._run_command(external_ip_command) - if not ip: - logging.error('No external IP found:' + error) - return ip.decode("utf-8").replace("'", '') - - @staticmethod - def _auth_cluster(cluster="APP"): - """ Authenticates for kubectl commands. """ - logging.info("Authenticating cluster") - project_id = Recipe._get_project_id() - if not project_id: - print("No project found.") - logging.error("Could not authenticate cluster. No project ID found.") - exit(1) - name = "cloud-ops-sandbox" - if cluster == "LOADGEN": - name = "loadgenerator" - zone_command = "gcloud container clusters list --filter name:{} --project {} --format value(zone)".format( - name, project_id - ) - zone, error = Recipe._run_command(zone_command) - zone = zone.decode("utf-8").replace('"', "") - if not zone: - print("Failed to set up recipe. No cluster for {} was found.".format(name)) - logging.error( - "Could not authenticate cluster. No cluster found for {} found.".format( - name - ) - ) - exit(1) - auth_command = "gcloud container clusters get-credentials {} --project {} --zone {}".format( - name, project_id, zone - ) - Recipe._run_command(auth_command) - logging.info("Cluster has been authenticated") - - @staticmethod - def _generate_multiple_choice(prompt, choices, correct_answer): - """Creates a multiple choice quiz using numeric answers and prints to terminal. Automatically polls for user response. - Input: - prompt - (string) the question asked to the user - choice - (list of strings) a list of responses. They will automatically be ennumerated - correct_answer - (string) the correct answer - must string match with one of the entries in the choice array - Output: - No output - """ - # Verify the correct exists as a choice - if not correct_answer in choices: - logging.error( - "Correct answer not found in available choices for prompt: {}".format( - prompt - ) - ) - return - - # Show the multiple choice - print(prompt) - for index, choice in enumerate(choices, 1): - print("\t {}) {}".format(index, choice)) - - # Verify the answer - while True: - answer = input("Enter the number of your answer: ") - try: - answer = int(answer) - if answer < 1 or answer > len(choices): - print("Not a valid choice.") - elif choices[answer - 1] == correct_answer: - print("Correct!") - return - else: - print("Incorrect. Try again.") - except ValueError: - print("Please enter the number of your answer.") diff --git a/sre-recipes/recipe_runner.py b/sre-recipes/recipe_runner.py new file mode 100644 index 000000000..4fc639588 --- /dev/null +++ b/sre-recipes/recipe_runner.py @@ -0,0 +1,267 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- + +""" +This file contains utility runtime classes implementing core SRE Recipes +features, such as breaking and restoring microservices, printing hints, and +running interactive multiple choice questions. + +Currently, it implements two SRE Recipe Runner: +- ImplBasedRecipeRunner: runs SRE Recipe implemented via python classes. +- ConfigBasedRecipeRunner: runs SRE Recipes defined as YAML configs. + +Refer to the class docstring for further explanations. +""" + +import abc +import importlib +import requests +import subprocess +import yaml + +from inspect import isclass +from os import path + +import utils +from recipes.impl_based.base import BaseRecipeImpl + + +# Default Load Generation Config +DEFAULT_LOADGEN_USER_TYPE = "BasicHomePageViewingUser" +DEFAULT_LOADGEN_USER_COUNT = 20 +DEFAULT_LOADGEN_SPAWN_RATE = 1 +DEFAULT_LOADGEN_TIMEOUT_SECONDS = 600 + + +class ImplBasedRecipeRunner: + """A SRE Recipe runner for running recipes implemented as class objects. + + Given a `recipe_name`, it tries to run `recipes/impl_based/recipe_name.py`. + + This runner will propgate all exceptions to the caller, and it is caller's + responsibility to handle any exception and to perform any error logging. + """ + + def __init__(self, recipe_name): + self.recipe = None + module = importlib.import_module(f"recipes.impl_based.{recipe_name}") + for attribute_name in dir(module): + attr = getattr(module, attribute_name) + if isclass(attr) and attr is not BaseRecipeImpl and issubclass(attr, BaseRecipeImpl): + self.recipe = attr() + break + if not self.recipe: + raise NotImplementedError( + f"No valid implementation exists for `{recipe_name}` recipe.") + + def get_name(self): + return self.recipe.get_name() + + def get_description(self): + return self.recipe.get_description() + + def run_break(self): + return self.recipe.run_break() + + def run_restore(self): + return self.recipe.run_restore() + + def run_hint(self): + return self.recipe.run_hint() + + def run_verify(self): + return self.recipe.run_verify() + + +class ConfigBasedRecipeRunner: + """A SRE Recipe runner for running recipes implemented using configs. + + Given a `recipe_name`, it tries to load `recipes/configs_based/recipe_name.yaml`. + + This runner will propagate all exceptions to the caller, and it is caller's + responsibility to handle any exception and to perform any error logging. + """ + + def __init__(self, recipe_name, skip_loadgen=False): + filepath = path.join(path.dirname( + path.abspath(__file__)), f"recipes/configs_based/{recipe_name}.yaml") + with open(filepath, "r") as file: + self.recipe = yaml.safe_load(file.read()) + if not self.recipe: + raise ValueError("Cannot parse config as YAML.") + self.action_handler = ActionHandler(skip_loadgen) + + def get_name(self): + return self.recipe.get("name", "No name found") + + def get_description(self): + return self.recipe.get("description", "No description found") + + @property + def config(self): + return self.recipe.get("config", {}) + + def run_break(self): + print('Deploying broken service...') + for action in self.config.get("break", []): + self.action_handler.handle_action(action) + print('Done. Deployed broken service') + + def run_restore(self): + print('Restoring service back to normal...') + for action in self.config.get("restore", []): + self.action_handler.handle_action(action) + print('Done. Restored broken service to working state.') + + def run_hint(self): + hint = self.config.get("hint", None) + if hint: + print(f'Here is your hint!\n\n{hint}') + else: + print("This recipe has no hints.") + + def run_verify(self): + verify_config = self.config.get("verify", []) + if not verify_config: + raise NotImplementedError("Verify is not configured") + for action in verify_config: + self.action_handler.handle_action(action) + + +class ActionHandler: + """A utility helper for executing actions supported by SRE Recipe configs. + + Implementation Guide + -------------------- + 1. Map the action name to the action handler in the `__init__` method. + 2. All action handlers should take exactly one argument, which is the full + config specified for the action itself, as it is defined in YAML. + For example: {action: "run-shell-commands", commands: ['echo Hi']} + + This runner will propgate all exceptions to the caller, and it is caller's + responsibility to handle any exception and to perform any error logging. + """ + + def __init__(self, skip_loadgen=False): + # Action types to action handlers + self.action_map = { + "run-shell-commands": self.run_shell_commands, + "multiple-choice-quiz": self.run_multiple_choice_quiz, + "loadgen-spawn": self.loadgen_spawn, + "loadgen-stop": self.loadgen_stop, + } + if skip_loadgen: + # ignore loadgen actions when requested + self.action_map["loadgen-spawn"] = lambda *args: None + self.action_map['loadgen-stop'] = lambda *args: None + # Reusable parameters shared between action handlers + self.loadgen_ip = None + + def handle_action(self, config): + if "action" not in config: + raise ValueError("Action config missing `action` type") + action_type = config["action"] + if action_type not in self.action_map: + raise NotImplementedError( + f"Action type not implemented: {action_type}") + return self.action_map[action_type](config) + + def init_loadgen_ip(self): + if not self.loadgen_ip: + self.loadgen_ip, err = utils.get_loadgen_ip() + if err: + raise RuntimeError(f"Failed to get loadgen IP: {err}") + + ############################ Action Handlers ############################### + + def run_shell_commands(self, config): + """Runs the commands one at a time in shell. + + Config Paramters + ---------------- + commands: string[] + Required. A list of shell command strings. + """ + for cmd in config["commands"]: + output, err = utils.run_shell_command(cmd) + if err: + raise RuntimeError( + f"Failed to run command `{cmd}`: {err}") + + def run_multiple_choice_quiz(self, config): + """Runs an interactive multiple choice quiz. + + Config Paramters + ---------------- + prompt: string + Required. The question prompt to display to the user. + choices: dict[] + option: string + Required. The answer display text to show to the user. + accept: bool + Optional. If true, the choice is considered correct. + """ + if "prompt" not in config: + raise ValueError("No prompt specified for the multiple choice.") + elif "choices" not in config: + raise ValueError( + "No answer choices available for the multiple choice.") + utils.run_interactive_multiple_choice( + config["prompt"], config["choices"]) + + def loadgen_spawn(self, config): + """ + Starts spawning a load shape at specified spawn rate until a total + user count is reached. Then, stop the load after a specified timesout. + + Config Paramters + ---------------- + user_type: string + Optional. Same as the `sre_recipe_user_identifier` for locust tasks + defined in `sre/loadgenerator/locust_tasks`. + Default: BasicHomePageViewingUser. + user_count: int + Optional. The number of total users to spawn. Default: 20. + spawn_rate: int + Optional. The number of users per second to spawn. Default: 1. + stop_after: int + Optional. The number of seconds to spawn before stopping. + Default: 600 seconds. + """ + self.init_loadgen_ip() + user_type = config.get( + "user_type", DEFAULT_LOADGEN_USER_TYPE) + resp = requests.post( + f"http://{self.loadgen_ip}:81/api/spawn/{user_type}", + { + "user_count": int(config.get("user_count", DEFAULT_LOADGEN_USER_COUNT)), + "spawn_rate": int(config.get("spawn_rate", DEFAULT_LOADGEN_SPAWN_RATE)), + "stop_after": int(config.get("stop_after", DEFAULT_LOADGEN_TIMEOUT_SECONDS)) + }) + if not resp.ok: + raise RuntimeError( + f"Failed to start load generation: {resp.status_code} {resp.reason}") + + def loadgen_stop(self, config): + """Stops any active load generation produced by SRE Recipes. + + Config Paramters is not required. + """ + self.init_loadgen_ip() + resp = requests.post(f"http://{self.loadgen_ip}:81/api/stop") + if not resp.ok: + raise RuntimeError( + f"Failed to stop existing load generation: {resp.status_code} {resp.reason}") diff --git a/sre-recipes/recipes/configs_based/README.md b/sre-recipes/recipes/configs_based/README.md new file mode 100644 index 000000000..62b7d37a9 --- /dev/null +++ b/sre-recipes/recipes/configs_based/README.md @@ -0,0 +1,147 @@ +# Configs-Based SRE Recipe + +This directory contains configs for supported config-based SRE Recipes. + +## Writing the Config + +Each SRE Recipe config is a YAML file with the following overall structure. + +```yaml +name: +description: +config: + # This section defines the actions to run when `sandboxctl sre-receipes break` + # is called" . In practice, this is where you try to break sandbox services. + # + # If your SRE Recipe has complex logic, prefer running a shell command to + # run a shell script instead. + # + # You can use, or contribute, more action templates by referring to the + # "Supported SRE Recipe Actions" below. + break: + # The `run-shell-commands` action template simply runs the given shell + # commands one at a time as it is. + - action: run-shell-commands + commands: + - echo 'first command' + - echo 'another command' + + # The `loadgen-spawn` action template will spawn the given load shape + # producible by `user_type` (see `sre/loadgenerator/locust_tasks`) at a + # `spawn_rate` of users per second until it reaches a total of `user_count` + # users. The users will keep generating load until at least `stop_after` + # seconds have passed. + - action: loadgen-spawn + user_type: BasicHomePageViewingUser + user_count: 20 + spawn_rate: 5 + stop_after: 600 + + # The `loadgen-stop` action template will stop any active load generation + # produced by SRE Recipes. It is ok to call this even if there is no load + # generation ongoing. + - action: loadgen-stop + # This section defines the actions to run when `sandboxctl sre-receipes restore` + # is called". In practice, this is where you try to restore sandbox services. + # + # If your SRE Recipe has complex logic, prefer running a shell command to + # run a shell script instead. + # + # You can use, or contribute, more action templates by referring to the + # "Supported SRE Recipe Actions" below. + restore: + # The same set of action templates as `break` are supported in `restore` + - action: run-shell-commands + commands: + - echo 'first command' + - echo 'another command' + - action: loadgen-stop + hint: Put the hint string for your recipe here + verify: + - action: multiple-choice-quiz + prompt: Put the question prompt here + choices: + # Put as many answers to choose from as you need + # Mark the correct option with `accept: true` + # You must at least mark one option as accepted, otherwise a runtime + # error will be thrown. You can mark multiple options as accepted. + - option: Answer 1 + accept: true + - option: Answer 2 + - option: Answer 3 +``` + +## Contributions + +If you want to add more pre-defined action templates, + +1. add your implementation to the `ActionHandlers` in `recipe_runner.py`. +2. add a short guide for how to use your new action in this README file +3. add schema validation for your new action config in `./schema` folder + +## Supported SRE Recipe Actions + +The `break` and `restore` sections support the following action templates: + +1. `run-shell-commands`: simply run the commands one at a time in shell + +Example: + +```yaml +- action: run-shell-commands + commands: + - kubectl delete pod $(kubectl get pod -l app=frontend -o jsonpath='{.items[0].metadata.name}') +``` + +2. `loadgen-stop`: stop any active load generation produced by SRE Recipes. + +It is ok to call this even if there is no load generation ongoing. + +Example: + +```yaml +- action: loadgen-stop +``` + +3. `loadgen-spawn`: start spawning the given load shape producible by + `user_type` at a `spawn_rate` of users per second until it reaches a total of `user_count` users. The users will keep generating load until at least + `stop_after` seconds have passed. + +_Optional Parameters:_ + +- `user_type`: same as the `sre_recipe_user_identifier` for locust + tasks defined in `sre/loadgenerator/locust_tasks`. You can implement new load + shapes by contributing in `sre/loadgenerator/locust_tasks`. + Default: `BasicHomePageViewingUser`. +- `user_count`: the number of total users to spawn. Default: `20`. +- `spawn_rate`: the number of users per second to spawn. Default: `1`. +- `stop_after`: the number of seconds to spawn before stopping. Default: `600`. + +Example: + +```yaml +- action: loadgen-spawn + # Defined in /src/loadgenerator/locust_tasks/sre_recipe_load_tasks.py + user_type: BasicHomePageViewingUser + user_count: 20 + spawn_rate: 5 + stop_after: 600 +``` + +4. `multiple-choice-quiz`: run an interactive multiple choice quiz. + +Example + +```yaml +- action: multiple-choice-quiz + prompt: Put the question prompt here + choices: + # Put as many answers to choose from as you need + # Mark the correct option with `accept: true` + # You must at least mark one option as accepted, otherwise a runtime + # error will be thrown. You can mark multiple options as accepted. + - option: Answer 1 + accept: true + - option: Answer 2 + - option: Answer 3 +``` diff --git a/sre-recipes/recipes/configs_based/disabled/README.md b/sre-recipes/recipes/configs_based/disabled/README.md new file mode 100644 index 000000000..d552db570 --- /dev/null +++ b/sre-recipes/recipes/configs_based/disabled/README.md @@ -0,0 +1,2 @@ +Any recipe config in this directory is considered inactive or disabled, thus not +runnable via the `sandboxctl`. diff --git a/sre-recipes/recipes/configs_based/disabled/recipe1.yaml b/sre-recipes/recipes/configs_based/disabled/recipe1.yaml new file mode 100644 index 000000000..b3a1689ac --- /dev/null +++ b/sre-recipes/recipes/configs_based/disabled/recipe1.yaml @@ -0,0 +1,67 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- + +name: Encoding Recipe +description: | + This implements recipe 1, which purposefully breaks encoding logic in the + email service, which is a part of the checkout flow for sending order + confirmation emails. +config: + break: + - action: run-shell-commands + commands: + - kubectl set env deployment/emailservice ENCODE_EMAIL=true + - kubectl delete pod $(kubectl get pod -l app=emailservice -o jsonpath='{.items[0].metadata.name}') + - kubectl wait --for=condition=available --timeout=600s deployment/emailservice + restore: + - action: run-shell-commands + commands: + - kubectl set env deployment/emailservice ENCODE_EMAIL=false + - kubectl delete pod $(kubectl get pod -l app=emailservice -o jsonpath='{.items[0].metadata.name}') + - kubectl wait --for=condition=available --timeout=600s deployment/emailservice + hint: | + Visit the external IP of the demo application and try buying some products. + You can also use monitoring dashboards to see metrics associated with each + service, and use Cloud Logging to view logs exported by each service. + Note: It may take up to 5 minutes for monitoring metrics to be updated. + You can also use `sandboxctl describe` to get information (such as project + ID, logs, core URLs) for your sandbox. + verify: + - action: multiple-choice-quiz + prompt: Which service has an issue? + choices: + - option: Ad + - option: Cart + - option: Checkout + - option: Currency + - option: Email + accept: true + - option: Frontend + - option: Payment + - option: Product Catalog + - option: Rating + - option: Recommendation + - option: Shipping + - action: multiple-choice-quiz + prompt: What was the cause of the issue? + choices: + - option: Dropped Requests + - option: Failed connections to other services + - option: High latency + - option: High memory usage + - option: Memory Quota Exceeded + - option: Internal Server Error + accept: true diff --git a/sre-recipes/recipes/configs_based/recipe0.yaml b/sre-recipes/recipes/configs_based/recipe0.yaml new file mode 100644 index 000000000..96124946d --- /dev/null +++ b/sre-recipes/recipes/configs_based/recipe0.yaml @@ -0,0 +1,72 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- + +name: Currency Recipe +description: | + This implements recipe 0, which purposefully introduces latency into the + frontend service by doing a lot of unnecessary currency conversions. +config: + break: + - action: loadgen-stop + - action: run-shell-commands + commands: + - kubectl set env deployment/frontend CONVERT_CURRENCIES=true + - kubectl delete pod $(kubectl get pod -l app=frontend -o jsonpath='{.items[0].metadata.name}') + - kubectl wait --for=condition=available --timeout=600s deployment/frontend + - action: loadgen-spawn + user_type: BasicHomePageViewingUser + user_count: 20 + spawn_rate: 5 + stop_after: 600 + restore: + - action: loadgen-stop + - action: run-shell-commands + commands: + - kubectl set env deployment/frontend CONVERT_CURRENCIES=false + - kubectl delete pod $(kubectl get pod -l app=frontend -o jsonpath='{.items[0].metadata.name}') + - kubectl wait --for=condition=available --timeout=600s deployment/frontend + hint: | + Visit the external IP of the demo application to see if there are any + visible changes. You can also use monitoring dashboards to see metrics + associated with each service. Note: It may take up to 5 minutes for + monitoring metrics to be updated. You can also use `sandboxctl describe` + to get information (such as project ID, logs, core URLs) for your sandbox. + verify: + - action: multiple-choice-quiz + prompt: Which service has an issue? + choices: + - option: Ad + - option: Cart + - option: Checkout + - option: Currency + - option: Email + - option: Frontend + accept: true + - option: Payment + - option: Product + - option: Rating + - option: Recommendation + - option: Shipping + - action: multiple-choice-quiz + prompt: What was the cause of the issue? + choices: + - option: Dropped Requests + - option: Failed connections to other services + - option: High latency + accept: true + - option: High memory usage + - option: Memory Quota Exceeded + - option: Internal Server Error diff --git a/sre-recipes/recipes/configs_based/recipe2.yaml b/sre-recipes/recipes/configs_based/recipe2.yaml new file mode 100644 index 000000000..9b2882e29 --- /dev/null +++ b/sre-recipes/recipes/configs_based/recipe2.yaml @@ -0,0 +1,61 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- + +name: Ratings Freshness Recipe +description: | + This implements recipe 2, which purposefully stops ratings service recollect + API calls to rating service, so the ratings will become stale. +config: + break: + - action: run-shell-commands + commands: + - gcloud scheduler jobs pause ratingservice-recollect-job --project $(gcloud config list --format "value(core.project)") 2>&1 + restore: + - action: run-shell-commands + commands: + - gcloud scheduler jobs resume ratingservice-recollect-job --project $(gcloud config list --format "value(core.project)") 2>&1 + hint: | + Product ratings are managed by the "rating service", hosted on Google AppEngine. + The service provides APIs that allow other services to get and update products' ratings. + The rating data is kept up-to-date by periodically calling an API endpoint that collects, + all recently sent new rating scores for each product and calculates the new rating, + based on the old value and the new scores. Try to check if the rating service operates normally. + You can also use `sandboxctl describe` to get information (such as project + ID, logs, core URLs) for your sandbox. + verify: + - action: multiple-choice-quiz + prompt: Which service has an issue? + choices: + - option: Ad + - option: Cart + - option: Checkout + - option: Currency + - option: Email + - option: Frontend + - option: Payment + - option: Product Catalog + - option: Rating + accept: true + - option: Recommendation + - option: Shipping + - action: multiple-choice-quiz + prompt: What was the cause of the issue? + choices: + - option: Rating service does not run + - option: Rating votes data is missing in the database + - option: Scheduler job that sends recollect request to rating service does not work + accept: true + - option: New ratings are calculated incorrectly diff --git a/sre-recipes/recipes/configs_based/recipe3.yaml b/sre-recipes/recipes/configs_based/recipe3.yaml new file mode 100644 index 000000000..0e12e984e --- /dev/null +++ b/sre-recipes/recipes/configs_based/recipe3.yaml @@ -0,0 +1,63 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- + +name: Recommendation Crash Recipe +description: | + This implements recipe 3, which adds a crashing bug to the recommendation + service by causing an exception in request processing. +config: + break: + # Dev Note: the MAX_RESPONSES is 5.0, a float, which will cause crash + # during integer conversion stage in the service. + - action: run-shell-commands + commands: + - kubectl set env deployment/recommendationservice MAX_RESPONSES=5.0 + - kubectl delete pod $(kubectl get pod -l app=recommendationservice -o jsonpath='{.items[0].metadata.name}') + - kubectl wait --for=condition=available --timeout=600s deployment/recommendationservice + restore: + - action: run-shell-commands + commands: + - kubectl set env deployment/recommendationservice MAX_RESPONSES- + - kubectl delete pod $(kubectl get pod -l app=recommendationservice -o jsonpath='{.items[0].metadata.name}') + - kubectl wait --for=condition=available --timeout=600s deployment/recommendationservice + hint: | + Browse your website until you encounter an issue, and use Cloud Logging to + view logs exported by each service. You can also use `sandboxctl describe` + to get information (such as project ID, logs, core URLs) for your sandbox. + verify: + - action: multiple-choice-quiz + prompt: Which service has an issue? + choices: + - option: Ad + - option: Cart + - option: Checkout + - option: Currency + - option: Email + - option: Frontend + - option: Payment + - option: Product Catalog + - option: Rating + - option: Recommendation + accept: true + - option: Shipping + - action: multiple-choice-quiz + prompt: What was the cause of the issue? + choices: + - option: High Latency + - option: Internal Service Error + accept: true + - option: Failed Connection to Other Services + - option: Memory Quota Issues diff --git a/sre-recipes/recipes/configs_based/schema/README.md b/sre-recipes/recipes/configs_based/schema/README.md new file mode 100644 index 000000000..fb219c709 --- /dev/null +++ b/sre-recipes/recipes/configs_based/schema/README.md @@ -0,0 +1,61 @@ +## Config Based SRE Recipe Schema + +This directory defines the schema validation for SRE Recipes configs. + +It uses the JSON Schema (https://json-schema.org/) definition based the parsed +JSON from the YAML format. + +### Usage + +If you need to write reusable schema definitions that can be referenced via +`$ref` field, define them in the `./defs` subdirectory. + +### Adding validation for a new SRE Recipe action + +1. Define the JSON schema for your action config under `./defs`. + + For example, our `loadgen-spawn` action config schema validation are defined + at `./defs/loadgen-spawn.schema.json` + +2. Add your new action to the `./defs/action-config-list.schema.json` schema + + a. Add your action config name to the list of `enums` under `Supported action configs names`. + + b. Attach your schema definition reference to the config name by adding a new `if-then` tuple under `allOf`. + +For example, if you added a new action handler for `action: my-action`, then: + +1. create a `./defs/my-action.schema.json` schema definition +2. add to the `action-config-list.schema.json`: + +``` +{ + // other stuff .... + "items": { + "properties": { + "action": { + "type": "string", + "description": "Supported action configs names", + "enum": [ + // other stuff .... + "my-action" // step a: add your action name here + ] + } + }, + "allOf": [ + // .... + // step b: attach your schema definition here + { + "description": "The schema definition for `action: my-action`", + "if": { + "properties": { "action": { "const": "my-action" } } + }, + "then": { + "$ref": "#/$defs/my-action" + } + } + ] + }, + // other stuff .... +} +``` diff --git a/sre-recipes/recipes/configs_based/schema/defs/README.md b/sre-recipes/recipes/configs_based/schema/defs/README.md new file mode 100644 index 000000000..182a349a0 --- /dev/null +++ b/sre-recipes/recipes/configs_based/schema/defs/README.md @@ -0,0 +1,61 @@ +# JSON Schema Definitions + +This directory contains all the JSON schema definitions that will be pulled into +the root `$def` section of the main root schema at `schema.json` (in the parent +directory) for reference at SRE Recipe validation schema bundling time. + +**Requirements** + +1. All schema definitions should follow the naming convention of `ABC.schema.json` +2. The individual schema definition file should NOT define its own `definitions` + or `$defs` sections. If you need to reuse certain schema definition, make + it a new schema definition file on its own. + +For a definition file named `ABC.schema.json`, it can be referenced by +`#/$defs/abc` by both the root `schema.json` and any other definition file +under this `./defs` directory. + +### Example + +- `schema.json`: + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "schema.json", + "type": "object", + "properties": { + "first-name": { + "$ref": "#/$defs/name" + }, + "last-name": { + "$ref": "#/$defs/name" + }, + "age": { + "$ref": "#/$defs/age" + } + } +} +``` + +- `defs/name.schema.json`: + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "name.schema.json", + "type": "string", + "minLength": 1 +} +``` + +- `defs/age.schema.json`: + +```json +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "age.schema.json", + "type": "integer", + "minimum": 1 +} +``` diff --git a/sre-recipes/recipes/configs_based/schema/defs/action-config-list.schema.json b/sre-recipes/recipes/configs_based/schema/defs/action-config-list.schema.json new file mode 100644 index 000000000..4455f075e --- /dev/null +++ b/sre-recipes/recipes/configs_based/schema/defs/action-config-list.schema.json @@ -0,0 +1,57 @@ +{ + "type": "array", + "description": "The main schema for defining a list of action configs", + "items": { + "properties": { + "action": { + "type": "string", + "description": "Supported action configs names", + "enum": [ + "run-shell-commands", + "loadgen-spawn", + "loadgen-stop", + "multiple-choice-quiz" + ] + } + }, + "allOf": [ + { + "description": "The schema definition for `action: run-shell-commands`", + "if": { + "properties": { "action": { "const": "run-shell-commands" } } + }, + "then": { + "$ref": "#/$defs/run-shell-commands" + } + }, + { + "description": "The schema definition for `action: loadgen-spawn`", + "if": { + "properties": { "action": { "const": "loadgen-spawn" } } + }, + "then": { + "$ref": "#/$defs/loadgen-spawn" + } + }, + { + "description": "The schema definition for `action: loadgen-stop`", + "if": { + "properties": { "action": { "const": "loadgen-stop" } } + }, + "then": { + "$ref": "#/$defs/loadgen-stop" + } + }, + { + "description": "The schema definition for `action: multiple-choice-quiz`", + "if": { + "properties": { "action": { "const": "multiple-choice-quiz" } } + }, + "then": { + "$ref": "#/$defs/multiple-choice-quiz" + } + } + ] + }, + "minItems": 1 +} diff --git a/sre-recipes/recipes/configs_based/schema/defs/loadgen-spawn.schema.json b/sre-recipes/recipes/configs_based/schema/defs/loadgen-spawn.schema.json new file mode 100644 index 000000000..45bda18d1 --- /dev/null +++ b/sre-recipes/recipes/configs_based/schema/defs/loadgen-spawn.schema.json @@ -0,0 +1,33 @@ +{ + "type": "object", + "description": "The config schema for generating a specific load pattern to the sandbox frontend.", + "required": ["action"], + "properties": { + "action": { + "type": "string", + "const": "loadgen-spawn", + "description": "Required identifier for loadgen-spawn action." + }, + "user_type": { + "type": "string", + "description": "Optional. The `sre_recipe_user_identifier` for locust tasks defined in `sre/loadgenerator/locust_tasks`. Default: BasicHomePageViewingUser.", + "minLength": 1 + }, + "user_count": { + "type": "integer", + "description": "Optional. The number of total users to spawn. Default: 20.", + "minimum": 1 + }, + "spawn_rate": { + "type": "integer", + "description": "Optional. The number of users per second to spawn. Default: 1.", + "minimum": 1 + }, + "stop_after": { + "type": "integer", + "description": "Optional. The number of seconds to spawn before stopping. Default: 600.", + "minimum": 1 + } + }, + "additionalProperties": false +} diff --git a/sre-recipes/recipes/configs_based/schema/defs/loadgen-stop.schema.json b/sre-recipes/recipes/configs_based/schema/defs/loadgen-stop.schema.json new file mode 100644 index 000000000..2ba763a3f --- /dev/null +++ b/sre-recipes/recipes/configs_based/schema/defs/loadgen-stop.schema.json @@ -0,0 +1,13 @@ +{ + "type": "object", + "description": "The config schema for stopping any active load generation produced by SRE Recipe Load Generator.", + "required": ["action"], + "properties": { + "action": { + "type": "string", + "const": "loadgen-stop", + "description": "Required identifier for loadgen-stop action." + } + }, + "additionalProperties": false +} diff --git a/sre-recipes/recipes/configs_based/schema/defs/multiple-choice-quiz.schema.json b/sre-recipes/recipes/configs_based/schema/defs/multiple-choice-quiz.schema.json new file mode 100644 index 000000000..dfd92cdb0 --- /dev/null +++ b/sre-recipes/recipes/configs_based/schema/defs/multiple-choice-quiz.schema.json @@ -0,0 +1,51 @@ +{ + "type": "object", + "description": "The config schema for running an interactive multiple choice quiz.", + "required": ["action", "prompt", "choices"], + "properties": { + "action": { + "type": "string", + "const": "multiple-choice-quiz", + "description": "Required identifier for multiple-choice-quiz action." + }, + "prompt": { + "type": "string", + "description": "Required. The question prompt to display.", + "minLength": 1 + }, + "choices": { + "type": "array", + "description": "Required. The list of potential answers to choose from.", + "minItems": 1, + "items": { + "type": "object", + "description": "The config schema for a specific answer choice", + "required": ["option"], + "properties": { + "option": { + "type": "string", + "description": "Required. The answer display text to show user." + }, + "accept": { + "type": "boolean", + "description": "Optional. When true, this entry will be accepted as correct." + } + }, + "additionalProperties": false + }, + "contains": { + "type": "object", + "description": "At least one answer config has `accept` defined as True.", + "required": ["accept"], + "properties": { + "accept": { + "type": "boolean", + "enum": [true] + } + } + }, + "uniqueItems": true + } + }, + "additionalProperties": false +} diff --git a/sre-recipes/recipes/configs_based/schema/defs/run-shell-commands.schema.json b/sre-recipes/recipes/configs_based/schema/defs/run-shell-commands.schema.json new file mode 100644 index 000000000..bc81362d6 --- /dev/null +++ b/sre-recipes/recipes/configs_based/schema/defs/run-shell-commands.schema.json @@ -0,0 +1,22 @@ +{ + "type": "object", + "description": "The config schema for running a list of shell commands one at a time", + "required": ["action", "commands"], + "properties": { + "action": { + "type": "string", + "const": "run-shell-commands", + "description": "Required identifier for run-shell-commands action." + }, + "commands": { + "type": "array", + "description": "Required. A list of shell command strings", + "items": { + "type": "string", + "description": "Valid command string passed to Python `subprocess.run`", + "minLength": 1 + } + } + }, + "additionalProperties": false +} diff --git a/sre-recipes/recipes/configs_based/schema/schema.json b/sre-recipes/recipes/configs_based/schema/schema.json new file mode 100644 index 000000000..750292537 --- /dev/null +++ b/sre-recipes/recipes/configs_based/schema/schema.json @@ -0,0 +1,46 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "schema.json", + "title": "SRE Recipe Config - Schema Definitions", + "type": "object", + "description": "The base schema for an SRE Recipe", + "required": ["name", "description", "config"], + "properties": { + "name": { + "type": "string", + "description": "The name of the SRE Recipe", + "minLength": 1 + }, + "description": { + "type": "string", + "description": "The description of the SRE Recipe", + "minLength": 1 + }, + "config": { + "type": "object", + "description": "The config section for the SRE Recipe", + "required": ["break", "restore", "hint", "verify"], + "properties": { + "break": { + "description": "A list of actions to run for the `sandboxctl sre-receipes break` command", + "$ref": "#/$defs/action-config-list" + }, + "restore": { + "description": "A list of actions to run for the `sandboxctl sre-receipes restore` command", + "$ref": "#/$defs/action-config-list" + }, + "hint": { + "type": "string", + "description": "A hint string to display for the `sandboxctl sre-receipes hint` command", + "minLength": 1 + }, + "verify": { + "description": "A list of actions to run for the `sandboxctl sre-receipes verify` command", + "$ref": "#/$defs/action-config-list" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/sre-recipes/recipes/currencies_recipe/currencies_recipe.py b/sre-recipes/recipes/currencies_recipe/currencies_recipe.py deleted file mode 100644 index 7c40ba47a..000000000 --- a/sre-recipes/recipes/currencies_recipe/currencies_recipe.py +++ /dev/null @@ -1,175 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -*- coding: utf-8 -*- -""" -This module contains the implementation of recipe 0 -""" - -import requests -import logging -import subprocess -from recipe import Recipe - - -class CurrenciesRecipe(Recipe): - """ - This class implements recipe 0, which purposefully - introduces latency into the frontend service. - """ - name = "recipe0" - - def get_name(self): - return self.name - - @staticmethod - def _deploy_state(state): - """ - Sets an environment variable CONVERT_CURRENCIES to given state - and updates the state accordingly - """ - # Try getting Load Generator IP - Recipe._auth_cluster(cluster="LOADGEN") - get_loadgen_ip_command = """kubectl get service loadgenerator -o \ - jsonpath=\"{.status.loadBalancer.ingress[0].ip}\"""" - logging.info('Getting loadgen IP: %s', get_loadgen_ip_command) - loadgen_ip, error = Recipe._run_command(get_loadgen_ip_command) - if loadgen_ip is not None: - loadgen_ip = loadgen_ip.decode("utf-8").replace('"', '').strip() - - if not loadgen_ip: - operation = "start" if state else "stop" - print(f"No load generator IP found. Will not {operation} synthetic load") - logging.error(f"No load generator IP found. Will not {operation} synthetic load") - elif not state: - logging.info(f"Trying to stop any load generation.") - resp = requests.post(f"http://{loadgen_ip}:81/api/stop") - logging.info(f"Load Generator API Response: {resp.text}") - - Recipe._auth_cluster(cluster="APP") - state_str = str(state).lower() - set_env_command = f"kubectl set env deployment/frontend CONVERT_CURRENCIES={state_str}" - get_pod_command = """kubectl get pod -l app=frontend -o \ - jsonpath=\"{.items[0].metadata.name}\"""" - logging.info('Setting env variable: %s', set_env_command) - logging.info('Getting pod: %s', get_pod_command) - - Recipe._run_command(set_env_command) - service, error = Recipe._run_command(get_pod_command) - service = service.decode("utf-8").replace('"', '') - if not service: - print('No service found. Could not deploy state.') - logging.error('No service found. Could not deploy state.') - delete_pod_command = f"kubectl delete pod {service}" - logging.info('Deleting pod: %s', delete_pod_command) - Recipe._run_command(delete_pod_command) - availability_command = "kubectl wait --for=condition=available --timeout=600s deployment/frontend" - Recipe._run_command(availability_command) - - if loadgen_ip and state: - # If we are breaking the service, start generating loads to the - # frontend, after it is available, in order to expose the high - # latency (caused by this recipe) in the frontend metrics. - # The load will be generated by 20 users at spawn rate of 5 - # users/seconds, and the load will auto-stop after 10 minutes. - logging.info(f"Trying to start load generation") - resp = requests.post( - f"http://{loadgen_ip}:81/api/spawn/BasicHomePageViewingUser", - { - "user_count": 20, - "spawn_rate": 5, - "stop_after": 600 - }) - logging.info(f"Load Generator API Response: {resp.text}") - - def break_service(self): - """ - Rolls back the working version of the given service and deploys the - broken version of the given service - """ - print('Deploying broken service...') - self._deploy_state(True) - print('Done') - logging.info('Deployed broken service') - - def restore_service(self): - """ - Rolls back the broken version of the given service and deploys the - working version of the given service - """ - print('Deploying working service...') - self._deploy_state(False) - print('Done') - logging.info('Deployed working service') - - def hint(self): - """ - Provides a hint about finding the root cause of this recipe - """ - print('Giving hint for recipe') - Recipe._auth_cluster() - external_ip_command = "kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'" - ip, error = Recipe._run_command(external_ip_command) - ip = ip.decode("utf-8").replace("'", '') - if not ip: - print('No external IP found.') - logging.error('No external IP found.') - exit(1) - print('Visit the external IP of the demo application to see if there are any visible changes: http://{}'.format(ip)) - get_project_command = "gcloud config list --format value(core.project)" - project_id, error = Recipe._run_command(get_project_command) - project_id = project_id.decode("utf-8").replace('"', '') - if not project_id: - print('No project ID found.') - logging.error('No project ID found.') - exit(1) - print('Use Monitoring Dashboards to see metrics associated with each service: https://console.cloud.google.com/monitoring/dashboards?project={}'.format(project_id)) - print('Note: It may take up to 5 minutes for monitoring metrics to be updated') - - def verify_broken_service(self): - """ - Displays a multiple choice quiz to the user about which service - broke and prompts the user for an answer - """ - prompt = 'Which service has a breakage?' - choices = ['email service', 'frontend service', 'ad service', 'recommendation service', 'currency service'] - answer = 'frontend service' - Recipe._generate_multiple_choice(prompt, choices, answer) - - def verify_broken_cause(self): - """ - Displays a multiple choice quiz to the user about the cause of - the breakage and prompts the user for an answer - """ - prompt = 'What caused the breakage?' - choices = ['failed connections to other services', 'high memory usage', 'high latency', 'dropped requests'] - answer = 'high latency' - Recipe._generate_multiple_choice(prompt, choices, answer) - - def verify(self): - """Verifies the user found the root cause of the broken service""" - print( - ''' - This is a multiple choice quiz to verify that - you have found the root cause of the breakage. - ''' - ) - self.verify_broken_service() - self.verify_broken_cause() - print( - ''' - Good job! You have correctly identified which - service broke and what caused it to break. - ''' - ) diff --git a/sre-recipes/recipes/encoding_recipe/encoding_recipe.py b/sre-recipes/recipes/encoding_recipe/encoding_recipe.py deleted file mode 100644 index faac77d69..000000000 --- a/sre-recipes/recipes/encoding_recipe/encoding_recipe.py +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright 2020 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -*- coding: utf-8 -*- -""" -This module contains the implementation of recipe 1 -""" - -import logging -import subprocess -from recipe import Recipe - - -class EncodingRecipe(Recipe): - """ - This class implements recipe 1, which purposefully - spits errors from the Email Service. - """ - name = "recipe1" - - def get_name(self): - return self.name - - def is_active(self): - # recipe temporarily disabled until it is easier to solve - # TODO: improve and re-enable recipe - return False - - def deploy_state(self, state): - """ - Sets an environment variable ENCODE_EMAIL to given state - and updates the state accordingly - """ - state_str = str(state).lower() - set_env_command = f"kubectl set env deployment/emailservice ENCODE_EMAIL={state_str}" - get_pod_command = """kubectl get pod -l app=emailservice -o \ - jsonpath=\"{.items[0].metadata.name}\"""" - logging.info('Setting env variable: %s', set_env_command) - logging.info('Getting pod: %s', get_pod_command) - - Recipe._run_command(set_env_command) - service, error = Recipe._run_command(get_pod_command) - service = service.decode("utf-8").replace('"', '') - if not service: - print('No service found. Could not deploy state.') - logging.error('No service found. Could not deploy state.') - exit(1) - delete_pod_command = f"kubectl delete pod {service}" - logging.info('Deleting pod: %s', delete_pod_command) - Recipe._run_command(delete_pod_command) - availability_command = "kubectl wait --for=condition=available --timeout=600s deployment/emailservice" - Recipe._run_command(availability_command) - - def break_service(self): - """ - Rolls back the working version of the given service and deploys the - broken version of the given service - """ - print("Deploying broken service...") - Recipe._auth_cluster() - self.deploy_state(True) - print("Done") - logging.info('Deployed broken service') - - def restore_service(self): - """ - Rolls back the broken version of the given service and deploys the - working version of the given service - """ - print("Deploying working service...") - Recipe._auth_cluster() - self.deploy_state(False) - print("Done") - logging.info('Deployed working service') - - def hint(self): - """ - Provides a hint about the root cause of the issue - """ - get_project_command = "gcloud config list --format value(core.project)" - project_id, error = Recipe._run_command(get_project_command) - project_id = project_id.decode("utf-8").replace('"', '') - if not project_id: - print('No project ID found.') - logging.error('No project ID found.') - exit(1) - print('Use Cloud Logging to view logs exported by each service: https://console.cloud.google.com/logs?project={}'.format(project_id)) - - def verify_broken_service(self): - """ - Displays a multiple choice quiz to the user about which service - broke and prompts the user for an answer - """ - prompt = 'Which service has a breakage?' - choices = ['email service', 'recommendation service', 'productcatalog service', 'cart service', 'frontend service'] - answer = 'email service' - Recipe._generate_multiple_choice(prompt, choices, answer) - - def verify_broken_cause(self): - """ - Displays a multiple choice quiz to the user about the cause of - the breakage and prompts the user for an answer - """ - prompt = 'What was the cause of the break?' - choices = ['high latency', 'internal service errors', 'failed connection to other services', 'memory quota exceeded'] - answer = 'internal service errors' - Recipe._generate_multiple_choice(prompt, choices, answer) - - def verify(self): - """Verifies the user found the root cause of the broken service""" - print( - ''' - This is a multiple choice quiz to verify that - you have found the root cause of the break. - ''' - ) - self.verify_broken_service() - self.verify_broken_cause() - print( - ''' - Good job! You have correctly identified which - service broke and what caused it to break! - ''' - ) diff --git a/sre-recipes/recipes/impl_based/README.md b/sre-recipes/recipes/impl_based/README.md new file mode 100644 index 000000000..b2bfa1d68 --- /dev/null +++ b/sre-recipes/recipes/impl_based/README.md @@ -0,0 +1,21 @@ +# Implementation-Based SRE Recipe + +This directory contains configs for implementation based SRE Recipes. + +## Implementing the Recipe + +To create a implemented base SRE Recipe, create a file under `recipes/impl_based` +directory that implements a child class extending the `BaseRecipeImpl` from +`base.py`. + +For the recipe to be recognized as a recipe runnable via `sandboxctl`, include +`recipe` substring somewhere in the filename + +For example, to implement a recipe named `my_recipe` that can be invoked via +`sandboxctl sre-recipes my_recipe`, create a python implementation +named `recipes/impl_based/my_recipe.py` that implements a child class +extending the `BaseRecipeImpl` from `base.py`. + +If you are curious about how our SRE Recipe runner loads and reads your +implementation dynamically, check out the `ImplBasedRecipeRunner` in +`recipe_runner.py`. diff --git a/sre-recipes/recipes/currencies_recipe/__init__.py b/sre-recipes/recipes/impl_based/__init__.py similarity index 100% rename from sre-recipes/recipes/currencies_recipe/__init__.py rename to sre-recipes/recipes/impl_based/__init__.py diff --git a/sre-recipes/recipes/impl_based/base.py b/sre-recipes/recipes/impl_based/base.py new file mode 100644 index 000000000..bd700cd7c --- /dev/null +++ b/sre-recipes/recipes/impl_based/base.py @@ -0,0 +1,47 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- + +import abc + + +class BaseRecipeImpl(abc.ABC): + """The base abstract class for implementation based SRE Recipe.""" + + @abc.abstractmethod + def get_name(self): + """Returns the name of the recipe.""" + + @abc.abstractmethod + def get_description(self): + """Returns the descripion of the recipe.""" + + @abc.abstractmethod + def run_break(self): + """Performs SRE Recipe actions to break a sandbox service.""" + + @abc.abstractmethod + def run_restore(self): + """Performs SRE Recipe actions to restore a sandbox service.""" + + @abc.abstractmethod + def run_hint(self): + """Prints a hint about the root cause of the issue""" + + @abc.abstractmethod + def run_verify(self): + """ + Verifies that the user of the recipe found the correct impacted broken + service, as well as the root cause of the breakage.""" diff --git a/sre-recipes/recipes/impl_based/disabled/README.md b/sre-recipes/recipes/impl_based/disabled/README.md new file mode 100644 index 000000000..23e7d6132 --- /dev/null +++ b/sre-recipes/recipes/impl_based/disabled/README.md @@ -0,0 +1,2 @@ +Any recipe implementation in this directory is considered inactive or disabled, +thus not runnable via the `sandboxctl`. diff --git a/sre-recipes/recipes/impl_based/disabled/dummy_recipe.py b/sre-recipes/recipes/impl_based/disabled/dummy_recipe.py new file mode 100644 index 000000000..e90237c1e --- /dev/null +++ b/sre-recipes/recipes/impl_based/disabled/dummy_recipe.py @@ -0,0 +1,41 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- +""" +This module contains the implementation of a dummy implementation based Recipe. +""" + +from .base import BaseRecipeImpl + + +class DummyRecipe(BaseRecipeImpl): + + def get_name(self): + return "A dummy recipe" + + def get_description(self): + return "A implementation based recipe for illustration purposes only" + + def run_break(self): + print("Nothing to break.") + + def run_restore(self): + print("Nothing to restore.") + + def run_hint(self): + print("No hints needed. I am a dummy recipe.") + + def run_verify(self): + print("Nothing to verify. It's just a dummy recipe") diff --git a/sre-recipes/recipes/ratings_freshness_recipe/__init__.py b/sre-recipes/recipes/ratings_freshness_recipe/__init__.py deleted file mode 100644 index fd3160ad0..000000000 --- a/sre-recipes/recipes/ratings_freshness_recipe/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/sre-recipes/recipes/ratings_freshness_recipe/ratings_freshness_recipe.py b/sre-recipes/recipes/ratings_freshness_recipe/ratings_freshness_recipe.py deleted file mode 100644 index 43046c082..000000000 --- a/sre-recipes/recipes/ratings_freshness_recipe/ratings_freshness_recipe.py +++ /dev/null @@ -1,146 +0,0 @@ -# -# Copyright 2021 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -*- coding: utf-8 -*- -""" -This module contains the implementation of rating2 recipe -""" - -import logging -import subprocess -from recipe import Recipe - - -class RatingsFreshnessRecipe(Recipe): - """ - This class implements 'rating2' which purposefully - stops recollect API calls to rating service. - """ - - name = "recipe2" - - def get_name(self): - return self.name - - def is_active(self): - return True - - def break_service(self): - """ - Pause Cloud scheduler job to stop calls to recollect API of - the rating service - """ - logging.info("Pausing scheduled job of the rating service") - print("Breaking service operations...") - project_id = Recipe._get_project_id() - if not project_id: - print("Failed: cannot find project id.") - logging.error("Failed pausing scheduled job: no project id.") - exit(1) - pause_command = "gcloud scheduler jobs pause ratingservice-recollect-job --project {pid}".format( - pid=project_id - ) - _, err_str = Recipe._run_command(pause_command) - if "ERROR:" in str(err_str, "utf-8"): - print(err_str) - logging.error("Failed executing service breaking command:" + err_str) - else: - print("...done") - logging.info("Scheduled job of the rating service paused") - - def restore_service(self): - """ - Resume Cloud scheduler job to restore calls to recollect API of - the rating service - """ - logging.info("Resuming scheduled job of the rating service") - print("Restoring broken operations...") - project_id = Recipe._get_project_id() - if not project_id: - print("Failed: cannot find project id.") - logging.error("Failed pausing scheduled job: no project id.") - exit(1) - resume_command = "gcloud scheduler jobs resume ratingservice-recollect-job --project {pid}".format( - pid=project_id - ) - _, err_str = Recipe._run_command(resume_command) - if "ERROR:" in str(err_str, "utf-8"): - print(err_str) - logging.error("Failed executing service restoring command:" + err_str) - else: - print("...done") - logging.info("Scheduled job of the rating service resumed") - - def hint(self): - """ - Provides a hint about the root cause of the issue - """ - project_id = Recipe._get_project_id() - print( - "\n".join( - ( - 'Product ratings are managed by the "rating service", hosted on Google AppEngine.', - "The service provides APIs that allow other services to get and update products' ratings.", - "The rating data is kept up-to-date by periodically calling an API endpoint that collects", - "all recently sent new rating scores for each product and calculates the new rating", - "based on the old value and the new scores. Try to check if the rating service operates normally.", - ) - ) - ) - - def verify_broken_service(self): - """ - Displays a multiple choice quiz to the user about which service - broke and prompts the user for an answer - """ - prompt = "Which service has a breakage?" - choices = [ - "email service", - "frontend service", - "ad service", - "rating service", - "recommendation service", - "currency service", - ] - answer = "rating service" - Recipe._generate_multiple_choice(prompt, choices, answer) - - def verify_broken_cause(self): - """ - Displays a multiple choice quiz to the user about the cause of - the breakage and prompts the user for an answer - """ - prompt = "What is the cause of the break?" - choices = [ - "rating service does not run", - "rating votes data is missing in the database", - "scheduler job that sends recollect request to rating service does not work", - "new ratings are calculated incorrectly", - ] - answer = ( - "scheduler job that sends recollect request to rating service does not work" - ) - Recipe._generate_multiple_choice(prompt, choices, answer) - - def verify(self): - """Verifies the user found the root cause of the broken service""" - print( - """ - This is a multiple choice quiz to verify that - you have found the root cause of the break. - """ - ) - self.verify_broken_service() - self.verify_broken_cause() diff --git a/sre-recipes/requirements.txt b/sre-recipes/requirements.txt index e35d78c2d..b9a54caaf 100644 --- a/sre-recipes/requirements.txt +++ b/sre-recipes/requirements.txt @@ -1,2 +1,3 @@ click>=7.1.0 +pyyaml>-5.4.1 requests>=2.24.0 \ No newline at end of file diff --git a/sre-recipes/sandboxctl b/sre-recipes/sandboxctl index e2f84c44a..a84f34573 100755 --- a/sre-recipes/sandboxctl +++ b/sre-recipes/sandboxctl @@ -26,122 +26,116 @@ For information on how to run the CLI, run the following: import logging import os +import glob import signal import subprocess import sys -from importlib import import_module -from inspect import isclass -from os.path import abspath, dirname -from pathlib import Path -from pkgutil import iter_modules import click -from recipe import Recipe - - -def get_valid_recipes(attributes): - """ - Gets all valid recipes from the given list of tuples of attribute names - and attributes, and returns a map containing recipe names and recipe objects - """ - - recipe_objs = {} - for (attribute_name, attribute) in attributes: - if isclass(attribute) and attribute is not Recipe and issubclass(attribute, Recipe): - try: - recipe_obj = attribute() - name = recipe_obj.get_name() - if recipe_obj.is_active(): - recipe_objs[name] = recipe_obj - except TypeError: - logging.warning( - f"{attribute_name} needs to implement all abstract methods") - except Exception as e: - logging.warning(f"Unexpected error: {e}") - return recipe_objs - - -def get_recipes(): - """ - Gets all valid recipes in sre-recipes/recipes, and returns - a map containing recipe names and recipe objects - """ - - root_dir = Path(dirname(abspath(__file__))) / 'recipes' - modules = [f"recipes.{subdir}.{name}" - for subdir in os.listdir(root_dir) - for _, name, _ in iter_modules([root_dir / subdir])] - recipe_modules = [import_module(module) for module in modules] - attributes = [(attribute_name, getattr(recipe_module, attribute_name)) - for recipe_module in recipe_modules - for attribute_name in dir(recipe_module)] - recipes = get_valid_recipes(attributes) - return recipes - - -def get_loadgen_ip(): - Recipe._auth_cluster('LOADGEN') - get_ip_command = "kubectl get service loadgenerator -o "\ - "jsonpath='{.status.loadBalancer.ingress[0].ip}'" - ip_addr, _ = Recipe._run_command(get_ip_command) - ip_addr = ip_addr.decode('utf-8').strip("'") - - return ip_addr +import utils +from recipe_runner import ImplBasedRecipeRunner +from recipe_runner import ConfigBasedRecipeRunner +cli = click.Group() -def get_external_ip(): - return Recipe._get_external_ip() +def get_config_based_recipes(): + files = glob.glob(os.path.join(os.path.dirname( + os.path.abspath(__file__)), "recipes/configs_based/*.yaml")) + recipe_names = [os.path.basename(x).split(".")[0] for x in files] + return recipe_names -def get_project_id(): - return Recipe._get_project_id() +def get_impl_based_recipes(): + files = glob.glob(os.path.join(os.path.dirname( + os.path.abspath(__file__)), "recipes/impl_based/*recipe*.py")) + recipe_names = [os.path.basename(x).split(".")[0] for x in files] + return recipe_names -cli = click.Group() -RECIPES = get_recipes() +CONFIG_RECIPES = get_config_based_recipes() +IMPL_RECIPES = get_impl_based_recipes() @cli.command() @click.argument('action', type=click.Choice( ['break', 'restore', 'verify', 'hint'])) -@click.argument('recipe_name', type=click.Choice(RECIPES.keys())) -def sre_recipes(action, recipe_name): +@click.argument('recipe_name', type=click.Choice( + sorted(CONFIG_RECIPES + IMPL_RECIPES))) +@click.option('--skip-loadgen', is_flag=True, help="Ignore loadgen actions in config based recipes.") +def sre_recipes(action, recipe_name, skip_loadgen): """Performs an action on a recipe.""" logging.basicConfig(filename='srerecipes.log', level=logging.INFO, format='%(asctime)s %(message)s') - recipe = RECIPES[recipe_name] - if action == 'break': - logging.info(f"Breaking {recipe_name}") - recipe.break_service() - elif action == 'restore': - logging.info(f"Restoring {recipe_name}") - recipe.restore_service() - elif action == 'verify': - logging.info(f"Verifying {recipe_name}") - recipe.verify() - elif action == 'hint': - logging.info(f"Giving hint for {recipe_name}") - recipe.hint() + + try: + has_config = recipe_name in CONFIG_RECIPES + has_impl = recipe_name in IMPL_RECIPES + + recipe = None + if has_config and has_impl: + print(f"Find conflicting config & impl for {recipe_name}") + return + elif has_config: + recipe = ConfigBasedRecipeRunner(recipe_name, skip_loadgen=skip_loadgen) + elif has_impl: + recipe = ImplBasedRecipeRunner(recipe_name) + else: + # should not reach here due to 'click.Choice' above + print(f"Cannot find config or impl for {recipe_name}") + return + + if action == 'break': + logging.info(f"Breaking {recipe_name}") + recipe.run_break() + elif action == 'restore': + logging.info(f"Restoring {recipe_name}") + recipe.run_restore() + elif action == 'verify': + logging.info(f"Verifying {recipe_name}") + recipe.run_verify() + elif action == 'hint': + logging.info(f"Giving hint for {recipe_name}") + recipe.run_hint() + except Exception as e: + logging.error(e) + print(f"Failed to run SRE Recipe {recipe_name}: {e}") + exit(1) @cli.command() @click.argument('traffic_pattern', type=click.Choice(['basic', 'step'])) def loadgen(traffic_pattern): """Change traffic patterns for the loadgenerator service""" + #We will always switch back to cloud-ops-sandbox cluster after successful + #completion of this command, assuming it is the most common cluster to be in. set_env_command = "kubectl set env deployment/loadgenerator "\ - f"LOCUST_TASK={traffic_pattern}_locustfile.py" + f"LOCUST_TASK={traffic_pattern}" delete_pods_command = "kubectl delete pods -l app=loadgenerator" + if not utils.auth_cluster('loadgenerator'): + print("Failed to authenticate into load generator cluster") + return print('Redeploying Loadgenerator...') - Recipe._run_command(set_env_command) - Recipe._run_command(delete_pods_command) + _, err = utils.run_shell_command(set_env_command) + if err: + print("Failed to set traffic pattern for load generator: ", err) + _, err = utils.run_shell_command(delete_pods_command) + if err: + print("Failed to redeploy updated load generator: ", err) print(f'Loadgenerator deployed using {traffic_pattern} pattern') - ip_addr = get_loadgen_ip() - if ip_addr: + ip_addr, err = utils.get_loadgen_ip() + if err: + print("Failed to get load generator IP: ", err) + elif not ip_addr: + print("Found empty load generator IP") + else: print(f"Loadgenerator web UI: http://{ip_addr}") - Recipe._auth_cluster('APP') + + # Try switching back to cloud-ops-sandbox cluster. + # Do not error even if we fail + utils.auth_cluster('cloud-ops-sandbox') @cli.command() @@ -181,16 +175,22 @@ def create(project, *args, **kwargs): def describe(): """Show information about an existing sandbox""" gcp_path = "https://console.cloud.google.com" - project_id = get_project_id() - loadgen_ip = "http://" + get_loadgen_ip() - external_ip = "http://" + get_external_ip() + project_id, err = utils.get_project_id() + if err: + print("Failed to get project ID:". err) + external_ip, err = utils.get_external_ip() + if err: + print("Failed to get external ID:". err) + loadgen_ip, err = utils.get_loadgen_ip() + if err: + print("Failed to get loadgen ID:". err) gcp_kubernetes_path = gcp_path + '/kubernetes/workload?project=' + project_id gcp_monitoring_path = gcp_path + '/monitoring?project=' + project_id print(f"""Cloud Operations Sandbox info for project: {project_id} - "- Load generator web interface: {loadgen_ip} - "- Hipstershop web app address: {external_ip} - "- Google Cloud Console KBE Dashboard: {gcp_kubernetes_path} - "- Google Cloud Console Monitoring Workspace {gcp_monitoring_path}""") + - Load generator web interface: http://{loadgen_ip} + - Hipstershop web app address: http://{external_ip} + - Google Cloud Console KBE Dashboard: {gcp_kubernetes_path} + - Google Cloud Console Monitoring Workspace {gcp_monitoring_path}""") @cli.command() @@ -198,7 +198,7 @@ def destroy(): """Delete an existing sandbox""" os.chdir(os.path.abspath(sys.path[0])) destroy_command = "../terraform/destroy.sh" - Recipe._run_command_interactive(destroy_command) + utils.run_interactive_shell_command(destroy_command) if __name__ == "__main__": diff --git a/sre-recipes/utils.py b/sre-recipes/utils.py new file mode 100644 index 000000000..f92d69454 --- /dev/null +++ b/sre-recipes/utils.py @@ -0,0 +1,201 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- + +import subprocess +import logging + + +def run_shell_command(command, decode_output=True): + """ + Runs the given command and returns any output and error + If `decode_output` is True, try to decode output and error message with + UTF-8 encoding, as well as removing any single quote. + """ + process = subprocess.run( + command, shell=True, capture_output=True + ) + output, error = process.stdout, process.stderr + if decode_output: + if output is not None: + output = output.decode("utf-8").replace("'", '').strip() + if error is not None: + error = error.decode("utf-8").replace("'", '').strip() + return output, error + + +def run_interactive_shell_command(command): + """ + Runs the given interactive command that waits for user input and + returns any output and error + """ + subprocess.run(command.split()) + + +def get_project_id(): + """Get the Google Cloud Project ID""" + project_id, err = run_shell_command( + "gcloud config list --format 'value(core.project)'") + if not project_id: + logging.warn(f"Could not retrieve project id.") + return project_id, err + + +def get_external_ip(): + """Get the IP Address for the external LoadBalancer""" + if not auth_cluster('cloud-ops-sandbox'): + return None, "Failed to authenticate into cloud-ops-sandbox cluster" + ip_addr, err = run_shell_command( + "kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}'") + if not ip_addr: + logging.warn(f"No external IP found.") + return ip_addr, err + + +def get_loadgen_ip(): + """Get the IP Address for the load generator""" + if not auth_cluster('loadgenerator'): + return None, "Failed to authenticate into loadgenerator cluster" + ip_addr, err = run_shell_command( + "kubectl get service loadgenerator -o jsonpath='{.status.loadBalancer.ingress[0].ip}'") + if not ip_addr: + logging.warn(f"No loadgeen IP found.") + # Try switching back to cloud-ops-sandbox cluster. + # Do not error even if we fail + auth_cluster('cloud-ops-sandbox') + return ip_addr, err + + +def get_cluster_zone(project_id, cluster_name): + """Get the zone for a cluster in a given project""" + zone, err = run_shell_command( + f"gcloud container clusters list --filter name:{cluster_name} --project {project_id} --format 'value(zone)'") + if not zone: + logging.warn( + f"No zone found for {cluster_name} in project {project_id}" + ) + return zone, err + + +def auth_cluster(cluster_name="cloud-ops-sandbox"): + """ + Authenticates cluster with kubectl commands. + + @param cluster_name: the Kubernetes cluster name + Options: + - cloud-ops-sandbox + - loadgenerator + + Return true if authentication was successful, or false otherwise. + """ + logging.info("Trying to authenticate cluster...") + # Locate project ID + project_id, err = get_project_id() + if err or not project_id: + logging.error( + f"Can't authenticate cluster. Failed too get project ID: {err}") + return False + # Get cluster zone + zone, err = get_cluster_zone(project_id, cluster_name) + if err or not zone: + logging.error(f"Can't authenticate cluster. Failed to get zone: {err}") + return False + # Run authentication command + run_shell_command( + f"gcloud container clusters get-credentials {cluster_name} --project {project_id} --zone {zone}") + logging.info("Cluster has been authenticated") + return True + + +def run_interactive_multiple_choice(prompt, choices): + """Runs an interactive multiple choice Quiz. + + Example Layout: + =============================================================== + MULTIPLE CHOICE QUIZ + =============================================================== + Question: Which service has an issue? + Choices + 0: Ad + 1: Cart + 2: Checkout + 3: Currency + 4: Email + 5: Frontend + 6: Payment + 7: Product Catalog + 8: Rating + 9: Recommendation + 10: Shipping + Enter your answer: + + The user can respond with their answer by typing the number shown before + the answer choice (e.g. 1 for Cart). + + Parameters + --------- + prompt: string + The question prompt to display. + choices: dict[] + A list of potential answers to choose from. + Each entry is a dictionary of the following fields: + - option: Required. The answer display text to show user + - accept: Optional. When true, this entry will be accepted as correct. + + If multiple entries have `accept` field set to True, it means there are + multiple correct answers. If no entries have `accept` set to True, the + function will throw ValueError. + """ + if not choices: + logging.info("Skipped. Empty multiple choice.") + return + + if not all(["option" in x for x in choices]): + logging.error( + "The 'option' field is required for all answer choice entries.") + exit(1) + + if not any([x.get("accept", False) for x in choices]): + logging.error( + "No accepted answer found in in the pool of potential answers.") + exit(1) + + # Show the question + print("===============================================================") + print(" MULTIPLE CHOICE QUIZ ") + print("===============================================================") + print(f"Question: {prompt}") + print("Choices") + correct_answers = set() + for i, choice in enumerate(choices): + display_text = choice["option"].strip() + print(f" {i}: {display_text}") + if choice.get("accept", False): + correct_answers.add(i) + + # Asks for answer + while True: + user_answer = input("Enter your answer: ").strip() + try: + user_answer = int(user_answer) + if user_answer < 0 or user_answer >= len(choices): + print("Not a valid choice") + elif user_answer in correct_answers: + print("Congratulations! You are correct.") + return + else: + print("Incorrect. Please try again.") + except ValueError: + print("Please enter the number of your selected answer.") diff --git a/terraform/00_state.tf b/terraform/00_state.tf index fe5c41f9c..b957cc110 100644 --- a/terraform/00_state.tf +++ b/terraform/00_state.tf @@ -20,12 +20,12 @@ # in the data section. terraform { - backend "gcs" {} + backend "gcs" {} } data "terraform_remote_state" "state" { - backend = "gcs" - config = { - bucket = var.bucket_name - } + backend = "gcs" + config = { + bucket = var.bucket_name + } } diff --git a/terraform/01_provider.tf b/terraform/01_provider.tf index af0bcb3f3..0c84e2d80 100644 --- a/terraform/01_provider.tf +++ b/terraform/01_provider.tf @@ -21,18 +21,19 @@ # # TODO: we can consider configuring it via env vars # that were populated appropriately at runtime. +terraform { + # The module has 0.12 syntax and is not compatible with any versions below 0.12. + required_version = ">= 0.12" -provider "google" { - # pin provider to 2.x - version = "~> 3.0" + required_providers { + google = { + source = "hashicorp/google" + version = ">=3.23.0" + } + random = { + source = "hashicorp/random" + version = "~> 2.0" + } - # credentials = "/path/to/creds.json" - # project = "project-id" - # region = "default-region" - # zone = "default-zone" -} - -# we also use the random provider so let's pin that too -provider "random" { - version = "~> 2.0" -} + } +} \ No newline at end of file diff --git a/terraform/03_gke_cluster.tf b/terraform/03_gke_cluster.tf index 4bd2fe89c..1f0230c60 100644 --- a/terraform/03_gke_cluster.tf +++ b/terraform/03_gke_cluster.tf @@ -45,18 +45,22 @@ resource "google_container_cluster" "gke" { project = data.google_project.project.project_id # Here's how you specify the name - name = "cloud-ops-sandbox" + name = var.gke_cluster_name - # Set the zone by grabbing the result of the random_shuffle above. It - # returns a list so we have to pull the first element off. If you're looking + # If GKE_cluster was specify during insalltion use it otherwise set the zone by grabbing the result of the random_shuffle above. + # It returns a list so we have to pull the first element off. If you're looking # at this and thinking "huh terraform syntax looks a clunky" you are NOT WRONG - location = element(random_shuffle.zone.result, 0) + location = var.gke_location != "" ? var.gke_location : element(random_shuffle.zone.result, 0) # Enable Workload Identity for cluster workload_identity_config { identity_namespace = "${data.google_project.project.project_id}.svc.id.goog" } + resource_labels = { + "version" = var.app_version + } + # Using an embedded resource to define the node pool. Another # option would be to create the node pool as a separate resource and link it # to this cluster. There are tradeoffs to each approach. @@ -94,7 +98,7 @@ resource "google_container_cluster" "gke" { initial_node_count = 4 autoscaling { - min_node_count = 3 + min_node_count = 2 max_node_count = 10 } @@ -111,7 +115,7 @@ resource "google_container_cluster" "gke" { # Stores the zone of created gke cluster provisioner "local-exec" { - command = "gcloud config set compute/zone ${element(random_shuffle.zone.result, 0)}" + command = "gcloud config set compute/zone ${google_container_cluster.gke.location}" } # add a hint that the service resource must be created (i.e., the service must @@ -141,7 +145,7 @@ data "google_compute_default_service_account" "default" { # Create GSA/KSA binding: let IAM auth KSAs as a svc.id.goog member name resource "google_service_account_iam_binding" "set_gsa_binding" { service_account_id = data.google_compute_default_service_account.default.name // google_service_account.set_gsa.name - role = "roles/iam.workloadIdentityUser" + role = "roles/iam.workloadIdentityUser" members = [ "serviceAccount:${data.google_project.project.project_id}.svc.id.goog[default/default]" @@ -158,7 +162,7 @@ resource "null_resource" "annotate_ksa" { provisioner "local-exec" { command = <' @@ -61,11 +61,12 @@ Guided Tour Terraform configs are split into separate files for each function. Detailed comments are available in each file, but here's the short version: -* `00_state.tf` -- configure state storage -* `01_provider.tf` -- configure the terraform provider -* `02_project.tf` -- create a GCP project, set up billing, and enable services -* `03_gke_cluster.tf` -- provision a GKE cluster per to the Hipster Shop README -* `03_ratingservice.tf` -- provision and populates Postgres DB over CloudSQL and deploy ranking service to AppEngine. Creates scheduled task to aggregate new placed ratings. +* `00_state.tf` -- configure state storage +* `01_provider.tf` -- configure the terraform provider +* `02_project.tf` -- create a GCP project, set up billing, and enable services +* `03_gke_cluster.tf` -- provision a GKE cluster per to the Hipster Shop README +* `04_ratingservice.tf` -- provision and populates Postgres DB over CloudSQL and deploy ranking service to AppEngine. Creates scheduled task to aggregate new placed ratings. +* `05_loadgen.tf` -- provision a loadgen cluster per to the Hipster Shop README The assumption is that a system under user control would run terraform and create resources on the user's behalf. The user would not be aware of the underlying tool. @@ -73,8 +74,5 @@ The user would not be aware of the underlying tool. Monitoring Examples -------------------------------------------------------------------------------- -To provision monitoring examples for the Stackdriver Sandbox, navigate -to the `monitoring` folder and run the command `terraform apply`. Please note that in order to run this command -you must have first created a [Monitoring Workspace] for the Google Cloud Project. - -[Monitoring Workspace]: https://cloud.google.com/monitoring/workspaces/create \ No newline at end of file +To provision monitoring examples for the Cloud Operations Sandbox, navigate +to the `monitoring` folder and run the command `terraform apply`. \ No newline at end of file diff --git a/terraform/install.sh b/terraform/install.sh index b2c4cd973..b484c65ec 100755 --- a/terraform/install.sh +++ b/terraform/install.sh @@ -188,6 +188,7 @@ createProject() { } applyTerraform() { + rm -f .terraform/terraform.tfstate log "Initialize terraform backend with bucket ${bucket_name}" @@ -201,12 +202,33 @@ applyTerraform() { terraform init -backend-config "bucket=${bucket_name}" -lockfile=false # lock-free to prevent access fail fi - log "Apply Terraform automation" + #build Terraform apply command + terraform_command="terraform apply -auto-approve -var=\"project_id=${project_id}\" -var=\"bucket_name=${bucket_name}\" -var=\"skip_loadgen=${skip_loadgen:-false}\"" + + #If billing account provided specify it if [[ -n "$billing_id" ]]; then - terraform apply -auto-approve -var="billing_account=${billing_acct}" -var="project_id=${project_id}" -var="bucket_name=${bucket_name}" -var="skip_loadgen=${skip_loadgen:-false}" - else - terraform apply -auto-approve -var="project_id=${project_id}" -var="bucket_name=${bucket_name}" -var="skip_loadgen=${skip_loadgen:-false}" + terraform_command+=" -var=\"billing_account=${billing_acct}\"" fi + #Check application version + #If cluster already exist leave original version + gke_location="$(gcloud container clusters list --format="value(location)" --filter name=cloud-ops-sandbox)" + if [[ -n "$gke_location" ]]; then + #use existing gke_location instead of using random one + terraform_command+=" -var=\"gke_location=${gke_location}\"" + gke_version="$(gcloud container clusters describe cloud-ops-sandbox --zone "${gke_location}" --format="value(resourceLabels.version)")" + #If cluster exist and it's older version use backward comp params + if [[ -n "$gke_version" ]]; then + app_ver=$gke_version + fi + elif [[ -n "$VERSION" ]]; then + app_ver="$(echo $VERSION | tr "." "_")" + else + app_ver="0" + fi + terraform_command+=" -var=\"app_version=${app_ver}\"" + + log "Apply Terraform automation" + eval $terraform_command } authenticateCluster() { diff --git a/terraform/loadgen/00_loadgen.tf b/terraform/loadgen/00_loadgen.tf index 325d43e0d..5c0323716 100644 --- a/terraform/loadgen/00_loadgen.tf +++ b/terraform/loadgen/00_loadgen.tf @@ -71,12 +71,12 @@ resource "google_container_cluster" "gke_loadgen" { machine_type = "n1-standard-2" oauth_scopes = [ - "https://www.googleapis.com/auth/cloud-platform" + "https://www.googleapis.com/auth/cloud-platform" ] labels = { environment = "dev", - cluster = "loadgenerator-main" + cluster = "loadgenerator-main" } } @@ -114,7 +114,7 @@ resource "null_resource" "set_gke_context" { } depends_on = [ - google_container_cluster.gke_loadgen, + google_container_cluster.gke_loadgen, null_resource.current_project ] } diff --git a/terraform/monitoring/00_provider.tf b/terraform/monitoring/00_provider.tf index e13538c36..a97d18e8f 100644 --- a/terraform/monitoring/00_provider.tf +++ b/terraform/monitoring/00_provider.tf @@ -22,12 +22,15 @@ # TODO: we can consider configuring it via env vars # that were populated appropriately at runtime. -provider "google" { - # pin provider to 3.23.0 - version = ">=3.23.0" +terraform { + required_providers { + google = { + source = "hashicorp/google" + version = ">=3.23.0" + } + } +} - # credentials = "/path/to/creds.json" +provider "google" { project = var.project_id - # region = "default-region" - # zone = "default-zone" -} +} \ No newline at end of file diff --git a/terraform/monitoring/01_uptime_checks.tf b/terraform/monitoring/01_uptime_checks.tf index 0e18c7cb7..aed13b94b 100644 --- a/terraform/monitoring/01_uptime_checks.tf +++ b/terraform/monitoring/01_uptime_checks.tf @@ -18,7 +18,7 @@ resource "google_monitoring_uptime_check_config" "http" { display_name = "HTTP Uptime Check" timeout = "10s" - period = "60s" + period = "60s" http_check { path = "/" @@ -50,10 +50,10 @@ resource "google_monitoring_alert_policy" "alert_policy" { comparison = "COMPARISON_GT" aggregations { # the alignment sets the window over which the metric is viewed - alignment_period = "1200s" - per_series_aligner = "ALIGN_NEXT_OLDER" + alignment_period = "1200s" + per_series_aligner = "ALIGN_NEXT_OLDER" cross_series_reducer = "REDUCE_COUNT_FALSE" - group_by_fields = ["resource.label.*"] + group_by_fields = ["resource.label.*"] } threshold_value = "2" trigger { diff --git a/terraform/monitoring/03_services.tf b/terraform/monitoring/03_services.tf index 9feefc8aa..0b016b4a8 100644 --- a/terraform/monitoring/03_services.tf +++ b/terraform/monitoring/03_services.tf @@ -17,59 +17,59 @@ # and maximum error budget burn rates. variable "custom_services" { type = list(object({ - service_name = string, - service_id = string, - availability_goal = number, + service_name = string, + service_id = string, + availability_goal = number, availability_burn_rate = number, - latency_goal = number, - latency_threshold = number, - latency_burn_rate = number + latency_goal = number, + latency_threshold = number, + latency_burn_rate = number })) default = [ { - service_name = "Frontend Service" - service_id = "frontend" - availability_goal = 0.9 # configurable goal for the availability SLO (0.9 = 90% of requests are successsful) - availability_burn_rate = 2 # limit on error budget burn rate (2 indicates we alert if error budget is consumed 2x faster than it should) - latency_goal = 0.9 # configurable goal for the latency SLO (0.9 = 90% of requests finish in under the latency threshold) - latency_threshold = 500 # indicates 500ms as the maximum latency of a 'good' request - latency_burn_rate = 2 + service_name = "Frontend Service" + service_id = "frontend" + availability_goal = 0.9 # configurable goal for the availability SLO (0.9 = 90% of requests are successsful) + availability_burn_rate = 2 # limit on error budget burn rate (2 indicates we alert if error budget is consumed 2x faster than it should) + latency_goal = 0.9 # configurable goal for the latency SLO (0.9 = 90% of requests finish in under the latency threshold) + latency_threshold = 500 # indicates 500ms as the maximum latency of a 'good' request + latency_burn_rate = 2 }, { - service_name = "Checkout Service" - service_id = "checkoutservice" - availability_goal = 0.99 + service_name = "Checkout Service" + service_id = "checkoutservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 }, { - service_name = "Payment Service" - service_id = "paymentservice" - availability_goal = 0.99 + service_name = "Payment Service" + service_id = "paymentservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 }, { - service_name = "Email Service" - service_id = "emailservice" - availability_goal = 0.99 + service_name = "Email Service" + service_id = "emailservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 }, { - service_name = "Shipping Service" - service_id = "shippingservice" - availability_goal = 0.99 + service_name = "Shipping Service" + service_id = "shippingservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 } ] } @@ -82,8 +82,8 @@ variable "custom_services" { # services for us. This example uses a custom service to demonstrate Terraform support for # creating custom services with attached SLOs and alerting policies. resource "google_monitoring_custom_service" "custom_service" { - count = length(var.custom_services) - service_id = "${var.custom_services[count.index].service_id}-srv" + count = length(var.custom_services) + service_id = "${var.custom_services[count.index].service_id}-srv" display_name = var.custom_services[count.index].service_name } @@ -93,59 +93,59 @@ resource "google_monitoring_custom_service" "custom_service" { # and burn rate limits for alerting policies variable "istio_services" { type = list(object({ - service_name = string, - service_id = string, - availability_goal = number, + service_name = string, + service_id = string, + availability_goal = number, availability_burn_rate = number, - latency_goal = number, - latency_threshold = number, - latency_burn_rate = number + latency_goal = number, + latency_threshold = number, + latency_burn_rate = number })) default = [ { - service_name = "Cart Service" - service_id = "cartservice" - availability_goal = 0.99 + service_name = "Cart Service" + service_id = "cartservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 }, { - service_name = "Product Catalog Service" - service_id = "productcatalogservice" - availability_goal = 0.99 + service_name = "Product Catalog Service" + service_id = "productcatalogservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 }, { - service_name = "Currency Service" - service_id = "currencyservice" - availability_goal = 0.99 + service_name = "Currency Service" + service_id = "currencyservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 }, { - service_name = "Recommendation Service" - service_id = "recommendationservice" - availability_goal = 0.99 + service_name = "Recommendation Service" + service_id = "recommendationservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 }, { - service_name = "Ad Service" - service_id = "adservice" - availability_goal = 0.99 + service_name = "Ad Service" + service_id = "adservice" + availability_goal = 0.99 availability_burn_rate = 2 - latency_goal = 0.99 - latency_threshold = 500 - latency_burn_rate = 2 + latency_goal = 0.99 + latency_threshold = 500 + latency_burn_rate = 2 } ] } diff --git a/terraform/monitoring/04_slos.tf b/terraform/monitoring/04_slos.tf index 53869a4ff..8beb731b3 100644 --- a/terraform/monitoring/04_slos.tf +++ b/terraform/monitoring/04_slos.tf @@ -21,8 +21,8 @@ resource "google_monitoring_slo" "custom_service_availability_slo" { count = length(var.custom_services) service = google_monitoring_custom_service.custom_service[count.index].service_id - slo_id = "availability-slo" - display_name = "Availability SLO with request base SLI (good total ratio)" + slo_id = "${google_monitoring_custom_service.custom_service[count.index].service_id}-availability-slo" + display_name = "Availability SLO with request base SLI (good total ratio) for ${google_monitoring_custom_service.custom_service[count.index].service_id}" # The goal sets our objective for successful requests over the 30 day rolling window period goal = var.custom_services[count.index].availability_goal @@ -64,8 +64,8 @@ resource "google_monitoring_slo" "custom_service_availability_slo" { resource "google_monitoring_slo" "custom_service_latency_slo" { count = length(var.custom_services) service = google_monitoring_custom_service.custom_service[count.index].service_id - slo_id = "latency-slo" - display_name = "Latency SLO with request base SLI (distribution cut)" + slo_id = "${google_monitoring_custom_service.custom_service[count.index].service_id}-latency-slo" + display_name = "Latency SLO with request base SLI (distribution cut) for ${google_monitoring_custom_service.custom_service[count.index].service_id}" goal = var.custom_services[count.index].latency_goal rolling_period_days = 30 @@ -102,8 +102,8 @@ resource "google_monitoring_slo" "istio_service_availability_slo" { # Uses the Istio service that is automatically detected and created by installing Istio # Identify the service using the string: ist:${project_id}-zone-${zone}-cloud-ops-sandbox-default-${service_id} service = "ist:${var.project_id}-zone-${var.zone}-cloud-ops-sandbox-default-${var.istio_services[count.index].service_id}" - slo_id = "availability-slo" - display_name = "Availability SLO with request base SLI (good total ratio)" + slo_id = "${var.istio_services[count.index].service_id}-availability-slo" + display_name = "Availability SLO with request base SLI (good total ratio) for ${var.istio_services[count.index].service_id}" # The goal sets our objective for successful requests over the 30 day rolling window period goal = var.istio_services[count.index].availability_goal @@ -141,11 +141,10 @@ resource "google_monitoring_slo" "istio_service_availability_slo" { # Example SLO is defined as: # 99% of requests return in under 500 ms in the previous 30 days resource "google_monitoring_slo" "istio_service_latency_slo" { - count = length(var.istio_services) - service = "ist:${var.project_id}-zone-${var.zone}-cloud-ops-sandbox-default-${var.istio_services[count.index].service_id}" - slo_id = "latency-slo" - display_name = "Latency SLO with request base SLI (distribution cut)" - + count = length(var.istio_services) + service = "ist:${var.project_id}-zone-${var.zone}-cloud-ops-sandbox-default-${var.istio_services[count.index].service_id}" + slo_id = "${var.istio_services[count.index].service_id}-latency-slo" + display_name = "Latency SLO with request base SLI (distribution cut) for ${var.istio_services[count.index].service_id}" goal = var.istio_services[count.index].latency_goal rolling_period_days = 30 @@ -178,8 +177,8 @@ resource "google_monitoring_slo" "rating_service_availability_slo" { # Uses ratingservice service that is automatically detected and created when the service is deployed to App Engine # Identify of the service is built after the following template: gae:${project_id}_servicename service = "gae:${var.project_id}_ratingservice" - slo_id = "availability-slo" - display_name = "Availability SLO with request base SLI (good total ratio)" + slo_id = "ratingservice-availability-slo" + display_name = "Rating Service Availability SLO with request base SLI (good total ratio)" # The goal sets our objective for successful requests over the 30 day rolling window period goal = 0.99 @@ -225,8 +224,8 @@ resource "google_monitoring_slo" "rating_service_latency_slo" { # Uses ratingservice service that is automatically detected and created when the service is deployed to App Engine # Identify of the service is built after the following template: gae:${project_id}_servicename service = "gae:${var.project_id}_ratingservice" - slo_id = "latency-slo" - display_name = "Latency SLO with request base SLI (distribution cut)" + slo_id = "ratingservice-latency-slo" + display_name = "Rating Service Latency SLO with request base SLI (distribution cut)" goal = 0.99 rolling_period_days = 30 @@ -259,7 +258,7 @@ resource "google_monitoring_slo" "rating_service_freshness_slo" { # Uses ratingservice service that is automatically detected and created when the service is deployed to App Engine # Identify of the service is built after the following template: gae:${project_id}_servicename service = "gae:${var.project_id}_ratingservice" - slo_id = "freshness-slo" + slo_id = "ratingservice-freshness-slo" display_name = "Rating freshness SLO with window based SLI" goal = 0.99 diff --git a/terraform/monitoring/05_alerting_policies.tf b/terraform/monitoring/05_alerting_policies.tf index 1f3acc3d1..2a1616926 100644 --- a/terraform/monitoring/05_alerting_policies.tf +++ b/terraform/monitoring/05_alerting_policies.tf @@ -16,7 +16,7 @@ # The definition of the SLO can be found in the file '03_service_slo.tf'. # We alert on budget burn rate, alerting if burn rate exceeds the threshold defined for the service resource "google_monitoring_alert_policy" "custom_service_availability_slo_alert" { - count = length(var.custom_services) + count = length(var.custom_services) display_name = "${var.custom_services[count.index].service_name} Availability Alert Policy" combiner = "AND" conditions { @@ -24,18 +24,18 @@ resource "google_monitoring_alert_policy" "custom_service_availability_slo_alert condition_threshold { # This filter alerts on burn rate over the past 60 minutes - filter = "select_slo_burn_rate(\"projects/${var.project_id}/services/${google_monitoring_custom_service.custom_service[count.index].service_id}/serviceLevelObjectives/${google_monitoring_slo.custom_service_availability_slo[count.index].slo_id}\", 60m)" - + filter = "select_slo_burn_rate(\"projects/${var.project_id}/services/${google_monitoring_custom_service.custom_service[count.index].service_id}/serviceLevelObjectives/${google_monitoring_slo.custom_service_availability_slo[count.index].slo_id}\", 60m)" + # The threshhold is determined by how quickly we burn through our error budget. # Example: if threshold_value = 2 then error budget is consumed in 15 days. # Details: https://landing.google.com/sre/workbook/chapters/alerting-on-slos/#4-alert-on-burn-rate threshold_value = var.custom_services[count.index].availability_burn_rate - comparison = "COMPARISON_GT" - duration = "60s" + comparison = "COMPARISON_GT" + duration = "60s" } } documentation { - content = "Availability SLO burn for the ${var.custom_services[count.index].service_name} for the past 60m exceeded ${var.custom_services[count.index].availability_burn_rate}x the acceptable budget burn rate. The service is returning less OK responses than desired. Consider viewing the service logs or custom dashboard to retrieve more information or adjust the values for the SLO and error budget." + content = "Availability SLO burn for the ${var.custom_services[count.index].service_name} for the past 60m exceeded ${var.custom_services[count.index].availability_burn_rate}x the acceptable budget burn rate. The service is returning less OK responses than desired. Consider viewing the service logs or custom dashboard to retrieve more information or adjust the values for the SLO and error budget." mime_type = "text/markdown" } } @@ -43,20 +43,20 @@ resource "google_monitoring_alert_policy" "custom_service_availability_slo_alert # Create another alerting policy, this time on the SLO for latency for the custom service. # Alert on budget burn rate as well. resource "google_monitoring_alert_policy" "custom_service_latency_slo_alert" { - count = length(var.custom_services) + count = length(var.custom_services) display_name = "${var.custom_services[count.index].service_name} Latency Alert Policy" combiner = "AND" conditions { display_name = "SLO burn rate alert for latency SLO with a threshold of ${var.custom_services[count.index].latency_burn_rate}" condition_threshold { - filter = "select_slo_burn_rate(\"projects/${var.project_id}/services/${google_monitoring_custom_service.custom_service[count.index].service_id}/serviceLevelObjectives/${google_monitoring_slo.custom_service_latency_slo[count.index].slo_id}\", 60m)" + filter = "select_slo_burn_rate(\"projects/${var.project_id}/services/${google_monitoring_custom_service.custom_service[count.index].service_id}/serviceLevelObjectives/${google_monitoring_slo.custom_service_latency_slo[count.index].slo_id}\", 60m)" threshold_value = var.custom_services[count.index].availability_burn_rate - comparison = "COMPARISON_GT" - duration = "60s" + comparison = "COMPARISON_GT" + duration = "60s" } } documentation { - content = "Latency SLO burn for the ${var.custom_services[count.index].service_name} for the past 60m exceeded ${var.custom_services[count.index].latency_burn_rate}x the acceptable budget burn rate. The service is responding slower than desired. Consider viewing the service logs or custom dashboard to retrieve more information or adjust the values for the SLO and error budget." + content = "Latency SLO burn for the ${var.custom_services[count.index].service_name} for the past 60m exceeded ${var.custom_services[count.index].latency_burn_rate}x the acceptable budget burn rate. The service is responding slower than desired. Consider viewing the service logs or custom dashboard to retrieve more information or adjust the values for the SLO and error budget." mime_type = "text/markdown" } } @@ -65,7 +65,7 @@ resource "google_monitoring_alert_policy" "custom_service_latency_slo_alert" { # The definition of the SLO can be found in the file '04_slos.tf'. # Alerts on error budget burn rate. resource "google_monitoring_alert_policy" "istio_service_availability_slo_alert" { - count = length(var.istio_services) + count = length(var.istio_services) display_name = "${var.istio_services[count.index].service_name} Availability Alert Policy" combiner = "AND" conditions { @@ -74,14 +74,14 @@ resource "google_monitoring_alert_policy" "istio_service_availability_slo_alert" # This filter alerts on burn rate over the past 60 minutes # The service is defined by the unique Istio string that is automatically created - filter = "select_slo_burn_rate(\"projects/${var.project_id}/services/ist:${var.project_id}-zone-${var.zone}-cloud-ops-sandbox-default-${var.istio_services[count.index].service_id}/serviceLevelObjectives/${google_monitoring_slo.istio_service_availability_slo[count.index].slo_id}\", 60m)" + filter = "select_slo_burn_rate(\"projects/${var.project_id}/services/ist:${var.project_id}-zone-${var.zone}-cloud-ops-sandbox-default-${var.istio_services[count.index].service_id}/serviceLevelObjectives/${google_monitoring_slo.istio_service_availability_slo[count.index].slo_id}\", 60m)" threshold_value = var.istio_services[count.index].availability_burn_rate - comparison = "COMPARISON_GT" - duration = "60s" + comparison = "COMPARISON_GT" + duration = "60s" } } documentation { - content = "Availability SLO burn for the ${var.istio_services[count.index].service_name} for the past 60m exceeded ${var.istio_services[count.index].availability_burn_rate}x the acceptable budget burn rate. The service is returning less OK responses than desired. Consider viewing the service logs or custom dashboard to retrieve more information or adjust the values for the SLO and error budget." + content = "Availability SLO burn for the ${var.istio_services[count.index].service_name} for the past 60m exceeded ${var.istio_services[count.index].availability_burn_rate}x the acceptable budget burn rate. The service is returning less OK responses than desired. Consider viewing the service logs or custom dashboard to retrieve more information or adjust the values for the SLO and error budget." mime_type = "text/markdown" } } @@ -89,20 +89,20 @@ resource "google_monitoring_alert_policy" "istio_service_availability_slo_alert" # Create another alerting policy, this time on the SLO for latency for the Istio service. # Alerts on error budget burn rate. resource "google_monitoring_alert_policy" "istio_service_latency_slo_alert" { - count = length(var.istio_services) + count = length(var.istio_services) display_name = "${var.istio_services[count.index].service_name} Latency Alert Policy" combiner = "AND" conditions { display_name = "SLO burn rate alert for latency SLO with a threshold of ${var.istio_services[count.index].latency_burn_rate}" condition_threshold { - filter = "select_slo_burn_rate(\"projects/${var.project_id}/services/ist:${var.project_id}-zone-${var.zone}-cloud-ops-sandbox-default-${var.istio_services[count.index].service_id}/serviceLevelObjectives/${google_monitoring_slo.istio_service_latency_slo[count.index].slo_id}\", 60m)" + filter = "select_slo_burn_rate(\"projects/${var.project_id}/services/ist:${var.project_id}-zone-${var.zone}-cloud-ops-sandbox-default-${var.istio_services[count.index].service_id}/serviceLevelObjectives/${google_monitoring_slo.istio_service_latency_slo[count.index].slo_id}\", 60m)" threshold_value = var.istio_services[count.index].availability_burn_rate - comparison = "COMPARISON_GT" - duration = "60s" + comparison = "COMPARISON_GT" + duration = "60s" } } documentation { - content = "Latency SLO burn for the ${var.istio_services[count.index].service_name} for the past 60m exceeded ${var.istio_services[count.index].latency_burn_rate}x the acceptable budget burn rate. The service is responding slower than desired. Consider viewing the service logs or custom dashboard to retrieve more information or adjust the values for the SLO and error budget." + content = "Latency SLO burn for the ${var.istio_services[count.index].service_name} for the past 60m exceeded ${var.istio_services[count.index].latency_burn_rate}x the acceptable budget burn rate. The service is responding slower than desired. Consider viewing the service logs or custom dashboard to retrieve more information or adjust the values for the SLO and error budget." mime_type = "text/markdown" } } diff --git a/terraform/monitoring/variables.tf b/terraform/monitoring/variables.tf index 7ee8982ec..95198f44f 100644 --- a/terraform/monitoring/variables.tf +++ b/terraform/monitoring/variables.tf @@ -28,8 +28,8 @@ variable "project_id" { } variable "project_owner_email" { - type = string - description = "The email to receive alerts caused by violations of alerting policies." + type = string + description = "The email to receive alerts caused by violations of alerting policies." } variable "zone" { diff --git a/terraform/ratingservice/main.tf b/terraform/ratingservice/main.tf index 8f80ba227..aac2f782b 100644 --- a/terraform/ratingservice/main.tf +++ b/terraform/ratingservice/main.tf @@ -14,31 +14,16 @@ * limitations under the License. */ - -terraform { - # The module has 0.12 syntax and is not compatible with any versions below 0.12. - required_version = ">= 0.12" -} - -provider "google" { - version = "~> 3.0" - - project = var.gcp_project_id - region = var.gcp_region_name -} - -provider "random" { - version = "~> 2.0" -} - resource "google_project_service" "gae" { service = "appengine.googleapis.com" disable_dependent_services = true + project = var.gcp_project_id } resource "google_project_service" "cloudscheduler" { service = "cloudscheduler.googleapis.com" disable_dependent_services = true + project = var.gcp_project_id } resource "random_string" "suffix_len_4" { @@ -57,7 +42,7 @@ resource "google_sql_database_instance" "rating_service" { name = "ratingservice-sql-instance-${random_string.suffix_len_4.result}" database_version = "POSTGRES_12" deletion_protection = false - + region = var.gcp_region_name settings { tier = "db-f1-micro" } @@ -97,6 +82,7 @@ resource "google_storage_bucket" "it" { # max name length is 63 char = 30 chars for project id + '-ratingservice-' + 4 char suffix name = "${var.gcp_project_id}-ratingservice-${random_string.suffix_len_4.result}" uniform_bucket_level_access = true + project = var.gcp_project_id } resource "google_storage_bucket_object" "requirements" { @@ -189,8 +175,8 @@ resource "google_app_engine_standard_app_version" "ratingservice" { min_instances = 1 } max_concurrent_requests = 9 - min_idle_instances = 1 - max_idle_instances = 1 + min_idle_instances = 1 + max_idle_instances = 1 } delete_service_on_destroy = true @@ -202,6 +188,7 @@ resource "google_cloud_scheduler_job" "recollect_job" { schedule = "* * * * *" # each minute description = "recollect recently posted new votes" time_zone = "Europe/London" + region = var.gcp_region_name attempt_deadline = "340s" retry_config { diff --git a/terraform/ratingservice/provider.tf b/terraform/ratingservice/provider.tf new file mode 100644 index 000000000..eb2dc6c2c --- /dev/null +++ b/terraform/ratingservice/provider.tf @@ -0,0 +1,34 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +terraform { + required_version = ">= 0.12" + required_providers { + google = { + source = "hashicorp/google" + version = ">=3.23.0" + } + random = { + source = "hashicorp/random" + version = "~> 2.0" + } + } +} + +provider "google" { + project = var.gcp_project_id + region = var.gcp_region_name +} diff --git a/terraform/telemetry.py b/terraform/telemetry.py index cfe5ed844..81a1c9fcb 100644 --- a/terraform/telemetry.py +++ b/terraform/telemetry.py @@ -52,7 +52,7 @@ def get_telemetry_msg(session, project_id, event, version): # returns False along with an error message if not def validate_args(session, project_id, event, version): args_exp = { - "version": r"^v\d.\d.\d$", + "version": r"^(v\d.\d.\d|develop)$", "project_id": r"^cloud-ops-sandbox-(\d){6,12}$", "v4uuid": r"^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$" } diff --git a/terraform/variables.tf b/terraform/variables.tf index 2299b7887..affe28f2a 100644 --- a/terraform/variables.tf +++ b/terraform/variables.tf @@ -32,6 +32,31 @@ variable "bucket_name" { description = "The name of your bucket to store the state file. Case-sensitive." } +#AppEngine +variable "appengine_region" { + default = "us-east1" + description = "App Engine defult GCP region." +} + +variable "app_version" { + default = 0 + type = string + description = "Cloud Operations Sandbox's Version. If wasn't set will be 0." +} + +#GKE Services Cluster +variable "gke_cluster_name" { + default = "cloud-ops-sandbox" + description = "GKE GKE Hipster shop cluster name." +} + +variable "gke_location" { + default = "" + type = string + description = "GKE Cloud Operations Sandbox's Cluster location." + +} +#Loadgen variable "skip_loadgen" { default = false description = "If true, the load generator will not be deployed." diff --git a/tests/monitoring_integration_test.py b/tests/monitoring_integration_test.py index 9f2bb0405..b49def828 100644 --- a/tests/monitoring_integration_test.py +++ b/tests/monitoring_integration_test.py @@ -283,53 +283,53 @@ def getIstioService(self, service_name): def testFrontendServiceSloExists(self): """ Test that for Frontend Service that two SLOs (availability, latency) get created. """ found_availability_slo = self.checkForSlo( - 'frontend-srv', 'availability-slo') + 'frontend-srv', 'frontend-srv-availability-slo') self.assertTrue(found_availability_slo) - found_latency_slo = self.checkForSlo('frontend-srv', 'latency-slo') + found_latency_slo = self.checkForSlo('frontend-srv', 'frontend-srv-latency-slo') self.assertTrue(found_latency_slo) def testCheckoutServiceSloExists(self): """ Test that for Checkout Service that two SLOs (availability, latency) get created. """ found_availability_slo = self.checkForSlo( - 'checkoutservice-srv', 'availability-slo') + 'checkoutservice-srv', 'checkoutservice-srv-availability-slo') self.assertTrue(found_availability_slo) found_latency_slo = self.checkForSlo( - 'checkoutservice-srv', 'latency-slo') + 'checkoutservice-srv', 'checkoutservice-srv-latency-slo') self.assertTrue(found_latency_slo) def testPaymentServiceSloExists(self): """ Test that for Payment Service that two SLOs (availability, latency) get created. """ found_availability_slo = self.checkForSlo( - 'paymentservice-srv', 'availability-slo') + 'paymentservice-srv', 'paymentservice-srv-availability-slo') self.assertTrue(found_availability_slo) found_latency_slo = self.checkForSlo( - 'paymentservice-srv', 'latency-slo') + 'paymentservice-srv', 'paymentservice-srv-latency-slo') self.assertTrue(found_latency_slo) def testEmailServiceSloExists(self): """ Test that for Email Service that two SLOs (availability, latency) get created. """ found_availability_slo = self.checkForSlo( - 'emailservice-srv', 'availability-slo') + 'emailservice-srv', 'emailservice-srv-availability-slo') self.assertTrue(found_availability_slo) - found_latency_slo = self.checkForSlo('emailservice-srv', 'latency-slo') + found_latency_slo = self.checkForSlo('emailservice-srv', 'emailservice-srv-latency-slo') self.assertTrue(found_latency_slo) def testShippingServiceSloExists(self): """ Test that for Shipping Service that two SLOs (availability, latency) get created. """ found_availability_slo = self.checkForSlo( - 'shippingservice-srv', 'availability-slo') + 'shippingservice-srv', 'shippingservice-srv-availability-slo') self.assertTrue(found_availability_slo) found_latency_slo = self.checkForSlo( - 'shippingservice-srv', 'latency-slo') + 'shippingservice-srv', 'shippingservice-srv-latency-slo') self.assertTrue(found_latency_slo) def testCartServiceSloExists(self): """ Test that for each service that two SLOs (availability, latency) get created. """ cartservice_id = self.getIstioService('cartservice') found_availability_slo = self.checkForSlo( - cartservice_id, 'availability-slo') + cartservice_id, 'cartservice-availability-slo') self.assertTrue(found_availability_slo) - found_latency_slo = self.checkForSlo(cartservice_id, 'latency-slo') + found_latency_slo = self.checkForSlo(cartservice_id, 'cartservice-latency-slo') self.assertTrue(found_latency_slo) def testProductCatalogServiceSloExists(self): @@ -337,19 +337,19 @@ def testProductCatalogServiceSloExists(self): productcatalogservice_id = self.getIstioService( 'productcatalogservice') found_availability_slo = self.checkForSlo( - productcatalogservice_id, 'availability-slo') + productcatalogservice_id, 'productcatalogservice-availability-slo') self.assertTrue(found_availability_slo) found_latency_slo = self.checkForSlo( - productcatalogservice_id, 'latency-slo') + productcatalogservice_id, 'productcatalogservice-latency-slo') self.assertTrue(found_latency_slo) def testCurrencyServiceSloExists(self): """ Test that for each service that two SLOs (availability, latency) get created. """ currencyservice_id = self.getIstioService('currencyservice') found_availability_slo = self.checkForSlo( - currencyservice_id, 'availability-slo') + currencyservice_id, 'currencyservice-availability-slo') self.assertTrue(found_availability_slo) - found_latency_slo = self.checkForSlo(currencyservice_id, 'latency-slo') + found_latency_slo = self.checkForSlo(currencyservice_id, 'currencyservice-latency-slo') self.assertTrue(found_latency_slo) def testRecommendationServiceSloExists(self): @@ -357,28 +357,28 @@ def testRecommendationServiceSloExists(self): recommendationservice_id = self.getIstioService( 'recommendationservice') found_availability_slo = self.checkForSlo( - recommendationservice_id, 'availability-slo') + recommendationservice_id, 'recommendationservice-availability-slo') self.assertTrue(found_availability_slo) found_latency_slo = self.checkForSlo( - recommendationservice_id, 'latency-slo') + recommendationservice_id, 'recommendationservice-latency-slo') self.assertTrue(found_latency_slo) def testAdServiceSloExists(self): """ Test that for each service that two SLOs (availability, latency) get created. """ adservice_id = self.getIstioService('adservice') found_availability_slo = self.checkForSlo( - adservice_id, 'availability-slo') + adservice_id, 'adservice-availability-slo') self.assertTrue(found_availability_slo) - found_latency_slo = self.checkForSlo(adservice_id, 'latency-slo') + found_latency_slo = self.checkForSlo(adservice_id, 'adservice-latency-slo') self.assertTrue(found_latency_slo) def testRatingServiceSloExists(self): """ Test the rating service for having two SLOs (availability, latency) get created. """ service_id = 'gae:' + project_id + '_ratingservice' found_availability_slo = self.checkForSlo( - service_id, 'availability-slo') + service_id, 'ratingservice-availability-slo') self.assertTrue(found_availability_slo) - found_latency_slo = self.checkForSlo(service_id, 'latency-slo') + found_latency_slo = self.checkForSlo(service_id, 'ratingservice-latency-slo') self.assertTrue(found_latency_slo) diff --git a/tests/recipes/test_recommendation_crash_recipe.sh b/tests/recipes/test_recommendation_crash_recipe.sh new file mode 100755 index 000000000..1b77acea8 --- /dev/null +++ b/tests/recipes/test_recommendation_crash_recipe.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# add sandboxctl to path +SCRIPT_DIR=$(dirname $(realpath -s $0)) +SRE_RECIPES_DIR=$(realpath $SCRIPT_DIR/../../sre-recipes) +export PATH=$PATH:$SRE_RECIPES_DIR + +set -e +echo "Testing Recommendation Crash SRE Recipe" + +HTTP_ADDR=$(sandboxctl describe | grep "Hipstershop web app address" | awk '{ print $NF }') +echo "Hipstershop endpoint: $HTTP_ADDR" + +echo "- testing request before changes..." +curl --show-error --fail $HTTP_ADDR/product/OLJCESPC7Z | grep Typewriter + +echo "- breaking sandbox..." +sandboxctl sre-recipes break recipe3 +broken_pod=$(kubectl get pods --sort-by=.status.startTime -o jsonpath="{.items[-1].metadata.name}") +kubectl wait --for=condition=ready --timeout=30s pod $broken_pod +sleep 10 + +echo "- expecting to see 500 error..." +curl -I --no-fail $HTTP_ADDR/product/OLJCESPC7Z | grep "500 Internal Server Error" + +echo "- checking for expected recomendationservice log..." +kubectl logs $broken_pod recommendationservice | grep "invalid literal for int() with base 10: '5.0'" + +echo "- restoring sandbox" +sandboxctl sre-recipes restore recipe3 +restored_pod=$(kubectl get pods --sort-by=.status.startTime -o jsonpath="{.items[-1].metadata.name}") +kubectl wait --for=condition=ready pod $restored_pod +sleep 10 + +echo "- testing restored website..." +curl --show-error --fail $HTTP_ADDR/product/OLJCESPC7Z | grep Typewriter + +echo "✓ Tests Passed" diff --git a/tests/recipes/validate_recipe_configs.py b/tests/recipes/validate_recipe_configs.py new file mode 100644 index 000000000..ab588abc6 --- /dev/null +++ b/tests/recipes/validate_recipe_configs.py @@ -0,0 +1,62 @@ +# Copyright 2021 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# -*- coding: utf-8 -*- + +import os +import json +import yaml +import glob +import jsonschema + +RECIPES_ROOT = os.path.join(os.path.dirname( + os.path.abspath(__file__)), "../../sre-recipes/recipes/configs_based") +SCHEMA_ROOT = RECIPES_ROOT + "/schema" + +print("Loading base schema...") +with open(SCHEMA_ROOT + "/schema.json", "r") as file: + schema = json.load(file) + +print("Bundling additional schema definitions...") +for def_path in glob.glob(SCHEMA_ROOT + "/defs/*.schema.json"): + def_name = os.path.basename(def_path).split(".")[0] + with open(def_path, "r") as def_file: + def_schema = json.load(def_file) + if "$defs" not in schema: + schema["$defs"] = {} + schema["$defs"][def_name] = def_schema + +print("Running validations on all SRE recipe configs...") +has_error = False +for recipe_path in glob.glob(RECIPES_ROOT + "/*.yaml"): + recipe_name = os.path.basename(recipe_path).split(".")[0] + print("Validating:", recipe_name) + with open(recipe_path, "r") as recipe_file: + try: + recipe_config = yaml.load( + recipe_file.read(), Loader=yaml.FullLoader) + except Exception as e: + print("Invalid or empty YAML:", e) + has_error = True + continue + try: + jsonschema.validate(recipe_config, schema) + print("Valid!") + except Exception as e: + print("Invalid!", e) + has_error = True + +if has_error: + print("ERROR. At least one SRE Recipe config is invalid.") + exit(1) diff --git a/tests/requirements.txt b/tests/requirements.txt index ec77e885c..64bc8c142 100644 --- a/tests/requirements.txt +++ b/tests/requirements.txt @@ -3,3 +3,5 @@ google-cloud-monitoring-dashboards>=1.0.0 tabulate>=0.8.7 google-api-python-client>=1.10.0 oauth2client>=4.1.3 +jsonschema>=3.2.0 +pyyaml>-5.4.1 \ No newline at end of file diff --git a/website/config.toml b/website/config.toml index faaeeb017..07bf00acc 100644 --- a/website/config.toml +++ b/website/config.toml @@ -96,7 +96,7 @@ archived_version = false # The version number for the version of the docs represented in this doc set. # Used in the "version-banner" partial to display a version number for the # current doc set. -version = "1.0" +version = "v0.7.1" # A link to latest version of the docs. Used in the "version-banner" partial to # point people to the main doc site. @@ -106,7 +106,10 @@ url_latest_version = "https://cloud-ops-sandbox.dev/" github_repo = "https://github.com/GoogleCloudPlatform/cloud-ops-sandbox" # Specify a value here if your content directory is not in your repo's root directory -github_subdir = "website/docsy" +github_subdir = "website" + +# Specify development branch +github_branch = "develop" # Google Custom Search Engine ID. Remove or comment out to disable search. #gcs_engine_id = "011737558837375720776:fsdu1nryfng" diff --git a/website/content/en/docs/User Guide/Set Up/_index.md b/website/content/en/docs/User Guide/Set Up/_index.md index cb2a9e1a2..46e18e34a 100644 --- a/website/content/en/docs/User Guide/Set Up/_index.md +++ b/website/content/en/docs/User Guide/Set Up/_index.md @@ -10,7 +10,7 @@ weight: 10 ## Deploy the Sandbox -In a new browser tab, navigate to the Cloud Operations Sandbox [website](https://stackdriver-sandbox.dev/) and follow the instructions there: +In a new browser tab, navigate to the Cloud Operations Sandbox [website](/) and follow the instructions there: Click the **Open in Google Cloud Shell** button. You might have to click Proceed on a second dialog if you haven't run Cloud Shell before. @@ -53,8 +53,4 @@ The URLs in this message tell you where to find the results of the installation: ### Recovering from session timeout Should your Cloud Shell session timeout due to user inactivity, you will need to launch the custom Cloud Shell image to access the `sandboxctl` command. -Click the - -![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.png) - -button from the [Cloud Operations Sandbox homepage](https://cloud-ops-sandbox.dev/) to restart the custom Cloud Shell +Click the [![Open in Cloud Shell](https://gstatic.com/cloudssh/images/open-btn.png)](/) button on the [Cloud Operations Sandbox homepage](/) to restart the custom Cloud Shell diff --git a/website/content/en/docs/User Guide/_index.md b/website/content/en/docs/User Guide/_index.md index 04cc1020c..9b6f16ca9 100644 --- a/website/content/en/docs/User Guide/_index.md +++ b/website/content/en/docs/User Guide/_index.md @@ -30,7 +30,7 @@ The Hipster Shop application consists of a number of microservices, written in a **Note:** We are not endorsing this architecture as the best way to build a real online store. This application is optimized for demonstration and learning purposes. It illustrates a large number of cloud-native technologies, uses a variety of programming languages, and provides an environment that can be explored productively with Cloud Operations tools. -The Git repository you cloned has all the source code, so you can explore the implementation details of the application. See the repository [README](https://github.com/GoogleCloudPlatform/cloud-ops-sandbox) for a guided tour. +The Git repository you cloned has all the source code, so you can explore the implementation details of the application. See the repository [README](https://github.com/GoogleCloudPlatform/cloud-ops-sandbox/blob/main/README.md) for a guided tour. # Prerequisites diff --git a/website/content/en/docs/getting_started.md b/website/content/en/docs/getting_started.md index 5b2778877..d5511a0e0 100644 --- a/website/content/en/docs/getting_started.md +++ b/website/content/en/docs/getting_started.md @@ -31,9 +31,9 @@ __Note__: If installation stops due to billing account errors, set up the billin ### Next Steps -* Explore your Sandbox deployment and its [architecture](#Service-Overview) -* Follow the User Guide to start using [Cloud Operations](https://cloud-ops-sandbox.dev/docs/user-guide/learn-cloud-learn-cloud-operations/) -* Learn more about Cloud Operations using [Code Labs](https://codelabs.developers.google.com/s/results?q=Monitoring) +* Explore your Sandbox deployment and its [architecture](/docs/service_overview/#service-architecture) +* Follow the User Guide to start using [Cloud Operations](/docs/user-guide/learn-cloud-operations/) +* Learn more about Cloud Operations using [Code Labs](https://codelabs.developers.google.com/?cat=cloud) ### Clean Up diff --git a/website/deploy/css/shortcodes.css b/website/deploy/css/shortcodes.css new file mode 100644 index 000000000..cdae606db --- /dev/null +++ b/website/deploy/css/shortcodes.css @@ -0,0 +1,18 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@import "shortcodes/tabbed-pane.css"; +@import "shortcodes/cards-pane.css"; diff --git a/website/deploy/css/shortcodes/cards-pane.css b/website/deploy/css/shortcodes/cards-pane.css new file mode 100644 index 000000000..8dc13438a --- /dev/null +++ b/website/deploy/css/shortcodes/cards-pane.css @@ -0,0 +1,37 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.card-deck { + max-width: 83%; +} + +.card { + max-width: 80%; +} + +.card-body.code { + background-color: #f8f9fa; + padding: 0 0 0 1ex; +} + +.card-body pre { + margin: 0; + padding: 0 1rem 1rem 1rem; +} + +.card .highlight { + border: none; +} diff --git a/website/deploy/css/shortcodes/tabbed-pane.css b/website/deploy/css/shortcodes/tabbed-pane.css new file mode 100644 index 000000000..ddc4fc674 --- /dev/null +++ b/website/deploy/css/shortcodes/tabbed-pane.css @@ -0,0 +1,34 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +.td-content .highlight { + margin: 0rem 0 2rem 0; +} + +.tab-content .highlight { + border: none; +} + +.tab-content { + margin: 0rem; + max-width: 80%; +} + +.tab-content pre { + border-left: 1px solid rgba(0, 0, 0, 0.125); + border-right: 1px solid rgba(0, 0, 0, 0.125); + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} diff --git a/website/deploy/docs/_print/index.html b/website/deploy/docs/_print/index.html index 74728caaa..620e75428 100644 --- a/website/deploy/docs/_print/index.html +++ b/website/deploy/docs/_print/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ Home | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/getting_started/index.html b/website/deploy/docs/getting_started/index.html index b35dec0dd..ab9a28d0b 100644 --- a/website/deploy/docs/getting_started/index.html +++ b/website/deploy/docs/getting_started/index.html @@ -19,7 +19,7 @@ - + @@ -38,19 +38,17 @@ Note: If installation stops due to billing account errors, set up the billing account and type: sandboxctl create." /> - - + + + + - - - - - - - + + + - + + + diff --git a/website/deploy/docs/images/user-guide/51-Error-Reporting-podfailed.png b/website/deploy/docs/images/user-guide/51-Error-Reporting-podfailed.png new file mode 100644 index 000000000..a7173ef1b Binary files /dev/null and b/website/deploy/docs/images/user-guide/51-Error-Reporting-podfailed.png differ diff --git a/website/deploy/docs/images/user-guide/52-Error-Reporting-pod.png b/website/deploy/docs/images/user-guide/52-Error-Reporting-pod.png new file mode 100644 index 000000000..ba1ee971a Binary files /dev/null and b/website/deploy/docs/images/user-guide/52-Error-Reporting-pod.png differ diff --git a/website/deploy/docs/images/user-guide/53-Error-Reporting-logs.png b/website/deploy/docs/images/user-guide/53-Error-Reporting-logs.png new file mode 100644 index 000000000..25ec47eb5 Binary files /dev/null and b/website/deploy/docs/images/user-guide/53-Error-Reporting-logs.png differ diff --git a/website/deploy/docs/images/user-guide/54-Error-Reporting2.png b/website/deploy/docs/images/user-guide/54-Error-Reporting2.png new file mode 100644 index 000000000..69f907248 Binary files /dev/null and b/website/deploy/docs/images/user-guide/54-Error-Reporting2.png differ diff --git a/website/deploy/docs/images/user-guide/55-Error-Reporting-failed-con-logs.png b/website/deploy/docs/images/user-guide/55-Error-Reporting-failed-con-logs.png new file mode 100644 index 000000000..477ebab71 Binary files /dev/null and b/website/deploy/docs/images/user-guide/55-Error-Reporting-failed-con-logs.png differ diff --git a/website/deploy/docs/images/user-guide/56-Error-Reporting-loadgen.png b/website/deploy/docs/images/user-guide/56-Error-Reporting-loadgen.png new file mode 100644 index 000000000..7875895b5 Binary files /dev/null and b/website/deploy/docs/images/user-guide/56-Error-Reporting-loadgen.png differ diff --git a/website/deploy/docs/images/user-guide/57-billing-menu.png b/website/deploy/docs/images/user-guide/57-billing-menu.png new file mode 100644 index 000000000..1a62264ce Binary files /dev/null and b/website/deploy/docs/images/user-guide/57-billing-menu.png differ diff --git a/website/deploy/docs/images/user-guide/58-billing-console.png b/website/deploy/docs/images/user-guide/58-billing-console.png new file mode 100644 index 000000000..9d14dc125 Binary files /dev/null and b/website/deploy/docs/images/user-guide/58-billing-console.png differ diff --git a/website/deploy/docs/images/user-guide/59-resources-console.png b/website/deploy/docs/images/user-guide/59-resources-console.png new file mode 100644 index 000000000..c17ea31cf Binary files /dev/null and b/website/deploy/docs/images/user-guide/59-resources-console.png differ diff --git a/website/deploy/docs/images/user-guide/60-gke-billing.png b/website/deploy/docs/images/user-guide/60-gke-billing.png new file mode 100644 index 000000000..90798511b Binary files /dev/null and b/website/deploy/docs/images/user-guide/60-gke-billing.png differ diff --git a/website/deploy/docs/images/user-guide/61-AppEngine-billing.png b/website/deploy/docs/images/user-guide/61-AppEngine-billing.png new file mode 100644 index 000000000..e2ac6475e Binary files /dev/null and b/website/deploy/docs/images/user-guide/61-AppEngine-billing.png differ diff --git a/website/deploy/docs/images/user-guide/62-cloudsql-billing.png b/website/deploy/docs/images/user-guide/62-cloudsql-billing.png new file mode 100644 index 000000000..2e6e6ec0b Binary files /dev/null and b/website/deploy/docs/images/user-guide/62-cloudsql-billing.png differ diff --git a/website/deploy/docs/images/user-guide/63-storage-metrics.png b/website/deploy/docs/images/user-guide/63-storage-metrics.png new file mode 100644 index 000000000..ea84ddc67 Binary files /dev/null and b/website/deploy/docs/images/user-guide/63-storage-metrics.png differ diff --git a/website/deploy/docs/images/user-guide/64-cost-est.png b/website/deploy/docs/images/user-guide/64-cost-est.png new file mode 100644 index 000000000..1d036f978 Binary files /dev/null and b/website/deploy/docs/images/user-guide/64-cost-est.png differ diff --git a/website/deploy/docs/images/user-guide/65-cost-est2.png b/website/deploy/docs/images/user-guide/65-cost-est2.png new file mode 100644 index 000000000..0914d79fa Binary files /dev/null and b/website/deploy/docs/images/user-guide/65-cost-est2.png differ diff --git a/website/deploy/docs/images/user-guide/66-AppEngine-billing-ui.png b/website/deploy/docs/images/user-guide/66-AppEngine-billing-ui.png new file mode 100644 index 000000000..cc8bb0ebe Binary files /dev/null and b/website/deploy/docs/images/user-guide/66-AppEngine-billing-ui.png differ diff --git a/website/deploy/docs/images/user-guide/67-cloudsql-calc-menu.png b/website/deploy/docs/images/user-guide/67-cloudsql-calc-menu.png new file mode 100644 index 000000000..7af776a06 Binary files /dev/null and b/website/deploy/docs/images/user-guide/67-cloudsql-calc-menu.png differ diff --git a/website/deploy/docs/index.html b/website/deploy/docs/index.html index 6c899dc90..183b1dc51 100644 --- a/website/deploy/docs/index.html +++ b/website/deploy/docs/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ Home | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/service_overview/index.html b/website/deploy/docs/service_overview/index.html index 2ef9ce752..675dbc2cd 100644 --- a/website/deploy/docs/service_overview/index.html +++ b/website/deploy/docs/service_overview/index.html @@ -19,7 +19,7 @@ - + @@ -37,18 +37,16 @@ - - + + + + - + - - - - - + @@ -70,8 +68,8 @@ - - + + + diff --git a/website/deploy/docs/user-guide/_print/index.html b/website/deploy/docs/user-guide/_print/index.html index 56e1e9e8d..26e2b0ee4 100644 --- a/website/deploy/docs/user-guide/_print/index.html +++ b/website/deploy/docs/user-guide/_print/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ User Guide | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/user-guide/cost-explained/_print/index.html b/website/deploy/docs/user-guide/cost-explained/_print/index.html new file mode 100644 index 000000000..28e5096b1 --- /dev/null +++ b/website/deploy/docs/user-guide/cost-explained/_print/index.html @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + +Breaking Down Cloud Operations Sandbox Cost | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+
+
+
+ + + + + +
+
+

+This the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Breaking Down Cloud Operations Sandbox Cost

+ + + + + +
    + + + + + + + + +
+ + +
+ + + + +

Cloud Operations Sandbox Cost Estimations

+

Cloud Operations Sandbox Cost is made up of compute cost, storage and usage of network traffic and additional services like Cloud Operations Suite. While some of the cost, like GKE infrastructure is constant, for some services cost is a factor of usage. Note, that some of Sandbox costs fall under the free tier, but not not all. +To learn more about billing and pricing please refer to: Google Cloud Pricing Overview, Google’s Pricing philosophy, GCP’s Billing.

+

The GCP billing page will break down your expenses by resource usage. To view billing information for your project in the console go to the Billing section in the left navigation menu.

+

image

+

image

+

GCP Calculator

+

GCP has transparent pricing which is applied per resource. You can plan and estimate pricing using the pricing calculator. One great feature of Google Cloud Platform is sustained use discounts, which can save up to 30% in costs as a credit applied to your account. This allows you later to see exact costs attributed to usage, so you can more accurately reduce usage going forward."

+

To break down the cost we will use a GCP calculator. As network, storage and observability cost are very minimal due to the low volume, in the next section we will focus on the cost of the infrastructure.

+

Sandbox Compute Cost Estimations

+

You can view the provisioned resources in Terraform code you can see the exact resources created or in GCP’s console.

+

image

+

In order to use the calculator you should first select a product from the scrolling list and fill the needed variables. We should do the same for each one of the products.

+

Resources Information +Region: “us-east1”

+
    +
  • Loadgen Cluster 1x “n1-standard-2”
  • +
  • GKE cluster (for the hipster shop microservices) 4x “n1-standard-2”
  • +
  • App Engine (Standard, F1)
  • +
  • SQL PostgresQL - “db-f1-micro”
  • +
+

GKE Clusters +Choose GKE Standard -> fill the number of machines, machine type and region and at the end press ‘add to the estimate’ +image

+

App Engine +For AppEngine -we should choose ‘Standard’ - F1, as AppEngine scale to 0 when not used in our learning environment with periodical test our cost fall under the free tier (AppEngine pricing) +image

+
+

You can see detailed usage and billing cost in the AppEngine console +image

+
+

Cloud SQL +Similar to before, we should choose the product i.e. Cloud SQL.

+

image +Then we should choose PostgresQL -> and fill the instance type, region as before. In regards to storage we can fill 10GB which is the default. +image

+

Similarly we can also add to the estimation the cost of our storage(buckets), in order to estimate that cost we will need to get how much data we are using. +You can view this information easily using Metrics Explorer, by choosing Resource Type: GCS Bucket and Metric Total bytes

+

image +As you can see it is well below 1GB which costs $0.02. +At the end you will have an estimation that includes all the components, and you also save it or email it to be referenced later. Which is ~$250 a month for Sandbox components.

+
+

Please note that is only estimation for the compute components and additional charges like networking and metrics will be added based on usage.

+
+

image +image

+ +
+
+ + + + + + + + + + + + + + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + diff --git a/website/deploy/docs/user-guide/cost-explained/index.html b/website/deploy/docs/user-guide/cost-explained/index.html new file mode 100644 index 000000000..0c1756b11 --- /dev/null +++ b/website/deploy/docs/user-guide/cost-explained/index.html @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + +Breaking Down Cloud Operations Sandbox Cost | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+ +
+ + + + + + +
+

Breaking Down Cloud Operations Sandbox Cost

+ + + + + + +

Cloud Operations Sandbox Cost Estimations

+

Cloud Operations Sandbox Cost is made up of compute cost, storage and usage of network traffic and additional services like Cloud Operations Suite. While some of the cost, like GKE infrastructure is constant, for some services cost is a factor of usage. Note, that some of Sandbox costs fall under the free tier, but not not all. +To learn more about billing and pricing please refer to: Google Cloud Pricing Overview, Google’s Pricing philosophy, GCP’s Billing.

+

The GCP billing page will break down your expenses by resource usage. To view billing information for your project in the console go to the Billing section in the left navigation menu.

+

image

+

image

+

GCP Calculator

+

GCP has transparent pricing which is applied per resource. You can plan and estimate pricing using the pricing calculator. One great feature of Google Cloud Platform is sustained use discounts, which can save up to 30% in costs as a credit applied to your account. This allows you later to see exact costs attributed to usage, so you can more accurately reduce usage going forward."

+

To break down the cost we will use a GCP calculator. As network, storage and observability cost are very minimal due to the low volume, in the next section we will focus on the cost of the infrastructure.

+

Sandbox Compute Cost Estimations

+

You can view the provisioned resources in Terraform code you can see the exact resources created or in GCP’s console.

+

image

+

In order to use the calculator you should first select a product from the scrolling list and fill the needed variables. We should do the same for each one of the products.

+

Resources Information +Region: “us-east1”

+
    +
  • Loadgen Cluster 1x “n1-standard-2”
  • +
  • GKE cluster (for the hipster shop microservices) 4x “n1-standard-2”
  • +
  • App Engine (Standard, F1)
  • +
  • SQL PostgresQL - “db-f1-micro”
  • +
+

GKE Clusters +Choose GKE Standard -> fill the number of machines, machine type and region and at the end press ‘add to the estimate’ +image

+

App Engine +For AppEngine -we should choose ‘Standard’ - F1, as AppEngine scale to 0 when not used in our learning environment with periodical test our cost fall under the free tier (AppEngine pricing) +image

+
+

You can see detailed usage and billing cost in the AppEngine console +image

+
+

Cloud SQL +Similar to before, we should choose the product i.e. Cloud SQL.

+

image +Then we should choose PostgresQL -> and fill the instance type, region as before. In regards to storage we can fill 10GB which is the default. +image

+

Similarly we can also add to the estimation the cost of our storage(buckets), in order to estimate that cost we will need to get how much data we are using. +You can view this information easily using Metrics Explorer, by choosing Resource Type: GCS Bucket and Metric Total bytes

+

image +As you can see it is well below 1GB which costs $0.02. +At the end you will have an estimation that includes all the components, and you also save it or email it to be referenced later. Which is ~$250 a month for Sandbox components.

+
+

Please note that is only estimation for the compute components and additional charges like networking and metrics will be added based on usage.

+
+

image +image

+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
Last modified July 7, 2021: updated images (c0fb631f) +
+
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/destroying-your-cluster/_print/index.html b/website/deploy/docs/user-guide/destroying-your-cluster/_print/index.html index 111185cfd..6cf22d495 100644 --- a/website/deploy/docs/user-guide/destroying-your-cluster/_print/index.html +++ b/website/deploy/docs/user-guide/destroying-your-cluster/_print/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ Destroying your cluster | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/user-guide/destroying-your-cluster/index.html b/website/deploy/docs/user-guide/destroying-your-cluster/index.html index 158ef7db6..4eae59652 100644 --- a/website/deploy/docs/user-guide/destroying-your-cluster/index.html +++ b/website/deploy/docs/user-guide/destroying-your-cluster/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ Destroying your cluster | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/user-guide/explore-your-project-in-gcp/_print/index.html b/website/deploy/docs/user-guide/explore-your-project-in-gcp/_print/index.html index a4c1e3f1b..82dfbfdd0 100644 --- a/website/deploy/docs/user-guide/explore-your-project-in-gcp/_print/index.html +++ b/website/deploy/docs/user-guide/explore-your-project-in-gcp/_print/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ Explore your project | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/user-guide/explore-your-project-in-gcp/index.html b/website/deploy/docs/user-guide/explore-your-project-in-gcp/index.html index 24eb66758..c8e37e79f 100644 --- a/website/deploy/docs/user-guide/explore-your-project-in-gcp/index.html +++ b/website/deploy/docs/user-guide/explore-your-project-in-gcp/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ Explore your project | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/user-guide/index.html b/website/deploy/docs/user-guide/index.html index 43bbe60cc..595b88b96 100644 --- a/website/deploy/docs/user-guide/index.html +++ b/website/deploy/docs/user-guide/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ User Guide | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/_print/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/_print/index.html new file mode 100644 index 000000000..9bd80b59e --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/_print/index.html @@ -0,0 +1,774 @@ + + + + + + + + + + + + + + + + + + + + + + +Learn Cloud Operations | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+
+
+
+
+ + + + + +
+
+

+This the multi-page printable view of this section. +Click here to print. +

+Return to the regular view of this page. +

+
+ + + +

Learn Cloud Operations

+ + + + + + + + +
+

Cloud Operations Overview

+

As the cloud-native microservice architecture, which promises scalability and flexibility benefits, gets more popular, developers and administrators need tools that can work across cloud-based distributed systems.

+

Cloud Operations provides products for both developers and administrators, this section introduces the products and their general audiences. The tools are covered in more detail later. +Application developers need to be able to investigate the cause of problems in applications running in distributed environments, and in this context, the importance of Application Performance Management (APM) has increased. Cloud Operations provides 3 products for APM:

+ +

Similarly, cloud-native, microservice-based applications complicate traditional approaches used by administrators for monitoring system health: it’s harder to observe your system health when the number of instances is flexible and the inter-dependencies among the many components are complicated. In the last few years, Site Reliability Engineering (SRE) has become recognized as a practical approach to managing large-scale, highly complex, distributed systems. Cloud Operations provides the following tools that are useful for SRE:

+ +

You can find the Cloud Operations products in the navigation panel on the GCP Console:

+

image

+ +
+
+ + + + + + + + + + + + + + + + +
+ +

1 - Cloud Trace

+ +

Trace Overview

+

Cloud Trace (documentation) enables developers to see distributed traces that visually expose latency bottleneck in requests. Developers instrument application code to collect trace information. You can also include environmental information in traces and trace information can be included in Cloud Logging logs. The Trace UI can then pull relevant log events into the trace timelines.

+

For instrumenting your applications, currently recommended solution is OpenCensus. OpenCensus is an open-source project that supports trace instrumentation in a variety of languages and that can export this data to Cloud Operations. Then you can use the Cloud Trace UI to analyze the data. Note that OpenCensus is merging with another similar project, OpenTracing, to form OpenTelemetry. See OpenCensus to become OpenTelemetry in this doc.

+

HipsterShop microservices are instrumented to collect trace data. In addition to distributed tracing, OpenCensus (Stats) provides the sink to send quantifiable data, such as database latency, open file descriptors, and so on, that helps to set up monitoring of SLIs and SLOs for the service. This data is available in Cloud Monitoring, and HipsterShop microservices are also instrumented to collect this kind of data.

+

Using Trace

+

To bring up Cloud Trace, click Trace in the GCP navigation panel. This takes you to the Trace Overview page, where you see the traces generated by the Sandbox microservices:

+

image

+

Click Trace List in the navigation panel to get the list of traces captured during a particular time:

+

image

+

Click on any trace in the timeline to get a detailed view and breakdown of the traced call and the subsequent calls that were made:

+

image

+

Finally, click Analysis Reports in the navigation menu to see a list of reports that are generated.

+

If you have just set up the Sandbox environment, you may not have any reports. Click on New Report to create one. An example of a first report: in the Request Filter field, select Recv./cart. Leave the other options the default. Once the report is created, you should be able to see it in the Analysis Reports list.

+

image

+

View one of the reports that was created (or the one you created yourself) to understand either the density or cumulative distribution of latency for the call you selected:

+

image

+

Feel free to explore the tracing data collected from here before moving on to the next section.

+ +
+ + + + + + + + + + + +
+ +

2 - SLIs, SLOs and Burn rate Alerts

+ + + + + +

SLIs, SLOs and Burn rate Alerts Overview

+

Cloud Operations Sandbox comes with several predefined SLOs (Service level objectives), that allow you to measure your users happiness. To learn more about SLIs and SLOs SRE fundamentals.

+

Cloud operations suite provides service oriented monitoring, that means that you are configuring SLIs, SLOs and Burning Rates Alerts for a ‘service’.

+

The first step in order to create SLO is to ingest the data. For GKE services telemetry and dashboards comes out of the box, but you can also ingest additional data and create custom metrics.

+

Then you need to define your service, Cloud Operations Sandbox' services are already detected since Istio’s services are automatically detected and created. But to demonstrate that you can create your own services, it also deploys custom services using Terraform.

+

You can find all the services under monitoring → services → Services Overview, and you can create your own custom service.

+

image

+

Services SLOs

+

The predefined SLOs are also deployed as part of Terraform code and currently are for the mentioned custom services, the Istio service and Rating service.

+

Custom services SLOs

+
Custom service availability SLO: 90% of HTTP requests are successful within the past 30 day windowed period
+
Custom service Latency SLO: 90% of requests return in under 500 ms in the previous 30 days
+

To view the exiting SLOs, in the Services Overview screen choose the desired service.

+

For example for checkoutservice:

+

image

+

image

+

Additional predefined SLOs:

+
Istio service availability SLO: 99% of HTTP requests are successful within the past 30 day windowed period
+
Istio service latency SLO: 99% of requests return in under 500 ms in the previous 30 days
+
Rating service availability SLO: 99% of HTTP requests are successful within the past 30 day windowed period
+
Rating service latency SLO: 99% of requests that return in under 175 ms in the previous 30 days
+
Rating service's data freshness SLO: during a day 99.9% of minutes have at least 1 successful recollect API call
+

Configure your own SLIs and SLOs

+
+

Remember The purpose of defining SLIs and SLOs is to improve your user’s experience, your SLOs scope is a User journey. Therefore your first step should be to identify the most critical User Journey(CUJ) to your business, then identify the metrics that measure your customer experience as closely as possible and ingest that data.

+
+

You can configure your own SLIs and SLOs for an existing service or for your own custom service.

+

Example: configuring the checkout service

+
    +
  1. In the service screen you will choose Create SLO: +image +2.Then you will set your SLI, you need to choose SLI type and the method(request vs window based): +image
  2. +
  3. Then you will define your metric and you can also preview its performance based on historical data: +image
  4. +
  5. Then you will configure your SLO, your target in a specific time window. You can also choose between rolling window or a calendar window: +image
  6. +
+

Configure Burn Rate Alerts

+

After you create the SLO, you can create Burn Rate Alertsfor those.

+

Several predefined policies are deployed as part of Terraform. You can view them in the service screen, edit them, or create your own.

+

Let’s continue with the Istio checkoutservice SLO you created in the previous section:

+
    +
  1. In the service screen you will be able to see your new SLO and you will choose ‘Create Alerting Policy’
  2. +
+

image +2. Then you will want to set the alert’s condition, who and how they will be notified and additional instructions:
+image +3. After it will be created you could see it and incidents that might be triggered due to it in the service screen and in the Alerting screen: +image

+ +
+ + + + + + + + + + + +
+ +

3 - Cloud Profiler

+ + + + + +

Profiler Overview

+

Cloud Profiler (documentation) performs statistical sampling on your running application. Depending on the language, it can capture statistical data on CPU utilization, heap size, threads, and so on. You can use the charts created by the Profiler UI to help identify performance bottlenecks in your application code.

+

You do not have to write any profiling code in your application; you simply need to make the Profiler library available (the mechanism varies by language). This library will sample performance traits and create reports, which you can then analyze with the Profiler UI.

+

The following Hipster Shop microservices are configured to capture profiling data:

+
    +
  • Checkout service
  • +
  • Currency service
  • +
  • Frontend
  • +
  • Payment service
  • +
  • Product-catalog service
  • +
  • Shipping service
  • +
+

Using Profiler

+

Select Profiler from the GCP navigation menu to open the Profiler home page. It comes up with a default configuration and shows you the profiling graph:

+

image

+

You can change the service, the profile type, and many other aspects of the configuration For example, to select the service you’d like to view Profiler data for, choose a different entry on the Service pulldown menu:

+

image

+

Depending on the service you select and the language it’s written in, you can select from multiple metrics collected by Profiler:

+

image

+
+

See “Types of profiling available” for information on the specific metrics available for each language.

+
+

Profiler uses a visualization called a flame graph to represents both code execution and resource utilization. See “Flame graphs” for information on how to interpret this visualization. You can read more about how to use the flame graph to understand your service’s efficiency and performance in “Using the Profiler interface”.

+ +
+ + + + + + + + + + + +
+ +

4 - Cloud Debugger

+ + + + + +

Debugger Overview

+

You might have experienced situations where you see problems in production environments but they can’t be reproduced in test environments. To find a root cause, then, you need to step into the source code or add more logs of the application as it runs in the production environment. Typically, this would require re-deploying the app, with all associated risks for production deployment.

+

Cloud Debugger (documentation) lets developers debug running code with live request data. You can set breakpoints and log points on the fly. When a breakpoint is hit, a snapshot of the process state is taken, so you can examine what caused the problem. With log points, you can add a log statement to a running app without re-deploying, and without incurring meaningful performance costs.

+

You do not have to add any instrumentation code to your application to use Cloud Debugger. You start the debugger agent in the container running the application, and you can then use the Debugger UI to step through snapshots of the running code.

+

The following Hipster Shop microservices are configured to capture debugger data:

+
    +
  • Currency service
  • +
  • Email service
  • +
  • Payment service
  • +
  • Recommendation service
  • +
+

Using Debugger

+

To bring up the Debugger, select Debugger from the navigation panel on the GPC console:

+

image

+

As you can see, Debugger requires access to source code to function. For this exercise, you’ll download the code locally and link it to Debugger.

+
Download source code
+

In Cloud Shell, issue these commands to download a release of the Sandbox source code and extract the archive:

+
cd ~
+wget https://github.com/GoogleCloudPlatform/cloud-ops-sandbox/archive/next19.tar.gz
+tar -xvf next19.tar.gz
+cd cloud-ops-sandbox-next19
+
Create and configure source repository
+

To create a Cloud Source Repository for the source code and to configure Git access, issue these commands in Cloud Shell:

+
gcloud source repos create google-source-captures
+git config --global user.email "user@domain.tld" # substitute with your email
+git config --global user.name "first last"       # substitute with your name
+
Upload source code to Debugger
+

In the Debugger home page, copy the command (don’t click the button!) in the “Upload a source code capture to Google servers” box, but don’t include the LOCAL_PATH variable. (You will replace this with another value before executing the command.)

+

image

+

Paste the command into your Cloud Shell prompt and add a space and a period:

+
gcloud beta debug source upload --project=cloud-ops-sandbox-68291054 --branch=6412930C2492B84D99F3 .
+

Enter RETURN to execute the command.

+

In the Debugger home page, click the Select Source button under “Upload a source code capture” option, which will then open the source code:

+

image

+

You are now ready to debug your code!

+
Create a snapshot
+

Start by using the Snapshot functionality to understand the state of your variables. In the Source capture tree, open the server.js file under src > currencyservice.

+

Next, click on line 121 to create a snapshot. in a few moments, you should see a snapshot be created, and you can view the values of all variables at that point on the right side of the screen:

+

image

+
Create a logpoint
+

Switch to the Logpoint tab on the right side. To create the logpoint:

+
    +
  1. Again, click on line 121 of server.js to position the logpoint.
  2. +
  3. In the Message field, type “testing logpoint” to set the message that will be logged.
  4. +
  5. Click the Add button.
  6. +
+

To see all messages that are being generated in Cloud Logging from your logpoint, click the Logs tab in the middle of the UI. This brings up an embedded viewer for the logs:

+

image

+ +
+ + + + + + + + + + + +
+ +

5 - Cloud Monitoring

+ + + + + +

Monitoring Overview

+

Cloud Monitoring (documentation) is the go-to place to grasp real-time trends of the system based on SLI/SLO. SRE team and application development team (and even business organization team) can collaborate to set up charts on the monitoring dashboard using metrics sent from the resources and the applications.

+

Using Monitoring

+

To get to Cloud Monitoring from the GCP console, select Monitoring on the navigation panel. By default, you reach an overview page:

+

image

+

There are many pre-built monitoring pages. For example, the GKE Cluster Details page (select Monitoring > Dashboards > Kubernetes Engine > Infrastructure) brings up a page that provides information about the Sandbox cluster:

+

image

+

You can also use the Monitoring console to create alerts and uptime checks, and to create dashboards that chart metrics you are interested in. For example, Metrics Explorer lets you select a specific metric, configure it for charting, and then save the chart. Select Monitoring > Metrics Explorer from the navigation panel to bring it up.

+

To search and view metrics, type the name of the metric or the type of resource, for example to search OpenCensus metrics in the **Monitoring > Metrics Explorer > ** search for grpc.io:

+

image

+

The following chart shows the client-side RPC calls that did not result in an OK status:

+

image

+

This chart uses the metric type custom.googleapis.com/opencensus/grpc.io/client/completed_rpcs (display name: “OpenCensus/grpc.io/client/completed_rpcs” ), and filters on the grpc_client_status label to only keep time series where the label value equals “OK”.

+

The following example displays results where the grpc_client_status is not “OK” (e.g. PERMISSION_DENIED) and where the grpc_client_method does not include “google”, i.e. errors from application services.

+

image

+

In addition to the default GCP dashboards mentioned above, Cloud Operations Sandbox provisions several dashboards using Terraform code.

+

In the User Experience Dashboard, you can also view Opencensus metrics like HTTP Request Count by Method, HTTP Response Errors and HTTP Request Latency, 99th Percentile.

+

Additionally, you can edit the dashboard, add additional charts, and also open the chart in the Metrics explorer as shown below: +image

+
Monitoring and logs-based metrics
+

Cloud Logging provides default, logs-based system metrics, but you can also create your own (see Using logs-based metrics). To see available metrics, select Logging > Logs-based metrics from the navigation panel. You should see both system metrics and some user-defined, logs-based metrics created in Sandbox.

+

image

+

All system-defined logs-based metrics are counters. User-defined logs-based metrics can be either counter or distribution metrics.

+
Creating a logs-based metric
+

To create a logs-based metric, click the Create Metric button at the top of the Logs-based metrics page or the Logs Viewer. This takes you to the Logs Viewer if needed, and also brings up the Metric Editor panel.

+

Creating a logs-based metric involves two general steps:

+
    +
  1. Identifying the set of log entries you want to use as the source of data for your entry by using the Logs Viewer. Using the Logs Viewer is briefly described in the Cloud Logging section of this document.
  2. +
  3. Describing the metric data to extract from these log entries by using the Metric Editor.
  4. +
+

This example creates a logs-based metric that counts the number of times a user (user ID, actually) adds an item to the HipsterShop cart. (This is an admittedly trivial example, though it could be extended. For example, from this same set of records, you can extract the user ID, item, and quantity added.)

+

First, create a logs query that finds the relevant set of log entries:

+
    +
  1. For the resource type, select Kubernetes Container > cloud-ops-sandbox > default > server
  2. +
  3. In the box with default text “Filter by label or text search”, enter “AddItemAsync” (the method used to add an item to the cart), and hit return.
  4. +
+

The Logs Viewer display shows the resulting entries:

+

image

+

Second, describe the new metric to be based on the logs query. This will be a counter metric. Enter a name and description and click Create Metric:

+

image

+

It takes a few minutes for metric data to be collected, but once the metric collection has begun, you can chart this metric just like any other.

+

To chart this metric using Metrics Explorer, select Monitoring from the GCP console, and on the Monitoring console, select Resources > Metrics Explorer.

+

Search for the metric type using the name you gave it (“purchasing_counter_metric”, in this example):

+

image

+ +
+ + + + + + + + + + + +
+ +

6 - Cloud Logging

+ + + + + +

Logging Overview

+

Operators can look at logs in Cloud Logging to find clues explaining any anomalies in the metrics charts.

+

Using Logging

+

You can access Cloud Logging by selecting Logging from the GCP navigation menu. This brings up the Logs Viewer interface:

+

image

+

The Logs Viewer allows you to view logs emitted by resources in the project using search filters provided. The Logs Viewer lets you select standard filters from pulldown menus.

+
An example: server logs
+

To view all container logs emitted by pods running in the default namespace, use the Resources and Logs filter fields (these default to Audited Resources and All logs):

+
    +
  1. For the resource type, select GKE Container -> cloud-ops-sandbox -> default
  2. +
  3. For the log type, select server
  4. +
+

The Logs Viewer now displays the logs generated by pods running in the default namespace:

+

image

+
Another example: audit logs
+

To see logs for all audited actions that took place in the project during the specified time interval:

+
    +
  1. For the resource type, select Audited Resources > All services
  2. +
  3. For the log type, select** All logs**
  4. +
  5. For the time interval, you might have to experiment, depending on how long your project has been up.
  6. +
+

The Logs Viewer now shows all audited actions that took place in the project during the specified time interval:

+

image

+
Exporting logs
+

Audit logs contain the records of who did what. For long-term retention of these records, the recommended practice is to create exports for audit logs. You can do that by clicking on Create Sink:

+

image

+

Give your sink a name, and select the service and destination to which you will export your logs. We recommend using a less expensive class of storage for exported audit logs, since they are not likely to be accessed frequently. For this example, create an export for audit logs to Google Cloud Storage.

+

Click Create Sink. Then follow the prompts to create a new storage bucket and export logs there:

+

image

+ +
+ + + + + + + + + + + +
+ +

7 - Cloud Error Reporting

+ + + + + +

Error Reporting Overview

+

Cloud Error Reporting (documentation) automatically groups errors depending on stack trace message patterns and shows the frequency of each error group. The error groups are generated automatically, based on stack traces.

+

On opening an error group report, operators can access to the exact line in the application code where the error occurred and reason about the cause by navigating to the line of the source code on Google Cloud Source Repository.

+

Using Error Reporting

+

You can access Error Reporting by selecting Error Reporting from the GCP navigation menu:

+

image

+
+

Note: Error Reporting can also let you know when new errors are received; see “Notifications for Error Reporting” for details.

+
+

To get started, select any open error by clicking on the error in the Error field:

+

image

+

The Error Details screen shows you when the error has been occurring in the timeline and provides the stack trace that was captured with the error. Scroll down to see samples of the error:

+

image

+

Click View Logs for one of the samples to see the log messages that match this particular error:

+

image

+

You can expand any of the messages that matches the filter to see the full stack trace:

+

image

+

Errors Manufacturing

+

There are several ways in which you can experiment with Error Reporting tool and manufacture errors that will be reported and displayed in the UI. For the purpose of this demonstration, we will use Cloud Operations Sandbox’s Load Generator and SRE Recipes features to simulate errors in the system.

+

To simulate requests using the load generator we can use the UI or the sandboxctl command line tool.

+
$sandboxctl loadgen step
+Redeploying Loadgenerator...
+Loadgenerator deployed using step pattern
+Loadgenerator web UI: http://<ExampleIP>
+

Then to break the service we will use sre-recipes(recipe2)

+
$sandboxctl sre-recipes break recipe2
+Breaking service operations...
+...done
+

In this case you will see in Error Reporting UI you will see a new reported error Unhealthy pod, failed probe

+

image

+

You can open it to see additional information, in the below example you can see that this error repeats itself several times in the last hour.

+

image

+

You can also press View logs to view detailed log information in Cloud Operations Logging.

+

image

+
+

Note: at the end, don’t forget to recover the service using sandboxctl sre-recipes restore.

+
+

Another way to break the service is to use the load generator to overload the service with too many requests. +In the Load Generator UI( addressed provided about or using sandboxctl describe), we will start run a test with 500 users.

+
+

Note: Currently only load test <100 users would be successful.

+
+

image

+

In the UI you will see that the previous error Unhealthy pod, failed probe, in addition you can see an additional error Container Downtime:

+

image

+

image

+ +
+ + + + + + + + + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/cloud_debugger/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_debugger/index.html new file mode 100644 index 000000000..3d1871502 --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_debugger/index.html @@ -0,0 +1,626 @@ + + + + + + + + + + + + + + + + + + + + + +Cloud Debugger | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + +
+

Cloud Debugger

+ + + + + + +

Debugger Overview

+

You might have experienced situations where you see problems in production environments but they can’t be reproduced in test environments. To find a root cause, then, you need to step into the source code or add more logs of the application as it runs in the production environment. Typically, this would require re-deploying the app, with all associated risks for production deployment.

+

Cloud Debugger (documentation) lets developers debug running code with live request data. You can set breakpoints and log points on the fly. When a breakpoint is hit, a snapshot of the process state is taken, so you can examine what caused the problem. With log points, you can add a log statement to a running app without re-deploying, and without incurring meaningful performance costs.

+

You do not have to add any instrumentation code to your application to use Cloud Debugger. You start the debugger agent in the container running the application, and you can then use the Debugger UI to step through snapshots of the running code.

+

The following Hipster Shop microservices are configured to capture debugger data:

+
    +
  • Currency service
  • +
  • Email service
  • +
  • Payment service
  • +
  • Recommendation service
  • +
+

Using Debugger

+

To bring up the Debugger, select Debugger from the navigation panel on the GPC console:

+

image

+

As you can see, Debugger requires access to source code to function. For this exercise, you’ll download the code locally and link it to Debugger.

+
Download source code
+

In Cloud Shell, issue these commands to download a release of the Sandbox source code and extract the archive:

+
cd ~
+wget https://github.com/GoogleCloudPlatform/cloud-ops-sandbox/archive/next19.tar.gz
+tar -xvf next19.tar.gz
+cd cloud-ops-sandbox-next19
+
Create and configure source repository
+

To create a Cloud Source Repository for the source code and to configure Git access, issue these commands in Cloud Shell:

+
gcloud source repos create google-source-captures
+git config --global user.email "user@domain.tld" # substitute with your email
+git config --global user.name "first last"       # substitute with your name
+
Upload source code to Debugger
+

In the Debugger home page, copy the command (don’t click the button!) in the “Upload a source code capture to Google servers” box, but don’t include the LOCAL_PATH variable. (You will replace this with another value before executing the command.)

+

image

+

Paste the command into your Cloud Shell prompt and add a space and a period:

+
gcloud beta debug source upload --project=cloud-ops-sandbox-68291054 --branch=6412930C2492B84D99F3 .
+

Enter RETURN to execute the command.

+

In the Debugger home page, click the Select Source button under “Upload a source code capture” option, which will then open the source code:

+

image

+

You are now ready to debug your code!

+
Create a snapshot
+

Start by using the Snapshot functionality to understand the state of your variables. In the Source capture tree, open the server.js file under src > currencyservice.

+

Next, click on line 121 to create a snapshot. in a few moments, you should see a snapshot be created, and you can view the values of all variables at that point on the right side of the screen:

+

image

+
Create a logpoint
+

Switch to the Logpoint tab on the right side. To create the logpoint:

+
    +
  1. Again, click on line 121 of server.js to position the logpoint.
  2. +
  3. In the Message field, type “testing logpoint” to set the message that will be logged.
  4. +
  5. Click the Add button.
  6. +
+

To see all messages that are being generated in Cloud Logging from your logpoint, click the Logs tab in the middle of the UI. This brings up an embedded viewer for the logs:

+

image

+ + + + +
+ + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/cloud_error_reporting/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_error_reporting/index.html new file mode 100644 index 000000000..518ef3658 --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_error_reporting/index.html @@ -0,0 +1,623 @@ + + + + + + + + + + + + + + + + + + + + + +Cloud Error Reporting | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + +
+

Cloud Error Reporting

+ + + + + + +

Error Reporting Overview

+

Cloud Error Reporting (documentation) automatically groups errors depending on stack trace message patterns and shows the frequency of each error group. The error groups are generated automatically, based on stack traces.

+

On opening an error group report, operators can access to the exact line in the application code where the error occurred and reason about the cause by navigating to the line of the source code on Google Cloud Source Repository.

+

Using Error Reporting

+

You can access Error Reporting by selecting Error Reporting from the GCP navigation menu:

+

image

+
+

Note: Error Reporting can also let you know when new errors are received; see “Notifications for Error Reporting” for details.

+
+

To get started, select any open error by clicking on the error in the Error field:

+

image

+

The Error Details screen shows you when the error has been occurring in the timeline and provides the stack trace that was captured with the error. Scroll down to see samples of the error:

+

image

+

Click View Logs for one of the samples to see the log messages that match this particular error:

+

image

+

You can expand any of the messages that matches the filter to see the full stack trace:

+

image

+

Errors Manufacturing

+

There are several ways in which you can experiment with Error Reporting tool and manufacture errors that will be reported and displayed in the UI. For the purpose of this demonstration, we will use Cloud Operations Sandbox’s Load Generator and SRE Recipes features to simulate errors in the system.

+

To simulate requests using the load generator we can use the UI or the sandboxctl command line tool.

+
$sandboxctl loadgen step
+Redeploying Loadgenerator...
+Loadgenerator deployed using step pattern
+Loadgenerator web UI: http://<ExampleIP>
+

Then to break the service we will use sre-recipes(recipe2)

+
$sandboxctl sre-recipes break recipe2
+Breaking service operations...
+...done
+

In this case you will see in Error Reporting UI you will see a new reported error Unhealthy pod, failed probe

+

image

+

You can open it to see additional information, in the below example you can see that this error repeats itself several times in the last hour.

+

image

+

You can also press View logs to view detailed log information in Cloud Operations Logging.

+

image

+
+

Note: at the end, don’t forget to recover the service using sandboxctl sre-recipes restore.

+
+

Another way to break the service is to use the load generator to overload the service with too many requests. +In the Load Generator UI( addressed provided about or using sandboxctl describe), we will start run a test with 500 users.

+
+

Note: Currently only load test <100 users would be successful.

+
+

image

+

In the UI you will see that the previous error Unhealthy pod, failed probe, in addition you can see an additional error Container Downtime:

+

image

+

image

+ + + +
Last modified May 27, 2021: Updated review syntax changes. (6cae6d5d) +
+
+ + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/cloud_logging/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_logging/index.html new file mode 100644 index 000000000..68f21d09b --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_logging/index.html @@ -0,0 +1,611 @@ + + + + + + + + + + + + + + + + + + + + + +Cloud Logging | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + +
+

Cloud Logging

+ + + + + + +

Logging Overview

+

Operators can look at logs in Cloud Logging to find clues explaining any anomalies in the metrics charts.

+

Using Logging

+

You can access Cloud Logging by selecting Logging from the GCP navigation menu. This brings up the Logs Viewer interface:

+

image

+

The Logs Viewer allows you to view logs emitted by resources in the project using search filters provided. The Logs Viewer lets you select standard filters from pulldown menus.

+
An example: server logs
+

To view all container logs emitted by pods running in the default namespace, use the Resources and Logs filter fields (these default to Audited Resources and All logs):

+
    +
  1. For the resource type, select GKE Container -> cloud-ops-sandbox -> default
  2. +
  3. For the log type, select server
  4. +
+

The Logs Viewer now displays the logs generated by pods running in the default namespace:

+

image

+
Another example: audit logs
+

To see logs for all audited actions that took place in the project during the specified time interval:

+
    +
  1. For the resource type, select Audited Resources > All services
  2. +
  3. For the log type, select** All logs**
  4. +
  5. For the time interval, you might have to experiment, depending on how long your project has been up.
  6. +
+

The Logs Viewer now shows all audited actions that took place in the project during the specified time interval:

+

image

+
Exporting logs
+

Audit logs contain the records of who did what. For long-term retention of these records, the recommended practice is to create exports for audit logs. You can do that by clicking on Create Sink:

+

image

+

Give your sink a name, and select the service and destination to which you will export your logs. We recommend using a less expensive class of storage for exported audit logs, since they are not likely to be accessed frequently. For this example, create an export for audit logs to Google Cloud Storage.

+

Click Create Sink. Then follow the prompts to create a new storage bucket and export logs there:

+

image

+ + + + +
+ + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/cloud_monitoring/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_monitoring/index.html new file mode 100644 index 000000000..aabb76c56 --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_monitoring/index.html @@ -0,0 +1,622 @@ + + + + + + + + + + + + + + + + + + + + + +Cloud Monitoring | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + +
+

Cloud Monitoring

+ + + + + + +

Monitoring Overview

+

Cloud Monitoring (documentation) is the go-to place to grasp real-time trends of the system based on SLI/SLO. SRE team and application development team (and even business organization team) can collaborate to set up charts on the monitoring dashboard using metrics sent from the resources and the applications.

+

Using Monitoring

+

To get to Cloud Monitoring from the GCP console, select Monitoring on the navigation panel. By default, you reach an overview page:

+

image

+

There are many pre-built monitoring pages. For example, the GKE Cluster Details page (select Monitoring > Dashboards > Kubernetes Engine > Infrastructure) brings up a page that provides information about the Sandbox cluster:

+

image

+

You can also use the Monitoring console to create alerts and uptime checks, and to create dashboards that chart metrics you are interested in. For example, Metrics Explorer lets you select a specific metric, configure it for charting, and then save the chart. Select Monitoring > Metrics Explorer from the navigation panel to bring it up.

+

To search and view metrics, type the name of the metric or the type of resource, for example to search OpenCensus metrics in the **Monitoring > Metrics Explorer > ** search for grpc.io:

+

image

+

The following chart shows the client-side RPC calls that did not result in an OK status:

+

image

+

This chart uses the metric type custom.googleapis.com/opencensus/grpc.io/client/completed_rpcs (display name: “OpenCensus/grpc.io/client/completed_rpcs” ), and filters on the grpc_client_status label to only keep time series where the label value equals “OK”.

+

The following example displays results where the grpc_client_status is not “OK” (e.g. PERMISSION_DENIED) and where the grpc_client_method does not include “google”, i.e. errors from application services.

+

image

+

In addition to the default GCP dashboards mentioned above, Cloud Operations Sandbox provisions several dashboards using Terraform code.

+

In the User Experience Dashboard, you can also view Opencensus metrics like HTTP Request Count by Method, HTTP Response Errors and HTTP Request Latency, 99th Percentile.

+

Additionally, you can edit the dashboard, add additional charts, and also open the chart in the Metrics explorer as shown below: +image

+
Monitoring and logs-based metrics
+

Cloud Logging provides default, logs-based system metrics, but you can also create your own (see Using logs-based metrics). To see available metrics, select Logging > Logs-based metrics from the navigation panel. You should see both system metrics and some user-defined, logs-based metrics created in Sandbox.

+

image

+

All system-defined logs-based metrics are counters. User-defined logs-based metrics can be either counter or distribution metrics.

+
Creating a logs-based metric
+

To create a logs-based metric, click the Create Metric button at the top of the Logs-based metrics page or the Logs Viewer. This takes you to the Logs Viewer if needed, and also brings up the Metric Editor panel.

+

Creating a logs-based metric involves two general steps:

+
    +
  1. Identifying the set of log entries you want to use as the source of data for your entry by using the Logs Viewer. Using the Logs Viewer is briefly described in the Cloud Logging section of this document.
  2. +
  3. Describing the metric data to extract from these log entries by using the Metric Editor.
  4. +
+

This example creates a logs-based metric that counts the number of times a user (user ID, actually) adds an item to the HipsterShop cart. (This is an admittedly trivial example, though it could be extended. For example, from this same set of records, you can extract the user ID, item, and quantity added.)

+

First, create a logs query that finds the relevant set of log entries:

+
    +
  1. For the resource type, select Kubernetes Container > cloud-ops-sandbox > default > server
  2. +
  3. In the box with default text “Filter by label or text search”, enter “AddItemAsync” (the method used to add an item to the cart), and hit return.
  4. +
+

The Logs Viewer display shows the resulting entries:

+

image

+

Second, describe the new metric to be based on the logs query. This will be a counter metric. Enter a name and description and click Create Metric:

+

image

+

It takes a few minutes for metric data to be collected, but once the metric collection has begun, you can chart this metric just like any other.

+

To chart this metric using Metrics Explorer, select Monitoring from the GCP console, and on the Monitoring console, select Resources > Metrics Explorer.

+

Search for the metric type using the name you gave it (“purchasing_counter_metric”, in this example):

+

image

+ + + + +
+ + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/cloud_profiler/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_profiler/index.html new file mode 100644 index 000000000..d0dec3275 --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_profiler/index.html @@ -0,0 +1,599 @@ + + + + + + + + + + + + + + + + + + + + + +Cloud Profiler | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + +
+

Cloud Profiler

+ + + + + + +

Profiler Overview

+

Cloud Profiler (documentation) performs statistical sampling on your running application. Depending on the language, it can capture statistical data on CPU utilization, heap size, threads, and so on. You can use the charts created by the Profiler UI to help identify performance bottlenecks in your application code.

+

You do not have to write any profiling code in your application; you simply need to make the Profiler library available (the mechanism varies by language). This library will sample performance traits and create reports, which you can then analyze with the Profiler UI.

+

The following Hipster Shop microservices are configured to capture profiling data:

+
    +
  • Checkout service
  • +
  • Currency service
  • +
  • Frontend
  • +
  • Payment service
  • +
  • Product-catalog service
  • +
  • Shipping service
  • +
+

Using Profiler

+

Select Profiler from the GCP navigation menu to open the Profiler home page. It comes up with a default configuration and shows you the profiling graph:

+

image

+

You can change the service, the profile type, and many other aspects of the configuration For example, to select the service you’d like to view Profiler data for, choose a different entry on the Service pulldown menu:

+

image

+

Depending on the service you select and the language it’s written in, you can select from multiple metrics collected by Profiler:

+

image

+
+

See “Types of profiling available” for information on the specific metrics available for each language.

+
+

Profiler uses a visualization called a flame graph to represents both code execution and resource utilization. See “Flame graphs” for information on how to interpret this visualization. You can read more about how to use the flame graph to understand your service’s efficiency and performance in “Using the Profiler interface”.

+ + + + +
+ + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/cloud_slo_monitoring/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_slo_monitoring/index.html new file mode 100644 index 000000000..26c693e85 --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_slo_monitoring/index.html @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + + + + + +SLIs, SLOs and Burn rate Alerts | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + +
+

SLIs, SLOs and Burn rate Alerts

+ + + + + + +

SLIs, SLOs and Burn rate Alerts Overview

+

Cloud Operations Sandbox comes with several predefined SLOs (Service level objectives), that allow you to measure your users happiness. To learn more about SLIs and SLOs SRE fundamentals.

+

Cloud operations suite provides service oriented monitoring, that means that you are configuring SLIs, SLOs and Burning Rates Alerts for a ‘service’.

+

The first step in order to create SLO is to ingest the data. For GKE services telemetry and dashboards comes out of the box, but you can also ingest additional data and create custom metrics.

+

Then you need to define your service, Cloud Operations Sandbox' services are already detected since Istio’s services are automatically detected and created. But to demonstrate that you can create your own services, it also deploys custom services using Terraform.

+

You can find all the services under monitoring → services → Services Overview, and you can create your own custom service.

+

image

+

Services SLOs

+

The predefined SLOs are also deployed as part of Terraform code and currently are for the mentioned custom services, the Istio service and Rating service.

+

Custom services SLOs

+
Custom service availability SLO: 90% of HTTP requests are successful within the past 30 day windowed period
+
Custom service Latency SLO: 90% of requests return in under 500 ms in the previous 30 days
+

To view the exiting SLOs, in the Services Overview screen choose the desired service.

+

For example for checkoutservice:

+

image

+

image

+

Additional predefined SLOs:

+
Istio service availability SLO: 99% of HTTP requests are successful within the past 30 day windowed period
+
Istio service latency SLO: 99% of requests return in under 500 ms in the previous 30 days
+
Rating service availability SLO: 99% of HTTP requests are successful within the past 30 day windowed period
+
Rating service latency SLO: 99% of requests that return in under 175 ms in the previous 30 days
+
Rating service's data freshness SLO: during a day 99.9% of minutes have at least 1 successful recollect API call
+

Configure your own SLIs and SLOs

+
+

Remember The purpose of defining SLIs and SLOs is to improve your user’s experience, your SLOs scope is a User journey. Therefore your first step should be to identify the most critical User Journey(CUJ) to your business, then identify the metrics that measure your customer experience as closely as possible and ingest that data.

+
+

You can configure your own SLIs and SLOs for an existing service or for your own custom service.

+

Example: configuring the checkout service

+
    +
  1. In the service screen you will choose Create SLO: +image +2.Then you will set your SLI, you need to choose SLI type and the method(request vs window based): +image
  2. +
  3. Then you will define your metric and you can also preview its performance based on historical data: +image
  4. +
  5. Then you will configure your SLO, your target in a specific time window. You can also choose between rolling window or a calendar window: +image
  6. +
+

Configure Burn Rate Alerts

+

After you create the SLO, you can create Burn Rate Alertsfor those.

+

Several predefined policies are deployed as part of Terraform. You can view them in the service screen, edit them, or create your own.

+

Let’s continue with the Istio checkoutservice SLO you created in the previous section:

+
    +
  1. In the service screen you will be able to see your new SLO and you will choose ‘Create Alerting Policy’
  2. +
+

image +2. Then you will want to set the alert’s condition, who and how they will be notified and additional instructions:
+image +3. After it will be created you could see it and incidents that might be triggered due to it in the service screen and in the Alerting screen: +image

+ + + +
Last modified May 12, 2021: Update cloud_slo_monitoring.md (2a68484d) +
+
+ + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/cloud_trace/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_trace/index.html new file mode 100644 index 000000000..6daf9e763 --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/cloud_trace/index.html @@ -0,0 +1,583 @@ + + + + + + + + + + + + + + + + + + + + + +Cloud Trace | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + +
+

Cloud Trace

+ + +

Trace Overview

+

Cloud Trace (documentation) enables developers to see distributed traces that visually expose latency bottleneck in requests. Developers instrument application code to collect trace information. You can also include environmental information in traces and trace information can be included in Cloud Logging logs. The Trace UI can then pull relevant log events into the trace timelines.

+

For instrumenting your applications, currently recommended solution is OpenCensus. OpenCensus is an open-source project that supports trace instrumentation in a variety of languages and that can export this data to Cloud Operations. Then you can use the Cloud Trace UI to analyze the data. Note that OpenCensus is merging with another similar project, OpenTracing, to form OpenTelemetry. See OpenCensus to become OpenTelemetry in this doc.

+

HipsterShop microservices are instrumented to collect trace data. In addition to distributed tracing, OpenCensus (Stats) provides the sink to send quantifiable data, such as database latency, open file descriptors, and so on, that helps to set up monitoring of SLIs and SLOs for the service. This data is available in Cloud Monitoring, and HipsterShop microservices are also instrumented to collect this kind of data.

+

Using Trace

+

To bring up Cloud Trace, click Trace in the GCP navigation panel. This takes you to the Trace Overview page, where you see the traces generated by the Sandbox microservices:

+

image

+

Click Trace List in the navigation panel to get the list of traces captured during a particular time:

+

image

+

Click on any trace in the timeline to get a detailed view and breakdown of the traced call and the subsequent calls that were made:

+

image

+

Finally, click Analysis Reports in the navigation menu to see a list of reports that are generated.

+

If you have just set up the Sandbox environment, you may not have any reports. Click on New Report to create one. An example of a first report: in the Request Filter field, select Recv./cart. Leave the other options the default. Once the report is created, you should be able to see it in the Analysis Reports list.

+

image

+

View one of the reports that was created (or the one you created yourself) to understand either the density or cumulative distribution of latency for the call you selected:

+

image

+

Feel free to explore the tracing data collected from here before moving on to the next section.

+ + + + +
+ + +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/learn-cloud-operations/index.html b/website/deploy/docs/user-guide/learn-cloud-operations/index.html new file mode 100644 index 000000000..281b20cac --- /dev/null +++ b/website/deploy/docs/user-guide/learn-cloud-operations/index.html @@ -0,0 +1,658 @@ + + + + + + + + + + + + + + + + + + + + + + +Learn Cloud Operations | Cloud Operations Sandbox + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+
+
+
+
+ + + + + +
+ + + + +
+ + + + +
+
+ + + + + + + + + + + + + + +
+
+ + + + + + +
+

Learn Cloud Operations

+ + +

Cloud Operations Overview

+

As the cloud-native microservice architecture, which promises scalability and flexibility benefits, gets more popular, developers and administrators need tools that can work across cloud-based distributed systems.

+

Cloud Operations provides products for both developers and administrators, this section introduces the products and their general audiences. The tools are covered in more detail later. +Application developers need to be able to investigate the cause of problems in applications running in distributed environments, and in this context, the importance of Application Performance Management (APM) has increased. Cloud Operations provides 3 products for APM:

+ +

Similarly, cloud-native, microservice-based applications complicate traditional approaches used by administrators for monitoring system health: it’s harder to observe your system health when the number of instances is flexible and the inter-dependencies among the many components are complicated. In the last few years, Site Reliability Engineering (SRE) has become recognized as a practical approach to managing large-scale, highly complex, distributed systems. Cloud Operations provides the following tools that are useful for SRE:

+ +

You can find the Cloud Operations products in the navigation panel on the GCP Console:

+

image

+ +
+ + + + + +
+ + + + + + + + + + + + + + + + + + +
+
+ Cloud Trace +
+

+
+ + + + + +
+
+ SLIs, SLOs and Burn rate Alerts +
+

+
+ + + +
+
+ Cloud Profiler +
+

+
+ + + +
+
+ Cloud Debugger +
+

+
+ + + +
+
+ Cloud Monitoring +
+

+
+ + + +
+
+ Cloud Logging +
+

+
+ + + +
+
+ Cloud Error Reporting +
+

+
+ + + +
+ + + + +
+ +
+
+
+ +
+
+
+
+ + + + + + + +
+
+ + + + + + + +
+
+ © 2021 Cloud Sandbox Authors. All Rights Reserved + Privacy Policy + + + +
+
+
+
+ + +
+ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/website/deploy/docs/user-guide/set-up/_print/index.html b/website/deploy/docs/user-guide/set-up/_print/index.html index 46b04618d..3269aa52d 100644 --- a/website/deploy/docs/user-guide/set-up/_print/index.html +++ b/website/deploy/docs/user-guide/set-up/_print/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ Set Up | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/docs/user-guide/set-up/index.html b/website/deploy/docs/user-guide/set-up/index.html index a95d8d111..2d7101bfa 100644 --- a/website/deploy/docs/user-guide/set-up/index.html +++ b/website/deploy/docs/user-guide/set-up/index.html @@ -19,7 +19,7 @@ - + @@ -37,11 +37,10 @@ Set Up | Cloud Operations Sandbox - - + + - - + @@ -62,8 +61,8 @@ - - + + + diff --git a/website/deploy/index.html b/website/deploy/index.html index 7216caf41..edd7de04a 100644 --- a/website/deploy/index.html +++ b/website/deploy/index.html @@ -19,7 +19,7 @@ - + Cloud Operations Sandbox @@ -34,6 +34,7 @@ gtag('config', 'UA-137862890-1'); + @@ -59,7 +60,7 @@

Get started now

cloud shell @@ -71,14 +72,14 @@

Next steps

+

* Note: This is NOT an official Google product. Customers will be billed for using cloud resources when creating a sandbox cluster. - +

diff --git a/website/deploy/js/deflate.js b/website/deploy/js/deflate.js new file mode 100644 index 000000000..b452c84e9 --- /dev/null +++ b/website/deploy/js/deflate.js @@ -0,0 +1,1652 @@ +/* Copyright (C) 1999 Masanao Izumo +* Version: 1.0.1 +* LastModified: Dec 25 1999 +*/ + +/* Interface: +* data = deflate(src); +*/ +const deflate = (function () { + /* constant parameters */ + var zip_WSIZE = 32768; // Sliding Window size + var zip_STORED_BLOCK = 0; + var zip_STATIC_TREES = 1; + var zip_DYN_TREES = 2; + + /* for deflate */ + var zip_DEFAULT_LEVEL = 6; + var zip_FULL_SEARCH = true; + var zip_INBUFSIZ = 32768; // Input buffer size + var zip_INBUF_EXTRA = 64; // Extra buffer + var zip_OUTBUFSIZ = 1024 * 8; + var zip_window_size = 2 * zip_WSIZE; + var zip_MIN_MATCH = 3; + var zip_MAX_MATCH = 258; + var zip_BITS = 16; + // for SMALL_MEM + var zip_LIT_BUFSIZE = 0x2000; + var zip_HASH_BITS = 13; + // for MEDIUM_MEM + // var zip_LIT_BUFSIZE = 0x4000; + // var zip_HASH_BITS = 14; + // for BIG_MEM + // var zip_LIT_BUFSIZE = 0x8000; + // var zip_HASH_BITS = 15; + //if(zip_LIT_BUFSIZE > zip_INBUFSIZ) + // alert("error: zip_INBUFSIZ is too small"); + //if((zip_WSIZE<<1) > (1< zip_BITS-1) + // alert("error: zip_HASH_BITS is too large"); + //if(zip_HASH_BITS < 8 || zip_MAX_MATCH != 258) + // alert("error: Code too clever"); + var zip_DIST_BUFSIZE = zip_LIT_BUFSIZE; + var zip_HASH_SIZE = 1 << zip_HASH_BITS; + var zip_HASH_MASK = zip_HASH_SIZE - 1; + var zip_WMASK = zip_WSIZE - 1; + var zip_NIL = 0; // Tail of hash chains + var zip_TOO_FAR = 4096; + var zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1; + var zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD; + var zip_SMALLEST = 1; + var zip_MAX_BITS = 15; + var zip_MAX_BL_BITS = 7; + var zip_LENGTH_CODES = 29; + var zip_LITERALS = 256; + var zip_END_BLOCK = 256; + var zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES; + var zip_D_CODES = 30; + var zip_BL_CODES = 19; + var zip_REP_3_6 = 16; + var zip_REPZ_3_10 = 17; + var zip_REPZ_11_138 = 18; + var zip_HEAP_SIZE = 2 * zip_L_CODES + 1; + var zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / + zip_MIN_MATCH); + + /* variables */ + var zip_free_queue; + var zip_qhead, zip_qtail; + var zip_initflag; + var zip_outbuf = null; + var zip_outcnt, zip_outoff; + var zip_complete; + var zip_window; + var zip_d_buf; + var zip_l_buf; + var zip_prev; + var zip_bi_buf; + var zip_bi_valid; + var zip_block_start; + var zip_ins_h; + var zip_hash_head; + var zip_prev_match; + var zip_match_available; + var zip_match_length; + var zip_prev_length; + var zip_strstart; + var zip_match_start; + var zip_eofile; + var zip_lookahead; + var zip_max_chain_length; + var zip_max_lazy_match; + var zip_compr_level; + var zip_good_match; + var zip_nice_match; + var zip_dyn_ltree; + var zip_dyn_dtree; + var zip_static_ltree; + var zip_static_dtree; + var zip_bl_tree; + var zip_l_desc; + var zip_d_desc; + var zip_bl_desc; + var zip_bl_count; + var zip_heap; + var zip_heap_len; + var zip_heap_max; + var zip_depth; + var zip_length_code; + var zip_dist_code; + var zip_base_length; + var zip_base_dist; + var zip_flag_buf; + var zip_last_lit; + var zip_last_dist; + var zip_last_flags; + var zip_flags; + var zip_flag_bit; + var zip_opt_len; + var zip_static_len; + var zip_deflate_data; + var zip_deflate_pos; + + /* objects (deflate) */ + + function zip_DeflateCT() { + this.fc = 0; // frequency count or bit string + this.dl = 0; // father node in Huffman tree or length of bit string + } + + function zip_DeflateTreeDesc() { + this.dyn_tree = null; // the dynamic tree + this.static_tree = null; // corresponding static tree or NULL + this.extra_bits = null; // extra bits for each code or NULL + this.extra_base = 0; // base index for extra_bits + this.elems = 0; // max number of elements in the tree + this.max_length = 0; // max bit length for the codes + this.max_code = 0; // largest code with non zero frequency + } + + /* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ + function zip_DeflateConfiguration(a, b, c, d) { + this.good_length = a; // reduce lazy search above this match length + this.max_lazy = b; // do not perform lazy search above this match length + this.nice_length = c; // quit search above this match length + this.max_chain = d; + } + + function zip_DeflateBuffer() { + this.next = null; + this.len = 0; + this.ptr = new Array(zip_OUTBUFSIZ); + this.off = 0; + } + + /* constant tables */ + var zip_extra_lbits = [ + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]; + var zip_extra_dbits = [ + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]; + var zip_extra_blbits = [ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]; + var zip_bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + var zip_configuration_table = [ + new zip_DeflateConfiguration(0, 0, 0, 0), + new zip_DeflateConfiguration(4, 4, 8, 4), + new zip_DeflateConfiguration(4, 5, 16, 8), + new zip_DeflateConfiguration(4, 6, 32, 32), + new zip_DeflateConfiguration(4, 4, 16, 16), + new zip_DeflateConfiguration(8, 16, 32, 32), + new zip_DeflateConfiguration(8, 16, 128, 128), + new zip_DeflateConfiguration(8, 32, 128, 256), + new zip_DeflateConfiguration(32, 128, 258, 1024), + new zip_DeflateConfiguration(32, 258, 258, 4096)]; + + + /* routines (deflate) */ + + function zip_deflate_start(level) { + var i; + + if (!level) + level = zip_DEFAULT_LEVEL; + else if (level < 1) + level = 1; + else if (level > 9) + level = 9; + + zip_compr_level = level; + zip_initflag = false; + zip_eofile = false; + if (zip_outbuf != null) + return; + + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = new Array(zip_OUTBUFSIZ); + zip_window = new Array(zip_window_size); + zip_d_buf = new Array(zip_DIST_BUFSIZE); + zip_l_buf = new Array(zip_INBUFSIZ + zip_INBUF_EXTRA); + zip_prev = new Array(1 << zip_BITS); + zip_dyn_ltree = new Array(zip_HEAP_SIZE); + for (i = 0; i < zip_HEAP_SIZE; i++) + zip_dyn_ltree[i] = new zip_DeflateCT(); + zip_dyn_dtree = new Array(2 * zip_D_CODES + 1); + for (i = 0; i < 2 * zip_D_CODES + 1; i++) + zip_dyn_dtree[i] = new zip_DeflateCT(); + zip_static_ltree = new Array(zip_L_CODES + 2); + for (i = 0; i < zip_L_CODES + 2; i++) + zip_static_ltree[i] = new zip_DeflateCT(); + zip_static_dtree = new Array(zip_D_CODES); + for (i = 0; i < zip_D_CODES; i++) + zip_static_dtree[i] = new zip_DeflateCT(); + zip_bl_tree = new Array(2 * zip_BL_CODES + 1); + for (i = 0; i < 2 * zip_BL_CODES + 1; i++) + zip_bl_tree[i] = new zip_DeflateCT(); + zip_l_desc = new zip_DeflateTreeDesc(); + zip_d_desc = new zip_DeflateTreeDesc(); + zip_bl_desc = new zip_DeflateTreeDesc(); + zip_bl_count = new Array(zip_MAX_BITS + 1); + zip_heap = new Array(2 * zip_L_CODES + 1); + zip_depth = new Array(2 * zip_L_CODES + 1); + zip_length_code = new Array(zip_MAX_MATCH - zip_MIN_MATCH + 1); + zip_dist_code = new Array(512); + zip_base_length = new Array(zip_LENGTH_CODES); + zip_base_dist = new Array(zip_D_CODES); + zip_flag_buf = new Array(parseInt(zip_LIT_BUFSIZE / 8)); + } + + function zip_deflate_end() { + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = null; + zip_window = null; + zip_d_buf = null; + zip_l_buf = null; + zip_prev = null; + zip_dyn_ltree = null; + zip_dyn_dtree = null; + zip_static_ltree = null; + zip_static_dtree = null; + zip_bl_tree = null; + zip_l_desc = null; + zip_d_desc = null; + zip_bl_desc = null; + zip_bl_count = null; + zip_heap = null; + zip_depth = null; + zip_length_code = null; + zip_dist_code = null; + zip_base_length = null; + zip_base_dist = null; + zip_flag_buf = null; + } + + function zip_reuse_queue(p) { + p.next = zip_free_queue; + zip_free_queue = p; + } + + function zip_new_queue() { + var p; + + if (zip_free_queue != null) { + p = zip_free_queue; + zip_free_queue = zip_free_queue.next; + } + else + p = new zip_DeflateBuffer(); + p.next = null; + p.len = p.off = 0; + + return p; + } + + function zip_head1(i) { + return zip_prev[zip_WSIZE + i]; + } + + function zip_head2(i, val) { + return zip_prev[zip_WSIZE + i] = val; + } + + /* put_byte is used for the compressed output, put_ubyte for the + * uncompressed output. However unlzw() uses window for its + * suffix table instead of its output buffer, so it does not use put_ubyte + * (to be cleaned up). + */ + function zip_put_byte(c) { + zip_outbuf[zip_outoff + zip_outcnt++] = c; + if (zip_outoff + zip_outcnt == zip_OUTBUFSIZ) + zip_qoutbuf(); + } + + /* Output a 16 bit value, lsb first */ + function zip_put_short(w) { + w &= 0xffff; + if (zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { + zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); + zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); + } else { + zip_put_byte(w & 0xff); + zip_put_byte(w >>> 8); + } + } + + /* ========================================================================== + * Insert string s in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of s are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ + function zip_INSERT_STRING() { + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) + ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) + & zip_HASH_MASK; + zip_hash_head = zip_head1(zip_ins_h); + zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; + zip_head2(zip_ins_h, zip_strstart); + } + + /* Send a code of the given tree. c and tree must not have side effects */ + function zip_SEND_CODE(c, tree) { + zip_send_bits(tree[c].fc, tree[c].dl); + } + + /* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. dist_code[256] and dist_code[257] are never + * used. + */ + function zip_D_CODE(dist) { + return (dist < 256 ? zip_dist_code[dist] + : zip_dist_code[256 + (dist >> 7)]) & 0xff; + } + + /* ========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + function zip_SMALLER(tree, n, m) { + return tree[n].fc < tree[m].fc || + (tree[n].fc == tree[m].fc && zip_depth[n] <= zip_depth[m]); + } + + /* ========================================================================== + * read string data + */ + function zip_read_buff(buff, offset, n) { + var i; + for (i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) + buff[offset + i] = + zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; + return i; + } + + /* ========================================================================== + * Initialize the "longest match" routines for a new file + */ + function zip_lm_init() { + var j; + + /* Initialize the hash table. */ + for (j = 0; j < zip_HASH_SIZE; j++) + // zip_head2(j, zip_NIL); + zip_prev[zip_WSIZE + j] = 0; + /* prev will be initialized on the fly */ + + /* Set the default configuration parameters: + */ + zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; + zip_good_match = zip_configuration_table[zip_compr_level].good_length; + if (!zip_FULL_SEARCH) + zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; + zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; + + zip_strstart = 0; + zip_block_start = 0; + + zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); + if (zip_lookahead <= 0) { + zip_eofile = true; + zip_lookahead = 0; + return; + } + zip_eofile = false; + /* Make sure that we always have enough lookahead. This is important + * if input comes from a device such as a tty. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + + /* If lookahead < MIN_MATCH, ins_h is garbage, but this is + * not important since only literal bytes will be emitted. + */ + zip_ins_h = 0; + for (j = 0; j < zip_MIN_MATCH - 1; j++) { + // UPDATE_HASH(ins_h, window[j]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; + } + } + + /* ========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + */ + function zip_longest_match(cur_match) { + var chain_length = zip_max_chain_length; // max hash chain length + var scanp = zip_strstart; // current string + var matchp; // matched string + var len; // length of current match + var best_len = zip_prev_length; // best match length so far + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); + + var strendp = zip_strstart + zip_MAX_MATCH; + var scan_end1 = zip_window[scanp + best_len - 1]; + var scan_end = zip_window[scanp + best_len]; + + /* Do not waste too much time if we already have a good match: */ + if (zip_prev_length >= zip_good_match) + chain_length >>= 2; + + // Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead"); + + do { + // Assert(cur_match < encoder->strstart, "no future"); + matchp = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2: + */ + if (zip_window[matchp + best_len] != scan_end || + zip_window[matchp + best_len - 1] != scan_end1 || + zip_window[matchp] != zip_window[scanp] || + zip_window[++matchp] != zip_window[scanp + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scanp += 2; + matchp++; + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + } while (zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + zip_window[++scanp] == zip_window[++matchp] && + scanp < strendp); + + len = zip_MAX_MATCH - (strendp - scanp); + scanp = strendp - zip_MAX_MATCH; + + if (len > best_len) { + zip_match_start = cur_match; + best_len = len; + if (zip_FULL_SEARCH) { + if (len >= zip_MAX_MATCH) break; + } else { + if (len >= zip_nice_match) break; + } + + scan_end1 = zip_window[scanp + best_len - 1]; + scan_end = zip_window[scanp + best_len]; + } + } while ((cur_match = zip_prev[cur_match & zip_WMASK]) > limit + && --chain_length != 0); + + return best_len; + } + + /* ========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead, and sets eofile if end of input file. + * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 + * OUT assertions: at least one byte has been read, or eofile is set; + * file reads are performed for at least two bytes (required for the + * translate_eol option). + */ + function zip_fill_window() { + var n, m; + + // Amount of free space at the end of the window. + var more = zip_window_size - zip_lookahead - zip_strstart; + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (more == -1) { + /* Very unlikely, but possible on 16 bit machine if strstart == 0 + * and lookahead == 1 (input done one byte at time) + */ + more--; + } else if (zip_strstart >= zip_WSIZE + zip_MAX_DIST) { + /* By the IN assertion, the window is not empty so we can't confuse + * more == 0 with more == 64K on a 16 bit machine. + */ + // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM"); + + // System.arraycopy(window, WSIZE, window, 0, WSIZE); + for (n = 0; n < zip_WSIZE; n++) + zip_window[n] = zip_window[n + zip_WSIZE]; + + zip_match_start -= zip_WSIZE; + zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */ + zip_block_start -= zip_WSIZE; + + for (n = 0; n < zip_HASH_SIZE; n++) { + m = zip_head1(n); + zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + for (n = 0; n < zip_WSIZE; n++) { + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + m = zip_prev[n]; + zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + more += zip_WSIZE; + } + // At this point, more >= 2 + if (!zip_eofile) { + n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); + if (n <= 0) + zip_eofile = true; + else + zip_lookahead += n; + } + } + + /* ========================================================================== + * Processes a new input file and return its compressed length. This + * function does not perform lazy evaluationof matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + function zip_deflate_fast() { + while (zip_lookahead != 0 && zip_qhead == null) { + var flush; // set if current block must be flushed + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (zip_hash_head != zip_NIL && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + } + if (zip_match_length >= zip_MIN_MATCH) { + // check_match(strstart, match_start, match_length); + + flush = zip_ct_tally(zip_strstart - zip_match_start, + zip_match_length - zip_MIN_MATCH); + zip_lookahead -= zip_match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (zip_match_length <= zip_max_lazy_match) { + zip_match_length--; // string at strstart already in hash table + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since + * the next lookahead bytes will be emitted as literals. + */ + } while (--zip_match_length != 0); + zip_strstart++; + } else { + zip_strstart += zip_match_length; + zip_match_length = 0; + zip_ins_h = zip_window[zip_strstart] & 0xff; + // UPDATE_HASH(ins_h, window[strstart + 1]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK; + + //#if MIN_MATCH != 3 + // Call UPDATE_HASH() MIN_MATCH-3 more times + //#endif + + } + } else { + /* No match, output a literal byte */ + flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff); + zip_lookahead--; + zip_strstart++; + } + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + } + + function zip_deflate_better() { + /* Process the input block. */ + while (zip_lookahead != 0 && zip_qhead == null) { + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + */ + zip_prev_length = zip_match_length; + zip_prev_match = zip_match_start; + zip_match_length = zip_MIN_MATCH - 1; + + if (zip_hash_head != zip_NIL && + zip_prev_length < zip_max_lazy_match && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) + zip_match_length = zip_lookahead; + + /* Ignore a length 3 match if it is too distant: */ + if (zip_match_length == zip_MIN_MATCH && + zip_strstart - zip_match_start > zip_TOO_FAR) { + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + zip_match_length--; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (zip_prev_length >= zip_MIN_MATCH && + zip_match_length <= zip_prev_length) { + var flush; // set if current block must be flushed + + // check_match(strstart - 1, prev_match, prev_length); + flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, + zip_prev_length - zip_MIN_MATCH); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. + */ + zip_lookahead -= zip_prev_length - 1; + zip_prev_length -= 2; + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since the + * next lookahead bytes will always be emitted as literals. + */ + } while (--zip_prev_length != 0); + zip_match_available = 0; + zip_match_length = zip_MIN_MATCH - 1; + zip_strstart++; + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + } else if (zip_match_available != 0) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + if (zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + zip_strstart++; + zip_lookahead--; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + zip_match_available = 1; + zip_strstart++; + zip_lookahead--; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) + zip_fill_window(); + } + } + + function zip_init_deflate() { + if (zip_eofile) + return; + zip_bi_buf = 0; + zip_bi_valid = 0; + zip_ct_init(); + zip_lm_init(); + + zip_qhead = null; + zip_outcnt = 0; + zip_outoff = 0; + + if (zip_compr_level <= 3) { + zip_prev_length = zip_MIN_MATCH - 1; + zip_match_length = 0; + } + else { + zip_match_length = zip_MIN_MATCH - 1; + zip_match_available = 0; + } + + zip_complete = false; + } + + /* ========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + function zip_deflate_internal(buff, off, buff_size) { + var n; + + if (!zip_initflag) { + zip_init_deflate(); + zip_initflag = true; + if (zip_lookahead == 0) { // empty + zip_complete = true; + return 0; + } + } + + if ((n = zip_qcopy(buff, off, buff_size)) == buff_size) + return buff_size; + + if (zip_complete) + return n; + + if (zip_compr_level <= 3) // optimized for speed + zip_deflate_fast(); + else + zip_deflate_better(); + if (zip_lookahead == 0) { + if (zip_match_available != 0) + zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); + zip_flush_block(1); + zip_complete = true; + } + return n + zip_qcopy(buff, n + off, buff_size - n); + } + + function zip_qcopy(buff, off, buff_size) { + var n, i, j; + + n = 0; + while (zip_qhead != null && n < buff_size) { + i = buff_size - n; + if (i > zip_qhead.len) + i = zip_qhead.len; + // System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; + + zip_qhead.off += i; + zip_qhead.len -= i; + n += i; + if (zip_qhead.len == 0) { + var p; + p = zip_qhead; + zip_qhead = zip_qhead.next; + zip_reuse_queue(p); + } + } + + if (n == buff_size) + return n; + + if (zip_outoff < zip_outcnt) { + i = buff_size - n; + if (i > zip_outcnt - zip_outoff) + i = zip_outcnt - zip_outoff; + // System.arraycopy(outbuf, outoff, buff, off + n, i); + for (j = 0; j < i; j++) + buff[off + n + j] = zip_outbuf[zip_outoff + j]; + zip_outoff += i; + n += i; + if (zip_outcnt == zip_outoff) + zip_outcnt = zip_outoff = 0; + } + return n; + } + + /* ========================================================================== + * Allocate the match buffer, initialize the various tables and save the + * location of the internal file attribute (ascii/binary) and method + * (DEFLATE/STORE). + */ + function zip_ct_init() { + var n; // iterates over tree elements + var bits; // bit counter + var length; // length value + var code; // code value + var dist; // distance index + + if (zip_static_dtree[0].dl != 0) return; // ct_init already called + + zip_l_desc.dyn_tree = zip_dyn_ltree; + zip_l_desc.static_tree = zip_static_ltree; + zip_l_desc.extra_bits = zip_extra_lbits; + zip_l_desc.extra_base = zip_LITERALS + 1; + zip_l_desc.elems = zip_L_CODES; + zip_l_desc.max_length = zip_MAX_BITS; + zip_l_desc.max_code = 0; + + zip_d_desc.dyn_tree = zip_dyn_dtree; + zip_d_desc.static_tree = zip_static_dtree; + zip_d_desc.extra_bits = zip_extra_dbits; + zip_d_desc.extra_base = 0; + zip_d_desc.elems = zip_D_CODES; + zip_d_desc.max_length = zip_MAX_BITS; + zip_d_desc.max_code = 0; + + zip_bl_desc.dyn_tree = zip_bl_tree; + zip_bl_desc.static_tree = null; + zip_bl_desc.extra_bits = zip_extra_blbits; + zip_bl_desc.extra_base = 0; + zip_bl_desc.elems = zip_BL_CODES; + zip_bl_desc.max_length = zip_MAX_BL_BITS; + zip_bl_desc.max_code = 0; + + // Initialize the mapping length (0..255) -> length code (0..28) + length = 0; + for (code = 0; code < zip_LENGTH_CODES - 1; code++) { + zip_base_length[code] = length; + for (n = 0; n < (1 << zip_extra_lbits[code]); n++) + zip_length_code[length++] = code; + } + // Assert (length == 256, "ct_init: length != 256"); + + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + zip_length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + zip_base_dist[code] = dist; + for (n = 0; n < (1 << zip_extra_dbits[code]); n++) { + zip_dist_code[dist++] = code; + } + } + // Assert (dist == 256, "ct_init: dist != 256"); + dist >>= 7; // from now on, all distances are divided by 128 + for (; code < zip_D_CODES; code++) { + zip_base_dist[code] = dist << 7; + for (n = 0; n < (1 << (zip_extra_dbits[code] - 7)); n++) + zip_dist_code[256 + dist++] = code; + } + // Assert (dist == 256, "ct_init: 256+dist != 512"); + + // Construct the codes of the static literal tree + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + n = 0; + while (n <= 143) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } + while (n <= 255) { zip_static_ltree[n++].dl = 9; zip_bl_count[9]++; } + while (n <= 279) { zip_static_ltree[n++].dl = 7; zip_bl_count[7]++; } + while (n <= 287) { zip_static_ltree[n++].dl = 8; zip_bl_count[8]++; } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); + + /* The static distance tree is trivial: */ + for (n = 0; n < zip_D_CODES; n++) { + zip_static_dtree[n].dl = 5; + zip_static_dtree[n].fc = zip_bi_reverse(n, 5); + } + + // Initialize the first block of the first file: + zip_init_block(); + } + + /* ========================================================================== + * Initialize a new block. + */ + function zip_init_block() { + var n; // iterates over tree elements + + // Initialize the trees. + for (n = 0; n < zip_L_CODES; n++) zip_dyn_ltree[n].fc = 0; + for (n = 0; n < zip_D_CODES; n++) zip_dyn_dtree[n].fc = 0; + for (n = 0; n < zip_BL_CODES; n++) zip_bl_tree[n].fc = 0; + + zip_dyn_ltree[zip_END_BLOCK].fc = 1; + zip_opt_len = zip_static_len = 0; + zip_last_lit = zip_last_dist = zip_last_flags = 0; + zip_flags = 0; + zip_flag_bit = 1; + } + + /* ========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + function zip_pqdownheap( + tree, // the tree to restore + k) { // node to move down + var v = zip_heap[k]; + var j = k << 1; // left son of k + + while (j <= zip_heap_len) { + // Set j to the smallest of the two sons: + if (j < zip_heap_len && + zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) + j++; + + // Exit if v is smaller than both sons + if (zip_SMALLER(tree, v, zip_heap[j])) + break; + + // Exchange v with the smallest son + zip_heap[k] = zip_heap[j]; + k = j; + + // And continue down the tree, setting j to the left son of k + j <<= 1; + } + zip_heap[k] = v; + } + + /* ========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + function zip_gen_bitlen(desc) { // the tree descriptor + var tree = desc.dyn_tree; + var extra = desc.extra_bits; + var base = desc.extra_base; + var max_code = desc.max_code; + var max_length = desc.max_length; + var stree = desc.static_tree; + var h; // heap index + var n, m; // iterate over the tree elements + var bits; // bit length + var xbits; // extra bits + var f; // frequency + var overflow = 0; // number of elements with bit length too large + + for (bits = 0; bits <= zip_MAX_BITS; bits++) + zip_bl_count[bits] = 0; + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap + + for (h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { + n = zip_heap[h]; + bits = tree[tree[n].dl].dl + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n].dl = bits; + // We overwrite tree[n].dl which is no longer needed + + if (n > max_code) + continue; // not a leaf node + + zip_bl_count[bits]++; + xbits = 0; + if (n >= base) + xbits = extra[n - base]; + f = tree[n].fc; + zip_opt_len += f * (bits + xbits); + if (stree != null) + zip_static_len += f * (stree[n].dl + xbits); + } + if (overflow == 0) + return; + + // This happens for example on obj2 and pic of the Calgary corpus + + // Find the first bit length which could increase: + do { + bits = max_length - 1; + while (zip_bl_count[bits] == 0) + bits--; + zip_bl_count[bits]--; // move one leaf down the tree + zip_bl_count[bits + 1] += 2; // move one overflow item as its brother + zip_bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits != 0; bits--) { + n = zip_bl_count[bits]; + while (n != 0) { + m = zip_heap[--h]; + if (m > max_code) + continue; + if (tree[m].dl != bits) { + zip_opt_len += (bits - tree[m].dl) * tree[m].fc; + tree[m].fc = bits; + } + n--; + } + } + } + + /* ========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + function zip_gen_codes(tree, // the tree to decorate + max_code) { // largest code with non zero frequency + var next_code = new Array(zip_MAX_BITS + 1); // next code value for each bit length + var code = 0; // running code value + var bits; // bit index + var n; // code index + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= zip_MAX_BITS; bits++) { + code = ((code + zip_bl_count[bits - 1]) << 1); + next_code[bits] = code; + } + + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + // Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<> 1; n >= 1; n--) + zip_pqdownheap(tree, n); + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + do { + n = zip_heap[zip_SMALLEST]; + zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; + zip_pqdownheap(tree, zip_SMALLEST); + + m = zip_heap[zip_SMALLEST]; // m = node of next least frequency + + // keep the nodes sorted by frequency + zip_heap[--zip_heap_max] = n; + zip_heap[--zip_heap_max] = m; + + // Create a new node father of n and m + tree[node].fc = tree[n].fc + tree[m].fc; + // depth[node] = (char)(MAX(depth[n], depth[m]) + 1); + if (zip_depth[n] > zip_depth[m] + 1) + zip_depth[node] = zip_depth[n]; + else + zip_depth[node] = zip_depth[m] + 1; + tree[n].dl = tree[m].dl = node; + + // and insert the new node in the heap + zip_heap[zip_SMALLEST] = node++; + zip_pqdownheap(tree, zip_SMALLEST); + + } while (zip_heap_len >= 2); + + zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + zip_gen_bitlen(desc); + + // The field len is now set, we can generate the bit codes + zip_gen_codes(tree, max_code); + } + + /* ========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. Updates opt_len to take into account the repeat + * counts. (The contribution of the bit length codes will be added later + * during the construction of bl_tree.) + */ + function zip_scan_tree(tree,// the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + tree[max_code + 1].dl = 0xffff; // guard + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) + continue; + else if (count < min_count) + zip_bl_tree[curlen].fc += count; + else if (curlen != 0) { + if (curlen != prevlen) + zip_bl_tree[curlen].fc++; + zip_bl_tree[zip_REP_3_6].fc++; + } else if (count <= 10) + zip_bl_tree[zip_REPZ_3_10].fc++; + else + zip_bl_tree[zip_REPZ_11_138].fc++; + count = 0; prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + + /* ========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + function zip_send_tree(tree, // the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + /* tree[max_code+1].dl = -1; */ /* guard already set */ + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen == nextlen) { + continue; + } else if (count < min_count) { + do { zip_SEND_CODE(curlen, zip_bl_tree); } while (--count != 0); + } else if (curlen != 0) { + if (curlen != prevlen) { + zip_SEND_CODE(curlen, zip_bl_tree); + count--; + } + // Assert(count >= 3 && count <= 6, " 3_6?"); + zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); + zip_send_bits(count - 3, 2); + } else if (count <= 10) { + zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); + zip_send_bits(count - 3, 3); + } else { + zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); + zip_send_bits(count - 11, 7); + } + count = 0; + prevlen = curlen; + if (nextlen == 0) { + max_count = 138; + min_count = 3; + } else if (curlen == nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + } + + /* ========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + function zip_build_bl_tree() { + var max_blindex; // index of last bit length code of non zero freq + + // Determine the bit length frequencies for literal and distance trees + zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); + zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); + + // Build the bit length tree: + zip_build_tree(zip_bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = zip_BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (zip_bl_tree[zip_bl_order[max_blindex]].dl != 0) break; + } + /* Update opt_len to include the bit length tree and counts */ + zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + // Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + return max_blindex; + } + + /* ========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + function zip_send_all_trees(lcodes, dcodes, blcodes) { // number of codes for each tree + var rank; // index in bl_order + + // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + // Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + // Tracev((stderr, "\nbl counts: ")); + zip_send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt + zip_send_bits(dcodes - 1, 5); + zip_send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt + for (rank = 0; rank < blcodes; rank++) { + // Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); + } + + // send the literal tree + zip_send_tree(zip_dyn_ltree, lcodes - 1); + + // send the distance tree + zip_send_tree(zip_dyn_dtree, dcodes - 1); + } + + /* ========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + function zip_flush_block(eof) { // true if this is the last block for a file + var opt_lenb, static_lenb; // opt_len and static_len in bytes + var max_blindex; // index of last bit length code of non zero freq + var stored_len; // length of input block + + stored_len = zip_strstart - zip_block_start; + zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items + + // Construct the literal and distance trees + zip_build_tree(zip_l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + zip_build_tree(zip_d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = zip_build_bl_tree(); + + // Determine the best encoding. Compute first the block length in bytes + opt_lenb = (zip_opt_len + 3 + 7) >> 3; + static_lenb = (zip_static_len + 3 + 7) >> 3; + + // Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", + // opt_lenb, encoder->opt_len, + // static_lenb, encoder->static_len, stored_len, + // encoder->last_lit, encoder->last_dist)); + + if (static_lenb <= opt_lenb) + opt_lenb = static_lenb; + if (stored_len + 4 <= opt_lenb // 4: two words for the lengths + && zip_block_start >= 0) { + var i; + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); /* send block type */ + zip_bi_windup(); /* align on byte boundary */ + zip_put_short(stored_len); + zip_put_short(~stored_len); + + // copy block + /* + p = &window[block_start]; + for(i = 0; i < stored_len; i++) + put_byte(p[i]); + */ + for (i = 0; i < stored_len; i++) + zip_put_byte(zip_window[zip_block_start + i]); + + } else if (static_lenb == opt_lenb) { + zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); + zip_compress_block(zip_static_ltree, zip_static_dtree); + } else { + zip_send_bits((zip_DYN_TREES << 1) + eof, 3); + zip_send_all_trees(zip_l_desc.max_code + 1, + zip_d_desc.max_code + 1, + max_blindex + 1); + zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); + } + + zip_init_block(); + + if (eof != 0) + zip_bi_windup(); + } + + /* ========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + function zip_ct_tally( + dist, // distance of matched string + lc) { // match length-MIN_MATCH or unmatched char (if dist==0) + zip_l_buf[zip_last_lit++] = lc; + if (dist == 0) { + // lc is the unmatched char + zip_dyn_ltree[lc].fc++; + } else { + // Here, lc is the match length - MIN_MATCH + dist--; // dist = match distance - 1 + // Assert((ush)dist < (ush)MAX_DIST && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match"); + + zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; + zip_dyn_dtree[zip_D_CODE(dist)].fc++; + + zip_d_buf[zip_last_dist++] = dist; + zip_flags |= zip_flag_bit; + } + zip_flag_bit <<= 1; + + // Output the flags if they fill a byte + if ((zip_last_lit & 7) == 0) { + zip_flag_buf[zip_last_flags++] = zip_flags; + zip_flags = 0; + zip_flag_bit = 1; + } + // Try to guess if it is profitable to stop the current block here + if (zip_compr_level > 2 && (zip_last_lit & 0xfff) == 0) { + // Compute an upper bound for the compressed length + var out_length = zip_last_lit * 8; + var in_length = zip_strstart - zip_block_start; + var dcode; + + for (dcode = 0; dcode < zip_D_CODES; dcode++) { + out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); + } + out_length >>= 3; + // Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", + // encoder->last_lit, encoder->last_dist, in_length, out_length, + // 100L - out_length*100L/in_length)); + if (zip_last_dist < parseInt(zip_last_lit / 2) && + out_length < parseInt(in_length / 2)) + return true; + } + return (zip_last_lit == zip_LIT_BUFSIZE - 1 || + zip_last_dist == zip_DIST_BUFSIZE); + /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + } + + /* ========================================================================== + * Send the block data compressed using the given Huffman trees + */ + function zip_compress_block( + ltree, // literal tree + dtree) { // distance tree + var dist; // distance of matched string + var lc; // match length or unmatched char (if dist == 0) + var lx = 0; // running index in l_buf + var dx = 0; // running index in d_buf + var fx = 0; // running index in flag_buf + var flag = 0; // current flags + var code; // the code to send + var extra; // number of extra bits to send + + if (zip_last_lit != 0) do { + if ((lx & 7) == 0) + flag = zip_flag_buf[fx++]; + lc = zip_l_buf[lx++] & 0xff; + if ((flag & 1) == 0) { + zip_SEND_CODE(lc, ltree); /* send a literal byte */ + // Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + // Here, lc is the match length - MIN_MATCH + code = zip_length_code[lc]; + zip_SEND_CODE(code + zip_LITERALS + 1, ltree); // send the length code + extra = zip_extra_lbits[code]; + if (extra != 0) { + lc -= zip_base_length[code]; + zip_send_bits(lc, extra); // send the extra length bits + } + dist = zip_d_buf[dx++]; + // Here, dist is the match distance - 1 + code = zip_D_CODE(dist); + // Assert (code < D_CODES, "bad d_code"); + + zip_SEND_CODE(code, dtree); // send the distance code + extra = zip_extra_dbits[code]; + if (extra != 0) { + dist -= zip_base_dist[code]; + zip_send_bits(dist, extra); // send the extra distance bits + } + } // literal or match pair ? + flag >>= 1; + } while (lx < zip_last_lit); + + zip_SEND_CODE(zip_END_BLOCK, ltree); + } + + /* ========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + var zip_Buf_size = 16; // bit size of bi_buf + function zip_send_bits( + value, // value to send + length) { // number of bits + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (zip_bi_valid > zip_Buf_size - length) { + zip_bi_buf |= (value << zip_bi_valid); + zip_put_short(zip_bi_buf); + zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); + zip_bi_valid += length - zip_Buf_size; + } else { + zip_bi_buf |= value << zip_bi_valid; + zip_bi_valid += length; + } + } + + /* ========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + function zip_bi_reverse( + code, // the value to invert + len) { // its bit length + var res = 0; + do { + res |= code & 1; + code >>= 1; + res <<= 1; + } while (--len > 0); + return res >> 1; + } + + /* ========================================================================== + * Write out any remaining bits in an incomplete byte. + */ + function zip_bi_windup() { + if (zip_bi_valid > 8) { + zip_put_short(zip_bi_buf); + } else if (zip_bi_valid > 0) { + zip_put_byte(zip_bi_buf); + } + zip_bi_buf = 0; + zip_bi_valid = 0; + } + + function zip_qoutbuf() { + if (zip_outcnt != 0) { + var q, i; + q = zip_new_queue(); + if (zip_qhead == null) + zip_qhead = zip_qtail = q; + else + zip_qtail = zip_qtail.next = q; + q.len = zip_outcnt - zip_outoff; + // System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len); + for (i = 0; i < q.len; i++) + q.ptr[i] = zip_outbuf[zip_outoff + i]; + zip_outcnt = zip_outoff = 0; + } + } + + return function deflate(str, level) { + var i, j; + + zip_deflate_data = str; + zip_deflate_pos = 0; + if (typeof level == "undefined") + level = zip_DEFAULT_LEVEL; + zip_deflate_start(level); + + var buff = new Array(1024); + var aout = []; + while ((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { + var cbuf = new Array(i); + for (j = 0; j < i; j++) { + cbuf[j] = String.fromCharCode(buff[j]); + } + aout[aout.length] = cbuf.join(""); + } + zip_deflate_data = null; // G.C. + return aout.join(""); + }; +})(); \ No newline at end of file diff --git a/website/deploy/js/main.min.5c74b870c6953931a705f390a49c7e4c0a842ec5c83b24354758dd674343ed0d.js b/website/deploy/js/main.min.5c74b870c6953931a705f390a49c7e4c0a842ec5c83b24354758dd674343ed0d.js new file mode 100644 index 000000000..cedbd3a82 --- /dev/null +++ b/website/deploy/js/main.min.5c74b870c6953931a705f390a49c7e4c0a842ec5c83b24354758dd674343ed0d.js @@ -0,0 +1,17 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +(function(a){'use strict';a(function(){a('[data-toggle="tooltip"]').tooltip(),a('[data-toggle="popover"]').popover(),a('.popover-dismiss').popover({trigger:'focus'})});function b(a){return a.offset().top+a.outerHeight()}a(function(){var c=a(".js-td-cover"),e,f,d;if(!c.length)return;e=b(c),f=a('.js-navbar-scroll').offset().top,d=Math.ceil(a('.js-navbar-scroll').outerHeight()),e-f',a.href='#'+b.id,b.insertAdjacentElement('beforeend',a),b.addEventListener('mouseenter',function(){a.style.visibility='initial'}),b.addEventListener('mouseleave',function(){a.style.visibility='hidden'})}})})}(jQuery),function(a){'use strict';var b={init:function(){a(document).ready(function(){a(document).on('keypress','.td-search-input',function(d){var b,c;if(d.keyCode!==13)return;return b=a(this).val(),c="/search/?q="+b,document.location=c,!1})})}};b.init()}(jQuery) \ No newline at end of file diff --git a/website/deploy/js/tabpane-persist.js b/website/deploy/js/tabpane-persist.js new file mode 100644 index 000000000..bb762e1eb --- /dev/null +++ b/website/deploy/js/tabpane-persist.js @@ -0,0 +1,35 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +if (typeof Storage !== 'undefined') { + const activeLanguage = localStorage.getItem('active_language'); + if (activeLanguage) { + document + .querySelectorAll('.tab-' + activeLanguage) + .forEach((element) => { + $('#' + element.id).tab('show'); + }); + } +} +function handleClick(language) { + if (typeof Storage !== 'undefined') { + localStorage.setItem('active_language', language); + document.querySelectorAll('.tab-' + language) + .forEach((element) => { + $('#' + element.id).tab('show'); + }); + } +} diff --git a/website/deploy/scss/main.min.82a704dc8bf35cfc5b5ef78794ae97f94c8489182871a483bb3515c771738949.css b/website/deploy/scss/main.min.82a704dc8bf35cfc5b5ef78794ae97f94c8489182871a483bb3515c771738949.css new file mode 100644 index 000000000..33894f0d4 --- /dev/null +++ b/website/deploy/scss/main.min.82a704dc8bf35cfc5b5ef78794ae97f94c8489182871a483bb3515c771738949.css @@ -0,0 +1,7 @@ +@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,700,700i";@import "https://cdn.jsdelivr.net/gh/rastikerdar/vazir-font@v27.0.1/dist/font-face.css";@import "https://fonts.googleapis.com/css2?family=Rubik:wght@300;400;500;600;700&display=swap";@import "https://fonts.googleapis.com/css2?family=Tajawal:wght@300;400;500;700&display=swap";@fa-font-path:"../webfonts";/*!* Bootstrap v4.5.3 (https://getbootstrap.com/) +* Copyright 2011-2020 The Bootstrap Authors +* Copyright 2011-2020 Twitter, Inc. +* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)*/:root{--blue:#72A1E5;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#BA5A31;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#888;--gray-dark:#333;--primary:#30638E;--secondary:#FFA630;--success:#3772FF;--info:#C0E0DE;--warning:#ED6A5A;--danger:#ED6A5A;--light:#D3F3EE;--dark:#403F4C;--breakpoint-xs:0;--breakpoint-sm:576px;--breakpoint-md:768px;--breakpoint-lg:992px;--breakpoint-xl:1200px;--font-family-sans-serif:"Open Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--font-family-monospace:SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace}*,*::before,*::after{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;font-size:1rem;font-weight:400;line-height:1.5;color:#222;text-align:left;background-color:#fff}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.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;-webkit-text-decoration-skip-ink:none;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:.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:-.25em}sup{top:-.5em}a{color:#3176d9;text-decoration:none;background-color:initial}a:hover{color:#1e53a0;text-decoration:none}a:not([href]):not([class]){color:inherit;text-decoration:none}a:not([href]):not([class]):hover{color:inherit;text-decoration:none}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;-ms-overflow-style:scrollbar}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:.75rem;padding-bottom:.75rem;color:#888;text-align:left;caption-side:bottom}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.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}[role=button]{cursor:pointer}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]{box-sizing:border-box;padding:0}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:.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:.5rem;font-weight:500;line-height:1.2}h1,.h1{font-size:2.25rem}h2,.h2{font-size:2rem}h3,.h3{font-size:1.5rem}h4,.h4{font-size:1.35rem}h5,.h5{font-size:1.15rem}h6,.h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:3rem;font-weight:700;line-height:1.2}.display-2{font-size:2.5rem;font-weight:700;line-height:1.2}.display-3{font-size:2rem;font-weight:700;line-height:1.2}.display-4{font-size:1.75rem;font-weight:700;line-height:1.2}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}small,.small{font-size:80%;font-weight:400}mark,.mark{padding:.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:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#888}.blockquote-footer::before{content:"\2014\00A0"}.img-fluid,.td-content img{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #dee2e6;border-radius:.25rem;box-shadow:0 1px 2px rgba(0,0,0,.075);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#888}code{font-size:87.5%;color:#c97300;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:87.5%;color:#fff;background-color:#222;border-radius:.2rem;box-shadow:inset 0 -.1rem rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;font-size:87.5%;color:#222}pre code{font-size:inherit;color:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-xl,.container-lg,.container-md,.container-sm{width:100%;padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media(min-width:576px){.container-sm,.container{max-width:540px}}@media(min-width:768px){.container-md,.container-sm,.container{max-width:720px}}@media(min-width:992px){.container-lg,.container-md,.container-sm,.container{max-width:960px}}@media(min-width:1200px){.container-xl,.container-lg,.container-md,.container-sm,.container{max-width:1140px}}.row{display:flex;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-xl,.col-xl-auto,.col-xl-12,.col-xl-11,.col-xl-10,.col-xl-9,.col-xl-8,.col-xl-7,.col-xl-6,.col-xl-5,.col-xl-4,.col-xl-3,.col-xl-2,.col-xl-1,.col-lg,.col-lg-auto,.col-lg-12,.col-lg-11,.col-lg-10,.col-lg-9,.col-lg-8,.col-lg-7,.col-lg-6,.col-lg-5,.col-lg-4,.col-lg-3,.col-lg-2,.col-lg-1,.col-md,.col-md-auto,.col-md-12,.col-md-11,.col-md-10,.col-md-9,.col-md-8,.col-md-7,.col-md-6,.col-md-5,.col-md-4,.col-md-3,.col-md-2,.col-md-1,.col-sm,.col-sm-auto,.col-sm-12,.col-sm-11,.col-sm-10,.col-sm-9,.col-sm-8,.col-sm-7,.col-sm-6,.col-sm-5,.col-sm-4,.col-sm-3,.col-sm-2,.col-sm-1,.col,.col-auto,.col-12,.col-11,.col-10,.col-9,.col-8,.col-7,.col-6,.col-5,.col-4,.col-3,.col-2,.col-1{position:relative;width:100%;padding-right:15px;padding-left:15px}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-auto{flex:none;width:auto;max-width:100%}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media(min-width:576px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-auto{flex:none;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media(min-width:768px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-auto{flex:none;width:auto;max-width:100%}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media(min-width:992px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-auto{flex:none;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media(min-width:1200px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.33333333%;max-width:33.33333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-auto{flex:none;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table,.td-content>table,.td-box .row.section>table{width:100%;margin-bottom:1rem;color:#222}.table th,.td-content>table th,.td-box .row.section>table th,.table td,.td-content>table td,.td-box .row.section>table td{padding:.75rem;vertical-align:top;border-top:1px solid #dee2e6}.table thead th,.td-content>table thead th,.td-box .row.section>table thead th{vertical-align:bottom;border-bottom:2px solid #dee2e6}.table tbody+tbody,.td-content>table tbody+tbody,.td-box .row.section>table tbody+tbody{border-top:2px solid #dee2e6}.table-sm th,.table-sm td{padding:.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),.td-content>table tbody tr:nth-of-type(odd),.td-box .row.section>table tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,5%)}.table-hover tbody tr:hover{color:#222;background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>th,.table-primary>td{background-color:#c5d3df}.table-primary th,.table-primary td,.table-primary thead th,.table-primary tbody+tbody{border-color:#93aec4}.table-hover .table-primary:hover{background-color:#b5c7d6}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b5c7d6}.table-secondary,.table-secondary>th,.table-secondary>td{background-color:#ffe6c5}.table-secondary th,.table-secondary td,.table-secondary thead th,.table-secondary tbody+tbody{border-color:#ffd193}.table-hover .table-secondary:hover{background-color:#ffdbac}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#ffdbac}.table-success,.table-success>th,.table-success>td{background-color:#c7d8ff}.table-success th,.table-success td,.table-success thead th,.table-success tbody+tbody{border-color:#97b6ff}.table-hover .table-success:hover{background-color:#aec6ff}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#aec6ff}.table-info,.table-info>th,.table-info>td{background-color:#edf6f6}.table-info th,.table-info td,.table-info thead th,.table-info tbody+tbody{border-color:#deefee}.table-hover .table-info:hover{background-color:#dceeee}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#dceeee}.table-warning,.table-warning>th,.table-warning>td{background-color:#fad5d1}.table-warning th,.table-warning td,.table-warning thead th,.table-warning tbody+tbody{border-color:#f6b2a9}.table-hover .table-warning:hover{background-color:#f8c0ba}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f8c0ba}.table-danger,.table-danger>th,.table-danger>td{background-color:#fad5d1}.table-danger th,.table-danger td,.table-danger thead th,.table-danger tbody+tbody{border-color:#f6b2a9}.table-hover .table-danger:hover{background-color:#f8c0ba}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f8c0ba}.table-light,.table-light>th,.table-light>td{background-color:#f3fcfa}.table-light th,.table-light td,.table-light thead th,.table-light tbody+tbody{border-color:#e8f9f6}.table-hover .table-light:hover{background-color:#dff7f2}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#dff7f2}.table-dark,.table-dark>th,.table-dark>td{background-color:#cac9cd}.table-dark th,.table-dark td,.table-dark thead th,.table-dark tbody+tbody{border-color:#9c9ba2}.table-hover .table-dark:hover{background-color:#bdbcc1}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#bdbcc1}.table-active,.table-active>th,.table-active>td{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.table .thead-dark th,.td-content>table .thead-dark th,.td-box .row.section>table .thead-dark th{color:#fff;background-color:#333;border-color:#464646}.table .thead-light th,.td-content>table .thead-light th,.td-box .row.section>table .thead-light th{color:#495057;background-color:#eee;border-color:#dee2e6}.table-dark{color:#fff;background-color:#333}.table-dark th,.table-dark td,.table-dark thead th{border-color:#464646}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd),.td-content>table.table-dark tbody tr:nth-of-type(odd),.td-box .row.section>table.table-dark tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,5%)}.table-dark.table-hover tbody tr:hover{color:#fff;background-color:rgba(255,255,255,.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,.td-content>table,.td-box .row.section>table{display:block;width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive>.table-bordered,.td-content>table>.table-bordered,.td-box .row.section>table>.table-bordered{border:0}.form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border-radius:.25rem;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:initial;border:0}.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.form-control:focus{color:#495057;background-color:#fff;border-color:#6fa3ce;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(48,99,142,.25)}.form-control::-moz-placeholder{color:#888;opacity:1}.form-control:-ms-input-placeholder{color:#888;opacity:1}.form-control::placeholder{color:#888;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#eee;opacity:1}input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}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(.375rem + 1px);padding-bottom:calc(.375rem + 1px);margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + 1px);padding-bottom:calc(.5rem + 1px);font-size:1.25rem;line-height:1.5}.col-form-label-sm{padding-top:calc(.25rem + 1px);padding-bottom:calc(.25rem + 1px);font-size:.875rem;line-height:1.5}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;font-size:1rem;line-height:1.5;color:#222;background-color:initial;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 + .5rem + 2px);padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.form-control-lg{height:calc(1.5em + 1rem + 2px);padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}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:.25rem}.form-row{display:flex;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:.3rem;margin-left:-1.25rem}.form-check-input[disabled]~.form-check-label,.form-check-input:disabled~.form-check-label{color:#888}.form-check-label{margin-bottom:0}.form-check-inline{display:inline-flex;align-items:center;padding-left:0;margin-right:.75rem}.form-check-inline .form-check-input{position:static;margin-top:0;margin-right:.3125rem;margin-left:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#3772ff}.valid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(55,114,255,.9);border-radius:.25rem}.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip,.is-valid~.valid-feedback,.is-valid~.valid-tooltip{display:block}.was-validated .form-control:valid,.form-control.is-valid{border-color:#3772ff;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%233772FF' 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:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:valid:focus,.form-control.is-valid:focus{border-color:#3772ff;box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .custom-select:valid,.custom-select.is-valid{border-color:#3772ff;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%233772FF' 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(.75em + .375rem)calc(.75em + .375rem)}.was-validated .custom-select:valid:focus,.custom-select.is-valid:focus{border-color:#3772ff;box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.was-validated .form-check-input:valid~.form-check-label,.form-check-input.is-valid~.form-check-label{color:#3772ff}.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:#3772ff}.was-validated .custom-control-input:valid~.custom-control-label::before,.custom-control-input.is-valid~.custom-control-label::before{border-color:#3772ff}.was-validated .custom-control-input:valid:checked~.custom-control-label::before,.custom-control-input.is-valid:checked~.custom-control-label::before{border-color:#6a96ff;background:#6a96ff linear-gradient(180deg,#80a6ff,#6a96ff)repeat-x}.was-validated .custom-control-input:valid:focus~.custom-control-label::before,.custom-control-input.is-valid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(55,114,255,.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:#3772ff}.was-validated .custom-file-input:valid~.custom-file-label,.custom-file-input.is-valid~.custom-file-label{border-color:#3772ff}.was-validated .custom-file-input:valid:focus~.custom-file-label,.custom-file-input.is-valid:focus~.custom-file-label{border-color:#3772ff;box-shadow:0 0 0 .2rem rgba(55,114,255,.25)}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:80%;color:#ed6a5a}.invalid-tooltip{position:absolute;top:100%;left:0;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;line-height:1.5;color:#fff;background-color:rgba(237,106,90,.9);border-radius:.25rem}.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip,.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip{display:block}.was-validated .form-control:invalid,.form-control.is-invalid{border-color:#ed6a5a;padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ED6A5A' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ED6A5A' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem)center;background-size:calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .form-control:invalid:focus,.form-control.is-invalid:focus{border-color:#ed6a5a;box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem)right calc(.375em + .1875rem)}.was-validated .custom-select:invalid,.custom-select.is-invalid{border-color:#ed6a5a;padding-right:calc(.75em + 2.3125rem);background:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")no-repeat right .75rem center/8px 10px,url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23ED6A5A' viewBox='0 0 12 12'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23ED6A5A' stroke='none'/%3e%3c/svg%3e")#fff no-repeat center right 1.75rem/calc(.75em + .375rem)calc(.75em + .375rem)}.was-validated .custom-select:invalid:focus,.custom-select.is-invalid:focus{border-color:#ed6a5a;box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.was-validated .form-check-input:invalid~.form-check-label,.form-check-input.is-invalid~.form-check-label{color:#ed6a5a}.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:#ed6a5a}.was-validated .custom-control-input:invalid~.custom-control-label::before,.custom-control-input.is-invalid~.custom-control-label::before{border-color:#ed6a5a}.was-validated .custom-control-input:invalid:checked~.custom-control-label::before,.custom-control-input.is-invalid:checked~.custom-control-label::before{border-color:#f29488;background:#f29488 linear-gradient(180deg,#f4a49a,#f29488)repeat-x}.was-validated .custom-control-input:invalid:focus~.custom-control-label::before,.custom-control-input.is-invalid:focus~.custom-control-label::before{box-shadow:0 0 0 .2rem rgba(237,106,90,.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:#ed6a5a}.was-validated .custom-file-input:invalid~.custom-file-label,.custom-file-input.is-invalid~.custom-file-label{border-color:#ed6a5a}.was-validated .custom-file-input:invalid:focus~.custom-file-label,.custom-file-input.is-invalid:focus~.custom-file-label{border-color:#ed6a5a;box-shadow:0 0 0 .2rem rgba(237,106,90,.25)}.form-inline{display:flex;flex-flow:row wrap;align-items:center}.form-inline .form-check{width:100%}@media(min-width:576px){.form-inline label{display:flex;align-items:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:flex;flex:none;flex-flow:row wrap;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:flex;align-items:center;justify-content:center;width:auto;padding-left:0}.form-inline .form-check-input{position:relative;flex-shrink:0;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{display:inline-block;font-weight:400;color:#222;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:initial;border:1px solid transparent;padding:.375rem .75rem;font-size:1rem;line-height:1.5;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#222;text-decoration:none}.btn:focus,.btn.focus{outline:0;box-shadow:0 0 0 .2rem rgba(48,99,142,.25)}.btn.disabled,.btn:disabled{opacity:.65;box-shadow:none}.btn:not(:disabled):not(.disabled){cursor:pointer}.btn:not(:disabled):not(.disabled):active,.btn:not(:disabled):not(.disabled).active{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:not(:disabled):not(.disabled):active:focus,.btn:not(:disabled):not(.disabled).active:focus{box-shadow:0 0 0 .2rem rgba(48,99,142,.25),inset 0 3px 5px rgba(0,0,0,.125)}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{color:#fff;background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x;border-color:#30638e;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-primary:hover{color:#fff;background:#264f71 linear-gradient(180deg,#476987,#264f71)repeat-x;border-color:#234868}.btn-primary:focus,.btn-primary.focus{color:#fff;background:#264f71 linear-gradient(180deg,#476987,#264f71)repeat-x;border-color:#234868;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(79,122,159,.5)}.btn-primary.disabled,.btn-primary:disabled{color:#fff;background-color:#30638e;border-color:#30638e;background-image:none}.btn-primary:not(:disabled):not(.disabled):active,.btn-primary:not(:disabled):not(.disabled).active,.show>.btn-primary.dropdown-toggle{color:#fff;background-color:#234868;background-image:none;border-color:#20425e}.btn-primary:not(:disabled):not(.disabled):active:focus,.btn-primary:not(:disabled):not(.disabled).active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(79,122,159,.5)}.btn-secondary{color:#fff;background:#ffa630 linear-gradient(180deg,#ffb34f,#FFA630)repeat-x;border-color:#ffa630;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-secondary:hover{color:#fff;background:#ff960a linear-gradient(180deg,#ffa52f,#ff960a)repeat-x;border-color:#fc9000}.btn-secondary:focus,.btn-secondary.focus{color:#fff;background:#ff960a linear-gradient(180deg,#ffa52f,#ff960a)repeat-x;border-color:#fc9000;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(255,179,79,.5)}.btn-secondary.disabled,.btn-secondary:disabled{color:#fff;background-color:#ffa630;border-color:#ffa630;background-image:none}.btn-secondary:not(:disabled):not(.disabled):active,.btn-secondary:not(:disabled):not(.disabled).active,.show>.btn-secondary.dropdown-toggle{color:#fff;background-color:#fc9000;background-image:none;border-color:#ef8800}.btn-secondary:not(:disabled):not(.disabled):active:focus,.btn-secondary:not(:disabled):not(.disabled).active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(255,179,79,.5)}.btn-success{color:#fff;background:#3772ff linear-gradient(180deg,#5587ff,#3772FF)repeat-x;border-color:#3772ff;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-success:hover{color:#fff;background:#1157ff linear-gradient(180deg,#3470ff,#1157ff)repeat-x;border-color:#044eff}.btn-success:focus,.btn-success.focus{color:#fff;background:#1157ff linear-gradient(180deg,#3470ff,#1157ff)repeat-x;border-color:#044eff;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(85,135,255,.5)}.btn-success.disabled,.btn-success:disabled{color:#fff;background-color:#3772ff;border-color:#3772ff;background-image:none}.btn-success:not(:disabled):not(.disabled):active,.btn-success:not(:disabled):not(.disabled).active,.show>.btn-success.dropdown-toggle{color:#fff;background-color:#044eff;background-image:none;border-color:#0049f6}.btn-success:not(:disabled):not(.disabled):active:focus,.btn-success:not(:disabled):not(.disabled).active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(85,135,255,.5)}.btn-info{color:#222;background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x;border-color:#c0e0de;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-info:hover{color:#fff;background:#a6d3d1 linear-gradient(180deg,#b4dad8,#a6d3d1)repeat-x;border-color:#9ecfcc}.btn-info:focus,.btn-info.focus{color:#fff;background:#a6d3d1 linear-gradient(180deg,#b4dad8,#a6d3d1)repeat-x;border-color:#9ecfcc;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(168,196,194,.5)}.btn-info.disabled,.btn-info:disabled{color:#222;background-color:#c0e0de;border-color:#c0e0de;background-image:none}.btn-info:not(:disabled):not(.disabled):active,.btn-info:not(:disabled):not(.disabled).active,.show>.btn-info.dropdown-toggle{color:#fff;background-color:#9ecfcc;background-image:none;border-color:#95cbc8}.btn-info:not(:disabled):not(.disabled):active:focus,.btn-info:not(:disabled):not(.disabled).active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(168,196,194,.5)}.btn-warning{color:#fff;background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x;border-color:#ed6a5a;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-warning:hover{color:#fff;background:#e94b38 linear-gradient(180deg,#ed6655,#e94b38)repeat-x;border-color:#e8402c}.btn-warning:focus,.btn-warning.focus{color:#fff;background:#e94b38 linear-gradient(180deg,#ed6655,#e94b38)repeat-x;border-color:#e8402c;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(240,128,115,.5)}.btn-warning.disabled,.btn-warning:disabled{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a;background-image:none}.btn-warning:not(:disabled):not(.disabled):active,.btn-warning:not(:disabled):not(.disabled).active,.show>.btn-warning.dropdown-toggle{color:#fff;background-color:#e8402c;background-image:none;border-color:#e73621}.btn-warning:not(:disabled):not(.disabled):active:focus,.btn-warning:not(:disabled):not(.disabled).active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(240,128,115,.5)}.btn-danger{color:#fff;background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x;border-color:#ed6a5a;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger:hover{color:#fff;background:#e94b38 linear-gradient(180deg,#ed6655,#e94b38)repeat-x;border-color:#e8402c}.btn-danger:focus,.btn-danger.focus{color:#fff;background:#e94b38 linear-gradient(180deg,#ed6655,#e94b38)repeat-x;border-color:#e8402c;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(240,128,115,.5)}.btn-danger.disabled,.btn-danger:disabled{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a;background-image:none}.btn-danger:not(:disabled):not(.disabled):active,.btn-danger:not(:disabled):not(.disabled).active,.show>.btn-danger.dropdown-toggle{color:#fff;background-color:#e8402c;background-image:none;border-color:#e73621}.btn-danger:not(:disabled):not(.disabled):active:focus,.btn-danger:not(:disabled):not(.disabled).active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(240,128,115,.5)}.btn-light{color:#222;background:#d3f3ee linear-gradient(180deg,#daf5f1,#D3F3EE)repeat-x;border-color:#d3f3ee;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-light:hover{color:#222;background:#b5ebe2 linear-gradient(180deg,#c0eee7,#b5ebe2)repeat-x;border-color:#abe8df}.btn-light:focus,.btn-light.focus{color:#222;background:#b5ebe2 linear-gradient(180deg,#c0eee7,#b5ebe2)repeat-x;border-color:#abe8df;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(184,212,207,.5)}.btn-light.disabled,.btn-light:disabled{color:#222;background-color:#d3f3ee;border-color:#d3f3ee;background-image:none}.btn-light:not(:disabled):not(.disabled):active,.btn-light:not(:disabled):not(.disabled).active,.show>.btn-light.dropdown-toggle{color:#222;background-color:#abe8df;background-image:none;border-color:#a1e5db}.btn-light:not(:disabled):not(.disabled):active:focus,.btn-light:not(:disabled):not(.disabled).active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(184,212,207,.5)}.btn-dark{color:#fff;background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x;border-color:#403f4c;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-dark:hover{color:#fff;background:#2e2e37 linear-gradient(180deg,#4e4d55,#2e2e37)repeat-x;border-color:#292830}.btn-dark:focus,.btn-dark.focus{color:#fff;background:#2e2e37 linear-gradient(180deg,#4e4d55,#2e2e37)repeat-x;border-color:#292830;box-shadow:inset 0 1px rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(93,92,103,.5)}.btn-dark.disabled,.btn-dark:disabled{color:#fff;background-color:#403f4c;border-color:#403f4c;background-image:none}.btn-dark:not(:disabled):not(.disabled):active,.btn-dark:not(:disabled):not(.disabled).active,.show>.btn-dark.dropdown-toggle{color:#fff;background-color:#292830;background-image:none;border-color:#232229}.btn-dark:not(:disabled):not(.disabled):active:focus,.btn-dark:not(:disabled):not(.disabled).active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(93,92,103,.5)}.btn-outline-primary{color:#30638e;border-color:#30638e}.btn-outline-primary:hover{color:#fff;background-color:#30638e;border-color:#30638e}.btn-outline-primary:focus,.btn-outline-primary.focus{box-shadow:0 0 0 .2rem rgba(48,99,142,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#30638e;background-color:initial}.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:#30638e;border-color:#30638e}.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{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(48,99,142,.5)}.btn-outline-secondary{color:#ffa630;border-color:#ffa630}.btn-outline-secondary:hover{color:#fff;background-color:#ffa630;border-color:#ffa630}.btn-outline-secondary:focus,.btn-outline-secondary.focus{box-shadow:0 0 0 .2rem rgba(255,166,48,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#ffa630;background-color:initial}.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:#ffa630;border-color:#ffa630}.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{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(255,166,48,.5)}.btn-outline-success{color:#3772ff;border-color:#3772ff}.btn-outline-success:hover{color:#fff;background-color:#3772ff;border-color:#3772ff}.btn-outline-success:focus,.btn-outline-success.focus{box-shadow:0 0 0 .2rem rgba(55,114,255,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#3772ff;background-color:initial}.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:#3772ff;border-color:#3772ff}.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{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(55,114,255,.5)}.btn-outline-info{color:#c0e0de;border-color:#c0e0de}.btn-outline-info:hover{color:#222;background-color:#c0e0de;border-color:#c0e0de}.btn-outline-info:focus,.btn-outline-info.focus{box-shadow:0 0 0 .2rem rgba(192,224,222,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#c0e0de;background-color:initial}.btn-outline-info:not(:disabled):not(.disabled):active,.btn-outline-info:not(:disabled):not(.disabled).active,.show>.btn-outline-info.dropdown-toggle{color:#222;background-color:#c0e0de;border-color:#c0e0de}.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{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(192,224,222,.5)}.btn-outline-warning{color:#ed6a5a;border-color:#ed6a5a}.btn-outline-warning:hover{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-warning:focus,.btn-outline-warning.focus{box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ed6a5a;background-color:initial}.btn-outline-warning:not(:disabled):not(.disabled):active,.btn-outline-warning:not(:disabled):not(.disabled).active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.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{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-danger{color:#ed6a5a;border-color:#ed6a5a}.btn-outline-danger:hover{color:#fff;background-color:#ed6a5a;border-color:#ed6a5a}.btn-outline-danger:focus,.btn-outline-danger.focus{box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#ed6a5a;background-color:initial}.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:#ed6a5a;border-color:#ed6a5a}.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{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(237,106,90,.5)}.btn-outline-light{color:#d3f3ee;border-color:#d3f3ee}.btn-outline-light:hover{color:#222;background-color:#d3f3ee;border-color:#d3f3ee}.btn-outline-light:focus,.btn-outline-light.focus{box-shadow:0 0 0 .2rem rgba(211,243,238,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#d3f3ee;background-color:initial}.btn-outline-light:not(:disabled):not(.disabled):active,.btn-outline-light:not(:disabled):not(.disabled).active,.show>.btn-outline-light.dropdown-toggle{color:#222;background-color:#d3f3ee;border-color:#d3f3ee}.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{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(211,243,238,.5)}.btn-outline-dark{color:#403f4c;border-color:#403f4c}.btn-outline-dark:hover{color:#fff;background-color:#403f4c;border-color:#403f4c}.btn-outline-dark:focus,.btn-outline-dark.focus{box-shadow:0 0 0 .2rem rgba(64,63,76,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#403f4c;background-color:initial}.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:#403f4c;border-color:#403f4c}.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{box-shadow:inset 0 3px 5px rgba(0,0,0,.125),0 0 0 .2rem rgba(64,63,76,.5)}.btn-link{font-weight:400;color:#3176d9;text-decoration:none}.btn-link:hover{color:#1e53a0;text-decoration:none}.btn-link:focus,.btn-link.focus{text-decoration:none}.btn-link:disabled,.btn-link.disabled{color:#888;pointer-events:none}.btn-lg,.btn-group-lg>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-sm,.btn-group-sm>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{transition:opacity .15s linear}@media(prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}@media(prefers-reduced-motion:reduce){.collapsing{transition:none}}.dropup,.dropright,.dropdown,.dropleft{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.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:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#222;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;box-shadow:0 .5rem 1rem rgba(0,0,0,.175)}.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:.125rem}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.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:.125rem}.dropright .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.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:.125rem}.dropleft .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropleft .dropdown-toggle::after{display:none}.dropleft .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.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:.5rem 0;overflow:hidden;border-top:1px solid #eee}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#222;text-align:inherit;white-space:nowrap;background-color:initial;border:0}.dropdown-item:hover,.dropdown-item:focus{color:#151515;text-decoration:none;background:#f8f9fa linear-gradient(180deg,#f9fafb,#f8f9fa)repeat-x}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x}.dropdown-item.disabled,.dropdown-item:disabled{color:#888;pointer-events:none;background-color:initial;background-image:none}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#888;white-space:nowrap}.dropdown-item-text{display:block;padding:.25rem 1.5rem;color:#222}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;flex: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:flex;flex-wrap:wrap;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:.5625rem;padding-left:.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:.375rem;padding-left:.375rem}.btn-lg+.dropdown-toggle-split,.btn-group-lg>.btn+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group.show .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.show .dropdown-toggle.btn-link{box-shadow:none}.btn-group-vertical{flex-direction:column;align-items:flex-start;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:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-control-plaintext,.input-group>.custom-select,.input-group>.custom-file{position:relative;flex:auto;width:1%;min-width:0;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:flex;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: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:flex;align-items:center;padding:.375rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;text-align:center;white-space:nowrap;background-color:#eee;border:1px solid #ccc;border-radius:.25rem}.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:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-sm>.form-control:not(textarea),.input-group-sm>.custom-select{height:calc(1.5em + .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:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.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;z-index:1;display:block;min-height:1.5rem;padding-left:1.5rem;-webkit-print-color-adjust:exact;color-adjust:exact}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{position:absolute;left:0;z-index:-1;width:1rem;height:1.25rem;opacity:0}.custom-control-input:checked~.custom-control-label::before{color:#fff;border-color:#30638e;background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x;box-shadow:}.custom-control-input:focus~.custom-control-label::before{box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 0 .2rem rgba(48,99,142,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label::before{border-color:#6fa3ce}.custom-control-input:not(:disabled):active~.custom-control-label::before{color:#fff;background-color:#95bbdb;border-color:#95bbdb;box-shadow:}.custom-control-input[disabled]~.custom-control-label,.custom-control-input:disabled~.custom-control-label{color:#888}.custom-control-input[disabled]~.custom-control-label::before,.custom-control-input:disabled~.custom-control-label::before{background-color:#eee}.custom-control-label{position:relative;margin-bottom:0;vertical-align:top}.custom-control-label::before{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;pointer-events:none;content:"";background-color:#fff;border:#adb5bd solid 1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.custom-control-label::after{position:absolute;top:.25rem;left:-1.5rem;display:block;width:1rem;height:1rem;content:"";background:no-repeat 50%/50%}.custom-checkbox .custom-control-label::before{border-radius:.25rem}.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' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3e%3c/svg%3e")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label::before{border-color:#30638e;background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x;box-shadow:}.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' width='4' height='4' 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:rgba(48,99,142,.5)linear-gradient(180deg,rgba(120,153,181,.575),rgba(48,99,142,.5))repeat-x}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label::before{background:rgba(48,99,142,.5)linear-gradient(180deg,rgba(120,153,181,.575),rgba(48,99,142,.5))repeat-x}.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' width='12' height='12' 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:rgba(48,99,142,.5)linear-gradient(180deg,rgba(120,153,181,.575),rgba(48,99,142,.5))repeat-x}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label::before{left:-2.25rem;width:1.75rem;pointer-events:all;border-radius:.5rem}.custom-switch .custom-control-label::after{top:calc(.25rem + 2px);left:calc(-2.25rem + 2px);width:calc(1rem - 4px);height:calc(1rem - 4px);background-color:#adb5bd;border-radius:.5rem;transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-switch .custom-control-label::after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label::after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label::before{background:rgba(48,99,142,.5)linear-gradient(180deg,rgba(120,153,181,.575),rgba(48,99,142,.5))repeat-x}.custom-select{display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem 1.75rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5' viewBox='0 0 4 5'%3e%3cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3e%3c/svg%3e")no-repeat right .75rem center/8px 10px;border:1px solid #ccc;border-radius:.25rem;box-shadow:inset 0 1px 2px rgba(0,0,0,.075);-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#6fa3ce;outline:0;box-shadow:inset 0 1px 2px rgba(0,0,0,.075),0 0 0 .2rem rgba(48,99,142,.25)}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select[multiple],.custom-select[size]:not([size="1"]){height:auto;padding-right:.75rem;background-image:none}.custom-select:disabled{color:#888;background-color:#eee}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #495057}.custom-select-sm{height:calc(1.5em + .5rem + 2px);padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem}.custom-select-lg{height:calc(1.5em + 1rem + 2px);padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem}.custom-file{position:relative;display:inline-block;width:100%;height:calc(1.5em + .75rem + 2px);margin-bottom:0}.custom-file-input{position:relative;z-index:2;width:100%;height:calc(1.5em + .75rem + 2px);margin:0;opacity:0}.custom-file-input:focus~.custom-file-label{border-color:#6fa3ce;box-shadow:0 0 0 .2rem rgba(48,99,142,.25)}.custom-file-input[disabled]~.custom-file-label,.custom-file-input:disabled~.custom-file-label{background-color:#eee}.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 + .75rem + 2px);padding:.375rem .75rem;font-weight:400;line-height:1.5;color:#495057;background-color:#fff;border:1px solid #ccc;border-radius:.25rem;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.custom-file-label::after{position:absolute;top:0;right:0;bottom:0;z-index:3;display:block;height:calc(1.5em + .75rem);padding:.375rem .75rem;line-height:1.5;color:#495057;content:"Browse";background:#eee linear-gradient(180deg,#f1f1f1,#eee)repeat-x;border-left:inherit;border-radius:0 .25rem .25rem 0}.custom-range{width:100%;height:1.4rem;padding:0;background-color:initial;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-range:focus{outline:none}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(48,99,142,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(48,99,142,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .2rem rgba(48,99,142,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .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:#95bbdb linear-gradient(180deg,#a5c5e1,#95bbdb)repeat-x}.custom-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-moz-range-thumb{width:1rem;height:1rem;background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-moz-appearance:none;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background:#95bbdb linear-gradient(180deg,#a5c5e1,#95bbdb)repeat-x}.custom-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:#dee2e6;border-color:transparent;border-radius:1rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.custom-range::-ms-thumb{width:1rem;height:1rem;margin-top:0;margin-right:.2rem;margin-left:.2rem;background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x;border:0;border-radius:1rem;box-shadow:0 .1rem .25rem rgba(0,0,0,.1);-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;appearance:none}@media(prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background:#95bbdb linear-gradient(180deg,#a5c5e1,#95bbdb)repeat-x}.custom-range::-ms-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:initial;border-color:transparent;border-width:.5rem;box-shadow:inset 0 .25rem .25rem rgba(0,0,0,.1)}.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{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.custom-control-label::before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:hover,.nav-link:focus{text-decoration:none}.nav-link.disabled{color:#888;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:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:hover,.nav-tabs .nav-link:focus{border-color:#eee #eee #dee2e6}.nav-tabs .nav-link.disabled{color:#888;background-color:initial;border-color:transparent}.nav-tabs .nav-link.active,.nav-tabs .nav-item.show .nav-link{color:#495057;background-color:#fff;border-color:#dee2e6 #dee2e6 #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:#fff;background-color:#30638e}.nav-fill>.nav-link,.nav-fill .nav-item{flex:auto;text-align:center}.nav-justified>.nav-link,.nav-justified .nav-item{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.5rem 1rem}.navbar .container,.navbar .container-fluid,.navbar .container-sm,.navbar .container-md,.navbar .container-lg,.navbar .container-xl{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.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:flex;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:.5rem;padding-bottom:.5rem}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background-color:initial;border:1px solid transparent;border-radius:.25rem}.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 50%;background-size:100% 100%}@media(max-width:575.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{padding-right:0;padding-left:0}}@media(min-width:576px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media(max-width:767.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{padding-right:0;padding-left:0}}@media(min-width:768px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-md,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media(max-width:991.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{padding-right:0;padding-left:0}}@media(min-width:992px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media(max-width:1199.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{padding-right:0;padding-left:0}}@media(min-width:1200px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-sm,.navbar-expand>.container-md,.navbar-expand>.container-lg,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:hover,.navbar-light .navbar-brand:focus{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:hover,.navbar-light .navbar-nav .nav-link:focus{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(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,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.5%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a{color:rgba(0,0,0,.9)}.navbar-light .navbar-text a:hover,.navbar-light .navbar-text a:focus{color:rgba(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,.75)}.navbar-dark .navbar-nav .nav-link:hover,.navbar-dark .navbar-nav .nav-link:focus{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.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,.75);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.navbar-dark .navbar-text{color:rgba(255,255,255,.75)}.navbar-dark .navbar-text a{color:#fff}.navbar-dark .navbar-text a:hover,.navbar-dark .navbar-text a:focus{color:#fff}.card,.td-content .highlight{position:relative;display:flex;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr,.td-content .highlight>hr{margin-right:0;margin-left:0}.card>.list-group,.td-content .highlight>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child,.td-content .highlight>.list-group:first-child{border-top-width:0;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card>.list-group:last-child,.td-content .highlight>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card>.card-header+.list-group,.td-content .highlight>.card-header+.list-group,.card>.list-group+.card-footer,.td-content .highlight>.list-group+.card-footer{border-top:0}.card-body{flex:auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.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:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,3%);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px)calc(.25rem - 1px)0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,3%);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px)calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem;border-radius:calc(.25rem - 1px)}.card-img,.card-img-top,.card-img-bottom{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img,.card-img-bottom{border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck .card,.card-deck .td-content .highlight,.td-content .card-deck .highlight{margin-bottom:15px}@media(min-width:576px){.card-deck{display:flex;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card,.card-deck .td-content .highlight,.td-content .card-deck .highlight{flex:1 0;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group>.card,.td-content .card-group>.highlight{margin-bottom:15px}@media(min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card,.td-content .card-group>.highlight{flex:1 0;margin-bottom:0}.card-group>.card+.card,.td-content .card-group>.highlight+.card,.td-content .card-group>.card+.highlight,.td-content .card-group>.highlight+.highlight{margin-left:0;border-left:0}.card-group>.card:not(:last-child),.td-content .card-group>.highlight:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-img-top,.td-content .card-group>.highlight:not(:last-child) .card-img-top,.card-group>.card:not(:last-child) .card-header,.td-content .card-group>.highlight:not(:last-child) .card-header{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-img-bottom,.td-content .card-group>.highlight:not(:last-child) .card-img-bottom,.card-group>.card:not(:last-child) .card-footer,.td-content .card-group>.highlight:not(:last-child) .card-footer{border-bottom-right-radius:0}.card-group>.card:not(:first-child),.td-content .card-group>.highlight:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-img-top,.td-content .card-group>.highlight:not(:first-child) .card-img-top,.card-group>.card:not(:first-child) .card-header,.td-content .card-group>.highlight:not(:first-child) .card-header{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-img-bottom,.td-content .card-group>.highlight:not(:first-child) .card-img-bottom,.card-group>.card:not(:first-child) .card-footer,.td-content .card-group>.highlight:not(:first-child) .card-footer{border-bottom-left-radius:0}}.card-columns .card,.card-columns .td-content .highlight,.td-content .card-columns .highlight{margin-bottom:.75rem}@media(min-width:576px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card,.card-columns .td-content .highlight,.td-content .card-columns .highlight{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card,.td-content .accordion>.highlight{overflow:hidden}.accordion>.card:not(:last-of-type),.td-content .accordion>.highlight:not(:last-of-type){border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:not(:first-of-type),.td-content .accordion>.highlight:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header,.td-content .accordion>.highlight>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{display:flex;flex-wrap:wrap;padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#eee;border-radius:.25rem}.breadcrumb-item{display:flex}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;color:#888;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#888}.pagination{display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#888;background-color:#fff;border:1px solid rgba(0,0,0,.1)}.page-link:hover{z-index:2;color:#1e53a0;text-decoration:none;background-color:#eee;border-color:#dee2e6}.page-link:focus{z-index:3;outline:0;box-shadow:0 0 0 .2rem rgba(48,99,142,.25)}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:3;color:#fff;background-color:#30638e;border-color:#2a567b}.page-item.disabled .page-link{color:#dee2e6;pointer-events:none;cursor:auto;background-color:#fff;border-color:#dee2e6}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media(prefers-reduced-motion:reduce){.badge{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:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#30638e}a.badge-primary:hover,a.badge-primary:focus{color:#fff;background-color:#234868}a.badge-primary:focus,a.badge-primary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(48,99,142,.5)}.badge-secondary{color:#fff;background-color:#ffa630}a.badge-secondary:hover,a.badge-secondary:focus{color:#fff;background-color:#fc9000}a.badge-secondary:focus,a.badge-secondary.focus{outline:0;box-shadow:0 0 0 .2rem rgba(255,166,48,.5)}.badge-success{color:#fff;background-color:#3772ff}a.badge-success:hover,a.badge-success:focus{color:#fff;background-color:#044eff}a.badge-success:focus,a.badge-success.focus{outline:0;box-shadow:0 0 0 .2rem rgba(55,114,255,.5)}.badge-info{color:#222;background-color:#c0e0de}a.badge-info:hover,a.badge-info:focus{color:#222;background-color:#9ecfcc}a.badge-info:focus,a.badge-info.focus{outline:0;box-shadow:0 0 0 .2rem rgba(192,224,222,.5)}.badge-warning{color:#fff;background-color:#ed6a5a}a.badge-warning:hover,a.badge-warning:focus{color:#fff;background-color:#e8402c}a.badge-warning:focus,a.badge-warning.focus{outline:0;box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.badge-danger{color:#fff;background-color:#ed6a5a}a.badge-danger:hover,a.badge-danger:focus{color:#fff;background-color:#e8402c}a.badge-danger:focus,a.badge-danger.focus{outline:0;box-shadow:0 0 0 .2rem rgba(237,106,90,.5)}.badge-light{color:#222;background-color:#d3f3ee}a.badge-light:hover,a.badge-light:focus{color:#222;background-color:#abe8df}a.badge-light:focus,a.badge-light.focus{outline:0;box-shadow:0 0 0 .2rem rgba(211,243,238,.5)}.badge-dark{color:#fff;background-color:#403f4c}a.badge-dark:hover,a.badge-dark:focus{color:#fff;background-color:#292830}a.badge-dark:focus,a.badge-dark.focus{outline:0;box-shadow:0 0 0 .2rem rgba(64,63,76,.5)}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#eee;border-radius:.3rem}@media(min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{position:relative;padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{position:absolute;top:0;right:0;z-index:2;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#19334a;background:#d6e0e8 linear-gradient(180deg,#dce5eb,#d6e0e8)repeat-x;border-color:#c5d3df}.alert-primary hr{border-top-color:#b5c7d6}.alert-primary .alert-link{color:#0c1924}.alert-secondary{color:#855619;background:#ffedd6 linear-gradient(180deg,#fff0dc,#ffedd6)repeat-x;border-color:#ffe6c5}.alert-secondary hr{border-top-color:#ffdbac}.alert-secondary .alert-link{color:#5a3a11}.alert-success{color:#1d3b85;background:#d7e3ff linear-gradient(180deg,#dde7ff,#d7e3ff)repeat-x;border-color:#c7d8ff}.alert-success hr{border-top-color:#aec6ff}.alert-success .alert-link{color:#14285b}.alert-info{color:#647473;background:#f2f9f8 linear-gradient(180deg,#f4faf9,#f2f9f8)repeat-x;border-color:#edf6f6}.alert-info hr{border-top-color:#dceeee}.alert-info .alert-link{color:#4c5958}.alert-warning{color:#7b372f;background:#fbe1de linear-gradient(180deg,#fce6e3,#fbe1de)repeat-x;border-color:#fad5d1}.alert-warning hr{border-top-color:#f8c0ba}.alert-warning .alert-link{color:#562721}.alert-danger{color:#7b372f;background:#fbe1de linear-gradient(180deg,#fce6e3,#fbe1de)repeat-x;border-color:#fad5d1}.alert-danger hr{border-top-color:#f8c0ba}.alert-danger .alert-link{color:#562721}.alert-light{color:#6e7e7c;background:#f6fdfc linear-gradient(180deg,#f7fdfc,#f6fdfc)repeat-x;border-color:#f3fcfa}.alert-light hr{border-top-color:#dff7f2}.alert-light .alert-link{color:#566361}.alert-dark{color:#212128;background:#d9d9db linear-gradient(180deg,#dfdfe0,#d9d9db)repeat-x;border-color:#cac9cd}.alert-dark hr{border-top-color:#bdbcc1}.alert-dark .alert-link{color:#0a0a0c}@-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:flex;height:1rem;overflow:hidden;line-height:0;font-size:.75rem;background-color:#eee;border-radius:.25rem;box-shadow:inset 0 .1rem .1rem rgba(0,0,0,.1)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:#fff;text-align:center;white-space:nowrap;background-color:#30638e;transition:width .6s ease}@media(prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.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:flex;align-items:flex-start}.media-body{flex:1}.list-group{display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:.25rem}.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:#222;background-color:#eee}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:#888;pointer-events:none;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#30638e;border-color:#30638e}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:-1px;border-top-width:1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}@media(min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}@media(min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-top-right-radius:.25rem;border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:1px;border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:-1px;border-left-width:1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{color:#19334a;background-color:#c5d3df}.list-group-item-primary.list-group-item-action:hover,.list-group-item-primary.list-group-item-action:focus{color:#19334a;background-color:#b5c7d6}.list-group-item-primary.list-group-item-action.active{color:#fff;background-color:#19334a;border-color:#19334a}.list-group-item-secondary{color:#855619;background-color:#ffe6c5}.list-group-item-secondary.list-group-item-action:hover,.list-group-item-secondary.list-group-item-action:focus{color:#855619;background-color:#ffdbac}.list-group-item-secondary.list-group-item-action.active{color:#fff;background-color:#855619;border-color:#855619}.list-group-item-success{color:#1d3b85;background-color:#c7d8ff}.list-group-item-success.list-group-item-action:hover,.list-group-item-success.list-group-item-action:focus{color:#1d3b85;background-color:#aec6ff}.list-group-item-success.list-group-item-action.active{color:#fff;background-color:#1d3b85;border-color:#1d3b85}.list-group-item-info{color:#647473;background-color:#edf6f6}.list-group-item-info.list-group-item-action:hover,.list-group-item-info.list-group-item-action:focus{color:#647473;background-color:#dceeee}.list-group-item-info.list-group-item-action.active{color:#fff;background-color:#647473;border-color:#647473}.list-group-item-warning{color:#7b372f;background-color:#fad5d1}.list-group-item-warning.list-group-item-action:hover,.list-group-item-warning.list-group-item-action:focus{color:#7b372f;background-color:#f8c0ba}.list-group-item-warning.list-group-item-action.active{color:#fff;background-color:#7b372f;border-color:#7b372f}.list-group-item-danger{color:#7b372f;background-color:#fad5d1}.list-group-item-danger.list-group-item-action:hover,.list-group-item-danger.list-group-item-action:focus{color:#7b372f;background-color:#f8c0ba}.list-group-item-danger.list-group-item-action.active{color:#fff;background-color:#7b372f;border-color:#7b372f}.list-group-item-light{color:#6e7e7c;background-color:#f3fcfa}.list-group-item-light.list-group-item-action:hover,.list-group-item-light.list-group-item-action:focus{color:#6e7e7c;background-color:#dff7f2}.list-group-item-light.list-group-item-action.active{color:#fff;background-color:#6e7e7c;border-color:#6e7e7c}.list-group-item-dark{color:#212128;background-color:#cac9cd}.list-group-item-dark.list-group-item-action:hover,.list-group-item-dark.list-group-item-action:focus{color:#212128;background-color:#bdbcc1}.list-group-item-dark.list-group-item-action.active{color:#fff;background-color:#212128;border-color:#212128}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):hover,.close:not(:disabled):not(.disabled):focus{opacity:.75}button.close{padding:0;background-color:initial;border:0}a.close.disabled{pointer-events:none}.toast{flex-basis:350px;max-width:350px;font-size:.875rem;background-color:rgba(255,255,255,.85);background-clip:padding-box;border:1px solid rgba(0,0,0,.1);box-shadow:0 .25rem .75rem rgba(0,0,0,.1);opacity:0;border-radius:.25rem}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{display:flex;align-items:center;padding:.25rem .75rem;color:#888;background-color:rgba(255,255,255,.85);background-clip:padding-box;border-bottom:1px solid rgba(0,0,0,5%);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.toast-body{padding:.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:.5rem;pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media(prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{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{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - 1rem)}.modal-dialog-centered::before{display:block;height:calc(100vh - 1rem);height:-webkit-min-content;height:-moz-min-content;height:min-content;content:""}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;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:flex;flex-direction:column;width:100%;pointer-events:auto;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .25rem .5rem rgba(0,0,0,.5);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:.5}.modal-header{display:flex;align-items:flex-start;justify-content:space-between;padding:1rem;border-bottom:1px solid #dee2e6;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.modal-header .close{padding:1rem;margin:-1rem -1rem -1rem auto}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;flex:auto;padding:1rem}.modal-footer{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:.75rem;border-top:1px solid #dee2e6;border-bottom-right-radius:calc(.3rem - 1px);border-bottom-left-radius:calc(.3rem - 1px)}.modal-footer>*{margin:.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);height:-webkit-min-content;height:-moz-min-content;height:min-content}.modal-content{box-shadow:0 .5rem 1rem rgba(0,0,0,.5)}.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:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;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:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:.8rem;height:.4rem}.tooltip .arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-top,.bs-tooltip-auto[x-placement^=top]{padding:.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:.4rem .4rem 0;border-top-color:#000}.bs-tooltip-right,.bs-tooltip-auto[x-placement^=right]{padding:0 .4rem}.bs-tooltip-right .arrow,.bs-tooltip-auto[x-placement^=right] .arrow{left:0;width:.4rem;height:.8rem}.bs-tooltip-right .arrow::before,.bs-tooltip-auto[x-placement^=right] .arrow::before{right:0;border-width:.4rem .4rem .4rem 0;border-right-color:#000}.bs-tooltip-bottom,.bs-tooltip-auto[x-placement^=bottom]{padding:.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 .4rem .4rem;border-bottom-color:#000}.bs-tooltip-left,.bs-tooltip-auto[x-placement^=left]{padding:0 .4rem}.bs-tooltip-left .arrow,.bs-tooltip-auto[x-placement^=left] .arrow{right:0;width:.4rem;height:.8rem}.bs-tooltip-left .arrow::before,.bs-tooltip-auto[x-placement^=left] .arrow::before{left:0;border-width:.4rem 0 .4rem .4rem;border-left-color:#000}.tooltip-inner{max-width:200px;padding:.25rem .5rem;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;font-family:open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol;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:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;box-shadow:0 .25rem .5rem rgba(0,0,0,.2)}.popover .arrow{position:absolute;display:block;width:1rem;height:.5rem;margin:0 .3rem}.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:.5rem}.bs-popover-top>.arrow,.bs-popover-auto[x-placement^=top]>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-top>.arrow::before,.bs-popover-auto[x-placement^=top]>.arrow::before{bottom:0;border-width:.5rem .5rem 0;border-top-color:rgba(0,0,0,.25)}.bs-popover-top>.arrow::after,.bs-popover-auto[x-placement^=top]>.arrow::after{bottom:1px;border-width:.5rem .5rem 0;border-top-color:#fff}.bs-popover-right,.bs-popover-auto[x-placement^=right]{margin-left:.5rem}.bs-popover-right>.arrow,.bs-popover-auto[x-placement^=right]>.arrow{left:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-right>.arrow::before,.bs-popover-auto[x-placement^=right]>.arrow::before{left:0;border-width:.5rem .5rem .5rem 0;border-right-color:rgba(0,0,0,.25)}.bs-popover-right>.arrow::after,.bs-popover-auto[x-placement^=right]>.arrow::after{left:1px;border-width:.5rem .5rem .5rem 0;border-right-color:#fff}.bs-popover-bottom,.bs-popover-auto[x-placement^=bottom]{margin-top:.5rem}.bs-popover-bottom>.arrow,.bs-popover-auto[x-placement^=bottom]>.arrow{top:calc(-.5rem - 1px)}.bs-popover-bottom>.arrow::before,.bs-popover-auto[x-placement^=bottom]>.arrow::before{top:0;border-width:0 .5rem .5rem;border-bottom-color:rgba(0,0,0,.25)}.bs-popover-bottom>.arrow::after,.bs-popover-auto[x-placement^=bottom]>.arrow::after{top:1px;border-width:0 .5rem .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:-.5rem;content:"";border-bottom:1px solid #f7f7f7}.bs-popover-left,.bs-popover-auto[x-placement^=left]{margin-right:.5rem}.bs-popover-left>.arrow,.bs-popover-auto[x-placement^=left]>.arrow{right:calc(-.5rem - 1px);width:.5rem;height:1rem;margin:.3rem 0}.bs-popover-left>.arrow::before,.bs-popover-auto[x-placement^=left]>.arrow::before{right:0;border-width:.5rem 0 .5rem .5rem;border-left-color:rgba(0,0,0,.25)}.bs-popover-left>.arrow::after,.bs-popover-auto[x-placement^=left]>.arrow::after{right:1px;border-width:.5rem 0 .5rem .5rem;border-left-color:#fff}.popover-header{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:.5rem .75rem;color:#222}.carousel{position:relative}.carousel.pointer-event{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;transition:transform .6s ease-in-out}@media(prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item.active,.carousel-item-next,.carousel-item-prev{display:block}.carousel-item-next:not(.carousel-item-left),.active.carousel-item-right{transform:translateX(100%)}.carousel-item-prev:not(.carousel-item-right),.active.carousel-item-left{transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;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;transition:opacity 0s .6s}@media(prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-prev,.carousel-control-next{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5;transition:opacity .15s ease}@media(prefers-reduced-motion:reduce){.carousel-control-prev,.carousel-control-next{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:.9}.carousel-control-prev{left:0;background-image:linear-gradient(90deg,rgba(0,0,0,.25),rgba(0,0,0,.1%))}.carousel-control-next{right:0;background-image:linear-gradient(270deg,rgba(0,0,0,.25),rgba(0,0,0,.1%))}.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' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M5.25 0l-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%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' width='8' height='8' viewBox='0 0 8 8'%3e%3cpath d='M2.75 0l-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:15;display:flex;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{box-sizing:content-box;flex:initial;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:.5;transition:opacity .6s ease}@media(prefers-reduced-motion:reduce){.carousel-indicators li{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{transform:rotate(360deg)}}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{display:inline-block;width:2rem;height:2rem;vertical-align:text-bottom;border:.25em solid;border-right-color:transparent;border-radius:50%;-webkit-animation:spinner-border .75s linear infinite;animation:spinner-border .75s linear infinite}.spinner-border-sm{width:1rem;height:1rem;border-width:.2em}@-webkit-keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.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 .75s linear infinite;animation:spinner-grow .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:#30638e!important}a.bg-primary:hover,a.bg-primary:focus,button.bg-primary:hover,button.bg-primary:focus{background-color:#234868!important}.bg-secondary{background-color:#ffa630!important}a.bg-secondary:hover,a.bg-secondary:focus,button.bg-secondary:hover,button.bg-secondary:focus{background-color:#fc9000!important}.bg-success{background-color:#3772ff!important}a.bg-success:hover,a.bg-success:focus,button.bg-success:hover,button.bg-success:focus{background-color:#044eff!important}.bg-info{background-color:#c0e0de!important}a.bg-info:hover,a.bg-info:focus,button.bg-info:hover,button.bg-info:focus{background-color:#9ecfcc!important}.bg-warning{background-color:#ed6a5a!important}a.bg-warning:hover,a.bg-warning:focus,button.bg-warning:hover,button.bg-warning:focus{background-color:#e8402c!important}.bg-danger{background-color:#ed6a5a!important}a.bg-danger:hover,a.bg-danger:focus,button.bg-danger:hover,button.bg-danger:focus{background-color:#e8402c!important}.bg-light{background-color:#d3f3ee!important}a.bg-light:hover,a.bg-light:focus,button.bg-light:hover,button.bg-light:focus{background-color:#abe8df!important}.bg-dark{background-color:#403f4c!important}a.bg-dark:hover,a.bg-dark:focus,button.bg-dark:hover,button.bg-dark:focus{background-color:#292830!important}.bg-gradient-primary{background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x!important}.bg-gradient-secondary{background:#ffa630 linear-gradient(180deg,#ffb34f,#FFA630)repeat-x!important}.bg-gradient-success{background:#3772ff linear-gradient(180deg,#5587ff,#3772FF)repeat-x!important}.bg-gradient-info{background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x!important}.bg-gradient-warning{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.bg-gradient-danger{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.bg-gradient-light{background:#d3f3ee linear-gradient(180deg,#daf5f1,#D3F3EE)repeat-x!important}.bg-gradient-dark{background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:initial!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:#30638e!important}.border-secondary{border-color:#ffa630!important}.border-success{border-color:#3772ff!important}.border-info{border-color:#c0e0de!important}.border-warning{border-color:#ed6a5a!important}.border-danger{border-color:#ed6a5a!important}.border-light{border-color:#d3f3ee!important}.border-dark{border-color:#403f4c!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-lg{border-radius:.3rem!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:flex!important}.d-inline-flex{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:flex!important}.d-sm-inline-flex{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:flex!important}.d-md-inline-flex{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:flex!important}.d-lg-inline-flex{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:flex!important}.d-xl-inline-flex{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:flex!important}.d-print-inline-flex{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.85714286%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media(min-width:576px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media(min-width:768px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media(min-width:992px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media(min-width:1200px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.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}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;-ms-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;-ms-user-select:none!important;user-select: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;margin:-1px;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{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{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}.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:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.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:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.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:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.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:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.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:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.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:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.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:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.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:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.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:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.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:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.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:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.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:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.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:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.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:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.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:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.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}}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;pointer-events:auto;content:"";background-color:initial}.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:#30638e!important}a.text-primary:hover,a.text-primary:focus{color:#1d3b55!important}.text-secondary{color:#ffa630!important}a.text-secondary:hover,a.text-secondary:focus{color:#e38100!important}.text-success{color:#3772ff!important}a.text-success:hover,a.text-success:focus{color:#0045ea!important}.text-info{color:#c0e0de!important}a.text-info:hover,a.text-info:focus{color:#8dc7c3!important}.text-warning{color:#ed6a5a!important}a.text-warning:hover,a.text-warning:focus{color:#e22f19!important}.text-danger{color:#ed6a5a!important}a.text-danger:hover,a.text-danger:focus{color:#e22f19!important}.text-light{color:#d3f3ee!important}a.text-light:hover,a.text-light:focus{color:#97e3d7!important}.text-dark{color:#403f4c!important}a.text-dark:hover,a.text-dark:focus{color:#1d1c22!important}.text-body{color:#222!important}.text-muted{color:#888!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:rgba(255,255,255,.5)!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:initial;border:0}.text-decoration-none{text-decoration:none!important}.text-break{word-break:break-word!important;word-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;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,.td-content>table,.td-box .row.section>table{border-collapse:collapse!important}.table td,.td-content>table td,.td-box .row.section>table td,.table th,.td-content>table th,.td-box .row.section>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,.td-content>table .thead-dark th,.td-box .row.section>table .thead-dark th{color:inherit;border-color:#dee2e6}}/*!* Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/.fa,.fas,.far,.fal,.fad,.fab{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:solid .08em #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fas.fa-pull-left,.far.fa-pull-left,.fal.fa-pull-left,.fab.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fas.fa-pull-right,.far.fa-pull-right,.fal.fa-pull-right,.fab.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes fa-spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scale(-1,1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(1,-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";transform:scale(-1,-1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-flip-both{filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bacteria:before{content:"\e059"}.fa-bacterium:before{content:"\e05a"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-box-tissue:before{content:"\e05b"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dailymotion:before{content:"\e052"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-deezer:before{content:"\e077"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-disease:before{content:"\f7fa"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edge-legacy:before{content:"\e078"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-faucet:before{content:"\e005"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\e007"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-pay:before{content:"\e079"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-holding-water:before{content:"\f4c1"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-sparkles:before{content:"\e05d"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-hands-wash:before{content:"\e05e"}.fa-handshake:before{content:"\f2b5"}.fa-handshake-alt-slash:before{content:"\e05f"}.fa-handshake-slash:before{content:"\e060"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-head-side-cough:before{content:"\e061"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-head-side-mask:before{content:"\e063"}.fa-head-side-virus:before{content:"\e064"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hospital-user:before{content:"\f80d"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-house-user:before{content:"\e065"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\e013"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-instagram-square:before{content:"\e055"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-house:before{content:"\e066"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lungs:before{content:"\f604"}.fa-lungs-virus:before{content:"\e067"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\e01a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mixer:before{content:"\e056"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-arrows:before{content:"\e068"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\e01e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-plane-slash:before{content:"\e069"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pump-medical:before{content:"\e06a"}.fa-pump-soap:before{content:"\e06b"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-rust:before{content:"\e07a"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-shield-virus:before{content:"\e06c"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopify:before{content:"\e057"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sink:before{content:"\e06d"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-soap:before{content:"\e06e"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-stopwatch-20:before{content:"\e06f"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-store-alt-slash:before{content:"\e070"}.fa-store-slash:before{content:"\e071"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-tiktok:before{content:"\e07b"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\e041"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\e049"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-unsplash:before{content:"\e07c"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-users-slash:before{content:"\e073"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-virus:before{content:"\e074"}.fa-virus-slash:before{content:"\e075"}.fa-viruses:before{content:"\e076"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}/*!* Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/@font-face{font-family:'font awesome 5 free';font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix)format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2)format("woff2"),url(../webfonts/fa-solid-900.woff)format("woff"),url(../webfonts/fa-solid-900.ttf)format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome)format("svg")}.fa,.fas{font-family:'font awesome 5 free';font-weight:900}/*!* Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com +* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)*/@font-face{font-family:'font awesome 5 brands';font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix)format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2)format("woff2"),url(../webfonts/fa-brands-400.woff)format("woff"),url(../webfonts/fa-brands-400.ttf)format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome)format("svg")}.fab{font-family:'font awesome 5 brands';font-weight:400}.td-border-top{border:none;border-top:1px solid #eee}.td-border-none{border:none}.td-block-padding,.td-default main section{padding-top:4rem;padding-bottom:4rem}@media(min-width:768px){.td-block-padding,.td-default main section{padding-top:5rem;padding-bottom:5rem}}.td-overlay{position:relative}.td-overlay::after{content:"";position:absolute;top:0;right:0;bottom:0;left:0}.td-overlay--dark::after{background-color:rgba(64,63,76,.3)}.td-overlay--light::after{background-color:rgba(211,243,238,.3)}.td-overlay__inner{position:relative;z-index:1}@media(min-width:992px){.td-max-width-on-larger-screens,.td-content>pre,.td-content>.highlight,.td-content>.lead,.td-content>h1,.td-content>h2,.td-content>ul,.td-content>ol,.td-content>p,.td-content>blockquote,.td-content>dl dd,.td-content .footnotes,.td-content>.alert{max-width:80%}}.-bg-blue{color:#fff;background-color:#72a1e5}.-bg-blue p>a{color:#a0c0ee}.-bg-blue p>a:hover{color:#1e53a0}.-text-blue{color:#72a1e5}.-bg-indigo{color:#fff;background-color:#6610f2}.-bg-indigo p>a{color:#b8cff2}.-bg-indigo p>a:hover{color:#1e53a0}.-text-indigo{color:#6610f2}.-bg-purple{color:#fff;background-color:#6f42c1}.-bg-purple p>a{color:#b7cff2}.-bg-purple p>a:hover{color:#1e53a0}.-text-purple{color:#6f42c1}.-bg-pink{color:#fff;background-color:#e83e8c}.-bg-pink p>a{color:#aec9f0}.-bg-pink p>a:hover{color:#1e53a0}.-text-pink{color:#e83e8c}.-bg-red{color:#fff;background-color:#dc3545}.-bg-red p>a{color:#b4cdf1}.-bg-red p>a:hover{color:#1e53a0}.-text-red{color:#dc3545}.-bg-orange{color:#fff;background-color:#ba5a31}.-bg-orange p>a{color:#bed4f3}.-bg-orange p>a:hover{color:#1e53a0}.-text-orange{color:#ba5a31}.-bg-yellow{color:#fff;background-color:#ffc107}.-bg-yellow p>a{color:#b7cff2}.-bg-yellow p>a:hover{color:#1e53a0}.-text-yellow{color:#ffc107}.-bg-green{color:#fff;background-color:#28a745}.-bg-green p>a{color:#c6d9f4}.-bg-green p>a:hover{color:#1e53a0}.-text-green{color:#28a745}.-bg-teal{color:#fff;background-color:#20c997}.-bg-teal p>a{color:#bfd4f3}.-bg-teal p>a:hover{color:#1e53a0}.-text-teal{color:#20c997}.-bg-cyan{color:#fff;background-color:#17a2b8}.-bg-cyan p>a{color:#c6d9f4}.-bg-cyan p>a:hover{color:#1e53a0}.-text-cyan{color:#17a2b8}.-bg-white{color:#222;background-color:#fff}.-bg-white p>a{color:#72a1e5}.-bg-white p>a:hover{color:#1e53a0}.-text-white{color:#fff}.-bg-gray{color:#fff;background-color:#888}.-bg-gray p>a{color:#b4cdf1}.-bg-gray p>a:hover{color:#1e53a0}.-text-gray{color:#888}.-bg-gray-dark{color:#fff;background-color:#333}.-bg-gray-dark p>a{color:#e3ecfa}.-bg-gray-dark p>a:hover{color:#1e53a0}.-text-gray-dark{color:#333}.-bg-primary{color:#fff;background-color:#30638e}.-bg-primary p>a{color:#cadcf5}.-bg-primary p>a:hover{color:#1e53a0}.-text-primary{color:#30638e}.-bg-secondary{color:#fff;background-color:#ffa630}.-bg-secondary p>a{color:#abc7f0}.-bg-secondary p>a:hover{color:#1e53a0}.-text-secondary{color:#ffa630}.-bg-success{color:#fff;background-color:#3772ff}.-bg-success p>a{color:#a9c6ef}.-bg-success p>a:hover{color:#1e53a0}.-text-success{color:#3772ff}.-bg-info{color:#222;background-color:#c0e0de}.-bg-info p>a{color:#638ac1}.-bg-info p>a:hover{color:#1e53a0}.-text-info{color:#c0e0de}.-bg-warning{color:#fff;background-color:#ed6a5a}.-bg-warning p>a{color:#a5c3ee}.-bg-warning p>a:hover{color:#1e53a0}.-text-warning{color:#ed6a5a}.-bg-danger{color:#fff;background-color:#ed6a5a}.-bg-danger p>a{color:#a5c3ee}.-bg-danger p>a:hover{color:#1e53a0}.-text-danger{color:#ed6a5a}.-bg-light{color:#222;background-color:#d3f3ee}.-bg-light p>a{color:#6993d0}.-bg-light p>a:hover{color:#1e53a0}.-text-light{color:#d3f3ee}.-bg-dark{color:#fff;background-color:#403f4c}.-bg-dark p>a{color:#d9e5f8}.-bg-dark p>a:hover{color:#1e53a0}.-text-dark{color:#403f4c}.-bg-100{color:#222;background-color:#f8f9fa}.-bg-100 p>a{color:#709ee0}.-bg-100 p>a:hover{color:#1e53a0}.-text-100{color:#f8f9fa}.-bg-200{color:#222;background-color:#eee}.-bg-200 p>a{color:#6d99d8}.-bg-200 p>a:hover{color:#1e53a0}.-text-200{color:#eee}.-bg-300{color:#222;background-color:#dee2e6}.-bg-300 p>a{color:#6993cf}.-bg-300 p>a:hover{color:#1e53a0}.-text-300{color:#dee2e6}.-bg-400{color:#222;background-color:#ccc}.-bg-400 p>a{color:#6288be}.-bg-400 p>a:hover{color:#1e53a0}.-text-400{color:#ccc}.-bg-500{color:#fff;background-color:#adb5bd}.-bg-500 p>a{color:#9bbced}.-bg-500 p>a:hover{color:#1e53a0}.-text-500{color:#adb5bd}.-bg-600{color:#fff;background-color:#888}.-bg-600 p>a{color:#b4cdf1}.-bg-600 p>a:hover{color:#1e53a0}.-text-600{color:#888}.-bg-700{color:#fff;background-color:#495057}.-bg-700 p>a{color:#d3e2f7}.-bg-700 p>a:hover{color:#1e53a0}.-text-700{color:#495057}.-bg-800{color:#fff;background-color:#333}.-bg-800 p>a{color:#e3ecfa}.-bg-800 p>a:hover{color:#1e53a0}.-text-800{color:#333}.-bg-900{color:#fff;background-color:#222}.-bg-900 p>a{color:#ecf2fc}.-bg-900 p>a:hover{color:#1e53a0}.-text-900{color:#222}.-bg-0{color:#fff;background-color:#403f4c}.-bg-0 p>a{color:#d9e5f8}.-bg-0 p>a:hover{color:#1e53a0}.-text-0{color:#403f4c}.-bg-1{color:#fff;background-color:#30638e}.-bg-1 p>a{color:#cadcf5}.-bg-1 p>a:hover{color:#1e53a0}.-text-1{color:#30638e}.-bg-2{color:#fff;background-color:#ffa630}.-bg-2 p>a{color:#abc7f0}.-bg-2 p>a:hover{color:#1e53a0}.-text-2{color:#ffa630}.-bg-3{color:#222;background-color:#c0e0de}.-bg-3 p>a{color:#638ac1}.-bg-3 p>a:hover{color:#1e53a0}.-text-3{color:#c0e0de}.-bg-4{color:#222;background-color:#fff}.-bg-4 p>a{color:#72a1e5}.-bg-4 p>a:hover{color:#1e53a0}.-text-4{color:#fff}.-bg-5{color:#fff;background-color:#888}.-bg-5 p>a{color:#b4cdf1}.-bg-5 p>a:hover{color:#1e53a0}.-text-5{color:#888}.-bg-6{color:#fff;background-color:#3772ff}.-bg-6 p>a{color:#a9c6ef}.-bg-6 p>a:hover{color:#1e53a0}.-text-6{color:#3772ff}.-bg-7{color:#fff;background-color:#ed6a5a}.-bg-7 p>a{color:#a5c3ee}.-bg-7 p>a:hover{color:#1e53a0}.-text-7{color:#ed6a5a}.-bg-8{color:#fff;background-color:#403f4c}.-bg-8 p>a{color:#d9e5f8}.-bg-8 p>a:hover{color:#1e53a0}.-text-8{color:#403f4c}.-bg-9{color:#fff;background-color:#ed6a5a}.-bg-9 p>a{color:#a5c3ee}.-bg-9 p>a:hover{color:#1e53a0}.-text-9{color:#ed6a5a}.-bg-10{color:#fff;background-color:#30638e}.-bg-10 p>a{color:#cadcf5}.-bg-10 p>a:hover{color:#1e53a0}.-text-10{color:#30638e}.-bg-11{color:#fff;background-color:#ffa630}.-bg-11 p>a{color:#abc7f0}.-bg-11 p>a:hover{color:#1e53a0}.-text-11{color:#ffa630}.-bg-12{color:#222;background-color:#fff}.-bg-12 p>a{color:#72a1e5}.-bg-12 p>a:hover{color:#1e53a0}.-text-12{color:#fff}.-bg-13{color:#222;background-color:#c0e0de}.-bg-13 p>a{color:#638ac1}.-bg-13 p>a:hover{color:#1e53a0}.-text-13{color:#c0e0de}.td-box--height-min{min-height:300px}.td-box--height-med{min-height:400px}.td-box--height-max{min-height:500px}.td-box--height-full{min-height:100vh}@media(min-width:768px){.td-box--height-min{min-height:450px}.td-box--height-med{min-height:500px}.td-box--height-max{min-height:650px}}.td-box .row.section{padding-left:5vw;padding-right:5vw;flex-direction:column}.td-box .row{padding-left:5vw;padding-right:5vw;flex-direction:row}.td-box.linkbox{padding:5vh 5vw}.td-box--0{color:#fff;background-color:#403f4c}.td-box--0 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--0 p>a{color:#d9e5f8}.td-box--0 p>a:hover{color:#1e53a0}.td-box--10.td-box--gradient{background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x!important}.td-box--1{color:#fff;background-color:#30638e}.td-box--1 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#30638e transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--1 p>a{color:#cadcf5}.td-box--1 p>a:hover{color:#1e53a0}.td-box--11.td-box--gradient{background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x!important}.td-box--2{color:#fff;background-color:#ffa630}.td-box--2 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffa630 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--2 p>a{color:#abc7f0}.td-box--2 p>a:hover{color:#1e53a0}.td-box--12.td-box--gradient{background:#ffa630 linear-gradient(180deg,#ffb34f,#FFA630)repeat-x!important}.td-box--3{color:#222;background-color:#c0e0de}.td-box--3 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--3 p>a{color:#638ac1}.td-box--3 p>a:hover{color:#1e53a0}.td-box--13.td-box--gradient{background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x!important}.td-box--4{color:#222;background-color:#fff}.td-box--4 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--4 p>a{color:#72a1e5}.td-box--4 p>a:hover{color:#1e53a0}.td-box--14.td-box--gradient{background:#fff linear-gradient(180deg,white,white)repeat-x!important}.td-box--5{color:#fff;background-color:#888}.td-box--5 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#888 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--5 p>a{color:#b4cdf1}.td-box--5 p>a:hover{color:#1e53a0}.td-box--15.td-box--gradient{background:#888 linear-gradient(180deg,#9a9a9a,#888)repeat-x!important}.td-box--6{color:#fff;background-color:#3772ff}.td-box--6 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--6 p>a{color:#a9c6ef}.td-box--6 p>a:hover{color:#1e53a0}.td-box--16.td-box--gradient{background:#3772ff linear-gradient(180deg,#5587ff,#3772FF)repeat-x!important}.td-box--7{color:#fff;background-color:#ed6a5a}.td-box--7 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--7 p>a{color:#a5c3ee}.td-box--7 p>a:hover{color:#1e53a0}.td-box--17.td-box--gradient{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.td-box--8{color:#fff;background-color:#403f4c}.td-box--8 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--8 p>a{color:#d9e5f8}.td-box--8 p>a:hover{color:#1e53a0}.td-box--18.td-box--gradient{background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x!important}.td-box--9{color:#fff;background-color:#ed6a5a}.td-box--9 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--9 p>a{color:#a5c3ee}.td-box--9 p>a:hover{color:#1e53a0}.td-box--19.td-box--gradient{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.td-box--10{color:#fff;background-color:#30638e}.td-box--10 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#30638e transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--10 p>a{color:#cadcf5}.td-box--10 p>a:hover{color:#1e53a0}.td-box--110.td-box--gradient{background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x!important}.td-box--11{color:#fff;background-color:#ffa630}.td-box--11 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffa630 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--11 p>a{color:#abc7f0}.td-box--11 p>a:hover{color:#1e53a0}.td-box--111.td-box--gradient{background:#ffa630 linear-gradient(180deg,#ffb34f,#FFA630)repeat-x!important}.td-box--12{color:#222;background-color:#fff}.td-box--12 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--12 p>a{color:#72a1e5}.td-box--12 p>a:hover{color:#1e53a0}.td-box--112.td-box--gradient{background:#fff linear-gradient(180deg,white,white)repeat-x!important}.td-box--13{color:#222;background-color:#c0e0de}.td-box--13 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--13 p>a{color:#638ac1}.td-box--13 p>a:hover{color:#1e53a0}.td-box--113.td-box--gradient{background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x!important}.td-box--blue{color:#fff;background-color:#72a1e5}.td-box--blue .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#72a1e5 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--blue p>a{color:#a0c0ee}.td-box--blue p>a:hover{color:#1e53a0}.td-box--1blue.td-box--gradient{background:#72a1e5 linear-gradient(180deg,#87afe9,#72A1E5)repeat-x!important}.td-box--indigo{color:#fff;background-color:#6610f2}.td-box--indigo .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6610f2 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--indigo p>a{color:#b8cff2}.td-box--indigo p>a:hover{color:#1e53a0}.td-box--1indigo.td-box--gradient{background:#6610f2 linear-gradient(180deg,#7d34f4,#6610f2)repeat-x!important}.td-box--purple{color:#fff;background-color:#6f42c1}.td-box--purple .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#6f42c1 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--purple p>a{color:#b7cff2}.td-box--purple p>a:hover{color:#1e53a0}.td-box--1purple.td-box--gradient{background:#6f42c1 linear-gradient(180deg,#855eca,#6f42c1)repeat-x!important}.td-box--pink{color:#fff;background-color:#e83e8c}.td-box--pink .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#e83e8c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--pink p>a{color:#aec9f0}.td-box--pink p>a:hover{color:#1e53a0}.td-box--1pink.td-box--gradient{background:#e83e8c linear-gradient(180deg,#eb5b9d,#e83e8c)repeat-x!important}.td-box--red{color:#fff;background-color:#dc3545}.td-box--red .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dc3545 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--red p>a{color:#b4cdf1}.td-box--red p>a:hover{color:#1e53a0}.td-box--1red.td-box--gradient{background:#dc3545 linear-gradient(180deg,#e15361,#dc3545)repeat-x!important}.td-box--orange{color:#fff;background-color:#ba5a31}.td-box--orange .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ba5a31 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--orange p>a{color:#bed4f3}.td-box--orange p>a:hover{color:#1e53a0}.td-box--1orange.td-box--gradient{background:#ba5a31 linear-gradient(180deg,#c47350,#BA5A31)repeat-x!important}.td-box--yellow{color:#fff;background-color:#ffc107}.td-box--yellow .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffc107 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--yellow p>a{color:#b7cff2}.td-box--yellow p>a:hover{color:#1e53a0}.td-box--1yellow.td-box--gradient{background:#ffc107 linear-gradient(180deg,#ffca2c,#ffc107)repeat-x!important}.td-box--green{color:#fff;background-color:#28a745}.td-box--green .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#28a745 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--green p>a{color:#c6d9f4}.td-box--green p>a:hover{color:#1e53a0}.td-box--1green.td-box--gradient{background:#28a745 linear-gradient(180deg,#48b461,#28a745)repeat-x!important}.td-box--teal{color:#fff;background-color:#20c997}.td-box--teal .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#20c997 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--teal p>a{color:#bfd4f3}.td-box--teal p>a:hover{color:#1e53a0}.td-box--1teal.td-box--gradient{background:#20c997 linear-gradient(180deg,#41d1a7,#20c997)repeat-x!important}.td-box--cyan{color:#fff;background-color:#17a2b8}.td-box--cyan .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#17a2b8 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--cyan p>a{color:#c6d9f4}.td-box--cyan p>a:hover{color:#1e53a0}.td-box--1cyan.td-box--gradient{background:#17a2b8 linear-gradient(180deg,#3ab0c3,#17a2b8)repeat-x!important}.td-box--white{color:#222;background-color:#fff}.td-box--white .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#fff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--white p>a{color:#72a1e5}.td-box--white p>a:hover{color:#1e53a0}.td-box--1white.td-box--gradient{background:#fff linear-gradient(180deg,white,#fff)repeat-x!important}.td-box--gray{color:#fff;background-color:#888}.td-box--gray .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#888 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray p>a{color:#b4cdf1}.td-box--gray p>a:hover{color:#1e53a0}.td-box--1gray.td-box--gradient{background:#888 linear-gradient(180deg,#9a9a9a,#888)repeat-x!important}.td-box--gray-dark{color:#fff;background-color:#333}.td-box--gray-dark .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#333 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--gray-dark p>a{color:#e3ecfa}.td-box--gray-dark p>a:hover{color:#1e53a0}.td-box--1gray-dark.td-box--gradient{background:#333 linear-gradient(180deg,#525252,#333)repeat-x!important}.td-box--primary{color:#fff;background-color:#30638e}.td-box--primary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#30638e transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--primary p>a{color:#cadcf5}.td-box--primary p>a:hover{color:#1e53a0}.td-box--1primary.td-box--gradient{background:#30638e linear-gradient(180deg,#4f7a9f,#30638E)repeat-x!important}.td-box--secondary{color:#fff;background-color:#ffa630}.td-box--secondary .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ffa630 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--secondary p>a{color:#abc7f0}.td-box--secondary p>a:hover{color:#1e53a0}.td-box--1secondary.td-box--gradient{background:#ffa630 linear-gradient(180deg,#ffb34f,#FFA630)repeat-x!important}.td-box--success{color:#fff;background-color:#3772ff}.td-box--success .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#3772ff transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--success p>a{color:#a9c6ef}.td-box--success p>a:hover{color:#1e53a0}.td-box--1success.td-box--gradient{background:#3772ff linear-gradient(180deg,#5587ff,#3772FF)repeat-x!important}.td-box--info{color:#222;background-color:#c0e0de}.td-box--info .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#c0e0de transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--info p>a{color:#638ac1}.td-box--info p>a:hover{color:#1e53a0}.td-box--1info.td-box--gradient{background:#c0e0de linear-gradient(180deg,#c9e5e3,#C0E0DE)repeat-x!important}.td-box--warning{color:#fff;background-color:#ed6a5a}.td-box--warning .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--warning p>a{color:#a5c3ee}.td-box--warning p>a:hover{color:#1e53a0}.td-box--1warning.td-box--gradient{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.td-box--danger{color:#fff;background-color:#ed6a5a}.td-box--danger .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ed6a5a transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--danger p>a{color:#a5c3ee}.td-box--danger p>a:hover{color:#1e53a0}.td-box--1danger.td-box--gradient{background:#ed6a5a linear-gradient(180deg,#f08073,#ED6A5A)repeat-x!important}.td-box--light{color:#222;background-color:#d3f3ee}.td-box--light .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#d3f3ee transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--light p>a{color:#6993d0}.td-box--light p>a:hover{color:#1e53a0}.td-box--1light.td-box--gradient{background:#d3f3ee linear-gradient(180deg,#daf5f1,#D3F3EE)repeat-x!important}.td-box--dark{color:#fff;background-color:#403f4c}.td-box--dark .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#403f4c transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--dark p>a{color:#d9e5f8}.td-box--dark p>a:hover{color:#1e53a0}.td-box--1dark.td-box--gradient{background:#403f4c linear-gradient(180deg,#5d5c67,#403F4C)repeat-x!important}.td-box--100{color:#222;background-color:#f8f9fa}.td-box--100 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#f8f9fa transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--100 p>a{color:#709ee0}.td-box--100 p>a:hover{color:#1e53a0}.td-box--1100.td-box--gradient{background:#f8f9fa linear-gradient(180deg,#f9fafb,#f8f9fa)repeat-x!important}.td-box--200{color:#222;background-color:#eee}.td-box--200 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#eee transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--200 p>a{color:#6d99d8}.td-box--200 p>a:hover{color:#1e53a0}.td-box--1200.td-box--gradient{background:#eee linear-gradient(180deg,#f1f1f1,#eee)repeat-x!important}.td-box--300{color:#222;background-color:#dee2e6}.td-box--300 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#dee2e6 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--300 p>a{color:#6993cf}.td-box--300 p>a:hover{color:#1e53a0}.td-box--1300.td-box--gradient{background:#dee2e6 linear-gradient(180deg,#e3e6ea,#dee2e6)repeat-x!important}.td-box--400{color:#222;background-color:#ccc}.td-box--400 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#ccc transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--400 p>a{color:#6288be}.td-box--400 p>a:hover{color:#1e53a0}.td-box--1400.td-box--gradient{background:#ccc linear-gradient(180deg,#d4d4d4,#ccc)repeat-x!important}.td-box--500{color:#fff;background-color:#adb5bd}.td-box--500 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#adb5bd transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--500 p>a{color:#9bbced}.td-box--500 p>a:hover{color:#1e53a0}.td-box--1500.td-box--gradient{background:#adb5bd linear-gradient(180deg,#b9c0c7,#adb5bd)repeat-x!important}.td-box--600{color:#fff;background-color:#888}.td-box--600 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#888 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--600 p>a{color:#b4cdf1}.td-box--600 p>a:hover{color:#1e53a0}.td-box--1600.td-box--gradient{background:#888 linear-gradient(180deg,#9a9a9a,#888)repeat-x!important}.td-box--700{color:#fff;background-color:#495057}.td-box--700 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#495057 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--700 p>a{color:#d3e2f7}.td-box--700 p>a:hover{color:#1e53a0}.td-box--1700.td-box--gradient{background:#495057 linear-gradient(180deg,#646a70,#495057)repeat-x!important}.td-box--800{color:#fff;background-color:#333}.td-box--800 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#333 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--800 p>a{color:#e3ecfa}.td-box--800 p>a:hover{color:#1e53a0}.td-box--1800.td-box--gradient{background:#333 linear-gradient(180deg,#525252,#333)repeat-x!important}.td-box--900{color:#fff;background-color:#222}.td-box--900 .td-arrow-down::before{left:50%;margin-left:-30px;bottom:-25px;border-style:solid;border-width:25px 30px 0;border-color:#222 transparent transparent transparent;z-index:3;position:absolute;content:""}.td-box--900 p>a{color:#ecf2fc}.td-box--900 p>a:hover{color:#1e53a0}.td-box--1900.td-box--gradient{background:#222 linear-gradient(180deg,#434343,#222)repeat-x!important}.td-blog .td-rss-button{position:absolute;top:5.5rem;right:1rem;z-index:22}.td-content .highlight{margin:2rem 0;padding:0}.td-content .highlight pre{margin:0;padding:1rem}.td-content p code,.td-content li>code,.td-content table code{color:inherit;padding:.2em .4em;margin:0;font-size:85%;word-break:normal;background-color:rgba(0,0,0,5%);border-radius:.25rem}.td-content p code br,.td-content li>code br,.td-content table code br{display:none}.td-content pre{word-wrap:normal;background-color:#f8f9fa;padding:1rem}.td-content pre>code{background-color:inherit!important;padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;border:0}.td-content pre.mermaid{background-color:inherit;font-size:0}.td-navbar-cover{background:#30638e}@media(min-width:768px){.td-navbar-cover{background:0 0!important}.td-navbar-cover .nav-link{text-shadow:1px 1px 2px #403f4c}}.td-navbar-cover.navbar-bg-onscroll .nav-link{text-shadow:none}.navbar-bg-onscroll{background:#30638e!important;opacity:inherit}.td-navbar{background:#30638e;min-height:4rem;margin:0;z-index:32}@media(min-width:768px){.td-navbar{position:fixed;top:0;width:100%}}.td-navbar .navbar-brand{text-transform:none;text-align:middle}.td-navbar .navbar-brand .nav-link{display:inline-block;margin-right:-30px}.td-navbar .navbar-brand svg{display:inline-block;margin:0 10px;height:30px}.td-navbar .nav-link{text-transform:none;font-weight:700}.td-navbar .td-search-input{border:none}.td-navbar .td-search-input::-webkit-input-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search-input:-moz-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search-input::-moz-placeholder{color:rgba(255,255,255,.75)}.td-navbar .td-search-input:-ms-input-placeholder{color:rgba(255,255,255,.75)}.td-navbar .dropdown{min-width:100px}@media(max-width:991.98px){.td-navbar{padding-right:.5rem;padding-left:.75rem}.td-navbar .td-navbar-nav-scroll{max-width:100%;height:2.5rem;margin-top:.25rem;overflow:hidden;font-size:.875rem}.td-navbar .td-navbar-nav-scroll .nav-link{padding-right:.25rem;padding-left:0}.td-navbar .td-navbar-nav-scroll .navbar-nav{padding-bottom:2rem;overflow-x:auto;white-space:nowrap;-webkit-overflow-scrolling:touch}}.td-sidebar-nav{padding-right:.5rem;margin-right:-15px;margin-left:-15px}@media(min-width:768px){@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar-nav{max-height:calc(100vh - 10rem);overflow-y:auto}}}@media(min-width:768px){.td-sidebar-nav{display:block!important}}.td-sidebar-nav__section{padding-left:0}.td-sidebar-nav__section li{list-style:none}.td-sidebar-nav__section ul{padding:0;margin:0}@media(min-width:768px){.td-sidebar-nav__section>ul{padding-left:.5rem}}.td-sidebar-nav__section-title{display:block;font-weight:500}.td-sidebar-nav__section-title .active{font-weight:700}.td-sidebar-nav__section-title a{color:#222}.td-sidebar-nav .td-sidebar-link{display:block;padding-bottom:.375rem}.td-sidebar-nav .td-sidebar-link__page{color:#495057;font-weight:300}.td-sidebar-nav a:hover{color:#72a1e5;text-decoration:none}.td-sidebar-nav a.active{font-weight:700}.td-sidebar-nav .dropdown a{color:#495057}.td-sidebar-nav .dropdown .nav-link{padding:0 0 1rem}.td-sidebar-nav>.td-sidebar-nav__section{padding-top:.5rem;padding-left:1.5rem}.td-sidebar{padding-bottom:1rem}@media(min-width:768px){.td-sidebar{padding-top:4rem;background-color:rgba(48,99,142,3%);padding-right:1rem;border-right:1px solid #dee2e6}}.td-sidebar__toggle{line-height:1;color:#222;margin:1rem}.td-sidebar__search{padding:1rem 15px;margin-right:-15px;margin-left:-15px}.td-sidebar__inner{order:0}@media(min-width:768px){@supports((position:-webkit-sticky) or (position:sticky)){.td-sidebar__inner{position:-webkit-sticky;position:sticky;top:4rem;z-index:10;height:calc(100vh - 6rem)}}}@media(min-width:1200px){.td-sidebar__inner{flex:0 1 320px}}.td-sidebar__inner .td-search-box{width:100%}.td-sidebar #content-desktop{display:block}.td-sidebar #content-mobile{display:none}@media(max-width:991.98px){.td-sidebar #content-desktop{display:none}.td-sidebar #content-mobile{display:block}}.td-toc{border-left:1px solid #dee2e6;order:2;padding-top:.75rem;padding-bottom:1.5rem;vertical-align:top}@supports((position:-webkit-sticky) or (position:sticky)){.td-toc{position:-webkit-sticky;position:sticky;top:4rem;height:calc(100vh - 10rem);overflow-y:auto}}.td-toc a{display:block;font-weight:300;padding-bottom:.25rem}.td-toc li{list-style:none;display:block}.td-toc li li{margin-left:.5rem}.td-toc .td-page-meta a{font-weight:500}.td-toc #TableOfContents a{color:#888}.td-toc #TableOfContents a:hover{color:#72a1e5;text-decoration:none}.td-toc ul{padding-left:0}.btn{border-radius:1rem}.btn-lg,.btn-group-lg>.btn{border-radius:2rem}.btn-sm,.btn-group-sm>.btn{border-radius:1rem}.breadcrumb{background:0 0;padding-left:0;padding-top:0}.alert{font-weight:500;background:#fff;color:inherit;border-radius:0}.alert-primary{border-style:solid;border-color:#30638e;border-width:0 0 0 4px}.alert-primary .alert-heading{color:#30638e}.alert-secondary{border-style:solid;border-color:#ffa630;border-width:0 0 0 4px}.alert-secondary .alert-heading{color:#ffa630}.alert-success{border-style:solid;border-color:#3772ff;border-width:0 0 0 4px}.alert-success .alert-heading{color:#3772ff}.alert-info{border-style:solid;border-color:#c0e0de;border-width:0 0 0 4px}.alert-info .alert-heading{color:#c0e0de}.alert-warning{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-warning .alert-heading{color:#ed6a5a}.alert-danger{border-style:solid;border-color:#ed6a5a;border-width:0 0 0 4px}.alert-danger .alert-heading{color:#ed6a5a}.alert-light{border-style:solid;border-color:#d3f3ee;border-width:0 0 0 4px}.alert-light .alert-heading{color:#d3f3ee}.alert-dark{border-style:solid;border-color:#403f4c;border-width:0 0 0 4px}.alert-dark .alert-heading{color:#403f4c}.td-content{order:1}.td-content p,.td-content li,.td-content td{font-weight:400}.td-content>h1{font-weight:700;margin-bottom:1rem}.td-content>h2{margin-bottom:1rem}.td-content>h2:not(:first-child){margin-top:3rem}.td-content>h2+h3{margin-top:1rem}.td-content>h3,.td-content>h4,.td-content>h5,.td-content>h6{margin-bottom:1rem;margin-top:2rem}.td-content>blockquote{padding:0 0 0 1rem;margin-bottom:1rem;color:#888;border-left:6px solid #ffa630}.td-content>ul li,.td-content>ol li{margin-bottom:.25rem}.td-content strong{font-weight:700}.td-content .alert:not(:first-child){margin-top:2rem;margin-bottom:2rem}.td-content .lead{margin-bottom:1.5rem}.td-title{margin-top:1rem;margin-bottom:.5rem}@media(min-width:576px){.td-title{font-size:3rem}}.td-search-input{background:0 0;max-width:90%;border-radius:1rem;font-family:"font awesome 5 free",open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol}.td-search-input.form-control:focus{border-color:#f5f8fb;box-shadow:0 0 0 2px #82afd5}.popover.offline-search-result{max-width:90%}.popover.offline-search-result .card,.popover.offline-search-result .td-content .highlight,.td-content .popover.offline-search-result .highlight{margin-bottom:.5rem}.popover.offline-search-result .card .card-header,.popover.offline-search-result .td-content .highlight .card-header,.td-content .popover.offline-search-result .highlight .card-header{font-weight:700}.td-outer{display:flex;flex-direction:column;height:100vh}@media(min-width:768px){.td-default main>section:first-of-type{padding-top:8rem}}.td-main{flex-grow:1}.td-main main{padding-bottom:2rem}@media(min-width:768px){.td-main main{padding-top:5.5rem}}.td-cover-block--height-min{min-height:300px}.td-cover-block--height-med{min-height:400px}.td-cover-block--height-max{min-height:500px}.td-cover-block--height-full{min-height:100vh}@media(min-width:768px){.td-cover-block--height-min{min-height:450px}.td-cover-block--height-med{min-height:500px}.td-cover-block--height-max{min-height:650px}}.td-cover-logo{margin-right:.5em}.td-cover-block{position:relative;padding-top:5rem;padding-bottom:5rem;background-repeat:no-repeat;background-position:50% 0;background-size:cover}.td-cover-block>.byline{position:absolute;bottom:2px;right:4px}.td-bg-arrow-wrapper{position:relative}.section-index .entry{padding:.75rem}.section-index h5{margin-bottom:0}.section-index h5 a{font-weight:700}.section-index p{margin-top:0}.pageinfo{font-weight:500;background:#f8f9fa;color:inherit;border-radius:0;margin:2rem;padding:1.5rem;padding-bottom:.5rem}.pageinfo-primary{border-style:solid;border-color:#30638e}.pageinfo-secondary{border-style:solid;border-color:#ffa630}.pageinfo-success{border-style:solid;border-color:#3772ff}.pageinfo-info{border-style:solid;border-color:#c0e0de}.pageinfo-warning{border-style:solid;border-color:#ed6a5a}.pageinfo-danger{border-style:solid;border-color:#ed6a5a}.pageinfo-light{border-style:solid;border-color:#d3f3ee}.pageinfo-dark{border-style:solid;border-color:#403f4c}footer{min-height:150px}@media(max-width:991.98px){footer{min-height:200px}}@media(min-width:768px){.td-offset-anchor:target{display:block;position:relative;top:-4rem;visibility:hidden}h2[id]:before,h3[id]:before,h4[id]:before,h5[id]:before{display:block;content:" ";margin-top:-5rem;height:5rem;visibility:hidden}}body:lang(fa),body:lang(ar),body:lang(az),body:lang(dv),body:lang(he),body:lang(ku),body:lang(ur){direction:rtl;text-align:right}body:lang(fa) .m-0,body:lang(ar) .m-0,body:lang(az) .m-0,body:lang(dv) .m-0,body:lang(he) .m-0,body:lang(ku) .m-0,body:lang(ur) .m-0{margin:0!important}body:lang(fa) .mt-0,body:lang(fa) .my-0,body:lang(ar) .mt-0,body:lang(ar) .my-0,body:lang(az) .mt-0,body:lang(az) .my-0,body:lang(dv) .mt-0,body:lang(dv) .my-0,body:lang(he) .mt-0,body:lang(he) .my-0,body:lang(ku) .mt-0,body:lang(ku) .my-0,body:lang(ur) .mt-0,body:lang(ur) .my-0{margin-top:0!important}body:lang(fa) .mr-0,body:lang(fa) .mx-0,body:lang(ar) .mr-0,body:lang(ar) .mx-0,body:lang(az) .mr-0,body:lang(az) .mx-0,body:lang(dv) .mr-0,body:lang(dv) .mx-0,body:lang(he) .mr-0,body:lang(he) .mx-0,body:lang(ku) .mr-0,body:lang(ku) .mx-0,body:lang(ur) .mr-0,body:lang(ur) .mx-0{-webkit-margin-end:0!important;margin-inline-end:0!important}body:lang(fa) .mb-0,body:lang(fa) .my-0,body:lang(ar) .mb-0,body:lang(ar) .my-0,body:lang(az) .mb-0,body:lang(az) .my-0,body:lang(dv) .mb-0,body:lang(dv) .my-0,body:lang(he) .mb-0,body:lang(he) .my-0,body:lang(ku) .mb-0,body:lang(ku) .my-0,body:lang(ur) .mb-0,body:lang(ur) .my-0{margin-bottom:0!important}body:lang(fa) .ml-0,body:lang(fa) .mx-0,body:lang(ar) .ml-0,body:lang(ar) .mx-0,body:lang(az) .ml-0,body:lang(az) .mx-0,body:lang(dv) .ml-0,body:lang(dv) .mx-0,body:lang(he) .ml-0,body:lang(he) .mx-0,body:lang(ku) .ml-0,body:lang(ku) .mx-0,body:lang(ur) .ml-0,body:lang(ur) .mx-0{-webkit-margin-start:0!important;margin-inline-start:0!important}body:lang(fa) .m-1,body:lang(ar) .m-1,body:lang(az) .m-1,body:lang(dv) .m-1,body:lang(he) .m-1,body:lang(ku) .m-1,body:lang(ur) .m-1{margin:.25rem!important}body:lang(fa) .mt-1,body:lang(fa) .my-1,body:lang(ar) .mt-1,body:lang(ar) .my-1,body:lang(az) .mt-1,body:lang(az) .my-1,body:lang(dv) .mt-1,body:lang(dv) .my-1,body:lang(he) .mt-1,body:lang(he) .my-1,body:lang(ku) .mt-1,body:lang(ku) .my-1,body:lang(ur) .mt-1,body:lang(ur) .my-1{margin-top:.25rem!important}body:lang(fa) .mr-1,body:lang(fa) .mx-1,body:lang(ar) .mr-1,body:lang(ar) .mx-1,body:lang(az) .mr-1,body:lang(az) .mx-1,body:lang(dv) .mr-1,body:lang(dv) .mx-1,body:lang(he) .mr-1,body:lang(he) .mx-1,body:lang(ku) .mr-1,body:lang(ku) .mx-1,body:lang(ur) .mr-1,body:lang(ur) .mx-1{-webkit-margin-end:.25rem!important;margin-inline-end:.25rem!important}body:lang(fa) .mb-1,body:lang(fa) .my-1,body:lang(ar) .mb-1,body:lang(ar) .my-1,body:lang(az) .mb-1,body:lang(az) .my-1,body:lang(dv) .mb-1,body:lang(dv) .my-1,body:lang(he) .mb-1,body:lang(he) .my-1,body:lang(ku) .mb-1,body:lang(ku) .my-1,body:lang(ur) .mb-1,body:lang(ur) .my-1{margin-bottom:.25rem!important}body:lang(fa) .ml-1,body:lang(fa) .mx-1,body:lang(ar) .ml-1,body:lang(ar) .mx-1,body:lang(az) .ml-1,body:lang(az) .mx-1,body:lang(dv) .ml-1,body:lang(dv) .mx-1,body:lang(he) .ml-1,body:lang(he) .mx-1,body:lang(ku) .ml-1,body:lang(ku) .mx-1,body:lang(ur) .ml-1,body:lang(ur) .mx-1{-webkit-margin-start:.25rem!important;margin-inline-start:.25rem!important}body:lang(fa) .m-2,body:lang(ar) .m-2,body:lang(az) .m-2,body:lang(dv) .m-2,body:lang(he) .m-2,body:lang(ku) .m-2,body:lang(ur) .m-2{margin:.5rem!important}body:lang(fa) .mt-2,body:lang(fa) .my-2,body:lang(ar) .mt-2,body:lang(ar) .my-2,body:lang(az) .mt-2,body:lang(az) .my-2,body:lang(dv) .mt-2,body:lang(dv) .my-2,body:lang(he) .mt-2,body:lang(he) .my-2,body:lang(ku) .mt-2,body:lang(ku) .my-2,body:lang(ur) .mt-2,body:lang(ur) .my-2{margin-top:.5rem!important}body:lang(fa) .mr-2,body:lang(fa) .mx-2,body:lang(ar) .mr-2,body:lang(ar) .mx-2,body:lang(az) .mr-2,body:lang(az) .mx-2,body:lang(dv) .mr-2,body:lang(dv) .mx-2,body:lang(he) .mr-2,body:lang(he) .mx-2,body:lang(ku) .mr-2,body:lang(ku) .mx-2,body:lang(ur) .mr-2,body:lang(ur) .mx-2{-webkit-margin-end:.5rem!important;margin-inline-end:.5rem!important}body:lang(fa) .mb-2,body:lang(fa) .my-2,body:lang(ar) .mb-2,body:lang(ar) .my-2,body:lang(az) .mb-2,body:lang(az) .my-2,body:lang(dv) .mb-2,body:lang(dv) .my-2,body:lang(he) .mb-2,body:lang(he) .my-2,body:lang(ku) .mb-2,body:lang(ku) .my-2,body:lang(ur) .mb-2,body:lang(ur) .my-2{margin-bottom:.5rem!important}body:lang(fa) .ml-2,body:lang(fa) .mx-2,body:lang(ar) .ml-2,body:lang(ar) .mx-2,body:lang(az) .ml-2,body:lang(az) .mx-2,body:lang(dv) .ml-2,body:lang(dv) .mx-2,body:lang(he) .ml-2,body:lang(he) .mx-2,body:lang(ku) .ml-2,body:lang(ku) .mx-2,body:lang(ur) .ml-2,body:lang(ur) .mx-2{-webkit-margin-start:.5rem!important;margin-inline-start:.5rem!important}body:lang(fa) .m-3,body:lang(ar) .m-3,body:lang(az) .m-3,body:lang(dv) .m-3,body:lang(he) .m-3,body:lang(ku) .m-3,body:lang(ur) .m-3{margin:1rem!important}body:lang(fa) .mt-3,body:lang(fa) .my-3,body:lang(ar) .mt-3,body:lang(ar) .my-3,body:lang(az) .mt-3,body:lang(az) .my-3,body:lang(dv) .mt-3,body:lang(dv) .my-3,body:lang(he) .mt-3,body:lang(he) .my-3,body:lang(ku) .mt-3,body:lang(ku) .my-3,body:lang(ur) .mt-3,body:lang(ur) .my-3{margin-top:1rem!important}body:lang(fa) .mr-3,body:lang(fa) .mx-3,body:lang(ar) .mr-3,body:lang(ar) .mx-3,body:lang(az) .mr-3,body:lang(az) .mx-3,body:lang(dv) .mr-3,body:lang(dv) .mx-3,body:lang(he) .mr-3,body:lang(he) .mx-3,body:lang(ku) .mr-3,body:lang(ku) .mx-3,body:lang(ur) .mr-3,body:lang(ur) .mx-3{-webkit-margin-end:1rem!important;margin-inline-end:1rem!important}body:lang(fa) .mb-3,body:lang(fa) .my-3,body:lang(ar) .mb-3,body:lang(ar) .my-3,body:lang(az) .mb-3,body:lang(az) .my-3,body:lang(dv) .mb-3,body:lang(dv) .my-3,body:lang(he) .mb-3,body:lang(he) .my-3,body:lang(ku) .mb-3,body:lang(ku) .my-3,body:lang(ur) .mb-3,body:lang(ur) .my-3{margin-bottom:1rem!important}body:lang(fa) .ml-3,body:lang(fa) .mx-3,body:lang(ar) .ml-3,body:lang(ar) .mx-3,body:lang(az) .ml-3,body:lang(az) .mx-3,body:lang(dv) .ml-3,body:lang(dv) .mx-3,body:lang(he) .ml-3,body:lang(he) .mx-3,body:lang(ku) .ml-3,body:lang(ku) .mx-3,body:lang(ur) .ml-3,body:lang(ur) .mx-3{-webkit-margin-start:1rem!important;margin-inline-start:1rem!important}body:lang(fa) .m-4,body:lang(ar) .m-4,body:lang(az) .m-4,body:lang(dv) .m-4,body:lang(he) .m-4,body:lang(ku) .m-4,body:lang(ur) .m-4{margin:1.5rem!important}body:lang(fa) .mt-4,body:lang(fa) .my-4,body:lang(ar) .mt-4,body:lang(ar) .my-4,body:lang(az) .mt-4,body:lang(az) .my-4,body:lang(dv) .mt-4,body:lang(dv) .my-4,body:lang(he) .mt-4,body:lang(he) .my-4,body:lang(ku) .mt-4,body:lang(ku) .my-4,body:lang(ur) .mt-4,body:lang(ur) .my-4{margin-top:1.5rem!important}body:lang(fa) .mr-4,body:lang(fa) .mx-4,body:lang(ar) .mr-4,body:lang(ar) .mx-4,body:lang(az) .mr-4,body:lang(az) .mx-4,body:lang(dv) .mr-4,body:lang(dv) .mx-4,body:lang(he) .mr-4,body:lang(he) .mx-4,body:lang(ku) .mr-4,body:lang(ku) .mx-4,body:lang(ur) .mr-4,body:lang(ur) .mx-4{-webkit-margin-end:1.5rem!important;margin-inline-end:1.5rem!important}body:lang(fa) .mb-4,body:lang(fa) .my-4,body:lang(ar) .mb-4,body:lang(ar) .my-4,body:lang(az) .mb-4,body:lang(az) .my-4,body:lang(dv) .mb-4,body:lang(dv) .my-4,body:lang(he) .mb-4,body:lang(he) .my-4,body:lang(ku) .mb-4,body:lang(ku) .my-4,body:lang(ur) .mb-4,body:lang(ur) .my-4{margin-bottom:1.5rem!important}body:lang(fa) .ml-4,body:lang(fa) .mx-4,body:lang(ar) .ml-4,body:lang(ar) .mx-4,body:lang(az) .ml-4,body:lang(az) .mx-4,body:lang(dv) .ml-4,body:lang(dv) .mx-4,body:lang(he) .ml-4,body:lang(he) .mx-4,body:lang(ku) .ml-4,body:lang(ku) .mx-4,body:lang(ur) .ml-4,body:lang(ur) .mx-4{-webkit-margin-start:1.5rem!important;margin-inline-start:1.5rem!important}body:lang(fa) .m-5,body:lang(ar) .m-5,body:lang(az) .m-5,body:lang(dv) .m-5,body:lang(he) .m-5,body:lang(ku) .m-5,body:lang(ur) .m-5{margin:3rem!important}body:lang(fa) .mt-5,body:lang(fa) .my-5,body:lang(ar) .mt-5,body:lang(ar) .my-5,body:lang(az) .mt-5,body:lang(az) .my-5,body:lang(dv) .mt-5,body:lang(dv) .my-5,body:lang(he) .mt-5,body:lang(he) .my-5,body:lang(ku) .mt-5,body:lang(ku) .my-5,body:lang(ur) .mt-5,body:lang(ur) .my-5{margin-top:3rem!important}body:lang(fa) .mr-5,body:lang(fa) .mx-5,body:lang(ar) .mr-5,body:lang(ar) .mx-5,body:lang(az) .mr-5,body:lang(az) .mx-5,body:lang(dv) .mr-5,body:lang(dv) .mx-5,body:lang(he) .mr-5,body:lang(he) .mx-5,body:lang(ku) .mr-5,body:lang(ku) .mx-5,body:lang(ur) .mr-5,body:lang(ur) .mx-5{-webkit-margin-end:3rem!important;margin-inline-end:3rem!important}body:lang(fa) .mb-5,body:lang(fa) .my-5,body:lang(ar) .mb-5,body:lang(ar) .my-5,body:lang(az) .mb-5,body:lang(az) .my-5,body:lang(dv) .mb-5,body:lang(dv) .my-5,body:lang(he) .mb-5,body:lang(he) .my-5,body:lang(ku) .mb-5,body:lang(ku) .my-5,body:lang(ur) .mb-5,body:lang(ur) .my-5{margin-bottom:3rem!important}body:lang(fa) .ml-5,body:lang(fa) .mx-5,body:lang(ar) .ml-5,body:lang(ar) .mx-5,body:lang(az) .ml-5,body:lang(az) .mx-5,body:lang(dv) .ml-5,body:lang(dv) .mx-5,body:lang(he) .ml-5,body:lang(he) .mx-5,body:lang(ku) .ml-5,body:lang(ku) .mx-5,body:lang(ur) .ml-5,body:lang(ur) .mx-5{-webkit-margin-start:3rem!important;margin-inline-start:3rem!important}body:lang(fa) .p-0,body:lang(ar) .p-0,body:lang(az) .p-0,body:lang(dv) .p-0,body:lang(he) .p-0,body:lang(ku) .p-0,body:lang(ur) .p-0{padding:0!important}body:lang(fa) .pt-0,body:lang(fa) .py-0,body:lang(ar) .pt-0,body:lang(ar) .py-0,body:lang(az) .pt-0,body:lang(az) .py-0,body:lang(dv) .pt-0,body:lang(dv) .py-0,body:lang(he) .pt-0,body:lang(he) .py-0,body:lang(ku) .pt-0,body:lang(ku) .py-0,body:lang(ur) .pt-0,body:lang(ur) .py-0{padding-top:0!important}body:lang(fa) .pr-0,body:lang(fa) .px-0,body:lang(ar) .pr-0,body:lang(ar) .px-0,body:lang(az) .pr-0,body:lang(az) .px-0,body:lang(dv) .pr-0,body:lang(dv) .px-0,body:lang(he) .pr-0,body:lang(he) .px-0,body:lang(ku) .pr-0,body:lang(ku) .px-0,body:lang(ur) .pr-0,body:lang(ur) .px-0{-webkit-padding-end:0!important;padding-inline-end:0!important}body:lang(fa) .pb-0,body:lang(fa) .py-0,body:lang(ar) .pb-0,body:lang(ar) .py-0,body:lang(az) .pb-0,body:lang(az) .py-0,body:lang(dv) .pb-0,body:lang(dv) .py-0,body:lang(he) .pb-0,body:lang(he) .py-0,body:lang(ku) .pb-0,body:lang(ku) .py-0,body:lang(ur) .pb-0,body:lang(ur) .py-0{padding-bottom:0!important}body:lang(fa) .pl-0,body:lang(fa) .px-0,body:lang(ar) .pl-0,body:lang(ar) .px-0,body:lang(az) .pl-0,body:lang(az) .px-0,body:lang(dv) .pl-0,body:lang(dv) .px-0,body:lang(he) .pl-0,body:lang(he) .px-0,body:lang(ku) .pl-0,body:lang(ku) .px-0,body:lang(ur) .pl-0,body:lang(ur) .px-0{-webkit-padding-start:0!important;padding-inline-start:0!important}body:lang(fa) .p-1,body:lang(ar) .p-1,body:lang(az) .p-1,body:lang(dv) .p-1,body:lang(he) .p-1,body:lang(ku) .p-1,body:lang(ur) .p-1{padding:.25rem!important}body:lang(fa) .pt-1,body:lang(fa) .py-1,body:lang(ar) .pt-1,body:lang(ar) .py-1,body:lang(az) .pt-1,body:lang(az) .py-1,body:lang(dv) .pt-1,body:lang(dv) .py-1,body:lang(he) .pt-1,body:lang(he) .py-1,body:lang(ku) .pt-1,body:lang(ku) .py-1,body:lang(ur) .pt-1,body:lang(ur) .py-1{padding-top:.25rem!important}body:lang(fa) .pr-1,body:lang(fa) .px-1,body:lang(ar) .pr-1,body:lang(ar) .px-1,body:lang(az) .pr-1,body:lang(az) .px-1,body:lang(dv) .pr-1,body:lang(dv) .px-1,body:lang(he) .pr-1,body:lang(he) .px-1,body:lang(ku) .pr-1,body:lang(ku) .px-1,body:lang(ur) .pr-1,body:lang(ur) .px-1{-webkit-padding-end:.25rem!important;padding-inline-end:.25rem!important}body:lang(fa) .pb-1,body:lang(fa) .py-1,body:lang(ar) .pb-1,body:lang(ar) .py-1,body:lang(az) .pb-1,body:lang(az) .py-1,body:lang(dv) .pb-1,body:lang(dv) .py-1,body:lang(he) .pb-1,body:lang(he) .py-1,body:lang(ku) .pb-1,body:lang(ku) .py-1,body:lang(ur) .pb-1,body:lang(ur) .py-1{padding-bottom:.25rem!important}body:lang(fa) .pl-1,body:lang(fa) .px-1,body:lang(ar) .pl-1,body:lang(ar) .px-1,body:lang(az) .pl-1,body:lang(az) .px-1,body:lang(dv) .pl-1,body:lang(dv) .px-1,body:lang(he) .pl-1,body:lang(he) .px-1,body:lang(ku) .pl-1,body:lang(ku) .px-1,body:lang(ur) .pl-1,body:lang(ur) .px-1{-webkit-padding-start:.25rem!important;padding-inline-start:.25rem!important}body:lang(fa) .p-2,body:lang(ar) .p-2,body:lang(az) .p-2,body:lang(dv) .p-2,body:lang(he) .p-2,body:lang(ku) .p-2,body:lang(ur) .p-2{padding:.5rem!important}body:lang(fa) .pt-2,body:lang(fa) .py-2,body:lang(ar) .pt-2,body:lang(ar) .py-2,body:lang(az) .pt-2,body:lang(az) .py-2,body:lang(dv) .pt-2,body:lang(dv) .py-2,body:lang(he) .pt-2,body:lang(he) .py-2,body:lang(ku) .pt-2,body:lang(ku) .py-2,body:lang(ur) .pt-2,body:lang(ur) .py-2{padding-top:.5rem!important}body:lang(fa) .pr-2,body:lang(fa) .px-2,body:lang(ar) .pr-2,body:lang(ar) .px-2,body:lang(az) .pr-2,body:lang(az) .px-2,body:lang(dv) .pr-2,body:lang(dv) .px-2,body:lang(he) .pr-2,body:lang(he) .px-2,body:lang(ku) .pr-2,body:lang(ku) .px-2,body:lang(ur) .pr-2,body:lang(ur) .px-2{-webkit-padding-end:.5rem!important;padding-inline-end:.5rem!important}body:lang(fa) .pb-2,body:lang(fa) .py-2,body:lang(ar) .pb-2,body:lang(ar) .py-2,body:lang(az) .pb-2,body:lang(az) .py-2,body:lang(dv) .pb-2,body:lang(dv) .py-2,body:lang(he) .pb-2,body:lang(he) .py-2,body:lang(ku) .pb-2,body:lang(ku) .py-2,body:lang(ur) .pb-2,body:lang(ur) .py-2{padding-bottom:.5rem!important}body:lang(fa) .pl-2,body:lang(fa) .px-2,body:lang(ar) .pl-2,body:lang(ar) .px-2,body:lang(az) .pl-2,body:lang(az) .px-2,body:lang(dv) .pl-2,body:lang(dv) .px-2,body:lang(he) .pl-2,body:lang(he) .px-2,body:lang(ku) .pl-2,body:lang(ku) .px-2,body:lang(ur) .pl-2,body:lang(ur) .px-2{-webkit-padding-start:.5rem!important;padding-inline-start:.5rem!important}body:lang(fa) .p-3,body:lang(ar) .p-3,body:lang(az) .p-3,body:lang(dv) .p-3,body:lang(he) .p-3,body:lang(ku) .p-3,body:lang(ur) .p-3{padding:1rem!important}body:lang(fa) .pt-3,body:lang(fa) .py-3,body:lang(ar) .pt-3,body:lang(ar) .py-3,body:lang(az) .pt-3,body:lang(az) .py-3,body:lang(dv) .pt-3,body:lang(dv) .py-3,body:lang(he) .pt-3,body:lang(he) .py-3,body:lang(ku) .pt-3,body:lang(ku) .py-3,body:lang(ur) .pt-3,body:lang(ur) .py-3{padding-top:1rem!important}body:lang(fa) .pr-3,body:lang(fa) .px-3,body:lang(ar) .pr-3,body:lang(ar) .px-3,body:lang(az) .pr-3,body:lang(az) .px-3,body:lang(dv) .pr-3,body:lang(dv) .px-3,body:lang(he) .pr-3,body:lang(he) .px-3,body:lang(ku) .pr-3,body:lang(ku) .px-3,body:lang(ur) .pr-3,body:lang(ur) .px-3{-webkit-padding-end:1rem!important;padding-inline-end:1rem!important}body:lang(fa) .pb-3,body:lang(fa) .py-3,body:lang(ar) .pb-3,body:lang(ar) .py-3,body:lang(az) .pb-3,body:lang(az) .py-3,body:lang(dv) .pb-3,body:lang(dv) .py-3,body:lang(he) .pb-3,body:lang(he) .py-3,body:lang(ku) .pb-3,body:lang(ku) .py-3,body:lang(ur) .pb-3,body:lang(ur) .py-3{padding-bottom:1rem!important}body:lang(fa) .pl-3,body:lang(fa) .px-3,body:lang(ar) .pl-3,body:lang(ar) .px-3,body:lang(az) .pl-3,body:lang(az) .px-3,body:lang(dv) .pl-3,body:lang(dv) .px-3,body:lang(he) .pl-3,body:lang(he) .px-3,body:lang(ku) .pl-3,body:lang(ku) .px-3,body:lang(ur) .pl-3,body:lang(ur) .px-3{-webkit-padding-start:1rem!important;padding-inline-start:1rem!important}body:lang(fa) .p-4,body:lang(ar) .p-4,body:lang(az) .p-4,body:lang(dv) .p-4,body:lang(he) .p-4,body:lang(ku) .p-4,body:lang(ur) .p-4{padding:1.5rem!important}body:lang(fa) .pt-4,body:lang(fa) .py-4,body:lang(ar) .pt-4,body:lang(ar) .py-4,body:lang(az) .pt-4,body:lang(az) .py-4,body:lang(dv) .pt-4,body:lang(dv) .py-4,body:lang(he) .pt-4,body:lang(he) .py-4,body:lang(ku) .pt-4,body:lang(ku) .py-4,body:lang(ur) .pt-4,body:lang(ur) .py-4{padding-top:1.5rem!important}body:lang(fa) .pr-4,body:lang(fa) .px-4,body:lang(ar) .pr-4,body:lang(ar) .px-4,body:lang(az) .pr-4,body:lang(az) .px-4,body:lang(dv) .pr-4,body:lang(dv) .px-4,body:lang(he) .pr-4,body:lang(he) .px-4,body:lang(ku) .pr-4,body:lang(ku) .px-4,body:lang(ur) .pr-4,body:lang(ur) .px-4{-webkit-padding-end:1.5rem!important;padding-inline-end:1.5rem!important}body:lang(fa) .pb-4,body:lang(fa) .py-4,body:lang(ar) .pb-4,body:lang(ar) .py-4,body:lang(az) .pb-4,body:lang(az) .py-4,body:lang(dv) .pb-4,body:lang(dv) .py-4,body:lang(he) .pb-4,body:lang(he) .py-4,body:lang(ku) .pb-4,body:lang(ku) .py-4,body:lang(ur) .pb-4,body:lang(ur) .py-4{padding-bottom:1.5rem!important}body:lang(fa) .pl-4,body:lang(fa) .px-4,body:lang(ar) .pl-4,body:lang(ar) .px-4,body:lang(az) .pl-4,body:lang(az) .px-4,body:lang(dv) .pl-4,body:lang(dv) .px-4,body:lang(he) .pl-4,body:lang(he) .px-4,body:lang(ku) .pl-4,body:lang(ku) .px-4,body:lang(ur) .pl-4,body:lang(ur) .px-4{-webkit-padding-start:1.5rem!important;padding-inline-start:1.5rem!important}body:lang(fa) .p-5,body:lang(ar) .p-5,body:lang(az) .p-5,body:lang(dv) .p-5,body:lang(he) .p-5,body:lang(ku) .p-5,body:lang(ur) .p-5{padding:3rem!important}body:lang(fa) .pt-5,body:lang(fa) .py-5,body:lang(ar) .pt-5,body:lang(ar) .py-5,body:lang(az) .pt-5,body:lang(az) .py-5,body:lang(dv) .pt-5,body:lang(dv) .py-5,body:lang(he) .pt-5,body:lang(he) .py-5,body:lang(ku) .pt-5,body:lang(ku) .py-5,body:lang(ur) .pt-5,body:lang(ur) .py-5{padding-top:3rem!important}body:lang(fa) .pr-5,body:lang(fa) .px-5,body:lang(ar) .pr-5,body:lang(ar) .px-5,body:lang(az) .pr-5,body:lang(az) .px-5,body:lang(dv) .pr-5,body:lang(dv) .px-5,body:lang(he) .pr-5,body:lang(he) .px-5,body:lang(ku) .pr-5,body:lang(ku) .px-5,body:lang(ur) .pr-5,body:lang(ur) .px-5{-webkit-padding-end:3rem!important;padding-inline-end:3rem!important}body:lang(fa) .pb-5,body:lang(fa) .py-5,body:lang(ar) .pb-5,body:lang(ar) .py-5,body:lang(az) .pb-5,body:lang(az) .py-5,body:lang(dv) .pb-5,body:lang(dv) .py-5,body:lang(he) .pb-5,body:lang(he) .py-5,body:lang(ku) .pb-5,body:lang(ku) .py-5,body:lang(ur) .pb-5,body:lang(ur) .py-5{padding-bottom:3rem!important}body:lang(fa) .pl-5,body:lang(fa) .px-5,body:lang(ar) .pl-5,body:lang(ar) .px-5,body:lang(az) .pl-5,body:lang(az) .px-5,body:lang(dv) .pl-5,body:lang(dv) .px-5,body:lang(he) .pl-5,body:lang(he) .px-5,body:lang(ku) .pl-5,body:lang(ku) .px-5,body:lang(ur) .pl-5,body:lang(ur) .px-5{-webkit-padding-start:3rem!important;padding-inline-start:3rem!important}body:lang(fa) .m-n1,body:lang(ar) .m-n1,body:lang(az) .m-n1,body:lang(dv) .m-n1,body:lang(he) .m-n1,body:lang(ku) .m-n1,body:lang(ur) .m-n1{margin:-.25rem!important}body:lang(fa) .mt-n1,body:lang(fa) .my-n1,body:lang(ar) .mt-n1,body:lang(ar) .my-n1,body:lang(az) .mt-n1,body:lang(az) .my-n1,body:lang(dv) .mt-n1,body:lang(dv) .my-n1,body:lang(he) .mt-n1,body:lang(he) .my-n1,body:lang(ku) .mt-n1,body:lang(ku) .my-n1,body:lang(ur) .mt-n1,body:lang(ur) .my-n1{margin-top:-.25rem!important}body:lang(fa) .mr-n1,body:lang(fa) .mx-n1,body:lang(ar) .mr-n1,body:lang(ar) .mx-n1,body:lang(az) .mr-n1,body:lang(az) .mx-n1,body:lang(dv) .mr-n1,body:lang(dv) .mx-n1,body:lang(he) .mr-n1,body:lang(he) .mx-n1,body:lang(ku) .mr-n1,body:lang(ku) .mx-n1,body:lang(ur) .mr-n1,body:lang(ur) .mx-n1{margin-right:-.25rem!important}body:lang(fa) .mb-n1,body:lang(fa) .my-n1,body:lang(ar) .mb-n1,body:lang(ar) .my-n1,body:lang(az) .mb-n1,body:lang(az) .my-n1,body:lang(dv) .mb-n1,body:lang(dv) .my-n1,body:lang(he) .mb-n1,body:lang(he) .my-n1,body:lang(ku) .mb-n1,body:lang(ku) .my-n1,body:lang(ur) .mb-n1,body:lang(ur) .my-n1{margin-bottom:-.25rem!important}body:lang(fa) .ml-n1,body:lang(fa) .mx-n1,body:lang(ar) .ml-n1,body:lang(ar) .mx-n1,body:lang(az) .ml-n1,body:lang(az) .mx-n1,body:lang(dv) .ml-n1,body:lang(dv) .mx-n1,body:lang(he) .ml-n1,body:lang(he) .mx-n1,body:lang(ku) .ml-n1,body:lang(ku) .mx-n1,body:lang(ur) .ml-n1,body:lang(ur) .mx-n1{margin-left:-.25rem!important}body:lang(fa) .m-n2,body:lang(ar) .m-n2,body:lang(az) .m-n2,body:lang(dv) .m-n2,body:lang(he) .m-n2,body:lang(ku) .m-n2,body:lang(ur) .m-n2{margin:-.5rem!important}body:lang(fa) .mt-n2,body:lang(fa) .my-n2,body:lang(ar) .mt-n2,body:lang(ar) .my-n2,body:lang(az) .mt-n2,body:lang(az) .my-n2,body:lang(dv) .mt-n2,body:lang(dv) .my-n2,body:lang(he) .mt-n2,body:lang(he) .my-n2,body:lang(ku) .mt-n2,body:lang(ku) .my-n2,body:lang(ur) .mt-n2,body:lang(ur) .my-n2{margin-top:-.5rem!important}body:lang(fa) .mr-n2,body:lang(fa) .mx-n2,body:lang(ar) .mr-n2,body:lang(ar) .mx-n2,body:lang(az) .mr-n2,body:lang(az) .mx-n2,body:lang(dv) .mr-n2,body:lang(dv) .mx-n2,body:lang(he) .mr-n2,body:lang(he) .mx-n2,body:lang(ku) .mr-n2,body:lang(ku) .mx-n2,body:lang(ur) .mr-n2,body:lang(ur) .mx-n2{margin-right:-.5rem!important}body:lang(fa) .mb-n2,body:lang(fa) .my-n2,body:lang(ar) .mb-n2,body:lang(ar) .my-n2,body:lang(az) .mb-n2,body:lang(az) .my-n2,body:lang(dv) .mb-n2,body:lang(dv) .my-n2,body:lang(he) .mb-n2,body:lang(he) .my-n2,body:lang(ku) .mb-n2,body:lang(ku) .my-n2,body:lang(ur) .mb-n2,body:lang(ur) .my-n2{margin-bottom:-.5rem!important}body:lang(fa) .ml-n2,body:lang(fa) .mx-n2,body:lang(ar) .ml-n2,body:lang(ar) .mx-n2,body:lang(az) .ml-n2,body:lang(az) .mx-n2,body:lang(dv) .ml-n2,body:lang(dv) .mx-n2,body:lang(he) .ml-n2,body:lang(he) .mx-n2,body:lang(ku) .ml-n2,body:lang(ku) .mx-n2,body:lang(ur) .ml-n2,body:lang(ur) .mx-n2{margin-left:-.5rem!important}body:lang(fa) .m-n3,body:lang(ar) .m-n3,body:lang(az) .m-n3,body:lang(dv) .m-n3,body:lang(he) .m-n3,body:lang(ku) .m-n3,body:lang(ur) .m-n3{margin:-1rem!important}body:lang(fa) .mt-n3,body:lang(fa) .my-n3,body:lang(ar) .mt-n3,body:lang(ar) .my-n3,body:lang(az) .mt-n3,body:lang(az) .my-n3,body:lang(dv) .mt-n3,body:lang(dv) .my-n3,body:lang(he) .mt-n3,body:lang(he) .my-n3,body:lang(ku) .mt-n3,body:lang(ku) .my-n3,body:lang(ur) .mt-n3,body:lang(ur) .my-n3{margin-top:-1rem!important}body:lang(fa) .mr-n3,body:lang(fa) .mx-n3,body:lang(ar) .mr-n3,body:lang(ar) .mx-n3,body:lang(az) .mr-n3,body:lang(az) .mx-n3,body:lang(dv) .mr-n3,body:lang(dv) .mx-n3,body:lang(he) .mr-n3,body:lang(he) .mx-n3,body:lang(ku) .mr-n3,body:lang(ku) .mx-n3,body:lang(ur) .mr-n3,body:lang(ur) .mx-n3{margin-right:-1rem!important}body:lang(fa) .mb-n3,body:lang(fa) .my-n3,body:lang(ar) .mb-n3,body:lang(ar) .my-n3,body:lang(az) .mb-n3,body:lang(az) .my-n3,body:lang(dv) .mb-n3,body:lang(dv) .my-n3,body:lang(he) .mb-n3,body:lang(he) .my-n3,body:lang(ku) .mb-n3,body:lang(ku) .my-n3,body:lang(ur) .mb-n3,body:lang(ur) .my-n3{margin-bottom:-1rem!important}body:lang(fa) .ml-n3,body:lang(fa) .mx-n3,body:lang(ar) .ml-n3,body:lang(ar) .mx-n3,body:lang(az) .ml-n3,body:lang(az) .mx-n3,body:lang(dv) .ml-n3,body:lang(dv) .mx-n3,body:lang(he) .ml-n3,body:lang(he) .mx-n3,body:lang(ku) .ml-n3,body:lang(ku) .mx-n3,body:lang(ur) .ml-n3,body:lang(ur) .mx-n3{margin-left:-1rem!important}body:lang(fa) .m-n4,body:lang(ar) .m-n4,body:lang(az) .m-n4,body:lang(dv) .m-n4,body:lang(he) .m-n4,body:lang(ku) .m-n4,body:lang(ur) .m-n4{margin:-1.5rem!important}body:lang(fa) .mt-n4,body:lang(fa) .my-n4,body:lang(ar) .mt-n4,body:lang(ar) .my-n4,body:lang(az) .mt-n4,body:lang(az) .my-n4,body:lang(dv) .mt-n4,body:lang(dv) .my-n4,body:lang(he) .mt-n4,body:lang(he) .my-n4,body:lang(ku) .mt-n4,body:lang(ku) .my-n4,body:lang(ur) .mt-n4,body:lang(ur) .my-n4{margin-top:-1.5rem!important}body:lang(fa) .mr-n4,body:lang(fa) .mx-n4,body:lang(ar) .mr-n4,body:lang(ar) .mx-n4,body:lang(az) .mr-n4,body:lang(az) .mx-n4,body:lang(dv) .mr-n4,body:lang(dv) .mx-n4,body:lang(he) .mr-n4,body:lang(he) .mx-n4,body:lang(ku) .mr-n4,body:lang(ku) .mx-n4,body:lang(ur) .mr-n4,body:lang(ur) .mx-n4{margin-right:-1.5rem!important}body:lang(fa) .mb-n4,body:lang(fa) .my-n4,body:lang(ar) .mb-n4,body:lang(ar) .my-n4,body:lang(az) .mb-n4,body:lang(az) .my-n4,body:lang(dv) .mb-n4,body:lang(dv) .my-n4,body:lang(he) .mb-n4,body:lang(he) .my-n4,body:lang(ku) .mb-n4,body:lang(ku) .my-n4,body:lang(ur) .mb-n4,body:lang(ur) .my-n4{margin-bottom:-1.5rem!important}body:lang(fa) .ml-n4,body:lang(fa) .mx-n4,body:lang(ar) .ml-n4,body:lang(ar) .mx-n4,body:lang(az) .ml-n4,body:lang(az) .mx-n4,body:lang(dv) .ml-n4,body:lang(dv) .mx-n4,body:lang(he) .ml-n4,body:lang(he) .mx-n4,body:lang(ku) .ml-n4,body:lang(ku) .mx-n4,body:lang(ur) .ml-n4,body:lang(ur) .mx-n4{margin-left:-1.5rem!important}body:lang(fa) .m-n5,body:lang(ar) .m-n5,body:lang(az) .m-n5,body:lang(dv) .m-n5,body:lang(he) .m-n5,body:lang(ku) .m-n5,body:lang(ur) .m-n5{margin:-3rem!important}body:lang(fa) .mt-n5,body:lang(fa) .my-n5,body:lang(ar) .mt-n5,body:lang(ar) .my-n5,body:lang(az) .mt-n5,body:lang(az) .my-n5,body:lang(dv) .mt-n5,body:lang(dv) .my-n5,body:lang(he) .mt-n5,body:lang(he) .my-n5,body:lang(ku) .mt-n5,body:lang(ku) .my-n5,body:lang(ur) .mt-n5,body:lang(ur) .my-n5{margin-top:-3rem!important}body:lang(fa) .mr-n5,body:lang(fa) .mx-n5,body:lang(ar) .mr-n5,body:lang(ar) .mx-n5,body:lang(az) .mr-n5,body:lang(az) .mx-n5,body:lang(dv) .mr-n5,body:lang(dv) .mx-n5,body:lang(he) .mr-n5,body:lang(he) .mx-n5,body:lang(ku) .mr-n5,body:lang(ku) .mx-n5,body:lang(ur) .mr-n5,body:lang(ur) .mx-n5{margin-right:-3rem!important}body:lang(fa) .mb-n5,body:lang(fa) .my-n5,body:lang(ar) .mb-n5,body:lang(ar) .my-n5,body:lang(az) .mb-n5,body:lang(az) .my-n5,body:lang(dv) .mb-n5,body:lang(dv) .my-n5,body:lang(he) .mb-n5,body:lang(he) .my-n5,body:lang(ku) .mb-n5,body:lang(ku) .my-n5,body:lang(ur) .mb-n5,body:lang(ur) .my-n5{margin-bottom:-3rem!important}body:lang(fa) .ml-n5,body:lang(fa) .mx-n5,body:lang(ar) .ml-n5,body:lang(ar) .mx-n5,body:lang(az) .ml-n5,body:lang(az) .mx-n5,body:lang(dv) .ml-n5,body:lang(dv) .mx-n5,body:lang(he) .ml-n5,body:lang(he) .mx-n5,body:lang(ku) .ml-n5,body:lang(ku) .mx-n5,body:lang(ur) .ml-n5,body:lang(ur) .mx-n5{margin-left:-3rem!important}body:lang(fa) .m-auto,body:lang(ar) .m-auto,body:lang(az) .m-auto,body:lang(dv) .m-auto,body:lang(he) .m-auto,body:lang(ku) .m-auto,body:lang(ur) .m-auto{margin:auto!important}body:lang(fa) .mt-auto,body:lang(fa) .my-auto,body:lang(ar) .mt-auto,body:lang(ar) .my-auto,body:lang(az) .mt-auto,body:lang(az) .my-auto,body:lang(dv) .mt-auto,body:lang(dv) .my-auto,body:lang(he) .mt-auto,body:lang(he) .my-auto,body:lang(ku) .mt-auto,body:lang(ku) .my-auto,body:lang(ur) .mt-auto,body:lang(ur) .my-auto{margin-top:auto!important}body:lang(fa) .mr-auto,body:lang(fa) .mx-auto,body:lang(ar) .mr-auto,body:lang(ar) .mx-auto,body:lang(az) .mr-auto,body:lang(az) .mx-auto,body:lang(dv) .mr-auto,body:lang(dv) .mx-auto,body:lang(he) .mr-auto,body:lang(he) .mx-auto,body:lang(ku) .mr-auto,body:lang(ku) .mx-auto,body:lang(ur) .mr-auto,body:lang(ur) .mx-auto{margin-right:auto!important}body:lang(fa) .mb-auto,body:lang(fa) .my-auto,body:lang(ar) .mb-auto,body:lang(ar) .my-auto,body:lang(az) .mb-auto,body:lang(az) .my-auto,body:lang(dv) .mb-auto,body:lang(dv) .my-auto,body:lang(he) .mb-auto,body:lang(he) .my-auto,body:lang(ku) .mb-auto,body:lang(ku) .my-auto,body:lang(ur) .mb-auto,body:lang(ur) .my-auto{margin-bottom:auto!important}body:lang(fa) .ml-auto,body:lang(fa) .mx-auto,body:lang(ar) .ml-auto,body:lang(ar) .mx-auto,body:lang(az) .ml-auto,body:lang(az) .mx-auto,body:lang(dv) .ml-auto,body:lang(dv) .mx-auto,body:lang(he) .ml-auto,body:lang(he) .mx-auto,body:lang(ku) .ml-auto,body:lang(ku) .mx-auto,body:lang(ur) .ml-auto,body:lang(ur) .mx-auto{margin-left:auto!important}@media(min-width:576px){body:lang(fa) .m-sm-0,body:lang(ar) .m-sm-0,body:lang(az) .m-sm-0,body:lang(dv) .m-sm-0,body:lang(he) .m-sm-0,body:lang(ku) .m-sm-0,body:lang(ur) .m-sm-0{margin:0!important}body:lang(fa) .mt-sm-0,body:lang(fa) .my-sm-0,body:lang(ar) .mt-sm-0,body:lang(ar) .my-sm-0,body:lang(az) .mt-sm-0,body:lang(az) .my-sm-0,body:lang(dv) .mt-sm-0,body:lang(dv) .my-sm-0,body:lang(he) .mt-sm-0,body:lang(he) .my-sm-0,body:lang(ku) .mt-sm-0,body:lang(ku) .my-sm-0,body:lang(ur) .mt-sm-0,body:lang(ur) .my-sm-0{margin-top:0!important}body:lang(fa) .mr-sm-0,body:lang(fa) .mx-sm-0,body:lang(ar) .mr-sm-0,body:lang(ar) .mx-sm-0,body:lang(az) .mr-sm-0,body:lang(az) .mx-sm-0,body:lang(dv) .mr-sm-0,body:lang(dv) .mx-sm-0,body:lang(he) .mr-sm-0,body:lang(he) .mx-sm-0,body:lang(ku) .mr-sm-0,body:lang(ku) .mx-sm-0,body:lang(ur) .mr-sm-0,body:lang(ur) .mx-sm-0{-webkit-margin-end:0!important;margin-inline-end:0!important}body:lang(fa) .mb-sm-0,body:lang(fa) .my-sm-0,body:lang(ar) .mb-sm-0,body:lang(ar) .my-sm-0,body:lang(az) .mb-sm-0,body:lang(az) .my-sm-0,body:lang(dv) .mb-sm-0,body:lang(dv) .my-sm-0,body:lang(he) .mb-sm-0,body:lang(he) .my-sm-0,body:lang(ku) .mb-sm-0,body:lang(ku) .my-sm-0,body:lang(ur) .mb-sm-0,body:lang(ur) .my-sm-0{margin-bottom:0!important}body:lang(fa) .ml-sm-0,body:lang(fa) .mx-sm-0,body:lang(ar) .ml-sm-0,body:lang(ar) .mx-sm-0,body:lang(az) .ml-sm-0,body:lang(az) .mx-sm-0,body:lang(dv) .ml-sm-0,body:lang(dv) .mx-sm-0,body:lang(he) .ml-sm-0,body:lang(he) .mx-sm-0,body:lang(ku) .ml-sm-0,body:lang(ku) .mx-sm-0,body:lang(ur) .ml-sm-0,body:lang(ur) .mx-sm-0{-webkit-margin-start:0!important;margin-inline-start:0!important}body:lang(fa) .m-sm-1,body:lang(ar) .m-sm-1,body:lang(az) .m-sm-1,body:lang(dv) .m-sm-1,body:lang(he) .m-sm-1,body:lang(ku) .m-sm-1,body:lang(ur) .m-sm-1{margin:.25rem!important}body:lang(fa) .mt-sm-1,body:lang(fa) .my-sm-1,body:lang(ar) .mt-sm-1,body:lang(ar) .my-sm-1,body:lang(az) .mt-sm-1,body:lang(az) .my-sm-1,body:lang(dv) .mt-sm-1,body:lang(dv) .my-sm-1,body:lang(he) .mt-sm-1,body:lang(he) .my-sm-1,body:lang(ku) .mt-sm-1,body:lang(ku) .my-sm-1,body:lang(ur) .mt-sm-1,body:lang(ur) .my-sm-1{margin-top:.25rem!important}body:lang(fa) .mr-sm-1,body:lang(fa) .mx-sm-1,body:lang(ar) .mr-sm-1,body:lang(ar) .mx-sm-1,body:lang(az) .mr-sm-1,body:lang(az) .mx-sm-1,body:lang(dv) .mr-sm-1,body:lang(dv) .mx-sm-1,body:lang(he) .mr-sm-1,body:lang(he) .mx-sm-1,body:lang(ku) .mr-sm-1,body:lang(ku) .mx-sm-1,body:lang(ur) .mr-sm-1,body:lang(ur) .mx-sm-1{-webkit-margin-end:.25rem!important;margin-inline-end:.25rem!important}body:lang(fa) .mb-sm-1,body:lang(fa) .my-sm-1,body:lang(ar) .mb-sm-1,body:lang(ar) .my-sm-1,body:lang(az) .mb-sm-1,body:lang(az) .my-sm-1,body:lang(dv) .mb-sm-1,body:lang(dv) .my-sm-1,body:lang(he) .mb-sm-1,body:lang(he) .my-sm-1,body:lang(ku) .mb-sm-1,body:lang(ku) .my-sm-1,body:lang(ur) .mb-sm-1,body:lang(ur) .my-sm-1{margin-bottom:.25rem!important}body:lang(fa) .ml-sm-1,body:lang(fa) .mx-sm-1,body:lang(ar) .ml-sm-1,body:lang(ar) .mx-sm-1,body:lang(az) .ml-sm-1,body:lang(az) .mx-sm-1,body:lang(dv) .ml-sm-1,body:lang(dv) .mx-sm-1,body:lang(he) .ml-sm-1,body:lang(he) .mx-sm-1,body:lang(ku) .ml-sm-1,body:lang(ku) .mx-sm-1,body:lang(ur) .ml-sm-1,body:lang(ur) .mx-sm-1{-webkit-margin-start:.25rem!important;margin-inline-start:.25rem!important}body:lang(fa) .m-sm-2,body:lang(ar) .m-sm-2,body:lang(az) .m-sm-2,body:lang(dv) .m-sm-2,body:lang(he) .m-sm-2,body:lang(ku) .m-sm-2,body:lang(ur) .m-sm-2{margin:.5rem!important}body:lang(fa) .mt-sm-2,body:lang(fa) .my-sm-2,body:lang(ar) .mt-sm-2,body:lang(ar) .my-sm-2,body:lang(az) .mt-sm-2,body:lang(az) .my-sm-2,body:lang(dv) .mt-sm-2,body:lang(dv) .my-sm-2,body:lang(he) .mt-sm-2,body:lang(he) .my-sm-2,body:lang(ku) .mt-sm-2,body:lang(ku) .my-sm-2,body:lang(ur) .mt-sm-2,body:lang(ur) .my-sm-2{margin-top:.5rem!important}body:lang(fa) .mr-sm-2,body:lang(fa) .mx-sm-2,body:lang(ar) .mr-sm-2,body:lang(ar) .mx-sm-2,body:lang(az) .mr-sm-2,body:lang(az) .mx-sm-2,body:lang(dv) .mr-sm-2,body:lang(dv) .mx-sm-2,body:lang(he) .mr-sm-2,body:lang(he) .mx-sm-2,body:lang(ku) .mr-sm-2,body:lang(ku) .mx-sm-2,body:lang(ur) .mr-sm-2,body:lang(ur) .mx-sm-2{-webkit-margin-end:.5rem!important;margin-inline-end:.5rem!important}body:lang(fa) .mb-sm-2,body:lang(fa) .my-sm-2,body:lang(ar) .mb-sm-2,body:lang(ar) .my-sm-2,body:lang(az) .mb-sm-2,body:lang(az) .my-sm-2,body:lang(dv) .mb-sm-2,body:lang(dv) .my-sm-2,body:lang(he) .mb-sm-2,body:lang(he) .my-sm-2,body:lang(ku) .mb-sm-2,body:lang(ku) .my-sm-2,body:lang(ur) .mb-sm-2,body:lang(ur) .my-sm-2{margin-bottom:.5rem!important}body:lang(fa) .ml-sm-2,body:lang(fa) .mx-sm-2,body:lang(ar) .ml-sm-2,body:lang(ar) .mx-sm-2,body:lang(az) .ml-sm-2,body:lang(az) .mx-sm-2,body:lang(dv) .ml-sm-2,body:lang(dv) .mx-sm-2,body:lang(he) .ml-sm-2,body:lang(he) .mx-sm-2,body:lang(ku) .ml-sm-2,body:lang(ku) .mx-sm-2,body:lang(ur) .ml-sm-2,body:lang(ur) .mx-sm-2{-webkit-margin-start:.5rem!important;margin-inline-start:.5rem!important}body:lang(fa) .m-sm-3,body:lang(ar) .m-sm-3,body:lang(az) .m-sm-3,body:lang(dv) .m-sm-3,body:lang(he) .m-sm-3,body:lang(ku) .m-sm-3,body:lang(ur) .m-sm-3{margin:1rem!important}body:lang(fa) .mt-sm-3,body:lang(fa) .my-sm-3,body:lang(ar) .mt-sm-3,body:lang(ar) .my-sm-3,body:lang(az) .mt-sm-3,body:lang(az) .my-sm-3,body:lang(dv) .mt-sm-3,body:lang(dv) .my-sm-3,body:lang(he) .mt-sm-3,body:lang(he) .my-sm-3,body:lang(ku) .mt-sm-3,body:lang(ku) .my-sm-3,body:lang(ur) .mt-sm-3,body:lang(ur) .my-sm-3{margin-top:1rem!important}body:lang(fa) .mr-sm-3,body:lang(fa) .mx-sm-3,body:lang(ar) .mr-sm-3,body:lang(ar) .mx-sm-3,body:lang(az) .mr-sm-3,body:lang(az) .mx-sm-3,body:lang(dv) .mr-sm-3,body:lang(dv) .mx-sm-3,body:lang(he) .mr-sm-3,body:lang(he) .mx-sm-3,body:lang(ku) .mr-sm-3,body:lang(ku) .mx-sm-3,body:lang(ur) .mr-sm-3,body:lang(ur) .mx-sm-3{-webkit-margin-end:1rem!important;margin-inline-end:1rem!important}body:lang(fa) .mb-sm-3,body:lang(fa) .my-sm-3,body:lang(ar) .mb-sm-3,body:lang(ar) .my-sm-3,body:lang(az) .mb-sm-3,body:lang(az) .my-sm-3,body:lang(dv) .mb-sm-3,body:lang(dv) .my-sm-3,body:lang(he) .mb-sm-3,body:lang(he) .my-sm-3,body:lang(ku) .mb-sm-3,body:lang(ku) .my-sm-3,body:lang(ur) .mb-sm-3,body:lang(ur) .my-sm-3{margin-bottom:1rem!important}body:lang(fa) .ml-sm-3,body:lang(fa) .mx-sm-3,body:lang(ar) .ml-sm-3,body:lang(ar) .mx-sm-3,body:lang(az) .ml-sm-3,body:lang(az) .mx-sm-3,body:lang(dv) .ml-sm-3,body:lang(dv) .mx-sm-3,body:lang(he) .ml-sm-3,body:lang(he) .mx-sm-3,body:lang(ku) .ml-sm-3,body:lang(ku) .mx-sm-3,body:lang(ur) .ml-sm-3,body:lang(ur) .mx-sm-3{-webkit-margin-start:1rem!important;margin-inline-start:1rem!important}body:lang(fa) .m-sm-4,body:lang(ar) .m-sm-4,body:lang(az) .m-sm-4,body:lang(dv) .m-sm-4,body:lang(he) .m-sm-4,body:lang(ku) .m-sm-4,body:lang(ur) .m-sm-4{margin:1.5rem!important}body:lang(fa) .mt-sm-4,body:lang(fa) .my-sm-4,body:lang(ar) .mt-sm-4,body:lang(ar) .my-sm-4,body:lang(az) .mt-sm-4,body:lang(az) .my-sm-4,body:lang(dv) .mt-sm-4,body:lang(dv) .my-sm-4,body:lang(he) .mt-sm-4,body:lang(he) .my-sm-4,body:lang(ku) .mt-sm-4,body:lang(ku) .my-sm-4,body:lang(ur) .mt-sm-4,body:lang(ur) .my-sm-4{margin-top:1.5rem!important}body:lang(fa) .mr-sm-4,body:lang(fa) .mx-sm-4,body:lang(ar) .mr-sm-4,body:lang(ar) .mx-sm-4,body:lang(az) .mr-sm-4,body:lang(az) .mx-sm-4,body:lang(dv) .mr-sm-4,body:lang(dv) .mx-sm-4,body:lang(he) .mr-sm-4,body:lang(he) .mx-sm-4,body:lang(ku) .mr-sm-4,body:lang(ku) .mx-sm-4,body:lang(ur) .mr-sm-4,body:lang(ur) .mx-sm-4{-webkit-margin-end:1.5rem!important;margin-inline-end:1.5rem!important}body:lang(fa) .mb-sm-4,body:lang(fa) .my-sm-4,body:lang(ar) .mb-sm-4,body:lang(ar) .my-sm-4,body:lang(az) .mb-sm-4,body:lang(az) .my-sm-4,body:lang(dv) .mb-sm-4,body:lang(dv) .my-sm-4,body:lang(he) .mb-sm-4,body:lang(he) .my-sm-4,body:lang(ku) .mb-sm-4,body:lang(ku) .my-sm-4,body:lang(ur) .mb-sm-4,body:lang(ur) .my-sm-4{margin-bottom:1.5rem!important}body:lang(fa) .ml-sm-4,body:lang(fa) .mx-sm-4,body:lang(ar) .ml-sm-4,body:lang(ar) .mx-sm-4,body:lang(az) .ml-sm-4,body:lang(az) .mx-sm-4,body:lang(dv) .ml-sm-4,body:lang(dv) .mx-sm-4,body:lang(he) .ml-sm-4,body:lang(he) .mx-sm-4,body:lang(ku) .ml-sm-4,body:lang(ku) .mx-sm-4,body:lang(ur) .ml-sm-4,body:lang(ur) .mx-sm-4{-webkit-margin-start:1.5rem!important;margin-inline-start:1.5rem!important}body:lang(fa) .m-sm-5,body:lang(ar) .m-sm-5,body:lang(az) .m-sm-5,body:lang(dv) .m-sm-5,body:lang(he) .m-sm-5,body:lang(ku) .m-sm-5,body:lang(ur) .m-sm-5{margin:3rem!important}body:lang(fa) .mt-sm-5,body:lang(fa) .my-sm-5,body:lang(ar) .mt-sm-5,body:lang(ar) .my-sm-5,body:lang(az) .mt-sm-5,body:lang(az) .my-sm-5,body:lang(dv) .mt-sm-5,body:lang(dv) .my-sm-5,body:lang(he) .mt-sm-5,body:lang(he) .my-sm-5,body:lang(ku) .mt-sm-5,body:lang(ku) .my-sm-5,body:lang(ur) .mt-sm-5,body:lang(ur) .my-sm-5{margin-top:3rem!important}body:lang(fa) .mr-sm-5,body:lang(fa) .mx-sm-5,body:lang(ar) .mr-sm-5,body:lang(ar) .mx-sm-5,body:lang(az) .mr-sm-5,body:lang(az) .mx-sm-5,body:lang(dv) .mr-sm-5,body:lang(dv) .mx-sm-5,body:lang(he) .mr-sm-5,body:lang(he) .mx-sm-5,body:lang(ku) .mr-sm-5,body:lang(ku) .mx-sm-5,body:lang(ur) .mr-sm-5,body:lang(ur) .mx-sm-5{-webkit-margin-end:3rem!important;margin-inline-end:3rem!important}body:lang(fa) .mb-sm-5,body:lang(fa) .my-sm-5,body:lang(ar) .mb-sm-5,body:lang(ar) .my-sm-5,body:lang(az) .mb-sm-5,body:lang(az) .my-sm-5,body:lang(dv) .mb-sm-5,body:lang(dv) .my-sm-5,body:lang(he) .mb-sm-5,body:lang(he) .my-sm-5,body:lang(ku) .mb-sm-5,body:lang(ku) .my-sm-5,body:lang(ur) .mb-sm-5,body:lang(ur) .my-sm-5{margin-bottom:3rem!important}body:lang(fa) .ml-sm-5,body:lang(fa) .mx-sm-5,body:lang(ar) .ml-sm-5,body:lang(ar) .mx-sm-5,body:lang(az) .ml-sm-5,body:lang(az) .mx-sm-5,body:lang(dv) .ml-sm-5,body:lang(dv) .mx-sm-5,body:lang(he) .ml-sm-5,body:lang(he) .mx-sm-5,body:lang(ku) .ml-sm-5,body:lang(ku) .mx-sm-5,body:lang(ur) .ml-sm-5,body:lang(ur) .mx-sm-5{-webkit-margin-start:3rem!important;margin-inline-start:3rem!important}body:lang(fa) .p-sm-0,body:lang(ar) .p-sm-0,body:lang(az) .p-sm-0,body:lang(dv) .p-sm-0,body:lang(he) .p-sm-0,body:lang(ku) .p-sm-0,body:lang(ur) .p-sm-0{padding:0!important}body:lang(fa) .pt-sm-0,body:lang(fa) .py-sm-0,body:lang(ar) .pt-sm-0,body:lang(ar) .py-sm-0,body:lang(az) .pt-sm-0,body:lang(az) .py-sm-0,body:lang(dv) .pt-sm-0,body:lang(dv) .py-sm-0,body:lang(he) .pt-sm-0,body:lang(he) .py-sm-0,body:lang(ku) .pt-sm-0,body:lang(ku) .py-sm-0,body:lang(ur) .pt-sm-0,body:lang(ur) .py-sm-0{padding-top:0!important}body:lang(fa) .pr-sm-0,body:lang(fa) .px-sm-0,body:lang(ar) .pr-sm-0,body:lang(ar) .px-sm-0,body:lang(az) .pr-sm-0,body:lang(az) .px-sm-0,body:lang(dv) .pr-sm-0,body:lang(dv) .px-sm-0,body:lang(he) .pr-sm-0,body:lang(he) .px-sm-0,body:lang(ku) .pr-sm-0,body:lang(ku) .px-sm-0,body:lang(ur) .pr-sm-0,body:lang(ur) .px-sm-0{-webkit-padding-end:0!important;padding-inline-end:0!important}body:lang(fa) .pb-sm-0,body:lang(fa) .py-sm-0,body:lang(ar) .pb-sm-0,body:lang(ar) .py-sm-0,body:lang(az) .pb-sm-0,body:lang(az) .py-sm-0,body:lang(dv) .pb-sm-0,body:lang(dv) .py-sm-0,body:lang(he) .pb-sm-0,body:lang(he) .py-sm-0,body:lang(ku) .pb-sm-0,body:lang(ku) .py-sm-0,body:lang(ur) .pb-sm-0,body:lang(ur) .py-sm-0{padding-bottom:0!important}body:lang(fa) .pl-sm-0,body:lang(fa) .px-sm-0,body:lang(ar) .pl-sm-0,body:lang(ar) .px-sm-0,body:lang(az) .pl-sm-0,body:lang(az) .px-sm-0,body:lang(dv) .pl-sm-0,body:lang(dv) .px-sm-0,body:lang(he) .pl-sm-0,body:lang(he) .px-sm-0,body:lang(ku) .pl-sm-0,body:lang(ku) .px-sm-0,body:lang(ur) .pl-sm-0,body:lang(ur) .px-sm-0{-webkit-padding-start:0!important;padding-inline-start:0!important}body:lang(fa) .p-sm-1,body:lang(ar) .p-sm-1,body:lang(az) .p-sm-1,body:lang(dv) .p-sm-1,body:lang(he) .p-sm-1,body:lang(ku) .p-sm-1,body:lang(ur) .p-sm-1{padding:.25rem!important}body:lang(fa) .pt-sm-1,body:lang(fa) .py-sm-1,body:lang(ar) .pt-sm-1,body:lang(ar) .py-sm-1,body:lang(az) .pt-sm-1,body:lang(az) .py-sm-1,body:lang(dv) .pt-sm-1,body:lang(dv) .py-sm-1,body:lang(he) .pt-sm-1,body:lang(he) .py-sm-1,body:lang(ku) .pt-sm-1,body:lang(ku) .py-sm-1,body:lang(ur) .pt-sm-1,body:lang(ur) .py-sm-1{padding-top:.25rem!important}body:lang(fa) .pr-sm-1,body:lang(fa) .px-sm-1,body:lang(ar) .pr-sm-1,body:lang(ar) .px-sm-1,body:lang(az) .pr-sm-1,body:lang(az) .px-sm-1,body:lang(dv) .pr-sm-1,body:lang(dv) .px-sm-1,body:lang(he) .pr-sm-1,body:lang(he) .px-sm-1,body:lang(ku) .pr-sm-1,body:lang(ku) .px-sm-1,body:lang(ur) .pr-sm-1,body:lang(ur) .px-sm-1{-webkit-padding-end:.25rem!important;padding-inline-end:.25rem!important}body:lang(fa) .pb-sm-1,body:lang(fa) .py-sm-1,body:lang(ar) .pb-sm-1,body:lang(ar) .py-sm-1,body:lang(az) .pb-sm-1,body:lang(az) .py-sm-1,body:lang(dv) .pb-sm-1,body:lang(dv) .py-sm-1,body:lang(he) .pb-sm-1,body:lang(he) .py-sm-1,body:lang(ku) .pb-sm-1,body:lang(ku) .py-sm-1,body:lang(ur) .pb-sm-1,body:lang(ur) .py-sm-1{padding-bottom:.25rem!important}body:lang(fa) .pl-sm-1,body:lang(fa) .px-sm-1,body:lang(ar) .pl-sm-1,body:lang(ar) .px-sm-1,body:lang(az) .pl-sm-1,body:lang(az) .px-sm-1,body:lang(dv) .pl-sm-1,body:lang(dv) .px-sm-1,body:lang(he) .pl-sm-1,body:lang(he) .px-sm-1,body:lang(ku) .pl-sm-1,body:lang(ku) .px-sm-1,body:lang(ur) .pl-sm-1,body:lang(ur) .px-sm-1{-webkit-padding-start:.25rem!important;padding-inline-start:.25rem!important}body:lang(fa) .p-sm-2,body:lang(ar) .p-sm-2,body:lang(az) .p-sm-2,body:lang(dv) .p-sm-2,body:lang(he) .p-sm-2,body:lang(ku) .p-sm-2,body:lang(ur) .p-sm-2{padding:.5rem!important}body:lang(fa) .pt-sm-2,body:lang(fa) .py-sm-2,body:lang(ar) .pt-sm-2,body:lang(ar) .py-sm-2,body:lang(az) .pt-sm-2,body:lang(az) .py-sm-2,body:lang(dv) .pt-sm-2,body:lang(dv) .py-sm-2,body:lang(he) .pt-sm-2,body:lang(he) .py-sm-2,body:lang(ku) .pt-sm-2,body:lang(ku) .py-sm-2,body:lang(ur) .pt-sm-2,body:lang(ur) .py-sm-2{padding-top:.5rem!important}body:lang(fa) .pr-sm-2,body:lang(fa) .px-sm-2,body:lang(ar) .pr-sm-2,body:lang(ar) .px-sm-2,body:lang(az) .pr-sm-2,body:lang(az) .px-sm-2,body:lang(dv) .pr-sm-2,body:lang(dv) .px-sm-2,body:lang(he) .pr-sm-2,body:lang(he) .px-sm-2,body:lang(ku) .pr-sm-2,body:lang(ku) .px-sm-2,body:lang(ur) .pr-sm-2,body:lang(ur) .px-sm-2{-webkit-padding-end:.5rem!important;padding-inline-end:.5rem!important}body:lang(fa) .pb-sm-2,body:lang(fa) .py-sm-2,body:lang(ar) .pb-sm-2,body:lang(ar) .py-sm-2,body:lang(az) .pb-sm-2,body:lang(az) .py-sm-2,body:lang(dv) .pb-sm-2,body:lang(dv) .py-sm-2,body:lang(he) .pb-sm-2,body:lang(he) .py-sm-2,body:lang(ku) .pb-sm-2,body:lang(ku) .py-sm-2,body:lang(ur) .pb-sm-2,body:lang(ur) .py-sm-2{padding-bottom:.5rem!important}body:lang(fa) .pl-sm-2,body:lang(fa) .px-sm-2,body:lang(ar) .pl-sm-2,body:lang(ar) .px-sm-2,body:lang(az) .pl-sm-2,body:lang(az) .px-sm-2,body:lang(dv) .pl-sm-2,body:lang(dv) .px-sm-2,body:lang(he) .pl-sm-2,body:lang(he) .px-sm-2,body:lang(ku) .pl-sm-2,body:lang(ku) .px-sm-2,body:lang(ur) .pl-sm-2,body:lang(ur) .px-sm-2{-webkit-padding-start:.5rem!important;padding-inline-start:.5rem!important}body:lang(fa) .p-sm-3,body:lang(ar) .p-sm-3,body:lang(az) .p-sm-3,body:lang(dv) .p-sm-3,body:lang(he) .p-sm-3,body:lang(ku) .p-sm-3,body:lang(ur) .p-sm-3{padding:1rem!important}body:lang(fa) .pt-sm-3,body:lang(fa) .py-sm-3,body:lang(ar) .pt-sm-3,body:lang(ar) .py-sm-3,body:lang(az) .pt-sm-3,body:lang(az) .py-sm-3,body:lang(dv) .pt-sm-3,body:lang(dv) .py-sm-3,body:lang(he) .pt-sm-3,body:lang(he) .py-sm-3,body:lang(ku) .pt-sm-3,body:lang(ku) .py-sm-3,body:lang(ur) .pt-sm-3,body:lang(ur) .py-sm-3{padding-top:1rem!important}body:lang(fa) .pr-sm-3,body:lang(fa) .px-sm-3,body:lang(ar) .pr-sm-3,body:lang(ar) .px-sm-3,body:lang(az) .pr-sm-3,body:lang(az) .px-sm-3,body:lang(dv) .pr-sm-3,body:lang(dv) .px-sm-3,body:lang(he) .pr-sm-3,body:lang(he) .px-sm-3,body:lang(ku) .pr-sm-3,body:lang(ku) .px-sm-3,body:lang(ur) .pr-sm-3,body:lang(ur) .px-sm-3{-webkit-padding-end:1rem!important;padding-inline-end:1rem!important}body:lang(fa) .pb-sm-3,body:lang(fa) .py-sm-3,body:lang(ar) .pb-sm-3,body:lang(ar) .py-sm-3,body:lang(az) .pb-sm-3,body:lang(az) .py-sm-3,body:lang(dv) .pb-sm-3,body:lang(dv) .py-sm-3,body:lang(he) .pb-sm-3,body:lang(he) .py-sm-3,body:lang(ku) .pb-sm-3,body:lang(ku) .py-sm-3,body:lang(ur) .pb-sm-3,body:lang(ur) .py-sm-3{padding-bottom:1rem!important}body:lang(fa) .pl-sm-3,body:lang(fa) .px-sm-3,body:lang(ar) .pl-sm-3,body:lang(ar) .px-sm-3,body:lang(az) .pl-sm-3,body:lang(az) .px-sm-3,body:lang(dv) .pl-sm-3,body:lang(dv) .px-sm-3,body:lang(he) .pl-sm-3,body:lang(he) .px-sm-3,body:lang(ku) .pl-sm-3,body:lang(ku) .px-sm-3,body:lang(ur) .pl-sm-3,body:lang(ur) .px-sm-3{-webkit-padding-start:1rem!important;padding-inline-start:1rem!important}body:lang(fa) .p-sm-4,body:lang(ar) .p-sm-4,body:lang(az) .p-sm-4,body:lang(dv) .p-sm-4,body:lang(he) .p-sm-4,body:lang(ku) .p-sm-4,body:lang(ur) .p-sm-4{padding:1.5rem!important}body:lang(fa) .pt-sm-4,body:lang(fa) .py-sm-4,body:lang(ar) .pt-sm-4,body:lang(ar) .py-sm-4,body:lang(az) .pt-sm-4,body:lang(az) .py-sm-4,body:lang(dv) .pt-sm-4,body:lang(dv) .py-sm-4,body:lang(he) .pt-sm-4,body:lang(he) .py-sm-4,body:lang(ku) .pt-sm-4,body:lang(ku) .py-sm-4,body:lang(ur) .pt-sm-4,body:lang(ur) .py-sm-4{padding-top:1.5rem!important}body:lang(fa) .pr-sm-4,body:lang(fa) .px-sm-4,body:lang(ar) .pr-sm-4,body:lang(ar) .px-sm-4,body:lang(az) .pr-sm-4,body:lang(az) .px-sm-4,body:lang(dv) .pr-sm-4,body:lang(dv) .px-sm-4,body:lang(he) .pr-sm-4,body:lang(he) .px-sm-4,body:lang(ku) .pr-sm-4,body:lang(ku) .px-sm-4,body:lang(ur) .pr-sm-4,body:lang(ur) .px-sm-4{-webkit-padding-end:1.5rem!important;padding-inline-end:1.5rem!important}body:lang(fa) .pb-sm-4,body:lang(fa) .py-sm-4,body:lang(ar) .pb-sm-4,body:lang(ar) .py-sm-4,body:lang(az) .pb-sm-4,body:lang(az) .py-sm-4,body:lang(dv) .pb-sm-4,body:lang(dv) .py-sm-4,body:lang(he) .pb-sm-4,body:lang(he) .py-sm-4,body:lang(ku) .pb-sm-4,body:lang(ku) .py-sm-4,body:lang(ur) .pb-sm-4,body:lang(ur) .py-sm-4{padding-bottom:1.5rem!important}body:lang(fa) .pl-sm-4,body:lang(fa) .px-sm-4,body:lang(ar) .pl-sm-4,body:lang(ar) .px-sm-4,body:lang(az) .pl-sm-4,body:lang(az) .px-sm-4,body:lang(dv) .pl-sm-4,body:lang(dv) .px-sm-4,body:lang(he) .pl-sm-4,body:lang(he) .px-sm-4,body:lang(ku) .pl-sm-4,body:lang(ku) .px-sm-4,body:lang(ur) .pl-sm-4,body:lang(ur) .px-sm-4{-webkit-padding-start:1.5rem!important;padding-inline-start:1.5rem!important}body:lang(fa) .p-sm-5,body:lang(ar) .p-sm-5,body:lang(az) .p-sm-5,body:lang(dv) .p-sm-5,body:lang(he) .p-sm-5,body:lang(ku) .p-sm-5,body:lang(ur) .p-sm-5{padding:3rem!important}body:lang(fa) .pt-sm-5,body:lang(fa) .py-sm-5,body:lang(ar) .pt-sm-5,body:lang(ar) .py-sm-5,body:lang(az) .pt-sm-5,body:lang(az) .py-sm-5,body:lang(dv) .pt-sm-5,body:lang(dv) .py-sm-5,body:lang(he) .pt-sm-5,body:lang(he) .py-sm-5,body:lang(ku) .pt-sm-5,body:lang(ku) .py-sm-5,body:lang(ur) .pt-sm-5,body:lang(ur) .py-sm-5{padding-top:3rem!important}body:lang(fa) .pr-sm-5,body:lang(fa) .px-sm-5,body:lang(ar) .pr-sm-5,body:lang(ar) .px-sm-5,body:lang(az) .pr-sm-5,body:lang(az) .px-sm-5,body:lang(dv) .pr-sm-5,body:lang(dv) .px-sm-5,body:lang(he) .pr-sm-5,body:lang(he) .px-sm-5,body:lang(ku) .pr-sm-5,body:lang(ku) .px-sm-5,body:lang(ur) .pr-sm-5,body:lang(ur) .px-sm-5{-webkit-padding-end:3rem!important;padding-inline-end:3rem!important}body:lang(fa) .pb-sm-5,body:lang(fa) .py-sm-5,body:lang(ar) .pb-sm-5,body:lang(ar) .py-sm-5,body:lang(az) .pb-sm-5,body:lang(az) .py-sm-5,body:lang(dv) .pb-sm-5,body:lang(dv) .py-sm-5,body:lang(he) .pb-sm-5,body:lang(he) .py-sm-5,body:lang(ku) .pb-sm-5,body:lang(ku) .py-sm-5,body:lang(ur) .pb-sm-5,body:lang(ur) .py-sm-5{padding-bottom:3rem!important}body:lang(fa) .pl-sm-5,body:lang(fa) .px-sm-5,body:lang(ar) .pl-sm-5,body:lang(ar) .px-sm-5,body:lang(az) .pl-sm-5,body:lang(az) .px-sm-5,body:lang(dv) .pl-sm-5,body:lang(dv) .px-sm-5,body:lang(he) .pl-sm-5,body:lang(he) .px-sm-5,body:lang(ku) .pl-sm-5,body:lang(ku) .px-sm-5,body:lang(ur) .pl-sm-5,body:lang(ur) .px-sm-5{-webkit-padding-start:3rem!important;padding-inline-start:3rem!important}body:lang(fa) .m-sm-n1,body:lang(ar) .m-sm-n1,body:lang(az) .m-sm-n1,body:lang(dv) .m-sm-n1,body:lang(he) .m-sm-n1,body:lang(ku) .m-sm-n1,body:lang(ur) .m-sm-n1{margin:-.25rem!important}body:lang(fa) .mt-sm-n1,body:lang(fa) .my-sm-n1,body:lang(ar) .mt-sm-n1,body:lang(ar) .my-sm-n1,body:lang(az) .mt-sm-n1,body:lang(az) .my-sm-n1,body:lang(dv) .mt-sm-n1,body:lang(dv) .my-sm-n1,body:lang(he) .mt-sm-n1,body:lang(he) .my-sm-n1,body:lang(ku) .mt-sm-n1,body:lang(ku) .my-sm-n1,body:lang(ur) .mt-sm-n1,body:lang(ur) .my-sm-n1{margin-top:-.25rem!important}body:lang(fa) .mr-sm-n1,body:lang(fa) .mx-sm-n1,body:lang(ar) .mr-sm-n1,body:lang(ar) .mx-sm-n1,body:lang(az) .mr-sm-n1,body:lang(az) .mx-sm-n1,body:lang(dv) .mr-sm-n1,body:lang(dv) .mx-sm-n1,body:lang(he) .mr-sm-n1,body:lang(he) .mx-sm-n1,body:lang(ku) .mr-sm-n1,body:lang(ku) .mx-sm-n1,body:lang(ur) .mr-sm-n1,body:lang(ur) .mx-sm-n1{margin-right:-.25rem!important}body:lang(fa) .mb-sm-n1,body:lang(fa) .my-sm-n1,body:lang(ar) .mb-sm-n1,body:lang(ar) .my-sm-n1,body:lang(az) .mb-sm-n1,body:lang(az) .my-sm-n1,body:lang(dv) .mb-sm-n1,body:lang(dv) .my-sm-n1,body:lang(he) .mb-sm-n1,body:lang(he) .my-sm-n1,body:lang(ku) .mb-sm-n1,body:lang(ku) .my-sm-n1,body:lang(ur) .mb-sm-n1,body:lang(ur) .my-sm-n1{margin-bottom:-.25rem!important}body:lang(fa) .ml-sm-n1,body:lang(fa) .mx-sm-n1,body:lang(ar) .ml-sm-n1,body:lang(ar) .mx-sm-n1,body:lang(az) .ml-sm-n1,body:lang(az) .mx-sm-n1,body:lang(dv) .ml-sm-n1,body:lang(dv) .mx-sm-n1,body:lang(he) .ml-sm-n1,body:lang(he) .mx-sm-n1,body:lang(ku) .ml-sm-n1,body:lang(ku) .mx-sm-n1,body:lang(ur) .ml-sm-n1,body:lang(ur) .mx-sm-n1{margin-left:-.25rem!important}body:lang(fa) .m-sm-n2,body:lang(ar) .m-sm-n2,body:lang(az) .m-sm-n2,body:lang(dv) .m-sm-n2,body:lang(he) .m-sm-n2,body:lang(ku) .m-sm-n2,body:lang(ur) .m-sm-n2{margin:-.5rem!important}body:lang(fa) .mt-sm-n2,body:lang(fa) .my-sm-n2,body:lang(ar) .mt-sm-n2,body:lang(ar) .my-sm-n2,body:lang(az) .mt-sm-n2,body:lang(az) .my-sm-n2,body:lang(dv) .mt-sm-n2,body:lang(dv) .my-sm-n2,body:lang(he) .mt-sm-n2,body:lang(he) .my-sm-n2,body:lang(ku) .mt-sm-n2,body:lang(ku) .my-sm-n2,body:lang(ur) .mt-sm-n2,body:lang(ur) .my-sm-n2{margin-top:-.5rem!important}body:lang(fa) .mr-sm-n2,body:lang(fa) .mx-sm-n2,body:lang(ar) .mr-sm-n2,body:lang(ar) .mx-sm-n2,body:lang(az) .mr-sm-n2,body:lang(az) .mx-sm-n2,body:lang(dv) .mr-sm-n2,body:lang(dv) .mx-sm-n2,body:lang(he) .mr-sm-n2,body:lang(he) .mx-sm-n2,body:lang(ku) .mr-sm-n2,body:lang(ku) .mx-sm-n2,body:lang(ur) .mr-sm-n2,body:lang(ur) .mx-sm-n2{margin-right:-.5rem!important}body:lang(fa) .mb-sm-n2,body:lang(fa) .my-sm-n2,body:lang(ar) .mb-sm-n2,body:lang(ar) .my-sm-n2,body:lang(az) .mb-sm-n2,body:lang(az) .my-sm-n2,body:lang(dv) .mb-sm-n2,body:lang(dv) .my-sm-n2,body:lang(he) .mb-sm-n2,body:lang(he) .my-sm-n2,body:lang(ku) .mb-sm-n2,body:lang(ku) .my-sm-n2,body:lang(ur) .mb-sm-n2,body:lang(ur) .my-sm-n2{margin-bottom:-.5rem!important}body:lang(fa) .ml-sm-n2,body:lang(fa) .mx-sm-n2,body:lang(ar) .ml-sm-n2,body:lang(ar) .mx-sm-n2,body:lang(az) .ml-sm-n2,body:lang(az) .mx-sm-n2,body:lang(dv) .ml-sm-n2,body:lang(dv) .mx-sm-n2,body:lang(he) .ml-sm-n2,body:lang(he) .mx-sm-n2,body:lang(ku) .ml-sm-n2,body:lang(ku) .mx-sm-n2,body:lang(ur) .ml-sm-n2,body:lang(ur) .mx-sm-n2{margin-left:-.5rem!important}body:lang(fa) .m-sm-n3,body:lang(ar) .m-sm-n3,body:lang(az) .m-sm-n3,body:lang(dv) .m-sm-n3,body:lang(he) .m-sm-n3,body:lang(ku) .m-sm-n3,body:lang(ur) .m-sm-n3{margin:-1rem!important}body:lang(fa) .mt-sm-n3,body:lang(fa) .my-sm-n3,body:lang(ar) .mt-sm-n3,body:lang(ar) .my-sm-n3,body:lang(az) .mt-sm-n3,body:lang(az) .my-sm-n3,body:lang(dv) .mt-sm-n3,body:lang(dv) .my-sm-n3,body:lang(he) .mt-sm-n3,body:lang(he) .my-sm-n3,body:lang(ku) .mt-sm-n3,body:lang(ku) .my-sm-n3,body:lang(ur) .mt-sm-n3,body:lang(ur) .my-sm-n3{margin-top:-1rem!important}body:lang(fa) .mr-sm-n3,body:lang(fa) .mx-sm-n3,body:lang(ar) .mr-sm-n3,body:lang(ar) .mx-sm-n3,body:lang(az) .mr-sm-n3,body:lang(az) .mx-sm-n3,body:lang(dv) .mr-sm-n3,body:lang(dv) .mx-sm-n3,body:lang(he) .mr-sm-n3,body:lang(he) .mx-sm-n3,body:lang(ku) .mr-sm-n3,body:lang(ku) .mx-sm-n3,body:lang(ur) .mr-sm-n3,body:lang(ur) .mx-sm-n3{margin-right:-1rem!important}body:lang(fa) .mb-sm-n3,body:lang(fa) .my-sm-n3,body:lang(ar) .mb-sm-n3,body:lang(ar) .my-sm-n3,body:lang(az) .mb-sm-n3,body:lang(az) .my-sm-n3,body:lang(dv) .mb-sm-n3,body:lang(dv) .my-sm-n3,body:lang(he) .mb-sm-n3,body:lang(he) .my-sm-n3,body:lang(ku) .mb-sm-n3,body:lang(ku) .my-sm-n3,body:lang(ur) .mb-sm-n3,body:lang(ur) .my-sm-n3{margin-bottom:-1rem!important}body:lang(fa) .ml-sm-n3,body:lang(fa) .mx-sm-n3,body:lang(ar) .ml-sm-n3,body:lang(ar) .mx-sm-n3,body:lang(az) .ml-sm-n3,body:lang(az) .mx-sm-n3,body:lang(dv) .ml-sm-n3,body:lang(dv) .mx-sm-n3,body:lang(he) .ml-sm-n3,body:lang(he) .mx-sm-n3,body:lang(ku) .ml-sm-n3,body:lang(ku) .mx-sm-n3,body:lang(ur) .ml-sm-n3,body:lang(ur) .mx-sm-n3{margin-left:-1rem!important}body:lang(fa) .m-sm-n4,body:lang(ar) .m-sm-n4,body:lang(az) .m-sm-n4,body:lang(dv) .m-sm-n4,body:lang(he) .m-sm-n4,body:lang(ku) .m-sm-n4,body:lang(ur) .m-sm-n4{margin:-1.5rem!important}body:lang(fa) .mt-sm-n4,body:lang(fa) .my-sm-n4,body:lang(ar) .mt-sm-n4,body:lang(ar) .my-sm-n4,body:lang(az) .mt-sm-n4,body:lang(az) .my-sm-n4,body:lang(dv) .mt-sm-n4,body:lang(dv) .my-sm-n4,body:lang(he) .mt-sm-n4,body:lang(he) .my-sm-n4,body:lang(ku) .mt-sm-n4,body:lang(ku) .my-sm-n4,body:lang(ur) .mt-sm-n4,body:lang(ur) .my-sm-n4{margin-top:-1.5rem!important}body:lang(fa) .mr-sm-n4,body:lang(fa) .mx-sm-n4,body:lang(ar) .mr-sm-n4,body:lang(ar) .mx-sm-n4,body:lang(az) .mr-sm-n4,body:lang(az) .mx-sm-n4,body:lang(dv) .mr-sm-n4,body:lang(dv) .mx-sm-n4,body:lang(he) .mr-sm-n4,body:lang(he) .mx-sm-n4,body:lang(ku) .mr-sm-n4,body:lang(ku) .mx-sm-n4,body:lang(ur) .mr-sm-n4,body:lang(ur) .mx-sm-n4{margin-right:-1.5rem!important}body:lang(fa) .mb-sm-n4,body:lang(fa) .my-sm-n4,body:lang(ar) .mb-sm-n4,body:lang(ar) .my-sm-n4,body:lang(az) .mb-sm-n4,body:lang(az) .my-sm-n4,body:lang(dv) .mb-sm-n4,body:lang(dv) .my-sm-n4,body:lang(he) .mb-sm-n4,body:lang(he) .my-sm-n4,body:lang(ku) .mb-sm-n4,body:lang(ku) .my-sm-n4,body:lang(ur) .mb-sm-n4,body:lang(ur) .my-sm-n4{margin-bottom:-1.5rem!important}body:lang(fa) .ml-sm-n4,body:lang(fa) .mx-sm-n4,body:lang(ar) .ml-sm-n4,body:lang(ar) .mx-sm-n4,body:lang(az) .ml-sm-n4,body:lang(az) .mx-sm-n4,body:lang(dv) .ml-sm-n4,body:lang(dv) .mx-sm-n4,body:lang(he) .ml-sm-n4,body:lang(he) .mx-sm-n4,body:lang(ku) .ml-sm-n4,body:lang(ku) .mx-sm-n4,body:lang(ur) .ml-sm-n4,body:lang(ur) .mx-sm-n4{margin-left:-1.5rem!important}body:lang(fa) .m-sm-n5,body:lang(ar) .m-sm-n5,body:lang(az) .m-sm-n5,body:lang(dv) .m-sm-n5,body:lang(he) .m-sm-n5,body:lang(ku) .m-sm-n5,body:lang(ur) .m-sm-n5{margin:-3rem!important}body:lang(fa) .mt-sm-n5,body:lang(fa) .my-sm-n5,body:lang(ar) .mt-sm-n5,body:lang(ar) .my-sm-n5,body:lang(az) .mt-sm-n5,body:lang(az) .my-sm-n5,body:lang(dv) .mt-sm-n5,body:lang(dv) .my-sm-n5,body:lang(he) .mt-sm-n5,body:lang(he) .my-sm-n5,body:lang(ku) .mt-sm-n5,body:lang(ku) .my-sm-n5,body:lang(ur) .mt-sm-n5,body:lang(ur) .my-sm-n5{margin-top:-3rem!important}body:lang(fa) .mr-sm-n5,body:lang(fa) .mx-sm-n5,body:lang(ar) .mr-sm-n5,body:lang(ar) .mx-sm-n5,body:lang(az) .mr-sm-n5,body:lang(az) .mx-sm-n5,body:lang(dv) .mr-sm-n5,body:lang(dv) .mx-sm-n5,body:lang(he) .mr-sm-n5,body:lang(he) .mx-sm-n5,body:lang(ku) .mr-sm-n5,body:lang(ku) .mx-sm-n5,body:lang(ur) .mr-sm-n5,body:lang(ur) .mx-sm-n5{margin-right:-3rem!important}body:lang(fa) .mb-sm-n5,body:lang(fa) .my-sm-n5,body:lang(ar) .mb-sm-n5,body:lang(ar) .my-sm-n5,body:lang(az) .mb-sm-n5,body:lang(az) .my-sm-n5,body:lang(dv) .mb-sm-n5,body:lang(dv) .my-sm-n5,body:lang(he) .mb-sm-n5,body:lang(he) .my-sm-n5,body:lang(ku) .mb-sm-n5,body:lang(ku) .my-sm-n5,body:lang(ur) .mb-sm-n5,body:lang(ur) .my-sm-n5{margin-bottom:-3rem!important}body:lang(fa) .ml-sm-n5,body:lang(fa) .mx-sm-n5,body:lang(ar) .ml-sm-n5,body:lang(ar) .mx-sm-n5,body:lang(az) .ml-sm-n5,body:lang(az) .mx-sm-n5,body:lang(dv) .ml-sm-n5,body:lang(dv) .mx-sm-n5,body:lang(he) .ml-sm-n5,body:lang(he) .mx-sm-n5,body:lang(ku) .ml-sm-n5,body:lang(ku) .mx-sm-n5,body:lang(ur) .ml-sm-n5,body:lang(ur) .mx-sm-n5{margin-left:-3rem!important}body:lang(fa) .m-sm-auto,body:lang(ar) .m-sm-auto,body:lang(az) .m-sm-auto,body:lang(dv) .m-sm-auto,body:lang(he) .m-sm-auto,body:lang(ku) .m-sm-auto,body:lang(ur) .m-sm-auto{margin:auto!important}body:lang(fa) .mt-sm-auto,body:lang(fa) .my-sm-auto,body:lang(ar) .mt-sm-auto,body:lang(ar) .my-sm-auto,body:lang(az) .mt-sm-auto,body:lang(az) .my-sm-auto,body:lang(dv) .mt-sm-auto,body:lang(dv) .my-sm-auto,body:lang(he) .mt-sm-auto,body:lang(he) .my-sm-auto,body:lang(ku) .mt-sm-auto,body:lang(ku) .my-sm-auto,body:lang(ur) .mt-sm-auto,body:lang(ur) .my-sm-auto{margin-top:auto!important}body:lang(fa) .mr-sm-auto,body:lang(fa) .mx-sm-auto,body:lang(ar) .mr-sm-auto,body:lang(ar) .mx-sm-auto,body:lang(az) .mr-sm-auto,body:lang(az) .mx-sm-auto,body:lang(dv) .mr-sm-auto,body:lang(dv) .mx-sm-auto,body:lang(he) .mr-sm-auto,body:lang(he) .mx-sm-auto,body:lang(ku) .mr-sm-auto,body:lang(ku) .mx-sm-auto,body:lang(ur) .mr-sm-auto,body:lang(ur) .mx-sm-auto{margin-right:auto!important}body:lang(fa) .mb-sm-auto,body:lang(fa) .my-sm-auto,body:lang(ar) .mb-sm-auto,body:lang(ar) .my-sm-auto,body:lang(az) .mb-sm-auto,body:lang(az) .my-sm-auto,body:lang(dv) .mb-sm-auto,body:lang(dv) .my-sm-auto,body:lang(he) .mb-sm-auto,body:lang(he) .my-sm-auto,body:lang(ku) .mb-sm-auto,body:lang(ku) .my-sm-auto,body:lang(ur) .mb-sm-auto,body:lang(ur) .my-sm-auto{margin-bottom:auto!important}body:lang(fa) .ml-sm-auto,body:lang(fa) .mx-sm-auto,body:lang(ar) .ml-sm-auto,body:lang(ar) .mx-sm-auto,body:lang(az) .ml-sm-auto,body:lang(az) .mx-sm-auto,body:lang(dv) .ml-sm-auto,body:lang(dv) .mx-sm-auto,body:lang(he) .ml-sm-auto,body:lang(he) .mx-sm-auto,body:lang(ku) .ml-sm-auto,body:lang(ku) .mx-sm-auto,body:lang(ur) .ml-sm-auto,body:lang(ur) .mx-sm-auto{margin-left:auto!important}}@media(min-width:768px){body:lang(fa) .m-md-0,body:lang(ar) .m-md-0,body:lang(az) .m-md-0,body:lang(dv) .m-md-0,body:lang(he) .m-md-0,body:lang(ku) .m-md-0,body:lang(ur) .m-md-0{margin:0!important}body:lang(fa) .mt-md-0,body:lang(fa) .my-md-0,body:lang(ar) .mt-md-0,body:lang(ar) .my-md-0,body:lang(az) .mt-md-0,body:lang(az) .my-md-0,body:lang(dv) .mt-md-0,body:lang(dv) .my-md-0,body:lang(he) .mt-md-0,body:lang(he) .my-md-0,body:lang(ku) .mt-md-0,body:lang(ku) .my-md-0,body:lang(ur) .mt-md-0,body:lang(ur) .my-md-0{margin-top:0!important}body:lang(fa) .mr-md-0,body:lang(fa) .mx-md-0,body:lang(ar) .mr-md-0,body:lang(ar) .mx-md-0,body:lang(az) .mr-md-0,body:lang(az) .mx-md-0,body:lang(dv) .mr-md-0,body:lang(dv) .mx-md-0,body:lang(he) .mr-md-0,body:lang(he) .mx-md-0,body:lang(ku) .mr-md-0,body:lang(ku) .mx-md-0,body:lang(ur) .mr-md-0,body:lang(ur) .mx-md-0{-webkit-margin-end:0!important;margin-inline-end:0!important}body:lang(fa) .mb-md-0,body:lang(fa) .my-md-0,body:lang(ar) .mb-md-0,body:lang(ar) .my-md-0,body:lang(az) .mb-md-0,body:lang(az) .my-md-0,body:lang(dv) .mb-md-0,body:lang(dv) .my-md-0,body:lang(he) .mb-md-0,body:lang(he) .my-md-0,body:lang(ku) .mb-md-0,body:lang(ku) .my-md-0,body:lang(ur) .mb-md-0,body:lang(ur) .my-md-0{margin-bottom:0!important}body:lang(fa) .ml-md-0,body:lang(fa) .mx-md-0,body:lang(ar) .ml-md-0,body:lang(ar) .mx-md-0,body:lang(az) .ml-md-0,body:lang(az) .mx-md-0,body:lang(dv) .ml-md-0,body:lang(dv) .mx-md-0,body:lang(he) .ml-md-0,body:lang(he) .mx-md-0,body:lang(ku) .ml-md-0,body:lang(ku) .mx-md-0,body:lang(ur) .ml-md-0,body:lang(ur) .mx-md-0{-webkit-margin-start:0!important;margin-inline-start:0!important}body:lang(fa) .m-md-1,body:lang(ar) .m-md-1,body:lang(az) .m-md-1,body:lang(dv) .m-md-1,body:lang(he) .m-md-1,body:lang(ku) .m-md-1,body:lang(ur) .m-md-1{margin:.25rem!important}body:lang(fa) .mt-md-1,body:lang(fa) .my-md-1,body:lang(ar) .mt-md-1,body:lang(ar) .my-md-1,body:lang(az) .mt-md-1,body:lang(az) .my-md-1,body:lang(dv) .mt-md-1,body:lang(dv) .my-md-1,body:lang(he) .mt-md-1,body:lang(he) .my-md-1,body:lang(ku) .mt-md-1,body:lang(ku) .my-md-1,body:lang(ur) .mt-md-1,body:lang(ur) .my-md-1{margin-top:.25rem!important}body:lang(fa) .mr-md-1,body:lang(fa) .mx-md-1,body:lang(ar) .mr-md-1,body:lang(ar) .mx-md-1,body:lang(az) .mr-md-1,body:lang(az) .mx-md-1,body:lang(dv) .mr-md-1,body:lang(dv) .mx-md-1,body:lang(he) .mr-md-1,body:lang(he) .mx-md-1,body:lang(ku) .mr-md-1,body:lang(ku) .mx-md-1,body:lang(ur) .mr-md-1,body:lang(ur) .mx-md-1{-webkit-margin-end:.25rem!important;margin-inline-end:.25rem!important}body:lang(fa) .mb-md-1,body:lang(fa) .my-md-1,body:lang(ar) .mb-md-1,body:lang(ar) .my-md-1,body:lang(az) .mb-md-1,body:lang(az) .my-md-1,body:lang(dv) .mb-md-1,body:lang(dv) .my-md-1,body:lang(he) .mb-md-1,body:lang(he) .my-md-1,body:lang(ku) .mb-md-1,body:lang(ku) .my-md-1,body:lang(ur) .mb-md-1,body:lang(ur) .my-md-1{margin-bottom:.25rem!important}body:lang(fa) .ml-md-1,body:lang(fa) .mx-md-1,body:lang(ar) .ml-md-1,body:lang(ar) .mx-md-1,body:lang(az) .ml-md-1,body:lang(az) .mx-md-1,body:lang(dv) .ml-md-1,body:lang(dv) .mx-md-1,body:lang(he) .ml-md-1,body:lang(he) .mx-md-1,body:lang(ku) .ml-md-1,body:lang(ku) .mx-md-1,body:lang(ur) .ml-md-1,body:lang(ur) .mx-md-1{-webkit-margin-start:.25rem!important;margin-inline-start:.25rem!important}body:lang(fa) .m-md-2,body:lang(ar) .m-md-2,body:lang(az) .m-md-2,body:lang(dv) .m-md-2,body:lang(he) .m-md-2,body:lang(ku) .m-md-2,body:lang(ur) .m-md-2{margin:.5rem!important}body:lang(fa) .mt-md-2,body:lang(fa) .my-md-2,body:lang(ar) .mt-md-2,body:lang(ar) .my-md-2,body:lang(az) .mt-md-2,body:lang(az) .my-md-2,body:lang(dv) .mt-md-2,body:lang(dv) .my-md-2,body:lang(he) .mt-md-2,body:lang(he) .my-md-2,body:lang(ku) .mt-md-2,body:lang(ku) .my-md-2,body:lang(ur) .mt-md-2,body:lang(ur) .my-md-2{margin-top:.5rem!important}body:lang(fa) .mr-md-2,body:lang(fa) .mx-md-2,body:lang(ar) .mr-md-2,body:lang(ar) .mx-md-2,body:lang(az) .mr-md-2,body:lang(az) .mx-md-2,body:lang(dv) .mr-md-2,body:lang(dv) .mx-md-2,body:lang(he) .mr-md-2,body:lang(he) .mx-md-2,body:lang(ku) .mr-md-2,body:lang(ku) .mx-md-2,body:lang(ur) .mr-md-2,body:lang(ur) .mx-md-2{-webkit-margin-end:.5rem!important;margin-inline-end:.5rem!important}body:lang(fa) .mb-md-2,body:lang(fa) .my-md-2,body:lang(ar) .mb-md-2,body:lang(ar) .my-md-2,body:lang(az) .mb-md-2,body:lang(az) .my-md-2,body:lang(dv) .mb-md-2,body:lang(dv) .my-md-2,body:lang(he) .mb-md-2,body:lang(he) .my-md-2,body:lang(ku) .mb-md-2,body:lang(ku) .my-md-2,body:lang(ur) .mb-md-2,body:lang(ur) .my-md-2{margin-bottom:.5rem!important}body:lang(fa) .ml-md-2,body:lang(fa) .mx-md-2,body:lang(ar) .ml-md-2,body:lang(ar) .mx-md-2,body:lang(az) .ml-md-2,body:lang(az) .mx-md-2,body:lang(dv) .ml-md-2,body:lang(dv) .mx-md-2,body:lang(he) .ml-md-2,body:lang(he) .mx-md-2,body:lang(ku) .ml-md-2,body:lang(ku) .mx-md-2,body:lang(ur) .ml-md-2,body:lang(ur) .mx-md-2{-webkit-margin-start:.5rem!important;margin-inline-start:.5rem!important}body:lang(fa) .m-md-3,body:lang(ar) .m-md-3,body:lang(az) .m-md-3,body:lang(dv) .m-md-3,body:lang(he) .m-md-3,body:lang(ku) .m-md-3,body:lang(ur) .m-md-3{margin:1rem!important}body:lang(fa) .mt-md-3,body:lang(fa) .my-md-3,body:lang(ar) .mt-md-3,body:lang(ar) .my-md-3,body:lang(az) .mt-md-3,body:lang(az) .my-md-3,body:lang(dv) .mt-md-3,body:lang(dv) .my-md-3,body:lang(he) .mt-md-3,body:lang(he) .my-md-3,body:lang(ku) .mt-md-3,body:lang(ku) .my-md-3,body:lang(ur) .mt-md-3,body:lang(ur) .my-md-3{margin-top:1rem!important}body:lang(fa) .mr-md-3,body:lang(fa) .mx-md-3,body:lang(ar) .mr-md-3,body:lang(ar) .mx-md-3,body:lang(az) .mr-md-3,body:lang(az) .mx-md-3,body:lang(dv) .mr-md-3,body:lang(dv) .mx-md-3,body:lang(he) .mr-md-3,body:lang(he) .mx-md-3,body:lang(ku) .mr-md-3,body:lang(ku) .mx-md-3,body:lang(ur) .mr-md-3,body:lang(ur) .mx-md-3{-webkit-margin-end:1rem!important;margin-inline-end:1rem!important}body:lang(fa) .mb-md-3,body:lang(fa) .my-md-3,body:lang(ar) .mb-md-3,body:lang(ar) .my-md-3,body:lang(az) .mb-md-3,body:lang(az) .my-md-3,body:lang(dv) .mb-md-3,body:lang(dv) .my-md-3,body:lang(he) .mb-md-3,body:lang(he) .my-md-3,body:lang(ku) .mb-md-3,body:lang(ku) .my-md-3,body:lang(ur) .mb-md-3,body:lang(ur) .my-md-3{margin-bottom:1rem!important}body:lang(fa) .ml-md-3,body:lang(fa) .mx-md-3,body:lang(ar) .ml-md-3,body:lang(ar) .mx-md-3,body:lang(az) .ml-md-3,body:lang(az) .mx-md-3,body:lang(dv) .ml-md-3,body:lang(dv) .mx-md-3,body:lang(he) .ml-md-3,body:lang(he) .mx-md-3,body:lang(ku) .ml-md-3,body:lang(ku) .mx-md-3,body:lang(ur) .ml-md-3,body:lang(ur) .mx-md-3{-webkit-margin-start:1rem!important;margin-inline-start:1rem!important}body:lang(fa) .m-md-4,body:lang(ar) .m-md-4,body:lang(az) .m-md-4,body:lang(dv) .m-md-4,body:lang(he) .m-md-4,body:lang(ku) .m-md-4,body:lang(ur) .m-md-4{margin:1.5rem!important}body:lang(fa) .mt-md-4,body:lang(fa) .my-md-4,body:lang(ar) .mt-md-4,body:lang(ar) .my-md-4,body:lang(az) .mt-md-4,body:lang(az) .my-md-4,body:lang(dv) .mt-md-4,body:lang(dv) .my-md-4,body:lang(he) .mt-md-4,body:lang(he) .my-md-4,body:lang(ku) .mt-md-4,body:lang(ku) .my-md-4,body:lang(ur) .mt-md-4,body:lang(ur) .my-md-4{margin-top:1.5rem!important}body:lang(fa) .mr-md-4,body:lang(fa) .mx-md-4,body:lang(ar) .mr-md-4,body:lang(ar) .mx-md-4,body:lang(az) .mr-md-4,body:lang(az) .mx-md-4,body:lang(dv) .mr-md-4,body:lang(dv) .mx-md-4,body:lang(he) .mr-md-4,body:lang(he) .mx-md-4,body:lang(ku) .mr-md-4,body:lang(ku) .mx-md-4,body:lang(ur) .mr-md-4,body:lang(ur) .mx-md-4{-webkit-margin-end:1.5rem!important;margin-inline-end:1.5rem!important}body:lang(fa) .mb-md-4,body:lang(fa) .my-md-4,body:lang(ar) .mb-md-4,body:lang(ar) .my-md-4,body:lang(az) .mb-md-4,body:lang(az) .my-md-4,body:lang(dv) .mb-md-4,body:lang(dv) .my-md-4,body:lang(he) .mb-md-4,body:lang(he) .my-md-4,body:lang(ku) .mb-md-4,body:lang(ku) .my-md-4,body:lang(ur) .mb-md-4,body:lang(ur) .my-md-4{margin-bottom:1.5rem!important}body:lang(fa) .ml-md-4,body:lang(fa) .mx-md-4,body:lang(ar) .ml-md-4,body:lang(ar) .mx-md-4,body:lang(az) .ml-md-4,body:lang(az) .mx-md-4,body:lang(dv) .ml-md-4,body:lang(dv) .mx-md-4,body:lang(he) .ml-md-4,body:lang(he) .mx-md-4,body:lang(ku) .ml-md-4,body:lang(ku) .mx-md-4,body:lang(ur) .ml-md-4,body:lang(ur) .mx-md-4{-webkit-margin-start:1.5rem!important;margin-inline-start:1.5rem!important}body:lang(fa) .m-md-5,body:lang(ar) .m-md-5,body:lang(az) .m-md-5,body:lang(dv) .m-md-5,body:lang(he) .m-md-5,body:lang(ku) .m-md-5,body:lang(ur) .m-md-5{margin:3rem!important}body:lang(fa) .mt-md-5,body:lang(fa) .my-md-5,body:lang(ar) .mt-md-5,body:lang(ar) .my-md-5,body:lang(az) .mt-md-5,body:lang(az) .my-md-5,body:lang(dv) .mt-md-5,body:lang(dv) .my-md-5,body:lang(he) .mt-md-5,body:lang(he) .my-md-5,body:lang(ku) .mt-md-5,body:lang(ku) .my-md-5,body:lang(ur) .mt-md-5,body:lang(ur) .my-md-5{margin-top:3rem!important}body:lang(fa) .mr-md-5,body:lang(fa) .mx-md-5,body:lang(ar) .mr-md-5,body:lang(ar) .mx-md-5,body:lang(az) .mr-md-5,body:lang(az) .mx-md-5,body:lang(dv) .mr-md-5,body:lang(dv) .mx-md-5,body:lang(he) .mr-md-5,body:lang(he) .mx-md-5,body:lang(ku) .mr-md-5,body:lang(ku) .mx-md-5,body:lang(ur) .mr-md-5,body:lang(ur) .mx-md-5{-webkit-margin-end:3rem!important;margin-inline-end:3rem!important}body:lang(fa) .mb-md-5,body:lang(fa) .my-md-5,body:lang(ar) .mb-md-5,body:lang(ar) .my-md-5,body:lang(az) .mb-md-5,body:lang(az) .my-md-5,body:lang(dv) .mb-md-5,body:lang(dv) .my-md-5,body:lang(he) .mb-md-5,body:lang(he) .my-md-5,body:lang(ku) .mb-md-5,body:lang(ku) .my-md-5,body:lang(ur) .mb-md-5,body:lang(ur) .my-md-5{margin-bottom:3rem!important}body:lang(fa) .ml-md-5,body:lang(fa) .mx-md-5,body:lang(ar) .ml-md-5,body:lang(ar) .mx-md-5,body:lang(az) .ml-md-5,body:lang(az) .mx-md-5,body:lang(dv) .ml-md-5,body:lang(dv) .mx-md-5,body:lang(he) .ml-md-5,body:lang(he) .mx-md-5,body:lang(ku) .ml-md-5,body:lang(ku) .mx-md-5,body:lang(ur) .ml-md-5,body:lang(ur) .mx-md-5{-webkit-margin-start:3rem!important;margin-inline-start:3rem!important}body:lang(fa) .p-md-0,body:lang(ar) .p-md-0,body:lang(az) .p-md-0,body:lang(dv) .p-md-0,body:lang(he) .p-md-0,body:lang(ku) .p-md-0,body:lang(ur) .p-md-0{padding:0!important}body:lang(fa) .pt-md-0,body:lang(fa) .py-md-0,body:lang(ar) .pt-md-0,body:lang(ar) .py-md-0,body:lang(az) .pt-md-0,body:lang(az) .py-md-0,body:lang(dv) .pt-md-0,body:lang(dv) .py-md-0,body:lang(he) .pt-md-0,body:lang(he) .py-md-0,body:lang(ku) .pt-md-0,body:lang(ku) .py-md-0,body:lang(ur) .pt-md-0,body:lang(ur) .py-md-0{padding-top:0!important}body:lang(fa) .pr-md-0,body:lang(fa) .px-md-0,body:lang(ar) .pr-md-0,body:lang(ar) .px-md-0,body:lang(az) .pr-md-0,body:lang(az) .px-md-0,body:lang(dv) .pr-md-0,body:lang(dv) .px-md-0,body:lang(he) .pr-md-0,body:lang(he) .px-md-0,body:lang(ku) .pr-md-0,body:lang(ku) .px-md-0,body:lang(ur) .pr-md-0,body:lang(ur) .px-md-0{-webkit-padding-end:0!important;padding-inline-end:0!important}body:lang(fa) .pb-md-0,body:lang(fa) .py-md-0,body:lang(ar) .pb-md-0,body:lang(ar) .py-md-0,body:lang(az) .pb-md-0,body:lang(az) .py-md-0,body:lang(dv) .pb-md-0,body:lang(dv) .py-md-0,body:lang(he) .pb-md-0,body:lang(he) .py-md-0,body:lang(ku) .pb-md-0,body:lang(ku) .py-md-0,body:lang(ur) .pb-md-0,body:lang(ur) .py-md-0{padding-bottom:0!important}body:lang(fa) .pl-md-0,body:lang(fa) .px-md-0,body:lang(ar) .pl-md-0,body:lang(ar) .px-md-0,body:lang(az) .pl-md-0,body:lang(az) .px-md-0,body:lang(dv) .pl-md-0,body:lang(dv) .px-md-0,body:lang(he) .pl-md-0,body:lang(he) .px-md-0,body:lang(ku) .pl-md-0,body:lang(ku) .px-md-0,body:lang(ur) .pl-md-0,body:lang(ur) .px-md-0{-webkit-padding-start:0!important;padding-inline-start:0!important}body:lang(fa) .p-md-1,body:lang(ar) .p-md-1,body:lang(az) .p-md-1,body:lang(dv) .p-md-1,body:lang(he) .p-md-1,body:lang(ku) .p-md-1,body:lang(ur) .p-md-1{padding:.25rem!important}body:lang(fa) .pt-md-1,body:lang(fa) .py-md-1,body:lang(ar) .pt-md-1,body:lang(ar) .py-md-1,body:lang(az) .pt-md-1,body:lang(az) .py-md-1,body:lang(dv) .pt-md-1,body:lang(dv) .py-md-1,body:lang(he) .pt-md-1,body:lang(he) .py-md-1,body:lang(ku) .pt-md-1,body:lang(ku) .py-md-1,body:lang(ur) .pt-md-1,body:lang(ur) .py-md-1{padding-top:.25rem!important}body:lang(fa) .pr-md-1,body:lang(fa) .px-md-1,body:lang(ar) .pr-md-1,body:lang(ar) .px-md-1,body:lang(az) .pr-md-1,body:lang(az) .px-md-1,body:lang(dv) .pr-md-1,body:lang(dv) .px-md-1,body:lang(he) .pr-md-1,body:lang(he) .px-md-1,body:lang(ku) .pr-md-1,body:lang(ku) .px-md-1,body:lang(ur) .pr-md-1,body:lang(ur) .px-md-1{-webkit-padding-end:.25rem!important;padding-inline-end:.25rem!important}body:lang(fa) .pb-md-1,body:lang(fa) .py-md-1,body:lang(ar) .pb-md-1,body:lang(ar) .py-md-1,body:lang(az) .pb-md-1,body:lang(az) .py-md-1,body:lang(dv) .pb-md-1,body:lang(dv) .py-md-1,body:lang(he) .pb-md-1,body:lang(he) .py-md-1,body:lang(ku) .pb-md-1,body:lang(ku) .py-md-1,body:lang(ur) .pb-md-1,body:lang(ur) .py-md-1{padding-bottom:.25rem!important}body:lang(fa) .pl-md-1,body:lang(fa) .px-md-1,body:lang(ar) .pl-md-1,body:lang(ar) .px-md-1,body:lang(az) .pl-md-1,body:lang(az) .px-md-1,body:lang(dv) .pl-md-1,body:lang(dv) .px-md-1,body:lang(he) .pl-md-1,body:lang(he) .px-md-1,body:lang(ku) .pl-md-1,body:lang(ku) .px-md-1,body:lang(ur) .pl-md-1,body:lang(ur) .px-md-1{-webkit-padding-start:.25rem!important;padding-inline-start:.25rem!important}body:lang(fa) .p-md-2,body:lang(ar) .p-md-2,body:lang(az) .p-md-2,body:lang(dv) .p-md-2,body:lang(he) .p-md-2,body:lang(ku) .p-md-2,body:lang(ur) .p-md-2{padding:.5rem!important}body:lang(fa) .pt-md-2,body:lang(fa) .py-md-2,body:lang(ar) .pt-md-2,body:lang(ar) .py-md-2,body:lang(az) .pt-md-2,body:lang(az) .py-md-2,body:lang(dv) .pt-md-2,body:lang(dv) .py-md-2,body:lang(he) .pt-md-2,body:lang(he) .py-md-2,body:lang(ku) .pt-md-2,body:lang(ku) .py-md-2,body:lang(ur) .pt-md-2,body:lang(ur) .py-md-2{padding-top:.5rem!important}body:lang(fa) .pr-md-2,body:lang(fa) .px-md-2,body:lang(ar) .pr-md-2,body:lang(ar) .px-md-2,body:lang(az) .pr-md-2,body:lang(az) .px-md-2,body:lang(dv) .pr-md-2,body:lang(dv) .px-md-2,body:lang(he) .pr-md-2,body:lang(he) .px-md-2,body:lang(ku) .pr-md-2,body:lang(ku) .px-md-2,body:lang(ur) .pr-md-2,body:lang(ur) .px-md-2{-webkit-padding-end:.5rem!important;padding-inline-end:.5rem!important}body:lang(fa) .pb-md-2,body:lang(fa) .py-md-2,body:lang(ar) .pb-md-2,body:lang(ar) .py-md-2,body:lang(az) .pb-md-2,body:lang(az) .py-md-2,body:lang(dv) .pb-md-2,body:lang(dv) .py-md-2,body:lang(he) .pb-md-2,body:lang(he) .py-md-2,body:lang(ku) .pb-md-2,body:lang(ku) .py-md-2,body:lang(ur) .pb-md-2,body:lang(ur) .py-md-2{padding-bottom:.5rem!important}body:lang(fa) .pl-md-2,body:lang(fa) .px-md-2,body:lang(ar) .pl-md-2,body:lang(ar) .px-md-2,body:lang(az) .pl-md-2,body:lang(az) .px-md-2,body:lang(dv) .pl-md-2,body:lang(dv) .px-md-2,body:lang(he) .pl-md-2,body:lang(he) .px-md-2,body:lang(ku) .pl-md-2,body:lang(ku) .px-md-2,body:lang(ur) .pl-md-2,body:lang(ur) .px-md-2{-webkit-padding-start:.5rem!important;padding-inline-start:.5rem!important}body:lang(fa) .p-md-3,body:lang(ar) .p-md-3,body:lang(az) .p-md-3,body:lang(dv) .p-md-3,body:lang(he) .p-md-3,body:lang(ku) .p-md-3,body:lang(ur) .p-md-3{padding:1rem!important}body:lang(fa) .pt-md-3,body:lang(fa) .py-md-3,body:lang(ar) .pt-md-3,body:lang(ar) .py-md-3,body:lang(az) .pt-md-3,body:lang(az) .py-md-3,body:lang(dv) .pt-md-3,body:lang(dv) .py-md-3,body:lang(he) .pt-md-3,body:lang(he) .py-md-3,body:lang(ku) .pt-md-3,body:lang(ku) .py-md-3,body:lang(ur) .pt-md-3,body:lang(ur) .py-md-3{padding-top:1rem!important}body:lang(fa) .pr-md-3,body:lang(fa) .px-md-3,body:lang(ar) .pr-md-3,body:lang(ar) .px-md-3,body:lang(az) .pr-md-3,body:lang(az) .px-md-3,body:lang(dv) .pr-md-3,body:lang(dv) .px-md-3,body:lang(he) .pr-md-3,body:lang(he) .px-md-3,body:lang(ku) .pr-md-3,body:lang(ku) .px-md-3,body:lang(ur) .pr-md-3,body:lang(ur) .px-md-3{-webkit-padding-end:1rem!important;padding-inline-end:1rem!important}body:lang(fa) .pb-md-3,body:lang(fa) .py-md-3,body:lang(ar) .pb-md-3,body:lang(ar) .py-md-3,body:lang(az) .pb-md-3,body:lang(az) .py-md-3,body:lang(dv) .pb-md-3,body:lang(dv) .py-md-3,body:lang(he) .pb-md-3,body:lang(he) .py-md-3,body:lang(ku) .pb-md-3,body:lang(ku) .py-md-3,body:lang(ur) .pb-md-3,body:lang(ur) .py-md-3{padding-bottom:1rem!important}body:lang(fa) .pl-md-3,body:lang(fa) .px-md-3,body:lang(ar) .pl-md-3,body:lang(ar) .px-md-3,body:lang(az) .pl-md-3,body:lang(az) .px-md-3,body:lang(dv) .pl-md-3,body:lang(dv) .px-md-3,body:lang(he) .pl-md-3,body:lang(he) .px-md-3,body:lang(ku) .pl-md-3,body:lang(ku) .px-md-3,body:lang(ur) .pl-md-3,body:lang(ur) .px-md-3{-webkit-padding-start:1rem!important;padding-inline-start:1rem!important}body:lang(fa) .p-md-4,body:lang(ar) .p-md-4,body:lang(az) .p-md-4,body:lang(dv) .p-md-4,body:lang(he) .p-md-4,body:lang(ku) .p-md-4,body:lang(ur) .p-md-4{padding:1.5rem!important}body:lang(fa) .pt-md-4,body:lang(fa) .py-md-4,body:lang(ar) .pt-md-4,body:lang(ar) .py-md-4,body:lang(az) .pt-md-4,body:lang(az) .py-md-4,body:lang(dv) .pt-md-4,body:lang(dv) .py-md-4,body:lang(he) .pt-md-4,body:lang(he) .py-md-4,body:lang(ku) .pt-md-4,body:lang(ku) .py-md-4,body:lang(ur) .pt-md-4,body:lang(ur) .py-md-4{padding-top:1.5rem!important}body:lang(fa) .pr-md-4,body:lang(fa) .px-md-4,body:lang(ar) .pr-md-4,body:lang(ar) .px-md-4,body:lang(az) .pr-md-4,body:lang(az) .px-md-4,body:lang(dv) .pr-md-4,body:lang(dv) .px-md-4,body:lang(he) .pr-md-4,body:lang(he) .px-md-4,body:lang(ku) .pr-md-4,body:lang(ku) .px-md-4,body:lang(ur) .pr-md-4,body:lang(ur) .px-md-4{-webkit-padding-end:1.5rem!important;padding-inline-end:1.5rem!important}body:lang(fa) .pb-md-4,body:lang(fa) .py-md-4,body:lang(ar) .pb-md-4,body:lang(ar) .py-md-4,body:lang(az) .pb-md-4,body:lang(az) .py-md-4,body:lang(dv) .pb-md-4,body:lang(dv) .py-md-4,body:lang(he) .pb-md-4,body:lang(he) .py-md-4,body:lang(ku) .pb-md-4,body:lang(ku) .py-md-4,body:lang(ur) .pb-md-4,body:lang(ur) .py-md-4{padding-bottom:1.5rem!important}body:lang(fa) .pl-md-4,body:lang(fa) .px-md-4,body:lang(ar) .pl-md-4,body:lang(ar) .px-md-4,body:lang(az) .pl-md-4,body:lang(az) .px-md-4,body:lang(dv) .pl-md-4,body:lang(dv) .px-md-4,body:lang(he) .pl-md-4,body:lang(he) .px-md-4,body:lang(ku) .pl-md-4,body:lang(ku) .px-md-4,body:lang(ur) .pl-md-4,body:lang(ur) .px-md-4{-webkit-padding-start:1.5rem!important;padding-inline-start:1.5rem!important}body:lang(fa) .p-md-5,body:lang(ar) .p-md-5,body:lang(az) .p-md-5,body:lang(dv) .p-md-5,body:lang(he) .p-md-5,body:lang(ku) .p-md-5,body:lang(ur) .p-md-5{padding:3rem!important}body:lang(fa) .pt-md-5,body:lang(fa) .py-md-5,body:lang(ar) .pt-md-5,body:lang(ar) .py-md-5,body:lang(az) .pt-md-5,body:lang(az) .py-md-5,body:lang(dv) .pt-md-5,body:lang(dv) .py-md-5,body:lang(he) .pt-md-5,body:lang(he) .py-md-5,body:lang(ku) .pt-md-5,body:lang(ku) .py-md-5,body:lang(ur) .pt-md-5,body:lang(ur) .py-md-5{padding-top:3rem!important}body:lang(fa) .pr-md-5,body:lang(fa) .px-md-5,body:lang(ar) .pr-md-5,body:lang(ar) .px-md-5,body:lang(az) .pr-md-5,body:lang(az) .px-md-5,body:lang(dv) .pr-md-5,body:lang(dv) .px-md-5,body:lang(he) .pr-md-5,body:lang(he) .px-md-5,body:lang(ku) .pr-md-5,body:lang(ku) .px-md-5,body:lang(ur) .pr-md-5,body:lang(ur) .px-md-5{-webkit-padding-end:3rem!important;padding-inline-end:3rem!important}body:lang(fa) .pb-md-5,body:lang(fa) .py-md-5,body:lang(ar) .pb-md-5,body:lang(ar) .py-md-5,body:lang(az) .pb-md-5,body:lang(az) .py-md-5,body:lang(dv) .pb-md-5,body:lang(dv) .py-md-5,body:lang(he) .pb-md-5,body:lang(he) .py-md-5,body:lang(ku) .pb-md-5,body:lang(ku) .py-md-5,body:lang(ur) .pb-md-5,body:lang(ur) .py-md-5{padding-bottom:3rem!important}body:lang(fa) .pl-md-5,body:lang(fa) .px-md-5,body:lang(ar) .pl-md-5,body:lang(ar) .px-md-5,body:lang(az) .pl-md-5,body:lang(az) .px-md-5,body:lang(dv) .pl-md-5,body:lang(dv) .px-md-5,body:lang(he) .pl-md-5,body:lang(he) .px-md-5,body:lang(ku) .pl-md-5,body:lang(ku) .px-md-5,body:lang(ur) .pl-md-5,body:lang(ur) .px-md-5{-webkit-padding-start:3rem!important;padding-inline-start:3rem!important}body:lang(fa) .m-md-n1,body:lang(ar) .m-md-n1,body:lang(az) .m-md-n1,body:lang(dv) .m-md-n1,body:lang(he) .m-md-n1,body:lang(ku) .m-md-n1,body:lang(ur) .m-md-n1{margin:-.25rem!important}body:lang(fa) .mt-md-n1,body:lang(fa) .my-md-n1,body:lang(ar) .mt-md-n1,body:lang(ar) .my-md-n1,body:lang(az) .mt-md-n1,body:lang(az) .my-md-n1,body:lang(dv) .mt-md-n1,body:lang(dv) .my-md-n1,body:lang(he) .mt-md-n1,body:lang(he) .my-md-n1,body:lang(ku) .mt-md-n1,body:lang(ku) .my-md-n1,body:lang(ur) .mt-md-n1,body:lang(ur) .my-md-n1{margin-top:-.25rem!important}body:lang(fa) .mr-md-n1,body:lang(fa) .mx-md-n1,body:lang(ar) .mr-md-n1,body:lang(ar) .mx-md-n1,body:lang(az) .mr-md-n1,body:lang(az) .mx-md-n1,body:lang(dv) .mr-md-n1,body:lang(dv) .mx-md-n1,body:lang(he) .mr-md-n1,body:lang(he) .mx-md-n1,body:lang(ku) .mr-md-n1,body:lang(ku) .mx-md-n1,body:lang(ur) .mr-md-n1,body:lang(ur) .mx-md-n1{margin-right:-.25rem!important}body:lang(fa) .mb-md-n1,body:lang(fa) .my-md-n1,body:lang(ar) .mb-md-n1,body:lang(ar) .my-md-n1,body:lang(az) .mb-md-n1,body:lang(az) .my-md-n1,body:lang(dv) .mb-md-n1,body:lang(dv) .my-md-n1,body:lang(he) .mb-md-n1,body:lang(he) .my-md-n1,body:lang(ku) .mb-md-n1,body:lang(ku) .my-md-n1,body:lang(ur) .mb-md-n1,body:lang(ur) .my-md-n1{margin-bottom:-.25rem!important}body:lang(fa) .ml-md-n1,body:lang(fa) .mx-md-n1,body:lang(ar) .ml-md-n1,body:lang(ar) .mx-md-n1,body:lang(az) .ml-md-n1,body:lang(az) .mx-md-n1,body:lang(dv) .ml-md-n1,body:lang(dv) .mx-md-n1,body:lang(he) .ml-md-n1,body:lang(he) .mx-md-n1,body:lang(ku) .ml-md-n1,body:lang(ku) .mx-md-n1,body:lang(ur) .ml-md-n1,body:lang(ur) .mx-md-n1{margin-left:-.25rem!important}body:lang(fa) .m-md-n2,body:lang(ar) .m-md-n2,body:lang(az) .m-md-n2,body:lang(dv) .m-md-n2,body:lang(he) .m-md-n2,body:lang(ku) .m-md-n2,body:lang(ur) .m-md-n2{margin:-.5rem!important}body:lang(fa) .mt-md-n2,body:lang(fa) .my-md-n2,body:lang(ar) .mt-md-n2,body:lang(ar) .my-md-n2,body:lang(az) .mt-md-n2,body:lang(az) .my-md-n2,body:lang(dv) .mt-md-n2,body:lang(dv) .my-md-n2,body:lang(he) .mt-md-n2,body:lang(he) .my-md-n2,body:lang(ku) .mt-md-n2,body:lang(ku) .my-md-n2,body:lang(ur) .mt-md-n2,body:lang(ur) .my-md-n2{margin-top:-.5rem!important}body:lang(fa) .mr-md-n2,body:lang(fa) .mx-md-n2,body:lang(ar) .mr-md-n2,body:lang(ar) .mx-md-n2,body:lang(az) .mr-md-n2,body:lang(az) .mx-md-n2,body:lang(dv) .mr-md-n2,body:lang(dv) .mx-md-n2,body:lang(he) .mr-md-n2,body:lang(he) .mx-md-n2,body:lang(ku) .mr-md-n2,body:lang(ku) .mx-md-n2,body:lang(ur) .mr-md-n2,body:lang(ur) .mx-md-n2{margin-right:-.5rem!important}body:lang(fa) .mb-md-n2,body:lang(fa) .my-md-n2,body:lang(ar) .mb-md-n2,body:lang(ar) .my-md-n2,body:lang(az) .mb-md-n2,body:lang(az) .my-md-n2,body:lang(dv) .mb-md-n2,body:lang(dv) .my-md-n2,body:lang(he) .mb-md-n2,body:lang(he) .my-md-n2,body:lang(ku) .mb-md-n2,body:lang(ku) .my-md-n2,body:lang(ur) .mb-md-n2,body:lang(ur) .my-md-n2{margin-bottom:-.5rem!important}body:lang(fa) .ml-md-n2,body:lang(fa) .mx-md-n2,body:lang(ar) .ml-md-n2,body:lang(ar) .mx-md-n2,body:lang(az) .ml-md-n2,body:lang(az) .mx-md-n2,body:lang(dv) .ml-md-n2,body:lang(dv) .mx-md-n2,body:lang(he) .ml-md-n2,body:lang(he) .mx-md-n2,body:lang(ku) .ml-md-n2,body:lang(ku) .mx-md-n2,body:lang(ur) .ml-md-n2,body:lang(ur) .mx-md-n2{margin-left:-.5rem!important}body:lang(fa) .m-md-n3,body:lang(ar) .m-md-n3,body:lang(az) .m-md-n3,body:lang(dv) .m-md-n3,body:lang(he) .m-md-n3,body:lang(ku) .m-md-n3,body:lang(ur) .m-md-n3{margin:-1rem!important}body:lang(fa) .mt-md-n3,body:lang(fa) .my-md-n3,body:lang(ar) .mt-md-n3,body:lang(ar) .my-md-n3,body:lang(az) .mt-md-n3,body:lang(az) .my-md-n3,body:lang(dv) .mt-md-n3,body:lang(dv) .my-md-n3,body:lang(he) .mt-md-n3,body:lang(he) .my-md-n3,body:lang(ku) .mt-md-n3,body:lang(ku) .my-md-n3,body:lang(ur) .mt-md-n3,body:lang(ur) .my-md-n3{margin-top:-1rem!important}body:lang(fa) .mr-md-n3,body:lang(fa) .mx-md-n3,body:lang(ar) .mr-md-n3,body:lang(ar) .mx-md-n3,body:lang(az) .mr-md-n3,body:lang(az) .mx-md-n3,body:lang(dv) .mr-md-n3,body:lang(dv) .mx-md-n3,body:lang(he) .mr-md-n3,body:lang(he) .mx-md-n3,body:lang(ku) .mr-md-n3,body:lang(ku) .mx-md-n3,body:lang(ur) .mr-md-n3,body:lang(ur) .mx-md-n3{margin-right:-1rem!important}body:lang(fa) .mb-md-n3,body:lang(fa) .my-md-n3,body:lang(ar) .mb-md-n3,body:lang(ar) .my-md-n3,body:lang(az) .mb-md-n3,body:lang(az) .my-md-n3,body:lang(dv) .mb-md-n3,body:lang(dv) .my-md-n3,body:lang(he) .mb-md-n3,body:lang(he) .my-md-n3,body:lang(ku) .mb-md-n3,body:lang(ku) .my-md-n3,body:lang(ur) .mb-md-n3,body:lang(ur) .my-md-n3{margin-bottom:-1rem!important}body:lang(fa) .ml-md-n3,body:lang(fa) .mx-md-n3,body:lang(ar) .ml-md-n3,body:lang(ar) .mx-md-n3,body:lang(az) .ml-md-n3,body:lang(az) .mx-md-n3,body:lang(dv) .ml-md-n3,body:lang(dv) .mx-md-n3,body:lang(he) .ml-md-n3,body:lang(he) .mx-md-n3,body:lang(ku) .ml-md-n3,body:lang(ku) .mx-md-n3,body:lang(ur) .ml-md-n3,body:lang(ur) .mx-md-n3{margin-left:-1rem!important}body:lang(fa) .m-md-n4,body:lang(ar) .m-md-n4,body:lang(az) .m-md-n4,body:lang(dv) .m-md-n4,body:lang(he) .m-md-n4,body:lang(ku) .m-md-n4,body:lang(ur) .m-md-n4{margin:-1.5rem!important}body:lang(fa) .mt-md-n4,body:lang(fa) .my-md-n4,body:lang(ar) .mt-md-n4,body:lang(ar) .my-md-n4,body:lang(az) .mt-md-n4,body:lang(az) .my-md-n4,body:lang(dv) .mt-md-n4,body:lang(dv) .my-md-n4,body:lang(he) .mt-md-n4,body:lang(he) .my-md-n4,body:lang(ku) .mt-md-n4,body:lang(ku) .my-md-n4,body:lang(ur) .mt-md-n4,body:lang(ur) .my-md-n4{margin-top:-1.5rem!important}body:lang(fa) .mr-md-n4,body:lang(fa) .mx-md-n4,body:lang(ar) .mr-md-n4,body:lang(ar) .mx-md-n4,body:lang(az) .mr-md-n4,body:lang(az) .mx-md-n4,body:lang(dv) .mr-md-n4,body:lang(dv) .mx-md-n4,body:lang(he) .mr-md-n4,body:lang(he) .mx-md-n4,body:lang(ku) .mr-md-n4,body:lang(ku) .mx-md-n4,body:lang(ur) .mr-md-n4,body:lang(ur) .mx-md-n4{margin-right:-1.5rem!important}body:lang(fa) .mb-md-n4,body:lang(fa) .my-md-n4,body:lang(ar) .mb-md-n4,body:lang(ar) .my-md-n4,body:lang(az) .mb-md-n4,body:lang(az) .my-md-n4,body:lang(dv) .mb-md-n4,body:lang(dv) .my-md-n4,body:lang(he) .mb-md-n4,body:lang(he) .my-md-n4,body:lang(ku) .mb-md-n4,body:lang(ku) .my-md-n4,body:lang(ur) .mb-md-n4,body:lang(ur) .my-md-n4{margin-bottom:-1.5rem!important}body:lang(fa) .ml-md-n4,body:lang(fa) .mx-md-n4,body:lang(ar) .ml-md-n4,body:lang(ar) .mx-md-n4,body:lang(az) .ml-md-n4,body:lang(az) .mx-md-n4,body:lang(dv) .ml-md-n4,body:lang(dv) .mx-md-n4,body:lang(he) .ml-md-n4,body:lang(he) .mx-md-n4,body:lang(ku) .ml-md-n4,body:lang(ku) .mx-md-n4,body:lang(ur) .ml-md-n4,body:lang(ur) .mx-md-n4{margin-left:-1.5rem!important}body:lang(fa) .m-md-n5,body:lang(ar) .m-md-n5,body:lang(az) .m-md-n5,body:lang(dv) .m-md-n5,body:lang(he) .m-md-n5,body:lang(ku) .m-md-n5,body:lang(ur) .m-md-n5{margin:-3rem!important}body:lang(fa) .mt-md-n5,body:lang(fa) .my-md-n5,body:lang(ar) .mt-md-n5,body:lang(ar) .my-md-n5,body:lang(az) .mt-md-n5,body:lang(az) .my-md-n5,body:lang(dv) .mt-md-n5,body:lang(dv) .my-md-n5,body:lang(he) .mt-md-n5,body:lang(he) .my-md-n5,body:lang(ku) .mt-md-n5,body:lang(ku) .my-md-n5,body:lang(ur) .mt-md-n5,body:lang(ur) .my-md-n5{margin-top:-3rem!important}body:lang(fa) .mr-md-n5,body:lang(fa) .mx-md-n5,body:lang(ar) .mr-md-n5,body:lang(ar) .mx-md-n5,body:lang(az) .mr-md-n5,body:lang(az) .mx-md-n5,body:lang(dv) .mr-md-n5,body:lang(dv) .mx-md-n5,body:lang(he) .mr-md-n5,body:lang(he) .mx-md-n5,body:lang(ku) .mr-md-n5,body:lang(ku) .mx-md-n5,body:lang(ur) .mr-md-n5,body:lang(ur) .mx-md-n5{margin-right:-3rem!important}body:lang(fa) .mb-md-n5,body:lang(fa) .my-md-n5,body:lang(ar) .mb-md-n5,body:lang(ar) .my-md-n5,body:lang(az) .mb-md-n5,body:lang(az) .my-md-n5,body:lang(dv) .mb-md-n5,body:lang(dv) .my-md-n5,body:lang(he) .mb-md-n5,body:lang(he) .my-md-n5,body:lang(ku) .mb-md-n5,body:lang(ku) .my-md-n5,body:lang(ur) .mb-md-n5,body:lang(ur) .my-md-n5{margin-bottom:-3rem!important}body:lang(fa) .ml-md-n5,body:lang(fa) .mx-md-n5,body:lang(ar) .ml-md-n5,body:lang(ar) .mx-md-n5,body:lang(az) .ml-md-n5,body:lang(az) .mx-md-n5,body:lang(dv) .ml-md-n5,body:lang(dv) .mx-md-n5,body:lang(he) .ml-md-n5,body:lang(he) .mx-md-n5,body:lang(ku) .ml-md-n5,body:lang(ku) .mx-md-n5,body:lang(ur) .ml-md-n5,body:lang(ur) .mx-md-n5{margin-left:-3rem!important}body:lang(fa) .m-md-auto,body:lang(ar) .m-md-auto,body:lang(az) .m-md-auto,body:lang(dv) .m-md-auto,body:lang(he) .m-md-auto,body:lang(ku) .m-md-auto,body:lang(ur) .m-md-auto{margin:auto!important}body:lang(fa) .mt-md-auto,body:lang(fa) .my-md-auto,body:lang(ar) .mt-md-auto,body:lang(ar) .my-md-auto,body:lang(az) .mt-md-auto,body:lang(az) .my-md-auto,body:lang(dv) .mt-md-auto,body:lang(dv) .my-md-auto,body:lang(he) .mt-md-auto,body:lang(he) .my-md-auto,body:lang(ku) .mt-md-auto,body:lang(ku) .my-md-auto,body:lang(ur) .mt-md-auto,body:lang(ur) .my-md-auto{margin-top:auto!important}body:lang(fa) .mr-md-auto,body:lang(fa) .mx-md-auto,body:lang(ar) .mr-md-auto,body:lang(ar) .mx-md-auto,body:lang(az) .mr-md-auto,body:lang(az) .mx-md-auto,body:lang(dv) .mr-md-auto,body:lang(dv) .mx-md-auto,body:lang(he) .mr-md-auto,body:lang(he) .mx-md-auto,body:lang(ku) .mr-md-auto,body:lang(ku) .mx-md-auto,body:lang(ur) .mr-md-auto,body:lang(ur) .mx-md-auto{margin-right:auto!important}body:lang(fa) .mb-md-auto,body:lang(fa) .my-md-auto,body:lang(ar) .mb-md-auto,body:lang(ar) .my-md-auto,body:lang(az) .mb-md-auto,body:lang(az) .my-md-auto,body:lang(dv) .mb-md-auto,body:lang(dv) .my-md-auto,body:lang(he) .mb-md-auto,body:lang(he) .my-md-auto,body:lang(ku) .mb-md-auto,body:lang(ku) .my-md-auto,body:lang(ur) .mb-md-auto,body:lang(ur) .my-md-auto{margin-bottom:auto!important}body:lang(fa) .ml-md-auto,body:lang(fa) .mx-md-auto,body:lang(ar) .ml-md-auto,body:lang(ar) .mx-md-auto,body:lang(az) .ml-md-auto,body:lang(az) .mx-md-auto,body:lang(dv) .ml-md-auto,body:lang(dv) .mx-md-auto,body:lang(he) .ml-md-auto,body:lang(he) .mx-md-auto,body:lang(ku) .ml-md-auto,body:lang(ku) .mx-md-auto,body:lang(ur) .ml-md-auto,body:lang(ur) .mx-md-auto{margin-left:auto!important}}@media(min-width:992px){body:lang(fa) .m-lg-0,body:lang(ar) .m-lg-0,body:lang(az) .m-lg-0,body:lang(dv) .m-lg-0,body:lang(he) .m-lg-0,body:lang(ku) .m-lg-0,body:lang(ur) .m-lg-0{margin:0!important}body:lang(fa) .mt-lg-0,body:lang(fa) .my-lg-0,body:lang(ar) .mt-lg-0,body:lang(ar) .my-lg-0,body:lang(az) .mt-lg-0,body:lang(az) .my-lg-0,body:lang(dv) .mt-lg-0,body:lang(dv) .my-lg-0,body:lang(he) .mt-lg-0,body:lang(he) .my-lg-0,body:lang(ku) .mt-lg-0,body:lang(ku) .my-lg-0,body:lang(ur) .mt-lg-0,body:lang(ur) .my-lg-0{margin-top:0!important}body:lang(fa) .mr-lg-0,body:lang(fa) .mx-lg-0,body:lang(ar) .mr-lg-0,body:lang(ar) .mx-lg-0,body:lang(az) .mr-lg-0,body:lang(az) .mx-lg-0,body:lang(dv) .mr-lg-0,body:lang(dv) .mx-lg-0,body:lang(he) .mr-lg-0,body:lang(he) .mx-lg-0,body:lang(ku) .mr-lg-0,body:lang(ku) .mx-lg-0,body:lang(ur) .mr-lg-0,body:lang(ur) .mx-lg-0{-webkit-margin-end:0!important;margin-inline-end:0!important}body:lang(fa) .mb-lg-0,body:lang(fa) .my-lg-0,body:lang(ar) .mb-lg-0,body:lang(ar) .my-lg-0,body:lang(az) .mb-lg-0,body:lang(az) .my-lg-0,body:lang(dv) .mb-lg-0,body:lang(dv) .my-lg-0,body:lang(he) .mb-lg-0,body:lang(he) .my-lg-0,body:lang(ku) .mb-lg-0,body:lang(ku) .my-lg-0,body:lang(ur) .mb-lg-0,body:lang(ur) .my-lg-0{margin-bottom:0!important}body:lang(fa) .ml-lg-0,body:lang(fa) .mx-lg-0,body:lang(ar) .ml-lg-0,body:lang(ar) .mx-lg-0,body:lang(az) .ml-lg-0,body:lang(az) .mx-lg-0,body:lang(dv) .ml-lg-0,body:lang(dv) .mx-lg-0,body:lang(he) .ml-lg-0,body:lang(he) .mx-lg-0,body:lang(ku) .ml-lg-0,body:lang(ku) .mx-lg-0,body:lang(ur) .ml-lg-0,body:lang(ur) .mx-lg-0{-webkit-margin-start:0!important;margin-inline-start:0!important}body:lang(fa) .m-lg-1,body:lang(ar) .m-lg-1,body:lang(az) .m-lg-1,body:lang(dv) .m-lg-1,body:lang(he) .m-lg-1,body:lang(ku) .m-lg-1,body:lang(ur) .m-lg-1{margin:.25rem!important}body:lang(fa) .mt-lg-1,body:lang(fa) .my-lg-1,body:lang(ar) .mt-lg-1,body:lang(ar) .my-lg-1,body:lang(az) .mt-lg-1,body:lang(az) .my-lg-1,body:lang(dv) .mt-lg-1,body:lang(dv) .my-lg-1,body:lang(he) .mt-lg-1,body:lang(he) .my-lg-1,body:lang(ku) .mt-lg-1,body:lang(ku) .my-lg-1,body:lang(ur) .mt-lg-1,body:lang(ur) .my-lg-1{margin-top:.25rem!important}body:lang(fa) .mr-lg-1,body:lang(fa) .mx-lg-1,body:lang(ar) .mr-lg-1,body:lang(ar) .mx-lg-1,body:lang(az) .mr-lg-1,body:lang(az) .mx-lg-1,body:lang(dv) .mr-lg-1,body:lang(dv) .mx-lg-1,body:lang(he) .mr-lg-1,body:lang(he) .mx-lg-1,body:lang(ku) .mr-lg-1,body:lang(ku) .mx-lg-1,body:lang(ur) .mr-lg-1,body:lang(ur) .mx-lg-1{-webkit-margin-end:.25rem!important;margin-inline-end:.25rem!important}body:lang(fa) .mb-lg-1,body:lang(fa) .my-lg-1,body:lang(ar) .mb-lg-1,body:lang(ar) .my-lg-1,body:lang(az) .mb-lg-1,body:lang(az) .my-lg-1,body:lang(dv) .mb-lg-1,body:lang(dv) .my-lg-1,body:lang(he) .mb-lg-1,body:lang(he) .my-lg-1,body:lang(ku) .mb-lg-1,body:lang(ku) .my-lg-1,body:lang(ur) .mb-lg-1,body:lang(ur) .my-lg-1{margin-bottom:.25rem!important}body:lang(fa) .ml-lg-1,body:lang(fa) .mx-lg-1,body:lang(ar) .ml-lg-1,body:lang(ar) .mx-lg-1,body:lang(az) .ml-lg-1,body:lang(az) .mx-lg-1,body:lang(dv) .ml-lg-1,body:lang(dv) .mx-lg-1,body:lang(he) .ml-lg-1,body:lang(he) .mx-lg-1,body:lang(ku) .ml-lg-1,body:lang(ku) .mx-lg-1,body:lang(ur) .ml-lg-1,body:lang(ur) .mx-lg-1{-webkit-margin-start:.25rem!important;margin-inline-start:.25rem!important}body:lang(fa) .m-lg-2,body:lang(ar) .m-lg-2,body:lang(az) .m-lg-2,body:lang(dv) .m-lg-2,body:lang(he) .m-lg-2,body:lang(ku) .m-lg-2,body:lang(ur) .m-lg-2{margin:.5rem!important}body:lang(fa) .mt-lg-2,body:lang(fa) .my-lg-2,body:lang(ar) .mt-lg-2,body:lang(ar) .my-lg-2,body:lang(az) .mt-lg-2,body:lang(az) .my-lg-2,body:lang(dv) .mt-lg-2,body:lang(dv) .my-lg-2,body:lang(he) .mt-lg-2,body:lang(he) .my-lg-2,body:lang(ku) .mt-lg-2,body:lang(ku) .my-lg-2,body:lang(ur) .mt-lg-2,body:lang(ur) .my-lg-2{margin-top:.5rem!important}body:lang(fa) .mr-lg-2,body:lang(fa) .mx-lg-2,body:lang(ar) .mr-lg-2,body:lang(ar) .mx-lg-2,body:lang(az) .mr-lg-2,body:lang(az) .mx-lg-2,body:lang(dv) .mr-lg-2,body:lang(dv) .mx-lg-2,body:lang(he) .mr-lg-2,body:lang(he) .mx-lg-2,body:lang(ku) .mr-lg-2,body:lang(ku) .mx-lg-2,body:lang(ur) .mr-lg-2,body:lang(ur) .mx-lg-2{-webkit-margin-end:.5rem!important;margin-inline-end:.5rem!important}body:lang(fa) .mb-lg-2,body:lang(fa) .my-lg-2,body:lang(ar) .mb-lg-2,body:lang(ar) .my-lg-2,body:lang(az) .mb-lg-2,body:lang(az) .my-lg-2,body:lang(dv) .mb-lg-2,body:lang(dv) .my-lg-2,body:lang(he) .mb-lg-2,body:lang(he) .my-lg-2,body:lang(ku) .mb-lg-2,body:lang(ku) .my-lg-2,body:lang(ur) .mb-lg-2,body:lang(ur) .my-lg-2{margin-bottom:.5rem!important}body:lang(fa) .ml-lg-2,body:lang(fa) .mx-lg-2,body:lang(ar) .ml-lg-2,body:lang(ar) .mx-lg-2,body:lang(az) .ml-lg-2,body:lang(az) .mx-lg-2,body:lang(dv) .ml-lg-2,body:lang(dv) .mx-lg-2,body:lang(he) .ml-lg-2,body:lang(he) .mx-lg-2,body:lang(ku) .ml-lg-2,body:lang(ku) .mx-lg-2,body:lang(ur) .ml-lg-2,body:lang(ur) .mx-lg-2{-webkit-margin-start:.5rem!important;margin-inline-start:.5rem!important}body:lang(fa) .m-lg-3,body:lang(ar) .m-lg-3,body:lang(az) .m-lg-3,body:lang(dv) .m-lg-3,body:lang(he) .m-lg-3,body:lang(ku) .m-lg-3,body:lang(ur) .m-lg-3{margin:1rem!important}body:lang(fa) .mt-lg-3,body:lang(fa) .my-lg-3,body:lang(ar) .mt-lg-3,body:lang(ar) .my-lg-3,body:lang(az) .mt-lg-3,body:lang(az) .my-lg-3,body:lang(dv) .mt-lg-3,body:lang(dv) .my-lg-3,body:lang(he) .mt-lg-3,body:lang(he) .my-lg-3,body:lang(ku) .mt-lg-3,body:lang(ku) .my-lg-3,body:lang(ur) .mt-lg-3,body:lang(ur) .my-lg-3{margin-top:1rem!important}body:lang(fa) .mr-lg-3,body:lang(fa) .mx-lg-3,body:lang(ar) .mr-lg-3,body:lang(ar) .mx-lg-3,body:lang(az) .mr-lg-3,body:lang(az) .mx-lg-3,body:lang(dv) .mr-lg-3,body:lang(dv) .mx-lg-3,body:lang(he) .mr-lg-3,body:lang(he) .mx-lg-3,body:lang(ku) .mr-lg-3,body:lang(ku) .mx-lg-3,body:lang(ur) .mr-lg-3,body:lang(ur) .mx-lg-3{-webkit-margin-end:1rem!important;margin-inline-end:1rem!important}body:lang(fa) .mb-lg-3,body:lang(fa) .my-lg-3,body:lang(ar) .mb-lg-3,body:lang(ar) .my-lg-3,body:lang(az) .mb-lg-3,body:lang(az) .my-lg-3,body:lang(dv) .mb-lg-3,body:lang(dv) .my-lg-3,body:lang(he) .mb-lg-3,body:lang(he) .my-lg-3,body:lang(ku) .mb-lg-3,body:lang(ku) .my-lg-3,body:lang(ur) .mb-lg-3,body:lang(ur) .my-lg-3{margin-bottom:1rem!important}body:lang(fa) .ml-lg-3,body:lang(fa) .mx-lg-3,body:lang(ar) .ml-lg-3,body:lang(ar) .mx-lg-3,body:lang(az) .ml-lg-3,body:lang(az) .mx-lg-3,body:lang(dv) .ml-lg-3,body:lang(dv) .mx-lg-3,body:lang(he) .ml-lg-3,body:lang(he) .mx-lg-3,body:lang(ku) .ml-lg-3,body:lang(ku) .mx-lg-3,body:lang(ur) .ml-lg-3,body:lang(ur) .mx-lg-3{-webkit-margin-start:1rem!important;margin-inline-start:1rem!important}body:lang(fa) .m-lg-4,body:lang(ar) .m-lg-4,body:lang(az) .m-lg-4,body:lang(dv) .m-lg-4,body:lang(he) .m-lg-4,body:lang(ku) .m-lg-4,body:lang(ur) .m-lg-4{margin:1.5rem!important}body:lang(fa) .mt-lg-4,body:lang(fa) .my-lg-4,body:lang(ar) .mt-lg-4,body:lang(ar) .my-lg-4,body:lang(az) .mt-lg-4,body:lang(az) .my-lg-4,body:lang(dv) .mt-lg-4,body:lang(dv) .my-lg-4,body:lang(he) .mt-lg-4,body:lang(he) .my-lg-4,body:lang(ku) .mt-lg-4,body:lang(ku) .my-lg-4,body:lang(ur) .mt-lg-4,body:lang(ur) .my-lg-4{margin-top:1.5rem!important}body:lang(fa) .mr-lg-4,body:lang(fa) .mx-lg-4,body:lang(ar) .mr-lg-4,body:lang(ar) .mx-lg-4,body:lang(az) .mr-lg-4,body:lang(az) .mx-lg-4,body:lang(dv) .mr-lg-4,body:lang(dv) .mx-lg-4,body:lang(he) .mr-lg-4,body:lang(he) .mx-lg-4,body:lang(ku) .mr-lg-4,body:lang(ku) .mx-lg-4,body:lang(ur) .mr-lg-4,body:lang(ur) .mx-lg-4{-webkit-margin-end:1.5rem!important;margin-inline-end:1.5rem!important}body:lang(fa) .mb-lg-4,body:lang(fa) .my-lg-4,body:lang(ar) .mb-lg-4,body:lang(ar) .my-lg-4,body:lang(az) .mb-lg-4,body:lang(az) .my-lg-4,body:lang(dv) .mb-lg-4,body:lang(dv) .my-lg-4,body:lang(he) .mb-lg-4,body:lang(he) .my-lg-4,body:lang(ku) .mb-lg-4,body:lang(ku) .my-lg-4,body:lang(ur) .mb-lg-4,body:lang(ur) .my-lg-4{margin-bottom:1.5rem!important}body:lang(fa) .ml-lg-4,body:lang(fa) .mx-lg-4,body:lang(ar) .ml-lg-4,body:lang(ar) .mx-lg-4,body:lang(az) .ml-lg-4,body:lang(az) .mx-lg-4,body:lang(dv) .ml-lg-4,body:lang(dv) .mx-lg-4,body:lang(he) .ml-lg-4,body:lang(he) .mx-lg-4,body:lang(ku) .ml-lg-4,body:lang(ku) .mx-lg-4,body:lang(ur) .ml-lg-4,body:lang(ur) .mx-lg-4{-webkit-margin-start:1.5rem!important;margin-inline-start:1.5rem!important}body:lang(fa) .m-lg-5,body:lang(ar) .m-lg-5,body:lang(az) .m-lg-5,body:lang(dv) .m-lg-5,body:lang(he) .m-lg-5,body:lang(ku) .m-lg-5,body:lang(ur) .m-lg-5{margin:3rem!important}body:lang(fa) .mt-lg-5,body:lang(fa) .my-lg-5,body:lang(ar) .mt-lg-5,body:lang(ar) .my-lg-5,body:lang(az) .mt-lg-5,body:lang(az) .my-lg-5,body:lang(dv) .mt-lg-5,body:lang(dv) .my-lg-5,body:lang(he) .mt-lg-5,body:lang(he) .my-lg-5,body:lang(ku) .mt-lg-5,body:lang(ku) .my-lg-5,body:lang(ur) .mt-lg-5,body:lang(ur) .my-lg-5{margin-top:3rem!important}body:lang(fa) .mr-lg-5,body:lang(fa) .mx-lg-5,body:lang(ar) .mr-lg-5,body:lang(ar) .mx-lg-5,body:lang(az) .mr-lg-5,body:lang(az) .mx-lg-5,body:lang(dv) .mr-lg-5,body:lang(dv) .mx-lg-5,body:lang(he) .mr-lg-5,body:lang(he) .mx-lg-5,body:lang(ku) .mr-lg-5,body:lang(ku) .mx-lg-5,body:lang(ur) .mr-lg-5,body:lang(ur) .mx-lg-5{-webkit-margin-end:3rem!important;margin-inline-end:3rem!important}body:lang(fa) .mb-lg-5,body:lang(fa) .my-lg-5,body:lang(ar) .mb-lg-5,body:lang(ar) .my-lg-5,body:lang(az) .mb-lg-5,body:lang(az) .my-lg-5,body:lang(dv) .mb-lg-5,body:lang(dv) .my-lg-5,body:lang(he) .mb-lg-5,body:lang(he) .my-lg-5,body:lang(ku) .mb-lg-5,body:lang(ku) .my-lg-5,body:lang(ur) .mb-lg-5,body:lang(ur) .my-lg-5{margin-bottom:3rem!important}body:lang(fa) .ml-lg-5,body:lang(fa) .mx-lg-5,body:lang(ar) .ml-lg-5,body:lang(ar) .mx-lg-5,body:lang(az) .ml-lg-5,body:lang(az) .mx-lg-5,body:lang(dv) .ml-lg-5,body:lang(dv) .mx-lg-5,body:lang(he) .ml-lg-5,body:lang(he) .mx-lg-5,body:lang(ku) .ml-lg-5,body:lang(ku) .mx-lg-5,body:lang(ur) .ml-lg-5,body:lang(ur) .mx-lg-5{-webkit-margin-start:3rem!important;margin-inline-start:3rem!important}body:lang(fa) .p-lg-0,body:lang(ar) .p-lg-0,body:lang(az) .p-lg-0,body:lang(dv) .p-lg-0,body:lang(he) .p-lg-0,body:lang(ku) .p-lg-0,body:lang(ur) .p-lg-0{padding:0!important}body:lang(fa) .pt-lg-0,body:lang(fa) .py-lg-0,body:lang(ar) .pt-lg-0,body:lang(ar) .py-lg-0,body:lang(az) .pt-lg-0,body:lang(az) .py-lg-0,body:lang(dv) .pt-lg-0,body:lang(dv) .py-lg-0,body:lang(he) .pt-lg-0,body:lang(he) .py-lg-0,body:lang(ku) .pt-lg-0,body:lang(ku) .py-lg-0,body:lang(ur) .pt-lg-0,body:lang(ur) .py-lg-0{padding-top:0!important}body:lang(fa) .pr-lg-0,body:lang(fa) .px-lg-0,body:lang(ar) .pr-lg-0,body:lang(ar) .px-lg-0,body:lang(az) .pr-lg-0,body:lang(az) .px-lg-0,body:lang(dv) .pr-lg-0,body:lang(dv) .px-lg-0,body:lang(he) .pr-lg-0,body:lang(he) .px-lg-0,body:lang(ku) .pr-lg-0,body:lang(ku) .px-lg-0,body:lang(ur) .pr-lg-0,body:lang(ur) .px-lg-0{-webkit-padding-end:0!important;padding-inline-end:0!important}body:lang(fa) .pb-lg-0,body:lang(fa) .py-lg-0,body:lang(ar) .pb-lg-0,body:lang(ar) .py-lg-0,body:lang(az) .pb-lg-0,body:lang(az) .py-lg-0,body:lang(dv) .pb-lg-0,body:lang(dv) .py-lg-0,body:lang(he) .pb-lg-0,body:lang(he) .py-lg-0,body:lang(ku) .pb-lg-0,body:lang(ku) .py-lg-0,body:lang(ur) .pb-lg-0,body:lang(ur) .py-lg-0{padding-bottom:0!important}body:lang(fa) .pl-lg-0,body:lang(fa) .px-lg-0,body:lang(ar) .pl-lg-0,body:lang(ar) .px-lg-0,body:lang(az) .pl-lg-0,body:lang(az) .px-lg-0,body:lang(dv) .pl-lg-0,body:lang(dv) .px-lg-0,body:lang(he) .pl-lg-0,body:lang(he) .px-lg-0,body:lang(ku) .pl-lg-0,body:lang(ku) .px-lg-0,body:lang(ur) .pl-lg-0,body:lang(ur) .px-lg-0{-webkit-padding-start:0!important;padding-inline-start:0!important}body:lang(fa) .p-lg-1,body:lang(ar) .p-lg-1,body:lang(az) .p-lg-1,body:lang(dv) .p-lg-1,body:lang(he) .p-lg-1,body:lang(ku) .p-lg-1,body:lang(ur) .p-lg-1{padding:.25rem!important}body:lang(fa) .pt-lg-1,body:lang(fa) .py-lg-1,body:lang(ar) .pt-lg-1,body:lang(ar) .py-lg-1,body:lang(az) .pt-lg-1,body:lang(az) .py-lg-1,body:lang(dv) .pt-lg-1,body:lang(dv) .py-lg-1,body:lang(he) .pt-lg-1,body:lang(he) .py-lg-1,body:lang(ku) .pt-lg-1,body:lang(ku) .py-lg-1,body:lang(ur) .pt-lg-1,body:lang(ur) .py-lg-1{padding-top:.25rem!important}body:lang(fa) .pr-lg-1,body:lang(fa) .px-lg-1,body:lang(ar) .pr-lg-1,body:lang(ar) .px-lg-1,body:lang(az) .pr-lg-1,body:lang(az) .px-lg-1,body:lang(dv) .pr-lg-1,body:lang(dv) .px-lg-1,body:lang(he) .pr-lg-1,body:lang(he) .px-lg-1,body:lang(ku) .pr-lg-1,body:lang(ku) .px-lg-1,body:lang(ur) .pr-lg-1,body:lang(ur) .px-lg-1{-webkit-padding-end:.25rem!important;padding-inline-end:.25rem!important}body:lang(fa) .pb-lg-1,body:lang(fa) .py-lg-1,body:lang(ar) .pb-lg-1,body:lang(ar) .py-lg-1,body:lang(az) .pb-lg-1,body:lang(az) .py-lg-1,body:lang(dv) .pb-lg-1,body:lang(dv) .py-lg-1,body:lang(he) .pb-lg-1,body:lang(he) .py-lg-1,body:lang(ku) .pb-lg-1,body:lang(ku) .py-lg-1,body:lang(ur) .pb-lg-1,body:lang(ur) .py-lg-1{padding-bottom:.25rem!important}body:lang(fa) .pl-lg-1,body:lang(fa) .px-lg-1,body:lang(ar) .pl-lg-1,body:lang(ar) .px-lg-1,body:lang(az) .pl-lg-1,body:lang(az) .px-lg-1,body:lang(dv) .pl-lg-1,body:lang(dv) .px-lg-1,body:lang(he) .pl-lg-1,body:lang(he) .px-lg-1,body:lang(ku) .pl-lg-1,body:lang(ku) .px-lg-1,body:lang(ur) .pl-lg-1,body:lang(ur) .px-lg-1{-webkit-padding-start:.25rem!important;padding-inline-start:.25rem!important}body:lang(fa) .p-lg-2,body:lang(ar) .p-lg-2,body:lang(az) .p-lg-2,body:lang(dv) .p-lg-2,body:lang(he) .p-lg-2,body:lang(ku) .p-lg-2,body:lang(ur) .p-lg-2{padding:.5rem!important}body:lang(fa) .pt-lg-2,body:lang(fa) .py-lg-2,body:lang(ar) .pt-lg-2,body:lang(ar) .py-lg-2,body:lang(az) .pt-lg-2,body:lang(az) .py-lg-2,body:lang(dv) .pt-lg-2,body:lang(dv) .py-lg-2,body:lang(he) .pt-lg-2,body:lang(he) .py-lg-2,body:lang(ku) .pt-lg-2,body:lang(ku) .py-lg-2,body:lang(ur) .pt-lg-2,body:lang(ur) .py-lg-2{padding-top:.5rem!important}body:lang(fa) .pr-lg-2,body:lang(fa) .px-lg-2,body:lang(ar) .pr-lg-2,body:lang(ar) .px-lg-2,body:lang(az) .pr-lg-2,body:lang(az) .px-lg-2,body:lang(dv) .pr-lg-2,body:lang(dv) .px-lg-2,body:lang(he) .pr-lg-2,body:lang(he) .px-lg-2,body:lang(ku) .pr-lg-2,body:lang(ku) .px-lg-2,body:lang(ur) .pr-lg-2,body:lang(ur) .px-lg-2{-webkit-padding-end:.5rem!important;padding-inline-end:.5rem!important}body:lang(fa) .pb-lg-2,body:lang(fa) .py-lg-2,body:lang(ar) .pb-lg-2,body:lang(ar) .py-lg-2,body:lang(az) .pb-lg-2,body:lang(az) .py-lg-2,body:lang(dv) .pb-lg-2,body:lang(dv) .py-lg-2,body:lang(he) .pb-lg-2,body:lang(he) .py-lg-2,body:lang(ku) .pb-lg-2,body:lang(ku) .py-lg-2,body:lang(ur) .pb-lg-2,body:lang(ur) .py-lg-2{padding-bottom:.5rem!important}body:lang(fa) .pl-lg-2,body:lang(fa) .px-lg-2,body:lang(ar) .pl-lg-2,body:lang(ar) .px-lg-2,body:lang(az) .pl-lg-2,body:lang(az) .px-lg-2,body:lang(dv) .pl-lg-2,body:lang(dv) .px-lg-2,body:lang(he) .pl-lg-2,body:lang(he) .px-lg-2,body:lang(ku) .pl-lg-2,body:lang(ku) .px-lg-2,body:lang(ur) .pl-lg-2,body:lang(ur) .px-lg-2{-webkit-padding-start:.5rem!important;padding-inline-start:.5rem!important}body:lang(fa) .p-lg-3,body:lang(ar) .p-lg-3,body:lang(az) .p-lg-3,body:lang(dv) .p-lg-3,body:lang(he) .p-lg-3,body:lang(ku) .p-lg-3,body:lang(ur) .p-lg-3{padding:1rem!important}body:lang(fa) .pt-lg-3,body:lang(fa) .py-lg-3,body:lang(ar) .pt-lg-3,body:lang(ar) .py-lg-3,body:lang(az) .pt-lg-3,body:lang(az) .py-lg-3,body:lang(dv) .pt-lg-3,body:lang(dv) .py-lg-3,body:lang(he) .pt-lg-3,body:lang(he) .py-lg-3,body:lang(ku) .pt-lg-3,body:lang(ku) .py-lg-3,body:lang(ur) .pt-lg-3,body:lang(ur) .py-lg-3{padding-top:1rem!important}body:lang(fa) .pr-lg-3,body:lang(fa) .px-lg-3,body:lang(ar) .pr-lg-3,body:lang(ar) .px-lg-3,body:lang(az) .pr-lg-3,body:lang(az) .px-lg-3,body:lang(dv) .pr-lg-3,body:lang(dv) .px-lg-3,body:lang(he) .pr-lg-3,body:lang(he) .px-lg-3,body:lang(ku) .pr-lg-3,body:lang(ku) .px-lg-3,body:lang(ur) .pr-lg-3,body:lang(ur) .px-lg-3{-webkit-padding-end:1rem!important;padding-inline-end:1rem!important}body:lang(fa) .pb-lg-3,body:lang(fa) .py-lg-3,body:lang(ar) .pb-lg-3,body:lang(ar) .py-lg-3,body:lang(az) .pb-lg-3,body:lang(az) .py-lg-3,body:lang(dv) .pb-lg-3,body:lang(dv) .py-lg-3,body:lang(he) .pb-lg-3,body:lang(he) .py-lg-3,body:lang(ku) .pb-lg-3,body:lang(ku) .py-lg-3,body:lang(ur) .pb-lg-3,body:lang(ur) .py-lg-3{padding-bottom:1rem!important}body:lang(fa) .pl-lg-3,body:lang(fa) .px-lg-3,body:lang(ar) .pl-lg-3,body:lang(ar) .px-lg-3,body:lang(az) .pl-lg-3,body:lang(az) .px-lg-3,body:lang(dv) .pl-lg-3,body:lang(dv) .px-lg-3,body:lang(he) .pl-lg-3,body:lang(he) .px-lg-3,body:lang(ku) .pl-lg-3,body:lang(ku) .px-lg-3,body:lang(ur) .pl-lg-3,body:lang(ur) .px-lg-3{-webkit-padding-start:1rem!important;padding-inline-start:1rem!important}body:lang(fa) .p-lg-4,body:lang(ar) .p-lg-4,body:lang(az) .p-lg-4,body:lang(dv) .p-lg-4,body:lang(he) .p-lg-4,body:lang(ku) .p-lg-4,body:lang(ur) .p-lg-4{padding:1.5rem!important}body:lang(fa) .pt-lg-4,body:lang(fa) .py-lg-4,body:lang(ar) .pt-lg-4,body:lang(ar) .py-lg-4,body:lang(az) .pt-lg-4,body:lang(az) .py-lg-4,body:lang(dv) .pt-lg-4,body:lang(dv) .py-lg-4,body:lang(he) .pt-lg-4,body:lang(he) .py-lg-4,body:lang(ku) .pt-lg-4,body:lang(ku) .py-lg-4,body:lang(ur) .pt-lg-4,body:lang(ur) .py-lg-4{padding-top:1.5rem!important}body:lang(fa) .pr-lg-4,body:lang(fa) .px-lg-4,body:lang(ar) .pr-lg-4,body:lang(ar) .px-lg-4,body:lang(az) .pr-lg-4,body:lang(az) .px-lg-4,body:lang(dv) .pr-lg-4,body:lang(dv) .px-lg-4,body:lang(he) .pr-lg-4,body:lang(he) .px-lg-4,body:lang(ku) .pr-lg-4,body:lang(ku) .px-lg-4,body:lang(ur) .pr-lg-4,body:lang(ur) .px-lg-4{-webkit-padding-end:1.5rem!important;padding-inline-end:1.5rem!important}body:lang(fa) .pb-lg-4,body:lang(fa) .py-lg-4,body:lang(ar) .pb-lg-4,body:lang(ar) .py-lg-4,body:lang(az) .pb-lg-4,body:lang(az) .py-lg-4,body:lang(dv) .pb-lg-4,body:lang(dv) .py-lg-4,body:lang(he) .pb-lg-4,body:lang(he) .py-lg-4,body:lang(ku) .pb-lg-4,body:lang(ku) .py-lg-4,body:lang(ur) .pb-lg-4,body:lang(ur) .py-lg-4{padding-bottom:1.5rem!important}body:lang(fa) .pl-lg-4,body:lang(fa) .px-lg-4,body:lang(ar) .pl-lg-4,body:lang(ar) .px-lg-4,body:lang(az) .pl-lg-4,body:lang(az) .px-lg-4,body:lang(dv) .pl-lg-4,body:lang(dv) .px-lg-4,body:lang(he) .pl-lg-4,body:lang(he) .px-lg-4,body:lang(ku) .pl-lg-4,body:lang(ku) .px-lg-4,body:lang(ur) .pl-lg-4,body:lang(ur) .px-lg-4{-webkit-padding-start:1.5rem!important;padding-inline-start:1.5rem!important}body:lang(fa) .p-lg-5,body:lang(ar) .p-lg-5,body:lang(az) .p-lg-5,body:lang(dv) .p-lg-5,body:lang(he) .p-lg-5,body:lang(ku) .p-lg-5,body:lang(ur) .p-lg-5{padding:3rem!important}body:lang(fa) .pt-lg-5,body:lang(fa) .py-lg-5,body:lang(ar) .pt-lg-5,body:lang(ar) .py-lg-5,body:lang(az) .pt-lg-5,body:lang(az) .py-lg-5,body:lang(dv) .pt-lg-5,body:lang(dv) .py-lg-5,body:lang(he) .pt-lg-5,body:lang(he) .py-lg-5,body:lang(ku) .pt-lg-5,body:lang(ku) .py-lg-5,body:lang(ur) .pt-lg-5,body:lang(ur) .py-lg-5{padding-top:3rem!important}body:lang(fa) .pr-lg-5,body:lang(fa) .px-lg-5,body:lang(ar) .pr-lg-5,body:lang(ar) .px-lg-5,body:lang(az) .pr-lg-5,body:lang(az) .px-lg-5,body:lang(dv) .pr-lg-5,body:lang(dv) .px-lg-5,body:lang(he) .pr-lg-5,body:lang(he) .px-lg-5,body:lang(ku) .pr-lg-5,body:lang(ku) .px-lg-5,body:lang(ur) .pr-lg-5,body:lang(ur) .px-lg-5{-webkit-padding-end:3rem!important;padding-inline-end:3rem!important}body:lang(fa) .pb-lg-5,body:lang(fa) .py-lg-5,body:lang(ar) .pb-lg-5,body:lang(ar) .py-lg-5,body:lang(az) .pb-lg-5,body:lang(az) .py-lg-5,body:lang(dv) .pb-lg-5,body:lang(dv) .py-lg-5,body:lang(he) .pb-lg-5,body:lang(he) .py-lg-5,body:lang(ku) .pb-lg-5,body:lang(ku) .py-lg-5,body:lang(ur) .pb-lg-5,body:lang(ur) .py-lg-5{padding-bottom:3rem!important}body:lang(fa) .pl-lg-5,body:lang(fa) .px-lg-5,body:lang(ar) .pl-lg-5,body:lang(ar) .px-lg-5,body:lang(az) .pl-lg-5,body:lang(az) .px-lg-5,body:lang(dv) .pl-lg-5,body:lang(dv) .px-lg-5,body:lang(he) .pl-lg-5,body:lang(he) .px-lg-5,body:lang(ku) .pl-lg-5,body:lang(ku) .px-lg-5,body:lang(ur) .pl-lg-5,body:lang(ur) .px-lg-5{-webkit-padding-start:3rem!important;padding-inline-start:3rem!important}body:lang(fa) .m-lg-n1,body:lang(ar) .m-lg-n1,body:lang(az) .m-lg-n1,body:lang(dv) .m-lg-n1,body:lang(he) .m-lg-n1,body:lang(ku) .m-lg-n1,body:lang(ur) .m-lg-n1{margin:-.25rem!important}body:lang(fa) .mt-lg-n1,body:lang(fa) .my-lg-n1,body:lang(ar) .mt-lg-n1,body:lang(ar) .my-lg-n1,body:lang(az) .mt-lg-n1,body:lang(az) .my-lg-n1,body:lang(dv) .mt-lg-n1,body:lang(dv) .my-lg-n1,body:lang(he) .mt-lg-n1,body:lang(he) .my-lg-n1,body:lang(ku) .mt-lg-n1,body:lang(ku) .my-lg-n1,body:lang(ur) .mt-lg-n1,body:lang(ur) .my-lg-n1{margin-top:-.25rem!important}body:lang(fa) .mr-lg-n1,body:lang(fa) .mx-lg-n1,body:lang(ar) .mr-lg-n1,body:lang(ar) .mx-lg-n1,body:lang(az) .mr-lg-n1,body:lang(az) .mx-lg-n1,body:lang(dv) .mr-lg-n1,body:lang(dv) .mx-lg-n1,body:lang(he) .mr-lg-n1,body:lang(he) .mx-lg-n1,body:lang(ku) .mr-lg-n1,body:lang(ku) .mx-lg-n1,body:lang(ur) .mr-lg-n1,body:lang(ur) .mx-lg-n1{margin-right:-.25rem!important}body:lang(fa) .mb-lg-n1,body:lang(fa) .my-lg-n1,body:lang(ar) .mb-lg-n1,body:lang(ar) .my-lg-n1,body:lang(az) .mb-lg-n1,body:lang(az) .my-lg-n1,body:lang(dv) .mb-lg-n1,body:lang(dv) .my-lg-n1,body:lang(he) .mb-lg-n1,body:lang(he) .my-lg-n1,body:lang(ku) .mb-lg-n1,body:lang(ku) .my-lg-n1,body:lang(ur) .mb-lg-n1,body:lang(ur) .my-lg-n1{margin-bottom:-.25rem!important}body:lang(fa) .ml-lg-n1,body:lang(fa) .mx-lg-n1,body:lang(ar) .ml-lg-n1,body:lang(ar) .mx-lg-n1,body:lang(az) .ml-lg-n1,body:lang(az) .mx-lg-n1,body:lang(dv) .ml-lg-n1,body:lang(dv) .mx-lg-n1,body:lang(he) .ml-lg-n1,body:lang(he) .mx-lg-n1,body:lang(ku) .ml-lg-n1,body:lang(ku) .mx-lg-n1,body:lang(ur) .ml-lg-n1,body:lang(ur) .mx-lg-n1{margin-left:-.25rem!important}body:lang(fa) .m-lg-n2,body:lang(ar) .m-lg-n2,body:lang(az) .m-lg-n2,body:lang(dv) .m-lg-n2,body:lang(he) .m-lg-n2,body:lang(ku) .m-lg-n2,body:lang(ur) .m-lg-n2{margin:-.5rem!important}body:lang(fa) .mt-lg-n2,body:lang(fa) .my-lg-n2,body:lang(ar) .mt-lg-n2,body:lang(ar) .my-lg-n2,body:lang(az) .mt-lg-n2,body:lang(az) .my-lg-n2,body:lang(dv) .mt-lg-n2,body:lang(dv) .my-lg-n2,body:lang(he) .mt-lg-n2,body:lang(he) .my-lg-n2,body:lang(ku) .mt-lg-n2,body:lang(ku) .my-lg-n2,body:lang(ur) .mt-lg-n2,body:lang(ur) .my-lg-n2{margin-top:-.5rem!important}body:lang(fa) .mr-lg-n2,body:lang(fa) .mx-lg-n2,body:lang(ar) .mr-lg-n2,body:lang(ar) .mx-lg-n2,body:lang(az) .mr-lg-n2,body:lang(az) .mx-lg-n2,body:lang(dv) .mr-lg-n2,body:lang(dv) .mx-lg-n2,body:lang(he) .mr-lg-n2,body:lang(he) .mx-lg-n2,body:lang(ku) .mr-lg-n2,body:lang(ku) .mx-lg-n2,body:lang(ur) .mr-lg-n2,body:lang(ur) .mx-lg-n2{margin-right:-.5rem!important}body:lang(fa) .mb-lg-n2,body:lang(fa) .my-lg-n2,body:lang(ar) .mb-lg-n2,body:lang(ar) .my-lg-n2,body:lang(az) .mb-lg-n2,body:lang(az) .my-lg-n2,body:lang(dv) .mb-lg-n2,body:lang(dv) .my-lg-n2,body:lang(he) .mb-lg-n2,body:lang(he) .my-lg-n2,body:lang(ku) .mb-lg-n2,body:lang(ku) .my-lg-n2,body:lang(ur) .mb-lg-n2,body:lang(ur) .my-lg-n2{margin-bottom:-.5rem!important}body:lang(fa) .ml-lg-n2,body:lang(fa) .mx-lg-n2,body:lang(ar) .ml-lg-n2,body:lang(ar) .mx-lg-n2,body:lang(az) .ml-lg-n2,body:lang(az) .mx-lg-n2,body:lang(dv) .ml-lg-n2,body:lang(dv) .mx-lg-n2,body:lang(he) .ml-lg-n2,body:lang(he) .mx-lg-n2,body:lang(ku) .ml-lg-n2,body:lang(ku) .mx-lg-n2,body:lang(ur) .ml-lg-n2,body:lang(ur) .mx-lg-n2{margin-left:-.5rem!important}body:lang(fa) .m-lg-n3,body:lang(ar) .m-lg-n3,body:lang(az) .m-lg-n3,body:lang(dv) .m-lg-n3,body:lang(he) .m-lg-n3,body:lang(ku) .m-lg-n3,body:lang(ur) .m-lg-n3{margin:-1rem!important}body:lang(fa) .mt-lg-n3,body:lang(fa) .my-lg-n3,body:lang(ar) .mt-lg-n3,body:lang(ar) .my-lg-n3,body:lang(az) .mt-lg-n3,body:lang(az) .my-lg-n3,body:lang(dv) .mt-lg-n3,body:lang(dv) .my-lg-n3,body:lang(he) .mt-lg-n3,body:lang(he) .my-lg-n3,body:lang(ku) .mt-lg-n3,body:lang(ku) .my-lg-n3,body:lang(ur) .mt-lg-n3,body:lang(ur) .my-lg-n3{margin-top:-1rem!important}body:lang(fa) .mr-lg-n3,body:lang(fa) .mx-lg-n3,body:lang(ar) .mr-lg-n3,body:lang(ar) .mx-lg-n3,body:lang(az) .mr-lg-n3,body:lang(az) .mx-lg-n3,body:lang(dv) .mr-lg-n3,body:lang(dv) .mx-lg-n3,body:lang(he) .mr-lg-n3,body:lang(he) .mx-lg-n3,body:lang(ku) .mr-lg-n3,body:lang(ku) .mx-lg-n3,body:lang(ur) .mr-lg-n3,body:lang(ur) .mx-lg-n3{margin-right:-1rem!important}body:lang(fa) .mb-lg-n3,body:lang(fa) .my-lg-n3,body:lang(ar) .mb-lg-n3,body:lang(ar) .my-lg-n3,body:lang(az) .mb-lg-n3,body:lang(az) .my-lg-n3,body:lang(dv) .mb-lg-n3,body:lang(dv) .my-lg-n3,body:lang(he) .mb-lg-n3,body:lang(he) .my-lg-n3,body:lang(ku) .mb-lg-n3,body:lang(ku) .my-lg-n3,body:lang(ur) .mb-lg-n3,body:lang(ur) .my-lg-n3{margin-bottom:-1rem!important}body:lang(fa) .ml-lg-n3,body:lang(fa) .mx-lg-n3,body:lang(ar) .ml-lg-n3,body:lang(ar) .mx-lg-n3,body:lang(az) .ml-lg-n3,body:lang(az) .mx-lg-n3,body:lang(dv) .ml-lg-n3,body:lang(dv) .mx-lg-n3,body:lang(he) .ml-lg-n3,body:lang(he) .mx-lg-n3,body:lang(ku) .ml-lg-n3,body:lang(ku) .mx-lg-n3,body:lang(ur) .ml-lg-n3,body:lang(ur) .mx-lg-n3{margin-left:-1rem!important}body:lang(fa) .m-lg-n4,body:lang(ar) .m-lg-n4,body:lang(az) .m-lg-n4,body:lang(dv) .m-lg-n4,body:lang(he) .m-lg-n4,body:lang(ku) .m-lg-n4,body:lang(ur) .m-lg-n4{margin:-1.5rem!important}body:lang(fa) .mt-lg-n4,body:lang(fa) .my-lg-n4,body:lang(ar) .mt-lg-n4,body:lang(ar) .my-lg-n4,body:lang(az) .mt-lg-n4,body:lang(az) .my-lg-n4,body:lang(dv) .mt-lg-n4,body:lang(dv) .my-lg-n4,body:lang(he) .mt-lg-n4,body:lang(he) .my-lg-n4,body:lang(ku) .mt-lg-n4,body:lang(ku) .my-lg-n4,body:lang(ur) .mt-lg-n4,body:lang(ur) .my-lg-n4{margin-top:-1.5rem!important}body:lang(fa) .mr-lg-n4,body:lang(fa) .mx-lg-n4,body:lang(ar) .mr-lg-n4,body:lang(ar) .mx-lg-n4,body:lang(az) .mr-lg-n4,body:lang(az) .mx-lg-n4,body:lang(dv) .mr-lg-n4,body:lang(dv) .mx-lg-n4,body:lang(he) .mr-lg-n4,body:lang(he) .mx-lg-n4,body:lang(ku) .mr-lg-n4,body:lang(ku) .mx-lg-n4,body:lang(ur) .mr-lg-n4,body:lang(ur) .mx-lg-n4{margin-right:-1.5rem!important}body:lang(fa) .mb-lg-n4,body:lang(fa) .my-lg-n4,body:lang(ar) .mb-lg-n4,body:lang(ar) .my-lg-n4,body:lang(az) .mb-lg-n4,body:lang(az) .my-lg-n4,body:lang(dv) .mb-lg-n4,body:lang(dv) .my-lg-n4,body:lang(he) .mb-lg-n4,body:lang(he) .my-lg-n4,body:lang(ku) .mb-lg-n4,body:lang(ku) .my-lg-n4,body:lang(ur) .mb-lg-n4,body:lang(ur) .my-lg-n4{margin-bottom:-1.5rem!important}body:lang(fa) .ml-lg-n4,body:lang(fa) .mx-lg-n4,body:lang(ar) .ml-lg-n4,body:lang(ar) .mx-lg-n4,body:lang(az) .ml-lg-n4,body:lang(az) .mx-lg-n4,body:lang(dv) .ml-lg-n4,body:lang(dv) .mx-lg-n4,body:lang(he) .ml-lg-n4,body:lang(he) .mx-lg-n4,body:lang(ku) .ml-lg-n4,body:lang(ku) .mx-lg-n4,body:lang(ur) .ml-lg-n4,body:lang(ur) .mx-lg-n4{margin-left:-1.5rem!important}body:lang(fa) .m-lg-n5,body:lang(ar) .m-lg-n5,body:lang(az) .m-lg-n5,body:lang(dv) .m-lg-n5,body:lang(he) .m-lg-n5,body:lang(ku) .m-lg-n5,body:lang(ur) .m-lg-n5{margin:-3rem!important}body:lang(fa) .mt-lg-n5,body:lang(fa) .my-lg-n5,body:lang(ar) .mt-lg-n5,body:lang(ar) .my-lg-n5,body:lang(az) .mt-lg-n5,body:lang(az) .my-lg-n5,body:lang(dv) .mt-lg-n5,body:lang(dv) .my-lg-n5,body:lang(he) .mt-lg-n5,body:lang(he) .my-lg-n5,body:lang(ku) .mt-lg-n5,body:lang(ku) .my-lg-n5,body:lang(ur) .mt-lg-n5,body:lang(ur) .my-lg-n5{margin-top:-3rem!important}body:lang(fa) .mr-lg-n5,body:lang(fa) .mx-lg-n5,body:lang(ar) .mr-lg-n5,body:lang(ar) .mx-lg-n5,body:lang(az) .mr-lg-n5,body:lang(az) .mx-lg-n5,body:lang(dv) .mr-lg-n5,body:lang(dv) .mx-lg-n5,body:lang(he) .mr-lg-n5,body:lang(he) .mx-lg-n5,body:lang(ku) .mr-lg-n5,body:lang(ku) .mx-lg-n5,body:lang(ur) .mr-lg-n5,body:lang(ur) .mx-lg-n5{margin-right:-3rem!important}body:lang(fa) .mb-lg-n5,body:lang(fa) .my-lg-n5,body:lang(ar) .mb-lg-n5,body:lang(ar) .my-lg-n5,body:lang(az) .mb-lg-n5,body:lang(az) .my-lg-n5,body:lang(dv) .mb-lg-n5,body:lang(dv) .my-lg-n5,body:lang(he) .mb-lg-n5,body:lang(he) .my-lg-n5,body:lang(ku) .mb-lg-n5,body:lang(ku) .my-lg-n5,body:lang(ur) .mb-lg-n5,body:lang(ur) .my-lg-n5{margin-bottom:-3rem!important}body:lang(fa) .ml-lg-n5,body:lang(fa) .mx-lg-n5,body:lang(ar) .ml-lg-n5,body:lang(ar) .mx-lg-n5,body:lang(az) .ml-lg-n5,body:lang(az) .mx-lg-n5,body:lang(dv) .ml-lg-n5,body:lang(dv) .mx-lg-n5,body:lang(he) .ml-lg-n5,body:lang(he) .mx-lg-n5,body:lang(ku) .ml-lg-n5,body:lang(ku) .mx-lg-n5,body:lang(ur) .ml-lg-n5,body:lang(ur) .mx-lg-n5{margin-left:-3rem!important}body:lang(fa) .m-lg-auto,body:lang(ar) .m-lg-auto,body:lang(az) .m-lg-auto,body:lang(dv) .m-lg-auto,body:lang(he) .m-lg-auto,body:lang(ku) .m-lg-auto,body:lang(ur) .m-lg-auto{margin:auto!important}body:lang(fa) .mt-lg-auto,body:lang(fa) .my-lg-auto,body:lang(ar) .mt-lg-auto,body:lang(ar) .my-lg-auto,body:lang(az) .mt-lg-auto,body:lang(az) .my-lg-auto,body:lang(dv) .mt-lg-auto,body:lang(dv) .my-lg-auto,body:lang(he) .mt-lg-auto,body:lang(he) .my-lg-auto,body:lang(ku) .mt-lg-auto,body:lang(ku) .my-lg-auto,body:lang(ur) .mt-lg-auto,body:lang(ur) .my-lg-auto{margin-top:auto!important}body:lang(fa) .mr-lg-auto,body:lang(fa) .mx-lg-auto,body:lang(ar) .mr-lg-auto,body:lang(ar) .mx-lg-auto,body:lang(az) .mr-lg-auto,body:lang(az) .mx-lg-auto,body:lang(dv) .mr-lg-auto,body:lang(dv) .mx-lg-auto,body:lang(he) .mr-lg-auto,body:lang(he) .mx-lg-auto,body:lang(ku) .mr-lg-auto,body:lang(ku) .mx-lg-auto,body:lang(ur) .mr-lg-auto,body:lang(ur) .mx-lg-auto{margin-right:auto!important}body:lang(fa) .mb-lg-auto,body:lang(fa) .my-lg-auto,body:lang(ar) .mb-lg-auto,body:lang(ar) .my-lg-auto,body:lang(az) .mb-lg-auto,body:lang(az) .my-lg-auto,body:lang(dv) .mb-lg-auto,body:lang(dv) .my-lg-auto,body:lang(he) .mb-lg-auto,body:lang(he) .my-lg-auto,body:lang(ku) .mb-lg-auto,body:lang(ku) .my-lg-auto,body:lang(ur) .mb-lg-auto,body:lang(ur) .my-lg-auto{margin-bottom:auto!important}body:lang(fa) .ml-lg-auto,body:lang(fa) .mx-lg-auto,body:lang(ar) .ml-lg-auto,body:lang(ar) .mx-lg-auto,body:lang(az) .ml-lg-auto,body:lang(az) .mx-lg-auto,body:lang(dv) .ml-lg-auto,body:lang(dv) .mx-lg-auto,body:lang(he) .ml-lg-auto,body:lang(he) .mx-lg-auto,body:lang(ku) .ml-lg-auto,body:lang(ku) .mx-lg-auto,body:lang(ur) .ml-lg-auto,body:lang(ur) .mx-lg-auto{margin-left:auto!important}}@media(min-width:1200px){body:lang(fa) .m-xl-0,body:lang(ar) .m-xl-0,body:lang(az) .m-xl-0,body:lang(dv) .m-xl-0,body:lang(he) .m-xl-0,body:lang(ku) .m-xl-0,body:lang(ur) .m-xl-0{margin:0!important}body:lang(fa) .mt-xl-0,body:lang(fa) .my-xl-0,body:lang(ar) .mt-xl-0,body:lang(ar) .my-xl-0,body:lang(az) .mt-xl-0,body:lang(az) .my-xl-0,body:lang(dv) .mt-xl-0,body:lang(dv) .my-xl-0,body:lang(he) .mt-xl-0,body:lang(he) .my-xl-0,body:lang(ku) .mt-xl-0,body:lang(ku) .my-xl-0,body:lang(ur) .mt-xl-0,body:lang(ur) .my-xl-0{margin-top:0!important}body:lang(fa) .mr-xl-0,body:lang(fa) .mx-xl-0,body:lang(ar) .mr-xl-0,body:lang(ar) .mx-xl-0,body:lang(az) .mr-xl-0,body:lang(az) .mx-xl-0,body:lang(dv) .mr-xl-0,body:lang(dv) .mx-xl-0,body:lang(he) .mr-xl-0,body:lang(he) .mx-xl-0,body:lang(ku) .mr-xl-0,body:lang(ku) .mx-xl-0,body:lang(ur) .mr-xl-0,body:lang(ur) .mx-xl-0{-webkit-margin-end:0!important;margin-inline-end:0!important}body:lang(fa) .mb-xl-0,body:lang(fa) .my-xl-0,body:lang(ar) .mb-xl-0,body:lang(ar) .my-xl-0,body:lang(az) .mb-xl-0,body:lang(az) .my-xl-0,body:lang(dv) .mb-xl-0,body:lang(dv) .my-xl-0,body:lang(he) .mb-xl-0,body:lang(he) .my-xl-0,body:lang(ku) .mb-xl-0,body:lang(ku) .my-xl-0,body:lang(ur) .mb-xl-0,body:lang(ur) .my-xl-0{margin-bottom:0!important}body:lang(fa) .ml-xl-0,body:lang(fa) .mx-xl-0,body:lang(ar) .ml-xl-0,body:lang(ar) .mx-xl-0,body:lang(az) .ml-xl-0,body:lang(az) .mx-xl-0,body:lang(dv) .ml-xl-0,body:lang(dv) .mx-xl-0,body:lang(he) .ml-xl-0,body:lang(he) .mx-xl-0,body:lang(ku) .ml-xl-0,body:lang(ku) .mx-xl-0,body:lang(ur) .ml-xl-0,body:lang(ur) .mx-xl-0{-webkit-margin-start:0!important;margin-inline-start:0!important}body:lang(fa) .m-xl-1,body:lang(ar) .m-xl-1,body:lang(az) .m-xl-1,body:lang(dv) .m-xl-1,body:lang(he) .m-xl-1,body:lang(ku) .m-xl-1,body:lang(ur) .m-xl-1{margin:.25rem!important}body:lang(fa) .mt-xl-1,body:lang(fa) .my-xl-1,body:lang(ar) .mt-xl-1,body:lang(ar) .my-xl-1,body:lang(az) .mt-xl-1,body:lang(az) .my-xl-1,body:lang(dv) .mt-xl-1,body:lang(dv) .my-xl-1,body:lang(he) .mt-xl-1,body:lang(he) .my-xl-1,body:lang(ku) .mt-xl-1,body:lang(ku) .my-xl-1,body:lang(ur) .mt-xl-1,body:lang(ur) .my-xl-1{margin-top:.25rem!important}body:lang(fa) .mr-xl-1,body:lang(fa) .mx-xl-1,body:lang(ar) .mr-xl-1,body:lang(ar) .mx-xl-1,body:lang(az) .mr-xl-1,body:lang(az) .mx-xl-1,body:lang(dv) .mr-xl-1,body:lang(dv) .mx-xl-1,body:lang(he) .mr-xl-1,body:lang(he) .mx-xl-1,body:lang(ku) .mr-xl-1,body:lang(ku) .mx-xl-1,body:lang(ur) .mr-xl-1,body:lang(ur) .mx-xl-1{-webkit-margin-end:.25rem!important;margin-inline-end:.25rem!important}body:lang(fa) .mb-xl-1,body:lang(fa) .my-xl-1,body:lang(ar) .mb-xl-1,body:lang(ar) .my-xl-1,body:lang(az) .mb-xl-1,body:lang(az) .my-xl-1,body:lang(dv) .mb-xl-1,body:lang(dv) .my-xl-1,body:lang(he) .mb-xl-1,body:lang(he) .my-xl-1,body:lang(ku) .mb-xl-1,body:lang(ku) .my-xl-1,body:lang(ur) .mb-xl-1,body:lang(ur) .my-xl-1{margin-bottom:.25rem!important}body:lang(fa) .ml-xl-1,body:lang(fa) .mx-xl-1,body:lang(ar) .ml-xl-1,body:lang(ar) .mx-xl-1,body:lang(az) .ml-xl-1,body:lang(az) .mx-xl-1,body:lang(dv) .ml-xl-1,body:lang(dv) .mx-xl-1,body:lang(he) .ml-xl-1,body:lang(he) .mx-xl-1,body:lang(ku) .ml-xl-1,body:lang(ku) .mx-xl-1,body:lang(ur) .ml-xl-1,body:lang(ur) .mx-xl-1{-webkit-margin-start:.25rem!important;margin-inline-start:.25rem!important}body:lang(fa) .m-xl-2,body:lang(ar) .m-xl-2,body:lang(az) .m-xl-2,body:lang(dv) .m-xl-2,body:lang(he) .m-xl-2,body:lang(ku) .m-xl-2,body:lang(ur) .m-xl-2{margin:.5rem!important}body:lang(fa) .mt-xl-2,body:lang(fa) .my-xl-2,body:lang(ar) .mt-xl-2,body:lang(ar) .my-xl-2,body:lang(az) .mt-xl-2,body:lang(az) .my-xl-2,body:lang(dv) .mt-xl-2,body:lang(dv) .my-xl-2,body:lang(he) .mt-xl-2,body:lang(he) .my-xl-2,body:lang(ku) .mt-xl-2,body:lang(ku) .my-xl-2,body:lang(ur) .mt-xl-2,body:lang(ur) .my-xl-2{margin-top:.5rem!important}body:lang(fa) .mr-xl-2,body:lang(fa) .mx-xl-2,body:lang(ar) .mr-xl-2,body:lang(ar) .mx-xl-2,body:lang(az) .mr-xl-2,body:lang(az) .mx-xl-2,body:lang(dv) .mr-xl-2,body:lang(dv) .mx-xl-2,body:lang(he) .mr-xl-2,body:lang(he) .mx-xl-2,body:lang(ku) .mr-xl-2,body:lang(ku) .mx-xl-2,body:lang(ur) .mr-xl-2,body:lang(ur) .mx-xl-2{-webkit-margin-end:.5rem!important;margin-inline-end:.5rem!important}body:lang(fa) .mb-xl-2,body:lang(fa) .my-xl-2,body:lang(ar) .mb-xl-2,body:lang(ar) .my-xl-2,body:lang(az) .mb-xl-2,body:lang(az) .my-xl-2,body:lang(dv) .mb-xl-2,body:lang(dv) .my-xl-2,body:lang(he) .mb-xl-2,body:lang(he) .my-xl-2,body:lang(ku) .mb-xl-2,body:lang(ku) .my-xl-2,body:lang(ur) .mb-xl-2,body:lang(ur) .my-xl-2{margin-bottom:.5rem!important}body:lang(fa) .ml-xl-2,body:lang(fa) .mx-xl-2,body:lang(ar) .ml-xl-2,body:lang(ar) .mx-xl-2,body:lang(az) .ml-xl-2,body:lang(az) .mx-xl-2,body:lang(dv) .ml-xl-2,body:lang(dv) .mx-xl-2,body:lang(he) .ml-xl-2,body:lang(he) .mx-xl-2,body:lang(ku) .ml-xl-2,body:lang(ku) .mx-xl-2,body:lang(ur) .ml-xl-2,body:lang(ur) .mx-xl-2{-webkit-margin-start:.5rem!important;margin-inline-start:.5rem!important}body:lang(fa) .m-xl-3,body:lang(ar) .m-xl-3,body:lang(az) .m-xl-3,body:lang(dv) .m-xl-3,body:lang(he) .m-xl-3,body:lang(ku) .m-xl-3,body:lang(ur) .m-xl-3{margin:1rem!important}body:lang(fa) .mt-xl-3,body:lang(fa) .my-xl-3,body:lang(ar) .mt-xl-3,body:lang(ar) .my-xl-3,body:lang(az) .mt-xl-3,body:lang(az) .my-xl-3,body:lang(dv) .mt-xl-3,body:lang(dv) .my-xl-3,body:lang(he) .mt-xl-3,body:lang(he) .my-xl-3,body:lang(ku) .mt-xl-3,body:lang(ku) .my-xl-3,body:lang(ur) .mt-xl-3,body:lang(ur) .my-xl-3{margin-top:1rem!important}body:lang(fa) .mr-xl-3,body:lang(fa) .mx-xl-3,body:lang(ar) .mr-xl-3,body:lang(ar) .mx-xl-3,body:lang(az) .mr-xl-3,body:lang(az) .mx-xl-3,body:lang(dv) .mr-xl-3,body:lang(dv) .mx-xl-3,body:lang(he) .mr-xl-3,body:lang(he) .mx-xl-3,body:lang(ku) .mr-xl-3,body:lang(ku) .mx-xl-3,body:lang(ur) .mr-xl-3,body:lang(ur) .mx-xl-3{-webkit-margin-end:1rem!important;margin-inline-end:1rem!important}body:lang(fa) .mb-xl-3,body:lang(fa) .my-xl-3,body:lang(ar) .mb-xl-3,body:lang(ar) .my-xl-3,body:lang(az) .mb-xl-3,body:lang(az) .my-xl-3,body:lang(dv) .mb-xl-3,body:lang(dv) .my-xl-3,body:lang(he) .mb-xl-3,body:lang(he) .my-xl-3,body:lang(ku) .mb-xl-3,body:lang(ku) .my-xl-3,body:lang(ur) .mb-xl-3,body:lang(ur) .my-xl-3{margin-bottom:1rem!important}body:lang(fa) .ml-xl-3,body:lang(fa) .mx-xl-3,body:lang(ar) .ml-xl-3,body:lang(ar) .mx-xl-3,body:lang(az) .ml-xl-3,body:lang(az) .mx-xl-3,body:lang(dv) .ml-xl-3,body:lang(dv) .mx-xl-3,body:lang(he) .ml-xl-3,body:lang(he) .mx-xl-3,body:lang(ku) .ml-xl-3,body:lang(ku) .mx-xl-3,body:lang(ur) .ml-xl-3,body:lang(ur) .mx-xl-3{-webkit-margin-start:1rem!important;margin-inline-start:1rem!important}body:lang(fa) .m-xl-4,body:lang(ar) .m-xl-4,body:lang(az) .m-xl-4,body:lang(dv) .m-xl-4,body:lang(he) .m-xl-4,body:lang(ku) .m-xl-4,body:lang(ur) .m-xl-4{margin:1.5rem!important}body:lang(fa) .mt-xl-4,body:lang(fa) .my-xl-4,body:lang(ar) .mt-xl-4,body:lang(ar) .my-xl-4,body:lang(az) .mt-xl-4,body:lang(az) .my-xl-4,body:lang(dv) .mt-xl-4,body:lang(dv) .my-xl-4,body:lang(he) .mt-xl-4,body:lang(he) .my-xl-4,body:lang(ku) .mt-xl-4,body:lang(ku) .my-xl-4,body:lang(ur) .mt-xl-4,body:lang(ur) .my-xl-4{margin-top:1.5rem!important}body:lang(fa) .mr-xl-4,body:lang(fa) .mx-xl-4,body:lang(ar) .mr-xl-4,body:lang(ar) .mx-xl-4,body:lang(az) .mr-xl-4,body:lang(az) .mx-xl-4,body:lang(dv) .mr-xl-4,body:lang(dv) .mx-xl-4,body:lang(he) .mr-xl-4,body:lang(he) .mx-xl-4,body:lang(ku) .mr-xl-4,body:lang(ku) .mx-xl-4,body:lang(ur) .mr-xl-4,body:lang(ur) .mx-xl-4{-webkit-margin-end:1.5rem!important;margin-inline-end:1.5rem!important}body:lang(fa) .mb-xl-4,body:lang(fa) .my-xl-4,body:lang(ar) .mb-xl-4,body:lang(ar) .my-xl-4,body:lang(az) .mb-xl-4,body:lang(az) .my-xl-4,body:lang(dv) .mb-xl-4,body:lang(dv) .my-xl-4,body:lang(he) .mb-xl-4,body:lang(he) .my-xl-4,body:lang(ku) .mb-xl-4,body:lang(ku) .my-xl-4,body:lang(ur) .mb-xl-4,body:lang(ur) .my-xl-4{margin-bottom:1.5rem!important}body:lang(fa) .ml-xl-4,body:lang(fa) .mx-xl-4,body:lang(ar) .ml-xl-4,body:lang(ar) .mx-xl-4,body:lang(az) .ml-xl-4,body:lang(az) .mx-xl-4,body:lang(dv) .ml-xl-4,body:lang(dv) .mx-xl-4,body:lang(he) .ml-xl-4,body:lang(he) .mx-xl-4,body:lang(ku) .ml-xl-4,body:lang(ku) .mx-xl-4,body:lang(ur) .ml-xl-4,body:lang(ur) .mx-xl-4{-webkit-margin-start:1.5rem!important;margin-inline-start:1.5rem!important}body:lang(fa) .m-xl-5,body:lang(ar) .m-xl-5,body:lang(az) .m-xl-5,body:lang(dv) .m-xl-5,body:lang(he) .m-xl-5,body:lang(ku) .m-xl-5,body:lang(ur) .m-xl-5{margin:3rem!important}body:lang(fa) .mt-xl-5,body:lang(fa) .my-xl-5,body:lang(ar) .mt-xl-5,body:lang(ar) .my-xl-5,body:lang(az) .mt-xl-5,body:lang(az) .my-xl-5,body:lang(dv) .mt-xl-5,body:lang(dv) .my-xl-5,body:lang(he) .mt-xl-5,body:lang(he) .my-xl-5,body:lang(ku) .mt-xl-5,body:lang(ku) .my-xl-5,body:lang(ur) .mt-xl-5,body:lang(ur) .my-xl-5{margin-top:3rem!important}body:lang(fa) .mr-xl-5,body:lang(fa) .mx-xl-5,body:lang(ar) .mr-xl-5,body:lang(ar) .mx-xl-5,body:lang(az) .mr-xl-5,body:lang(az) .mx-xl-5,body:lang(dv) .mr-xl-5,body:lang(dv) .mx-xl-5,body:lang(he) .mr-xl-5,body:lang(he) .mx-xl-5,body:lang(ku) .mr-xl-5,body:lang(ku) .mx-xl-5,body:lang(ur) .mr-xl-5,body:lang(ur) .mx-xl-5{-webkit-margin-end:3rem!important;margin-inline-end:3rem!important}body:lang(fa) .mb-xl-5,body:lang(fa) .my-xl-5,body:lang(ar) .mb-xl-5,body:lang(ar) .my-xl-5,body:lang(az) .mb-xl-5,body:lang(az) .my-xl-5,body:lang(dv) .mb-xl-5,body:lang(dv) .my-xl-5,body:lang(he) .mb-xl-5,body:lang(he) .my-xl-5,body:lang(ku) .mb-xl-5,body:lang(ku) .my-xl-5,body:lang(ur) .mb-xl-5,body:lang(ur) .my-xl-5{margin-bottom:3rem!important}body:lang(fa) .ml-xl-5,body:lang(fa) .mx-xl-5,body:lang(ar) .ml-xl-5,body:lang(ar) .mx-xl-5,body:lang(az) .ml-xl-5,body:lang(az) .mx-xl-5,body:lang(dv) .ml-xl-5,body:lang(dv) .mx-xl-5,body:lang(he) .ml-xl-5,body:lang(he) .mx-xl-5,body:lang(ku) .ml-xl-5,body:lang(ku) .mx-xl-5,body:lang(ur) .ml-xl-5,body:lang(ur) .mx-xl-5{-webkit-margin-start:3rem!important;margin-inline-start:3rem!important}body:lang(fa) .p-xl-0,body:lang(ar) .p-xl-0,body:lang(az) .p-xl-0,body:lang(dv) .p-xl-0,body:lang(he) .p-xl-0,body:lang(ku) .p-xl-0,body:lang(ur) .p-xl-0{padding:0!important}body:lang(fa) .pt-xl-0,body:lang(fa) .py-xl-0,body:lang(ar) .pt-xl-0,body:lang(ar) .py-xl-0,body:lang(az) .pt-xl-0,body:lang(az) .py-xl-0,body:lang(dv) .pt-xl-0,body:lang(dv) .py-xl-0,body:lang(he) .pt-xl-0,body:lang(he) .py-xl-0,body:lang(ku) .pt-xl-0,body:lang(ku) .py-xl-0,body:lang(ur) .pt-xl-0,body:lang(ur) .py-xl-0{padding-top:0!important}body:lang(fa) .pr-xl-0,body:lang(fa) .px-xl-0,body:lang(ar) .pr-xl-0,body:lang(ar) .px-xl-0,body:lang(az) .pr-xl-0,body:lang(az) .px-xl-0,body:lang(dv) .pr-xl-0,body:lang(dv) .px-xl-0,body:lang(he) .pr-xl-0,body:lang(he) .px-xl-0,body:lang(ku) .pr-xl-0,body:lang(ku) .px-xl-0,body:lang(ur) .pr-xl-0,body:lang(ur) .px-xl-0{-webkit-padding-end:0!important;padding-inline-end:0!important}body:lang(fa) .pb-xl-0,body:lang(fa) .py-xl-0,body:lang(ar) .pb-xl-0,body:lang(ar) .py-xl-0,body:lang(az) .pb-xl-0,body:lang(az) .py-xl-0,body:lang(dv) .pb-xl-0,body:lang(dv) .py-xl-0,body:lang(he) .pb-xl-0,body:lang(he) .py-xl-0,body:lang(ku) .pb-xl-0,body:lang(ku) .py-xl-0,body:lang(ur) .pb-xl-0,body:lang(ur) .py-xl-0{padding-bottom:0!important}body:lang(fa) .pl-xl-0,body:lang(fa) .px-xl-0,body:lang(ar) .pl-xl-0,body:lang(ar) .px-xl-0,body:lang(az) .pl-xl-0,body:lang(az) .px-xl-0,body:lang(dv) .pl-xl-0,body:lang(dv) .px-xl-0,body:lang(he) .pl-xl-0,body:lang(he) .px-xl-0,body:lang(ku) .pl-xl-0,body:lang(ku) .px-xl-0,body:lang(ur) .pl-xl-0,body:lang(ur) .px-xl-0{-webkit-padding-start:0!important;padding-inline-start:0!important}body:lang(fa) .p-xl-1,body:lang(ar) .p-xl-1,body:lang(az) .p-xl-1,body:lang(dv) .p-xl-1,body:lang(he) .p-xl-1,body:lang(ku) .p-xl-1,body:lang(ur) .p-xl-1{padding:.25rem!important}body:lang(fa) .pt-xl-1,body:lang(fa) .py-xl-1,body:lang(ar) .pt-xl-1,body:lang(ar) .py-xl-1,body:lang(az) .pt-xl-1,body:lang(az) .py-xl-1,body:lang(dv) .pt-xl-1,body:lang(dv) .py-xl-1,body:lang(he) .pt-xl-1,body:lang(he) .py-xl-1,body:lang(ku) .pt-xl-1,body:lang(ku) .py-xl-1,body:lang(ur) .pt-xl-1,body:lang(ur) .py-xl-1{padding-top:.25rem!important}body:lang(fa) .pr-xl-1,body:lang(fa) .px-xl-1,body:lang(ar) .pr-xl-1,body:lang(ar) .px-xl-1,body:lang(az) .pr-xl-1,body:lang(az) .px-xl-1,body:lang(dv) .pr-xl-1,body:lang(dv) .px-xl-1,body:lang(he) .pr-xl-1,body:lang(he) .px-xl-1,body:lang(ku) .pr-xl-1,body:lang(ku) .px-xl-1,body:lang(ur) .pr-xl-1,body:lang(ur) .px-xl-1{-webkit-padding-end:.25rem!important;padding-inline-end:.25rem!important}body:lang(fa) .pb-xl-1,body:lang(fa) .py-xl-1,body:lang(ar) .pb-xl-1,body:lang(ar) .py-xl-1,body:lang(az) .pb-xl-1,body:lang(az) .py-xl-1,body:lang(dv) .pb-xl-1,body:lang(dv) .py-xl-1,body:lang(he) .pb-xl-1,body:lang(he) .py-xl-1,body:lang(ku) .pb-xl-1,body:lang(ku) .py-xl-1,body:lang(ur) .pb-xl-1,body:lang(ur) .py-xl-1{padding-bottom:.25rem!important}body:lang(fa) .pl-xl-1,body:lang(fa) .px-xl-1,body:lang(ar) .pl-xl-1,body:lang(ar) .px-xl-1,body:lang(az) .pl-xl-1,body:lang(az) .px-xl-1,body:lang(dv) .pl-xl-1,body:lang(dv) .px-xl-1,body:lang(he) .pl-xl-1,body:lang(he) .px-xl-1,body:lang(ku) .pl-xl-1,body:lang(ku) .px-xl-1,body:lang(ur) .pl-xl-1,body:lang(ur) .px-xl-1{-webkit-padding-start:.25rem!important;padding-inline-start:.25rem!important}body:lang(fa) .p-xl-2,body:lang(ar) .p-xl-2,body:lang(az) .p-xl-2,body:lang(dv) .p-xl-2,body:lang(he) .p-xl-2,body:lang(ku) .p-xl-2,body:lang(ur) .p-xl-2{padding:.5rem!important}body:lang(fa) .pt-xl-2,body:lang(fa) .py-xl-2,body:lang(ar) .pt-xl-2,body:lang(ar) .py-xl-2,body:lang(az) .pt-xl-2,body:lang(az) .py-xl-2,body:lang(dv) .pt-xl-2,body:lang(dv) .py-xl-2,body:lang(he) .pt-xl-2,body:lang(he) .py-xl-2,body:lang(ku) .pt-xl-2,body:lang(ku) .py-xl-2,body:lang(ur) .pt-xl-2,body:lang(ur) .py-xl-2{padding-top:.5rem!important}body:lang(fa) .pr-xl-2,body:lang(fa) .px-xl-2,body:lang(ar) .pr-xl-2,body:lang(ar) .px-xl-2,body:lang(az) .pr-xl-2,body:lang(az) .px-xl-2,body:lang(dv) .pr-xl-2,body:lang(dv) .px-xl-2,body:lang(he) .pr-xl-2,body:lang(he) .px-xl-2,body:lang(ku) .pr-xl-2,body:lang(ku) .px-xl-2,body:lang(ur) .pr-xl-2,body:lang(ur) .px-xl-2{-webkit-padding-end:.5rem!important;padding-inline-end:.5rem!important}body:lang(fa) .pb-xl-2,body:lang(fa) .py-xl-2,body:lang(ar) .pb-xl-2,body:lang(ar) .py-xl-2,body:lang(az) .pb-xl-2,body:lang(az) .py-xl-2,body:lang(dv) .pb-xl-2,body:lang(dv) .py-xl-2,body:lang(he) .pb-xl-2,body:lang(he) .py-xl-2,body:lang(ku) .pb-xl-2,body:lang(ku) .py-xl-2,body:lang(ur) .pb-xl-2,body:lang(ur) .py-xl-2{padding-bottom:.5rem!important}body:lang(fa) .pl-xl-2,body:lang(fa) .px-xl-2,body:lang(ar) .pl-xl-2,body:lang(ar) .px-xl-2,body:lang(az) .pl-xl-2,body:lang(az) .px-xl-2,body:lang(dv) .pl-xl-2,body:lang(dv) .px-xl-2,body:lang(he) .pl-xl-2,body:lang(he) .px-xl-2,body:lang(ku) .pl-xl-2,body:lang(ku) .px-xl-2,body:lang(ur) .pl-xl-2,body:lang(ur) .px-xl-2{-webkit-padding-start:.5rem!important;padding-inline-start:.5rem!important}body:lang(fa) .p-xl-3,body:lang(ar) .p-xl-3,body:lang(az) .p-xl-3,body:lang(dv) .p-xl-3,body:lang(he) .p-xl-3,body:lang(ku) .p-xl-3,body:lang(ur) .p-xl-3{padding:1rem!important}body:lang(fa) .pt-xl-3,body:lang(fa) .py-xl-3,body:lang(ar) .pt-xl-3,body:lang(ar) .py-xl-3,body:lang(az) .pt-xl-3,body:lang(az) .py-xl-3,body:lang(dv) .pt-xl-3,body:lang(dv) .py-xl-3,body:lang(he) .pt-xl-3,body:lang(he) .py-xl-3,body:lang(ku) .pt-xl-3,body:lang(ku) .py-xl-3,body:lang(ur) .pt-xl-3,body:lang(ur) .py-xl-3{padding-top:1rem!important}body:lang(fa) .pr-xl-3,body:lang(fa) .px-xl-3,body:lang(ar) .pr-xl-3,body:lang(ar) .px-xl-3,body:lang(az) .pr-xl-3,body:lang(az) .px-xl-3,body:lang(dv) .pr-xl-3,body:lang(dv) .px-xl-3,body:lang(he) .pr-xl-3,body:lang(he) .px-xl-3,body:lang(ku) .pr-xl-3,body:lang(ku) .px-xl-3,body:lang(ur) .pr-xl-3,body:lang(ur) .px-xl-3{-webkit-padding-end:1rem!important;padding-inline-end:1rem!important}body:lang(fa) .pb-xl-3,body:lang(fa) .py-xl-3,body:lang(ar) .pb-xl-3,body:lang(ar) .py-xl-3,body:lang(az) .pb-xl-3,body:lang(az) .py-xl-3,body:lang(dv) .pb-xl-3,body:lang(dv) .py-xl-3,body:lang(he) .pb-xl-3,body:lang(he) .py-xl-3,body:lang(ku) .pb-xl-3,body:lang(ku) .py-xl-3,body:lang(ur) .pb-xl-3,body:lang(ur) .py-xl-3{padding-bottom:1rem!important}body:lang(fa) .pl-xl-3,body:lang(fa) .px-xl-3,body:lang(ar) .pl-xl-3,body:lang(ar) .px-xl-3,body:lang(az) .pl-xl-3,body:lang(az) .px-xl-3,body:lang(dv) .pl-xl-3,body:lang(dv) .px-xl-3,body:lang(he) .pl-xl-3,body:lang(he) .px-xl-3,body:lang(ku) .pl-xl-3,body:lang(ku) .px-xl-3,body:lang(ur) .pl-xl-3,body:lang(ur) .px-xl-3{-webkit-padding-start:1rem!important;padding-inline-start:1rem!important}body:lang(fa) .p-xl-4,body:lang(ar) .p-xl-4,body:lang(az) .p-xl-4,body:lang(dv) .p-xl-4,body:lang(he) .p-xl-4,body:lang(ku) .p-xl-4,body:lang(ur) .p-xl-4{padding:1.5rem!important}body:lang(fa) .pt-xl-4,body:lang(fa) .py-xl-4,body:lang(ar) .pt-xl-4,body:lang(ar) .py-xl-4,body:lang(az) .pt-xl-4,body:lang(az) .py-xl-4,body:lang(dv) .pt-xl-4,body:lang(dv) .py-xl-4,body:lang(he) .pt-xl-4,body:lang(he) .py-xl-4,body:lang(ku) .pt-xl-4,body:lang(ku) .py-xl-4,body:lang(ur) .pt-xl-4,body:lang(ur) .py-xl-4{padding-top:1.5rem!important}body:lang(fa) .pr-xl-4,body:lang(fa) .px-xl-4,body:lang(ar) .pr-xl-4,body:lang(ar) .px-xl-4,body:lang(az) .pr-xl-4,body:lang(az) .px-xl-4,body:lang(dv) .pr-xl-4,body:lang(dv) .px-xl-4,body:lang(he) .pr-xl-4,body:lang(he) .px-xl-4,body:lang(ku) .pr-xl-4,body:lang(ku) .px-xl-4,body:lang(ur) .pr-xl-4,body:lang(ur) .px-xl-4{-webkit-padding-end:1.5rem!important;padding-inline-end:1.5rem!important}body:lang(fa) .pb-xl-4,body:lang(fa) .py-xl-4,body:lang(ar) .pb-xl-4,body:lang(ar) .py-xl-4,body:lang(az) .pb-xl-4,body:lang(az) .py-xl-4,body:lang(dv) .pb-xl-4,body:lang(dv) .py-xl-4,body:lang(he) .pb-xl-4,body:lang(he) .py-xl-4,body:lang(ku) .pb-xl-4,body:lang(ku) .py-xl-4,body:lang(ur) .pb-xl-4,body:lang(ur) .py-xl-4{padding-bottom:1.5rem!important}body:lang(fa) .pl-xl-4,body:lang(fa) .px-xl-4,body:lang(ar) .pl-xl-4,body:lang(ar) .px-xl-4,body:lang(az) .pl-xl-4,body:lang(az) .px-xl-4,body:lang(dv) .pl-xl-4,body:lang(dv) .px-xl-4,body:lang(he) .pl-xl-4,body:lang(he) .px-xl-4,body:lang(ku) .pl-xl-4,body:lang(ku) .px-xl-4,body:lang(ur) .pl-xl-4,body:lang(ur) .px-xl-4{-webkit-padding-start:1.5rem!important;padding-inline-start:1.5rem!important}body:lang(fa) .p-xl-5,body:lang(ar) .p-xl-5,body:lang(az) .p-xl-5,body:lang(dv) .p-xl-5,body:lang(he) .p-xl-5,body:lang(ku) .p-xl-5,body:lang(ur) .p-xl-5{padding:3rem!important}body:lang(fa) .pt-xl-5,body:lang(fa) .py-xl-5,body:lang(ar) .pt-xl-5,body:lang(ar) .py-xl-5,body:lang(az) .pt-xl-5,body:lang(az) .py-xl-5,body:lang(dv) .pt-xl-5,body:lang(dv) .py-xl-5,body:lang(he) .pt-xl-5,body:lang(he) .py-xl-5,body:lang(ku) .pt-xl-5,body:lang(ku) .py-xl-5,body:lang(ur) .pt-xl-5,body:lang(ur) .py-xl-5{padding-top:3rem!important}body:lang(fa) .pr-xl-5,body:lang(fa) .px-xl-5,body:lang(ar) .pr-xl-5,body:lang(ar) .px-xl-5,body:lang(az) .pr-xl-5,body:lang(az) .px-xl-5,body:lang(dv) .pr-xl-5,body:lang(dv) .px-xl-5,body:lang(he) .pr-xl-5,body:lang(he) .px-xl-5,body:lang(ku) .pr-xl-5,body:lang(ku) .px-xl-5,body:lang(ur) .pr-xl-5,body:lang(ur) .px-xl-5{-webkit-padding-end:3rem!important;padding-inline-end:3rem!important}body:lang(fa) .pb-xl-5,body:lang(fa) .py-xl-5,body:lang(ar) .pb-xl-5,body:lang(ar) .py-xl-5,body:lang(az) .pb-xl-5,body:lang(az) .py-xl-5,body:lang(dv) .pb-xl-5,body:lang(dv) .py-xl-5,body:lang(he) .pb-xl-5,body:lang(he) .py-xl-5,body:lang(ku) .pb-xl-5,body:lang(ku) .py-xl-5,body:lang(ur) .pb-xl-5,body:lang(ur) .py-xl-5{padding-bottom:3rem!important}body:lang(fa) .pl-xl-5,body:lang(fa) .px-xl-5,body:lang(ar) .pl-xl-5,body:lang(ar) .px-xl-5,body:lang(az) .pl-xl-5,body:lang(az) .px-xl-5,body:lang(dv) .pl-xl-5,body:lang(dv) .px-xl-5,body:lang(he) .pl-xl-5,body:lang(he) .px-xl-5,body:lang(ku) .pl-xl-5,body:lang(ku) .px-xl-5,body:lang(ur) .pl-xl-5,body:lang(ur) .px-xl-5{-webkit-padding-start:3rem!important;padding-inline-start:3rem!important}body:lang(fa) .m-xl-n1,body:lang(ar) .m-xl-n1,body:lang(az) .m-xl-n1,body:lang(dv) .m-xl-n1,body:lang(he) .m-xl-n1,body:lang(ku) .m-xl-n1,body:lang(ur) .m-xl-n1{margin:-.25rem!important}body:lang(fa) .mt-xl-n1,body:lang(fa) .my-xl-n1,body:lang(ar) .mt-xl-n1,body:lang(ar) .my-xl-n1,body:lang(az) .mt-xl-n1,body:lang(az) .my-xl-n1,body:lang(dv) .mt-xl-n1,body:lang(dv) .my-xl-n1,body:lang(he) .mt-xl-n1,body:lang(he) .my-xl-n1,body:lang(ku) .mt-xl-n1,body:lang(ku) .my-xl-n1,body:lang(ur) .mt-xl-n1,body:lang(ur) .my-xl-n1{margin-top:-.25rem!important}body:lang(fa) .mr-xl-n1,body:lang(fa) .mx-xl-n1,body:lang(ar) .mr-xl-n1,body:lang(ar) .mx-xl-n1,body:lang(az) .mr-xl-n1,body:lang(az) .mx-xl-n1,body:lang(dv) .mr-xl-n1,body:lang(dv) .mx-xl-n1,body:lang(he) .mr-xl-n1,body:lang(he) .mx-xl-n1,body:lang(ku) .mr-xl-n1,body:lang(ku) .mx-xl-n1,body:lang(ur) .mr-xl-n1,body:lang(ur) .mx-xl-n1{margin-right:-.25rem!important}body:lang(fa) .mb-xl-n1,body:lang(fa) .my-xl-n1,body:lang(ar) .mb-xl-n1,body:lang(ar) .my-xl-n1,body:lang(az) .mb-xl-n1,body:lang(az) .my-xl-n1,body:lang(dv) .mb-xl-n1,body:lang(dv) .my-xl-n1,body:lang(he) .mb-xl-n1,body:lang(he) .my-xl-n1,body:lang(ku) .mb-xl-n1,body:lang(ku) .my-xl-n1,body:lang(ur) .mb-xl-n1,body:lang(ur) .my-xl-n1{margin-bottom:-.25rem!important}body:lang(fa) .ml-xl-n1,body:lang(fa) .mx-xl-n1,body:lang(ar) .ml-xl-n1,body:lang(ar) .mx-xl-n1,body:lang(az) .ml-xl-n1,body:lang(az) .mx-xl-n1,body:lang(dv) .ml-xl-n1,body:lang(dv) .mx-xl-n1,body:lang(he) .ml-xl-n1,body:lang(he) .mx-xl-n1,body:lang(ku) .ml-xl-n1,body:lang(ku) .mx-xl-n1,body:lang(ur) .ml-xl-n1,body:lang(ur) .mx-xl-n1{margin-left:-.25rem!important}body:lang(fa) .m-xl-n2,body:lang(ar) .m-xl-n2,body:lang(az) .m-xl-n2,body:lang(dv) .m-xl-n2,body:lang(he) .m-xl-n2,body:lang(ku) .m-xl-n2,body:lang(ur) .m-xl-n2{margin:-.5rem!important}body:lang(fa) .mt-xl-n2,body:lang(fa) .my-xl-n2,body:lang(ar) .mt-xl-n2,body:lang(ar) .my-xl-n2,body:lang(az) .mt-xl-n2,body:lang(az) .my-xl-n2,body:lang(dv) .mt-xl-n2,body:lang(dv) .my-xl-n2,body:lang(he) .mt-xl-n2,body:lang(he) .my-xl-n2,body:lang(ku) .mt-xl-n2,body:lang(ku) .my-xl-n2,body:lang(ur) .mt-xl-n2,body:lang(ur) .my-xl-n2{margin-top:-.5rem!important}body:lang(fa) .mr-xl-n2,body:lang(fa) .mx-xl-n2,body:lang(ar) .mr-xl-n2,body:lang(ar) .mx-xl-n2,body:lang(az) .mr-xl-n2,body:lang(az) .mx-xl-n2,body:lang(dv) .mr-xl-n2,body:lang(dv) .mx-xl-n2,body:lang(he) .mr-xl-n2,body:lang(he) .mx-xl-n2,body:lang(ku) .mr-xl-n2,body:lang(ku) .mx-xl-n2,body:lang(ur) .mr-xl-n2,body:lang(ur) .mx-xl-n2{margin-right:-.5rem!important}body:lang(fa) .mb-xl-n2,body:lang(fa) .my-xl-n2,body:lang(ar) .mb-xl-n2,body:lang(ar) .my-xl-n2,body:lang(az) .mb-xl-n2,body:lang(az) .my-xl-n2,body:lang(dv) .mb-xl-n2,body:lang(dv) .my-xl-n2,body:lang(he) .mb-xl-n2,body:lang(he) .my-xl-n2,body:lang(ku) .mb-xl-n2,body:lang(ku) .my-xl-n2,body:lang(ur) .mb-xl-n2,body:lang(ur) .my-xl-n2{margin-bottom:-.5rem!important}body:lang(fa) .ml-xl-n2,body:lang(fa) .mx-xl-n2,body:lang(ar) .ml-xl-n2,body:lang(ar) .mx-xl-n2,body:lang(az) .ml-xl-n2,body:lang(az) .mx-xl-n2,body:lang(dv) .ml-xl-n2,body:lang(dv) .mx-xl-n2,body:lang(he) .ml-xl-n2,body:lang(he) .mx-xl-n2,body:lang(ku) .ml-xl-n2,body:lang(ku) .mx-xl-n2,body:lang(ur) .ml-xl-n2,body:lang(ur) .mx-xl-n2{margin-left:-.5rem!important}body:lang(fa) .m-xl-n3,body:lang(ar) .m-xl-n3,body:lang(az) .m-xl-n3,body:lang(dv) .m-xl-n3,body:lang(he) .m-xl-n3,body:lang(ku) .m-xl-n3,body:lang(ur) .m-xl-n3{margin:-1rem!important}body:lang(fa) .mt-xl-n3,body:lang(fa) .my-xl-n3,body:lang(ar) .mt-xl-n3,body:lang(ar) .my-xl-n3,body:lang(az) .mt-xl-n3,body:lang(az) .my-xl-n3,body:lang(dv) .mt-xl-n3,body:lang(dv) .my-xl-n3,body:lang(he) .mt-xl-n3,body:lang(he) .my-xl-n3,body:lang(ku) .mt-xl-n3,body:lang(ku) .my-xl-n3,body:lang(ur) .mt-xl-n3,body:lang(ur) .my-xl-n3{margin-top:-1rem!important}body:lang(fa) .mr-xl-n3,body:lang(fa) .mx-xl-n3,body:lang(ar) .mr-xl-n3,body:lang(ar) .mx-xl-n3,body:lang(az) .mr-xl-n3,body:lang(az) .mx-xl-n3,body:lang(dv) .mr-xl-n3,body:lang(dv) .mx-xl-n3,body:lang(he) .mr-xl-n3,body:lang(he) .mx-xl-n3,body:lang(ku) .mr-xl-n3,body:lang(ku) .mx-xl-n3,body:lang(ur) .mr-xl-n3,body:lang(ur) .mx-xl-n3{margin-right:-1rem!important}body:lang(fa) .mb-xl-n3,body:lang(fa) .my-xl-n3,body:lang(ar) .mb-xl-n3,body:lang(ar) .my-xl-n3,body:lang(az) .mb-xl-n3,body:lang(az) .my-xl-n3,body:lang(dv) .mb-xl-n3,body:lang(dv) .my-xl-n3,body:lang(he) .mb-xl-n3,body:lang(he) .my-xl-n3,body:lang(ku) .mb-xl-n3,body:lang(ku) .my-xl-n3,body:lang(ur) .mb-xl-n3,body:lang(ur) .my-xl-n3{margin-bottom:-1rem!important}body:lang(fa) .ml-xl-n3,body:lang(fa) .mx-xl-n3,body:lang(ar) .ml-xl-n3,body:lang(ar) .mx-xl-n3,body:lang(az) .ml-xl-n3,body:lang(az) .mx-xl-n3,body:lang(dv) .ml-xl-n3,body:lang(dv) .mx-xl-n3,body:lang(he) .ml-xl-n3,body:lang(he) .mx-xl-n3,body:lang(ku) .ml-xl-n3,body:lang(ku) .mx-xl-n3,body:lang(ur) .ml-xl-n3,body:lang(ur) .mx-xl-n3{margin-left:-1rem!important}body:lang(fa) .m-xl-n4,body:lang(ar) .m-xl-n4,body:lang(az) .m-xl-n4,body:lang(dv) .m-xl-n4,body:lang(he) .m-xl-n4,body:lang(ku) .m-xl-n4,body:lang(ur) .m-xl-n4{margin:-1.5rem!important}body:lang(fa) .mt-xl-n4,body:lang(fa) .my-xl-n4,body:lang(ar) .mt-xl-n4,body:lang(ar) .my-xl-n4,body:lang(az) .mt-xl-n4,body:lang(az) .my-xl-n4,body:lang(dv) .mt-xl-n4,body:lang(dv) .my-xl-n4,body:lang(he) .mt-xl-n4,body:lang(he) .my-xl-n4,body:lang(ku) .mt-xl-n4,body:lang(ku) .my-xl-n4,body:lang(ur) .mt-xl-n4,body:lang(ur) .my-xl-n4{margin-top:-1.5rem!important}body:lang(fa) .mr-xl-n4,body:lang(fa) .mx-xl-n4,body:lang(ar) .mr-xl-n4,body:lang(ar) .mx-xl-n4,body:lang(az) .mr-xl-n4,body:lang(az) .mx-xl-n4,body:lang(dv) .mr-xl-n4,body:lang(dv) .mx-xl-n4,body:lang(he) .mr-xl-n4,body:lang(he) .mx-xl-n4,body:lang(ku) .mr-xl-n4,body:lang(ku) .mx-xl-n4,body:lang(ur) .mr-xl-n4,body:lang(ur) .mx-xl-n4{margin-right:-1.5rem!important}body:lang(fa) .mb-xl-n4,body:lang(fa) .my-xl-n4,body:lang(ar) .mb-xl-n4,body:lang(ar) .my-xl-n4,body:lang(az) .mb-xl-n4,body:lang(az) .my-xl-n4,body:lang(dv) .mb-xl-n4,body:lang(dv) .my-xl-n4,body:lang(he) .mb-xl-n4,body:lang(he) .my-xl-n4,body:lang(ku) .mb-xl-n4,body:lang(ku) .my-xl-n4,body:lang(ur) .mb-xl-n4,body:lang(ur) .my-xl-n4{margin-bottom:-1.5rem!important}body:lang(fa) .ml-xl-n4,body:lang(fa) .mx-xl-n4,body:lang(ar) .ml-xl-n4,body:lang(ar) .mx-xl-n4,body:lang(az) .ml-xl-n4,body:lang(az) .mx-xl-n4,body:lang(dv) .ml-xl-n4,body:lang(dv) .mx-xl-n4,body:lang(he) .ml-xl-n4,body:lang(he) .mx-xl-n4,body:lang(ku) .ml-xl-n4,body:lang(ku) .mx-xl-n4,body:lang(ur) .ml-xl-n4,body:lang(ur) .mx-xl-n4{margin-left:-1.5rem!important}body:lang(fa) .m-xl-n5,body:lang(ar) .m-xl-n5,body:lang(az) .m-xl-n5,body:lang(dv) .m-xl-n5,body:lang(he) .m-xl-n5,body:lang(ku) .m-xl-n5,body:lang(ur) .m-xl-n5{margin:-3rem!important}body:lang(fa) .mt-xl-n5,body:lang(fa) .my-xl-n5,body:lang(ar) .mt-xl-n5,body:lang(ar) .my-xl-n5,body:lang(az) .mt-xl-n5,body:lang(az) .my-xl-n5,body:lang(dv) .mt-xl-n5,body:lang(dv) .my-xl-n5,body:lang(he) .mt-xl-n5,body:lang(he) .my-xl-n5,body:lang(ku) .mt-xl-n5,body:lang(ku) .my-xl-n5,body:lang(ur) .mt-xl-n5,body:lang(ur) .my-xl-n5{margin-top:-3rem!important}body:lang(fa) .mr-xl-n5,body:lang(fa) .mx-xl-n5,body:lang(ar) .mr-xl-n5,body:lang(ar) .mx-xl-n5,body:lang(az) .mr-xl-n5,body:lang(az) .mx-xl-n5,body:lang(dv) .mr-xl-n5,body:lang(dv) .mx-xl-n5,body:lang(he) .mr-xl-n5,body:lang(he) .mx-xl-n5,body:lang(ku) .mr-xl-n5,body:lang(ku) .mx-xl-n5,body:lang(ur) .mr-xl-n5,body:lang(ur) .mx-xl-n5{margin-right:-3rem!important}body:lang(fa) .mb-xl-n5,body:lang(fa) .my-xl-n5,body:lang(ar) .mb-xl-n5,body:lang(ar) .my-xl-n5,body:lang(az) .mb-xl-n5,body:lang(az) .my-xl-n5,body:lang(dv) .mb-xl-n5,body:lang(dv) .my-xl-n5,body:lang(he) .mb-xl-n5,body:lang(he) .my-xl-n5,body:lang(ku) .mb-xl-n5,body:lang(ku) .my-xl-n5,body:lang(ur) .mb-xl-n5,body:lang(ur) .my-xl-n5{margin-bottom:-3rem!important}body:lang(fa) .ml-xl-n5,body:lang(fa) .mx-xl-n5,body:lang(ar) .ml-xl-n5,body:lang(ar) .mx-xl-n5,body:lang(az) .ml-xl-n5,body:lang(az) .mx-xl-n5,body:lang(dv) .ml-xl-n5,body:lang(dv) .mx-xl-n5,body:lang(he) .ml-xl-n5,body:lang(he) .mx-xl-n5,body:lang(ku) .ml-xl-n5,body:lang(ku) .mx-xl-n5,body:lang(ur) .ml-xl-n5,body:lang(ur) .mx-xl-n5{margin-left:-3rem!important}body:lang(fa) .m-xl-auto,body:lang(ar) .m-xl-auto,body:lang(az) .m-xl-auto,body:lang(dv) .m-xl-auto,body:lang(he) .m-xl-auto,body:lang(ku) .m-xl-auto,body:lang(ur) .m-xl-auto{margin:auto!important}body:lang(fa) .mt-xl-auto,body:lang(fa) .my-xl-auto,body:lang(ar) .mt-xl-auto,body:lang(ar) .my-xl-auto,body:lang(az) .mt-xl-auto,body:lang(az) .my-xl-auto,body:lang(dv) .mt-xl-auto,body:lang(dv) .my-xl-auto,body:lang(he) .mt-xl-auto,body:lang(he) .my-xl-auto,body:lang(ku) .mt-xl-auto,body:lang(ku) .my-xl-auto,body:lang(ur) .mt-xl-auto,body:lang(ur) .my-xl-auto{margin-top:auto!important}body:lang(fa) .mr-xl-auto,body:lang(fa) .mx-xl-auto,body:lang(ar) .mr-xl-auto,body:lang(ar) .mx-xl-auto,body:lang(az) .mr-xl-auto,body:lang(az) .mx-xl-auto,body:lang(dv) .mr-xl-auto,body:lang(dv) .mx-xl-auto,body:lang(he) .mr-xl-auto,body:lang(he) .mx-xl-auto,body:lang(ku) .mr-xl-auto,body:lang(ku) .mx-xl-auto,body:lang(ur) .mr-xl-auto,body:lang(ur) .mx-xl-auto{margin-right:auto!important}body:lang(fa) .mb-xl-auto,body:lang(fa) .my-xl-auto,body:lang(ar) .mb-xl-auto,body:lang(ar) .my-xl-auto,body:lang(az) .mb-xl-auto,body:lang(az) .my-xl-auto,body:lang(dv) .mb-xl-auto,body:lang(dv) .my-xl-auto,body:lang(he) .mb-xl-auto,body:lang(he) .my-xl-auto,body:lang(ku) .mb-xl-auto,body:lang(ku) .my-xl-auto,body:lang(ur) .mb-xl-auto,body:lang(ur) .my-xl-auto{margin-bottom:auto!important}body:lang(fa) .ml-xl-auto,body:lang(fa) .mx-xl-auto,body:lang(ar) .ml-xl-auto,body:lang(ar) .mx-xl-auto,body:lang(az) .ml-xl-auto,body:lang(az) .mx-xl-auto,body:lang(dv) .ml-xl-auto,body:lang(dv) .mx-xl-auto,body:lang(he) .ml-xl-auto,body:lang(he) .mx-xl-auto,body:lang(ku) .ml-xl-auto,body:lang(ku) .mx-xl-auto,body:lang(ur) .ml-xl-auto,body:lang(ur) .mx-xl-auto{margin-left:auto!important}}body:lang(fa) .dropdown-menu,body:lang(ar) .dropdown-menu,body:lang(az) .dropdown-menu,body:lang(dv) .dropdown-menu,body:lang(he) .dropdown-menu,body:lang(ku) .dropdown-menu,body:lang(ur) .dropdown-menu{text-align:right}body:lang(fa) .text-right,body:lang(ar) .text-right,body:lang(az) .text-right,body:lang(dv) .text-right,body:lang(he) .text-right,body:lang(ku) .text-right,body:lang(ur) .text-right{text-align:left!important}body:lang(fa) pre,body:lang(ar) pre,body:lang(az) pre,body:lang(dv) pre,body:lang(he) pre,body:lang(ku) pre,body:lang(ur) pre{text-align:left;direction:ltr}body:lang(fa) .td-rss-button,body:lang(ar) .td-rss-button,body:lang(az) .td-rss-button,body:lang(dv) .td-rss-button,body:lang(he) .td-rss-button,body:lang(ku) .td-rss-button,body:lang(ur) .td-rss-button{left:1rem!important;right:auto!important}body:lang(fa){font-family:vazir,open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol}body:lang(he){font-family:rubik,open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol}body:lang(ar){font-family:tajawal,open sans,-apple-system,BlinkMacSystemFont,segoe ui,Roboto,helvetica neue,Arial,sans-serif,apple color emoji,segoe ui emoji,segoe ui symbol} \ No newline at end of file diff --git a/website/deploy/search/index.html b/website/deploy/search/index.html index a6c9dd11b..36c4b58aa 100644 --- a/website/deploy/search/index.html +++ b/website/deploy/search/index.html @@ -19,7 +19,7 @@ - + @@ -36,17 +36,15 @@ Search Results | Cloud Operations Sandbox - + + + - - - - - + @@ -67,8 +65,8 @@ - - + + + diff --git a/website/deploy/sitemap.xml b/website/deploy/sitemap.xml index 66ac75ed9..477595593 100644 --- a/website/deploy/sitemap.xml +++ b/website/deploy/sitemap.xml @@ -17,85 +17,59 @@ - /docs/ - 2021-03-31T14:52:16-07:00 - - - + 2021-05-05T10:34:09+01:00 + /docs/getting_started/ - 2021-03-31T14:52:16-07:00 - - - + 2021-10-26T15:56:11-07:00 + + /docs/user-guide/cost-explained/ + 2021-07-07T11:34:23-07:00 + /docs/service_overview/ - 2021-03-11T17:22:33-08:00 - - - + 2021-05-06T12:07:21+01:00 + /docs/user-guide/ - 2021-03-11T17:22:33-08:00 - - - + 2021-10-26T15:56:11-07:00 + /docs/user-guide/set-up/ - 2021-03-11T17:22:33-08:00 - - - + 2021-10-26T15:56:11-07:00 + /docs/user-guide/explore-your-project-in-gcp/ - 2021-03-11T17:22:33-08:00 - - - - /docs/user-guide/learn-ops-management/ - 2021-03-11T17:22:33-08:00 - - - - /docs/user-guide/learn-ops-management/cloud_trace/ - 2021-03-11T17:22:33-08:00 - - - + 2021-05-27T21:00:19+01:00 + + /docs/user-guide/learn-cloud-operations/ + 2021-05-12T12:29:14+01:00 + + /docs/user-guide/learn-cloud-operations/cloud_trace/ + 2021-05-12T12:29:14+01:00 + /docs/user-guide/destroying-your-cluster/ - 2021-03-11T17:22:33-08:00 - - - - /docs/user-guide/learn-ops-management/cloud_profiler/ - 2021-03-11T17:22:33-08:00 - - - - /docs/user-guide/learn-ops-management/cloud_debugger/ - 2021-03-11T17:22:33-08:00 - - - - /docs/user-guide/learn-ops-management/cloud_monitoring/ - 2021-03-11T17:22:33-08:00 - - - - /docs/user-guide/learn-ops-management/cloud_logging/ - 2021-03-11T17:22:33-08:00 - - - - /docs/user-guide/learn-ops-management/cloud_error_reporting/ - 2021-03-11T17:22:33-08:00 - - - + 2021-05-05T11:18:06+01:00 + + /docs/user-guide/learn-cloud-operations/cloud_slo_monitoring/ + 2021-05-12T22:34:00+03:00 + + /docs/user-guide/learn-cloud-operations/cloud_profiler/ + 2021-05-12T12:29:14+01:00 + + /docs/user-guide/learn-cloud-operations/cloud_debugger/ + 2021-05-12T12:29:14+01:00 + + /docs/user-guide/learn-cloud-operations/cloud_monitoring/ + 2021-05-12T12:29:14+01:00 + + /docs/user-guide/learn-cloud-operations/cloud_logging/ + 2021-05-12T12:29:14+01:00 + + /docs/user-guide/learn-cloud-operations/cloud_error_reporting/ + 2021-05-27T21:22:22+01:00 + / - 2021-03-31T14:52:16-07:00 - - - + 2021-10-26T15:56:11-07:00 + /search/ 2021-03-11T17:22:33-08:00 - diff --git a/website/layouts/index.html b/website/layouts/index.html index 2d3ed9af8..65bd9506b 100644 --- a/website/layouts/index.html +++ b/website/layouts/index.html @@ -56,7 +56,7 @@

Cloud Operations Sandbox is an open source tool* that helps practitioners to

Get started now

cloud shell @@ -75,7 +75,7 @@

Next steps