diff --git a/nx.json b/nx.json index 0f16627a5fba8..fe98ab16cb27f 100644 --- a/nx.json +++ b/nx.json @@ -17,7 +17,8 @@ "outputs": [ "{projectRoot}/**/*.integ.*.js.snapshot/*", "{projectRoot}/tsconfig.json", - "{projectRoot}/**/lib/aws-custom-resource/sdk-api-metadata.json", + "{projectRoot}/**/lib/aws-custom-resource/sdk-v2-to-v3.json", + "{projectRoot}/**/lib/aws-custom-resource/sdk-v3-metadata.json", "{projectRoot}/**/build-info.json", "{projectRoot}/**/*.js", "{projectRoot}/**/*.js.map", diff --git a/package.json b/package.json index 7bd5bae4ab0d0..4efa425a893bd 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@types/node": "18.11.19", "@types/prettier": "2.6.0", "@yarnpkg/lockfile": "^1.1.0", + "aws-sdk-js-codemod": "^0.18.3", "cdk-generate-synthetic-examples": "^0.1.291", "conventional-changelog-cli": "^2.2.2", "fs-extra": "^9.1.0", diff --git a/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/aws-sdk-v2-handler.ts b/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/aws-sdk-v2-handler.ts index 4634b8d994e53..6484ec25e4c86 100644 --- a/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/aws-sdk-v2-handler.ts +++ b/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/aws-sdk-v2-handler.ts @@ -9,7 +9,9 @@ import { join } from 'path'; /* eslint-disable-next-line import/no-extraneous-dependencies,import/no-unresolved */ import * as AWSLambda from 'aws-lambda'; import { AwsSdkCall } from './construct-types'; -import { decodeCall, decodeSpecialValues, filterKeys, flatten, respond, startsWithOneOf } from './shared'; +import { decodeCall, decodeSpecialValues, filterKeys, respond, startsWithOneOf } from './shared'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { flatten } from '@aws-cdk/sdk-v2-to-v3-adapter'; let latestSdkInstalled = false; diff --git a/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/aws-sdk-v3-handler.ts b/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/aws-sdk-v3-handler.ts index 4ef7df5aa0036..9caaa730d9a08 100644 --- a/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/aws-sdk-v3-handler.ts +++ b/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/aws-sdk-v3-handler.ts @@ -2,7 +2,7 @@ /* eslint-disable no-console */ import { execSync } from 'child_process'; // eslint-disable-next-line import/no-extraneous-dependencies -import { coerceApiParameters, findV3ClientConstructor, getV3ClientPackageName } from '@aws-cdk/sdk-v2-to-v3-adapter'; +import { ApiCall } from '@aws-cdk/sdk-v2-to-v3-adapter'; // import the AWSLambda package explicitly, // which is globally available in the Lambda runtime, // as otherwise linking this repository with link-all.sh @@ -10,7 +10,7 @@ import { coerceApiParameters, findV3ClientConstructor, getV3ClientPackageName } /* eslint-disable-next-line import/no-extraneous-dependencies,import/no-unresolved */ import type * as AWSLambda from 'aws-lambda'; import type { AwsSdkCall } from './construct-types'; -import { decodeCall, decodeSpecialValues, filterKeys, flatten, respond, startsWithOneOf } from './shared'; +import { decodeCall, decodeSpecialValues, filterKeys, respond, startsWithOneOf } from './shared'; let installedSdk: { [service: string]: boolean } = {}; @@ -89,14 +89,9 @@ export async function handler(event: AWSLambda.CloudFormationCustomResourceEvent } const call: AwsSdkCall | undefined = event.ResourceProperties[event.RequestType]; if (call) { - // when provide v2 service name, transform it v3 package name. - const packageName = call.service.startsWith('@aws-sdk/') ? call.service : getV3ClientPackageName(call.service); - const serviceShortName = packageName.split('/client-')[1]; // '@aws-sdk/client-s3' -> 's3' + const apiCall = new ApiCall(call.service, call.action); - let awsSdk: AwsSdk | Promise = loadAwsSdk( - packageName, - event.ResourceProperties.InstallLatestAwsSdk, - ); + let awsSdk: AwsSdk | Promise = loadAwsSdk(apiCall.v3PackageName, event.ResourceProperties.InstallLatestAwsSdk); console.log(JSON.stringify({ ...event, ResponseURL: '...' })); @@ -109,7 +104,7 @@ export async function handler(event: AWSLambda.CloudFormationCustomResourceEvent RoleSessionName: `${timestamp}-${physicalResourceId}`.substring(0, 64), }; - const { fromTemporaryCredentials } = await import('@aws-sdk/credential-providers' as string); + const { fromTemporaryCredentials } = await import('@aws-sdk/credential-providers'); credentials = fromTemporaryCredentials({ params, clientConfig: call.region !== undefined ? { region: call.region } : undefined, @@ -117,33 +112,21 @@ export async function handler(event: AWSLambda.CloudFormationCustomResourceEvent } awsSdk = await awsSdk; - const ServiceClient = findV3ClientConstructor(awsSdk); - - const client = new ServiceClient({ - apiVersion: call.apiVersion, - credentials: credentials, - region: call.region, - }); - const commandName = call.action.endsWith('Command') ? call.action : `${call.action}Command`; - const shortCommandName = commandName.replace(/Command$/, ''); // 'PutObjectCommand' -> 'PutObject' - const Command = Object.entries(awsSdk).find( - ([name]) => name.toLowerCase() === commandName.toLowerCase(), - )?.[1] as { new (input: any): any }; - - let flatData: { [key: string]: string } = {}; + + const flatData: { [key: string]: string } = {}; try { - // Command must pass input value https://github.com/aws/aws-sdk-js-v3/issues/424 - const response = await client.send( - new Command(call.parameters - ? coerceApiParameters(serviceShortName, shortCommandName, decodeSpecialValues(call.parameters, physicalResourceId)) - : {}, - ), - ); - flatData = { - apiVersion: client.config.apiVersion, // For test purposes: check if apiVersion was correctly passed. - region: await client.config.region().catch(() => undefined), // For test purposes: check if region was correctly passed. - ...flatten(response), - }; + const response = await await apiCall.invoke({ + sdkPackage: awsSdk, + apiVersion: call.apiVersion, + credentials: credentials, + region: call.region, + parameters: decodeSpecialValues(call.parameters, physicalResourceId), + flattenResponse: true, + }); + + flatData.apiVersion = apiCall.client.config.apiVersion; // For test purposes: check if apiVersion was correctly passed. + flatData.region = await apiCall.client.config.region().catch(() => undefined); // For test purposes: check if region was correctly passed. + Object.assign(flatData, response); let outputPaths: string[] | undefined; if (call.outputPath) { diff --git a/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/shared.ts b/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/shared.ts index 08af4c121178d..5186c3519b056 100644 --- a/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/shared.ts +++ b/packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/shared.ts @@ -5,45 +5,6 @@ import * as AWSLambda from 'aws-lambda'; */ export const PHYSICAL_RESOURCE_ID_REFERENCE = 'PHYSICAL:RESOURCEID:'; -/** - * Text decoder used for Uint8Array response parsing - */ -const decoder = new TextDecoder(); - -/** - * Parse both buffers and ArrayBuffers which can be returned by sdkv3 - */ -function parseField(value: any): any { - if (Buffer.isBuffer(value)) { - return value.toString('utf8'); - } else if (ArrayBuffer.isView(value)) { - return decoder.decode(value.buffer); - } - - return value; -} -/** - * Flattens a nested object - * - * @param object the object to be flattened - * @returns a flat object with path as keys - */ -export function flatten(object: object): { [key: string]: any } { - function _flatten(child: any, path: string[] = []): any { - return [].concat(...Object.keys(child) - .map(key => { - const childKey = parseField(child[key]); - return typeof childKey === 'object' && childKey !== null - ? _flatten(childKey, path.concat([key])) - : ({ [path.concat([key]).join('.')]: childKey }); - })); - } - return Object.assign( - {}, - ..._flatten(object), - ); -} - /** * Decodes encoded special values (physicalResourceId) */ diff --git a/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/sdk.ts b/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/sdk.ts index 3d09c6d5ae7d6..22967b9606773 100644 --- a/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/sdk.ts +++ b/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/sdk.ts @@ -1,98 +1,21 @@ /* eslint-disable no-console */ import { CustomResourceHandler } from './base'; import { AwsApiCallRequest, AwsApiCallResult } from './types'; -import { - getV3ClientPackageName, - findV3ClientConstructor, - coerceApiParameters, -} from '@aws-cdk/sdk-v2-to-v3-adapter'; -import { decodeParameters, coerceResponse } from './utils'; - -/** - * Flattens a nested object - * - * @param object the object to be flattened - * @returns a flat object with path as keys - */ -export function flatten(object: object): { [key: string]: any } { - return Object.assign( - {}, - ...function _flatten(child: any, path: string[] = []): any { - return [].concat(...Object.keys(child) - .map(key => { - let childKey = Buffer.isBuffer(child[key]) ? child[key].toString('utf8') : child[key]; - // if the value is a json string then treat it as an object - // and keep recursing. This allows for easier assertions against complex json strings - if (typeof childKey === 'string') { - childKey = isJsonString(childKey); - } - return typeof childKey === 'object' && childKey !== null - ? _flatten(childKey, path.concat([key])) - : ({ [path.concat([key]).join('.')]: childKey }); - })); - }(object), - ); -} - -interface V3SdkPkg { - service: string; - packageName: string; - pkg: object; -} - -function getServicePackage(service: string): V3SdkPkg { - const packageName = getV3ClientPackageName(service); - try { - /* eslint-disable-next-line @typescript-eslint/no-require-imports */ - const pkg = require(packageName); - - return { - service, - pkg, - packageName, - }; - } catch (e) { - throw Error(`Service ${service} client package with name '${packageName}' does not exist.`); - } -} - -function getServiceClient(sdkPkg: V3SdkPkg): any { - try { - const ServiceClient = findV3ClientConstructor(sdkPkg.pkg); - return new ServiceClient({}); - } catch (e) { - console.error(e); - throw Error(`No client constructor found within package: ${sdkPkg.packageName}`); - } -} - -function getSdkCommand(sdkPkg: V3SdkPkg, api: string): any { - const commandName = api.endsWith('Command') ? api : `${api}Command`; - const command = Object.entries(sdkPkg.pkg).find( - ([name]) => name.toLowerCase() === commandName.toLowerCase(), - )?.[1] as { new (input: any): any }; - - if (!command) { - throw new Error(`Unable to find command named: ${commandName} for api: ${api} in service package`); - } - return command; -} +import { ApiCall, flatten } from '@aws-cdk/sdk-v2-to-v3-adapter'; +import { decodeParameters, deepParseJson } from './utils'; export class AwsApiCallHandler extends CustomResourceHandler { protected async processEvent(request: AwsApiCallRequest): Promise { - const sdkPkg = getServicePackage(request.service); - const client = getServiceClient(sdkPkg); + const apiCall = new ApiCall(request.service, request.api); - const Command = getSdkCommand(sdkPkg, request.api); - const parameters = (request.parameters && decodeParameters(request.parameters)) ?? {}; - const commandInput = coerceApiParameters(request.service, request.api, parameters); + const parameters = request.parameters ? decodeParameters(request.parameters) : {}; + console.log(`SDK request to ${apiCall.service}.${apiCall.action} with parameters ${JSON.stringify(parameters)}`); + const response = await apiCall.invoke({ parameters }) as Record; + const parsedResponse = deepParseJson(response); - console.log(`SDK request to ${sdkPkg.service}.${request.api} with parameters ${JSON.stringify(commandInput)}`); - const response = await client.send(new Command(commandInput)); - await coerceResponse(response); + console.log(`SDK response received ${JSON.stringify(parsedResponse)}`); + delete parsedResponse.$metadata; - console.log(`SDK response received ${JSON.stringify(response)}`); - delete response.$metadata; const respond = { apiCallResponse: response, }; @@ -120,12 +43,4 @@ function filterKeys(object: object, searchStrings: string[]): { [key: string]: s } return filteredObject; }, {}); -} - -function isJsonString(value: string): any { - try { - return JSON.parse(value); - } catch { - return value; - } -} +} \ No newline at end of file diff --git a/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/utils.ts b/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/utils.ts index c5c17d471fd57..c33d38c9e0040 100644 --- a/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/utils.ts +++ b/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/lambda-handler/utils.ts @@ -1,21 +1,31 @@ -async function coerceValue(v: any) { - - if (v && typeof(v) === 'object' && typeof((v as any).transformToString) === 'function') { - // in sdk v3 some return types are now adapters that we need to explicitly - // convert to strings. see example: https://github.com/aws/aws-sdk-js-v3/blob/main/UPGRADING.md?plain=1#L573-L576 - // note we don't use 'instanceof Unit8Array' because observations show this won't always return true, even though - // the `transformToString` function will be available. (for example S3::GetObject) - const text = await (v as any).transformToString(); - return tryJsonParse(text); +/** + * Recurse into the given object, trying to parse any string as JSON + */ +export function deepParseJson(x: A): unknown; +export function deepParseJson(x: A): A; +export function deepParseJson(x: unknown): unknown { + if (typeof x === 'string') { + return tryJsonParse(x); + } + if (Array.isArray(x)) { + return x.map(deepParseJson); + } + if (x && typeof x === 'object') { + for (const [key, value] of Object.entries(x)) { + (x as any)[key] = deepParseJson(value); + } + + return x; } - return tryJsonParse(v); + return x; } -function tryJsonParse(v: any) { +function tryJsonParse(v: string): unknown { if (typeof(v) !== 'string') { return v; } + try { return JSON.parse(v); } catch { @@ -23,21 +33,6 @@ function tryJsonParse(v: any) { } } -export async function coerceResponse(response: any) { - - if (response == null) { - return; - } - - for (const key of Object.keys(response)) { - response[key] = await coerceValue(response[key]); - if (typeof response[key] === 'object') { - await coerceResponse(response[key]); - } - } - -} - export function decodeParameters(obj: Record): any { return Object.fromEntries(Object.entries(obj).map(([key, value]) => { try { diff --git a/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/provider.ts b/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/provider.ts index ef4f08c8ea46c..1fe737965c841 100644 --- a/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/provider.ts +++ b/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/provider.ts @@ -1,8 +1,7 @@ import * as path from 'path'; import { Duration, CfnResource, AssetStaging, Stack, FileAssetPackaging, Token, Lazy, Reference } from 'aws-cdk-lib/core'; import { Construct } from 'constructs'; - -let SDK_METADATA: any = undefined; +import { awsSdkToIamAction } from 'aws-cdk-lib/custom-resources/lib/helpers-internal'; /** * Properties for a lambda function provider @@ -157,15 +156,8 @@ class SingletonFunction extends Construct { * Create a policy statement from a specific api call */ public addPolicyStatementFromSdkCall(service: string, api: string, resources?: string[]): void { - if (SDK_METADATA === undefined) { - // eslint-disable-next-line - SDK_METADATA = require('./sdk-api-metadata.json'); - } - const srv = service.toLowerCase(); - const iamService = (SDK_METADATA[srv] && SDK_METADATA[srv].prefix) || srv; - const iamAction = api.charAt(0).toUpperCase() + api.slice(1); this.lambdaFunction.addPolicies([{ - Action: [`${iamService}:${iamAction}`], + Action: [awsSdkToIamAction(service, api)], Effect: 'Allow', Resource: resources || ['*'], }]); diff --git a/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/sdk-api-metadata.json b/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/sdk-api-metadata.json deleted file mode 100644 index ccb516bc2ee37..0000000000000 --- a/packages/@aws-cdk/integ-tests-alpha/lib/assertions/providers/sdk-api-metadata.json +++ /dev/null @@ -1,1160 +0,0 @@ -{ - "acm": { - "name": "ACM", - "cors": true - }, - "apigateway": { - "name": "APIGateway", - "cors": true - }, - "applicationautoscaling": { - "prefix": "application-autoscaling", - "name": "ApplicationAutoScaling", - "cors": true - }, - "appstream": { - "name": "AppStream" - }, - "autoscaling": { - "name": "AutoScaling", - "cors": true - }, - "batch": { - "name": "Batch" - }, - "budgets": { - "name": "Budgets" - }, - "clouddirectory": { - "name": "CloudDirectory", - "versions": [ - "2016-05-10*" - ] - }, - "cloudformation": { - "name": "CloudFormation", - "cors": true - }, - "cloudfront": { - "name": "CloudFront", - "versions": [ - "2013-05-12*", - "2013-11-11*", - "2014-05-31*", - "2014-10-21*", - "2014-11-06*", - "2015-04-17*", - "2015-07-27*", - "2015-09-17*", - "2016-01-13*", - "2016-01-28*", - "2016-08-01*", - "2016-08-20*", - "2016-09-07*", - "2016-09-29*", - "2016-11-25*", - "2017-03-25*", - "2017-10-30*", - "2018-06-18*", - "2018-11-05*", - "2019-03-26*" - ], - "cors": true - }, - "cloudhsm": { - "name": "CloudHSM", - "cors": true - }, - "cloudsearch": { - "name": "CloudSearch" - }, - "cloudsearchdomain": { - "name": "CloudSearchDomain" - }, - "cloudtrail": { - "name": "CloudTrail", - "cors": true - }, - "cloudwatch": { - "prefix": "monitoring", - "name": "CloudWatch", - "cors": true - }, - "cloudwatchevents": { - "prefix": "events", - "name": "CloudWatchEvents", - "versions": [ - "2014-02-03*" - ], - "cors": true - }, - "cloudwatchlogs": { - "prefix": "logs", - "name": "CloudWatchLogs", - "cors": true - }, - "codebuild": { - "name": "CodeBuild", - "cors": true - }, - "codecommit": { - "name": "CodeCommit", - "cors": true - }, - "codedeploy": { - "name": "CodeDeploy", - "cors": true - }, - "codepipeline": { - "name": "CodePipeline", - "cors": true - }, - "cognitoidentity": { - "prefix": "cognito-identity", - "name": "CognitoIdentity", - "cors": true - }, - "cognitoidentityserviceprovider": { - "prefix": "cognito-idp", - "name": "CognitoIdentityServiceProvider", - "cors": true - }, - "cognitosync": { - "prefix": "cognito-sync", - "name": "CognitoSync", - "cors": true - }, - "configservice": { - "prefix": "config", - "name": "ConfigService", - "cors": true - }, - "cur": { - "name": "CUR", - "cors": true - }, - "datapipeline": { - "name": "DataPipeline" - }, - "devicefarm": { - "name": "DeviceFarm", - "cors": true - }, - "directconnect": { - "name": "DirectConnect", - "cors": true - }, - "directoryservice": { - "prefix": "ds", - "name": "DirectoryService" - }, - "discovery": { - "name": "Discovery" - }, - "dms": { - "name": "DMS" - }, - "dynamodb": { - "name": "DynamoDB", - "cors": true - }, - "dynamodbstreams": { - "prefix": "streams.dynamodb", - "name": "DynamoDBStreams", - "cors": true - }, - "ec2": { - "name": "EC2", - "versions": [ - "2013-06-15*", - "2013-10-15*", - "2014-02-01*", - "2014-05-01*", - "2014-06-15*", - "2014-09-01*", - "2014-10-01*", - "2015-03-01*", - "2015-04-15*", - "2015-10-01*", - "2016-04-01*", - "2016-09-15*" - ], - "cors": true - }, - "ecr": { - "name": "ECR", - "cors": true - }, - "ecs": { - "name": "ECS", - "cors": true - }, - "efs": { - "prefix": "elasticfilesystem", - "name": "EFS", - "cors": true - }, - "elasticache": { - "name": "ElastiCache", - "versions": [ - "2012-11-15*", - "2014-03-24*", - "2014-07-15*", - "2014-09-30*" - ], - "cors": true - }, - "elasticbeanstalk": { - "name": "ElasticBeanstalk", - "cors": true - }, - "elb": { - "prefix": "elasticloadbalancing", - "name": "ELB", - "cors": true - }, - "elbv2": { - "prefix": "elasticloadbalancingv2", - "name": "ELBv2", - "cors": true - }, - "emr": { - "prefix": "elasticmapreduce", - "name": "EMR", - "cors": true - }, - "es": { - "name": "ES" - }, - "elastictranscoder": { - "name": "ElasticTranscoder", - "cors": true - }, - "firehose": { - "name": "Firehose", - "cors": true - }, - "gamelift": { - "name": "GameLift", - "cors": true - }, - "glacier": { - "name": "Glacier" - }, - "health": { - "name": "Health" - }, - "iam": { - "name": "IAM", - "cors": true - }, - "importexport": { - "name": "ImportExport" - }, - "inspector": { - "name": "Inspector", - "versions": [ - "2015-08-18*" - ], - "cors": true - }, - "iot": { - "name": "Iot", - "cors": true - }, - "iotdata": { - "prefix": "iot-data", - "name": "IotData", - "cors": true - }, - "kinesis": { - "name": "Kinesis", - "cors": true - }, - "kinesisanalytics": { - "name": "KinesisAnalytics" - }, - "kms": { - "name": "KMS", - "cors": true - }, - "lambda": { - "name": "Lambda", - "cors": true - }, - "lexruntime": { - "prefix": "runtime.lex", - "name": "LexRuntime", - "cors": true - }, - "lightsail": { - "name": "Lightsail" - }, - "machinelearning": { - "name": "MachineLearning", - "cors": true - }, - "marketplacecommerceanalytics": { - "name": "MarketplaceCommerceAnalytics", - "cors": true - }, - "marketplacemetering": { - "prefix": "meteringmarketplace", - "name": "MarketplaceMetering" - }, - "mturk": { - "prefix": "mturk-requester", - "name": "MTurk", - "cors": true - }, - "mobileanalytics": { - "name": "MobileAnalytics", - "cors": true - }, - "opsworks": { - "name": "OpsWorks", - "cors": true - }, - "opsworkscm": { - "name": "OpsWorksCM" - }, - "organizations": { - "name": "Organizations" - }, - "pinpoint": { - "name": "Pinpoint" - }, - "polly": { - "name": "Polly", - "cors": true - }, - "rds": { - "name": "RDS", - "versions": [ - "2014-09-01*" - ], - "cors": true - }, - "redshift": { - "name": "Redshift", - "cors": true - }, - "rekognition": { - "name": "Rekognition", - "cors": true - }, - "resourcegroupstaggingapi": { - "name": "ResourceGroupsTaggingAPI" - }, - "route53": { - "name": "Route53", - "cors": true - }, - "route53domains": { - "name": "Route53Domains", - "cors": true - }, - "s3": { - "name": "S3", - "dualstackAvailable": true, - "cors": true - }, - "s3control": { - "name": "S3Control", - "dualstackAvailable": true, - "xmlNoDefaultLists": true - }, - "servicecatalog": { - "name": "ServiceCatalog", - "cors": true - }, - "ses": { - "prefix": "email", - "name": "SES", - "cors": true - }, - "shield": { - "name": "Shield" - }, - "simpledb": { - "prefix": "sdb", - "name": "SimpleDB" - }, - "sms": { - "name": "SMS" - }, - "snowball": { - "name": "Snowball" - }, - "sns": { - "name": "SNS", - "cors": true - }, - "sqs": { - "name": "SQS", - "cors": true - }, - "ssm": { - "name": "SSM", - "cors": true - }, - "storagegateway": { - "name": "StorageGateway", - "cors": true - }, - "stepfunctions": { - "prefix": "states", - "name": "StepFunctions" - }, - "sts": { - "name": "STS", - "cors": true - }, - "support": { - "name": "Support" - }, - "swf": { - "name": "SWF" - }, - "xray": { - "name": "XRay", - "cors": true - }, - "waf": { - "name": "WAF", - "cors": true - }, - "wafregional": { - "prefix": "waf-regional", - "name": "WAFRegional" - }, - "workdocs": { - "name": "WorkDocs", - "cors": true - }, - "workspaces": { - "name": "WorkSpaces" - }, - "codestar": { - "name": "CodeStar" - }, - "lexmodelbuildingservice": { - "prefix": "lex-models", - "name": "LexModelBuildingService", - "cors": true - }, - "marketplaceentitlementservice": { - "prefix": "entitlement.marketplace", - "name": "MarketplaceEntitlementService" - }, - "athena": { - "name": "Athena", - "cors": true - }, - "greengrass": { - "name": "Greengrass" - }, - "dax": { - "name": "DAX" - }, - "migrationhub": { - "prefix": "AWSMigrationHub", - "name": "MigrationHub" - }, - "cloudhsmv2": { - "name": "CloudHSMV2", - "cors": true - }, - "glue": { - "name": "Glue" - }, - "mobile": { - "name": "Mobile" - }, - "pricing": { - "name": "Pricing", - "cors": true - }, - "costexplorer": { - "prefix": "ce", - "name": "CostExplorer", - "cors": true - }, - "mediaconvert": { - "name": "MediaConvert" - }, - "medialive": { - "name": "MediaLive" - }, - "mediapackage": { - "name": "MediaPackage" - }, - "mediastore": { - "name": "MediaStore" - }, - "mediastoredata": { - "prefix": "mediastore-data", - "name": "MediaStoreData", - "cors": true - }, - "appsync": { - "name": "AppSync" - }, - "guardduty": { - "name": "GuardDuty" - }, - "mq": { - "name": "MQ" - }, - "comprehend": { - "name": "Comprehend", - "cors": true - }, - "iotjobsdataplane": { - "prefix": "iot-jobs-data", - "name": "IoTJobsDataPlane" - }, - "kinesisvideoarchivedmedia": { - "prefix": "kinesis-video-archived-media", - "name": "KinesisVideoArchivedMedia", - "cors": true - }, - "kinesisvideomedia": { - "prefix": "kinesis-video-media", - "name": "KinesisVideoMedia", - "cors": true - }, - "kinesisvideo": { - "name": "KinesisVideo", - "cors": true - }, - "sagemakerruntime": { - "prefix": "runtime.sagemaker", - "name": "SageMakerRuntime" - }, - "sagemaker": { - "name": "SageMaker" - }, - "translate": { - "name": "Translate", - "cors": true - }, - "resourcegroups": { - "prefix": "resource-groups", - "name": "ResourceGroups", - "cors": true - }, - "alexaforbusiness": { - "name": "AlexaForBusiness" - }, - "cloud9": { - "name": "Cloud9" - }, - "serverlessapplicationrepository": { - "prefix": "serverlessrepo", - "name": "ServerlessApplicationRepository" - }, - "servicediscovery": { - "name": "ServiceDiscovery" - }, - "workmail": { - "name": "WorkMail" - }, - "autoscalingplans": { - "prefix": "autoscaling-plans", - "name": "AutoScalingPlans" - }, - "transcribeservice": { - "prefix": "transcribe", - "name": "TranscribeService" - }, - "connect": { - "name": "Connect", - "cors": true - }, - "acmpca": { - "prefix": "acm-pca", - "name": "ACMPCA" - }, - "fms": { - "name": "FMS" - }, - "secretsmanager": { - "name": "SecretsManager", - "cors": true - }, - "iotanalytics": { - "name": "IoTAnalytics", - "cors": true - }, - "iot1clickdevicesservice": { - "prefix": "iot1click-devices", - "name": "IoT1ClickDevicesService" - }, - "iot1clickprojects": { - "prefix": "iot1click-projects", - "name": "IoT1ClickProjects" - }, - "pi": { - "name": "PI" - }, - "neptune": { - "name": "Neptune" - }, - "mediatailor": { - "name": "MediaTailor" - }, - "eks": { - "name": "EKS" - }, - "macie": { - "name": "Macie" - }, - "dlm": { - "name": "DLM" - }, - "signer": { - "name": "Signer" - }, - "chime": { - "name": "Chime" - }, - "pinpointemail": { - "prefix": "pinpoint-email", - "name": "PinpointEmail" - }, - "ram": { - "name": "RAM" - }, - "route53resolver": { - "name": "Route53Resolver" - }, - "pinpointsmsvoice": { - "prefix": "sms-voice", - "name": "PinpointSMSVoice" - }, - "quicksight": { - "name": "QuickSight" - }, - "rdsdataservice": { - "prefix": "rds-data", - "name": "RDSDataService" - }, - "amplify": { - "name": "Amplify" - }, - "datasync": { - "name": "DataSync" - }, - "robomaker": { - "name": "RoboMaker" - }, - "transfer": { - "name": "Transfer" - }, - "globalaccelerator": { - "name": "GlobalAccelerator" - }, - "comprehendmedical": { - "name": "ComprehendMedical", - "cors": true - }, - "kinesisanalyticsv2": { - "name": "KinesisAnalyticsV2" - }, - "mediaconnect": { - "name": "MediaConnect" - }, - "fsx": { - "name": "FSx" - }, - "securityhub": { - "name": "SecurityHub" - }, - "appmesh": { - "name": "AppMesh", - "versions": [ - "2018-10-01*" - ] - }, - "licensemanager": { - "prefix": "license-manager", - "name": "LicenseManager" - }, - "kafka": { - "name": "Kafka" - }, - "apigatewaymanagementapi": { - "name": "ApiGatewayManagementApi" - }, - "apigatewayv2": { - "name": "ApiGatewayV2" - }, - "docdb": { - "name": "DocDB" - }, - "backup": { - "name": "Backup" - }, - "worklink": { - "name": "WorkLink" - }, - "textract": { - "name": "Textract" - }, - "managedblockchain": { - "name": "ManagedBlockchain" - }, - "mediapackagevod": { - "prefix": "mediapackage-vod", - "name": "MediaPackageVod" - }, - "groundstation": { - "name": "GroundStation" - }, - "iotthingsgraph": { - "name": "IoTThingsGraph" - }, - "iotevents": { - "name": "IoTEvents" - }, - "ioteventsdata": { - "prefix": "iotevents-data", - "name": "IoTEventsData" - }, - "personalize": { - "name": "Personalize", - "cors": true - }, - "personalizeevents": { - "prefix": "personalize-events", - "name": "PersonalizeEvents", - "cors": true - }, - "personalizeruntime": { - "prefix": "personalize-runtime", - "name": "PersonalizeRuntime", - "cors": true - }, - "applicationinsights": { - "prefix": "application-insights", - "name": "ApplicationInsights" - }, - "servicequotas": { - "prefix": "service-quotas", - "name": "ServiceQuotas" - }, - "ec2instanceconnect": { - "prefix": "ec2-instance-connect", - "name": "EC2InstanceConnect" - }, - "eventbridge": { - "name": "EventBridge" - }, - "lakeformation": { - "name": "LakeFormation" - }, - "forecastservice": { - "prefix": "forecast", - "name": "ForecastService", - "cors": true - }, - "forecastqueryservice": { - "prefix": "forecastquery", - "name": "ForecastQueryService", - "cors": true - }, - "qldb": { - "name": "QLDB" - }, - "qldbsession": { - "prefix": "qldb-session", - "name": "QLDBSession" - }, - "workmailmessageflow": { - "name": "WorkMailMessageFlow" - }, - "codestarnotifications": { - "prefix": "codestar-notifications", - "name": "CodeStarNotifications" - }, - "savingsplans": { - "name": "SavingsPlans" - }, - "sso": { - "name": "SSO" - }, - "ssooidc": { - "prefix": "sso-oidc", - "name": "SSOOIDC" - }, - "marketplacecatalog": { - "prefix": "marketplace-catalog", - "name": "MarketplaceCatalog" - }, - "dataexchange": { - "name": "DataExchange" - }, - "sesv2": { - "name": "SESV2" - }, - "migrationhubconfig": { - "prefix": "migrationhub-config", - "name": "MigrationHubConfig" - }, - "connectparticipant": { - "name": "ConnectParticipant" - }, - "appconfig": { - "name": "AppConfig" - }, - "iotsecuretunneling": { - "name": "IoTSecureTunneling" - }, - "wafv2": { - "name": "WAFV2" - }, - "elasticinference": { - "prefix": "elastic-inference", - "name": "ElasticInference" - }, - "imagebuilder": { - "name": "Imagebuilder" - }, - "schemas": { - "name": "Schemas" - }, - "accessanalyzer": { - "name": "AccessAnalyzer" - }, - "codegurureviewer": { - "prefix": "codeguru-reviewer", - "name": "CodeGuruReviewer" - }, - "codeguruprofiler": { - "name": "CodeGuruProfiler" - }, - "computeoptimizer": { - "prefix": "compute-optimizer", - "name": "ComputeOptimizer" - }, - "frauddetector": { - "name": "FraudDetector" - }, - "kendra": { - "name": "Kendra" - }, - "networkmanager": { - "name": "NetworkManager" - }, - "outposts": { - "name": "Outposts" - }, - "augmentedairuntime": { - "prefix": "sagemaker-a2i-runtime", - "name": "AugmentedAIRuntime" - }, - "ebs": { - "name": "EBS" - }, - "kinesisvideosignalingchannels": { - "prefix": "kinesis-video-signaling", - "name": "KinesisVideoSignalingChannels", - "cors": true - }, - "detective": { - "name": "Detective" - }, - "codestarconnections": { - "prefix": "codestar-connections", - "name": "CodeStarconnections" - }, - "synthetics": { - "name": "Synthetics" - }, - "iotsitewise": { - "name": "IoTSiteWise" - }, - "macie2": { - "name": "Macie2" - }, - "codeartifact": { - "name": "CodeArtifact" - }, - "honeycode": { - "name": "Honeycode" - }, - "ivs": { - "name": "IVS" - }, - "braket": { - "name": "Braket" - }, - "identitystore": { - "name": "IdentityStore" - }, - "appflow": { - "name": "Appflow" - }, - "redshiftdata": { - "prefix": "redshift-data", - "name": "RedshiftData" - }, - "ssoadmin": { - "prefix": "sso-admin", - "name": "SSOAdmin" - }, - "timestreamquery": { - "prefix": "timestream-query", - "name": "TimestreamQuery" - }, - "timestreamwrite": { - "prefix": "timestream-write", - "name": "TimestreamWrite" - }, - "s3outposts": { - "name": "S3Outposts" - }, - "databrew": { - "name": "DataBrew" - }, - "servicecatalogappregistry": { - "prefix": "servicecatalog-appregistry", - "name": "ServiceCatalogAppRegistry" - }, - "networkfirewall": { - "prefix": "network-firewall", - "name": "NetworkFirewall" - }, - "mwaa": { - "name": "MWAA" - }, - "amplifybackend": { - "name": "AmplifyBackend" - }, - "appintegrations": { - "name": "AppIntegrations" - }, - "connectcontactlens": { - "prefix": "connect-contact-lens", - "name": "ConnectContactLens" - }, - "devopsguru": { - "prefix": "devops-guru", - "name": "DevOpsGuru" - }, - "ecrpublic": { - "prefix": "ecr-public", - "name": "ECRPUBLIC" - }, - "lookoutvision": { - "name": "LookoutVision" - }, - "sagemakerfeaturestoreruntime": { - "prefix": "sagemaker-featurestore-runtime", - "name": "SageMakerFeatureStoreRuntime" - }, - "customerprofiles": { - "prefix": "customer-profiles", - "name": "CustomerProfiles" - }, - "auditmanager": { - "name": "AuditManager" - }, - "emrcontainers": { - "prefix": "emr-containers", - "name": "EMRcontainers" - }, - "healthlake": { - "name": "HealthLake" - }, - "sagemakeredge": { - "prefix": "sagemaker-edge", - "name": "SagemakerEdge" - }, - "amp": { - "name": "Amp" - }, - "greengrassv2": { - "name": "GreengrassV2" - }, - "iotdeviceadvisor": { - "name": "IotDeviceAdvisor" - }, - "iotfleethub": { - "name": "IoTFleetHub" - }, - "iotwireless": { - "name": "IoTWireless" - }, - "location": { - "name": "Location", - "cors": true - }, - "wellarchitected": { - "name": "WellArchitected" - }, - "lexmodelsv2": { - "prefix": "models.lex.v2", - "name": "LexModelsV2" - }, - "lexruntimev2": { - "prefix": "runtime.lex.v2", - "name": "LexRuntimeV2", - "cors": true - }, - "fis": { - "name": "Fis" - }, - "lookoutmetrics": { - "name": "LookoutMetrics" - }, - "mgn": { - "name": "Mgn" - }, - "lookoutequipment": { - "name": "LookoutEquipment" - }, - "nimble": { - "name": "Nimble" - }, - "finspace": { - "name": "Finspace" - }, - "finspacedata": { - "prefix": "finspace-data", - "name": "Finspacedata" - }, - "ssmcontacts": { - "prefix": "ssm-contacts", - "name": "SSMContacts" - }, - "ssmincidents": { - "prefix": "ssm-incidents", - "name": "SSMIncidents" - }, - "applicationcostprofiler": { - "name": "ApplicationCostProfiler" - }, - "apprunner": { - "name": "AppRunner" - }, - "proton": { - "name": "Proton" - }, - "route53recoverycluster": { - "prefix": "route53-recovery-cluster", - "name": "Route53RecoveryCluster" - }, - "route53recoverycontrolconfig": { - "prefix": "route53-recovery-control-config", - "name": "Route53RecoveryControlConfig" - }, - "route53recoveryreadiness": { - "prefix": "route53-recovery-readiness", - "name": "Route53RecoveryReadiness" - }, - "chimesdkidentity": { - "prefix": "chime-sdk-identity", - "name": "ChimeSDKIdentity" - }, - "chimesdkmessaging": { - "prefix": "chime-sdk-messaging", - "name": "ChimeSDKMessaging" - }, - "snowdevicemanagement": { - "prefix": "snow-device-management", - "name": "SnowDeviceManagement" - }, - "memorydb": { - "name": "MemoryDB" - }, - "opensearch": { - "name": "OpenSearch" - }, - "kafkaconnect": { - "name": "KafkaConnect" - }, - "voiceid": { - "prefix": "voice-id", - "name": "VoiceID" - }, - "wisdom": { - "name": "Wisdom" - }, - "account": { - "name": "Account" - }, - "cloudcontrol": { - "name": "CloudControl" - }, - "grafana": { - "name": "Grafana" - }, - "panorama": { - "name": "Panorama" - }, - "chimesdkmeetings": { - "prefix": "chime-sdk-meetings", - "name": "ChimeSDKMeetings" - }, - "resiliencehub": { - "name": "Resiliencehub" - }, - "migrationhubstrategy": { - "name": "MigrationHubStrategy" - }, - "appconfigdata": { - "name": "AppConfigData" - }, - "drs": { - "name": "Drs" - }, - "migrationhubrefactorspaces": { - "prefix": "migration-hub-refactor-spaces", - "name": "MigrationHubRefactorSpaces" - }, - "evidently": { - "name": "Evidently" - }, - "inspector2": { - "name": "Inspector2" - }, - "rbin": { - "name": "Rbin" - }, - "rum": { - "name": "RUM" - }, - "backupgateway": { - "prefix": "backup-gateway", - "name": "BackupGateway" - }, - "iottwinmaker": { - "name": "IoTTwinMaker" - }, - "workspacesweb": { - "prefix": "workspaces-web", - "name": "WorkSpacesWeb" - }, - "amplifyuibuilder": { - "name": "AmplifyUIBuilder" - }, - "keyspaces": { - "name": "Keyspaces" - }, - "billingconductor": { - "name": "Billingconductor" - }, - "gamesparks": { - "name": "GameSparks" - }, - "pinpointsmsvoicev2": { - "prefix": "pinpoint-sms-voice-v2", - "name": "PinpointSMSVoiceV2" - }, - "redshiftserverless": { - "prefix": "redshift-serverless", - "name": "RedshiftServerless" - } -} diff --git a/packages/@aws-cdk/integ-tests-alpha/test/assertions/providers/lambda-handler/utils.test.ts b/packages/@aws-cdk/integ-tests-alpha/test/assertions/providers/lambda-handler/utils.test.ts index a2de0aea5390b..2bd2385714f86 100644 --- a/packages/@aws-cdk/integ-tests-alpha/test/assertions/providers/lambda-handler/utils.test.ts +++ b/packages/@aws-cdk/integ-tests-alpha/test/assertions/providers/lambda-handler/utils.test.ts @@ -1,4 +1,4 @@ -import { decodeParameters, coerceResponse } from '../../../../lib/assertions/providers/lambda-handler/utils'; +import { decodeParameters, deepParseJson } from '../../../../lib/assertions/providers/lambda-handler/utils'; describe('utils', () => { test('decode parameters', () => { @@ -27,7 +27,7 @@ describe('utils', () => { array: ['value3'], }; - await coerceResponse(response); + await deepParseJson(response); expect(response).toEqual({ simple: 'value1', @@ -49,7 +49,7 @@ describe('utils', () => { array: ['{ "foo3": "bar3" }'], }; - await coerceResponse(response); + await deepParseJson(response); expect(response).toEqual({ simple: { foo1: 'bar1' }, @@ -72,7 +72,7 @@ describe('utils', () => { }, }; - await coerceResponse(response); + await deepParseJson(response); expect(response).toEqual({ Data: 'non-json', diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/api-call.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/api-call.ts new file mode 100644 index 0000000000000..a3a340779b20e --- /dev/null +++ b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/api-call.ts @@ -0,0 +1,224 @@ +import { coerceApiParameters } from './coerce-api-parameters'; +import { findV3ClientConstructor } from './find-client-constructor'; +import { normalizeActionName, normalizeServiceName } from './sdk-info'; +import type { AwsCredentialIdentityProvider } from '@smithy/types'; + +interface InvokeOptions { + /** + * The SDKv3 package for the service. + * + * @default - Load the package automatically + */ + readonly sdkPackage?: any; + + /** + * Override API version + * + * @default - Use default API version + */ + readonly apiVersion?: string; + + /** + * Override region + * + * @default - Current region + */ + readonly region?: string; + + /** + * Override credentials + * + * @default - Default credentials + */ + readonly credentials?: AwsCredentialIdentityProvider; + + /** + * Parameters to the API call + */ + readonly parameters: Record; + + /** + * Flatten the response object + * + * Instead of a nested object structure, return a map of `{ string -> value }`, with the keys + * being the paths to each primitive value. + * + * @default false + */ + readonly flattenResponse?: boolean; +} + +/** + * Wrapper to make an SDKv3 API call, with SDKv2 compatibility + */ +export class ApiCall { + public readonly service: string; + public readonly action: string; + public readonly v3PackageName: string; + public client?: any; // For testing purposes + + constructor(service: string, action: string) { + this.service = normalizeServiceName(service); + this.action = normalizeActionName(this.service, action); + + this.v3PackageName = `@aws-sdk/client-${this.service}`; + } + + public async invoke(options: InvokeOptions) { + // eslint-disable-next-line @typescript-eslint/no-require-imports + const v3Package = options.sdkPackage ?? this.loadPackage(); + const ServiceClient = this.findConstructor(v3Package); + + this.client = new ServiceClient({ + apiVersion: options.apiVersion, + credentials: options.credentials, + region: options.region, + }); + + const commandName = `${this.action}Command`; + + const Command = Object.entries(v3Package).find( + ([name]) => name.toLowerCase() === commandName.toLowerCase(), + )?.[1] as { new (input: any): any }; + if (!Command) { + throw new Error(`Unable to find command named: ${commandName} for action: ${this.action} in service package`); + } + + // Command must pass input value https://github.com/aws/aws-sdk-js-v3/issues/424 + const response = await this.client.send( + new Command(options.parameters + ? coerceApiParameters(this.service, this.action, options.parameters) + : {}, + ), + ); + + const coerced = coerceSdkv3Response(response); + + return options.flattenResponse ? flatten(coerced) : coerced; + } + + private loadPackage() { + try { + /* eslint-disable-next-line @typescript-eslint/no-require-imports */ + return require(this.v3PackageName); + } catch (e) { + throw Error(`Service ${this.service} client package with name '${this.v3PackageName}' does not exist.`); + } + } + + private findConstructor(pkg: Object) { + try { + const ret = findV3ClientConstructor(pkg); + if (!ret) { + throw new Error('findV3ClientConstructor returned undefined'); + } + return ret; + } catch (e) { + // eslint-disable-next-line no-console + console.error(e); + throw Error(`No client constructor found within package: ${this.v3PackageName}`); + } + } + +} + +/** + * Flattens a nested object + * + * @param object the object to be flattened + * @returns a flat object with path as keys + */ +export function flatten(root: unknown): { [key: string]: any } { + const ret: { [key: string]: any } = {}; + recurse(root); + return ret; + + function recurse(x: unknown, path: string[] = []): any { + if (x && typeof x === 'object') { + for (const [key, value] of Object.entries(x)) { + recurse(value, [...path, key]); + } + return; + } + + ret[path.join('.')] = x; + } +} + +async function coerceValue(v: any) { + if (v && typeof(v) === 'object' && typeof((v as any).transformToString) === 'function') { + // in sdk v3 some return types are now adapters that we need to explicitly + // convert to strings. see example: https://github.com/aws/aws-sdk-js-v3/blob/main/UPGRADING.md?plain=1#L573-L576 + // note we don't use 'instanceof Unit8Array' because observations show this won't always return true, even though + // the `transformToString` function will be available. (for example S3::GetObject) + const text = await (v as any).transformToString(); + return tryJsonParse(text); + } + return tryJsonParse(v); + +} + +function tryJsonParse(v: any) { + if (typeof(v) !== 'string') { + return v; + } + try { + return JSON.parse(v); + } catch { + return v; + } +} + +export async function coerceResponse(response: any) { + + if (response == null) { + return; + } + + for (const key of Object.keys(response)) { + response[key] = await coerceValue(response[key]); + if (typeof response[key] === 'object') { + await coerceResponse(response[key]); + } + } + +} + +/** + * Text decoder used for Uint8Array response parsing + */ +const decoder = new TextDecoder(); + +async function coerceSdkv3Response(value: unknown): Promise { + if (value && typeof(value) === 'object' && typeof((value as any).transformToString) === 'function') { + // in sdk v3 some return types are now adapters that we need to explicitly + // convert to strings. see example: https://github.com/aws/aws-sdk-js-v3/blob/main/UPGRADING.md?plain=1#L573-L576 + // note we don't use 'instanceof Unit8Array' because observations show this won't always return true, even though + // the `transformToString` function will be available. (for example S3::GetObject) + const text = await (value as any).transformToString(); + return tryJsonParse(text); + } + if (Buffer.isBuffer(value)) { + return value.toString('utf8'); + } + if (ArrayBuffer.isView(value)) { + return decoder.decode(value.buffer); + } + + if (Array.isArray(value)) { + const ret = []; + for (const x of value) { + ret.push(await coerceSdkv3Response(x)); + } + return ret; + } + + if (value && typeof value === 'object') { + for (const key of Object.keys(value)) { + (value as any)[key] = await coerceSdkv3Response((value as any)[key]); + } + return value; + } + + return value; +} diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-names-map.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-names-map.ts deleted file mode 100644 index aaa5a6959dbf2..0000000000000 --- a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-names-map.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { CLIENT_NAMES } from './client-names'; - -export const CLIENT_NAMES_MAP: Record = { - ...CLIENT_NAMES.reduce((acc, name) => ({ ...acc, [name]: name }), {}), - AugmentedAIRuntime: 'SageMakerA2IRuntime', - CUR: 'CostAndUsageReportService', - CodeArtifact: 'Codeartifact', - CodeStarNotifications: 'CodestarNotifications', - CodeStarconnections: 'CodeStarConnections', - CognitoIdentityServiceProvider: 'CognitoIdentityProvider', - DMS: 'DatabaseMigrationService', - Discovery: 'ApplicationDiscoveryService', - ELB: 'ElasticLoadBalancing', - ELBv2: 'ElasticLoadBalancingV2', - EMRcontainers: 'EMRContainers', - ES: 'ElasticsearchService', - Finspacedata: 'FinspaceData', - ForecastQueryService: 'Forecastquery', - ForecastService: 'Forecast', - IVS: 'Ivs', - IdentityStore: 'Identitystore', - Iot: 'IoT', - IotData: 'IoTDataPlane', - KinesisVideoSignalingChannels: 'KinesisVideoSignaling', - LexRuntime: 'LexRuntimeService', - MQ: 'Mq', - RDSDataService: 'RDSData', - SESV2: 'SESv2', - SavingsPlans: 'Savingsplans', - StepFunctions: 'SFN', - TranscribeService: 'Transcribe', -}; diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-names.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-names.ts deleted file mode 100644 index bf7b5645284ac..0000000000000 --- a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-names.ts +++ /dev/null @@ -1,336 +0,0 @@ -export const CLIENT_NAMES = [ - 'ACM', - 'ACMPCA', - 'APIGateway', - 'ARCZonalShift', - 'AccessAnalyzer', - 'Account', - 'AlexaForBusiness', - 'Amp', - 'Amplify', - 'AmplifyBackend', - 'AmplifyUIBuilder', - 'ApiGatewayManagementApi', - 'ApiGatewayV2', - 'AppConfig', - 'AppConfigData', - 'AppIntegrations', - 'AppMesh', - 'AppRunner', - 'AppStream', - 'AppSync', - 'Appflow', - 'ApplicationAutoScaling', - 'ApplicationCostProfiler', - 'ApplicationInsights', - 'Athena', - 'AuditManager', - 'AugmentedAIRuntime', - 'AutoScaling', - 'AutoScalingPlans', - 'Backup', - 'BackupGateway', - 'BackupStorage', - 'Batch', - 'Billingconductor', - 'Braket', - 'Budgets', - 'CUR', - 'Chime', - 'ChimeSDKIdentity', - 'ChimeSDKMediaPipelines', - 'ChimeSDKMeetings', - 'ChimeSDKMessaging', - 'ChimeSDKVoice', - 'Cloud9', - 'CloudControl', - 'CloudDirectory', - 'CloudFormation', - 'CloudFront', - 'CloudHSM', - 'CloudHSMV2', - 'CloudSearch', - 'CloudSearchDomain', - 'CloudTrail', - 'CloudWatch', - 'CloudWatchEvents', - 'CloudWatchLogs', - 'CodeArtifact', - 'CodeBuild', - 'CodeCatalyst', - 'CodeCommit', - 'CodeDeploy', - 'CodeGuruProfiler', - 'CodeGuruReviewer', - 'CodePipeline', - 'CodeStar', - 'CodeStarNotifications', - 'CodeStarconnections', - 'CognitoIdentity', - 'CognitoIdentityServiceProvider', - 'CognitoSync', - 'Comprehend', - 'ComprehendMedical', - 'ComputeOptimizer', - 'ConfigService', - 'Connect', - 'ConnectCampaigns', - 'ConnectCases', - 'ConnectContactLens', - 'ConnectParticipant', - 'ControlTower', - 'CostExplorer', - 'CustomerProfiles', - 'DAX', - 'DLM', - 'DMS', - 'DataBrew', - 'DataExchange', - 'DataPipeline', - 'DataSync', - 'Detective', - 'DevOpsGuru', - 'DeviceFarm', - 'DirectConnect', - 'DirectoryService', - 'Discovery', - 'DocDB', - 'DocDBElastic', - 'Drs', - 'DynamoDB', - 'DynamoDBStreams', - 'EBS', - 'EC2', - 'EC2InstanceConnect', - 'ECR', - 'ECRPUBLIC', - 'ECS', - 'EFS', - 'EKS', - 'ELB', - 'ELBv2', - 'EMR', - 'EMRServerless', - 'EMRcontainers', - 'ES', - 'ElastiCache', - 'ElasticBeanstalk', - 'ElasticInference', - 'ElasticTranscoder', - 'EventBridge', - 'Evidently', - 'FMS', - 'FSx', - 'Finspace', - 'Finspacedata', - 'Firehose', - 'Fis', - 'ForecastQueryService', - 'ForecastService', - 'FraudDetector', - 'GameLift', - 'GameSparks', - 'Glacier', - 'GlobalAccelerator', - 'Glue', - 'Grafana', - 'Greengrass', - 'GreengrassV2', - 'GroundStation', - 'GuardDuty', - 'Health', - 'HealthLake', - 'Honeycode', - 'IAM', - 'IVS', - 'IdentityStore', - 'Imagebuilder', - 'Inspector', - 'Inspector2', - 'IoT1ClickDevicesService', - 'IoT1ClickProjects', - 'IoTAnalytics', - 'IoTEvents', - 'IoTEventsData', - 'IoTFleetHub', - 'IoTFleetWise', - 'IoTJobsDataPlane', - 'IoTRoboRunner', - 'IoTSecureTunneling', - 'IoTSiteWise', - 'IoTThingsGraph', - 'IoTTwinMaker', - 'IoTWireless', - 'Iot', - 'IotData', - 'IotDeviceAdvisor', - 'Ivschat', - 'KMS', - 'Kafka', - 'KafkaConnect', - 'Kendra', - 'Keyspaces', - 'Kinesis', - 'KinesisAnalytics', - 'KinesisAnalyticsV2', - 'KinesisVideo', - 'KinesisVideoArchivedMedia', - 'KinesisVideoMedia', - 'KinesisVideoSignalingChannels', - 'KinesisVideoWebRTCStorage', - 'LakeFormation', - 'Lambda', - 'LexModelBuildingService', - 'LexModelsV2', - 'LexRuntime', - 'LexRuntimeV2', - 'LicenseManager', - 'LicenseManagerLinuxSubscriptions', - 'LicenseManagerUserSubscriptions', - 'Lightsail', - 'Location', - 'LookoutEquipment', - 'LookoutMetrics', - 'LookoutVision', - 'M2', - 'MQ', - 'MTurk', - 'MWAA', - 'MachineLearning', - 'Macie', - 'Macie2', - 'ManagedBlockchain', - 'MarketplaceCatalog', - 'MarketplaceCommerceAnalytics', - 'MarketplaceEntitlementService', - 'MarketplaceMetering', - 'MediaConnect', - 'MediaConvert', - 'MediaLive', - 'MediaPackage', - 'MediaPackageVod', - 'MediaStore', - 'MediaStoreData', - 'MediaTailor', - 'MemoryDB', - 'Mgn', - 'MigrationHub', - 'MigrationHubConfig', - 'MigrationHubOrchestrator', - 'MigrationHubRefactorSpaces', - 'MigrationHubStrategy', - 'Mobile', - 'Neptune', - 'NetworkFirewall', - 'NetworkManager', - 'Nimble', - 'OAM', - 'Omics', - 'OpenSearch', - 'OpenSearchServerless', - 'OpsWorks', - 'OpsWorksCM', - 'Organizations', - 'Outposts', - 'PI', - 'Panorama', - 'Personalize', - 'PersonalizeEvents', - 'PersonalizeRuntime', - 'Pinpoint', - 'PinpointEmail', - 'PinpointSMSVoice', - 'PinpointSMSVoiceV2', - 'Pipes', - 'Polly', - 'Pricing', - 'PrivateNetworks', - 'Proton', - 'QLDB', - 'QLDBSession', - 'QuickSight', - 'RAM', - 'RDS', - 'RDSDataService', - 'RUM', - 'Rbin', - 'Redshift', - 'RedshiftData', - 'RedshiftServerless', - 'Rekognition', - 'Resiliencehub', - 'ResourceExplorer2', - 'ResourceGroups', - 'ResourceGroupsTaggingAPI', - 'RoboMaker', - 'RolesAnywhere', - 'Route53', - 'Route53Domains', - 'Route53RecoveryCluster', - 'Route53RecoveryControlConfig', - 'Route53RecoveryReadiness', - 'Route53Resolver', - 'S3', - 'S3Control', - 'S3Outposts', - 'SES', - 'SESV2', - 'SMS', - 'SNS', - 'SQS', - 'SSM', - 'SSMContacts', - 'SSMIncidents', - 'SSO', - 'SSOAdmin', - 'SSOOIDC', - 'STS', - 'SWF', - 'SageMaker', - 'SageMakerFeatureStoreRuntime', - 'SageMakerGeospatial', - 'SageMakerMetrics', - 'SageMakerRuntime', - 'SagemakerEdge', - 'SavingsPlans', - 'Scheduler', - 'Schemas', - 'SecretsManager', - 'SecurityHub', - 'SecurityLake', - 'ServerlessApplicationRepository', - 'ServiceCatalog', - 'ServiceCatalogAppRegistry', - 'ServiceDiscovery', - 'ServiceQuotas', - 'Shield', - 'Signer', - 'SimSpaceWeaver', - 'SnowDeviceManagement', - 'Snowball', - 'SsmSap', - 'StepFunctions', - 'StorageGateway', - 'Support', - 'SupportApp', - 'Synthetics', - 'Textract', - 'TimestreamQuery', - 'TimestreamWrite', - 'TranscribeService', - 'Transfer', - 'Translate', - 'VoiceID', - 'WAF', - 'WAFRegional', - 'WAFV2', - 'WellArchitected', - 'Wisdom', - 'WorkDocs', - 'WorkLink', - 'WorkMail', - 'WorkMailMessageFlow', - 'WorkSpaces', - 'WorkSpacesWeb', - 'XRay', -]; diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-package-names-map.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-package-names-map.ts deleted file mode 100644 index 79043c27ba157..0000000000000 --- a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/client-package-names-map.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { CLIENT_NAMES } from './client-names'; - -export const CLIENT_PACKAGE_NAMES_MAP: Record = { - ...CLIENT_NAMES.reduce( - (acc, name) => ({ - ...acc, - [name]: `client-${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}` - .replace('-chime-sdk', '-chime-sdk-') - .replace('client-amplify-', 'client-amplify') - .replace('client-cloud-', 'client-cloud') - .replace('client-code-', 'client-code') - .replace('client-connect-', 'client-connect') - .replace('client-data-', 'client-data') - .replace('client-io-t', 'client-iot-') - .replace('client-iot-fleet-', 'client-iotfleet') - .replace('client-lookout-', 'client-lookout') - .replace('client-media-', 'client-media') - .replace('client-migration-hub-', 'client-migrationhub') - .replace('client-pinpoint-sms', 'client-pinpoint-sms-') - .replace('client-route53', 'client-route53-') - .replace('client-sage-maker', 'client-sagemaker') - .replace('client-security-', 'client-security') - .replace('client-work-', 'client-work'), - }), - {}, - ), - AccessAnalyzer: 'client-accessanalyzer', - ACMPCA: 'client-acm-pca', - APIGateway: 'client-api-gateway', - ApiGatewayManagementApi: 'client-apigatewaymanagementapi', - ApiGatewayV2: 'client-apigatewayv2', - AppConfig: 'client-appconfig', - AppConfigData: 'client-appconfigdata', - AppIntegrations: 'client-appintegrations', - AppRunner: 'client-apprunner', - AppStream: 'client-appstream', - AppSync: 'client-appsync', - ApplicationCostProfiler: 'client-applicationcostprofiler', - ARCZonalShift: 'client-arc-zonal-shift', - AugmentedAIRuntime: 'client-sage-maker-a2iruntime', - AuditManager: 'client-auditmanager', - BackupStorage: 'client-backupstorage', - CUR: 'client-cost-and-usage-report-service', - CloudHSMV2: 'client-cloudhsm-v2', - CodeGuruProfiler: 'client-codeguruprofiler', - CodeStarconnections: 'client-codestar-connections', - CognitoIdentityServiceProvider: 'client-cognito-identity-provider', - ComprehendMedical: 'client-comprehendmedical', - ConnectContactLens: 'client-connect-contact-lens', - ControlTower: 'client-controltower', - DMS: 'client-database-migration-service', - DataPipeline: 'client-data-pipeline', - Discovery: 'client-application-discovery-service', - DevOpsGuru: 'client-devops-guru', - DynamoDB: 'client-dynamodb', - DynamoDBStreams: 'client-dynamodb-streams', - DocDB: 'client-docdb', - DocDBElastic: 'client-docdb-elastic', - EC2InstanceConnect: 'client-ec2-instance-connect', - ECRPUBLIC: 'client-ecr-public', - ELB: 'client-elastic-load-balancing', - ELBv2: 'client-elastic-load-balancing-v2', - ElastiCache: 'client-elasticache', - EMRcontainers: 'client-emr-containers', - EMRServerless: 'client-emr-serverless', - ES: 'client-elasticsearch-service', - EventBridge: 'client-eventbridge', - Finspacedata: 'client-finspace-data', - ForecastQueryService: 'client-forecastquery', - ForecastService: 'client-forecast', - FraudDetector: 'client-frauddetector', - GameLift: 'client-gamelift', - GameSparks: 'client-gamesparks', - GreengrassV2: 'client-greengrassv2', - GroundStation: 'client-groundstation', - GuardDuty: 'client-guardduty', - HealthLake: 'client-healthlake', - IdentityStore: 'client-identitystore', - IoTAnalytics: 'client-iotanalytics', - IotData: 'client-iot-data-plane', - IotDeviceAdvisor: 'client-iotdeviceadvisor', - IoTSecureTunneling: 'client-iotsecuretunneling', - IoTSiteWise: 'client-iotsitewise', - IoTThingsGraph: 'client-iotthingsgraph', - IoTTwinMaker: 'client-iottwinmaker', - IoTRoboRunner: 'client-iot-roborunner', - KafkaConnect: 'client-kafkaconnect', - KinesisVideoSignalingChannels: 'client-kinesis-video-signaling', - KinesisVideoWebRTCStorage: 'client-kinesis-video-webrtc-storage', - LakeFormation: 'client-lakeformation', - LexRuntime: 'client-lex-runtime-service', - ManagedBlockchain: 'client-managedblockchain', - MigrationHubConfig: 'client-migrationhub-config', - MigrationHubRefactorSpaces: 'client-migration-hub-refactor-spaces', - NetworkManager: 'client-networkmanager', - OpenSearch: 'client-opensearch', - OpenSearchServerless: 'client-opensearchserverless', - OpsWorks: 'client-opsworks', - OpsWorksCM: 'client-opsworkscm', - PrivateNetworks: 'client-privatenetworks', - QLDBSession: 'client-qldb-session', - QuickSight: 'client-quicksight', - ResourceExplorer2: 'client-resource-explorer-2', - RDSDataService: 'client-rds-data', - RoboMaker: 'client-robomaker', - RolesAnywhere: 'client-rolesanywhere', - Route53: 'client-route-53', - Route53Domains: 'client-route-53-domains', - Route53Resolver: 'client-route53resolver', - S3Control: 'client-s3-control', - SageMakerFeatureStoreRuntime: 'client-sagemaker-featurestore-runtime', - SavingsPlans: 'client-savingsplans', - SecurityHub: 'client-securityhub', - ServerlessApplicationRepository: 'client-serverlessapplicationrepository', - ServiceCatalogAppRegistry: 'client-service-catalog-appregistry', - ServiceDiscovery: 'client-servicediscovery', - SimSpaceWeaver: 'client-simspaceweaver', - SSMContacts: 'client-ssm-contacts', - SSMIncidents: 'client-ssm-incidents', - SSOAdmin: 'client-sso-admin', - SSOOIDC: 'client-sso-oidc', - StepFunctions: 'client-sfn', - TranscribeService: 'client-transcribe', - WAFRegional: 'client-waf-regional', - WellArchitected: 'client-wellarchitected', - WorkMailMessageFlow: 'client-workmailmessageflow', -}; \ No newline at end of file diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/get-v3-client-package-name.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/get-v3-client-package-name.ts deleted file mode 100644 index 4ee1c0366d81f..0000000000000 --- a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/get-v3-client-package-name.ts +++ /dev/null @@ -1,8 +0,0 @@ -// Refer to https://github.com/awslabs/aws-sdk-js-codemod -import { CLIENT_PACKAGE_NAMES_MAP } from './client-package-names-map'; - -// Returns v3 client package name for the provided v2 client name. -export const getV3ClientPackageName = (clientName: string) => { - if (clientName in CLIENT_PACKAGE_NAMES_MAP) {return `@aws-sdk/${CLIENT_PACKAGE_NAMES_MAP[clientName]}`;} - throw new Error(`Client '${clientName}' is either deprecated or newly added. Please consider using the v3 package format (@aws-sdk/client-xxx).`); -}; diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/index.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/index.ts index 33f576c5ce1d5..3ba5aa18fdb1f 100644 --- a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/index.ts +++ b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/index.ts @@ -1,4 +1,5 @@ export { coerceApiParameters } from './coerce-api-parameters'; export { findV3ClientConstructor } from './find-client-constructor'; -export { getV3ClientPackageName } from './get-v3-client-package-name'; +export { normalizeServiceName, normalizeActionName } from './sdk-info'; export * from './sdk-v3-helpers'; +export * from './api-call'; diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/parameter-types.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/parameter-types.ts index 1908080506160..5e960e0066c7e 100644 --- a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/parameter-types.ts +++ b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/parameter-types.ts @@ -1,10 +1,10 @@ -// This file was generated from the aws-sdk-js-v3 at Thu Sep 14 2023 12:13:30 GMT+0200 (Central European Summer Time) +// This file was generated from the aws-sdk-js-v3 at Tue Sep 26 2023 16:22:17 GMT+0200 (Central European Summer Time) /* eslint-disable quote-props,comma-dangle,quotes */ import * as zlib from 'zlib'; export type TypeCoercionStateMachine = Array> export let typeCoercionStateMachine = (): TypeCoercionStateMachine => { - const encoded = "W/AsNQqBjQMAhF6rOQqxm1SVvYGOm2d/3QGYwXkAQE/15YOph+ONkbl63Zwitwh1JKPl+MSgleEdaTF4Nn6MsA+YgqfuSovB3/AjF34IMA9b4A+RQjqccJELH+KfW117/n5a/1X/ev62dCXqTeS44AAmk1csOiFirf2DSvMCt/PbWSETVQg+osK2qvT/6f7d9kytz4g1EDhceLZBkidKgW/ghkv9oQkwvfmW6h+vKfUouSrptvPLkSS4NJ/AITLASiv7pb5a1afoYt+npiTbYSxZjEj7Pt2SeCJ3BPLB2IV8OL9PV2Znglm7e8CjMfDLKXMQEUXOMvevKmm3e7T2tIzqRc0aQzpA6QAoundRCNGl53/fl5ll1qsfjk8HiIAiWEyKGlLK1bYRiEgZyYgcJo2UabMtvHPeu6ZwuLuJmKwCQMAqR7PKVMlMKfUw3nvf++7fh2BiyhSAoCSSonUpVWNKPclq2ZPte7HcACBlxlRPUo/q2nX7lW9Wur3Tifqzh77GUUnDoePUF2DghPQoLINT71VlcKGCC3ECwIBa+plVjWCjATIAzJAxitqwzjA82u4eLQYNh/A/ZxgVTE/PdIXHd+lYG9asfmLPBiJGYDjb7rb3fb91k3Y6eZx83lgSvI1BCIG7+/tV1Ks+Zmat63PLJCACoiKEJL0M075fT9rZeXWa/n+PJXEYMGC4RZb9yv+/0/Ysb5bO56tJQDYVETGEnGW/t///6+rsV1vbv3tqEgEREa1KCGEWU7Wk7S2P+HkWOERuEIQWh/d9U/+rk/a+OU5Tf04EgNwla6G4gvg/5l/p3Md5fBy+b9LKHBrzYmO4rVZEHDNWl+O553dCMQ8wC4n7QN2lk934JaI1u/lh6ruL+mlUYUomj7vpA6w7/rwnzgOVGzAba9vNdqRknmXuMnP+QBsHqSmpf4tWvR7Qm2S6nDWc96YZ8NqC1PJQyTlXGp4ikw15D56Zpw4hGEts+vRwF4k5uQEygt1W/p6eV0eyZKjWW7mdxMUwlTHXeK88iat1pykzhT15WnHXR55Wz9WG+ZjtVb/7GixJAg3qSw8i16X9vPRWiDKZqUF1yzJvPRzdf2d251mMP3Lf++o/ODQ2c5WxrEdNdh5v8X/bl5zI5QNewkbLYrnjspBCsrft2zwScJOOivvVx9zXihcB6IXSP2ysXhuf1wK2EJVh9rCkhWc+w0Ox9YAbvjVv5npCwer6DPUen9u2MIF9ucPLrofewKZg4RGn1+DBKb5zj/osKRPEXF521jLHJXnNOSWUFIah1w1gV8LTD8JKiaLt/sdgW+grKLEBOC/4n3aAdIUM+exeNmGxYN3MHrffJAeAt0w6Bs3OyBVZIFsEjlbdDii/fMMGwXCv++lSuboyY6/x2uO6ouGR/vmrmJLXUrZnhW7JYfHRHFUVGYTKoOw7oA2PGH531aEC1sawlUSnbXQ5zTXe1A3LcKvnWd4U/+qxCsr3EUHVV8PbG9ub8/Q9ulc42U+7oCXxI3ikq97WyD8Cg+syWcBccCgmCfRVmMx5SvoedN9wHhWfbac+JHtM+HeZZB4wzAz2rg3ZPAMOkKgTuHbfW8JxBguDzQrYYwq2TTZiAwWI0nd2dfDaUI6hB/SWQBIWAfozITYahemyztNnulcpP569f33zvkOmLy7zOzdUQ7yEk/aZoaqnGHisB7SdDhXloAlnXWwZ7yIuVlvmklH7OwsBEw3YhfNwb+6LbcCz1YtO3ltMvMZme9zZ8shU2cn6jU/VkJ1vTmMvIzuAcYXgHLDUUvbTE9iJyMiMF/C86w7/I7XON9bPqk48g4yzmqmFRyCBKBcCKGCpgKAGqc8K9hoJI4vBIPLyu6UfPpnRTCPYgz5LuMbSckTsoOO+wyqQA1wBfg0ZavIcA4pXaf5Xs0g0cHNJ+DPHJou86b316EDc4sg3yNAfnbLlx6lXcZ1tcMWIryj8WpdAAekywCPVY/aK3+NFNxCbtZv0JYe/VFG89grssQ1cDUJtnjU+Gt9GRbHwa2Y4JYyziiRcEr4HTxPPZMKlgvW9R+SDTNzxK4FDcHTWjsiszxCewlKD1cc2IxUOa8Xj/YwOCSq+SYDor/XeMR25I58jUOs84TkGwPfDLomA52qWTmqe11MdKAZIe113YF4k+Ey4vL+nNACP9Trv7Cbgom5vjR+9rxHYnUNt+kjXC4KjoftxjSLfbCGETg4P2InWUGQmwbks3X3B9gFw3UCtickm3s32PzDfqaFLC3c0kkV8T670uWDpagxliuGX/czkLmV22M/xJVE6z5240TeBZKpt4ZA8qjuR/4QodWboyk4Il0sT0vov2vVzEUuvwiTveFczS/JfSGZ05piJFXtSW7Kk4tlY0uRw5cAdr1syl+3bWnkEtF613CUCddleRTmBunZcJqQi2Q/qEtKYaoe3SVTkUxZPNR6smI+ERZS3vfln/4kvnbFyr++C9u5jYUrDMrGaICIIAjUWuHsKoTMq2vmrl/QZHbmR5OKAjmWt8wetU21JsmQeTg2AREFAlPLERjAUbxrUZXdFkv6RnWZH9tW5bNjHdA16OmlcHYvxvEsXzOzHmLN7afZOp+TZgqnyoIZJWxKZ6OkO/P45D/Tt8g/3vyQEiwUE7DVBrnpOqeJKROeyTKZXwx0/ZrmtDNiBPQkvh9xUfs59p7a/8Z+UOw76VnPnEwGi3aT2OlFIA7AORKJzpR1Yx2yC0rMxwaLkTXfzI+Ln9PC5/WBcMT8A55e5YSmsl1XJ4HYANj60a6+/SUgL/hn5aXew1C60LwRPq6CXke07cCfIk5Md+eFfBhhHzA6YUnjggYHzA7QW3KTUPve66VT72FO6JIYIvW53IbXMXE+h595Og/MylTyEO7sBsUEoCOoiLeKCRRFygAGdXUZ4JLQTr7+PL3r5tmdGRUimjLsVfJ7HKNXcymDTAalPazLAQPD7ihGu3jYmCftqLmcb4c/ICp0DrXYp9ryUh2o2r5XJQkjGx/fg5mOF0XxZJuYRIIMXf/14J7uO3vmKFnYSZwNlYFM0+94wD/ws7C30yGDpveSH/cHlU/U2hs/LBP73H0OqzWYrFNG77ayf1IGMzAy+D0W2IMjs1ccT6z6p7vGlbtSKV6eHbDHRqHXNoDr4/B4NM8s+gu/cBK+7pilunndX1OVP9oz7I5IjMMkW25Lu+hb/UDfN9/z2Lob9NQcosJEFpqFHMUHC+J6Xv9nHcEoAQbhtmQBjG+Hp1n3df2PwaNdZIAa/Vlw5MLJxWEcFaBghcSpYm1DHRwktwOlOwJAoVQ5KCUbmlMn+zdk4PBC32W0lHppGGYGx92H/Ky43BhBjMvFHEq9XWdLBO4i5kECMSuJIKvlfztp95bDEfCWTNzGnQ+tuI2jFJE7c8ICql+0eNGoCrG4sydJ59LgOuJ6v+JF3vj7vGVQQFU94vbg2+GVnrCzkdUlNMOADsxlM1r2EyfyEjqclmwy7yKYObOkA7SaW7wHSXYY0PLqNtTtGKRDdU5A7eYERH/52B2FAJAVgF6FlEXY7PBlhVF5sLgxUGEhKbseZg7r9MUAYqb7tqfAPQ4C9Q2BTk4G+iXBeSB6D009m8/Y3H0QYsUtuyYG+aQbQnfG4taHjZGq7iZkA1nGHwyHr7dBSyEQC+cRZCjCSmJjcEX1tAakn6HYrs9xu8i2U7G89cXD29gHzZxAz4iz1iMlDsg9JHy03poyE/tqe1epjSZP48QFQI3Yh6Z6pgKqpr6wh7NdiTVz3pAZM7fU/lsL3Ol//Ql4KmF5PC1MeSXANATwdxBCDHXlZ74M9Xnl2O6h6ZEiX6MUTAjB5scgY2NlXWhnCYzswcai/NRm2xPhaH48fTPXu/majhCqD9cLBfH3eCbZufZQ9/E+cKiXQTmGdJ+R7vrJudhwUHHyt41QYbOgk6T3gfCfrrbNxmhhOfFJo7TxvswfnKA2fvvTrQ1ePuGbyI4nAMeUea5vS85KA7J/iaWlnC9O9q4G2u6GjGtbu3LujuzmQdIve6dASXT8V3zrBQOi4X8/qE5+sEyp3/suErzhMYpFwADgd7g9vV9zwTtHyOiApu53aIQkR55D0bQPXMxUF6AbHLY1Ud/I+c4DTpR5y7KQV/lKu+M8xUOnlPAlqEnA4JQppP52TLdy8JqQILu17SopPPHeIoxdRCuBZTH/T5MKTe5qaXHgNtmbMxACkWz/SgOyeJPtvzfi/otDd2dsYgLd4Uols05uXNjpAkcG9OxibOYcg0rYFaJcpz/VwbCijPPCeM3g8Daap/Fu1IFnei5JIcf6k7rcoLqK1xQQVKWU2PephL5nqZAlUe/r4H+tB1XhRZv8wPCLub3G3fNbgbjr7Q7nQ/Dwe+KPck9OkxlG+wyI+BH4/zJRGWeEDzJYnc416ygfQqG44qMCRr+9HSKtQ7czU7Y80LQM9M8qx8wTX4+kSiodUHnw8vB8XsolnDbPTep+2yz8aMf2Sk3qDlYWhul7BkBbg0ytZsAbM9CSwf3ZTfQm7gzOVCIYF2JonFUOi7/DFBbIIw0DOJiTqT11LbAGsRiOj03heC6+eNmsXC/wGP7HmauSzwm1jgdZMauqGZ13lAdzq82Ozp48VPV3vBrCebHQCey8iqGZZ0EhTKQjU2XjakU8PmVQPyG7MtqnNh0Je0DrZ9DR9fXUnR2RlF8XZ+jjrn2RATr8X5fQo7CcPUUlWgIzieuQklVszGpgN4oituNpN2fJoGWvDPR/uK5nq+VhLR2KqqqhDoLqI+fpYEI7BFb9/pJjhdFr6EtjVI6CPIRqYsZ53hOwyHLpZkWQqq9o1iTrUDM5payzAi4FNIpZMyVMQSIEVTUGchOXOytaxMUZosC3sDdqA9T0WUPVIQFiXE7q6S620546NVErzAkEnX4fG2arBy+Otipv5dKIGLYN0ImjqC0b27zvBKcQ6XMpGyV35u7M4WZ+UZ+lg703rv9uZx49f/jG+aL2PvWkzr2/OS8r5QMWV5VBUx9PuCO+IXfNBg6HUlovtevDEoJd4f1ojeDnH8TbWpsC90KslOae+QvuT5YO0tHhWIEIunxjl1hPLS9HmGPY7ChkJahN3DlhHCXkVX10yXOQ6Fh39ZojTsF5PPlJ5Tr9SWZR1iEMJadj5dYLlytIIoja6K0rNzw4Rnx+nPV9J2RUEsXcky6fApeP34c4pZvX5AfvG95KcfthWT8pflLjHs4e2tTH1uAJrOuThXjVJ8zseDV1JH6sXJ0F/6kbvs4XObTwEngxnFE4qSBsQI9WC6tgw3CDVBr6qaGQkQjh9i4ZXouC+eiLCBi4kly89I6yVlMdCoSqUtNK4h/wi75aiZ8UBOX4BvwQHeJWwiz/X+J1iwOkw7UPqEDNsErB/UZ00vKpIsPvNaWzO5fickA128YHUqB/0tBK7ioTZ+jkI1lQYWAP4Kr++j1XZC2mAbDMF4LoUStGLA8KzOnQLKEfX7bR5hd7NAFBDdNb9Zc1cspYHxSsnWEfTwfk5laFPzKpQRBzwPUpplb6CeTUWjFnYq/UdKNuwo0A/w43JAKwjo58AyiZcHEkUkHXFdtoz/WA92LWCF8cg4aceyJTsMclTeIbW1+xyCsqZb44uO+sfhITd92r0FUI0v6vleviPjehgTlj2MtDnqFBD58gvkUUbqD+/xEJSTExNW2A14lK/4pi8jMma52l41IoexGvBgW8tdRJAFxNXljfN/NDbtLeh3WGLwR1iJQ3SjJQKH8pFW/3j9PjoznS73I/g0FNrdS6dKLiTeF7xcXnEYub6Z8f8p3ksSE9TL8kjY+TFtA8URfyrU2btrynmwkgVANn5tB+oIwNahoKrYHP2qLpbdlwNMdFPWyBHCmjvtCBEGGr2P+1HqIhodAwbjxggI5TJrVLtAoiOPprwHJIRScNnyABFeeCgjPbj1Vk2qbR8Ieo1+2HTQZ52ifrDlDVl5G4tco7SINe8sZ9nUk+PaQg4sparXEjker6lErBhPrtcaRFfk900MZiqJUGUdodqWZOxh4f9H0oiSGwxNPB5FxQmdPwKB8r3Z1yRSJq0IBuA/K49rG/ct+mPGL+9N1tKS/Epg+aG4bWx5zYAug6NZLa/A7CbNMw7gLqHoQMbn6Non2rfLQmfhxfPvqmLOOzXq1wBrK50mnOrLzkdXit96oFbPemB21rYGas14V6TPlhfXomyUoWOdOyt9tGx0oZ7P+0ESskjEiI8VSMk+gOoW27h1T27bd8DyhZe9Zgt3GrYrXe11cPu8R6H7ae/MrwzsVVeVhZKJN71WLcJ2mmQq+g9NSW3B53/hNBCY0Xz8W5Mt60MTSaxnQPAC+qJTpp0MGO3VHegeCNIuv++lwHtNStPwftqj7+sxTgsaC4BQBIVBxcuKQIeUvqcYrb19HyRISnjVMxvXIA0NSiyPOpsdy1zTPPEsj0YsYxXizlMh6WUoaEdCTHeAKPoDNR+DHKEXa5r8/dJSEV1BnD1aX0u0o8Bcen4O+MLIutJSjkAWYU4xgafmlQpEjtE8a5FVzfJe20oEwnB2VCL63xzY2B1gE8Q4khArLGpShi2ukmpiWgIAao+xJkN+Auj7VmZgSoR7fTSINfBH+A1JZVgSV9luONkuPcNxy8CpATP54QD42HN1rOMdeTQfeuQit/d5tDy7f84XB3eT4INsi/B5dqB80fl6iEfzgG8/VkXrI5EuMwT9J+wr02jaa1ATkYKmYv18U0c3FePCxVAqfZZs2RQ/w8xKCTIQyoFkQi5yuomBZWtLko2a5zzuA4fjLF4G5ABQ9FGZRixQOlDPHIb2g0H0IKTtqCdXP/bW9QXBXw3AkWVTelzCiSf1sbxlIEyFi8+JirZWb8Ud1npDAbWPNFtFIJwNj4kNB1FuU0Qrjlo8RKzFgiraX1EjxL7gHIjKXK9Ggb3OEMGV+qNmtFCualqpAFb19MB8zzzagUfbgGsLUQOKaWcdy2JLweqmVLmLTLBgeD+CwRli3PGki6ReNLsqyXiOr7p15VEiJnmL5hIAgPv1GJvkd2Pq8s60BNs1Ebiv4SFSOlIdzg7rogRUX23108KM/HZojqWiRsT8yNM/bhdzKpx97Wx13EnishR0ann44CyKcJPrGLbqIjLdPoyM9RCHab0/37BRr3bAAQJFUyVdrXuhAdetmPd8CeGHW/RMIRPdAV6QijNw22nr+kF3OJRbUAnIGYC2MWt3txTuvKw4VKk3CkP4P3dpf/Bbjrt33a3nxOAuJQdN6XDnl7SeHiSeKJ8fi8riiwd/z/im6SPD4oF04ClBGyLCYiVLc8ve3mPQrn6Ut4cNISC1FSPDuA+6tteugYEpfbzue5i3srPsC4D/YfDJsZ2zNLgqMUKlbKpcY8O615uYRBh+VIl74bpEfnOS5aCZZZF1EBH/K17O7UIhWX27PgyuRaog4h5sf/le3tj/g66NNx1I6azmGz26YjElpTQi0EzaWswtH/fItbSpK7riDJkWxYrSQvzwzpxIAg1mzAmmc3RHUJi5IZxTeo0GuaR3csqeXwnE4hjgV/1PL0g6rCFVFxBXWgAH9MHxOy2XFrbk5PusZWD1/6bVIGbbDtB0JS5eRpLhKWExNXL7+5WfuxLAdYrdlSNijrF/Asvw0PIJLzJa0f2RdfeSbYZd1W0hUgIgieb7mAdaSOhRFgxV29cIdzjO68u7YRQiB/6OEWpzIXPjQuD1lmudS4uiQ9nl0p9w0rgauoAG2zGWl5vsrx18lRNO1VHxdXD1FvLQbNOr/C/wz11JeZQfs49rW+CMqsfngA9rAxXOrWt7JSpZ5WWTU6hXFTdayzzZVFBAKyo5uq27s9wEujKC5K9c9/WYQP+8T3y9WOJG3uCgKUDV52DL7xac8rFy5dcPZa4j2kF27Jujv5kHG44xacJ0sVojjjvgIW6Y9gDI9QKTL2c5/JTKM7o0GyMWet51zAphGndO8qXN6NwiJCb5LkutZGrV9Ew/w520CzNQ/143pjzrWJNz6eZB4xq5v/bYpXOWSxByB7fAxqeDcOS31KMH/RDUg5Ffyt4oESH5+AUDdXADSLzzPHoURVpAxGkfgVQnJR5Fz9JlLWEh6zGFEBSVSxeGvRATbonxhphhatVtI0hezZoJoz6J70moDicHkKmTQ7wgjIJBpg4a18vlMdh6mNnto9KiVRoM6wdwWdsc0JTP4HkGPV4HYtrb1I3AcP4cGnTKBEE8FcxR3nBP0VIx4mupjZpH7siHeU1sYyC9L3wVLYzZkUMXG2lsThjh8JyEKSNcz6j5kPYqwL98xmD4kTHjpGwD51PVKPBHx7V/1Ge8MQraqglCto7tz8JwEfG3CkKIEKNaIuDNIPjneMQl93zssyEHC//owNAj2yhK+3oLdN7lIkpmXUG/owsY3qE2QMmT5LPSixo95aCEnVF5swI2K8CJs5Gfac5CgICpQyNhnuvO3yE+9tz0SuNiq/vI/OQTAvwFHA8Ju5hgRXpxL2uioa8D1evCnKizX5er0dUpa4H2kI7azyBhgIXs3cEUJdk8RjmTztifxkLEa+7efhgpxIVAGpxxEFAh9Ceg52anvMbStnSeBRrfbhX5gwVLOPvNPnQiyCNbAFUO7+xCh2taj+cgh/71Yee3WP3fa/bZVmlRocoOKYkgxCC3XmNQjupJ1/BcjqCy5XSnCi2mF9w70WUoGHWE3RhDX6F6PVe6duO3gDpn75GkYtYjEAtU+gwrsOd4xQhHOZ6XQalhTOwM+BuL4neeQu5tWGyGft7qfOPKyLXhZiErZLKChNdRA8oewhEiOx/92oLBshUCU5XCxXTavEmATaoeuNoT+9NEwH8Vc2R9ykrcPYWwB/zEaRHfuiAF91Hw3v6L7GU2RAWlK6g/2ar95N2Wfp8b01Xjwwu1Zb3DZoJAXYQ5pIxOiDCtD/cs5Qd7a+LcULcNha5KeqaEN56gnbiAD/XkZZcUijpNLnpCoBktM6KAtq4MN2QGJ337VrQeJORXubuhXdHdnyrY9Ex2JghsO4VJ1dUePIsg8qpSx0vfbbeFhJn+RLStBvlN/0/mPnHcbBasVVzPffT+tFC3pbLtclMLve6KW9yp+RHIsxxIxZSLW9JNK3c5INTUqg+/JjKZynB/qacytnDK/MydyLDiTWVURfF5UUuW4m7qv0a5ya69EA/HJmirmT+yxD0qvg3AHbDBHB3pcMqbt2TGZl+k3BnXne0oQ63etxN9ZxZh9Ny5N6qTvEADNIGUYdqoHlAYQ+PNS2ezFi3ZvTUU3FIWXivufDxqooDvl8WT8dJIPCiTgmIiUlRYOWml7zdTZ7OtgnVkpOtt97E5N2wWJ9W77VA0Jf2nQ1y6UIVMwA7UAtCEj74uT46oBh7TvfVE85jTV2W9UOcPfhf7rPxWwB1khnZxNathn6pvhp+Ys7mcYJupHbnPHx/FOdsUBaHpPPN/wv6rIZYkcFaqdt2a/XsKAMJ4kxw6+SNclSY8bQLKOaDiDPYqemVLpaLTsJN+vnosscb2q3dkwktZLSgtvOO93csc6uyoLsM+He7Wi4KSLdQkC62xY7qATzG1mVCvwQQ2cjD/ILADPvTTDPfujiQh/iUuAQCSy7F4t1DALOy7h9Am/ZJ6WogJ93JKL5c8NkE5eQJHmimEISJ+wwKJXfFa4m4jzL7YYIP8JTSf4t3X7j1vWazUKbJDCtZclb/k23+ryBj9Z+kmXvhrOwNs2aKuYcBbaEBOPC4KjTNKYQ5FjmxIlp5wAwdgQs9l6PxlElaqk2CAB4Be8ILU/OhFWkHUpSPDAC2/KDk1PjRViULLpTW4QPk6AIe1yoRVfPI2OTn8IADlBIsOjEH5Gq1TGXsMR2NHFTUIWsJP1Emhi9PcLvOOrNseGHjdJ7Ywu1+QSqulx6WJ+NcbR4LtPebdIWEQjCkmvR0OjcZKeC71mkqY6PiTMBEU5nCfiMUna1igHlF000YNd7ROFho8/K9H2K/4Bbb9SakJdsJqdrgVp+aR7EIskOvR2XgEFmSc2Fush5bpuKst3l0xxlObmlQad/v04HHcFPw7bXqt8rqWdKu7SMHxyj+LroGZPln63RZLyzaLcxy65pZ1qilo3F9+S5NKKXSQtZK8BXh3vYuJuANoA0N8u2rxA1jILvPlez/6WHRcuOdcA3+776IaNNxY5y+DE5xaf2cAfjJQ0E72/cW65ghY/NCA4I2zWg7DYforxTr0Msq4TGB1dLbArZzPjxYcej39bBEtFM/P+oxebSVzpq3kraCsXg61/tHzX6sw1pWdbwJCPMMGMI72MmWgtwRV7RpsbMu9wW99aLjy7X8rHl5bfTHXXnShjXg+R6YdFyOxYbmsZ9XiMiZLKPz7u0d7PuO9OWdeDULB33JpnUXUACrpeH57BZKeij0b5orW3AvLThlTYPwSZLfvN0VngxZLZlkumkB5WlgafOxI7PBuPypqALK1s+e9l50Lt9MdWwqLAlQjqkw6wwMLXJRN7GqgElbrdp4h9cGI+6Al2B+grc7JKfb4/nz4idcqZw4ziuXHlJkZ86bT5mnD1rOyJst1lqo0tJWzygt8M5JMiUHo80Zxck/QqueMheNPyC8bPaTAF8J4EeLgAZ12q8Avy8TT566Q7PqyTxNmP3o+ZwD86x2j7B80fN67x33b4nvf5/N4HMf+aVFeZFAdqPtvcek5EdYYQODcrgYKzsaDSCslVVBhJV2hkoWvTvKTmfYHmXf9OjQT7ASBCBvk4+JJ0nCkICn4ZQ/eYxiFe8qHYKKkg2ZHfGAzsIKwgyiYe8F7X9lncNRGKWwbj2/gweb8exKNqFF34t1NMA4X0n4rhY7sU4TczAunILqUvYSN0w93lKj05Ud0kwNs1wKa66mWmQ3t1rwp+OHtuH7mwxQnS3F0ikkMEB190nAtlc3dkA6fqmPcWedPaaHSGueCOB7hiuzCPPXwMgMYAC9lxSEwfMFve8aM8OxIlNyRa0EA5g6soYLG6rTtdoUwqOuzRpeuGcdgcT8lt/s1lvFPBUA0hMGurDfhZOpAqJrHeXyrpPLuixoe/YmDACOrRoiR1ATu5Repu8trHO2ACLKTmg+Ftp3ilPKH1n8KggX3ckTgVhCh7UscLuCt/rNodFpCa+v3+bazlAfD7j3CVvYq+UFGIQTi0jrcQ3ge8qrBgrrfoWRGfdZp1+47zFn4vnCxE38ClQNdoYPmxswt4gM0u3YYynm4+gH8N8pN5BWLyuhRBJI2mSLVV6LkJBD3APBrMYnZpItH0AX7n1OeaeSOwo3qt181x0d2jwjoXYhHt09O7NGrm69d/SR0Rxgs/5P7svBvp3WLSxM95sx8Oe5Z+mVWUFSOsCq45UlCdnSvDekWJrhOFDnmAqILmiD8547RUP2cC8nLs+n8hb1Gx9wh9+T8XV8ZJK9uuExyzbazJd3bri2Tm1ArN2twzV2gb/uYI4DKMOlPL9gvdXaVR6vA14VmRFXF3d2bS5Nl3KEn7FvtIOxvIS5WUNz9QHZg+SOedwiYMYe/aGcPxaLXF/s2tcp9AewshNARzJSFojetxCwLqBRNezfKy1KcLixmJePUIJSfKda4bcl6+L4QdeygteeIRDhLjMCctt24sOnvzVl655v9Wk7NAB3QftEUzRVsIHgQQjUGgJE64A0ixYCZlWwt2rj+DAARW0YrA379eVi9kgfQmKl12IUK8J21XaEpWmfPIp25Zc3VCsEt1MPNTUruqfFSOZMbsdHvrxJvNi0v7+eKPhRfWfTYaS7IK/CiuZyYPPT0EPmCG9IPWKrrj+gOB3HGNpYhoTmh7TSlsoIlfkd1HRpQnTnYNb5FMD3bRC/4fC+3aM5LBMK64UaQjqc3fyB6IEl8zNdenoqbQOom+2OaVcjuLuUuyADRwL16vn9DxFJXQeUzUd37DTnK9ej1TLT06OB3ImdpUsGn4+mVFymhVqt675LVJMDVSFYoIPcX8lRm54B2lV+E6KuzRbAdYqTK9zqbbRJeWk2+ZSkipSb+U3m6MpuNF2jcGObHutvNzPMhOOhpVqmqIRFoaW/vkahBn9strDu933FpUG4dr6vQwayh4PNHcdrNVTu7edbNpiGVIWavnjlkgI+es+C9Wy5m1YvLyUIbQP6vmesDjQPv1GLvVdT43mxtXzcBF/gixk39I3DZm/soaVTnAlXmZpt93hZhOSEK8pO4uNJ73qWPQqPkunLPIdWRkmh2O9tNPwajyprWCOTo27pPaRoWhI9QNVwNWyY1CspAAmIpWHMONZQQFRhNsCoFdAOFhC+L0FmLffr7XS+GIoc9D/hHj7U4wGMFImX1xgvHzG8TtGXrSWXojEBoippZfh6sWdABHYRlPSWoM8870DBSvj/FOQVlxgYDrDXr/MErwGOTev5WQ6sv8sDA7+qNUeBPZ7ScQoy1LqxfH0uxi3l2vyhNf5dScFHGS2Pkb829tqNbUQSnEY33fiJLfHxQB1cnTSM4E+XbxCOm+pFwZTwPRVHT6J49AAyMfY/FGiYUo8CLyPqkgjitaDWpsF2EphYhEgGfXpYCMoEKZSef6ivwgoAVW8idtrwm1aE60aARLy4rFG/eWlZ6NPe4gUfwFsFZ5DzArO4Cvf7TL6gDeNX+kP18FlYFuPyEnCdCTKqUAjOHz1Bbmige5MWHhxz0F/ecMbMUaPwVP7ANxYJ3X0v72nX+WWNwg6fpjI9fjoiHkXclVxKFyQRYPkzqxzjsdBYyG1VYYa+9GC609hHcPopeJJ/UHFzqgTPO08154uf8WWc+aXOsqV5WSUGEpfrubzDJ52ko3nXu/Uaf03r8SnP0KDmBY/68ErpIih8TMebvOtwulwxY+EBLmwxrgsRBboqHZZ8mZsq7k/N25hK2Naabz5tifGB51qgUuzLH1GKxiu8a/5vLJBL0UgRGjyIgrbJO5/8IiqRLWlOvtT78qepvDX5Uu3733EyvxKcgxPQ88aDtLyh0riGPs4SdoSlWb6QKS8rxnbMNo9h4XBGxU7r1Ghujcu8AtBqJ/pe3gSxXM4lhA5wlcSH7xaGsx4u9eJiNgNi6tPcrPUKvHjHtVqm9VkANjmDu+NoDPwksDzFlCr6g7+6z8gjvO5bXLGKDBb9xp0+sIb0PMedS9cLTP9M214b+mbMINGAbKOofYrg1nnPO6YM9zFidi8QVFJvLZAUDsCnQWKFa5f/N9OABJgzqgw/NR3zgNcixzwu5ROPe4z9OpykA9tgJSxgLQC9/sr7dfKE1UQWX7IpzprXm9GZ95+d9ErPNo0Z/+R3XJ8oQDGqHOKe/e4vgi9CnEnihbC+NMASz6N5Sfn1sThgq4f9GXzXiAsq1cg4SJQ0D0T+EskyrEEVgBe8VxQSN1tjVWMN1KqQtl4SrL8BjjtVHvFBQnLh8hHdX4zdtvrKjLQUK1klxn4HKr5oIikJ0pvn+yBEys6HwMbtD9SJTRnzl37sx4pBlvi+4xG5nqHCizwYq/8j0N1GRaVHeC/jrJZLaUKm3aTrMc2apA0H0TsONJGCLAZgh5j2K5Z+kx9cssQXQ4Xj8qZh6joi4VnrnXHmAh7CZmbmo58dkeYoDojFahN4rLpdpQL6i1/vRSYwnquGCzTk+mXxWQWWu4CtwVZVTQXkoqR3M8ry4dcqmwkztZtV+P0wshXtG5opxQLqxkCiOgEoR7Qawk0/gAle+EzhYNVByqdHnamTsItTdrjq86hN5uPERbeUS982N39uRZhEQmNiQLiNmnKif/3Wne0pSgdzSC1Y1kMstIxt51IJYG5RHc9cKjOSKFQwOXqfs4//X5XAIVoXFHru+56/k1S4qkq57EeIxwZaywgNwhZwi3FdgtFVy3G9ODUBwQysYVSLE24LRyc4lcn5vw+iVjsc4JMjv6utA65GNCaH/sZmf8/HAbwg/Y+dwRCHx4Jpi4DqWH+2Vs9yuLqtjcaBVYcjefjqsCu/ixdRd19/UgT2ZQBcxq9qJDvN1XJbI6OsnLGnni2qo2QdOmdZCBGrTSQoCujofdI8ZqPy1Aht2O/635XhRkqPYrna+ERBby8vQGpV9gbuEp0ulfZfJHfWlOtno2YGJjg6WtbV0kq5/oji4A2bncYMj3ICsGoiAzqli1dcDkjiJyGXZszO3t50+5TP7Kn8ApZf7hnjfXBSWyEmIDl1WpIXpQzLPvB8lh8U935y0xoKWp2Qowu49CRjCz1khnpFD3iuGCHrC/9ebg7vPQQGefH2wrjtMzuYFKLACXvjJf1jZdBb/8iq81wgpfYnjumKpl6XkziUJStLWhw6nHoW1fjoDUWJkcPRsSSLp7V5oGkPkEMBvMD6SXe3CCWgp+SLdYIfMRkcchE4GR1OBO4vqb/7QAQS891KsAGUcxkd/t7cQNbZpRojSFc5nJsoQas2wx8RLEWnS5MqokRKbunx/vRfxCIJH6udq7fGMrJ8B8o1rPMON2IErG/X/cx2+ol/+90a+0hAwzrjNOjvlvSbc1tumYwprPQKyIvz8refZZwXLr43yqBtNk6EbWJxygpJPoUFGVN67u42m+HMsxKQDQJwldfgRtkqsBWrk7ZDzhAJHndpYqbF7h4QsruiKVxfXApJlUJPj+DhgpDxbKTESh+iWSUYRXYXwe2BWA0UeJ66rVw2KNakWgZfC9IiyAO24FxoY0mZ5LEPB8My9AG++4sWRllZwhAM2Zf26hR3vKGqn4Hn2QNR9emQY1En8u2W4W92eSCuBiuURDPcHqtt7Td9Qa0N6Dsb5LHDs6ZJI+t4prD2XflpoadEPrGOMxSZW4/Va4gjzKQRNZPuhfgLL0oJ+/gUnnP3BQzxg9tIsj9vThnxAffgq39sEN/qUBDUnY0qGcT/0cdV7dyU2TcbqCtY9PoH9n4EXfm9QHnUXUmMWPCG8xVjgiaNGSVQWSKb7nmR1kR69peexsXJcZaIPZZFHfWTdy+OW7P9g1vzkhAHJKwuilUUMKjoDKdGTi0KlL3s7QXkA9ERfcBwPLGZeGtZjj5PahKCcocbvbtbj5bfuVvQlACKTcoFUmG4IxG9IBUn0L5y92zIp/34qT2GdgkyJk777Ge0gwTIySr9HUiP5vqaOdvUv0hGHWxe0NgWqHaAxJTjcyM+TtLiAPj7kk67SvuBtM+Q76vV6ejpCaGYBI/z41WTqJMCFjn/jsRLSWa4F2b3mW/O8/0a8fk3sue2gLRznFJG7AembqL2nmsc3qfv628NxJQRJRSQDQhpvS4M4yUAsEgo8gAtHwTFGqswwyzHi5JALNi4yJFI+20nsqS9tr2xFgH6PyRecBSshGtfvXf0WgOlz1dM3UIsZpxLFmaRC4F8j/Tn3fze+8zIrmw50gdfR2JMJyfUwl1KfLkmeziRRqEBSPKVjsCjGwmN4rgsjekZH4MhXVtHu0mm6dne98+dTh4VOaqbtoPjS2TviiyX0ZL0f5wdVYEj12dFnM5TukOfH+SiqIleNCVg7ltW88WbioyVm1QMEOQIuRCp8VPzwJH4t/KpmazGThaEftx9vAR2xiIqclzs7n5QHkiE1QiBw6tdXACFekN1/jS8kjkdgjyd9wBYwT1Ofa85lAUVmKo6SADUBz8xrcxLGgiI/MtAuQnzFLw/WojtbR1jnhHepQkO72uIoFXm7OrsKtZ/afY7DVH6vizWsQIuJbMi7R/ARpYwp8/dzoy5El7GoK4ChDYQQNSYJWnLGzkoIe4rQLde9u/f/uOifBBVOTGUwBzKqeSHqNFLDPvq4kMBi7rfF1EcEpAk7Y5cPcuISwuP5tjnrqc/cHKS949tD6EvcMLSNeTfZCcVF36qEuoNPyx2BjHa9Bk/oPmCoXpMOEvjichVzhnXJbZ7px7EX4WKIw+vpE45VimSSZYiMZgnQGWLbPIVYqutAr+weghNGkBmzGknAvpsIUIwo0GDHE9A1ackbNwdFh0G9DbN4pe0UPgcOQbIEvEK5bC75HA4xMa+TIoXcld2vRrUloyglDZhbLoVYYN0WzfJtMI1sfMCk4+OAjyhsAfNA1wsys+kh+S5y5ZWou6EU78duM48DKde2IqQVoigLjll3NRiMot+QzGAM41yH0Zcwpz39e5dY9UG6aIGJHoDxRqls+HJpUEp2jM+r/i9s6R99VY8A+NAnMFP4DDurBC6mtS1KIOMvM1zd3xJ/1mT53YdsUukdBRxrWIdLnS8lvwslLlt6UM3QJhhQyVvAhumQX6b2rk//Lvi/ie0hO/f/l7VC8HK2AzTNRcNUg3+J/y3kQ5XMv8atnFAJkd/3BFl0oDN1gOxqZ0EgxcjXLkdHAekW/A+sg1xlyWos1seeIPknt11UPEkaQvSBIeUL7RvQt81dfDgB4qVfd9GpsarNOhXiCsZRpsPUC4MxVhKvd2zPi4gaqGSRS/QgSvhEElxP9mC/OO1J4RUJMubuabXcSXPigZj+q9pitF1ogh16fT+pdltRh1HEgsNRd6ik8Hi7hu/kKw776Wt83tz+ig0aEajMOYr0A1OPjQsITglqXYJns5an3v0K2yCDbJpojfTbJcVxW0staSRrkpEDzPtxNbD+A+/h/N8z70D05fMpny+3Ee6aPY5kgkIVJ8ykkyA1h9rVGWx1Vt5M6tW5rI0yAekOOswV52DeNjtxPcuBmK0PisZmxX0oGSzsA0DvdDcwq0j3BauaTg/gfeKggeChSnIX0m7NkmNT+Ch9J5zsUBZMjxXh8av4Kk0OvndM1Xpeh9M5LtOkT/1RpAuboisG8InYoEBXF9OxO6NaV3OvJwTmAYUU6atuX3gpwpFLJCYcOIMJN3NYWJLr9x6ATnlqi4+Avj843Kna1431fJZ8D57qU+4jZGxRmLXYdIM1c9FzIngcXAw/V/cdqIXwVa/HvupWJxxgbGPjL00LWw8LCzfMW6uthfVs4mfYGyb5cq1GuU0qJsNSxpI3f/CtZGQ8rRju2Nuf6CJecA2AfmSBAeBB4nyyDpP7eiZYLnm0p187X+x0rgw90u4pYCFAKCTDwUxYfNFiSyO54orf2gJ3duYwHSd3cjY7kTubDrirpdZwvYdAKaXFER9PNsq8aaCPj09ALeDogXQc/PzYZWPjXkmSrnWXVRkJCMuIsxIkZyToyItkKSbKiAC96X3ESqT+7oYG5QcqiNBJZ74vpOIHM/Ei3zWUJS4ZFrlJk5cPxkk287nxIc2BY3mXc6f/RHx+b5zbFH6dGc4R0JHcHJ/gG/x9zJH8kKEjQDaWfECasbF5rykQShb2K3lpCyj+WX9KPG9wKy0tb+yxRKxdSXnbF0Z5v3yhgt0YOiFlWGVNOMgZk70E9R2jQCLcksmxxYOlRkk2YXLFbw9OLS1B6Tb/yYXrRROS/VZanyQK812VD5EW7oQeu8ZwZEEAdUNg8hAZiGCgvDkFOwyChEh5ajrMqRN3fqU5ztUE8vdw5VIecl5gFrBccWZwz4z/AH5IiTU57Uvp0VKJDg5ghARBNmyBUjlpmjLSYDDruBKWt1P4C3X3oVZGRPbZQ4IwrTMqPBNmRqApLsasgVy33ChlfRYK0IQg2jCmdxgrgi1Ngigw6TkQ6Y0Qbyb7Fb9gUkSB74u/RpjI1x9AKCh9iz+Lh86Vca9gUU71q7KdeUwfj74VYl/Gpebs2qs2pRI+YPBpx2OaS0TyVoamO+RN1B67WrQsYmOlSb+PCiehlKx/TVQC64yWSVSV1VABtXypxItzo+ZYXtGet9KUJ9x3cGuHhIQ48viLeuRLhc1/uqoZDsiesFRAdnrFbN9D8GgbuHGRGXQctomRY169W84S1DiP8dIXlJLM8SyTrlR+QCW8FDBX/ZAipq43GAajxBeORYvzvDNcWEs1ZHRN6/7twICDE9140twjpJxcjxvgH8A7p1ytb+kvySctejpfdQy7tnj/18dBARTrBQqaUXzxPEgSTqr1MTGiZl2dlwRlt+V5r0sL9+m2e/avUnp8UPB6LnfHIJrjM9scCbHXdj5DKnxAimkcLpN4CZrfirWAxOdY9ppFR7JwKgtssYQWHQr4EyhXYFTzROuZzcpjG+TuaqpvJP8/lCa5Ue9bfETT38SpGffcvSdgPFvrNniIeSyxEmvQ+dwxP5nRbgdkKFRzrBI++bjqkkaLme/B1je5YpZ3LRBlvov9L6dKLL1jJ8+f8Uzv/q5DTceLaWeRYHqtrJPd/PoiXdqnK5eL38Om6OYZhFROegkZSr8epa7IJuTYP+DDj2irwjbkqjEJ8hP4IcxHHSAZp0aX/HkMNaYOX4RXl/mAeTtvCCui2isR/DiJGlL8ViAsrVSKKUi+QK1UMGplz5wayqpZO1cywflmk4mhhJ0HchP8Pfp8xSzFwtrdMO0oZleZOl9+pHqu7pwd4H71Nc6x51fE4XVxsrDymWrEDd94iRFDPslEtRqGHil5TZcsflWYc7a2LanRLVPWZIDBKQ03xQt7E0rRXEzrfdwwU2E/hcxHmlDQLia6Kh0ZgO/AsfAIhHhzkSPOnD6HKUfRnuWsVNc91XIJxYLJKXOudQvq4yJHxn7I3Ej+ZOGHcXaglhsodYc6KHbWIUey6iKwXWGgLp9iMrKY36BUU911tpE+IKSz183hz0mLbmKDgSRdcrXjXQPtk/9ypDgZgWEp9P2tTIVBk2XjV4vDWVyVramI74eHWxCa3CpcSRRwu/H8CbuQSSVxqDRLBihwzxTgJg6EtEATV0t2HDvNLMkYHL6Rh6Opt6tPD1A2B3JbQcaHBW3Q3mpRwBMhZYMLxfQy315DqxWwAM5lw8xweb9SyzkhkAXXwsWEYVCB/ME6rMnRmRhoswlhCqkg1uS1GyvcQrLwOYdaGQxDE6WxPdIG0lIHU1ttMynivAaD0xng3I7MuohoZ1GIypqj9o32aq9i7wn6SwA9fh6AI02fqRE+5D5nU+6Ecp84m5JV2XTAPdFXWydbaTL2lMJ6cAGulnpAXFegDCVk1G24YB8mF66FIGnbrimzEOgjBOgReAG8UAdnXqzxMTSTp6cOvu14rOLvgkeW/YyIna4KGf5is7LTo/7Hj/snQgbGj1aVFcxCuu59aTxhpJ1pFYbWd3wbMqCU5JmglQufEwTfBVNLt3yOSEcITxnOLakA/HkpX9RS47Jey1iu1Op7qEqYy3LvE4elTF+mWDKZH2ETsWTApS7wImzbwhvU7itAxSx3tKW25PzFRlCxaStpLVJkXRzWpdaoxyspc1iJ1s7j7HWPiPZeBXZXaMYwPvL7tM3n9MnXWY/i/RsHMRM4FXJm2DWJBoXrc2gjEDxHncKjclo5HpA6l3nsIT1fvtqFoJ0Ma3ERmc3pz19rZW0TZzW0WcY4ArJeMMTtejEvcv0AqwrPycA2XXuhWc7ephyJ9VZ36pH+/1nHObEUny7n6kIDaruR1hKifhdwgvavVw2Z1Afx0hQMaqPP0xZDqNHO/xkqeERt0VV+kvFlE61/6WhlX+k2huaH2BVHo/609upWokPeOLeOoh/V0IvWNX5i13i25g0VbfAmRN7S4SsukSk6x8Gm7so6o+eQdDH3L6rHIfH+Vv7uO6DLKzqMKilbeH9S4PzNtAIWjGAElYZ8QytLVMtefwKBsj6QEcmaTBJPs3BYl3CFUjOBUQNOc5Hld7gGS1XOssCEpz1XitD/2EHXiT5H8ovti7Ej0Cf4CmZeusoYqF+7ryaIc9HYt4/zoPMVGBZFW3J//8/KUe2A9zbWCiCwkhdPoq5YEBplQL723A0BtnspWnCJsA8+4gUMWm9lf6nN75e8D9+CChYLgxyYdvWu17EwuBfm2Nt7OHI1SwTW+56I6eJ4NJimq98vJYnd9mQcMF5MvcXTXMq8kIBizQX+tJl8gXTglF0aKBl4QdhOvGeceIE8JMU/oWkirViAnhVi5vGyL+t2kYO1xOsJFYWxvUSRgUU/gu5OErmJbMZOMlhLiBXiR91ejNtxK5ml09pMGKB4km8NjOAZLw5rto3CMCNGx//Uf2X1mg9WDZtE/GbOf77iOgQK1cGFpdpRnMong8vtVbBePI7eEkny4wcoG7k72QnlN2G6nJ6e4nfsN4AROnYvZ8LpsXwv3rjMgmpy4nT6jO1OUsewhkQQuoRJelx34CS7mk5ZCwjWjMO3ERYIgug2uaGdx254bu7csOzrr2x+xr15FSNLb+m3jcypwZsHQ5V9iboTOfBfHSUFIMkU+bIBpxW4357dySOCoDy2P/HPCgAKI7525U6x47P0+qqzvmDGmm/pi6qsddUHpSrM3lLkraJS370iqTO+gx8Uh95IJ/kVT4AOrr5WhhCIn0tYTQaiULc7rAaC0Pb7fLyjhx8yUy6lEya5JEA14XqNbIcOf7cYzPMuPOInwNMiZTsDwPcLJRWR4GrliwXCJ3CIus2JN7tiru/8sKaHCQJfQloPhEsVjrBpTYW+0u4BmjqwVkfHD0IBHeIUIuF+RYnu6TUKSTy2QDlp2PStNNTjfP1igkhUuSusCm0BNVn/Qd8PnFi/QkrrJTqkY/vVeBsnx1LTGAAruV4gR/ZNfgu5GnSAvDu5m8g6NZPY9H/RpLpmN+8DRybY7FmStpCJtRrUHtOhvNqfR733z+CI0h/xcVFJHIBPcnj7x7HZxhZH0IkI7mqp8fhFImydUk+lRV+EljX+ArZcKrS6NAUryUZoy63/dxsAGVQnXjS5zchTQM52FUvd3g90nXE6VeeM+365WdZYMXhfcN7wQE44VXzMDcH0TM0LDCgqxw7tMrovERPy9VBwlatUOMiB5H3K+Grzrs0sulw7S1dBXbFKIl+igqcRzXOhfkqh7Fn8OZh89QPjEM6MU7aVC6Q87Xi33AeXhFYm0x1CahjOH2Aa21sI0WSj/tu3cyv5GQbmblqUYsdI0UEzEn7zskA6s5bgej4mkqhP5HxlPLcWi8IeMZhvMv1PyDqeBd7ea83LS0GhZg1as+qiH+Ai3yn8Xx4HzHD0QhVs0ESXIXUHjTZfgjQivFP9G9AWrryr4EFD9mFq1gDtK6bKMDUZ2+DY4QerT8tSZ5srn9EoUnOcFdLKRjUUk89wf7cPzUc/A0WcowXSES08rz3hMvDQuQh9+xDj2f5/J/MkpWL+oA5/Sbdcn1nNQSGzC/4mIRqL8EORfIYOQ+x8X9bj5MNkfypeFWTYXjEbo/+jm6n0e4pj5tnM9Tsa0p8GMt9eQZgwk9IDoqSaXN2xowFpFvBwZUcYxTIe3jI1YcextTWGSLna9OD+KzD7gkez6af8JngWrfSmd7CulfianaUu76xALFHgG4yFlbngoNWEqpAKjGpgNACu4rRxk3RPFViJicQrRINHZSfViXqO5D/lvrP353nlFAJujPPWnoo2hYC+C72VNpszfJwV0MSeeSmOuWPW/MrFyjMMGjZb924LdlmqmeufmGG1J8OpJ8Sp0+DJOGW6K/q+YCPYfY08KiRB3O6ChgTCIDheToTBLPddf20jGb2go4zciTKf/bj1584dyla/9NtTfew/ogzu5XcHUyZw//PeIa0bzItbt6HjSFvNLm/LRegb+5enMv7/XEiWJrUKhiU8+jO70mcZdNKtFmMwf8xxhN9GH3s0GHTOBH01eePWvWy3rsy0BfldxTQyV52mhw7YlK0N9VNbT8vfEqKTyIWJ3ZK8E08uUH0KvywBjHzdhU5Aqzr+Sp9zTcx83kBvMowwRZhVdiZsUcBrwHJWHWG0Pq+qZa5Qe/qKSZuGv8SUw9b9LH5r2AKlBnFJJeUmOtP5hJJIOpKhftvgczSkMJwT/Sp0ipUNzbhrK6JlzePyq5QsISlN9sTNQss932i9ZGoyT9IfWse1YvLnptTAyAdjTRX4GzrdF3ELQ76jw+dB6uj0oLuQdsjgFtD0YaqSXtFAenQts9R1B3HRlZyH0SqSpnvnF3s4BK+XgSufLdlFPKlMFgtNZpNXoCVnKBBnp2wRSrfZmUFJpcfTwztJ5+0ctgxz7N6kxeu+3ImE/QKjSMwt8Dxoxiyzm5GFFeWoDQfxYPC1mhzIl5xicBU44L7fbye9KUiEASrApHpAdI1kWFcwU5bDD2jmN0eHMSsOglmFLQ36fEFsofpBSwMWEaC+4304sB0PzgVqKR6YJJgTQn8fpa9CPD3xHYV4WP1SmLk42Rm6Yi4535PZLuq/rzOz1l5ou8/xCwi5oK++jmVYGkgTuza0ppT8v0gJu6eJH5v2u09a6P7da6u+CbO77cTz/zzyX6WPFqPyO3YQ9i86O5D/EyKJULEKtEcWybTrc7uNKaCbXo8O3jeZ2xfE52fjB/P2I4mJFt1yZxrXg49+z6CVINKysUR4ZkHbUlLi2RkNsnqnpXF8ZJOC5EdqmyWScVM0HQlSAAXLSHDvZuYVQHqbiaLA9stY1TAS33RpHBesbtb1jTn40geC426sckKBIlLNu0R9yCOWwoo7pNN50bc0zFvQLJqJRjBH2518pxdIgnMrEP6S9q+dxJdWA7qq1Wgr4YWhQsn3Ll9Ekha0BvM4+yXb2Yd0iUQ8Bhj1C1gPxw15x1zrBa2cDfmPDk5x4EV30luTlkpbQQb3ote2aDfyocKIqSwtcPxfRJxC0yul6EjVQBsTyq2hMS82JYSi6iYW/ThwlBjZ2vAq+jwUHhuPZ7abs4WTRKW43yqBgJQw/6JQaTCmcia3M3wuxZ3L/CZUCtPFAF1uJYMU6TRrsCxQFZjiUWHZHxUm38gR8HAoIefE0ScLRfwxkW1TcGnyikCY6z1DLoqSEt5qgYsZkV5ekd0d1PQh5mXGK/W3GM55Nj87o9wixNQMY4wY3S45wDLVxERicjuvbzv9XG7h03cQ4J01fi/CgumR3LQWIf2Q5SqbNBG1pFndCdBzkV8bi34WerF7Xn4sGpa0Ckw0gMYpJQ5VmK+r8WqRQWP8TPNC6Yt/MTAxLHJKqbD/YxofASimClQKi6Xpw3o0DEo1w+EXWQKnsmYx9iqq1E2M/aE0ga6kqyuBGwZsMSQfhnvipjNJ6p8sOz+8xkq9ZmyefHu4tEWNrwwAkCyhbKl/WNdTkKNfghTusiz5hHkeBLLy5Bi5WQ0epVoGUGiW64QEBVehSyKOEh5mYEcIl3OrMkdHlE28lNrr/IksCQfl/NofLFmIyjoqW6m9ZxM5w1HrAiQ3CH5XkqtI9oYW+gm4qOT1/Mu73qmmG0OlCoFdJtf4YfPPZV6ePUtjDjBKHVHV1iMnzafs0fsNbMGyoJsLkk1q3ptj/VzorONLVsD858otl3Gh0fMy5fP0sIw51OL6di58YSnUSCsWEVe90IXYK2aoheCTDcqA6j8sW9gWxTGznIU43EEab0bR7yOHNm7No3UcscStTaQnYxlYY2X4ovrDadVxw2cxQGWc6BpEOvRCp99JzwVEzQCVMRqecGsABxN0HdaXpU+miKpyFq5Z5+lUYbvdxvEHOlTq3OjoC+x5nFrp7HdLZVNvZz8NWEkUfa5XI1SRiX2WXKRGyXn3suzuVqdjlhonLKp5OQGeGQLVgKA/yKA6omnJU749Qxcw9JzR+JcTqJUf8Oqyn68KPfCzmkgARCYXGE7nolV3+OkBEBPHdUQSAV9O5SBxLpvh/FOpVPaznZUfPw7BmpS1mpeui2liQ5uvlmusAcCn85DnmqW1E79XTjtCDZpQviGK6ZFhgytAfQ73WQUSr5QyZgZy9rT/YHa/Q/ec+IjCMWiINJjh3wOKRdEKv5eTwdmqdGf41tRHiDj/d4pTboqTuZlX6dswtK/NYGzU05k+PyPczS1X2sexQPF54zkBlIxVsBmWo2dFUBPXTTpBZpQlvC4uqctHwjIJaZwnjMbIJ4BKtkjkBdIuTWotyvxcwWA4HxKzGAhJzqBDldcRHo8YXAmoLTQCcw4S15dIlhm87jxyK3P5FMAKXUuBdBq6fu/KSUCnlFfap9OZu1CYkEPUR0JXiEYrJEOxweYsPULKzN8CTRS7Znnb63KTI76MPe4+v52SHIRerw2sXRgPn1gJigXt0vFBEEU4t6LMKdV+BTq3NOyZc/gCbJzc5KmPxHWtpKcQMQ0Gvz2vclsNmzo1nGyR70ILaoH/DAL8/z27Rnr7Gwq6Owzta6jzSCkqMh/nCu7+R+Ed1nt+iTZ9CVFr9fMepkSGV1mLmoqSF3cEih25qlPUOnnOrkkEg6OtyRSjKE4Az7HiIJWfI2J2XPZ7EkU+3vs5k8QHOVKlilrld/R0itO/CstrDB1xrZn+lGd+eWcCmLjZf3Cayt1RW9d3kLiAiq9JFAQ2x+NdzARPT8iwDnkAqvADFHtEt9DIqyzes/4jvNmmkWP3SK8ts5O83tBNa3EDhxAe/je1dOoVWQLB5M2GmiPsB68JRA7RDVm8xMr6yC7ZXWuoBpx5p6sm7s9Kbs0wzdSjCzBw2X358QNH+aK4W3jNfRIiIqn5eZ3BA17Ce5TK29bFsSCaLr8SKJIPmCChnI+UffxvmH3P3TXtRYFIDK6dgwBNHv8wPfWbDDwmJBvRKLdTL1sOEL16on/0wxJnk6TkAkkaoLamiH97p3PuksjDkV8tOQ7rIa4eHW1sSwi4tMfbDt51SejGHAcbPH2APS7HhJOg5dvlBrVI8Wg9Mf2XkrCiSY6Ss2E4ygncw+V4634FZW3cH+gdv/tOvHFfRjx/F1yRoxM/cVmiZ/m7y+aq10meNaYYKFyONba4t/3JSkli+JvmDRy8jq7eOLuaHlxgkfu37lW+rsP+/BvJ0agy21sOGCEEnKDaCIoS5+qhKcYEPh367bY73NRk9hpGOeohJxPdmugE3i7bMvgq7vmTQgovvw9/eI+ZRjx46OD3o40KwjtuVvxvoV0uxFpJhms4z0v0sMFaSflJOG6qep10rIsOi4o/hqvDzQcpxkpZPoVuX9Veu8ROWlSOKUnRMoYPm3FBmik67jKvSNfkwQ3zdckl4soVdaszqKVAncVEk1aVDTR9utBGZWeK4HD5/j8C4ovOQ8+ETHxPEzTPd0sZDZzgqqPYpTmXu1dG0PNe5NeacZFzLjzGFsaZi7TptYwU1+TlwT95mutqv3+AfIx3rm6y6wnGJLkcGoQ2Zs6QNmyggo9kogpbviBF7VSD9CeHCjmbt3mo+MsEEjyva6BzleHYNaSAUTz+nuCVJarHDreDoNa7spkmEEOYhJqh8+MPqM0mQH02JTbATWXbaLcaphuwIjr04jp1JBv7nr8tOrrvAZDlXmuDIL53ijOeaY+dkEKedabpIiDbH4Iv0v6H4f2kXDbegx706lZqyR6jpUCQbNugoZYuHLQVTWgbWm1AKlOvQvTYEk4GrUCHfAOfkTNkKutifuXuG4u8/PpWGiZAdcHCJ772RQGAMJk++VPYBrt1IV0foUrccv0WObRf8eT2VpU43ddkWukXWQFrpa31fjR4vON65+/pgoxUdAEV1PviAwx9GHrI2/AFtpKD0noL7VP++PISXcgGRy9aIAMKJ4FYIH1yxyPoPrVii24frvBPbQalU/PZcFr2JvI8naFpHuShDY3vOLz27XmmekKsSpQBNANAtL5NG2M6s2WANwsyt5o5y/jK27l3lMJ7rhqEvXfiWxnXut+EPg18I4BFwxAzwyHUcsOAG6WbEFqYYD21yuyhroWdSeUU49AFOrvIYF4du898ZgbmNBLvtaL+0dzXvAiZI4VjMZwsbSatkTsUlklRID6JBxdb7OVqurZ35Dnype0jeRfToZp1spYKjcm18bUdokqf1gwr/a9C33DZBiTvZ+bl8jjKZ5wot8YN/F1u/+Bzk3XDQWQy4GWPoR4+Nu3fElRjNi6wckHkzC8GuC2ROYyKzP4fzgKWlE0o3tqsuCs2EiQKmMgbI0JCxPiNQh7kDkKBFDGyS6li/P+GRIvZn/yQKyQjUdm6fYbuJ4Pe49/64S9KrBcnZSrz1u/wMLgHCyDVqhs/8qkRkcWg1Ln/Jbxiuf6KjObiuUzzLAWLtmkreXNY3NqKMNy60b3A36uEJ9pVJuI++Wxk0YDlvQc3dvTBEGL5zJpdt0A0ApurmXYDbZQsiqF1OGww6yxZLi74jP6BtLNezukn/PtwM6YHdBJ7B9gSn4CM4927D9e3qFoOzsO/yfC7jKtE6fVh0BRchlapvO8d+AfH+S8XhIVtYoucPVnnU/KdLh9AXeJIGAa5tarxhJi2OiTk5C2ngPnfRjbG6qMTUy6PS7mjg40qa7YjsgJnf+sp+pn8LTS3B/PTR2wDsyW2uCfmRJuchSwql2h2IlmLojSJH+Yk2zohygyXmXkFeM7rWVKIV/sPEnFs9x1uw2TkQRqH4gU1SUHRwana+FLmVL/UXhJYgTMoP9C8DT5p63Y6mudz7b3IiGvktjj0pMOhDth3EJs0OkGM7uBMedaH27OVB8qNIdjJvlI1chiZvnITfOvvK/U0NXx4o2r+yfEo1Drq6qsKVLCWRZ9fbpTWRfXIQ5jV7OeXkiNswqCbRxLfBuB6bWeUREwmfinxkG9lhAc5TthrjRWj5VJ6QGbxQrHad2jt9eCuKGRD0GzaQXo1e7dbm3ovQWaebEJLRVpOmZ8uNaaN8HPsGAPddYfjVFRK3ds6yx5QbOkffWXW09DDbpJpNXQdTY0Cqcp0LFZXJrACZLmuKmkkWe+VwXd+njitRnPb1w3R0YPHfVCEokBDm3xy5cD2tEovjPNGqxRz95rKvtDo7lT+GAxiWc/OVH3e/PCPcCb/zqPIy7P5eX/2KWBc10KZwyCMCch9sonZqlOsNNM/aLn3HvgvCuxjtovI/+RI6C8EXnG+hPBR46W/xHET+aSysRTxn+liTTn+8hWRr1xWRWitjwaeEI0sT6vN1K1LEz96yKCsYbjRxyO6KNdwOEhi4eQ5Sa1dESN29shYtkx08tli9+5B+bIkB844h9deTdXni59Izr3lFTfcJxn5VlfeZMAY2lS6hNKREwfU3GzCpqabE5zNxaA6+7ZPxjAESPDyGFD1776bckkQDQQ69Rs3gkQ/W6f0DPE4KOfVDf+XXGNMN9zpptzAgBy1p++4rIWV8zNyp1DubIjvn7sRZtNnh51zlZ5VlbzDCrw0jKesG1v4fSX06nLUxzzaXrXLdE6rhuFHfaYTTUsv9i/pbdxfWfbtUGZtigSEoaXgi3DE3p6HxEQsyedqbHd/rReWZ4rkgMpLU0qNxKAlnFz5Re279lmPr55vfZN6/V+Db17gE7O9qb0Dm9G7wjUj5u2X6F3Dof/EyEbV1L1T3/bdBdZEFc0CffqJNK+Sc2bfALsm9U8/oZrniT11Mj7P1k2ydR69k1g2dt3hFLxWjzQjK062Rax2FxaUzWQddgb9umSuWG+8biynuCz/PZzRA3tMBCARjrd50UXjcQJAMqz7/PRLp7nD+C+QKdE0YaZ9SUFBz64Bgq13tngmfA/swbzvfwrkULmROAl+fyi+F8/zEHNF6l4cxq4PENZzLCRW4ES8699lJl5WQQtrdSbe58mcwxh/xpM1Rp9SbfRCyi/sp2yDm9eQ5JiDm1EzYrjkQisPYh3nUZor+GuoSly+O6t0QhLL/x6NPRvqIY7Msf4qHoPpF3pfLaE0h+EtrjlC3uImHzRiiIbbH5NX9UkqKxTLwXKULdkamsna5io23PYWt4PaeDFJB4y9FXA4ooCguGg35S6kYenwbUDO7ipHWM5X76ahA5kkZpI2T3E7lE3G2/mhQttV6rjsLyi0NytTjO/LegV634XEi7wQcjuUT4oX8aQ3ygIDYTrOlSXTDgDu7h6MeB4Qap88Q4nMvc4ekavV6c4oD6gY7PoWktzrFX8mHWKC2M1cK/5LzU0qJ/W7DN9oxPUZaxMia0bVAtnNQnz7UreM/TkDTIwNtUOxMo9qQZDWD1RM3zWEPaSScUG4GpSpxGyhvbHuq2WCc9EWrxff9XQ+dLC2QB/3xCxannIizrqN28I1UnNFP8c1u0c3kM7KuJ1i28VPMOBDHg/fQ8xpmmRetecVRjAdxlEuCjp2NLVOnD1GbewDw6Im1oNHGBqiDvBg3wCVw0+kteHxiHCa441aiIJoB1MXvhfaPumiHPNigLCIDgYnBH1iIqZPWIuvQgXTbQYWlLh6/exnlrx3LMk8LHyU3oDcrg8TjOB7ewzgw+dm832/Q6+ZzJVjdbH/jQziu32EUw+BGlMSYumbLtz9maJZzDKeDon7tJGQM0lu9sRcLtA0nWcjDuAB/yq9gQ5/AlVUmRHrPZuoXNEE0OUzS0rb6xYxR8oMX8NECNDzXnyNyVgxNcIlhaI2Xy057t4t/G4zkBmUKNx9ZsiQLp6Vy9rlWokh5T9ZH2sugvQW6OaXjiHsSb65p925gIDcnqYfAfg5O7pr5bPeuK+dLx9B9M/kmmLNQCO0j6EbXgUEX1BWypionaxSQmtz9jvco2ZlXg83X739wrvPgV6ppmLLDT3xgNL/azkPl6eLXoUPGcYkgfs/Ls3v+Dbs8/bfuUwXI45rtcJ5kx4LlB0fgzj5Jo7pECe00BYECZdnrv/zCJQEeijgKLPbvuxJJRh1b5NfZQH+l82+G7+oNMMfMFNKjABh4qos2J2+tNCR5/OUvjoxv2MgJ5h7p1w/mrmQMQvQstKxCoiIZnxJGLm0ygSxThItuh027wEZfs/BqK3W+YUY7+7m65MkoZpVPmW54xlfAIIVJcKlSSJddAzdGiRPj6dkmOpo5uwYk+gwyWF1cQU2XhgROebhw/W+4POKXmDfY/kD/NCmlM016GwkW9HwO9kh1PdRyQMwRKoeL8FMI8ndc/G79rvugrnQVERMUcm4UcXRIJ6RU+E1aUr4UtuToSQkoSPyPv8C+q3wM1wexQSdEdD4PlE38PcTVguedYPE7juvGNSDkJiQeWzJr6mz1GZibBlQK58GPQp+MB0M8SqhILcd88+u2f5/RRDBmE/YLrcT99H3DPM6hmeYDEZIa1cVZxGLh9r0GhLmKli9J18LklSAt2EV3Kj/w2hzW85jFkBWexQlTnRmTUgLSeSy9YKlTMpGPmRQ8zQ2I8XLaf5aRrnO4gU7+aK9T7Z3MTE6TjZDmfDTgU1nu8GAvzOBL62S8vj2zoumZfwEoXJgoHmzjy2AsVwZ2cPZvjJC+qZA08ie0bQVZ92OKxGdI+zAONCOLNCLgSukmSkgueT74X7cg9xjrOoJJnu35vCZ4iC4EVbXVHexeLsSL9q99yi4fYVsVhz7tzXPFlvphabsUk6A6w75mVTFp9yjiLoDmK60OoDXDFjsHGKJLPDRo5aNMVAeh/Esw8Rn7hIJuwHFcQP5m0uapBsIeEMIjMaaZ7n+TwG4TgiATil6mVuu5Y7mhfbW7ha0yt12V0sPvS7f3aZ/gzJRxQNqiTj+M+V+2sEZF758MUdLNUa4nL9BQStPaNOvEY1ivKMHPOREmBZXsenugj2JsGgs+VSfJ7Q2+qhZyTZQO8VqtQXtko26ZxIYjtFvD6Hvu6auz+LubpGPXrzDWHslF9XlhSeXOYrdyyguXJswScfTDi86By/LCZ16DCEfo8NM52Vw7PlvAgsk8enJIKGMiK3YiWZbDznI3iz/Nw7sgEmhm0uyAHeUsDvQerrDRsneHVxaJixjupY7uC4kLyB5A2vnFZYbwoNdYp1k8XB1n2/ods+rxjyd1aGB05M+3lfZqlETvJGUcr1cIsPvOl7xa+nig7vh3Ru3x3S3M1LQLhEpZGSqXuxLUUPzHn6H6PNWMRBgDFhvtcFTvYpDcoPs4EEA6gNpoz7JBI5JN+UGAkG7Yef8KsRlZpCm/YmhLCoK5ghiaJro+9yq+xJr7Ak4qeOtq5Hwgg5FcvcY7+HZpvoBEdy04gmKjbKT7gFneDACar2B3KBOwN93ew2dFzPde07eXB3A+6BJiSWO8tPAmo1qrBSEwZdGjegjB0bsEqXdfhHfydLAoavCL9FJdpg61dJl/1OenkQgyjT1L2Gl+gkc3yLE/AfAEWUr6B0BhjKTglRc73QD5pg34MMgXN6tcCTcSYWTWROa3gKnaYn+CYd3sFNB7hytmcdfXO3VYgs/xI1PGDs4i789G8aR2VP3J8UY/xlMvHv5uK8eUB8KitN1FFoEw1BOgzgFvJS9qOAea7O8NuxpHyq2WLi73PfyHTzDqmaFfHLxM5z5xqSnpRH0HxfhAzZD1LlQilrGqnwhw2wfhCVGNLex66k1MqcICOabWcbRlJIsiSwC9ostgSABjzp+U8cXEkZgKqT1b80Pf089mhM9CgVqjLiOBsT6txhrEXQAfWCr7ouk8KBqU+pdD67TfI2tzRoLxdaZqi+kd15xrhIWmtAxjGAn4J5TjBgBrxLqxmH6KfE884XMuBqTaugnKq7qXLAe9yXNvJDfCoAsMIFtofjWzG6iCHucL8f2fXfjDCyg+VCYzRoxiSeuEm3pjpCPC+KlCofy1wJgHA8xa3zjLqlOFmfZ74NFIyHny3yHIpymaOwis1YpWebvPMyt2b5nQOZN0rxNLyUZIipfcEPTw0I5cx4DE74c36qraF7tH2x6vbI+5x2qgePDZ6v30H24UZa2Ilj7w0hmYDFkQ7gAK3hyUrMJEcKFwMzIlLv0FQAH9M9oENTCKTHrpL1isT5EZ7j12IW33VkuzBwGcLO9R9jM35rIE+fVGGsSPaxbTkYUn6akUe9+ZEKfEN6kdDnH81uEt9fln7jwusHldvGzxMmLogjFq8xYNLAWcyjZ5/S6n+0S4C6smoD0XXmh2NjMbNflhyjQwkYzdYFje2QvY2zNXyW2bBmCrIFR8eZUaW6t2qZCQ1ni/Meybj2h7eGOO0ar9YV356veZVOiKnCN2BEDjNognyqFpevpx22fJ23T2hmU6XO4tGdVy4eLBLqLdRd8R3TvFPLLZCrCjP2hFvUQkcMwewZ4qMyEUFryfTyFVlZKI0f+cqswRQy0jeoQyQJwjmUbT84Z0P4iM17lyCZzlqqQNNfyUhadxfmEEa7A4bIdvgSQMwn6ywJu8ybdHUgvvMWXKOUf32bsrIx1NfCDotB7PSbmU04YHIr3xsTVuO+bndwXEqvDw24ZP5tErnKynqDkTCquCrU7EwBV2GK+Agz6rFh69kLmgkx5XyNZeZqXf55R3OXPROvcty/ApasuLmhDSWLkw0hfjaickc8AS1qcrxD8aKt4FKXmxBanJZ6prIU5DJnGy3M3fAd07IiS19OSr+NDbZZAurhmtm2auPAKeevDoBlSOKf0VG/wcLz3WgBoGEVam7EJYJ4pySQrvPIjYsk82hgxPQ9QuE/7/ZD/aL+z8rvlJ/9ux6sC7TXCBWoVO4L/i14xygle8Vfc94pfUvaZwKn7XwD3MYuoEnveM7qDvA07gB9b7RT9OzsQPx1tTvm/7upNS640e+0mKe7EtFM535ppRSWEhJWK8gnz66pBvepWek+FUmumsd811iLg/i64YgCWrevqzxx4cE2nr+V/LwsQ3zu7qeAx5/Xf40gjh7/u/045cC5UEDrrkutrazciRQpk+8yvwcnrDsyUyTsXWhl+dPlTnEZpNyjJY7l/IGf5vL9fsAW0tiQHRbrQFg0z6tSKuefEVwFK8n6XJ63f/CRSgA6Sfl9rFiit6RK7Lo0U9r4eTxeiMswejI48RhmHHu1J59KCPKmcJNSK6b30jGXb/CRHdCqE8nY1MBzmhIJJTZy22/y0jLMT8vvuiUcLs2bUbfWXJuk1bslyHMhSi6qtLStspaqlnvZPk4GiG/hYV9TGZF9zWcdmV84XA2MQA4wuWwchmqds9LsUpjnzEY/6yBZUEfdbJRvxAfDT9wtLlhMGy9/TWvCXTHpEiYtLv7Z+8c/lUJDFymbq5hyl5hRUAOqyg3UBKPh/9lTLLjJwrvrfslN2P6hHtz2KMLA5ElCoGJOGdMKsQ3K5a7/lNMuL9ehK9HEM6/M5eJn3Gn87cL712nA48eNpsmB78hycjGPKudiK8c3roi055gLsTZNg+SICEvOw13ALktQQUbIE3hrAUhn/4HlBDcPePY6irelz6IekzcAf9UM6GOgrTn6VcGbAiC9IwD0m5ScdGodc09+RdHD+O47EaZNRmCa3cXR3tlDFP56gkEbOd1J9DbKrGFS/s8K953MD5Rj40ukL8fHWQ7PV27+uJIivZSr8DvyiaD5vdQQAt38igLlTv1tq2IjH/6vCvGmc53riOrZZywhIWTNwzqOAApCnnEDOUs97UK3PM1xv2At/5o24Vn+2wRkeXTFEul31aArL+5tVZhlJC7yGEcZfFgZR+nnW5HXzaM2io/UzzCPRhe6oXR/jfkCtnJJFFet6jAzMolPFSljOQ0A6ipyAuvLyALksTx+iciU3rdr+sW6gGW6iMy7mUHb2fbC+S5g+Zj+w3CdvOJDfOXhGydE2zU6qgadGoSb+0OV1RugisPFNL1SzORAG/YKYKxOlFtquPhg1b3vbf9B3jdniawM4TK5yhAhW8jtzRoNLJYq9RMIVTYLy6fYMBWorJBr+b9OdfLITE8dgGYj4//z2P4cWbLjOW/u19q1DOmgpg2cp90uzQh9Ym/Bv/LElk9IIVqUvwIMTgu7/EiX1ed9fEzuYzIdwP1VvucQ1S8hcnnxohklpUt4X97DHNZRrAItUzSmXCchbgAEbeDcCTT/jI++CBGr0WA40puh1qYQcZelAeYR4RDea0X//HPXoYngAEsPOSDzQ9xmAuP90ZB824sd1+YM0pb5E/o7cjkvb/cF+abFnSrZiT6F/QtuVlDsUnbW++QIosGOCvdggK/rg56OqmI4eCBYdOX8RU3JtLrELa8SswSoG4O2f3K41l0c1TWZrL4i/HQBo+Z7Hsbh3RyUfc1p0jnI79iXOUJ9mANIIpxd2uIJtC6y3lOZUqBYuBYJaeLhEL5KwzTJY8EtOKlCyELYyASiMoDVG7JplCyAr6oQ38ak5a2GdglewNMo+bDmgbqvpzWfixrYSCawL1hLt5C4ktsELOxBLvpnobKM2djptbing30OTnkJiB/DSXNOxtg5yZ0WF84iWqTU4rgd7OQ6fcGSNk5vdIDNxcsz2wr2dTo/otgM5IVQzQTJYoGdzm09qEoGqsZzDHz3CnU8GO+IH6RC76ojELZvn92teIKg+3J5+kOCaPSH8Bj6Qw7KEj1KIlpTSOCzMWutXDQ0r9cxabrQWMSKwPn26htm3jjlVi7sWfTsrlpCtc2wBDffvzjfgTyrLhuHZIabvO/tgcurGkPD+Hf3/ulC6OQjvHMpvv5N3IuxAJ0L/f5purhnmYZlXF7ShL+iHhkhvSsCFYqHRJHZQna+nOXaWNL8UyxcDH4LfwED/n0GzAxpnkYXYz7+tqwKO0mYeJBbgZFSG2t06s1lZzdVp03T3wQLLfqmF0RcDVVUmZ0Mcn5rgomLwUT2v+r+H/TytNcglLsJb8SMnrhFGdLAihK7P/HtDQLYnODVNcNyN3i1XFqJm35ED9NnYiL4EzQJak2tu5DSnxHyGPcmxypLVT2NY4oolhdbogQ82H0yTg2cTzMMF1pQDV16JgN9mCIja3xTDCWl886q3JnkcaaBRlIUO8xi68nFnm9SQN4Ha3QFzLf+8IPuZ3X5Ga2uqjdwk0tcYjsPmre7PsrnfvfHUFe1HQLrp5S+US6aDJly8wdA9VcHcPS+3AOD/yLAhcG089+5ynH0aqAJ4oh4AKnPD1xbXgFyKKUwFp79zTfHFDXU0othTfKh88xL+APtez/WrLTKLQgG59tujEbg1zDU6Pg1TmIiVVTtvJqRk2w8eSKfJIiWy2rvNXCvrv0lkfkW39zKPNrh2iKPZfIalmAXwNRJIqy5SmIGReDcarl8SujG+LxjVxYLUJ2mVtXYj9AQtgXrQK6A3hoYabqhTF10Ad5JDTs9tWuCljtf290/gejzOpHdVQAZZDUKcHDV0QEnWfGKBU3YAy4mQwMfStMGhMNuv7z68bNav+3tBn6MJNVI/8qHGalZBPqtIKiYXb4GYIaKRzcbQgYbevjmiwysbeBBB77HkSIxlaQvnSmjqwWGdNWJU52M0pUUzAtKdCxlIG/PEZxGy2c0Txj0M7/VAXnHaRdLqdHqlJUvEhQkn+tW1SlGf/l2CYin7JQvJWJ4fKOrsvx8X73fCvkcaDGLo0cF1DuPxMrH5qco1lppYQN7exPs/PP2KFPLjoqYErmxY0BfFKU9PKjxHu3DOEOP8rXN8lXYrKt1XevlO1cnLe96RfHmbnnS7xgAqno1Ly8YXeUJLf5trwWKW+U1QuxglZMW6bjXhYQinm3UJMN662BAu3x0eaUbesNli/rYyLPxvf52M1pjCQcyRLKa3ul1pbyYq+8RlIddvjfB7KTTZgle/bXp7RlsLYYIkaB0XImHteUNZfBkorQByEcdSVoGqF5Md1Y6M4iY1eVx6+6y2UkwYB3Ys7z+qQGbDWUD2EXJuZNobHDH07daZCsuQF3L22jsidD/G4jY0pKIHmL+vjgY8tKc9Pxed8Pc8Jut8fHjJC1AoE0lvLcPONrxzA2fPOi+hDbsePd7kQKxaVCNszTmC4KQhthwjpzjqH0tVJ2Vgj2umWxARTr8bD7FXq66QMmKp0oi2fYX8WNNTjmv8jRJdnMPx1qlItEv+hoaWnS8HgxjyNv6BIGwZSfnFcKTc3YVmbRew+l6fQ70cV4bxe3uwiFiO2hSNKTfE9100EzaSzOFRru7rn6S/3hfS75WBdehF13B7LXa61Umkic+vTRXVAwib40ujRraru3qRrGyddT9uR9UgPpp/WCzuqZ2UdpjNhX+J+k1P1tgeC367fmJC1OmkzcC0AyG/29kOUfwGfqm4NT20Jt9XUMrHIb79ojvkIYEXtKqBzw3NB0Or+40AeHtCvNUAqAjW6fAd7DhFcrPqLo0a6pLy8q1iAT9nJ/lQR+fMtowHzcBDYW1JgnukYC5tFIpdrExP/7M8+JVLR3tMf/M++ka8/aVYn7WiAHcztMnn/OpMV2YiDk5EcMcawN0RJ8Ye02BkuSWF3wkkXLKFlcFyLywOpKs3WGWH9DFPlooAfM5LMwg/jbk7LSoEIgEVw6+nyD8moo+XrJ5pZhjCfLVZRAmzlbKZxz+9oG5KUFFlC38md9aEGSuBXEj91RRpmQUHb66j/Shg8dS+jVpiBRUHeFap2XOI5F1X4SKtUtnPiV0LnzJehdE+FYfwCFyztKfvsctlp9Rb7yczgnMjlOxWhE/I9+IESt+KqOvjGv95LaZ38y+QCpZedMv2WTwBaDpmHwzSSiDM5ItqNMH3dQr/uT1zdDQNQPk1v8Lj0Br5QAHq8p4htAY8QprlA6l1XILV/YEe4yxrHykoAH4XOn7x7d9c3u1Wazy7rLWZBb7vda6nZU1dBoEblQdsgDxrw88Yn/u9w2A/Asp26NSTRd8fIRJe5BzKY/IawoIWqadEW8pf0xVZUI0DAxO7znH6x0YIhd/jyyigAo/ShVkcIbhpB0zKfU+DvrmilYtyBFcMKacc3PIy8dRUdnoCtkviFvbP31TLiPxpNsxFkhU9q6MuCG8o9nh9PmLd8At2tZTx0Gk1DqN2FYAn53sY392sKGs4TnkTCnecby/PBMV3Ysy8MCmGJhdfHBKbEtjKvMSfq6R4YL9e1WrqnfbEFs1qrpv/TtgMtAo6rmE2XetusxCXLvwlDXfjk0IeLTdAR1DMXs0qLMhqep7p7/8VyM6l87zlfcSH/v7HPa1VK/cgbk1307aGD/LQK5s/LpivTpj7KUORfblBlopx2xIkC1HHD0G3uNx8gj1S2hZ3z+UpEgjaakIUhZ3nbBt4sKsUgO1eRFsRNio/Xb/9OnR09Af0SnhGivSLFdUSD4IvT5cjdNIJiOMgigDI3gXVni4YNwxQmqRDIgArSf98LlKYXFfjT9AdbmspmSd7KgxaEaguRHQ1HwHehgKJXj8ROUNRqFa027d5pMe3ZbxBNrEB4XvXmLw/E4Qn/DkbgvQeP0/bxBjdNiYzTq87IT2BaQcaNduUHsgNihLkDNeX5SpCGQhNiLZPhRtduwZTEulvyEKigkUNfjMI8XWOal/0Nf2dNd7oKdzudr89YyiB0TCsBRaXHHG5pBK2xDv6m0MFxQkm0uPlF1uKLuFbr7RZQftklsuVmocjCbKMpD26ltg9gQNlvV3cuiRvq4B16qfOluaX/Cd6Eg1dsMUVzBNE5AUZn0YAeh+zfXFFGt8SprJdncub1NJlh72dlyQ0wfvGGWm0hWUy9BFlUA/7hJSLv4jCsDIIv8Z0I4yHTVfEzanye9d5de/498l4u62yO07ndr96r338r1RBCGnhlsLI5NDS3IUj5nJ+GebioR7pfVoPnxXjooQV/YxiLT3y+5VgyoglX1uXPtBhR888zlqJJtlayvudFuI7Ew/p2hMImgRaZYTupCgyUgZwxuHYQNijZVCS3SBAOjgy97uDbmQkVtsxGDzJMJ+nhTe5eysSSZ3AYz0flWtbR65I341X8xsYVMUQ4g0rfJv3hsVulzpTHQ+q9to1Z3PjcbiAhXeby9ynuXZQx4Gk3FGV4d3nnOC7KMB7W46cmLZrFk6lGG15XfIt5T+ExLi1lLegniMgByusH8R7tjF7ZMAB/ITw2FVB2wtxRkQ1XWyhsA6KmB4q1f0PsXF1hU1WfHcMXkj6h8VJWZD+Wl4+fZFVZRjAmJwm2E24ZIGYMuD0dGzyclK7RKvfup+bTT4Kcv8g+XzAejOJTvdymIvH58e9EGAhAE/7sPkF0TrpocRzX2XD51luqdTEchEWIMrOugiF//m6dokKl5o1X5q53jI3btRi1p6D8KJicwmTd6HAARmO5RU0Dui1eoFr47IOQtrYQNLTM+sMaRdYqfGIBBSC5LVBwQKedfpCGHjSSVNbM3sQHvJHe0gXqNGIvxbB7zu3k5yX1LVAqJrQb54fusypRDhp7EjdsB37kktYLYTmM7j2d2pqqg0x1+fHjdIOjHjNK5spaIc+ohlD2EPPwZ6Q5MgkvLhVA5+d8pkql5yzAgr/ii7UCNXfP+iw4C4O5d08SVtwXe9IbXsPn0otmi0fxOiqVMSzan0L1erZGvdwuYbmvSyLTqf93E0xLMR5CvUaghkDjxeazZEdxJHiChdQ9L8qTQiJZjBxMgxgdt8x8mCinrRZ39xMYwdeJTEfRM1b55bzdzdWV6sXVDJA75B93VA2FH70abRT34hyTafNSVAbM+6+pp+CbkHwyJz1j55wpql8kL9iZ1bHWUGaiFwngePW8wkRTtA6korNHjUR0fjuXIvzpGPqSOoEr5fwNfNENPTKLqSN687RVO1lUbP6HqUxNeJ2oe5fnahs+Sxbxv2G1dXkD4wCf+S3W9E84mKoX1kmy46F7V9L6irFaPcTG+eqXRXCTzw/5Nl8usabgZlIvPd1bXWg5dknD1ZXmdzZOKFu8WRkkJysLjNlt/EgcXFLvkwvVKlXPlZXH8ueJsnKlm4k5bZlDXV2HZ/toRYpPcM7INN3jJXLgAiv1jaNY1IwtZS3t7VloaoAP9rIat7rrkOF+WAc9B5u/3g0qAeb6vudTr+QOeJC506aBPcAdva6ND6PnmeRZsg/u2rJpVDFatB8REsFKfi62oFPy1Xo1O8+eaXXisbTKesCrV3EgOkauUv+UFw9vCdiMR1U0HFioRxQdF9u5SzqUHTYjeyMLUgk1Rj56co5ENQLDi21bykwucxiLXPknfY9zWL5Rb2KTqvQ1hdeiKeFU34lBuENHiA1UKJfgO+ECz2vsb8yuJgDbVu4L1Xf9fMzLMtMKdrW3mJA1wiYhm877/BcPAFbvfvfkj7X33761VKBQB7Az0hXtFQLNrM5knf1oSkhvHuisiQEboJwexwtcfA0JFB6GLi5KoVS+u+v8mITqsvJDjL7Qxwj+AnFq94otLx+KZrmG7yElxTJx7eV4mTqyyznMxVaJ2YWvI6mrYrZ7AwLIFZVekSon5LMU1cbJLK7yiCO3kpOQ1yZiDPB8zyB0/OgP5KxWSS0PlJTTtikcD2+EICYRzglS6VAdckectK2hnZTv6MBWR+SvJHipoo8CvQz/SoWbnDLH7x7es1MQD3RCR0D8S9VfO6s+eo6o//p6otUWbjImktDfxaIKxL609iapXdSVMb98w8W8EJ7wgA12tDAj8Seb8Svvq0W4/ee3K6Hpc5UaJqlIYqqfSI5VvFtiCulhHUo4eXauplgQiibqx/gai3WQo4dmW5cuoVcjmZncdce/jOJFzx21oztHOty5WTp3Z+Au7zbvwJO6REacUvdL5w4WgdSdJV7Gi+B7P6920w1vG8/YZAhk6lZYwurM+jQXNT5cErUZMZ3+7IhvncZyZ07Z7IhzhAPok1j51mEcC1rcgFUF8vY2DlLxGdCg2GIjOywGRGHn+rQBxaQN4PhK9JJlu+62Rcw1e9voxDeK9PXAvYlCnC5LM9YjaLa2mCK0QvKp/8gQ95F2BxJD4rZdBiPc4sBVXfFnmHnFo6/+Yz+wXsVW8/WjltONkLZzwVgHH4srWd63wfD16xNiD1RKUAOA4pWwa+BudPQJeuAL2JvFeEWLFM8c4bC+DBTSiBXnE0vnHjVLoH6PJErj8JgGymbs9A+5G2WwixIX5fsiJ8Ftl+xaM3P9OP0WdZeGf0gOZPe/g+KAH1SGNtfE9CTG98Fg9z4OgdLipsQP1VwtmA4WAG5iWncCIXOpDBpQWmSjz0gQlJPzBLqwDuNbHEK9eVO412c0AkhQdjMCEXD5vv/ietgdth2o92hBnv633A79jG+TIINXi8IDo3HV0CIq64QQlfpoKHRENQW87F91B5qeWR524Z2xygOwwAX2tP6E5W64lt9dDyVW6FzN+1sm48ohpZuL5vMHf85k+6u57bBlfcI19pMpRxIQbYJvtX6VMQ8fR1C009P5UToH/Os6NsJXBNxD0c4rxI06ZmCW7ftTGQD7E9E4JXh9PxjNy8D4jnOa1+oAz37d+2+sL/+AlMsSWqzskwvfAtjxu3jMzFW87DUHhxpf4k803sbRpf1bJ2Gj9gjVpTHQlubQ4JBW4tYTrW2mzPeUxNGspZa6eipErgo9YTVPljYe3sr3eut3nMjDwu5WBcOOXaat/CdvHrGxs2F0GNTyHnZ/twhJgAvAoEYT85XzWiyMiOp55RllP7cmtkzzyueSa7tc8LbkxK3UHdasXC/RlyvY73em447bYG7hySPh/RTmDWlPT09IMYDw+XsezKXJUljY1KGjwVEClnb+oHBOiKYD3I1z0MW2TrbK3hH6A14tFyykqArC2BRVgdp1uiRNx/d8dqHl914wXsscp73v/g3CdvgKZ0LvcT8JMwyxg94hG5t2Q/CK9hIzs+ahYFGUnuKyK6tlHOR53y5EC6jRV+4J8jSEgwKIG9p3663EVa67UGldo97CK/bLyoq5mkUAWsO9K+i8F16TgDz1r5BWRrr7Lkt0Mf5N9mWjoxCaW4mtydoMf3GvuoDKDf7nJ1yH8y1jv/mufeI2iaHrQ5T/fTZbdz6Pn3OubeUE3JVAZhkNdb5k82/Vabp5UM3wzjFMvW99dGPmFb3YKRJPYkP7jJdEaVnHy80A+B3eyd/3JfpSAIJja/PW+M9Qc2ZKFJwif2PmHH/2GU7OP7n1d/NsB2vr97r/+utscvvoU7DzXaugJvTzQwP+xUQWrlIP0m5Fj9tGKaxhD00sxJITX1MYRxe0Kxq1258+Aiscs1970CbvX8m5v0l/FInQVNlkxVMNmDNateH3BY36S5H3+0zvqBgsnt3KzmQaG4Ta07OvcEepNey5FcJmqvalTwPhi8M9N/1WBPFN+61RyAoP17gG7qjbUnQ+hvYdPHh2pf1lGXwG8E8YnkMQxKH3dJX94Yz/nt5Pgm84SfX7u1qApcKYMXWIxiyIThrxujv/Z+rHxVljKxyEIW/g3TmO66TiADl1kRSPXWiiOlaZSK76VBbWSOqCajTt6pMr7vlHIDozxbvkPBXs2CP5vp7t1wvG/ifWaNw0VesKTYESnM7pryvx0w6nC4YvkmLmXx/Eu8F0edCUOQ5LmS6nIUtFNhuJ0gcZk1v6NL2A6io1GnexMeTl0vn7NdfmrPOdOHFz7bwRW/w5jXqWgfJ5XuvOlLIW61Y+StsuZ0rnjeUNSK3zrSzYjbJcnipT1llw8WPWaXM5z1nHZ0tEQGPE4+4TmR1tGnEYR5d1oj8jaKid8zeYTtGNNYX9kwRJ68ktFxL647KUQHddazkqPkp+5MIf7DKIPumR5vVKp1BLW7bM4SLyqCqTTcYqdT2wbGlca9y5r/g+79XOmkVYTpWA+ywl4m8jQkc4Bryf7OqnFi9GZtesMgNNPypAvUizVMTVmbWyTKHYp62i+ZfRYxxOmYMX0JsVH9wYzUukDDTEYU4F3KXZgeUD0+egPN1uhW/yW7c2r9+3fZ08rt0JjfXQ+a5HQ9BveuXJ7VLF6iMDWyIXo8m3Ca7EprrYemb941yC/GfhH264Zt50d9VtGo4kGt7ORtdORzwpY9AQ54cQGTMe2hype4fl7MkF0qPuVYTSzVv0y/X3L8WZPxPVC10dJMkCWIQRZJxw0BVFE9uYGUT/AlJ6uh2GNfkALvX4ADXRDhEcQOqzOgvVwwMpm47bVjuhfOASCsd6Hng7bulOO73+iVBQOgmgycC2OLzo7pMHCATIZNBtrDcEDNkYeWJxdHmEEjwNmgRsUtidmwFWRz7UZitnq9ih7YAzi+3101dP65bFQDAJRfsR9KQ0AUj9EMabUhhjEQqFpnBKDIpTS+xA8nqffJh6QOHV5othMwvgF0JkwaWb/y/RuFjcSRth8SI5xwwm6BDU1feEWs0C47hIo4qsMEiF0CPrDBKwJyQnThmKW8aNudZdjwl5q5KnKxj05FLzsIlamGD1ECXaMRtoEjL1yN2idXo1n2X5rrX0RI8uJBSLzHtYouMVKFeWObDoVQxHPR11xbED1tvHON0qUkuDIfkeLMLc4gFOq6P89nk7gIhSkixLU1Jx8TcnQV+gVIZLnpoCkpP0xVfGAGr7XOLrX9zOp534CDo+kWyBgmBoGI6QYZNi2VrIFBqqkiPjane3mkWFkBO7B0uz7j4qQiwOR021sr8X+X3kPzU+bs/iBIC4z/KREC3WToIbNrPUpkQC3DlzZKjJFSBGDm/e6QJAsBs7YGRis5Ov8DHuqzBoqUq95UxN64YTJMc4kBPkAXAAADa2kNqCCmYECC4VLcu8BvHb80y7G69O1OWQC6AJnN3GEuM2Yr+bO4fzWjQl5fY59hz/LeN07g8lRKtvPvjPAJKi6BfrZ1XriAZuzt5436N9RofKtXdeJO3jZtq+ROKIdjP85z+w01DlYIlwLS8oCL18/FvFQ4V5djsq3xaepXN42VObsw9ZWlsh+dzvaTuXHjS3yP4JwzhKTLyW6Wgu0mBo1GVCsbwCOvoeSkylf55u8SHxpDgJUfX90wg4+dU27zhMdQGxx/aVF9dANoa17oJ02Mw72m7Rg7s+vT9mbjwFtuNLWJw72F5lOSIstJ6QFX+CDqKMxDH1JQ7PkVXVDRrOFbrL9YM63KMN05rZtzJcPZV0QAra+sv81a3DLQmaW+GbfH4XEbi/bHntFtDBNw/JgLx6pkcdiF/HcaHFzIP9y6xGIakHVW5/KXUCitHOunAdA6Wzt3pKJSILmul1p7ua3o6KHFNVhi9pv+un7zy1dliWUFqxouEN80xdErMzjA+7LKXJ1ADVwXI/6Okp9zw6qXVwsgc2tO0WzyWjnwxn2VeuZDWBSUW/2h7bN8RZ83ffjpri4Se9ajSuc5y7Z47GvYH2d7UvmcrHTOLLpzbBmMbF1Jfxs94rD051JQGf5FwWoYA0BdRuajcLvXUbvkLpNm4N8I88bsFM860cY4KnpE3Lv8rCvz4qu+eOd9ye9pLfhKurQHRDXURL7okGAZwFKEEG8A1RJv49a13PDqxtxO8p4CcFd4Y4E5I8tiA8gmlJEXBiOcbNdLQpKsG8JyC9At5u2TUX3L6U7JOek50WqMRczSAZwEFagArI2QSjDFTqGvThgpwrPzeBqq5exZ5n0yp79y9mQaWtIi9VC62BP2TQDomLq4ZRc9MdHZ59Si7j3OWhYPkXK/N0PauXl7s3FxieSjPKZTClIKH4pIWeQRSV97MDX08nxNtmeSdLnQVRBXx288a5nxDpTFoTgYrnTqHn3YUwkbJvowINDv1QlmiwX0A8oLyL5XJ4TiB7J5TZgeB91A6cCQ6kDa2kMAvu5jc377hddh6Er/i1tM7mvKoqh9zhHKCujb4PqC0jYR9lxzzwxAtnVfLpWEN60wUC3+AJntDWb/fO9Gcz7po6hpZfA+j7nUqWnXo047SDwulOECGMMx4Gy2YAdJYKwafWyn3IHExeGzPqyMFiNNOlCorWnxKfdCerAoE2GCLe7l+tp8yjDsefdnGtIlBPdJiCglJ6q2IF5ktF3H3Ka2UGpTCjbK/5muC9DLFT4f026BqERu92FaKxC50+/AGbNJi2vZgnyfFm8CtnZb+XvzDjaSiH5MOoKqA/yGeXGbY9LC7uWofD8ztOwbgbN+On7GhUlPC+WGzsXJjG1PGLM3gvMv64MPc4D8lui02zxfPtmAtnOTxwQkq4Z4MdkBj3Zd8BuRwaVDbIB3waaR7QtN1EkzbAAsyLdjuoEi5W9gF5KbwcSC8wbjus026aLz1/N5DK2WbR7zTD4ArDvWRmJWQ3zCe5d0a2qegqg15JjrWo4zi+TSM/EhV0HN3VgMLb2tdXf5lJ4qfk9+EBRbnmJFijrzibs53RgB07nwyi+1H2fBLhkkP2PykvHs9RjYaCkQ3Url/xdNpmoMpy4hXM6szYB2m808iYDG7Vx7Dq9lFixRW4yDCZh+IU/qNmVK8Fq1aWEleHYXZLzqM5qL17bYxa3r8FmPCZUTjEzDXeMRjLvGbUPC7QcBb/npbkzBVDu9bZUNbMuwrZ3fFP8grtNdcgVqeFQ7fHmJ/lM4VJTyKsflUT8cxatw2L/iCXeIUadtfkBUgCxQcrZErnInaseJzpv2hWDzJW+jD0+TNP/MGU1ckLCBaIBVecbzrIkz2RlIbloS3TkWWuvmom6QvEVxGvEvZcClSMXnPW5XihYLHJDJCw0NCYtNw8zsSiCUgfI3Y+r0NecRuDuOaN+ju2Nw0VmVh4Oh6VukKOy86pmgJhRRaz9CVcMq0OCZKD4qYFb2FbiLBPXgjunXBQwOgidYmy62W3rBCxj/3kNjwdKqUWBv7GrIbfZD+xqjX2gLRRjpqzpxNly9NEn3T/Sho9YTC7EEqfDMa29eC85G4mhwuSwOd1+c36J1kdP3aWzYxufkhIdrvTiPNgik9F4tX3d39zjHtFICrznmNF1fIMddBghfbGCjazH9lQq8eVm2WOJnGwi1iFTjhcHd/Gv8s8iJrP0luw5o8/4AXDw35cx144fHnG8kmcB1qETLuiTMV45xljJ2WUQ9iOiy4+cXDdybRFdv3pE0VTeTKl44qK+irsd8Lu91IZaT9XzHpixDAwoJrWH9zpccgqH61vdYwwXgNRSLj/CqLdFkHQz8WhWHp3v3fJN35ukZxg7VwB3S1bFwERakj0p2rSLgdlm4FZNTnaNKIU7aEuRC50tHc4GcvT2FIkAIDZPhtCXbhV1E9sfu+VQ4BZM84pGXHfPhRew0vEhiPmgsnvD9pz1EXAxXpVgbPf8aTTpQh9WK4qsJIv8Y+ex9tXbDAjWVeuQWYF2gKiD1WZNv3XhvrjGZ3eBp53EM6eQ05lpJ27o0Rxvv2eNrGjpeAerKreL7ib29qdSa14O0V1Q7PpWJExUU0kcK0f6fc5n0jULD+nuZstYfDv+8+qfN0Z6Dpn38lRS3jMfYWOjwNZwSHr9waOxZRxthp2Gj4dHQzz2ny4fi/lbw/Sc7SpBXnJRVRp2DEo1eyWJ79qty/MYESx1L7eMete03DoAdbXgjBle+8os1dKMFw01Wy2zSQU8zmGX5GZvDkf1goRw0PYzm4KLgAJ25Wvt16Pg0UjmvKPI+FXBH0mFo13r1CcTkCckUkGPLY4ZRoOCZFZQ0MCjuKCNw2CwmI07C8qusfZCEyxp18CRQenmVv1NyReU82YBiOY73VvoukAJdsfp9XwS6B3qiQnJ7zkoEQFANIbSoncCkwQo5Teu74LJSIRxR22yoL9X4ix+rRMbGEGEnH/X/i9CucFYTAF27jmOcgGLikmbY7sXzAF6NcElEXZkApCWkYoIVE520dame6bRimtHXn5C1tyf+9uYS9VtYjloq6+MnpyXdkmNULvV1GLTgybdzyfzDuQwa8dSun0x2BTcY9vTwvhcnnREApEv+kMAzNLZHPt6MlDNmOvCPf8KYyPjjB7ZfgCcb3oplCcrYVTXpbrGP2s6TzThaaMogbyGoy2gGXvHrW+Q9Oz2ZjySC2FO26px5b5RbMvZ0JjlfzDSxXNTSxvJyazuznJ/Vnj8PCQs3wk1k39uN+H2/wE4az6pe3zYgIPeIVrBvvTPaWTGwW7XOVe4DKOaxdS+dqHLTdUyQJKVL1vU5JfVpFUuWqjR72edGizFbbjHL8mMY6A34OwiNRhjX0xWSqiSvc65eNOAOKkp/HtsvTpmrH7pvKS0aGCKVIpmpLNWFieHi0O1o91vC8a/NZa63LY7HbHXOpnyMqxV74AMbDUFFfs5yn0tdKGwGfl66CYuEbWHVdvxYomG5FfsB0CwN8qEGr1y9eLG7V3LPWrl8sK4x4XCFPF3uzfGv7/P5yyMXd+YZ5VZHQQ5zqxUH1pYsn7uCsMFZFEfx2kqpqAAzCOLbvczBXp0BYXYbMPn0yLbiTtV4bCUSywLbt7xvhguWx1MBqgkafs/WIVkgRH7i2k7ZvVAA7rNmxQoE5BBHJ5VuPap9yhKBUq/9Mea9zrwDU3KlQ8flj2NJNO8Nem8KdVCNJfI7NEuWVIcUjYsDcf+LaqKaO4526Rr0HHFkYNakyDBBZbJBtqZYluvMSLU9JJ8EP8yWcy6qEkhUc0QjCKOTvNTNw2JYI/n34JAN36fkUebfZ+XIZoD4GdD2uwB944zsecJUrYydRFbuV03H8OJDFQJ44InIWqbVvJ0zXRpTxF54I1ngjgmt6n+Ad8D1WFNrrx+FRk3fJ/jpxZ8ioPnqfby9t2KLwrm77xw+I8FAwoWLWWqA2o8TUzuE3VbLqjJWnccXFxnsJI3L4VHDodbO6vxeKSpZmRq7acRM/zs68LWLlNJj86GZiZVUo/WzhW7ze1vUODJvJooyVHN+c8efjqX1YrDBPFp7ziSwK5/q84QzlfbzT3cJ0Ah/OZB3fmnIW+4vE3makiWD+GbLhxAxKP1lwlhicALVSwwhWG5W6VRlfaudP9y1rrHyiq34H8nvb6vnP7u+uev87fdbQZSvA+TDpMezh4ttWYq5G30G8aMkotpFm207PqNOqLx8F81RTuywg4XSX9UImp9x6i/bm4fii5p5xOonMc8Yy+rf0RINvXBysdFXdt8+ZB6HTjtPEtQRPTMnqB7Xk0TVyzsBUY40mI2dA7Nd+LBqbSenBATElF5nVI2rn1gkdN3Nhv9ub+jdTGHbf+Ik0AXuzbraHaE8+VchmrhHPmNUM5STAFSVex6TgJsooURaYxqpCtBccXELx2MzdoDaTyxtjhbXyU9ekyunrTVXUTd5BtKNRkRA5yXdINXQwbAHeBR8VqQoxOxtYFszzmcz7eFvKCfRJvpwHDCIvtQbN/mK3YU2ZjrK57DK6W3QUqDbxn0iGzGlCd1+7J3UJqFRp5iGycNfHS3fBNgLLsshGx8AieJHwhicQjn03/Y+E6zSyjgQDVnZ8Sed1iXiniXAqSavXTN5/Wf85e57PZuWavGYd6pyVRWBFyB2k5wf6dGmGdK8sSsxSt6FHaT7pPuAH6aTjAenMp6sjPg/rSkgLNMrrPqQSsjQBgGQsz5YQTs7rpy5En+hTMAvNY+VjIEYnqKv7KnzVmhWA0QRLoYUQETqLy9g6xKFa9EZXrxvu1cDAEigQ778mm8ymU95JbArp+TsiLQCusQ7CR0lB2MvtdHVBtQDYOBvfu+IS1ghAvERT7X9NBPV3Bc/BzMIii6A/LHaAoYUSFpoR6JK4oiWwfZPNmpcrWkvLCv4fAn6iJUqbXKkKj8DH5A3pzdMI7U9StbmJIgQ2qRjM6jdfUXZtc+HNQOM15qzhc05r7pTYYUujboJdlsKxjVHpQhW/9g4yE9GWFoCLxJIDcwBCmtV6mq7ZHl2MxYazTOwjP/fgct7EhjWuTkWTmVVay6kvM/ANpdqCG6BDwp0YOwI151BgzIIs1ULIGrtxOtytUIr3xA4JYshn/XCMbHqqigAL/F19cAqECrCaxWOk4+M1Qkn6LGzazGyIXHD9KyCbECar/nzZsuhoSpXOAyQP6p3gwAgVHij5TdH3KY+qsYXh48RgI5dnf8DL/exvFclEVBLxSes+AHoVutDhqp9c2k93JkBtia3Cys3ASlF9sYlgHOR9IFrnzQn/VLz2Bgxfu4OVMAXgC7C0p90k0UyP5c33NqtRKFdytrpeOJqZwKEjzrpDiLO3lgxZWkIWqsnj9UB+KrPDVzeV/bhzunFkfAjuIauFamHINfYWBNG4SwT3burSzjLDBKiY3GnthuP4eLyAQWKTosdyPfguGwuTN9ydgpvANSTvQHbRbqF+AB8Tdp9bBB0VeY/EHWdX1rO2LCL6al8wfu4Ok5ToyGyNg//ihxQ8yyBCh+AAOqNdL7n1Mw/j6hn1bZkcvJlGKGkoxPWM+jT0gcpY4zuMF0iNwlLy1QUllSawkR/ROgzmps4v8MKrixOGaazVoVIx6wPoO7Fbnoq4Xxzx9kAhuBG50BFHZ96bjcBn3SaPdtFlPF3+lvOUyidw+iWxZt++fIjYbQL0vgjRpYzlwN97msrbVrmSHO8yzdzdf5iIjnteC8zJqeMF8IZ3gcwFK2bkzDcqUejh+wQ4S3mJs5bUC5itf2JIzocJpb38kaMMJm/Vbq6wgl895Dckap9EzGnI13XtLd8bgq9REHzVGy8vXdvw8aOovifl3CwwZPLE7AaOISJNbB561JheZ24bjkVql4CUM4HGd5LP//gS6aZYIi+hTEfIUC4R4eI8+RVLQjumZ9xeE64I5e1+t/sTFb4m1c9H057ZsD2z9q6nYeY5KSMD4xF8NyhJ35w9xThAYoxEh7pyAo9eeubEImmGu8X4IfWvY6qCxK6gJ72AS4d21/yc88l/bAln2Z5Pnm65YAC+Sw6KP/FjtkZkLoDcG0LyLS6pkO/nX2oKjJnFeIpgRfHnITSl9Xt2QNOBunCAmAwfYLvkLJu+j/H6pMh2/fVIRZhJM7ef5ijkKfT05EQM/7+RSIuZvjkoDdCv/OM5RCEZkxPq93p8c217tzbvodTY/zGzTRj5GylcxYoFY/2/RLVVDr3RR2QPvpusMqsnhYbXOYMkIxD2UDWdlkB8IIX7TKDQkPK050d9uqLboBCk6lNzUYx1jmrxGmxoZfHN4XK08O32dZwuZZe/LjVxlNz7t4s3xgRETQzucr3SWkiIrb5a+Mo48LeSvRUcK8ShCjVgFGJdxGrD9AzFcXHCRulvRa31im7PoB1jfAjBOA8YM8zrUgsaZ8t354iF6+LilRnEExaGQd1PPXBNS1p05KTMTNMFKWzPv8bROcO4TAYXi8hY2CjijtcgNvl2JExV92fsPh6NeLJD236qcFFAbG1CbY+MQoi+Z2bgfj9B0wugU9ayVd51YnqFHrp08gNJZpgwteMP+GEtXaxLWdnk0Hv09CKpw2CJu5ngjsyonKgGv9xg5h0eVa9BFiSvsfvHOZ7bYVD3CvmNltJN7Hn2ZmRFkft2YHano8OAXvec5Vk2ESMh2syiW15Zz8zjuVlsG/h+41KHHOB4nvKbdgNtiFknsaIDeqTvl38MNGcx1jXiDiJQJiLWMi8TK9xknAoWluvrQF5+7QGL5/FYYPnIwGbZ2lbddB97rN8Lz/jfPhEoZ6jPIgIzLEj/FsLwBYaSICnuTEZ9ZiIZoDaW7WSE1Cwqn3XlpvoAKA2Ut2vCNj8W3nvZQyMQvCxoSaRgIXDilEpbqZgKqe/uh/YqQZjyIbXMCNon5feQ56GuBExFVWk9BU/l/fszLVOVH3vzJ/WfqS9bsF8DDsWgFFPFMIMLpn3geyBIODXCq+anDQuhZVzNknCtTYWZwHTvdhs2/vk4TXyHisw5JxB4nq0joGz6g1QNaIW5BTZIo2K0UjNLB3Rawr+4TV1ia9dHjKkuzeErLFmI2dOPgRltxKw4sj6ou6I60A5mQ+eYRMWZGtMcg8w90feki7pbPkX+rNH1kctRD/tbZsXs9KIV6dvleHrbZpGmX3X/5AOpu8TfDVtphupgPSl4mvPyTyTV5DDL6eIYtPKRZ0m6TQk2BTZG6yZbam8RRU5F5DWn0JhugGGp1RyiGMKhrx2QNtVzodawOgjDlpRnrYuZBA10CFaLtX7+MOMjCEB9yDQvLmDqpsg6jxM37NmxLiAyytsFOB5+caFW8vsIxilIwCCT9eFHskCzew89IJSMHmoBRsneZ+dyGVKdkQrirGaBQgeZD17NnrhmpL46rkEn+ybhanbeSW0IjaFfOyeGjJ0CXhXJWMgAJKBL7zAdvF+Nk8z5dh3uzW6l3D6bDpMsHQ/OwkXKeaTwBBVX+BA1nFGemn2+h35khEHdMobbCh3m4iHsTd+5ScnZl18intTjE+2Ri5K0uS00aonX6cwDEDa4GUV+vFP+FfbzpPlk8A8y8V+Z629/rRXi/ZtZErjfqTYziTTOGibsqIpx7njSewy8pKY7xwrKwBg9BX4RPWBQ8tkQK26PUdAVvbJjLhyAGKtkcOKRNbIOJG3mpAFAA7HELhanK4Nj/C2OiaDKCds/Q5gJOfpxEgLstzBdsNFztoqCdNhNdMN7GPxWji53E2wtPq4ERtAFdc2ECb4SDzlUzUOMqnUugd6QA9wi0eONwAU/sA9BeqxakEBOm62ks6uABCTPWZBkpjWrUVxJ+b4PQwSZ+Tugg4izX1GOEgB+j7gxbTkUVO8SZhsyiREpAE857Zx/V4KNN/pAdMr9hVpz86w38taqjxGqfb9AbDMHoPGDGyzi5mdZshc0PVsECobGKO0cfyBylTF+I9R7gmCgpcuIbx96zWyRkK2/wLu8+c9Tk/OVdv4iowDkghfkmdy5gcM9/ekb6dXLFIyquPBFUoOqsaNSWpPZjS1lY5+lgykvhF5gxhRDOToZl+IWHVqc4/ba+YdGTHkhdeNBMPX9wzn46DJVD+N5cXX8XOZ0Y49lkIQ+Laaj0tfcUegrIZM2XK4Bt/ymx3EY+JPwuOVlae9EKMj6pgjPoCTW2gE/fMrMnwWHoM4MrYJ/0NYDd/txNXM3vmuFe+ErLZMDRFTU84EAuvlvCHgGVqqBJLY0+6EqUFZmeG2otey+OfrCksvyYsMdIPpbEDoS/+9iuafVKGj7SKmK8+FeJAPzHj+ri/W5ZRqMhv29UTtxO/3eIA7N7kIZsNmBxGW49TIMtgJm5Vghg1TKpk+rWSUZtzP8u+x3HIS/HQGEkYJHVZHwnDAt2xBJ4PTNt3uyfOESoD6LmaIJTn2d8XMT//Kp+CqyUyo3LYb66tuP+yMdu7rBQ8xsy9AWVtBUVgwLOf9TEwujbNxxxt7VoxoHiEtZsrBVy2pNVCA1vDBnUHLs1N2GWUyD7BlNbVCD1k+NLpzfWdWgRziZSQTAdwYmzdIA6BsNVirhKmKpV81WgEM4Iwn2af3Ztzs8AipzjOwH9lXWtD3bt39OJoi57+/kgk+TGcde/RQ68oG5RirNOmiO4FWxhcb8z1NztCKDM3djb39JEGr9/mNPw2pTqB6BbW57EJ2mVSOd3zDTMTiamN2+2DqqXlFpfkBcuccSPGsDt8Mhbs3+1/BA0cnoKZPuCAYwuekM182X4zWEAwh9YoU9fCoq+uUhW/ZLSFTdh7zIOLPgK+W9Oi6CT2Gu/V8H6h7Thl/DA+qnlz9tux8EolmrWQiI5EkwE8HptDMRzymhHUQacmc1SYBunuj9MhQB6ZWjRgeD5rqwtOGXE42tpNztyMXYYmFOs8YwLGc6+Gi73HTx97E2dxoPQigYnwY6NbKnH/NeMo1bl1B5KytnJoTiZQ4ifDWmrJWrIeKNnfLKUu5WXW3t3yvp3YyijEsTuOhRvZ344syGJgDpfxKMj5LuzLd626aeCeNyBdumk6vkZ+HR45Ui3JKfA32eiJDgcNdnERNzyrBVGsXn+RG0d4xOAOEVd3lw/XWDIC9WEAKUSIbr5yJU1mcV73MImXde6cDFzZ1vR9kdvEub5/qc10pbeXBM2o6o9SN1zzpUT7/X8FMHjMfPOzvFoZz2I+Qv0yM/Uj3i2K22O3+6/rHoDdvBGWYUPwyAvxUqH3L2F98Aq0EJABklYUA4Imymvdrhr4q9aMdBNSDO+88UT/jxmHu7ADpSrp+tFejbSun8OdyQPKo11+nHQKJWZZhjzIcnO5raEVPhGdohbezxTxZtIMVRig+V/2usSoJLmzfKV9dhTfgks2m54TLo7HpPm2CiCp/1tSrWuateCxe9UZdL7Km7uRFtxSfGyATo/NhuATPknYHpC64MvHDO2jz8BH6XceLYGwzTw701j3htE87ah2FhOCtc+b0p64t3ivTeLERJ3hCl3+3YN4dsXQAA0Y3xPuQrl/m2Fmy77q8h7CCnXyZBT1ql7oYBGVFCBOCnz2WqiJ/ubH4EMDv6INtW2umDF52XiOlmOAYsWWny8VbHfwJ+4H+Q88KPBUA5QtTwc7NI3rxrZm8vnIjWSr6PGFF/+vho6fcl4z5Tfa/2MiQAOl7CgSzAO/bT3OP1rpS3BSn1r2cwkldViTP+fCqhC0o2OiZgVo8D3E37I4lNkRRlH2CdagawJmcgS8IKF8Gn/GVsyorSFR+6u/+/3BPyIUEBT+MVy79e4EPQVgMbSjUG/ZqOrN62ePqdsB7kuDwMQXGKRwFyyb+u73wP1rCS8pDhTkg+BNirZWJ/qbw+6tsNeC8XX0zL7u8Uwpe22ttUFPRLQaQXATVTbJEAuHDz4cIbehFvIwIzMRYksos9q1jmemau+ETOwCX+SqOkLs8MbeQWRQpzLDMdywxNtriGiMeFXeGgwTcJW8a559M4D6zs99qn+3ekesZHd6iJ86KQfB4IDrKtDVpFvXj4frJIBYXA5ulUccTR07bMetUveWgBOETQN4ulWgSrNKBkIWIrseJGaTprWyXtie0OSsP1zsr2N4fBBEuoBFut3eeM9AQLVg9byMJoXnUfWO6/QlkpGU2oKyr/xRfWp+YKs+R6tCqW8YT0D7qWMFo7tRj6oCK+/CXD7mXWxfTxdBbntoVXBgQ6I35KT0MtH9kOqUlzli/EJhcZdbr6VkR9LQrxpVBhR7PFP41uv8XU4KpXUPEhBAn5NluWs/cmS5gMm9ZXYQi2AYPchgbLnxGlboUHcDW17UZyLrp4kHeGiZn1yBBkJWEBxfIhUa/iEmQ6xzYrOPUOVim0dwAEXq62kP8Pb6XjkuNc43gftLemj78HJm1bzFsyFrx220786sFnsxmSNFgJwvJ7KbK41WENnLq/diLJINSbpXfPN4WG/xurvUX0vEQitNA1Tmdwnai3pMm3j5/6x64KMv1r2r+csblcdcHHVzDdhV/JddUKl009ubW8b1vIQycKav5yG77Eo4Kq3pxm07/YkPOWe15StOZQQcJQnzwjVypTUaPspkyCuO/rucD21zFzkkZVRfw3mNhU2lw+0vjwceQW76zzuAgG3mXzP4mU3/93Dp+X75i1NwQ385s7l5jsW4cFjT3AhvnXcY3X1DYGKwHY/+ZVm4KggG3fIueLW3+Ft2QrlSNAcPZbHp/PuHDVrWx5K2vxBZbNpi+samBiTm6b/29ISHdvf8Md6aA/sKle/fFZn8XFf97vvUo0Kp/xmdLZndXz8qScTa3vvbZAgqDEa/+jJM4z+9mn4tv/vGAETC9C2///QR5cXjc3v25pddvy9BZK4pxOG6u7GMF0EjreomvJnoiPF980zBG72Cv78POvLCvdMLytEHWxsA2oXvUklK9oCNEYqUV+06ZeCSxy56ygcKlSLNLNhyzX+ZSyDvvCikJ04fg3RGpa78SrldGgSDkhPBQ9Nsl8PY9ZfcpB8tJD0EzpXl1svilkiujL8/WI0e8KkmylDz/AhtmTQ3xfAoI5D5BW0bWNLIg5Xvk9fcb/h67k19OIvqV4hu7dJqGZJ4N/9Je5D2MOjWzU1kfnV3ieITyv8AGaRZJ8lzSOB4/kmmDm5l3c53VIND/RLpgfxFdrw1Q3V+CrtIiskCXMPD5eO0DVqTCe+WbCLLAew3k9WJtD/feeuFFwu9VL27K239v3evs0zLfvZ+rCT5h7283CF6kFu5O869cbR7D3MYuRsRjuQkBlrB0EN6Lp5ytUj1MKyN5QEJEbQzW5wKFrj96CvSY1ND29HuxVDm2Nxb35vxL29zL3mPy3rAvKUQQEAcueVZt0hQrgRd33eSZ92K9iYEkTCP1df4UiFxwic4iIOMg+ZDTldRhvM/iGy4xIhKsrUVGGsA+SvHUF/JRiS829Skbv8aTeDZf1Zj0Hn/SK2ls87SxiZVuVMON3jg2UBDrOO23Iw64RQo99EcA+TWb6+WtaJOIMarDfGOKdNJN0iQ42YF9HeukigOgKupo9/7S1bRn0WPW+G+cZnc8QEoBpVUTZzic8J6QFWKfMg4eDrJBKgtgG1uNGHBc7aj7RPtW61j5EjdNCKconK9CPiJXeuZEVDo3qiaX3dOf+LJvq80IP/fP+wYzKJJ4p0O20Wt/MKEaOjbH9rGy+ZioMTbd+brj+Jc56U27AUmg/gVzm+CFznzetIQDZYQGHHlf+TtCpuXUSQMAnlJR5jgCiAsZVYq9rlI1V5/CRt6N5e9NdZsKI6HyG33c4piwrejJ4THkZqlFo2f4+qOjjoXr/+30+xL6ZuUbhUnLZ8eyjs3lkVZDfW6sPxxtErBujbSLXZTHMe+hSv5u95EcwWMMyb5jN7adObJGyze2vJzZs4P+VFikWfTymxv84roXm0gXYrkOSgV0Ss7pD5D2XlIhrziN0LUr/ccL0dUXlj/f79mGiKdgPWLcDQBruLag0AxujPOl/fQcP4+KB0DdQbsLULfaegB3zzj3ZZ55yDfEutBGAnjITpmInLYTPagvT+6Z4OHFoJP3ybCv5R2mfmk2ViENic1GNgmpQjblBM/bHkjTtFK6fPz7YOYxMbLiXQUMg4ysVrQyJ2lemTmO972ee40kZfZwtNFQ2JlopCD6kubxN82sWg6Fhm3FrWeuHPvs1NCalaxyVWufNa4VEEP7t1BZn7+9691UavJ1i5s4i0Pr7Wu5EDcjUSDZ1/XlaxStrRqKgL3NyZu2S7zBDtXVDxQ5WeBLrICIuIjC8/WQOUJgsNeA5qupxsUezmmElVN6gM1SRtqzl7pXbcTS8ZNsTGHACs9YHo8vwXsv89bj5AiAiDCJ/pP2d7sS/tI3qd72H19/Mw7MpawfX5Q3l/HA5iHgmhbis3RUdLkyfql4aSoogf/pkHUxMR3I8/rzPVhDNOeDyItbdnxx42ftXYL3iXd89zAh45gg4lHAKnxZbw6E9FVYPeSOmK3DwMt6jCWN5+op0wN8hjO7/caowxwpwYwURlvMWWz5qd6xTDxI+2VqHoW/Z8MPcd0YIG5aw8baEKTCboAMF1WX9iUI31jgb0YHBewb3w1FNqe2oMCcYLI8LuDe/gJNzgs3khYyUmcvF/Gjav6BkPEcXxO42tOi/Bl07J8e8oRq66Z8rEuaYLoL+7D9vYTB8R0Gb2iKDOmPnWqAG5WN9VGF4AQ/sjnKkP5fD26DEy6rOiuwwLip40USzwX9yL+Qg5zAU3xaa9mRJTPgLdNpMcF8GyBh92aqO6s+QtA5w3Lc3Au4GasZkBrSZQRGn7zfFYdyCcQVJWkyIesoJxnKCTIk58AbTWsy903hnvuNVDVLtLogkhtMYHOK/aYZC9eroi1sIWsN1T5hOZ0s2F9MnpHkZAxbI2fDEo/IvgzJ0LLsxO1Pf2RXNBZLmMqZqvKMPHkmqS/uYc0hTPGswyEfS3OxzBN6UU84+gQ25/jq+F0x7xDNI7XEU7cxmDUKkA+/2LTzNJQwP6cDNhsURzB4touzju1pQNL5rNmM0aeq3FSXSVfKFxapbAm+iLvpi8vvi8vzqgwDgp2jnuLC+XJN+AGXypHJF4kWXjVumnVdrCBX9xFzwfwxXLCwtOQZUcpf8pN1GlZlolVmrNt/DOhoI3agq+UasrGstd0zqQ7x2oQZiY3HvS3jiaJF2peHNXy/5Q4Damf0rf7IiMRBfyVd5OQw+RSC9LKSkWRXoKvGKr2ICWJtlIYsOA16aBSILHyqtJN0yhaORNMCQdzZVGJOOmfWmlGYr+f70kregZZ1e5Izut5xvOSgzVfnnVPt/J1NQtaR6pJdWPawAIGt+8DYNt4KnLhvk37IoFWGs9LdhYBI42Mumeb7WO/h4MvT5svV7r62Tnbam28iL9x9/i71JXb53PPHaXaBILeGq2B+37vspXpvjjDsdGxWHGaqmyVYPD/Qtr4QDCsTGuGb0hd/URVxE69sXdrqY/J3Qb6x1GQDzFm7ybCNE8FlwuukflAiaBut2NRzRLnL8sDU4ZnVTVyzQUJ3Wp/lJoMn57FAk21lUcQ8NFV1i1LXeNHk1pQdlnEEWIkdpckVZ1bBqrgT1mL/1fazYR/0oWLsOztNNXkROFdxsmXgE5gyR18bxbDO1rDQL1xAx+nxGawb+jL8ncGUygN18+BUaF/yGcg+791jn13i8QXU/GSMAhWUsFYVo8AObvcIcXpiYhUb2TGCBmziUQ/MreLrjfWV4KVTMKNzDreUmzu/HcnkXvbUIxsWNCYiI7PJYnc83GhMSY5qjNQaiVJZERoAlrWG/ixglgG7X4PGRh29MwXXdoz4C+FO8uYYWxS2I6S3hWMrXW4O78srFr69CO/YeRqBNR0tKMC9n+X1P00OtW9MvCH3DXnbmq4FDuh29joLgpciWzJAZ/zNQt+Krpc+OpUPHAP2vuldRarTDVkGsnN2mU78y+Uc33iJGtui43tCVf6bd0x+SREEGf/L1a/XyD1x92uYeaZV42VnZLln5ydySW+cfn5FA4bn/WO3cvRRxLVfRK10WRitpMPp9gLjJ+l4fYuaAPw+sZ+m1z/f6l/l+cYIUzCtzlTZ4luyhR+fIu2m2YOSFbpUqA8/QXCSlafTedvKVxYb6Gfp/DHcGD51RI6BMKe12M6henzhxOWU1nX6Q7Ql1sA6B3aXggMUw9vwqRizZ+DZckxMRs9GWK//k3lGQkJX0WaaQ5wrTCPC5rKy7RB5vxA+Yyt+BnkUAPUgtQdZnjFXi0K/RryP4Nmj5jt8T0FVCRGUUzAR6xaQyDpX+/32mqk3qcofK+jAAMfAKOsbyAbGa69EPFcf4NcdT0nN9nw93uzynxHgz7D+mq8woTwXhKZ81DpznrnMhUuOn9/nxNWobELXxv49TYiarAFyDNv6F4z9j4uFTX7wzKFsJkpf0Z4THy/C62Fycb0xW1zROh5g5qpQ5vleOOFlSDIaf8X3kn6pmXIfEz0YdeW3o8JRwH7sEYi3sfFt4q2G98RvTugwlbE2rosaieQJPJGpmue53Bevl2L+EF2v6D8XYRPlc4hSTIpuYkd7QNoPJ5F4vYuqs8bjiLzyAi9PdfK184KWMIi2UAjbO5iegR0O7llKb7qfuabjQzY7MGRna6S2EwRHhnpFYctLNU13MI7GNpCl22lhyO8nfJceRkyVIyJLKEb4akuorb0ohUUAczqoOowo5WMrtQGgTqThQ/J4N2O2q3iib6eVKc6OJA6L5XAJd5PDHWFMOYDDJKDXhKM2KySJkRpvBMyrUsoQv6YFXmenuFHiLdrdmTKPAPjjPyVRybtLaX5FbD7FccmWqq9/d4KnPhWWJHDIx/JkgEq4+1OtBYS1CJ9U43RrUeMGIEuDqxnmMUCrN9hjMN1a18g7Rix5u0VpT75JFG/NZADXs67iUBcYOW/PbTLvczSilj8ucbUpVZ2Q/harJwLnlhB5qDITUi/nABUkA9B7CnlcFbhdzvrJI/vKLyVTzsA8SFjN1EqnpbxfaBSkgAFYVmhQygkMm5EuOpYrMssQmrWP34ebCXMq4nQ3KZ/y7cROFvF1roTjm7tnZNOXvh+PzeEV7jbfUuUdcHmAuz4Xb9yQgCvqFb5+k2PB4KlvOTC6gSkbjN6bZgflPLfYjWGU5nrfwvGkyiZO/Xio6BM4/BldGTvl6rU1N7eYWveJZ5t73PZa995Q+v9y89cr19UMPqMPGEfoToR9jcNKeQAZvZNHP0rkZwKtHYFFxQmYxLWA3EPfTW9lWkIVH0Cw3ZHvXQDswkoGQsaZJFLkIisPrEpQdnKv4COD8iGv1r3CZ+PoByXKtHUK0avOmUgd+mEfWQDeKc5FtEyF3f2rr+ToVlYEMGtcAL2y74ldfMye8kYAUaPQFRyfeQT5UwhMV9IBWLtJF5X9pc+frc7jhqupML93KXopinoFshvI+9uPIITekodoYslKYg9nEMzDO96qQWzACErl7Hm0D0AdWSd93RuE8nTEU8FBtbYJbcVBay/tV6UQBFGnyGlX7c4GeNZlJ4jHkXv1OsxByflMU4gznumqStkmGL8VjqDmth+TnH7SpilLRdtXuRM0R0oiVu33sFN4lZNnpSE7F5KaexxvVotBPpV9DYUDCMOqDR08LWQWyVaIbaCZisqdi3Q9w4la2RgjJI9eEEyVeI4B6zo5MW1PC76OZyi/FuGf+69YW9edNGDqc9R/xHXAUTy9kuLwwgQP9EmHQPC5wGixVdtLYu8rUy5hEt3XRNwT1tDDXuTaLeyBaRBmtcah1OtPw1EngU4IjYidTo5sIrAebTofNYoCG0nWJqE5cRDGnfHMyluSG63l4VlVghrlJJWxGBjRJZ7i5UAE1i7LD5+2FvB/zew7OaIyECzPpOZSZ67PdEK0YSUkbilVQC4WGS1hc8DcDGtO1nT0D+U3aTJPzT08H/ystEskztrSvNRgjUV72+nshnV39iuzsgCr9Srn7D1ZT4WeYbjHvLgOOqSS+BhMS99IGuD0rY+235Cs8vNZ9VfJ6j6V9bvCFcz2prPG6GvCzforbOiYQ6LGjgDPk+5DZd22Na/uNi1Ed/HjcS1Jf9+vale+WJRPBleqTqUK07W2GEs4hoDQVPRDXAtAKxnin2pxvor8LrF+djIoSSRr7XP5VLYPPHADYA7IOVrsSJ6DPXArgNQHAUNuRfNlqkzzvENqWQ1I2f4V2+a5+ppGrzK4r1bqwfnLztavsLH3PbLZdsO5rVtAB6+dlSEY1FiL4GT2n7RGVd7jrd1KrVb4eDaRlzD2bM8zyVz16/csJQLPTpg8EZXmpPf8ieyJZ1hBvCrdmbsgXU4HbKSZhZAy6MVnkjmiPGlM2bX7ufw4dzuIGXI8lVPRRM/koh5JygKSXxVQaebs2ImDaBcmQ31Tyt7rEyi0PLhiCJ91VSpyafoU1I8w3dEAAotUT+rV9EVq/MzSjt0rWkn35daIlOLS9FUxEAqNe/0eUC/ssbNt67hc74GwbtThfULq4wyI5st20nM7TwRy3MTbIgnWmugI3YgtQFQDTUnw8kWO2LWYdf/MEfnn+2mBesnKmMN0pCOVGkLWWJG7DFB1DzLn+HOd1GWem2If0IdHgC+RiJ9MkR49/0sWTUvYl5keC0rlZd1sPALdhNK+4CX1EXM8sUoRo9Om3QlMr5QvVhs2DsoGtB6Yy+EasWdfEzth8Ioli9b7wgAcWL7Og4PxQ+y+9BTl/JrOYL9uvjP1BO8fgJk8WBrGbVowa2YJw0G/8VOkfLASWx930gHwer3w3Q+A9QQLDpfMYt4LdhU4OEkx+PCIPaGdFIrv7CGhNxVACrbyriIMOnMeD7G/WG1pWABY1SOmdJNXYJRvpuagpomn8ootRr13xIXTyrAqvI796gLSoD/VqQmh4biuc5BUEwdMW2LFNjiwj/HwnhdfcQnT5be8k3PO2vUMyEzIVDv6mWOpFLsimqFLD4P7fJdC+oPOi+pxAWuj2bUw91g/ZNSx0vTsXtKHywC7s0/x597juzvpyn64ZfWIFpO7EvvOAu5uR+7yrJHuBNl6RIrMygv9bFUy0ptIa6LuDSFGTonQJawtEDxR8RMSUF9U3uxpwXkkKB7lHnETo1B4BHQhfk/oBGVCz1utNDfYr+GQQhcM97qr1LxwmWEDgAhy0u1aJwo9chX+yTTEh6Fwzl61y59lFCv/yGAwacWA9oryhYdPbEJWwhmjygEXHopyOu92AJcJ0rtcDroYpXUJxSJtwOyJjMlvtQEdnT8nAjqWltl4+Y+aah0JRJ0oXbovewxXtAJlBMPzSNklY6UscEQxIISP0PfhnU/r0QdA2bQWiUrFlcfFe68iAlT88so9SCUwJwoxgf9OM1HWoDpaZ1yU7AkT06GRPXp8Eb65q4NZFU4QQT8rCh5TVVhJZOWKPBpVvBsmPSB7A3q63Dfe9atUBF3chc/TbGJb+3spK9LIagnAJM3D+LXCEzUDntp3FP8WAjU5yu4aPhB6LwiZZNkedOIErT4yJahJWUucQtV+IaZ20QSSZCJyvXIIZUWNZ71wgWgxMR91c46rT3wPsJV7jhmD7SYHZT1OSoSIGqp5TyYZRAm+pnVRb4vXYPyr91XXJmklThruVd5EmCIM1j7McoYcX5QJ5Wdz8/a8nD9OTDG9rkv1CkuNt5sMI7PudCt92XjAB8hhaoWZqFVwwzvRqxiblRKhq/QfmeYQriEeDiLv9frEDMZzMUZ/XflYtQj+AK0q5uQ21QWrDk3oUk1V2hkRjNDtLkQCKkk2JiQ8dWxypwGwBhoQiHl02ApabWWsmnFSLYgjlz9uyi3g0bdCvmJAbN/hdu2S7zNbQZcfNz4PwDvWP+4QS5EFEN3EtnkJ0KxuTNllINDcKeOGEEBTnFbfv2OQUUWtOOh7kANGAoaflRmcDGaIq8kUezV+w0d018krAOs2Hf2Lbs3r2cZcwNzBWF/CvbZ0ANUp7EBTr3S4Da9EWf0rF8dkO+bilJYhSZonLxfO6p5IarziVD29fLd5eGZ5zNwvWy4/TW5U6XtWIIe9hobko21SKct6xUb7Zp2sL0x97aNrYwBpKrwf+jUB4IexdCl/ier2e/2JYm/YDyk0lm6TXNryq4wj0jR2HBnB2dr5lFVhws1AfHF24z3YpjTiN5oRfAPGSzyCjsd42EQveyYgOTgcZ51mHAHyPtK1ZoNovwCVkOBf+SYeomIEa6+ciQik+qmD5bJdEDjo4UmjFMwo09eXJejHFkFuaDtnpHrznlxe0I7HY+/SLx8aYOoI7JcvI7hN0cYIDPgQCw7M6Y+gE6UDrAIbGrmMxW1iS3M8BNCVKvh0wlntjDTMwuXM8jNlg0GSwxVoTukXLPZEB8wIAQ3PU5w84HFrN3zZHlXLFTbHgRlR+03XKqSXS2ixHZpHs4ec5lNWvjTd1Ksya02XAH2wF/svMTf9XRdUeAaXB2ss5v3lktGwpn+BG0PxrQwR1s9lluWC16xZeB+piOrm5m0029UnvMrZdxMmI06RU+64GGL0YrLcuEFIwhYzjgJZZ/XQsL4/q3GPMHWXbCRMRUC72Q/Lh4zuzYZxtEN3T8duhN1iAMiB9wsnMxjDW/sZwcSCvwyscWe+C8RZ3rpgaGesIRIdAjsbOcjFeROnDWRzaX0IXMd63QZQK53cwySHDS/zp981mzy35nnkQM46apyo5CYbjIaZU267LU+PrB4uOT+5qZW9d0x2tcF0k9+8ByYlUwhpdmXcB2ItQWHJM976aQ4XDSk8rbqStDGkk7ie4UoEwCmbXspFOs3jkPIknARq7ZpnR2iW8bDQmJGlDQzgM6NevJ5NpjZcSZevk3lBlMIY7Te4D0XPZj3K9h8ZW84L5lmRwlW7l5giKb/mka1+lBiA8I6kNBMACHut65fD/xD2ccpGYPbrNFgzb69IFJslaWwxmrxWThj9d0XIDP59Qf7otu2xZFzA3D/e6PVymGNFwYbG1mcKQKoc1/OrhkpqAjEYEfAPUUglQFsY4U8dtMFL6unEJS0F5AXtq4lqHyD5lTvaRPYUBztVPb6J7I3W4Ylc0VrhaTuZiU95euiNx0s1hOE7VyAWfX7BgE5GAogASOHZtZt3BZh0eNRVFuLWXY524eW0TUrHB3hsjFhoQNAhN1wvW+xNoAeZW/LZRiHrpM4FdMQ1F3Sxk2SPOrioYyyv/PWVbKSnaRcDqMZr2hSq/vXsjsMXCml6FmUkYsrBw/POXc6tOW5JLk28UJDuqyF6mF/ch0idQtiQrTrWVQW5RYisCb58SzmzyLkwwfER8NyvJQdqYuLhsOBMk3C2zbVkiJ3ILApwEImUu32OKlZx/xAm8QtdRvQ3gwbqfHDh06U0G/MwD8rhaLwBiwALNP8ItTbICYvEwXqrn1MD+e14nq25TWmpbHdIoAoKZGsxobDaCJPwwr7LaCJvi5LAwnfX7AnqRk2RyFg3G6qBrqs7niOQ/kiBLyX2A6xr6fBYO9IETOIMAVF347QCtFi54909E0Edu/eUMAZEdyTIENqFRO1RSqwmYnvpeewa8hyTHJmcY6VBPUDuIWlb7919oQm6BUUDtbQHhcjE593e6nfZzNXlKFAdpWv/FpEMfNB8CXonUxcSRV0bGtJbZAd9IxY7MypObxHlYN3ThKo6tUOiwY0HQcV6o2Djsvcp3tCVJEjj8Zr/KfWc5h7IeX474rFCGGwZYwzqP9VxDgnxs7MfCvuZFHxpJzUC6hBi2v6IrbDDpe855xGyZKiBsF+X1CvVvAFsr2r2iYpDzyRKz7NsRcCXQkTkG+wzRpe7AZMSd8LiMQDkNQqp64xWMVZ0xq0vlwj359QJK580YxolB2lukDcVrBcdN0JZ2vXqrR3A+esHQjXRpSMbCYFkcio4Mv+c6gavwPiqj3kemn/1t99hCNiE/FYo08aFlfGI8b+s8ffP/fuAa71u595CJjzhYvSwrmCb3uHAUPG2pTqY9+LsCOIYRFRk+9fnQCtWdsCGwo/H28QqzrBaYqHM69gPVjuXVs5DVwHS2dRmrvF3q6bU5ypZJ/+8X58EFfKqXoJKRl2cNxP5SzkPX3KevvQ8yzjxdLUeG3M2Z0j4AWNnf5pbFwl6a2daLxsjSZf2GIb43YlGLFVoOtkaUJmNy//8SQx4K5A5mmP2S3j+s4SsDdAXB/uYzpaKMelF4L0SKUAv8u2pe44Aqr+lDaUUUvpW9dzYqcGl4FKtcMGtPdEpbLnaOzEqV0P31V3qRbyazJ6hGVhePGhyG5m8+j2ThINzQsCVxXACXuS7kFGn+SUq4GTgXVfRCHzR3CPDSXG6c9Ti8O91HtzqB6uduYDf/6El0UzEH04Yto7MM0wuZQuS18xweW9jl61Q4qdDQWE5sG6hcavUMagwMC1x3AyfkqlLAJhJ1JjoWVYCGjSxTdRzr9l0/DDv0EAjvvYXNA4vEXJJphCcAFuS0Qy3U6ZFLW/sS+DE31/lAVwx/j4JwEBKWCi7095zbdaLmI1JchcThFYNDbMbbYpbQ49ykijBXDOGan0vGNhgsXH55KExv6V4MPQMasAESXc3C+qlxBCtv7vHJqy9m1oAw+0ObUEecinhOSz+Nn7MASjzGUxKYGfkG0BD6RAf32owR10ltUxoxUkQP55gWMByX4cXHdh769uEVafC3q5ecK4omgFRlHowrBQSNtJtLDm4wnfzyoqx8rMGQo9qH82YXd6cpLFG/HgLkL9XBB/a5sMX+h7qUYZ2P+tntx0livmxc0mLyOTDWfEaO8k2oyruyC0rQAyEQwnYGDO6SDmeaxE8vi8x3NzjYqmeIUYt5gDCTixQGT2wJiJgawNg6VjLrj54SN8A6Tua+BIJND82AlFmxiZT9VvUw+vNSgwy1Tb9QuR3ttyFESR5SrI6XYafxUWII36vypHMuqKsYCw8JrFKWZUotDSOlBP3qkDPg90O16LogNmHsbE7uqzAxgbMvazaP+aqiP3qJF/2ZKdOYCvVrxzeHAt5xEXzDHlpmU6lOciJdBSTy831sux8rvxGu8EURKXL8ouJZarH4oSzgrNvElM//uw4YZjNmA2GadgWMs2d/nPZ97nqkMWtXF3eex5WSrGm7LVd5Pwmi36WL5MP5jWyr2Ra6HtYg8VyL32wnfiY1Zg98OI2f7Zz9txrnrr/Gx1SD0Zpz2O5X8qJZX7SOVUMhMKJF3U+azfSO1BU2VGLnSgaJvO5OuqxvDu3hecfeScyFlORefkW0/wcCxoZw33KnR8K/Bxl4o2XXHyXiFb4cmeUcKTc7dHsR8pku3hNaqFpCqKRc9YuzcPLl4cXP0h8GXj7PMxEShIEiu8X8OqPWDZ49BIm7/sjjYijcYx5J5Z8cWAuYETgYDAheOjfAoO7yJkLOSmReR9PRQOaVFkPYiL8EmbVHFHHcv/k2lKOFOxewjQeuZmQ8jGWo7WWcPwy8K5YtUbT2PYqgPMAXWUXynvgboCkQs1MxDdc66kHaB4iflDYCPL9o4mjTfUKE8jbgM2VtDIuZ0JOc0s9ModrBEUAUis45joLnRI8jCfm3wd56iAwsXjGLuXJ05nCyWCvmDfcqU2cn4u9Jd/KO5WmPBIr66AukrDkiyaOTHUTcKAlN1RPaaNOqWjc81gRWabLlyq5wXHOHcpVho3FFYF8g0fF9QyH68f3bI2LafsQ5XrYoXjiQuMt8uSOtE8e1XpfzuFIHc499ZDNHcpz1y8QHvN0ETKWB5hsouHcovBryI0hIjkMsIE4Ip10esfePDccEIz/B7SbpwOv9W1v9eRvnaim6doFhj552YD6xDPqlDRxkoD8ZFEQ5+J3JJfyY0kBBUCNTUgPkQE/jy8a77EhM2H0cTiwc8/kn9xooNasroxy0sFkdg00gfgjtZZyjVHtyiwUIG1QA9LZMzrforhcq3IBW5SoDD/zzd5cIdkI5e7KLn+NKPX4QYdFhS+O7B6iGhedCs2VvOH0BP1h7Ufs5dV5LFfL4j1akU5Am6IVd9PlnItLHNk3lAf3dkLArMEiyjGO5t7wgJtx6WolTbL6UOxZUiT/JUBBdaOt6FhBm+c+qR6hvMTwN2ZNn7+A3VRetWwcRHAWH98FCHUuIZhcycRRp8VcziWRnDA3X5Nol62xjNEO+j4BYPn2G6G2OF92K4dKSB3WbxvSPcpVjZ8C3Dx2fbbqH3wTxtcq94zVIBy/vlsecsdGhrouDn3GexnHw/jOcuOeg6sj1+nP4LCcCIGWHaka+yKnPulQOnjN8XXHRzzhdzCuMdQwacnCBdHNXV1qdZ1SC4G2mscstYbxhQzLsZuswTAe1ofGwXThvmy1QTCWJuf8l+K5DcplxmtpFeLn5oMGIWYQz+RSQKXPbeD8AbNAThkweeBMX9K7njcC7sBele7OLADTtTaXluzeLHHYDwC9OEZeBeCZH7VZHp3Q9w8ocGEMId73VdGoKdZyl+82X9AhvB8OiYOqAJlvKJDfk48a8kfLYb0BVlJWkfAOOEoCDjhXpnRJW88glfhfjOOf5ARvDTXg4Rwb8a885b/cyXOUx3dCwNHIr2G5koqc6STwwFOSCSWO9IkZD/HMfKz0zIsKPahoMXKrj4pEvURcBXKHYd7SfA9ni9Upj/VT8Y7eIdJmXr6PCv30FmU/uHY0ffq9aj8GLZYp+R6NH5yVk7PPUuh8IJ7M/X4YSfsVZ+oHJDUqdOpprJ7NFyxVWnCH/sOR2UKhvLKWmRJD+3my/Al5HCCbm9NFRp1L3BVeJ25KhsKbHwdnGH9gWkrzl0H1S9GIbJRF4WWKCOov0Q9Bg+83Js5EAS8DkGxB1gF1TYo5UeKok73v38pocylY/uf7tivs8+5MtFWYUcuz3l3nkqDCETEkyUkp6OxK3rEqrkyV3h8VfZnHXLH/0YjrVkez5VjgRU5yQiYNOmSQOv8dYVjLGcnR3OxJ7x0hu5EEzTV9N40geLiB/xKmSeTtHLQVKW+w89qF3fAMYj9u+t6gG+B5tiTDasjZQ0YSYmoAghP80qXa/cg9+7bXTV2d8WdYl80KntrZIuR53Nv24/PYl1f08GIWPWqndgvpd3tKbUXCxA7wLNfswuUNiWki3GUM1D7nyVhHnKbMyIMOz/Mjj7+3fzcjwyvuiwPQDlFaCCR/ZHGpTCktsUR5m/6sTh2dsHDCVfrXOumEdiIf/ARliltb6u6O/M69H0khwR1Q0bdvi9/Xe+77c+Ws5WYYXAXhUnGOUeHPZ4SarkfwLc6oNgykxd4etHKZq7B7+f3gTmhri/nt9b0yIH8Sb8DqRGHBHURv0hk9csnjwW/N+39p+AhOMVBvro+MobnjKRsv/t3WKBZM12YpEHLPBwoLBkIuFIGgjWWA5i5pYrg/J7xDnWVF2DO4HHPAgZbHaCNKUwlaIDq0B5PE1S9wHaUK6Dw8aMtbRQx+0JiibeYFVmW94erCml9YZPy2SN6RimUJeV8TtEzWR4yAGC3Ehv9hv1SLfEBGRKYN1/EKUknK+duiZAGzs08QlbdGLquAdoZp6WvKwUa45sTCztQWNN7VxXSUt6Y9sY8DLp0sIX44sdjtojzZktcBNYzaUTa93fyCEM3T7tmo5ookukeejPNXrFdm3Sf81UiO5+cXoZzBAt3g6i5DQ/W1QaL0jbwxZm/9CgOxWLHO5IuOfsZRSLHBcf8Sfo/geFmZWF9AaiQhBE0XydHaBcTfSwF2ZXxCcNNc1RKE1YkV2FBgY8jzC6TdNY6tm51J0tdn1PAB/dK8YotJEttkKBMY2fm84QSqupsrWo4SfsVkGJ2z4eqPe/UBlM3FiD1X87yB2ddWJWthsGrIA1fQcumeNCyXYfQbo97lHtekPYBRhYWDqWB7Bo9pAdlDN1xDyrViodQ1AZHvS1VD96drIAvlucfC61vcRPiEQXxYJaWqVRjo5DAxT2evfFq+K0fmmvmcJGTpvMJSWTNoe6sjCaR/vTyP8Dls5paf1k4Z/30WsdGy6znBciX4rlHZ0cSDXJ/ROILJ88byAWuShxZL9TaI3Zx0MFlsSOGSBbJB4Fd6Q8j/G/JQBOY68LITbHBHv3J+bXmdiZC8ShnkJ+h6OjrvQKlNWyo4nMxPn0mdDycAMLv+jW/i/lsbJK8WRNfVnTc/s0PXHiB5sePoWIGNJHr7MLQaGDfbSNcnfsvHxSFl9O8YuC0a+dXuTUGFyI6qMUSHlsF21ZrAg7edsIejpGwyVRQsaOH9TzCwMou1Oge3PbA4wsFOtQ+htt0bnZ9bCbd+8iw/jDooi5WjCmF5Sxhixhymr799jVf8I1g532BJoiuY/GlufPNQPgR1SHaXZKse/GGenXRqLL6TAnTbWdHiKdENI75lYRiH/3dUkhFQsp2Wwj0fRARhGw0DxKaRgzdAAU16YV3Pg4AKKiMUEuBubzsmR9ZtgOrVxp0TNh8Pqw/DyBzirJsfvsagKmgmDtHDIHSYvkRRJBmWTjeww3YcqeI9HERQRA1v2auGfoVW56z7sJSqpjEWulPwvcGDv7ySIqkEyZRhFgi567CyBkG/J6BAAcBVBHGDqlWqJkiqdfrJEUOa2gWNV7Tveba1+ZuDpN9W+6O0XvlOUMSrpFSv4FMq6DILHdE9hhXaotai4JeCdOPQkmaRZAKJ6lRdePnurO8Ub4DRFOJHUszhXVbjVPK25CbiVvHZzd3ZqAGIMz3lMPXuAZzsUGUPtTJ5BGoK+Gub5iQNijmbft6cpRhhmvxMeC77+Bigodj6lgF2aMv04hVam2/owrlXTRKdiWzpV4mBX8PDAm/5AcUM/F1S42Np1eFPMLXQcjYvB87fACnO+z00u55uTpNn4Sf/fiZGWeZcXLWAGqV7nMaE/a7mWel7Jq68Kl+T6cI2rJKS9Fx2YWaUjTQaWO4mu/l7EwI+ytj3cVW65ouW9x6PpC/L3XPd4gR89XwUZDcpuXv8kUbmmY8HhF3m6zf9KYGJ9oiIfskeiI08ykLW05wWkYH67wFumd0AXWvPeVqu4YRy6gtSmOAFdPhcmvh8X0MF4hPiQiI8DNwHQIAlCgSvwJivFhdSPm/czvLtE4SWANBhLx3bMi/bV6TjkJkqQCXQj9vlU+lJExXzjLAtdFRoJxaWAtDcsGmFdh52KXkRTAgAzzeXLlxR8axwQQU6O/S+uPrg43t1TS6h8MqbrgwCvA/Ylk+h0ViUA7mklwBCXIs2xLjqAWNxfTt9sIRC0UYZqsIYevsAZ2MdLtLf774Hh8747I0n/QgzbwQscFusrxn87oHaQ5GoFshAbNmvE3xI6gGNb9mqT6bbYlCPBh+wk64jAiZU4ZyGO3ispVidsk2zj2LCxe9WI7kBMXrvbjxVeDUgMwmEUlJyYKWjM6jCy2c2ijyXnfMi5DewuanG6KByXT1MkDfhem1vxw3UY7X0tuq8vpwatZdEt5Qk30YSat5xprcoRFRzhA8pBZDFTuQePm4KttPMvlW3zSXFoHN8fpQnnIz/u9jZjLQqshrg9sbCp+P/u6tPmwJRTRvJ/mFCGKXbwfLWtmbkCaLk5DmuL/WmiQYVe69km/ue9H0aFkcx3GtEhfjdH+115DJxyEMg8mR970ZLletHhBA4bygLlq4+nt2L6Ro62XQEeOGm0tOluaLRbxYs+Vg68cmuGPv7ms+q6nz0n+6+E6HXcG5fKhzZIOiW1bl2sY3aA/mZ5/sPVkd3Alun8qN0bobhNqTU7BuYQgYamTQItkL74wfUSS6jgml24+lTaaydsZhbCea8B77NszmRXpQalHGxYxMhmXHuHPldcPeZo0/uvB0a8OWLeW9ysHMiIvX1DlAs05feBiUt8d9kvPNAi/QGFPYNor5bnyPLPf4T6foBkkEieRK8H3sNQheAOETDvZVYRBgIoDv92loYdIARkvGcLA9ojRMQwjVCERfk2+0baJgJo6ozEFeRZYpE+0xSHMTt5NLQTQeT5a+MzL7LxSVcmNjpzDF2xPszeVOM9lstPDE1bjHjd+XEJV6a77w/BoL0A6BOEioC8CDyVy5e7YwzqFfbFmBfuF1L4wFbqAypk2dnI8i+nB7h3bAe/149CUbQssqOyGbwYn+ZiE5c6pyPE5zOJBjM44yOluVr0hI5WALltOQ4wRSp+sr6eWHSV1w9zzPaY8UQMQRRooXu/dDsV63dAokCUeJGGTmkfAzinfNqSQbHYKX7npp4GPy/3eoffvLnD+Uv3/efd0JMfaNPdl0ndJ/lhJCAV6frKsiyP/LFVt/JlHaMTylf1yEbX+1X7TDOS73IPtWNMdTNiPkJ0V0Io4hY2rVgpR+0rY49g7dv2POwvNIHsSFhauMC1OrhRw1lI19FTWtnpmYn9n4ivDacxAK0BdGNda0gVy+XV9duugbtK9SM9YIg7nryue4vwJeT1jxnuYXC7+uC2NuHsvvqo+GdojzLPEN2ru7CcHZD13N/Mu9/ipbTmsBYyil3ujgelT85pVIUUCdcjAIHLhvH5X3t+7AUA9aZ4G8xD06kwBJcF6kGo4C1qGVHOj7JqW2MIJb8rMjnjB0Q8DgRD0i/sxQfbdOxfDiShN/E+kBIDp5J8lusmx+AyD7sNrpqjFaHj6GuqgnTM4IeNMpOLfh5O9udrHSvQTSWix96Yn9jWhNuORPgBIlW/BHogYkAhpuR9AXA1M7jeLzq20r5eaxlcEYqBqw/c+9A/2tBZC1o2FSy+hnq1wVEpXCBE3EU+ABArI+j9GbPfr28FxHFJmkH/XyUdqO4uBkxfmw9DKxCEMLSxD1m4qDxBgFaI09drstLhNEXEMKJZTsLLRRTipxTyRc+oHq7Hya9eceus+UboeZ9DstPfe/XjphKm7srmu/mW+W6d0sABC/lZKAxWuV0xKUNRSf3ubnW2sED20ecum3A11Nq8aPApHlwb8qT0xKoswis0nogeJoqn7Ru2u+KDCqziUB0KD1NKBkcFk28eahoe4JmuueCSO/C9NsFt125TvigN9haUUcFpt8LBZ5bKtek3MbiRqFv7JTmpucdYaYokmom0AdvoX1RCnCLeFflpUXGvSpKcQcdGaHncb6RjyGknmg2RMwFwTWs3eJ3TWUJAtloAN92O3R2AD3WlzBZutq3hOgsy4OrQr2KYoFypObGnm4GrxMWzZRdjzPe1pVyBu+wjFstFAdUWWvmQTj0MkLwInPovVteNR9Gof+gjtFeqV63gkDkKNtbJjcE0dhYpCBnFINDsLZZjCiwC5UdavG/zHQbAHjSiGuGAyHxBvN5x7IME6BSjabtifb8Ax5Q1n5tz4Ntu8Nau67bIwEPyDWh9dIf4oioAlNFt9VYidIj20AMLPeY0i8iR0uEXN0BtbTZH9I8MuJGhmBBzZ18CcuTziFiQN8nbGYo6AGXRNiWG8xBNCFEDSyG5kTnHGfd+fcuLQnkXLhVNXnFPgqCV2hgBr61Mh3OdwEPXDn4QCdqR7lbe07QP169adEFat9dcpQpPSx2B6r2jVslKQQjjoZ37b2lZefqdbqitdn4ldyUgJEG2khCUb31n2E3VIWx1xODv8iUfbrQw5SlhhZ8G2Wb/YBvedHWbbFqlXBVW5rU9lufWsdPrqAhdlEZBy8ORGpYQ6mojmdtGt0uhm1O882sl4ZQzeQB3ro/gO7wmeSBgNcT1szFGtG4vnZLIv6xC8u5vD+R1G2+tISkAVs6uy0NxefqFSZn9IleqyHH/Alm2dLhdzRY9Cf5NvATHI6191fAvnbnpd3X+soU4eKLSdeIGBzvc+aDJzZaDvq2t0fPUj/tIqSqx+AOjh/+HN1ZTvd2HNxi0D8kkqb+XwfOmbulCKcs4yFuweN1zP3AgyO7P/fa4SSRwdsUj6Wp77RF764iK1RQS3MPoUJafi4tY78eTXFIcWmtq8Pea/4LFtSh88JhbC63W2xE7uB79/2lHpU3YFn4kRg/Vx5O56jjcaFHPmsJlLB7ob0u6QeI3RMdnB0c7xFD0ByS2iDZQrBtFQQNClhzGQXBYFyWQRiDIsSFk0HX0VrG2dauDIHOleIvvzeuNJOs0l2Rjz0G9rl70sbtEA+ApmddkQrNAVutGMaq7gM4vErayTEroJ1m+V5OcOnm3ff/Bpjdj87McjjUjB+wDjD2kfrZIdlkVT3a0l87gqd1pNmeqVMXgUh1JrADWLOt0ALpR7PzyKtFdraHJsN68/JcOVPG5HzcX+v2DqBL700qY6XqEtyk68gC4K6oQTkFDbVbGExugMZLeUPen5w9hO4OhZD4eZc+I9PeTy2AZCI/G2W07jTi+Fy8oTYkDbeYX3DCqyd+5Sd9sZM//5Sv6LRf2em++Pl9to1/M57664/zPKrfPm5PX2/fdR7m/Qzch/seIfPIeVOSuehMux4SQNlc4Z5e5Db8PNPs4gT4QhTjKznXTOJOVTwBDvJ7G0vbScN3/43evhoKGv6FFsJyBz2bDV9zLaLsMgr4m9bUMsaFTHdTnZZDsPLPnPG45NZ18MeQJfQe4XbONRol42NCCDvGkxLJdroPqYh3AN49vtuSjlnR9R7e28lr/3h0enH4/cbzNu8P4K60CBeJShahGVrGzkBx0NSTrkAC0u2xKuz7s5eiYB9Os8Pd8dW95MEB9oZ6ytl3FI6YUzrB+B6et4MoHavfyXv8fFri3bTtpTFoIOlKqgKvuH0sCL/hrnv+O+pzp8btPsqAO7dobtr7jprcmy/OexTnJmFql80B20eFocAaevWZ2x4AeN/NUAdRd5rvjMkg5OeZmSIjA8rVQ+A2ZvQxAQurQ4zDKHVRGLHDV9U60y3xfIvggAiD+uEBEGzbAQdwt9oCOML3kNeaNKElvoPtTAQEWDNHQYcW2rwbA3B7FmR9iQF+R68+7o7GBA2A+XVI81dVgg+fNOOIVbRgFrn/tHcPhjpdAGJwGnW7AKpN0Mazn2VkjdYIu51KYMBLthLREdGVQ3K2hLLvYyyXaUBlNDYkTKC/SkrSDFcC/GzxMUWfYoEJchEp78GU+DYgkpXiVpL4X0EaOACP0F4JkOMCg26R1whQREbjxVCLp6AS0xIxQIJEJWYsvdhFyuwllTt72YulZO8qBm0sMC8BxHWHoeW+vz0EkdPW0WsHQ4lyT0unlVllLUAKAYIhh2M6pyxWrfUFseJV76TaZS4dRilr1yyEDjcFapb17CQNArkXxTeR2ixa9K2wUuJNpnEncgiEDdF53VZXX4spaexSsGuA4yBs+8m6Y3EEx20vlKCJD8PLe2VdiNJq5wo5BH58OO4gVNTBxAoba1reRdV7bfc0KSeYKElZJ9fccJ/FaQh84orX5SiFNyUGXf9g+Y/iPb/KJrwuAt/PAffFei5cCzFCrOE5LEISk5EmoWL+DkWp+hfwEm2J5Eey5BApe+ZCLLUpCUKHL/nJiulOrWt+X/xIgMO4lAf7GBwW2qQIoU61Hs5Iz9gaP4GPJ5XT8u1elY/l+AIkRdcV64EDOD0xH5+f3UuEpb0Ywcgivfv26PvAvQYtCX6MQ9Zq20TA1FQiEpC6KiOhH9TZF1Qdv/waB7jQ6nTBbr0GuFw9jWf1w3aVSVgStSgCqGFqHIB3UPWBZ3DxW8AGoz4OZFgsRQCE2lAMsFwrPXwJ4V3t7kYh4Dw10k7D9A6XpQ6kzszPal/erGa7JuQEdwQVVpcA2w3e1bV4DqNDbiqCAt+qrp3Tc6afqvItpZc8oPI8WyUs/LQ7aKivh23njNd39O/TO6HV5KtttW7VLzSJLZ7AQ20KXEFFq6WIQQ93jvdGF0jVwwyKqmbE9sbWmxtoJxLjsgDckm361x6vC8s1Kuw94DtFlSvqLnMZQtkGum7mcbPnDb99FQyjksGLheI5aFCKmWcpaDIwmsFlEXkGvhGf1Qpjf1jJkO5o/08+SofNGZv9vhHcoN2LilvHtU8Omhk6x2hfw820vBLWYEmLL7zLhNQaHDk2BUqPz0zYfLkIA8wGyvlBfdm1grSGi2aF3ikyvEdDSBs8VUdfq9JbR1Ipc54ronx+IvsFitXmtY3pobbnkR2vAFccYsQSHGh/S2EuVVhVcdZbqtkGXGZo5j6/vnKYLA/EwQtL12h4X+wbEwTMXipxErDCemYj81ngbUMLTXuT1UDp02Ll3xUIJms275NT7nJrg1i9OY3Toj0YkFn18huTZtsKvb7ZjuyAEa1b9S44iDiZXMkvNpbwrVdTHERWwoazZVsmgMgXl1WuN6aqT7xL30XMKWN3wZfSdZZXeMzO6BsgZ7UO+Fmt1P1vSmmsZVGaEZoOs7f8NE+I4mLKR5jimN3m4GXaM23npaaPzE0BzriPAYM65JTfDMEGkG191XIM6ISBQfuywerMs0AXVh2jwwgcJbMq2dekuUUg7YEkexAdIpGl+dizMgZcXZTkU2ZNC3Q6JSJfokia6hl8oL40KsHqLCWUbjk+qVE7Y1kGpkz5JKQhS8o2LQWDmTGz2h3xL+cJm4bV27aMWIAckqQeq9k9Altoh97ymE2ZKLclYsD+8gYqe1OyIp5gd29Pz9Pt6dtMCqJJ8p7M1lAQMVD0bTpxpz2Eg9RS1azetrAB7VPzZkPr31Roxj5Fe6Fuy1B2eGIo7WHQx0Xa2Ok9Svg1eD4IEaHzR87gPZLpOOX+X4fWmO7muAMN+A10IoFpWmdBy9Qt2z3KkkydOiF1MpZcp3vvHszhJkc3253Cpkr0Xue9ZXeJOcQ8biSKVk5jnS4dCnZP3lH8HVR8EN4OCuvsi5vUwgrVdFmHx2dgQpXEi5Da3GrVTBgnj8vIHPJNsUIbJdlej9TujFg+M7cuE6atW85kKeFJVlEMSXYZWdYh3D+xh377B6Mdn0Y0cCEZf/Qiwf3AMCi1oNGr3EMzRbilxejKe3bESUL9/C4ESgoCPRgcZvP6JMvLbXdXzdWUdm6MaDgcqoHJYna2WVAQUFY/UqjrnG2LBCNt4s1t9Vw+MW8HWz7Xa42E1yKXq9KcC56p1zUrvgMtz3gaD1lQV212M+xs9IXs4SFGcSIWYx2tZ/CF5hN/N3A/D+4R14CDfIxUa1qFjeqx1fleudbkXddFST6XVmp2w/YeSHIeP1GFWiS1n+odBn2edCDEBEmNmJhMM7bSi5RYaIdVVnSr3HAfk9wJOYh8n+3q8dMPY5LMx7MSdA15G20TUgmmUJQ15syvcWYHk8Ic8TNSy5+4a0HYjKRPSdIOHKFCdMqWVOEH795p8mLt36V5U4TFOg73ws7gbmagyadKMWu0Wv/2lxMf3xTz8vPM259hXsvpi+U2zRAW/k7NPPcXgrrTS2JY1RSIW9Pjtgahc8/gR/VBR0YHgbP9QYw9LJ/15btHTmywUJWiSplREi/TvWheJB1ZV981l2hn/7vncF9qAICni4gD4MeF3y715o9gEBINPkGSpl56r5sazFdkixHK2OUIH6xAs78RHCQNYfDMuBAFc+iDjuVyIdHnIcTYCOZIHLxi/x9qKEq6ZLTu6DAyIvkyqnN0fqyrFbvp/gNz0PMCql7DjhawEsqzCTse36SoAKYoNdq6bZ+WylDPzqMgbpf2r4dZsXFubVrqAH9VBNAS6f5qSmi1272J+IjwvpErkQsxz5FKGlZOj6dCrLgKSAxE+jPaw8Fh2pHM+jywsrOoodXIJ1GzHklW/hygNOkxkZ+/TPCZJGjElCpnwBO8E9Bn8DCADUtG4yptNBIvRbZ9pPhzAP1RQYPE+jwmzXHDfAgWHCe9vp6cgf3cfMuXIOewxNw/0sU9SotnWDKSfA/LLCnae98RdKNewP9v+wqH/vMceHgL7VcDxq8JTMClUTqG+KrM/yXh2ou9jNBZ2tqkICmXYVzNSCwVAHD/bA1C2OxYHiA6ZEsFg3wj0jOUIQCrcLEy7CAdqm4gvEUaS6bRVI2qT+TwBc8I33zyhknLDuItlz8LIitkjjKS1SGvkeJ5SBmzB2jnMLpbP+krczHlvViH10rbZsxoqwqYLmVaW03Sp0a8VhYbeA7UqrAc3QhdtSJpfAC+X1NedkAjk5c0vRCtymP7hlciJi8H+J4h5QKiKwiIa5HjaiJqRTOTO/avpN+DYrZZl2aLVO8PoASB7uMrwguS+lJhzdF/nKT4r7jP9Ubvjp8XXRsPCKthwzpxrpIQqaro1ginU/aohK5fwFGSPFFSFYWkV2Kv1lTdqnOgHIuOhUWEoRQCQCVMBtgo/YHwVR3PjkGLpXvmVAcrbSqc6vINzOPydHosqjP+O0U3kB8xAezBZf/1Z2tMr0SjG5UdVbUGNHLDOU8G1oQ2gPA0SiKy7YPN7CaA+6hft2qp3AZdR56iQ4JEPhd5Idp6v8fhz/iNMvNmjBFnyGdyArrU82+VwJTzjIrhRYsfbJ81gvQGMad8silcsAZOmn8PKLseRNRChhFLKxoJFUu33I/9WEqDF5CenukADdYU/uxwKR0grWrfIeVQmZ+Mdy4FQSxL5eFx7Ar/7Asy56t3GSUv0dHcJO5PXIVjQBcmT1NfGd7OspOME5hz/ILxZc7wbRFInTYuKG8dhqUDny2PXEmc9Axfh2/rGpiM0telhD3XqHaQ+qrSNdbGnRWwnSQCVDpoPSO5sHHJzyTUnvJNb7Q7kB0nPw44+JX8lmuR5/leRWqldT7Wes/lQ44B/kRr85R0JLbE7y4MwDa8warvhJbWSabkNb2e/OXx3VfOeetwK8rjX7A0/IsYip/Ah0ESR8CHeP7xoGLzPsz31n2S2mAQ3Xh69iuqWmDMOExvahgPHDSDaXGPEF7zYyUdVGBJALGXKjubqAJzEtvWoP6NKlqpfqN3KT5i/odM+DyaxCvIcYxugi+cCwp4OjsLziEg5pv5KW5/rKkWoPO7eioPR/2ALVPPGPXALPcZdn9N0OWx2qsBwIV6psV9UfgJvYdKJAASeDuwICwwQTzUxmfnB2V7SwZiK4d2LSyBlsPcuU14hKSKdn9Z80ww0rMRarmB6kos7tbI8NEJnkP6sk3jckSCLO3ZBeaKCy/D4W5xQGV/d7VXKJy3Mt/WAY4PfXqKMyNEbQc5VErfuFT6yAVUo9Q+cwHBfB2vpsL3jE9s9/3ZJdhh9G8AB6kFvQMZpcRDQKN11It7uQ6H1pjtm9P+MYMtACToEU0MXjjvCYvaS79S8Mg0Czg0/gyk3Mmn8RZXAixmTmzdHT3el7gD1Bw/+ZcsF3YefHJFIDrnjBkbBIPRIABycC//Ql4Jr42HcQqW4BP3B3AUo8eSsBAmQLqBqKPpE2yPZ+L0Q/c6W5jptrKYIsp7WxmmNy194UzytpNQM3m5NANzWs2nq1zUzGCbXz0fND6pOfOMSPSR9Kg88Wz9BVylx/a+KIJQuyTL4Jj0aC67Z0DydPDjruh2ih+BKpY+GXk5kgGj51uB1AHkx73CpyPffyDvD/lYEh/AIb18l9OtIG8eEs25A9/bz5hiSNx+tHgpvuZoJAsGFEz264NDvT80pXOeovFJFww6yp1wmq7FvjcwoZjBxe08rIcpbX8dQs8WeeKUb1fKTUF5wKd11skDNLwv6Drn+7JUQxi3bGYmhTwwQ8UoOVLGwsfOJoH8nwztPyWs5TEWniaWo+2X6U6IiW7dbP4efRvmff5oDlrygwIP0iFyuKPSVIdnn2tpGRjLGZjl4EdnomU9tjSwr5CpzHiMfJ5K0XLPIp95Fs9tJJC0VrdOmtKXT7ak7Db0+8xtDeVt2r+hr1QO1sw22To+ANzZ0O/1COQUML7/m4frpGqefAM1V2dxwDuAfW/JznWNaNDRezzuj0W1kahWvQ/9zV1N9Y9fD9z9dcC9/IRKePOw86Zh8WvAEtCukjbzedIk/H8NNr9+Oexi8a/ZPprP4ZD/P4U3v4T9Bd8FT46Y4clw8MvhBYvf652JIapTJKHhjPO+/JQI6FFLYwviOXAikkO+Xz0+zxRZYOF6Xfmc7rCbGbWJeEsvtJ+bv4a+WHovmpkHCkLYqi3p7DOnMCUU1jj/utG8rKpr9ODOoDh1eZDEuBcOTT3/RgLY1I1zNllPIybN79HRykqofMmNsnnWa4uyHi4QzwRqrDl0wwnzhdiVW6LakvmNDWTnfG6u/3TlGnoT1SrdZdV6gFtwyKfRmYYZ+j8ts4tqGiAPF702s6XdycO503RX4FxpLByhtU09qJPxOCDR7lXL4voAVp0wjwcx97qfRpz7wNpQR6iws3Qt32+i0+FzrXCveQBYE+rwSYSDZTpP1CjoXAigSclA+ULNIzSPxfXXBpJ2MpsxtD6weDxwKOXTbKh/u68flfL9pvTrRHobmNPdF3qn36YrpiMe7kpcOpkhrpznIHXiJjpzpM8hr81ziAXWrxqPrtOwTpIbsPw2Lg+uW05YfxNI9yaQ328g8myM7MaueO7d+uwiz2zxJru/22Iild4bSQ3LweAsCUUxW4aVj9/yLN2jKIyej3ZNyee2XDZ132/emLLCwSuZXQFdNrVq7gIMfKq4f81A07I5b2f60OxXR+mvG+V+TbTv59HOrxctfm20fBNo9SvR+lNoV1G0ao23LR9U8Gmev738G9npeaqvAHUslYuVS3BRJg7gWSnz3nRqPavTyo2N+zV2bmFB43FaOLNtlJs+Yc+JVr5Rtq0OwTjqDYlENkn+kYlQXfjjU69Cn5KoavzVxG2skRCXB9JI697lXc4NdQk8x41rr1MQSH8Ax8p6lQfD0ikW2qHN/V66Tmcj9wpra78891SwyK4ECxH4c40RZxSfbwbOGBHeQWUPNaiLOi5ZClQxxOeV9ZAxuThdMlW+OCF46hn3K4LlU/iZQaC2xt/3XWlDn8LveUXVZQsZak5lSxqCAdW4gGfiR28g6sKDrin4AF5zpBiaN4nf5u8lyacn/0o9b3Nc2aowNCjqRax+ICwkTFkLDTtUSRpialsg7tHAU2iatzJBhc+GszxYV3WnROHzjzxDKUzy8ojdd4j2KvlgVCi3q2DllcfkX0KSfwki/5JX/iUhIgkGipclIsjKdrqn6/VIGGXrw6ExxI8I4GOVnt27nKJu1ep2X2PpLPcVFhzETI6O6UQxoJ1Jyzw/mrdBWAgtUyt7U4cmz3kpO5xM2/W71VgLNOZ8qGLBwiXs4oosLdq16PgF+s5N/RAfk7lK5n/O9mVZI1cQPdSAxxvZlOzh8lu27vZTtUvMhGEhtA4D55MbE9sPLd+TAr+pOcHCJatUzoc5+vLeQG6ZZJPlTCO4V7Dxg9Muxp/Ghr6Gvm8nqDTnaYpKc6sCbyqg4UA9uxKYO3cKfJ926Fg9oWSw8+tvT5pYnDxTEgXY6zFJ6jRFd6oWWGBZg1MMyFtU3tDpKewvJ/RN80AbpO3ekpz4JKf9daP3tNEHodQA658Qjn01f3dJRqM80XgDiZeVvGPXpJEdUS4DzoWt3NLCS9U5sKTax3NxM8spt1athdwh4yT+FaN8KiZY5TkncILWHNBNTnv6GkkEUWsT4KtWVisCeZMOCssctoLo8Aykr3tedw3vbbex90bsp9jmTskuSolN4cM/ykxn7T8EriD6cSQvlvQxIdRl+rHLdHUXCNY+QE+/x0oIgpxvBCcE9Jy3EjRiXDV8kXsbpc9ZUWAiLTSrfBwlNxuuf3ugWXWp2JFt0iaKjCIZPLpdwidw8cpgxgLvJA9eOZ3cOpNO0aF0D5KsqVT+DJG1s+pmB3H+SloDv+uluCwxFV2A3WsOJh5gB14cia9arOQQZmAXgDN8z6WoQtnvJKqTRay1hK1VWIfhgr8uhz751l2ZVxAdekaQY9WnVNRb0E06ti364SsZMPLE+2QBrmm4+Ol3XBpNXS2rIa0w03C61bcTPmdFkE8IuXUn/tZLy4iZVYXa/Ece55gBnaBoiNpsWtia2BS/8Rao1czrKIXMFFj/4w6ejpPmlH+Esajjs5WaEwcEV0PYy+al4pCijMJNEiJkTv4pVqM8Xv667riiTv/rKr9SL9/FantnJIpV3E4niQ0wIXjukcTNJGh/QW5zrJCgZIXPUMp8JKA2u6Z1wwP9fabn4HsBCCtsUaz3uk3yf5WIyKoBwXXsbKiUdocHneUgO9EtD2WzHk6B5afsJLd0sXc0dD5BlVJeLKYMwH44JFYgvKaPWvYQGwPLURIDSkwlzJdoRHh4X/grxZPlXAj0YvKPKnjaB3fYTbVSf5awl9HNgJ3bgzPymYlX8aiMDg8X3kgEhZyFuxg5WYcGr1Gc+tPI/mmkbrt+NcphtHYtrUpUHnxt+wHPhu2M9eKHu6/1DRNMeU0fEjw8fOOoDdFoeoLy0bLZsBrXDNaQRenFIelJn/cly+9UUD5wfdPjx+khZP8+qeY5gahTGiDXdj2ChftQt1+W74SwvP8LT9RsB/ijOnYDzDZpSZSUu6jefV/Z95Ts1AGsHqHno8Zvr2K5AGr6hkZdZgjJ1wyD9SkFzSocNAq/Bwvxv/HBilEWlIzUysXSOih080bhysB8NfawR7cfkM2q7PxlMV4saegd0rWevZsPHp8n+WqEfeiBWXMInIbj3JMUavH7Y8UtuzAGo5R++8qOIzBNKQ5i7o0upFaYZ9nCAa4aYDIO6f/kWLzgFYa1cjqpCUYNr/FLZVzL588WCZaLmnp0VbHMC0ALdGgJX1NpZdZ8BNmHHqpKp1yCV4VbTjT0AN2t1t2nucORvhzMPbm65x18XDPy4x4bY3GWVR82Q6frwDVYfeltSA9YwBuHn2RxcJ2uq6RcrnF1ydY5RLR6DdGisgYqVun+tgnR/+iX8ee9ZCmKF9lhVRdu11Zqz/xlPXknyt15MnL7uU0Z+RQrpiimzyJLdcYAnrwK5aXV6rgfkJB6hMmDWGQzMTVEdc2ficTcX4XFFxC13krKsCZDKwqEPV1o30S7No7s+0seE+aC0JTiTI8o2gAlKkJ3933k5ZUum56BDBjwb20WXOW54WULn9jq/9i0GI85ucEdZ6OoUFk3/5UHNXeY/95zrQGjtHtzGt1/+AArydQy3JxEe6vUMDscufUaXcIPhy8UsLAI5IwJyMjOffCgwCZdPtxwa3GmSIyQbDgzTU9m8cZBaPCa5FnWGJ532hhoJWMc/60z3YcUxw63Wye3kwgSNOwacRQrga9JHcDQCuh7LGBqadrKcUC5pSfjfo7dGMC9K9YZtHb4nmnAsIQdcYOb7l574N2d0xdqxh/NU0JPyxxSMxkFaCoi2/3P78r6OQT47hbMgqwdZLtObl3EGxwZt4gkp78vQpLZpUT5Z7Gwfn+3+ptUOy/v62Xc8cNKoELloB+HZGxR0vVJkhnJEXOxLwhC6hWx6it36Q97xW8dIe737RV2d+DvNrXL250HV934ksm80Fhsi2yu9g0tKPDSV3x8DZAgUUsnPdXoLHcUUCEHjKeleE1a2RC47CGYQuw+cG8EN1cpgIUqIqxz7HNAgMSWeD2THxGJ+mV5O0mooOA4vVdW7ncC8Hy/ruPzj9mVCPXpGbt6bUw9qtzNALZhdMkBS33aGdizoYx4LFoDtiYXHrUjb8EcT74zb38tT1CfMmvRV2fi9jRbz/aXOS5Q9Czka/ihCCkTEuREe1XqZ67r9tnfbdgsQP/+9PaRtvmvJsZBDoz6QzrXuM0rirW0iIIxXlonosIjb+jlUkADXcf98SVyxhMshogDOVO0Agnw0vqJYj5Aus9csRUw0oYjeaxX6G1uj7mnVimrOD+r56DU+PZC3dq3D8hm8pZ3lsOkmIBtQku58GxeuPn/WKoHzpRPtWGG1g6pJLEp4LHFXhRwobY1RpxDc0lwqfnJaab7AxSwb6zUnTNQAcINRbbabt8Q3boXj4GVZHI1/3gQxsc0w3XNXuVHgZq31KjiKZlSwGkHwEYoXNdj2tcJfERlzo1yrU/dUQy7S6R4IJFL3U937LaOvMoIupFYYdoGguH1Dr1PkWkVgnvfp9q/nCm9bt4/HRJ65YcP6LeTacRCBpQS7hqcUtcoe02V/aKQxFNF/GTnUl9ANjnaN7b4nrokoslTa1zQXVl7AX3lvoFLwHc0PhISF0MDmIghak+aEXmHxIEUoOuWS1y6ypX2U337ymvsIJ1HIxAgA2VpJoDP75zG/c6ALfty3XbxnI96BC8mETGAX2hjTRLL/fh+/7xC1ZFUVT6Fhccdrl4VoMOBmoKUzZ1KV+J2wfVLSLhya5aG/+xqCB2fcSBlypau+J/1ltl5AqoaoEXD2H7lJAF1CLhptWMUVfst1Rmwu5O0cusF8bRrGG+RG72XEsFtJ3ITqSicpVf2/fHivenrOwAqn+kNod+6C4HpO4G7W2DOfEUG84GgPvNmfXDzQP6D9Y60nIpoTybm5w+5PYB/tbx3Wj0FlBhNXt3EuZD/zN77lHoyP90udVjpRkQFadk6raiR/Dxzu1UfYQNS/oA6i8p32t3YeP1jlVxu+vBc+qbd4LAcfZbg61/BO3cPWWRjiQyQ3t6/CcwUm3vkL/X5wPJAHP9Gdkwubr5Vtr3trEc/IUlEKjlgeemGeUIeH9jHg4i4e21vF7DdJriJIK6TeqI9zcI/ZLCjEi+folDnyncBgOoaTeZQxfUZsL0/Qzn3NDxCwu872rXbTl8A7Q3P6cgmYMG/r3CVEx0AGdm9FNz9shyxDw30ZOcMUeY76pMpL7cB2b09XE3d3iKE3+H7Ir6OXeyFWFe0AnYPew64RwHpFIlSz5xAzZyxBDKJohBg1ogVT0fEr7EErer+yWMl3wiv7siV4m/jgFNkFHf1HFaP8kHvuObiCUP9Tchs1kociFrJn0jdMoiLdRgq/K7WKdjwcZGctjhcsUHWrcyi/P0s0R7IIPqInnRcD6ou8k4Hwazss7NFaVs6tKjXRibC6/JhH/Vlm5r6LS6vQAx7WezwUPA/46OLQoBlwUvd/PTL9Hz88Uqg3lzBeDHTBGBa7B+MyXYGHMWfy62pBrFkg/XrcWsj/R8tYxCDD7zFWN7AZprFXeh4izh1/e668Fy7ZOASbASn60xedk+HZC+epSiW5FvlviR8lpyqHiRZiKyrZKhvqEEiPOMfI/P7QV7+pkt0sPFrzI+h7MDuKn3rvNS8wZSes5tyrrIB4L/iRTEhNKCSq3LlcTt/tQ6LsBqe5Zf/xrg25pXYq12Wn3FSb8WY9i+iebR9bm2O4FsWdpUBfE0+/UJmnwmgmXAzCm1Vkf8egKeP427AudJWyisPPZ8kdLn/tnOHbiIt0Y3XguwkxrTCLY+4HnRT/wdd1Gpb7eg55c0w73gudfzn3yox4jjAtSkt9HwNSGF7hZgAOQF3FkBJ3YRT5g1PImEkYaSXTmNNVMxf2DsIbhqo7CmyBOZJJmQmYHtaHXqf9GK9h3pALm7i3nt9+rR/LZKkIetVgqbeffVyRv6lu+c3uYlweQgl92OsI4aXURDMqRjT5BeKkwUcActNPeeuOujEUuUo1TSyOhRy7grzUjUV/yt6572phhLkevolmZNUrlsGldUloAjt1B5gi7vZZVEE9kxSykZ9/uy+9wSYOhYTiHvHtpwS2AVEU626BW7EvBstnHnmGfvnhOOEj5VllMQKoGxgBW9V5ANt/P31HVATbt1O3jejfHf2JfSylD2DuykNAHIk4FIStg7ArLxAZ9IWMDYUnv2tlih+5PGGtVXfLRGIiVYAGaUvncizoK5wz2ZJ9JX7C2nMxEzc9nfeO1eWuJHIEo2XA4aaW5NCK1R2qwhHVfKVx3Xq9xAx6cxbya5GFmJRwkxuuIygkUVHm5zC/Uatd4Gqm2SFBWpjS3h9UdLeCfOvBKsmtcf1KIwsVQCyngKVNXwl0wjt124Xx0dq7qnrFKDua1ai2VogSF3BSzYvIlojFp1MfaFFOrywWaXCx3GFIazHDZQlvELLajwpMPTD96D/P1xqbPwhiGeC40AAF71NEwDzMmEIxENFz1kQWEIjtWdGwgxdKU3iQfCr+/CJfcTh5mYuYZHqpP/JfZy9QfQMgwZXEvE0pIGVhyFYNRSbxCRkI6V7PoEYovs5PfBMFloXm36IpZipnJRGJj9IkRhGkdwt2VipRzpOu49HhzGo8DfN1x5QuhLdVR6uLY7qKZkwFPfPWC3FMU3VT6OcNWV7Ykeq86ZnMDrBOgBcfLthFIfNDTGMZUnlV0w7SblolK0EOpa7TceOgE1cy1uoX6pft0iVQMJmiIE68V1b7i8lrI4cvfJR79bCDp7H37rppls8vIpX8AIQMZPLGsgAlDTLB4gaO8UpayYvIIiZSln/q5YQeexupj1XrOkLPubNJOcCOv8o1GjXQvJPou5j8I7q6R8l9tu+ettxVO4BiHlxKVTWtA8pgLzf5l/C8c1abAsitJ29O0S+n3hN8ootlCMArUfp0FfyBeDITYuQTdmRWyoTUA4q8d1T6CkL9Q/m/M3dm1oAE9QGRozPWHapgHD8e485OJ4m4qJqLQlhdaPESlKSG0MUTR4af1fugZm3gAIsMbRskSVAUiNvHNBXPYWJpAez0j1m7x3/JLtnmyktOyJiaa140VJpCI3rJHzKWmb0wgGx6oIUEHca3tNnZUfv6DxGycXSzBG3T+EA4ilXcNBUiDKKEAu89VzKXxZl7T6vsPBsydjpzoRDbhXZkpDzBtHyg+EFQbwdDySfLcBjdItp56ng0BXNrwJJfdtjnQ0MWwa1K/MumTGh9eyqLc8LLrkDuqa1OeEv6H3QsBnS9iNJW7X0XUecQdiq5WJddLSA5NUpWtT32/YZFbx9Y80/Ea/e6Y5p8+E99ycGv+cLWUqkrXnJf2ZmyBuv8X/Au7a+BkT3bEju8AF9BwPZFW0FyIxm7Z/P9AjIDys/S0N0PrmD4J+0gZxted4u5v26lxrZj1Ty3iA+mdX4LmeZGKA189YFwLwsOrI6rHInqLWKBDWg3c0rX7yz6FmhdHPzSMJnKj6K9AjyGyqfifaR1EfSPaLfQz1vZDyy+ZlYn4H9aM4bex/BfSTfo+U9PHr0+CG5/4O5/HU38wjB5yC8mzw8+xmld/c9ws4jL+6uzrp+oEGHaZxYQDtrB1bpU4s5iVXvBHjbpIsA5IUaADXl9ryY0FLMIM2no3RBFR/TvI36CoC8AqzWVFTWpUAZPPBwm0BMRM1326kvBb6zgTsqbwz2kcOrYynj0hncFgBYrwmUY+ypGsUhFi+skv9DJ/UVnANQRWlOuP6e7v6zl/7uBnaYonGwMHNK9HlTO0W+JB4o8B/NH2gllGPBI/ut5A58eLPESErQtOjNQ9EdBrIBmd3jPKtKJV8s/MXHEHTEaEH8xEysK/BhjygF1CGrIJYrIajobCgc5C097zOqFSo/b2cGRqgKABGq2xTorCKO3kSyNvjOBGqBwrv3CkRUkx8KjIBUukHnI/6aiQe1uaigbjUhvZkbLcU8Roqj/4IJ/8ibK+7+t/eIeFR28e2n3xfwXvxVg8oEpVNS8Q9A2psJbQDRIcNe+1eQ2derQ+Vm0V2fwAMQmBKHXLnVGth/3QhPvolW3dDHjuIJKiAsiYgCwt/WylSeYYnpjsQCAqC6/UgtbupnFvPKIsgNiyqMk/Yd+mPJcD/o8utrvtw2eYMY1fuAX7LaexcY3bx3gpt0XzM1y2x7YAZewX7qCLBGajbCDqQ2CPK6yv66f0LIA8cgGhsSy2n6jJZERNkoA9TCLEUwkyGA1oKmXiDEnePXnMDvtEcGA3v2RwRu1QCCD4TQ1ZF7dfG9sDAyLtdVljCyzxH4NQ/A1/ghQT2f9YjF+ZgFIZeGlyMHIjLYe0XIvdYm13E7NQuYaSuU6ABao1ojXhxMTmjUD2c+4TigvsbPimyMgB8LFrn+D3tZdAL5ZaiMrgFfxdhAaUJXyb07H9ip7nH41I4o4BbDIwfCFtdGf9v3NCBb1XQYk25cSwSrb58zbADE3X1wPkFOGsOwTwYAF0C1AnIyaqDqSiIqjl3fYHM8QSKdtO6onMhFViybydYQD4/PIwBJKdv5m09uuJ/lClv2hhEp8O2URceHB+lIuQHkKIRPRd4jbeu9fuWiA4CdpSZ41owiJ9I2UVkYeAhk9yovmA/5uPLlntg2nb26qC7eP3Nq4uS2W+kJXX1YVqwpzl4xgQ64qxK4ev7dq3QdubVOi897oVdifK6iDpVjpzMjDMHICixmZ3fWlbVGsMcIZGlQjIhaYwmqK5uLM9xJrJ3D5TuDGl2Eom4Az6Yz+lAE6PEtqJvR9SeXb/DDbMjgHHhh/cu+eXniODEjvPvYK0Gcsl8gWPOCIbhaAP1o83S8BN2q2eq2IgC6CLGdmXf6oLgfkeu1a8RcIiPyfiZ8EL5WowfsjVmSwAMzc89oYicXk3h4W6D5EP3bI38nLJHybWLKNgxaCczJRU7+Urn86kyYrEvuNFfoJpw8MSrEeJqTBa6lOQe++vGL6brxq5B6EIFrb6OkpEQYVFXgvcN00D2Has9kKE/76aAv9S8ycwQjOA7s1ZCXDOTHnv+Ovvl81G+zjisPUFkxE9fSxGtHFwhWg5YZMgF6j+UADa+FJH2YUoLwhVU8vpNKsUoMbQOaFb5w/j1W21i2ggy0m7oRYcgWfvnWj1dTI+yFS+xWQaT+KBlI3dSzyLvsecaPpdrtYviwdyZ2osQrh13zjuFYDMmftSYGAC1t2f+yCc4Zy5oRwT9y7f6S6jK1Lz46lJ2O0hWvUZWDwVAmk7KVkfpOEgbV2lQwqGJq/hFYrPPQraTjF+64U1kiyrfehEyC6yhQQ5/7brcDrvHery9r3GIZQJRPuoc/6EDjwbYd+OH59jZ6wVmPAw=="; + const encoded = "W6pBNQppWueN6WxEbedo24QS/B81phpl24cW5XYYMk/17zlKvR03xkCDV9vzYgd+4lepQmUaOiIaTFSB6DrV+NAtrAWzzhiT/Se1d6iFsWBeYx1gGyPMHhHDpqO6eumjcehfW3vmT7Ov+vTzr6MrZRjbegFEJOGsN1l0ukJED4axsouzBiyWD2NswEK0eed1g6Fq1HxVv6r+iirE9ocN3pDsSyVJSFw9gyPcDCTL/36u/K63/EXHpRAB5zGwV4eucY1H+EAu0NFC5U+4kjC+Wq9hgmrW+r36al/1W3Sxdt+npCTbYSxFjEh7P92QuCLnCORFMAM5WHDiVP7CnZIw/z9dvrErwfp4RquNteYq2KX8RbUOSptwV3nuezPKzqwMUlD6KDsArP1AVQCoqdn/vi/TyqxXP9x/OECPSEYUk8lSzravzcbhALNJRmgoijmSrNxshXfOe9cEh7tbEZMZgYgwEynSLCXVpMwaxnfve9/9+xBBx0AlgAipSEo1KGtUz9m9rapeLBa93AAgyyzYo7JHWS3b//LVPlPM4LIfa4nF7Mr4LGi896ji55cNFYXsc27fKo1BSXRVn+SMnI92877dmF8AyADEcmtcJPlQQRAqDo31ea75/KztjGNR/1+UQepQL23ZYrTnoXvYsnrOzC49nhWI2pgQwGo0hcf2Uxdez/mZvATU1gH2va9VPU/1hqsw/XdjwMpWAoF6N1tVDZU9G7F5/qaRZOMLYwyJL6mWvW9V667pvbukkvxdWRK8jTEGIVHz2Lv/f9G78XmGOVRAZeHiLWZqjZO0M2vH8W9rADxFURTFE0QXU61Om7nmxONnBIDsotTZQPyV0vqj5ZtOYRaRVfd+54dgNweLopML/zNm0/1+5DojnUc5KvJTh+KE2n+LT1U99KUzWNVs076y4LW8fpBgXzLRGafWb/NkQQjP7Uv/+KW/hV8ZfbjdqMQ+TwK779Xip+IaJUodKX7MFTWfUgXiZpvlPlB8iyL0ODMsWQhnqo7SiRt7rbe6nDvD8NSeiweP3qPUUotzbCKtPB1sVTPSEDlh72lG/mu4xDgkTMXFNH6W16/5SKjXOh0qFI0ezXIOcrvUFl+LlH1zKu445dv4uf8dr5za+SjN8/OI+kSyVT4faeMpgVncWimJKnOGpxM56oyha6dQFhi2kLKLgv7pPdW7///rtVg6E6hlkMoFC9gC8zx0xVplykpqGuTaMzpOymN3AM5x81tvinwEvrBUbGyf175CeXUuI02RCdWQRepmBxQzuFBb8dT7nvrEB1p7oO2Zyee8DgSEGHeDytnsjifPHssXZERJ56k9Trj8P9aYiUeonppIYfnQpfNiSEQijWJGIDExmD8fQ9NSzy8sWOgdFAWwp2pw1VAYb2dXgmwryEzrYg081v7TSsIitetnb4XBUsZke0CR0W9LaRvNKiCZn0bjCNNSx0hW4A2OzvTRGhjEjk6vVDYTKsgrIyGoKCymKAK6I3WMKh5TfBPOa1PYFJiONHwRk6bShWSaphTZRVmih8EMC1s732p8NqWHmleXhd+BToHshyTVJfN8cBercM+0OwFyIIQJ09oMnHyqTlTgDGuSE+AiLjKxjFXybEtrqFVrpW5DYOmRuErv/15jdescUQFjgI5el6zSMFX99iO8HWgcZqSIFBh39Qbu8xTlK0AkUgFhk5qd22HPhlep0jur+HTBRkm+bE+ech+p2OkchakYmYUC1QKRkPxVII6IWxhijxwpoLg4rcdcJCk4IEszLOC6haHj+5HDm8G9mqlt1AYUZRJrrGFh8fWKXUdM6cWXtuZhcQrBJ7q53nlahG1DkkrYhW0UWbTy9tBl1eRmbb+cQsr4SDSLbBOywmjj64OY4pMi8dI7eA8+MfhiHekSVAfjjBC5ysVF3JHy1R4ukcpXjougSE9ulxVArZBiFbHeoVJkcqnbO1bstjuuYoHIzGKUjdYG75+Mzt7WWroUUEtK0iTBhEU6IZURFf2/F3zhOop+TIDd9keQnf01pZW+rfBd1y2g/nZSwU+JIYNRWInSE4kd0soJGV5e4v2EcCGIGzTeQeb3dL2IT7RosNGqjrGrN8aaIFTYuQE1tzIcfi9mUWvgvvnOvZH51uApFKvkNreE7BERejmuSd5+mjV7U3+QgquL9d7IqlvvaQzKPaS+z6Kwgnw4ncJCiQqauH7mKftTfhaSy6Ca6vZpjuqiXLkqYNlhjibuzmrYbmJI2WqGahupXILYEtYZ8OpugnW0yYoAG5crYJdMqypILP64PlzRxBmea2Ng0WzbtyqK1DT8gGGzA2Ommwq/fLUMeuSOXh+u9jW+2Bn2yxyFYFNV0vZbAYUbdDzLwXC+BOaXDc/b6UYR7UyXYFF+qEWbLlQoCJ6wlSYZ8FLMuyNLE+UJoRrJViyYQGw/EInWVuEOTEF6himV8oDjflw9a2cgWZBkkIP7YuuVTMYC9jEsYxyzJD/23EQ2vMYE5FTQIyRCShU6OQOlDssXfa1nUYhV+hpz2rZX9X3sssVlFQ9oEo0AGTeJF9CB7hUp2swZez5WpO18KY92sik2/qu6dfpjj+9rqOpcm6rPtbFxqKNwehmmyJIUcHTgwsooLGMQ451AEF1s31OHf/Yl0PTl3TXFGkz9FumE9MrBmWuwa/F0PCS60f4Ci4cxXpAovOFCJ4MkJmsrXZLS0eBQGAAyLnZOsHhulaLJRmrcOSJbxiS9s74KMMmupC/lpNzy1QedxfYRU4a5dIlEdyfJVxS/Z5pktrfpDmRMckhidqtoLz9JsiddasGQTbRs4TB+T1RYvo4bHhioKa2DWwkwTR+NHhYvS6nk5vCKj/wvduXSNYuHORIOLG1cPLWvVrc+9hRwLhHZC/mZyJNBTN496tKl4fbUm44gh2WNuq+mGIIqFxWru23uHmIZnmX1uKfJxoP+qrIYVsK1se+Wuw1tmu2lDORsoht34hT+L9Dx108j5TgeEORhci6QkFWg4hd6dELxb/83h3uEp614G3jQUtQ4GAs4mWG+3V225nTWJa6bsq6us2IMZ8ml/cLUe5G2sYP1LQXTa4AI1Un4m6kyCov0LqGnWY9DftYUCVsGOEo7kFuo/ZMsImeCbjldKmFNd88EiFr2yhhp51SZPjh2NXOXF3aH7kTRCSpujI+SEsKXw8KwclxFA85FS9cZh5JzFer7gVdvLtJyDHQshXOnmHMDKGCKhb8RaJw/JP3PfYbAkRceyy7Xcf2QJabcRxPw6VPZahBbXCWs8w5/XQ8t1PinAO/HoUYhLMNUTV+v/Iui9y3jmyDqAx1UoyhWAkG814TMYAEmJq2cxsHXDl0stdfQ+HWJzTfS2mxVa28ydfkp37tE7/gd98iTqYXV7yLnYCAILs4TFgEO/nrg7Ig87vNii43XbUS4bfXFkCWuEtH44qEOzlWTvkk0i9dK7eTfo7PA3KQWDn/qt+xTlXm1A5c8QXj71w856i2BE/A4t8YiUUrseKxVgXFwlMVO/Eswv9B4AtCxd6wcYBbj6jd71F9N7b+/m79rp2Ve5OY9XDMtn8qB9ZbZJmfEdkC4tarHaZh9efeNu+paq2GdFtthTdB8H8Nql37iITFZEBnBeysdP71TNN7Fep9ybwXyPJYjtOG74kh6/laL//xB3+idv31kMfU3jnCgHSvGIplgkfzYG38DwCJ1QEG5Y5kCK8YR6tr354PvTM7XOnTU4IKJN/eMHHyrUUEqpog3sK1zai+T0xo6fXPQ5Uqhe6kke2jK5MFWnIj3RGYzXBKiapoR2mbl6d6+x/3BGGKlO/623Lusz72ql0m6lENMSyJJazcAZzrBpGGcMruK06ZZ5VeK3mSAL1hveV454cScGUC/LgElWu2hh5Ggi3cGZhQ5kmf9AtCGFpq2Era/+aersTLmznyEYGsmFh4atouCMfzG3FCHLLvYyvxLzL4EDtIGIYGCGdX0DNHuPdMUmHAFaG4l9mY6D0AkkEoJGtr84YbB7rzBoxHWOvth7mBqA8nKHbd00GIK1C4g23c8wyhOsYJ1D2wNStB7CJeZZgP8UzLedp6VHacHAa2D6w544y1gEm+0TjQ2XLbTpH2Vdd7gsCl7u7zUMp5Cvr3tF+hnICp1S19aSOCv32htlsdVfriq/a0LVV7snGCViKgRl6m7VHfQdzB3542pJEEKphfDIF/VBA6hg5TtGfMxv9/hSsY/r4gDlMPRTyyf4lDlrr+KdSel3v1EXWqY3rYLU448uIQQtgc+yhz+HXUPuLHNsO/+pn+kaJd/ObsgIZOXjEyC3avqSlHuHYDKp/51ZThG5duNiRwwkpn5euMKBTHrlnt4kkQeCH47Kx///94AlSOewk6PK/h8Jz1trFMb807H1YFwoqGgTYZWpNbrhr3xLZqTynR3njr03TnKq48/BvaON3e8lVIh3Utye3fPv8gfZzO0ewG6US/ydOcriPv7mY4WntnkhrPrrOBbCy5wk+zranni4Xqz0ypbbwlSPF4azMGboOxQ3B9zn2ZHQXSgJrUA0H4SYlYZLwfkkOXiDnciQ+7RlO/FBPkiB28aM+rurBkvTRSUpPYYq+aJFBGkEQhhEuLZxF9o4e41odn7Lv2kSSSoe7WG6evS1EG7LEBNvf1I00gK74E7vMwNgFqxUw3Y1km27wfVFY4liRysAUWEmzHKZpbzxwweW52wHYlavW/bd16a0tuAa/3mRd5ijVdOzVOeU3f79X4M1SvlyPbnzV6sS0X8D5b3dnos1H3XLu1vY3hLDf/YWGjebLppaJ5KqxQjKaOmMZ8CTw5G2hgo/4npj7fXLbsFP4JH1dVuBnDBKXsD6RcOm/ZSiFhl+UJ7tF6V6KCtWIV+2lWBe+n2j+7tNU/lcNBy9OFerZUDpeyTGGmdr3uBm5CFphf/hyb32zw+7XzTCs1v0R20EQa7Deq1O7wZ1ptp+9IfY6Zf74Ne42ZmtC5XPGS0eP9GVtcONT3F024aI37TXtggimSuA3aHdCKJb7XfoZBMLkgbRaoB+2Xa8cEAK1w7bVtL9+7p0I6xaavw2w/7lYCse/hDXxSLWm1PvaIQANgVolSd15Tt++jyKplMT7wmB+1h5ebFjUSFnESzTqjd8U2ZyHaHbUUdW3MFUegTIxneJ1C1+I29XFGWTRzNpdLsqpRA2j/1gtKUtpan6ITMwHp5ac465bszGqCO44jduNjD3vx0GesgPx3xC5nt6WQLt2JoXeQeWF541HeNBSECVvYfKGaIMBZ/B7qTAnsKZzDq2+U9cmprL9v8erH1ZZXeFK5BzvgcZ6MBXwqcknUhFP0Hha+x5DKIabDiOSqFAqyEcw6ng77vzZA5XEmJSS+pKITNTkZ0j80aG2ktdRSNvIsNDP2X57J3biJLX5yrTs0r/XCqUl2KFmALF2EctDi/dEJAu57W+ii1q4NDOHUAb4gbuz/9lXkheLa9DJnXRxqGpkFm8aatFdsddNwjGuISDadCVvr62Y6tPT7uGeE/ypXCbYMLHpVTEGuNt6tzSrWC+yzzbrmKhFZAQi/fTHMrFI0Vdbrur4ZcSYLe2t0jNrLDeY1vLBla8+Lrjn65inawL+ecU35Rv1BllJ2IB5LSnbY7Be1IEwmmNFgbuQ7MDhVfT9M1WFJ5/T2axKVG3AMODTkw9T6lmO2X4Ff3DoZScHQyFDAuecKrNwN5ddlGhZZr0DvO0noIy6mMkDrcU9WJ4hRYb/ZBa3bm6MHN29Cke9ABXYEa2eZ0d7v1XqE78A1FY0vBXPstKraJQwDkxewYuJZsX3pG8CNo74ZGa2jJDo5r7Ku8R/KhFR/kBgbiHJwQVgLPft7yr5AEBnO1j9lD1LDJwT7SOqjYjlJBA6oT6aLLBZLOh715sGjZJbiyRHcsgbqDDoqucisbgejwy5fRkf2UDkmOUxz8JorSMvHurPAqABZC5KsDzupa72r4Ha2RRATIBD+iPWm+OsI6osacnlJZe8qyCk3wjqC3YnC5b+dAtBiXZdjq9t1z9nWf7oIZHk06aBlZfgpYMuf8Us51682uyPkNA3bHFhJetl8Eit8lIX+yz2IvmanRwfbM0P90CO7sPR0gRIWs/niVMdbR5PfL3aJJ/6VT2l0oE17xmpe4i85VViIqOBhmfo6LJJlgV1uA5fi91vlF0YlLyz3NwLOUDyHeTbvZcOmUALwUv7XHaRaI3mW+ju7uVD24S2xlRMaR6PFJxaj7f9yfBFifJnt+gcBPrf250FLwLEx6+ef5ActFl788pr+rJ4PMyPaSxL1L8aP6wfzaHZFoe7swkrUGy1UcoLWy5Cd1VcsmPGo+TI/DmeoiugvWdg57hy2AV0BqQkQi9gCU3VswHZQ1gbxlgO2YeEkCMEur0wmvborE1/DdzYB1ZEEg7bhnNrFyslaBnBkV1RYI6oajXdK+r8omqE6wUmegEbkUjp5ezj4I7MBQtQG3GeLor00OXM0+m9PSIuom58EyY9RN2ph5xl2ulU3CId7335dF0Oh6aOCGbyKUYxLLFJQdUL8lnGA1JhmD9Lm+r6/cj2JIjN/hqy2rpf6UlaxDTbaRH+wgLbtRMgfgDtpK0LOxzp41sDrkD35GCYW2Oojsuweb38B4doDyIm8c8GZKWPE8SgS/8S47euJRMjzx6Da7Y3XHfZXLIKwPVpVyM3LseZx2enGsxO6rn4EC5feRCh4h/Yg4/feuYDjcuwU5QNjqcLhPSXW4oxx99K67+qB6/PJ6U8KpLPwO8yrPjQ5afN4/120Ct11OWqN3GUvuDLoACqUG+57mxl5zg+4NTUYRn3uA19QTneTpgAseI35gFI7NXUG10z7P5UUI8ubdHxozDheqyy+QJkqEM2vJmLusPqWYnT0+LzUka4ye+ZULkbEGxZtHXe4uZ5GpnluKheEr+Wg3neG+lErUDSQh8uuAlBTCMo5BTrHzqRr/vh1S0V0EZIlYoZYwMvBptQ6GPEsGdRYAdYxf04PvcqnTyXNE8SlFb7fIr9LQ5uTis6kul3lvY2J7lm8jxReH6XJRn3DAvEvQKiUqmoArgUTTMb8O5VBJ6HKK/V7GpDj87lmuZBNc6asSN/x0iNI4CBGBj0RRILpsffSQbvVTdO8fU9GXOR5q3/1Pn1aH+kmwwQ4lOd868EeZ2Bv7VA7h40+6YhNy4TwQ/A95rE0nqp1ETkJimbulMi9x01O+I+d6gNLv0xdzhvp/jEEhSR5TqYlEIFa2lyq4ZH9RylnloseNUGE9xiOYEujqNuq/8TXKTkvopO98OMCaDuradmv9Q2/WH+cIWhEw+myRQj1H86JO1oQOWIBio7yusvVY/py9TndFV4hyuQ3Drq2has5Lg4KyKznkBarbEFiuDhJDSvRaZaWSn/aqGt/J0MGb8rxqSldxuupUPjenLAVWj2PQLfh0C2F3wU+RUnZ6jxH5MsDxrJT6iKSxo1j9HGZzhZBT1wXNQb7VHOxQxPJ9cwXtCYqtwsLbIDHwpMyyizTAb+/tnu5wMr7G/6cIETEd4YeTc0WUiPWbbD+pzSRoS2pYLOeG2Q9ne3enhFvjZraR7bgbReYoq+15GpBWxdi5le0clSAqri9LAzoxgQF8mx2bbwAKh2uZOkUtfsICnne0r6YCnjQ66BzDdwcCeIvQWsrHUifDgEcn77GYVtEeUWsY8rijcHasqhATXnXIc+UBnd88/Scm4dqfS47ReZorCCXfo+rhJQencvYbiatDi/aaegPn/+c5OoWo0OzqFjc5aFpOoCS/wOxbTRJ5e9vivYLUUB060g7enw63lbEOQ1npdLE7a50ADTszUEA7bJJsd7c6WFzNhUrlVJmlw86XWRt4YLpaSXuiWCLffs3SsM89jxvolL/2Vtt2orTMPptgBu8cOTVM5EeAJ/Vj9nfQZeKeKmUaB2vf90eUeUmJvlyprGa76w/wdhEYrGo7GNqN7QFb+XMGuo1EEExkzh1WvlOEDzAxdd0aqKgddYa897NaId8VY3FIE9jYUDqoGlsj+uygr9nBD+lBYV6cext8+6yP6MIubE515He/qrYXBFXFW+exSlhWSF28/o3dzI9DKtDW0ZFll9eULA6Ur3sGRqygh7AtuNNr/yyHyfMo3VwqOMmTLTk8TrWRkCKyMJbut2jYexPWgi4aEoj+tFFR6cL3lQuE2m9uNtHvSZKq3tad/FwCt7OIx+BKVtveEvVo5L5ao632lgOGiV3LBbYGW/hvck9dSSP2j3nLYE5QaPXTE6RHtZELV1sLT6mOVm7lZNTKWf29ykJfGuckwLK6rubw/gQnia60JNmTcteJZdO5gWe6gyyJo1sIuDpw39kFw+o2h2LcvtgdWSJ/Nq2SbEt7OvrW2D3Qxvs9d8q1Seq0DxpsJ/1ZPYmp5yznt6Fo0qGxDNuG4DMGSi1M954or3B66RChV/lzWbojF6+nof5DBEK1P+/1PcFdpHp2jj33xC9v5+PfFassnCUSjG7jEdNOpVc4Trjo9VlKjLRp2XqChc4+4dXLbCIAyN7RSXM8F9YsGQATZIEFVJysKeRASWxuCU85S6oEm7HMskMe0QM3CnvGmmJ5WitrY0P5bBCNoMu8J3De2ef0lGXmaIxnVJFjAIpV51omXWZWH2eTe5RKqkJfZ+0WvpwaT1j2J5iAac+3TdsX2ZuggT5iNjZKFGH4K1+o6lOS8DlbupqKpZfUG+kosIl9bACaOwmTKjdEtCURbnfVWDzk9uMhg5zTQuMHd1oEBkASV4ofDRvXOAD0Q1HlBn/ztv77uePCJ3roJgreatzfTiBI6sJjFFBEG+nmV2mur+0G17jsXeZ9fqQm8z87gPTY4Xhpi6+Z4aPMTSmtM/D3yEqmRZm8Y9I06bLEmnZ/KahSb45pmgaAIpjF2ayfYCTGYVDN8Nr1bmvrjE/3ejRIXxlVvPsYWddkaoilrGODeYgdroSWe93NX2V9c/vAoCdeAdI6QLzlh2ilLaKyPgDralyYT3Kw1nKOR83+1JX7S7iIhN1TEzhHI1kB4JYoPgI8HE07OCvX8n9TSWtakKLdd6jCNBHESv7ZJB19kaSRw8FKpw/2ob1b9W9t8Ma++9AkfehxYLudN6p16ZAGh5R0kELQZy9RxH7G1q+wnxnndaFglErX883tfVIFsDM7BR7W4EuUXr4nzG0fDtD++DOa3GXVPFjPCt1X5XNboI0mrnO9LKvSXBNsrLjbVzE/oUHX7Kx96b+Ww7+SkbnuhMcdhaKyMNGl9ICqCkeF1P5b51gwwFkV53dxUJ0e7Z7HfUSXtneo96WKAJiCC99TWaD5LDw39unER37shFd9TIeP9Z8SWbNpc1BxD32rfM567ELOvlPXdPt7gGxruwflEoE2Zr2dCEognN01nmrShg7m2aZCzEEWp1OiH8rjrWcooHaIUx3pyjmJllGTl7F4S0lrRDTj+p1BO3Cjv5ULGo0ZGWaen3kXyuNbC3Z9hIMlAhsPMopFMW+fZZAZnanD2aCt1015M4uBVs69AKf9N0yvGT4WJ87G054HXgVSgx4Jim24KFV8zaxXxVMKJDHqxpms4Zin0+nmMR2fnFr1zrehgpYq7KflVNE++GDdZ5SfcWJXZdR1cX6dy2Hinjpj49REiQ/0d0omi5dM+2Tuq2gFIR/GwVsnHCsezwJiEm+DUNGea5IP+DCOiHWmfQ77QXxrEska1okbeH2rjmiNwimeXS2hTLjXNbHtP7+mzH26ngvyS7rEBzMwtxpxojgKK+0iCbHo0iEhEleStsZ0o7U6A7Za3eTg7LWasOF1u6Wq9WFzFH2p39nkNJ3rYzpoY6IdeclE+Kmt9SGa2TP4V29zvXbVZV9VROq7/7ktq8A5WCOJpU0c3sbgr7YoNaGYcnqcsCtp4DmP4C/iVg7yEpGEtgP/mt7gIVlktVbg225vKo9+ziZGQJ06lG9OL9R+ZT66A9BWa1/2gTApA4rVCQwZ2PFzwNGrt2MKotZqH0StpKKcEo2TtR7zsj4Ojy9F4XhAIvE9Q/w6e9zv3gptGt9wcmSfH1cWAJiN8cZfIyt7H9uphw9yaeq19ljTerUdlIo5HFnoGTvaVwlLhmpD6HIqegniztWuBAlib3Waqp7dwnGHu25o138vCdiwDXhZK1I95n2zGf6IDpzDXRXvtANNezAgenBt7KDnab6L0oTtfs2BG3R7lnNGfu2LGhPtnI3b67eJ7u/bx1sOQSF4uPOQ9ocdbNNr7AbO8GaJSwG4kf9/fli03Ycu/BEEPnoV057b5v31FrjgF3+yABpA3vxmk8MOFwV6XSbw5yxwyuy887waaoDDSKONPcLfUNHO4xy60TYCbuzxTXB6PN/idH0uXWxtrvSt4p1Q7B3PDP+iNY38ANutRrYQkZ6Bq/BxjrKhli8kFpx6NjguXfychmlRsWO6ftKwsI2+nsvPW7cFPjsEk0nMsThRPflRRaj/hO9IupO3++3eSLWjO2IeiLqkBiyn88DeyCV5nquYFNCViMxmA7eWRm/Zbr0PH6mDxW+H6DLbNJkZfFYuHitVM8vrzoC3Edku1zenfxhsrAEsc8ZK9Y1ztv6ZbryHr7o/vkyW41npv/Xd+NEMqC9EZtY/Qfc1j+3K/0QW9/pSL4+n0R082t6gPWQltzzCf91C5Ay+cnsbsi9HBGWQu7jdk3Eth6uJm+2qhWRnghDnJ4/Y01g4qp2w4d+bf6M0cnGAYoZF2249EAzeE1oLJ2zP0+A8TfDDflQVRai08xwv4dmAXoItIFOsjAYNENnWE48h8bluhKq448oBIAcCMG+5imvcB4C9/g55nFsUiKfDrTaioCF0gsSl1Tb8aLVCIeY9xMC/ldTD7XjJh1fKKq+Q1Q7UQvo4Jdpuizk95DUw6Rzb5eXTb/BTYZYIO6KURtXbh7nH31V/3qmreKX+lKF0bOAFlb3IHFH1T1afzAgPRdmf8Wc/MYVi/DKrjAwZYLnqehhIZbSMgLZabDUzykyjlLFncfJkOgZGXTTy8z9dRd1BfBHi54SfK3NFX/wJCKMdpO4NbJ7d3VBpRECVS3v/cVL6zbUflFZkYpMJIy+cKl+FF6lWTh5XND9VlSnRKWbB3QPpGWO2BMiyksxNVIqeFGG4ZPdw17lluiG7izQ+3DzXQJ6jvK0yKZGgZkzH0w4a2hZzCdVC2jNKomNjVxV2CU0MxPcipEOTYgTtkDqN5GKqIgNuM1HK4H//OlDLtoMZsLkqMplRs18S/cfO3IcV/wGFJkyrui8NZIaoy61b4Ywz0c0mxgMKe0VGGid3sGt0oX9H2QUE1vueqPFY7Z/3IBiARsXC9j8QLdykIZ29wTZsFbF0lnEMgzZtWtN7XiRMcdMdr6s/9wiTuUa9nGHferMLA4LV90c8ZQvEPd6otVztb8oHtxOJfuPAignn9mTMi/YLN1QZS/D6oOcqDZWnhMdRBm+qIpUDsN0U4FHxBBCdfbDJgAlHegqSI6EBrjVvBxy75fruAIZnSjHyDHcnjAkS4Dj4ilBOHTdFFczMOJQDv9zFbml4XscnbjkzIDfd7EcWycUDVEmRaEcHay7zNvm5WdxJxPhxFoVEfd8yFmyX8JWDSH85EDpA6+xctZvGSJzHr5KpvMuStjd8yQ0BjnTc84rd5vkbvM95fovq9E8ACeshsQAH8+Ded/gSUaAd5a3vBn9yhzwp7ra5FiDnr35zbDRaIkr122zbGBon92mZ2/Zg1wrxhjArJkgn7eArljqU9buseczoA/BK8w+e1+M38Sxw5bFrymTz9Ze3TMghrY7X7GKBH4uEix8yIQuyXEswkQaSOMlylZqZCT06XyEeiySomWaNAyFm3vZzVUbp7bsaR/vpG+l0aeuClOrBNCMsZI7ljXbnYld8Rxsb1SE67//Clve2Mx+jE9P7vRz4+eSzvMu8IEntgIWoZ1tEV/iVOYpwVLZxUDlM61LHw8nBsiF9vGdTZ2dUecEzdP2E9Qwwwg4DRtnHwj1mtZU696XdG461tQ1JyvKakNWd4J+lTB5O3bU8PVbFVVuWH7GDti4ync4+yzmea3V2wuRjzJx9pR2N+UXM1RqcCw9JHyXPpg4HFMzZoz+W0wdjlvNL21VtLidsYW3HUUn3Fi8dGWs+akbB5XY/uwIgLawOI70xE1vU8ZKvUC38lmWdnWCwUijhe9+QGIcYaNJPbjtOAnx8VVk7mLB7VogAbx0tFL7twhCxvUtSANcFANW6DqtEOAOqg9hdmpjH4f3dfsFeB1iSDoLDtBxeDoZyFPLxm0x0nKD+R4/C6/y5tSJ9CfREYFUNCyd4MZM4levRys+t9Ko3fu3+toOfqC/NdCi585xmKEeDKbh+V/KRPsQrko/WrssPyU/IMQbXFyLu+kMu05a/PFhmW4kmL4yoWjdp43Qe+2bhrmcGB9s2HvEQmg7S0w0xVoNt5Otedy34e8XuOcMMpl945s6CmZU9vDVs1WcLjoTqhWcH+ZEeOLuXnk2HaZ0pnd/QjB8dzgdgRU+rmiAZT6G8DGLrrTt+l7gWAVecsyEO8+BuNKsEdeAW0ptQtVptDl4yO73cVzmVNikw1SafnGSRgjO9yVi8vE2YaOdtvKiHNhJqvieX02uoZoJBs5Ra8c8vUURDsbZa2PdH3uPeIGgS+i5sYPuws7rRXnPVyMEDPiEKY1CxYJpJORRjeN02uN3GBF0upAihdcCvKmU3iFZPpPpGNFGlEV0Hb6ohGqIdqVF87x43+94+dPsN/KTakbHZ7SCVRGVTeETaoH+83bueZtflCD19Ws/BI1WSyHehUvy2lU8je1glk8NueYwkDQpiAFaEskFiir3AjsdhllE+52hTDlOQ+QBjyEA8GIjbWSaUZhtum+0o8k3okFpG43zN8rm35ZWN9cq0OugxePlasimuJkBVMOjJEYu+CIxrLwLL7Cz83D5SoBfIX4W94R4Fextor5ffBrDBHZza97M6tPY+jwz8KUYdBvqACgcq6FDthjIfFE2S2TZ9bI17Xyfh3QBtNDLY5oHXuI5JwsNYwys/tSVC1rQDVUodP42gzIqDO0/g1hCOmUZRMVsXP7ByMg6sehWT6m7YbTJSEMVrxlxaDNdTMvkyRHLo/ccBsVCQUul4rrecPKTR7UTs1fEv7XBatGCUgzgd475+rZPg+71F9Vfgr4xTyOkOa3nl/lkl6ZLWjSbbHKo9H0ZVGEPZFmjdwjG+mmJRPV21u0K3phC998Sj/vyGM2qONQtfpY98sUkRrqq0r233G4nQw+eJhQ8/HRJ349oznArq2Thg+tQqB7kvNZpjXdWYMXuBM95Yf5Pg+OfwSQZCzc2qExzn1HNe/flew0u96guS1Zp0LQYjMNaBvNwnnKW9BZZ/b2aUx6btASpPd0VN9Y9tRIGgEo6NavSW1uaDo9r5ihkNH1DMVy8lK0r0qHhYlhJfLO+xrWomE7Zu+bc+H4mC/d2OLOrPP6OVjRd4X/1SL0QxnxCjLpJK5vsxnf7SVyJd1Ex3xS99nkrbky7WPrzjZlqEo3s7cOuNR2n2lUr1Kvp4i9iRFWfpUia/sBjfQVs5iqWJ07NZW8dq8mMvkxqgQ94lx94HNy05kbCrhbwMv26nMIXQFYlzHXAyXBP82D+8BR6eYkzil3L0ooMD1FP/xFrFlz3mGrLZhMethMELPfIT9eCGBk8yePubrX7wGNTjnJMmYW+A8du+ccNQjBcmHMl1qOpmzLhu6Pm9KdUA6VF7V/RVil5xnyR3DN4PkkIPPq510/IcUfQBBqSEYQEQZbPR3Is2jMcKAlAOJ83BNthOFpG8sz1tSc9OwVhcGZ0nORUnzsvd1pn2oJ6ELp793YVKWhO9VJTrKDBqNGg3DFHCPwCZ1ZPInm4zxQ7GIsr6wHDfgq9yvRDJMdL3gwfNmoQ/pfXiSPXugOvZL45eNdtj5RvvUB3nSG+yiF+fHNyBKVsNH6BjE18yGmuDkW17WB4EAclEIJODDuQxU6UfJGivnp2aj5LQX+FGiRqvLj82OBrviGYgiCR1P3PtvHKjM0lY7YCwKeGe415tWjOUlQvEsB/YqoYJypRp8Po9pHshxRAMZ4Y9X7JN/rSBhVYvVCfObzpmiSQWvtX+GWc24PGpJkFf7DBvsY7RuWa+9pd2tp2MbQBeGTbx4tlxFKuQolq7z0u2WKYC2AW1ygUO2KWWe5e+px7+dFDNTRs7Wgx3HkT2YntzxWzRkFI+lDiDA8wxBpqyF4gK3zo8QhjnMEgZdVEzSxn2cTp2Am4Hxk1PE4Xzye9bW92CUzPCfC0xyoeE26hJJ+rP7+/sz3E6uGOqKRH9XIgZ3YZWKM7gLXWDM58VFUkV8nIdvdd5B//fVsAhXgX1PVX5+VeLC1euROfVjdkwWDciOAicQy6N6RTMdiz5TchpadM5OAaSA5XDNE03XC3FgToTCXbuEJPXO9dyxd/2D+bk2N9M/re87ODNjtd1hUF2jyZpjcCWRjy6kGVp7hT522xc6DguKATFcU++li9DZavCQuIaJx3kPLxqj+xV54CvzYyy4sX78LxeWiTrxynbXJDIKYcUWSEdvVeqR63nU+yXKv1vyZCRgtpoBlI2lVNR0PJRFJb9gQ+pTqORooOkN4LKAOq4mYHflMQL800YL3WjQRwjqxaJdL9FQQFgcZ7XY6R2oHcINP5Hod+5st443UdN8fEO2ZLAA+HpUdoKJXUZogJC4junJnrGZfcVrpS9tLiArBzfcYYy5TvsqgtEKRE3dFOtm2HotsIH7k8R39ldf4DirMSaR+KlnbcNcaDkKtJDcdnU87FUgS3urkEi/55wS0JXrnuTCM7SlaUtqg/f8gwEjL+uwDz9GDniTUw/sDsLxD7xF7bK0p6BV4CQFe2sic3gn5JkJ0o3vMmJQdhO9fc8CF8C0JL4G1DpMKACgIIDdI29iALTK0aH0gkJSkQqdqTg4DvdOk0RJ0oB1Ht53QYjhgx2ip2r9rhSyguAtgvjPMSDGZ7r28296HilO3h+t+YhElAqUxl2KksGlS7N/lkqhwr3ygz67Ez9rbOMy8w4+0qZJ1FHinAqzU5eoUkns2BDcs9dTSfznX4VDXQFP1zoQFw1hweO6Oga7gFn6ELhnsPur0ZR/QFqYW9Dt7e+GRWaYnJtrQXptKtghyS2/BDPxj+vq0RQowKYl7JQ+Fl6RtNxkHRF5AjfzY51rwCwyYR3A2eEoIiGqxvLnCPAlxuxS0pSOn9EEv7i4c/DrlmfvufFBHGlY6/Trak5S8PipIOgLg4hCuJT7oz1l4rQU0F+9BQOil5DZl73KqESSZue2Wj9KXg/UUlhpxZIVo7e+L6mXokk7AVBWYLSqfjVdkpBu3H20Km3BTNROMOe5v1Ud4nebjpr7aqC/0Q1Q5A31uui4v+PVnao4SmTddpXF7AEtuv5dgxd+JNBftxdSJQsXRIBxfgUDarCiq+SVDrh07LkDadiennOREqda7A9NNO4eqRk9BNG7Xzl4by85WcCLa4Rl0ig0O7prpSMRhVouds7iNUIqoV+UFet2CrcapS+0RJXhrBUraO3G7aI+ZXanIoo0OhWboYKrz2J6eZGkQK1c/cugb2vx5hjA2q1yGRU9YulfgFIQI/jy2nDku6aH+zCPDwmzaj9zdsXOwadVhw8sCs1VFYJ6quAYFXQbKvDiSCcNOTrYvWXv78gNbJhnd/fO/HKuMDN+XcKbIoQxNMwh8q8l5L/ap07eOpWkIHPjlOaqAxANSXk1quL+ZmdsdX4mnrivr6bSomgvu7pJioBZAnQYAbqzQiODVhuj3mOtx+BaVIZSdFIH2wjtuSjNzYqQPGZwAbWSzSDuKTA8Fm4+LpFNTX4csa4g6HcbHq3+KXusiHX8uqSp+2Oa18LJqoxR+TCk1CsuSSnOBEDowJMMlYcg4sZ0aj8hEiVDTBCBkPC1ky8RQJOlpekd8wJzk9loPoJjjGV7fuvH0ldi93I/VGVOHKTVoRjPeZW5oB7uThuQvdPCZnbjlV3XzVq3LxTQr3ib1xGeHIgrmMXhd0WoDGnLD+gguCnnRUmsG0Tca69u3v7wKxJuHA43+FdF9LBXDMiUoVmpWjGG5BWEMJ9rv7pepTs1qGWIctPy7B4h4AyQaUPkVEbODNl7oEPzEJXdO/omGyQiBaUf/js0oR1kPuds6eIgOXebxdkWU5mvskVCCmaI9qBIcEtAMskY+tD9d0YT7M1LQBpKQTiVYUKaoJ7bkmIzaKgVDjH8u/8JRlaiCsYmEdgFwVVsET0BydqgFL88UBzCfsjAUUwnwQxk+RmWkKkYdiU89rzFCcPZtIWsp8hFCUPaBqH4KkckGIijlVGvunmo09gRptA44dUdxk6V7nLNF6JXOSscVmiu7eMFv4G1Bz74EYq06U1KZpEMeL9eQS7cJFjvqDvn5VhGcIH74SZm8aceCIZ0zbSCzPkNwjQBVxpL9omIFJ2qNcjOveXtVDqI6kEJKl4w3LY3X54gKmjvT0QO+QZLWjaoHZ1BKkMuOTcHR44mCHqKp1uzqrouT7BSkPzL1fag2gN3p6IXVN48RKcL0+v59wuXFkwejR27eZWCBFhLfCRMFQ201kUO9skbg3U/pvY/m0p+8vdv8WqBttZTYjSB5IuormhBUKhpPspq8s8YdIlfOUNbPIBm2BSHeFOCiMsQSXTEth+31RKPPFHhsSqTFeTvDNSPIqcZL4RF8rtS4YW0tTB9KkbIvNgcO2QCK2WCOmDau/xlBVCCfo3t/DFz6p2CLr0Y9Ki2Si0g/+wXxtpsrz/3rZxwCbHP/VmCiX92XRDEHveiT94N8IUmMMwQcImD1BtbskkRTl77YkPSOrVWgPnr5K2YT1ySHpdfZO2sKqJtZskZb6FTI+3aTCGELcylBI1IG0e5ccKI9tTVt5Iea2GkvgmDEQklSVJVmtdkj9duSKkBn3W3iW9nSuZVlQ3jH+NuJj7y8suGK7vbyNbjdxP4ef6jdBMV+Gp+8KQbsnaznBBCZLOiN8iVQqZsUDY9XzdMHhhiyT7Iq94PRtZ/bKDDnHkb9CtrWnP2hg71jHqaLHSprxcKtroidco25MP729te0c2Q1HEOOn9/T4SdlyP822BQhRJdDRfvauk0Q4uk5BHfSpzep0SVZ4GfZcWZGzSt52Dujt16qeNdJlI3cWQs9lCD9LmVvR1UynXtSlsTVf3aDP5/mteRgYLakVGyXEDlftMGWlCnIbtUd34+Ubnxie/eiTLDfi9ifyUk2VRuR4WlzfElnIeFHncAC+dkm19E53N48ysCx+arl3Xc5vA/bPcQ9kmJCqMSANNa1Mo3+srFTBgp7jt4jOAnc/LTli9carm8mD3w7AbFG50ywxVfpgwiYY97EXWUcPi1qCGw5jdRs+irZZt8BWxM6OLfsiMvjctLDs0MD0Ebq52UNXDiaC4C7N5s6bMLBXITEk1mcmzSaoqqAxQs+mn5Epoxx2LqmQitZJZLyPjf8duzDyAQRT3K3Yq0HsalN4ANMYt67r06jfgkrbzb+4DxU6vOTMCTK/5Aq4AYg/vDaKC9K6GyqK6Yugn4siMJip0ulGvtyEBL+pTTVM8DzNPlUMRgFrY5EdDTFWj3mbY7+5P0CvjzFRe5QAuymrEkj8XX0vPvMNdCTMTpF2nmqxE9h/As5SOkinW6eZCJ6ygEifEDLbGKQmEPhsYTiZnUGMyTmTPEiZq52kSiFcUBvxN/y2vFA1zcFc44nT/1UQ9BA+AKbl2075djmSHEBkeGqrxZqsi4yFAtkEpah2uRA+amIPk/HBwWb4C1SzkM6wC045SeFwSDYOoaWPYoHVsBFyoXZkcCzi0ZpDmGJNv4f0sa9HxHqBO/0YuOlE4LdVqcWGFJJUGfMuVxQPAD8dUQKQIqGZ3YkMzYxAWiBcfYVzyExM2V7tuU/qjk096foIttdwzBLECSLhacfCWXRLXXC1SlAD8BgJ6KMzXB02aSn8eATxoBWPialmOT4iLbnuEaxcWiWLOKtVY/STTtwAkz92Qw5cvDRlcifO1JmA0qIZDG2lPuFamT/hHU/eUkfEKP+6ZrWkkufrrYuQx7OHJv3mCJmfNjQlmTV3ImLMGS/NCAz37K31cbzSV6Ez2/WOv47P0DRLeXrDq1lR7EJZ9BYBe8/UJ770tvO9zo8XyP91DfoTSUv0OqA1ZDNkcUulmgEL/E47zkgFcao8dFGl/bf36kDKIBYIRnyhrOtI4Eqbixg5PlG5723a0l5tiUCv2+zN9QrS5jalKv6U0vPKqgcd/XbU/kqPbx/LyOjdHtDeRoSgjYElfIv+3VRBHyDvs1vjFedisXKdzfHWkmxa9uoGRNeZrSRv8MEWEJ2e6C6AmT1IGB3m5K1/VNhkOCXNRwhe2ba0N8uHXgf94EOLWlCdTMTKusyCrRNKB9gYbRyf26nvm8sD0uTRtZ34BN82JV59OcisQGXOovxeyg4ydBodQy8LZZ0jVMUgipdMNEpsE/VjKBhWfYzprZVZlsDo/EuS3Oeioxqp/vUKnDj+3nm1SGt/gpNqa0mbSJ0TpZ+91scY//npG62c93Lp2gPpfFmuNFcb2ko84EI2gfv4nRsiOWNeoLGLzmcjlraCqe/JrAAfPV8xy2w1G8RndqNp6E1JpzAbyb2Gmw39/QSpfuRXu9TDoOZrejczigEt2VPZVrDC8CGRNHVC+NozRISp29nrhj9gnRbUSes3og4i3sOxh7q5sSn2EHzUUxFcQTiZehX3QH8GHUkx1gGfjF9/+CtG3cBmWEVFe4hvYgcdt7sk1SyR8CUHUWUCbHS00lyvaPH2TsUTPYdw+kF0n6KNv3NAHadcN6ysm+FKQ9ONr4McpZjuaVhqjau9MDzb3Of1o42d09+4MUwqpnWLwV8Whb8RD3A7lUBJDAyIlSWKOTKQop6LvIxX/YYxjYDKz1mbKX+Lq5zzJsjYk+pb4GUJ1VRRD03obm6qicYPI0MkFlISxicxCp47wC1BxFnEkd1cMqwNnz1FaolTXGTvJZQ9DOrVYIkVrWSAtx1HOxD9yjyIwKPlh4UElNCeTnmsPB364Ha3csGU01uBmwbrt56far9QCAE36RTrQinP1BhGsftccAZ7cWfpjXxBbKj9wJFyb7+tGr2Arw1ig2Ynraio6w58zqP7K0Xr7sksdCUqY/r6J9s5y5lAiVqP7ELmWUS3Hpwbbeo0FXGASEFVKYhqwqVZ3D89mbKeAsvUCdV8iQESF7AbKEn4jKPBDr4UCU01tGEotmU7O4dtXaX6rtmggvAvZywkJYHSrn9gwGOer4YORD8qNMg+wPodjeHYm0VpRod3p3muSVh2w/uEcwfHtiMQd+idJY9sUrxBVVAXbvEKfK6AQEwCV8+dOmiXZLIcEP4+uIGdp0/o9fHvgp1MlZjAggroSTt9uBFmR9l/Mr3bafXsSNtUPpX8vxwYYMpbl1tN6FMl7Kymj2EB4n4ZBfDxsSUY3o2DRCft1W/lmBV4NlVE+qhErM1HKnw7qjk4NYaLisZGefHTrg8VXJ/sQPmQONSK6Pyzy8Y7OKy6A5wkVT08A9sFVF0kQd+ZGt57UTTG6jlQpRfXm13W8uCCJRowpZYDHiL2LJr05+BohzgjOHKfd6UA92rQwSs4yetoiujtTqQDKb9byzFNcZMXK3wnGQJWBuhClBUiP0efOASLcxvBIB0ji+UR77lTOd7SQsSMdJq1jirTb1cW0XJGMtXJcvLBrFzLlUueRbjiG7a5RDuDztSn78DUe6V77ZaRtw03UCN6VuklFTqrh4VJ7GG9QfIY3eafIaWR9QPJj63Xx7MP8bpaCNDIuREdXHk8nrlqh/FEHvaMBn3ReueqNWnbiGZjfAIapZwVgw7beeG1IX1oxHKDdtpc066D/Gac10STuBlSvYmJYcT9hoLSIv8ssp1rPeXMG+WFCYopR/fzjnO042vQxPrEaDxpXzJ/aTelc+x8aXOxPVI+Gj09fhTb6NUTQsMISIbDF3Br0v1RLy1/F2e4uT23aJQXQ0JmIvuVpCbvEpGkhNHU+aypYY6lsvv4qdBh3gGveqCchDSwy9Bqma0T/EuG0DVwBNu9D8azMcIYul6Fp3f9xq6/2I51YrNckWTe75XoT1kByMSA6ABLg9emDbVy221nmE2eu99Ya+nYHsgRKk1D+m3VP/CPgt+mU1rltEemqnT0vptfTsZi2kADQqRYsrUqxX3CGv/XEfoRcyeksMFbozcYxG4iwao4jrquOQTEC6c+wBfDTXpAmo7AV6n9xo/WK/+NPDodlm4NQ5roLrxWzWO24rbH2EDGE2pYHu+9aM6WJ1OCyLnHpiM1P77wp4Jz5sNZxXJdcERcOaCS6GMh1lG+sqxzl9gZeXL8XpjMDGiNSgDhKYaFLK98sJpAXtLnqkfwd1Tdyeh63RHR5nly3YRZAYcKQiqSwtnY6Bwch6AVmatAUXd+YMo9z3Kf0MtFQscXf0BlALOUUo+0rBGJGjk3wWf2fWPN8t6x7W8i/iQrgZ0R1rFQhmF2oKbW9UuIF8fK+9XKeTA++tzWePzlgQfZLQjTSEHT3foltP8B/Y2ehC/ttLoB04q5YHSVIwgcf8bnmnMNtIugTgvg0fTMIe9XK9GeHyF3mjfTyNOlaLbYAk3UbPiLb8BVsG14Sv3HkDZVUBaioh+Y7c/dm4owgO1sCw+1P8L1GYe0MKRkGaaagagN2qzhxAxm4qwEq3wdvrPMEgOTQvnOpUXl8nE7SM9Ce5yi2bKpxle2m5q4Mz4xzaqOB76DsIq0RoIFL6wU0vd1V8cbiyuuWSN1GY/G+0bMUsq67cDSbC9fM+ztS+5K9cC+ZRGJTgK57Ru+RZcnxZx+dY8adSewsoIqksPhCQM5icbXIvm3JgoHgKSyzbnDEvj2RBRde2JR70cJoAy5KENwVfnuhk8VzS7iduzyEbxCmDY7i56bRzgdA3I6nnQojQzyzDZC+mCVRXWPQCCgti4ERYvfmJHiXsPK0A0AcvzWcGc8WFnQflo+vjuZ+n92wlG8AL8ewAwg5N9hG5KUSA4iW0xsoWtFBBaZ1IZ32VADTd+yPxaYp6UAZcC9h9EUZLqzjC7n/cA+OIPWGu4s88gJ7O49/2OxfbiZ9SHCN9CoqnnVTxDmPi/Jp0+InHrIXSSLp0bg4qg1zJpm2LnUAXW2QaDWZ/FWf3e80zOigw55v8jIk7MgTMD9r6gCm91li+el83acpB51Q2zzXjgX4GTMNMMAd64eqyuy5xE/T7UECOyzkvMsB7GohouOseyNc0Zp5EQZK75YT/5TTOYmrng3TbQ5jz+HVPWfp/uhneWKk1KnZIwHl+H+BBWAXoeWSsy4hpRS7D7Cu9Z2kSPO0+/BmhiU7W8/RdW99ejYWE8OhjktdlD0bvJWIj3fUCi3yjKMi2/XSTYGAkeifcgMQmFLW3V4+SwfnvF+I6hJ9WUWCNZxnPo3Xna+IGkId25gXkiCLDh1Cw8JXAVzQ//uJoGHFhGvCfRZ8yzk8ijaAy5ipAlR5arunqk7T1BUo2sIvnGFBocbRcN9MKSg0U089A/8Lf9N08K9bHlB/h0Tkmk/bT4T+FpB8yzP5HU9x+fhvrGLNi+6OKeVCzYJ9NzMPhgCae0hSrx63CFfyPXJGYuP/0jaHBdSyH9lhDSu4JIsWap/pdk+qdaWR8zhHzf5Iik9l2S/JBUyYCkmtKKwX0iCy88q4AnfR4KcdBXYFH3DTbMR4KDaqBJTrbeCrFMcnxIybiCyt/KsNy5h5DZRPlrGZYCh5ZUH8kIC4z5gLzxkHFzOqaJLJeiYIMdAd9Av85dfmTNYIDFQdw2WHSj865JWNSH9JA+jfWOeUMBH2bBdlW6Qvw2phgKDV+y59v2S+x4smTepbHqXyv4smfxq1KUWtk6+4d1tYmLKeGfuNAclfTMtAJT5eBEnDQ9EO6/2EJjIDlcwreW9ON4FiHAVQvFBnimC/ZdNSzUJmX8xkIwtR/lf//O6JW5ek5d+tdvHBz383hO0og1iEIv6QsA2JX+Wx5LQVm0PmqPJ8JOej9/avAJm/DzOC5nqiudV0XXzQM0izrrqJVosyODDGiKIVo48emqwaKcRfCiapRc0b8iuzfVFeR4Ed7eWsyQkkJkV12riv7VdoKpLak5gl+FEJ9vqWbhLf0T/uQcLs7SBnhDVt75h3tEmsHRzgHYv1ZyOwEEcz9ijfPUCJ1dchuLz3NDKP6NrqCq96/xJVgl362P9XULO7/REPuafEbH8851iSydtij/8Z2OVrSFn4J/pkqQUc9zbhftwULx9Wyy6Qv4SvNzsUVfMtT36icpWsUcFADa5pXM9Ge7AbzYK0qJ2FnPu1UzQT21DDyYMUuu9myn59AE7VKsBrIKm3nlf7xQFqUHfQicgb63tZyVOkqBRA47S7g6sHe5ZO66OR0eiXTbdku/53RiDQYsRvBBSL1aaLrJulEBhyh3jv/vJFJw4zDXpSafnMwLeNhN+LrhiDaRfHj6PXGt4KKK80RW5G8rXC2thUeVup1jM0N7ng+QAMswAqarOr0u5IstEkRe8YYmit8AXBgvwIC37HtrARs5Cy5ZOf+sANvfRrh+DeG8jxq9Kd1HHZyuip0B9z7OwfB6K+WvMIpqd/TZ2uJToBXZLOAMtnr9OakDv5LUISgGSVbDl7gfd0VgzQ1E4dLovRVroH43bmEuzx8B1957JPRT3lxhit+b3Z1SqVHF3jvGXfjwvMGdh1CJSBUYGsbkdovCAJIaOsZlB8AHadFa2sYc+2H86JhcH7lWeMFWE5AOVCmUMhAOn70lRolgnTlVQA7uTWAxyIiUunr6bGVJgjjwcK+AEi9L/4FGsKIlaGY4v4JcuiA1YTLKKThIhLGg4RNi9OTiU1+dN465gGfTrm6VEge6Z6tHMhrG4mwY8T5cjRGHlp4MhIEXstNbzYBYu1LOJDVBT8PjRA4reIevrbV/HEIo6Gw4Jl1ZWZCYU13Q2XSGQD7C1UG+jTm4pbtN/e6af/+w6f+f+snoFIm9Q/eQmlBm0cLED4hg963OEdeZiz40YDP3V0jcryeQOA/oR5UBLQX3cjt5zNwEyTy1xkQ1m5Zt8fDI8HeavzvAfTOJRHUBSZ7b4KhOh1n+pkzf7nGa+wStCw41S/xXi2BDwGvlgJr/isTRrUnptTYRGSQ1I1/ZPqvJ7MUWFAgpEZO7g2ag9Du/2wyNIG8R/rdEqNfo5AMZLme0HseFLLypGyfNLoUSbxMoJU10OuIRB35DUvLhxlzwV2yIQ58Xb2MKjSsR+6UuSngaL5aWHZNL5o0zHkFDBXj3VAHu+K3YyHSPaQjC/F1sImyprXQ1ROUWZPG72lbouSptAWFOCdeaUfdnpb7OE9kGDP+EKxO8LSYvzEyaw9YruZN1AYJLNJaLaIg3vonpk43+jC1XHW8AKQJay4SyNdQEv3nZRV0YHTdo3HQ9V8oaSYscbumBC9XCexK8h1o1rZk3/8NhfNhNHTWB+RI0jsPSvm49iR02vVWM03LXGrfdnwWFyr7Iwt+jLMFjfuSkA7BaIK1Z7Y5ZOnT6gShcpETQ42yHY27E5M8dTO5lpeFUtXunlFHubqDB82d47ZOzjWvhqFgYx0Hrt/Kife8k3VMid9UChbagp7uaOzMjL8MD7KlZtz5/is7ljjRmw26CIaNxL1M+1YgGBhQQCOlVMJaxjYM3hJbYBPSkqVsCncWtXOUnk0Wt7cG6OPAULUZTLJC2uAPk5SQGKdSBWFjH7Vc4WHNUE3VpQpV1frYI9RRT9koBZfs9Fb2XKr/uW9OLtKdbb+zVqcizWaFxjUWkrzolFi/UWT+T2oPhAvDRbxD5eQ0ePvRi2jJpN/qX1/qvH4z6KWAhMWfQ5g1KP7dA25Rw8y/nfdM/wkjhrL+31yYON8s6fJW5ZnrnDqT2jXOm/ysMuW2CJPKaG/SjckC0hGYUfxdzJc5qIcrwBOdrV1mgB+bMAvB0ThePv07pE2PhzAvmDrImNqDAIXaLY94ixykbJa2ZNdqBRAgjRMbOTmEpcm/AuVZgkAt1Dl/sz+DqjhyU36iWLuqJhmXAbUVFQAK+eySgK/SDGdEzeLW3jG9cFUmruRXPBhqrkE72BIQ2PyrgAVUj+ydCWTQCRn82L8wKrMpJB1OqXhl3NNo/1T8d42XW80/ECN2LzCnTeYSBXs/iWnuZhsAVRdhprfcerdM/SzV32epv2Ia1s3KWDiKXy4fupb+iQirrwZYmWE9YMBQf/kFeR7ad/xXt7MCVOr0gYS1W7SbJ5ulz9cucSkZmHn1Q5Q0o0PSRbuHbMep8Ce6OLE71g5MctMIIlgRYGfSDZlJVL2tk8lkgwx5wN+Dw16MfA9tGSJpZFPqljfcImCgvDI/4otU2J4LQrL4rQwrnmNXX28RfdsmvjNnApmL0sERJRtGIgFdIS0vLAsk0DCP4ttFQ+2jetXlQeb9gYDqm8sMfHqWwI7WfmMV+yP0yye7IITdpnvcod0ko07oE+ZIizC55YyuuzXet6dvIH/CFygTwWi+8biufjEq17QzGz5FWQD0mXZdUrJk7Rz8wRHkoEQ3n+cXxjIr9lKTGosOUAzAsRF3cz0L5Z28iV8cWxkZLm2uaAav15UH9L3iLA+X030fpyP4vEf73VXw0wHAPVXoDIVgUwR0KC2GjOQTJgdRK7jdP2DlyjWq+/8xxP7sj9NYUYMaSO2PTYM8Msg8nZuKFFkiMIGzbUiF4/uSjULlJMue/LYC7tRx0Dq4OokXyHAsZuc4+h7ODim65Gld+1ZVg9IzpEiPXItimNbEwm/1hauxSk62nB/qvH4PaNUV6b4g9JArqmSmWB8ETQ0UC9uTqRr+eS+NMqU9cS12S9+Hzq87FtkbzGZdvKUhIHEe+7DmMB/zdUfuU4UvGCI8Wlilro8DjVrZM9FN7hGkr1ZHBuGZ+lZNAywO8b6kotHxYszlY5K0bn3sngnsfX2uPj8VF29FUKWYdh/wpim5sdzTLNH/Kfvla+bFQ0XwnGWTKOENim+brL6eDCP8nlCxqmO7Kjwg57IUTwNny81XGsrIsyvEkW+USB1VKcTVeUdfQV0zpWyRCNjN6sYj3yMWiRqPkYp56I0Eqq6u3MMeSyTa1TwKW5bOTRYo6N0Bfb0LteAyGTpBUQRSXHvpsmomwRtlk2wLTLHZWGsfW5jDvTBE8CYhpekYelGbDQiXbrNboWmPUaHHIunma02/l9lEfUMV6qkWfcYkudNfzy/sOqA5qfULOwb00xh8YNBtuU+wMqawDJVy85HrTTgEKuxW6CnsW2cavUCXNPzRkHqopW7XaMxJ/KjqVQD10jQMga0DsXmHeTl0UEf6mwPWMQcDbOtUdSxQ+LiFIG6bfRwqrqCWhU7TxizaWNOg2Oa91I6L1UbB8cw03sPl3iiO9pCAZ4dgNx2BhAFKHxT2MppSfqUK5WCxReyWHDLrFx2VWPoaHe1EqnOfgwxZsk5aJsGtkUpeMo2i672WDz8uKsRc6Tyjiws9owMQo4JShcDMKF1AvMZJokT9I0sfMxdWbnEOYACHjfO1+JA/kiKvLjHTVUQazO3Gk9befYqAmDp+0p+RzAFVd13pAYXAULq9dXjGK7lEEn40wJb2b367sDT25ZrQA3M0gLIMPV8jnPYenbFMahubxDCVXX59D0/MhO7KPkZVFbw3ZMnXPOY3i9Q/ghSwApqFVgCmQiB6nSRtpYQ1qkA4sTWbtpOMON/fN74NI7rrvVdrGhZgq9DyyAEwxobRQE5BrjnQsqozQ8AcWKdQjbFgF6MH8oal2eopyF1H4ErnDciE+Y7U1/ceZ0dCHpA60F41lcFD6KmXCFullsnf925RHLwKkUCRoCcg/H9mtzTvzDTFY9ibV/1/OTKWo3va3T648MzSBxPdXWpsuXueCHAmaBXz0Xd30/p+LBhKwpH6r4iEe/G4z8FLh54BSh/z3ACDNTD31/ykL4Yfujw14jERmW2AnK7yyutyjv8Px4Frbma8D59mREscuCIOhnIer2433iKxW3xXuboEUArJ9vfNXXdvu49TwKJ/KObhoVuPFbLPLxA9rTf2/3YMFmWs2OddKxPp78A3Wz55sqjfPM/VqdUn8v8udQIYJvI1ptTtATyHTTUPPPnXNLG1m5xTqPQrWWoYTanz2q7gDIRw7GD21onGQUpYHhfhxMUtQnMpNahBpCakXNlJWqwua5V4VTt9huTjBd72VLsFawhQPB5C0CfE4D/MxqAniT8CP/NXEGaZwHw+RJgqHUDuv8XQkB2kMJYpNqR5ORD3Zo6PzbwL0Hwxt+1TPT13CDZn7RfP0P3zhXNJoQQ07ifqtHGPaj24Un1kZM9hU+LGF3VoGz8k9Qpmt3sNxjLKMs2lk1880/7v72rK7XCfvS9/5/Q5xvqHjaIQuGo4iazDh1ttMPvoS7Fo2I7389ZDvM7KBK00p8ExSc9LZqwqvpiKtTSTX6fPHKobjEJgpVlV8hxPHPysftldy6BlJMkolzMGAJD+LQlqDUn60vlL7VylpHFxO/O5O0ORBhMrmnNO00+s2fiObVpz+pni4chzSHRJC1VjUw0S0s31f+lyVLFbMfS6y8botgeRWDfUG1NqRKOWObef9mjEgoi5je5H0crMrDOxXKqtZAl5EaA8UXkiSQwGURjbIgAa2vCA+km0PRHR7IQrVrQamLhONN79AmbIRwqD8Gb1SY2Xrir5+6g2fc2iPRsFC0fw9Cm+N1M1zQKv8gjd/+kCamXRbXnfkNCvnjEdYq4ePud0ia2lkSpVVlsxF1xKbaCvQb5a55Yo93HfBXtU6b5u1vTJE9om6J+46odqUg0tufbSBRUdPfDEG92Oi7jG6MawcUv2v/pWe5siIin+0GMwsnoSTlb5eefQ63h5/8uhyvuL+XlX/FSGfCCN84YXGHsL9zllSAzWsLareKi4XcA0tlE52pbSf4zR0j+Fpop9gcbnzmm/mcQn4kylRBUxl/UxJ/TfeQm/KwDJco023Y4yBTIieVbu/qLrjcVd1c++Aco8hlHLvpsF/LgmIUiJM+otOzlFfXbIcRs3+tlnu+9U8PpkuGJrhGCdOEzXX7D9JWY30NbfdUDr8rv+0qjwjUFLzQ/QYNieqPF7CuoitpU7K4sCC/oaf+IgQWxx8g4v1oHqvu12ICtwZ4TNN15ApP+ff35jOAIPwZudsPMMDv/Se+Wzuw6AQRd6/ffcL/IX+zOSi1EfrgjLkC61Cbbp0fdtZXfl1W9hwonidIvsd7gAnFiN1TnNzmmG/UuW6u1vyAd+jikUs2G6dIOPAyd/U6WJKEMARItCYOrZou0XS1n0rZgMrsbmiomLtx+iHndIilYFKfJ7Y4EpCbDufwNXz+w9D6+8czdG8xW4X0GvgLc6uDPXPz2RrI1mD5v+/V3ZUtu/n8h+Csv0eyPfdj0IfsgLmYb7sVppX2DWXS6BfaNZjG/71msNJ8qj/8XS9pMNbWvAkzW38GmfGG8l+1kNfotvN5cuFhzsNeYXjNNX68rdhyPq+8JpOU7LxFTxodcADFp3EFb/Gq0GBwgv/8+LXdRYa+o6lwnJ9SKvfVJzQGGPP+yrSdbAsX/0ln2+7CLIt3MSe4lHf0S+v/8TBdqWqfijWWp/B5lQWKlzIIf8ydB8pCeJ6GFS4BnVtRkEA/ceD2btUav6jZ6F/lF21B2eFPZmTeQnaXZLOcekWD1nK92Kre9Y7zKUlbON+tGI1RfeDPZ0e9rdjKy3Hi3izXt3u4C7S3VP34tu5Op7UFHWboV6SSsXqgvahtUMq/nQsUoG0eSzB1rL1uTXhqVALCbDlI6fMmBHwN9VbEUMUFQfqzZYrBnTqnPZrm/rrnVYp1w3klChyIIeNLrRxYbWdd7PJsX9qpdqF550qbCdte6mKtrzrJYUECXc4EvgvZO8kUNE778SqZr9zuuRHXOeqY45pdFB7PHD7UvnnC9Hu9Hnmd1meJHqwa8b9o8ttMc2RafsxtD/lh93Gr/Kxp3zxeygep4mLDW+NqUuLWMeuGsJ6Gepu7OE8+iagRvvgV2YkpIPRgCy/a24XdJ4ZuY1GwAshxa1YO67MFYtzVf2WrAlnIOicalFlbkBwSrmpiO8D33am/htC/UwUJq2xHAd8AwEj/X5q0FuHu319eHO5+75IiCRe89c7Y7gKA1TomFk07ikiHkPEwxCBmwVjvtomUGAqqkBBR8cqZHUYuPZGKhComIm32VGk8DcIOTK2MHdfcUfjJHXoUbYQKPZ8TdpWJmTZlLF51Z85qFnaID7IeIZjI796QLoqz0nLmAHYZ5Z+poO/vFuULjbLO+n8L3TKvi/PZjZ3UJ0/YOFJPfjmnMSvPerPtKtaZhplDiP+0rCZg6BUrTvCG1VtEk8q79xLYBvTevbo/TJGT3WaY1dpgMEfActsUQafWtlfZXLA8SzJj/fBDDrkzF8lclZMQ7CdYsidf5uKFvATcALmCSGjGkX1YrD5F+lKMfvS2nHGPoZazJgzoHvtZR2wun0LJFX4zBTuxhwE439+oAncwj/FkzEE8CWJxwX4/oI3DVGKuDLDK+hB92VOKjQV0sYiL3X0cdddQ4qJqNnUd27wc4Dzu660nwXL2Xufbe+E6TV2arXZrfd1Q9pzltB/T8eVTf4+tT1Fv/vMTweLDYOUfUXAiCYvVD7DBXPSQ5+pQN3EpTxQW6fU1Xv9TlJItNfXhtIE1DLTryiO4z/6j/mjG4+o+dqld5M69AHTmilDprZof/TmHEYoyhD6BjIjy1Vip6hlrZzgOiqbmQYImxtsR0DHKSmVAiar4dop34B+km1T4UQRmztQCG/S8l3Mgr3PuUcv8Z3lH4fcc11wcLMJCd26nlSayTnuFdk/T+2yg6Fnq6cUuBBRMbhWUKFe34TilPtw/vtu/3uqb8DXY+kn5fXU2apLoVhT96A5uv2ZlAAWvBwvgGgfMnXIATMGNP2m5KH7kJ5xEHETOHZ7nGIESKMmIpAstjMMFPtCAXQkldgPNDKT6k+9FNsTEUmsq5TAxC7OOjD3U6odm/WR7q6Lr7jlHvC42G5U9O9pJ+j8pTZILzsuvDp4/kg0ugATrKKUg98SwiD8U7Ix4aFF/9epV6dVCnzh7uQJ+PEJbEy8/TlKguo+wl4+9VFg9Rl+QpgXBCq5kx+ICJPLDt8dcCkujh1uZET7EA1ZRLLreayYxZd8hL3mMStHbCqO1Lz4Q23UekxDcXrAPK6l4mYce47vDkSOZayUaceNg4dDXUKwBaxwNciP+eY5XkyMjR73wWDqtMogO3NGJu3O0tSVZZwlvSbNj1uCXD7oR15J4sTu+dmKVTLsPjFVFME+EmrcQEqwHYamc0AC1a/raMSf3mdBw2UrVnDaK35yI0KlXfRzU2TIHEyUL7OuaM9Tae1oMrCixnjw//0c+LTcjhMJIjhhUro0FPlVarBOUVXqRsafVCMchk+wgoanFSw1ZTEFlXOrQH6XJLNufZQwl6nbRV+GRpCpND7yrpLJsjzZR3qyhgvMPIyX6bJbrorvwuz3vbetUDoEZdXL8evQe7I8OUL7uWFPm7QRCbGubJJozqT/kdNfZpu+PjesVJGOa1ExC1WkVXQKxKHds1+8QOinkd1Z60L7YcsiEshZErDSTBCdvsNHzRYqwN2u6CN3C8JX7VV9ivMajX5kOcI9ZFJhyJ5184XtmTHx0c92+Kaw2T2t+lbFAXRhGALiRGaJ5GNikxIQasvs+aukxpNmWtp+C4f2KHTJB9Jbh8vK1ArJjQURxunB7I2aHpyXE6SXPpxQSlfSTte/nEwo9SZ6P2FBZzF++28X7Duu0hZ5xfA784iar3YUStH8hRvuFNcpHu/CckUViOuTTS4sGOP8sDatYOzFjSAsujMISp6ERuW9Epc1pBx3k0dnuHUj0eKGv0DNeNuid/UnQZa5RTfKxpie0m3Q4ZKbpajwvgjYQby6RZdwazSHlBhieSqgMZ+BndpDss67YSCdZKaZqPlB3js8CiE/THUNugOuEdUnP8Ja7TE9pCRygIwor7nq0IaKmRaclt6ESw+gai1Wkt5yLS5bQbazIC8uE0apjrxSAMPdPJoI4BLHRepWD9m/kEGC8iTAiV5JuunCU9/huZ7U4Rkq7mWeP7HD+tvdwl8H+AijLbROlJ0BW8EqqqlpFIqBGvB1NCKctq6NG4UYstbHftLUw6blv1VTo6hKsOcuE2nw711QNXJjb/LoZYUN8/nnv1X7Ws6tJD2C+j1Hjp7xmpkE+9MnNsqRnf9uBl3EWXgyyIgyevrx+saSHW1dDHbNTMWhkGPXiM78WWapZGhrwG8Iw9mmiXhAIecmCBot8IkZjNSCuGKkiGIdDNbJVY9EMFn7hR/7sEvddi3fa8qpLGslFoEK0GbwPiy/YaOzNoGu41Hgeqew7UyDhrUkFC8sCfU21YJ+hQcSsq0brPdIbJj/FSAGgxZ8QjAq5FmeTjf+6KIKjd3har83XGzjRGazaDOSp2JqQUrJfGlKhUrma2GYkOAZjidmZG3eaZrGA1BaWBu3hmWXJXKEm9des8jXWs1nk+z/FKLVC1ozPiDz+1u12YL4aW8j49NYWT8uTRh+GfFZX+qRggda+iccvafU370UL4prvXI+FC2FZxKx9CDzSWkCVKV2YAl2NpS9TkjicrPlcaihURNAFf0z3sN1WcwbObPFr7SvPwe4RQFuK7TuxXJjJB2UD/GMHrWwPlJVqKFXm6p7blfEW+O13+tTBMJWH367H5jrIXrc1tWZyLM10PLCcxXyHSLxkllnfSocIwTdRnz35JA/V+YwLWkjYcmJYTLzL5WM2TVvL1HmgHFTMAIEY3lv1ms113lj7Qngq6pn3otI1ZFt7Ka74crhtKADQXy4evfXEammGOq3A9Xt3VJ4gqQhGlSKB2Wbn0oYJXusaxu6Vrb/28mltqte8WH1RNdjDrGN9cLQw7NJ2wp76Wo4+qfmgX19YODfEQpp0InNTwd3YL3peuksniVfxKV8t03pDQ/2Gu6pU/rqdwuiXc1CbCVwFnbBYW52m5JlT9CH5Se7NnDsdvd7mHZD0QB2Dm0/bMOXgpMXYdSPS8TdeN5J8fUdaehRZr3qCZujzl5++Bd/AYSo+Ftrlt3d0BH8nLYwU+hm+wVaps/AkGlLDgpWjVYAY3SrL4TzLqEQTH82JT06ZJRRvtycXa/9Oh5tbWiRbVvP4tuGTFPRD199pTtCijOj9ftKALYmWTjA8ljtaqc4NuwMQKY71nKoNb9nO2NsK8djs0tTeyOOwktVuLYOsbIB+ep8macQEZhf/oHdE4lNhOWlQPKZvymgFonePySI0dRDBPSgJrho/UCD8SnxX8mNGHK8ZmnXL2R3TiGzjpvvf88C9D6CSoMwmHUChfDJ6o0bJBCD0tANw8Bx+PXFeipgL4LFsrtlPd5kFEJoD3SkCmPCBVAzFZAJoBj41yBV4BOfPg3OiuwF0G0AL5MreIECOKgFdJAF5A4QxAHKaArCYANyZg8AzAeFxVgPoJ/TKTfe3/U/gyYvckrQDDnL15klbgI7K0s1BurXAgBPtL5RMb5glcRfqusRaBDCXcLkPUGtbZrIA4I1G9H3WZv0b9lHGa0SyXl/87dli4/rIOH+PaxsZ04JvAOq9MFqDLln5gVhQI3Uhka2RvbwCttYfbkkySqA1kNLdfngAME1mOIOV+wObdY9aZX9ZC0zGQomR5gkTo4vBN2D6Wt+0fxiFsFK/h9h9oYCEKf/lksMk0WbbTx8q1k2VzfYSoJcP5rixzM3kOQ6hXRaKUpW82XysAS8Rq46LKKv0qDc5vWuSUPWW+GU+ua6D5c3G3EroLzsjH2rTUSq1Wf5BuWyTJVeGruZVvcLbu2m8TRNkqc4PQs+skF4NIBaUDhhs7h+7O9Y2H8+fjNfqPSCac8l7zTm6uIpv9zGFkoRzj5qkSfryjp/Aam+av6mf/HEXkq+bTFhOEI+Dk/Y6wsGtQI1wSyyZVs4LJJytSwdDlvv+KMcWC+/f2VvFqf01m56vGcDvtFANzjwmCkSlzVGvHcizXmTLHnPfXfQ3CDFt8aJbW+RrMaHf8GSP/mbWfnzd5JwfYI8uxxct7qSBbxAveibQbmTxk9cYnOfbCHIeYC8ClKQrKSHwcjxygZa9U/WVOdOsIQA+jhVv+WaLnZA+iPWpudANsex39t0CoCYJEE8RClk7CaB2Gj35DMUUvPSzCZ0UPDTM0WOyd1Tvuz0cE7JGynqRvvdYxUMoKavV2mPmezmzy5ZGtydPskGebN/8FkyzL5BvxV+UzI5MsSDzJCqzIj22V79nCtJEP4TU65E3XWtYRR3v44qNCV/1gF0Ya9SPGqqNcmnxqH97SRJM8rqV/ps0BLf1MHsk0vlCW/kMcu9LYR+qDltI5K2Yc5fFDaznKSF8rvWwxtTJ9pJGG+qy0pytS82PMe7DWTNK40ao08zozCSQvTzLmfsGG0BNadkIbYieYCyZT896p6SMq0ZK2xsCtXunNA8T1ohTDPK1/M04mbfradWphtpEjo3cYOAdRjd/fZNkEyDqvZxdT7ylmeoevha/oGBNUz2AlYm4ciMEnSt+IneC8A7w5RJTjazPwo9yw8NCxDUqJ3kcgjZluNMFlIubghMWIDf+njceVbHG7+/qc3+DRLwnv03ft5OjpANS6BUoNlqz9o3x1sgQ8pRfMy09od4vESYsEBrQVtzDVizov1fDZlPL7JA/vRiBw4V8McStBUNl+8bWZJt3WCbUa+3XAq8CXE2xGjJg2uS//sMY/L5c3+bnSBJXxfsMKQkc7DJt2VHjc7KIP+pHnELEChgOI79ry8l1se4jnaHp8jR7yHeGi2/09t2YTsDn7XoXRrcssrvQkl9JoxtVencV+23cZpp2S3bAUSrtV48+9N0Dr4hBPKTNiGbqjWPIo/Iuhck3xqBR7AZMUaFwXbQwlkbJ3LKeqTFI9onyxC7+mzNYYHFmDuS8px8O2xtu5b54/n+Zekgun14F5YlsxWW/i4rj9rN0QctIkxiGiw8M0UVtBNhOMIah5bMzCpWUAbLN4OTLSBogORNTNCcvzDfvys7n3o9T3pe6pfD3ACV3ywEZMgUczsX7N8ytRDkh7ilcr8dOELMM4QIxbTPcQNZvtuuD+OZxM5+CPjbOcavmFp6A3SMXkG+HueE9BLqct1Ssdoi/jpZnmhA12vB6Vb27yTMbNEcliex2z1UoRwKtQjQb5ExL1aPAA6kJDgRoHFoE9+7XUmS4k4WqUFyk6Rl5EdK68yPRU4lcVMTNcG47w6Zl5ki+561d0mUTpcQQtJ1m7n4xiucI2Pybd/BLAJdWm8R3IINL8NuxFfdk15Gq4uvi9M3AlU/3h0L8xT6DOZJJ/BMnLePeDyEsZAZ86/P0LdJFnrXB+Sx8MtrBXpCOhptcl1FzpHa80UQYyrWm2PdC7wGNcArG5k0h8zD8v+Jxh29PvfNLHvrUFYQsHcw9SKxiSu8kqub269uwO6zFrmJMKRTra3ueUXAxjoiJVCez8sQVzF52XHLzXx/+hN6n9BqFYVP/HAhAvJMXWyvhuVuwNBxVstvDiemJ+ILxYQS0nUN+lhhk0Phf8bXQ51qoaei6rP6FfsW6k6VLoDbDBeSNKTfoWL4FwGz/4Zwydz7OEFmKQDVN8JgG+kyKhrRfqo2B2Olzlh5M0UjUESZLskJm9fVLJ56sUko7CKu0C8yUiXmu+pNEXFV/UeOAK1zlr86zxvteHKOW3/+pdwt1aD7X115LjvS5jZP2hINvZVuFY2Qzw1QgmawDZGkwdnWvhr6v2gKhljrwHIL0onRPgxTew3S6UxnLfr4RiEVxguiH0lmjo/kroeLr/eC0x9iypQQyKrrMnYxYA791X/I731UVUhw1jl5Ln56Rb/fxkHEHxki6KBYCywYkaa2dJrD/Hj85lTrfJcEECyvFrQIJHufB20pSygiVRXU2oNVc+wspjIMP3MayVuQJY+Epi+vuAE+KL4TJgLOCvD/zUnVG6rsCAWLL4tgPLKviYAR241upvYFbqQSK62S0GsC3HNgW8FTPUAVlehV12d4vIr9F2gqCE2qlZR+Vd8fTvo+GAuFcdxEDFSD/ODzJKEwqMXEFxTTQwERtHOZ4nvu1AVBqF+M6rDJy37b0OlNEmT00zGU0nCunGKl3G6sReZSZ3JQLTqgIhixmIeKHAHbU4aZ5jtM38VkXniV1YbKTc1R2ruFRk0H2uXpUmn/6luBd4NxsFTIkZngT1dbF2ccdybfoSdPCM0y6ZEElOitaQTVVRsd6mmW0i7k8ID0hvSJkeMk3Rlfl9B4S2Mup7/6HBQ7BP5Yz5SVcGTNcw1MHWDq5Hs6sMpoOvmF49ME/67QNx1FR+aR8sj2jxr94ZqLAjXQ7o3SnzpjQHiz4eak9pTw+sb20dDWxIwrTZFePhvEVxrBTb2HH/RDMqZDkQ2FRh4brl50LFMRc/Jsg/eNnxBK8nHTvL8dVeu108JwXMhMWVDFcmlvheYgKx8M1Eay+Qn3Iub3nHYjn4emeqIFExCFj2abaN4Ocnx2vO/M8hO+C8oHAAu0L5aBdPDl5p+nDTynKAhZgYoN0JvXO3I2sNlC93Dq54t9S++Uieoycvh7/fAh8/jtZAx/dsQDYZOKpyZXmNDu4PeDsP84+sB5LTIBtWbmcUFOHqiudpR8/eNZ6EarVcssc1xw2w2Ia5TaDEa1ZXKbeiW0E1u2rfSTCEFJZ16aVJc5zeHWudCigQtmwkU7EETwFW3ihXJwp/AybY3ZQFDEpbr+L0zu4Q+thsVrrdLTmVyLJNkaT07/BDJrEuvUFD7a3UFxfku/LRvcaXYyNUx2HQajlMNbEsfN92/DlJddpAR0yMNSNDpA3cfL/I3h52RHdVQWx3XWnbLm1fFPcopsDkIL/T304VUK9eIhTmwo7Fszp6b4J6fHfLcosgrIX7hn1vd/BWuyM43rd6b0QJj3Dw5UnKgkcsMuIAWur7kNFN7lSVcG/JLzsvbq1E/P745YnacfvxILJyHgHgBmNe0hFYjlTn561c+gqrTRK+QoQ0LbVK8SgTeSBfzYsazLofF4DvmnhrjRf3haTZsR8T2qR8E9Yci5W6xDTFydT5ZBvAq3jD2OQJXDfKacMYlko0845SFqwAmgLbjjRr/V4NIFjILUrIdF4XFu9ew5xnZYVAJXsnUB4q/JqEPo5YNZI9Mh/zLWgQKNFtyu/48LtyNC+KUBFXlv5U0agggxyIHOh9xRkLkT5AO8xdgZFKdh81xMpWQ+HazQedb3lzAYxgiXUdTaAcw0v6+amr8kGIiAPsQCBp3eq8TWkbjA9WLvWalmHg8IoTuVqRYCIKksWKv2xIoQyuAD3LxN9vg4FWbtWb3Weo5PMZYhmZFIYLY1JE2gwW9kE4tnNE+e56iBicAZNF1I1Pkb8BHmI3QMPRH9PPnGVmzwndtoCFzg88Nme8KmgsXkt9Q+oLKRxKsaonFj66LRLToBS7LUoNkxOBJUUGNkD99aEDzskcIZkFYUmaWtVpsUJDTqnR+4of0wooaiGece6KHDJVZQpBdRuN+j1n+LyHO9bFnymmkGJ/kmqo4AxErR31fngWamNcb+Wa9ddEqYzOrSHvIIvinI4Vut+ILHTNMV0yZtSGits8FpAXVrEEyxCsy9mu/vzZN8AN2sHgBT6elIUVz3LwDz+aJ7usn5Opeg7bU/J3LPc3xgvqGPlYgWMxUHv7EOTUVIwqwq4CLTV7LLh5Xya0qPHtwLSNcUW//3akbG1AYkwxB9CqLhl8OoB11hKa9AxdLA9IIxAsoQjWnnJhNb434MRCKAY12lf0jV8FOWdfd7IVzawbqGvzraSd+Waw1S03v/SMH1UZu52WsKtbgQunBjXi+EPhF3zA33mh3IPtLFoW+HdZKaENO8mDlP09Dtk6dMGs0H5wmo0SHjhqx61+fX751M0pckroj0VaTfMCFeImvON6/VTchXCrCErfcO6FHhbSqTfUkFy4eyFQ7Urbgy6SZ6zq8ftonDEbk7JQtpd4NsWYWA+pqkFj42UcFP+xQ5W1mINRVLv9Otd6NBsuFHBVJ6RffrxZp/eCDQpX7rWAjdcD5j3MWG02VsXGmHlcAwOSEbQXd7C+EuuEvchY7y7yRQM80BoRfw6yjju6CtNyxj4SOcEq8hLIZtCyMZAgvkbvHCiX26L763zT+t2MpldE3LIOamR2yuYBl34k3lseDZvrOBRLl+R1TZQ8RFc/6nIieGKZKTtBUirJTkHWyHnj8h5aLEMLbbwgPQwZGDUlS9uq3ASDbUdoGF234lvGMFVDkORmfRqBxPOn255kLPpvCTTpadUltcpJ00PjRjKS+hijRp6y0FNzHj6rFOhTbl5lE3xGARnZ1n8IxKMMSNWjwupE6dOrdAQ8/nMinm8LN65D3e4XDnzuMBGFS6rhVtvFhKEuKZINpTL+5VZHwb3wujgffop4Qa7L+xgce+az7ssNJ8pMeZ+b3YBQ7gf8w0tUnB4+lz/r1iA5m35M8RhG0CTSLFGaICeJTQnVm8eVvmGRlUxd4hwBEMIRvTodMkEj11mxsuXtAHszaWOk02aTTu4CGen9guo76q1b/Vl9P9O5TZ6VGNK2yn9qr53rcsFT0em0bqW4O50c9fkFkYc/UiY989OH1qJ96IHZ3D4qjZYCPKBamrecVpVvIrs5qcPhxVLsewmneUdx4wdzQJ2iryj+sUjXdGIYA7SWhZPomQ002xmpsn+lnjYbgik1ugY9kAbgGx001eEZ2Abj1QIE7My80Yekg6C21J1mqzsv7T3tSU/7OumG5572FoQIjBZLE9bZtmi10dG3uTNg/fq5uWXx19V2niHGODtwKKTFQdFwShrmmqIdkIA7+pu2mNEzYBnTZOJaF/QB9GYqsg9vJUQEYUx02SKxMYZFThwG6HaGUiLT+8aAFD/opcl9VS8cZXstevdO+Cj+wbMRjuCFxbSBJqp3Q3QI58xGkUJgpJgkyxcIGHxwiwMuW1fKaYNrZoXqHpMiGy2oVh6RdZsW3vbk2hOX1ZG3+2KSRFCGTc7/xrov1hTI2+LbuWDQn3jfGFb/jsZksDPUtP4OWWVSvxJ2m3xfncRiXBynrDH8WLuJmAZbKe1R+fCPxkru/csutYKJP8mu9MiNYMDtoWA9ffvV2QiH+D3Dq3bcU9EPhzwasAWTRCzZziF7MFXsZHs+POebWvx6sDrteSMrYnUF+XLFHhydgfD91rrtHViOIRLZECQbKywyB0yYWF4FMFFg2FlwXu4D9S/uh34ikRK6r6L2z1PR8a1sO+qeUAoEzgnT6OnfsCLiRo++4g9F2rNgK+t62lj/jiH+KYQmiVWz2Yuqd8szd4+91IqtTh+hqtjSZiEGeDIFDFDZ0kwNHiVpa36X443kY+oyo4Ov63o3DAmYZvZ0vAmqQpryIonFMXoI+QUKXro6/4rC4Wb6y/ri+QAx7UEnqJB/zuGtGD5xwbulsOSNOy/NgE4ct7jNFWDrQqHiCvCB/7/slO9qyFTKu8RPS5c6Xo8gbe9i8xYuyHBDh2omkSQubrPjOLFhdr5M2lMvVDZY2ozLPxrf6qFK9u4gRTt5bTl+gcJY1MKlY6DXtmndTGaeCJ9Sqdk0YwnslrTG3c4Xyvr/BaorvmfU9WBRriAF7bfXDyEt7vHWwZfr+ECHLeCUsR1nEWhX13TZD8ibGXXDCOinqJVB5os+8eF0FLu6r6eL/k/d/SU8mNBAHC0rVKMLx7JSN2cJCM958Ke1Qfrre8a60nMHGYsS6p5SzjHTqluDaM3T2cLbaVxY5SSslBvjIJmeNuZ86MLvXZi+P87UK51Ruf3yYvBtMv1DoDRdodWmidjCdQWDC7TcKPE9k/zF33v2txaBoiJy4P1l/S1uGLoeOAHhPF+0/wHUFhtVgBpGUp2cgdtw36b0/wlv15ucaxLYN0YtS/ZHM51nc2wzGpG6l6DYy0q4kaeeBBMhV90a1yqwvu9glpyp/06TEe12JCLE+XHhEDlmTLWsClVQ/ZfITdeXcHEZeniPwvfdmZUfuzoRrmyqQ6MiScBWxYWeCVTUNjXF8mUn/7rfZJEGKinC5PBkV+S0wmCuD1wfodD/qHifOfG9r+mXNDLcX4DIMKyzeyErakC+T/i2WLqy+H98gz3k4ebWjeU1kalPUNBeIafqMoZ/WpnZGyfIV66ME+/ALHZh2PxYEUWi+r+T8/mUbH0kR9Mg6BOBwd6hRElWu5NIDveqoR+hCmkDXABc4L0CfyZ2qIkINI8iOB4CZKuDJCVOBAC53kqyKa4QIBybIbKMYsahRSAF1rODy32gbtrBwJSoFATOAD30y+lPIZLVthKDowVuiPRoO709V3CDtbXj66l1OAirfCuHUpPaat6QmwRi86RtSdoONzLfMWj+VQvUNW7eeoMvQ2bcbLU3DvYQG6ory/df2TbWuH2huLHzvwbDq09FPr1B0mGs2uapvgUY3Qrv76RDDexhvtFpdOnoVMmgaH8FYDWz8cjyKGBXExFdzXCL182uhHX4LGGzu4P3krSuABN5mDfRbNFaRdPLLe/GyCl/7O2hJ0h+5A8D8vCiP6qegqx/OlnXnIZqgeqmfcm6L34D07HdJH1hrJuAQx0mT57jSX4COX3ytV8Ad9M5E60zl0FQihYgpGWTUdbErgxBUy9r+3lMIQceoxolNJEffQPDt+HuwG2WdFAJiBynboCQ7qadFsx08D/nzAifWdpf8O2bNvUperq5lyWSM/TqYiIwIY9wmQ7PVt9EP4NlZ3w8othdhMSAEvqECoNkleMQ7rh7qZrdha3AJVAF/NUPvJOafFBMvQDvMbz4zu2yLeI15yonymiQMf4xf+V87z+JFUIvhL7XBCYHdod82zauL4vPAvD1o33DBSaHCZkfIO0ZoEwg4ouxkPKNofaB9tqwuKxpDPBykdiWixNalCV/fHM+0P2WakGgs8+uDEvWqKY5fT9m7mot4Ak71DTj7pHHm/Rm9NXgtJPFkZNPwfja6xoc5qAaiV+CiIVHpC2hXa1OcqZlq8XKZhxCv25eYckOfJMnhHeCAM+8+LQTSBDlEok1AS4n5StM8ny8YMdI5wJZ46xGLfEcMDduT2+HszXbXqxvFeP1t633bv/Q9IuiWYCNH9AniqwW7Fs9i7+A2/BQ7VQsr/s93qYiEKX01W89J0zgpOEzuBaHNKPNv9wJ3+qbZuQbU67HuVrZWr4VBvfrmxsOZ3SMTSI1tW0EvEwgVhkCd6qcLh2RpWbXE0ArPWb8fH3k5JxRz5N3ITLhcdJnvIO8xhKL+2tKlx4O2tK5AlW0HGRsiZoC1fX8PD/d425gc4jbB3THZUEmrYKMYgEjCT5dREDGEqtdSMSKuEOytncsQx8gVgw+tbNLnm+V+BaBJYwJkhKzeu+NVQN8lfR93CPOe9y/oPGTMzAJn9AlprniaSm1NXHMWtIfRJTWW9s/ymT5GWlWPWBe5pJtzkeJ/PBAQs/iPHdGe0TSL4FewUTAHHiMQ4bKWLAdogKIsmEAbW3wVtxbkiZgFLIVwx5AlZfeQ/o3PsI/+Cb/NPZ9syD2W5P7Onx8dTl4cSf9VpchcHnRF01/h659OFn6g7z6xTOG2Vu4uPv7inleVlPye+hkPfXoXbbcryX6LGT4MwC1MGtffjZzne7o0+lJaou/e1tZKl1J/eRmPwQ3e4D+0x2sIAimAYeb/tjIHs/TN3F/lKembKP+XlLTx5fvH78PyA7e795Pv4vute1z4d6jrbcP5+CsqGMaEK8rKBW6oSeiU+v7dZsc6cJe2DohqIanD2I8odhrpDOfayysJN+mxh/vNrO1PE67vRFKZWkwZeqFk7ex1Hq7cAIHXhA2v/+KpXIQJExvp7Y1y4Xicxot0u6ZpEbtfHT5UJ5c1cCjCAuyzk5Pjuc9Hl71tXYSxIJQSmC3ypqwigLfpa1fFbvcFf3Jy2M+2ERjR6f8z7vx5mn7znMifJCNwm/S26yFHcz0AUMm04RoADik+341n9b82Z3M4K7tZfgPjjT37kIfYphgGsoC/KVV5Ss4UtZFmDrVt/4TxR03ibRdRQPbLvk6+mXj/DYFB9UMHh07fIsDCPfevuEyovnBfMkEKEKg3TPTHxob4w5jWDPv0WlafP8802aruUQROMsSFmgTxFOtu+2iI7W8GneO2JJq0eHwrSmAu7k3TSRvaeeespz+dP1n3VvjbxKFt2nbOkdMar+jp0nEslpJ2iytUWOyNw4ZKvj+iTI9bkxJ9i/lK8MFBp8ZCpD0nXqwtcQGLCofCMSVsa1nmjJtUaVH2kjR8gM7n9A3RjXKW7a2QPLNISSdBZusd0SINmpvW2ZSTdp5JwrxX0rX6uHGeddGWL1L5yzveFFXlbZdNCA0f6CsqS3c0P9Fd1adOshNYrjcg7SumYqc5dQBupv9q6vmmds3rVU3o4r+H1LDTTx9PKW1ruE1tcvrmXhN7WOP8YCQMl1OKeFGTPCmCkRMZXg2vYXkhZqL1cbdHWjZJu4YQNI7X2M3f6BpcwYxwbsuVUnqWiMUvHCJVrV/ybXiaKn6XCtPk112rXbRjEu8drmV95/bpROkOq0YCbuBlXlyti8Y4hRKudn4J+DBZzHwPk55tfItwc+bNeWcilAZlhRDEcwEnbNq3HwHrgOSxgCFYDk1LnKhXA6j9N1SxQMRpIJ29tgXrNg7GPAQ50d4hOPU2enTnkMZpJtttd22XAvDPoB07a14uGxmlgHVzfvZhu2GmqwWa25slko0W/AJ0InYqmB5JQ64qXURaTQ/4qeoolCjFUK8SdSWLiOrBRyJOuDbzfTaHuHx/NGqqRbQzFHzAZKOXmSHgCpWIfvWpkXsQkWICYsRoHIuqOE5c+1OUvSTD0Ed3N8QMyegNtjsKkMm1axPBv+qnkPa8WsPccGCbAI3PO5On3tFtKTceQiWS1v0qGGWciH4lS1TD7AjYHvHJPlJ7RojbiS4cqtjZWlXzPeDYFHVg4gTW5RG4JYsp2512+7NrWLX33u8+kWMQPcPguJe1lK6RAkN6NVtGxy8kRjZZnRB/Eh5+4pVJttyrlvaaG5/BqXEIn81SM7mxA9lCfMQ8e6fjxF4c2M/BmikeeygMiE/itL4QPVOTXN8yhbxM7XdKqgFXGBjF5sQmDhu5VDTbslCGCQbeyA4iSJgAY8UsRXQPW2W53dM1CsCUMYOvmWWP/F9y0/R5eOJpRdY1E9ixHbMsGtmb4XwhsCoow/2MXer/aoL9+6nV23iuDIQRddASekP5QFAtChpA40tx7xNU5vCt07pYzAIWpY9ANBWUoFNWh6W9M/C6SahK75p27sXF+DR1jykAWAF5hElrnPp1RlJV+T+vQ53SOwL+klZXdGbz94W9qLYxZ1+Z0RMRDQIYvD0qxr+ex7RoOzX7ff1WLD17uDE1N9Wza+k6pSD/mnW7ff1WNasdhRYzHU238UuvD/y6ALpcbhVrKl+cQNZnr0zg19eMPvJ8WbfWBtL3iaW8JQ9hKaV2Z2Zuw2095sYU3Q4Ap5i05usYHkL+mmC20OAnk/3Bd2ftq5/qoc8ettuzxDUvID8Ara53h9kzQ73MnqK7kyvTzsoxkZxGxyiGwZIzS2oBFG9k+wDifHX67B6W/E1hWgEf1l9Lqoo/gHZTrtBxp7d5sTSh5ezjHVZFJBrzfK3aU/LEIhUNkwq9+wG34z6z7TwpsYJx4+5fLFK9oc9ngOPm/IvJCCuXX0+DegaHSfzl4cQyzsWUAOkNto2ZiezVCA+GivF9hKH0dGDs4uw+PQ3HXYJDUyWZfGZBR0N94j3jpt16lJIIETKYqhWvn3mAv9j4dtMo/PLXl44iBhXmaTi+0tlwyv2me+aT2PbIFvvT3OfmTF9WvmDl7tARqx74Veo6iwH47FHsZ9np1LppKxME81bdGwpDLuwZPIgPWLPtI3JKA3/jKgllQCwVvz4pNzt5VNeLuue0eolPiPQEv0B931T8Fr69Y8jZmXzs6QYxmc54c57bwdcHe5BWgCBKURZC/Q2cbrhJXkIHg5YedrdheXmb3i2oG5HuesA3BJfWWTSSI/CAXQTl5KXMUgY6a7bGgSuO7gdF7Brm9ZQ1u/M7DcdioZrxykz1TVJ093TsEmXGAL3hCxMW1NXrcWPtQjfpVgTVQ/NOjJ8umZOp+vTUJdayCNp53EnJ3BKoyiqW3Zv7cA32uWLJbxhkrr5a6Q88U3QNmbe2nKc3yX5yN/UIQhFIm0KAyJ3NlfEyO6BVDv0JTmgSdjlXldYrO1/8F2eWtk82R+y/eFCB+/Rez6FEmHasvwCXzh5BLXDAntE65P3FqZoG6KFTSpf3bQE+RRDss2Thx5C3NdJUgr1AQyE1xFmgpyapYAELTL9ZxcpjoW6Ga7bCtNUOHX1U1EA3fW5UyogkOMQVp8O9+XrCuYv32QbDZLmWnJn3ONFlwQ5NZtQU0j+whARpaEOF4G94oDuGkI7Tyv4Slcp8TUkshP8bnVoGzdGyVA29vzeoBYR5az7bi7ikghgub7ANr9L0fN515UIlVUmAyeoPNRp2wEd6QUFQZbeJd4rgZVDKE0F6BFxDxJu+5w65Shbxm/dpY+FhKJxqv4d+D8vgXHhcAj5CS2+C9jgrfFf9ak+koqOdFLQKkt5BsN40JERYY7K+TND474eOuuz7Wes4/jUYB7pLKRpsq+BYN8Enn5qJ3yKg6QPRY8zOtGXDjcgbszkewiSuMH3Nzvg5a7DhohuhWtsQLTM1pH1s5YRwIUdunc/piZHd0GFl9dAN2GYAPiKTqv0kZtu1cUnsInPWEp9YGTBdIITAGxJa0lUp8UpvLdCy/oWKjyuy2mFz7KwPQiSqE+ZA0TZyQ3CfGiZ9615zhdJ4uMH84kiV/ewWSSvMx26qxOOETKdFS/8bvs083dJIdkpk9vm6tb12W6pwzw7lNL/z3gYrLmMsu65uTua1hrgFpOpp4HP5LWxPSHKU3uWjMji3gQAruPtuk2pEjw7OuythM/mnoxnOZEY4QEohQq09YAppbzlCDnVcMu8C/OWecMUj/teTB36aXG8hbI65v0qR9haoHndCX/qUmK9eHKwwNWGbLCJif7FI4qRDCvD6l4CJsWtsNm/5aQcptZonh+3yEeaYyRta2vn9iI6c6L9pj0vrL7rbdaFKJIWoGnSxPgJ24gmvLZWmKWNJmcDwVLLG9PIPH3tZNQVkrjIDyRmbwbcjaINukL1SjLcRYjRK2bkV6T142dDrtYA8ft5TC0llc63F0dwKWhCwAozT4bwiZSaENfHGmKB9+zGy16wecYeLS7c1mC0jpSxlxZNuuBUxn5VPOYktkhdpX2+dHSYrRqNU3YrisTPeLZcEVUqQ0NSTLjE33pcAleEkBWnNoI7c6rkOJ5QEV/vlUYN2pXWFCH/zGp0PmbijThscO1whWcwxm+RLMvpBw8dTgt0UufhEu/Ro/YDycCP9sVnj98g1/F18ybNIDTgy3X0fC8HUNEC33775jK2uC2Hz/TTrYRqTCj0Qv+u/jV+M1KsKf/C+U7DIHiLD1L7tILORKavqXE+8UuaifRwJJLMBU8HujxvJhYxSnB3g6LVDgNPqljZgbBk2pZUNnUIBFEuJLWReaweXtN0Zvm+9LdtyjLEn5DgMrbjY8nNKOq9K1jIZXA3gfscJDxLyHbSNgZBtxGbh3trE0pbUiZyYDywiEydzPXEgg1YlI5WBF6fcd6K0qkadqVQ9zE7HhM8X096F9jZnOwVIUKpRiJObZLT6YV2T52cKsMJk2Tiwjfa5tMLC2zYk2LabzQBEQfPj7jlgscKh2qXL6MKCNGVtawNVgWTfozcfFt03OCUGSerbWcvHCwRZfYT8IWpsz9rhyd6gIc25ND0hKthQFGxtstcarniAIw5OwvAXAt3kfMnDhqHIeGy00jdrdrhUt4dqSCRiVREEvazwJ5ARQzss6+y2l/DALSKoFbGmzaa9vOfBLk2xc3R7ABseCLvuvJ+/IlotcWOG26Hu5v5KRr/c8fZPxOjf+SsALyTk+xKL9dPwijrFJpBfHnhf/CO2Yu5GvIUV0/9B9BGbTo1Cpkf+4VCutRBTrtuZIOcjaqF7kqbrK5I9oOOct30QdbXFwXpwMeIkvHlbpEMJkjVIj9AKodcyKwteSw7pMBMLsNOCZq4y4aecdiJGCrUYossQmh3MKeMSL2slF4iI4koGYm8KKHlHNzk/7flBrEa9W0oHhgSO6FeUiCPVe/5IpCv0i01mklXTASkjOlFaFbbwUkkNbD+XZBs1B+61iVB09uBKYAf/LloP/qxHl6SUtRbcq+4o2ITIC2YtuNGAcnEhk134PNVAU5lE0S1CDLQ4VGrm2WQeYZ3ja7pjD09CcZg0rvPyDolFPuAc47m7S2LLrHwscPTsnYZ6AXofZ06SXNKaApWlD0ciCJXNST5bIAMPIY9vJkM/qgLfICEwSHie4pIT9vHMknscazh+18DzRgK2yE/MPP5eNDirVh2oYRmxQT5VE7g+uLBNhppSmCvxYkEagJR3LtX1MOYe+yPQXhBe8xRVc67q1mSIG442F8UVdFdRL9GDfhWz1E6bdY7wXORjPNGhhzZ96Yj/sgXsJM+sFVrAhxghLnHR8D33xmtYgw0jxroyncChI9ZW5h2jJLTZZSfBMFyjot0SvCLxciZJkKLniypUHLo1oqZhQwVPcO/jdB4BCJgLydBHJzXDYxfYsizqMj+2bBffKu6QDRfkl00MEzIRlJvk2RnLNPKbjbZ5k/kkckOWq4kSN1GHq/eSa3SmzyK2d1gsdEWlB/0WeLzdouQwwq+Kez2Cd3Iqp5IctgOz7VGDACksZGkQKtl645e7PHuF1rSejairZP0iLG7urI7xx3h2wnMU0VbND2abl4IIemQwi6gtUkNhldjxD/nwkbyHSyFvAKY4FjJe57AibkBo84b8P7+iT3mDiV5dDkSPU623Wt+nSFModOuN8cTtMdhDswkeJ5NkJxfRHeetCZZHAQTh7lAGYm6Y3RSmcPc6u4/4z7tTNowhFfadFwOORRNut0i4Vj1WfK7DF2Wew1atC8OzOqK5OdVTjxEr653j1v+ekWW8FMhSmWDriuYmWuYFDFVVz49fDVKtYuiOJrhnJRV9CSQt1jVM0RNa+wXsK2t8AJpS1VeJx3ziYAEKQEtBLj7qVPP57uV0JTYAv0swBTWBolyAUy44vtMrXkZlV0qk/hZfTs92228i8XpDwjFg/iK+l4+khg3/RDipw/BMQYixz841+Rbtk4YO9eJf0YKFl6ACUxTQ1ldwzXVy1WtJZkqYVyReGMk0JOnXq6PqmFs7W4aFJaQRbGp0pxqFOBv6sC3LpDKDNCHN3JYCTax2KXQcvaUjCpvzauJJA9XfVC64w/I0oAxhvI6Wo1OZNCsQrDXlAz8Fb+naheItUjtCERW2h3iT3unSBPl7BokqLaDCBX90t4plC4KKeB4l4kTpjXtOMeqI9zYE0sONg8acSJljfqN1Vr1G+JrTic/HqVTFl9qz917v0TWCezkwEmcg/ZPm++f1QXEpb3pY8Uts9CVErnbcbR8qLjkwyuMVJRr7+0deTFZW7YWVA8S2dzwpXt8ktxf73iiJRq+KenPVcbKK2LITli0zGcqx+8fOgt0hrx1WX02lqb/BkzLMJdPGFUReT8AkRCfxzgCJ/LtEKJtxSmCWGF+v8NomMbpEVUhPt9XDbBOeJ7q7mpH1OyfHYPIRZ0/2WaU3nULKMoxDSeuXN4J8V2GQEutG+MRfEzxdEpkMGwfJzVd3karuCc6CWG5aX85lbJAcfgJiNtur2NJr466eDm8tATNXETJAxrYRClhq0aCnJXG4MENADE4Bc7cweOpmQYOqG3C/mxm3/3ncrliJf2yHVAI+GG+dfLlp+utFDU6nT7OV6D9lpwBN30YdY8Gb7b/K+MwTTvfSPe16uHD3LueS50DXpeE39B4xCKZiEGs8hCw/gIAFP1hVuilBCjAq5qY3S4IXTAxK5aQSeWnxdape0KUuNfznkrlMigMDwXm9tPtew6kjsrZS/iZPp2oqm78y5mdngIf3CHXV5fTmk4uLSZciQCwXZNPxA08s+CKy98MbUjcTmthBnHh0jBSY+R35gpoX1isGpj+ywI1j+l5abMoH4VFdTOkQSJQwIYBXG+eymahFsZrk/NWAEQGQk7Mr+kmpU4y3a4pKN+Ky6VDJTjkPHUpHUqNJ7eb4VM7U6sz88dX3EOMCMwzXGj/46Qph8V4E6h+oMvh8xcaC+hVJfeXTNbR4ctvdga6Kmq6rr23Jgf9ze8VbQUS7Tpj24Q6pK2wPDJ9q9ori3b2wbgZZ1PXQSWFf6cD8m97Nn2MfQW2LhV4t1bfphjdGuUz9KU0VFUhpfa4+NswwhGBpN0ljSYDwYEJSBtxVdFfMge1e54L0RuPCtlWlxBQSeY810dzLGPRLVrjIenAQbsa2fXWeJDvCnT14ogoy+pAWpHZKgkw0lfxtmPNloVzCN0y+yFhsrCNFjw2eQ4mgahcUgeCrcKqjSl6d6x22JIBC3uUHUmqnvpUFb9O3j/qbyteHZwK4qWLOO1rsv+JQMCdeid5NTsk42USfXKNDwF5zqpQBGK0/ppbX4QRkFulA8T8gASV07guyk59NrpRuyXgqcafFsYp5VfkcjirAMF9sg7ttzUH/r04bEwab8JBnoYT5Lsp7P4mn6WW+tkfHO5m6dSuqIi2J1LY8BE+ZPIdVDTf6bFliQjr0/6x2gBf4rrv8i7BnYDuzAMBn12VZVrLhaQttZwdoBb2Eklt773rLrjFhIBpUCwaaw7k0qZ9CiQNZduQr4HHUZ0ZwKU7Wt4AaV36JgLUEd3cBgGiK/S5KShanedAULWot6dg55wBgVqyOfAJRB5LrFfFwevDwVLrMj3oUxnpIaDxUTo9N24moEc0d26drzz5stZLMpUN7RqIrsyPUsYYLaKmJK9CVsycU+hS9BTBQyaCH5LD5rOnJGEVC+EeptjNI7gxC0yo2VlRT4Wcbz5wNoimuNLHEBNdXXxsbnw+CN18chIw45/WudQyyTVidDvjVb+D2VthtHvS+LeM3tHQ71Gdh+zbVyLMZ//Fs7IjvmW+a8UfKQgs77vL4q7Q0IjXy1D7FtnkA59NKNpaA7TubdBzGUVgzTG0nNy71gKHQ2dvvGmYJuE16JEA8NwekOQoHK70G1tllRX6oF8U+dgUhWP13BoJs9x4b7WILuiOHHTYe+eM5eSJ0XJrmtOk0Y1svnC4564L1RkSjc8YO2dKh0jyqG3HeOmpTn1RNKkX3wNYkNf9fDO5PQMW4/8G6iS1d+GLVBzPX2xCpqrI1Y0d1iJnpo9CwK5VaTRR17DItlnc9vzGq7yk6encvIFWqMmaRBJfzbVIOc1xxhHZVFJOzO9Ui9R7MPq5B2gHg7m74SfkQlHt3uWaj/9NSQdbbbLxZ1r0RaCMmcdbt5WR/RPZiW+DLdIBVOIjNb7kmg/rI63lZ8RvYBFcCJE+oUNIQ9k1D+ELw8+FTR64AXpRKaXXTqlYrxOapC2n/AmgF+O0lbNdIXeA5n1jFhw6rO4aM2ngISAZaiIivrGsf94WhyBZCzbeMSDoU/lcJm+maLexWF1cUmzPMcL61s+7gA0Yw9+Wd+eNlGHzTatauFTgjASx3yX2fIWnF4547tgxcw6qKe2YVTY3nie6+nPznYmJvZWqZwI1CPOQweDVStQsIk/weG5i4aMWWvoL6mZZXg7EFdtGRnoE6DwY+GjweE3r2wt/jMvd7SJb2xZGYv+EjRoz9RivLonDwS2hSBpDunED2d7+7geE42DaIgMJFZuWa+IM5N6WJgmFRX7I09cbfMoxiG36uSFLwqQND7bpMQoq+Z0yQRz/Pd4+SL5dSu09Nw5Vx+wcIGMs807d3qd9gEEv2hCNzdbm5Otw0HsiLnG/QfgrHJDYSI1A4Lr934oTFTBPuhcCcwL4+O3DY7Euxol7xnCPglB7z/OgaMANqutcxhp9dgjZ9844SQ3A0V9HSYS29tXByLzIlkC/hfcbpSvmAskH2gexK+xIyNMOxWKrGoMvLZGTg7FGiRTiDZ9U+ZZV9SDONvi5hkFJFeI5XOGnkLFeNEf2mhycAlLW68SfpjCWB+jRTcyfbYZpxwd+Mp0QnLKIhknKEIgwa0MlHOO4w4LUl6d50HyeWGR4rr0D6ksMpE1Oe75nJDvyjoiBkY3F3xsEpBqABXyaWg2KHhOWslB9KyKpkwhYXB8auovkKVCwEA2mkGiJgEMkVpRw9bFFLmGHhjHqplzkTP6Ur+DifuDcA6OAVgNLixsn/oLVTBMROaIxomYJ8sSvWC3D2NJejMsT/9byEc6PBPUU3truedk/cCacQzyYvmgEgm5mB9lBoE5YkGeLpOwWt2v731HfOWifD5ApaM/fF3ZI2YPUZcfycs5iOsCV9CJsk6WNtB5HNeXYhILvunAQu08mQal8ryHhShPUJerAq2qZgrR1ymehy80tLwfp9BUiuiMxJlzQdelgIaBWZ1IXs1yH/G0z2ifro1xsf2pc18Dbcrd8xA6NPIIyVQMp0/zxXwqH6YcQX3RdyJkqQP0V2LjHZN7oC8qlmmPE0SF2ierDmi1G5mPlKHc8xQk6L+7tAotl0VDGVwHVU45bjWPyh7RQRus451MtZPRbDhK+Hg4vHA2sI8R2OVd4gwH1Y4ACci2MR/cOspYde/0AWBG1yF9ApkcZ6hDHunjFhtuwRwqhBEEAmCZNK1o0zVHmWfjmBn+ycE0pO1mfDUuPNLvihcpYJAMUa4mlke+jKGeD9dIMFEfqhrdNZBFL6Y3k5j02M3pPIFqbt+4GhTKAcjaA+EuWesr7RP66VCvk9KeNOEHTAX7GeCSZb5nUGE0MD3QNJbjeprtqSefWGLBjvqBFvuWEJZG98Sv9fmISpSZ/hsdg4dt6FxlX0o3xxu9fplCjvdT+y+L2439nd6yepkuHgXme/TrPmqeAqjsGt7VkUGNtNdGeYaay31Ydd6hcEPNVCmUlHWHwHGEcAVCxXLeKGAl7sU08oo6VDQSVEJMYOwDTreXqC7ElE3bkrRwwhgAXcQntXAJKwSW8LVncRrhcbnofRg4znp9yqYVn2JbH1FDmLGFfoKWGAkYKxm6PUskbp2vxcSW2dCvWrcDA8pG4yiar7GdSAHYfdJ8e8OYvsG0CmiUiO1rUI0DI41aQwxRAfLiHGaDxTW6bkqtD1EogdPqBfNBGJFqlZbAwwK9C9psmj3LEnQTKsUy8ZBeC6JsXx2VH9O0eMO2cMUs+cjitMvhGsdaYuA7cEdFMH4OoJjaO2Ki89uY07HK2/JX0jVFqOX5fZbBiAAjbfPKiWeml5qOiK2LjKFg4wkMiO0HAZHfQx6fPdSQVviTRlDLQn/D9VFqdFq0lDhwSo6TA0VpFSUnLhNS70tYP46WXU/yPEDXRkPDjSvjAvIQVHe9568DCiF4vvXcFIGAfGOvuoG1cO5CleBkCk0Jtw2KnHPJINWRPWxhDoMuUTMrWeZf9VziDx8OjBgOjZRUZouKY2g9+ANCJzBBCfb2eWBDhwzj6MHL/T0MPWNI2PJHlJO/8lOvvBLWkrEPMVDcqgtAy9BxCHu6aEPExocpAkvorytaMNCVqFgG9q7D0lmLnQDjoKehHaMETVLgB0BItaAsT1VrLiHiwuhb+u752V0KHZJPasy/hOe2/3xM4uC9cS3rpwy73w63IQWBAOEmNOlHvOYYsOSZ0AxNxef8sHVszG8XwBTErdWK0arXCBOLCaAkND5adur3Fi/8KkHIXTWQp0+/Yt2j6xW/lW+GidaBR/uKurMPvduAZrffHax6iZrvTbvWgWGHNmMglwn1qsrQZebyy+6bpNSSoNqWv8F2ujAInYF1078EkZvcx7DEb6O6AbV2QqBJZQSK8DDkbNMvo+/pIlcQAV8j+je64KTqGXZbhPz2RaihFzJzBVL2WRhIEzfjBRg2k580D1K7LOeXD8xk2wpx8X/6XRRZ/SzAHVg95PICcVNLhybTlCsRaAy4y+aLWCWLpu3Vzj+8gWmChfJ6JAF2WrwXMTQqnpsDIFu7SF3L5hPftKgz1IXCJ0bPWLRTmAgBqxdG653I3Dg+5u+WRUldXqieklE3ZNHTh0+C4czk6CtTKA+gmS3oMEI8S8VjG8CNJTZoMoBaVQwPRaXlhal1wjoUBQDs/cEstL4BXMNLdjw5v7ONDBr72ja83JikAbaxqRfWCx+RwHEZq1qgzpMC08iLOYIxD0wB6POjqKodGVxlX9KrnyeOQVxsNwpfPfCvfEzpQmXHxY7x62v+Rm929jd8BAsjwHAq8vbKgZ6UwMs78bv42KO7niceK5mXNU43SpttpFxXW/k6MNnC8Jg5bszbYUzmNog/bV/lAMzu8ckaZd3VBZYemJJyWC0tML8NUcU/qkW7tNs1ebtoTFyCyJRtNAEdtinz9EWv7SKm4Eyiglrv0+hMMKQwYBnOAsoC5gpjuakHkJUsgiTAHjdXwyKki0iuYWKeUgV/oGti0svHtMLPbk4sUxug8YoLLey+YEhu5hrzs6Y/8AHCXnBNyXeyni/JiO0Z+jc3Yse6r9lS24e335Y9Cr94YStU58vXt0a9Jw0XbW0hQpM1lzhDcy6yxslXYG1Y9kLOhbSkEC3knRAZ33i1ToVQNuMirhjLkbgySiSnYe5KxdRInPXrcD/rxMbUHPRe1tCcWqTtp3ubUiZ71daPuzZ9toXTR7lZHlmKmwHf1AhfKK8zWKnuCz7QpSlW4nBpF0WoLxBT3J1md3Iosdo9b6eK7ayCrpe1uGN+yt+sAwhSOFuKSPcvefQLpcYu2t33m5oMz/IDH7V56GbDS4GfU+5lh6AHGxsSF77gY1oT1al3VzqDQCyWE1dn3HzWsb05bOmgvUAyHe03Gb4z2kwNQ+wx3GZzkiBZY2F3GABGkhdC7FF6hcXUGX51g314MEOz6AXes1VTmz7tsmVQMCKisxey+j7UsgnNUD/b3vChwKQDO7l0H7Z0LYoSr7LetKXpmedLHCSv+f9g+/hj7UlFfV/NfboywAHv1HApmAdGPoyYeCy5jiqG8dc3LLxyltiV5zO9CWYPDIi1NMDLjB5R0Q9+ER7RN2qZYp5FAt8k39gUDJrwg3L9Ty0p2Qiv/2r/9Z3inxFqCqzBhpaHbuETSXsjtEgdPtCFr0/Drtsccr/+PieH09xAapzAVljbx7+36f5DsmlBgDou7sG2ilyu2/kjIX1S+9prD53v2Ci/dIrZTJgHR8oZRkGAksOSRUNkgPnShU5AJG7qZYOCLvmmdSfSPncpQVGb5SAXkPAczhdzlCe9CyWAkUQDxeKwyOt7iJsOfGneCk4Xc5VRQ9M/GDp5J/9fcfLt/5fZNE2vd8+aSMHg429ObYXdSreuHow2Uwiydm9tnSa9DNZNIGVPr2E6B7V1RLQTxMpNMODP2VCfGrh+7vokmNFNRkEkcL0NdFrLXy6D8WggGF9xwt+Y8ZmBghrvskx5iiYhorRzT7YewVWZ/QONn/wVaWhFV3LkyGvg2C9vGUtAJ3MTWK3jqKXlAZmz404es7d5FuS+tFxe0GB8XIPDh+TE9dNQ/YlGRLB3tGAKUq9JaL+9ahN1Xh2KZj/DjsOJ/Qln1j08KBjm9YErI2+Qh27Jzj8WASnxke+Ha5OtcyKjHcubT89em8FR2fB2cgW2czp5sp5t8xQYpArNrRGSNfIYljuHTIJc5tGnTDZ2aV0LgA8wwH3N6phlOTlXettOX+I4VOPDC1AKXjoIZ5g9xK12WUSBg3UKkrbiTjWY2kuX+qkObOfl+6FXSQaFo0vdO95vNf3cu0xeU63kUx4GsiDqlLLTos6TtINd4dplv/xbzp4vSdtWVgperp0JHtXExhf9ik542cl+5Q+/wHC7ygmv1CeSowAJnr7LfsCdnbPcsNhhN4F2XUvzoG7mSq1I9ZT9lFPq/q/mNMsSxe9Z6yQt8/1woUhLm61y/uhK5pSdtDs5TaMnE/6tY//IZdvzOfMHIuSe+M2bxLRvL8ka5hNG7AaOgo3qOUOi1orn/UoWbgmKgXd+sZ837v1k3JCwj4fYw9ps+uSUcoFnWSj7xldu8pJ7FN4rOWayRvGp/7UnItPLv4S0DhrMr79mG/wgP9pf8EEWwjr/HZ01u7y6enWXLWd3+sddmZDEoguK/XigB7eEdOvz0G1Uvsz5udn9/gq7pcPr9zzW//NdtmG0r9uNQSLJc+wVgn9l1m4RaPxGgz37X1K3XwFfoQ8mFUt8ATBvImrM/wL/rLrv1kh5hKla6NfCYKRcbd95zTTDXNm0OBYhh+PNAkvA0TDkrYfqKvbV6GFKykNjLy4Ig6Ai3YPSdyfHLsnbvkwsImkg6U/rbJ5nAjIiFge70gWSfsApUOivPbk/FLNuJ08dgAK3iY9vIokYWpmyfvPyew9vY3fx85j6eGd+8yT5x1Z1eAYRjsHvgLTR9EVo7PVuMlVP+X+KANXOI88y8cTx/ItMGmaH3MqT0BAs4crNnf5bsX0xQ9NcgP3Fq4VnAxcDrfVMXNKrYj8snDaiplYvU6xn0J9jWlh+eJfQocPYy7SDX+uXpfw2u/H8xziv041FvjhezC/cYHpY6nMdAt7lfJXzBfZIDS2AocfnsY8wuURBi0iRPUPi0jUr2mVDJ2B99FvSYFNH69HyxVX5ybywOTnmC2zrIVW3S/nAgc8gFQe7AqRf1Pm6xKdjo8SqvtB/H3zOQmGmk3s53BuoMCN1FYMpF0kGnZTmI8Qmzb2hRhs+x1jYZaQj7LMVXr99nJd5Y1av0Cjae2LP6ssak+fjjXolkq0eOVex0pZpu9ObRoYLJjuN+fyJwe4W749eA/NfkZi9tRx1HjFEh5GfKZ5RukUZBZzQc+FiFBM9BlgUcpH3ncy96zsOzNf7AchEaebLfQLpivMTeyckn+4oZ41mjwhXKwWwWB9x2HUd0idzYVQ9Y1K+uc+lFBQGn8vj0MeQFWTI0J/Koc6Xj5HI5+yNfaed9esSpv98vSYMsymcV8kW9+n+MeJ/qK9RMxKPNh8TNsSU/sdvzNMxR33X4mQRst5Bcha+3tDmbPUkEJXADcVRX+oGgqU/VCQwVT1rsdCwABJKPKvu9ptpI9qzcN70rK9i3OEQGxR39xtjKGEas/yBdcRpy19lFoz/j6wdD9zlcJP+8c5IMzsJXx1la6fOxtGs/ch2H+jLZH87JA467p+1sF+V5KFW0yc92H3lK8BiDsu3ala2nLsNf0zcuz+dVZbB/raoNUmHz9YO+ukHfZ75AztixbgV46tVf8EzdTWtkA+N46w4Zt2CgO5uATupOrCe2HDGvX0y5pjX4nqFv43x1tx/jDqczADz96pr9azUR2w/wVouBAG2NaU4gWxubCfCaBrG6Jz/WjA7DulwTPuxV6Ogjif60bxj9BeniQiTi+xFtErSSb0qBBdwZmKmpaVra+Cr+3MdGmqBll8TgmawaHZh4b65mkLMqUjz2GYVm9pzSRlPhiqI+C9Gmmsf/aOioK1loWjnz+LGqItJGakBlNkdk+cq6tzavxoip7bs7Wp++f+Q91A7lx12wYswPbZS5pd11MaWA0p/Le8VUbBS/tSMaQb9tCrDdl+Cg77bUH6ny8cDbKkMSMSWF9UcWd7wn1pDfEo4KmuLDKdFiOe074CxxUkZWpmVVJZ2OX1Cdqg0o82NQSh5fReBz6rJUORzES0wSwKT9qsPGn/pdJrXLp89fLARzqe7HqwrzBMLqeby6oBnS6ShkqmX8dglX1VRy//0h63zQOpD3y6/4oGNRXREibUHr40sWelhMkr+P7Fa8RxTpkUji3sRy2Zh7nSxhaE9kQtHWWbwhX9V4rNpcDwYzwu0OmqAXc1wVZpRALsYJCXF5/Rp0JtbSvkaRNP/ARiHismlAXLWx9d0hIMNmjnRt6AsbFERyNPX1eEUT2Dc/Gpp1PqqJArTySSMZ6tt/kXintX13JNh2j59SI76jRsyK+2Tna4Ivbx0XDDzA7Vv6gDv6rasqsi5rnPHOHsL2qxjsd2LwXU6R27RjbwrIVarHerca5wY/sbnKkOVvb5GDo2srOm3SlF/X8SyJ96Y/4U/UwBePmBzDXPJugRm0pypUi4Lpk8KEbZxFl1HrMwSvLZ3j6mkg67HKTYahLjeC8iideNnZXHJxsUKbNA2oDx1KmTIrJ+DbArFJTb2dUt9BVpOtVme0UgcT4JzWv6mmw/WCNhrYvC7DsuptUVPN0PBQJR13No2tkethSUokP1WbodbZ8Sug/sSueCxBmfK1qtKaPGktqVd3iOogkjyNOTCy8GyxmWYNBpU+Ac45yTp+NKYxUb1US0E1zw50LAOkMzDW7TwOLdPPmZzNM8xDEV5OlHRc3MONJmfrZrNItw275niUu5ovOlLJKnyWetOry3x1eV6QV8Gw0N5TOwfpcuPcF2oqC5PPUy68aOo064y+hzyaRqwG84/hilmnJa2Jkv8pH0ncsC8TZytHI/8pENZGjKGLhQ5ZW1Yv3kO5E/HSZBopjodTp0oUdYuwMQ8V+0Eu54mG1XIDpe5HlFXdYpoTvJEjAeV7rcNu0LalQ4j7xgo9iwmG9a0OaXi4ja1RI9IGU+2fECpdOxJfM0wx8dyZGYROBZtwme7o++rKPYFOnXvCGq30OOuSCm26P++BK/hvXwWz4BEMGgj6wrKJBZhs94Nz7X9tMpXr9MMKPaxNqMM1oT2Bz+foPEQ2cfDadPdaXXXgAs6O+/lHo+u92h8Fg7586v3zNNtAkH8VwyDD7103Vb0/R8R2+q5X7CSvTrdYPN4zVr8QESuRHZGccg0IvTMKJ1blOvc0oMmvNOO47bpUjnlSo+iwLhTOaRz9UXhgSmibreHUxqJMAhiYTjwdDXUeKeE9l58VJyUop8VAxbeSMmIaHPq6xa0ZPx91Hc2G8lQCtM2Gw8OCp8JgX9wRa0FAZ2w+bMM+Vdy+zMa5u/wx4CaOnDbLw2l19N1RzOw8/Rna+38xX/gOj8/8pvtfQlTKz9XV81PmAlPRQDZ8b+4AbdnU4+X5lXorwwltdEOkKbC7vX0E/7h9IozN2zJCDNkaNh+of4VebqxviheOda1nwGFVc1PHwyNc7jkPrHbDjLPLyNKseOyuRx2NpGRR8+6bkTKVNGIMsLRGrH8jprF6wwbV4zp6PB1lzMWjSBwbl47I2Mqwvsl1a9jB0mO8o/xyU/utRfjA1tMILWX4QRNu/iwdwHFKtn3l3VdUvaJ6oHvFzKW3k4NqcH4KvqSgxi0Ui9ALmWl69+t07tjZu8slwiUYSRYCSdr2JhwoXir2lYvUuMqOjYVlgX/SsUkXFTHhoQKmruvYyLH4Nag8aIDqKf1Lp2Q+ttNLWXCcSL+gOcPC/9jDHD2NuPRl1PmPP1iKc2vfDvcz/dNuoysRRndJDPVpcJ0F/u/FNNc4wbpXRzfclXfBqsFPFs/K7MNZebrQ7hE7TdDy8w4u+thwzIucaa4XqWoPunZ9Red5n3KAbpyK8/Wzr00EqBr9Y7xlgwE2iAoyORNE9RuHu/rIPYFINlvjcM1df9st6j8UKFAS3GFddg6RZv8pETjvsVDO69VXRKQ4LABFFQC3ltbnWZ7wOAZHr1PfED57mTeHnw7tbjJpzedtpg2DP9PSqAzAwrgUyUAQ6b4vdAjMjXK0inRovPSsoXPxIfbIA+WMi1CvzdCAsyYQD4FXeriN0vUmVA3ijsvomSv8HpmqrulxzUBVENxdB480YWIurtsEoAzXAP96ys8/bAvtuBjoJuDLvhVO0QEqrxfu+QnTgvbWWBMRfnxzc1UznokfLHv3a7UwFf489QqjOzjqi2JtZ/dFdzM0HJrMa12SXGKed79zQOqafHMRaL8sP/Vd+rQHdvXTF5qG5T/SsiPiyxa+1iJQMzctu66JBp/svloiLeuEhvdH6LqOth2xT7/assSqSey+QLoT772yuABe00doI4O9bOkt+dfX4iiRonSGcm1VV/243kLDUMBQmmCVOCp6dV4EjmPZY3QF/7gD6k5lGM8UrKSi4htlYhK2oxBgE+K+5JNce+HrNkIEpIQn4kO+HqCU1slUoI/SmpGnVYnJfMNrcI+3pwQy8YAK+QDf1QY7rpDGx2K8ETLvNUsHBHeaIiIeBBHO0120wXtztzcSf/appsekDRZxHYYXCeZD2rjfEHaqL+teaBpXqz42IARkcu33SAJDOIL1ge1JtxfVb2C6MN8Z58kO9tJttyCFalEbRz4+ZkkvfLj1arqPIgldA7zUuhtnW4bqjAWVSTod9Zh1eAnHUgAfu9LnrRqtSsQKcN+GVU6KbXJTTS8gc24AvILohK204aOS9zKwLHck1bTENEyqpxkzE1bk/kIUgTIqDcsxSApFgmFf0sT7pmQmK5GmF8iD4spmxiCwLjRX5D83W/YCwc3FhTB9dQONzILhILkX8VoYXB2qSpvgfA8ZPxVxXJGQC+oWNpuKO0+STFEbHo4nsaE3cZaanpcvu/lp9GrSnETz1RoDnOQWGsnqBcFqNHbCSbbmIUXXFcRqkv1pEKywnXHwkji2ITErLmXy41N4olYg3pPnq9VVmJGGxGuhRTVt8kAI7LK6JiskaCnBszRvtolJ+JCZeJ91U9FVq+iLQtEX10VfPPm3aLQ6jv14GuMYBJCqgqyTzxxcczOMGg4mf2EFVQ9l08BXGo/VXP2jb3bRws/oQ8YC33diYuXAkh9CRm/m0avx1feAnDSEFjAN284jwRBYqrfW0SOqurygW5bNDqCt6C7PEEWTh5Uu4fUPstM4G4VvtedmkP6WZFNf1kBzbPPcyOrh1OhV80z0ICliCwJoK6cyWhna5oEEaRGJOU4bDvUKvYSVkoXxkTFQmMCUyTQGNeCFBNJW3GWhZAK0RKWpz94G5LPWuVzECzZ/eC5+LY4Bb1L5QO+25lG44Jv1kMKazm9tWVsRanVb2wZZBFQ0zkGGKn/uRqHN9K4ahGbC+KsegKw7CB62iV4ZpAGi5lWCCncULB0dtwE8OUz8fNQ0cs6cL0IrxCSROR7G/Uut94ve9ydU3t31cHwXL1DNeApyQyy+3Q1B8iSmgx/gWPEi74XkBm0zKFV3OblpPjH5tZbj2jwBgDT64H4jSwTX/XMHoqlJPXrCniEH15xXpYcUYO0ojpzqmWgAWwhmDNlGQlC2pSsTufxZnbLccky7AVWuwWAptgma4gVQCGjauaBNOwyGz+b5JWvGwwT6jluqwdWkWhXErGgOTsZ+5jo1eWCalGkWpMhwe5KvttJTHULktyXRYBIRWjrWno8yWaGNNN0P4GNUtVTwR51Ycj3TG6As4XkQgyBUPjkjLOyJOxfZK4LkgMkKdKSWzwJet+XKycOgaDgIup+6FNkRIQBR/5hLixtS0choKatD5qZbdbqq6j+V30TYpqq7eDr86W58kUgrVA41mi+zZOM7vGsxvt8Ttx5Jv9dps8aG5HA0bn5piukeJT+CZ2Qyh36PdGs84E94NRZ+uM/G9Ebaa7xLquHviw6zPklvxrgPt3JN4W7BvZSKdq0TTdJOAbJQKVQf9wZxF+QDBIN7G2Pj916v6mYZCrj5e8zxXr01ocXoQcUDrJ+ByBMqXyrhvQ6l/VkKFZ+ZoaDTZxz9fntaP98af9MTADJd4IHxe8Otb/Qj+KcdFk7XaM4KX0cCPg+nT5Vj8ld9mP7i7uUXR8Y0+lXpZ/UK/+SvF/n2YJRhjWo0polp8hjOpSI49HYBrooSc93iP9fi8hRq/8WRS9I4azsVZ1QPr2PGWHl4B1FDJbE3taFaBKZ/9bZA6hSQuLVqfKsxET0rGLMbLfRusriT9YxQd62d912WA9H9Rnsoe6DpPvHEbvuVpw4tWiO8imCCYrD6agwN4Ps4abOfrEzQkIatYTTRVOyla0Qu37hLXP/wDy0lA29mmFQf1uqahcvCJuMauot6I8awOyOLfTG6Etshon9dH/9C1h9Q0/qUf7335g3e9Tx85HAqX8oVJqrzjFXJNSS9LRCOsNPKQ9XLTaDMDozrgC9NqIj7Qc0H8ekabBhAza4V5T2eqAOhc11+5uAyI9USjyMy/i8olwzkL0f6589b0OqzP6YQ3yHguOtz6Gb7wmYdIEFZrudHf4JK0Qf8AmQ/+rFHd/4fswC2SYpu8aaIpaMDVOVBRhzPXeSKvsOUbYGbAwX+k8QL1E1uThPQs39L+uxxPrqM9DcQcFGTs70Gc6i3gYBKtjHy0yPE7omPX+nN+Qe9REZMQ1MKv+ZZFfLKb+FtVRU0FA97u7fPNKO47+mdLpqtrq9yElDaj9s5vrQCcBloTEB5/oXXDRUy6fgOA1Ud7b4COuie5x6e9B/O1mxymT79kvqwPTjuxoC2p0/bDi4sEi8c1sxSSUr35YfwV5KubYnWrABMyEr7Y4MTNwrKxSzdmyDojsP8FHf/kvRwBXErQVDy25tX1V1aBPSRJgz8ny6CGzg5zQgCpGMXQgkn1dKe93qp+ZhokFbr+sUo/hoSI05rgKjVT/rQ1ubV7CCphZMI3XUDaIr4OSUkuNgJB3rjHtbz7BvugTr/ljZzylx7Ph1smxyVNvWHDpeq26tSNGqNEWfnUxJpnI1mPZVWJtBYiwHMsmbuv9y7wt+GQOqcjxQf24K6wfPPNXrDYGGQpja6Kwni4tkRx8IOzKPcAcVnuVB8yA/r+Z81PFsJ3KwJYOvE8Ni03PsquFyQFUCfUrGXvmHIWyi5C6pEuBOmu6vF17lfFMzmiGC9gT6GuJVLUCn4GkTvchuET7gvKAkp49mne1pWDZUkazkgD3Ux8B4hLYgTEzzRAzjAW8ng6Hx1mTgfNBpjAPFWAEvZ03HtAJkDOXMoWqi+1yEi1lPyXe59QY0Ssy/pacfU17qDbWIdGjz9moQ0RsQu8/yvNY3JFagaG/GGft5jqG6FyKOQbInnvjx5jNnVy79DKNdwn94r0z76ECj719KbYH4LcsS3UNrFa/RNQkZiO5CIFvx0m6RO5caMWxP1u6SLqUiEjB+cLLG1r/OzqmKg0g3eEQnPu8scQrl87jb1XA0OrdbWDM9HkwYc7x6VDJOgz8d3xwTpJvjjh28iHETgGQXLP6kvLm0jcWWLGjK8DVElsxZJGi3ifAal3lbdnP06lqHzzjExbL1KbITe52DLhC2DJ9p0lyRCPeYn0z6cQXvVe0tuyIlqsttlGf1oGUV9VRps0qDm8Dsbtj3B1vg8E9eBtLcWK3gvgk8Ed/DvW8Nh3LKnT4hdOeu98zFillbxHCwfHULoAazD8LYdqhE6AnEPja3lUwZOj1jmMozQsq0KB/cdRxcCAVoCYo2hHo2uJXG8TD/c7yRrkqqzH1f+MC/lC3dgNsTLIruOLdOvRGL5hZckpZo0Qefh3yyQSLvhwIRVORIF7D6nuWunkf4JgybSlDRgk7G9lXTLvF6o/g3QAe+YCZqAsyl8y9NR3zvtF9ajVsSHyW4BYHA+4RlTb17a3kBCzbe8M+EuYxNgsitOIBL5Aj3tbVqX1n8ysk+Gwhut9mSJKB1z7SzytqRHLAY7A8jxugefbpudeQDh/HcVNReOHQIrF2wKZ8MYW922LltvW7Oj9aXGbgfk2ehAogKfRL5YhPw4lcXKv8JZ/9bryO6g248pNJFuk726pbcZe6Yl2x5fy6PtvVutWCZEFMjuwnV8BhJ8FlvEWXBUh9dvBWEv6nUirm8XlhTbXspcxwVnNXyCLF7LONUH9SQo2Je18qddqFEUiMyJGKT4FofLdiYjdNDFA5dCKDXT5cwS9r30uiviRqIOGgKodmH7PlOyQSHXBgZQvk5640+QW+KCswzEEGsOlPSrzyoNjdZ9KBTvUAbI5GgInSb7p2f/RuGncfRrQ9Vw1y7Dz090CgehS8VAdIxfuPhm1yFcF+7mn1TTA1Rovyjb+RlJWXOUMNcsv/fKn06ltGpUBA+j5liUWM40fcg7dpa0lxB97yDx/1B78e+6YoJneH64xnren68Hj+X0E7ox6z+RLlK3e/GzRPg6GrX2viEG8OwBF20Xuh54wN7Ii3D28FYy2iDog4xfT6C6sWYYksDFUuFA11A8O7TzT0HkQ+zgTtr3GgG40BWyh1LebiT4q9Ypik261zwfweUVAlIbPRobfBiAHb0fzOiVADeZiH/4hGJ+X0KW2mZpXSQ+BHo2iof0nhNbrsH0BhHIxsQbN8BqO8nd2dnteamfgTdt8tw8lxzYF60qpyq5zwa9ocXU7LilHijH5ZzLBawruVFMd9VRoy5b+gomrcQXEVE17tPrpaDV+wl3fZHDdUOaUhxdJl7p0li/oYm2IkeMEkypWKd6JJKfhpNQrYxTPTiLQqw1ser2IqxGt7Y/5FLb/K10tY0yr4aUHaV9udfYI0ZljiiCl170bmCFeZTHY149jrT8Qofs9qNJEEQ0KM0VASTqFMK3Gv5L4MUaR4n0IaKfZ9T9wC6Rl1VYkHHjsq4vajLxpsO4tLfvwzppPBrANajYP2p3ar/aG6tzzWGp6QO1YpQd9IUgvUC/enkZ5WW7nG3ejbB5q3jG+wi3bbc7ymXMFqqINfViAqjs/2HOodC8Tyyi6Job60ipM/o5FftJDLCFNX98q55Puf/4WQ2BOJIITLcfLxjgTXXnJCDWI5Oloa+1QJvwCMlLxE2OC8PbDcu6aQD4EIo+/gFF1yrmY2UjWIHvpco921aj68bMC/DA1ozQqbRT2djfm2mMXU/w7kaKlGzKZQDZcAoJmLV/n98ynSHTJtR3XLmpQB6hecP0ril23ee98Bpgll1DfD+/ugwZMwuBfauH4YirDGAkQcE5/PIjoW+xctKEx0fIYarVrd9ExSBA+lJLX5sXl4kieiS1Z9dBtXUEoRBAWeu7JU4iv9YppseE9cQ54Synq6nps3sFJiCC12F2jTWaP0IbJ3gCo+H8fdu1NkRo5j79VSXwyzrqiBTWOrkyGB66FGgBhq9A1ZK3biy08BOWL8KCYCXen3mS7WANvKSceOZ7/nmDeidb9AdgWJvw6JfJ6In6CKiC1bKAdbE7PuE0eAB4WhffwARgKsChc9xuqhuYL+nimO32BHoTfYqnAteMM4BBPujCgaLdvcWjFrG8b7tne+udBVPO7OG2/82khu4VuMaES3tn0Qz2VPAc/O5h6DuypnrzwW/WQugcvhGqnj1+s0gHNlAVsuKiPIkKN+Y1+WEC4a9CAJvkFRNJg1RWWP0n13WquyA9/cYNTzfBfG1RSqf+85AWkRJ/dv1wyGoSxO0tBJH1dkGmrscmd7JMBRv72YwaV8ZQGCBuH1wYSAksvojKFhWTnkhcgbpI+Gl1UGFhUwqr9M43BOzi82HxGDToJQoZ2pJa01c4ka5vJQCYXnXO1jilUqpY56S6TpY1MAxGQiQRRGFrRPMBnT+OIGQTWD2SsRBoJjGenemnLc4MjLD67elOWMG/9Q5DAifGcYU05M7q7nqJHTCt/+paPWu0drvdrrVMqnwM9W5jQRks4lxtIm5NtsOKtD0sVrJM8re1AOdqWmaj+WttAI9HxBEt0bzHEWnYWDtc7bak0ojGAqhhL4/AeL2k07gEW3wS8El9Eoy/bvQWnOh1BGHLLyv7zpw7c0WRL+asR9Ejp48AvJGBafnI0UXC3kbBsvfGSFoBF8dAxMMnMWYZA0EfjyHF8lchwemzBPSa0IF0hubs0OBPkq0D/Mz0AVbVOkdrdW0/LlES9oxqX+UFfkSva95UrIYV34qc6js137vvPE2DEZ5hHQkKbGP2d+ZYmsQvHOCYam59m9M9lMTNs0cthnuG+4dxknTQKwRerKW7s9/HfMZk6du0UFGJj9zEI/SZcJ8MX/WKJ4OREf8cSxjWDle7cyG//5W3pZmKD7WpB0mtdJOrVIPmJYNQbZgoBSmk+NOg4LAiaMNQv45pLMgwN02R3AxZZaopAFSpGhU/y1Yghk1Y9kf3m0MfzvMgPxPv/AmPgGW1XIfKhScAl70QGvNQJtkDXcJiLrFsb/MAL+h/+xlgLqQsZOFy6lOs2TOLzakTRiYIRm2ZttpdAs7jaVFIoziNY1R7G2kGzG2yEcl8hhK39s9yfB5ihNDAIVkBIRC7XO99djlZdUsbZOixSZe8JT2kSOEpKnrt/1MuiCKoRCkBnlB1WyaFPfi832CO3gq5DHLFUbBEnmBmAKA/ew8e2IxObgKLizLUnis/FxLfIClKVxhChY1NXSWclEEk8KbdZYvlJ702u9vs4iHy8uooYzn8f8YG8uum2wbX+WabfYDzlid3P+xbuF2rjNnFc9lGabIN2CHur4lwwpkcOo49tX3xs9Ee4ulRki/oagmPMzmxmx9VNV+OfdkiCxAFWQHL/R6rSgJWwoCYjmD25hm4CA6g/pYT2yah6kOXIFpNLIpd0iIP5C6mTlUc6mnAEAcN56MYeZJHHBwTZiSan4cFFPCOWzgE5q05c8FkssOUsMSlbuQIrLhXTfjwMGEEnAac5+DIX300ZbKNypn7Wf1i1Ud17Bf29Jr3PHVzW6aH+QbVxZDXhurqHPk2iuFIuR2Rb0hRbG6e4tlptvxqKDtjUJbOYhinUaMmjvn68oInR4ma2gVoF0RnNhE5xKbiae2pjvsvJ+rLBVDLLd9hOn3uBEq9Ju9zB836FY9+mMflnYGV9QtJDO0UqzKfnaZr88TTVyN/4JBafwn0WgibJwlwdLfkqrcpAyvIQVJRzEuUxkX1QLicqLLzJWvIxeCiUyrIRceBh0dPPtqpubw8dYUYSBpHasmkND+HNh5KeczF0himKXf4N0h0B/f3FuK7WUz7z2+CYh4uPlsvQrxFDjlujbhRQXziftJHSAXunjLS6yR0njhuUCrZIpA/HWISEoCJS/4vbqp6SRwNNuaeYnKHxaGZFo44n+zNflMVQvMpmxNSpGb8kabAl0LrrzwVvo1x9ETTA9A/y7qaIzW725j4HbMTlH/n/sR+Rxm5vXXR+jWqFrdb24tLtOztMB8gDqBQq5mJAofh3FqQ6lnie7UuIR9+Qx012culkM3VbCl2R0Ai61RfqrsWGGRoEjgXau4/l0SoO+lkAQ4gHhkMoiypsadJ5ekicXLzfsybiKpL6Od8z+238jIiKnelSCD0RihLum5iWI3+CdxlJlfxQOyNmlQxvqepImdNdzIVNvPjnDeZK08c8yGh/QZvBdc7cTQO+Dp77mRq/Sbu1c3sYliQRt6sVG44Tsqj7PTTmJPm4cR7fJPtDuVd1oO4AeQSTQMw6Efz1FUdDN+GXB/Ct4cBOBilSINQ72ZXOHVl/fEFwC3dH/jscd39k3/5THZGrx6oG2KdTXjQP7VRo6qJYSfw/8GHCF8Lh/ZS/if6gBpgLE7IBYGDgM5PH78NS8049iAxgKdeSFjq/q2OtV1Z5uR6wukgGAVJSPotFRvt3LKaacLGwRgSDo7T+Cqu8/3KNxEhxpsi0apH3nZJPUKZTOv5nyMiH9/zY13hDuetmy6XmAzNdczh+JP8w+4Pf1Fv5zG2lhR8YlcRBa0sV9y6tO8sYeIUq24Qxf29EDILYkS2yFE9He6SZaN6mSVESXtEw4dRnfy3gWg6HG1Px02iOvsJHQnZVYafGdY20J9hmcxHJ6kPRjh0uu8ChLrOIp9cSOoYE2MCUjSSTzTOO5LtvEKWits91DOBmK+/Wuv0JWbM3qGctg6duBUbPvKdjb8JuHrx+lJhv/dQJu8Wbu+pQkZ+OZyfdcfWDnVZMH3CLs5xB/JJ2EDooDvJYwI0aDEnBrFFJOqyz8L1Ed3VgxfY5Ev5+hrZAz+deVWshiImzXZoNAU/YCdQ4lhOvD+eqXDEX9phebctx3DEDwHiTI+aBrb1aJ1gzE7i8Lb8oUvKyQ2I7RXt/5eniGEoGhQ0OevS0qc28HlP01A+4mkCw4H8hJc9FwdMEF8j742nNi3utjm3VE9nKcR2DugJG2knMEh8RGvmEYd2gsCFCWQWsb5eFJ+qii23yBuk08LNDKeNg84Amg9NkB/Iaw75wXLYcYBQ8noSnoQzNGBnrlJptm09hPXivxpnf4EjvFbNAXfm6JJ/4Zv+83F+zIJ03s02FTa0WlIWno5a7m0LSy5DrPMzcqFcyX30ZH2KSwssfox82UfVRr3MvQjtHUp7K1Z8OFmsuDyU5+SJ3iH2Zh7jR49+eI3KH9Dtox++d9zH4EdbI19HkwgnFVj7HYy7Ud9BXk1cwHyuviP6lInraeqfTdcsZbbGYv/9UVpFIb+3llyJ2f00FQWFtBCQZOdEyajZxC33y8wtT6zw6vOwHOOPzW5qfg10vhrTXo8yK8NMcYv6baaQNziziULjTSwOIHxBAoHDKvUcb3PUdO/DZzhtioSlB/j7Q2c59umEZr9VpFHz29696Cf+cnYepM4JVejsaX5HX3JheHo/KOZaj7kuARZvxG7j+6x9K4isNDniUAk94HX1/DPCI5vTz0dz3ZNSY5xaJcGATXpthMAXVJMksVgQL5lxCi/OqkDzlarWK8+A/LzNsclX4FnRpMSqa9pdS+JuVQeFKPi5S7XXQleE605U02l8DZO0SeyxwJKQx6lu8cdXCJW+6s7oWcypXWxiyJeIzQJIWxPFhNkGzLS8XOYNyjDA+BI2qp//JNwjfpNjZ/h2A3u42x49rW5+I/OP4wC4QewuuDx/rOPCTqW0yxQJt/a5nVoakeGIDv07nSwENyRiSiFPdc0W94We/iSSQrN7DywcEm4QBBZd2KitH5tmqA2cG3iuiEqK/i9mhFqeR/g1zqhGDIbvwC1wsXnWwvHlT4Kc4Jpr8m69i/xJmIR3aHHCYuIGpjcbGj0WgclCXMMnf2q6isnOBP3q+p1JNI88pRPGn+6ZZDA8niWjyYt+JL9gYORJEfKMn82zxkMVuOMm4rXOsibsGUIuOuBcbZXUO02LtmiBaVBfTeLXv0A2JvQ36oOj9hxDROe1StVcNd18XdofLi6w+pNFxm+M5IgYlUZEPpcEL+76jBHi0wU/XEP0WTVfrE6PSYy5P/x7oLqsYEecDs9vGFSbgl4bubACLD1df2kLp+IuOtHcq87hxqe4sCGl11vnGlUWtni7hASy4/mc0fnbLVmcBfccRnKDu/oTIapvvKfTmguy1T3y7Th7zXphVn5SdCLJ5t114alqnq77uJtyMAbHDwfxjLZgKZnt7nQGpowyzxyX2sf0kbBm8PK6A4twyYv9GYRIlVCCqNXB1rEVSLCSAm2N8gpBTtt+8yCwlO+NjAwjXUlWoG1Z2bZMMpTkXZ7iugq8l6eyTSYNcwb1BYFJBzS3UKOXeqjlKBEXrUG6bSMuvuKLDpHm9xi170YF/UD41afPzDBfxJXsKnh5dk8A+Cta1l3s1PjoWcYJANQzHbHTFiUawvc0wfS1G6Yu+UwQkWsdh0m/c3kB+At4OwnmzcdSJB6/j/DzXuK3jhlui6pgrqH9yOxQgtAwu6caa0esTmox7zQbbGlNaHwtqgRUv3dPdq+VzdK9H6Gdxv/NnjIbvQ4WAV5F61rfmGMIFB3GyNADTA1dSAj9jI9mTOhcUJC0zmQt49fDLj+w6sIgCiXdanBo5CCFT6VyJ30J8BeH7wp/UfiLwHeB054y8wiBeVnqj0T2mzpiBSzXA796E7VEHw36qunUgQuH0BPdfRW3Q+GzFhG5wroeNHyviPbvE+YK3PSXCF+9WXx4HXz9hvERBK3RI9UJmDm3LE6/E5+gHRxYp86zTUDUI0hJnt48vvshpKrYC5GGpFg7pBQNIF1qKe3IsBt1jb5IHBLXLREDArSwk6ZvcDVZLkP27yBKMkzyVyMF8JIZVwFrJRHHgW4dvVTgu0BOhCrdBcJmPaS0J4Fyni0OVW+HfCgVlurNEBg0HRF7OI2+NqPfM49KbHNcF9Y2ShgwLDMhjDk4CQqKpjgdcLloqZUSaB6GpWva87xPfyGKYxVlQebvA3lIKyhUushMPwRritaUJhvNyLfl9dZ+DLdL1vcKAxFt4ep9gMYfBeoyFHHLLcJWP37Pzi8lF0BpHptIu+hy2jptQ+leaDKWnwSoXXatTyUQ3PINxrTwUjglzVJRl9SiV38ZyC4/RMrggBtIBDiS9O3T0Hpg3KVJu0wJnJ0Y8160v2ngdfFYYYPe2lo3ci5nDOmhrmGGDGR2blFNKSSbiynRZ9uCl8KxCgpmJtGa1/t2BtbHHYbK9XJ6fDnmlzJO3rP3RT0Z9esYlmWZIwti6aUgyIw9UF/+BWZv+atuna/CNNEFTP9U1796MB9iEt9clbXIEyCxP22FTxmwSZX3jWdpyTvkpwx0I+DCV1MYmZzcVUxlIt0Oce5kgQJmWnf6PWAtJhWUY1euCLjWBhWBBsjJCFs8yjcFWIreiM1Qm1d4LYaxZrQFdRCkM+hAtMYmvjsJ7j46J4k03VcsDnR3qTwlfLobMRRx3RNn/52buY4+TYt8/XnZ6uEdHDcDYlXcv5FduAqatTTLCfLTErNzxR6TnR61QG1SiFxl9SjSgmaWcsxec9Z4d+Qx322V0XncVl5CfEInJUenU62PwSKyWcgo8y6iqHJqAh7YCRb1ZCHhGiiZX6BZwxC3tObay8+S5OMiDlQwiASrOGjEexmJVJlvo2xhMxnuVxDHcQMxAzDlrDIQECzGyrto3IelwK2F/DXcs1UGSXNSjp72U6hY22pfWLZ0hAxYN8fZoUB3S7Aw3q1Lxbu7qUm5kdVzs6BrwYiCT5CuAbrKMrwRHtaXbYXkAiK/LmXuUCen76AU78HJDXV1onTVrdKfh6KXrpSRyVJdozSQIZzkHyEUjzJNPLlVmrUDpF7dUZewz2VlF6Bx0F7HfEPp/d+rEPJZRubHRZmqr1vWZzw945pvoMsWKeDsrEWwmmHB4OOPNRLPdEQgtcW/fA4g55D15xLFGqHwasWguiWCEnV0+CYgKw8O+CnXXcjSsHeHUwdQoxqgfzKtAseJ4izftiCASXyiz7zogwERGhYEJLCkCoOCsiNgS2RwZv+c6x1iPgH4kBvHAdAW+6xIO6ZiCCQlbYEVMisLGmmo5wPrQksDd8v8xACbClatEE/N9vPPgiYC8Gk0C/6KkucHJ3jwYReamt+8cLdR0HqQEXpvt+cVPouEdfmSKXSWZShbIaqAEdXiDVFl9xhzfj3NEZiDIetjfddipj5mQc7HWgcKIAKgNb4W2tM+4yQbIQukTBmGgMrW3sAcyEd6TuJ6SOIdUl/Gbjt8NcL5CeP20QIqnOApHXcXLHtZnJNtD+HFuo3ddlxyD773v/tJnnsWQxKDVym+m+p+rmpjRSXWo9a9iLrZvcxCmQTTEf20kJuh9nLsagDuJNriAetNaTTfqTMxl64QVFwVqHQloKh7Q4nmUBHRWuJ+qUyAbjMtYs+y5AHQv/wuouZSDKpBaHj9KI8oqQAw0bOZqZUkdcAd/pkvHQAPWvulL8KPmE2kfxzITuGO6LS9tSFpCi/pio7Sl/IwwaRs/5Unx3+swNMxO47hdluqxJ9+6x/HLhWJLAxiT9L7rrQbU+yY4ELnFWXD3OXHsnw2YUU3q1bNz0wrLW2qqxpDuqDox9RSZWrJ8LysdLAwYVhxFCVCyuL0oUwI/I2qDmpaRtfaFPQn7vcf2B3Na63dyn9yR5Ya7sQN9RqDMcV8HJ0BQjJ00H9gWRMTSlhAW398VGojqmyWLOG97YOPdNITaSo0N9/eosjSgbhGwRozreHOC7vb31wfKvj53V45Geg5GZO4qZPeDRiUmewJ91nf02eBrYnzQf3tebGQtkCZGEDVdwXMBNCTOpGXKKCR5TuIUpT9BqEVbDRV/AhrEUop0HC3XnVjnRaADLiRIq/B2uMIhKD3YEQXeZvtaQ5DoU0BBTJVaXa01K8gl1PMZuHdeqUE6hEH9ubNcqWcGJiRzjB3xJs8aWOU/tstfDHU7zbhefnUOX6absNKhoI0h2V834RIKwfP2cb41NOxunaB0U5R10UlnnWBsvHoUR5ilqAbaiI6shorXgNSDEzTLt2yJujYpCamE2c7666E05oUvXmc0TTJ/Iw6YE9NEdoeBmaW7zgoQvtAea1IIe7jjDHdzIhgycjRo1zsyqS+S+0VyIiMLEfK/lIyCnG7Io5Sct/5jfpjefLU25m7OWfte4Q+nX9s73/cwhzUT79Mr3TwfpiDBESwCntfeAHYnf1taLzAh+CXZCtv0I2v3BWaCQmkkHm/Rs+x0LvniPoZEw7iRUOLhGDoy6vl3mvJAZy7jn6eJEAagmDDFVoJuJgEyBRWqiuR9ZbmLV9ED4kIMdzEuycME+Kda9j4YAuAl3aptGt4V6Qn7AcsVsImvzPC03sJrGgUpAuJ3dwbvtE7ZQvXxsM/RX2Sn6D06D9GmLLrnx/7jXUTVfSc1oTGciFyqI1k49C9NcveQnRMRqkwECF1fO6q63tPfAPYoPM4PqjaJStiZGtC2XUBrK2eDcURSo5uo8vkZCainzOWQMiHTCbuHUruCaByZpo1YYI441hHCMrBC006ybr6IYjtocz5CxwbCQ7PwR6VpolLDb5nHoOVf77KiTRQ9znZeCznP+Khwo6x2bjrLB73DndHPOfjflgBSjOoHSBHskaGPz51lMCFgFo3jlxk1oAjCiKG1EZgRsSfqVt0bowmDWAKufb9+G6vBATR3ndLoj5A9tx1RLi+hC3001H601TE0YjyY2uT6ygIIf5ezJ0m9pK1w9AeafJ8bf4cYXBzw4FZVjNt5C8W+ahanpjwo6AoosLa27ezsV8TSisRKi4tBHya2Pmc2yvx3WS162dUTQEMT9nY4FAbzJSWOLsRE7JgFgl7DfdbT35Q2oGgZK7NJ3YoYKTuXOeRi8Hj+rEYgdHXhlzUD81seHme/dlCYhorDa4pTwHOGsr/UFL3KBM1DxdRgQmM1xdMvFLtUEN/0MWl9ypU828KIjWbr0u+lcWRoqCyW6obn3aFGnxRUa3OfnRutTFKkfzhHz0gZdqNUlcvTCvi2AhNp4urQF/gRMMhNEAIL0dbzr/LjWxBKEtJYltvV35mTo+l5Ay2Lm6rkyYmDnQNuBmJYyiKbzQGCOOaoBuBUU3d5Tgorp0pB/kenOJYDcYeVdqeaZiLqZRYA0nse98/48T5MEpZC7+TBmyzBYPYERJcXnEIqtUYY8vxT1PDPljaMMYUWIbqpGDTj6WM5wlIVNoyHZgy2mS+Zh4XZa13ajiZYD65T3rFv2XxDxV9kUq9wM2yDamwQLTGl4FZC+GLweICUFRNqhYzoQ3jgely3GRyAGDveEVMCdsF6vJs0K2liVyFhJdjOZSfcsOL7iGmixxbgR9Cw3dxuA475sN5UK0hxHU59ESQDJxSy/1P/FXEpCihAs7WZUaTEJ7RsWp4SxEWlfcC0drs8ANhS1ZIANdyAIr+iTaXk3LXh8euhUbGm4Esfe9WuFqCMUeaOfEmd/HaHlRbbfxqrkrISENtJMEo6/7Hf12w6pbOG1JSY8U0ngB3l1sDWNVVdqgiqEr7o1ynH2kVEj4/w9a4PI8ceot2HvBdn1YChJsy9TX1oOqE8WyGM8/pO8FPdsBU705zQGrakr4GmSCsXwPrDZP/f5zfHqmscNWsDrNt3J0O20nwdiz7NgDkBb+Nu8+vhDgZhwA0W4Bh4KnTIJdas0KJjAFRaWKESxF5DR7N1GEknEjJkJU9sBvf6NLWSNzgDD4y4A8fdA0yPaacAZDaumOm8NAe6vS7Fxb9rKOIhOBNzyJMUSYEVnfuDlZS8UGo9mx0mGwTWLcIwgZ5WZocNqFQJq9NjEEVIsPRoPNCOhnBxbISBG0in6BBBVZjs8QO7Zdzb1FT2ZKOgM1MOs7C9QFdXGyaz030wQ9KxCi7PgA3Ksnuf4IMd4F+8gfALL84HAV4qFkDgI1Bl6HGr8aSzW2jqS4DYlfUprb1bgot5AlMKICd7vWlHYUeuFAxOc7KJjgcBfb4XsO7yedzO0/Cy8Pi1xpLxVfLiCk+5juii/9bQNElUjPaUH58S9+eoUrwTcjK3no8wVq0rtWe+J5w53x9VwkHEwnrVCxiUDad5aPsFcMj8OrnLj3tOPazxdt5e5S2gyB6alJQ9Z5TNZDU+OGVwMQUTb90lgegc3ALF4D97ewhCbLQdQxAIsamUt3Njd/BX2u7IBfrEerqkCQE8Ro6VCGhqXoNg7HpUHk2bcons4vDpXtXxkj6dEs5oa7WzLFc2vF8QmXr3TY8Eq9TNffciWjXNeakV7NssKc6Ez4uRaanh7Znf2Twr3NmlK9O69PJRMvNuiIOs6+BG/jIG5HyGO+ZNj0lhJLPX73/Z8dhZmbYcAuI5kUMhWWcefEb1VLmzY87BXqfrx3ZHgHoMLjDFPt5C2W+ix5OylddDy/Snlz6PdZVMxSJDPzX+IoQQctfOW4CZ03mmA5uV96yHWLiRqelVvPHiyp7J+TUyruRa+hXdrrYnYNlDAqBcDgjhctHUgC39zV6MWd4FAJ/ZygXZ8IbgRKtjQPGXcKy47SSzdAb3xWwGdA16u9X0e3I5rDYrFnk2uvGI2Vf6+e7biP4O+iP8gOirzeA6ZpEn2+AbPJimvQMWZqLqTRTOx0aNFhpolsPWc7NnnHYPUB7Ovok1KGencVDE91AjwPaPW89nuDPbsdymcWrWdqYzYP0sIYHUetwyBSgZ6VDkzG1036Kgr4LEx00gO+Wg68D2DWRu5/NsI/YwkHmjzm3zeRq2P3Zy8b39gi00o6XikKu+7yw1VLphogH5hz+FbHmORCv0bNN3BQWmfAsF1WR/PioRf4MkpV5MAmveIIWL58y2OzN1uzlA1/xECBWMhnsoFqyPH0oPNIA6IoPlwUvQnEG+dCt9rgtgGGtU60Yp24KI7rfVb0zYYivLSYw4W6VxDJzsawjJuDdWu0wiThhvNPiF9viHVgOs0XArRaFWGrtvr9NpYlFfZEhQZeG4ugsbiR4ZlWklvyDqERQ0G6ClewAEVryw8/mdHAJvmQrCRIxnTgrtuqWA1Y7X2zmy1mqhWl2ZWLcJXmMUeDPAR7TeA4YqNAuweMrEE1UT5DMSmkgaTa2ljC8VhLgBRHie9ack6QR8MRGV2s3518SVZUUkZgeEFZnAzy+hS7x5Fum8uJb9mYp1b+yTlsF1ZhKZGfOhpwPqQj7RVnAcqukyyDZAMdnEBDDmTpDt1JwooWrvkh2zLl1BKlsmdYT3K8Uflkxx/MyKMRn1o9RemjMkBVWE/ySa7yAPa2LwD44vzvo1dcrRhsztzYB4DK2vjF3ATmwhMdqL38gik1ASF47oQkNtD59IBg+KD6VZa2wTbSgse7jS7r6qh3EIukIElfrK+KaJR6ySIuCeygCW5BSgDNqEPaYqiV+JUrE5t3SD9C2aflnreoSUQKscwmQxkYf00eChZRUMk0Pm83YeJN/Y4sOsbKXLtSict1OcL+To6yS4ECBxDYGTKdw7gXMyS0CBOXGAcFlvcspQWQAFHoXXu50MqCmDwC9Xv7YrEcGIK3MupjJzxlYgRTfP4qRVgLL03DN/Y/PQHVRKkABeUWEd29ffmJIH2QxfHCjkwgD3coJiGCX3mMKt4ob5q7a0g9cP2zxxid09Rs/gdlzAQxT93Jgw2IBASSojKCAi7WW1LbnAVIfc5qKCjNZncRw26HG17qYGTGRynX73kLunGy9R7XMlWx9beTesKlhorIPQlWhhAgS2ebdsjtIrKEj2tTaOr4kZB8r8y2q7AX6/WMylqtkdqbQebMaQ2mj+X6rXUkXHk/I6fxlqJ4Nk+SYzUkKKuCO+tRpTJpFisRrY5W+hdmkT6XiAAheSpfNOVb7Iz24wRvsFzerR165O3q8OnlcIUYoNtYRHtQJ89ffZdSODU88bwO19RPRAfp03D1nsyBGLRUiFVK7M9Et0z8jCZcrIBI7X43jr6HUWAZCzq6WM7wAxxJ+96Td5qWV6aO6Pb+1X7gIfdN3TYgB7m/JB3JVFop4ly+UJgdOU0Rz27MvHCrJZX7ww9xFGv7nW5tn/ZdBQoEjSkWtqzo2n0RMHPa0VTKQ5SDSqIYqN0QwGB0z0qIcfZdbJcTu1YmMqlHChMSyl05NqiUW8QKnm4YGZtS87J0RiDnaWMrPNpHU1lI6K8RWAoeXtLVdwCSyqKymuauRhL/r38Kc0G3uLvrsgscePLuVHPZAwCZrXpHUyxwXo0DwSG4YOqMGu+x8wUl5ecJlY1SZg816RdqtA6AH8GgCmxorpfGB8mY4NkpduAFop19RWKV0qx4I/fM6+zbNZGpYdpQWI3CVjDRpW5fqNoE4UJIHkkRB0k9Oq2yrJAUv7EU91yIILRLJUBwvs7gQ7LvXrdOVhY4eURFrN12r4ejofpKBR8NzF0KfgSUrdIR+xZlZLY8ImPKFrSu71wOAaIBnMknZkZObBDobkDjpUWmZqNd5bMABsgaVzSlZEo84NhhVzy8tiW9byYgnwX8SyaFgfKjEt/34k1EuIIQaMSc119kXxF4176S09k2KqvOBYj+MK8SV7B8kigMdtBpXbO4sneq6wxlSZunMiWv4xnxk3v9ztxAjAt/f0dazbf/dvKqjbUY7L2jG5pRZGZN+Qms8qnId778rGMQ0J24EB0ojL9F83dBbtpf4TJqNhlL0Mmp8dt5QsH2C4pKn9yqAW+3k6CvOXoZ6zURVpDa4JAi6FBO4vTM2uFixT3pjJuKQ8bBYxHYJzo9Zbj2BTK/Ntdc4ecBLWS2kPMEt0aVpGoB11gPIRTrTxqcRQxHRjEZ95CF8QmFKNIZcFyrN8kPU3oe7vajR7fBpnv6EBvNzL1CSkOicwzIwqi2tXqNE6VX5ne5dJK3jXt3Z8Hgdc3+hdZDDRB610GWX0nHLfigf1cN/P7GieMLF7ejRYG0nfJbQ7s5ddSE0Y2vPmuCBnidkc5wZFBabvK07ufyCfOgtIz84nQGsxeZNpVN/M3Y/DvIlV+AysAfDOa7NLhDU9kKXRd7VZik3pFZ0wVT14LePYJIbh3pl6xEUu5SdemycS3s4kIqT8ZaJWmv6di+SXRY6ooPDWSGlGCpOVk9YhUjI3x013ZtM1tpH3ARt3caNznHRBJMoko157Vd5bQerwiJeiI7Zo5vO4RUnuUqadk9IJaJVclcVgfDRvRbt1/4sLW8fFoY8OAg7076ajSafT+gou33Zp1uZffTxte3MCzv7/I4yDzDmOzVxZOFnaicBIIeMyz5Ol4/YItDWx6sLoHXPEIv9wCM7EAJ/++NYhlh63ZfuXEZxQlNRkio7jZJ6qY4RtJbSkXWUZHVKPbb+LZ97Das6f9VHcQB9WjCZh29+AKs5RgMRIyU3l+s16smkrS0uUdoxtQBzdPvAbytNIuGJ5SgFi8TZmKVWQ6LRHVxjO2KO1MHa7/++1n0oXda0Jv9NKVR6J9UsEUdN9mYp9etHY/s847Bexe7L0BT56wnN8Xyyr4CrcYbNBnq6R4CFZ8/T2yAmSzCsy0nkOO9ezfWB/1gEUrPU/ccp0VXfASkEI9rwG7kaqdF/6lhJxbPT4zkjln0OSGzEA9Bodw/jshRZW7ehQJ7cNtQ62ceoeSJJTH8MpIPSYzr+/NqgqDRo1IeqDIaReBLQBz4zoFV3jcayu1GRIHdr294q/jLAPyj4tmLti0yqbxymo7Bc/B2PYMWDLBlLHxs+NFGrjxQyItLjIZaONB+gmM0m9t8nQNyXHPKLbp2nTSqZcdxb93uJq9cVByAkFyBFPb6OL0lWbJX9Sg6tpYhGMcgPyEaczohY0mHo4PgkJa02EYh3ybYaCuw3Gl5+gNujbMlnsqUlhux7QAViieYwqypKV6nIYgZnJY1w7ZM2TWpTgrsvYbNGaykElRD9FGmdIq7ylJ4wgX6T269v/aKxDKqbj+uYIFY7THW9LWVAtSBj/6tQswC5o5Zyr/wOU8OceT24Y0UUHQG+msKz8YDH40vDGIw0lOpOS/GXRgO+4kB6A+WdQYhfjAxnE1O2NzQ45OBGej5IZpP5g7ZJDZJD7+xVDX5TBqApHbJ/9h4UX0YOojKmP1r3pTwTJCJC0QDqwO536UTjyBbuJH9eFuKAm3X+YWepFESTlhRuIWgWGFg3FHHufYlrLEE3d6vLsaILIEVj1OR68aCE78L+8Bjmalm38V3cEDl9p2eJdrx8fcNckfcuxbe6O/d1iWEeXv/dN2tCn8SjIyNLRgUliLDb4JMs3bkJdUDhaxRVbTunGP5WgPerTPuhfpCAue+y+/ggoH5XpjOqR2d86Un0q9MGHdWgzDjBPKMD1CKvxHb/4j6lZOh48b1F7OHoq0WddP9nyND5i5nEf0H2YYW2N4Rcs9RdVcCw9UKzZygwizxI4pdlPGCDNYYzmg8Eqaom/RugoHKzr+Ody2GQ21tphO88zo3rSdw2rnftsD6lpdwvbo9AjENAo4BPU28ZcmvZuI4TqNN44die43oR2PjiOKe+dursGXzV2B88G3hAi80t32cwKz4xJQyQR8WDKSOydg6t3FiB69H+QLVSlFjObfr6syjYdnn9O2CAdkB+3x30PivfNZqtCi8tNeIy7HeiqYcH6NFoZ6lptFiT2qiXQFRlV7QGjaGt5ZqpGDtDvtxlv8Lxr37CZJQ7wOBN/zMlIT+z9VC4xhGIPlx9PCnZvlPxPvBvp17NRMP4Xv2IyuSKXmzf1nCQeyI6VdPivyd8pmaxH0yiYgBz0p23NlHsdCCnhzKvmuzt+p3efRPyZPC3MuEDlBOf0I5jkhNidnNDA3Oeq2RlAma6yrF+L8fS4QE89UfP7ekawD9RJaAf4QJEhRQM1ZvAc6LaPA5ABnmmPQamC4qlkEDzweaFyXuBCs19bXx13EnbOhmYg3ltJ8MSbL7QpiLDFCYdaffnNS8lMz2j1uZbhO5kITdG7vsGYnq3bRnnIxJofpxcYbCccosfsxwDWPaPVnuDyqkqY5Ae8NhoJV87NPKHugqnwZLb4KfSFj8gG4S1zQ8opuu44RbeZ17xk0b+xTXYcfRwxbfdGipZxwPbMSEiAtyxmryMLzepMqd52/3uUWvr5Hlz0Maw6Pp93vWkzNkekXDX1EvAOM4AW3rrp3FnGiDlbdm6PYoL7waq242tP/SnzFfJ7jhwzgjMEv1DKxMUXUeHQbkxdv9P1KVw3dSKVvGscMTjCd4xkSbPumIQr0CqIEh2VjIkukVzSMZroBqOof6SKGO9srfTPq229Fh55ERoTlpw5sCguKX78mVhDmgn8i2wcYn1nIcislkF65qiZutvIIveGB5LJphom6QtjEmT6sJFBzT3Bz9ti+6U/B24CuLxIy3oPn40qZWYI8A+7ZKOI+mGaPlhUhlbBh+Rhp+H9mkBWKYxSTURa0NjCkE+AXlAjwUeoUWfB1Sob8xX+QYJv7WqMX7TVeaoHLVs9seTMiKbU+H12PSHMUN+Y05GnRenyLuLpIblPhDTNBL3Aav7+0eXyb+FTOpRdlMmBso+UMOOUrKrjLmnzAbGPoybze8c1lwZB09Px7vb7dNENyrAqwzEKijayvNItdeSw1IFH1FVTEaO2QLYfE7whTBDo3EwzCAYnZGaufNCzxpD6FZjGvmAA+s1Os/fXvP9qDhIrUBTW+0aU1VB/qi5SiWi36fKyaGsp+07+nIF9c4so2YF5s1xKf1mv09yBGoEM7xxBQZl88wbuNkajg98pVcuj1F7gC54kw53BivDA8VUYlmQFdHPrtBjtuXNKOybUHB6ZFz8JhReu+qvphpgNWF+Ho5+C+A+bzP9TtWLr/9Z1VR9ML7AZf/zeZMwGCSWu6U+hhzVFL9TcTD/Qe+QeomaGRU6zrT/2YPYAZRH3IPxIDgx4pIPOdX6YSKsOEy/yx+cKzqdidMICMGM+/Pn0OZbAE2/AX2BT03WpLtPnMLYvujy+s2rSSq7RNOUZilpbwU5f4Z9U8vDcQVsaBRFfV1PpdF20HMMjEZSB03ulE0zr54XBnou90zAyp5DVlY0nSlevi2KzRkI4sA2bA/LgRcrV2hoVWQGjrmBjyiVS16EZppRrfCizC+pve5M8K8sJHPPk8m41fS+xBU75hZMfZtzTCo+FxVYDKgzP1YRAJ1ow0xjTAxQN7l7cOpHCbDsfRjDKZvun37s84tmBPaieKPxR5TsYY2IIgGfyBVCk3IkHAg5d9GssYrQHUnbmNliZCIA3di5/ZTLp+jQ4FG7Qa7SDXD1JpWzSbkcv9kbLaH+ySoVEXfTfBCaoi6YZud7Iic0xLZPqVucjw8Y6v6iMUw+TWtMcAQAo2SIfM2W+G9AxW9AJb+PKrc58n5+xIf+2muXcOJrRtG3t1tUrIo3R0JlrtDdYUKSzdhu+R0oPktzg8qIPZg43tOKkyl00sOmU4fp4vL2DITJy1VTZ2DgVdnteAciSbV/kK5pq7vfW5fetC6/rq78qq57sxr1+hp4XY0GYpLT76Wxt/RfMo2hihdpnWDi/VReE4a9Cd01jpI5yjk4LycQ8Cra8BoAZ3KA3uWb6zds9CAxg87jtHEicYzbJqOtowMakrgaFOMoiSSusgkCsk3krsQ/PreLCCpXVY2/jJVVdRLq/FAabWm+rPO57mACDnLDi45ghdIfA1H8r/xwWGb7/Dtigz9IlhJt5H6hrW3nDx/yGFmQZMAIs41EcEjx8WHgLBjhzlq2C0d0VsekC6EqptiMi++2TCYyzqMsnbMQfPWE+3Jj+TU9ZBhEyfHDM+Oh5zUTmRamMhOqTGZnOvR7ad6b0oNe82qVBe7a8AJ85pgcad6gnk3fTJK+oPw368lWvzKupOui38dh054w4juzvf9lvZBrGvzltsCs6IFfoqnWZYJzvzzg0vC46Dw5Kh9/4g1MaSOYxuy9Q/Z7ES1xIWHZNFo+aVT6IzTpj2DSH/mkPxLa+oqBNECWtpd4m6s3w4TSbRtBMjzqu1S520vUD89tTlHYsXEdpzF7Er/Mh4GMH+kYjhQD3LgA4AHStBXcnOvr5WhzKm6pmsgSR5uW/W411gLNgbEamFzSIV/RnWVr0a9m1zdtuzf07IG/zlWe/ke8qG2ccQpRcMO01HryUnbXXOzth/1a7LKImN07RIsBH5Trr7YfmhFh3Qmn6ggLZ7VaOSBmaMybA5k0SZqlxoMf1NaijVFn5y/oq/gk+oFvwkrz9imVTty9CryrgKYD9/B9hblxq8CHPAaP1hRqBjsIEfetyflJGxNIwMCcQZTLRYTHagG6c9bgFgWz5iN/aOgY8T8vKfpfIsJQGR25nvgoH0c0j8HXRh6GUuasf0am6K3p20sSOqWpxhtKPK9k7bwGnXQfzSl4KnDlnhaeq07B5bJ9vJY2AQiPa431kFtkjKt/aVaaDFes8qATOOlsDmgnxz1tnSSGRIsTEB0ryxWhvEsH+WYOW0kFeQLS2y2/u4Q3t+vo+3Q8nS+7W5Lzkq+Q+62Jpcb9+I9umv2aaUjMMGnLSihMNHKaajM1UHQ3wbPDiBWCne+ESQWmeSVVLMZVYpi0TSfZ9cB6SAszTxnQdG0piAWwJZMKZw/m9I20B/58XnakoksTFoeiH/8wQzMCmNxu6TMPe2koeTAGdsNOqJL+aBzadMFBCJJZNgBFCQoMFlUyByDLHkxMtg8C0QXfJVkqI4zVNUBnzF2doowFBABVuUlMNxHYzbAPHY6fqakJjm3f8jL8G2Ycs8VLXSHHM6edNMFeiEeHFmxO4+/EBbxsxWZdf9WlMxSW1DrSDrMG4ZQnLYWvWSs9MYReOxQ/pWgbMbSwkKv/bGboKCa0gqqhSuupgV2xJbq1F7hWZ2kZ5cSStv/RmlbY+mxiPo5xsSzBwCc86B8t158rJDLySNRVIZrOeISK1ilNID+mQy6k29fDVTWFBiNkUcBDMhKLWy6fkgbhVjBhBNwoiROy74lCvDVWENSUp0hleEhQnz3T0uY5BXdw9QRfCYJQZOpszde7Sf63IDFpRaC4hI38FS7f4X5nPkyPB9AHtlm74sD2UzQWQE30sym6n7CC4XEssuIAnBsZAuJp/YGdYhCWclFq5EeMJXBql6wL0wyGqvQqfNKJwLc2PS238FKTZ0wTVZTVgcypctRm0Eb28UJ+n7iiTCW0uHPwSmmQyIG4s8lc2RHDV5pH/2JsPzpFd16/kOyDRJbNLZxUGn5pm5RQB+4M+fGdzy+9DC+ckrq+egtftdWv3mId49HUDcvX1lJWYKUb5g1aaaY+VjJNDe3fFhIzks64Ien/KxalX300ktp+lps2AH1QPSxS5K+045S0pdPHLPiu2oxxUDN9WwkN0GTrxr0m28BN9nBTd38jeCUJekTj3yfqbTW5N2dbb962X992gCkvYbubLPE+Aku8XMfMLvklMSUjacMWOAZNCB5yGm7ud1vu77bUr1vo97Yw23osqqgdqOKGPpNLDgyKGV0Yg09d+wbpBqlLB4CwTdFOgi/KkT84goxLn+R3GW0SPt9BJHKEACxbFHAq+Z1VIhdIObapXpsZi+VnhuDxka641NQ0C38GAaXdyEvq58gZdtV6B0BZZHZ6pXBbZLqwhtjNOEjYul72SJIoK5pU9A9pWNre3QsnV2D0SIWpiOrahE7j0ZGjFIrx50JtkCuG3wypYXsl0DBiWYha6Tjb336lr4SBALw4BxRGNfhnZ4XwFTY00w0WRo0nq2fJ07zIaA8oEb92bYsxG/wA1hyDmIiuG5bmZUmaCZ6A6Eg1f+BX7p6SqETAty7W3iZ61i1NVZl6cXlPu/hwmvEALOZE4wAJf9AMHUQVl2D5pb/hMtUMnrf8ZevCbw3QG3EWMalNulAsolcHa6OugpKOXV36/ogffG2P3o+R4niWJZbuRmonVnLbAu1AVkWpG6JGbkGzyi6/ZjMhjsXleogL7fYr9sqrXfcmdCUIKltYN4pZZRNVUpSX84uRmPurIDsDRnKad+dRShf6AqOlnpRei7ZOubJ/3zIt3uWYGC6EjHuOcICMPqG9vSJpZ8+zL0gHFDi8OAkv/Fj/ekVMpHhS+hKhjTYPzOxPMa8ytm/6Ow2r5rKrh9V5R2j56kRxP1EAHgkol+Exfd2ftpoJwsijBRFBELELBuaWiAe2AvSo5FDuFRjC/EQ6x/emlxT4KZtgqGrVNt7PSh06/DAxhwdDNwc+Eo1y/9kToR5WXCvMmX+AYnJJjttG7K1YEJRDLcDnGKh5IFDlxsSFfOfh+w+AvlEd1d+VEfsMupYElnFA8UHk4gjzdpDYB2+hjwcVjT+eh+uPNcuHzWQWwCHndvM/dpdFzCHE93Bw5q9uYGvt5oWumDc4sWMVadbHZIwkC4uJ+i9hU3v+rd6fppb70t6ex/FOPPICpfLPfTKTFGmsWtJJX3U4zMvHBJURaZAsD4+Imh12nSHyb8bn1ha4to8aAbESoh0/ZXse5wzWxdPXqG3JgAjtBslPlyGs3JRW5qjEB6xl5VfSyxz0ucnKKPvBEWF+QrZoJAv5AlFJB5XswAEFrgHGp7G651vsq0XiMUgGFUO3ZF58Gx5aFpfNCKmh9eHB37cuuAJxYmST+QaniCsA6FwwlCufuhRN0Zap9a6tEwfXTslgeS/dVslfAzgwvoX8BAPm7XfCgNebx7aE11Toa/wtXE5KCv/XJG/I1u7ybzfMEKJj01zH2uRfS+Ca9IP8eFU1h4Hxi2kQzmq8IIOYSXK+HxrxFuDWqEac5KdcZT7hpSCMTHYUtZ0CwhfOQywAmGw0G9YCqryEK7mzFxTEDyH1JZuliDW9tAehaH5yLmnviRM2fV3YuedmPlQATXkkhdesOZv4s3jettgT/lSHIVKUJX9tmsBXCzajgGxdXOsoDtFBh302/YU1THsD1uJG6NIfn+sDTJTXQGy9nmGWoj7cCRaatZ7O1uAr7orZBWhCknRFKMuMRdbZ4VkpcNsm0B0MnNQU1bQYBB0jPJviT0CLQ8S0WUuLCZdG2Z5665TWkqe+QbiKYxmAB4ru0S6d57BuGfh6zV8lDsChUpAvQdj/QNikhRoudSIaMqSE8kWTo2FcsgSEut+QIfValwRrls+MCHRrtjT9Md5rDalo9FpPnHALFRZfgmeie0rw7mgdC4nspIQwMd1G2lSP2BkrRbMArkucj8kyF+oJtnfjhR+gbVpiEEBdjpnsOMSNrl0G13sT2IIvwTFezRaf4NkkYrrwL7SxJsll9qzwMRWLwjiJMn8MC9MMFU0L4O6GooAt45s30UduQa48gI5kDQsGiQAFLYz0xT+wZYekLnhg7C8FNQWVdRll/ZtcCakHgBtXysfRPez6TRqutpKAbUWHsVn98RxHmqVLClLuDihrnFa5WtolV5DLP6rVGQEpdLIvBH90JlDeHt5KhkEzDysLvPtTLCnCD2AlEmtrlnNW8x+mOpqYHPrv5h78rdRJAxUUtFRWCdw5l/xK3pInHfAe7uJ7cNn7YyNQTfapWZE8Zja1XfUZNiQ8tjJ+cuqTPhIdL3+0kvNNn54zhdUpDot3wIyl7VN4p3745HbM4u7JRRzWAjOX+1nS5/psaH4ojj+VHZOTqyfLujHB4x4uCYKES/ZYbv9OmpI7CHpayxK5UvomE92AlltI6tKhHwbCIH/Ec5+iK+qPUSicluuLAStP6TJbVd9UKbi+q4fuBeVqIGLVjp274/QGEM9ifL9CIXHIBr78PcdXfCBoVHmGcvtLj4QF6BA3r7RbZ76tmkw5tM9hn3Xt42YKDxYhooVX0Tq2uJ8SzRIM4IrpCbJiXapTBOE/H1CrhpAosGFctQDVxVqqO5GgSwjruFO7x2LTbX2YqzmSZSGFPjaKw0hWbyC80NyxORx26T5BGQxKB0y5waNIXhOM86UZLHwXMfLb3GjUIcnhkg261onQFDjIkvXedOi7vA479iBrMe12UMzyRjtrVretQ48yOjYRUZ45vbupmuwq1RI5RD4t+rzYg9fB/yXPLg65DwY/NbN5yNN0450sgeKcOfP5Z3kAteduKZbJdoBd+Zl8e0ZdFbTJYh+ZpSX/+8sYJKCBd77LGmx22NwCjzfnXdPzLguv9ctzhZyV4Pb42UO1f4hm+y885TZ4V743CX9lhxIxyZNt1t2kS6eoQ6A84V9BZ/cCgvyEc3S0csc8hWsJNl3uW5f50BuM6ekpaMZpNkDsjz8rJpQKlnNaLj9yp0/XYR52wyv//N8YF8e0Gn26S7O5UWi3IlXPS1QDuM/kZoEPIFwMBETXuf+JyiohwPPKTS9rakWYkwAR/jksg87lOoFeePDpaKHDKb7lFNJOejzGfg3W0EvQWiYPEtmjdvI/wrjc4rcPAPzvp5h2PnF5/O/eYMmA84CXopAjtHUgib5RhBA5AncSQE15ASkG1lrGeIj4luXRd2DqYEsFfQvBVQOWTUVmDD65QVgKYF/dO8PvXiyOUw/YpYRRexAL9huR7yIwZd0M2JGsB1LgkDxRJXTFsohotZByQ0a7Ypfz/CqYXoy/KD9TGkRwFxgX5EFJbfc6MVvICyWQpBaZDJ3DR/yq8ihmrXqvqu7iuZyeSZajlROXTmnBABVZQ9sDcClbi80PrtKqQS0rr/rLm0GAhiZmBWZl6xqEAt2kN1YrbM5mfKSoRvD+RuWAGa7xp40WgFtlqQ9T2AQBARfvpg4GWSzOKF7DZoAJfCKN3x/hmX48b60L79JFIWk9vOANfkB8cqBJe4aYNpc5AFYulPMvLw7TWvZdPH1eVUKqWjI6Ng9oSQyW216pYoKjLv/Je+fy4tOJJNV4WSOquj0pbVdly4qI+uVJ/Usbld1e2CSUGjG6K4YKV92wXODCIzdhOdpRv738Asyiup4sdO16VRBvwI7kkxZMP/4W9H97YZA1agT1zGFmFiCGS6zqVZiUHUygHsozjpEF29JILZopiZjGr4ssZDq0IvGu9+7G+G8S7yPOMak3yn0MXIkgmjlYHmEgyvZhr0NVFE+SRImuCGDLyVBarq1mmsD92uT2wIUrzUy3AFcmbWNP8nOHNI4bKdnePXFioqm2Vjq+PuxzbuWiaag4wS9vPPuD+GGGGF5YZEtTDC0y9PaLwViSgnzglMaaBWa4jRFrwWcqP0VfyUnM+ucdSkZ58pvk1qJUyS2TldVatOO0/Hi0GIMSO3W+9JDcpO1W7s5X2QlQuFYYqvttbiyARlWpZL2IiGXdekerdW86Hhds4sD5R71msYsUEcVUNmfmkqnHQRvMmhLpZvGJ28IYJQBwoiuwswX9lBKBuEhgajCF411GbjIlsDy9C/v8orYW9mEBQSXCnbeYpnSZQMJZIKA0U2ATknEMHJhyd4tISwU/IEwOLsMbCGoleGANI6vNF0IHHl1hHLW9/rYqrROmIYSWJ4rlBi0Kxr/jg5/6tNzgrqPcGcDMu+dDZVH7lAJJe276I9zcHUucRueA03qToSdYySDq51yCHuByIi36Sj9Y+OaxLpaizRNbKEBlzxLvnoMvstHgaNDT28MKYoJbQbXGvm6PawiRxG+ag2X60U5aZmkaAkt4CSgVCV8PUTXZeP6UBCeNAQdguGstyxb401+apHn485Q7EuqLwuQQxP5SQRgsn6yyt2yJiK1j1UuR8mzEyMa5XxChCc2wZ6oapOeXtgM309O/ZUvvxk4v6o7ZmSOprlzZ9uGB9SAq1otXR8zxXnLJGlzU1esoUMOrZnOn50kccr8IdsXvC2b7MBJssT4e2APggFCPMNmWVPFAioqGgabsnbGOBI4dg+KS58xYweXsaQDmXe43BL6UtjoR1/0J6DhMqWfyYkZO3uWJOwB8iYrzJdCoCPKU16DHTfV37GdUMICStsCRYmneLeMyV7rX9Yc+UaXFV6lzfpkZImteFQBAlEkF+dHu7ogCtEXbxcC2TGu5P8cEuU6kn4EF7KeVGaks069ude9tXQcHWa/tnRL+X0OtydiqaLJyEK9M6vwSD49nhEXz2hVQnY9EWouONA4FqpGw/moCVlON6rX0IaEd2qY3UJaNkBhIpuaYK+gAXYPHmTfTbuETcyYu0J0vqoJRCIPqUCgGohwaFX+g/0tA/9JRAxtfHbW/SZTSOi/dsajpNwPgBYBfHZivBqx8vQRea1B1yagphH7Y0NW1YL88qHW0OomYKJ2FVtTGAVJK7tHzV1uKISR6MY7Pqp4HJZH6TUD3PFyxrkHpTYPievGewn1odxE3XydUXw3myeAtlVeGn4GPSstWyqlzODE4JrW0HwqO1YTGq8VvjY5lgdI05ukEWCGpOHv8TozBTGl9eaCj4j5gbuZkNvX6Q29mJlGvM7SrqzhLEGx4ivWWcgMx7PF7JZm7GnjmKqNBy6ojBv4pIOXP0YhnRi7sJMze2cH4Yiw/6JEZ1Bp0xYrtcigKGSmFxnqepJuldijyuJsZHMEqEMSoThKLy1njNJIVFbAGTw9ULnE2M9u1g4ExkGo35X5G4HBXBzCo0n8x4aKzVLykgYwVi/+gEX+g5qmF/+6fkVMRk2Di8ufQMAJH3SoGtVOuTCogb5Q8MDFYd4gLACLQzG7jq2zDxGE3ZoHBqLvk0h0tgv23VHhymjm8qpfVR9oGYVbkbBAiR60koNCwxJhJiN0gQIo+CNSc0H5pWGbFkCsWlxkp9Sr6qWS6HXbpBTadpaCsIUa1IrAz/fv4oNHOWhVcpRuboe5wOwOf4uUsEe0Clgg1mtiFFVRCPhfZYw8WpijDxNpeHri5ZXxmYZB0OMA1ZzmCTxoCrNvG5E1BUmO+4wT+hE0ymNizf4uYsxpAdpkQ3HnxDbvPDwczPaCFYAsltjFB0LUJ7SCuquerHLE5pqSohuFnUmeAEuiVJmhlYqPLSzRx2+2xtDzfI6wLoI4Inh0MbqjUKns25ZjAduF0s+nG/fpcsMnlh+jzonoQCkZPuwaiQ74q3gR32LxFH+ip6X+CUA8rIJcu2kM5ESFBxFQ764CuA2E/Ru5e8xSdfcA1rUDMEuF+wgxpiOguzABoc6lYYE0Fg6m8sEi5aNM7Qj056xMGI4bSaXeW9RB7oHX4/ePTrIVJBvDpO1CuuBk5xZa8a0TyIvyTxq6nztGHSze+fzZkx0baJ43aj/1eY8+R4wi1eXb00nJTV8ZaGDYKdCudFn+PnJ72LO26TmwfHVlHNdJyxA9EM9DJCAB3NgHS6aVsARZogVsrgSzHFZPwYOSRewNxKzdeivHdoThYDtGHRhiEvGpBnksIqtTAEgDcfKpH6Pcr4F5hirASkl4cOy2CgoCQQ6jeSciDCYjkhUafiiDntvSuy6A/yoHPGxyzWMb0w/KHXntZQi8yXuP4C3G8aBfYsRBtjtymcKbgckH82mhFTGNEg3NJAHhpxXpKbAyAZDXh0demGXOZjtjVQoQIqUX6AASNJ3d9H0/VIc2DAYwTauTXCjoZmn6itzyKiXj2BYgRCMMLzcNb2MkvStsLYyirnfNGa1mDXL2eUVbL45zMbS41jbA1GL+E6xu/EimiE/jx2At5T3jdIh58+7T650TDUCKfBOlxnwX7av+g8rFghPu+SxvynIH83vOfxZ+Pqfwl7brsEJUlM3CpUD+vcCclL4X4VCaAV0T20PBpXtCIl0oA0XbFzHAbslcTBiYCUUlXNSStr6+Vr3Q1YXRXwZD1GrPt70+neuD1a1vutZd/5HSadWhn7h0uD44fU4nwxfRh786wFUXLD7HoLbpZyioxYm0UBHrqYilIGpwyl4V2ggkzNid5KclV/eqlNVuqnjIBReXWQbeVk7R2vbIfhKOstqqgUPrZ9OTOsU6Dt5P2Vb/h0MgWXjQfe6yImSaXHfrYX/+9Qbv8Zhfl1idZCuJFK/GDrxRU+7Bu8YB/umMQv+CujQE="; const decoded = JSON.parse(zlib.brotliDecompressSync(Buffer.from(encoded, 'base64')).toString()); typeCoercionStateMachine = () => decoded; return decoded; -}; +}; \ No newline at end of file diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-info.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-info.ts new file mode 100644 index 0000000000000..28914bb4dca16 --- /dev/null +++ b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-info.ts @@ -0,0 +1,50 @@ +import * as path from 'path'; + +/** + * Normalize a service name from: + * + * - A full SDKv3 package name + * - A partial SDKv3 package name + * - An SDKv2 constructor name + * + * To a partial SDKv3 package name. + */ +export function normalizeServiceName(service: string) { + service = service.toLowerCase(); // Lowercase + service = service.replace(/^@aws-sdk\/client-/, ''); // Strip the start of a V3 package name + service = v2ToV3Mapping()?.[service] ?? service; // Optionally map v2 name -> v3 name + return service; +} + +/** + * Normalize an action name from: + * + * - camelCase SDKv2 method name + * - PascalCase API name + * - SDKv3 command class name + * + * To a PascalCase API name. + */ +export function normalizeActionName(v3Service: string, action: string) { + if (action.charAt(0).toLowerCase() === action.charAt(0)) { + return action.charAt(0).toUpperCase() + action.slice(1); + } + + // If the given word is in the APIs ending in 'Command' for this service, + // return as is. Otherwise, return with a potential 'Command' suffix stripped. + if (v3Metadata()[v3Service]?.commands?.includes(action)) { + return action; + } + + return action.replace(/Command$/, ''); +} + +function v2ToV3Mapping(): Record { + // eslint-disable-next-line @typescript-eslint/no-require-imports + return require(path.join(__dirname, 'sdk-v2-to-v3.json')); +} + +function v3Metadata(): Record { + // eslint-disable-next-line @typescript-eslint/no-require-imports + return require(path.join(__dirname, 'sdk-v3-metadata.json')); +} diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-v2-to-v3.json b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-v2-to-v3.json new file mode 100644 index 0000000000000..4d6a670769e57 --- /dev/null +++ b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-v2-to-v3.json @@ -0,0 +1,143 @@ +{ + "acmpca": "acm-pca", + "apigateway": "api-gateway", + "arczonalshift": "arc-zonal-shift", + "alexaforbusiness": "alexa-for-business", + "appmesh": "app-mesh", + "applicationautoscaling": "application-auto-scaling", + "applicationinsights": "application-insights", + "augmentedairuntime": "sage-maker-a2iruntime", + "autoscaling": "auto-scaling", + "autoscalingplans": "auto-scaling-plans", + "backupgateway": "backup-gateway", + "cur": "cost-and-usage-report-service", + "chimesdkidentity": "chime-sdk-identity", + "chimesdkmediapipelines": "chime-sdk-media-pipelines", + "chimesdkmeetings": "chime-sdk-meetings", + "chimesdkmessaging": "chime-sdk-messaging", + "chimesdkvoice": "chime-sdk-voice", + "cloudhsmv2": "cloudhsm-v2", + "cloudsearchdomain": "cloudsearch-domain", + "cloudtraildata": "cloudtrail-data", + "cloudwatchevents": "cloudwatch-events", + "cloudwatchlogs": "cloudwatch-logs", + "codegurureviewer": "codeguru-reviewer", + "codegurusecurity": "codeguru-security", + "codestarnotifications": "codestar-notifications", + "codestarconnections": "codestar-connections", + "cognitoidentity": "cognito-identity", + "cognitoidentityserviceprovider": "cognito-identity-provider", + "cognitosync": "cognito-sync", + "computeoptimizer": "compute-optimizer", + "configservice": "config-service", + "connectcontactlens": "connect-contact-lens", + "costexplorer": "cost-explorer", + "customerprofiles": "customer-profiles", + "dms": "database-migration-service", + "datapipeline": "data-pipeline", + "devopsguru": "devops-guru", + "devicefarm": "device-farm", + "directconnect": "direct-connect", + "directoryservice": "directory-service", + "discovery": "application-discovery-service", + "docdbelastic": "docdb-elastic", + "dynamodbstreams": "dynamodb-streams", + "ec2instanceconnect": "ec2-instance-connect", + "ecrpublic": "ecr-public", + "elb": "elastic-load-balancing", + "elbv2": "elastic-load-balancing-v2", + "emrserverless": "emr-serverless", + "emrcontainers": "emr-containers", + "es": "elasticsearch-service", + "elasticbeanstalk": "elastic-beanstalk", + "elasticinference": "elastic-inference", + "elastictranscoder": "elastic-transcoder", + "finspacedata": "finspace-data", + "forecastqueryservice": "forecastquery", + "forecastservice": "forecast", + "globalaccelerator": "global-accelerator", + "iot1clickdevicesservice": "iot-1click-devices-service", + "iot1clickprojects": "iot-1click-projects", + "iotevents": "iot-events", + "ioteventsdata": "iot-events-data", + "iotjobsdataplane": "iot-jobs-data-plane", + "iotroborunner": "iot-roborunner", + "iotwireless": "iot-wireless", + "iotdata": "iot-data-plane", + "ivsrealtime": "ivs-realtime", + "kendraranking": "kendra-ranking", + "kinesisanalytics": "kinesis-analytics", + "kinesisanalyticsv2": "kinesis-analytics-v2", + "kinesisvideo": "kinesis-video", + "kinesisvideoarchivedmedia": "kinesis-video-archived-media", + "kinesisvideomedia": "kinesis-video-media", + "kinesisvideosignalingchannels": "kinesis-video-signaling", + "kinesisvideowebrtcstorage": "kinesis-video-webrtc-storage", + "lexmodelbuildingservice": "lex-model-building-service", + "lexmodelsv2": "lex-models-v2", + "lexruntime": "lex-runtime-service", + "lexruntimev2": "lex-runtime-v2", + "licensemanager": "license-manager", + "licensemanagerlinuxsubscriptions": "license-manager-linux-subscriptions", + "licensemanagerusersubscriptions": "license-manager-user-subscriptions", + "machinelearning": "machine-learning", + "managedblockchainquery": "managedblockchain-query", + "marketplacecatalog": "marketplace-catalog", + "marketplacecommerceanalytics": "marketplace-commerce-analytics", + "marketplaceentitlementservice": "marketplace-entitlement-service", + "marketplacemetering": "marketplace-metering", + "mediapackagevod": "mediapackage-vod", + "mediastoredata": "mediastore-data", + "medicalimaging": "medical-imaging", + "memorydb": "memory-db", + "migrationhub": "migration-hub", + "migrationhubconfig": "migrationhub-config", + "migrationhubrefactorspaces": "migration-hub-refactor-spaces", + "networkfirewall": "network-firewall", + "paymentcryptography": "payment-cryptography", + "paymentcryptographydata": "payment-cryptography-data", + "pcaconnectorad": "pca-connector-ad", + "personalizeevents": "personalize-events", + "personalizeruntime": "personalize-runtime", + "pinpointemail": "pinpoint-email", + "pinpointsmsvoice": "pinpoint-sms-voice", + "pinpointsmsvoicev2": "pinpoint-sms-voice-v2", + "qldbsession": "qldb-session", + "rdsdataservice": "rds-data", + "redshiftdata": "redshift-data", + "redshiftserverless": "redshift-serverless", + "resourceexplorer2": "resource-explorer-2", + "resourcegroups": "resource-groups", + "resourcegroupstaggingapi": "resource-groups-tagging-api", + "route53": "route-53", + "route53domains": "route-53-domains", + "route53recoverycluster": "route53-recovery-cluster", + "route53recoverycontrolconfig": "route53-recovery-control-config", + "route53recoveryreadiness": "route53-recovery-readiness", + "s3control": "s3-control", + "ssmcontacts": "ssm-contacts", + "ssmincidents": "ssm-incidents", + "ssoadmin": "sso-admin", + "ssooidc": "sso-oidc", + "sagemakerfeaturestoreruntime": "sagemaker-featurestore-runtime", + "sagemakergeospatial": "sagemaker-geospatial", + "sagemakermetrics": "sagemaker-metrics", + "sagemakerruntime": "sagemaker-runtime", + "sagemakeredge": "sagemaker-edge", + "secretsmanager": "secrets-manager", + "servicecatalog": "service-catalog", + "servicecatalogappregistry": "service-catalog-appregistry", + "servicequotas": "service-quotas", + "snowdevicemanagement": "snow-device-management", + "ssmsap": "ssm-sap", + "stepfunctions": "sfn", + "storagegateway": "storage-gateway", + "supportapp": "support-app", + "timestreamquery": "timestream-query", + "timestreamwrite": "timestream-write", + "transcribeservice": "transcribe", + "voiceid": "voice-id", + "vpclattice": "vpc-lattice", + "wafregional": "waf-regional", + "workspacesweb": "workspaces-web" +} \ No newline at end of file diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-v3-metadata.json b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-v3-metadata.json new file mode 100644 index 0000000000000..ac34417dd8db0 --- /dev/null +++ b/packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-v3-metadata.json @@ -0,0 +1,1075 @@ +{ + "accessanalyzer": { + "iamPrefix": "access-analyzer" + }, + "account": { + "iamPrefix": "account" + }, + "acm-pca": { + "iamPrefix": "acm-pca" + }, + "acm": { + "iamPrefix": "acm" + }, + "alexa-for-business": { + "iamPrefix": "a4b" + }, + "amp": { + "iamPrefix": "aps" + }, + "amplify": { + "iamPrefix": "amplify" + }, + "amplifybackend": { + "iamPrefix": "amplifybackend" + }, + "amplifyuibuilder": { + "iamPrefix": "amplifyuibuilder" + }, + "api-gateway": { + "iamPrefix": "apigateway" + }, + "apigatewaymanagementapi": { + "iamPrefix": "execute-api" + }, + "apigatewayv2": { + "iamPrefix": "apigateway" + }, + "app-mesh": { + "iamPrefix": "appmesh" + }, + "appconfig": { + "iamPrefix": "appconfig" + }, + "appconfigdata": { + "iamPrefix": "appconfig" + }, + "appfabric": { + "iamPrefix": "appfabric" + }, + "appflow": { + "iamPrefix": "appflow" + }, + "appintegrations": { + "iamPrefix": "app-integrations" + }, + "application-auto-scaling": { + "iamPrefix": "application-autoscaling" + }, + "application-discovery-service": { + "iamPrefix": "discovery" + }, + "application-insights": { + "iamPrefix": "applicationinsights" + }, + "applicationcostprofiler": { + "iamPrefix": "application-cost-profiler" + }, + "apprunner": { + "iamPrefix": "apprunner" + }, + "appstream": { + "iamPrefix": "appstream" + }, + "appsync": { + "iamPrefix": "appsync" + }, + "arc-zonal-shift": { + "iamPrefix": "arc-zonal-shift" + }, + "athena": { + "iamPrefix": "athena" + }, + "auditmanager": { + "iamPrefix": "auditmanager" + }, + "auto-scaling-plans": { + "iamPrefix": "autoscaling-plans" + }, + "auto-scaling": { + "iamPrefix": "autoscaling" + }, + "backup-gateway": { + "iamPrefix": "backup-gateway" + }, + "backup": { + "iamPrefix": "backup" + }, + "backupstorage": { + "iamPrefix": "backup-storage" + }, + "batch": { + "iamPrefix": "batch" + }, + "billingconductor": { + "iamPrefix": "billingconductor" + }, + "braket": { + "iamPrefix": "braket" + }, + "budgets": { + "iamPrefix": "budgets" + }, + "chime-sdk-identity": { + "iamPrefix": "chime" + }, + "chime-sdk-media-pipelines": { + "iamPrefix": "chime" + }, + "chime-sdk-meetings": { + "iamPrefix": "chime" + }, + "chime-sdk-messaging": { + "iamPrefix": "chime" + }, + "chime-sdk-voice": { + "iamPrefix": "chime" + }, + "chime": { + "iamPrefix": "chime" + }, + "cleanrooms": { + "iamPrefix": "cleanrooms" + }, + "cloud9": { + "iamPrefix": "cloud9" + }, + "cloudcontrol": { + "iamPrefix": "cloudcontrolapi" + }, + "clouddirectory": { + "iamPrefix": "clouddirectory" + }, + "cloudformation": { + "iamPrefix": "cloudformation" + }, + "cloudfront": { + "iamPrefix": "cloudfront" + }, + "cloudhsm-v2": { + "iamPrefix": "cloudhsm" + }, + "cloudhsm": { + "iamPrefix": "cloudhsm" + }, + "cloudsearch-domain": { + "iamPrefix": "cloudsearch" + }, + "cloudsearch": { + "iamPrefix": "cloudsearch" + }, + "cloudtrail-data": { + "iamPrefix": "cloudtrail-data" + }, + "cloudtrail": { + "iamPrefix": "cloudtrail" + }, + "cloudwatch-events": { + "iamPrefix": "events" + }, + "cloudwatch-logs": { + "iamPrefix": "logs" + }, + "cloudwatch": { + "iamPrefix": "monitoring" + }, + "codeartifact": { + "iamPrefix": "codeartifact" + }, + "codebuild": { + "iamPrefix": "codebuild" + }, + "codecatalyst": {}, + "codecommit": { + "iamPrefix": "codecommit" + }, + "codedeploy": { + "iamPrefix": "codedeploy" + }, + "codeguru-reviewer": { + "iamPrefix": "codeguru-reviewer" + }, + "codeguru-security": { + "iamPrefix": "codeguru-security" + }, + "codeguruprofiler": { + "iamPrefix": "codeguru-profiler" + }, + "codepipeline": { + "iamPrefix": "codepipeline" + }, + "codestar-connections": { + "iamPrefix": "codestar-connections" + }, + "codestar-notifications": { + "iamPrefix": "codestar-notifications" + }, + "codestar": { + "iamPrefix": "codestar" + }, + "cognito-identity-provider": { + "iamPrefix": "cognito-idp" + }, + "cognito-identity": { + "iamPrefix": "cognito-identity" + }, + "cognito-sync": { + "iamPrefix": "cognito-sync" + }, + "comprehend": { + "iamPrefix": "comprehend" + }, + "comprehendmedical": { + "iamPrefix": "comprehendmedical" + }, + "compute-optimizer": { + "iamPrefix": "compute-optimizer" + }, + "config-service": { + "iamPrefix": "config" + }, + "connect-contact-lens": { + "iamPrefix": "connect" + }, + "connect": { + "iamPrefix": "connect" + }, + "connectcampaigns": { + "iamPrefix": "connect-campaigns" + }, + "connectcases": { + "iamPrefix": "cases" + }, + "connectparticipant": { + "iamPrefix": "execute-api" + }, + "controltower": { + "iamPrefix": "controltower" + }, + "cost-and-usage-report-service": { + "iamPrefix": "cur" + }, + "cost-explorer": { + "iamPrefix": "ce" + }, + "customer-profiles": { + "iamPrefix": "profile" + }, + "data-pipeline": { + "iamPrefix": "datapipeline" + }, + "database-migration-service": { + "iamPrefix": "dms" + }, + "databrew": { + "iamPrefix": "databrew" + }, + "dataexchange": { + "iamPrefix": "dataexchange" + }, + "datasync": { + "iamPrefix": "datasync" + }, + "dax": { + "iamPrefix": "dax" + }, + "detective": { + "iamPrefix": "detective" + }, + "device-farm": { + "iamPrefix": "devicefarm" + }, + "devops-guru": { + "iamPrefix": "devops-guru" + }, + "direct-connect": { + "iamPrefix": "directconnect" + }, + "directory-service": { + "iamPrefix": "ds" + }, + "dlm": { + "iamPrefix": "dlm" + }, + "docdb-elastic": { + "iamPrefix": "docdb-elastic" + }, + "docdb": { + "iamPrefix": "rds" + }, + "drs": { + "iamPrefix": "drs" + }, + "dynamodb-streams": { + "iamPrefix": "dynamodb" + }, + "dynamodb": { + "iamPrefix": "dynamodb" + }, + "ebs": { + "iamPrefix": "ebs" + }, + "ec2-instance-connect": { + "iamPrefix": "ec2-instance-connect" + }, + "ec2": { + "iamPrefix": "ec2" + }, + "ecr-public": { + "iamPrefix": "ecr-public" + }, + "ecr": { + "iamPrefix": "ecr" + }, + "ecs": { + "iamPrefix": "ecs", + "commands": [ + "ExecuteCommand" + ] + }, + "efs": { + "iamPrefix": "elasticfilesystem" + }, + "eks": { + "iamPrefix": "eks" + }, + "elastic-beanstalk": { + "iamPrefix": "elasticbeanstalk" + }, + "elastic-inference": { + "iamPrefix": "elastic-inference" + }, + "elastic-load-balancing-v2": { + "iamPrefix": "elasticloadbalancing" + }, + "elastic-load-balancing": { + "iamPrefix": "elasticloadbalancing" + }, + "elastic-transcoder": { + "iamPrefix": "elastictranscoder" + }, + "elasticache": { + "iamPrefix": "elasticache" + }, + "elasticsearch-service": { + "iamPrefix": "es" + }, + "emr-containers": { + "iamPrefix": "emr-containers" + }, + "emr-serverless": { + "iamPrefix": "emr-serverless" + }, + "emr": { + "iamPrefix": "elasticmapreduce" + }, + "entityresolution": { + "iamPrefix": "entityresolution" + }, + "eventbridge": { + "iamPrefix": "events" + }, + "evidently": { + "iamPrefix": "evidently" + }, + "finspace-data": { + "iamPrefix": "finspace-api" + }, + "finspace": { + "iamPrefix": "finspace" + }, + "firehose": { + "iamPrefix": "firehose" + }, + "fis": { + "iamPrefix": "fis" + }, + "fms": { + "iamPrefix": "fms" + }, + "forecast": { + "iamPrefix": "forecast" + }, + "forecastquery": { + "iamPrefix": "forecast" + }, + "frauddetector": { + "iamPrefix": "frauddetector" + }, + "fsx": { + "iamPrefix": "fsx" + }, + "gamelift": { + "iamPrefix": "gamelift" + }, + "gamesparks": { + "iamPrefix": "gamesparks" + }, + "glacier": { + "iamPrefix": "glacier" + }, + "global-accelerator": { + "iamPrefix": "globalaccelerator" + }, + "glue": { + "iamPrefix": "glue" + }, + "grafana": { + "iamPrefix": "grafana" + }, + "greengrass": { + "iamPrefix": "greengrass" + }, + "greengrassv2": { + "iamPrefix": "greengrass" + }, + "groundstation": { + "iamPrefix": "groundstation" + }, + "guardduty": { + "iamPrefix": "guardduty" + }, + "health": { + "iamPrefix": "health" + }, + "healthlake": { + "iamPrefix": "healthlake" + }, + "honeycode": { + "iamPrefix": "honeycode" + }, + "iam": { + "iamPrefix": "iam" + }, + "identitystore": { + "iamPrefix": "identitystore" + }, + "imagebuilder": { + "iamPrefix": "imagebuilder" + }, + "inspector": { + "iamPrefix": "inspector" + }, + "inspector2": { + "iamPrefix": "inspector2" + }, + "internetmonitor": { + "iamPrefix": "internetmonitor" + }, + "iot-1click-devices-service": { + "iamPrefix": "iot1click" + }, + "iot-1click-projects": { + "iamPrefix": "iot1click" + }, + "iot-data-plane": { + "iamPrefix": "iotdata" + }, + "iot-events-data": { + "iamPrefix": "ioteventsdata" + }, + "iot-events": { + "iamPrefix": "iotevents" + }, + "iot-jobs-data-plane": { + "iamPrefix": "iot-jobs-data" + }, + "iot-roborunner": { + "iamPrefix": "iotroborunner" + }, + "iot-wireless": { + "iamPrefix": "iotwireless" + }, + "iot": { + "iamPrefix": "iot" + }, + "iotanalytics": { + "iamPrefix": "iotanalytics" + }, + "iotdeviceadvisor": { + "iamPrefix": "iotdeviceadvisor" + }, + "iotfleethub": { + "iamPrefix": "iotfleethub" + }, + "iotfleetwise": { + "iamPrefix": "iotfleetwise" + }, + "iotsecuretunneling": { + "iamPrefix": "IoTSecuredTunneling" + }, + "iotsitewise": { + "iamPrefix": "iotsitewise" + }, + "iotthingsgraph": { + "iamPrefix": "iotthingsgraph" + }, + "iottwinmaker": { + "iamPrefix": "iottwinmaker" + }, + "ivs-realtime": { + "iamPrefix": "ivs" + }, + "ivs": { + "iamPrefix": "ivs" + }, + "ivschat": { + "iamPrefix": "ivschat" + }, + "kafka": { + "iamPrefix": "kafka" + }, + "kafkaconnect": { + "iamPrefix": "kafkaconnect" + }, + "kendra-ranking": { + "iamPrefix": "kendra-ranking" + }, + "kendra": { + "iamPrefix": "kendra" + }, + "keyspaces": { + "iamPrefix": "cassandra" + }, + "kinesis-analytics-v2": { + "iamPrefix": "kinesisanalytics" + }, + "kinesis-analytics": { + "iamPrefix": "kinesisanalytics" + }, + "kinesis-video-archived-media": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-media": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-signaling": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-webrtc-storage": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video": { + "iamPrefix": "kinesisvideo" + }, + "kinesis": { + "iamPrefix": "kinesis" + }, + "kms": { + "iamPrefix": "kms" + }, + "lakeformation": { + "iamPrefix": "lakeformation" + }, + "lambda": { + "iamPrefix": "lambda" + }, + "lex-model-building-service": { + "iamPrefix": "lex" + }, + "lex-models-v2": { + "iamPrefix": "lex" + }, + "lex-runtime-service": { + "iamPrefix": "lex" + }, + "lex-runtime-v2": { + "iamPrefix": "lex" + }, + "license-manager-linux-subscriptions": { + "iamPrefix": "license-manager-linux-subscriptions" + }, + "license-manager-user-subscriptions": { + "iamPrefix": "license-manager-user-subscriptions" + }, + "license-manager": { + "iamPrefix": "license-manager" + }, + "lightsail": { + "iamPrefix": "lightsail" + }, + "location": { + "iamPrefix": "geo" + }, + "lookoutequipment": { + "iamPrefix": "lookoutequipment" + }, + "lookoutmetrics": { + "iamPrefix": "lookoutmetrics" + }, + "lookoutvision": { + "iamPrefix": "lookoutvision" + }, + "m2": { + "iamPrefix": "m2" + }, + "machine-learning": { + "iamPrefix": "machinelearning" + }, + "macie": { + "iamPrefix": "macie" + }, + "macie2": { + "iamPrefix": "macie2" + }, + "managedblockchain-query": { + "iamPrefix": "managedblockchain-query" + }, + "managedblockchain": { + "iamPrefix": "managedblockchain" + }, + "marketplace-catalog": { + "iamPrefix": "aws-marketplace" + }, + "marketplace-commerce-analytics": { + "iamPrefix": "marketplacecommerceanalytics" + }, + "marketplace-entitlement-service": { + "iamPrefix": "aws-marketplace" + }, + "marketplace-metering": { + "iamPrefix": "aws-marketplace" + }, + "mediaconnect": { + "iamPrefix": "mediaconnect" + }, + "mediaconvert": { + "iamPrefix": "mediaconvert" + }, + "medialive": { + "iamPrefix": "medialive" + }, + "mediapackage-vod": { + "iamPrefix": "mediapackage-vod" + }, + "mediapackage": { + "iamPrefix": "mediapackage" + }, + "mediapackagev2": { + "iamPrefix": "mediapackagev2" + }, + "mediastore-data": { + "iamPrefix": "mediastore" + }, + "mediastore": { + "iamPrefix": "mediastore" + }, + "mediatailor": { + "iamPrefix": "mediatailor" + }, + "medical-imaging": { + "iamPrefix": "medical-imaging" + }, + "memorydb": { + "iamPrefix": "memorydb" + }, + "mgn": { + "iamPrefix": "mgn" + }, + "migration-hub-refactor-spaces": { + "iamPrefix": "refactor-spaces" + }, + "migration-hub": { + "iamPrefix": "mgh" + }, + "migrationhub-config": { + "iamPrefix": "mgh" + }, + "migrationhuborchestrator": { + "iamPrefix": "migrationhub-orchestrator" + }, + "migrationhubstrategy": { + "iamPrefix": "migrationhub-strategy" + }, + "mobile": { + "iamPrefix": "AWSMobileHubService" + }, + "mq": { + "iamPrefix": "mq" + }, + "mturk": { + "iamPrefix": "mturk-requester" + }, + "mwaa": { + "iamPrefix": "airflow" + }, + "neptune": { + "iamPrefix": "rds" + }, + "neptunedata": { + "iamPrefix": "neptune-db" + }, + "network-firewall": { + "iamPrefix": "network-firewall" + }, + "networkmanager": { + "iamPrefix": "networkmanager" + }, + "nimble": { + "iamPrefix": "nimble" + }, + "oam": { + "iamPrefix": "oam" + }, + "omics": { + "iamPrefix": "omics" + }, + "opensearch": { + "iamPrefix": "es" + }, + "opensearchserverless": { + "iamPrefix": "aoss" + }, + "opsworks": { + "iamPrefix": "opsworks" + }, + "opsworkscm": { + "iamPrefix": "opsworks-cm" + }, + "organizations": { + "iamPrefix": "organizations" + }, + "osis": { + "iamPrefix": "osis" + }, + "outposts": { + "iamPrefix": "outposts" + }, + "panorama": { + "iamPrefix": "panorama" + }, + "payment-cryptography-data": { + "iamPrefix": "payment-cryptography" + }, + "payment-cryptography": { + "iamPrefix": "payment-cryptography" + }, + "pca-connector-ad": { + "iamPrefix": "pca-connector-ad" + }, + "personalize-events": { + "iamPrefix": "personalize" + }, + "personalize-runtime": { + "iamPrefix": "personalize" + }, + "personalize": { + "iamPrefix": "personalize" + }, + "pi": { + "iamPrefix": "pi" + }, + "pinpoint-email": { + "iamPrefix": "ses" + }, + "pinpoint-sms-voice-v2": { + "iamPrefix": "sms-voice" + }, + "pinpoint-sms-voice": { + "iamPrefix": "sms-voice" + }, + "pinpoint": { + "iamPrefix": "mobiletargeting" + }, + "pipes": { + "iamPrefix": "pipes" + }, + "polly": { + "iamPrefix": "polly" + }, + "pricing": { + "iamPrefix": "pricing" + }, + "privatenetworks": { + "iamPrefix": "private-networks" + }, + "proton": { + "iamPrefix": "proton" + }, + "qldb-session": { + "iamPrefix": "qldb", + "commands": [ + "SendCommand" + ] + }, + "qldb": { + "iamPrefix": "qldb" + }, + "quicksight": { + "iamPrefix": "quicksight" + }, + "ram": { + "iamPrefix": "ram" + }, + "rbin": { + "iamPrefix": "rbin" + }, + "rds-data": { + "iamPrefix": "rds-data" + }, + "rds": { + "iamPrefix": "rds" + }, + "redshift-data": { + "iamPrefix": "redshift-data" + }, + "redshift-serverless": { + "iamPrefix": "redshift-serverless" + }, + "redshift": { + "iamPrefix": "redshift" + }, + "rekognition": { + "iamPrefix": "rekognition" + }, + "rekognitionstreaming": { + "iamPrefix": "rekognition" + }, + "resiliencehub": { + "iamPrefix": "resiliencehub" + }, + "resource-explorer-2": { + "iamPrefix": "resource-explorer-2" + }, + "resource-groups-tagging-api": { + "iamPrefix": "tagging" + }, + "resource-groups": { + "iamPrefix": "resource-groups" + }, + "robomaker": { + "iamPrefix": "robomaker" + }, + "rolesanywhere": { + "iamPrefix": "rolesanywhere" + }, + "route-53-domains": { + "iamPrefix": "route53domains" + }, + "route-53": { + "iamPrefix": "route53" + }, + "route53-recovery-cluster": { + "iamPrefix": "route53-recovery-cluster" + }, + "route53-recovery-control-config": { + "iamPrefix": "route53-recovery-control-config" + }, + "route53-recovery-readiness": { + "iamPrefix": "route53-recovery-readiness" + }, + "route53resolver": { + "iamPrefix": "route53resolver" + }, + "rum": { + "iamPrefix": "rum" + }, + "s3-control": { + "iamPrefix": "s3" + }, + "s3": { + "iamPrefix": "s3" + }, + "s3outposts": { + "iamPrefix": "s3-outposts" + }, + "sagemaker-a2i-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker-edge": { + "iamPrefix": "sagemaker" + }, + "sagemaker-featurestore-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker-geospatial": { + "iamPrefix": "sagemaker-geospatial" + }, + "sagemaker-metrics": { + "iamPrefix": "sagemaker" + }, + "sagemaker-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker": { + "iamPrefix": "sagemaker" + }, + "savingsplans": { + "iamPrefix": "savingsplans" + }, + "scheduler": { + "iamPrefix": "scheduler" + }, + "schemas": { + "iamPrefix": "schemas" + }, + "secrets-manager": { + "iamPrefix": "secretsmanager" + }, + "securityhub": { + "iamPrefix": "securityhub" + }, + "securitylake": { + "iamPrefix": "securitylake" + }, + "serverlessapplicationrepository": { + "iamPrefix": "serverlessrepo" + }, + "service-catalog-appregistry": { + "iamPrefix": "servicecatalog" + }, + "service-catalog": { + "iamPrefix": "servicecatalog" + }, + "service-quotas": { + "iamPrefix": "servicequotas" + }, + "servicediscovery": { + "iamPrefix": "servicediscovery" + }, + "ses": { + "iamPrefix": "ses" + }, + "sesv2": { + "iamPrefix": "ses" + }, + "sfn": { + "iamPrefix": "states" + }, + "shield": { + "iamPrefix": "shield" + }, + "signer": { + "iamPrefix": "signer" + }, + "simspaceweaver": { + "iamPrefix": "simspaceweaver" + }, + "sms": { + "iamPrefix": "sms" + }, + "snow-device-management": { + "iamPrefix": "snow-device-management" + }, + "snowball": { + "iamPrefix": "snowball" + }, + "sns": { + "iamPrefix": "sns" + }, + "sqs": { + "iamPrefix": "sqs" + }, + "ssm-contacts": { + "iamPrefix": "ssm-contacts" + }, + "ssm-incidents": { + "iamPrefix": "ssm-incidents" + }, + "ssm-sap": { + "iamPrefix": "ssm-sap" + }, + "ssm": { + "iamPrefix": "ssm", + "commands": [ + "CancelCommand", + "SendCommand" + ] + }, + "sso-admin": { + "iamPrefix": "sso" + }, + "sso-oidc": { + "iamPrefix": "awsssooidc" + }, + "sso": { + "iamPrefix": "awsssoportal" + }, + "storage-gateway": { + "iamPrefix": "storagegateway" + }, + "sts": { + "iamPrefix": "sts" + }, + "support-app": { + "iamPrefix": "supportapp" + }, + "support": { + "iamPrefix": "support" + }, + "swf": { + "iamPrefix": "swf" + }, + "synthetics": { + "iamPrefix": "synthetics" + }, + "textract": { + "iamPrefix": "textract" + }, + "timestream-query": { + "iamPrefix": "timestream" + }, + "timestream-write": { + "iamPrefix": "timestream" + }, + "tnb": { + "iamPrefix": "tnb" + }, + "transcribe-streaming": { + "iamPrefix": "transcribe" + }, + "transcribe": { + "iamPrefix": "transcribe" + }, + "transfer": { + "iamPrefix": "transfer" + }, + "translate": { + "iamPrefix": "translate" + }, + "verifiedpermissions": { + "iamPrefix": "verifiedpermissions" + }, + "voice-id": { + "iamPrefix": "voiceid" + }, + "vpc-lattice": { + "iamPrefix": "vpc-lattice" + }, + "waf-regional": { + "iamPrefix": "waf-regional" + }, + "waf": { + "iamPrefix": "waf" + }, + "wafv2": { + "iamPrefix": "wafv2" + }, + "wellarchitected": { + "iamPrefix": "wellarchitected" + }, + "wisdom": { + "iamPrefix": "wisdom" + }, + "workdocs": { + "iamPrefix": "workdocs" + }, + "worklink": { + "iamPrefix": "worklink" + }, + "workmail": { + "iamPrefix": "workmail" + }, + "workmailmessageflow": { + "iamPrefix": "workmailmessageflow" + }, + "workspaces-web": { + "iamPrefix": "workspaces-web" + }, + "workspaces": { + "iamPrefix": "workspaces" + }, + "xray": { + "iamPrefix": "xray" + } +} \ No newline at end of file diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/package.json b/packages/@aws-cdk/sdk-v2-to-v3-adapter/package.json index ead2f32ad0809..271b1cff6ab62 100644 --- a/packages/@aws-cdk/sdk-v2-to-v3-adapter/package.json +++ b/packages/@aws-cdk/sdk-v2-to-v3-adapter/package.json @@ -28,6 +28,7 @@ "@aws-cdk/cdk-build-tools": "0.0.0", "@aws-cdk/pkglint": "0.0.0", "@aws-sdk/client-s3": "^3.414.0", + "@smithy/types": "^2.3.3", "@types/jest": "^29.5.5", "jest": "^29.7.0" }, diff --git a/packages/@aws-cdk/sdk-v2-to-v3-adapter/test/get-v3-client-package-name.test.ts b/packages/@aws-cdk/sdk-v2-to-v3-adapter/test/api-call.test.ts similarity index 60% rename from packages/@aws-cdk/sdk-v2-to-v3-adapter/test/get-v3-client-package-name.test.ts rename to packages/@aws-cdk/sdk-v2-to-v3-adapter/test/api-call.test.ts index 7f9910dbc9ce8..f7a82e678c3ac 100644 --- a/packages/@aws-cdk/sdk-v2-to-v3-adapter/test/get-v3-client-package-name.test.ts +++ b/packages/@aws-cdk/sdk-v2-to-v3-adapter/test/api-call.test.ts @@ -1,7 +1,7 @@ -import { getV3ClientPackageName } from '../lib'; +import { ApiCall } from '../lib'; test('can map service name to SDK v3 client name', () => { - expect(getV3ClientPackageName('S3')).toBe('@aws-sdk/client-s3'); + expect(new ApiCall('S3', 'Bla').v3PackageName).toBe('@aws-sdk/client-s3'); }); test('will fail for unknown service', () => { diff --git a/packages/aws-cdk-lib/custom-resources/README.md b/packages/aws-cdk-lib/custom-resources/README.md index 0648f5ee164c6..d3c57bea20ddc 100644 --- a/packages/aws-cdk-lib/custom-resources/README.md +++ b/packages/aws-cdk-lib/custom-resources/README.md @@ -321,7 +321,6 @@ for the The following example will create the file `folder/file1.txt` inside `myBucket` with the contents `hello!`. - ```plaintext // This example exists only for TypeScript @@ -370,7 +369,6 @@ This sample demonstrates the following concepts: * Non-intrinsic physical IDs * Implemented in Python - ### Customizing Provider Function name In multi-account environments or when the custom resource may be re-utilized across several @@ -585,7 +583,7 @@ the data returned by the custom resource to specific paths in the API response: new cr.AwsCustomResource(this, 'ListObjects', { onCreate: { service: 's3', - action: 'listObjectsV2', + action: 'ListObjectsV2', parameters: { Bucket: 'my-bucket', }, @@ -609,7 +607,7 @@ path in `PhysicalResourceId.fromResponse()`. const getParameter = new cr.AwsCustomResource(this, 'GetParameter', { onUpdate: { // will also be called for a CREATE event service: 'SSM', - action: 'getParameter', + action: 'GetParameter', parameters: { Name: 'my-parameter', WithDecryption: true, @@ -632,12 +630,12 @@ const getParameter = new cr.AwsCustomResource(this, 'AssociateVPCWithHostedZone' onCreate: { assumedRoleArn: 'arn:aws:iam::OTHERACCOUNT:role/CrossAccount/ManageHostedZoneConnections', service: 'Route53', - action: 'associateVPCWithHostedZone', + action: 'AssociateVPCWithHostedZone', parameters: { HostedZoneId: 'hz-123', VPC: { - VPCId: 'vpc-123', - VPCRegion: 'region-for-vpc', + VPCId: 'vpc-123', + VPCRegion: 'region-for-vpc', }, }, physicalResourceId: cr.PhysicalResourceId.of('${vpcStack.SharedVpc.VpcId}-${vpcStack.Region}-${PrivateHostedZone.HostedZoneId}'), @@ -651,14 +649,27 @@ const getParameter = new cr.AwsCustomResource(this, 'AssociateVPCWithHostedZone' #### Using AWS SDK for JavaScript v3 -`AwsCustomResource` uses Node 18 and aws sdk v3 by default. You can specify the service as either the name of the sdk module, or just the service name, IE `@aws-sdk/client-ssm` or `SSM`, and the action as either the client method name or the sdk v3 command, `getParameter` or `GetParameterCommand`. It is recommended to use the v3 format for new AwsCustomResources going forward. +`AwsCustomResource` uses Node 18 and AWS SDK v3 by default. You can specify the service as either the name of the SDK module, or just the service name. Using API Gateway as an example, the following formats are all accepted for `service`: + +* The SDKv3 service name: `api-gateway` (recommended) +* The full SDKv3 package name: `@aws-sdk/client-api-gateway` +* The SDKv2 constructor name: `APIGateway` +* The SDKv2 constructor name in all lower case: `apigateway` + +The following formats are accepted for `action`: + +* The API call name: `GetRestApi` (recommended) +* The API call name with a lowercase starting letter method name: `getRestApi` +* The SDKv3 command class name: `GetRestApiCommand` + +For readability, we recommend using the short forms going forward: ```ts new cr.AwsCustomResource(this, 'GetParameter', { resourceType: 'Custom::SSMParameter', onUpdate: { - service: '@aws-sdk/client-ssm', // 'SSM' in v2 - action: 'GetParameterCommand', // 'getParameter' in v2 + service: 'ssm', // 'SSM' in v2 + action: 'GetParameter', // 'getParameter' in v2 parameters: { Name: 'foo', WithDecryption: true, @@ -681,8 +692,8 @@ new cr.AwsCustomResource(this, 'CrossAccount', { onCreate: { assumedRoleArn: crossAccountRoleArn, region: callRegion, // optional - service: '@aws-sdk/client-sts', - action: 'GetCallerIdentityCommand', + service: 'sts', + action: 'GetCallerIdentity', physicalResourceId: cr.PhysicalResourceId.of('id'), }, policy: cr.AwsCustomResourcePolicy.fromStatements([iam.PolicyStatement.fromJson({ @@ -691,4 +702,4 @@ new cr.AwsCustomResource(this, 'CrossAccount', { Resource: crossAccountRoleArn, })]), }); -``` \ No newline at end of file +``` diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/aws-custom-resource.ts b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/aws-custom-resource.ts index bb23492eee40b..aae56b70556cc 100644 --- a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/aws-custom-resource.ts +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/aws-custom-resource.ts @@ -1,4 +1,3 @@ -import * as fs from 'fs'; import * as path from 'path'; import { Construct } from 'constructs'; import * as ec2 from '../../../aws-ec2'; @@ -8,6 +7,7 @@ import * as logs from '../../../aws-logs'; import * as cdk from '../../../core'; import { Annotations } from '../../../core'; import * as cxapi from '../../../cx-api'; +import { awsSdkToIamAction } from '../helpers-internal/sdk-info'; // Shared definition with packages/@aws-cdk/custom-resource-handlers/lib/custom-resources/aws-custom-resource-handler/shared.ts const PHYSICAL_RESOURCE_ID_REFERENCE = 'PHYSICAL:RESOURCEID:'; @@ -85,6 +85,13 @@ export interface AwsSdkCall { /** * The service to call * + * This is the name of an AWS service, in one of the following forms: + * + * - An AWS SDK for JavaScript v3 package name (`@aws-sdk/client-api-gateway`) + * - An AWS SDK for JavaScript v3 client name (`api-gateway`) + * - An AWS SDK for JavaScript v2 constructor name (`APIGateway`) + * - A lowercase AWS SDK for JavaScript v2 constructor name (`apigateway`) + * * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/index.html */ readonly service: string; @@ -92,6 +99,12 @@ export interface AwsSdkCall { /** * The service action to call * + * This is the name of an AWS API call, in one of the following forms: + * + * - An API call name as found in the API Reference documentation (`GetObject`) + * - The API call name starting with a lowercase letter (`getObject`) + * - The AWS SDK for JavaScript v3 command class name (`GetObjectCommand`) + * * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/index.html */ readonly action: string; @@ -554,25 +567,6 @@ export class AwsCustomResource extends Construct implements iam.IGrantable { } } -/** - * AWS SDK service metadata. - */ -export type AwsSdkMetadata = {[key: string]: any}; - -/** - * Gets awsSdkMetaData from file or from cache - */ -let getAwsSdkMetadata = (() => { - let _awsSdkMetadata: AwsSdkMetadata; - return function () { - if (_awsSdkMetadata) { - return _awsSdkMetadata; - } else { - return _awsSdkMetadata = JSON.parse(fs.readFileSync(path.join(__dirname, 'sdk-api-metadata.json'), 'utf-8')); - } - }; -})(); - /** * Returns true if `obj` includes a `PhysicalResourceIdReference` in one of the * values. @@ -596,17 +590,3 @@ function includesPhysicalResourceIdRef(obj: any | undefined) { return foundRef; } - -/** - * Transform SDK service/action to IAM action using metadata from aws-sdk module. - * Example: CloudWatchLogs with putRetentionPolicy => logs:PutRetentionPolicy - * - * TODO: is this mapping correct for all services? - */ -function awsSdkToIamAction(service: string, action: string): string { - const srv = service.toLowerCase(); - const awsSdkMetadata = getAwsSdkMetadata(); - const iamService = (awsSdkMetadata[srv] && awsSdkMetadata[srv].prefix) || srv; - const iamAction = action.charAt(0).toUpperCase() + action.slice(1); - return `${iamService}:${iamAction}`; -} diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-api-metadata.json b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-api-metadata.json deleted file mode 100644 index 6a5f3cdb3e9aa..0000000000000 --- a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-api-metadata.json +++ /dev/null @@ -1,1339 +0,0 @@ -{ - "acm": { - "name": "ACM", - "cors": true - }, - "apigateway": { - "name": "APIGateway", - "cors": true - }, - "applicationautoscaling": { - "prefix": "application-autoscaling", - "name": "ApplicationAutoScaling", - "cors": true - }, - "appstream": { - "name": "AppStream" - }, - "autoscaling": { - "name": "AutoScaling", - "cors": true - }, - "batch": { - "name": "Batch" - }, - "budgets": { - "name": "Budgets" - }, - "clouddirectory": { - "name": "CloudDirectory", - "versions": [ - "2016-05-10*" - ] - }, - "cloudformation": { - "name": "CloudFormation", - "cors": true - }, - "cloudfront": { - "name": "CloudFront", - "versions": [ - "2013-05-12*", - "2013-11-11*", - "2014-05-31*", - "2014-10-21*", - "2014-11-06*", - "2015-04-17*", - "2015-07-27*", - "2015-09-17*", - "2016-01-13*", - "2016-01-28*", - "2016-08-01*", - "2016-08-20*", - "2016-09-07*", - "2016-09-29*", - "2016-11-25*", - "2017-03-25*", - "2017-10-30*", - "2018-06-18*", - "2018-11-05*", - "2019-03-26*" - ], - "cors": true - }, - "cloudhsm": { - "name": "CloudHSM", - "cors": true - }, - "cloudsearch": { - "name": "CloudSearch" - }, - "cloudsearchdomain": { - "name": "CloudSearchDomain" - }, - "cloudtrail": { - "name": "CloudTrail", - "cors": true - }, - "cloudwatch": { - "prefix": "monitoring", - "name": "CloudWatch", - "cors": true - }, - "cloudwatchevents": { - "prefix": "events", - "name": "CloudWatchEvents", - "versions": [ - "2014-02-03*" - ], - "cors": true - }, - "cloudwatchlogs": { - "prefix": "logs", - "name": "CloudWatchLogs", - "cors": true - }, - "codebuild": { - "name": "CodeBuild", - "cors": true - }, - "codecommit": { - "name": "CodeCommit", - "cors": true - }, - "codedeploy": { - "name": "CodeDeploy", - "cors": true - }, - "codepipeline": { - "name": "CodePipeline", - "cors": true - }, - "cognitoidentity": { - "prefix": "cognito-identity", - "name": "CognitoIdentity", - "cors": true - }, - "cognitoidentityserviceprovider": { - "prefix": "cognito-idp", - "name": "CognitoIdentityServiceProvider", - "cors": true - }, - "cognitosync": { - "prefix": "cognito-sync", - "name": "CognitoSync", - "cors": true - }, - "configservice": { - "prefix": "config", - "name": "ConfigService", - "cors": true - }, - "cur": { - "name": "CUR", - "cors": true - }, - "datapipeline": { - "name": "DataPipeline" - }, - "devicefarm": { - "name": "DeviceFarm", - "cors": true - }, - "directconnect": { - "name": "DirectConnect", - "cors": true - }, - "directoryservice": { - "prefix": "ds", - "name": "DirectoryService" - }, - "discovery": { - "name": "Discovery" - }, - "dms": { - "name": "DMS" - }, - "dynamodb": { - "name": "DynamoDB", - "cors": true - }, - "dynamodbstreams": { - "prefix": "streams.dynamodb", - "name": "DynamoDBStreams", - "cors": true - }, - "ec2": { - "name": "EC2", - "versions": [ - "2013-06-15*", - "2013-10-15*", - "2014-02-01*", - "2014-05-01*", - "2014-06-15*", - "2014-09-01*", - "2014-10-01*", - "2015-03-01*", - "2015-04-15*", - "2015-10-01*", - "2016-04-01*", - "2016-09-15*" - ], - "cors": true - }, - "ecr": { - "name": "ECR", - "cors": true - }, - "ecs": { - "name": "ECS", - "cors": true - }, - "efs": { - "prefix": "elasticfilesystem", - "name": "EFS", - "cors": true - }, - "elasticache": { - "name": "ElastiCache", - "versions": [ - "2012-11-15*", - "2014-03-24*", - "2014-07-15*", - "2014-09-30*" - ], - "cors": true - }, - "elasticbeanstalk": { - "name": "ElasticBeanstalk", - "cors": true - }, - "elb": { - "prefix": "elasticloadbalancing", - "name": "ELB", - "cors": true - }, - "elbv2": { - "prefix": "elasticloadbalancingv2", - "name": "ELBv2", - "cors": true - }, - "emr": { - "prefix": "elasticmapreduce", - "name": "EMR", - "cors": true - }, - "es": { - "name": "ES" - }, - "elastictranscoder": { - "name": "ElasticTranscoder", - "cors": true - }, - "firehose": { - "name": "Firehose", - "cors": true - }, - "gamelift": { - "name": "GameLift", - "cors": true - }, - "glacier": { - "name": "Glacier" - }, - "health": { - "name": "Health" - }, - "iam": { - "name": "IAM", - "cors": true - }, - "importexport": { - "name": "ImportExport" - }, - "inspector": { - "name": "Inspector", - "versions": [ - "2015-08-18*" - ], - "cors": true - }, - "iot": { - "name": "Iot", - "cors": true - }, - "iotdata": { - "prefix": "iot-data", - "name": "IotData", - "cors": true - }, - "kinesis": { - "name": "Kinesis", - "cors": true - }, - "kinesisanalytics": { - "name": "KinesisAnalytics" - }, - "kms": { - "name": "KMS", - "cors": true - }, - "lambda": { - "name": "Lambda", - "cors": true - }, - "lexruntime": { - "prefix": "runtime.lex", - "name": "LexRuntime", - "cors": true - }, - "lightsail": { - "name": "Lightsail" - }, - "machinelearning": { - "name": "MachineLearning", - "cors": true - }, - "marketplacecommerceanalytics": { - "name": "MarketplaceCommerceAnalytics", - "cors": true - }, - "marketplacemetering": { - "prefix": "meteringmarketplace", - "name": "MarketplaceMetering" - }, - "mturk": { - "prefix": "mturk-requester", - "name": "MTurk", - "cors": true - }, - "mobileanalytics": { - "name": "MobileAnalytics", - "cors": true - }, - "opsworks": { - "name": "OpsWorks", - "cors": true - }, - "opsworkscm": { - "name": "OpsWorksCM" - }, - "organizations": { - "name": "Organizations" - }, - "pinpoint": { - "name": "Pinpoint" - }, - "polly": { - "name": "Polly", - "cors": true - }, - "rds": { - "name": "RDS", - "versions": [ - "2014-09-01*" - ], - "cors": true - }, - "redshift": { - "name": "Redshift", - "cors": true - }, - "rekognition": { - "name": "Rekognition", - "cors": true - }, - "resourcegroupstaggingapi": { - "name": "ResourceGroupsTaggingAPI" - }, - "route53": { - "name": "Route53", - "cors": true - }, - "route53domains": { - "name": "Route53Domains", - "cors": true - }, - "s3": { - "name": "S3", - "dualstackAvailable": true, - "cors": true - }, - "s3control": { - "name": "S3Control", - "dualstackAvailable": true, - "xmlNoDefaultLists": true - }, - "servicecatalog": { - "name": "ServiceCatalog", - "cors": true - }, - "ses": { - "prefix": "email", - "name": "SES", - "cors": true - }, - "shield": { - "name": "Shield" - }, - "simpledb": { - "prefix": "sdb", - "name": "SimpleDB" - }, - "sms": { - "name": "SMS" - }, - "snowball": { - "name": "Snowball" - }, - "sns": { - "name": "SNS", - "cors": true - }, - "sqs": { - "name": "SQS", - "cors": true - }, - "ssm": { - "name": "SSM", - "cors": true - }, - "storagegateway": { - "name": "StorageGateway", - "cors": true - }, - "stepfunctions": { - "prefix": "states", - "name": "StepFunctions" - }, - "sts": { - "name": "STS", - "cors": true - }, - "support": { - "name": "Support" - }, - "swf": { - "name": "SWF" - }, - "xray": { - "name": "XRay", - "cors": true - }, - "waf": { - "name": "WAF", - "cors": true - }, - "wafregional": { - "prefix": "waf-regional", - "name": "WAFRegional" - }, - "workdocs": { - "name": "WorkDocs", - "cors": true - }, - "workspaces": { - "name": "WorkSpaces" - }, - "codestar": { - "name": "CodeStar" - }, - "lexmodelbuildingservice": { - "prefix": "lex-models", - "name": "LexModelBuildingService", - "cors": true - }, - "marketplaceentitlementservice": { - "prefix": "entitlement.marketplace", - "name": "MarketplaceEntitlementService" - }, - "athena": { - "name": "Athena", - "cors": true - }, - "greengrass": { - "name": "Greengrass" - }, - "dax": { - "name": "DAX" - }, - "migrationhub": { - "prefix": "AWSMigrationHub", - "name": "MigrationHub" - }, - "cloudhsmv2": { - "name": "CloudHSMV2", - "cors": true - }, - "glue": { - "name": "Glue" - }, - "mobile": { - "name": "Mobile" - }, - "pricing": { - "name": "Pricing", - "cors": true - }, - "costexplorer": { - "prefix": "ce", - "name": "CostExplorer", - "cors": true - }, - "mediaconvert": { - "name": "MediaConvert" - }, - "medialive": { - "name": "MediaLive" - }, - "mediapackage": { - "name": "MediaPackage" - }, - "mediastore": { - "name": "MediaStore" - }, - "mediastoredata": { - "prefix": "mediastore-data", - "name": "MediaStoreData", - "cors": true - }, - "appsync": { - "name": "AppSync" - }, - "guardduty": { - "name": "GuardDuty" - }, - "mq": { - "name": "MQ" - }, - "comprehend": { - "name": "Comprehend", - "cors": true - }, - "iotjobsdataplane": { - "prefix": "iot-jobs-data", - "name": "IoTJobsDataPlane" - }, - "kinesisvideoarchivedmedia": { - "prefix": "kinesis-video-archived-media", - "name": "KinesisVideoArchivedMedia", - "cors": true - }, - "kinesisvideomedia": { - "prefix": "kinesis-video-media", - "name": "KinesisVideoMedia", - "cors": true - }, - "kinesisvideo": { - "name": "KinesisVideo", - "cors": true - }, - "sagemakerruntime": { - "prefix": "runtime.sagemaker", - "name": "SageMakerRuntime" - }, - "sagemaker": { - "name": "SageMaker" - }, - "translate": { - "name": "Translate", - "cors": true - }, - "resourcegroups": { - "prefix": "resource-groups", - "name": "ResourceGroups", - "cors": true - }, - "alexaforbusiness": { - "name": "AlexaForBusiness" - }, - "cloud9": { - "name": "Cloud9" - }, - "serverlessapplicationrepository": { - "prefix": "serverlessrepo", - "name": "ServerlessApplicationRepository" - }, - "servicediscovery": { - "name": "ServiceDiscovery" - }, - "workmail": { - "name": "WorkMail" - }, - "autoscalingplans": { - "prefix": "autoscaling-plans", - "name": "AutoScalingPlans" - }, - "transcribeservice": { - "prefix": "transcribe", - "name": "TranscribeService" - }, - "connect": { - "name": "Connect", - "cors": true - }, - "acmpca": { - "prefix": "acm-pca", - "name": "ACMPCA" - }, - "fms": { - "name": "FMS" - }, - "secretsmanager": { - "name": "SecretsManager", - "cors": true - }, - "iotanalytics": { - "name": "IoTAnalytics", - "cors": true - }, - "iot1clickdevicesservice": { - "prefix": "iot1click-devices", - "name": "IoT1ClickDevicesService" - }, - "iot1clickprojects": { - "prefix": "iot1click-projects", - "name": "IoT1ClickProjects" - }, - "pi": { - "name": "PI" - }, - "neptune": { - "name": "Neptune" - }, - "mediatailor": { - "name": "MediaTailor" - }, - "eks": { - "name": "EKS" - }, - "macie": { - "name": "Macie" - }, - "dlm": { - "name": "DLM" - }, - "signer": { - "name": "Signer" - }, - "chime": { - "name": "Chime" - }, - "pinpointemail": { - "prefix": "pinpoint-email", - "name": "PinpointEmail" - }, - "ram": { - "name": "RAM" - }, - "route53resolver": { - "name": "Route53Resolver" - }, - "pinpointsmsvoice": { - "prefix": "sms-voice", - "name": "PinpointSMSVoice" - }, - "quicksight": { - "name": "QuickSight" - }, - "rdsdataservice": { - "prefix": "rds-data", - "name": "RDSDataService" - }, - "amplify": { - "name": "Amplify" - }, - "datasync": { - "name": "DataSync" - }, - "robomaker": { - "name": "RoboMaker" - }, - "transfer": { - "name": "Transfer" - }, - "globalaccelerator": { - "name": "GlobalAccelerator" - }, - "comprehendmedical": { - "name": "ComprehendMedical", - "cors": true - }, - "kinesisanalyticsv2": { - "name": "KinesisAnalyticsV2" - }, - "mediaconnect": { - "name": "MediaConnect" - }, - "fsx": { - "name": "FSx" - }, - "securityhub": { - "name": "SecurityHub" - }, - "appmesh": { - "name": "AppMesh", - "versions": [ - "2018-10-01*" - ] - }, - "licensemanager": { - "prefix": "license-manager", - "name": "LicenseManager" - }, - "kafka": { - "name": "Kafka" - }, - "apigatewaymanagementapi": { - "name": "ApiGatewayManagementApi" - }, - "apigatewayv2": { - "name": "ApiGatewayV2" - }, - "docdb": { - "name": "DocDB" - }, - "backup": { - "name": "Backup" - }, - "worklink": { - "name": "WorkLink" - }, - "textract": { - "name": "Textract" - }, - "managedblockchain": { - "name": "ManagedBlockchain" - }, - "mediapackagevod": { - "prefix": "mediapackage-vod", - "name": "MediaPackageVod" - }, - "groundstation": { - "name": "GroundStation" - }, - "iotthingsgraph": { - "name": "IoTThingsGraph" - }, - "iotevents": { - "name": "IoTEvents" - }, - "ioteventsdata": { - "prefix": "iotevents-data", - "name": "IoTEventsData" - }, - "personalize": { - "name": "Personalize", - "cors": true - }, - "personalizeevents": { - "prefix": "personalize-events", - "name": "PersonalizeEvents", - "cors": true - }, - "personalizeruntime": { - "prefix": "personalize-runtime", - "name": "PersonalizeRuntime", - "cors": true - }, - "applicationinsights": { - "prefix": "application-insights", - "name": "ApplicationInsights" - }, - "servicequotas": { - "prefix": "service-quotas", - "name": "ServiceQuotas" - }, - "ec2instanceconnect": { - "prefix": "ec2-instance-connect", - "name": "EC2InstanceConnect" - }, - "eventbridge": { - "name": "EventBridge" - }, - "lakeformation": { - "name": "LakeFormation" - }, - "forecastservice": { - "prefix": "forecast", - "name": "ForecastService", - "cors": true - }, - "forecastqueryservice": { - "prefix": "forecastquery", - "name": "ForecastQueryService", - "cors": true - }, - "qldb": { - "name": "QLDB" - }, - "qldbsession": { - "prefix": "qldb-session", - "name": "QLDBSession" - }, - "workmailmessageflow": { - "name": "WorkMailMessageFlow" - }, - "codestarnotifications": { - "prefix": "codestar-notifications", - "name": "CodeStarNotifications" - }, - "savingsplans": { - "name": "SavingsPlans" - }, - "sso": { - "name": "SSO" - }, - "ssooidc": { - "prefix": "sso-oidc", - "name": "SSOOIDC" - }, - "marketplacecatalog": { - "prefix": "marketplace-catalog", - "name": "MarketplaceCatalog", - "cors": true - }, - "dataexchange": { - "name": "DataExchange" - }, - "sesv2": { - "name": "SESV2" - }, - "migrationhubconfig": { - "prefix": "migrationhub-config", - "name": "MigrationHubConfig" - }, - "connectparticipant": { - "name": "ConnectParticipant" - }, - "appconfig": { - "name": "AppConfig" - }, - "iotsecuretunneling": { - "name": "IoTSecureTunneling" - }, - "wafv2": { - "name": "WAFV2" - }, - "elasticinference": { - "prefix": "elastic-inference", - "name": "ElasticInference" - }, - "imagebuilder": { - "name": "Imagebuilder" - }, - "schemas": { - "name": "Schemas" - }, - "accessanalyzer": { - "name": "AccessAnalyzer" - }, - "codegurureviewer": { - "prefix": "codeguru-reviewer", - "name": "CodeGuruReviewer" - }, - "codeguruprofiler": { - "name": "CodeGuruProfiler" - }, - "computeoptimizer": { - "prefix": "compute-optimizer", - "name": "ComputeOptimizer" - }, - "frauddetector": { - "name": "FraudDetector" - }, - "kendra": { - "name": "Kendra" - }, - "networkmanager": { - "name": "NetworkManager" - }, - "outposts": { - "name": "Outposts" - }, - "augmentedairuntime": { - "prefix": "sagemaker-a2i-runtime", - "name": "AugmentedAIRuntime" - }, - "ebs": { - "name": "EBS" - }, - "kinesisvideosignalingchannels": { - "prefix": "kinesis-video-signaling", - "name": "KinesisVideoSignalingChannels", - "cors": true - }, - "detective": { - "name": "Detective" - }, - "codestarconnections": { - "prefix": "codestar-connections", - "name": "CodeStarconnections" - }, - "synthetics": { - "name": "Synthetics" - }, - "iotsitewise": { - "name": "IoTSiteWise" - }, - "macie2": { - "name": "Macie2" - }, - "codeartifact": { - "name": "CodeArtifact" - }, - "honeycode": { - "name": "Honeycode" - }, - "ivs": { - "name": "IVS" - }, - "braket": { - "name": "Braket" - }, - "identitystore": { - "name": "IdentityStore" - }, - "appflow": { - "name": "Appflow" - }, - "redshiftdata": { - "prefix": "redshift-data", - "name": "RedshiftData" - }, - "ssoadmin": { - "prefix": "sso-admin", - "name": "SSOAdmin" - }, - "timestreamquery": { - "prefix": "timestream-query", - "name": "TimestreamQuery" - }, - "timestreamwrite": { - "prefix": "timestream-write", - "name": "TimestreamWrite" - }, - "s3outposts": { - "name": "S3Outposts" - }, - "databrew": { - "name": "DataBrew" - }, - "servicecatalogappregistry": { - "prefix": "servicecatalog-appregistry", - "name": "ServiceCatalogAppRegistry" - }, - "networkfirewall": { - "prefix": "network-firewall", - "name": "NetworkFirewall" - }, - "mwaa": { - "name": "MWAA" - }, - "amplifybackend": { - "name": "AmplifyBackend" - }, - "appintegrations": { - "name": "AppIntegrations" - }, - "connectcontactlens": { - "prefix": "connect-contact-lens", - "name": "ConnectContactLens" - }, - "devopsguru": { - "prefix": "devops-guru", - "name": "DevOpsGuru" - }, - "ecrpublic": { - "prefix": "ecr-public", - "name": "ECRPUBLIC" - }, - "lookoutvision": { - "name": "LookoutVision" - }, - "sagemakerfeaturestoreruntime": { - "prefix": "sagemaker-featurestore-runtime", - "name": "SageMakerFeatureStoreRuntime" - }, - "customerprofiles": { - "prefix": "customer-profiles", - "name": "CustomerProfiles" - }, - "auditmanager": { - "name": "AuditManager" - }, - "emrcontainers": { - "prefix": "emr-containers", - "name": "EMRcontainers" - }, - "healthlake": { - "name": "HealthLake" - }, - "sagemakeredge": { - "prefix": "sagemaker-edge", - "name": "SagemakerEdge" - }, - "amp": { - "name": "Amp", - "cors": true - }, - "greengrassv2": { - "name": "GreengrassV2" - }, - "iotdeviceadvisor": { - "name": "IotDeviceAdvisor" - }, - "iotfleethub": { - "name": "IoTFleetHub" - }, - "iotwireless": { - "name": "IoTWireless" - }, - "location": { - "name": "Location", - "cors": true - }, - "wellarchitected": { - "name": "WellArchitected" - }, - "lexmodelsv2": { - "prefix": "models.lex.v2", - "name": "LexModelsV2" - }, - "lexruntimev2": { - "prefix": "runtime.lex.v2", - "name": "LexRuntimeV2", - "cors": true - }, - "fis": { - "name": "Fis" - }, - "lookoutmetrics": { - "name": "LookoutMetrics" - }, - "mgn": { - "name": "Mgn" - }, - "lookoutequipment": { - "name": "LookoutEquipment" - }, - "nimble": { - "name": "Nimble" - }, - "finspace": { - "name": "Finspace" - }, - "finspacedata": { - "prefix": "finspace-data", - "name": "Finspacedata" - }, - "ssmcontacts": { - "prefix": "ssm-contacts", - "name": "SSMContacts" - }, - "ssmincidents": { - "prefix": "ssm-incidents", - "name": "SSMIncidents" - }, - "applicationcostprofiler": { - "name": "ApplicationCostProfiler" - }, - "apprunner": { - "name": "AppRunner" - }, - "proton": { - "name": "Proton" - }, - "route53recoverycluster": { - "prefix": "route53-recovery-cluster", - "name": "Route53RecoveryCluster" - }, - "route53recoverycontrolconfig": { - "prefix": "route53-recovery-control-config", - "name": "Route53RecoveryControlConfig" - }, - "route53recoveryreadiness": { - "prefix": "route53-recovery-readiness", - "name": "Route53RecoveryReadiness" - }, - "chimesdkidentity": { - "prefix": "chime-sdk-identity", - "name": "ChimeSDKIdentity" - }, - "chimesdkmessaging": { - "prefix": "chime-sdk-messaging", - "name": "ChimeSDKMessaging" - }, - "snowdevicemanagement": { - "prefix": "snow-device-management", - "name": "SnowDeviceManagement" - }, - "memorydb": { - "name": "MemoryDB" - }, - "opensearch": { - "name": "OpenSearch" - }, - "kafkaconnect": { - "name": "KafkaConnect" - }, - "voiceid": { - "prefix": "voice-id", - "name": "VoiceID" - }, - "wisdom": { - "name": "Wisdom" - }, - "account": { - "name": "Account" - }, - "cloudcontrol": { - "name": "CloudControl" - }, - "grafana": { - "name": "Grafana" - }, - "panorama": { - "name": "Panorama" - }, - "chimesdkmeetings": { - "prefix": "chime-sdk-meetings", - "name": "ChimeSDKMeetings" - }, - "resiliencehub": { - "name": "Resiliencehub" - }, - "migrationhubstrategy": { - "name": "MigrationHubStrategy" - }, - "appconfigdata": { - "name": "AppConfigData" - }, - "drs": { - "name": "Drs" - }, - "migrationhubrefactorspaces": { - "prefix": "migration-hub-refactor-spaces", - "name": "MigrationHubRefactorSpaces" - }, - "evidently": { - "name": "Evidently" - }, - "inspector2": { - "name": "Inspector2" - }, - "rbin": { - "name": "Rbin" - }, - "rum": { - "name": "RUM" - }, - "backupgateway": { - "prefix": "backup-gateway", - "name": "BackupGateway" - }, - "iottwinmaker": { - "name": "IoTTwinMaker" - }, - "workspacesweb": { - "prefix": "workspaces-web", - "name": "WorkSpacesWeb" - }, - "amplifyuibuilder": { - "name": "AmplifyUIBuilder" - }, - "keyspaces": { - "name": "Keyspaces" - }, - "billingconductor": { - "name": "Billingconductor" - }, - "gamesparks": { - "name": "GameSparks" - }, - "pinpointsmsvoicev2": { - "prefix": "pinpoint-sms-voice-v2", - "name": "PinpointSMSVoiceV2" - }, - "ivschat": { - "name": "Ivschat" - }, - "chimesdkmediapipelines": { - "prefix": "chime-sdk-media-pipelines", - "name": "ChimeSDKMediaPipelines" - }, - "emrserverless": { - "prefix": "emr-serverless", - "name": "EMRServerless" - }, - "m2": { - "name": "M2" - }, - "connectcampaigns": { - "name": "ConnectCampaigns" - }, - "redshiftserverless": { - "prefix": "redshift-serverless", - "name": "RedshiftServerless" - }, - "rolesanywhere": { - "name": "RolesAnywhere" - }, - "licensemanagerusersubscriptions": { - "prefix": "license-manager-user-subscriptions", - "name": "LicenseManagerUserSubscriptions" - }, - "backupstorage": { - "name": "BackupStorage" - }, - "privatenetworks": { - "name": "PrivateNetworks" - }, - "supportapp": { - "prefix": "support-app", - "name": "SupportApp" - }, - "controltower": { - "name": "ControlTower" - }, - "iotfleetwise": { - "name": "IoTFleetWise" - }, - "migrationhuborchestrator": { - "name": "MigrationHubOrchestrator" - }, - "connectcases": { - "name": "ConnectCases" - }, - "resourceexplorer2": { - "prefix": "resource-explorer-2", - "name": "ResourceExplorer2" - }, - "scheduler": { - "name": "Scheduler" - }, - "chimesdkvoice": { - "prefix": "chime-sdk-voice", - "name": "ChimeSDKVoice" - }, - "iotroborunner": { - "prefix": "iot-roborunner", - "name": "IoTRoboRunner" - }, - "ssmsap": { - "prefix": "ssm-sap", - "name": "SsmSap" - }, - "oam": { - "name": "OAM" - }, - "arczonalshift": { - "prefix": "arc-zonal-shift", - "name": "ARCZonalShift" - }, - "omics": { - "name": "Omics" - }, - "opensearchserverless": { - "name": "OpenSearchServerless" - }, - "securitylake": { - "name": "SecurityLake" - }, - "simspaceweaver": { - "name": "SimSpaceWeaver" - }, - "docdbelastic": { - "prefix": "docdb-elastic", - "name": "DocDBElastic" - }, - "sagemakergeospatial": { - "prefix": "sagemaker-geospatial", - "name": "SageMakerGeospatial" - }, - "codecatalyst": { - "name": "CodeCatalyst" - }, - "pipes": { - "name": "Pipes" - }, - "sagemakermetrics": { - "prefix": "sagemaker-metrics", - "name": "SageMakerMetrics" - }, - "kinesisvideowebrtcstorage": { - "prefix": "kinesis-video-webrtc-storage", - "name": "KinesisVideoWebRTCStorage" - }, - "licensemanagerlinuxsubscriptions": { - "prefix": "license-manager-linux-subscriptions", - "name": "LicenseManagerLinuxSubscriptions" - }, - "kendraranking": { - "prefix": "kendra-ranking", - "name": "KendraRanking" - }, - "cleanrooms": { - "name": "CleanRooms" - }, - "cloudtraildata": { - "prefix": "cloudtrail-data", - "name": "CloudTrailData" - }, - "tnb": { - "name": "Tnb" - }, - "internetmonitor": { - "name": "InternetMonitor" - }, - "ivsrealtime": { - "prefix": "ivs-realtime", - "name": "IVSRealTime" - }, - "vpclattice": { - "prefix": "vpc-lattice", - "name": "VPCLattice" - }, - "osis": { - "name": "OSIS" - }, - "mediapackagev2": { - "name": "MediaPackageV2" - }, - "paymentcryptography": { - "prefix": "payment-cryptography", - "name": "PaymentCryptography" - }, - "paymentcryptographydata": { - "prefix": "payment-cryptography-data", - "name": "PaymentCryptographyData" - }, - "codegurusecurity": { - "prefix": "codeguru-security", - "name": "CodeGuruSecurity" - }, - "verifiedpermissions": { - "name": "VerifiedPermissions" - }, - "appfabric": { - "name": "AppFabric" - }, - "medicalimaging": { - "prefix": "medical-imaging", - "name": "MedicalImaging" - }, - "entityresolution": { - "name": "EntityResolution" - }, - "managedblockchainquery": { - "prefix": "managedblockchain-query", - "name": "ManagedBlockchainQuery" - }, - "neptunedata": { - "name": "Neptunedata" - }, - "pcaconnectorad": { - "prefix": "pca-connector-ad", - "name": "PcaConnectorAd" - } -} \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-v2-to-v3.json b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-v2-to-v3.json new file mode 100644 index 0000000000000..4d6a670769e57 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-v2-to-v3.json @@ -0,0 +1,143 @@ +{ + "acmpca": "acm-pca", + "apigateway": "api-gateway", + "arczonalshift": "arc-zonal-shift", + "alexaforbusiness": "alexa-for-business", + "appmesh": "app-mesh", + "applicationautoscaling": "application-auto-scaling", + "applicationinsights": "application-insights", + "augmentedairuntime": "sage-maker-a2iruntime", + "autoscaling": "auto-scaling", + "autoscalingplans": "auto-scaling-plans", + "backupgateway": "backup-gateway", + "cur": "cost-and-usage-report-service", + "chimesdkidentity": "chime-sdk-identity", + "chimesdkmediapipelines": "chime-sdk-media-pipelines", + "chimesdkmeetings": "chime-sdk-meetings", + "chimesdkmessaging": "chime-sdk-messaging", + "chimesdkvoice": "chime-sdk-voice", + "cloudhsmv2": "cloudhsm-v2", + "cloudsearchdomain": "cloudsearch-domain", + "cloudtraildata": "cloudtrail-data", + "cloudwatchevents": "cloudwatch-events", + "cloudwatchlogs": "cloudwatch-logs", + "codegurureviewer": "codeguru-reviewer", + "codegurusecurity": "codeguru-security", + "codestarnotifications": "codestar-notifications", + "codestarconnections": "codestar-connections", + "cognitoidentity": "cognito-identity", + "cognitoidentityserviceprovider": "cognito-identity-provider", + "cognitosync": "cognito-sync", + "computeoptimizer": "compute-optimizer", + "configservice": "config-service", + "connectcontactlens": "connect-contact-lens", + "costexplorer": "cost-explorer", + "customerprofiles": "customer-profiles", + "dms": "database-migration-service", + "datapipeline": "data-pipeline", + "devopsguru": "devops-guru", + "devicefarm": "device-farm", + "directconnect": "direct-connect", + "directoryservice": "directory-service", + "discovery": "application-discovery-service", + "docdbelastic": "docdb-elastic", + "dynamodbstreams": "dynamodb-streams", + "ec2instanceconnect": "ec2-instance-connect", + "ecrpublic": "ecr-public", + "elb": "elastic-load-balancing", + "elbv2": "elastic-load-balancing-v2", + "emrserverless": "emr-serverless", + "emrcontainers": "emr-containers", + "es": "elasticsearch-service", + "elasticbeanstalk": "elastic-beanstalk", + "elasticinference": "elastic-inference", + "elastictranscoder": "elastic-transcoder", + "finspacedata": "finspace-data", + "forecastqueryservice": "forecastquery", + "forecastservice": "forecast", + "globalaccelerator": "global-accelerator", + "iot1clickdevicesservice": "iot-1click-devices-service", + "iot1clickprojects": "iot-1click-projects", + "iotevents": "iot-events", + "ioteventsdata": "iot-events-data", + "iotjobsdataplane": "iot-jobs-data-plane", + "iotroborunner": "iot-roborunner", + "iotwireless": "iot-wireless", + "iotdata": "iot-data-plane", + "ivsrealtime": "ivs-realtime", + "kendraranking": "kendra-ranking", + "kinesisanalytics": "kinesis-analytics", + "kinesisanalyticsv2": "kinesis-analytics-v2", + "kinesisvideo": "kinesis-video", + "kinesisvideoarchivedmedia": "kinesis-video-archived-media", + "kinesisvideomedia": "kinesis-video-media", + "kinesisvideosignalingchannels": "kinesis-video-signaling", + "kinesisvideowebrtcstorage": "kinesis-video-webrtc-storage", + "lexmodelbuildingservice": "lex-model-building-service", + "lexmodelsv2": "lex-models-v2", + "lexruntime": "lex-runtime-service", + "lexruntimev2": "lex-runtime-v2", + "licensemanager": "license-manager", + "licensemanagerlinuxsubscriptions": "license-manager-linux-subscriptions", + "licensemanagerusersubscriptions": "license-manager-user-subscriptions", + "machinelearning": "machine-learning", + "managedblockchainquery": "managedblockchain-query", + "marketplacecatalog": "marketplace-catalog", + "marketplacecommerceanalytics": "marketplace-commerce-analytics", + "marketplaceentitlementservice": "marketplace-entitlement-service", + "marketplacemetering": "marketplace-metering", + "mediapackagevod": "mediapackage-vod", + "mediastoredata": "mediastore-data", + "medicalimaging": "medical-imaging", + "memorydb": "memory-db", + "migrationhub": "migration-hub", + "migrationhubconfig": "migrationhub-config", + "migrationhubrefactorspaces": "migration-hub-refactor-spaces", + "networkfirewall": "network-firewall", + "paymentcryptography": "payment-cryptography", + "paymentcryptographydata": "payment-cryptography-data", + "pcaconnectorad": "pca-connector-ad", + "personalizeevents": "personalize-events", + "personalizeruntime": "personalize-runtime", + "pinpointemail": "pinpoint-email", + "pinpointsmsvoice": "pinpoint-sms-voice", + "pinpointsmsvoicev2": "pinpoint-sms-voice-v2", + "qldbsession": "qldb-session", + "rdsdataservice": "rds-data", + "redshiftdata": "redshift-data", + "redshiftserverless": "redshift-serverless", + "resourceexplorer2": "resource-explorer-2", + "resourcegroups": "resource-groups", + "resourcegroupstaggingapi": "resource-groups-tagging-api", + "route53": "route-53", + "route53domains": "route-53-domains", + "route53recoverycluster": "route53-recovery-cluster", + "route53recoverycontrolconfig": "route53-recovery-control-config", + "route53recoveryreadiness": "route53-recovery-readiness", + "s3control": "s3-control", + "ssmcontacts": "ssm-contacts", + "ssmincidents": "ssm-incidents", + "ssoadmin": "sso-admin", + "ssooidc": "sso-oidc", + "sagemakerfeaturestoreruntime": "sagemaker-featurestore-runtime", + "sagemakergeospatial": "sagemaker-geospatial", + "sagemakermetrics": "sagemaker-metrics", + "sagemakerruntime": "sagemaker-runtime", + "sagemakeredge": "sagemaker-edge", + "secretsmanager": "secrets-manager", + "servicecatalog": "service-catalog", + "servicecatalogappregistry": "service-catalog-appregistry", + "servicequotas": "service-quotas", + "snowdevicemanagement": "snow-device-management", + "ssmsap": "ssm-sap", + "stepfunctions": "sfn", + "storagegateway": "storage-gateway", + "supportapp": "support-app", + "timestreamquery": "timestream-query", + "timestreamwrite": "timestream-write", + "transcribeservice": "transcribe", + "voiceid": "voice-id", + "vpclattice": "vpc-lattice", + "wafregional": "waf-regional", + "workspacesweb": "workspaces-web" +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-v3-metadata.json b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-v3-metadata.json new file mode 100644 index 0000000000000..ac34417dd8db0 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-v3-metadata.json @@ -0,0 +1,1075 @@ +{ + "accessanalyzer": { + "iamPrefix": "access-analyzer" + }, + "account": { + "iamPrefix": "account" + }, + "acm-pca": { + "iamPrefix": "acm-pca" + }, + "acm": { + "iamPrefix": "acm" + }, + "alexa-for-business": { + "iamPrefix": "a4b" + }, + "amp": { + "iamPrefix": "aps" + }, + "amplify": { + "iamPrefix": "amplify" + }, + "amplifybackend": { + "iamPrefix": "amplifybackend" + }, + "amplifyuibuilder": { + "iamPrefix": "amplifyuibuilder" + }, + "api-gateway": { + "iamPrefix": "apigateway" + }, + "apigatewaymanagementapi": { + "iamPrefix": "execute-api" + }, + "apigatewayv2": { + "iamPrefix": "apigateway" + }, + "app-mesh": { + "iamPrefix": "appmesh" + }, + "appconfig": { + "iamPrefix": "appconfig" + }, + "appconfigdata": { + "iamPrefix": "appconfig" + }, + "appfabric": { + "iamPrefix": "appfabric" + }, + "appflow": { + "iamPrefix": "appflow" + }, + "appintegrations": { + "iamPrefix": "app-integrations" + }, + "application-auto-scaling": { + "iamPrefix": "application-autoscaling" + }, + "application-discovery-service": { + "iamPrefix": "discovery" + }, + "application-insights": { + "iamPrefix": "applicationinsights" + }, + "applicationcostprofiler": { + "iamPrefix": "application-cost-profiler" + }, + "apprunner": { + "iamPrefix": "apprunner" + }, + "appstream": { + "iamPrefix": "appstream" + }, + "appsync": { + "iamPrefix": "appsync" + }, + "arc-zonal-shift": { + "iamPrefix": "arc-zonal-shift" + }, + "athena": { + "iamPrefix": "athena" + }, + "auditmanager": { + "iamPrefix": "auditmanager" + }, + "auto-scaling-plans": { + "iamPrefix": "autoscaling-plans" + }, + "auto-scaling": { + "iamPrefix": "autoscaling" + }, + "backup-gateway": { + "iamPrefix": "backup-gateway" + }, + "backup": { + "iamPrefix": "backup" + }, + "backupstorage": { + "iamPrefix": "backup-storage" + }, + "batch": { + "iamPrefix": "batch" + }, + "billingconductor": { + "iamPrefix": "billingconductor" + }, + "braket": { + "iamPrefix": "braket" + }, + "budgets": { + "iamPrefix": "budgets" + }, + "chime-sdk-identity": { + "iamPrefix": "chime" + }, + "chime-sdk-media-pipelines": { + "iamPrefix": "chime" + }, + "chime-sdk-meetings": { + "iamPrefix": "chime" + }, + "chime-sdk-messaging": { + "iamPrefix": "chime" + }, + "chime-sdk-voice": { + "iamPrefix": "chime" + }, + "chime": { + "iamPrefix": "chime" + }, + "cleanrooms": { + "iamPrefix": "cleanrooms" + }, + "cloud9": { + "iamPrefix": "cloud9" + }, + "cloudcontrol": { + "iamPrefix": "cloudcontrolapi" + }, + "clouddirectory": { + "iamPrefix": "clouddirectory" + }, + "cloudformation": { + "iamPrefix": "cloudformation" + }, + "cloudfront": { + "iamPrefix": "cloudfront" + }, + "cloudhsm-v2": { + "iamPrefix": "cloudhsm" + }, + "cloudhsm": { + "iamPrefix": "cloudhsm" + }, + "cloudsearch-domain": { + "iamPrefix": "cloudsearch" + }, + "cloudsearch": { + "iamPrefix": "cloudsearch" + }, + "cloudtrail-data": { + "iamPrefix": "cloudtrail-data" + }, + "cloudtrail": { + "iamPrefix": "cloudtrail" + }, + "cloudwatch-events": { + "iamPrefix": "events" + }, + "cloudwatch-logs": { + "iamPrefix": "logs" + }, + "cloudwatch": { + "iamPrefix": "monitoring" + }, + "codeartifact": { + "iamPrefix": "codeartifact" + }, + "codebuild": { + "iamPrefix": "codebuild" + }, + "codecatalyst": {}, + "codecommit": { + "iamPrefix": "codecommit" + }, + "codedeploy": { + "iamPrefix": "codedeploy" + }, + "codeguru-reviewer": { + "iamPrefix": "codeguru-reviewer" + }, + "codeguru-security": { + "iamPrefix": "codeguru-security" + }, + "codeguruprofiler": { + "iamPrefix": "codeguru-profiler" + }, + "codepipeline": { + "iamPrefix": "codepipeline" + }, + "codestar-connections": { + "iamPrefix": "codestar-connections" + }, + "codestar-notifications": { + "iamPrefix": "codestar-notifications" + }, + "codestar": { + "iamPrefix": "codestar" + }, + "cognito-identity-provider": { + "iamPrefix": "cognito-idp" + }, + "cognito-identity": { + "iamPrefix": "cognito-identity" + }, + "cognito-sync": { + "iamPrefix": "cognito-sync" + }, + "comprehend": { + "iamPrefix": "comprehend" + }, + "comprehendmedical": { + "iamPrefix": "comprehendmedical" + }, + "compute-optimizer": { + "iamPrefix": "compute-optimizer" + }, + "config-service": { + "iamPrefix": "config" + }, + "connect-contact-lens": { + "iamPrefix": "connect" + }, + "connect": { + "iamPrefix": "connect" + }, + "connectcampaigns": { + "iamPrefix": "connect-campaigns" + }, + "connectcases": { + "iamPrefix": "cases" + }, + "connectparticipant": { + "iamPrefix": "execute-api" + }, + "controltower": { + "iamPrefix": "controltower" + }, + "cost-and-usage-report-service": { + "iamPrefix": "cur" + }, + "cost-explorer": { + "iamPrefix": "ce" + }, + "customer-profiles": { + "iamPrefix": "profile" + }, + "data-pipeline": { + "iamPrefix": "datapipeline" + }, + "database-migration-service": { + "iamPrefix": "dms" + }, + "databrew": { + "iamPrefix": "databrew" + }, + "dataexchange": { + "iamPrefix": "dataexchange" + }, + "datasync": { + "iamPrefix": "datasync" + }, + "dax": { + "iamPrefix": "dax" + }, + "detective": { + "iamPrefix": "detective" + }, + "device-farm": { + "iamPrefix": "devicefarm" + }, + "devops-guru": { + "iamPrefix": "devops-guru" + }, + "direct-connect": { + "iamPrefix": "directconnect" + }, + "directory-service": { + "iamPrefix": "ds" + }, + "dlm": { + "iamPrefix": "dlm" + }, + "docdb-elastic": { + "iamPrefix": "docdb-elastic" + }, + "docdb": { + "iamPrefix": "rds" + }, + "drs": { + "iamPrefix": "drs" + }, + "dynamodb-streams": { + "iamPrefix": "dynamodb" + }, + "dynamodb": { + "iamPrefix": "dynamodb" + }, + "ebs": { + "iamPrefix": "ebs" + }, + "ec2-instance-connect": { + "iamPrefix": "ec2-instance-connect" + }, + "ec2": { + "iamPrefix": "ec2" + }, + "ecr-public": { + "iamPrefix": "ecr-public" + }, + "ecr": { + "iamPrefix": "ecr" + }, + "ecs": { + "iamPrefix": "ecs", + "commands": [ + "ExecuteCommand" + ] + }, + "efs": { + "iamPrefix": "elasticfilesystem" + }, + "eks": { + "iamPrefix": "eks" + }, + "elastic-beanstalk": { + "iamPrefix": "elasticbeanstalk" + }, + "elastic-inference": { + "iamPrefix": "elastic-inference" + }, + "elastic-load-balancing-v2": { + "iamPrefix": "elasticloadbalancing" + }, + "elastic-load-balancing": { + "iamPrefix": "elasticloadbalancing" + }, + "elastic-transcoder": { + "iamPrefix": "elastictranscoder" + }, + "elasticache": { + "iamPrefix": "elasticache" + }, + "elasticsearch-service": { + "iamPrefix": "es" + }, + "emr-containers": { + "iamPrefix": "emr-containers" + }, + "emr-serverless": { + "iamPrefix": "emr-serverless" + }, + "emr": { + "iamPrefix": "elasticmapreduce" + }, + "entityresolution": { + "iamPrefix": "entityresolution" + }, + "eventbridge": { + "iamPrefix": "events" + }, + "evidently": { + "iamPrefix": "evidently" + }, + "finspace-data": { + "iamPrefix": "finspace-api" + }, + "finspace": { + "iamPrefix": "finspace" + }, + "firehose": { + "iamPrefix": "firehose" + }, + "fis": { + "iamPrefix": "fis" + }, + "fms": { + "iamPrefix": "fms" + }, + "forecast": { + "iamPrefix": "forecast" + }, + "forecastquery": { + "iamPrefix": "forecast" + }, + "frauddetector": { + "iamPrefix": "frauddetector" + }, + "fsx": { + "iamPrefix": "fsx" + }, + "gamelift": { + "iamPrefix": "gamelift" + }, + "gamesparks": { + "iamPrefix": "gamesparks" + }, + "glacier": { + "iamPrefix": "glacier" + }, + "global-accelerator": { + "iamPrefix": "globalaccelerator" + }, + "glue": { + "iamPrefix": "glue" + }, + "grafana": { + "iamPrefix": "grafana" + }, + "greengrass": { + "iamPrefix": "greengrass" + }, + "greengrassv2": { + "iamPrefix": "greengrass" + }, + "groundstation": { + "iamPrefix": "groundstation" + }, + "guardduty": { + "iamPrefix": "guardduty" + }, + "health": { + "iamPrefix": "health" + }, + "healthlake": { + "iamPrefix": "healthlake" + }, + "honeycode": { + "iamPrefix": "honeycode" + }, + "iam": { + "iamPrefix": "iam" + }, + "identitystore": { + "iamPrefix": "identitystore" + }, + "imagebuilder": { + "iamPrefix": "imagebuilder" + }, + "inspector": { + "iamPrefix": "inspector" + }, + "inspector2": { + "iamPrefix": "inspector2" + }, + "internetmonitor": { + "iamPrefix": "internetmonitor" + }, + "iot-1click-devices-service": { + "iamPrefix": "iot1click" + }, + "iot-1click-projects": { + "iamPrefix": "iot1click" + }, + "iot-data-plane": { + "iamPrefix": "iotdata" + }, + "iot-events-data": { + "iamPrefix": "ioteventsdata" + }, + "iot-events": { + "iamPrefix": "iotevents" + }, + "iot-jobs-data-plane": { + "iamPrefix": "iot-jobs-data" + }, + "iot-roborunner": { + "iamPrefix": "iotroborunner" + }, + "iot-wireless": { + "iamPrefix": "iotwireless" + }, + "iot": { + "iamPrefix": "iot" + }, + "iotanalytics": { + "iamPrefix": "iotanalytics" + }, + "iotdeviceadvisor": { + "iamPrefix": "iotdeviceadvisor" + }, + "iotfleethub": { + "iamPrefix": "iotfleethub" + }, + "iotfleetwise": { + "iamPrefix": "iotfleetwise" + }, + "iotsecuretunneling": { + "iamPrefix": "IoTSecuredTunneling" + }, + "iotsitewise": { + "iamPrefix": "iotsitewise" + }, + "iotthingsgraph": { + "iamPrefix": "iotthingsgraph" + }, + "iottwinmaker": { + "iamPrefix": "iottwinmaker" + }, + "ivs-realtime": { + "iamPrefix": "ivs" + }, + "ivs": { + "iamPrefix": "ivs" + }, + "ivschat": { + "iamPrefix": "ivschat" + }, + "kafka": { + "iamPrefix": "kafka" + }, + "kafkaconnect": { + "iamPrefix": "kafkaconnect" + }, + "kendra-ranking": { + "iamPrefix": "kendra-ranking" + }, + "kendra": { + "iamPrefix": "kendra" + }, + "keyspaces": { + "iamPrefix": "cassandra" + }, + "kinesis-analytics-v2": { + "iamPrefix": "kinesisanalytics" + }, + "kinesis-analytics": { + "iamPrefix": "kinesisanalytics" + }, + "kinesis-video-archived-media": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-media": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-signaling": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-webrtc-storage": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video": { + "iamPrefix": "kinesisvideo" + }, + "kinesis": { + "iamPrefix": "kinesis" + }, + "kms": { + "iamPrefix": "kms" + }, + "lakeformation": { + "iamPrefix": "lakeformation" + }, + "lambda": { + "iamPrefix": "lambda" + }, + "lex-model-building-service": { + "iamPrefix": "lex" + }, + "lex-models-v2": { + "iamPrefix": "lex" + }, + "lex-runtime-service": { + "iamPrefix": "lex" + }, + "lex-runtime-v2": { + "iamPrefix": "lex" + }, + "license-manager-linux-subscriptions": { + "iamPrefix": "license-manager-linux-subscriptions" + }, + "license-manager-user-subscriptions": { + "iamPrefix": "license-manager-user-subscriptions" + }, + "license-manager": { + "iamPrefix": "license-manager" + }, + "lightsail": { + "iamPrefix": "lightsail" + }, + "location": { + "iamPrefix": "geo" + }, + "lookoutequipment": { + "iamPrefix": "lookoutequipment" + }, + "lookoutmetrics": { + "iamPrefix": "lookoutmetrics" + }, + "lookoutvision": { + "iamPrefix": "lookoutvision" + }, + "m2": { + "iamPrefix": "m2" + }, + "machine-learning": { + "iamPrefix": "machinelearning" + }, + "macie": { + "iamPrefix": "macie" + }, + "macie2": { + "iamPrefix": "macie2" + }, + "managedblockchain-query": { + "iamPrefix": "managedblockchain-query" + }, + "managedblockchain": { + "iamPrefix": "managedblockchain" + }, + "marketplace-catalog": { + "iamPrefix": "aws-marketplace" + }, + "marketplace-commerce-analytics": { + "iamPrefix": "marketplacecommerceanalytics" + }, + "marketplace-entitlement-service": { + "iamPrefix": "aws-marketplace" + }, + "marketplace-metering": { + "iamPrefix": "aws-marketplace" + }, + "mediaconnect": { + "iamPrefix": "mediaconnect" + }, + "mediaconvert": { + "iamPrefix": "mediaconvert" + }, + "medialive": { + "iamPrefix": "medialive" + }, + "mediapackage-vod": { + "iamPrefix": "mediapackage-vod" + }, + "mediapackage": { + "iamPrefix": "mediapackage" + }, + "mediapackagev2": { + "iamPrefix": "mediapackagev2" + }, + "mediastore-data": { + "iamPrefix": "mediastore" + }, + "mediastore": { + "iamPrefix": "mediastore" + }, + "mediatailor": { + "iamPrefix": "mediatailor" + }, + "medical-imaging": { + "iamPrefix": "medical-imaging" + }, + "memorydb": { + "iamPrefix": "memorydb" + }, + "mgn": { + "iamPrefix": "mgn" + }, + "migration-hub-refactor-spaces": { + "iamPrefix": "refactor-spaces" + }, + "migration-hub": { + "iamPrefix": "mgh" + }, + "migrationhub-config": { + "iamPrefix": "mgh" + }, + "migrationhuborchestrator": { + "iamPrefix": "migrationhub-orchestrator" + }, + "migrationhubstrategy": { + "iamPrefix": "migrationhub-strategy" + }, + "mobile": { + "iamPrefix": "AWSMobileHubService" + }, + "mq": { + "iamPrefix": "mq" + }, + "mturk": { + "iamPrefix": "mturk-requester" + }, + "mwaa": { + "iamPrefix": "airflow" + }, + "neptune": { + "iamPrefix": "rds" + }, + "neptunedata": { + "iamPrefix": "neptune-db" + }, + "network-firewall": { + "iamPrefix": "network-firewall" + }, + "networkmanager": { + "iamPrefix": "networkmanager" + }, + "nimble": { + "iamPrefix": "nimble" + }, + "oam": { + "iamPrefix": "oam" + }, + "omics": { + "iamPrefix": "omics" + }, + "opensearch": { + "iamPrefix": "es" + }, + "opensearchserverless": { + "iamPrefix": "aoss" + }, + "opsworks": { + "iamPrefix": "opsworks" + }, + "opsworkscm": { + "iamPrefix": "opsworks-cm" + }, + "organizations": { + "iamPrefix": "organizations" + }, + "osis": { + "iamPrefix": "osis" + }, + "outposts": { + "iamPrefix": "outposts" + }, + "panorama": { + "iamPrefix": "panorama" + }, + "payment-cryptography-data": { + "iamPrefix": "payment-cryptography" + }, + "payment-cryptography": { + "iamPrefix": "payment-cryptography" + }, + "pca-connector-ad": { + "iamPrefix": "pca-connector-ad" + }, + "personalize-events": { + "iamPrefix": "personalize" + }, + "personalize-runtime": { + "iamPrefix": "personalize" + }, + "personalize": { + "iamPrefix": "personalize" + }, + "pi": { + "iamPrefix": "pi" + }, + "pinpoint-email": { + "iamPrefix": "ses" + }, + "pinpoint-sms-voice-v2": { + "iamPrefix": "sms-voice" + }, + "pinpoint-sms-voice": { + "iamPrefix": "sms-voice" + }, + "pinpoint": { + "iamPrefix": "mobiletargeting" + }, + "pipes": { + "iamPrefix": "pipes" + }, + "polly": { + "iamPrefix": "polly" + }, + "pricing": { + "iamPrefix": "pricing" + }, + "privatenetworks": { + "iamPrefix": "private-networks" + }, + "proton": { + "iamPrefix": "proton" + }, + "qldb-session": { + "iamPrefix": "qldb", + "commands": [ + "SendCommand" + ] + }, + "qldb": { + "iamPrefix": "qldb" + }, + "quicksight": { + "iamPrefix": "quicksight" + }, + "ram": { + "iamPrefix": "ram" + }, + "rbin": { + "iamPrefix": "rbin" + }, + "rds-data": { + "iamPrefix": "rds-data" + }, + "rds": { + "iamPrefix": "rds" + }, + "redshift-data": { + "iamPrefix": "redshift-data" + }, + "redshift-serverless": { + "iamPrefix": "redshift-serverless" + }, + "redshift": { + "iamPrefix": "redshift" + }, + "rekognition": { + "iamPrefix": "rekognition" + }, + "rekognitionstreaming": { + "iamPrefix": "rekognition" + }, + "resiliencehub": { + "iamPrefix": "resiliencehub" + }, + "resource-explorer-2": { + "iamPrefix": "resource-explorer-2" + }, + "resource-groups-tagging-api": { + "iamPrefix": "tagging" + }, + "resource-groups": { + "iamPrefix": "resource-groups" + }, + "robomaker": { + "iamPrefix": "robomaker" + }, + "rolesanywhere": { + "iamPrefix": "rolesanywhere" + }, + "route-53-domains": { + "iamPrefix": "route53domains" + }, + "route-53": { + "iamPrefix": "route53" + }, + "route53-recovery-cluster": { + "iamPrefix": "route53-recovery-cluster" + }, + "route53-recovery-control-config": { + "iamPrefix": "route53-recovery-control-config" + }, + "route53-recovery-readiness": { + "iamPrefix": "route53-recovery-readiness" + }, + "route53resolver": { + "iamPrefix": "route53resolver" + }, + "rum": { + "iamPrefix": "rum" + }, + "s3-control": { + "iamPrefix": "s3" + }, + "s3": { + "iamPrefix": "s3" + }, + "s3outposts": { + "iamPrefix": "s3-outposts" + }, + "sagemaker-a2i-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker-edge": { + "iamPrefix": "sagemaker" + }, + "sagemaker-featurestore-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker-geospatial": { + "iamPrefix": "sagemaker-geospatial" + }, + "sagemaker-metrics": { + "iamPrefix": "sagemaker" + }, + "sagemaker-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker": { + "iamPrefix": "sagemaker" + }, + "savingsplans": { + "iamPrefix": "savingsplans" + }, + "scheduler": { + "iamPrefix": "scheduler" + }, + "schemas": { + "iamPrefix": "schemas" + }, + "secrets-manager": { + "iamPrefix": "secretsmanager" + }, + "securityhub": { + "iamPrefix": "securityhub" + }, + "securitylake": { + "iamPrefix": "securitylake" + }, + "serverlessapplicationrepository": { + "iamPrefix": "serverlessrepo" + }, + "service-catalog-appregistry": { + "iamPrefix": "servicecatalog" + }, + "service-catalog": { + "iamPrefix": "servicecatalog" + }, + "service-quotas": { + "iamPrefix": "servicequotas" + }, + "servicediscovery": { + "iamPrefix": "servicediscovery" + }, + "ses": { + "iamPrefix": "ses" + }, + "sesv2": { + "iamPrefix": "ses" + }, + "sfn": { + "iamPrefix": "states" + }, + "shield": { + "iamPrefix": "shield" + }, + "signer": { + "iamPrefix": "signer" + }, + "simspaceweaver": { + "iamPrefix": "simspaceweaver" + }, + "sms": { + "iamPrefix": "sms" + }, + "snow-device-management": { + "iamPrefix": "snow-device-management" + }, + "snowball": { + "iamPrefix": "snowball" + }, + "sns": { + "iamPrefix": "sns" + }, + "sqs": { + "iamPrefix": "sqs" + }, + "ssm-contacts": { + "iamPrefix": "ssm-contacts" + }, + "ssm-incidents": { + "iamPrefix": "ssm-incidents" + }, + "ssm-sap": { + "iamPrefix": "ssm-sap" + }, + "ssm": { + "iamPrefix": "ssm", + "commands": [ + "CancelCommand", + "SendCommand" + ] + }, + "sso-admin": { + "iamPrefix": "sso" + }, + "sso-oidc": { + "iamPrefix": "awsssooidc" + }, + "sso": { + "iamPrefix": "awsssoportal" + }, + "storage-gateway": { + "iamPrefix": "storagegateway" + }, + "sts": { + "iamPrefix": "sts" + }, + "support-app": { + "iamPrefix": "supportapp" + }, + "support": { + "iamPrefix": "support" + }, + "swf": { + "iamPrefix": "swf" + }, + "synthetics": { + "iamPrefix": "synthetics" + }, + "textract": { + "iamPrefix": "textract" + }, + "timestream-query": { + "iamPrefix": "timestream" + }, + "timestream-write": { + "iamPrefix": "timestream" + }, + "tnb": { + "iamPrefix": "tnb" + }, + "transcribe-streaming": { + "iamPrefix": "transcribe" + }, + "transcribe": { + "iamPrefix": "transcribe" + }, + "transfer": { + "iamPrefix": "transfer" + }, + "translate": { + "iamPrefix": "translate" + }, + "verifiedpermissions": { + "iamPrefix": "verifiedpermissions" + }, + "voice-id": { + "iamPrefix": "voiceid" + }, + "vpc-lattice": { + "iamPrefix": "vpc-lattice" + }, + "waf-regional": { + "iamPrefix": "waf-regional" + }, + "waf": { + "iamPrefix": "waf" + }, + "wafv2": { + "iamPrefix": "wafv2" + }, + "wellarchitected": { + "iamPrefix": "wellarchitected" + }, + "wisdom": { + "iamPrefix": "wisdom" + }, + "workdocs": { + "iamPrefix": "workdocs" + }, + "worklink": { + "iamPrefix": "worklink" + }, + "workmail": { + "iamPrefix": "workmail" + }, + "workmailmessageflow": { + "iamPrefix": "workmailmessageflow" + }, + "workspaces-web": { + "iamPrefix": "workspaces-web" + }, + "workspaces": { + "iamPrefix": "workspaces" + }, + "xray": { + "iamPrefix": "xray" + } +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/index.ts b/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/index.ts new file mode 100644 index 0000000000000..56a4389d17878 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/index.ts @@ -0,0 +1 @@ +export * from './sdk-info'; \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-info.ts b/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-info.ts new file mode 100644 index 0000000000000..26ec0a33d1822 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-info.ts @@ -0,0 +1,61 @@ +import * as path from 'path'; + +/** + * Transform SDK service/action to IAM action using metadata obtained from AWS SDK metadata. + * Example: CloudWatchLogs with putRetentionPolicy => logs:PutRetentionPolicy + */ +export function awsSdkToIamAction(service: string, action: string): string { + const v3Name = normalizeServiceName(service); + const iamPrefix = v3Metadata()[v3Name]?.iamPrefix ?? v3Name; + const iamAction = normalizeActionName(v3Name, action); + return `${iamPrefix}:${iamAction}`; +} + +/** + * Normalize a service name from: + * + * - A full SDKv3 package name + * - A partial SDKv3 package name + * - An SDKv2 constructor name + * + * To a partial SDKv3 package name. + */ +function normalizeServiceName(service: string) { + service = service.toLowerCase(); // Lowercase + service = service.replace(/^@aws-sdk\/client-/, ''); // Strip the start of a V3 package name + service = v2ToV3Mapping()?.[service] ?? service; // Optionally map v2 name -> v3 name + return service; +} + +/** + * Normalize an action name from: + * + * - camelCase SDKv2 method name + * - PascalCase API name + * - SDKv3 command class name + * + * To a PascalCase API name. + */ +function normalizeActionName(v3Service: string, action: string) { + if (action.charAt(0).toLowerCase() === action.charAt(0)) { + return action.charAt(0).toUpperCase() + action.slice(1); + } + + // If the given word is in the APIs ending in 'Command' for this service, + // return as is. Otherwise, return with a potential 'Command' suffix stripped. + if (v3Metadata()[v3Service]?.commands?.includes(action)) { + return action; + } + + return action.replace(/Command$/, ''); +} + +function v2ToV3Mapping(): Record { + // eslint-disable-next-line @typescript-eslint/no-require-imports + return require(path.join(__dirname, 'sdk-v2-to-v3.json')); +} + +function v3Metadata(): Record { + // eslint-disable-next-line @typescript-eslint/no-require-imports + return require(path.join(__dirname, 'sdk-v3-metadata.json')); +} diff --git a/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-v2-to-v3.json b/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-v2-to-v3.json new file mode 100644 index 0000000000000..4d6a670769e57 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-v2-to-v3.json @@ -0,0 +1,143 @@ +{ + "acmpca": "acm-pca", + "apigateway": "api-gateway", + "arczonalshift": "arc-zonal-shift", + "alexaforbusiness": "alexa-for-business", + "appmesh": "app-mesh", + "applicationautoscaling": "application-auto-scaling", + "applicationinsights": "application-insights", + "augmentedairuntime": "sage-maker-a2iruntime", + "autoscaling": "auto-scaling", + "autoscalingplans": "auto-scaling-plans", + "backupgateway": "backup-gateway", + "cur": "cost-and-usage-report-service", + "chimesdkidentity": "chime-sdk-identity", + "chimesdkmediapipelines": "chime-sdk-media-pipelines", + "chimesdkmeetings": "chime-sdk-meetings", + "chimesdkmessaging": "chime-sdk-messaging", + "chimesdkvoice": "chime-sdk-voice", + "cloudhsmv2": "cloudhsm-v2", + "cloudsearchdomain": "cloudsearch-domain", + "cloudtraildata": "cloudtrail-data", + "cloudwatchevents": "cloudwatch-events", + "cloudwatchlogs": "cloudwatch-logs", + "codegurureviewer": "codeguru-reviewer", + "codegurusecurity": "codeguru-security", + "codestarnotifications": "codestar-notifications", + "codestarconnections": "codestar-connections", + "cognitoidentity": "cognito-identity", + "cognitoidentityserviceprovider": "cognito-identity-provider", + "cognitosync": "cognito-sync", + "computeoptimizer": "compute-optimizer", + "configservice": "config-service", + "connectcontactlens": "connect-contact-lens", + "costexplorer": "cost-explorer", + "customerprofiles": "customer-profiles", + "dms": "database-migration-service", + "datapipeline": "data-pipeline", + "devopsguru": "devops-guru", + "devicefarm": "device-farm", + "directconnect": "direct-connect", + "directoryservice": "directory-service", + "discovery": "application-discovery-service", + "docdbelastic": "docdb-elastic", + "dynamodbstreams": "dynamodb-streams", + "ec2instanceconnect": "ec2-instance-connect", + "ecrpublic": "ecr-public", + "elb": "elastic-load-balancing", + "elbv2": "elastic-load-balancing-v2", + "emrserverless": "emr-serverless", + "emrcontainers": "emr-containers", + "es": "elasticsearch-service", + "elasticbeanstalk": "elastic-beanstalk", + "elasticinference": "elastic-inference", + "elastictranscoder": "elastic-transcoder", + "finspacedata": "finspace-data", + "forecastqueryservice": "forecastquery", + "forecastservice": "forecast", + "globalaccelerator": "global-accelerator", + "iot1clickdevicesservice": "iot-1click-devices-service", + "iot1clickprojects": "iot-1click-projects", + "iotevents": "iot-events", + "ioteventsdata": "iot-events-data", + "iotjobsdataplane": "iot-jobs-data-plane", + "iotroborunner": "iot-roborunner", + "iotwireless": "iot-wireless", + "iotdata": "iot-data-plane", + "ivsrealtime": "ivs-realtime", + "kendraranking": "kendra-ranking", + "kinesisanalytics": "kinesis-analytics", + "kinesisanalyticsv2": "kinesis-analytics-v2", + "kinesisvideo": "kinesis-video", + "kinesisvideoarchivedmedia": "kinesis-video-archived-media", + "kinesisvideomedia": "kinesis-video-media", + "kinesisvideosignalingchannels": "kinesis-video-signaling", + "kinesisvideowebrtcstorage": "kinesis-video-webrtc-storage", + "lexmodelbuildingservice": "lex-model-building-service", + "lexmodelsv2": "lex-models-v2", + "lexruntime": "lex-runtime-service", + "lexruntimev2": "lex-runtime-v2", + "licensemanager": "license-manager", + "licensemanagerlinuxsubscriptions": "license-manager-linux-subscriptions", + "licensemanagerusersubscriptions": "license-manager-user-subscriptions", + "machinelearning": "machine-learning", + "managedblockchainquery": "managedblockchain-query", + "marketplacecatalog": "marketplace-catalog", + "marketplacecommerceanalytics": "marketplace-commerce-analytics", + "marketplaceentitlementservice": "marketplace-entitlement-service", + "marketplacemetering": "marketplace-metering", + "mediapackagevod": "mediapackage-vod", + "mediastoredata": "mediastore-data", + "medicalimaging": "medical-imaging", + "memorydb": "memory-db", + "migrationhub": "migration-hub", + "migrationhubconfig": "migrationhub-config", + "migrationhubrefactorspaces": "migration-hub-refactor-spaces", + "networkfirewall": "network-firewall", + "paymentcryptography": "payment-cryptography", + "paymentcryptographydata": "payment-cryptography-data", + "pcaconnectorad": "pca-connector-ad", + "personalizeevents": "personalize-events", + "personalizeruntime": "personalize-runtime", + "pinpointemail": "pinpoint-email", + "pinpointsmsvoice": "pinpoint-sms-voice", + "pinpointsmsvoicev2": "pinpoint-sms-voice-v2", + "qldbsession": "qldb-session", + "rdsdataservice": "rds-data", + "redshiftdata": "redshift-data", + "redshiftserverless": "redshift-serverless", + "resourceexplorer2": "resource-explorer-2", + "resourcegroups": "resource-groups", + "resourcegroupstaggingapi": "resource-groups-tagging-api", + "route53": "route-53", + "route53domains": "route-53-domains", + "route53recoverycluster": "route53-recovery-cluster", + "route53recoverycontrolconfig": "route53-recovery-control-config", + "route53recoveryreadiness": "route53-recovery-readiness", + "s3control": "s3-control", + "ssmcontacts": "ssm-contacts", + "ssmincidents": "ssm-incidents", + "ssoadmin": "sso-admin", + "ssooidc": "sso-oidc", + "sagemakerfeaturestoreruntime": "sagemaker-featurestore-runtime", + "sagemakergeospatial": "sagemaker-geospatial", + "sagemakermetrics": "sagemaker-metrics", + "sagemakerruntime": "sagemaker-runtime", + "sagemakeredge": "sagemaker-edge", + "secretsmanager": "secrets-manager", + "servicecatalog": "service-catalog", + "servicecatalogappregistry": "service-catalog-appregistry", + "servicequotas": "service-quotas", + "snowdevicemanagement": "snow-device-management", + "ssmsap": "ssm-sap", + "stepfunctions": "sfn", + "storagegateway": "storage-gateway", + "supportapp": "support-app", + "timestreamquery": "timestream-query", + "timestreamwrite": "timestream-write", + "transcribeservice": "transcribe", + "voiceid": "voice-id", + "vpclattice": "vpc-lattice", + "wafregional": "waf-regional", + "workspacesweb": "workspaces-web" +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-v3-metadata.json b/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-v3-metadata.json new file mode 100644 index 0000000000000..ac34417dd8db0 --- /dev/null +++ b/packages/aws-cdk-lib/custom-resources/lib/helpers-internal/sdk-v3-metadata.json @@ -0,0 +1,1075 @@ +{ + "accessanalyzer": { + "iamPrefix": "access-analyzer" + }, + "account": { + "iamPrefix": "account" + }, + "acm-pca": { + "iamPrefix": "acm-pca" + }, + "acm": { + "iamPrefix": "acm" + }, + "alexa-for-business": { + "iamPrefix": "a4b" + }, + "amp": { + "iamPrefix": "aps" + }, + "amplify": { + "iamPrefix": "amplify" + }, + "amplifybackend": { + "iamPrefix": "amplifybackend" + }, + "amplifyuibuilder": { + "iamPrefix": "amplifyuibuilder" + }, + "api-gateway": { + "iamPrefix": "apigateway" + }, + "apigatewaymanagementapi": { + "iamPrefix": "execute-api" + }, + "apigatewayv2": { + "iamPrefix": "apigateway" + }, + "app-mesh": { + "iamPrefix": "appmesh" + }, + "appconfig": { + "iamPrefix": "appconfig" + }, + "appconfigdata": { + "iamPrefix": "appconfig" + }, + "appfabric": { + "iamPrefix": "appfabric" + }, + "appflow": { + "iamPrefix": "appflow" + }, + "appintegrations": { + "iamPrefix": "app-integrations" + }, + "application-auto-scaling": { + "iamPrefix": "application-autoscaling" + }, + "application-discovery-service": { + "iamPrefix": "discovery" + }, + "application-insights": { + "iamPrefix": "applicationinsights" + }, + "applicationcostprofiler": { + "iamPrefix": "application-cost-profiler" + }, + "apprunner": { + "iamPrefix": "apprunner" + }, + "appstream": { + "iamPrefix": "appstream" + }, + "appsync": { + "iamPrefix": "appsync" + }, + "arc-zonal-shift": { + "iamPrefix": "arc-zonal-shift" + }, + "athena": { + "iamPrefix": "athena" + }, + "auditmanager": { + "iamPrefix": "auditmanager" + }, + "auto-scaling-plans": { + "iamPrefix": "autoscaling-plans" + }, + "auto-scaling": { + "iamPrefix": "autoscaling" + }, + "backup-gateway": { + "iamPrefix": "backup-gateway" + }, + "backup": { + "iamPrefix": "backup" + }, + "backupstorage": { + "iamPrefix": "backup-storage" + }, + "batch": { + "iamPrefix": "batch" + }, + "billingconductor": { + "iamPrefix": "billingconductor" + }, + "braket": { + "iamPrefix": "braket" + }, + "budgets": { + "iamPrefix": "budgets" + }, + "chime-sdk-identity": { + "iamPrefix": "chime" + }, + "chime-sdk-media-pipelines": { + "iamPrefix": "chime" + }, + "chime-sdk-meetings": { + "iamPrefix": "chime" + }, + "chime-sdk-messaging": { + "iamPrefix": "chime" + }, + "chime-sdk-voice": { + "iamPrefix": "chime" + }, + "chime": { + "iamPrefix": "chime" + }, + "cleanrooms": { + "iamPrefix": "cleanrooms" + }, + "cloud9": { + "iamPrefix": "cloud9" + }, + "cloudcontrol": { + "iamPrefix": "cloudcontrolapi" + }, + "clouddirectory": { + "iamPrefix": "clouddirectory" + }, + "cloudformation": { + "iamPrefix": "cloudformation" + }, + "cloudfront": { + "iamPrefix": "cloudfront" + }, + "cloudhsm-v2": { + "iamPrefix": "cloudhsm" + }, + "cloudhsm": { + "iamPrefix": "cloudhsm" + }, + "cloudsearch-domain": { + "iamPrefix": "cloudsearch" + }, + "cloudsearch": { + "iamPrefix": "cloudsearch" + }, + "cloudtrail-data": { + "iamPrefix": "cloudtrail-data" + }, + "cloudtrail": { + "iamPrefix": "cloudtrail" + }, + "cloudwatch-events": { + "iamPrefix": "events" + }, + "cloudwatch-logs": { + "iamPrefix": "logs" + }, + "cloudwatch": { + "iamPrefix": "monitoring" + }, + "codeartifact": { + "iamPrefix": "codeartifact" + }, + "codebuild": { + "iamPrefix": "codebuild" + }, + "codecatalyst": {}, + "codecommit": { + "iamPrefix": "codecommit" + }, + "codedeploy": { + "iamPrefix": "codedeploy" + }, + "codeguru-reviewer": { + "iamPrefix": "codeguru-reviewer" + }, + "codeguru-security": { + "iamPrefix": "codeguru-security" + }, + "codeguruprofiler": { + "iamPrefix": "codeguru-profiler" + }, + "codepipeline": { + "iamPrefix": "codepipeline" + }, + "codestar-connections": { + "iamPrefix": "codestar-connections" + }, + "codestar-notifications": { + "iamPrefix": "codestar-notifications" + }, + "codestar": { + "iamPrefix": "codestar" + }, + "cognito-identity-provider": { + "iamPrefix": "cognito-idp" + }, + "cognito-identity": { + "iamPrefix": "cognito-identity" + }, + "cognito-sync": { + "iamPrefix": "cognito-sync" + }, + "comprehend": { + "iamPrefix": "comprehend" + }, + "comprehendmedical": { + "iamPrefix": "comprehendmedical" + }, + "compute-optimizer": { + "iamPrefix": "compute-optimizer" + }, + "config-service": { + "iamPrefix": "config" + }, + "connect-contact-lens": { + "iamPrefix": "connect" + }, + "connect": { + "iamPrefix": "connect" + }, + "connectcampaigns": { + "iamPrefix": "connect-campaigns" + }, + "connectcases": { + "iamPrefix": "cases" + }, + "connectparticipant": { + "iamPrefix": "execute-api" + }, + "controltower": { + "iamPrefix": "controltower" + }, + "cost-and-usage-report-service": { + "iamPrefix": "cur" + }, + "cost-explorer": { + "iamPrefix": "ce" + }, + "customer-profiles": { + "iamPrefix": "profile" + }, + "data-pipeline": { + "iamPrefix": "datapipeline" + }, + "database-migration-service": { + "iamPrefix": "dms" + }, + "databrew": { + "iamPrefix": "databrew" + }, + "dataexchange": { + "iamPrefix": "dataexchange" + }, + "datasync": { + "iamPrefix": "datasync" + }, + "dax": { + "iamPrefix": "dax" + }, + "detective": { + "iamPrefix": "detective" + }, + "device-farm": { + "iamPrefix": "devicefarm" + }, + "devops-guru": { + "iamPrefix": "devops-guru" + }, + "direct-connect": { + "iamPrefix": "directconnect" + }, + "directory-service": { + "iamPrefix": "ds" + }, + "dlm": { + "iamPrefix": "dlm" + }, + "docdb-elastic": { + "iamPrefix": "docdb-elastic" + }, + "docdb": { + "iamPrefix": "rds" + }, + "drs": { + "iamPrefix": "drs" + }, + "dynamodb-streams": { + "iamPrefix": "dynamodb" + }, + "dynamodb": { + "iamPrefix": "dynamodb" + }, + "ebs": { + "iamPrefix": "ebs" + }, + "ec2-instance-connect": { + "iamPrefix": "ec2-instance-connect" + }, + "ec2": { + "iamPrefix": "ec2" + }, + "ecr-public": { + "iamPrefix": "ecr-public" + }, + "ecr": { + "iamPrefix": "ecr" + }, + "ecs": { + "iamPrefix": "ecs", + "commands": [ + "ExecuteCommand" + ] + }, + "efs": { + "iamPrefix": "elasticfilesystem" + }, + "eks": { + "iamPrefix": "eks" + }, + "elastic-beanstalk": { + "iamPrefix": "elasticbeanstalk" + }, + "elastic-inference": { + "iamPrefix": "elastic-inference" + }, + "elastic-load-balancing-v2": { + "iamPrefix": "elasticloadbalancing" + }, + "elastic-load-balancing": { + "iamPrefix": "elasticloadbalancing" + }, + "elastic-transcoder": { + "iamPrefix": "elastictranscoder" + }, + "elasticache": { + "iamPrefix": "elasticache" + }, + "elasticsearch-service": { + "iamPrefix": "es" + }, + "emr-containers": { + "iamPrefix": "emr-containers" + }, + "emr-serverless": { + "iamPrefix": "emr-serverless" + }, + "emr": { + "iamPrefix": "elasticmapreduce" + }, + "entityresolution": { + "iamPrefix": "entityresolution" + }, + "eventbridge": { + "iamPrefix": "events" + }, + "evidently": { + "iamPrefix": "evidently" + }, + "finspace-data": { + "iamPrefix": "finspace-api" + }, + "finspace": { + "iamPrefix": "finspace" + }, + "firehose": { + "iamPrefix": "firehose" + }, + "fis": { + "iamPrefix": "fis" + }, + "fms": { + "iamPrefix": "fms" + }, + "forecast": { + "iamPrefix": "forecast" + }, + "forecastquery": { + "iamPrefix": "forecast" + }, + "frauddetector": { + "iamPrefix": "frauddetector" + }, + "fsx": { + "iamPrefix": "fsx" + }, + "gamelift": { + "iamPrefix": "gamelift" + }, + "gamesparks": { + "iamPrefix": "gamesparks" + }, + "glacier": { + "iamPrefix": "glacier" + }, + "global-accelerator": { + "iamPrefix": "globalaccelerator" + }, + "glue": { + "iamPrefix": "glue" + }, + "grafana": { + "iamPrefix": "grafana" + }, + "greengrass": { + "iamPrefix": "greengrass" + }, + "greengrassv2": { + "iamPrefix": "greengrass" + }, + "groundstation": { + "iamPrefix": "groundstation" + }, + "guardduty": { + "iamPrefix": "guardduty" + }, + "health": { + "iamPrefix": "health" + }, + "healthlake": { + "iamPrefix": "healthlake" + }, + "honeycode": { + "iamPrefix": "honeycode" + }, + "iam": { + "iamPrefix": "iam" + }, + "identitystore": { + "iamPrefix": "identitystore" + }, + "imagebuilder": { + "iamPrefix": "imagebuilder" + }, + "inspector": { + "iamPrefix": "inspector" + }, + "inspector2": { + "iamPrefix": "inspector2" + }, + "internetmonitor": { + "iamPrefix": "internetmonitor" + }, + "iot-1click-devices-service": { + "iamPrefix": "iot1click" + }, + "iot-1click-projects": { + "iamPrefix": "iot1click" + }, + "iot-data-plane": { + "iamPrefix": "iotdata" + }, + "iot-events-data": { + "iamPrefix": "ioteventsdata" + }, + "iot-events": { + "iamPrefix": "iotevents" + }, + "iot-jobs-data-plane": { + "iamPrefix": "iot-jobs-data" + }, + "iot-roborunner": { + "iamPrefix": "iotroborunner" + }, + "iot-wireless": { + "iamPrefix": "iotwireless" + }, + "iot": { + "iamPrefix": "iot" + }, + "iotanalytics": { + "iamPrefix": "iotanalytics" + }, + "iotdeviceadvisor": { + "iamPrefix": "iotdeviceadvisor" + }, + "iotfleethub": { + "iamPrefix": "iotfleethub" + }, + "iotfleetwise": { + "iamPrefix": "iotfleetwise" + }, + "iotsecuretunneling": { + "iamPrefix": "IoTSecuredTunneling" + }, + "iotsitewise": { + "iamPrefix": "iotsitewise" + }, + "iotthingsgraph": { + "iamPrefix": "iotthingsgraph" + }, + "iottwinmaker": { + "iamPrefix": "iottwinmaker" + }, + "ivs-realtime": { + "iamPrefix": "ivs" + }, + "ivs": { + "iamPrefix": "ivs" + }, + "ivschat": { + "iamPrefix": "ivschat" + }, + "kafka": { + "iamPrefix": "kafka" + }, + "kafkaconnect": { + "iamPrefix": "kafkaconnect" + }, + "kendra-ranking": { + "iamPrefix": "kendra-ranking" + }, + "kendra": { + "iamPrefix": "kendra" + }, + "keyspaces": { + "iamPrefix": "cassandra" + }, + "kinesis-analytics-v2": { + "iamPrefix": "kinesisanalytics" + }, + "kinesis-analytics": { + "iamPrefix": "kinesisanalytics" + }, + "kinesis-video-archived-media": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-media": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-signaling": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video-webrtc-storage": { + "iamPrefix": "kinesisvideo" + }, + "kinesis-video": { + "iamPrefix": "kinesisvideo" + }, + "kinesis": { + "iamPrefix": "kinesis" + }, + "kms": { + "iamPrefix": "kms" + }, + "lakeformation": { + "iamPrefix": "lakeformation" + }, + "lambda": { + "iamPrefix": "lambda" + }, + "lex-model-building-service": { + "iamPrefix": "lex" + }, + "lex-models-v2": { + "iamPrefix": "lex" + }, + "lex-runtime-service": { + "iamPrefix": "lex" + }, + "lex-runtime-v2": { + "iamPrefix": "lex" + }, + "license-manager-linux-subscriptions": { + "iamPrefix": "license-manager-linux-subscriptions" + }, + "license-manager-user-subscriptions": { + "iamPrefix": "license-manager-user-subscriptions" + }, + "license-manager": { + "iamPrefix": "license-manager" + }, + "lightsail": { + "iamPrefix": "lightsail" + }, + "location": { + "iamPrefix": "geo" + }, + "lookoutequipment": { + "iamPrefix": "lookoutequipment" + }, + "lookoutmetrics": { + "iamPrefix": "lookoutmetrics" + }, + "lookoutvision": { + "iamPrefix": "lookoutvision" + }, + "m2": { + "iamPrefix": "m2" + }, + "machine-learning": { + "iamPrefix": "machinelearning" + }, + "macie": { + "iamPrefix": "macie" + }, + "macie2": { + "iamPrefix": "macie2" + }, + "managedblockchain-query": { + "iamPrefix": "managedblockchain-query" + }, + "managedblockchain": { + "iamPrefix": "managedblockchain" + }, + "marketplace-catalog": { + "iamPrefix": "aws-marketplace" + }, + "marketplace-commerce-analytics": { + "iamPrefix": "marketplacecommerceanalytics" + }, + "marketplace-entitlement-service": { + "iamPrefix": "aws-marketplace" + }, + "marketplace-metering": { + "iamPrefix": "aws-marketplace" + }, + "mediaconnect": { + "iamPrefix": "mediaconnect" + }, + "mediaconvert": { + "iamPrefix": "mediaconvert" + }, + "medialive": { + "iamPrefix": "medialive" + }, + "mediapackage-vod": { + "iamPrefix": "mediapackage-vod" + }, + "mediapackage": { + "iamPrefix": "mediapackage" + }, + "mediapackagev2": { + "iamPrefix": "mediapackagev2" + }, + "mediastore-data": { + "iamPrefix": "mediastore" + }, + "mediastore": { + "iamPrefix": "mediastore" + }, + "mediatailor": { + "iamPrefix": "mediatailor" + }, + "medical-imaging": { + "iamPrefix": "medical-imaging" + }, + "memorydb": { + "iamPrefix": "memorydb" + }, + "mgn": { + "iamPrefix": "mgn" + }, + "migration-hub-refactor-spaces": { + "iamPrefix": "refactor-spaces" + }, + "migration-hub": { + "iamPrefix": "mgh" + }, + "migrationhub-config": { + "iamPrefix": "mgh" + }, + "migrationhuborchestrator": { + "iamPrefix": "migrationhub-orchestrator" + }, + "migrationhubstrategy": { + "iamPrefix": "migrationhub-strategy" + }, + "mobile": { + "iamPrefix": "AWSMobileHubService" + }, + "mq": { + "iamPrefix": "mq" + }, + "mturk": { + "iamPrefix": "mturk-requester" + }, + "mwaa": { + "iamPrefix": "airflow" + }, + "neptune": { + "iamPrefix": "rds" + }, + "neptunedata": { + "iamPrefix": "neptune-db" + }, + "network-firewall": { + "iamPrefix": "network-firewall" + }, + "networkmanager": { + "iamPrefix": "networkmanager" + }, + "nimble": { + "iamPrefix": "nimble" + }, + "oam": { + "iamPrefix": "oam" + }, + "omics": { + "iamPrefix": "omics" + }, + "opensearch": { + "iamPrefix": "es" + }, + "opensearchserverless": { + "iamPrefix": "aoss" + }, + "opsworks": { + "iamPrefix": "opsworks" + }, + "opsworkscm": { + "iamPrefix": "opsworks-cm" + }, + "organizations": { + "iamPrefix": "organizations" + }, + "osis": { + "iamPrefix": "osis" + }, + "outposts": { + "iamPrefix": "outposts" + }, + "panorama": { + "iamPrefix": "panorama" + }, + "payment-cryptography-data": { + "iamPrefix": "payment-cryptography" + }, + "payment-cryptography": { + "iamPrefix": "payment-cryptography" + }, + "pca-connector-ad": { + "iamPrefix": "pca-connector-ad" + }, + "personalize-events": { + "iamPrefix": "personalize" + }, + "personalize-runtime": { + "iamPrefix": "personalize" + }, + "personalize": { + "iamPrefix": "personalize" + }, + "pi": { + "iamPrefix": "pi" + }, + "pinpoint-email": { + "iamPrefix": "ses" + }, + "pinpoint-sms-voice-v2": { + "iamPrefix": "sms-voice" + }, + "pinpoint-sms-voice": { + "iamPrefix": "sms-voice" + }, + "pinpoint": { + "iamPrefix": "mobiletargeting" + }, + "pipes": { + "iamPrefix": "pipes" + }, + "polly": { + "iamPrefix": "polly" + }, + "pricing": { + "iamPrefix": "pricing" + }, + "privatenetworks": { + "iamPrefix": "private-networks" + }, + "proton": { + "iamPrefix": "proton" + }, + "qldb-session": { + "iamPrefix": "qldb", + "commands": [ + "SendCommand" + ] + }, + "qldb": { + "iamPrefix": "qldb" + }, + "quicksight": { + "iamPrefix": "quicksight" + }, + "ram": { + "iamPrefix": "ram" + }, + "rbin": { + "iamPrefix": "rbin" + }, + "rds-data": { + "iamPrefix": "rds-data" + }, + "rds": { + "iamPrefix": "rds" + }, + "redshift-data": { + "iamPrefix": "redshift-data" + }, + "redshift-serverless": { + "iamPrefix": "redshift-serverless" + }, + "redshift": { + "iamPrefix": "redshift" + }, + "rekognition": { + "iamPrefix": "rekognition" + }, + "rekognitionstreaming": { + "iamPrefix": "rekognition" + }, + "resiliencehub": { + "iamPrefix": "resiliencehub" + }, + "resource-explorer-2": { + "iamPrefix": "resource-explorer-2" + }, + "resource-groups-tagging-api": { + "iamPrefix": "tagging" + }, + "resource-groups": { + "iamPrefix": "resource-groups" + }, + "robomaker": { + "iamPrefix": "robomaker" + }, + "rolesanywhere": { + "iamPrefix": "rolesanywhere" + }, + "route-53-domains": { + "iamPrefix": "route53domains" + }, + "route-53": { + "iamPrefix": "route53" + }, + "route53-recovery-cluster": { + "iamPrefix": "route53-recovery-cluster" + }, + "route53-recovery-control-config": { + "iamPrefix": "route53-recovery-control-config" + }, + "route53-recovery-readiness": { + "iamPrefix": "route53-recovery-readiness" + }, + "route53resolver": { + "iamPrefix": "route53resolver" + }, + "rum": { + "iamPrefix": "rum" + }, + "s3-control": { + "iamPrefix": "s3" + }, + "s3": { + "iamPrefix": "s3" + }, + "s3outposts": { + "iamPrefix": "s3-outposts" + }, + "sagemaker-a2i-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker-edge": { + "iamPrefix": "sagemaker" + }, + "sagemaker-featurestore-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker-geospatial": { + "iamPrefix": "sagemaker-geospatial" + }, + "sagemaker-metrics": { + "iamPrefix": "sagemaker" + }, + "sagemaker-runtime": { + "iamPrefix": "sagemaker" + }, + "sagemaker": { + "iamPrefix": "sagemaker" + }, + "savingsplans": { + "iamPrefix": "savingsplans" + }, + "scheduler": { + "iamPrefix": "scheduler" + }, + "schemas": { + "iamPrefix": "schemas" + }, + "secrets-manager": { + "iamPrefix": "secretsmanager" + }, + "securityhub": { + "iamPrefix": "securityhub" + }, + "securitylake": { + "iamPrefix": "securitylake" + }, + "serverlessapplicationrepository": { + "iamPrefix": "serverlessrepo" + }, + "service-catalog-appregistry": { + "iamPrefix": "servicecatalog" + }, + "service-catalog": { + "iamPrefix": "servicecatalog" + }, + "service-quotas": { + "iamPrefix": "servicequotas" + }, + "servicediscovery": { + "iamPrefix": "servicediscovery" + }, + "ses": { + "iamPrefix": "ses" + }, + "sesv2": { + "iamPrefix": "ses" + }, + "sfn": { + "iamPrefix": "states" + }, + "shield": { + "iamPrefix": "shield" + }, + "signer": { + "iamPrefix": "signer" + }, + "simspaceweaver": { + "iamPrefix": "simspaceweaver" + }, + "sms": { + "iamPrefix": "sms" + }, + "snow-device-management": { + "iamPrefix": "snow-device-management" + }, + "snowball": { + "iamPrefix": "snowball" + }, + "sns": { + "iamPrefix": "sns" + }, + "sqs": { + "iamPrefix": "sqs" + }, + "ssm-contacts": { + "iamPrefix": "ssm-contacts" + }, + "ssm-incidents": { + "iamPrefix": "ssm-incidents" + }, + "ssm-sap": { + "iamPrefix": "ssm-sap" + }, + "ssm": { + "iamPrefix": "ssm", + "commands": [ + "CancelCommand", + "SendCommand" + ] + }, + "sso-admin": { + "iamPrefix": "sso" + }, + "sso-oidc": { + "iamPrefix": "awsssooidc" + }, + "sso": { + "iamPrefix": "awsssoportal" + }, + "storage-gateway": { + "iamPrefix": "storagegateway" + }, + "sts": { + "iamPrefix": "sts" + }, + "support-app": { + "iamPrefix": "supportapp" + }, + "support": { + "iamPrefix": "support" + }, + "swf": { + "iamPrefix": "swf" + }, + "synthetics": { + "iamPrefix": "synthetics" + }, + "textract": { + "iamPrefix": "textract" + }, + "timestream-query": { + "iamPrefix": "timestream" + }, + "timestream-write": { + "iamPrefix": "timestream" + }, + "tnb": { + "iamPrefix": "tnb" + }, + "transcribe-streaming": { + "iamPrefix": "transcribe" + }, + "transcribe": { + "iamPrefix": "transcribe" + }, + "transfer": { + "iamPrefix": "transfer" + }, + "translate": { + "iamPrefix": "translate" + }, + "verifiedpermissions": { + "iamPrefix": "verifiedpermissions" + }, + "voice-id": { + "iamPrefix": "voiceid" + }, + "vpc-lattice": { + "iamPrefix": "vpc-lattice" + }, + "waf-regional": { + "iamPrefix": "waf-regional" + }, + "waf": { + "iamPrefix": "waf" + }, + "wafv2": { + "iamPrefix": "wafv2" + }, + "wellarchitected": { + "iamPrefix": "wellarchitected" + }, + "wisdom": { + "iamPrefix": "wisdom" + }, + "workdocs": { + "iamPrefix": "workdocs" + }, + "worklink": { + "iamPrefix": "worklink" + }, + "workmail": { + "iamPrefix": "workmail" + }, + "workmailmessageflow": { + "iamPrefix": "workmailmessageflow" + }, + "workspaces-web": { + "iamPrefix": "workspaces-web" + }, + "workspaces": { + "iamPrefix": "workspaces" + }, + "xray": { + "iamPrefix": "xray" + } +} \ No newline at end of file diff --git a/packages/aws-cdk-lib/package.json b/packages/aws-cdk-lib/package.json index bbcac3151d921..ddb65b656f366 100644 --- a/packages/aws-cdk-lib/package.json +++ b/packages/aws-cdk-lib/package.json @@ -33,7 +33,6 @@ "compressAssembly": true, "pre": [ "ts-node -P tsconfig.dev.json region-info/build-tools/generate-static-data.ts", - "(cp -f $(node -p 'require.resolve(\"aws-sdk/apis/metadata.json\")') custom-resources/lib/aws-custom-resource/sdk-api-metadata.json && rm -rf custom-resources/test/aws-custom-resource/cdk.out)", "(rm -rf core/test/fs/fixtures && cd core/test/fs && tar -xzf fixtures.tar.gz)", "(rm -rf assets/test/fs/fixtures && cd assets/test/fs && tar -xzvf fixtures.tar.gz)", "./scripts/airlift-custom-resource-handlers.sh" @@ -474,6 +473,7 @@ "./core": "./core/index.js", "./core/lib/helpers-internal": "./core/lib/helpers-internal/index.js", "./custom-resources": "./custom-resources/index.js", + "./custom-resources/lib/helpers-internal": "./custom-resources/lib/helpers-internal/index.js", "./cx-api": "./cx-api/index.js", "./lambda-layer-awscli": "./lambda-layer-awscli/index.js", "./lambda-layer-kubectl": "./lambda-layer-kubectl/index.js", diff --git a/scripts/update-sdkv3-parameters-model.sh b/scripts/update-sdkv3-parameters-model.sh index cfb325e424246..da2c899ddd3fb 100755 --- a/scripts/update-sdkv3-parameters-model.sh +++ b/scripts/update-sdkv3-parameters-model.sh @@ -4,7 +4,6 @@ scriptdir=$(cd $(dirname $0) && pwd) tmpdir=$(mktemp -d) zip=https://github.com/aws/aws-sdk-js-v3/archive/refs/heads/main.zip ziprootentry=aws-sdk-js-v3-main -target_file=packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/parameter-types.ts smithy_subdir=codegen/sdk-codegen/aws-models # Use the GitHub feature to download a zip archive of the current state of a branch @@ -14,7 +13,7 @@ curl -SfL -o $tmpdir/main.zip "$zip" (cd $tmpdir && unzip -q main.zip) echo "🖨️ Generating..." -npx ts-node $scriptdir/update-sdkv3-parameters-model.ts $tmpdir/$ziprootentry/$smithy_subdir > "$target_file" +npx ts-node $scriptdir/update-sdkv3-parameters-model.ts $tmpdir/$ziprootentry/$smithy_subdir echo "🚮 Cleaning up..." rm -rf $tmpdir diff --git a/scripts/update-sdkv3-parameters-model.ts b/scripts/update-sdkv3-parameters-model.ts index bd1888483e617..51e5612bf12ec 100644 --- a/scripts/update-sdkv3-parameters-model.ts +++ b/scripts/update-sdkv3-parameters-model.ts @@ -1,6 +1,14 @@ /** - * From the SDKv3 repository, build an index of all types that are are "Blob"s or numbers, - * so we can properly convert input strings to the right type. + * From the SDKv3 repository, extract important information. + * + * We extract two bits of information: + * + * - An index of all types that are are "Blob"s or numbers, so we can properly + * convert input strings to the right type. + * - We also extract an index of service names with mappings between SDKv2 and SDKv3 + * names, and their IAM names. + * + * ## Type index * * This is necessary for backwards compatibiltiy with SDKv2 which used to accept string * arguments liberally, but SDKv3 no longer does so we need to do the conversion ourselves. @@ -23,6 +31,10 @@ * * We save a gzipped representation of this state machine to save bytes (the full decoded * model is ~300kB and we don't want to ship that for every custom resource). + * + * ## Service name index + * + * Just a plain JSON map. */ import * as path from 'path'; import * as zlib from 'zlib'; @@ -41,6 +53,7 @@ async function main(argv: string[]) { idToNumber: new Map(), stateMachine: [{}], }; + const allServices: Record = {}; for (const entry of await fs.readdir(dir, { withFileTypes: true, encoding: 'utf-8' })) { if (entry.isFile() && entry.name.endsWith('.json')) { @@ -50,7 +63,11 @@ async function main(argv: string[]) { continue; } try { - await doFile(builder, contents); + const v3Name = entry.name.replace(/\.json$/, ''); + const serviceInfo: ServiceInfo = {}; + + await doFile(v3Name, builder, serviceInfo, contents); + allServices[v3Name] = serviceInfo; } catch (e) { throw new Error(`Error handling ${entry.name}: ${e}`); } @@ -66,26 +83,32 @@ async function main(argv: string[]) { if (process.env.DEBUG) { console.error(JSON.stringify(sortedStateMachine, undefined, 2)); } - renderStateMachineToTypeScript(sortedStateMachine); + + const root = path.resolve(__dirname, '..'); + await renderStateMachineToTypeScript(sortedStateMachine, path.join(root, 'packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/parameter-types.ts')); + + await writeAllServiceToModelFile(allServices, [ + path.join(root, 'packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-v3-metadata.json'), + path.join(root, 'packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-v3-metadata.json'), + ]); + await writeV2ToV3Mapping([ + path.join(root, 'packages/aws-cdk-lib/custom-resources/lib/aws-custom-resource/sdk-v2-to-v3.json'), + path.join(root, 'packages/@aws-cdk/sdk-v2-to-v3-adapter/lib/sdk-v2-to-v3.json'), + ]); } /** * Recurse through all the types of a singly Smithy model, and record the blobs */ -async function doFile(builder: StateMachineBuilder, model: SmithyFile) { +async function doFile(v3Name: string, builder: StateMachineBuilder, serviceInfo: ServiceInfo, model: SmithyFile) { const shapes = model.shapes; const service = Object.values(shapes).find(isShape('service')); if (!service) { throw new Error('Did not find service'); } - const _shortName = (service.traits?.['aws.api#service']?.arnNamespace - ?? service.traits?.['aws.api#service']?.endpointPrefix - ?? service.traits?.['aws.auth#sigv4']?.name); - if (!_shortName) { - throw new Error('Service does not have shortname'); - } - const shortName = _shortName; + + serviceInfo.iamPrefix = service.traits?.['aws.auth#sigv4']?.name; // Sort operations so we have a stable order to minimize future diffs const operations = service.operations ?? []; @@ -98,8 +121,13 @@ async function doFile(builder: StateMachineBuilder, model: SmithyFile) { } if (operation.input) { const [, opName] = operationTarget.target.split('#'); + + if (opName.endsWith('Command')) { + serviceInfo.commands = (serviceInfo.commands ?? []).concat(opName); + } + recurse([ - { fieldName: shortName, id: `service#${shortName}` }, // Only needs to be unique + { fieldName: v3Name, id: `service#${v3Name}` }, // Only needs to be unique { fieldName: opName.toLowerCase(), id: operation.input.target }, // Operation ]); } @@ -179,7 +207,7 @@ async function doFile(builder: StateMachineBuilder, model: SmithyFile) { } } -function renderStateMachineToTypeScript(sm: TypeCoercionStateMachine) { +async function renderStateMachineToTypeScript(sm: TypeCoercionStateMachine, filename: string) { const stringified = JSON.stringify(sm); const compressed = zlib.brotliCompressSync(Buffer.from(stringified)); @@ -198,7 +226,41 @@ function renderStateMachineToTypeScript(sm: TypeCoercionStateMachine) { '};', ); - console.log(lines.join('\n')); + await fs.writeFile(filename, lines.join('\n'), { encoding: 'utf-8' }); +} + +async function writeAllServiceToModelFile(allServices: Record, filenames: string[]) { + for (const filename of filenames) { + await fs.writeFile(filename, JSON.stringify(allServices, undefined, 2), { encoding: 'utf-8' }); + } +} + +/** + * Read the V2 to V3 mapping from https://github.com/awslabs/aws-sdk-js-codemod/blob/main/src/transforms/v2-to-v3/config/CLIENT_PACKAGE_NAMES_MAP.ts + * and save it to a file + */ +async function writeV2ToV3Mapping(filenames: string[]) { + const { CLIENT_PACKAGE_NAMES_MAP } = require('aws-sdk-js-codemod/dist/transforms/v2-to-v3/config/CLIENT_PACKAGE_NAMES_MAP'); + // Looks like: + // + // { ACM: 'client-acm', ACMPCA: 'client-acm-pca', APIGateway: 'client-api-gateway', ... } + // + // Transform into: + // + // { acmpca: 'acm-pca', apigateway: 'api-gateway' } + // + // etc. I.e., lowercase everything and remove idempotent mappings. + + const simplifiedMap = Object.fromEntries(Object.entries(CLIENT_PACKAGE_NAMES_MAP).flatMap(([key, value]) => { + const newKey = key.toLowerCase(); + const newValue = (value as string).replace(/^client-/, ''); + + return newKey !== newValue ? [[newKey, newValue]] : []; + })); + + for (const filename of filenames) { + await fs.writeFile(filename, JSON.stringify(simplifiedMap, undefined, 2), { encoding: 'utf-8' }); + } } interface PathElement { @@ -214,7 +276,7 @@ type TypeCoercionState = Record; interface StateMachineBuilder { idToNumber: Map; stateMachine: TypeCoercionStateMachine; -}; +} interface SmithyFile { shapes: Record; @@ -246,6 +308,14 @@ interface SmithyTraits { }; } +interface ServiceInfo { + /** IAM policy prefix for Actions in this service */ + iamPrefix?: string; + /** If this service has any API calls that end in the word 'Command', list them here. Need this for backwards compat. */ + commands?: string[]; +} + + function isShape(key: A) { return (x: SmithyShape): x is Extract => x.type === key; } diff --git a/yarn.lock b/yarn.lock index 90d0d5ceae99a..7bb49685dd54c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1818,6 +1818,27 @@ json5 "^2.2.3" semver "^6.3.1" +"@babel/core@^7.13.16": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz#f8259ae0e52a123eb40f552551e647b506a94d83" + integrity sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.0" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + 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.22.15", "@babel/generator@^7.7.2": version "7.22.15" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz#1564189c7ec94cb8f77b5e8a90c4d200d21b2339" @@ -1828,6 +1849,23 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" +"@babel/generator@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420" + integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g== + dependencies: + "@babel/types" "^7.23.0" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-compilation-targets@^7.22.15": version "7.22.15" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" @@ -1839,7 +1877,22 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-environment-visitor@^7.22.20": +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== @@ -1852,6 +1905,14 @@ "@babel/template" "^7.22.5" "@babel/types" "^7.22.5" +"@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" + "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" @@ -1859,6 +1920,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== + dependencies: + "@babel/types" "^7.23.0" + "@babel/helper-module-imports@^7.22.15": version "7.22.15" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" @@ -1877,11 +1945,38 @@ "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" -"@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.22.5", "@babel/helper-plugin-utils@^7.8.0": +"@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@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.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== +"@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" @@ -1889,6 +1984,13 @@ dependencies: "@babel/types" "^7.22.5" +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" @@ -1920,6 +2022,15 @@ "@babel/traverse" "^7.22.15" "@babel/types" "^7.22.15" +"@babel/helpers@^7.23.0": + version "7.23.1" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz#44e981e8ce2b9e99f8f0b703f3326a4636c16d15" + integrity sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.0" + "@babel/types" "^7.23.0" + "@babel/highlight@^7.10.4", "@babel/highlight@^7.22.13": version "7.22.20" resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" @@ -1934,6 +2045,36 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz#180aead7f247305cce6551bea2720934e2fa2c95" integrity sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA== +"@babel/parser@^7.13.16", "@babel/parser@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" + integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== + +"@babel/plugin-proposal-class-properties@^7.13.0": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" @@ -1955,6 +2096,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.12.13" +"@babel/plugin-syntax-flow@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859" + integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" @@ -1969,7 +2117,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.7.2": +"@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.7.2": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918" integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== @@ -2025,13 +2173,71 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.7.2": +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": version "7.22.5" resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272" integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== dependencies: "@babel/helper-plugin-utils" "^7.22.5" +"@babel/plugin-transform-flow-strip-types@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2" + integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481" + integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ== + dependencies: + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz#15adef906451d86349eb4b8764865c960eb54127" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/preset-flow@^7.13.13": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.22.15.tgz#30318deb9b3ebd9f5738e96da03a531e0cd3165d" + integrity sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-flow-strip-types" "^7.22.5" + +"@babel/preset-typescript@^7.13.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz#cc6602d13e7e5b2087c811912b87cf937a9129d9" + integrity sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.23.0" + "@babel/plugin-transform-typescript" "^7.22.15" + +"@babel/register@^7.13.16": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz#c2c294a361d59f5fa7bcc8b97ef7319c32ecaec7" + integrity sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg== + dependencies: + clone-deep "^4.0.1" + find-cache-dir "^2.0.0" + make-dir "^2.1.0" + pirates "^4.0.5" + source-map-support "^0.5.16" + "@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": version "7.22.15" resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -2057,6 +2263,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz#18196ddfbcf4ccea324b7f6d3ada00d8c5a99c53" + integrity sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.0" + "@babel/types" "^7.23.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3": version "7.22.19" resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.19.tgz#7425343253556916e440e662bb221a93ddb75684" @@ -2066,6 +2288,15 @@ "@babel/helper-validator-identifier" "^7.22.19" to-fast-properties "^2.0.0" +"@babel/types@^7.23.0": + version "7.23.0" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" + integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@balena/dockerignore@^1.0.2": version "1.0.2" resolved "https://registry.npmjs.org/@balena/dockerignore/-/dockerignore-1.0.2.tgz#9ffe4726915251e8eb69f44ef3547e0da2c03e0d" @@ -4862,6 +5093,17 @@ asap@^2.0.0: resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== +assert@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz#6d92a238d05dc02e7427c881fb8be81c8448b2dd" + integrity sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw== + dependencies: + call-bind "^1.0.2" + is-nan "^1.3.2" + object-is "^1.1.5" + object.assign "^4.1.4" + util "^0.12.5" + ast-module-types@^2.7.1: version "2.7.1" resolved "https://registry.npmjs.org/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3" @@ -4879,6 +5121,13 @@ ast-types@^0.13.4: dependencies: tslib "^2.0.1" +ast-types@^0.16.1: + version "0.16.1" + resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz#7a9da1617c9081bc121faafe91711b4c8bb81da2" + integrity sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg== + dependencies: + tslib "^2.0.1" + astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -4921,6 +5170,13 @@ aws-sdk-client-mock@^3.0.0: sinon "^14.0.2" tslib "^2.1.0" +aws-sdk-js-codemod@^0.18.3: + version "0.18.3" + resolved "https://registry.npmjs.org/aws-sdk-js-codemod/-/aws-sdk-js-codemod-0.18.3.tgz#5f1df84c24c23243ed3952deb18da382580cee3c" + integrity sha512-Bp1/RO+4DAla3am/dfhjQoqvGb6DU9VjldO/sZTxQHumff/RD7yvlfnZ7GoX0d9mPg6NfgCqJ66LrUH6WueAXg== + dependencies: + jscodeshift "0.15.0" + aws-sdk-mock@5.6.0: version "5.6.0" resolved "https://registry.npmjs.org/aws-sdk-mock/-/aws-sdk-mock-5.6.0.tgz#8cd44e2e8d65f7f38dea8d1ad073fa38f9c719d8" @@ -4972,6 +5228,11 @@ axios@^1.0.0: form-data "^4.0.0" proxy-from-env "^1.1.0" +babel-core@^7.0.0-bridge.0: + version "7.0.0-bridge.0" + resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" + integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== + babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" @@ -7039,7 +7300,7 @@ espree@^9.6.0, espree@^9.6.1: acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -7301,6 +7562,15 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +find-cache-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + find-cache-dir@^3.2.0: version "3.3.2" resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" @@ -7371,6 +7641,11 @@ flatten@^1.0.2: resolved "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz#c1283ac9f27b368abc1e36d1ff7b04501a30356b" integrity sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg== +flow-parser@0.*: + version "0.217.0" + resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.217.0.tgz#0e6bed214151fa3240dc9fd83ac8a9e050e523c5" + integrity sha512-hEa5n0dta1RcaDwJDWbnyelw07PK7+Vx0f9kDht28JOt2hXgKdKGaT3wM45euWV2DxOXtzDSTaUgGSD/FPvC2Q== + fn.name@1.x.x: version "1.1.0" resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" @@ -8408,6 +8683,14 @@ is-lambda@^1.0.1: resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== +is-nan@^1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -9187,6 +9470,31 @@ js-yaml@^3.10.0, js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jscodeshift@0.15.0: + version "0.15.0" + resolved "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.0.tgz#32fc8d90193d17cdf1b34604496922838500b51f" + integrity sha512-t337Wx7Vy1ffhas7E1KZUHaR9YPdeCfxPvxz9k6DKwYW88pcs1piR1eR9d+7GQZGSQIZd6a+cfIM3XpMe9rFKQ== + dependencies: + "@babel/core" "^7.13.16" + "@babel/parser" "^7.13.16" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.13.8" + "@babel/plugin-proposal-optional-chaining" "^7.13.12" + "@babel/plugin-transform-modules-commonjs" "^7.13.8" + "@babel/preset-flow" "^7.13.13" + "@babel/preset-typescript" "^7.13.0" + "@babel/register" "^7.13.16" + babel-core "^7.0.0-bridge.0" + chalk "^4.1.2" + flow-parser "0.*" + graceful-fs "^4.2.4" + micromatch "^4.0.4" + neo-async "^2.5.0" + node-dir "^0.1.17" + recast "^0.23.1" + temp "^0.8.4" + write-file-atomic "^2.3.0" + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -10026,7 +10334,7 @@ make-dir@4.0.0, make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-dir@^2.1.0: +make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== @@ -10260,7 +10568,7 @@ minimatch@3.0.5: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -10493,7 +10801,7 @@ negotiator@^0.6.3: resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.6.2: +neo-async@^2.5.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -10550,6 +10858,13 @@ node-addon-api@^3.2.1: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== +node-dir@^0.1.17: + version "0.1.17" + resolved "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" + integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== + dependencies: + minimatch "^3.0.2" + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -11101,6 +11416,14 @@ object-inspect@^1.12.3, object-inspect@^1.9.0: resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + object-keys@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -11631,11 +11954,18 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.4: +pirates@^4.0.4, pirates@^4.0.5: version "4.0.6" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + pkg-dir@^4.1.0, pkg-dir@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -12102,6 +12432,17 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +recast@^0.23.1: + version "0.23.4" + resolved "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz#ca1bac7bfd3011ea5a28dfecb5df678559fb1ddf" + integrity sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw== + dependencies: + assert "^2.0.0" + ast-types "^0.16.1" + esprima "~4.0.0" + source-map "~0.6.1" + tslib "^2.0.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -12289,6 +12630,13 @@ rimraf@^5.0.1: dependencies: glob "^10.2.5" +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + run-async@^2.4.0: version "2.4.1" resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -12655,7 +13003,7 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-support@^0.5.21: +source-map-support@^0.5.16, source-map-support@^0.5.21: version "0.5.21" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -13079,6 +13427,13 @@ temp-dir@^2.0.0: resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== +temp@^0.8.4: + version "0.8.4" + resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" + integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== + dependencies: + rimraf "~2.6.2" + temp@~0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/temp/-/temp-0.4.0.tgz#671ad63d57be0fe9d7294664b3fc400636678a60" @@ -13601,7 +13956,7 @@ util-extend@^1.0.1: resolved "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" integrity sha512-mLs5zAK+ctllYBj+iAQvlDCwoxU/WDOUaJkcFudeiAX6OajC6BKXJUa9a+tbtkC11dz2Ufb7h0lyvIOVn4LADA== -util@^0.12.4: +util@^0.12.4, util@^0.12.5: version "0.12.5" resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== @@ -13875,7 +14230,7 @@ write-file-atomic@5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -write-file-atomic@^2.4.2: +write-file-atomic@^2.3.0, write-file-atomic@^2.4.2: version "2.4.3" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==