@cdklabs/cdk-amazonmq
Version:
<!--BEGIN STABILITY BANNER-->
175 lines • 32 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ActiveMqBrokerRedundantPair = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
/*
Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
const aws_cdk_lib_1 = require("aws-cdk-lib");
const activemq_broker_deployment_1 = require("./activemq-broker-deployment");
const broker_deployment_mode_1 = require("../broker-deployment-mode");
/**
* A representation of an active/standby broker that is comprised of two brokers in two different Availability Zones.
*
* Additional optimizations:
* - When subnet selection returns more then 2 subnets. Construct picks first two that do belong to different AZ. Warning is annotated. If subnet selection does not meet AZ criteria an error is thrown.
*
*
* see: https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/active-standby-broker-deployment.html
*/
class ActiveMqBrokerRedundantPair extends activemq_broker_deployment_1.ActiveMqBrokerDeploymentBase {
/**
* Reference an existing ActiveMQ Broker Redundant Pair, defined outside of the CDK code, by ARN.
*
* @param scope
* @param logicalId the construct's logical ID
* @param arn the ARN of the existing ActiveMQ Broker Redundant Pair that is imported
* @param securityGroups optionally pass security groups for working with network connections
* @returns a representation of the ActiveMQ Broker Redundant Pair
*/
static fromActiveMqBrokerRedundantPairArn(scope, logicalId, arn, securityGroups) {
return ActiveMqBrokerRedundantPair._assignEndpoints(ActiveMqBrokerRedundantPair._fromActiveMqBrokerDeploymentAttributes(scope, logicalId, arn, undefined, undefined, securityGroups));
}
/**
* Reference an existing ActiveMQ Broker Redundant Pair, defined outside of the CDK code, by its name and id.
*
* @param scope
* @param logicalId
* @param name the name of the existing ActiveMQ Broker Redundant Pair to be imported
* @param id the ID of the existing ActiveMQ Broker Redundant Pair to be imported
* @param securityGroups (optional) pass security groups for working with network connections
* @returns a representation of the ActiveMQ Broker Redundant Pair
*/
static fromActiveMqBrokerRedundantPairNameAndId(scope, logicalId, name, id, securityGroups) {
return ActiveMqBrokerRedundantPair._assignEndpoints(ActiveMqBrokerRedundantPair._fromActiveMqBrokerDeploymentAttributes(scope, logicalId, undefined, name, id, securityGroups));
}
/**
*
* @internal
*/
static _assignEndpoints(imported) {
return Object.assign(imported, {
first: ActiveMqBrokerRedundantPair._buildActiveMqBroker(imported, "-1"),
second: ActiveMqBrokerRedundantPair._buildActiveMqBroker(imported, "-2"),
});
}
constructor(scope, id, props) {
let subnetSelection = props.vpcSubnets;
/* START - Validate subnets and select two with different AZ if more then 2 where found */
// This flag is used to determine if a annotation needs to be done
const annotations = {
warnings: new Array(),
errors: new Array(),
};
// check if subnet selection has been specified
if (props.vpcSubnets && props.vpc) {
let subnets = props.vpc?.selectSubnets(props.vpcSubnets);
if (subnets) {
if (subnets?.subnets.length < 2) {
annotations.errors.push(`Need exactly 2 subnets. '${JSON.stringify(props.vpcSubnets)}', please use a different selection.`);
}
if (subnets?.subnets.length >= 2) {
const azSubnet = [];
// find first two entries that has different az from subnets.availabilityZones
subnets.subnets.find((subnet, index) => {
const candidates = subnets.subnets.filter((p) => p.availabilityZone != subnet.availabilityZone);
if (candidates.length > 0) {
azSubnet.push(subnets.subnets[index]);
azSubnet.push(candidates[0]);
return true;
}
return false;
});
if (azSubnet.length >= 2) {
// take only first two
subnetSelection = { subnets: [azSubnet[0], azSubnet[1]] };
// display warning if other were rejected
if (azSubnet.length > 2) {
annotations.warnings.push(`Need exactly 2 subnets from different AZ found more. Selecting only two from different AZs: ${azSubnet[0].subnetId}, ${azSubnet[1].subnetId}`);
}
}
else {
annotations.warnings.push(`Requirement for exactly 2 subnets from different AZ is not be meet with '${JSON.stringify(props.vpcSubnets)}'`);
}
}
}
}
/* END - Validate subnets and select two with different AZ if more then 2 where found */
super(scope, id, {
...props,
vpcSubnets: subnetSelection,
deploymentMode: broker_deployment_mode_1.BrokerDeploymentMode.ACTIVE_STANDBY_MULTI_AZ,
});
// Provide Annotation to the resource.
if (annotations.warnings.length > 0) {
annotations.warnings.forEach((msg) => aws_cdk_lib_1.Annotations.of(this).addWarning(msg));
}
if (annotations.errors.length > 0) {
annotations.errors.forEach((msg) => aws_cdk_lib_1.Annotations.of(this).addWarning(msg));
}
this.first = {
endpoints: {
amqp: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrAmqpEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrAmqpEndpoints)))),
},
stomp: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrStompEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrStompEndpoints)))),
},
openWire: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrOpenWireEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrOpenWireEndpoints)))),
},
mqtt: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrMqttEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrMqttEndpoints)))),
},
wss: {
url: aws_cdk_lib_1.Fn.select(0, this._resource.attrWssEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(0, this._resource.attrWssEndpoints)))),
},
console: {
url: `https://${this.id}-1.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:8162`,
port: 8162,
},
},
ipAddress: aws_cdk_lib_1.Fn.select(0, this._resource.attrIpAddresses),
};
this.second = {
endpoints: {
amqp: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrAmqpEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrAmqpEndpoints)))),
},
stomp: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrStompEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrStompEndpoints)))),
},
openWire: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrOpenWireEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrOpenWireEndpoints)))),
},
mqtt: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrMqttEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrMqttEndpoints)))),
},
wss: {
url: aws_cdk_lib_1.Fn.select(1, this._resource.attrWssEndpoints),
port: aws_cdk_lib_1.Token.asNumber(aws_cdk_lib_1.Fn.select(2, aws_cdk_lib_1.Fn.split(":", aws_cdk_lib_1.Fn.select(1, this._resource.attrWssEndpoints)))),
},
console: {
url: `https://${this.id}-2.mq.${aws_cdk_lib_1.Aws.REGION}.${aws_cdk_lib_1.Aws.URL_SUFFIX}:8162`,
port: 8162,
},
},
ipAddress: aws_cdk_lib_1.Fn.select(1, this._resource.attrIpAddresses),
};
}
}
exports.ActiveMqBrokerRedundantPair = ActiveMqBrokerRedundantPair;
_a = JSII_RTTI_SYMBOL_1;
ActiveMqBrokerRedundantPair[_a] = { fqn: "@cdklabs/cdk-amazonmq.ActiveMqBrokerRedundantPair", version: "0.1.8" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZlbXEtYnJva2VyLXJlZHVuZGFudC1wYWlyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjdGl2ZW1xL2FjdGl2ZW1xLWJyb2tlci1yZWR1bmRhbnQtcGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7RUFHRTtBQUNGLDZDQUEwRDtBQUkxRCw2RUFJc0M7QUFDdEMsc0VBQWlFO0FBV2pFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBYSwyQkFDWCxTQUFRLHlEQUE0QjtJQUdwQzs7Ozs7Ozs7T0FRRztJQUNJLE1BQU0sQ0FBQyxrQ0FBa0MsQ0FDOUMsS0FBZ0IsRUFDaEIsU0FBaUIsRUFDakIsR0FBVyxFQUNYLGNBQWlDO1FBRWpDLE9BQU8sMkJBQTJCLENBQUMsZ0JBQWdCLENBQ2pELDJCQUEyQixDQUFDLHVDQUF1QyxDQUNqRSxLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFDSCxTQUFTLEVBQ1QsU0FBUyxFQUNULGNBQWMsQ0FDZixDQUNGLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLHdDQUF3QyxDQUNwRCxLQUFnQixFQUNoQixTQUFpQixFQUNqQixJQUFZLEVBQ1osRUFBVSxFQUNWLGNBQWlDO1FBRWpDLE9BQU8sMkJBQTJCLENBQUMsZ0JBQWdCLENBQ2pELDJCQUEyQixDQUFDLHVDQUF1QyxDQUNqRSxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osRUFBRSxFQUNGLGNBQWMsQ0FDZixDQUM4QixDQUFDO0lBQ3BDLENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQUMsZ0JBQWdCLENBQzdCLFFBQW1DO1FBRW5DLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7WUFDN0IsS0FBSyxFQUFFLDJCQUEyQixDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUM7WUFDdkUsTUFBTSxFQUFFLDJCQUEyQixD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T0FBTztvQkFDbkUsSUFBSSxFQUFFLElBQUk7aUJBQ1g7YUFDRjtZQUNELFNBQVMsRUFBRSxnQkFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUM7U0FDeEQsQ0FBQztJQUNKLENBQUM7O0FBalJILGtFQWtSQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4qL1xuaW1wb3J0IHsgQXdzLCBGbiwgVG9rZW4sIEFubm90YXRpb25zIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBJU3VibmV0LCBJU2VjdXJpdHlHcm91cCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgSUFjdGl2ZU1xQnJva2VyIH0gZnJvbSBcIi4vYWN0aXZlbXEtYnJva2VyXCI7XG5pbXBvcnQge1xuICBBY3RpdmVNcUJyb2tlckRlcGxveW1lbnRCYXNlLFxuICBBY3RpdmVNcUJyb2tlckRlcGxveW1lbnRQcm9wcyxcbiAgSUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudCxcbn0gZnJvbSBcIi4vYWN0aXZlbXEtYnJva2VyLWRlcGxveW1lbnRcIjtcbmltcG9ydCB7IEJyb2tlckRlcGxveW1lbnRNb2RlIH0gZnJvbSBcIi4uL2Jyb2tlci1kZXBsb3ltZW50LW1vZGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyXG4gIGV4dGVuZHMgSUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudCB7XG4gIHJlYWRvbmx5IGZpcnN0OiBJQWN0aXZlTXFCcm9rZXI7XG4gIHJlYWRvbmx5IHNlY29uZDogSUFjdGl2ZU1xQnJva2VyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpclByb3BzXG4gIGV4dGVuZHMgQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50UHJvcHMge31cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGFuIGFjdGl2ZS9zdGFuZGJ5IGJyb2tlciB0aGF0IGlzIGNvbXByaXNlZCBvZiB0d28gYnJva2VycyBpbiB0d28gZGlmZmVyZW50IEF2YWlsYWJpbGl0eSBab25lcy5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGltaXphdGlvbnM6XG4gKiAtIFdoZW4gc3VibmV0IHNlbGVjdGlvbiByZXR1cm5zIG1vcmUgdGhlbiAyIHN1Ym5ldHMuIENvbnN0cnVjdCBwaWNrcyBmaXJzdCB0d28gdGhhdCBkbyBiZWxvbmcgdG8gZGlmZmVyZW50IEFaLiBXYXJuaW5nIGlzIGFubm90YXRlZC4gSWYgc3VibmV0IHNlbGVjdGlvbiBkb2VzIG5vdCBtZWV0IEFaIGNyaXRlcmlhIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKlxuICogc2VlOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1hem9uLW1xL2xhdGVzdC9kZXZlbG9wZXItZ3VpZGUvYWN0aXZlLXN0YW5kYnktYnJva2VyLWRlcGxveW1lbnQuaHRtbFxuICovXG5leHBvcnQgY2xhc3MgQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyXG4gIGV4dGVuZHMgQWN0aXZlTXFCcm9rZXJEZXBsb3ltZW50QmFzZVxuICBpbXBsZW1lbnRzIElBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXJcbntcbiAgLyoqXG4gICAqIFJlZmVyZW5jZSBhbiBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIsIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgQ0RLIGNvZGUsIGJ5IEFSTi5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqIEBwYXJhbSBsb2dpY2FsSWQgdGhlIGNvbnN0cnVjdCdzIGxvZ2ljYWwgSURcbiAgICogQHBhcmFtIGFybiB0aGUgQVJOIG9mIHRoZSBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIgdGhhdCBpcyBpbXBvcnRlZFxuICAgKiBAcGFyYW0gc2VjdXJpdHlHcm91cHMgb3B0aW9uYWxseSBwYXNzIHNlY3VyaXR5IGdyb3VwcyBmb3Igd29ya2luZyB3aXRoIG5ldHdvcmsgY29ubmVjdGlvbnNcbiAgICogQHJldHVybnMgYSByZXByZXNlbnRhdGlvbiBvZiB0aGUgQWN0aXZlTVEgQnJva2VyIFJlZHVuZGFudCBQYWlyXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXJBcm4oXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBsb2dpY2FsSWQ6IHN0cmluZyxcbiAgICBhcm46IHN0cmluZyxcbiAgICBzZWN1cml0eUdyb3Vwcz86IElTZWN1cml0eUdyb3VwW10sXG4gICk6IElBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIge1xuICAgIHJldHVybiBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIuX2Fzc2lnbkVuZHBvaW50cyhcbiAgICAgIEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpci5fZnJvbUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudEF0dHJpYnV0ZXMoXG4gICAgICAgIHNjb3BlLFxuICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgIGFybixcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHNlY3VyaXR5R3JvdXBzLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSBhbiBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIsIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgQ0RLIGNvZGUsIGJ5IGl0cyBuYW1lIGFuZCBpZC5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqIEBwYXJhbSBsb2dpY2FsSWRcbiAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV4aXN0aW5nIEFjdGl2ZU1RIEJyb2tlciBSZWR1bmRhbnQgUGFpciB0byBiZSBpbXBvcnRlZFxuICAgKiBAcGFyYW0gaWQgdGhlIElEIG9mIHRoZSBleGlzdGluZyBBY3RpdmVNUSBCcm9rZXIgUmVkdW5kYW50IFBhaXIgdG8gYmUgaW1wb3J0ZWRcbiAgICogQHBhcmFtIHNlY3VyaXR5R3JvdXBzIChvcHRpb25hbCkgcGFzcyBzZWN1cml0eSBncm91cHMgZm9yIHdvcmtpbmcgd2l0aCBuZXR3b3JrIGNvbm5lY3Rpb25zXG4gICAqIEByZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIEFjdGl2ZU1RIEJyb2tlciBSZWR1bmRhbnQgUGFpclxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyTmFtZUFuZElkKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgc2VjdXJpdHlHcm91cHM/OiBJU2VjdXJpdHlHcm91cFtdLFxuICApIHtcbiAgICByZXR1cm4gQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyLl9hc3NpZ25FbmRwb2ludHMoXG4gICAgICBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIuX2Zyb21BY3RpdmVNcUJyb2tlckRlcGxveW1lbnRBdHRyaWJ1dGVzKFxuICAgICAgICBzY29wZSxcbiAgICAgICAgbG9naWNhbElkLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGlkLFxuICAgICAgICBzZWN1cml0eUdyb3VwcyxcbiAgICAgICksXG4gICAgKSBhcyBJQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2Fzc2lnbkVuZHBvaW50cyhcbiAgICBpbXBvcnRlZDogSUFjdGl2ZU1xQnJva2VyRGVwbG95bWVudCxcbiAgKTogSUFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpciB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW1wb3J0ZWQsIHtcbiAgICAgIGZpcnN0OiBBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIuX2J1aWxkQWN0aXZlTXFCcm9rZXIoaW1wb3J0ZWQsIFwiLTFcIiksXG4gICAgICBzZWNvbmQ6IEFjdGl2ZU1xQnJva2VyUmVkdW5kYW50UGFpci5fYnVpbGRBY3RpdmVNcUJyb2tlcihpbXBvcnRlZCwgXCItMlwiKSxcbiAgICB9IGFzIElBY3RpdmVNcUJyb2tlclJlZHVuZGFudFBhaXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmaXJzdCBicm9rZXIgb2YgdGhlIHJlZHVuZGFudCBwYWlyIGZvciB0aGUgZGVwbG95bWVudC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmaXJzdDogSUFjdGl2ZU1xQnJva2VyO1xuXG4gIC8qKlxuICAgKiBUaGUgc2Vjb25kIGJyb2tlciBvZiB0aGUgcmVkdW5kYW50IHBhaXIgZm9yIHRoZSBkZXBsb3ltZW50LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlY29uZDogSUFjdGl2ZU1xQnJva2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogQWN0aXZlTXFCcm9rZXJSZWR1bmRhbnRQYWlyUHJvcHMsXG4gICkge1xuICAgIGxldCBzdWJuZXRTZWxlY3Rpb24gPSBwcm9wcy52cGNTdWJuZXRzO1xuXG4gICAgLyogU1RBUlQgLSBWYWxpZGF0ZSBzdWJuZXRzIGFuZCBzZWxlY3QgdHdvIHdpdGggZGlmZmVyZW50IEFaIGlmIG1vcmUgdGhlbiAyIHdoZXJlIGZvdW5kICovXG4gICAgLy8gVGhpcyBmbGFnIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGEgYW5ub3RhdGlvbiBuZWVkcyB0byBiZSBkb25lXG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSB7XG4gICAgICB3YXJuaW5nczogbmV3IEFycmF5PHN0cmluZz4oKSxcbiAgICAgIGVycm9yczogbmV3IEFycmF5PHN0cmluZz4oKSxcbiAgICB9O1xuXG4gICAgLy8gY2hlY2sgaWYgc3VibmV0IHNlbGVjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWRcbiAgICBpZiAocHJvcHMudnBjU3VibmV0cyAmJiBwcm9wcy52cGMpIHtcbiAgICAgIGxldCBzdWJuZXRzID0gcHJvcHMudnBjPy5zZWxlY3RTdWJuZXRzKHByb3BzLnZwY1N1Ym5ldHMpO1xuXG4gICAgICBpZiAoc3VibmV0cykge1xuICAgICAgICBpZiAoc3VibmV0cz8uc3VibmV0cy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgYW5ub3RhdGlvbnMuZXJyb3JzLnB1c2goXG4gICAgICAgICAgICBgTmVlZCBleGFjdGx5IDIgc3VibmV0cy4gJyR7SlNPTi5zdHJpbmdpZnkocHJvcHMudnBjU3VibmV0cyl9JywgcGxlYXNlIHVzZSBhIGRpZmZlcmVudCBzZWxlY3Rpb24uYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN1Ym5ldHM/LnN1Ym5ldHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICBjb25zdCBhelN1Ym5ldDogSVN1Ym5ldFtdID0gW107XG5cbiAgICAgICAgICAvLyBmaW5kIGZpcnN0IHR3byBlbnRyaWVzIHRoYXQgaGFzIGRpZmZlcmVudCBheiBmcm9tIHN1Ym5ldHMuYXZhaWxhYmlsaXR5Wm9uZXNcbiAgICAgICAgICBzdWJuZXRzLnN1Ym5ldHMuZmluZCgoc3VibmV0LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHN1Ym5ldHMuc3VibmV0cy5maWx0ZXIoXG4gICAgICAgICAgICAgIChwKSA9PiBwLmF2YWlsYWJpbGl0eVpvbmUgIT0gc3VibmV0LmF2YWlsYWJpbGl0eVpvbmUsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGF6U3VibmV0LnB1c2goc3VibmV0cy5zdWJuZXRzW2luZGV4XSk7XG4gICAgICAgICAgICAgIGF6U3VibmV0LnB1c2goY2FuZGlkYXRlc1swXSk7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoYXpTdWJuZXQubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgIC8vIHRha2Ugb25seSBmaXJzdCB0d29cbiAgICAgICAgICAgIHN1Ym5ldFNlbGVjdGlvbiA9IHsgc3VibmV0czogW2F6U3VibmV0WzBdLCBhelN1Ym5ldFsxXV0gfTtcblxuICAgICAgICAgICAgLy8gZGlzcGxheSB3YXJuaW5nIGlmIG90aGVyIHdlcmUgcmVqZWN0ZWRcbiAgICAgICAgICAgIGlmIChhelN1Ym5ldC5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICAgIGFubm90YXRpb25zLndhcm5pbmdzLnB1c2goXG4gICAgICAgICAgICAgICAgYE5lZWQgZXhhY3RseSAyIHN1Ym5ldHMgZnJvbSBkaWZmZXJlbnQgQVogZm91bmQgbW9yZS4gU2VsZWN0aW5nIG9ubHkgdHdvIGZyb20gZGlmZmVyZW50IEFaczogJHthelN1Ym5ldFswXS5zdWJuZXRJZH0sICR7YXpTdWJuZXRbMV0uc3VibmV0SWR9YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnMud2FybmluZ3MucHVzaChcbiAgICAgICAgICAgICAgYFJlcXVpcmVtZW50IGZvciBleGFjdGx5IDIgc3VibmV0cyBmcm9tIGRpZmZlcmVudCBBWiBpcyBub3QgYmUgbWVldCB3aXRoICcke0pTT04uc3RyaW5naWZ5KHByb3BzLnZwY1N1Ym5ldHMpfSdgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBFTkQgLSBWYWxpZGF0ZSBzdWJuZXRzIGFuZCBzZWxlY3QgdHdvIHdpdGggZGlmZmVyZW50IEFaIGlmIG1vcmUgdGhlbiAyIHdoZXJlIGZvdW5kICovXG5cbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgdnBjU3VibmV0czogc3VibmV0U2VsZWN0aW9uLFxuICAgICAgZGVwbG95bWVudE1vZGU6IEJyb2tlckRlcGxveW1lbnRNb2RlLkFDVElWRV9TVEFOREJZX01VTFRJX0FaLFxuICAgIH0pO1xuXG4gICAgLy8gUHJvdmlkZSBBbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZS5cbiAgICBpZiAoYW5ub3RhdGlvbnMud2FybmluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgYW5ub3RhdGlvbnMud2FybmluZ3MuZm9yRWFjaCgobXNnKSA9PlxuICAgICAgICBBbm5vdGF0aW9ucy5vZih0aGlzKS5hZGRXYXJuaW5nKG1zZyksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChhbm5vdGF0aW9ucy5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgYW5ub3RhdGlvbnMuZXJyb3JzLmZvckVhY2goKG1zZykgPT4gQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZyhtc2cpKTtcbiAgICB9XG5cbiAgICB0aGlzLmZpcnN0ID0ge1xuICAgICAgZW5kcG9pbnRzOiB7XG4gICAgICAgIGFtcXA6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyQW1xcEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0ckFtcXBFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RvbXA6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyU3RvbXBFbmRwb2ludHMpLFxuICAgICAgICAgIHBvcnQ6IFRva2VuLmFzTnVtYmVyKFxuICAgICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICBGbi5zcGxpdChcIjpcIiwgRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJTdG9tcEVuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBvcGVuV2lyZToge1xuICAgICAgICAgIHVybDogRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJPcGVuV2lyZUVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0ck9wZW5XaXJlRW5kcG9pbnRzKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1xdHQ6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgwLCB0aGlzLl9yZXNvdXJjZS5hdHRyTXF0dEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0ck1xdHRFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgd3NzOiB7XG4gICAgICAgICAgdXJsOiBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0cldzc0VuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMCwgdGhpcy5fcmVzb3VyY2UuYXR0cldzc0VuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBjb25zb2xlOiB7XG4gICAgICAgICAgdXJsOiBgaHR0cHM6Ly8ke3RoaXMuaWR9LTEubXEuJHtBd3MuUkVHSU9OfS4ke0F3cy5VUkxfU1VGRklYfTo4MTYyYCxcbiAgICAgICAgICBwb3J0OiA4MTYyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlwQWRkcmVzczogRm4uc2VsZWN0KDAsIHRoaXMuX3Jlc291cmNlLmF0dHJJcEFkZHJlc3NlcyksXG4gICAgfTtcblxuICAgIHRoaXMuc2Vjb25kID0ge1xuICAgICAgZW5kcG9pbnRzOiB7XG4gICAgICAgIGFtcXA6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgxLCB0aGlzLl9yZXNvdXJjZS5hdHRyQW1xcEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0ckFtcXBFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RvbXA6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgxLCB0aGlzLl9yZXNvdXJjZS5hdHRyU3RvbXBFbmRwb2ludHMpLFxuICAgICAgICAgIHBvcnQ6IFRva2VuLmFzTnVtYmVyKFxuICAgICAgICAgICAgRm4uc2VsZWN0KFxuICAgICAgICAgICAgICAyLFxuICAgICAgICAgICAgICBGbi5zcGxpdChcIjpcIiwgRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJTdG9tcEVuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBvcGVuV2lyZToge1xuICAgICAgICAgIHVybDogRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJPcGVuV2lyZUVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0ck9wZW5XaXJlRW5kcG9pbnRzKSksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIG1xdHQ6IHtcbiAgICAgICAgICB1cmw6IEZuLnNlbGVjdCgxLCB0aGlzLl9yZXNvdXJjZS5hdHRyTXF0dEVuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0ck1xdHRFbmRwb2ludHMpKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSxcbiAgICAgICAgd3NzOiB7XG4gICAgICAgICAgdXJsOiBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0cldzc0VuZHBvaW50cyksXG4gICAgICAgICAgcG9ydDogVG9rZW4uYXNOdW1iZXIoXG4gICAgICAgICAgICBGbi5zZWxlY3QoXG4gICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgIEZuLnNwbGl0KFwiOlwiLCBGbi5zZWxlY3QoMSwgdGhpcy5fcmVzb3VyY2UuYXR0cldzc0VuZHBvaW50cykpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9LFxuICAgICAgICBjb25zb2xlOiB7XG4gICAgICAgICAgdXJsOiBgaHR0cHM6Ly8ke3RoaXMuaWR9LTIubXEuJHtBd3MuUkVHSU9OfS4ke0F3cy5VUkxfU1VGRklYfTo4MTYyYCxcbiAgICAgICAgICBwb3J0OiA4MTYyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGlwQWRkcmVzczogRm4uc2VsZWN0KDEsIHRoaXMuX3Jlc291cmNlLmF0dHJJcEFkZHJlc3NlcyksXG4gICAgfTtcbiAgfVxufVxuIl19