UNPKG

@aws-cdk/aws-s3tables-alpha

Version:

CDK Constructs for S3 Tables

261 lines 37.2 kB
"use strict"; var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) { function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; } var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value"; var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null; var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {}); var _, done = false; for (var i = decorators.length - 1; i >= 0; i--) { var context = {}; for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p]; for (var p in contextIn.access) context.access[p] = contextIn.access[p]; context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); }; var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context); if (kind === "accessor") { if (result === void 0) continue; if (result === null || typeof result !== "object") throw new TypeError("Object expected"); if (_ = accept(result.get)) descriptor.get = _; if (_ = accept(result.set)) descriptor.set = _; if (_ = accept(result.init)) initializers.unshift(_); } else if (_ = accept(result)) { if (kind === "field") initializers.unshift(_); else descriptor[key] = _; } } if (target) Object.defineProperty(target, contextIn.name, descriptor); done = true; }; var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) { var useValue = arguments.length > 2; for (var i = 0; i < initializers.length; i++) { value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg); } return useValue ? value : void 0; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.Table = exports.Status = exports.OpenTableFormat = void 0; const jsiiDeprecationWarnings = require("../.warnings.jsii.js"); const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const core_1 = require("aws-cdk-lib/core"); const aws_s3tables_1 = require("aws-cdk-lib/aws-s3tables"); const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource"); const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable"); const iam = require("aws-cdk-lib/aws-iam"); const perms = require("./permissions"); const os_1 = require("os"); /** * Base class for Table implementations. */ class TableBase extends core_1.Resource { addToResourcePolicy(statement) { if (!this.tablePolicy && this.autoCreatePolicy) { this.tablePolicy = new aws_s3tables_1.CfnTablePolicy(this, 'DefaultPolicy', { tableArn: this.tableArn, resourcePolicy: new iam.PolicyDocument({}), }); } if (this.tablePolicy) { this.tablePolicy.resourcePolicy.addStatements(statement); return { statementAdded: true, policyDependable: this.tablePolicy }; } return { statementAdded: false }; } grantRead(identity) { return this.grant(identity, perms.TABLE_READ_ACCESS, this.tableArn); } grantWrite(identity) { return this.grant(identity, perms.TABLE_WRITE_ACCESS, this.tableArn); } grantReadWrite(identity) { return this.grant(identity, perms.TABLE_READ_WRITE_ACCESS, this.tableArn); } /** * Grants the given s3tables permissions to the provided principal * @returns Grant object */ grant(grantee, tableActions, resourceArn, ...otherResourceArns) { const resources = [resourceArn, ...otherResourceArns].filter(arn => arn != undefined); const grant = iam.Grant.addToPrincipalOrResource({ grantee, actions: tableActions, resourceArns: resources, resource: this, }); return grant; } } /** * Supported open table formats. */ var OpenTableFormat; (function (OpenTableFormat) { /** * Apache Iceberg table format. */ OpenTableFormat["ICEBERG"] = "ICEBERG"; })(OpenTableFormat || (exports.OpenTableFormat = OpenTableFormat = {})); /** * Status values for maintenance actions. */ var Status; (function (Status) { /** * Enable the maintenance action. */ Status["ENABLED"] = "enabled"; /** * Disable the maintenance action. */ Status["DISABLED"] = "disabled"; })(Status || (exports.Status = Status = {})); /** * An S3 Table with helpers. */ let Table = (() => { let _classDecorators = [prop_injectable_1.propertyInjectable]; let _classDescriptor; let _classExtraInitializers = []; let _classThis; let _classSuper = TableBase; var Table = class extends _classSuper { static { _classThis = this; } static { const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0; __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers); Table = _classThis = _classDescriptor.value; if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata }); } static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-s3tables-alpha.Table", version: "2.223.0-alpha.0" }; /** Uniquely identifies this class. */ static PROPERTY_INJECTION_ID = '@aws-cdk.aws-s3tables-alpha.Table'; /** * Defines a Table construct that represents an external table. * * @param scope The parent creating construct (usually `this`). * @param id The construct's name. * @param attrs A `TableAttributes` object containing the table name and ARN. */ static fromTableAttributes(scope, id, attrs) { try { jsiiDeprecationWarnings._aws_cdk_aws_s3tables_alpha_TableAttributes(attrs); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, this.fromTableAttributes); } throw error; } const tableArn = attrs.tableArn; Table.validateTableName(attrs.tableName); class Import extends TableBase { tableName = attrs.tableName; tableArn = tableArn; tablePolicy; autoCreatePolicy = false; /** * Exports this from the stack. */ export() { return attrs; } } return new Import(scope, id, { environmentFromArn: tableArn, physicalName: tableArn, }); } /** * See https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-buckets-naming.html * @param tableName Name of the table * @throws UnscopedValidationError if any naming errors are detected */ static validateTableName(tableName) { if (tableName == undefined || core_1.Token.isUnresolved(tableName)) { // the name is a late-bound value, not a defined string, so skip validation return; } const errors = []; // Length validation if (tableName.length < 1 || tableName.length > 255) { errors.push('Table name must be at least 1 and no more than 255 characters'); } // Character set validation const illegalCharsetRegEx = /[^a-z0-9_]/; const allowedEdgeCharsetRegEx = /[a-z0-9]/; const illegalCharMatch = tableName.match(illegalCharsetRegEx); if (illegalCharMatch) { errors.push('Table name must only contain lowercase characters, numbers, and underscores (_)' + ` (offset: ${illegalCharMatch.index})`); } // Edge character validation if (!allowedEdgeCharsetRegEx.test(tableName.charAt(0))) { errors.push('Table name must start with a lowercase letter or number (offset: 0)'); } if (!allowedEdgeCharsetRegEx.test(tableName.charAt(tableName.length - 1))) { errors.push(`Table name must end with a lowercase letter or number (offset: ${tableName.length - 1})`); } if (errors.length > 0) { throw new core_1.UnscopedValidationError(`Invalid S3 table name (value: ${tableName})${os_1.EOL}${errors.join(os_1.EOL)}`); } } /** * The unique Amazon Resource Name (arn) of this table */ tableArn; /** * The underlying CfnTable L1 resource * @internal */ _resource; /** * The name of this table */ tableName; /** * The namespace containing this table */ namespace; /** * The resource policy for this table. */ tablePolicy; autoCreatePolicy = true; constructor(scope, id, props) { super(scope, id, {}); try { jsiiDeprecationWarnings._aws_cdk_aws_s3tables_alpha_TableProps(props); } catch (error) { if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") { Error.captureStackTrace(error, Table); } throw error; } // Enhanced CDK Analytics Telemetry (0, metadata_resource_1.addConstructMetadata)(this, props); Table.validateTableName(props.tableName); this._resource = new aws_s3tables_1.CfnTable(this, id, { tableName: props.tableName, openTableFormat: props.openTableFormat, tableBucketArn: props.namespace.tableBucket.tableBucketArn, namespace: props.namespace.namespaceName, compaction: props.compaction, icebergMetadata: props.icebergMetadata, snapshotManagement: props.snapshotManagement, withoutMetadata: props.withoutMetadata ? 'Yes' : undefined, }); this.namespace = props.namespace; this.tableName = props.tableName; this.tableArn = this._resource.attrTableArn; this._resource.applyRemovalPolicy(props.removalPolicy); this.node.addDependency(this.namespace); } static { __runInitializers(_classThis, _classExtraInitializers); } }; return Table = _classThis; })(); exports.Table = Table; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FNMEI7QUFFMUIsMkRBQW9FO0FBQ3BFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFFMUUsMkNBQTJDO0FBQzNDLHVDQUF1QztBQUN2QywyQkFBeUI7QUFtRnpCOztHQUVHO0FBQ0gsTUFBZSxTQUFVLFNBQVEsZUFBUTtJQWtCaEMsbUJBQW1CLENBQ3hCLFNBQThCO1FBRTlCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSw2QkFBYyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7Z0JBQzNELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsY0FBYyxFQUFFLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7YUFDM0MsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEUsQ0FBQztRQUVELE9BQU8sRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUM7S0FDbEM7SUFFTSxTQUFTLENBQUMsUUFBd0I7UUFDdkMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUNmLFFBQVEsRUFDUixLQUFLLENBQUMsaUJBQWlCLEVBQ3ZCLElBQUksQ0FBQyxRQUFRLENBQ2QsQ0FBQztLQUNIO0lBRU0sVUFBVSxDQUFDLFFBQXdCO1FBQ3hDLE9BQU8sSUFBSSxD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QUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgUmVzb3VyY2UsXG4gIElSZXNvdXJjZSxcbiAgUmVtb3ZhbFBvbGljeSxcbiAgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsXG4gIFRva2VuLFxufSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IElOYW1lc3BhY2UgfSBmcm9tICcuL25hbWVzcGFjZSc7XG5pbXBvcnQgeyBDZm5UYWJsZSwgQ2ZuVGFibGVQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczN0YWJsZXMnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgKiBhcyBwZXJtcyBmcm9tICcuL3Blcm1pc3Npb25zJztcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIFMzIFRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElUYWJsZSBleHRlbmRzIElSZXNvdXJjZSB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoaXMgdGFibGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgdGFibGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYWNjb3VudElkIGNvbnRhaW5pbmcgdGhpcyB0YWJsZS5cbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlZ2lvbiBjb250YWluaW5nIHRoaXMgdGFibGUuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkcyBhIHN0YXRlbWVudCB0byB0aGUgcmVzb3VyY2UgcG9saWN5IGZvciBhIHByaW5jaXBhbCAoaS5lLlxuICAgKiBhY2NvdW50L3JvbGUvc2VydmljZSkgdG8gcGVyZm9ybSBhY3Rpb25zIG9uIHRoaXMgdGFibGUuXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgcG9saWN5IHN0YXRlbWVudCBtYXkgb3IgbWF5IG5vdCBiZSBhZGRlZCB0byB0aGUgcG9saWN5LlxuICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBhbiBgSVRhYmxlYCBpcyBjcmVhdGVkIGZyb20gYW4gZXhpc3RpbmcgdGFibGUsXG4gICAqIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgdGFibGUgYWxyZWFkeSBoYXMgYSBwb2xpY3lcbiAgICogYXR0YWNoZWQsIGxldCBhbG9uZSB0byByZS11c2UgdGhhdCBwb2xpY3kgdG8gYWRkIG1vcmUgc3RhdGVtZW50cyB0byBpdC5cbiAgICogU28gaXQncyBzYWZlc3QgdG8gZG8gbm90aGluZyBpbiB0aGVzZSBjYXNlcy5cbiAgICpcbiAgICogQHBhcmFtIHN0YXRlbWVudCB0aGUgcG9saWN5IHN0YXRlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgdGFibGUnc1xuICAgKiBwb2xpY3kuXG4gICAqIEByZXR1cm5zIG1ldGFkYXRhIGFib3V0IHRoZSBleGVjdXRpb24gb2YgdGhpcyBtZXRob2QuIElmIHRoZSBwb2xpY3lcbiAgICogd2FzIG5vdCBhZGRlZCwgdGhlIHZhbHVlIG9mIGBzdGF0ZW1lbnRBZGRlZGAgd2lsbCBiZSBgZmFsc2VgLiBZb3VcbiAgICogc2hvdWxkIGFsd2F5cyBjaGVjayB0aGlzIHZhbHVlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBvcGVyYXRpb24gd2FzXG4gICAqIGFjdHVhbGx5IGNhcnJpZWQgb3V0LiBPdGhlcndpc2UsIHN5bnRoZXNpcyBhbmQgZGVwbG95IHdpbGwgdGVybWluYXRlXG4gICAqIHNpbGVudGx5LCB3aGljaCBtYXkgYmUgY29uZnVzaW5nLlxuICAgKi9cbiAgYWRkVG9SZXNvdXJjZVBvbGljeShzdGF0ZW1lbnQ6IGlhbS5Qb2xpY3lTdGF0ZW1lbnQpOiBpYW0uQWRkVG9SZXNvdXJjZVBvbGljeVJlc3VsdDtcblxuICAvKipcbiAgICogR3JhbnQgcmVhZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSB0byBhbiBJQU0gcHJpbmNpcGFsIChSb2xlL0dyb3VwL1VzZXIpLlxuICAgKlxuICAgKiBJZiB0aGUgcGFyZW50IFRhYmxlQnVja2V0IG9mIHRoaXMgdGFibGUgaGFzIGVuY3J5cHRpb24sXG4gICAqIHlvdSBzaG91bGQgZ3JhbnQga21zOkRlY3J5cHQgcGVybWlzc2lvbiB0byB1c2UgdGhpcyBrZXkgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbCB0byBhbGxvdyByZWFkIHBlcm1pc3Npb25zIHRvXG4gICAqL1xuICBncmFudFJlYWQoaWRlbnRpdHk6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCB3cml0ZSBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSB0byBhbiBJQU0gcHJpbmNpcGFsIChSb2xlL0dyb3VwL1VzZXIpLlxuICAgKlxuICAgKiBJZiB0aGUgcGFyZW50IFRhYmxlQnVja2V0IG9mIHRoaXMgdGFibGUgaGFzIGVuY3J5cHRpb24sXG4gICAqIHlvdSBzaG91bGQgZ3JhbnQga21zOkdlbmVyYXRlRGF0YUtleSBhbmQga21zOkRlY3J5cHQgcGVybWlzc2lvblxuICAgKiB0byB1c2UgdGhpcyBrZXkgdG8gdGhlIHNhbWUgcHJpbmNpcGFsLlxuICAgKlxuICAgKiBAcGFyYW0gaWRlbnRpdHkgVGhlIHByaW5jaXBhbCB0byBhbGxvdyB3cml0ZSBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgZ3JhbnRXcml0ZShpZGVudGl0eTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG5cbiAgLyoqXG4gICAqIEdyYW50IHJlYWQgYW5kIHdyaXRlIHBlcm1pc3Npb25zIGZvciB0aGlzIHRhYmxlIHRvIGFuIElBTSBwcmluY2lwYWwgKFJvbGUvR3JvdXAvVXNlcikuXG4gICAqXG4gICAqIElmIHRoZSBwYXJlbnQgVGFibGVCdWNrZXQgb2YgdGhpcyB0YWJsZSBoYXMgZW5jcnlwdGlvbixcbiAgICogeW91IHNob3VsZCBncmFudCBrbXM6R2VuZXJhdGVEYXRhS2V5IGFuZCBrbXM6RGVjcnlwdCBwZXJtaXNzaW9uXG4gICAqIHRvIHVzZSB0aGlzIGtleSB0byB0aGUgc2FtZSBwcmluY2lwYWwuXG4gICAqXG4gICAqIEBwYXJhbSBpZGVudGl0eSBUaGUgcHJpbmNpcGFsIHRvIGFsbG93IHJlYWQgYW5kIHdyaXRlIHBlcm1pc3Npb25zIHRvXG4gICAqL1xuICBncmFudFJlYWRXcml0ZShpZGVudGl0eTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQ7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgVGFibGUgaW1wbGVtZW50YXRpb25zLlxuICovXG5hYnN0cmFjdCBjbGFzcyBUYWJsZUJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElUYWJsZSB7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBwb2xpY3kgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGFibGUuXG4gICAqXG4gICAqIElmIGBhdXRvQ3JlYXRlUG9saWN5YCBpcyB0cnVlLCBhIGBUYWJsZVBvbGljeWAgd2lsbCBiZSBjcmVhdGVkIHVwb24gdGhlXG4gICAqIGZpcnN0IGNhbGwgdG8gYWRkVG9SZXNvdXJjZVBvbGljeShzKS5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCB0YWJsZVBvbGljeT86IENmblRhYmxlUG9saWN5O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgYSB0YWJsZSByZXNvdXJjZSBwb2xpY3kgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB1cG9uXG4gICAqIHRoZSBmaXJzdCBjYWxsIHRvIGBhZGRUb1Jlc291cmNlUG9saWN5YC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuO1xuXG4gIHB1YmxpYyBhZGRUb1Jlc291cmNlUG9saWN5KFxuICAgIHN0YXRlbWVudDogaWFtLlBvbGljeVN0YXRlbWVudCxcbiAgKTogaWFtLkFkZFRvUmVzb3VyY2VQb2xpY3lSZXN1bHQge1xuICAgIGlmICghdGhpcy50YWJsZVBvbGljeSAmJiB0aGlzLmF1dG9DcmVhdGVQb2xpY3kpIHtcbiAgICAgIHRoaXMudGFibGVQb2xpY3kgPSBuZXcgQ2ZuVGFibGVQb2xpY3kodGhpcywgJ0RlZmF1bHRQb2xpY3knLCB7XG4gICAgICAgIHRhYmxlQXJuOiB0aGlzLnRhYmxlQXJuLFxuICAgICAgICByZXNvdXJjZVBvbGljeTogbmV3IGlhbS5Qb2xpY3lEb2N1bWVudCh7fSksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50YWJsZVBvbGljeSkge1xuICAgICAgdGhpcy50YWJsZVBvbGljeS5yZXNvdXJjZVBvbGljeS5hZGRTdGF0ZW1lbnRzKHN0YXRlbWVudCk7XG4gICAgICByZXR1cm4geyBzdGF0ZW1lbnRBZGRlZDogdHJ1ZSwgcG9saWN5RGVwZW5kYWJsZTogdGhpcy50YWJsZVBvbGljeSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHN0YXRlbWVudEFkZGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZChpZGVudGl0eTogaWFtLklHcmFudGFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgcGVybXMuVEFCTEVfUkVBRF9BQ0NFU1MsXG4gICAgICB0aGlzLnRhYmxlQXJuLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ3JhbnRXcml0ZShpZGVudGl0eTogaWFtLklHcmFudGFibGUpIHtcbiAgICByZXR1cm4gdGhpcy5ncmFudChcbiAgICAgIGlkZW50aXR5LFxuICAgICAgcGVybXMuVEFCTEVfV1JJVEVfQUNDRVNTLFxuICAgICAgdGhpcy50YWJsZUFybixcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdyYW50UmVhZFdyaXRlKGlkZW50aXR5OiBpYW0uSUdyYW50YWJsZSkge1xuICAgIHJldHVybiB0aGlzLmdyYW50KFxuICAgICAgaWRlbnRpdHksXG4gICAgICBwZXJtcy5UQUJMRV9SRUFEX1dSSVRFX0FDQ0VTUyxcbiAgICAgIHRoaXMudGFibGVBcm4sXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudHMgdGhlIGdpdmVuIHMzdGFibGVzIHBlcm1pc3Npb25zIHRvIHRoZSBwcm92aWRlZCBwcmluY2lwYWxcbiAgICogQHJldHVybnMgR3JhbnQgb2JqZWN0XG4gICAqL1xuICBwcml2YXRlIGdyYW50KFxuICAgIGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLFxuICAgIHRhYmxlQWN0aW9uczogc3RyaW5nW10sXG4gICAgcmVzb3VyY2VBcm46IHN0cmluZyxcbiAgICAuLi5vdGhlclJlc291cmNlQXJuczogKHN0cmluZyB8IHVuZGVmaW5lZClbXSkge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IFtyZXNvdXJjZUFybiwgLi4ub3RoZXJSZXNvdXJjZUFybnNdLmZpbHRlcihhcm4gPT4gYXJuICE9IHVuZGVmaW5lZCk7XG5cbiAgICBjb25zdCBncmFudCA9IGlhbS5HcmFudC5hZGRUb1ByaW5jaXBhbE9yUmVzb3VyY2Uoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IHRhYmxlQWN0aW9ucyxcbiAgICAgIHJlc291cmNlQXJuczogcmVzb3VyY2VzLFxuICAgICAgcmVzb3VyY2U6IHRoaXMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JhbnQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBjcmVhdGluZyBhIG5ldyBTMyBUYWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhpcyB0YWJsZSwgdW5pcXVlIHdpdGhpbiB0aGUgbmFtZXNwYWNlXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lc3BhY2UgdW5kZXIgd2hpY2ggdGhpcyB0YWJsZSBpcyBjcmVhdGVkXG4gICAqL1xuICByZWFkb25seSBuYW1lc3BhY2U6IElOYW1lc3BhY2U7XG4gIC8qKlxuICAgKiBGb3JtYXQgb2YgdGhpcyB0YWJsZS4gQ3VycmVudGx5LCB0aGUgb25seSBzdXBwb3J0ZWQgdmFsdWUgaXMgT3BlblRhYmxlRm9ybWF0LklDRUJFUkcuXG4gICAqL1xuICByZWFkb25seSBvcGVuVGFibGVGb3JtYXQ6IE9wZW5UYWJsZUZvcm1hdDtcbiAgLyoqXG4gICAqIFNldHRpbmdzIGdvdmVybmluZyB0aGUgQ29tcGFjdGlvbiBtYWludGVuYW5jZSBhY3Rpb24uXG4gICAqIEBkZWZhdWx0IEFtYXpvbiBTMyBzZWxlY3RzIHRoZSBiZXN0IGNvbXBhY3Rpb24gc3RyYXRlZ3kgYmFzZWQgb24geW91ciB0YWJsZSBzb3J0IG9yZGVyLlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25TMy9sYXRlc3QvdXNlcmd1aWRlL3MzLXRhYmxlcy1tYWludGVuYW5jZS5odG1sXG4gICAqL1xuICByZWFkb25seSBjb21wYWN0aW9uPzogQ29tcGFjdGlvblByb3BlcnR5O1xuICAvKipcbiAgICogQ29udGFpbnMgZGV0YWlscyBhYm91dCB0aGUgbWV0YWRhdGEgZm9yIGFuIEljZWJlcmcgdGFibGUuXG4gICAqIEBkZWZhdWx0IHRhYmxlIGlzIGNyZWF0ZWQgd2l0aG91dCBhbnkgbWV0YWRhdGFcbiAgICovXG4gIHJlYWRvbmx5IGljZWJlcmdNZXRhZGF0YT86IEljZWJlcmdNZXRhZGF0YVByb3BlcnR5O1xuICAvKipcbiAgICogQ29udGFpbnMgZGV0YWlscyBhYm91dCB0aGUgc25hcHNob3QgbWFuYWdlbWVudCBzZXR0aW5ncyBmb3IgYW4gSWNlYmVyZyB0YWJsZS5cbiAgICogQGRlZmF1bHQgZW5hYmxlZDogTWluaW11bVNuYXBzaG90cyBpcyAxIGJ5IGRlZmF1bHQgYW5kIE1heGltdW1TbmFwc2hvdEFnZSBpcyAxMjAgaG91cnMgYnkgZGVmYXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IHNuYXBzaG90TWFuYWdlbWVudD86IFNuYXBzaG90TWFuYWdlbWVudFByb3BlcnR5O1xuICAvKipcbiAgICogQ29udHJvbHMgd2hhdCBoYXBwZW5zIHRvIHRoaXMgdGFibGUgaXQgaXQgc3RvcGVkIGJlaW5nIG1hbmFnZWQgYnkgY2xvdWRmb3JtYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFJFVEFJTlxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG4gIC8qKlxuICAgKiBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB5b3UgZG9uJ3Qgd2FudCB0byBzcGVjaWZ5IGEgc2NoZW1hIGZvciB0aGUgdGFibGUuXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHRvICdJY2ViZXJnTWV0YWRhdGEnLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgd2l0aG91dE1ldGFkYXRhPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0ZWQgb3BlbiB0YWJsZSBmb3JtYXRzLlxuICovXG5leHBvcnQgZW51bSBPcGVuVGFibGVGb3JtYXQge1xuICAvKipcbiAgICogQXBhY2hlIEljZWJlcmcgdGFibGUgZm9ybWF0LlxuICAgKi9cbiAgSUNFQkVSRyA9ICdJQ0VCRVJHJyxcbn1cblxuLyoqXG4gKiBTZXR0aW5ncyBnb3Zlcm5pbmcgdGhlIENvbXBhY3Rpb24gbWFpbnRlbmFuY2UgYWN0aW9uLlxuICpcbiAqIEBkZWZhdWx0IC0gTm8gY29tcGFjdGlvbiBzZXR0aW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBhY3Rpb25Qcm9wZXJ0eSB7XG4gIC8qKlxuICAgKiBTdGF0dXMgb2YgdGhlIGNvbXBhY3Rpb24gbWFpbnRlbmFuY2UgYWN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBTdGF0dXM7XG4gIC8qKlxuICAgKiBUYXJnZXQgZmlsZSBzaXplIGluIG1lZ2FieXRlcyBmb3IgY29tcGFjdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldEZpbGVTaXplTWI6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBTdGF0dXMgdmFsdWVzIGZvciBtYWludGVuYW5jZSBhY3Rpb25zLlxuICovXG5leHBvcnQgZW51bSBTdGF0dXMge1xuICAvKipcbiAgICogRW5hYmxlIHRoZSBtYWludGVuYW5jZSBhY3Rpb24uXG4gICAqL1xuICBFTkFCTEVEID0gJ2VuYWJsZWQnLFxuICAvKipcbiAgICogRGlzYWJsZSB0aGUgbWFpbnRlbmFuY2UgYWN0aW9uLlxuICAgKi9cbiAgRElTQUJMRUQgPSAnZGlzYWJsZWQnLFxufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgdGhlIG1ldGFkYXRhIGZvciBhbiBJY2ViZXJnIHRhYmxlLlxuICogQHNlZSBodHRwOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLXMzdGFibGVzLXRhYmxlLWljZWJlcmdtZXRhZGF0YS5odG1sXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWNlYmVyZ01ldGFkYXRhUHJvcGVydHkge1xuICAvKipcbiAgICogQ29udGFpbnMgZGV0YWlscyBhYm91dCB0aGUgc2NoZW1hIGZvciBhbiBJY2ViZXJnIHRhYmxlLlxuICAgKlxuICAgKiBAc2VlIGh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXByb3BlcnRpZXMtczN0YWJsZXMtdGFibGUtaWNlYmVyZ21ldGFkYXRhLmh0bWwjY2ZuLXMzdGFibGVzLXRhYmxlLWljZWJlcmdtZXRhZGF0YS1pY2ViZXJnc2NoZW1hXG4gICAqL1xuICByZWFkb25seSBpY2ViZXJnU2NoZW1hOiBJY2ViZXJnU2NoZW1hUHJvcGVydHk7XG59XG5cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCB0aGUgc2NoZW1hIGZvciBhbiBJY2ViZXJnIHRhYmxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEljZWJlcmdTY2hlbWFQcm9wZXJ0eSB7XG4gIC8qKlxuICAgKiBDb250YWlucyBkZXRhaWxzIGFib3V0IHRoZSBzY2hlbWEgZm9yIGFuIEljZWJlcmcgdGFibGUuXG4gICAqL1xuICByZWFkb25seSBzY2hlbWFGaWVsZExpc3Q6IFNjaGVtYUZpZWxkUHJvcGVydHlbXTtcbn1cblxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgc2NoZW1hIGZpZWxkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVtYUZpZWxkUHJvcGVydHkge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZpZWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIEJvb2xlYW4gdmFsdWUgdGhhdCBzcGVjaWZpZXMgd2hldGhlciB2YWx1ZXMgYXJlIHJlcXVpcmVkIGZvciBlYWNoIHJvdyBpbiB0aGlzIGZpZWxkLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIGlzIGBmYWxzZWAgYW5kIG51bGwgdmFsdWVzIGFyZSBhbGxvd2VkIGluIHRoZSBmaWVsZC4gSWYgdGhpcyBpcyBgdHJ1ZWAsIHRoZSBmaWVsZCBkb2VzIG5vdCBhbGxvdyBudWxsIHZhbHVlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGZpZWxkIHR5cGUuXG4gICAqXG4gICAqIFMzIFRhYmxlcyBzdXBwb3J0cyBhbGwgQXBhY2hlIEljZWJlcmcgcHJpbWl0aXZlIHR5cGVzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbQXBhY2hlIEljZWJlcmcgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2h0dHBzOi8vaWNlYmVyZy5hcGFjaGUub3JnL3NwZWMvI3ByaW1pdGl2ZS10eXBlcykuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29udGFpbnMgZGV0YWlscyBhYm91dCB0aGUgc25hcHNob3QgbWFuYWdlbWVudCBzZXR0aW5ncyBmb3IgYW4gSWNlYmVyZyB0YWJsZS5cbiAqXG4gKiBBIHNuYXBzaG90IGlzIGV4cGlyZWQgd2hlbiBpdCBleGNlZWRzIE1pblNuYXBzaG90c1RvS2VlcCBhbmQgTWF4U25hcHNob3RBZ2VIb3Vycy5cbiAqXG4gKiBAZGVmYXVsdCAtIE5vIHNuYXBzaG90IG1hbmFnZW1lbnQgc2V0dGluZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdE1hbmFnZW1lbnRQcm9wZXJ0eSB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBhZ2Ugb2YgYSBzbmFwc2hvdCBiZWZvcmUgaXQgY2FuIGJlIGV4cGlyZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gbWF4aW11bSBhZ2VcbiAgICovXG4gIHJlYWRvbmx5IG1heFNuYXBzaG90QWdlSG91cnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBzbmFwc2hvdHMgdG8ga2VlcC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBtaW5pbXVtIG51bWJlclxuICAgKi9cbiAgcmVhZG9ubHkgbWluU25hcHNob3RzVG9LZWVwPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgU25hcHNob3RNYW5hZ2VtZW50IG1haW50ZW5hbmNlIGFjdGlvbiBpcyBlbmFibGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1cz86IFN0YXR1cztcbn1cblxuLyoqXG4gKiBBIHJlZmVyZW5jZSB0byBhIHRhYmxlIG91dHNpZGUgdGhpcyBzdGFja1xuICpcbiAqIFRoZSB0YWJsZU5hbWUsIHJlZ2lvbiwgYW5kIGFjY291bnQgY2FuIGJlIHByb3ZpZGVkIGV4cGxpY2l0bHlcbiAqIG9yIHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdGFibGVBcm5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZUF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGlzIHRhYmxlXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhYmxlJ3MgQVJOLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFibGVBcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBTMyBUYWJsZSB3aXRoIGhlbHBlcnMuXG4gKi9cbkBwcm9wZXJ0eUluamVjdGFibGVcbmV4cG9ydCBjbGFzcyBUYWJsZSBleHRlbmRzIFRhYmxlQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLXMzdGFibGVzLWFscGhhLlRhYmxlJztcblxuICAvKipcbiAgICogRGVmaW5lcyBhIFRhYmxlIGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgcGFyZW50IGNyZWF0aW5nIGNvbnN0cnVjdCAodXN1YWxseSBgdGhpc2ApLlxuICAgKiBAcGFyYW0gaWQgVGhlIGNvbnN0cnVjdCdzIG5hbWUuXG4gICAqIEBwYXJhbSBhdHRycyBBIGBUYWJsZUF0dHJpYnV0ZXNgIG9iamVjdCBjb250YWluaW5nIHRoZSB0YWJsZSBuYW1lIGFuZCBBUk4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUF0dHJpYnV0ZXMoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIGF0dHJzOiBUYWJsZUF0dHJpYnV0ZXMsXG4gICk6IElUYWJsZSB7XG4gICAgY29uc3QgdGFibGVBcm4gPSBhdHRycy50YWJsZUFybjtcbiAgICBUYWJsZS52YWxpZGF0ZVRhYmxlTmFtZShhdHRycy50YWJsZU5hbWUpO1xuXG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgVGFibGVCYXNlIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YWJsZU5hbWUgPSBhdHRycy50YWJsZU5hbWU7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVBcm4gPSB0YWJsZUFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSB0YWJsZVBvbGljeT86IENmblRhYmxlUG9saWN5O1xuICAgICAgcHJvdGVjdGVkIGF1dG9DcmVhdGVQb2xpY3k6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgICAgLyoqXG4gICAgICAgKiBFeHBvcnRzIHRoaXMgIGZyb20gdGhlIHN0YWNrLlxuICAgICAgICovXG4gICAgICBwdWJsaWMgZXhwb3J0KCkge1xuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkLCB7XG4gICAgICBlbnZpcm9ubWVudEZyb21Bcm46IHRhYmxlQXJuLFxuICAgICAgcGh5c2ljYWxOYW1lOiB0YWJsZUFybixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC91c2VyZ3VpZGUvczMtdGFibGVzLWJ1Y2tldHMtbmFtaW5nLmh0bWxcbiAgICogQHBhcmFtIHRhYmxlTmFtZSBOYW1lIG9mIHRoZSB0YWJsZVxuICAgKiBAdGhyb3dzIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIGlmIGFueSBuYW1pbmcgZXJyb3JzIGFyZSBkZXRlY3RlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZVRhYmxlTmFtZSh0YWJsZU5hbWU6IHN0cmluZykge1xuICAgIGlmICh0YWJsZU5hbWUgPT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZCh0YWJsZU5hbWUpKSB7XG4gICAgICAvLyB0aGUgbmFtZSBpcyBhIGxhdGUtYm91bmQgdmFsdWUsIG5vdCBhIGRlZmluZWQgc3RyaW5nLCBzbyBza2lwIHZhbGlkYXRpb25cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBMZW5ndGggdmFsaWRhdGlvblxuICAgIGlmICh0YWJsZU5hbWUubGVuZ3RoIDwgMSB8fCB0YWJsZU5hbWUubGVuZ3RoID4gMjU1KSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgJ1RhYmxlIG5hbWUgbXVzdCBiZSBhdCBsZWFzdCAxIGFuZCBubyBtb3JlIHRoYW4gMjU1IGNoYXJhY3RlcnMnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDaGFyYWN0ZXIgc2V0IHZhbGlkYXRpb25cbiAgICBjb25zdCBpbGxlZ2FsQ2hhcnNldFJlZ0V4ID0gL1teYS16MC05X10vO1xuICAgIGNvbnN0IGFsbG93ZWRFZGdlQ2hhcnNldFJlZ0V4ID0gL1thLXowLTldLztcblxuICAgIGNvbnN0IGlsbGVnYWxDaGFyTWF0Y2ggPSB0YWJsZU5hbWUubWF0Y2goaWxsZWdhbENoYXJzZXRSZWdFeCk7XG4gICAgaWYgKGlsbGVnYWxDaGFyTWF0Y2gpIHtcbiAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAnVGFibGUgbmFtZSBtdXN0IG9ubHkgY29udGFpbiBsb3dlcmNhc2UgY2hhcmFjdGVycywgbnVtYmVycywgYW5kIHVuZGVyc2NvcmVzIChfKScgK1xuICAgICAgICAgIGAgKG9mZnNldDogJHtpbGxlZ2FsQ2hhck1hdGNoLmluZGV4fSlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBFZGdlIGNoYXJhY3RlciB2YWxpZGF0aW9uXG4gICAgaWYgKCFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KHRhYmxlTmFtZS5jaGFyQXQoMCkpKSB7XG4gICAgICBlcnJvcnMucHVzaChcbiAgICAgICAgJ1RhYmxlIG5hbWUgbXVzdCBzdGFydCB3aXRoIGEgbG93ZXJjYXNlIGxldHRlciBvciBudW1iZXIgKG9mZnNldDogMCknLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFhbGxvd2VkRWRnZUNoYXJzZXRSZWdFeC50ZXN0KHRhYmxlTmFtZS5jaGFyQXQodGFibGVOYW1lLmxlbmd0aCAtIDEpKSkge1xuICAgICAgZXJyb3JzLnB1c2goXG4gICAgICAgIGBUYWJsZSBuYW1lIG11c3QgZW5kIHdpdGggYSBsb3dlcmNhc2UgbGV0dGVyIG9yIG51bWJlciAob2Zmc2V0OiAke1xuICAgICAgICAgIHRhYmxlTmFtZS5sZW5ndGggLSAxXG4gICAgICAgIH0pYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIFMzIHRhYmxlIG5hbWUgKHZhbHVlOiAke3RhYmxlTmFtZX0pJHtFT0x9JHtlcnJvcnMuam9pbihFT0wpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChhcm4pIG9mIHRoaXMgdGFibGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YWJsZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdW5kZXJseWluZyBDZm5UYWJsZSBMMSByZXNvdXJjZVxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc291cmNlOiBDZm5UYWJsZTtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhpcyB0YWJsZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIGNvbnRhaW5pbmcgdGhpcyB0YWJsZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWVzcGFjZTogSU5hbWVzcGFjZTtcblxuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBvbGljeSBmb3IgdGhpcyB0YWJsZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0YWJsZVBvbGljeT86IENmblRhYmxlUG9saWN5O1xuXG4gIHByb3RlY3RlZCBhdXRvQ3JlYXRlUG9saWN5OiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVGFibGVQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge30pO1xuXG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICBUYWJsZS52YWxpZGF0ZVRhYmxlTmFtZShwcm9wcy50YWJsZU5hbWUpO1xuXG4gICAgdGhpcy5fcmVzb3VyY2UgPSBuZXcgQ2ZuVGFibGUodGhpcywgaWQsIHtcbiAgICAgIHRhYmxlTmFtZTogcHJvcHMudGFibGVOYW1lLFxuICAgICAgb3BlblRhYmxlRm9ybWF0OiBwcm9wcy5vcGVuVGFibGVGb3JtYXQsXG4gICAgICB0YWJsZUJ1Y2tldEFybjogcHJvcHMubmFtZXNwYWNlLnRhYmxlQnVja2V0LnRhYmxlQnVja2V0QXJuLFxuICAgICAgbmFtZXNwYWNlOiBwcm9wcy5uYW1lc3BhY2UubmFtZXNwYWNlTmFtZSxcbiAgICAgIGNvbXBhY3Rpb246IHByb3BzLmNvbXBhY3Rpb24sXG4gICAgICBpY2ViZXJnTWV0YWRhdGE6IHByb3BzLmljZWJlcmdNZXRhZGF0YSxcbiAgICAgIHNuYXBzaG90TWFuYWdlbWVudDogcHJvcHMuc25hcHNob3RNYW5hZ2VtZW50LFxuICAgICAgd2l0aG91dE1ldGFkYXRhOiBwcm9wcy53aXRob3V0TWV0YWRhdGEgPyAnWWVzJyA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIHRoaXMubmFtZXNwYWNlID0gcHJvcHMubmFtZXNwYWNlO1xuICAgIHRoaXMudGFibGVOYW1lID0gcHJvcHMudGFibGVOYW1lO1xuICAgIHRoaXMudGFibGVBcm4gPSB0aGlzLl9yZXNvdXJjZS5hdHRyVGFibGVBcm47XG4gICAgdGhpcy5fcmVzb3VyY2UuYXBwbHlSZW1vdmFsUG9saWN5KHByb3BzLnJlbW92YWxQb2xpY3kpO1xuICAgIHRoaXMubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMubmFtZXNwYWNlKTtcbiAgfVxufVxuIl19