UNPKG

aws-gameservers

Version:
87 lines 16.6 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.GameServer = 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 aws_ec2_1 = require("aws-cdk-lib/aws-ec2"); const aws_backup_1 = require("aws-cdk-lib/aws-backup"); const aws_iam_1 = require("aws-cdk-lib/aws-iam"); /** * (experimental) An abstract class representing an EC2 instance with an optional AWS Backup Plan, Elastic IP Address, and new or imported VPC. * * The GameServer abstract class is meant to be *extended* via the creation of child classes, e.g. ValheimServer, SatisfactoryServer. * * @experimental */ class GameServer extends constructs_1.Construct { /** * @experimental */ constructor(scope, id, props) { var _b; super(scope, id); this.game = props.game; this.vpc = props.vpcId ? aws_ec2_1.Vpc.fromLookup(this, "importedVpc", { vpcId: props.vpcId }) : new aws_ec2_1.Vpc(this, `${this.game}ServerVpc`, { maxAzs: 2, subnetConfiguration: [ { name: `${this.game}PublicSubnet1`, subnetType: aws_ec2_1.SubnetType.PUBLIC, }, { name: `${this.game}PublicSubnet2`, subnetType: aws_ec2_1.SubnetType.PUBLIC, }, ], }); // Create a simple UserData object and expose it for expansion by child classes. this.userData = aws_ec2_1.UserData.forLinux(); // Instantiate a role for the server that has the SSMCore policy this.serverRole = new aws_iam_1.Role(this, `${this.game}ServerRole`, { assumedBy: new aws_iam_1.ServicePrincipal('ec2.amazonaws.com') }); this.serverRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore')); //Instantiate the Server security grou this.securityGroup = new aws_ec2_1.SecurityGroup(this, `${this.game}SecurityGroup`, { vpc: this.vpc }); // Instantiate the GameServer instance this.server = new aws_ec2_1.Instance(this, `${this.game}Server`, { blockDevices: [ { deviceName: "/dev/sda1", volume: aws_ec2_1.BlockDeviceVolume.ebs(props.rootVolumeSize && props.rootVolumeSize >= 15 ? props.rootVolumeSize : 50, { volumeType: aws_ec2_1.EbsDeviceVolumeType.GP3, }), }, ], instanceName: `CDK-GameServer-${this.game}`, instanceType: (_b = props.instanceType) !== null && _b !== void 0 ? _b : new aws_ec2_1.InstanceType("t3.medium"), machineImage: new aws_ec2_1.AmazonLinuxImage({ generation: aws_ec2_1.AmazonLinuxGeneration.AMAZON_LINUX_2022, }), propagateTagsToVolumeOnCreation: true, userData: this.userData, vpc: this.vpc, role: this.serverRole, securityGroup: this.securityGroup }); this.elasticIp = new aws_ec2_1.CfnEIP(this, `${this.game}ElasticIP`, { domain: "vpc", instanceId: this.server.instanceId, }); this.elasticIp.applyRemovalPolicy(props.releaseIPOnDelete !== false ? aws_cdk_lib_1.RemovalPolicy.DESTROY : aws_cdk_lib_1.RemovalPolicy.RETAIN); if (props.backupGameServer !== false) { const backupPlan = aws_backup_1.BackupPlan.dailyMonthly1YearRetention(this, `${this.game}ServerBackupPlan`); // @ts-ignore const backupSelection = new aws_backup_1.BackupSelection(this, `${this.game}BackupSelection`, { backupPlan, resources: [aws_backup_1.BackupResource.fromEc2Instance(this.server)], }); } } } exports.GameServer = GameServer; _a = JSII_RTTI_SYMBOL_1; GameServer[_a] = { fqn: "aws-gameservers.GameServer", version: "0.0.9" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2FtZVNlcnZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9HYW1lU2VydmVyL0dhbWVTZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNEM7QUFDNUMsMkNBQXVDO0FBQ3ZDLGlEQWE2QjtBQUM3Qix1REFBcUY7QUFDckYsaURBQW1GOzs7Ozs7OztBQWdEbkYsTUFBc0IsVUFBVyxTQUFRLHNCQUFTOzs7O0lBUzlDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7O1FBQzVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSyxDQUFDO1FBRXhCLElBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUs7WUFDbEIsQ0FBQyxDQUFDLGFBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0QsQ0FBQyxDQUFDLElBQUksYUFBRyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRTtnQkFDbkMsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsbUJBQW1CLEVBQUU7b0JBQ2pCO3dCQUNJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLGVBQWU7d0JBQ2pDLFVBQVUsRUFBRSxvQkFBVSxDQUFDLE1BQU07cUJBQ2hDO29CQUNEO3dCQUNJLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLGVBQWU7d0JBQ2pDLFVBQVUsRUFBRSxvQkFBVSxDQUFDLE1BQU07cUJBQ2hDO2lCQUNKO2FBQ0osQ0FBQyxDQUFDO1FBRVQsZ0ZBQWdGO1FBQ2hGLElBQUksQ0FBQyxRQUFRLEdBQUcsa0JBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVwQyxnRUFBZ0U7UUFDaEUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGNBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSwwQkFBZ0IsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFDLENBQUMsQ0FBQTtRQUNuSCxJQUFJLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLHVCQUFhLENBQUMsd0JBQXdCLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFBO1FBRXhHLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksdUJBQWEsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsSUFBSSxlQUFlLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7UUFFNUYsc0NBQXNDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxrQkFBUSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLFFBQVEsRUFBRTtZQUNuRCxZQUFZLEVBQUU7Z0JBQ1Y7b0JBQ0ksVUFBVSxFQUFFLFdBQVc7b0JBQ3ZCLE1BQU0sRUFBRSwyQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUMzRyxVQUFVLEVBQUUsNkJBQW1CLENBQUMsR0FBRztxQkFDdEMsQ0FBQztpQkFDTDthQUNKO1lBQ0QsWUFBWSxFQUFFLGtCQUFrQixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQzNDLFlBQVksUUFBRSxLQUFLLENBQUMsWUFBWSxtQ0FBSSxJQUFJLHNCQUFZLENBQUMsV0FBVyxDQUFDO1lBQ2pFLFlBQVksRUFBRSxJQUFJLDBCQUFnQixDQUFDO2dCQUMvQixVQUFVLEVBQUUsK0JBQXFCLENBQUMsaUJBQWlCO2FBQ3RELENBQUM7WUFDRiwrQkFBK0IsRUFBRSxJQUFJO1lBQ3JDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7WUFDYixJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDckIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1NBQ3BDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxnQkFBTSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLFdBQVcsRUFBRTtZQUN2RCxNQUFNLEVBQUUsS0FBSztZQUNiLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVU7U0FDckMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FDN0IsS0FBSyxDQUFDLGlCQUFpQixLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsMkJBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLDJCQUFhLENBQUMsTUFBTSxDQUNuRixDQUFDO1FBRUYsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEtBQUssS0FBSyxFQUFFO1lBQ2xDLE1BQU0sVUFBVSxHQUFHLHVCQUFVLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLElBQUksa0JBQWtCLENBQUMsQ0FBQztZQUMvRixhQUFhO1lBQ2IsTUFBTSxlQUFlLEdBQUcsSUFBSSw0QkFBZSxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLGlCQUFpQixFQUFFO2dCQUM3RSxVQUFVO2dCQUNWLFNBQVMsRUFBRSxDQUFDLDJCQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMzRCxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7O0FBL0VMLGdDQWdGQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlbW92YWxQb2xpY3kgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICAgIEFtYXpvbkxpbnV4R2VuZXJhdGlvbixcbiAgICBBbWF6b25MaW51eEltYWdlLFxuICAgIEJsb2NrRGV2aWNlVm9sdW1lLFxuICAgIENmbkVJUCxcbiAgICBFYnNEZXZpY2VWb2x1bWVUeXBlLFxuICAgIElJbnN0YW5jZSxcbiAgICBJbnN0YW5jZSxcbiAgICBJbnN0YW5jZVR5cGUsIElTZWN1cml0eUdyb3VwLFxuICAgIElWcGMsIFNlY3VyaXR5R3JvdXAsXG4gICAgU3VibmV0VHlwZSxcbiAgICBVc2VyRGF0YSxcbiAgICBWcGMsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgQmFja3VwUGxhbiwgQmFja3VwUmVzb3VyY2UsIEJhY2t1cFNlbGVjdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYmFja3VwXCI7XG5pbXBvcnQgeyBJUm9sZSwgTWFuYWdlZFBvbGljeSwgUm9sZSwgU2VydmljZVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIEdhbWVTZXJ2ZXJQcm9wcyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICByZWFkb25seSBnYW1lPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICByZWFkb25seSBpbnN0YW5jZVR5cGU/OiBJbnN0YW5jZVR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIHJlYWRvbmx5IHJvb3RWb2x1bWVTaXplPzogbnVtYmVyO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICByZWFkb25seSByZWxlYXNlSVBPbkRlbGV0ZT86IGJvb2xlYW47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgcmVhZG9ubHkgYmFja3VwR2FtZVNlcnZlcj86IGJvb2xlYW47XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBpbnRlcmZhY2UgSUdhbWVTZXJ2ZXIge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIHJlYWRvbmx5IGdhbWU6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIHJlYWRvbmx5IHZwYzogSVZwYztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgIHJlYWRvbmx5IHNlcnZlcjogSUluc3RhbmNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgcmVhZG9ubHkgZWxhc3RpY0lwOiBDZm5FSVA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICB1c2VyRGF0YTogVXNlckRhdGE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICBzZXJ2ZXJSb2xlOiBJUm9sZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgc2VjdXJpdHlHcm91cDogSVNlY3VyaXR5R3JvdXA7XG59XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR2FtZVNlcnZlciBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElHYW1lU2VydmVyIHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgZ2FtZTogc3RyaW5nO1xuICAgIHB1YmxpYyByZWFkb25seSB2cGM6IElWcGM7XG4gICAgcHVibGljIHJlYWRvbmx5IHNlcnZlcjogSUluc3RhbmNlO1xuICAgIHB1YmxpYyByZWFkb25seSBlbGFzdGljSXA6IENmbkVJUDtcbiAgICBwdWJsaWMgdXNlckRhdGE6IFVzZXJEYXRhO1xuICAgIHB1YmxpYyBzZXJ2ZXJSb2xlOiBJUm9sZTtcbiAgICBwdWJsaWMgc2VjdXJpdHlHcm91cDogSVNlY3VyaXR5R3JvdXA7XG5cbiAgICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogR2FtZVNlcnZlclByb3BzKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAgICAgdGhpcy5nYW1lID0gcHJvcHMuZ2FtZSE7XG5cbiAgICAgICAgdGhpcy52cGMgPSBwcm9wcy52cGNJZFxuICAgICAgICAgICAgPyBWcGMuZnJvbUxvb2t1cCh0aGlzLCBcImltcG9ydGVkVnBjXCIsIHsgdnBjSWQ6IHByb3BzLnZwY0lkIH0pXG4gICAgICAgICAgICA6IG5ldyBWcGModGhpcywgYCR7dGhpcy5nYW1lfVNlcnZlclZwY2AsIHtcbiAgICAgICAgICAgICAgICAgIG1heEF6czogMixcbiAgICAgICAgICAgICAgICAgIHN1Ym5ldENvbmZpZ3VyYXRpb246IFtcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke3RoaXMuZ2FtZX1QdWJsaWNTdWJuZXQxYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUMsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke3RoaXMuZ2FtZX1QdWJsaWNTdWJuZXQyYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibmV0VHlwZTogU3VibmV0VHlwZS5QVUJMSUMsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIHNpbXBsZSBVc2VyRGF0YSBvYmplY3QgYW5kIGV4cG9zZSBpdCBmb3IgZXhwYW5zaW9uIGJ5IGNoaWxkIGNsYXNzZXMuXG4gICAgICAgIHRoaXMudXNlckRhdGEgPSBVc2VyRGF0YS5mb3JMaW51eCgpO1xuXG4gICAgICAgIC8vIEluc3RhbnRpYXRlIGEgcm9sZSBmb3IgdGhlIHNlcnZlciB0aGF0IGhhcyB0aGUgU1NNQ29yZSBwb2xpY3lcbiAgICAgICAgdGhpcy5zZXJ2ZXJSb2xlID0gbmV3IFJvbGUodGhpcywgYCR7dGhpcy5nYW1lfVNlcnZlclJvbGVgLCB7IGFzc3VtZWRCeTogbmV3IFNlcnZpY2VQcmluY2lwYWwoJ2VjMi5hbWF6b25hd3MuY29tJyl9KVxuICAgICAgICB0aGlzLnNlcnZlclJvbGUuYWRkTWFuYWdlZFBvbGljeShNYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQW1hem9uU1NNTWFuYWdlZEluc3RhbmNlQ29yZScpKVxuXG4gICAgICAgIC8vSW5zdGFudGlhdGUgdGhlIFNlcnZlciBzZWN1cml0eSBncm91XG4gICAgICAgIHRoaXMuc2VjdXJpdHlHcm91cCA9IG5ldyBTZWN1cml0eUdyb3VwKHRoaXMsIGAke3RoaXMuZ2FtZX1TZWN1cml0eUdyb3VwYCwgeyB2cGM6IHRoaXMudnBjIH0pXG5cbiAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIEdhbWVTZXJ2ZXIgaW5zdGFuY2VcbiAgICAgICAgdGhpcy5zZXJ2ZXIgPSBuZXcgSW5zdGFuY2UodGhpcywgYCR7dGhpcy5nYW1lfVNlcnZlcmAsIHtcbiAgICAgICAgICAgIGJsb2NrRGV2aWNlczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZTogXCIvZGV2L3NkYTFcIixcbiAgICAgICAgICAgICAgICAgICAgdm9sdW1lOiBCbG9ja0RldmljZVZvbHVtZS5lYnMocHJvcHMucm9vdFZvbHVtZVNpemUgJiYgcHJvcHMucm9vdFZvbHVtZVNpemUgPj0gMTUgPyBwcm9wcy5yb290Vm9sdW1lU2l6ZSEgOiA1MCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lVHlwZTogRWJzRGV2aWNlVm9sdW1lVHlwZS5HUDMsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgaW5zdGFuY2VOYW1lOiBgQ0RLLUdhbWVTZXJ2ZXItJHt0aGlzLmdhbWV9YCxcbiAgICAgICAgICAgIGluc3RhbmNlVHlwZTogcHJvcHMuaW5zdGFuY2VUeXBlID8/IG5ldyBJbnN0YW5jZVR5cGUoXCJ0My5tZWRpdW1cIiksXG4gICAgICAgICAgICBtYWNoaW5lSW1hZ2U6IG5ldyBBbWF6b25MaW51eEltYWdlKHtcbiAgICAgICAgICAgICAgICBnZW5lcmF0aW9uOiBBbWF6b25MaW51eEdlbmVyYXRpb24uQU1BWk9OX0xJTlVYXzIwMjIsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHByb3BhZ2F0ZVRhZ3NUb1ZvbHVtZU9uQ3JlYXRpb246IHRydWUsXG4gICAgICAgICAgICB1c2VyRGF0YTogdGhpcy51c2VyRGF0YSxcbiAgICAgICAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICAgICAgICByb2xlOiB0aGlzLnNlcnZlclJvbGUsXG4gICAgICAgICAgICBzZWN1cml0eUdyb3VwOiB0aGlzLnNlY3VyaXR5R3JvdXBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5lbGFzdGljSXAgPSBuZXcgQ2ZuRUlQKHRoaXMsIGAke3RoaXMuZ2FtZX1FbGFzdGljSVBgLCB7XG4gICAgICAgICAgICBkb21haW46IFwidnBjXCIsXG4gICAgICAgICAgICBpbnN0YW5jZUlkOiB0aGlzLnNlcnZlci5pbnN0YW5jZUlkLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmVsYXN0aWNJcC5hcHBseVJlbW92YWxQb2xpY3koXG4gICAgICAgICAgICBwcm9wcy5yZWxlYXNlSVBPbkRlbGV0ZSAhPT0gZmFsc2UgPyBSZW1vdmFsUG9saWN5LkRFU1RST1kgOiBSZW1vdmFsUG9saWN5LlJFVEFJTlxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChwcm9wcy5iYWNrdXBHYW1lU2VydmVyICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc3QgYmFja3VwUGxhbiA9IEJhY2t1cFBsYW4uZGFpbHlNb250aGx5MVllYXJSZXRlbnRpb24odGhpcywgYCR7dGhpcy5nYW1lfVNlcnZlckJhY2t1cFBsYW5gKTtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGJhY2t1cFNlbGVjdGlvbiA9IG5ldyBCYWNrdXBTZWxlY3Rpb24odGhpcywgYCR7dGhpcy5nYW1lfUJhY2t1cFNlbGVjdGlvbmAsIHtcbiAgICAgICAgICAgICAgICBiYWNrdXBQbGFuLFxuICAgICAgICAgICAgICAgIHJlc291cmNlczogW0JhY2t1cFJlc291cmNlLmZyb21FYzJJbnN0YW5jZSh0aGlzLnNlcnZlcildLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=