@pepperize/cdk-organizations
Version:
Manage AWS organizations, organizational units (OU), accounts and service control policies (SCP).
101 lines • 20.9 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Account = exports.IamUserAccessToBilling = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const constructs_1 = require("constructs");
const pascal_case_1 = require("pascal-case");
const account_provider_1 = require("./account-provider");
const delegated_administrator_1 = require("./delegated-administrator");
const policy_attachment_1 = require("./policy-attachment");
const tag_resource_1 = require("./tag-resource");
const validators_1 = require("./validators");
/**
* @see https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/control-access-billing.html#ControllingAccessWebsite-Activate
*/
var IamUserAccessToBilling;
(function (IamUserAccessToBilling) {
/**
* If set to ALLOW, the new account enables IAM users to access account billing information if they have the required permissions.
*/
IamUserAccessToBilling["ALLOW"] = "ALLOW";
/**
* If set to DENY, only the root user of the new account can access account billing information.
*/
IamUserAccessToBilling["DENY"] = "DENY";
})(IamUserAccessToBilling || (exports.IamUserAccessToBilling = IamUserAccessToBilling = {}));
/**
* Creates or imports an AWS account that is automatically a member of the organization whose credentials made the request. AWS Organizations automatically copies the information from the management account to the new member account
*/
class Account extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
this.tags = new aws_cdk_lib_1.TagManager(aws_cdk_lib_1.TagType.KEY_VALUE, "Custom::Organizations_Account");
this.scope = scope;
const { email, accountName, roleName, iamUserAccessToBilling, parent, importOnDuplicate, removalPolicy } = props;
if (!validators_1.Validators.of().email(email)) {
aws_cdk_lib_1.Annotations.of(this).addError("The account's email must be of type string and between 6 and 64 characters long.");
}
if (!validators_1.Validators.of().accountName(accountName)) {
aws_cdk_lib_1.Annotations.of(this).addError("The account's name must be of type string and between 1 and 50 characters long.");
}
const createAccountProvider = account_provider_1.AccountProvider.getOrCreate(this);
const account = new aws_cdk_lib_1.CustomResource(this, "CreateAccount", {
serviceToken: createAccountProvider.provider.serviceToken,
resourceType: "Custom::Organizations_Account",
properties: {
Email: email,
AccountName: accountName,
RoleName: roleName ?? "OrganizationAccountAccessRole",
IamUserAccessToBilling: iamUserAccessToBilling ?? IamUserAccessToBilling.ALLOW,
ParentId: parent?.identifier(),
ImportOnDuplicate: String(importOnDuplicate ?? true),
RemovalPolicy: removalPolicy ?? aws_cdk_lib_1.RemovalPolicy.RETAIN,
},
});
this.accountId = account.getAtt("AccountId").toString();
this.accountArn = account.getAtt("AccountArn").toString();
this.accountName = account.getAtt("AccountName").toString();
this.email = account.getAtt("Email").toString();
this.resource = account;
const tagResource = new tag_resource_1.TagResource(this, "Tags", { resourceId: this.accountId, tags: this.tags.renderedTags });
tagResource.node.addDependency(account);
}
identifier() {
return this.accountId;
}
/**
* Enables trusted access for the AWS service (trusted service) as <strong>Delegated Administrator</strong>, which performs tasks in your organization and its accounts on your behalf.
*
* @param {string} servicePrincipal The supported AWS service that you specify
* @param {string} region The region to delegate in
* @param {DelegatedAdministratorProps} props additional DelegatedAdministrator props
*/
delegateAdministrator(servicePrincipal, region, props = {}) {
const organizationsRegion = process.env.CDK_AWS_PARTITION === "aws-cn" ? "cn-northwest-1" : "us-east-1";
const delegatedAdministrator = new delegated_administrator_1.DelegatedAdministrator(this.scope, `Delegate${(0, pascal_case_1.pascalCase)(servicePrincipal)}${region && region !== organizationsRegion ? `-${region}` : ""}-${aws_cdk_lib_1.Names.nodeUniqueId(this.node)}`, {
...props,
account: this,
servicePrincipal: servicePrincipal,
region,
});
delegatedAdministrator.node.addDependency(this.resource);
}
/**
* Attach a policy. Before you can attach the policy, you must enable that policy type for use. You can use policies when you have all features enabled.
*
* @see https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies.html
*/
attachPolicy(policy) {
const policyAttachment = new policy_attachment_1.PolicyAttachment(this.scope, `PolicyAttachment-${aws_cdk_lib_1.Names.nodeUniqueId(this.node)}-${aws_cdk_lib_1.Names.nodeUniqueId(policy.node)}`, {
target: this,
policy: policy,
});
policyAttachment.node.addDependency(this.resource, policy);
}
}
exports.Account = Account;
_a = JSII_RTTI_SYMBOL_1;
Account[_a] = { fqn: "@pepperize/cdk-organizations.Account", version: "0.7.988" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hY2NvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsNkNBQXFHO0FBQ3JHLDJDQUFtRDtBQUNuRCw2Q0FBeUM7QUFDekMseURBQXFEO0FBQ3JELHVFQUFtRTtBQUduRSwyREFBZ0Y7QUFFaEYsaURBQWdFO0FBQ2hFLDZDQUEwQztBQUUxQzs7R0FFRztBQUNILElBQVksc0JBU1g7QUFURCxXQUFZLHNCQUFzQjtJQUNoQzs7T0FFRztJQUNILHlDQUFlLENBQUE7SUFDZjs7T0FFRztJQUNILHVDQUFhLENBQUE7QUFDZixDQUFDLEVBVFcsc0JBQXNCLHNDQUF0QixzQkFBc0IsUUFTakM7QUFzRUQ7O0dBRUc7QUFDSCxNQUFhLE9BQVEsU0FBUSxzQkFBUztJQVlwQyxZQUFtQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFtQjtRQUNsRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBSFYsU0FBSSxHQUFHLElBQUksd0JBQVUsQ0FBQyxxQkFBTyxDQUFDLFNBQVMsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO1FBSWpGLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBRWpILElBQUksQ0FBQyx1QkFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xDLHlCQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxrRkFBa0YsQ0FBQyxDQUFDO1FBQ3BILENBQUM7UUFFRCxJQUFJLENBQUMsdUJBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUs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LEtBQUssRUFDVixvQkFBb0IsbUJBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLG1CQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUN0RjtZQUNFLE1BQU0sRUFBRSxJQUFJO1lBQ1osTUFBTSxFQUFFLE1BQU07U0FDZixDQUNGLENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDN0QsQ0FBQzs7QUEvRkgsMEJBZ0dDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIEN1c3RvbVJlc291cmNlLCBOYW1lcywgUmVtb3ZhbFBvbGljeSwgVGFnTWFuYWdlciwgVGFnVHlwZSB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHBhc2NhbENhc2UgfSBmcm9tIFwicGFzY2FsLWNhc2VcIjtcbmltcG9ydCB7IEFjY291bnRQcm92aWRlciB9IGZyb20gXCIuL2FjY291bnQtcHJvdmlkZXJcIjtcbmltcG9ydCB7IERlbGVnYXRlZEFkbWluaXN0cmF0b3IgfSBmcm9tIFwiLi9kZWxlZ2F0ZWQtYWRtaW5pc3RyYXRvclwiO1xuaW1wb3J0IHsgSUNoaWxkLCBJUGFyZW50IH0gZnJvbSBcIi4vcGFyZW50XCI7XG5pbXBvcnQgeyBJUG9saWN5IH0gZnJvbSBcIi4vcG9saWN5XCI7XG5pbXBvcnQgeyBJUG9saWN5QXR0YWNobWVudFRhcmdldCwgUG9saWN5QXR0YWNobWVudCB9IGZyb20gXCIuL3BvbGljeS1hdHRhY2htZW50XCI7XG5pbXBvcnQgeyBJUmVzb3VyY2UgfSBmcm9tIFwiLi9yZXNvdXJjZVwiO1xuaW1wb3J0IHsgSVRhZ2dhYmxlUmVzb3VyY2UsIFRhZ1Jlc291cmNlIH0gZnJvbSBcIi4vdGFnLXJlc291cmNlXCI7XG5pbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSBcIi4vdmFsaWRhdG9yc1wiO1xuXG4vKipcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F3c2FjY291bnRiaWxsaW5nL2xhdGVzdC9hYm91dHYyL2NvbnRyb2wtYWNjZXNzLWJpbGxpbmcuaHRtbCNDb250cm9sbGluZ0FjY2Vzc1dlYnNpdGUtQWN0aXZhdGVcbiAqL1xuZXhwb3J0IGVudW0gSWFtVXNlckFjY2Vzc1RvQmlsbGluZyB7XG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gQUxMT1csIHRoZSBuZXcgYWNjb3VudCBlbmFibGVzIElBTSB1c2VycyB0byBhY2Nlc3MgYWNjb3VudCBiaWxsaW5nIGluZm9ybWF0aW9uIGlmIHRoZXkgaGF2ZSB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnMuXG4gICAqL1xuICBBTExPVyA9IFwiQUxMT1dcIixcbiAgLyoqXG4gICAqIElmIHNldCB0byBERU5ZLCBvbmx5IHRoZSByb290IHVzZXIgb2YgdGhlIG5ldyBhY2NvdW50IGNhbiBhY2Nlc3MgYWNjb3VudCBiaWxsaW5nIGluZm9ybWF0aW9uLlxuICAgKi9cbiAgREVOWSA9IFwiREVOWVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgb3duZXIgdG8gYXNzaWduIHRvIHRoZSBuZXcgbWVtYmVyIGFjY291bnQuIFRoaXMgZW1haWwgYWRkcmVzcyBtdXN0IG5vdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIEFXUyBhY2NvdW50LiBZb3UgbXVzdCB1c2UgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIHRvIGNvbXBsZXRlIGFjY291bnQgY3JlYXRpb24uIFlvdSBjYW4ndCBhY2Nlc3MgdGhlIHJvb3QgdXNlciBvZiB0aGUgYWNjb3VudCBvciByZW1vdmUgYW4gYWNjb3VudCB0aGF0IHdhcyBjcmVhdGVkIHdpdGggYW4gaW52YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1haWw6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBmcmllbmRseSBuYW1lIG9mIHRoZSBtZW1iZXIgYWNjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiBhbiBJQU0gcm9sZSB0aGF0IEFXUyBPcmdhbml6YXRpb25zIGF1dG9tYXRpY2FsbHkgcHJlY29uZmlndXJlcyBpbiB0aGUgbmV3IG1lbWJlciBhY2NvdW50LiBUaGlzIHJvbGUgdHJ1c3RzIHRoZSBtYW5hZ2VtZW50IGFjY291bnQsIGFsbG93aW5nIHVzZXJzIGluIHRoZSBtYW5hZ2VtZW50IGFjY291bnQgdG8gYXNzdW1lIHRoZSByb2xlLCBhcyBwZXJtaXR0ZWQgYnkgdGhlIG1hbmFnZW1lbnQgYWNjb3VudCBhZG1pbmlzdHJhdG9yLiBUaGUgcm9sZSBoYXMgYWRtaW5pc3RyYXRvciBwZXJtaXNzaW9ucyBpbiB0aGUgbmV3IG1lbWJlciBhY2NvdW50LlxuICAgKlxuICAgKiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGlzIHBhcmFtZXRlciwgdGhlIHJvbGUgbmFtZSBkZWZhdWx0cyB0byBPcmdhbml6YXRpb25BY2NvdW50QWNjZXNzUm9sZS5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGVOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogSWYgc2V0IHRvIEFMTE9XICwgdGhlIG5ldyBhY2NvdW50IGVuYWJsZXMgSUFNIHVzZXJzIHRvIGFjY2VzcyBhY2NvdW50IGJpbGxpbmcgaW5mb3JtYXRpb24gaWYgdGhleSBoYXZlIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucy4gSWYgc2V0IHRvIERFTlkgLCBvbmx5IHRoZSByb290IHVzZXIgb2YgdGhlIG5ldyBhY2NvdW50IGNhbiBhY2Nlc3MgYWNjb3VudCBiaWxsaW5nIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBTExPV1xuICAgKi9cbiAgcmVhZG9ubHkgaWFtVXNlckFjY2Vzc1RvQmlsbGluZz86IElhbVVzZXJBY2Nlc3NUb0JpbGxpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJlbnQgcm9vdCBvciBPVSB0aGF0IHlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgbmV3IEFjY291bnQgaW4uXG4gICAqL1xuICByZWFkb25seSBwYXJlbnQ/OiBJUGFyZW50O1xuICAvKipcbiAgICogV2hldGhlciB0byBpbXBvcnQsIGlmIGEgZHVwbGljYXRlIGFjY291bnQgd2l0aCBzYW1lIG5hbWUgYW5kIGVtYWlsIGFscmVhZHkgZXhpc3RzLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRPbkR1cGxpY2F0ZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJZiBzZXQgdG8gUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLCB0aGUgYWNjb3VudCB3aWxsIGJlIG1vdmVkIHRvIHRoZSByb290LlxuICAgKlxuICAgKiBAZGVmYXVsdCBSZW1vdmFsUG9saWN5LlJldGFpblxuICAgKi9cbiAgcmVhZG9ubHkgcmVtb3ZhbFBvbGljeT86IFJlbW92YWxQb2xpY3k7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFjY291bnQgZXh0ZW5kcyBJUG9saWN5QXR0YWNobWVudFRhcmdldCwgSUNoaWxkLCBJQ29uc3RydWN0LCBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogSWYgdGhlIGFjY291bnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgKElEKSBvZiB0aGUgbmV3IGFjY291bnQuIEV4YWN0bHkgMTIgZGlnaXRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIGFjY291bnQuXG4gICAqL1xuICByZWFkb25seSBhY2NvdW50QXJuOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZnJpZW5kbHkgbmFtZSBvZiB0aGUgYWNjb3VudC5cbiAgICovXG4gIHJlYWRvbmx5IGFjY291bnROYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgb3duZXIgdG8gYXNzaWduIHRvIHRoZSBuZXcgbWVtYmVyIGFjY291bnQuIFRoaXMgZW1haWwgYWRkcmVzcyBtdXN0IG5vdCBhbHJlYWR5IGJlIGFzc29jaWF0ZWQgd2l0aCBhbm90aGVyIEFXUyBhY2NvdW50LiBZb3UgbXVzdCB1c2UgYSB2YWxpZCBlbWFpbCBhZGRyZXNzIHRvIGNvbXBsZXRlIGFjY291bnQgY3JlYXRpb24uIFlvdSBjYW4ndCBhY2Nlc3MgdGhlIHJvb3QgdXNlciBvZiB0aGUgYWNjb3VudCBvciByZW1vdmUgYW4gYWNjb3VudCB0aGF0IHdhcyBjcmVhdGVkIHdpdGggYW4gaW52YWxpZCBlbWFpbCBhZGRyZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1haWw6IHN0cmluZztcblxuICAvKipcbiAgICogRW5hYmxlcyB0cnVzdGVkIGFjY2VzcyBmb3IgdGhlIEFXUyBzZXJ2aWNlICh0cnVzdGVkIHNlcnZpY2UpIGFzIDxzdHJvbmc+RGVsZWdhdGVkIEFkbWluaXN0cmF0b3I8L3N0cm9uZz4sIHdoaWNoIHBlcmZvcm1zIHRhc2tzIGluIHlvdXIgb3JnYW5pemF0aW9uIGFuZCBpdHMgYWNjb3VudHMgb24geW91ciBiZWhhbGYuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlUHJpbmNpcGFsIFRoZSBzdXBwb3J0ZWQgQVdTIHNlcnZpY2UgdGhhdCB5b3Ugc3BlY2lmeVxuICAgKiBAcGFyYW0gcmVnaW9uIFRoZSByZWdpb24gdG8gZGVsZWdhdGUgaW5cbiAgICogQHBhcmFtIHtEZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yUHJvcHN9IHByb3BzIGFkZGl0aW9uYWwgRGVsZWdhdGVkQWRtaW5pc3RyYXRvciBwcm9wc1xuICAgKi9cbiAgZGVsZWdhdGVBZG1pbmlzdHJhdG9yKHNlcnZpY2VQcmluY2lwYWw6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4pOiB2b2lkO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgb3IgaW1wb3J0cyBhbiBBV1MgYWNjb3VudCB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYSBtZW1iZXIgb2YgdGhlIG9yZ2FuaXphdGlvbiB3aG9zZSBjcmVkZW50aWFscyBtYWRlIHRoZSByZXF1ZXN0LiBBV1MgT3JnYW5pemF0aW9ucyBhdXRvbWF0aWNhbGx5IGNvcGllcyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbWFuYWdlbWVudCBhY2NvdW50IHRvIHRoZSBuZXcgbWVtYmVyIGFjY291bnRcbiAqL1xuZXhwb3J0IGNsYXNzIEFjY291bnQgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJQWNjb3VudCwgSVRhZ2dhYmxlUmVzb3VyY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgYWNjb3VudElkOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBhY2NvdW50QXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBhY2NvdW50TmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgZW1haWw6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb3VyY2U6IEN1c3RvbVJlc291cmNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcblxuICByZWFkb25seSB0YWdzID0gbmV3IFRhZ01hbmFnZXIoVGFnVHlwZS5LRVlfVkFMVUUsIFwiQ3VzdG9tOjpPcmdhbml6YXRpb25zX0FjY291bnRcIik7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBY2NvdW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcblxuICAgIGNvbnN0IHsgZW1haWwsIGFjY291bnROYW1lLCByb2xlTmFtZSwgaWFtVXNlckFjY2Vzc1RvQmlsbGluZywgcGFyZW50LCBpbXBvcnRPbkR1cGxpY2F0ZSwgcmVtb3ZhbFBvbGljeSB9ID0gcHJvcHM7XG5cbiAgICBpZiAoIVZhbGlkYXRvcnMub2YoKS5lbWFpbChlbWFpbCkpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZEVycm9yKFwiVGhlIGFjY291bnQncyBlbWFpbCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIGFuZCBiZXR3ZWVuIDYgYW5kIDY0IGNoYXJhY3RlcnMgbG9uZy5cIik7XG4gICAgfVxuXG4gICAgaWYgKCFWYWxpZGF0b3JzLm9mKCkuYWNjb3VudE5hbWUoYWNjb3VudE5hbWUpKSB7XG4gICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRFcnJvcihcIlRoZSBhY2NvdW50J3MgbmFtZSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIGFuZCBiZXR3ZWVuIDEgYW5kIDUwIGNoYXJhY3RlcnMgbG9uZy5cIik7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlQWNjb3VudFByb3ZpZGVyID0gQWNjb3VudFByb3ZpZGVyLmdldE9yQ3JlYXRlKHRoaXMpO1xuICAgIGNvbnN0IGFjY291bnQgPSBuZXcgQ3VzdG9tUmVzb3VyY2UodGhpcywgXCJDcmVhdGVBY2NvdW50XCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogY3JlYXRlQWNjb3VudFByb3ZpZGVyLnByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206Ok9yZ2FuaXphdGlvbnNfQWNjb3VudFwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBFbWFpbDogZW1haWwsXG4gICAgICAgIEFjY291bnROYW1lOiBhY2NvdW50TmFtZSxcbiAgICAgICAgUm9sZU5hbWU6IHJvbGVOYW1lID8/IFwiT3JnYW5pemF0aW9uQWNjb3VudEFjY2Vzc1JvbGVcIixcbiAgICAgICAgSWFtVXNlckFjY2Vzc1RvQmlsbGluZzogaWFtVXNlckFjY2Vzc1RvQmlsbGluZyA/PyBJYW1Vc2VyQWNjZXNzVG9CaWxsaW5nLkFMTE9XLFxuICAgICAgICBQYXJlbnRJZDogcGFyZW50Py5pZGVudGlmaWVyKCksXG4gICAgICAgIEltcG9ydE9uRHVwbGljYXRlOiBTdHJpbmcoaW1wb3J0T25EdXBsaWNhdGUgPz8gdHJ1ZSksXG4gICAgICAgIFJlbW92YWxQb2xpY3k6IHJlbW92YWxQb2xpY3kgPz8gUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5hY2NvdW50SWQgPSBhY2NvdW50LmdldEF0dChcIkFjY291bnRJZFwiKS50b1N0cmluZygpO1xuICAgIHRoaXMuYWNjb3VudEFybiA9IGFjY291bnQuZ2V0QXR0KFwiQWNjb3VudEFyblwiKS50b1N0cmluZygpO1xuICAgIHRoaXMuYWNjb3VudE5hbWUgPSBhY2NvdW50LmdldEF0dChcIkFjY291bnROYW1lXCIpLnRvU3RyaW5nKCk7XG4gICAgdGhpcy5lbWFpbCA9IGFjY291bnQuZ2V0QXR0KFwiRW1haWxcIikudG9TdHJpbmcoKTtcblxuICAgIHRoaXMucmVzb3VyY2UgPSBhY2NvdW50O1xuXG4gICAgY29uc3QgdGFnUmVzb3VyY2UgPSBuZXcgVGFnUmVzb3VyY2UodGhpcywgXCJUYWdzXCIsIHsgcmVzb3VyY2VJZDogdGhpcy5hY2NvdW50SWQsIHRhZ3M6IHRoaXMudGFncy5yZW5kZXJlZFRhZ3MgfSk7XG4gICAgdGFnUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KGFjY291bnQpO1xuICB9XG5cbiAgaWRlbnRpZmllcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFjY291bnRJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGVzIHRydXN0ZWQgYWNjZXNzIGZvciB0aGUgQVdTIHNlcnZpY2UgKHRydXN0ZWQgc2VydmljZSkgYXMgPHN0cm9uZz5EZWxlZ2F0ZWQgQWRtaW5pc3RyYXRvcjwvc3Ryb25nPiwgd2hpY2ggcGVyZm9ybXMgdGFza3MgaW4geW91ciBvcmdhbml6YXRpb24gYW5kIGl0cyBhY2NvdW50cyBvbiB5b3VyIGJlaGFsZi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlcnZpY2VQcmluY2lwYWwgVGhlIHN1cHBvcnRlZCBBV1Mgc2VydmljZSB0aGF0IHlvdSBzcGVjaWZ5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWdpb24gVGhlIHJlZ2lvbiB0byBkZWxlZ2F0ZSBpblxuICAgKiBAcGFyYW0ge0RlbGVnYXRlZEFkbWluaXN0cmF0b3JQcm9wc30gcHJvcHMgYWRkaXRpb25hbCBEZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yIHByb3BzXG4gICAqL1xuICBwdWJsaWMgZGVsZWdhdGVBZG1pbmlzdHJhdG9yKHNlcnZpY2VQcmluY2lwYWw6IHN0cmluZywgcmVnaW9uPzogc3RyaW5nLCBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9KSB7XG4gICAgY29uc3Qgb3JnYW5pemF0aW9uc1JlZ2lvbiA9IHByb2Nlc3MuZW52LkNES19BV1NfUEFSVElUSU9OID09PSBcImF3cy1jblwiID8gXCJjbi1ub3J0aHdlc3QtMVwiIDogXCJ1cy1lYXN0LTFcIjtcbiAgICBjb25zdCBkZWxlZ2F0ZWRBZG1pbmlzdHJhdG9yID0gbmV3IERlbGVnYXRlZEFkbWluaXN0cmF0b3IoXG4gICAgICB0aGlzLnNjb3BlLFxuICAgICAgYERlbGVnYXRlJHtwYXNjYWxDYXNlKHNlcnZpY2VQcmluY2lwYWwpfSR7XG4gICAgICAgIHJlZ2lvbiAmJiByZWdpb24gIT09IG9yZ2FuaXphdGlvbnNSZWdpb24gPyBgLSR7cmVnaW9ufWAgOiBcIlwiXG4gICAgICB9LSR7TmFtZXMubm9kZVVuaXF1ZUlkKHRoaXMubm9kZSl9YCxcbiAgICAgIHtcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgIGFjY291bnQ6IHRoaXMsXG4gICAgICAgIHNlcnZpY2VQcmluY2lwYWw6IHNlcnZpY2VQcmluY2lwYWwsXG4gICAgICAgIHJlZ2lvbixcbiAgICAgIH1cbiAgICApO1xuICAgIGRlbGVnYXRlZEFkbWluaXN0cmF0b3Iubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucmVzb3VyY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHBvbGljeS4gQmVmb3JlIHlvdSBjYW4gYXR0YWNoIHRoZSBwb2xpY3ksIHlvdSBtdXN0IGVuYWJsZSB0aGF0IHBvbGljeSB0eXBlIGZvciB1c2UuIFlvdSBjYW4gdXNlIHBvbGljaWVzIHdoZW4geW91IGhhdmUgYWxsIGZlYXR1cmVzIGVuYWJsZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL29yZ2FuaXphdGlvbnMvbGF0ZXN0L3VzZXJndWlkZS9vcmdzX21hbmFnZV9wb2xpY2llcy5odG1sXG4gICAqL1xuICBwdWJsaWMgYXR0YWNoUG9saWN5KHBvbGljeTogSVBvbGljeSkge1xuICAgIGNvbnN0IHBvbGljeUF0dGFjaG1lbnQgPSBuZXcgUG9saWN5QXR0YWNobWVudChcbiAgICAgIHRoaXMuc2NvcGUsXG4gICAgICBgUG9saWN5QXR0YWNobWVudC0ke05hbWVzLm5vZGVVbmlxdWVJZCh0aGlzLm5vZGUpfS0ke05hbWVzLm5vZGVVbmlxdWVJZChwb2xpY3kubm9kZSl9YCxcbiAgICAgIHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzLFxuICAgICAgICBwb2xpY3k6IHBvbGljeSxcbiAgICAgIH1cbiAgICApO1xuICAgIHBvbGljeUF0dGFjaG1lbnQubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucmVzb3VyY2UsIHBvbGljeSk7XG4gIH1cbn1cbiJdfQ==