diff --git a/.gitignore b/.gitignore
index 6fb03404e16..6759baa1e7d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
+docs
# Next.js cache and compiled artifacts
.next/
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000000..0cfcda40faa
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "singleQuote": false,
+ "trailingComma": "es5",
+ "semi": false,
+ "printWidth": 100
+}
diff --git a/.trunk/.gitignore b/.trunk/.gitignore
new file mode 100644
index 00000000000..15966d087eb
--- /dev/null
+++ b/.trunk/.gitignore
@@ -0,0 +1,9 @@
+*out
+*logs
+*actions
+*notifications
+*tools
+plugins
+user_trunk.yaml
+user.yaml
+tmp
diff --git a/.trunk/configs/.hadolint.yaml b/.trunk/configs/.hadolint.yaml
new file mode 100644
index 00000000000..98bf0cd2ee9
--- /dev/null
+++ b/.trunk/configs/.hadolint.yaml
@@ -0,0 +1,4 @@
+# Following source doesn't work in most setups
+ignored:
+ - SC1090
+ - SC1091
diff --git a/.trunk/configs/.markdownlint.yaml b/.trunk/configs/.markdownlint.yaml
new file mode 100644
index 00000000000..b40ee9d7a7a
--- /dev/null
+++ b/.trunk/configs/.markdownlint.yaml
@@ -0,0 +1,2 @@
+# Prettier friendly markdownlint config (all formatting rules disabled)
+extends: markdownlint/style/prettier
diff --git a/.trunk/configs/.shellcheckrc b/.trunk/configs/.shellcheckrc
new file mode 100644
index 00000000000..8c7b1ada8a3
--- /dev/null
+++ b/.trunk/configs/.shellcheckrc
@@ -0,0 +1,7 @@
+enable=all
+source-path=SCRIPTDIR
+disable=SC2154
+
+# If you're having issues with shellcheck following source, disable the errors via:
+# disable=SC1090
+# disable=SC1091
diff --git a/.trunk/configs/.yamllint.yaml b/.trunk/configs/.yamllint.yaml
new file mode 100644
index 00000000000..184e251f8de
--- /dev/null
+++ b/.trunk/configs/.yamllint.yaml
@@ -0,0 +1,7 @@
+rules:
+ quoted-strings:
+ required: only-when-needed
+ extra-allowed: ["{|}"]
+ key-duplicates: {}
+ octal-values:
+ forbid-implicit-octal: true
diff --git a/.trunk/configs/svgo.config.mjs b/.trunk/configs/svgo.config.mjs
new file mode 100644
index 00000000000..f403e04c120
--- /dev/null
+++ b/.trunk/configs/svgo.config.mjs
@@ -0,0 +1,14 @@
+export default {
+ plugins: [
+ {
+ name: "preset-default",
+ params: {
+ overrides: {
+ removeViewBox: false, // https://github.com/svg/svgo/issues/1128
+ sortAttrs: true,
+ removeOffCanvasPaths: true,
+ },
+ },
+ },
+ ],
+}
diff --git a/.trunk/trunk.yaml b/.trunk/trunk.yaml
new file mode 100644
index 00000000000..ed9ec1ed064
--- /dev/null
+++ b/.trunk/trunk.yaml
@@ -0,0 +1,42 @@
+# This file controls the behavior of Trunk: https://docs.trunk.io/cli
+# To learn more about the format of this file, see https://docs.trunk.io/reference/trunk-yaml
+version: 0.1
+cli:
+ version: 1.24.0
+# Trunk provides extensibility via plugins. (https://docs.trunk.io/plugins)
+plugins:
+ sources:
+ - id: trunk
+ ref: v1.7.1
+ uri: https://github.com/trunk-io/plugins
+# Many linters and tools depend on runtimes - configure them here. (https://docs.trunk.io/runtimes)
+runtimes:
+ enabled:
+ - go@1.21.0
+ - node@22.16.0
+ - python@3.10.8
+# This is the section where you manage your linters. (https://docs.trunk.io/check/configuration)
+lint:
+ enabled:
+ - actionlint@1.7.7
+ - checkov@3.2.457
+ - eslint@8.57.0
+ - git-diff-check
+ - hadolint@2.12.1-beta
+ - markdownlint@0.45.0
+ - osv-scanner@2.0.3
+ - oxipng@9.1.5
+ - prettier@3.6.2
+ - shellcheck@0.10.0
+ - shfmt@3.6.0
+ - svgo@4.0.0
+ - taplo@0.9.3
+ - trufflehog@3.90.2
+ - yamllint@1.37.1
+actions:
+ disabled:
+ - trunk-announce
+ - trunk-check-pre-push
+ - trunk-fmt-pre-commit
+ enabled:
+ - trunk-upgrade-available
diff --git a/api/src/services/email.service.ts b/api/src/services/email.service.ts
index 2704bff0859..b2b0bcea0e1 100644
--- a/api/src/services/email.service.ts
+++ b/api/src/services/email.service.ts
@@ -1,34 +1,31 @@
+import * as aws from '@aws-sdk/client-sesv2';
+import { HttpService } from '@nestjs/axios';
import { Inject, Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
-import { HttpService } from '@nestjs/axios';
+import {
+ LanguagesEnum,
+ ListingEventsTypeEnum,
+ ReviewOrderTypeEnum,
+} from '@prisma/client';
+import dayjs from 'dayjs';
+import advanced from 'dayjs/plugin/advancedFormat';
+import tz from 'dayjs/plugin/timezone';
+import utc from 'dayjs/plugin/utc';
import fs from 'fs';
import Handlebars from 'handlebars';
import juice from 'juice';
import Polyglot from 'node-polyglot';
-import { firstValueFrom } from 'rxjs';
import path from 'path';
-import dayjs from 'dayjs';
-import utc from 'dayjs/plugin/utc';
-import tz from 'dayjs/plugin/timezone';
-import advanced from 'dayjs/plugin/advancedFormat';
-import * as aws from '@aws-sdk/client-sesv2';
-import { TranslationService } from './translation.service';
-import { JurisdictionService } from './jurisdiction.service';
+import { firstValueFrom } from 'rxjs';
+import { ApplicationCreate } from '../dtos/applications/application-create.dto';
import { Jurisdiction } from '../dtos/jurisdictions/jurisdiction.dto';
-import {
- LanguagesEnum,
- ListingEventsTypeEnum,
- ReviewOrderTypeEnum,
-} from '@prisma/client';
-import { IdDTO } from '../dtos/shared/id.dto';
import { Listing } from '../dtos/listings/listing.dto';
-import { ApplicationCreate } from '../dtos/applications/application-create.dto';
-import { User } from '../dtos/users/user.dto';
+import { IdDTO } from '../dtos/shared/id.dto';
import Unit from '../dtos/units/unit.dto';
+import { User } from '../dtos/users/user.dto';
import { getPublicEmailURL } from '../utilities/get-public-email-url';
-
-dayjs.extend(utc);
-dayjs.extend(tz);
+import { JurisdictionService } from './jurisdiction.service';
+import { TranslationService } from './translation.service';
dayjs.extend(advanced);
type listingInfo = {
@@ -53,7 +50,7 @@ export class EmailService {
private logger = new Logger(EmailService.name),
) {
const sesClient = new aws.SESv2Client({
- region: process.env.AWS_REGION,
+ region: process.env.SES_REGION || process.env.AWS_REGION,
});
this.client = sesClient;
@@ -138,7 +135,7 @@ export class EmailService {
// juice inlines css to allow for email styling
const inlineHtml = juice(rawHtml);
- const govEmailXml = `\n ${subject}\n \n ${subject}\n \n \n ${fromEmailAddress}\n false\n true\n true\n true\n \n \n ${GOVDELIVERY_TOPIC}\n \n \n \n `;
await firstValueFrom(
@@ -177,8 +174,8 @@ export class EmailService {
},
Text: mailOptions.text
? {
- Data: mailOptions.text,
- }
+ Data: mailOptions.text,
+ }
: undefined,
},
},
@@ -659,9 +656,8 @@ export class EmailService {
);
tableRows.push({
label: this.polyglot.t(`rentalOpportunity.${key}`),
- value: `${bedroom?.length} unit${
- bedroom.length > 1 ? 's' : ''
- }${bathroomstring}${sqFtString}`,
+ value: `${bedroom?.length} unit${bedroom.length > 1 ? 's' : ''
+ }${bathroomstring}${sqFtString}`,
});
});
if (units?.rent?.length) {
@@ -854,9 +850,8 @@ export class EmailService {
formatPricing = (values: number[]): string => {
const minPrice = Math.min(...values);
const maxPrice = Math.max(...values);
- return `$${minPrice.toLocaleString()}${
- minPrice !== maxPrice ? ' - $' + maxPrice.toLocaleString() : ''
- } per month`;
+ return `$${minPrice.toLocaleString()}${minPrice !== maxPrice ? ' - $' + maxPrice.toLocaleString() : ''
+ } per month`;
};
formatUnitDetails = (
@@ -874,9 +869,8 @@ export class EmailService {
if (mappedField?.length) {
const minValue = Math.min(...mappedField);
const maxValue = Math.max(...mappedField);
- return `, ${minValue.toLocaleString()}${
- minValue !== maxValue ? ' - ' + maxValue.toLocaleString() : ''
- } ${pluralLabel && maxValue === 1 ? pluralLabel : label}`;
+ return `, ${minValue.toLocaleString()}${minValue !== maxValue ? ' - ' + maxValue.toLocaleString() : ''
+ } ${pluralLabel && maxValue === 1 ? pluralLabel : label}`;
}
return '';
};
diff --git a/build/docker/Dockerfile.backend b/build/docker/Dockerfile.backend
index 11e84497135..5fe50c66a7c 100644
--- a/build/docker/Dockerfile.backend
+++ b/build/docker/Dockerfile.backend
@@ -116,6 +116,7 @@ COPY --from=source --chown=node:node \
/app/api/yarn*.lock \
/app/api/prisma ./
+
# Add only dependencies required to run the application
COPY --from=optimize --chown=node:node /app/node_modules ./node_modules
RUN yarn prisma generate
@@ -126,12 +127,16 @@ RUN mkdir ./src
RUN mkdir ./src/temp
RUN chmod 777 ./src/temp
+# Copy and set permissions for entrypoint script as root
+COPY build/docker/entrypoint-run.sh /app/api/entrypoint-run.sh
+RUN chown node:node /app/api/entrypoint-run.sh
+RUN chmod 755 /app/api/entrypoint-run.sh
+
# When running this image, make sure to use the built-in node user
USER node
-RUN yarn prisma generate
-CMD yarn start:prod
+ENTRYPOINT [ "/app/api/entrypoint-run.sh" ]
#####################
##### NEW STAGE #####
@@ -159,10 +164,12 @@ COPY --from=source --chown=node:node /app/api/src ./src
COPY --from=source --chown=node:node /app/api/prisma ./prisma
COPY --from=source --chown=node:node /app/api/scripts ./scripts
+
+COPY build/docker/entrypoint-migrate.sh /app/api/entrypoint-migrate.sh
+RUN chown node:node /app/api/entrypoint-migrate.sh
+RUN chmod 755 /app/api/entrypoint-migrate.sh
## This CMD should be run as the node user
USER node
+RUN yarn prisma generate
-# We need to skip all migrations that are just for local development (changes already exist in deployed environment)
-CMD if [ "$SKIP_MIGRATIONS" = TRUE ]; then yarn db:migration:skip 00_init || true && yarn db:migration:skip 02_hba_to_prisma || true && yarn db:migration:skip 03_0_external_listing || true && yarn db:migration:run; \
- else yarn db:migration:run; \
- fi
+ENTRYPOINT [ "/app/api/entrypoint-migrate.sh" ]
diff --git a/build/docker/entrypoint-migrate.sh b/build/docker/entrypoint-migrate.sh
new file mode 100644
index 00000000000..aef4fdd9e53
--- /dev/null
+++ b/build/docker/entrypoint-migrate.sh
@@ -0,0 +1,28 @@
+#!/bin/sh
+# Debug the individual secret values
+echo "PGUSER: $PGUSER"
+echo "PGHOST: $PGHOST"
+echo "PGPORT: $PGPORT"
+echo "PGDATABASE: $PGDATABASE"
+echo "PGPASSWORD length: ${#PGPASSWORD}"
+
+# Validate port is numeric
+if ! echo "$PGPORT" | grep -qE '^[0-9]+$'; then
+ echo "ERROR: PGPORT is not a valid number: '$PGPORT'"
+ exit 1
+fi
+
+# URL encode the password to handle special characters
+ENCODED_PASSWORD=$(node -e "console.log(encodeURIComponent('$PGPASSWORD'))")
+
+export DATABASE_URL="postgresql://${PGUSER}:${ENCODED_PASSWORD}@${PGHOST}:${PGPORT}/${PGDATABASE}"
+echo "DATABASE_URL (password masked): postgresql://${PGUSER}:***@${PGHOST}:${PGPORT}/${PGDATABASE}"
+
+
+if [ "$SKIP_MIGRATIONS" = TRUE ];then
+ echo "Skipping Migrations"
+ yarn db:migration:skip 00_init || true && yarn db:migration:skip 02_hba_to_prisma || true && yarn db:migration:skip 03_0_external_listing || true && yarn db:migration:run;
+else
+ echo "Running migrations...${MIGRATION_CMD}";
+ yarn ${MIGRATION_CMD};
+fi
\ No newline at end of file
diff --git a/build/docker/entrypoint-run.sh b/build/docker/entrypoint-run.sh
new file mode 100644
index 00000000000..d930b533e6c
--- /dev/null
+++ b/build/docker/entrypoint-run.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+# Debug the individual secret values
+echo "PGUSER: $PGUSER"
+echo "PGHOST: $PGHOST"
+echo "PGPORT: $PGPORT"
+echo "PGDATABASE: $PGDATABASE"
+echo "PGPASSWORD length: ${#PGPASSWORD}"
+
+# Validate port is numeric
+if ! echo "$PGPORT" | grep -qE '^[0-9]+$'; then
+ echo "ERROR: PGPORT is not a valid number: '$PGPORT'"
+ exit 1
+fi
+
+# URL encode the password to handle special characters
+ENCODED_PASSWORD=$(node -e "console.log(encodeURIComponent('$PGPASSWORD'))")
+
+export DATABASE_URL="postgresql://${PGUSER}:${ENCODED_PASSWORD}@${PGHOST}:${PGPORT}/${PGDATABASE}"
+echo "DATABASE_URL (password masked): postgresql://${PGUSER}:***@${PGHOST}:${PGPORT}/${PGDATABASE}"
+
+echo "Starting Service..."
+yarn start:prod
diff --git a/cdk/.gitignore b/cdk/.gitignore
new file mode 100644
index 00000000000..f60797b6a91
--- /dev/null
+++ b/cdk/.gitignore
@@ -0,0 +1,8 @@
+*.js
+!jest.config.js
+*.d.ts
+node_modules
+
+# CDK asset staging directory
+.cdk.staging
+cdk.out
diff --git a/cdk/.npmignore b/cdk/.npmignore
new file mode 100644
index 00000000000..c1d6d45dcf3
--- /dev/null
+++ b/cdk/.npmignore
@@ -0,0 +1,6 @@
+*.ts
+!*.d.ts
+
+# CDK asset staging directory
+.cdk.staging
+cdk.out
diff --git a/cdk/README.md b/cdk/README.md
new file mode 100644
index 00000000000..938ea8bb778
--- /dev/null
+++ b/cdk/README.md
@@ -0,0 +1,26 @@
+# Doorway App CDK Project
+
+This project uses [CDK](https://aws.amazon.com/cdk/) to deploy the ECS tasks and services to AWS. This presumes that you have already deployed [doorway-infra](https://github.com/metrotranscom/doorway-infra) to the environment.
+
+The `cdk.json` file tells the CDK Toolkit how to execute your app.
+
+# Necessary workstation setup
+
+You will need the following things set up before you work with the code in this repo:
+
+- A Typescript IDE like VS Code.
+- NodeJS - currently version 22 - I reccomend using [NVM](https://github.com/nvm-sh/nvm).
+- The [AWS CLI](https://aws.amazon.com/cli/).
+- The [AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting-started.html)
+- [Yarn](https://yarnpkg.com/)
+
+## Useful commands
+
+- `yarn test` Perform the jest unit tests.
+- `cdk synth` emits the synthesized CloudFormation template. This is also good to use on your local
+ workstation to make sure your CDK code hangs together. **This doesn't touch the actual AWS
+ infrastructure.**
+- `cdk deploy DoorwayBuildPipelineStack` This deploys the Doorway application delivery pipeline. **This impacts AWS and will only work if you have the proper access and have configured your AWS credentials file.**
+- `cdk deploy DoorwayAppEnvironmentStack` This deploys a Doorway application. You will likely need to be an AWS admin to run this. You will also need to set an an environment variable named ENVIRONMENT. and a ".env" file named [$ENVIRONMENT].env for the scriot to load. **This impacts AWS and will only work if you have the proper access and have configured your AWS credentials file.**
+- `cdk diff` compare deployed stack with current state
+
diff --git a/cdk/bin/doorway-cdk.ts b/cdk/bin/doorway-cdk.ts
new file mode 100644
index 00000000000..3258e129fd0
--- /dev/null
+++ b/cdk/bin/doorway-cdk.ts
@@ -0,0 +1,29 @@
+import * as cdk from "aws-cdk-lib"
+import { DoorwayBuildPipelineStack } from "../lib/build-pipeline/doorway-build-pipeline-stack"
+import { DoorwayAppEnvironmentStack } from "../lib/doorway_environment/doorway-app-environment-stack"
+import { DoorwayCloudFrontStack } from "../lib/doorway_environment/doorway-cloudfront-stack"
+
+/**
+ * This script is really just a wrapper to execute the various
+ * stacks that make up the Doorway Application infrastructure and build pipeline.
+ **/
+const app = new cdk.App()
+const environment = process.env.ENVIRONMENT || "dev"
+
+
+/** This stack creates the doorway application build pipeline **/
+new DoorwayBuildPipelineStack(app, "DoorwayBuildPipelineStack", {
+ githubSecret: "mtc/githubSecret",
+ dockerHubSecret: "mtc/dockerHub",
+})
+/** This stack actually creates a doorway environment. */
+const appStack = new DoorwayAppEnvironmentStack(app, `DoorwayAppEnvironmentStack-${environment}`, environment)
+
+/** This stack creates the cert used by the cloudfront distribution. It sits in it's own stack because cloudfront certs have to be created in us-east-1 **/
+const cfCertStack = new DoorwayCloudFrontStack(app, `DoorwayCloudFrontStack-${environment}`, {
+ environment: environment,
+ publicDomainName: process.env.PUBLIC_PORTAL_DOMAIN || `${environment}.housingbayarea.mtc.ca.gov`,
+ partnersDomainName: process.env.PARTNERS_PORTAL_DOMAIN || `partners.${environment}.housingbayarea.mtc.ca.gov`,
+ loadBalancerDnsName: appStack.loadBalancerDnsName
+})
+
diff --git a/cdk/cdk.context.json b/cdk/cdk.context.json
new file mode 100644
index 00000000000..3dc80320fc9
--- /dev/null
+++ b/cdk/cdk.context.json
@@ -0,0 +1,17 @@
+{
+ "hosted-zone:account=364076391763:domainName=housingbayarea.mtc.ca.gov:region=us-east-1": {
+ "Id": "/hostedzone/Z01682742VM0KIXZ4Y3W5",
+ "Name": "housingbayarea.mtc.ca.gov."
+ },
+ "hosted-zone:account=364076391763:domainName=housingbayarea.mtc.ca.gov:region=us-west-2": {
+ "Id": "/hostedzone/Z01682742VM0KIXZ4Y3W5",
+ "Name": "housingbayarea.mtc.ca.gov."
+ },
+ "hosted-zone:account=364076391763:domainName=housingbayarea.mtc.ca.gov:region=us-west-1": {
+ "Id": "/hostedzone/Z01682742VM0KIXZ4Y3W5",
+ "Name": "housingbayarea.mtc.ca.gov."
+ },
+ "acknowledged-issue-numbers": [
+ 34892
+ ]
+}
diff --git a/cdk/cdk.json b/cdk/cdk.json
new file mode 100644
index 00000000000..3dbd62bc3e8
--- /dev/null
+++ b/cdk/cdk.json
@@ -0,0 +1,94 @@
+{
+ "app": "npx ts-node --prefer-ts-exts bin/doorway-cdk.ts",
+ "watch": {
+ "include": ["**"],
+ "exclude": [
+ "README.md",
+ "cdk*.json",
+ "**/*.d.ts",
+ "**/*.js",
+ "tsconfig.json",
+ "package*.json",
+ "yarn.lock",
+ "node_modules",
+ "test"
+ ]
+ },
+ "context": {
+ "@aws-cdk/aws-lambda:recognizeLayerVersion": true,
+ "@aws-cdk/core:checkSecretUsage": true,
+ "@aws-cdk/core:target-partitions": ["aws", "aws-cn"],
+ "@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver": true,
+ "@aws-cdk/aws-ec2:uniqueImdsv2TemplateName": true,
+ "@aws-cdk/aws-ecs:arnFormatIncludesClusterName": true,
+ "@aws-cdk/aws-iam:minimizePolicies": true,
+ "@aws-cdk/core:validateSnapshotRemovalPolicy": true,
+ "@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName": true,
+ "@aws-cdk/aws-s3:createDefaultLoggingPolicy": true,
+ "@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption": true,
+ "@aws-cdk/aws-apigateway:disableCloudWatchRole": true,
+ "@aws-cdk/core:enablePartitionLiterals": true,
+ "@aws-cdk/aws-events:eventsTargetQueueSameAccount": true,
+ "@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker": true,
+ "@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName": true,
+ "@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy": true,
+ "@aws-cdk/aws-route53-patters:useCertificate": true,
+ "@aws-cdk/customresources:installLatestAwsSdkDefault": false,
+ "@aws-cdk/aws-rds:databaseProxyUniqueResourceName": true,
+ "@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup": true,
+ "@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId": true,
+ "@aws-cdk/aws-ec2:launchTemplateDefaultUserData": true,
+ "@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments": true,
+ "@aws-cdk/aws-redshift:columnId": true,
+ "@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2": true,
+ "@aws-cdk/aws-ec2:restrictDefaultSecurityGroup": true,
+ "@aws-cdk/aws-apigateway:requestValidatorUniqueId": true,
+ "@aws-cdk/aws-kms:aliasNameRef": true,
+ "@aws-cdk/aws-kms:applyImportedAliasPermissionsToPrincipal": true,
+ "@aws-cdk/aws-autoscaling:generateLaunchTemplateInsteadOfLaunchConfig": true,
+ "@aws-cdk/core:includePrefixInUniqueNameGeneration": true,
+ "@aws-cdk/aws-efs:denyAnonymousAccess": true,
+ "@aws-cdk/aws-opensearchservice:enableOpensearchMultiAzWithStandby": true,
+ "@aws-cdk/aws-lambda-nodejs:useLatestRuntimeVersion": true,
+ "@aws-cdk/aws-efs:mountTargetOrderInsensitiveLogicalId": true,
+ "@aws-cdk/aws-rds:auroraClusterChangeScopeOfInstanceParameterGroupWithEachParameters": true,
+ "@aws-cdk/aws-appsync:useArnForSourceApiAssociationIdentifier": true,
+ "@aws-cdk/aws-rds:preventRenderingDeprecatedCredentials": true,
+ "@aws-cdk/aws-codepipeline-actions:useNewDefaultBranchForCodeCommitSource": true,
+ "@aws-cdk/aws-cloudwatch-actions:changeLambdaPermissionLogicalIdForLambdaAction": true,
+ "@aws-cdk/aws-codepipeline:crossAccountKeysDefaultValueToFalse": true,
+ "@aws-cdk/aws-codepipeline:defaultPipelineTypeToV2": true,
+ "@aws-cdk/aws-kms:reduceCrossAccountRegionPolicyScope": true,
+ "@aws-cdk/aws-eks:nodegroupNameAttribute": true,
+ "@aws-cdk/aws-ec2:ebsDefaultGp3Volume": true,
+ "@aws-cdk/aws-ecs:removeDefaultDeploymentAlarm": true,
+ "@aws-cdk/custom-resources:logApiResponseDataPropertyTrueDefault": false,
+ "@aws-cdk/aws-s3:keepNotificationInImportedBucket": false,
+ "@aws-cdk/core:explicitStackTags": true,
+ "@aws-cdk/aws-ecs:enableImdsBlockingDeprecatedFeature": false,
+ "@aws-cdk/aws-ecs:disableEcsImdsBlocking": true,
+ "@aws-cdk/aws-ecs:reduceEc2FargateCloudWatchPermissions": true,
+ "@aws-cdk/aws-dynamodb:resourcePolicyPerReplica": true,
+ "@aws-cdk/aws-ec2:ec2SumTImeoutEnabled": true,
+ "@aws-cdk/aws-appsync:appSyncGraphQLAPIScopeLambdaPermission": true,
+ "@aws-cdk/aws-rds:setCorrectValueForDatabaseInstanceReadReplicaInstanceResourceId": true,
+ "@aws-cdk/core:cfnIncludeRejectComplexResourceUpdateCreatePolicyIntrinsics": true,
+ "@aws-cdk/aws-lambda-nodejs:sdkV3ExcludeSmithyPackages": true,
+ "@aws-cdk/aws-stepfunctions-tasks:fixRunEcsTaskPolicy": true,
+ "@aws-cdk/aws-ec2:bastionHostUseAmazonLinux2023ByDefault": true,
+ "@aws-cdk/aws-route53-targets:userPoolDomainNameMethodWithoutCustomResource": true,
+ "@aws-cdk/aws-elasticloadbalancingV2:albDualstackWithoutPublicIpv4SecurityGroupRulesDefault": true,
+ "@aws-cdk/aws-iam:oidcRejectUnauthorizedConnections": true,
+ "@aws-cdk/core:enableAdditionalMetadataCollection": true,
+ "@aws-cdk/aws-lambda:createNewPoliciesWithAddToRolePolicy": false,
+ "@aws-cdk/aws-s3:setUniqueReplicationRoleName": true,
+ "@aws-cdk/aws-events:requireEventBusPolicySid": true,
+ "@aws-cdk/core:aspectPrioritiesMutating": true,
+ "@aws-cdk/aws-dynamodb:retainTableReplica": true,
+ "@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": true,
+ "@aws-cdk/s3-notifications:addS3TrustKeyPolicyForSnsSubscriptions": true,
+ "@aws-cdk/aws-ec2:requirePrivateSubnetsForEgressOnlyInternetGateway": true,
+ "@aws-cdk/aws-s3:publicAccessBlockedByDefault": true,
+ "@aws-cdk/aws-lambda:useCdkManagedLogGroup": true
+ }
+}
diff --git a/cdk/dev.env b/cdk/dev.env
new file mode 100644
index 00000000000..4176119a7ca
--- /dev/null
+++ b/cdk/dev.env
@@ -0,0 +1,48 @@
+MAINTENANCE_WINDOW=2024-03-26 18:00 -08:00,2024-04-25 18:00 -08:00
+DEST_REPO_NAMESPACE=doorway
+CACHE_REVALIDATE=30
+LANGUAGES=en,es,zh,vi,tl
+FEATURE_LISTINGS_APPROVAL=TRUE
+
+ECR_ACCOUNT_ID=364076391763
+ECR_NAMESPACE=doorway
+ECR_REGION=us-west-2
+CORS_ORIGINS=https://dev2.housingbayarea.mtc.ca.gov, https://partners.dev2.housingbayarea.mtc.ca.gov
+
+USE_SECURE_DOWNLOAD_PATHWAY=TRUE
+GTM_KEY=GTM-KF22FJP
+SOURCE_REPO_NAMESPACE=doorway
+IDLE_TIMEOUT=5
+CLOUDINARY_CLOUD_NAME=exygy
+APP_SECRET=""
+
+PUBLIC_PORTAL_PORT=3000
+PUBLIC_PORTAL_DOMAIN=dev2.housingbayarea.mtc.ca.gov
+PUBLIC_PORTAL_SECRETS=GOOGLE_MAPS_MAP_ID,GOOGLE_MAPS_API_KEY
+DISABLE_CORS=TRUE
+SAME_SITE=true
+HTTPS_OFF=true
+
+# Overriding prod infrastructure definitions for dev
+# If you are going to do a performance test you can just comment these out and dev will become prod-like
+
+PARTNERS_PORTAL_PORT=3200
+PARTNERS_PORTAL_DOMAIN=partners.dev2.housingbayarea.mtc.ca.gov
+BACKEND_API_DOMAIN=backend.dev2.housingbayarea.int
+BACKEND_API_BASE=http://backend.dev2.housingbayarea.int
+BACKEND_API_PORT=3100
+BACKEND_API_SECRETS=CLOUDINARY_KEY,CLOUDINARY_SECRET,EMAIL_API_KEY,GOOGLE_API_ID,GOOGLE_API_KEY,GOOGLE_MAPS_MAP_ID,GOOGLE_MAPS_API_KEY,GOVDELIVERY_PASSWORD,GOVDELIVERY_USERNAME,GOVDELIVERY_API_URL
+
+
+BACKEND_API_MEMORY=2048
+BACKEND_API_CPUS=1
+BACKEND_API_INSTANCES=1
+PARTNERS_PORTAL_MEMORY=2048
+PARTNERS_PORTAL_CPUS=1
+PARTNERS_PORTAL_INSTANCES=1
+PUBLIC_PORTAL_MEMORY=2048
+PUBLIC_PORTAL_CPUS=1
+PUBLIC_PORTAL_INSTANCES=1
+
+LOG_LEVEL=debug
+
diff --git a/cdk/jest.config.js b/cdk/jest.config.js
new file mode 100644
index 00000000000..5223f6d1a6d
--- /dev/null
+++ b/cdk/jest.config.js
@@ -0,0 +1,11 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+module.exports = {
+ testEnvironment: "node",
+ roots: ["/test"],
+ testMatch: ["**/*.test.ts"],
+ transform: {
+ "^.+\\.tsx?$": "ts-jest",
+ },
+};
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamVzdC5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJqZXN0LmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE1BQU0sQ0FBQyxPQUFPLEdBQUc7SUFDZixlQUFlLEVBQUUsTUFBTTtJQUN2QixLQUFLLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztJQUN6QixTQUFTLEVBQUUsQ0FBQyxjQUFjLENBQUM7SUFDM0IsU0FBUyxFQUFFO1FBQ1QsYUFBYSxFQUFFLFNBQVM7S0FDekI7Q0FDRixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSB7XG4gIHRlc3RFbnZpcm9ubWVudDogXCJub2RlXCIsXG4gIHJvb3RzOiBbXCI8cm9vdERpcj4vdGVzdFwiXSxcbiAgdGVzdE1hdGNoOiBbXCIqKi8qLnRlc3QudHNcIl0sXG4gIHRyYW5zZm9ybToge1xuICAgIFwiXi4rXFxcXC50c3g/JFwiOiBcInRzLWplc3RcIixcbiAgfSxcbn1cbiJdfQ==
\ No newline at end of file
diff --git a/cdk/jest.config.ts b/cdk/jest.config.ts
new file mode 100644
index 00000000000..93b648455f1
--- /dev/null
+++ b/cdk/jest.config.ts
@@ -0,0 +1,8 @@
+module.exports = {
+ testEnvironment: "node",
+ roots: ["/test"],
+ testMatch: ["**/*.test.ts"],
+ transform: {
+ "^.+\\.tsx?$": "ts-jest",
+ },
+}
diff --git a/cdk/jsdoc.json b/cdk/jsdoc.json
new file mode 100644
index 00000000000..16bf6bba43f
--- /dev/null
+++ b/cdk/jsdoc.json
@@ -0,0 +1,26 @@
+{
+ "plugins": [
+ "plugins/markdown",
+ "better-docs/typescript"
+ ],
+ "source": {
+ "include": [
+ "./lib",
+ "./README.md"
+ ],
+ "includePattern": ".+\\.(js|jsx|ts|tsx)$",
+ "excludePattern": "(^|\\/|\\\\)_"
+ },
+ "opts": {
+ "destination": "./docs/",
+ "recurse": true
+ },
+
+ "templates": {
+ "cleverLinks": false,
+ "monospaceLinks": false,
+ "default": {
+ "outputSourceFiles": true
+ }
+ }
+}
\ No newline at end of file
diff --git a/cdk/lib/build-pipeline/doorway-build-job-base.ts b/cdk/lib/build-pipeline/doorway-build-job-base.ts
new file mode 100644
index 00000000000..d251df5e28a
--- /dev/null
+++ b/cdk/lib/build-pipeline/doorway-build-job-base.ts
@@ -0,0 +1,122 @@
+import { Aws, Fn, Stack } from "aws-cdk-lib"
+import {
+ BuildSpec,
+ Cache,
+ ComputeType,
+ LinuxBuildImage,
+ PipelineProject,
+ PipelineProjectProps,
+} from "aws-cdk-lib/aws-codebuild"
+import { Artifact } from "aws-cdk-lib/aws-codepipeline"
+import { CodeBuildAction } from "aws-cdk-lib/aws-codepipeline-actions"
+import { SecurityGroup, Subnet, Vpc } from "aws-cdk-lib/aws-ec2"
+import { PolicyDocument, PolicyStatement, Role, ServicePrincipal } from "aws-cdk-lib/aws-iam"
+
+// Removed fs and YAML imports since we're using BuildSpec.fromSourceFilename
+
+export interface DoorwayBuildJobProps {
+ ecrNamespace?: string
+ databaseName?: string
+ buildInVpc?: boolean
+ environment: string
+ buildspec: string
+ source: Artifact
+}
+
+export class DoorwayBuildJobBase {
+ public readonly action: CodeBuildAction
+ constructor(stack: Stack, id: string, props: DoorwayBuildJobProps) {
+ const dbSecretArn = Fn.importValue(`doorwayDBSecret-${props.environment}`)
+
+ const buildRole = new Role(stack, "doorway-app-build-role", {
+ assumedBy: new ServicePrincipal("codebuild.amazonaws.com"),
+ managedPolicies: [
+ {
+ managedPolicyArn: "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess",
+ },
+ {
+ managedPolicyArn: "arn:aws:iam::aws:policy/AmazonS3FullAccess",
+ },
+ ],
+ inlinePolicies: {
+ ECRPolicies: new PolicyDocument({
+ statements: [
+ new PolicyStatement({
+ actions: ["ecr:*"],
+ resources: [`arn:aws:ecr:${Aws.REGION}:${Aws.ACCOUNT_ID}:repository/*`],
+ }),
+ new PolicyStatement({
+ actions: ["secretsmanager:GetSecretValue"],
+ resources: [dbSecretArn],
+ }),
+ new PolicyStatement({
+ actions: [
+ "cloudformation:*",
+ "ec2:*",
+ "ssm:*",
+ "codebuild:*",
+ "logs:*",
+ "iam:AssumeRole",
+ "iam:PassRole",
+ ],
+ resources: ["*"],
+ }),
+ ],
+ }),
+ },
+ })
+ let projectProps: PipelineProjectProps = {
+ buildSpec: BuildSpec.fromSourceFilename(props.buildspec),
+ environment: {
+ buildImage: LinuxBuildImage.STANDARD_7_0,
+ computeType: ComputeType.LARGE,
+ privileged: true, // Required for Docker commands
+ },
+ environmentVariables: {
+ DB_SECRET_ARN: { value: dbSecretArn },
+ ECR_REGION: { value: Aws.REGION },
+ ECR_ACCOUNT_ID: { value: Aws.ACCOUNT_ID },
+ ECR_NAMESPACE: { value: props.ecrNamespace || "doorway" },
+ PGDATABASE: { value: props.databaseName || "bloom" },
+ ENVIRONMENT: { value: props.environment },
+ },
+ role: buildRole,
+ cache: Cache.none(),
+ }
+ if (props.buildInVpc) {
+ const vpcId = Fn.importValue(`doorway-vpc-id-${props.environment}`)
+ const subnetId = Fn.importValue(`doorway-app-subnet-1-${props.environment}`)
+ const securityGroupId = Fn.importValue(`doorway-app-sg-${props.environment}`)
+
+ const azs = Fn.importValue(`doorway-azs-${props.environment}`).split(", ")
+ const vpc = Vpc.fromVpcAttributes(stack, "vpc", {
+ vpcId: vpcId,
+ availabilityZones: azs,
+ })
+ const subnet = Subnet.fromSubnetAttributes(stack, "subnet", {
+ subnetId: subnetId,
+ })
+ const sg = SecurityGroup.fromSecurityGroupId(stack, "sg", securityGroupId)
+ projectProps = {
+ ...projectProps,
+ vpc: vpc,
+ subnetSelection: { subnets: [subnet] },
+ securityGroups: [sg],
+ }
+ }
+
+ const project = new PipelineProject(
+ stack,
+ `doorway-dbMigrate-${props.environment}`,
+ projectProps,
+
+ )
+ // Create the CodeBuild action
+ this.action = new CodeBuildAction({
+ actionName: `${id}-DBMigrate`,
+ input: props.source,
+ outputs: [new Artifact(`${id}-BuildOutput`)],
+ project,
+ })
+ }
+}
diff --git a/cdk/lib/build-pipeline/doorway-build-pipeline-stack.ts b/cdk/lib/build-pipeline/doorway-build-pipeline-stack.ts
new file mode 100644
index 00000000000..c96bdf066d1
--- /dev/null
+++ b/cdk/lib/build-pipeline/doorway-build-pipeline-stack.ts
@@ -0,0 +1,257 @@
+import { Stack, StackProps } from "aws-cdk-lib"
+import { Artifact, Pipeline } from "aws-cdk-lib/aws-codepipeline"
+import { GitHubSourceAction, GitHubTrigger } from "aws-cdk-lib/aws-codepipeline-actions"
+import { PolicyDocument, PolicyStatement, Role, ServicePrincipal } from "aws-cdk-lib/aws-iam"
+import { Secret } from "aws-cdk-lib/aws-secretsmanager"
+import { Construct } from "constructs"
+
+import { DoorwayDatabaseMigrate } from "./doorway-database-migrate"
+import { BackendDockerBuild, ImportDockerBuild, PartnersDockerBuild, PublicDockerBuild } from "./doorway-docker-build"
+import { DoorwayECSDeploy } from "./doorway-ecs-deploy"
+
+export class DoorwayBuildPipelineStack extends Stack {
+ constructor(scope: Construct, id: string, props: PipelineProps) {
+ super(scope, id, props)
+
+ // No need to create a repository for docker-hub if using pull-through cache
+ // The pull-through cache repository should already be configured in the AWS console
+
+ const pipelineRole = new Role(this, "doorway-app-pipeline-role", {
+ assumedBy: new ServicePrincipal("codepipeline.amazonaws.com"),
+ })
+ pipelineRole.addToPolicy(
+ new PolicyStatement({
+ actions: [
+ "cloudformation:*",
+ "ec2:*",
+ "ssm:*",
+ "codebuild:*",
+ "logs:*",
+ "iam:AssumeRole",
+ "iam:PassRole",
+ ],
+ resources: ["*"],
+ }),
+ )
+ const buildRole = new Role(this, `${id}-doorway-app-build-role`, {
+ assumedBy: new ServicePrincipal("codebuild.amazonaws.com"),
+ managedPolicies: [
+ {
+ managedPolicyArn: "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess",
+ },
+ {
+ managedPolicyArn: "arn:aws:iam::aws:policy/AmazonS3FullAccess",
+ },
+ ],
+ inlinePolicies: {
+ ECRPolicies: new PolicyDocument({
+ statements: [
+ new PolicyStatement({
+ actions: [
+ "ecr:BatchGetImage",
+ "ecr:GetDownloadUrlForLayer",
+ "ecr:BatchCheckLayerAvailability",
+ ],
+ resources: [`arn:aws:ecr:${this.region}:${this.account}:repository/*`],
+ }),
+ new PolicyStatement({
+ actions: ["secretsmanager:GetSecretValue"],
+ resources: [
+ `arn:aws:secretsmanager:${this.region}:${this.account}:secret:mtc/dockerHub*`,
+ `arn:aws:secretsmanager:${this.region}:${this.account}:secret:doorwayDBSecret-*`,
+ ],
+ }),
+ new PolicyStatement({
+ actions: [
+ "cloudformation:*",
+ "ec2:*",
+ "ssm:*",
+ "codebuild:*",
+ "logs:*",
+ "iam:AssumeRole",
+ "iam:PassRole",
+ "ecs:*",
+ ],
+ resources: ["*"],
+ }),
+ ],
+ }),
+ },
+ })
+
+
+ const dockerSecret = Secret.fromSecretNameV2(
+ this,
+ "dockerSecret",
+ props.dockerHubSecret,
+ ).secretArn
+
+ const githubSecret = Secret.fromSecretNameV2(
+ this,
+ "githubSecret",
+ props.githubSecret,
+ ).secretValue
+ const pipeline = new Pipeline(this, "doorway-app-pipeline", {
+ role: pipelineRole,
+ pipelineName: "doorway-app-pipeline",
+ })
+ const sourceArtifact = new Artifact("SourceArtifact")
+ const doorwaySource = new GitHubSourceAction({
+ actionName: "Source",
+ oauthToken: githubSecret,
+ owner: "metrotranscom",
+ repo: "doorway",
+ branch: "main",
+ output: sourceArtifact,
+ trigger: GitHubTrigger.WEBHOOK,
+ variablesNamespace: "SourceVariables",
+ })
+ pipeline.addStage({
+ stageName: "Source",
+ actions: [doorwaySource],
+ })
+ pipeline.addStage({
+ stageName: "Build-Dev",
+ actions: [
+ new BackendDockerBuild(this, `doorway-backend`, {
+ buildspec: "../ci/buildspec/build_backend.yml",
+ imageName: "backend",
+ source: sourceArtifact,
+ dockerHubSecret: dockerSecret,
+ buildRole: buildRole,
+ environment: "dev"
+ }).action,
+ new ImportDockerBuild(this, "doorway-import-listings", {
+ buildspec: "../ci/buildspec/build_import_listings.yml",
+ imageName: "import-listings",
+ source: sourceArtifact,
+ dockerHubSecret: dockerSecret,
+ buildRole: buildRole,
+ environment: "dev"
+ }).action,
+ new PartnersDockerBuild(this, `doorway-partners-dev`, {
+ buildspec: "../ci/buildspec/build_partners.yml",
+ imageName: "partners",
+ source: sourceArtifact,
+ dockerHubSecret: dockerSecret,
+ buildRole: buildRole,
+ environment: "dev"
+ }).action,
+ new PublicDockerBuild(this, "doorway-public-dev", {
+ buildspec: "../ci/buildspec/build_public.yml",
+ imageName: "public",
+ source: sourceArtifact,
+ dockerHubSecret: dockerSecret,
+ buildRole: buildRole,
+ environment: "dev"
+ }).action,
+ ],
+ })
+
+ const dbmigrate = new DoorwayDatabaseMigrate(this, "doorway-database-migrate-dev", {
+ environment: "dev",
+ buildspec: "./ci/buildspec/migrate_stop_backend.yml",
+ source: sourceArtifact,
+ buildRole: buildRole, // This parameter is now ignored
+ }).action
+
+ const ecsDeploy = new DoorwayECSDeploy(this, "doorway-ecs-deploy-dev", {
+ buildspec: "./ci/buildspec/cdk_deploy.yml",
+ source: sourceArtifact,
+ buildRole: buildRole,
+ environment: "dev",
+ }).action
+
+ pipeline.addStage({
+ stageName: "Dev",
+ actions: [dbmigrate, ecsDeploy],
+ })
+ pipeline.addStage({
+ stageName: "Build-Staging",
+ actions: [
+
+ new PartnersDockerBuild(this, `doorway-partners-staging`, {
+ buildspec: "../ci/buildspec/build_partners.yml",
+ imageName: "partners",
+ source: sourceArtifact,
+ dockerHubSecret: dockerSecret,
+ buildRole: buildRole,
+ environment: "staging"
+ }).action,
+ new PublicDockerBuild(this, "doorway-public-staging", {
+ buildspec: "../ci/buildspec/build_public.yml",
+ imageName: "public",
+ source: sourceArtifact,
+ dockerHubSecret: dockerSecret,
+ buildRole: buildRole,
+ environment: "staging"
+ }).action,
+ ],
+ })
+
+ const dbmigrateStaging = new DoorwayDatabaseMigrate(this, "doorway-database-migrate-staging", {
+ environment: "staging",
+ buildspec: "./ci/buildspec/migrate.yml",
+ source: sourceArtifact,
+ buildRole: buildRole,
+ }).action;
+
+ const ecsDeployStaging = new DoorwayECSDeploy(this, "doorway-ecs-deploy-staging", {
+ buildspec: "./ci/buildspec/cdk_deploy.yml",
+ source: sourceArtifact,
+ buildRole: buildRole,
+ environment: "staging",
+ }).action
+
+ pipeline.addStage({
+ stageName: "Staging",
+ actions: [dbmigrateStaging, ecsDeployStaging],
+ })
+ pipeline.addStage({
+ stageName: "Build-Prod",
+ actions: [
+
+ new PartnersDockerBuild(this, `doorway-partners-prod`, {
+ buildspec: "../ci/buildspec/build_partners.yml",
+ imageName: "partners",
+ source: sourceArtifact,
+ dockerHubSecret: dockerSecret,
+ buildRole: buildRole,
+ environment: "prod"
+ }).action,
+ new PublicDockerBuild(this, "doorway-public-prod", {
+ buildspec: "../ci/buildspec/build_public.yml",
+ imageName: "public",
+ source: sourceArtifact,
+ dockerHubSecret: dockerSecret,
+ buildRole: buildRole,
+ environment: "prod"
+ }).action,
+ ],
+ })
+
+ const dbmigrateProd = new DoorwayDatabaseMigrate(this, "doorway-database-migrate-prod", {
+ environment: "prod",
+ buildspec: "./ci/buildspec/migrate.yml",
+ source: sourceArtifact,
+ buildRole: buildRole,
+ }).action;
+
+ const ecsDeployProd = new DoorwayECSDeploy(this, "doorway-ecs-deploy-prod", {
+ buildspec: "./ci/buildspec/cdk_deploy.yml",
+ source: sourceArtifact,
+ buildRole: buildRole,
+ environment: "prod",
+ }).action
+
+ pipeline.addStage({
+ stageName: "Prod",
+ actions: [dbmigrateProd, ecsDeployProd],
+ })
+ }
+
+}
+export interface PipelineProps extends StackProps {
+ githubSecret: string
+ dockerHubSecret: string
+}
diff --git a/cdk/lib/build-pipeline/doorway-database-migrate.ts b/cdk/lib/build-pipeline/doorway-database-migrate.ts
new file mode 100644
index 00000000000..8556d6a38fa
--- /dev/null
+++ b/cdk/lib/build-pipeline/doorway-database-migrate.ts
@@ -0,0 +1,114 @@
+import { Aws, Fn } from "aws-cdk-lib"
+import { BuildSpec, Cache, ComputeType, LinuxBuildImage, PipelineProject } from "aws-cdk-lib/aws-codebuild"
+import { Artifact } from "aws-cdk-lib/aws-codepipeline"
+import { CodeBuildAction } from "aws-cdk-lib/aws-codepipeline-actions"
+import { SecurityGroup, Subnet, Vpc } from "aws-cdk-lib/aws-ec2"
+import { PolicyStatement, Role } from "aws-cdk-lib/aws-iam"
+import { Secret } from "aws-cdk-lib/aws-secretsmanager"
+import { Construct } from "constructs"
+
+// Removed fs and YAML imports since we're using BuildSpec.fromSourceFilename
+
+
+export interface DoorwayDatabaseMigrateProps {
+ ecrNamespace?: string
+ databaseName?: string
+ environment: string
+ buildspec: string
+ source: Artifact
+ buildRole: Role
+}
+
+export class DoorwayDatabaseMigrate {
+ public readonly action: CodeBuildAction
+ constructor(scope: Construct, id: string, props: DoorwayDatabaseMigrateProps) {
+ const ecsClusterName = `doorway-ecs-cluster-${props.environment}`
+ const backendServiceName = `doorway-backend-${props.environment}`
+ const vpcId = Fn.importValue(`doorway-vpc-id-${props.environment}`)
+ const subnetId = Fn.importValue(`doorway-app-subnet-1-${props.environment}`)
+ const securityGroupId = Fn.importValue(`doorway-app-sg-${props.environment}`)
+ const dbSecretArn = Fn.importValue(`doorwayDBSecret-${props.environment}`)
+ const azs = Fn.importValue(`doorway-azs-${props.environment}`).split(", ")
+ const vpc = Vpc.fromVpcAttributes(scope, `vpc-${props.environment}`, {
+ vpcId: vpcId,
+ availabilityZones: azs,
+ })
+ const subnet = Subnet.fromSubnetAttributes(scope, `subnet-${props.environment}`, {
+ subnetId: subnetId,
+ })
+ const sg = SecurityGroup.fromSecurityGroupId(scope, `sg-${props.environment}`, securityGroupId)
+ const project = new PipelineProject(scope, `doorway-dbMigrate-${props.environment}`, {
+ vpc: vpc,
+ subnetSelection: { subnets: [subnet] },
+ securityGroups: [sg],
+ buildSpec: BuildSpec.fromSourceFilename(props.buildspec),
+ environment: {
+ buildImage: LinuxBuildImage.STANDARD_7_0,
+ computeType: ComputeType.LARGE,
+ privileged: true, // Required for Docker commands
+ },
+ environmentVariables: {
+ DB_CREDS_ARN: { value: dbSecretArn },
+ ECR_REGION: { value: Aws.REGION },
+ ECR_ACCOUNT_ID: { value: Aws.ACCOUNT_ID },
+ ECR_NAMESPACE: { value: props.ecrNamespace || "doorway" },
+ PGDATABASE: { value: props.databaseName || "bloom" },
+ CLOUDINARY_CLOUD_NAME: { value: "exygy" },
+ CACHE_REVALIDATE: { value: "60" },
+ LANGUAGES: { value: "en,es,zh,vi,tl" },
+ IDLE_TIMEOUT: { value: "5" },
+ PGPORT: { value: "5432" },
+ ECS_BACKEND_SERVICE: {
+ value: backendServiceName,
+ },
+ ECS_BACKEND_CLUSTER: {
+ value: ecsClusterName,
+ },
+ MIGRATION_CMD: {
+ value: "db:reseed:ci",
+ },
+ },
+ cache: Cache.none(),
+ })
+
+ // Grant permissions to the auto-created role
+ Secret.fromSecretCompleteArn(scope, `dbSecret-${props.environment}`, dbSecretArn).grantRead(project.role!)
+ project.addToRolePolicy(new PolicyStatement({
+ actions: ["ecs:*", "ecr:*"],
+ resources: ["*"]
+ }))
+ project.addToRolePolicy(new PolicyStatement({
+
+ actions: ["secretsmanager:GetSecretValue"],
+ resources: [
+ `arn:aws:secretsmanager:${Aws.REGION}:${Aws.ACCOUNT_ID}:secret:mtc/dockerHub*`,
+ `arn:aws:secretsmanager::${Aws.REGION}:${Aws.ACCOUNT_ID}:secret:doorwayDBSecret-*`,
+ ],
+ }))
+ project.addToRolePolicy(new PolicyStatement({
+ actions: ["iam:PassRole"],
+ resources: [`arn:aws:iam::${Aws.ACCOUNT_ID}:role/*doorway*internal-api-sc-role*`]
+ }))
+ project.addToRolePolicy(new PolicyStatement({
+ actions: [
+ "cloudformation:*",
+ "ec2:*",
+ "ssm:*",
+ "codebuild:*",
+ "logs:*",
+ "iam:AssumeRole",
+ "iam:PassRole",
+ ],
+ resources: ["*"],
+ }))
+
+ // Create the CodeBuild action
+ this.action = new CodeBuildAction({
+ actionName: `${id}-DBMigrate`,
+ input: props.source,
+ outputs: [new Artifact(`${id}-BuildOutput`)],
+ project,
+ runOrder: 1,
+ })
+ }
+}
diff --git a/cdk/lib/build-pipeline/doorway-docker-build.ts b/cdk/lib/build-pipeline/doorway-docker-build.ts
new file mode 100644
index 00000000000..3806ea41d07
--- /dev/null
+++ b/cdk/lib/build-pipeline/doorway-docker-build.ts
@@ -0,0 +1,136 @@
+import { Aws } from "aws-cdk-lib"
+import { BuildSpec, Cache, ComputeType, PipelineProject } from "aws-cdk-lib/aws-codebuild"
+import { Artifact } from "aws-cdk-lib/aws-codepipeline"
+import { CodeBuildAction } from "aws-cdk-lib/aws-codepipeline-actions"
+import { Repository } from "aws-cdk-lib/aws-ecr"
+import { Role } from "aws-cdk-lib/aws-iam"
+import { Construct } from "constructs/lib/construct"
+import dotenv from "dotenv"
+import fs from "fs"
+import path from "path"
+import * as YAML from "yaml"
+
+export interface DoorwayDockerBuildProps {
+ buildspec: string
+ imageName: string
+ source: Artifact
+ dockerHubSecret: string
+ buildRole: Role
+ environment: string
+}
+class DoorwayDockerBuild {
+ public readonly action: CodeBuildAction
+ protected environmentVariables: { [name: string]: { value: string } }
+
+
+
+
+ constructor(scope: Construct, id: string, props: DoorwayDockerBuildProps) {
+ console.log(`Creating Application stack for ${props.environment}`)
+ console.log(`Using environment file: ${path.resolve(__dirname, `../../${props.environment}.env`)}`)
+
+
+ dotenv.config({
+ path: path.resolve(__dirname, `../../${props.environment}.env`),
+ override: true
+ })
+ // Create ECR repository
+
+
+ this.environmentVariables = {
+ ECR_REGION: { value: Aws.REGION },
+ ECR_ACCOUNT_ID: { value: Aws.ACCOUNT_ID },
+ ECR_NAMESPACE: { value: "doorway" },
+ IMAGE_NAME: { value: props.imageName },
+ DOCKER_HUB_SECRET_ARN: { value: props.dockerHubSecret },
+ ENVIRONMENT: { value: props.environment },
+ BACKEND_API_BASE: { value: process.env.BACKEND_API_BASE || `http://backend.${props.environment}.housingbayarea.int` },
+ CACHE_REVALIDATE: { value: process.env.CACHE_REVALIDATE || "30" },
+ LANGUAGES: {
+ value: process.env.LANGUAGES || "en,es,zh,vi,tl"
+ },
+ MAPBOX_TOKEN: { value: process.env.MAPBOX_TOKEN || "" }
+
+ }
+
+
+ // Create the CodeBuild project
+ const project = new PipelineProject(scope, `${id}-Project`, {
+ buildSpec: BuildSpec.fromObject(YAML.parse(fs.readFileSync(props.buildspec, "utf8"))),
+ environment: {
+ computeType: ComputeType.LARGE,
+ },
+ environmentVariables: this.environmentVariables,
+ role: props.buildRole,
+ cache: Cache.none(),
+ })
+
+ // Create the CodeBuild action
+ this.action = new CodeBuildAction({
+ actionName: `${id}-DockerBuild`,
+ input: props.source,
+ outputs: [new Artifact(`${id}-BuildOutput`)],
+ project,
+ })
+ }
+}
+
+export class PartnersDockerBuild extends DoorwayDockerBuild {
+ constructor(scope: Construct, id: string, props: DoorwayDockerBuildProps) {
+ super(scope, id, props)
+ if (props.environment.startsWith("dev")) {
+ // Grant permissions to the provided role
+ const repo = new Repository(scope, `${id}-ECRRepository`, {
+ repositoryName: `doorway/${props.imageName}`,
+ })
+ repo.grantPullPush(props.buildRole)
+ }
+ this.environmentVariables.FEATURE_LISTINGS_APPROVAL = { value: process.env.FEATURE_LISTINGS_APPROVAL || "true" }
+ this.environmentVariables.USE_SECURE_DOWNLOAD_PATHWAY = { value: process.env.USE_SECURE_DOWNLOAD_PATHWAY || "true" }
+ this.environmentVariables.CLOUDINARY_CLOUD_NAME = { value: process.env.CLOUDINARY_CLOUD_NAME || "exygy" }
+ }
+}
+export class PublicDockerBuild extends DoorwayDockerBuild {
+ constructor(scope: Construct, id: string, props: DoorwayDockerBuildProps) {
+ super(scope, id, props)
+ if (props.environment.startsWith("dev")) {
+ // Grant permissions to the provided role
+ const repo = new Repository(scope, `${id}-ECRRepository`, {
+ repositoryName: `doorway/${props.imageName}`,
+ })
+ repo.grantPullPush(props.buildRole)
+ }
+ this.environmentVariables.SHOW_PROFESSIONAL_PARTNERS = { value: process.env.SHOW_PROFESSIONAL_PARTNERS || "true" }
+ this.environmentVariables.BLOOM_API_BASE = { value: process.env.BLOOM_API_BASE || "" }
+ this.environmentVariables.JURISDICTION_NAME = {
+ value: process.env.JURISDICTION_NAME || "Bay Area"
+ }
+ this.environmentVariables.MAINTENANCE_WINDOW = { value: process.env.MAINTENANCE_WINDOW || "2024-08-07 10:00 -07:00,2024-08-08 8:00 -07:00" }
+ this.environmentVariables.SITE_MESSAGE_WINDOW = { value: process.env.SITE_MESSAGE_WINDOW || "2025-05-05 10:00,2025-08-08 8:00" }
+ this.environmentVariables.NOTIFICATIONS_SIGN_UP_URL = { value: process.env.NOTIFICATIONS_SIGN_UP_URL || "https://public.govdelivery.com/accounts/CAMTC/signup/36832" }
+ this.environmentVariables.GTM_KEY = { value: process.env.GTM_KEY || "" }
+ }
+}
+export class BackendDockerBuild extends DoorwayDockerBuild {
+ constructor(scope: Construct, id: string, props: DoorwayDockerBuildProps) {
+ super(scope, id, props)
+ const repo = new Repository(scope, `${id}-ECRRepository`, {
+ repositoryName: `doorway/${props.imageName}`,
+ })
+
+ // Grant permissions to the provided role
+ repo.grantPullPush(props.buildRole)
+
+ }
+}
+export class ImportDockerBuild extends DoorwayDockerBuild {
+ constructor(scope: Construct, id: string, props: DoorwayDockerBuildProps) {
+ super(scope, id, props)
+ const repo = new Repository(scope, `${id}-ECRRepository`, {
+ repositoryName: `doorway/${props.imageName}`,
+ })
+ // Grant permissions to the provided role
+ repo.grantPullPush(props.buildRole)
+
+ }
+}
\ No newline at end of file
diff --git a/cdk/lib/build-pipeline/doorway-ecs-deploy.ts b/cdk/lib/build-pipeline/doorway-ecs-deploy.ts
new file mode 100644
index 00000000000..3fc75507520
--- /dev/null
+++ b/cdk/lib/build-pipeline/doorway-ecs-deploy.ts
@@ -0,0 +1,44 @@
+import { BuildSpec, Cache, ComputeType, LinuxBuildImage, PipelineProject } from "aws-cdk-lib/aws-codebuild"
+import { Artifact } from "aws-cdk-lib/aws-codepipeline"
+import { CodeBuildAction } from "aws-cdk-lib/aws-codepipeline-actions"
+import { Role } from "aws-cdk-lib/aws-iam"
+import { Construct } from "constructs"
+
+// Removed fs and YAML imports since we're using BuildSpec.fromSourceFilename
+
+export interface DoorwayECSDeployProps {
+ environment: string
+ buildspec: string
+ source: Artifact
+ buildRole: Role
+}
+
+export class DoorwayECSDeploy {
+ public readonly action: CodeBuildAction
+ constructor(scope: Construct, id: string, props: DoorwayECSDeployProps) {
+ const project = new PipelineProject(scope, `doorway-ecsDeploy-${props.environment}`, {
+ buildSpec: BuildSpec.fromSourceFilename(props.buildspec),
+ environmentVariables: {
+ ENVIRONMENT: {
+ value: props.environment,
+ },
+ },
+ environment: {
+ buildImage: LinuxBuildImage.STANDARD_7_0,
+ computeType: ComputeType.LARGE,
+ privileged: true, // Required for Docker commands
+ },
+
+ role: props.buildRole,
+ cache: Cache.none(),
+ })
+ // Create the CodeBuild action
+ this.action = new CodeBuildAction({
+ actionName: `${id}-ECSDeploy`,
+ input: props.source,
+ outputs: [new Artifact(`${id}-BuildOutput`)],
+ project,
+ runOrder: 2,
+ })
+ }
+}
diff --git a/cdk/lib/doorway_environment/doorway-app-environment-stack.ts b/cdk/lib/doorway_environment/doorway-app-environment-stack.ts
new file mode 100644
index 00000000000..c59295e150b
--- /dev/null
+++ b/cdk/lib/doorway_environment/doorway-app-environment-stack.ts
@@ -0,0 +1,85 @@
+import { aws_logs, Fn, RemovalPolicy, Stack } from "aws-cdk-lib"
+import { Vpc } from "aws-cdk-lib/aws-ec2"
+import { LogGroup } from "aws-cdk-lib/aws-logs"
+import { Construct } from "constructs"
+import * as dotenv from "dotenv"
+import path from "path"
+
+import { DoorwayLoadBalancers } from "./doorway-load-balancers"
+import { DoorwayProps } from "./doorway-props"
+import { DoorwayBackendService } from "./services/doorway-backend-service"
+import { DoorwayImportListings } from "./services/doorway-import-listings"
+import { DoorwayPartnersSite } from "./services/doorway-partners-site"
+import { DoorwayPublicSite } from "./services/doorway-public-site"
+import { DoorwayS3Stack } from "./services/doorway-s3-stack"
+import { DoorwaySecrets } from "./services/doorway-secrets-stack"
+
+export class DoorwayAppEnvironmentStack extends Stack {
+ public loadBalancerDnsName: string;
+
+ constructor(scope: Construct, id: string, environment: string) {
+ super(scope, id, {
+ env: {
+ account: process.env.CDK_DEFAULT_ACCOUNT || "364076391763",
+ region: process.env.CDK_DEFAULT_REGION || "us-west-2",
+ },
+ crossRegionReferences: true
+ })
+ console.log(`Creating Application stack for ${environment}`)
+ console.log(`Using environment file: ${path.resolve(__dirname, `../../${environment}.env`)}`)
+
+
+ dotenv.config({
+ path: path.resolve(__dirname, `../../${environment}.env`),
+ override: true
+ })
+
+ const logGroup = new LogGroup(this, `doorway-${environment}-tasks`, {
+ logGroupName: `doorway-${environment}-tasks`,
+ removalPolicy: RemovalPolicy.DESTROY,
+ retention: aws_logs.RetentionDays.ONE_WEEK,
+ })
+ const scLogGroup = new LogGroup(this, `${id}-service-connect-log-group`, {
+ logGroupName: `/doorway/${environment}/service-connect`,
+ removalPolicy: RemovalPolicy.DESTROY,
+ retention: aws_logs.RetentionDays.ONE_WEEK,
+ })
+ const vpcId = Fn.importValue(`doorway-vpc-id-${environment}`)
+ const azs = Fn.importValue(`doorway-azs-${environment}`).split(",")
+ const vpc = Vpc.fromVpcAttributes(this, `vpc-${id}`, {
+ vpcId: vpcId,
+ availabilityZones: azs,
+ })
+
+ const dwProps: DoorwayProps = {
+ environment: environment,
+ serviceConnectLogGroup: scLogGroup,
+ logGroup: logGroup,
+ backendServiceName: `doorway-backend-${environment}`,
+ publicServiceName: `doorway-public-${environment}`,
+ partnersServiceName: `doorway-partners-${environment}`,
+ clusterName: Fn.importValue(`doorway-ecs-cluster-${environment}`),
+ vpc: vpc
+ }
+ const s3stack = new DoorwayS3Stack(this, `doorway-s3-${environment}`, dwProps)
+ const secrets = new DoorwaySecrets(this, `doorway-secrets-${environment}`, dwProps)
+ const api = new DoorwayBackendService(this, `doorway-api-service-${environment}`, dwProps)
+ api.service.node.addDependency(s3stack)
+ const lb = new DoorwayLoadBalancers(this, `doorway-lbs-${environment}`, dwProps);
+ lb.loadBalancer.node.addDependency(s3stack)
+ const publicSite = new DoorwayPublicSite(this, `doorway-public-${environment}`, dwProps)
+ publicSite.service.node.addDependency(lb.loadBalancer)
+ publicSite.service.node.addDependency(api.service)
+ lb.publicTargetGroup.addTarget(publicSite.service)
+ const partnersSite = new DoorwayPartnersSite(this, `doorway-partners-${environment}`, dwProps)
+ partnersSite.service.node.addDependency(lb.loadBalancer)
+ partnersSite.service.node.addDependency(api.service)
+ lb.partnersTargetGroup.addTarget(partnersSite.service)
+ lb.privateTargetGroup.addTarget(api.service)
+ const scheduler = new DoorwayImportListings(this, `doorway-import-listings-scheduler-${environment}`, dwProps)
+ scheduler.schedule.node.addDependency(api.service)
+
+ // Expose load balancer DNS name for cross-region access
+ this.loadBalancerDnsName = lb.loadBalancer.loadBalancerDnsName;
+ }
+}
diff --git a/cdk/lib/doorway_environment/doorway-cloudfront-stack.ts b/cdk/lib/doorway_environment/doorway-cloudfront-stack.ts
new file mode 100644
index 00000000000..1676afb3362
--- /dev/null
+++ b/cdk/lib/doorway_environment/doorway-cloudfront-stack.ts
@@ -0,0 +1,125 @@
+import { Duration, Fn, Stack, StackProps } from "aws-cdk-lib";
+import { Certificate, CertificateValidation } from "aws-cdk-lib/aws-certificatemanager";
+import { AllowedMethods, CachePolicy, Distribution, OriginRequestPolicy, PriceClass, SecurityPolicyProtocol, ViewerProtocolPolicy } from "aws-cdk-lib/aws-cloudfront";
+import { LoadBalancerV2Origin } from "aws-cdk-lib/aws-cloudfront-origins";
+import { ApplicationLoadBalancer } from "aws-cdk-lib/aws-elasticloadbalancingv2";
+import { HostedZone } from "aws-cdk-lib/aws-route53";
+import { StringParameter } from "aws-cdk-lib/aws-ssm";
+import { Construct } from "constructs";
+import * as dotenv from 'dotenv';
+import * as path from 'path';
+
+export interface CloudFrontCertStackProps extends StackProps {
+ environment: string;
+ publicDomainName: string;
+ partnersDomainName: string;
+ loadBalancerDnsName: string;
+}
+
+export class DoorwayCloudFrontStack extends Stack {
+ public cloudFrontCertArn: string;
+ constructor(scope: Construct, id: string, props: CloudFrontCertStackProps) {
+ super(scope, id, {
+ env: {
+ region: 'us-east-1',
+ account: process.env.CDK_DEFAULT_ACCOUNT || "364076391763",
+ },
+ crossRegionReferences: true
+ });
+ const environment = props.environment;
+ console.log(`Creating Application stack for ${environment}`)
+ console.log(`Using environment file: ${path.resolve(__dirname, `../../${environment}.env`)}`)
+
+
+
+ dotenv.config({
+ path: path.resolve(__dirname, `../../${environment}.env`),
+ override: true
+ })
+ console.log(process.env)
+
+
+
+
+ const dnsZone = HostedZone.fromLookup(this, `publicDnsZone-${environment}`, {
+ domainName: "housingbayarea.mtc.ca.gov",
+ });
+ const publicDomainName = process.env.PUBLIC_PORTAL_DOMAIN || `${environment}.housingbayarea.mtc.ca.gov`
+ const partnersDomainName = process.env.PARTNERS_PORTAL_DOMAIN || `partners.${environment}.housingbayarea.mtc.ca.gov`
+
+
+ const cert = new Certificate(this, "CloudFrontCertificate", {
+ domainName: publicDomainName,
+ validation: CertificateValidation.fromDns(dnsZone),
+ subjectAlternativeNames: [partnersDomainName]
+ });
+
+ const cfOrigin = new LoadBalancerV2Origin(ApplicationLoadBalancer.fromApplicationLoadBalancerAttributes(this, `PublicLB-${environment}`, {
+ loadBalancerArn: `arn:aws:elasticloadbalancing:us-west-2:364076391763:loadbalancer/app/doorway-lbs-${environment}/dummy`,
+ securityGroupId: 'sg-dummy',
+ loadBalancerDnsName: props.loadBalancerDnsName
+ }))
+ const cachePolicy = new CachePolicy(this, `CachePolicy-images-${environment}`, {
+ cachePolicyName: `CachePolicy-images-${environment}`,
+ enableAcceptEncodingGzip: false,
+ enableAcceptEncodingBrotli: false,
+ minTtl: Duration.seconds(60),
+ maxTtl: Duration.seconds(31536000),
+ defaultTtl: Duration.seconds(86400),
+ headerBehavior: {
+ behavior: "whitelist",
+ headers: ["Host"],
+ },
+ queryStringBehavior: {
+ behavior: "none",
+ },
+ cookieBehavior: {
+ behavior: "none",
+ },
+ });
+
+ new Distribution(this, `CloudFront-${environment}`, {
+ domainNames: [publicDomainName, partnersDomainName],
+ certificate: cert,
+ minimumProtocolVersion: SecurityPolicyProtocol.TLS_V1_2_2021,
+ enableIpv6: true,
+
+
+ defaultRootObject: "",
+ logIncludesCookies: true,
+ logFilePrefix: "cloudfront",
+
+ comment: `Doorway Cloudfront for ${environment}`,
+
+ priceClass: PriceClass.PRICE_CLASS_100,
+ geoRestriction: {
+ locations: ["US"],
+ restrictionType: "whitelist"
+ },
+
+
+ defaultBehavior: {
+ origin: cfOrigin,
+ cachePolicy: CachePolicy.CACHING_DISABLED, // Disable caching
+ viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,
+ allowedMethods: AllowedMethods.ALLOW_ALL,
+ originRequestPolicy: OriginRequestPolicy.ALL_VIEWER
+
+ },
+ additionalBehaviors: {
+ "/images/*": {
+ origin: cfOrigin,
+ allowedMethods: AllowedMethods.ALLOW_ALL,
+ cachePolicy: cachePolicy,
+ viewerProtocolPolicy: ViewerProtocolPolicy.ALLOW_ALL,
+
+ }
+ }
+ })
+ this.cloudFrontCertArn = cert.certificateArn;
+ // Only create CloudFront A records if environment variable is set
+
+
+
+ }
+}
diff --git a/cdk/lib/doorway_environment/doorway-load-balancers.ts b/cdk/lib/doorway_environment/doorway-load-balancers.ts
new file mode 100644
index 00000000000..a0bf77b4bfb
--- /dev/null
+++ b/cdk/lib/doorway_environment/doorway-load-balancers.ts
@@ -0,0 +1,218 @@
+import { aws_ec2, CfnOutput, Duration, Fn } from "aws-cdk-lib";
+import { Certificate, CertificateValidation } from "aws-cdk-lib/aws-certificatemanager";
+import { ISubnet, Subnet } from "aws-cdk-lib/aws-ec2";
+import { ApplicationListener, ApplicationListenerRule, ApplicationLoadBalancer, ApplicationProtocol, ApplicationTargetGroup, ListenerAction, ListenerCondition, TargetType } from "aws-cdk-lib/aws-elasticloadbalancingv2";
+import { ARecord, HostedZone, RecordTarget } from "aws-cdk-lib/aws-route53";
+import { LoadBalancerTarget } from "aws-cdk-lib/aws-route53-targets";
+import { StringParameter } from "aws-cdk-lib/aws-ssm";
+import { Construct } from "constructs";
+
+import { DoorwayProps } from "./doorway-props";
+
+export class DoorwayLoadBalancers {
+ public loadBalancer: ApplicationLoadBalancer
+ public privateLoadBalancer: ApplicationLoadBalancer
+ public publicTargetGroup: ApplicationTargetGroup;
+ public partnersTargetGroup: ApplicationTargetGroup;
+ public privateTargetGroup: ApplicationTargetGroup;
+ constructor(scope: Construct, id: string, props: DoorwayProps) {
+
+ // Get Network setup
+ const vpcId = Fn.importValue(`doorway-vpc-id-${props.environment}`)
+ const azs = Fn.importValue(`doorway-azs-${props.environment}`).split(",")
+ const vpc = aws_ec2.Vpc.fromVpcAttributes(scope, `vpc-${id}`, {
+ vpcId: vpcId,
+ availabilityZones: azs,
+ })
+ const sgId = Fn.importValue(`doorway-public-sg-${props.environment}`)
+
+ const sg = aws_ec2.SecurityGroup.fromSecurityGroupId(scope, `doorway-public-sg-${props.environment}`, sgId)
+ const publicSubnetIds: string[] = []
+ publicSubnetIds.push(Fn.importValue(`doorway-public-subnet-1-${props.environment}`))
+ publicSubnetIds.push(Fn.importValue(`doorway-public-subnet-2-${props.environment}`))
+ const publicsubnets: ISubnet[] = []
+ publicSubnetIds.forEach((id) => {
+ publicsubnets.push(Subnet.fromSubnetId(scope, id, id))
+ })
+ this.loadBalancer = new ApplicationLoadBalancer(scope, id, {
+ vpc: vpc,
+ internetFacing: true,
+ loadBalancerName: id,
+ securityGroup: sg,
+ vpcSubnets: {
+ subnets: publicsubnets,
+ },
+
+ });
+ const dnsZone = HostedZone.fromLookup(scope, `publicDnsZone-${props.environment}`, {
+ domainName: "housingbayarea.mtc.ca.gov",
+ });
+ const publicDomainName = process.env.PUBLIC_PORTAL_DOMAIN || `${props.environment}.housingbayarea.mtc.ca.gov`
+ const partnersDomainName = process.env.PARTNERS_PORTAL_DOMAIN || `partners.${props.environment}.housingbayarea.mtc.ca.gov`
+ const backendDomainName = process.env.BACKEND_API_DOMAIN || `backend.${props.environment}.housingbayarea.int`
+ const cert = new Certificate(scope, "PublicCertificate", {
+ domainName: publicDomainName,
+ validation: CertificateValidation.fromDns(dnsZone),
+ subjectAlternativeNames: [partnersDomainName]
+ })
+
+
+ const httpListener = this.loadBalancer.addListener("HttpListener", {
+ port: 80,
+ open: true,
+ });
+ const httpsListener = new ApplicationListener(scope, "HttpsListener", {
+ loadBalancer: this.loadBalancer,
+ port: 443,
+ certificates: [cert],
+ protocol: ApplicationProtocol.HTTPS,
+ open: true
+ })
+ httpListener.addAction("DefaultAction", {
+ action: ListenerAction.redirect({
+ protocol: "HTTPS",
+ port: "443",
+ permanent: true,
+
+ }),
+ })
+ httpsListener.addAction("DefaultAction", {
+ action: ListenerAction.fixedResponse(403, {
+ contentType: "text/plain",
+ messageBody: "Forbidden",
+ })
+ })
+ this.publicTargetGroup = new ApplicationTargetGroup(scope, "PublicTargetGroup", {
+ port: Number(process.env.PUBLIC_PORTAL_PORT) || 3000,
+ protocol: ApplicationProtocol.HTTP,
+ vpc: vpc,
+ targetGroupName: `public-tg-${props.environment}`,
+ targetType: TargetType.IP,
+ healthCheck: {
+ enabled: true,
+ healthyThresholdCount: 2,
+ interval: Duration.seconds(10),
+ path: "/",
+ timeout: Duration.seconds(5),
+ unhealthyThresholdCount: 2,
+ },
+ })
+ new ApplicationListenerRule(scope, "PublicDomainRule", {
+ listener: httpsListener,
+ priority: 100,
+ action: ListenerAction.forward([this.publicTargetGroup]),
+ conditions: [ListenerCondition.hostHeaders([publicDomainName])
+ ]
+ });
+
+ this.partnersTargetGroup = new ApplicationTargetGroup(scope, "PartnersTargetGroup", {
+ port: Number(process.env.PUBLIC_PORTAL_PORT) || 3000,
+ protocol: ApplicationProtocol.HTTP,
+ vpc: vpc,
+ targetGroupName: `partners-tg-${props.environment}`,
+ targetType: TargetType.IP,
+ healthCheck: {
+ enabled: true,
+ healthyThresholdCount: 2,
+ interval: Duration.seconds(10),
+ path: "/",
+ timeout: Duration.seconds(5),
+ unhealthyThresholdCount: 2,
+ },
+ })
+ new ApplicationListenerRule(scope, "PartnersDomainRule", {
+ listener: httpsListener,
+ priority: 200,
+ action: ListenerAction.forward([this.partnersTargetGroup]),
+ conditions: [ListenerCondition.hostHeaders([partnersDomainName])
+ ]
+ });
+
+
+
+
+ const appSGId = Fn.importValue(`doorway-app-sg-${props.environment}`)
+
+ const appSg = aws_ec2.SecurityGroup.fromSecurityGroupId(scope, `doorway-app-sg-${props.environment}`, appSGId)
+ const appSubnetIds: string[] = []
+ appSubnetIds.push(Fn.importValue(`doorway-app-subnet-1-${props.environment}`))
+ appSubnetIds.push(Fn.importValue(`doorway-app-subnet-2-${props.environment}`))
+ const appsubnets: ISubnet[] = []
+ appSubnetIds.forEach((id) => {
+ appsubnets.push(Subnet.fromSubnetId(scope, id, id))
+ })
+
+ this.privateLoadBalancer = new ApplicationLoadBalancer(scope, `private-${id}`, {
+ vpc: vpc,
+ internetFacing: false,
+ loadBalancerName: `private-${id}`,
+ securityGroup: appSg,
+ vpcSubnets: {
+ subnets: appsubnets,
+ },
+
+ });
+ const httpListenerPrivate = this.privateLoadBalancer.addListener("PrivateListener", {
+
+ port: 80,
+ open: true,
+ protocol: ApplicationProtocol.HTTP,
+
+ })
+ this.privateTargetGroup = new ApplicationTargetGroup(scope, "PrivateTargetGroup", {
+ port: Number(process.env.BACKEND_API_PORT) || 3100,
+ protocol: ApplicationProtocol.HTTP,
+ vpc: vpc,
+
+ targetGroupName: `private-tg-${props.environment}`,
+ targetType: TargetType.IP,
+ healthCheck: {
+ enabled: true,
+ healthyThresholdCount: 2,
+ interval: Duration.seconds(10),
+ path: "/",
+ timeout: Duration.seconds(5),
+ unhealthyThresholdCount: 2,
+ },
+ })
+ httpListenerPrivate.addTargetGroups("PrivateTargetGroup", {
+ targetGroups: [this.privateTargetGroup],
+ });
+
+ const privateDnsZoneName = StringParameter.fromStringParameterName(scope, `privateDnsZoneId-${props.environment}`, `/doorway/private-hosted-zone`).stringValue;
+
+
+ const privateDnsZone = HostedZone.fromHostedZoneAttributes(scope, `privateDnsZone-${props.environment}`, {
+ hostedZoneId: privateDnsZoneName,
+ zoneName: "housingbayarea.int",
+ });
+ new ARecord(scope, `PrivateARecord-${props.environment}`, {
+ zone: privateDnsZone,
+ recordName: backendDomainName,
+ target: RecordTarget.fromAlias(new LoadBalancerTarget(this.privateLoadBalancer)),
+ });
+ new ARecord(scope, "PartnersARecord", {
+ zone: dnsZone,
+ recordName: partnersDomainName,
+ target: RecordTarget.fromAlias(new LoadBalancerTarget(this.loadBalancer)),
+ });
+
+ new ARecord(scope, "PublicARecord", {
+ zone: dnsZone,
+ recordName: publicDomainName,
+ target: RecordTarget.fromAlias(new LoadBalancerTarget(this.loadBalancer)),
+ });
+ new CfnOutput(scope, `public-lb-dns-${props.environment}`, {
+ value: this.loadBalancer.loadBalancerDnsName,
+ exportName: `public-lb-dns-${props.environment}`
+ })
+ new CfnOutput(scope, `public-lb-arn-${props.environment}`, {
+ value: this.loadBalancer.loadBalancerArn,
+ exportName: `doorway-public-lb-${props.environment}-arn`
+ })
+ new CfnOutput(scope, `public-lb-sg-${props.environment}`, {
+ value: sg.securityGroupId,
+ exportName: `doorway-public-lb-${props.environment}-sg`
+ })
+ }
+}
\ No newline at end of file
diff --git a/cdk/lib/doorway_environment/doorway-props.ts b/cdk/lib/doorway_environment/doorway-props.ts
new file mode 100644
index 00000000000..6bbf0ad8f9c
--- /dev/null
+++ b/cdk/lib/doorway_environment/doorway-props.ts
@@ -0,0 +1,60 @@
+import { ISecurityGroup, IVpc } from "aws-cdk-lib/aws-ec2"
+import { FargateService, Secret } from "aws-cdk-lib/aws-ecs"
+import { Role } from "aws-cdk-lib/aws-iam"
+import { LogGroup } from "aws-cdk-lib/aws-logs"
+import { IBucket } from "aws-cdk-lib/aws-s3"
+
+export interface DoorwayProps {
+ environment: string,
+ logGroup: LogGroup
+ serviceConnectLogGroup: LogGroup
+ clusterName: string
+ backendServiceName: string
+ publicServiceName: string
+ partnersServiceName: string
+ vpc: IVpc
+}
+
+export interface DoorwayServiceProps extends DoorwayProps {
+ memory: number
+ cpu: number
+ instances: number
+ port: number
+ secrets: { [key: string]: Secret }
+ environmentVariables: { [key: string]: string }
+ serviceConnectServer: boolean
+ domainName: string
+ apiTargetDomainName?: string
+ apiTargetPort?: number
+ executionRole: Role
+ publicUploads?: IBucket
+ secureUploads?: IBucket
+ container: string
+ securityGroup: ISecurityGroup
+ serviceName: string
+ clusterName: string
+}
+export interface DoorwayLoadBalancerProps extends DoorwayProps {
+ publicService: FargateService,
+ partnersService: FargateService,
+}
+
+
+export interface DoorwayLambdaProps {
+ environment: string;
+ name: string;
+ timeoutInMinutes: number;
+ handler: string;
+ memory?: number;
+ storage?: number;
+ bundling: {};
+
+ environmentVariables?: { [key: string]: string };
+
+}
+export interface DoorwayServiceMonitorLambdaProps {
+ secrets: { [key: string]: Secret };
+ service: FargateService;
+ environment: string
+
+}
\ No newline at end of file
diff --git a/cdk/lib/doorway_environment/services/doorway-backend-service.ts b/cdk/lib/doorway_environment/services/doorway-backend-service.ts
new file mode 100644
index 00000000000..f162974a866
--- /dev/null
+++ b/cdk/lib/doorway_environment/services/doorway-backend-service.ts
@@ -0,0 +1,179 @@
+import { Aws, Fn } from "aws-cdk-lib"
+import { ISecurityGroup, Port, Protocol, SecurityGroup } from "aws-cdk-lib/aws-ec2"
+import { FargateService, Secret } from "aws-cdk-lib/aws-ecs"
+import { PolicyStatement, Role, ServicePrincipal } from "aws-cdk-lib/aws-iam"
+import { Bucket } from "aws-cdk-lib/aws-s3"
+import * as secret from "aws-cdk-lib/aws-secretsmanager"
+import { EmailIdentity } from "aws-cdk-lib/aws-ses"
+import { Construct } from "constructs"
+
+import { DoorwayProps } from "../doorway-props"
+import { DoorwayService } from "./doorway_service"
+
+/**
+ * The Backend API Service for Doorway
+ * @class
+ * @see DoorwayService
+ */
+export class DoorwayBackendService {
+ public service: FargateService
+ public constructor(scope: Construct, id: string, props: DoorwayProps) {
+ const gitHash = process.env.CODEBUILD_RESOLVED_SOURCE_VERSION?.substring(0, 8) || "candidate"
+ const executionRole = new Role(scope, `executionRole-${id}`, {
+ assumedBy: new ServicePrincipal("ecs-tasks.amazonaws.com"),
+ })
+ const publicUploads = Bucket.fromBucketArn(
+ scope,
+ `publicUploadsBucket-${id}`,
+ Fn.importValue(`doorway-public-uploads-${props.environment}`),
+ )
+ const secureUploads = Bucket.fromBucketArn(
+ scope,
+ `secureUploadsBucket-${id}`,
+ Fn.importValue(`doorway-secure-uploads-${props.environment}`),
+ )
+
+ const environmentVariables = {
+ ASSET_FILE_SERVICE: process.env.ASSET_FILE_SERVICE || "s3",
+ LISTINGS_PROCESSING_QUERY: process.env.LISTINGS_PROCESSING_QUERY || "/listings",
+ PORT: process.env.BACKEND_API_PORT || "3100",
+ SHOW_LM_LINKS: process.env.SHOW_LM_LINKS || "TRUE",
+ TIME_ZONE: process.env.TIME_ZONE || "America/Los_Angeles",
+ SHOW_DUPLICATES: process.env.SHOW_DUPLICATES || "FALSE",
+ NO_COLOR: process.env.NO_COLOR || "TRUE",
+ ASSET_FS_CONFIG_s3_PATH_PREFIX: process.env.ASSET_FS_CONFIG_s3_PATH_PREFIX || "",
+ ASSET_FS_PRIVATE_CONFIG_s3_BUCKET: secureUploads.bucketName,
+ ASSET_FS_CONFIG_s3_BUCKET: publicUploads.bucketName,
+ ASSET_FS_CONFIG_s3_REGION: Aws.REGION,
+ ASSET_FS_CONFIG_s3_URL_FORMAT: process.env.ASSET_FS_CONFIG_s3_URL_FORMAT || "public",
+ THROTTLE_LIMIT: process.env.THROTTLE_LIMIT || "100",
+ THROTTLE_TTL: process.env.THROTTLE_TTL || "180000",
+ LOG_LEVEL: process.env.LOG_LEVEL || "info",
+ LISTING_PROCESSING_CRON_STRING: process.env.LISTING_PROCESSING_CRON_STRING || "0 * * * *",
+ LOTTERY_PROCESSING_CRON_STRING: process.env.LOTTERY_PROCESSING_CRON_STRING || "0 * * * *",
+ LOTTERY_PUBLISH_PROCESSING_CRON_STRING:
+ process.env.LOTTERY_PUBLISH_PROCESSING_CRON_STRING || "58 23 * * *",
+ AFS_PROCESSING_CRON_STRING: process.env.AFS_PROCESSING_CRON_STRING || "15 * * * *",
+ TEMP_FILE_CLEAR_CRON_STRING: process.env.TEMP_FILE_CLEAR_CRON_STRING || "30 * * * *",
+ DUPLICATES_PROCESSING_CRON_STRING:
+ process.env.DUPLICATES_PROCESSING_CRON_STRING || "5 * * * *",
+ LOTTERY_DAYS_TILL_EXPIRY: process.env.LOTTERY_DAYS_TILL_EXPIRY || "45",
+ MFA_CODE_LENGTH: process.env.MFA_CODE_LENGTH || "5",
+ MFA_CODE_VALID: process.env.MFA_CODE_VALID || "600000",
+ GOVDELIVERY_TOPIC: process.env.GOVDELIVERY_TOPIC || "5 * * * *",
+ PARTNERS_PORTAL_URL:
+ process.env.PARTNERS_PORTAL_URL ||
+ `https://partners.${props.environment}.housingbayarea.mtc.ca.gov`,
+ PARTNERS_BASE_URL:
+ process.env.PARTNERS_BASE_URL ||
+ `https://partners.${props.environment}.housingbayarea.mtc.ca.gov/api`,
+ ASSET_UPLOAD_MAX_SIZE: process.env.ASSET_UPLOAD_MAX_SIZE || "5",
+ AUTH_LOCK_LOGIN_COOLDOWN: process.env.AUTH_LOCK_LOGIN_COOLDOWN || "1800000",
+ AUTH_LOCK_LOGIN_AFTER_FAILED_ATTEMPTS:
+ process.env.AUTH_LOCK_LOGIN_AFTER_FAILED_ATTEMPTS || "5",
+ CORS_ORIGINS:
+ process.env.CORS_ORIGINS || "*",
+ DUPLICATES_CLOSE_DATE: process.env.DUPLICATES_CLOSE_DATE || "2024-10-08 00:00 -08:00",
+ // Doorway has started using serviceconnect which uses TLS internally, so we can turn HTTPS_OFF on for all environments.
+ HTTPS_OFF: process.env.HTTPS_OFF || "true",
+ // We can also turn off same site cookies and CORS since we're using serviceconnect because the incoming traffic looks like it's coming from localhost
+ SAME_SITE: process.env.SAME_SITE || "true",
+ DISABLE_CORS: process.env.DISABLE_CORS || "TRUE",
+ APP_SECRET: process.env.APP_SECRET || "",
+ }
+ const dbSecretArn = Fn.importValue(`doorwayDBSecret-${props.environment}`)
+ const dbSecret = secret.Secret.fromSecretCompleteArn(scope, "dbSecret", dbSecretArn)
+ dbSecret.grantRead(executionRole)
+ const secrets: { [key: string]: Secret } = {
+ PGUSER: Secret.fromSecretsManager(dbSecret, "username"),
+ PGPASSWORD: Secret.fromSecretsManager(dbSecret, "password"),
+ PGPORT: Secret.fromSecretsManager(dbSecret, "port"),
+ PGHOST: Secret.fromSecretsManager(dbSecret, "host"),
+ PGDATABASE: Secret.fromSecretsManager(dbSecret, "dbname"),
+ }
+ const secretNames = process.env.BACKEND_API_SECRETS || ""
+ console.log(`SECRETS: ${secretNames}`)
+ secretNames.split(",").forEach((secretName) => {
+ secrets[secretName] = Secret.fromSecretsManager(
+ secret.Secret.fromSecretNameV2(scope, secretName, `/doorway/${props.environment}/${secretName}`),
+ )
+ })
+
+ // Grant write access to the uploads buckets.
+ publicUploads.grantReadWrite(executionRole)
+ publicUploads.grantPut(executionRole)
+ secureUploads.grantReadWrite(executionRole)
+ secureUploads.grantPut(executionRole)
+ // Get the SES Email Information
+ const sesIdentity = EmailIdentity.fromEmailIdentityName(
+ scope,
+ "sesIdentity",
+ "housingbayarea2.org",
+ )
+ sesIdentity.grantSendEmail(executionRole)
+ // Add a bunch of random SES grants that grantSendEmail doesn't set up
+ const policy = new PolicyStatement({
+ actions: [
+ "ses:SendEmail",
+ "ses:SendRawEmail",
+ "ses:SendTemplatedEmail",
+ "ses:SendRawTemplatedEmail",
+ "ses:SendBulkTemplatedEmail",
+ "ses:UseConfiguration",
+ "ses:SendBulkEmail",
+ ],
+ resources: [
+ sesIdentity.emailIdentityArn,
+ `arn:aws:ses:${Aws.REGION}:${Aws.ACCOUNT_ID}:configuration-set/dway-config-set`,
+ `arn:aws:ses:${Aws.REGION}:${Aws.ACCOUNT_ID}:identity/*`,
+ ],
+ })
+ const appTierPrivateSGId = Fn.importValue(`doorway-app-sg-${props.environment}`)
+ const privateSG: ISecurityGroup = SecurityGroup.fromSecurityGroupId(
+ scope,
+ `appTierPrivateSG-${id}`,
+ appTierPrivateSGId,
+ )
+ const publicSGId = Fn.importValue(`doorway-public-sg-${props.environment}`)
+ const publicSG: ISecurityGroup = SecurityGroup.fromSecurityGroupId(
+ scope,
+ `publicSG-${id}`,
+ publicSGId,
+ )
+ const inboundPort = Number(process.env.BACKEND_API_PORT || 3100)
+ privateSG.addIngressRule(privateSG, new Port({
+ protocol: Protocol.TCP,
+ stringRepresentation: "inbound-backend",
+ fromPort: inboundPort,
+ toPort: inboundPort
+
+
+ }), "Allow internal traffic from web app servers")
+ executionRole.addToPolicy(policy)
+
+
+ this.service = new DoorwayService(scope, `doorway-api-service-${props.environment}`, {
+ ...props,
+ memory: Number(process.env.BACKEND_MEMORY || 4096),
+ cpu: Number(process.env.BACKEND_CPUS || 2),
+ instances: Number(process.env.BACKEND_INSTANCES || 3),
+ port: Number(process.env.BACKEND_API_PORT || 3100),
+ secrets: secrets,
+ environmentVariables: environmentVariables,
+ serviceConnectServer: true,
+ domainName: `backend.${props.environment}.housingbayarea.int`,
+ executionRole: executionRole,
+ publicUploads: publicUploads,
+ secureUploads: secureUploads,
+ environment: props.environment,
+ container: `doorway/backend:run-${gitHash}`,
+ securityGroup: privateSG,
+ serviceName: props.backendServiceName,
+ clusterName: props.clusterName,
+
+
+ }).service
+
+
+ }
+}
diff --git a/cdk/lib/doorway_environment/services/doorway-ecs-task.ts b/cdk/lib/doorway_environment/services/doorway-ecs-task.ts
new file mode 100644
index 00000000000..78ac62d16fe
--- /dev/null
+++ b/cdk/lib/doorway_environment/services/doorway-ecs-task.ts
@@ -0,0 +1,46 @@
+import { Aws } from "aws-cdk-lib";
+import { AppProtocol, Compatibility, ContainerImage, LogDrivers, NetworkMode, Protocol, TaskDefinition } from "aws-cdk-lib/aws-ecs";
+import { Construct } from "constructs";
+
+import { DoorwayServiceProps } from "../doorway-props";
+
+export class DoorwayEcsTask {
+ public task: TaskDefinition
+ constructor(scope: Construct, id: string, props: DoorwayServiceProps) {
+ this.task = new TaskDefinition(scope, `${id}-task`, {
+
+ compatibility: Compatibility.FARGATE,
+ executionRole: props.executionRole,
+ taskRole: props.executionRole,
+ networkMode: NetworkMode.AWS_VPC,
+ cpu: `${props.cpu * 1024}`,
+ memoryMiB: `${props.memory}`
+
+ })
+ this.task.addContainer(`${id}-container`, {
+ image: ContainerImage.fromRegistry(
+ `${Aws.ACCOUNT_ID}.dkr.ecr.${Aws.REGION}.amazonaws.com/${props.container}`,
+ ),
+ cpu: Number(props.cpu * 1024),
+ memoryLimitMiB: Number(props.memory),
+ essential: Boolean(true),
+ logging: LogDrivers.awsLogs({
+ streamPrefix: id,
+ logGroup: props.logGroup,
+ }),
+ secrets: props.secrets || {},
+ environment: props.environmentVariables,
+ entryPoint: [],
+ portMappings: [
+ {
+ name: `${id}-port-mapping`,
+ containerPort: Number(props.port),
+ protocol: Protocol.TCP,
+ appProtocol: AppProtocol.http,
+ hostPort: Number(props.port),
+ },
+ ],
+
+ })
+ }
+}
\ No newline at end of file
diff --git a/cdk/lib/doorway_environment/services/doorway-import-listings.ts b/cdk/lib/doorway_environment/services/doorway-import-listings.ts
new file mode 100644
index 00000000000..dca247a203a
--- /dev/null
+++ b/cdk/lib/doorway_environment/services/doorway-import-listings.ts
@@ -0,0 +1,139 @@
+/** @fileoverview Doorway Import Listings scheduled task configuration */
+import { Duration, Fn } from "aws-cdk-lib";
+import { ISecurityGroup, ISubnet, SecurityGroup, Subnet } from "aws-cdk-lib/aws-ec2";
+import { Cluster, Secret } from "aws-cdk-lib/aws-ecs";
+import { ManagedPolicy, PolicyStatement, Role, ServicePrincipal } from "aws-cdk-lib/aws-iam";
+import { Schedule, ScheduleExpression } from "aws-cdk-lib/aws-scheduler";
+import { EcsRunFargateTask } from "aws-cdk-lib/aws-scheduler-targets";
+import * as secret from "aws-cdk-lib/aws-secretsmanager";
+import { Construct } from "constructs";
+
+import { DoorwayProps } from "../doorway-props";
+import { DoorwayEcsTask } from "./doorway-ecs-task";
+
+/**
+ * Creates a new DoorwayImportListings construct.
+ *
+ * @param scope - The parent construct (typically a Stack or Stage)
+ * @param id - Unique identifier for this construct within the scope
+ * @param props - Configuration properties including VPC, environment, and cluster settings
+ * @param props.environment - Deployment environment (e.g., 'staging', 'production')
+ * @param props.vpc - VPC where the ECS task will run
+ * @param props.clusterName - Name of the existing ECS cluster to use
+ */
+export class DoorwayImportListings {
+ /**
+ *
+ * It sets up an EventBridge schedule that triggers the import listings ECS task every 30 minutes.
+ * Configured to run the task in private subnets with database access for importing
+ * housing listings from San Jose, San Mateo, and Alameda jurisdictions.
+ *
+ * @public
+ * @property {Schedule}
+ * @see {@link https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_scheduler.Schedule.html | AWS CDK Schedule}
+ * @see {@link https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_scheduler_targets.EcsRunFargateTask.html | EcsRunFargateTask}
+ */
+ public schedule: Schedule
+ constructor(scope: Construct, id: string, props: DoorwayProps) {
+ const executionRole = new Role(scope, `executionRole-${id}`, {
+ assumedBy: new ServicePrincipal("ecs-tasks.amazonaws.com"),
+ })
+ executionRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName("service-role/AmazonECSTaskExecutionRolePolicy"),
+ )
+ executionRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMReadOnlyAccess"),
+ )
+ executionRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName("AmazonRDSReadOnlyAccess"),
+ )
+ executionRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName("AmazonEC2ContainerRegistryReadOnly"),
+ )
+ props.logGroup.grantWrite(executionRole)
+ const dbSecretArn = Fn.importValue(`doorwayDBSecret-${props.environment}`)
+ const dbSecret = secret.Secret.fromSecretCompleteArn(scope, "dbSecret-import-listings", dbSecretArn)
+ dbSecret.grantRead(executionRole)
+ const secrets: { [key: string]: Secret } = {
+ PGUSER: Secret.fromSecretsManager(dbSecret, "username"),
+ PGPASSWORD: Secret.fromSecretsManager(dbSecret, "password"),
+ PGPORT: Secret.fromSecretsManager(dbSecret, "port"),
+ PGHOST: Secret.fromSecretsManager(dbSecret, "host"),
+ PGDATABASE: Secret.fromSecretsManager(dbSecret, "dbname"),
+ }
+ const appTierPrivateSGId = Fn.importValue(`doorway-app-sg-${props.environment}`)
+ const privateSG: ISecurityGroup = SecurityGroup.fromSecurityGroupId(
+ scope,
+ `appTierPrivateSG-${id}`,
+ appTierPrivateSGId,
+ )
+ const importListings = new DoorwayEcsTask(scope, `doorway-import-listings-${props.environment}`, {
+ ...props,
+ memory: 1024,
+ cpu: .5,
+ instances: 1,
+ port: 10246,
+ secrets: secrets,
+ environmentVariables: {
+ JURISDICTION_INCLUDE_LIST: "San Jose,San Mateo,Alameda",
+ EXTERNAL_API_BASE: "https://proxy.housingbayarea.org",
+ LISTING_VIEW: "base"
+ },
+ serviceConnectServer: false,
+ domainName: "",
+ executionRole: executionRole,
+ container: `doorway/import-listings:run-candidate`,
+ securityGroup: privateSG,
+ serviceName: `doorway-import-listings-${props.environment}`,
+ clusterName: props.clusterName,
+ })
+ const cluster = Cluster.fromClusterAttributes(scope, `import-listings-cluster-${props.environment}`, {
+ clusterName: props.clusterName,
+ vpc: props.vpc
+ })
+ // Get the subnets
+ const appSubnetIds: string[] = []
+ appSubnetIds.push(Fn.importValue(`doorway-app-subnet-1-${props.environment}`))
+ appSubnetIds.push(Fn.importValue(`doorway-app-subnet-2-${props.environment}`))
+ const appsubnets: ISubnet[] = []
+ appSubnetIds.forEach((id) => {
+ appsubnets.push(Subnet.fromSubnetId(scope, id, id))
+ })
+ const schedulerRole = new Role(scope, `scheduler-role-${id}`, {
+ assumedBy: new ServicePrincipal("scheduler.amazonaws.com"),
+ });
+
+ schedulerRole.addToPolicy(new PolicyStatement({
+ actions: [
+ "ecs:RunTask",
+ "ecs:DescribeTaskDefinition",
+ ],
+ resources: ["*"]
+ }));
+
+ // Allow passing the execution role to ECS
+ schedulerRole.addToPolicy(new PolicyStatement({
+ actions: ["iam:PassRole"],
+ resources: [executionRole.roleArn]
+ }));
+
+ const target = new EcsRunFargateTask(cluster, {
+ taskDefinition: importListings.task,
+ assignPublicIp: false,
+ securityGroups: [privateSG],
+ vpcSubnets: {
+ subnets: appsubnets,
+ },
+ role: schedulerRole,
+
+ })
+
+ this.schedule = new Schedule(scope, `import-listings-schedule-${props.environment}`, {
+ target: target,
+
+
+ schedule: ScheduleExpression.rate(Duration.minutes(30))
+ })
+
+ }
+}
\ No newline at end of file
diff --git a/cdk/lib/doorway_environment/services/doorway-partners-site.ts b/cdk/lib/doorway_environment/services/doorway-partners-site.ts
new file mode 100644
index 00000000000..d47d9ae10be
--- /dev/null
+++ b/cdk/lib/doorway_environment/services/doorway-partners-site.ts
@@ -0,0 +1,99 @@
+import { Fn } from "aws-cdk-lib"
+import { ISecurityGroup, Port, Protocol, SecurityGroup } from "aws-cdk-lib/aws-ec2"
+import { FargateService, Secret } from "aws-cdk-lib/aws-ecs"
+import { Role, ServicePrincipal } from "aws-cdk-lib/aws-iam"
+import { Bucket } from "aws-cdk-lib/aws-s3"
+import * as secret from "aws-cdk-lib/aws-secretsmanager"
+import { Construct } from "constructs"
+
+import { DoorwayProps } from "../doorway-props"
+import { DoorwayService } from "./doorway_service"
+
+/**
+ * Builds the Doorway Partners Site
+ * @class
+ * @see DoorwayService
+ */
+export class DoorwayPartnersSite {
+ public service: FargateService
+ constructor(scope: Construct, id: string, props: DoorwayProps) {
+ const gitHash = process.env.CODEBUILD_RESOLVED_SOURCE_VERSION?.substring(0, 8) || "candidate"
+ const executionRole = new Role(scope, `executionRole-${id}`, {
+ assumedBy: new ServicePrincipal("ecs-tasks.amazonaws.com"),
+ })
+
+ const publicUploads = Bucket.fromBucketArn(
+ scope,
+ `partnersUploadsBucket-${id}`,
+ Fn.importValue(`doorway-public-uploads-${props.environment}`),
+ )
+ const secureUploads = Bucket.fromBucketArn(
+ scope,
+ `secureUploadsBucket-${id}`,
+ Fn.importValue(`doorway-secure-uploads-${props.environment}`),
+ )
+ const port = Number(process.env.PARTNERS_PORTAL_PORT || "3000")
+ const appTierPrivateSGId = Fn.importValue(`doorway-app-sg-${props.environment}`)
+ const privateSG: ISecurityGroup = SecurityGroup.fromSecurityGroupId(
+ scope,
+ `appTierPrivateSG-${id}`,
+ appTierPrivateSGId,
+ )
+ const publicSGId = Fn.importValue(`doorway-public-sg-${props.environment}`)
+ const publicSG: ISecurityGroup = SecurityGroup.fromSecurityGroupId(
+ scope,
+ `publicSG-${id}`,
+ publicSGId,
+ )
+ const inboundPort = Number(process.env.BACKEND_API_PORT || 3000)
+ privateSG.addIngressRule(publicSG, new Port({
+ protocol: Protocol.TCP,
+ stringRepresentation: "inbound-backend",
+ fromPort: inboundPort,
+ toPort: inboundPort
+ }), "Allow internal traffic from web app servers")
+ const environmentVariables: { [key: string]: string } = {
+ BACKEND_API_BASE:
+ process.env.BACKEND_API_BASE || `http://backend.${props.environment}.housingbayarea.int`,
+ FEATURE_LISTINGS_APPROVAL:
+ process.env.FEATURE_LISTINGS_APPROVAL || "TRUE",
+ LISTINGS_QUERY: process.env.LISTINGS_QUERY || "/listings",
+ LOG_LEVEL: process.env.LOG_LEVEL || "info",
+ NEXTJS_PORT: String(port),
+ MAPBOX_TOKEN: process.env.MAPBOX_TOKEN || "",
+ NODE_ENV: process.env.NODE_ENV || "development",
+ SHOW_DUPLICATES: process.env.SHOW_DUPLICATES || "FALSE",
+ SHOW_LM_LINKS: process.env.SHOW_LM_LINKS || "TRUE",
+ USE_SECURE_DOWNLOAD_PATHWAY: process.env.USE_SECURE_DOWNLOAD_PATHWAY || "TRUE",
+ }
+ const secretNames = process.env.PARTNERS_PORTAL_SECRETS != undefined ? process.env.PARTNERS_PORTAL_SECRETS.split(",") : []
+ const secrets: { [key: string]: Secret } = {}
+ secretNames.forEach((secretName) => {
+ secrets[secretName] = Secret.fromSecretsManager(
+ secret.Secret.fromSecretNameV2(scope, `${secretName}-${id}`, `/doorway/${props.environment}/${secretName}`),
+ )
+ })
+ this.service = new DoorwayService(scope, `${id}-service`, {
+ ...props,
+ memory: Number(process.env.PARTNERS_PORTAL_MEMORY || 4096),
+ cpu: Number(process.env.PARTNERS_PORTAL_CPUS || 2),
+ instances: Number(process.env.PARTNERS_PORTAL_INSTANCES || 3),
+ port: Number(process.env.PARTNERS_PORTAL_PORT || 3000),
+ secrets: secrets,
+ environmentVariables: environmentVariables,
+ serviceConnectServer: false,
+ domainName: process.env.PARTNERS_PORTAL_DOMAIN || `partners.${props.environment}.housingbayarea.mtc.ca.gov`,
+ executionRole: executionRole,
+ publicUploads: publicUploads,
+ secureUploads: secureUploads,
+ logGroup: props.logGroup,
+ apiTargetDomainName: process.env.BACKEND_API_BASE || `http://backend.${props.environment}.housingbayarea.int`,
+ apiTargetPort: Number(process.env.BACKEND_API_PORT || 3000),
+ container: `doorway/partners:run-${props.environment}-${gitHash}`,
+ securityGroup: privateSG,
+ serviceName: props.partnersServiceName,
+ clusterName: props.clusterName,
+ }).service
+
+ }
+}
diff --git a/cdk/lib/doorway_environment/services/doorway-public-site.ts b/cdk/lib/doorway_environment/services/doorway-public-site.ts
new file mode 100644
index 00000000000..1aa6d3542ad
--- /dev/null
+++ b/cdk/lib/doorway_environment/services/doorway-public-site.ts
@@ -0,0 +1,103 @@
+import { Fn } from "aws-cdk-lib"
+import { ISecurityGroup, Port, Protocol, SecurityGroup } from "aws-cdk-lib/aws-ec2"
+import { FargateService, Secret } from "aws-cdk-lib/aws-ecs"
+import { Role, ServicePrincipal } from "aws-cdk-lib/aws-iam"
+import { Bucket } from "aws-cdk-lib/aws-s3"
+import * as secret from "aws-cdk-lib/aws-secretsmanager"
+import { Construct } from "constructs"
+
+import { DoorwayProps } from "../doorway-props"
+import { DoorwayService } from "./doorway_service"
+
+/**
+ * Builds the Doorway Public Site
+ * @class
+ * @see DoorwayService
+ */
+export class DoorwayPublicSite {
+ public service: FargateService
+ constructor(scope: Construct, id: string, props: DoorwayProps) {
+ const gitHash = process.env.CODEBUILD_RESOLVED_SOURCE_VERSION?.substring(0, 8) || "candidate"
+ const executionRole = new Role(scope, `executionRole-${id}`, {
+ assumedBy: new ServicePrincipal("ecs-tasks.amazonaws.com"),
+ })
+ const publicUploads = Bucket.fromBucketName(
+ scope,
+ `publicUploadsBucket-${id}`,
+
+ `doorway-public-uploads-${props.environment}`,
+ )
+ const secureUploads = Bucket.fromBucketArn(
+ scope,
+ `secureUploadsBucket-${id}`,
+ Fn.importValue(`doorway-secure-uploads-${props.environment}`),
+ )
+ const port = Number(process.env.PUBLIC_PORTAL_PORT || "3000")
+ const appTierPrivateSGId = Fn.importValue(`doorway-app-sg-${props.environment}`)
+ const privateSG: ISecurityGroup = SecurityGroup.fromSecurityGroupId(
+ scope,
+ `appTierPrivateSG-${id}`,
+ appTierPrivateSGId,
+ )
+ const publicSGId = Fn.importValue(`doorway-public-sg-${props.environment}`)
+ const publicSG: ISecurityGroup = SecurityGroup.fromSecurityGroupId(
+ scope,
+ `publicSG-${id}`,
+ publicSGId,
+ )
+ const inboundPort = Number(process.env.BACKEND_API_PORT || 3000)
+ privateSG.addIngressRule(publicSG, new Port({
+ protocol: Protocol.TCP,
+ stringRepresentation: "inbound-backend",
+ fromPort: inboundPort,
+ toPort: inboundPort
+ }), "Allow internal traffic from web app servers")
+ const environmentVariables: { [key: string]: string } = {
+ BACKEND_API_BASE:
+ process.env.BACKEND_API_BASE || `http://backend.${props.environment}.housingbayarea.int`,
+ BLOOM_API_BASE: process.env.BLOOM_API_BASE || "https://proxy.housingbayarea.org",
+ CACHE_REVALIDATE: process.env.CACHE_REVALIDATE || "60",
+ GTM_KEY: process.env.GTM_KEY || "GTM-KF22FJP",
+ IDLE_TIMEOUT: process.env.IDLE_TIMEOUT || "5",
+ JURISDICTION_NAME: process.env.JURISDICTION_NAME || "Bay Area",
+ LANGUAGES: process.env.LANGUAGES || "en,es,zh,vi,tl",
+ LISTINGS_QUERY: process.env.LISTINGS_QUERY || "/listings",
+ NEXTJS_PORT: String(port),
+ NODE_ENV: process.env.NODE_ENV || "development",
+ NOTIFICATIONS_SIGNUP_URL:
+ process.env.NOTIFICATIONS_SIGNUP_URL ||
+ "https://public.govdelivery.com/accounts/CAMTC/signup/36832",
+ SHOW_ALL_MAP_PINS: process.env.SHOW_ALL_MAP_PINS || "true",
+ SHOW_PROFESSIONAL_PARTNERS: process.env.SHOW_PROFESSIONAL_PARTNERS || "true",
+ }
+ const secretNames = (process.env.PUBLIC_PORTAL_SECRETS || "").split(",")
+ const secrets: { [key: string]: Secret } = {}
+ secretNames.forEach((secretName) => {
+ secrets[secretName] = Secret.fromSecretsManager(
+ secret.Secret.fromSecretNameV2(scope, `${secretName}-${id}`, `/doorway/${props.environment}/${secretName}`),
+ )
+ })
+ this.service = new DoorwayService(scope, `${id}-service`, {
+ ...props,
+ memory: Number(process.env.PUBLIC_PORTAL_MEMORY || 4096),
+ cpu: Number(process.env.PUBLIC_PORTAL_CPUS || 2),
+ instances: Number(process.env.PUBLIC_PORTAL_INSTANCES || 3),
+ port: Number(process.env.PUBLIC_PORTAL_PORT || 3000),
+ secrets: secrets,
+ environmentVariables: environmentVariables,
+ serviceConnectServer: false,
+ domainName: process.env.PUBLIC_PORTAL_DOMAIN || `${props.environment}.housingbayarea.mtc.ca.gov`,
+ executionRole: executionRole,
+ publicUploads: publicUploads,
+ secureUploads: secureUploads,
+ logGroup: props.logGroup,
+ apiTargetDomainName: process.env.BACKEND_API_BASE || `http://backend.${props.environment}.housingbayarea.int`,
+ apiTargetPort: Number(process.env.BACKEND_API_PORT || 3000),
+ container: `doorway/public:run-${props.environment}-${gitHash}`,
+ securityGroup: privateSG,
+ serviceName: props.publicServiceName,
+ clusterName: props.clusterName,
+ }).service
+
+ }
+}
diff --git a/cdk/lib/doorway_environment/services/doorway-s3-stack.ts b/cdk/lib/doorway_environment/services/doorway-s3-stack.ts
new file mode 100644
index 00000000000..af2ffd8c0ae
--- /dev/null
+++ b/cdk/lib/doorway_environment/services/doorway-s3-stack.ts
@@ -0,0 +1,58 @@
+import { CfnOutput, Stack } from "aws-cdk-lib";
+import { Bucket, HttpMethods } from "aws-cdk-lib/aws-s3";
+import { Construct } from "constructs";
+
+import { DoorwayProps } from "../doorway-props";
+
+export class DoorwayS3Stack extends Stack {
+ constructor(scope: Construct, id: string, props: DoorwayProps) {
+ super(scope, id);
+
+ const secureUploadsBucket = new Bucket(this, "secureUploadsBucket", {
+ bucketName: `doorway-secure-uploads-${props.environment}`,
+ blockPublicAccess: {
+ blockPublicAcls: true,
+ blockPublicPolicy: true,
+ ignorePublicAcls: true,
+ restrictPublicBuckets: true,
+ },
+ enforceSSL: true,
+ });
+
+
+ // Output the bucket name
+ new CfnOutput(this, "SecureBucketName", {
+ exportName: `doorway-secure-uploads-${props.environment}`,
+ value: secureUploadsBucket.bucketArn,
+ description: `Doorway Secure Uploads Bucket ARN for the ${props.environment} environment`,
+ });
+ const publicUploadsBucket = new Bucket(this, "publicUploadsBucket", {
+ bucketName: `doorway-public-uploads-${props.environment}`,
+ blockPublicAccess: {
+ blockPublicAcls: false,
+ blockPublicPolicy: false,
+ ignorePublicAcls: false,
+ restrictPublicBuckets: false,
+ },
+ enforceSSL: true,
+ });
+ publicUploadsBucket.grantPublicAccess();
+ publicUploadsBucket.addCorsRule({
+ allowedMethods: [
+ HttpMethods.GET
+ ],
+ allowedOrigins: [
+ `https://${process.env.PUBLIC_PORTAL_DOMAIN || `${props.environment}.housingbayarea.mtc.ca.gov`}`,
+ ],
+ allowedHeaders: ["*"],
+ exposedHeaders: [],
+ })
+
+ // Output the bucket name
+ new CfnOutput(this, "PublicBucketName", {
+ exportName: `doorway-public-uploads-${props.environment}`,
+ value: publicUploadsBucket.bucketArn,
+ description: `Doorway Public Uploads Bucket ARN for the ${props.environment} environment`,
+ });
+ }
+}
diff --git a/cdk/lib/doorway_environment/services/doorway-secrets-stack.ts b/cdk/lib/doorway_environment/services/doorway-secrets-stack.ts
new file mode 100644
index 00000000000..4a22d4ee399
--- /dev/null
+++ b/cdk/lib/doorway_environment/services/doorway-secrets-stack.ts
@@ -0,0 +1,62 @@
+import { SecretValue } from "aws-cdk-lib";
+import { Secret } from "aws-cdk-lib/aws-secretsmanager";
+import { Construct } from "constructs";
+
+import { DoorwayProps } from "../doorway-props";
+
+export class DoorwaySecrets {
+ constructor(scope: Construct, id: string, props: DoorwayProps) {
+
+ new Secret(scope, "googleId", {
+ secretName: `/doorway/${props.environment}/GOOGLE_API_ID`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+
+ new Secret(scope, "googleEmail", {
+ secretName: `/doorway/${props.environment}/GOOGLE_API_EMAIL`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+
+ new Secret(scope, "googleKey", {
+ secretName: `/doorway/${props.environment}/GOOGLE_API_KEY`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+ new Secret(scope, "googleMapsKey", {
+ secretName: `/doorway/${props.environment}/GOOGLE_MAPS_API_KEY`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+ new Secret(scope, "googleMapsMapId", {
+ secretName: `/doorway/${props.environment}/GOOGLE_MAPS_MAP_ID`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+
+ new Secret(scope, "govDeliveryURL", {
+ secretName: `/doorway/${props.environment}/GOVDELIVERY_API_URL`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+
+ new Secret(scope, "govDeliveryPassword", {
+ secretName: `/doorway/${props.environment}/GOVDELIVERY_PASSWORD`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+
+ new Secret(scope, "govDeliveryUsername", {
+ secretName: `/doorway/${props.environment}/GOVDELIVERY_USERNAME`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+ new Secret(scope, "emailApiKey", {
+ secretName: `/doorway/${props.environment}/EMAIL_API_KEY`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+
+ new Secret(scope, "cloudinaryKey", {
+ secretName: `/doorway/${props.environment}/CLOUDINARY_KEY`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+
+ new Secret(scope, "cloudinarySecret", {
+ secretName: `/doorway/${props.environment}/CLOUDINARY_SECRET`,
+ secretStringValue: SecretValue.unsafePlainText("changeme"),
+ });
+ }
+}
\ No newline at end of file
diff --git a/cdk/lib/doorway_environment/services/doorway_service.ts b/cdk/lib/doorway_environment/services/doorway_service.ts
new file mode 100644
index 00000000000..a4d2d37748a
--- /dev/null
+++ b/cdk/lib/doorway_environment/services/doorway_service.ts
@@ -0,0 +1,92 @@
+import * as cdk from "aws-cdk-lib"
+import { Fn } from "aws-cdk-lib"
+import { ISubnet, Subnet } from "aws-cdk-lib/aws-ec2"
+import { Cluster, FargateService } from "aws-cdk-lib/aws-ecs"
+//import * as ecs from "aws-cdk-lib/aws-ecs";
+import { ManagedPolicy } from "aws-cdk-lib/aws-iam"
+import { Construct } from "constructs"
+
+import { DoorwayServiceProps } from "../doorway-props"
+import { RestartServicesLambda } from "../utility_lambdas/restart-services-lambda"
+import { DoorwayEcsTask } from "./doorway-ecs-task"
+
+/**
+ * @class
+ * Base Class for Doorway Services (API, Public, Partners, etc)
+ * This really shouldn't change all that much. Most configuration settings are in the classes that use this.
+ * @see DoorwayBackendService
+ * @see DoorwayPublicSite
+ * @see DoorwayPartnersSite
+ * @see DoorwayImportListings
+ */
+export class DoorwayService {
+ public service: FargateService
+
+ constructor(scope: Construct, id: string, props: DoorwayServiceProps) {
+ // Initial Execution Role Setup
+ // Create the execution role for the doorway API service
+ props.executionRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName("service-role/AmazonECSTaskExecutionRolePolicy"),
+ )
+ props.executionRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMReadOnlyAccess"),
+ )
+ props.executionRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName("AmazonRDSReadOnlyAccess"),
+ )
+ props.executionRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName("AmazonEC2ContainerRegistryReadOnly"),
+ )
+
+ // Get the subnets
+ const appSubnetIds: string[] = []
+ appSubnetIds.push(cdk.Fn.importValue(`doorway-app-subnet-1-${props.environment}`))
+ appSubnetIds.push(cdk.Fn.importValue(`doorway-app-subnet-2-${props.environment}`))
+ const appsubnets: ISubnet[] = []
+ appSubnetIds.forEach((id) => {
+ appsubnets.push(Subnet.fromSubnetId(scope, id, id))
+ })
+
+ // Set up the ECS Task
+ const task = new DoorwayEcsTask(scope, id, props).task
+ // Set up the fargate service
+ this.service = new FargateService(scope, `${id}-fargate-service`, {
+ taskDefinition: task,
+ serviceName: props.serviceName,
+ circuitBreaker: {
+ enable: true,
+ rollback: true,
+ },
+ cluster: Cluster.fromClusterAttributes(scope, `ecsCluster-${id}`, {
+ clusterName: Fn.importValue(`doorway-ecs-cluster-${props.environment}`),
+ vpc: props.vpc,
+ }),
+ vpcSubnets: {
+ subnets: appsubnets,
+ },
+ securityGroups: [props.securityGroup],
+ desiredCount: props.instances,
+ })
+ // If the service has secrets associated with it,
+ // create a lambda to restart the service when the secrets are updated
+ const secrets = Object.keys(props.secrets)
+ if (Object.keys(props.secrets).length > 0) {
+ new RestartServicesLambda(scope, `restart-${id}-${props.environment}`, {
+ service: this.service,
+ secrets: props.secrets,
+ environment: props.environment,
+ })
+ }
+ props.logGroup.grantWrite(props.executionRole)
+ this.service.autoScaleTaskCount({
+ minCapacity: 3,
+ maxCapacity: 10,
+
+ }).scaleOnCpuUtilization("CpuScaling", {
+ targetUtilizationPercent: 50,
+ })
+
+
+ }
+
+}
diff --git a/cdk/lib/doorway_environment/utility_lambdas/lambda-base-class.ts b/cdk/lib/doorway_environment/utility_lambdas/lambda-base-class.ts
new file mode 100644
index 00000000000..e18a24cf00c
--- /dev/null
+++ b/cdk/lib/doorway_environment/utility_lambdas/lambda-base-class.ts
@@ -0,0 +1,67 @@
+import { Duration, Size } from 'aws-cdk-lib';
+import { Effect, ManagedPolicy, PolicyStatement, Role, ServicePrincipal } from 'aws-cdk-lib/aws-iam';
+import { Function, Runtime } from 'aws-cdk-lib/aws-lambda';
+import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';
+import { Secret } from 'aws-cdk-lib/aws-secretsmanager';
+import { Construct } from 'constructs';
+
+import { DoorwayLambdaProps } from '../doorway-props';
+
+export class DoorwayLambdaBaseClass extends Construct {
+ lambdaFunction: Function;
+ lambdaRole: Role;
+ constructor(scope: Construct, id: string, props: DoorwayLambdaProps) {
+ super(scope, id);
+ const environment = props.environment;
+
+ this.lambdaRole = new Role(this, `${props.name}-${environment}`, {
+ roleName: `${props.name}-${environment}`,
+ assumedBy: new ServicePrincipal('lambda.amazonaws.com'),
+ });
+ this.lambdaRole.addManagedPolicy(
+ ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')
+ );
+ this.lambdaRole.addToPolicy(
+ new PolicyStatement({
+ actions: ['ec2:*'],
+ effect: Effect.ALLOW,
+ resources: ['*'],
+ })
+ );
+ this.lambdaRole.addToPolicy(
+ new PolicyStatement({
+ actions: ['secretsmanager:GetSecretValue'],
+ effect: Effect.ALLOW,
+ resources: ['*'],
+ })
+ );
+
+
+ this.lambdaFunction = new NodejsFunction(this, 'function', {
+ runtime: Runtime.NODEJS_LATEST,
+ role: this.lambdaRole,
+ handler: 'handler',
+ entry: props.handler,
+ timeout: Duration.minutes(props.timeoutInMinutes),
+ environment: props.environmentVariables,
+ bundling: props.bundling,
+ memorySize: props.memory == undefined ? 128 : props.memory,
+ ephemeralStorageSize: Size.mebibytes(props.storage == undefined ? 512 : props.storage),
+ functionName: `${props.name}-${environment}`,
+ description: `${props.name}-${environment}`,
+ });
+ const dwSecret = Secret.fromSecretNameV2(
+ this,
+ `DWSecret-${environment}`,
+ `doorway-lambdas-svcaccount/${environment}`
+ );
+ dwSecret.grantRead(this.lambdaRole);
+ this.lambdaRole.addToPrincipalPolicy(
+ new PolicyStatement({
+ actions: ['secretsmanager:GetSecretValue'],
+ effect: Effect.ALLOW,
+ resources: [dwSecret.secretArn],
+ })
+ );
+ }
+}
diff --git a/cdk/lib/doorway_environment/utility_lambdas/restart-services-lambda.ts b/cdk/lib/doorway_environment/utility_lambdas/restart-services-lambda.ts
new file mode 100644
index 00000000000..c2ba4dbb932
--- /dev/null
+++ b/cdk/lib/doorway_environment/utility_lambdas/restart-services-lambda.ts
@@ -0,0 +1,78 @@
+import { Rule } from "aws-cdk-lib/aws-events";
+import { LambdaFunction } from "aws-cdk-lib/aws-events-targets";
+import { Effect, PolicyStatement, ServicePrincipal } from "aws-cdk-lib/aws-iam";
+import { Construct } from "constructs";
+
+import { DoorwayServiceMonitorLambdaProps } from "../doorway-props";
+import { DoorwayLambdaBaseClass } from "./lambda-base-class";
+
+export interface ServiceRestartDetail {
+ eventSource: string;
+ eventName: string;
+ requestParameters: {
+ secretId: string;
+ clientRequestToken: string;
+ };
+ responseElements: null;
+}
+
+/** this lambda will restart an ecs service whenever the secrets change for that service. This allows the environment variables running in the containers to get the new values. */
+export class RestartServicesLambda {
+ constructor(scope: Construct, id: string, props: DoorwayServiceMonitorLambdaProps) {
+
+ let secretArns: string[] = [];
+
+ for (const [key, secret] of Object.entries(props.secrets)) {
+ // Remove field names from secret ARN (everything after the 6-character suffix)
+ const baseArn = secret.arn.replace(/(-[A-Za-z0-9]{6}):.*$/, '$1');
+ if (!secretArns.includes(baseArn)) {
+ secretArns.push(baseArn);
+ }
+
+ }
+ console.log("All secret ARNs:", secretArns);
+
+ const dwLambda = new DoorwayLambdaBaseClass(scope, `${id}-restart-lambda`, {
+ name: `${id}-function`,
+ environment: props.environment,
+ environmentVariables: {
+ SERVICE_NAME: props.service.serviceName,
+ CLUSTER_NAME: props.service.cluster.clusterName,
+ },
+ timeoutInMinutes: 15,
+ memory: 1024,
+ storage: 512,
+ handler: "lib/doorway_environment/utility_lambdas/restart-services.handler.ts",
+ bundling: {}
+ })
+ dwLambda.lambdaRole.addToPolicy(new PolicyStatement({
+ actions: ["ecs:UpdateService", "ecs:DescribeServices"],
+ resources: [props.service.serviceArn],
+ effect: Effect.ALLOW,
+ }));
+ dwLambda.lambdaRole.assumeRolePolicy!.addStatements(new PolicyStatement({
+ actions: ["sts:AssumeRole"],
+ effect: Effect.ALLOW,
+ principals: [new ServicePrincipal("events.amazonaws.com")]
+ }))
+ dwLambda.lambdaFunction.grantInvoke(new ServicePrincipal("events.amazonaws.com"));
+
+ const secretRule = new Rule(scope, `${id}-secret-change-rule`, {
+ role: dwLambda.lambdaRole,
+ enabled: true,
+ description: `Rule to trigger a restart of the ${props.service.serviceName} service when a secret is changed`,
+ eventPattern: {
+ "source": ["aws.secretsmanager"],
+ "detailType": ["AWS API Call via CloudTrail"],
+ "detail": {
+ "eventSource": ["secretsmanager.amazonaws.com"],
+ "eventName": ["PutSecretValue"],
+ "requestParameters": {
+ "secretId": secretArns.map(arn => ({ "prefix": arn }))
+ }
+ }
+ }
+ });
+ secretRule.addTarget(new LambdaFunction(dwLambda.lambdaFunction));
+ }
+}
\ No newline at end of file
diff --git a/cdk/lib/doorway_environment/utility_lambdas/restart-services.handler.ts b/cdk/lib/doorway_environment/utility_lambdas/restart-services.handler.ts
new file mode 100644
index 00000000000..7f46d880846
--- /dev/null
+++ b/cdk/lib/doorway_environment/utility_lambdas/restart-services.handler.ts
@@ -0,0 +1,33 @@
+import { ECSClient, UpdateServiceCommand } from "@aws-sdk/client-ecs";
+import { EventBridgeEvent } from "aws-lambda";
+
+import { ServiceRestartDetail } from "./restart-services-lambda";
+
+export const handler = async function (event: EventBridgeEvent) {
+ const serviceName = process.env.SERVICE_NAME;
+ const cluster = process.env.CLUSTER_NAME;
+ const ecsClient = new ECSClient({ region: process.env.AWS_REGION })
+ const restart = new UpdateServiceCommand(
+ {
+ service: serviceName,
+ forceNewDeployment: true,
+ cluster: cluster,
+ }
+ )
+ try {
+ const response = await ecsClient.send(restart);
+ console.log("Service updated successfully:", response.service?.serviceArn);
+
+ return {
+ statusCode: 200,
+ body: JSON.stringify({ message: "Service is restarting" }),
+ };
+ } catch (error) {
+ console.error("Error updating service:", error);
+ return {
+ statusCode: 500,
+ body: JSON.stringify({ message: "Service Restart Failed!" }),
+ };
+ }
+
+}
\ No newline at end of file
diff --git a/cdk/package.json b/cdk/package.json
new file mode 100644
index 00000000000..5219ab92965
--- /dev/null
+++ b/cdk/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "doorway-cdk",
+ "version": "0.1.0",
+ "bin": {
+ "cdk": "bin/doorway-cdk.ts"
+ },
+ "scripts": {
+ "build": "tsc",
+ "watch": "tsc -w",
+ "test": "jest",
+ "cdk": "cdk",
+ "jsdoc": "jsdoc -c jsdoc.json"
+ },
+ "devDependencies": {
+ "@types/jest": "^29.5.14",
+ "@types/node": "22.7.9",
+ "aws-cdk": "2.1024.0",
+ "better-docs": "^2.7.3",
+ "jest": "^29.7.0",
+ "jsdoc": "^4.0.4",
+ "jsdoc-plugin-typescript": "^3.2.0",
+ "ts-jest": "^29.2.5",
+ "ts-node": "^10.9.2",
+ "typescript": "~5.6.3"
+ },
+ "dependencies": {
+ "@aws-sdk/client-ecs": "^3.873.0",
+ "@aws-sdk/client-lambda": "^3.876.0",
+ "@types/aws-lambda": "^8.10.152",
+ "aws-cdk-lib": "2.208.0",
+ "constructs": "^10.0.0",
+ "dotenv": "^17.2.1"
+ }
+}
diff --git a/cdk/prod.env b/cdk/prod.env
new file mode 100644
index 00000000000..b673b8a1e2a
--- /dev/null
+++ b/cdk/prod.env
@@ -0,0 +1,35 @@
+MAINTENANCE_WINDOW=2024-03-26 18:00 -08:00,2024-04-25 18:00 -08:00
+DEST_REPO_NAMESPACE=doorway
+CACHE_REVALIDATE=60
+LANGUAGES=en,es,zh,vi,tl
+FEATURE_LISTINGS_APPROVAL=TRUE
+
+ECR_ACCOUNT_ID=364076391763
+ECR_NAMESPACE=doorway
+ECR_REGION=us-west-2
+CORS_ORIGINS=https://prod2.housingbayarea.mtc.ca.gov, https://partners.prod2.housingbayarea.mtc.ca.gov
+
+USE_SECURE_DOWNLOAD_PATHWAY=TRUE
+GTM_KEY=GTM-KF22FJP
+SOURCE_REPO_NAMESPACE=doorway
+IDLE_TIMEOUT=5
+CLOUDINARY_CLOUD_NAME=exygy
+APP_SECRET=""
+
+PUBLIC_PORTAL_PORT=3000
+PUBLIC_PORTAL_DOMAIN=prod2.housingbayarea.mtc.ca.gov
+PUBLIC_PORTAL_SECRETS=GOOGLE_MAPS_MAP_ID,GOOGLE_MAPS_API_KEY
+DISABLE_CORS=FALSE
+SAME_SITE=true
+HTTPS_OFF=true
+
+
+PARTNERS_PORTAL_PORT=3200
+PARTNERS_PORTAL_DOMAIN=partners.prod2.housingbayarea.mtc.ca.gov
+BACKEND_API_DOMAIN=backend.prod2.housingbayarea.int
+BACKEND_API_BASE=http://backend.prod2.housingbayarea.int
+BACKEND_API_PORT=3100
+BACKEND_API_SECRETS=CLOUDINARY_KEY,CLOUDINARY_SECRET,EMAIL_API_KEY,GOOGLE_API_ID,GOOGLE_API_KEY,GOOGLE_MAPS_MAP_ID,GOOGLE_MAPS_API_KEY,GOVDELIVERY_PASSWORD,GOVDELIVERY_USERNAME,GOVDELIVERY_API_URL
+
+LOG_LEVEL=info
+
diff --git a/cdk/staging.env b/cdk/staging.env
new file mode 100644
index 00000000000..12c05e77ae6
--- /dev/null
+++ b/cdk/staging.env
@@ -0,0 +1,35 @@
+MAINTENANCE_WINDOW=2024-03-26 18:00 -08:00,2024-04-25 18:00 -08:00
+DEST_REPO_NAMESPACE=doorway
+CACHE_REVALIDATE=60
+LANGUAGES=en,es,zh,vi,tl
+FEATURE_LISTINGS_APPROVAL=TRUE
+
+ECR_ACCOUNT_ID=364076391763
+ECR_NAMESPACE=doorway
+ECR_REGION=us-west-2
+CORS_ORIGINS=https://staging2.housingbayarea.mtc.ca.gov, https://partners.staging2.housingbayarea.mtc.ca.gov
+
+USE_SECURE_DOWNLOAD_PATHWAY=TRUE
+GTM_KEY=GTM-KF22FJP
+SOURCE_REPO_NAMESPACE=doorway
+IDLE_TIMEOUT=5
+CLOUDINARY_CLOUD_NAME=exygy
+APP_SECRET=""
+
+PUBLIC_PORTAL_PORT=3000
+PUBLIC_PORTAL_DOMAIN=staging2.housingbayarea.mtc.ca.gov
+PUBLIC_PORTAL_SECRETS=GOOGLE_MAPS_MAP_ID,GOOGLE_MAPS_API_KEY
+DISABLE_CORS=FALSE
+SAME_SITE=true
+HTTPS_OFF=true
+
+
+PARTNERS_PORTAL_PORT=3200
+PARTNERS_PORTAL_DOMAIN=partners.staging2.housingbayarea.mtc.ca.gov
+BACKEND_API_DOMAIN=backend.staging2.housingbayarea.int
+BACKEND_API_BASE=http://backend.staging2.housingbayarea.int
+BACKEND_API_PORT=3100
+BACKEND_API_SECRETS=CLOUDINARY_KEY,CLOUDINARY_SECRET,EMAIL_API_KEY,GOOGLE_API_ID,GOOGLE_API_KEY,GOOGLE_MAPS_MAP_ID,GOOGLE_MAPS_API_KEY,GOVDELIVERY_PASSWORD,GOVDELIVERY_USERNAME,GOVDELIVERY_API_URL
+
+LOG_LEVEL=info
+
diff --git a/cdk/test/cdk.test.ts b/cdk/test/cdk.test.ts
new file mode 100644
index 00000000000..bd53ea16aae
--- /dev/null
+++ b/cdk/test/cdk.test.ts
@@ -0,0 +1,16 @@
+// import * as cdk from 'aws-cdk-lib';
+// import { Template } from 'aws-cdk-lib/assertions';
+// import * as Cdk from '../lib/cdk-stack';
+
+// example test. To run these tests, uncomment this file along with the
+// example resource in lib/cdk-stack.ts
+test("SQS Queue Created", () => {
+ // const app = new cdk.App();
+ // // WHEN
+ // const stack = new Cdk.CdkStack(app, 'MyTestStack');
+ // // THEN
+ // const template = Template.fromStack(stack);
+ // template.hasResourceProperties('AWS::SQS::Queue', {
+ // VisibilityTimeout: 300
+ // });
+})
diff --git a/cdk/tsconfig.json b/cdk/tsconfig.json
new file mode 100644
index 00000000000..b1eaa510e97
--- /dev/null
+++ b/cdk/tsconfig.json
@@ -0,0 +1,24 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "module": "NodeNext",
+ "moduleResolution": "NodeNext",
+ "lib": ["es2022"],
+ "declaration": true,
+ "strict": true,
+ "noImplicitAny": true,
+ "strictNullChecks": true,
+ "noImplicitThis": true,
+ "alwaysStrict": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noImplicitReturns": true,
+ "noFallthroughCasesInSwitch": false,
+ "inlineSourceMap": true,
+ "inlineSources": true,
+ "experimentalDecorators": true,
+ "strictPropertyInitialization": false,
+ "typeRoots": ["./node_modules/@types"]
+ },
+ "exclude": ["node_modules", "cdk.out"]
+}
diff --git a/cdk/yarn.lock b/cdk/yarn.lock
new file mode 100644
index 00000000000..c7c55e318f5
--- /dev/null
+++ b/cdk/yarn.lock
@@ -0,0 +1,5404 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4"
+ integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@aws-cdk/asset-awscli-v1@2.2.242":
+ version "2.2.242"
+ resolved "https://registry.yarnpkg.com/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.242.tgz#235cb25b6d1ad26975b0095c0d6ee84309adae5c"
+ integrity sha512-4c1bAy2ISzcdKXYS1k4HYZsNrgiwbiDzj36ybwFVxEWZXVAP0dimQTCaB9fxu7sWzEjw3d+eaw6Fon+QTfTIpQ==
+
+"@aws-cdk/asset-node-proxy-agent-v6@^2.1.0":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz#6d3c7860354d4856a7e75375f2f0ecab313b4989"
+ integrity sha512-7bY3J8GCVxLupn/kNmpPc5VJz8grx+4RKfnnJiO1LG+uxkZfANZG3RMHhE+qQxxwkyQ9/MfPtTpf748UhR425A==
+
+"@aws-cdk/cloud-assembly-schema@^45.2.0":
+ version "45.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-cdk/cloud-assembly-schema/-/cloud-assembly-schema-45.2.0.tgz#bd4bf1e16189a2d424b9ab503db48ca9732325b1"
+ integrity sha512-5TTUkGHQ+nfuUGwKA8/Yraxb+JdNUh4np24qk/VHXmrCMq+M6HfmGWfhcg/QlHA2S5P3YIamfYHdQAB4uSNLAg==
+ dependencies:
+ jsonschema "~1.4.1"
+ semver "^7.7.2"
+
+"@aws-crypto/crc32@5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1"
+ integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==
+ dependencies:
+ "@aws-crypto/util" "^5.2.0"
+ "@aws-sdk/types" "^3.222.0"
+ tslib "^2.6.2"
+
+"@aws-crypto/sha256-browser@5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz#153895ef1dba6f9fce38af550e0ef58988eb649e"
+ integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==
+ dependencies:
+ "@aws-crypto/sha256-js" "^5.2.0"
+ "@aws-crypto/supports-web-crypto" "^5.2.0"
+ "@aws-crypto/util" "^5.2.0"
+ "@aws-sdk/types" "^3.222.0"
+ "@aws-sdk/util-locate-window" "^3.0.0"
+ "@smithy/util-utf8" "^2.0.0"
+ tslib "^2.6.2"
+
+"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz#c4fdb773fdbed9a664fc1a95724e206cf3860042"
+ integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==
+ dependencies:
+ "@aws-crypto/util" "^5.2.0"
+ "@aws-sdk/types" "^3.222.0"
+ tslib "^2.6.2"
+
+"@aws-crypto/supports-web-crypto@^5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz#a1e399af29269be08e695109aa15da0a07b5b5fb"
+ integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==
+ dependencies:
+ tslib "^2.6.2"
+
+"@aws-crypto/util@^5.2.0":
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/@aws-crypto/util/-/util-5.2.0.tgz#71284c9cffe7927ddadac793c14f14886d3876da"
+ integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==
+ dependencies:
+ "@aws-sdk/types" "^3.222.0"
+ "@smithy/util-utf8" "^2.0.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-ecs@^3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-ecs/-/client-ecs-3.873.0.tgz#58068a5d85742f6a123064a077d77eddf5d95cdf"
+ integrity sha512-5VjDWf7Oz5LIacFgR684M2GBUZU8cS+PVeh/IPwA0QWrTzhpfYkurzhiOlo0coutdxklU52CTM57h72izZ3k1g==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/credential-provider-node" "3.873.0"
+ "@aws-sdk/middleware-host-header" "3.873.0"
+ "@aws-sdk/middleware-logger" "3.873.0"
+ "@aws-sdk/middleware-recursion-detection" "3.873.0"
+ "@aws-sdk/middleware-user-agent" "3.873.0"
+ "@aws-sdk/region-config-resolver" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/util-endpoints" "3.873.0"
+ "@aws-sdk/util-user-agent-browser" "3.873.0"
+ "@aws-sdk/util-user-agent-node" "3.873.0"
+ "@smithy/config-resolver" "^4.1.5"
+ "@smithy/core" "^3.8.0"
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/hash-node" "^4.0.5"
+ "@smithy/invalid-dependency" "^4.0.5"
+ "@smithy/middleware-content-length" "^4.0.5"
+ "@smithy/middleware-endpoint" "^4.1.18"
+ "@smithy/middleware-retry" "^4.1.19"
+ "@smithy/middleware-serde" "^4.0.9"
+ "@smithy/middleware-stack" "^4.0.5"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-body-length-node" "^4.0.0"
+ "@smithy/util-defaults-mode-browser" "^4.0.26"
+ "@smithy/util-defaults-mode-node" "^4.0.26"
+ "@smithy/util-endpoints" "^3.0.7"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-retry" "^4.0.7"
+ "@smithy/util-utf8" "^4.0.0"
+ "@smithy/util-waiter" "^4.0.7"
+ "@types/uuid" "^9.0.1"
+ tslib "^2.6.2"
+ uuid "^9.0.1"
+
+"@aws-sdk/client-lambda@^3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.876.0.tgz#963ac141505ff30229534d4ff72b514f282323c6"
+ integrity sha512-dOzCiZFAG5mihv/ZVxDJmgdH6A6MoF8GP8QsWN0BuvkISPtKXE7IPJivCCh7BmcTDqH5iPje+SW+lmdrhYJ1qQ==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/credential-provider-node" "3.876.0"
+ "@aws-sdk/middleware-host-header" "3.873.0"
+ "@aws-sdk/middleware-logger" "3.876.0"
+ "@aws-sdk/middleware-recursion-detection" "3.873.0"
+ "@aws-sdk/middleware-user-agent" "3.876.0"
+ "@aws-sdk/region-config-resolver" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/util-endpoints" "3.873.0"
+ "@aws-sdk/util-user-agent-browser" "3.873.0"
+ "@aws-sdk/util-user-agent-node" "3.876.0"
+ "@smithy/config-resolver" "^4.1.5"
+ "@smithy/core" "^3.8.0"
+ "@smithy/eventstream-serde-browser" "^4.0.5"
+ "@smithy/eventstream-serde-config-resolver" "^4.1.3"
+ "@smithy/eventstream-serde-node" "^4.0.5"
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/hash-node" "^4.0.5"
+ "@smithy/invalid-dependency" "^4.0.5"
+ "@smithy/middleware-content-length" "^4.0.5"
+ "@smithy/middleware-endpoint" "^4.1.18"
+ "@smithy/middleware-retry" "^4.1.19"
+ "@smithy/middleware-serde" "^4.0.9"
+ "@smithy/middleware-stack" "^4.0.5"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-body-length-node" "^4.0.0"
+ "@smithy/util-defaults-mode-browser" "^4.0.26"
+ "@smithy/util-defaults-mode-node" "^4.0.26"
+ "@smithy/util-endpoints" "^3.0.7"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-retry" "^4.0.7"
+ "@smithy/util-stream" "^4.2.4"
+ "@smithy/util-utf8" "^4.0.0"
+ "@smithy/util-waiter" "^4.0.7"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-sso@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.873.0.tgz#e51e7105ef47aa2675490ad602dc266637587403"
+ integrity sha512-EmcrOgFODWe7IsLKFTeSXM9TlQ80/BO1MBISlr7w2ydnOaUYIiPGRRJnDpeIgMaNqT4Rr2cRN2RiMrbFO7gDdA==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/middleware-host-header" "3.873.0"
+ "@aws-sdk/middleware-logger" "3.873.0"
+ "@aws-sdk/middleware-recursion-detection" "3.873.0"
+ "@aws-sdk/middleware-user-agent" "3.873.0"
+ "@aws-sdk/region-config-resolver" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/util-endpoints" "3.873.0"
+ "@aws-sdk/util-user-agent-browser" "3.873.0"
+ "@aws-sdk/util-user-agent-node" "3.873.0"
+ "@smithy/config-resolver" "^4.1.5"
+ "@smithy/core" "^3.8.0"
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/hash-node" "^4.0.5"
+ "@smithy/invalid-dependency" "^4.0.5"
+ "@smithy/middleware-content-length" "^4.0.5"
+ "@smithy/middleware-endpoint" "^4.1.18"
+ "@smithy/middleware-retry" "^4.1.19"
+ "@smithy/middleware-serde" "^4.0.9"
+ "@smithy/middleware-stack" "^4.0.5"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-body-length-node" "^4.0.0"
+ "@smithy/util-defaults-mode-browser" "^4.0.26"
+ "@smithy/util-defaults-mode-node" "^4.0.26"
+ "@smithy/util-endpoints" "^3.0.7"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-retry" "^4.0.7"
+ "@smithy/util-utf8" "^4.0.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/client-sso@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.876.0.tgz#1088a594684aeb469b5986eeef7ca3819baf8cac"
+ integrity sha512-Vf0PMF7HVpvllrfPODnBZmlz6kT/y2AvOt1RQG3+qD0VrHWzShc5nwgRZ+yyP3xkKVhZsQ3sJapfZTFnjqMOYA==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/middleware-host-header" "3.873.0"
+ "@aws-sdk/middleware-logger" "3.876.0"
+ "@aws-sdk/middleware-recursion-detection" "3.873.0"
+ "@aws-sdk/middleware-user-agent" "3.876.0"
+ "@aws-sdk/region-config-resolver" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/util-endpoints" "3.873.0"
+ "@aws-sdk/util-user-agent-browser" "3.873.0"
+ "@aws-sdk/util-user-agent-node" "3.876.0"
+ "@smithy/config-resolver" "^4.1.5"
+ "@smithy/core" "^3.8.0"
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/hash-node" "^4.0.5"
+ "@smithy/invalid-dependency" "^4.0.5"
+ "@smithy/middleware-content-length" "^4.0.5"
+ "@smithy/middleware-endpoint" "^4.1.18"
+ "@smithy/middleware-retry" "^4.1.19"
+ "@smithy/middleware-serde" "^4.0.9"
+ "@smithy/middleware-stack" "^4.0.5"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-body-length-node" "^4.0.0"
+ "@smithy/util-defaults-mode-browser" "^4.0.26"
+ "@smithy/util-defaults-mode-node" "^4.0.26"
+ "@smithy/util-endpoints" "^3.0.7"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-retry" "^4.0.7"
+ "@smithy/util-utf8" "^4.0.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/core@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.873.0.tgz#d0c2d4e890ff268c0d0c5ed9883203ef9197ab4b"
+ integrity sha512-WrROjp8X1VvmnZ4TBzwM7RF+EB3wRaY9kQJLXw+Aes0/3zRjUXvGIlseobGJMqMEGnM0YekD2F87UaVfot1xeQ==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/xml-builder" "3.873.0"
+ "@smithy/core" "^3.8.0"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/signature-v4" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-utf8" "^4.0.0"
+ fast-xml-parser "5.2.5"
+ tslib "^2.6.2"
+
+"@aws-sdk/core@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.876.0.tgz#8f5c6afac9c9f90e6dd19d5d257db1482e50c233"
+ integrity sha512-sVFBFkdoPOPyY13NaXO1E/R9O5J6ixzHnnRbqrbXYM2QQgLNPTKIiRtmVEuVoFV9YULg+/aKm7caix8m468y9w==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/xml-builder" "3.873.0"
+ "@smithy/core" "^3.8.0"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/signature-v4" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-utf8" "^4.0.0"
+ fast-xml-parser "5.2.5"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-env@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.873.0.tgz#6558387cc937c689d5e2a4d0d4e34798d526986f"
+ integrity sha512-FWj1yUs45VjCADv80JlGshAttUHBL2xtTAbJcAxkkJZzLRKVkdyrepFWhv/95MvDyzfbT6PgJiWMdW65l/8ooA==
+ dependencies:
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-env@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.876.0.tgz#11e4d4964e6e2fb85351e68da3a0cea9ff3036ab"
+ integrity sha512-cof7lwp2AlrAfRs0pt4W2KMS2VMBvEmpcti1UOFfSJIqkn+cyJliMJ8LHg22GI+kUexjvxdAqSbf3M7OHvEW+w==
+ dependencies:
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-http@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.873.0.tgz#efa22f1a5fcf74c5a19b9857fe7205853eaa3191"
+ integrity sha512-0sIokBlXIsndjZFUfr3Xui8W6kPC4DAeBGAXxGi9qbFZ9PWJjn1vt2COLikKH3q2snchk+AsznREZG8NW6ezSg==
+ dependencies:
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-stream" "^4.2.4"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-http@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.876.0.tgz#da29a773b5b1ee53308978582582d6bfbb490c66"
+ integrity sha512-wzmef2NBp2+X1l8D4Q8hx1G8oI3+WdvLdPev9VnVpRYZxYGRWVPl++wvCBsCn/ZL0mdWopPkhHA3kFexQhMzvg==
+ dependencies:
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-stream" "^4.2.4"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-ini@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.873.0.tgz#49ddf51deb23842e91975f88e198b75a9e7cc68f"
+ integrity sha512-bQdGqh47Sk0+2S3C+N46aNQsZFzcHs7ndxYLARH/avYXf02Nl68p194eYFaAHJSQ1re5IbExU1+pbums7FJ9fA==
+ dependencies:
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/credential-provider-env" "3.873.0"
+ "@aws-sdk/credential-provider-http" "3.873.0"
+ "@aws-sdk/credential-provider-process" "3.873.0"
+ "@aws-sdk/credential-provider-sso" "3.873.0"
+ "@aws-sdk/credential-provider-web-identity" "3.873.0"
+ "@aws-sdk/nested-clients" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/credential-provider-imds" "^4.0.7"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-ini@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.876.0.tgz#6afb8bf97198f88d1740e922a9abf4b4e1155038"
+ integrity sha512-JHbW6fqnJsVjGHCyko7B0NVPT1nEAPxkM3CGjUcVGsHgJBkxOLVCMQqTRyHcDdeHR2qeojlLoOHRz97xIHQjYw==
+ dependencies:
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/credential-provider-env" "3.876.0"
+ "@aws-sdk/credential-provider-http" "3.876.0"
+ "@aws-sdk/credential-provider-process" "3.876.0"
+ "@aws-sdk/credential-provider-sso" "3.876.0"
+ "@aws-sdk/credential-provider-web-identity" "3.876.0"
+ "@aws-sdk/nested-clients" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/credential-provider-imds" "^4.0.7"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-node@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.873.0.tgz#c33201aef628474056aad029f69255d94f5d990c"
+ integrity sha512-+v/xBEB02k2ExnSDL8+1gD6UizY4Q/HaIJkNSkitFynRiiTQpVOSkCkA0iWxzksMeN8k1IHTE5gzeWpkEjNwbA==
+ dependencies:
+ "@aws-sdk/credential-provider-env" "3.873.0"
+ "@aws-sdk/credential-provider-http" "3.873.0"
+ "@aws-sdk/credential-provider-ini" "3.873.0"
+ "@aws-sdk/credential-provider-process" "3.873.0"
+ "@aws-sdk/credential-provider-sso" "3.873.0"
+ "@aws-sdk/credential-provider-web-identity" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/credential-provider-imds" "^4.0.7"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-node@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.876.0.tgz#1619f84fee068217414ea2fa57c0e327768a9465"
+ integrity sha512-eHbNt1+Hi43e8ANnwf6toapLSxfMiyGq459y3Uh6i7NBOiWWKEsOVcgOfUC3RCoqeikxovt1tFM2cEElWUIOhg==
+ dependencies:
+ "@aws-sdk/credential-provider-env" "3.876.0"
+ "@aws-sdk/credential-provider-http" "3.876.0"
+ "@aws-sdk/credential-provider-ini" "3.876.0"
+ "@aws-sdk/credential-provider-process" "3.876.0"
+ "@aws-sdk/credential-provider-sso" "3.876.0"
+ "@aws-sdk/credential-provider-web-identity" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/credential-provider-imds" "^4.0.7"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-process@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.873.0.tgz#2c75a8c7ab86af5cffb767e3652db6203c441513"
+ integrity sha512-ycFv9WN+UJF7bK/ElBq1ugWA4NMbYS//1K55bPQZb2XUpAM2TWFlEjG7DIyOhLNTdl6+CbHlCdhlKQuDGgmm0A==
+ dependencies:
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-process@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.876.0.tgz#4f9760041e0c9f33d816ea7c5d004ef26d80a8f8"
+ integrity sha512-SMX4OlHvspu3gF4hxe7WAnZFhxpiCye+WlBSVoWfW/i9XNhtrZS1JMr29MK34GlCTk9qO7FlRwds/Z5k7xPpHg==
+ dependencies:
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-sso@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.873.0.tgz#d208878a955b74829cb36d70492f7e27f70995cd"
+ integrity sha512-SudkAOZmjEEYgUrqlUUjvrtbWJeI54/0Xo87KRxm4kfBtMqSx0TxbplNUAk8Gkg4XQNY0o7jpG8tK7r2Wc2+uw==
+ dependencies:
+ "@aws-sdk/client-sso" "3.873.0"
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/token-providers" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-sso@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.876.0.tgz#d4867ebf546c36ca3df7366bbf70ef99b958da9a"
+ integrity sha512-iP5dz9XqwePbgnh7Bdrq5e1319JpCRKLyomUfHH1XVeXkIHmwIJdmTj1Upeo1J8L/5cLHmhXAN6CTN11bLo8SA==
+ dependencies:
+ "@aws-sdk/client-sso" "3.876.0"
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/token-providers" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-web-identity@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.873.0.tgz#f03d730c1395b6dbdc0a5e121ca4de4deeb586cc"
+ integrity sha512-Gw2H21+VkA6AgwKkBtTtlGZ45qgyRZPSKWs0kUwXVlmGOiPz61t/lBX0vG6I06ZIz2wqeTJ5OA1pWZLqw1j0JQ==
+ dependencies:
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/nested-clients" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/credential-provider-web-identity@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.876.0.tgz#ece58ac87f7b2eb13176f5f89aafe916562289ef"
+ integrity sha512-q/XSCP1uae5aB9veM8zcm6Gqu6A4ckX9ZbhHgCzURXVJDwp+nINW1hM9vppMjGw3ND9Ibx/adR+KfTI0TDMzqw==
+ dependencies:
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/nested-clients" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-host-header@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.873.0.tgz#81e9c2f61674b96337472bcaefd85ce3b7a24f7b"
+ integrity sha512-KZ/W1uruWtMOs7D5j3KquOxzCnV79KQW9MjJFZM/M0l6KI8J6V3718MXxFHsTjUE4fpdV6SeCNLV1lwGygsjJA==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-logger@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.873.0.tgz#dc6e858ad1a2be56963a36bf7538e8c79a782a7a"
+ integrity sha512-QhNZ8X7pW68kFez9QxUSN65Um0Feo18ZmHxszQZNUhKDsXew/EG9NPQE/HgYcekcon35zHxC4xs+FeNuPurP2g==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-logger@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.876.0.tgz#16ee45f7bcd887badc8f12d80eef9ba18a0ac97c"
+ integrity sha512-cpWJhOuMSyz9oV25Z/CMHCBTgafDCbv7fHR80nlRrPdPZ8ETNsahwRgltXP1QJJ8r3X/c1kwpOR7tc+RabVzNA==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-recursion-detection@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.873.0.tgz#1f9086542800d355d85332acea7accf1856e408b"
+ integrity sha512-OtgY8EXOzRdEWR//WfPkA/fXl0+WwE8hq0y9iw2caNyKPtca85dzrrZWnPqyBK/cpImosrpR1iKMYr41XshsCg==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-user-agent@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.873.0.tgz#a882cd2fb4b992e5b3c2eb0251fd95f44b3dae44"
+ integrity sha512-gHqAMYpWkPhZLwqB3Yj83JKdL2Vsb64sryo8LN2UdpElpS+0fT4yjqSxKTfp7gkhN6TCIxF24HQgbPk5FMYJWw==
+ dependencies:
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/util-endpoints" "3.873.0"
+ "@smithy/core" "^3.8.0"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/middleware-user-agent@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.876.0.tgz#207f62b1e9f141ede0a562fd1f1bf90b948a2089"
+ integrity sha512-FR+8INfnbNv32QDQ5szxkWX6mB/QgezfNyx8LnAh1ErISZMmEFBxXXir+ZOfuV8vsmal1a6cy9qmnMNDaNnaNQ==
+ dependencies:
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/util-endpoints" "3.873.0"
+ "@smithy/core" "^3.8.0"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/nested-clients@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.873.0.tgz#cf9c5c04e25666024d9fc805e768f7b6267ef877"
+ integrity sha512-yg8JkRHuH/xO65rtmLOWcd9XQhxX1kAonp2CliXT44eA/23OBds6XoheY44eZeHfCTgutDLTYitvy3k9fQY6ZA==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/middleware-host-header" "3.873.0"
+ "@aws-sdk/middleware-logger" "3.873.0"
+ "@aws-sdk/middleware-recursion-detection" "3.873.0"
+ "@aws-sdk/middleware-user-agent" "3.873.0"
+ "@aws-sdk/region-config-resolver" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/util-endpoints" "3.873.0"
+ "@aws-sdk/util-user-agent-browser" "3.873.0"
+ "@aws-sdk/util-user-agent-node" "3.873.0"
+ "@smithy/config-resolver" "^4.1.5"
+ "@smithy/core" "^3.8.0"
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/hash-node" "^4.0.5"
+ "@smithy/invalid-dependency" "^4.0.5"
+ "@smithy/middleware-content-length" "^4.0.5"
+ "@smithy/middleware-endpoint" "^4.1.18"
+ "@smithy/middleware-retry" "^4.1.19"
+ "@smithy/middleware-serde" "^4.0.9"
+ "@smithy/middleware-stack" "^4.0.5"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-body-length-node" "^4.0.0"
+ "@smithy/util-defaults-mode-browser" "^4.0.26"
+ "@smithy/util-defaults-mode-node" "^4.0.26"
+ "@smithy/util-endpoints" "^3.0.7"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-retry" "^4.0.7"
+ "@smithy/util-utf8" "^4.0.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/nested-clients@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.876.0.tgz#73919a21b0d71d9b25b3eb2294f62fc812e79f31"
+ integrity sha512-R4TZrkM2gUElTsotk8mt3y7iLG8TNi1LL1wgVdEEWSLOYTaFyglGdoNBMtEeP7lmXilaTy00AbYF6BakJvSTHg==
+ dependencies:
+ "@aws-crypto/sha256-browser" "5.2.0"
+ "@aws-crypto/sha256-js" "5.2.0"
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/middleware-host-header" "3.873.0"
+ "@aws-sdk/middleware-logger" "3.876.0"
+ "@aws-sdk/middleware-recursion-detection" "3.873.0"
+ "@aws-sdk/middleware-user-agent" "3.876.0"
+ "@aws-sdk/region-config-resolver" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@aws-sdk/util-endpoints" "3.873.0"
+ "@aws-sdk/util-user-agent-browser" "3.873.0"
+ "@aws-sdk/util-user-agent-node" "3.876.0"
+ "@smithy/config-resolver" "^4.1.5"
+ "@smithy/core" "^3.8.0"
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/hash-node" "^4.0.5"
+ "@smithy/invalid-dependency" "^4.0.5"
+ "@smithy/middleware-content-length" "^4.0.5"
+ "@smithy/middleware-endpoint" "^4.1.18"
+ "@smithy/middleware-retry" "^4.1.19"
+ "@smithy/middleware-serde" "^4.0.9"
+ "@smithy/middleware-stack" "^4.0.5"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-body-length-node" "^4.0.0"
+ "@smithy/util-defaults-mode-browser" "^4.0.26"
+ "@smithy/util-defaults-mode-node" "^4.0.26"
+ "@smithy/util-endpoints" "^3.0.7"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-retry" "^4.0.7"
+ "@smithy/util-utf8" "^4.0.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/region-config-resolver@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.873.0.tgz#9a5ddf8aa5a068d1c728dda3ef7e5b31561f7419"
+ integrity sha512-q9sPoef+BBG6PJnc4x60vK/bfVwvRWsPgcoQyIra057S/QGjq5VkjvNk6H8xedf6vnKlXNBwq9BaANBXnldUJg==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-config-provider" "^4.0.0"
+ "@smithy/util-middleware" "^4.0.5"
+ tslib "^2.6.2"
+
+"@aws-sdk/token-providers@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.873.0.tgz#43e239d1e6de7d1aa059accfe948a5d8d430b74b"
+ integrity sha512-BWOCeFeV/Ba8fVhtwUw/0Hz4wMm9fjXnMb4Z2a5he/jFlz5mt1/rr6IQ4MyKgzOaz24YrvqsJW2a0VUKOaYDvg==
+ dependencies:
+ "@aws-sdk/core" "3.873.0"
+ "@aws-sdk/nested-clients" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/token-providers@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.876.0.tgz#952d62cfe53c9964bb2a6db687698279fe22fd57"
+ integrity sha512-iU08kaQbhXnY0CC2TBcr7y/2PqPwZP2CTWX/Rbq0NvhOyteikfh7ASC+bRfLUp0XMSHKvSb+w2dh8a0lvx4oHg==
+ dependencies:
+ "@aws-sdk/core" "3.876.0"
+ "@aws-sdk/nested-clients" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/types@3.862.0", "@aws-sdk/types@^3.222.0":
+ version "3.862.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.862.0.tgz#2f5622e1aa3a5281d4f419f5d2c90f87dd5ff0cf"
+ integrity sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/util-endpoints@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.873.0.tgz#11afbcf503bdbcf10c0ed08c81696303b8bb5fb0"
+ integrity sha512-YByHrhjxYdjKRf/RQygRK1uh0As1FIi9+jXTcIEX/rBgN8mUByczr2u4QXBzw7ZdbdcOBMOkPnLRjNOWW1MkFg==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ "@smithy/util-endpoints" "^3.0.7"
+ tslib "^2.6.2"
+
+"@aws-sdk/util-locate-window@^3.0.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-locate-window/-/util-locate-window-3.873.0.tgz#cc10edef3b7aecf365943ec657116d6eb470d9cb"
+ integrity sha512-xcVhZF6svjM5Rj89T1WzkjQmrTF6dpR2UvIHPMTnSZoNe6CixejPZ6f0JJ2kAhO8H+dUHwNBlsUgOTIKiK/Syg==
+ dependencies:
+ tslib "^2.6.2"
+
+"@aws-sdk/util-user-agent-browser@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.873.0.tgz#0fcc3c1877ae74aa692cc0b4ad874bc9a6ee1ad6"
+ integrity sha512-AcRdbK6o19yehEcywI43blIBhOCSo6UgyWcuOJX5CFF8k39xm1ILCjQlRRjchLAxWrm0lU0Q7XV90RiMMFMZtA==
+ dependencies:
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/types" "^4.3.2"
+ bowser "^2.11.0"
+ tslib "^2.6.2"
+
+"@aws-sdk/util-user-agent-node@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.873.0.tgz#3ebc4a7460eb10aba213d9ffc04aeb1bd613a7e1"
+ integrity sha512-9MivTP+q9Sis71UxuBaIY3h5jxH0vN3/ZWGxO8ADL19S2OIfknrYSAfzE5fpoKROVBu0bS4VifHOFq4PY1zsxw==
+ dependencies:
+ "@aws-sdk/middleware-user-agent" "3.873.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/util-user-agent-node@3.876.0":
+ version "3.876.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.876.0.tgz#0300f97d6a67bb451c9bc7d59fc35976ad311189"
+ integrity sha512-/ZIaeUt60JBdI0mNc7sZ8v3Tuzp8Pbe4gIAYnppGyF4KV8QA+Yu8tp2bGHfkKn150t1uvQ6P/4CwFfoGF34dzg==
+ dependencies:
+ "@aws-sdk/middleware-user-agent" "3.876.0"
+ "@aws-sdk/types" "3.862.0"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@aws-sdk/xml-builder@3.873.0":
+ version "3.873.0"
+ resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.873.0.tgz#b5a3acfdeecfc1b7fee8a7773cb2a45590eb5701"
+ integrity sha512-kLO7k7cGJ6KaHiExSJWojZurF7SnGMDHXRuQunFnEoD0n1yB6Lqy/S/zHiQ7oJnBhPr9q0TW9qFkrsZb1Uc54w==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be"
+ integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.27.1"
+ js-tokens "^4.0.0"
+ picocolors "^1.1.1"
+
+"@babel/compat-data@^7.27.2":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790"
+ integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==
+
+"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9":
+ version "7.28.3"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.3.tgz#aceddde69c5d1def69b839d09efa3e3ff59c97cb"
+ integrity sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.3"
+ "@babel/helper-compilation-targets" "^7.27.2"
+ "@babel/helper-module-transforms" "^7.28.3"
+ "@babel/helpers" "^7.28.3"
+ "@babel/parser" "^7.28.3"
+ "@babel/template" "^7.27.2"
+ "@babel/traverse" "^7.28.3"
+ "@babel/types" "^7.28.2"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/core@^7.7.5":
+ version "7.28.4"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496"
+ integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.3"
+ "@babel/helper-compilation-targets" "^7.27.2"
+ "@babel/helper-module-transforms" "^7.28.3"
+ "@babel/helpers" "^7.28.4"
+ "@babel/parser" "^7.28.4"
+ "@babel/template" "^7.27.2"
+ "@babel/traverse" "^7.28.4"
+ "@babel/types" "^7.28.4"
+ "@jridgewell/remapping" "^2.3.5"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.12.11", "@babel/generator@^7.28.3", "@babel/generator@^7.7.2":
+ version "7.28.3"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e"
+ integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==
+ dependencies:
+ "@babel/parser" "^7.28.3"
+ "@babel/types" "^7.28.2"
+ "@jridgewell/gen-mapping" "^0.3.12"
+ "@jridgewell/trace-mapping" "^0.3.28"
+ jsesc "^3.0.2"
+
+"@babel/helper-compilation-targets@^7.27.2":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d"
+ integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==
+ dependencies:
+ "@babel/compat-data" "^7.27.2"
+ "@babel/helper-validator-option" "^7.27.1"
+ browserslist "^4.24.0"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-globals@^7.28.0":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674"
+ integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==
+
+"@babel/helper-module-imports@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204"
+ integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==
+ dependencies:
+ "@babel/traverse" "^7.27.1"
+ "@babel/types" "^7.27.1"
+
+"@babel/helper-module-transforms@^7.28.3":
+ version "7.28.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6"
+ integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+ "@babel/traverse" "^7.28.3"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c"
+ integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==
+
+"@babel/helper-string-parser@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687"
+ integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==
+
+"@babel/helper-validator-identifier@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8"
+ integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==
+
+"@babel/helper-validator-option@^7.27.1":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f"
+ integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==
+
+"@babel/helpers@^7.28.3":
+ version "7.28.3"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441"
+ integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==
+ dependencies:
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.2"
+
+"@babel/helpers@^7.28.4":
+ version "7.28.4"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827"
+ integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==
+ dependencies:
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.4"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.15", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3":
+ version "7.28.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71"
+ integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==
+ dependencies:
+ "@babel/types" "^7.28.2"
+
+"@babel/parser@^7.2.3", "@babel/parser@^7.28.4":
+ version "7.28.4"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8"
+ integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==
+ dependencies:
+ "@babel/types" "^7.28.4"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-import-attributes@^7.24.7":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07"
+ integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/plugin-syntax-import-meta@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.7.2":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c"
+ integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.27.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18"
+ integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.27.1"
+
+"@babel/runtime@^7.7.6":
+ version "7.28.4"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326"
+ integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
+
+"@babel/template@^7.27.2", "@babel/template@^7.3.3":
+ version "7.27.2"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d"
+ integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/parser" "^7.27.2"
+ "@babel/types" "^7.27.1"
+
+"@babel/traverse@^7.1.6", "@babel/traverse@^7.28.4":
+ version "7.28.4"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b"
+ integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.3"
+ "@babel/helper-globals" "^7.28.0"
+ "@babel/parser" "^7.28.4"
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.4"
+ debug "^4.3.1"
+
+"@babel/traverse@^7.27.1", "@babel/traverse@^7.28.3":
+ version "7.28.3"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434"
+ integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==
+ dependencies:
+ "@babel/code-frame" "^7.27.1"
+ "@babel/generator" "^7.28.3"
+ "@babel/helper-globals" "^7.28.0"
+ "@babel/parser" "^7.28.3"
+ "@babel/template" "^7.27.2"
+ "@babel/types" "^7.28.2"
+ debug "^4.3.1"
+
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.28.2", "@babel/types@^7.3.3":
+ version "7.28.2"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b"
+ integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+
+"@babel/types@^7.2.0", "@babel/types@^7.28.4":
+ version "7.28.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a"
+ integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==
+ dependencies:
+ "@babel/helper-string-parser" "^7.27.1"
+ "@babel/helper-validator-identifier" "^7.27.1"
+
+"@balena/dockerignore@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d"
+ integrity sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@cspotcode/source-map-support@^0.8.0":
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
+ integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
+ dependencies:
+ "@jridgewell/trace-mapping" "0.3.9"
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/console@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc"
+ integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
+ slash "^3.0.0"
+
+"@jest/core@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f"
+ integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==
+ dependencies:
+ "@jest/console" "^29.7.0"
+ "@jest/reporters" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-changed-files "^29.7.0"
+ jest-config "^29.7.0"
+ jest-haste-map "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-regex-util "^29.6.3"
+ jest-resolve "^29.7.0"
+ jest-resolve-dependencies "^29.7.0"
+ jest-runner "^29.7.0"
+ jest-runtime "^29.7.0"
+ jest-snapshot "^29.7.0"
+ jest-util "^29.7.0"
+ jest-validate "^29.7.0"
+ jest-watcher "^29.7.0"
+ micromatch "^4.0.4"
+ pretty-format "^29.7.0"
+ slash "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"@jest/environment@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7"
+ integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==
+ dependencies:
+ "@jest/fake-timers" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ jest-mock "^29.7.0"
+
+"@jest/expect-utils@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6"
+ integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==
+ dependencies:
+ jest-get-type "^29.6.3"
+
+"@jest/expect@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2"
+ integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==
+ dependencies:
+ expect "^29.7.0"
+ jest-snapshot "^29.7.0"
+
+"@jest/fake-timers@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565"
+ integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@sinonjs/fake-timers" "^10.0.2"
+ "@types/node" "*"
+ jest-message-util "^29.7.0"
+ jest-mock "^29.7.0"
+ jest-util "^29.7.0"
+
+"@jest/globals@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d"
+ integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==
+ dependencies:
+ "@jest/environment" "^29.7.0"
+ "@jest/expect" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ jest-mock "^29.7.0"
+
+"@jest/reporters@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7"
+ integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@jridgewell/trace-mapping" "^0.3.18"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^6.0.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.1.3"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
+ jest-worker "^29.7.0"
+ slash "^3.0.0"
+ string-length "^4.0.1"
+ strip-ansi "^6.0.0"
+ v8-to-istanbul "^9.0.1"
+
+"@jest/schemas@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03"
+ integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==
+ dependencies:
+ "@sinclair/typebox" "^0.27.8"
+
+"@jest/source-map@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4"
+ integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.18"
+ callsites "^3.0.0"
+ graceful-fs "^4.2.9"
+
+"@jest/test-result@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c"
+ integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==
+ dependencies:
+ "@jest/console" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ collect-v8-coverage "^1.0.0"
+
+"@jest/test-sequencer@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce"
+ integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==
+ dependencies:
+ "@jest/test-result" "^29.7.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^29.7.0"
+ slash "^3.0.0"
+
+"@jest/transform@^29.7.0":
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c"
+ integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@jest/types" "^29.6.3"
+ "@jridgewell/trace-mapping" "^0.3.18"
+ babel-plugin-istanbul "^6.1.1"
+ chalk "^4.0.0"
+ convert-source-map "^2.0.0"
+ fast-json-stable-stringify "^2.1.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^29.7.0"
+ jest-regex-util "^29.6.3"
+ jest-util "^29.7.0"
+ micromatch "^4.0.4"
+ pirates "^4.0.4"
+ slash "^3.0.0"
+ write-file-atomic "^4.0.2"
+
+"@jest/types@^29.6.3":
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59"
+ integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^17.0.8"
+ chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5":
+ version "0.3.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f"
+ integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.5.0"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/remapping@^2.3.5":
+ version "2.3.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1"
+ integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.5"
+ "@jridgewell/trace-mapping" "^0.3.24"
+
+"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
+ integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0":
+ version "1.5.5"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba"
+ integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==
+
+"@jridgewell/trace-mapping@0.3.9":
+ version "0.3.9"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
+ integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28":
+ version "0.3.30"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz#4a76c4daeee5df09f5d3940e087442fb36ce2b99"
+ integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@jsdoc/salty@^0.2.1":
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/@jsdoc/salty/-/salty-0.2.9.tgz#4d8c147f7ca011532681ce86352a77a0178f1dec"
+ integrity sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==
+ dependencies:
+ lodash "^4.17.21"
+
+"@sinclair/typebox@^0.27.8":
+ version "0.27.8"
+ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
+ integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==
+
+"@sinonjs/commons@^3.0.0":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd"
+ integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^10.0.2":
+ version "10.3.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66"
+ integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==
+ dependencies:
+ "@sinonjs/commons" "^3.0.0"
+
+"@smithy/abort-controller@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.0.5.tgz#2872a12d0f11dfdcc4254b39566d5f24ab26a4ab"
+ integrity sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/config-resolver@^4.1.5":
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.1.5.tgz#3cb7cde8d13ca64630e5655812bac9ffe8182469"
+ integrity sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==
+ dependencies:
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-config-provider" "^4.0.0"
+ "@smithy/util-middleware" "^4.0.5"
+ tslib "^2.6.2"
+
+"@smithy/core@^3.8.0":
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.8.0.tgz#321d03564b753025b92e4476579efcd5c505ab1f"
+ integrity sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==
+ dependencies:
+ "@smithy/middleware-serde" "^4.0.9"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-body-length-browser" "^4.0.0"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-stream" "^4.2.4"
+ "@smithy/util-utf8" "^4.0.0"
+ "@types/uuid" "^9.0.1"
+ tslib "^2.6.2"
+ uuid "^9.0.1"
+
+"@smithy/credential-provider-imds@^4.0.7":
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz#d8bb566ffd8d9e556810b83d6e0b01b39036b810"
+ integrity sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==
+ dependencies:
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-codec@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.0.5.tgz#e742a4badaaf985ac9abcf4283ff4c39d7e48438"
+ integrity sha512-miEUN+nz2UTNoRYRhRqVTJCx7jMeILdAurStT2XoS+mhokkmz1xAPp95DFW9Gxt4iF2VBqpeF9HbTQ3kY1viOA==
+ dependencies:
+ "@aws-crypto/crc32" "5.2.0"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-hex-encoding" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-browser@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.5.tgz#fbebe76edf542d656fe3b187ac6b1e47a63f735f"
+ integrity sha512-LCUQUVTbM6HFKzImYlSB9w4xafZmpdmZsOh9rIl7riPC3osCgGFVP+wwvYVw6pXda9PPT9TcEZxaq3XE81EdJQ==
+ dependencies:
+ "@smithy/eventstream-serde-universal" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-config-resolver@^4.1.3":
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.1.3.tgz#59a01611feaef9830da592bf726ee8eef4f2c11d"
+ integrity sha512-yTTzw2jZjn/MbHu1pURbHdpjGbCuMHWncNBpJnQAPxOVnFUAbSIUSwafiphVDjNV93TdBJWmeVAds7yl5QCkcA==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-node@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.5.tgz#44f962898cfb3de806725ea5d88e904c7f3955d7"
+ integrity sha512-lGS10urI4CNzz6YlTe5EYG0YOpsSp3ra8MXyco4aqSkQDuyZPIw2hcaxDU82OUVtK7UY9hrSvgWtpsW5D4rb4g==
+ dependencies:
+ "@smithy/eventstream-serde-universal" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/eventstream-serde-universal@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.5.tgz#ec34b9999c7db3e057d67acb14ec0c8627c7ae2e"
+ integrity sha512-JFnmu4SU36YYw3DIBVao3FsJh4Uw65vVDIqlWT4LzR6gXA0F3KP0IXFKKJrhaVzCBhAuMsrUUaT5I+/4ZhF7aw==
+ dependencies:
+ "@smithy/eventstream-codec" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/fetch-http-handler@^5.1.1":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz#a444c99bffdf314deb447370429cc3e719f1a866"
+ integrity sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==
+ dependencies:
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/querystring-builder" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-base64" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/hash-node@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.5.tgz#16cf8efe42b8b611b1f56f78464b97b27ca6a3ec"
+ integrity sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-buffer-from" "^4.0.0"
+ "@smithy/util-utf8" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/invalid-dependency@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz#ed88e209668266b09c4b501f9bd656728b5ece60"
+ integrity sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/is-array-buffer@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz#f84f0d9f9a36601a9ca9381688bd1b726fd39111"
+ integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/is-array-buffer@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz#55a939029321fec462bcc574890075cd63e94206"
+ integrity sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/middleware-content-length@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz#c5d6e47f5a9fbba20433602bec9bffaeeb821ff3"
+ integrity sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==
+ dependencies:
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/middleware-endpoint@^4.1.18":
+ version "4.1.18"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz#81b2f85e3c72b0f1a2d8776e01b0a2968af62c0a"
+ integrity sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==
+ dependencies:
+ "@smithy/core" "^3.8.0"
+ "@smithy/middleware-serde" "^4.0.9"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ "@smithy/url-parser" "^4.0.5"
+ "@smithy/util-middleware" "^4.0.5"
+ tslib "^2.6.2"
+
+"@smithy/middleware-retry@^4.1.19":
+ version "4.1.19"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz#19c013c1a548e1185cc1bfabfab3f498667c9e89"
+ integrity sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==
+ dependencies:
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/service-error-classification" "^4.0.7"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-retry" "^4.0.7"
+ "@types/uuid" "^9.0.1"
+ tslib "^2.6.2"
+ uuid "^9.0.1"
+
+"@smithy/middleware-serde@^4.0.9":
+ version "4.0.9"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz#71213158bb11c1d632829001ca3f233323fb2a7c"
+ integrity sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==
+ dependencies:
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/middleware-stack@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz#577050d4c0afe816f1ea85f335b2ef64f73e4328"
+ integrity sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/node-config-provider@^4.1.4":
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz#42f231b7027e5a7ce003fd80180e586fe814944a"
+ integrity sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==
+ dependencies:
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/shared-ini-file-loader" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/node-http-handler@^4.1.1":
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz#dd806d9e08b6e73125040dd0808ab56d16a178e9"
+ integrity sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==
+ dependencies:
+ "@smithy/abort-controller" "^4.0.5"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/querystring-builder" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/property-provider@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.5.tgz#d3b368b31d5b130f4c30cc0c91f9ebb28d9685fc"
+ integrity sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/protocol-http@^5.1.3":
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.1.3.tgz#86855b528c0e4cb9fa6fb4ed6ba3cdf5960f88f4"
+ integrity sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/querystring-builder@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz#158ae170f8ec2d8af6b84cdaf774205a7dfacf68"
+ integrity sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-uri-escape" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/querystring-parser@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz#95706e56aa769f09dc8922d1b19ffaa06946e252"
+ integrity sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/service-error-classification@^4.0.7":
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz#24072198a8c110d29677762162a5096e29eb4862"
+ integrity sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+
+"@smithy/shared-ini-file-loader@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz#8d8a493276cd82a7229c755bef8d375256c5ebb9"
+ integrity sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/signature-v4@^5.1.3":
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.1.3.tgz#92a4f6e9ce66730eeb0d996cd0478c5cbaf5b3f5"
+ integrity sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==
+ dependencies:
+ "@smithy/is-array-buffer" "^4.0.0"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-hex-encoding" "^4.0.0"
+ "@smithy/util-middleware" "^4.0.5"
+ "@smithy/util-uri-escape" "^4.0.0"
+ "@smithy/util-utf8" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/smithy-client@^4.4.10":
+ version "4.4.10"
+ resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.4.10.tgz#c4b49c1d1ff9eb813f88f1e425a5dfac25a03180"
+ integrity sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==
+ dependencies:
+ "@smithy/core" "^3.8.0"
+ "@smithy/middleware-endpoint" "^4.1.18"
+ "@smithy/middleware-stack" "^4.0.5"
+ "@smithy/protocol-http" "^5.1.3"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-stream" "^4.2.4"
+ tslib "^2.6.2"
+
+"@smithy/types@^4.3.2":
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.3.2.tgz#66ac513e7057637de262e41ac15f70cf464c018a"
+ integrity sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/url-parser@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.5.tgz#1824a9c108b85322c5a31f345f608d47d06f073a"
+ integrity sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==
+ dependencies:
+ "@smithy/querystring-parser" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/util-base64@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.0.0.tgz#8345f1b837e5f636e5f8470c4d1706ae0c6d0358"
+ integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==
+ dependencies:
+ "@smithy/util-buffer-from" "^4.0.0"
+ "@smithy/util-utf8" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/util-body-length-browser@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz#965d19109a4b1e5fe7a43f813522cce718036ded"
+ integrity sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/util-body-length-node@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz#3db245f6844a9b1e218e30c93305bfe2ffa473b3"
+ integrity sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/util-buffer-from@^2.2.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz#6fc88585165ec73f8681d426d96de5d402021e4b"
+ integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==
+ dependencies:
+ "@smithy/is-array-buffer" "^2.2.0"
+ tslib "^2.6.2"
+
+"@smithy/util-buffer-from@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz#b23b7deb4f3923e84ef50c8b2c5863d0dbf6c0b9"
+ integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==
+ dependencies:
+ "@smithy/is-array-buffer" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/util-config-provider@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz#e0c7c8124c7fba0b696f78f0bd0ccb060997d45e"
+ integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/util-defaults-mode-browser@^4.0.26":
+ version "4.0.26"
+ resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz#fc04cd466bbb0d80e41930af8d6a8c33c48490f2"
+ integrity sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==
+ dependencies:
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ bowser "^2.11.0"
+ tslib "^2.6.2"
+
+"@smithy/util-defaults-mode-node@^4.0.26":
+ version "4.0.26"
+ resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz#adfee8c54301ec4cbabed58cd604995a81b4a8dc"
+ integrity sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==
+ dependencies:
+ "@smithy/config-resolver" "^4.1.5"
+ "@smithy/credential-provider-imds" "^4.0.7"
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/property-provider" "^4.0.5"
+ "@smithy/smithy-client" "^4.4.10"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/util-endpoints@^3.0.7":
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz#9d52f2e7e7a1ea4814ae284270a5f1d3930b3773"
+ integrity sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==
+ dependencies:
+ "@smithy/node-config-provider" "^4.1.4"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/util-hex-encoding@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz#dd449a6452cffb37c5b1807ec2525bb4be551e8d"
+ integrity sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/util-middleware@^4.0.5":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.5.tgz#405caf2a66e175ce8ca6c747fa1245b3f5386879"
+ integrity sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==
+ dependencies:
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/util-retry@^4.0.7":
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.7.tgz#3169450193e917da170a87557fcbdfe0faa86779"
+ integrity sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==
+ dependencies:
+ "@smithy/service-error-classification" "^4.0.7"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@smithy/util-stream@^4.2.4":
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.2.4.tgz#fa9f0e2fd5a8a5adbd013066b475ea8f9d4f900f"
+ integrity sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==
+ dependencies:
+ "@smithy/fetch-http-handler" "^5.1.1"
+ "@smithy/node-http-handler" "^4.1.1"
+ "@smithy/types" "^4.3.2"
+ "@smithy/util-base64" "^4.0.0"
+ "@smithy/util-buffer-from" "^4.0.0"
+ "@smithy/util-hex-encoding" "^4.0.0"
+ "@smithy/util-utf8" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/util-uri-escape@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz#a96c160c76f3552458a44d8081fade519d214737"
+ integrity sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==
+ dependencies:
+ tslib "^2.6.2"
+
+"@smithy/util-utf8@^2.0.0":
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-2.3.0.tgz#dd96d7640363259924a214313c3cf16e7dd329c5"
+ integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==
+ dependencies:
+ "@smithy/util-buffer-from" "^2.2.0"
+ tslib "^2.6.2"
+
+"@smithy/util-utf8@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.0.0.tgz#09ca2d9965e5849e72e347c130f2a29d5c0c863c"
+ integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==
+ dependencies:
+ "@smithy/util-buffer-from" "^4.0.0"
+ tslib "^2.6.2"
+
+"@smithy/util-waiter@^4.0.7":
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.7.tgz#c013cf6a5918c21f8b430b4a825dbac132163f4a"
+ integrity sha512-mYqtQXPmrwvUljaHyGxYUIIRI3qjBTEb/f5QFi3A6VlxhpmZd5mWXn9W+qUkf2pVE1Hv3SqxefiZOPGdxmO64A==
+ dependencies:
+ "@smithy/abort-controller" "^4.0.5"
+ "@smithy/types" "^4.3.2"
+ tslib "^2.6.2"
+
+"@tsconfig/node10@^1.0.7":
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
+ integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
+
+"@tsconfig/node12@^1.0.7":
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
+ integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
+
+"@tsconfig/node14@^1.0.0":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
+ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
+
+"@tsconfig/node16@^1.0.2":
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
+ integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
+
+"@types/aws-lambda@^8.10.152":
+ version "8.10.152"
+ resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.152.tgz#f68424a8175f0a54a2a941e65b76c3f51f3bd89d"
+ integrity sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw==
+
+"@types/babel-types@*", "@types/babel-types@^7.0.0":
+ version "7.0.16"
+ resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.16.tgz#74916c1b7a6bd53dc3d3f4053b65126bcc5e8e6f"
+ integrity sha512-5QXs9GBFTNTmilLlWBhnsprqpjfrotyrnzUdwDrywEL/DA4LuCWQT300BTOXA3Y9ngT9F2uvmCoIxI6z8DlJEA==
+
+"@types/babel__core@^7.1.14":
+ version "7.20.5"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017"
+ integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==
+ dependencies:
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.27.0"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.27.0.tgz#b5819294c51179957afaec341442f9341e4108a9"
+ integrity sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.4"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f"
+ integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
+ version "7.28.0"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.28.0.tgz#07d713d6cce0d265c9849db0cbe62d3f61f36f74"
+ integrity sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==
+ dependencies:
+ "@babel/types" "^7.28.2"
+
+"@types/babylon@^6.16.2":
+ version "6.16.9"
+ resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.9.tgz#7abf03f6591a921fe3171af91433077cd2666e36"
+ integrity sha512-sEKyxMVEowhcr8WLfN0jJYe4gS4Z9KC2DGz0vqfC7+MXFbmvOF7jSjALC77thvAO2TLgFUPa9vDeOak+AcUrZA==
+ dependencies:
+ "@types/babel-types" "*"
+
+"@types/graceful-fs@^4.1.3":
+ version "4.1.9"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4"
+ integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7"
+ integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf"
+ integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54"
+ integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/jest@^29.5.14":
+ version "29.5.14"
+ resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.5.14.tgz#2b910912fa1d6856cadcd0c1f95af7df1d6049e5"
+ integrity sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==
+ dependencies:
+ expect "^29.0.0"
+ pretty-format "^29.0.0"
+
+"@types/linkify-it@^5":
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-5.0.0.tgz#21413001973106cda1c3a9b91eedd4ccd5469d76"
+ integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==
+
+"@types/markdown-it@^14.1.1":
+ version "14.1.2"
+ resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-14.1.2.tgz#57f2532a0800067d9b934f3521429a2e8bfb4c61"
+ integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==
+ dependencies:
+ "@types/linkify-it" "^5"
+ "@types/mdurl" "^2"
+
+"@types/mdurl@^2":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-2.0.0.tgz#d43878b5b20222682163ae6f897b20447233bdfd"
+ integrity sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==
+
+"@types/node@*":
+ version "24.3.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.0.tgz#89b09f45cb9a8ee69466f18ee5864e4c3eb84dec"
+ integrity sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==
+ dependencies:
+ undici-types "~7.10.0"
+
+"@types/node@22.7.9":
+ version "22.7.9"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.9.tgz#2bf2797b5e84702d8262ea2cf843c3c3c880d0e9"
+ integrity sha512-jrTfRC7FM6nChvU7X2KqcrgquofrWLFDeYC1hKfwNWomVvrn7JIksqf344WN2X/y8xrgqBd2dJATZV4GbatBfg==
+ dependencies:
+ undici-types "~6.19.2"
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8"
+ integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==
+
+"@types/uuid@^9.0.1":
+ version "9.0.8"
+ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba"
+ integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==
+
+"@types/yargs-parser@*":
+ version "21.0.3"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15"
+ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==
+
+"@types/yargs@^17.0.8":
+ version "17.0.33"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d"
+ integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+ace-builds@^1.4.13:
+ version "1.43.3"
+ resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.43.3.tgz#ca4120fa763827dfd53c2b65a2d6b8c86f531928"
+ integrity sha512-MCl9rALmXwIty/4Qboijo/yNysx1r6hBTzG+6n/TiOm5LFhZpEvEIcIITPFiEOEFDfgBOEmxu+a4f54LEFM6Sg==
+
+acorn-globals@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+ integrity sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==
+ dependencies:
+ acorn "^4.0.4"
+
+acorn-walk@^8.1.1:
+ version "8.3.4"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7"
+ integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==
+ dependencies:
+ acorn "^8.11.0"
+
+acorn@^3.1.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+ integrity sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==
+
+acorn@^4.0.4, acorn@~4.0.2:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+ integrity sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==
+
+acorn@^8.11.0, acorn@^8.4.1:
+ version "8.15.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816"
+ integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==
+
+ajv@^8.0.1:
+ version "8.17.1"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6"
+ integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ integrity sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+anymatch@^3.0.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+arg@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+ integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b"
+ integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==
+ dependencies:
+ call-bound "^1.0.3"
+ is-array-buffer "^3.0.5"
+
+arraybuffer.prototype.slice@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c"
+ integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ is-array-buffer "^3.0.4"
+
+asap@~2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+ integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==
+
+ast-types@0.12.4, ast-types@^0.12.2:
+ version "0.12.4"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.12.4.tgz#71ce6383800f24efc9a1a3308f3a6e420a0974d1"
+ integrity sha512-ky/YVYCbtVAS8TdMIaTiPFHwEpRB5z1hctepJplTr3UW5q8TDrpIMCILyk8pmLxGtn2KCtC/lSn7zOsaI7nzDw==
+
+ast-types@^0.14.2:
+ version "0.14.2"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.14.2.tgz#600b882df8583e3cd4f2df5fa20fa83759d4bdfd"
+ integrity sha512-O0yuUDnZeQDL+ncNGlJ78BiO4jnYI3bvMsD5prT0/nsgijG/LpNBIr63gTjVTNsiGkgQhiyCShTgxt8oXOrklA==
+ dependencies:
+ tslib "^2.0.1"
+
+astral-regex@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
+ integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
+
+async-function@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b"
+ integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==
+
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
+
+aws-cdk-lib@2.208.0:
+ version "2.208.0"
+ resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.208.0.tgz#bec8ae4219b857b75d2841e4c6f023c42bdedd10"
+ integrity sha512-lZW475enKz36A/hZvS7xUwfjeqLqxKgBmZ2cGA7BB5PAlQsjBfN70ZGDgGl0egug5fb/hsYy1Dy4OrclfNzxFg==
+ dependencies:
+ "@aws-cdk/asset-awscli-v1" "2.2.242"
+ "@aws-cdk/asset-node-proxy-agent-v6" "^2.1.0"
+ "@aws-cdk/cloud-assembly-schema" "^45.2.0"
+ "@balena/dockerignore" "^1.0.2"
+ case "1.6.3"
+ fs-extra "^11.3.0"
+ ignore "^5.3.2"
+ jsonschema "^1.5.0"
+ mime-types "^2.1.35"
+ minimatch "^3.1.2"
+ punycode "^2.3.1"
+ semver "^7.7.2"
+ table "^6.9.0"
+ yaml "1.10.2"
+
+aws-cdk@2.1024.0:
+ version "2.1024.0"
+ resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.1024.0.tgz#c4fac23fa577a1a6e2253e68fa7a8b07cb6816aa"
+ integrity sha512-hY0iVT2gPX/QOQXL7RSP2sqIRI/4BYU27vSmbhZxLEj//c3pkMkd9QpIHj7gOhyWC2gf6n5JuYPw27Dgw8FEdA==
+ optionalDependencies:
+ fsevents "2.3.2"
+
+babel-jest@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5"
+ integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==
+ dependencies:
+ "@jest/transform" "^29.7.0"
+ "@types/babel__core" "^7.1.14"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^29.6.3"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ slash "^3.0.0"
+
+babel-plugin-istanbul@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
+ integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-instrument "^5.0.4"
+ test-exclude "^6.0.0"
+
+babel-plugin-jest-hoist@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626"
+ integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==
+ dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
+ "@types/babel__core" "^7.1.14"
+ "@types/babel__traverse" "^7.0.6"
+
+babel-preset-current-node-syntax@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz#20730d6cdc7dda5d89401cab10ac6a32067acde6"
+ integrity sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+
+babel-preset-jest@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c"
+ integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==
+ dependencies:
+ babel-plugin-jest-hoist "^29.6.3"
+ babel-preset-current-node-syntax "^1.0.0"
+
+babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+better-docs@^2.7.3:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/better-docs/-/better-docs-2.7.3.tgz#bdeec1b24514bc22562af2a277c2cf527abbe726"
+ integrity sha512-OEk9e7RQUQbo1DmVo0mdsALZ+mT0SwIen7/DGnN4xKNktXKgz1j7+KQ2pObNHHVSFGu8YMQW/Ig1v6eiTkdnbw==
+ dependencies:
+ brace "^0.11.1"
+ react-ace "^9.5.0"
+ react-docgen "^5.4.0"
+ react-frame-component "^5.2.1"
+ typescript "^4.5.4"
+ underscore "^1.13.2"
+ vue-docgen-api "^3.26.0"
+ vue2-ace-editor "^0.0.15"
+
+bluebird@^3.7.2:
+ version "3.7.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+ integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+bowser@^2.11.0:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.12.1.tgz#f9ad78d7aebc472feb63dd9635e3ce2337e0e2c1"
+ integrity sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==
+
+brace-expansion@^1.1.7:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843"
+ integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace@^0.11.0, brace@^0.11.1:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/brace/-/brace-0.11.1.tgz#4896fcc9d544eef45f4bb7660db320d3b379fe58"
+ integrity sha512-Fc8Ne62jJlKHiG/ajlonC4Sd66Pq68fFwK4ihJGNZpGqboc324SQk+lRvMzpPRuJOmfrJefdG8/7JdWX4bzJ2Q==
+
+braces@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+ integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+ dependencies:
+ fill-range "^7.1.1"
+
+browserslist@^4.24.0:
+ version "4.25.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.25.2.tgz#90c1507143742d743544ae6e92bca3348adff667"
+ integrity sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==
+ dependencies:
+ caniuse-lite "^1.0.30001733"
+ electron-to-chromium "^1.5.199"
+ node-releases "^2.0.19"
+ update-browserslist-db "^1.1.3"
+
+bs-logger@^0.2.6:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8"
+ integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==
+ dependencies:
+ fast-json-stable-stringify "2.x"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+c8@^7.6.0:
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/c8/-/c8-7.14.0.tgz#f368184c73b125a80565e9ab2396ff0be4d732f3"
+ integrity sha512-i04rtkkcNcCf7zsQcSv/T9EbUn4RXQ6mropeMcjFOsQXQ0iGLAr/xT6TImQg4+U9hmNpN9XdvPkjUL1IzbgxJw==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@istanbuljs/schema" "^0.1.3"
+ find-up "^5.0.0"
+ foreground-child "^2.0.0"
+ istanbul-lib-coverage "^3.2.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-reports "^3.1.4"
+ rimraf "^3.0.2"
+ test-exclude "^6.0.0"
+ v8-to-istanbul "^9.0.0"
+ yargs "^16.2.0"
+ yargs-parser "^20.2.9"
+
+call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
+ integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
+call-bind@^1.0.7, call-bind@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c"
+ integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==
+ dependencies:
+ call-bind-apply-helpers "^1.0.0"
+ es-define-property "^1.0.0"
+ get-intrinsic "^1.2.4"
+ set-function-length "^1.2.2"
+
+call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
+ integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ get-intrinsic "^1.3.0"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+ integrity sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==
+
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001733:
+ version "1.0.30001735"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz#ba658fd3fd24a4106fd68d5ce472a2c251494dbe"
+ integrity sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==
+
+case@1.6.3:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9"
+ integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==
+
+catharsis@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/catharsis/-/catharsis-0.9.0.tgz#40382a168be0e6da308c277d3a2b3eb40c7d2121"
+ integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==
+ dependencies:
+ lodash "^4.17.15"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ integrity sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
+character-parser@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
+ integrity sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==
+ dependencies:
+ is-regex "^1.0.3"
+
+ci-info@^3.2.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+ integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
+
+cjs-module-lexer@^1.0.0:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d"
+ integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==
+
+clean-css@^4.1.11:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178"
+ integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==
+ dependencies:
+ source-map "~0.6.0"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ integrity sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.1"
+ wrap-ansi "^7.0.0"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+collect-v8-coverage@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9"
+ integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+commander@^2.19.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+constantinople@^3.0.1, constantinople@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
+ integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==
+ dependencies:
+ "@types/babel-types" "^7.0.0"
+ "@types/babylon" "^6.16.2"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+
+constructs@^10.0.0:
+ version "10.4.2"
+ resolved "https://registry.yarnpkg.com/constructs/-/constructs-10.4.2.tgz#e875a78bef932cca12ea63965969873a25c1c132"
+ integrity sha512-wsNxBlAott2qg8Zv87q3eYZYgheb9lchtBfjHzzLHtXbttwSrHPs1NNQbBrmbb1YZvYg2+Vh0Dor76w4mFxJkA==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+core-js@^2.4.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+create-jest@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320"
+ integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-config "^29.7.0"
+ jest-util "^29.7.0"
+ prompts "^2.0.1"
+
+create-require@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+ integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.3:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+ integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+data-view-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570"
+ integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.2"
+
+data-view-byte-length@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735"
+ integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.2"
+
+data-view-byte-offset@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191"
+ integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
+de-indent@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
+ integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==
+
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.1.tgz#e5a8bc6cbc4c6cd3e64308b0693a3d4fa550189b"
+ integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
+ dependencies:
+ ms "^2.1.3"
+
+decamelize@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+
+dedent@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.6.0.tgz#79d52d6389b1ffa67d2bcef59ba51847a9d503b2"
+ integrity sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==
+
+deepmerge@^4.2.2:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
+diff-match-patch@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37"
+ integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==
+
+diff-sequences@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921"
+ integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==
+
+diff@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+ integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+doctypes@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
+ integrity sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==
+
+dotenv@^17.2.1:
+ version "17.2.1"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.1.tgz#6f32e10faf014883515538dc922a0fb8765d9b32"
+ integrity sha512-kQhDYKZecqnM0fCnzI5eIv5L4cAe/iRI+HqMbO/hbRdTAeXDG+M9FjipUxNfbARuEg4iHIbhnhs78BCHNbSxEQ==
+
+dunder-proto@^1.0.0, dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
+electron-to-chromium@^1.5.199:
+ version "1.5.202"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.202.tgz#e243716943a2cab144604a81b9ebaa87b4e8c1d4"
+ integrity sha512-NxbYjRmiHcHXV1Ws3fWUW+SLb62isauajk45LUJ/HgIOkUA7jLZu/X2Iif+X9FBNK8QkF9Zb4Q2mcwXCcY30mg==
+
+emittery@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
+ integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+entities@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.23.5, es-abstract@^1.23.6, es-abstract@^1.23.9:
+ version "1.24.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.0.tgz#c44732d2beb0acc1ed60df840869e3106e7af328"
+ integrity sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==
+ dependencies:
+ array-buffer-byte-length "^1.0.2"
+ arraybuffer.prototype.slice "^1.0.4"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.4"
+ data-view-buffer "^1.0.2"
+ data-view-byte-length "^1.0.2"
+ data-view-byte-offset "^1.0.1"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ es-set-tostringtag "^2.1.0"
+ es-to-primitive "^1.3.0"
+ function.prototype.name "^1.1.8"
+ get-intrinsic "^1.3.0"
+ get-proto "^1.0.1"
+ get-symbol-description "^1.1.0"
+ globalthis "^1.0.4"
+ gopd "^1.2.0"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ internal-slot "^1.1.0"
+ is-array-buffer "^3.0.5"
+ is-callable "^1.2.7"
+ is-data-view "^1.0.2"
+ is-negative-zero "^2.0.3"
+ is-regex "^1.2.1"
+ is-set "^2.0.3"
+ is-shared-array-buffer "^1.0.4"
+ is-string "^1.1.1"
+ is-typed-array "^1.1.15"
+ is-weakref "^1.1.1"
+ math-intrinsics "^1.1.0"
+ object-inspect "^1.13.4"
+ object-keys "^1.1.1"
+ object.assign "^4.1.7"
+ own-keys "^1.0.1"
+ regexp.prototype.flags "^1.5.4"
+ safe-array-concat "^1.1.3"
+ safe-push-apply "^1.0.0"
+ safe-regex-test "^1.1.0"
+ set-proto "^1.0.0"
+ stop-iteration-iterator "^1.1.0"
+ string.prototype.trim "^1.2.10"
+ string.prototype.trimend "^1.0.9"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.3"
+ typed-array-byte-length "^1.0.3"
+ typed-array-byte-offset "^1.0.4"
+ typed-array-length "^1.0.7"
+ unbox-primitive "^1.1.0"
+ which-typed-array "^1.1.19"
+
+es-define-property@^1.0.0, es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0, es-object-atoms@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1"
+ integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
+ integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
+ dependencies:
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
+es-to-primitive@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18"
+ integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==
+ dependencies:
+ is-callable "^1.2.7"
+ is-date-object "^1.0.5"
+ is-symbol "^1.0.4"
+
+escalade@^3.1.1, escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+esprima@^4.0.0, esprima@~4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estree-to-babel@^3.1.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/estree-to-babel/-/estree-to-babel-3.2.1.tgz#82e78315275c3ca74475fdc8ac1a5103c8a75bf5"
+ integrity sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==
+ dependencies:
+ "@babel/traverse" "^7.1.6"
+ "@babel/types" "^7.2.0"
+ c8 "^7.6.0"
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
+
+expect@^29.0.0, expect@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc"
+ integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==
+ dependencies:
+ "@jest/expect-utils" "^29.7.0"
+ jest-get-type "^29.6.3"
+ jest-matcher-utils "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
+
+fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-uri@^3.0.1:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748"
+ integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==
+
+fast-xml-parser@5.2.5:
+ version "5.2.5"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz#4809fdfb1310494e341098c25cb1341a01a9144a"
+ integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==
+ dependencies:
+ strnum "^2.1.0"
+
+fb-watchman@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
+ integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
+ dependencies:
+ bser "2.1.1"
+
+fill-range@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+ integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+find-up@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
+ integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
+ dependencies:
+ locate-path "^6.0.0"
+ path-exists "^4.0.0"
+
+for-each@^0.3.3, for-each@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47"
+ integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==
+ dependencies:
+ is-callable "^1.2.7"
+
+foreground-child@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53"
+ integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==
+ dependencies:
+ cross-spawn "^7.0.0"
+ signal-exit "^3.0.2"
+
+fs-extra@^11.3.0:
+ version "11.3.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.1.tgz#ba7a1f97a85f94c6db2e52ff69570db3671d5a74"
+ integrity sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+fsevents@^2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.6, function.prototype.name@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.8.tgz#e68e1df7b259a5c949eeef95cdbde53edffabb78"
+ integrity sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ functions-have-names "^1.2.3"
+ hasown "^2.0.2"
+ is-callable "^1.2.7"
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ function-bind "^1.1.2"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.1.0"
+
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
+get-proto@^1.0.0, get-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
+
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+get-symbol-description@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee"
+ integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+
+glob@^7.1.3, glob@^7.1.4:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globalthis@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
+gopd@^1.0.1, gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
+graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.9:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+handlebars@^4.7.8:
+ version "4.7.8"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9"
+ integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==
+ dependencies:
+ minimist "^1.2.5"
+ neo-async "^2.6.2"
+ source-map "^0.6.1"
+ wordwrap "^1.0.0"
+ optionalDependencies:
+ uglify-js "^3.1.4"
+
+has-bigints@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe"
+ integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
+has-proto@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5"
+ integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==
+ dependencies:
+ dunder-proto "^1.0.0"
+
+has-symbols@^1.0.3, has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
+has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
+hash-sum@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
+ integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA==
+
+hasown@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003"
+ integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==
+ dependencies:
+ function-bind "^1.1.2"
+
+he@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+ integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+ignore@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
+import-local@^3.0.2:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260"
+ integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+internal-slot@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961"
+ integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==
+ dependencies:
+ es-errors "^1.3.0"
+ hasown "^2.0.2"
+ side-channel "^1.1.0"
+
+is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280"
+ integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ get-intrinsic "^1.2.6"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-async-function@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523"
+ integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==
+ dependencies:
+ async-function "^1.0.0"
+ call-bound "^1.0.3"
+ get-proto "^1.0.1"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
+
+is-bigint@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672"
+ integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==
+ dependencies:
+ has-bigints "^1.0.2"
+
+is-boolean-object@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e"
+ integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.16.0:
+ version "2.16.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4"
+ integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==
+ dependencies:
+ hasown "^2.0.2"
+
+is-data-view@^1.0.1, is-data-view@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e"
+ integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==
+ dependencies:
+ call-bound "^1.0.2"
+ get-intrinsic "^1.2.6"
+ is-typed-array "^1.1.13"
+
+is-date-object@^1.0.5, is-date-object@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7"
+ integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==
+ dependencies:
+ call-bound "^1.0.2"
+ has-tostringtag "^1.0.2"
+
+is-expression@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f"
+ integrity sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw==
+ dependencies:
+ acorn "~4.0.2"
+ object-assign "^4.0.1"
+
+is-finalizationregistry@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90"
+ integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==
+ dependencies:
+ call-bound "^1.0.3"
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
+is-generator-function@^1.0.10:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.0.tgz#bf3eeda931201394f57b5dba2800f91a238309ca"
+ integrity sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==
+ dependencies:
+ call-bound "^1.0.3"
+ get-proto "^1.0.0"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
+
+is-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
+ integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
+
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
+is-number-object@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541"
+ integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-promise@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
+ integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
+
+is-regex@^1.0.3, is-regex@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22"
+ integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==
+ dependencies:
+ call-bound "^1.0.2"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
+is-set@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
+ integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
+
+is-shared-array-buffer@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f"
+ integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==
+ dependencies:
+ call-bound "^1.0.3"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9"
+ integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
+is-symbol@^1.0.4, is-symbol@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634"
+ integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==
+ dependencies:
+ call-bound "^1.0.2"
+ has-symbols "^1.1.0"
+ safe-regex-test "^1.1.0"
+
+is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b"
+ integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==
+ dependencies:
+ which-typed-array "^1.1.16"
+
+is-weakmap@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
+ integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
+
+is-weakref@^1.0.2, is-weakref@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293"
+ integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==
+ dependencies:
+ call-bound "^1.0.3"
+
+is-weakset@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca"
+ integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==
+ dependencies:
+ call-bound "^1.0.3"
+ get-intrinsic "^1.2.6"
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756"
+ integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==
+
+istanbul-lib-instrument@^5.0.4:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
+ integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==
+ dependencies:
+ "@babel/core" "^7.12.3"
+ "@babel/parser" "^7.14.7"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^6.3.0"
+
+istanbul-lib-instrument@^6.0.0:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765"
+ integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==
+ dependencies:
+ "@babel/core" "^7.23.9"
+ "@babel/parser" "^7.23.9"
+ "@istanbuljs/schema" "^0.1.3"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^7.5.4"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^4.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.1.3:
+ version "3.1.7"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b"
+ integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+istanbul-reports@^3.1.4:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.2.0.tgz#cb4535162b5784aa623cee21a7252cf2c807ac93"
+ integrity sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+jest-changed-files@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a"
+ integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==
+ dependencies:
+ execa "^5.0.0"
+ jest-util "^29.7.0"
+ p-limit "^3.1.0"
+
+jest-circus@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a"
+ integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==
+ dependencies:
+ "@jest/environment" "^29.7.0"
+ "@jest/expect" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ dedent "^1.0.0"
+ is-generator-fn "^2.0.0"
+ jest-each "^29.7.0"
+ jest-matcher-utils "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-runtime "^29.7.0"
+ jest-snapshot "^29.7.0"
+ jest-util "^29.7.0"
+ p-limit "^3.1.0"
+ pretty-format "^29.7.0"
+ pure-rand "^6.0.0"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-cli@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995"
+ integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==
+ dependencies:
+ "@jest/core" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ chalk "^4.0.0"
+ create-jest "^29.7.0"
+ exit "^0.1.2"
+ import-local "^3.0.2"
+ jest-config "^29.7.0"
+ jest-util "^29.7.0"
+ jest-validate "^29.7.0"
+ yargs "^17.3.1"
+
+jest-config@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f"
+ integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@jest/test-sequencer" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ babel-jest "^29.7.0"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ deepmerge "^4.2.2"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-circus "^29.7.0"
+ jest-environment-node "^29.7.0"
+ jest-get-type "^29.6.3"
+ jest-regex-util "^29.6.3"
+ jest-resolve "^29.7.0"
+ jest-runner "^29.7.0"
+ jest-util "^29.7.0"
+ jest-validate "^29.7.0"
+ micromatch "^4.0.4"
+ parse-json "^5.2.0"
+ pretty-format "^29.7.0"
+ slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a"
+ integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^29.6.3"
+ jest-get-type "^29.6.3"
+ pretty-format "^29.7.0"
+
+jest-docblock@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a"
+ integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1"
+ integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ chalk "^4.0.0"
+ jest-get-type "^29.6.3"
+ jest-util "^29.7.0"
+ pretty-format "^29.7.0"
+
+jest-environment-node@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376"
+ integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==
+ dependencies:
+ "@jest/environment" "^29.7.0"
+ "@jest/fake-timers" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ jest-mock "^29.7.0"
+ jest-util "^29.7.0"
+
+jest-get-type@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1"
+ integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==
+
+jest-haste-map@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104"
+ integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/graceful-fs" "^4.1.3"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^29.6.3"
+ jest-util "^29.7.0"
+ jest-worker "^29.7.0"
+ micromatch "^4.0.4"
+ walker "^1.0.8"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
+jest-leak-detector@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728"
+ integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==
+ dependencies:
+ jest-get-type "^29.6.3"
+ pretty-format "^29.7.0"
+
+jest-matcher-utils@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12"
+ integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^29.7.0"
+ jest-get-type "^29.6.3"
+ pretty-format "^29.7.0"
+
+jest-message-util@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3"
+ integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^29.6.3"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^29.7.0"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-mock@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347"
+ integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ jest-util "^29.7.0"
+
+jest-pnp-resolver@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
+ integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
+
+jest-regex-util@^29.6.3:
+ version "29.6.3"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52"
+ integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==
+
+jest-resolve-dependencies@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428"
+ integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==
+ dependencies:
+ jest-regex-util "^29.6.3"
+ jest-snapshot "^29.7.0"
+
+jest-resolve@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30"
+ integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==
+ dependencies:
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^29.7.0"
+ jest-pnp-resolver "^1.2.2"
+ jest-util "^29.7.0"
+ jest-validate "^29.7.0"
+ resolve "^1.20.0"
+ resolve.exports "^2.0.0"
+ slash "^3.0.0"
+
+jest-runner@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e"
+ integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==
+ dependencies:
+ "@jest/console" "^29.7.0"
+ "@jest/environment" "^29.7.0"
+ "@jest/test-result" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ emittery "^0.13.1"
+ graceful-fs "^4.2.9"
+ jest-docblock "^29.7.0"
+ jest-environment-node "^29.7.0"
+ jest-haste-map "^29.7.0"
+ jest-leak-detector "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-resolve "^29.7.0"
+ jest-runtime "^29.7.0"
+ jest-util "^29.7.0"
+ jest-watcher "^29.7.0"
+ jest-worker "^29.7.0"
+ p-limit "^3.1.0"
+ source-map-support "0.5.13"
+
+jest-runtime@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817"
+ integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==
+ dependencies:
+ "@jest/environment" "^29.7.0"
+ "@jest/fake-timers" "^29.7.0"
+ "@jest/globals" "^29.7.0"
+ "@jest/source-map" "^29.6.3"
+ "@jest/test-result" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ cjs-module-lexer "^1.0.0"
+ collect-v8-coverage "^1.0.0"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-mock "^29.7.0"
+ jest-regex-util "^29.6.3"
+ jest-resolve "^29.7.0"
+ jest-snapshot "^29.7.0"
+ jest-util "^29.7.0"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+
+jest-snapshot@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5"
+ integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==
+ dependencies:
+ "@babel/core" "^7.11.6"
+ "@babel/generator" "^7.7.2"
+ "@babel/plugin-syntax-jsx" "^7.7.2"
+ "@babel/plugin-syntax-typescript" "^7.7.2"
+ "@babel/types" "^7.3.3"
+ "@jest/expect-utils" "^29.7.0"
+ "@jest/transform" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ babel-preset-current-node-syntax "^1.0.0"
+ chalk "^4.0.0"
+ expect "^29.7.0"
+ graceful-fs "^4.2.9"
+ jest-diff "^29.7.0"
+ jest-get-type "^29.6.3"
+ jest-matcher-utils "^29.7.0"
+ jest-message-util "^29.7.0"
+ jest-util "^29.7.0"
+ natural-compare "^1.4.0"
+ pretty-format "^29.7.0"
+ semver "^7.5.3"
+
+jest-util@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc"
+ integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
+jest-validate@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c"
+ integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==
+ dependencies:
+ "@jest/types" "^29.6.3"
+ camelcase "^6.2.0"
+ chalk "^4.0.0"
+ jest-get-type "^29.6.3"
+ leven "^3.1.0"
+ pretty-format "^29.7.0"
+
+jest-watcher@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2"
+ integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==
+ dependencies:
+ "@jest/test-result" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ emittery "^0.13.1"
+ jest-util "^29.7.0"
+ string-length "^4.0.1"
+
+jest-worker@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a"
+ integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==
+ dependencies:
+ "@types/node" "*"
+ jest-util "^29.7.0"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jest@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613"
+ integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==
+ dependencies:
+ "@jest/core" "^29.7.0"
+ "@jest/types" "^29.6.3"
+ import-local "^3.0.2"
+ jest-cli "^29.7.0"
+
+js-stringify@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
+ integrity sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js2xmlparser@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a"
+ integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==
+ dependencies:
+ xmlcreate "^2.0.4"
+
+jsdoc-plugin-typescript@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/jsdoc-plugin-typescript/-/jsdoc-plugin-typescript-3.2.0.tgz#044daa753417ee88db07fb51051aa07d8677ef72"
+ integrity sha512-9AbhhBo+mA6N8KV7Q2r/ucNpG7NEALrUqeWgIzszkXEylvyuC26eK9hkB81Wjav2+rmJEbZkvAhA2zuNUgw5Zg==
+ dependencies:
+ string.prototype.matchall "^4.0.0"
+
+jsdoc@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/jsdoc/-/jsdoc-4.0.4.tgz#86565a9e39cc723a3640465b3fb189a22d1206ca"
+ integrity sha512-zeFezwyXeG4syyYHbvh1A967IAqq/67yXtXvuL5wnqCkFZe8I0vKfm+EO+YEvLguo6w9CDUbrAXVtJSHh2E8rw==
+ dependencies:
+ "@babel/parser" "^7.20.15"
+ "@jsdoc/salty" "^0.2.1"
+ "@types/markdown-it" "^14.1.1"
+ bluebird "^3.7.2"
+ catharsis "^0.9.0"
+ escape-string-regexp "^2.0.0"
+ js2xmlparser "^4.0.2"
+ klaw "^3.0.0"
+ markdown-it "^14.1.0"
+ markdown-it-anchor "^8.6.7"
+ marked "^4.0.10"
+ mkdirp "^1.0.4"
+ requizzle "^0.2.3"
+ strip-json-comments "^3.1.0"
+ underscore "~1.13.2"
+
+jsesc@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d"
+ integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+jsonfile@^6.0.1:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62"
+ integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==
+ dependencies:
+ universalify "^2.0.0"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonschema@^1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.5.0.tgz#f6aceb1ab9123563dd901d05f81f9d4883d3b7d8"
+ integrity sha512-K+A9hhqbn0f3pJX17Q/7H6yQfD/5OXgdrR5UE12gMXCiN9D5Xq2o5mddV2QEcX/bjla99ASsAAQUyMCCRWAEhw==
+
+jsonschema@~1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab"
+ integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==
+
+jstransformer@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
+ integrity sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==
+ dependencies:
+ is-promise "^2.0.0"
+ promise "^7.0.1"
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
+ dependencies:
+ is-buffer "^1.1.5"
+
+klaw@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-3.0.0.tgz#b11bec9cf2492f06756d6e809ab73a2910259146"
+ integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==
+ dependencies:
+ graceful-fs "^4.1.9"
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+ integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+linkify-it@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421"
+ integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==
+ dependencies:
+ uc.micro "^2.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+locate-path@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286"
+ integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==
+ dependencies:
+ p-locate "^5.0.0"
+
+lodash.get@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
+ integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+ integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
+
+lodash.truncate@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
+ integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==
+
+lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+ integrity sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==
+
+loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+ dependencies:
+ semver "^7.5.3"
+
+make-error@^1.1.1, make-error@^1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
+ integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
+
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
+ dependencies:
+ tmpl "1.0.5"
+
+markdown-it-anchor@^8.6.7:
+ version "8.6.7"
+ resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634"
+ integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==
+
+markdown-it@^14.1.0:
+ version "14.1.0"
+ resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.0.tgz#3c3c5992883c633db4714ccb4d7b5935d98b7d45"
+ integrity sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==
+ dependencies:
+ argparse "^2.0.1"
+ entities "^4.4.0"
+ linkify-it "^5.0.0"
+ mdurl "^2.0.0"
+ punycode.js "^2.3.1"
+ uc.micro "^2.1.0"
+
+marked@^4.0.10:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3"
+ integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==
+
+math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
+mdurl@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0"
+ integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+micromatch@^4.0.4:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+ dependencies:
+ braces "^3.0.3"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.35:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+min-indent@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
+ integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
+
+minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.2.5:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+mkdirp@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+ integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
+ms@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+neo-async@^2.6.1, neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+node-dir@^0.1.10:
+ version "0.1.17"
+ resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5"
+ integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==
+ dependencies:
+ minimatch "^3.0.2"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
+
+node-releases@^2.0.19:
+ version "2.0.19"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314"
+ integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==
+
+normalize-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.13.3, object-inspect@^1.13.4:
+ version "1.13.4"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
+ integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.7:
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d"
+ integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+ has-symbols "^1.1.0"
+ object-keys "^1.1.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+own-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.1.tgz#e4006910a2bf913585289676eebd6f390cf51358"
+ integrity sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==
+ dependencies:
+ get-intrinsic "^1.2.6"
+ object-keys "^1.1.1"
+ safe-push-apply "^1.0.0"
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2, p-limit@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-locate@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834"
+ integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==
+ dependencies:
+ p-limit "^3.0.2"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-json@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picocolors@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
+ integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
+
+picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pirates@^4.0.4:
+ version "4.0.7"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.7.tgz#643b4a18c4257c8a65104b73f3049ce9a0a15e22"
+ integrity sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+possible-typed-array-names@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae"
+ integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==
+
+pretty-format@^29.0.0, pretty-format@^29.7.0:
+ version "29.7.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812"
+ integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==
+ dependencies:
+ "@jest/schemas" "^29.6.3"
+ ansi-styles "^5.0.0"
+ react-is "^18.0.0"
+
+private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+promise@^7.0.1:
+ version "7.3.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
+ integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
+ dependencies:
+ asap "~2.0.3"
+
+prompts@^2.0.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+prop-types@^15.7.2:
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
+
+pug-attrs@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336"
+ integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==
+ dependencies:
+ constantinople "^3.0.1"
+ js-stringify "^1.0.1"
+ pug-runtime "^2.0.5"
+
+pug-code-gen@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.3.tgz#122eb9ada9b5bf601705fe15aaa0a7d26bc134ab"
+ integrity sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==
+ dependencies:
+ constantinople "^3.1.2"
+ doctypes "^1.1.0"
+ js-stringify "^1.0.1"
+ pug-attrs "^2.0.4"
+ pug-error "^1.3.3"
+ pug-runtime "^2.0.5"
+ void-elements "^2.0.1"
+ with "^5.0.0"
+
+pug-error@^1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6"
+ integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==
+
+pug-filters@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7"
+ integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==
+ dependencies:
+ clean-css "^4.1.11"
+ constantinople "^3.0.1"
+ jstransformer "1.0.0"
+ pug-error "^1.3.3"
+ pug-walk "^1.1.8"
+ resolve "^1.1.6"
+ uglify-js "^2.6.1"
+
+pug-lexer@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd"
+ integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==
+ dependencies:
+ character-parser "^2.1.1"
+ is-expression "^3.0.0"
+ pug-error "^1.3.3"
+
+pug-linker@^3.0.6:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb"
+ integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==
+ dependencies:
+ pug-error "^1.3.3"
+ pug-walk "^1.1.8"
+
+pug-load@^2.0.12:
+ version "2.0.12"
+ resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b"
+ integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==
+ dependencies:
+ object-assign "^4.1.0"
+ pug-walk "^1.1.8"
+
+pug-parser@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9"
+ integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==
+ dependencies:
+ pug-error "^1.3.3"
+ token-stream "0.0.1"
+
+pug-runtime@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a"
+ integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==
+
+pug-strip-comments@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8"
+ integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==
+ dependencies:
+ pug-error "^1.3.3"
+
+pug-walk@^1.1.8:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a"
+ integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==
+
+pug@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d"
+ integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==
+ dependencies:
+ pug-code-gen "^2.0.2"
+ pug-filters "^3.1.1"
+ pug-lexer "^4.1.0"
+ pug-linker "^3.0.6"
+ pug-load "^2.0.12"
+ pug-parser "^5.0.1"
+ pug-runtime "^2.0.5"
+ pug-strip-comments "^1.0.4"
+
+punycode.js@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7"
+ integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==
+
+punycode@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
+pure-rand@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2"
+ integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==
+
+react-ace@^9.5.0:
+ version "9.5.0"
+ resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-9.5.0.tgz#b6c32b70d404dd821a7e01accc2d76da667ff1f7"
+ integrity sha512-4l5FgwGh6K7A0yWVMQlPIXDItM4Q9zzXRqOae8KkCl6MkOob7sC1CzHxZdOGvV+QioKWbX2p5HcdOVUv6cAdSg==
+ dependencies:
+ ace-builds "^1.4.13"
+ diff-match-patch "^1.0.5"
+ lodash.get "^4.4.2"
+ lodash.isequal "^4.5.0"
+ prop-types "^15.7.2"
+
+react-docgen@^5.4.0:
+ version "5.4.3"
+ resolved "https://registry.yarnpkg.com/react-docgen/-/react-docgen-5.4.3.tgz#7d297f73b977d0c7611402e5fc2a168acf332b26"
+ integrity sha512-xlLJyOlnfr8lLEEeaDZ+X2J/KJoe6Nr9AzxnkdQWush5hz2ZSu66w6iLMOScMmxoSHWpWMn+k3v5ZiyCfcWsOA==
+ dependencies:
+ "@babel/core" "^7.7.5"
+ "@babel/generator" "^7.12.11"
+ "@babel/runtime" "^7.7.6"
+ ast-types "^0.14.2"
+ commander "^2.19.0"
+ doctrine "^3.0.0"
+ estree-to-babel "^3.1.0"
+ neo-async "^2.6.1"
+ node-dir "^0.1.10"
+ strip-indent "^3.0.0"
+
+react-frame-component@^5.2.1:
+ version "5.2.7"
+ resolved "https://registry.yarnpkg.com/react-frame-component/-/react-frame-component-5.2.7.tgz#e31c0943be95fdf667c59d6d7fcf18c1dda4d4b2"
+ integrity sha512-ROjHtSLoSVYUBfTieazj/nL8jIX9rZFmHC0yXEU+dx6Y82OcBEGgU9o7VyHMrBFUN9FuQ849MtIPNNLsb4krbg==
+
+react-is@^16.13.1:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-is@^18.0.0:
+ version "18.3.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e"
+ integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==
+
+recast@^0.17.3:
+ version "0.17.6"
+ resolved "https://registry.yarnpkg.com/recast/-/recast-0.17.6.tgz#64ae98d0d2dfb10ff92ff5fb9ffb7371823b69fa"
+ integrity sha512-yoQRMRrK1lszNtbkGyM4kN45AwylV5hMiuEveUBlxytUViWevjvX6w+tzJt1LH4cfUhWt4NZvy3ThIhu6+m5wQ==
+ dependencies:
+ ast-types "0.12.4"
+ esprima "~4.0.0"
+ private "^0.1.8"
+ source-map "~0.6.1"
+
+reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9"
+ integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.9"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.7"
+ get-proto "^1.0.1"
+ which-builtin-type "^1.2.1"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regexp.prototype.flags@^1.5.3, regexp.prototype.flags@^1.5.4:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19"
+ integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ set-function-name "^2.0.2"
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+requizzle@^0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/requizzle/-/requizzle-0.2.4.tgz#319eb658b28c370f0c20f968fa8ceab98c13d27c"
+ integrity sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==
+ dependencies:
+ lodash "^4.17.21"
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve.exports@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f"
+ integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==
+
+resolve@^1.1.6, resolve@^1.20.0:
+ version "1.22.10"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39"
+ integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==
+ dependencies:
+ is-core-module "^2.16.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ integrity sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+safe-array-concat@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3"
+ integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ get-intrinsic "^1.2.6"
+ has-symbols "^1.1.0"
+ isarray "^2.0.5"
+
+safe-push-apply@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5"
+ integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==
+ dependencies:
+ es-errors "^1.3.0"
+ isarray "^2.0.5"
+
+safe-regex-test@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1"
+ integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ is-regex "^1.2.1"
+
+semver@^6.3.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.5.3, semver@^7.5.4, semver@^7.7.2:
+ version "7.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
+ integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
+
+set-function-length@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+
+set-proto@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e"
+ integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel-list@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad"
+ integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
+side-channel@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9"
+ integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.3"
+ side-channel-list "^1.0.0"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
+
+signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+slice-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
+ integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
+ dependencies:
+ ansi-styles "^4.0.0"
+ astral-regex "^2.0.0"
+ is-fullwidth-code-point "^3.0.0"
+
+source-map-support@0.5.13:
+ version "0.5.13"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
+ integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@~0.5.1:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stack-utils@^2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
+ integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+stop-iteration-iterator@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad"
+ integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==
+ dependencies:
+ es-errors "^1.3.0"
+ internal-slot "^1.1.0"
+
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string.prototype.matchall@^4.0.0:
+ version "4.0.12"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz#6c88740e49ad4956b1332a911e949583a275d4c0"
+ integrity sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.6"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.6"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ internal-slot "^1.1.0"
+ regexp.prototype.flags "^1.5.3"
+ set-function-name "^2.0.2"
+ side-channel "^1.1.0"
+
+string.prototype.trim@^1.2.10:
+ version "1.2.10"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81"
+ integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ define-data-property "^1.1.4"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-object-atoms "^1.0.0"
+ has-property-descriptors "^1.0.2"
+
+string.prototype.trimend@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942"
+ integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.2"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-indent@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001"
+ integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==
+ dependencies:
+ min-indent "^1.0.0"
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+strnum@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.1.1.tgz#cf2a6e0cf903728b8b2c4b971b7e36b4e82d46ab"
+ integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+table@^6.9.0:
+ version "6.9.0"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5"
+ integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==
+ dependencies:
+ ajv "^8.0.1"
+ lodash.truncate "^4.4.2"
+ slice-ansi "^4.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+token-stream@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
+ integrity sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==
+
+ts-jest@^29.2.5:
+ version "29.4.1"
+ resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.4.1.tgz#42d33beb74657751d315efb9a871fe99e3b9b519"
+ integrity sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==
+ dependencies:
+ bs-logger "^0.2.6"
+ fast-json-stable-stringify "^2.1.0"
+ handlebars "^4.7.8"
+ json5 "^2.2.3"
+ lodash.memoize "^4.1.2"
+ make-error "^1.3.6"
+ semver "^7.7.2"
+ type-fest "^4.41.0"
+ yargs-parser "^21.1.1"
+
+ts-map@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/ts-map/-/ts-map-1.0.3.tgz#1c4d218dec813d2103b7e04e4bcf348e1471c1ff"
+ integrity sha512-vDWbsl26LIcPGmDpoVzjEP6+hvHZkBkLW7JpvwbCv/5IYPJlsbzCVXY3wsCeAxAUeTclNOUZxnLdGh3VBD/J6w==
+
+ts-node@^10.9.2:
+ version "10.9.2"
+ resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f"
+ integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==
+ dependencies:
+ "@cspotcode/source-map-support" "^0.8.0"
+ "@tsconfig/node10" "^1.0.7"
+ "@tsconfig/node12" "^1.0.7"
+ "@tsconfig/node14" "^1.0.0"
+ "@tsconfig/node16" "^1.0.2"
+ acorn "^8.4.1"
+ acorn-walk "^8.1.1"
+ arg "^4.1.0"
+ create-require "^1.1.0"
+ diff "^4.0.1"
+ make-error "^1.1.1"
+ v8-compile-cache-lib "^3.0.1"
+ yn "3.1.1"
+
+tslib@^2.0.1, tslib@^2.6.2:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^4.41.0:
+ version "4.41.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58"
+ integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==
+
+typed-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536"
+ integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.14"
+
+typed-array-byte-length@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce"
+ integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==
+ dependencies:
+ call-bind "^1.0.8"
+ for-each "^0.3.3"
+ gopd "^1.2.0"
+ has-proto "^1.2.0"
+ is-typed-array "^1.1.14"
+
+typed-array-byte-offset@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355"
+ integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ for-each "^0.3.3"
+ gopd "^1.2.0"
+ has-proto "^1.2.0"
+ is-typed-array "^1.1.15"
+ reflect.getprototypeof "^1.0.9"
+
+typed-array-length@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d"
+ integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==
+ dependencies:
+ call-bind "^1.0.7"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ is-typed-array "^1.1.13"
+ possible-typed-array-names "^1.0.0"
+ reflect.getprototypeof "^1.0.6"
+
+typescript@^3.2.2:
+ version "3.9.10"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8"
+ integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==
+
+typescript@^4.5.4:
+ version "4.9.5"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
+ integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==
+
+typescript@~5.6.3:
+ version "5.6.3"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b"
+ integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==
+
+uc.micro@^2.0.0, uc.micro@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee"
+ integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==
+
+uglify-js@^2.6.1:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ integrity sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-js@^3.1.4:
+ version "3.19.3"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.19.3.tgz#82315e9bbc6f2b25888858acd1fff8441035b77f"
+ integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+ integrity sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==
+
+unbox-primitive@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2"
+ integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==
+ dependencies:
+ call-bound "^1.0.3"
+ has-bigints "^1.0.2"
+ has-symbols "^1.1.0"
+ which-boxed-primitive "^1.1.1"
+
+underscore@^1.13.2, underscore@~1.13.2:
+ version "1.13.7"
+ resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.7.tgz#970e33963af9a7dda228f17ebe8399e5fbe63a10"
+ integrity sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==
+
+undici-types@~6.19.2:
+ version "6.19.8"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+
+undici-types@~7.10.0:
+ version "7.10.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.10.0.tgz#4ac2e058ce56b462b056e629cc6a02393d3ff350"
+ integrity sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==
+
+universalify@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d"
+ integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==
+
+update-browserslist-db@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420"
+ integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==
+ dependencies:
+ escalade "^3.2.0"
+ picocolors "^1.1.1"
+
+uuid@^9.0.1:
+ version "9.0.1"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
+ integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
+
+v8-compile-cache-lib@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+ integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+
+v8-to-istanbul@^9.0.0, v8-to-istanbul@^9.0.1:
+ version "9.3.0"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175"
+ integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.12"
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^2.0.0"
+
+void-elements@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
+ integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==
+
+vue-docgen-api@^3.26.0:
+ version "3.26.0"
+ resolved "https://registry.yarnpkg.com/vue-docgen-api/-/vue-docgen-api-3.26.0.tgz#2afc6a39e72862fbbc60ceb8510c681749f05460"
+ integrity sha512-ujdg4i5ZI/wE46RZQMFzKnDGyhEuPCu+fMA86CAd9EIek/6+OqraSVBm5ZkLrbEd5f8xxdnqMU4yiSGHHeao/Q==
+ dependencies:
+ "@babel/parser" "^7.2.3"
+ "@babel/types" "^7.0.0"
+ ast-types "^0.12.2"
+ hash-sum "^1.0.2"
+ lru-cache "^4.1.5"
+ pug "^2.0.3"
+ recast "^0.17.3"
+ ts-map "^1.0.3"
+ typescript "^3.2.2"
+ vue-template-compiler "^2.0.0"
+
+vue-template-compiler@^2.0.0:
+ version "2.7.16"
+ resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz#c81b2d47753264c77ac03b9966a46637482bb03b"
+ integrity sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==
+ dependencies:
+ de-indent "^1.0.2"
+ he "^1.2.0"
+
+vue2-ace-editor@^0.0.15:
+ version "0.0.15"
+ resolved "https://registry.yarnpkg.com/vue2-ace-editor/-/vue2-ace-editor-0.0.15.tgz#569b208e54ae771ae1edd3b8902ac42f0edc74e3"
+ integrity sha512-e3TR9OGXc71cGpvYcW068lNpRcFt3+OONCC81oxHL/0vwl/V3OgqnNMw2/RRolgQkO/CA5AjqVHWmANWKOtNnQ==
+ dependencies:
+ brace "^0.11.0"
+
+walker@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
+
+which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e"
+ integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==
+ dependencies:
+ is-bigint "^1.1.0"
+ is-boolean-object "^1.2.1"
+ is-number-object "^1.1.1"
+ is-string "^1.1.1"
+ is-symbol "^1.1.1"
+
+which-builtin-type@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e"
+ integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==
+ dependencies:
+ call-bound "^1.0.2"
+ function.prototype.name "^1.1.6"
+ has-tostringtag "^1.0.2"
+ is-async-function "^2.0.0"
+ is-date-object "^1.1.0"
+ is-finalizationregistry "^1.1.0"
+ is-generator-function "^1.0.10"
+ is-regex "^1.2.1"
+ is-weakref "^1.0.2"
+ isarray "^2.0.5"
+ which-boxed-primitive "^1.1.0"
+ which-collection "^1.0.2"
+ which-typed-array "^1.1.16"
+
+which-collection@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
+ integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
+ dependencies:
+ is-map "^2.0.3"
+ is-set "^2.0.3"
+ is-weakmap "^2.0.2"
+ is-weakset "^2.0.3"
+
+which-typed-array@^1.1.16, which-typed-array@^1.1.19:
+ version "1.1.19"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.19.tgz#df03842e870b6b88e117524a4b364b6fc689f956"
+ integrity sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.4"
+ for-each "^0.3.5"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+ integrity sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==
+
+with@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe"
+ integrity sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg==
+ dependencies:
+ acorn "^3.1.0"
+ acorn-globals "^3.0.0"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+ integrity sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==
+
+wordwrap@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+write-file-atomic@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd"
+ integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==
+ dependencies:
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.7"
+
+xmlcreate@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/xmlcreate/-/xmlcreate-2.0.4.tgz#0c5ab0f99cdd02a81065fa9cd8f8ae87624889be"
+ integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yaml@1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@^20.2.2, yargs-parser@^20.2.9:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ 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"
+
+yargs@^17.3.1:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+ dependencies:
+ cliui "^8.0.1"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.3"
+ y18n "^5.0.5"
+ yargs-parser "^21.1.1"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ integrity sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
+
+yn@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+ integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/ci/buildspec/build_partners.yml b/ci/buildspec/build_partners.yml
index c6c8a6886d9..15eff1d3bfd 100644
--- a/ci/buildspec/build_partners.yml
+++ b/ci/buildspec/build_partners.yml
@@ -15,12 +15,10 @@ phases:
pre_build:
commands:
- aws ecr get-login-password --region "${ECR_REGION}" | docker login --username AWS --password-stdin "${ECR_ACCOUNT_ID}.dkr.ecr.${ECR_REGION}.amazonaws.com"
-
build:
commands:
- export ECR_HOST="${ECR_ACCOUNT_ID}.dkr.ecr.${ECR_REGION}.amazonaws.com"
- export ECR_REPO="${ECR_HOST}/${ECR_NAMESPACE}"
-
# Build test image
- >
docker build . -f build/docker/Dockerfile.sites-generic
@@ -64,10 +62,13 @@ phases:
--build-arg "LOTTERY_DAYS_TILL_EXPIRY=${LOTTERY_DAYS_TILL_EXPIRY}"
--build-arg "LIMIT_CLOSED_LISTING_ACTIONS=${LIMIT_CLOSED_LISTING_ACTIONS}"
--build-arg "USE_SECURE_DOWNLOAD_PATHWAY=${USE_SECURE_DOWNLOAD_PATHWAY}"
- -t sites/partners:run-candidate
+ -t sites/partners:run-${ENVIRONMENT}-candidate
# Tag the run image
- - docker tag sites/partners:run-candidate "${ECR_REPO}/partners:run-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
+ - docker tag sites/partners:run-${ENVIRONMENT}-candidate "${ECR_REPO}/partners:run-${ENVIRONMENT}-candidate"
+ - docker tag sites/partners:run-${ENVIRONMENT}-candidate "${ECR_REPO}/partners:run-${ENVIRONMENT}-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
# Push the run image to ECR
- - docker push "${ECR_REPO}/partners:run-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
+ - docker push "${ECR_REPO}/partners:run-${ENVIRONMENT}-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
+ - docker push "${ECR_REPO}/partners:run-${ENVIRONMENT}-candidate"
+
diff --git a/ci/buildspec/build_public.yml b/ci/buildspec/build_public.yml
index b4e30d0d22e..ec172d26152 100644
--- a/ci/buildspec/build_public.yml
+++ b/ci/buildspec/build_public.yml
@@ -85,11 +85,13 @@ phases:
--build-arg "GOOGLE_MAPS_MAP_ID=${GOOGLE_MAPS_MAP_ID}"
--build-arg "SHOW_ALL_MAP_PINS=${SHOW_ALL_MAP_PINS}"
--target run
- -t sites/public:run-candidate
+ -t sites/public:run-${ENVIRONMENT}-candidate
.
# Tag the run image
- - docker tag sites/public:run-candidate "${ECR_REPO}/public:run-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
+ - docker tag sites/public:run-${ENVIRONMENT}-candidate "${ECR_REPO}/public:run-${ENVIRONMENT}-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
+ - docker tag sites/public:run-${ENVIRONMENT}-candidate "${ECR_REPO}/public:run-${ENVIRONMENT}-candidate"
# Push the run image to ECR
- - docker push "${ECR_REPO}/public:run-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
+ - docker push "${ECR_REPO}/public:run-${ENVIRONMENT}-candidate"
+ - docker push "${ECR_REPO}/public:run-${ENVIRONMENT}-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
diff --git a/ci/buildspec/cdk_deploy.yml b/ci/buildspec/cdk_deploy.yml
new file mode 100644
index 00000000000..4e8f2115e11
--- /dev/null
+++ b/ci/buildspec/cdk_deploy.yml
@@ -0,0 +1,15 @@
+# AWS CodeBuild config
+# This file is referenced in the infra repo as a CodeBuild buildspec target.
+## The environment variables in this file are passed in through the buildbuild resource.
+## Check the terraform scripts to see where these variables originate from.
+version: 0.2
+env:
+ shell: bash
+phases:
+ build:
+ commands:
+ - npm install -g yarn
+ - npm install -g aws-cdk
+ - cd ${CODEBUILD_SRC_DIR}/cdk
+ - yarn install
+ - cdk deploy DoorwayCloudFrontStack-${ENVIRONMENT} --require-approval never
diff --git a/ci/buildspec/migrate.yml b/ci/buildspec/migrate.yml
index 5c7ff7c1090..c9c42c1d855 100644
--- a/ci/buildspec/migrate.yml
+++ b/ci/buildspec/migrate.yml
@@ -7,13 +7,6 @@
version: 0.2
env:
shell: bash
- secrets-manager:
- PGUSER: "${DB_CREDS_ARN}:user"
- PGPASSWORD: "${DB_CREDS_ARN}:password"
- PGHOST: "${DB_CREDS_ARN}:host"
- PGDATABASE: "${DB_CREDS_ARN}:db_name"
- PGPORT: "${DB_CREDS_ARN}:port"
- DATABASE_URL: "${DB_CREDS_ARN}:uri"
phases:
pre_build:
@@ -22,14 +15,24 @@ phases:
build:
commands:
- export ECR_REPO="${ECR_ACCOUNT_ID}.dkr.ecr.${ECR_REGION}.amazonaws.com/${ECR_NAMESPACE}"
-
+ #FIXME: switch back to migration image once we have migrations to run
+ #- export MIGRATION_IMAGE="${ECR_REPO}/backend:migrate-candidate"
- export MIGRATION_IMAGE="${ECR_REPO}/backend:migrate-${CODEBUILD_RESOLVED_SOURCE_VERSION:0:8}"
+ - export PGUSER=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."username")
+ - export PGPASSWORD=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."password")
+ - export PGPORT=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."port")
+ - export PGHOST=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."host")
+ - export PGDATABASE=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."dbname")
# Pull down migration candidate image
- docker pull "${MIGRATION_IMAGE}"
# Default to db:migration:run
- export MIGRATION_CMD="${MIGRATION_CMD:-db:migration:run}"
+ # URL encode the password to handle special characters
+ - export ENCODED_PASSWORD=$(python3 -c "import urllib.parse; print(urllib.parse.quote('${PGPASSWORD}', safe=''))")
+ - export DATABASE_URL="postgres://${PGUSER}:${ENCODED_PASSWORD}@${PGHOST}:${PGPORT}/${PGDATABASE}"
+ - echo "Database URL (password masked):postgres://${PGUSER}:***@${PGHOST}:${PGPORT}/${PGDATABASE}"
# Execute migration
# Note that many of these vars are required by the app but not used for migration
@@ -38,7 +41,7 @@ phases:
--env PGUSER="${PGUSER}"
--env PGPASSWORD="${PGPASSWORD}"
--env PGHOST="${PGHOST}"
- --env PGDATABASE=template1
+ --env PGDATABASE="${PGDATABASE}"
--env PGPORT="${PGPORT}"
--env DATABASE_URL="${DATABASE_URL}"
--env CLOUDINARY_CLOUD_NAME="${CLOUDINARY_CLOUD_NAME}"
diff --git a/ci/buildspec/migrate_stop_backend.yml b/ci/buildspec/migrate_stop_backend.yml
index ea82d398cf8..6b6579523ce 100644
--- a/ci/buildspec/migrate_stop_backend.yml
+++ b/ci/buildspec/migrate_stop_backend.yml
@@ -5,13 +5,6 @@
version: 0.2
env:
shell: bash
- secrets-manager:
- PGUSER: "${DB_CREDS_ARN}:user"
- PGPASSWORD: "${DB_CREDS_ARN}:password"
- PGHOST: "${DB_CREDS_ARN}:host"
- PGDATABASE: "${DB_CREDS_ARN}:db_name"
- PGPORT: "${DB_CREDS_ARN}:port"
- DATABASE_URL: "${DB_CREDS_ARN}:uri"
phases:
pre_build:
commands:
@@ -38,16 +31,19 @@ phases:
- if [[ ! -z "${ECS_PRIVATE_BACKEND_SERVICE}" ]]; then aws ecs wait services-stable --cluster "${ECS_BACKEND_CLUSTER}" --services "${ECS_PRIVATE_BACKEND_SERVICE}"; fi
# Default to db:reseed:ci
- export MIGRATION_CMD="${MIGRATION_CMD:-db:reseed:ci}"
- # Execute migration
- # Note that many of these vars are required by the app but not used for migration
- - >
- docker run
+ - export PGUSER=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."username")
+ - export PGPASSWORD=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."password")
+ - export PGPORT=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."port")
+ - export PGHOST=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."host")
+ - export PGDATABASE=$(aws secretsmanager get-secret-value --secret-id ${DB_CREDS_ARN}|jq ."SecretString"|jq -r|jq -r ."dbname")
+
+
+ - docker run
--env PGUSER="${PGUSER}"
--env PGPASSWORD="${PGPASSWORD}"
--env PGHOST="${PGHOST}"
- --env PGDATABASE=template1
- --env PGPORT="${PGPORT}"
- --env DATABASE_URL="${DATABASE_URL}"
+ --env PGDATABASE=${PGDATABASE}
+ --env PGPORT=${PGPORT}
--env CLOUDINARY_CLOUD_NAME="${CLOUDINARY_CLOUD_NAME}"
--env LISTINGS_QUERY="${LISTINGS_QUERY}"
--env FILE_SERVICE="${FILE_SERVICE:-cloudinary}"
@@ -57,10 +53,8 @@ phases:
--env CLOUDINARY_SECRET="${CLOUDINARY_SECRET:-dummy_secret}"
--env CLOUDINARY_KEY="${CLOUDINARY_KEY:-dummy_key}"
--env ADMIN_ACCOUNTS="${ADMIN_ACCOUNTS:-100}"
+ --env MIGRATION_CMD="${MIGRATION_CMD}"
--env PARTNERS_BASE_URL="${PARTNERS_BASE_URL:-http://localhost:3001/not-used}"
--env PARTNERS_PORTAL_URL="${PARTNERS_PORTAL_URL:-http://localhost:3001/not-used}"
--env SKIP_MIGRATIONS=FALSE
- "${MIGRATION_IMAGE}" sh -c "yarn ${MIGRATION_CMD}"
- # Start the backend back up with the previous number of desired containers
- - aws ecs update-service --cluster "${ECS_BACKEND_CLUSTER}" --service "${ECS_BACKEND_SERVICE}" --desired-count $BACKEND_COUNT
- - if [[ ! -z "${ECS_PRIVATE_BACKEND_SERVICE}" ]]; then aws ecs update-service --cluster "${ECS_BACKEND_CLUSTER}" --service "${ECS_PRIVATE_BACKEND_SERVICE}" --desired-count $BACKEND_COUNT; fi
+ "${MIGRATION_IMAGE}"
diff --git a/doorway-ui-components/src/page_components/listing/ListingCard.tsx b/doorway-ui-components/src/page_components/listing/ListingCard.tsx
index 019993d8ff2..da92dc0bbaa 100644
--- a/doorway-ui-components/src/page_components/listing/ListingCard.tsx
+++ b/doorway-ui-components/src/page_components/listing/ListingCard.tsx
@@ -139,7 +139,7 @@ const ListingCard = (props: ListingCardProps) => {
return (
{header.href ? (
-
+
{header.content}
) : (
diff --git a/sites/public/logger.ts b/sites/public/logger.ts
index ab02d2ca7b0..c5e6fe6207d 100644
--- a/sites/public/logger.ts
+++ b/sites/public/logger.ts
@@ -1,8 +1,8 @@
import * as winston from "winston"
-let log_level = "info"
-if (process.env.LOG_LEVEL) {
- log_level = process.env.LOG_LEVEL
-}
+const log_level = "info"
+// if (process.env.LOG_LEVEL) {
+// log_level = process.env.LOG_LEVEL
+// }
const logger = winston.createLogger({
level: log_level,
format: winston.format.json(),
diff --git a/sites/public/src/components/core/LinkComponent.tsx b/sites/public/src/components/core/LinkComponent.tsx
index 6f8d1c064dd..f27315fd3eb 100644
--- a/sites/public/src/components/core/LinkComponent.tsx
+++ b/sites/public/src/components/core/LinkComponent.tsx
@@ -6,7 +6,7 @@ const LinkComponent = (props: PropsWithChildren
+ return
}
export default LinkComponent
diff --git a/sites/public/src/lib/runtime-config.ts b/sites/public/src/lib/runtime-config.ts
index 0d43de114f1..01e0bcb7ba6 100644
--- a/sites/public/src/lib/runtime-config.ts
+++ b/sites/public/src/lib/runtime-config.ts
@@ -60,7 +60,7 @@ export const runtimeConfig = {
},
getListingServiceUrl() {
- return `${this.getBackendApiBase()}${this.env.LISTINGS_QUERY}`
+ return `${this.getBackendApiBase()}/listings`
},
getJurisdictionName() {
diff --git a/sites/public/src/pages/listing/[id].tsx b/sites/public/src/pages/listing/[id].tsx
index b4f028998f4..f82c9a98b64 100644
--- a/sites/public/src/pages/listing/[id].tsx
+++ b/sites/public/src/pages/listing/[id].tsx
@@ -32,6 +32,7 @@ export async function getServerSideProps(context: {
headers,
})
} catch (e) {
+ console.log(e)
return { notFound: true }
}
diff --git a/sites/public/src/pages/listing/[id]/[slug].tsx b/sites/public/src/pages/listing/[id]/[slug].tsx
index 97f5362fec4..5e18bd070bb 100644
--- a/sites/public/src/pages/listing/[id]/[slug].tsx
+++ b/sites/public/src/pages/listing/[id]/[slug].tsx
@@ -18,6 +18,7 @@ import dayjs from "dayjs"
import { runtimeConfig } from "../../../lib/runtime-config"
import { Jurisdiction, Listing } from "@bloom-housing/shared-helpers/src/types/backend-swagger"
import { ListingViewSeeds } from "../../../components/listing/ListingViewSeeds"
+import { logger } from "../../../logger"
interface ListingProps {
listing: Listing
@@ -32,6 +33,8 @@ export default function ListingPage(props: ListingProps) {
const pageTitle = `${listing.name} - ${t("nav.siteTitle")}`
const { profile } = useContext(AuthContext)
+ // logger.info(`listing name - ${listing.name}`)
+
useEffect(() => {
if (!listing.id) return
pushGtmEvent({
@@ -88,18 +91,20 @@ export default function ListingPage(props: ListingProps) {
)
}
-export const getStaticPaths: GetStaticPaths = () => {
- return { paths: [], fallback: "blocking" }
-}
+// export const getStaticPaths: GetStaticPaths = () => {
+// return { paths: [], fallback: "blocking" }
+// }
-export const getStaticProps: GetStaticProps = async (context: {
+export async function getServerSideProps(context: {
params: Record
locale: string
-}) => {
+}) {
let response
const listingServiceUrl = runtimeConfig.getListingServiceUrl()
try {
+ logger.info(`requesting URL: ${listingServiceUrl}/${context.params.id}`)
+ logger.info(`context.locale: ${context.locale}`)
response = await axios.get(`${listingServiceUrl}/${context.params.id}`, {
headers: {
language: context.locale,
@@ -107,9 +112,11 @@ export const getStaticProps: GetStaticProps = async (context: {
},
})
} catch (e) {
- console.error("slug notFound Error:", e)
- return { notFound: true, revalidate: Number(process.env.cacheRevalidate) }
+ logger.error("slug notFound Error:")
+ logger.error(e)
+ return { notFound: true }
}
+ logger.info(`response data - ${response.data?.name}`)
return {
props: {
listing: response.data,
@@ -117,6 +124,6 @@ export const getStaticProps: GetStaticProps = async (context: {
googleMapsApiKey: runtimeConfig.getGoogleMapsApiKey() || null,
googleMapsMapId: runtimeConfig.getGoogleMapsMapId() || null,
},
- revalidate: Number(process.env.cacheRevalidate),
+ // revalidate: Number(process.env.cacheRevalidate),
}
}
diff --git a/sites/public/src/pages/listing/ext/[id].tsx b/sites/public/src/pages/listing/ext/[id].tsx
index 6504a06b2b8..75bc3ca7855 100644
--- a/sites/public/src/pages/listing/ext/[id].tsx
+++ b/sites/public/src/pages/listing/ext/[id].tsx
@@ -17,6 +17,7 @@ import { ErrorPage } from "../../_error"
import dayjs from "dayjs"
import { runtimeConfig } from "../../../lib/runtime-config"
import { Jurisdiction, Listing } from "@bloom-housing/shared-helpers/src/types/backend-swagger"
+import { logger } from "../../../logger"
interface ListingProps {
listing: Listing
@@ -84,21 +85,27 @@ export default function ListingPage(props: ListingProps) {
)
}
-export const getStaticPaths: GetStaticPaths = () => {
- return { paths: [], fallback: "blocking" }
-}
+// export const getStaticPaths: GetStaticPaths = () => {
+// return { paths: [], fallback: "blocking" }
+// }
-export const getStaticProps: GetStaticProps = async (context: {
+export async function getServerSideProps(context: {
params: Record
locale: string
-}) => {
+}) {
let response: AxiosResponse
try {
+ logger.info(
+ `requesting URL: ${process.env.BLOOM_API_BASE}/listings/external/${context.params.id}`
+ )
+ logger.info(`context.locale: ${context.locale}`)
const extUrl = `${process.env.BLOOM_API_BASE}/listings/external/${context.params.id}`
response = await axios.get(extUrl, {
headers: { language: context.locale },
})
} catch (e) {
+ logger.error("external notFound Error")
+ logger.error(e)
return { notFound: true }
}
@@ -109,6 +116,35 @@ export const getStaticProps: GetStaticProps = async (context: {
googleMapsApiKey: runtimeConfig.getGoogleMapsApiKey() || null,
googleMapsMapId: runtimeConfig.getGoogleMapsMapId() || null,
},
- revalidate: Number(process.env.cacheRevalidate),
+ // revalidate: Number(process.env.cacheRevalidate),
}
}
+
+// export const getStaticProps: GetStaticProps = async (context: {
+// params: Record
+// locale: string
+// }) => {
+// let response: AxiosResponse
+// try {
+// logger.info(
+// `requesting URL: ${process.env.BLOOM_API_BASE}/listings/external/${context.params.id}`
+// )
+// const extUrl = `${process.env.BLOOM_API_BASE}/listings/external/${context.params.id}`
+// response = await axios.get(extUrl, {
+// headers: { language: context.locale },
+// })
+// } catch (e) {
+// logger.error("external notFound Error")
+// return { notFound: true }
+// }
+
+// return {
+// props: {
+// listing: response.data,
+// jurisdiction: response.data.jurisdiction,
+// googleMapsApiKey: runtimeConfig.getGoogleMapsApiKey() || null,
+// googleMapsMapId: runtimeConfig.getGoogleMapsMapId() || null,
+// },
+// revalidate: Number(process.env.cacheRevalidate),
+// }
+// }