aws-ddk-core
Version:
The AWS DataOps Development Kit is an open source development framework for customers that build data workflows and modern data architecture on AWS.
196 lines • 24.2 kB
JavaScript
var _a, _b, _c, _d;
Object.defineProperty(exports, "__esModule", { value: true });
exports.EventStage = exports.StateMachineStage = exports.DataStage = exports.Stage = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const cloudwatch = require("aws-cdk-lib/aws-cloudwatch");
const events = require("aws-cdk-lib/aws-events");
const events_targets = require("aws-cdk-lib/aws-events-targets");
const sfn = require("aws-cdk-lib/aws-stepfunctions");
const constructs_1 = require("constructs");
/**
* Abstract class representing a stage.
*/
class Stage extends constructs_1.Construct {
/**
* Constructs the stage.
* @param scope Scope within which this construct is defined.
* @param id Identifier of the stage.
* @param props Properties for the stage.
*/
constructor(scope, id, props) {
super(scope, id);
this.name = props.name;
this.description = props.description;
}
}
exports.Stage = Stage;
_a = JSII_RTTI_SYMBOL_1;
Stage[_a] = { fqn: "aws-ddk-core.Stage", version: "1.4.1" };
/**
* Class that represents a data stage within a data pipeline.
*
* To create a DataStage, inherit from this class, add infrastructure required by the stage,
* and implement `eventPatterns` and `targets` properties.
*
* @example
* class MyStage extends DataStage:
* readonly queue: sqs.Queue;
*
* constructor(scope: Construct, id: string, props: MyStageProps) {
* super(scope, id, props);
*
* this.queue = sqs.Queue(this, "Queue");
*
* this.eventPatterns = {
* detail_type: ["my-detail-type"],
* };
* this.targets = [new events_targets.SqsQueue(this.queue)];
* }
*/
class DataStage extends Stage {
/**
* Constructs the stage.
* @param scope Scope within which this construct is defined.
* @param id Identifier of the stage.
* @param props Properties for the stage.
*/
constructor(scope, id, props) {
super(scope, id, props);
this.alarmsEnabled = props.alarmsEnabled ?? true;
this.cloudwatchAlarms = [];
}
/**
* Add a CloudWatch alarm for the DataStage.
* @param id Identifier of the CloudWatch Alarm.
* @param props Properties for the alarm.
* @returns this DataStage.
*/
addAlarm(id, props) {
if (this.alarmsEnabled) {
this.cloudwatchAlarms.push(new cloudwatch.Alarm(this, id, {
metric: props.metric,
comparisonOperator: props.comparisonOperator ?? cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD,
threshold: props.threshold ?? 1,
evaluationPeriods: props.evaluationPeriods ?? 1,
}));
}
return this;
}
}
exports.DataStage = DataStage;
_b = JSII_RTTI_SYMBOL_1;
DataStage[_b] = { fqn: "aws-ddk-core.DataStage", version: "1.4.1" };
function getDefinitionBody(definition, definitionFile) {
if (definition && definitionFile) {
throw new Error("Only one of 'definition' or 'definitionFile' should be provided.");
}
if (!definition && !definitionFile) {
throw new Error("One of 'definition' or 'definitionFile' must be provided.");
}
if (definitionFile) {
return sfn.DefinitionBody.fromFile(definitionFile, {});
}
else {
if (typeof definition == "string") {
return sfn.DefinitionBody.fromString(definition);
}
if (definition) {
return sfn.DefinitionBody.fromChainable(definition);
}
}
throw new Error("Not able to create a definition body.");
}
/**
* DataStage with helper methods to simplify StateMachine stages creation.
*/
class StateMachineStage extends DataStage {
/**
* Constructs state machine stage.
* @param scope Scope within which this construct is defined.
* @param id Identifier of the stage.
* @param props Properties for the stage.
*/
constructor(scope, id, props) {
super(scope, id, props);
}
/**
* Constructs a state machine from the definition.
* @param props State machine stage properties.
* @returns Dictionary with event pattern, targets and state machine construct.
*/
createStateMachine(props) {
const stateMachine = new sfn.StateMachine(this, "State Machine", {
definitionBody: getDefinitionBody(props.definition, props.definitionFile),
stateMachineName: props.stateMachineName,
});
if (props.additionalRolePolicyStatements) {
props.additionalRolePolicyStatements.forEach((s) => {
stateMachine.addToRolePolicy(s);
});
}
this.addAlarm("State Machine Failure Alarm", {
metric: stateMachine.metricFailed(),
threshold: props.stateMachineFailedExecutionsAlarmThreshold,
evaluationPeriods: props.stateMachineFailedExecutionsAlarmEvaluationPeriods,
});
const stateMachineInput = props.stateMachineInput;
const eventPattern = {
source: ["aws.states"],
detailType: ["Step Functions Execution Status Change"],
detail: {
status: ["SUCCEEDED"],
stateMachineArn: [stateMachine.stateMachineArn],
},
};
const targets = [
new events_targets.SfnStateMachine(stateMachine, {
input: events.RuleTargetInput.fromObject(stateMachineInput),
}),
];
return {
eventPattern,
targets,
stateMachine,
};
}
}
exports.StateMachineStage = StateMachineStage;
_c = JSII_RTTI_SYMBOL_1;
StateMachineStage[_c] = { fqn: "aws-ddk-core.StateMachineStage", version: "1.4.1" };
/**
* Class that represents an event stage within a data pipeline.
*
* To create an EventStage, inherit from this class, add infrastructure required by the stage,
* and implement the `eventPattern` property.
*
* The `targets` property will be set to null.
*
* @example
* class MyStage extends EventStage:
* constructor(scope: Construct, id: string, props: MyStageProps) {
* super(scope, id, props);
*
* this.eventPatterns = {
* source: ["aws.s3"],
* detail: props.detail,
* detail_type: props.detail_type,
* };
* }
*/
class EventStage extends Stage {
/**
* Constructs event stage.
* @param scope Scope within which this construct is defined.
* @param id Identifier of the stage.
* @param props Properties for the stage.
*/
constructor(scope, id, props) {
super(scope, id, props);
this.targets = undefined;
}
}
exports.EventStage = EventStage;
_d = JSII_RTTI_SYMBOL_1;
EventStage[_d] = { fqn: "aws-ddk-core.EventStage", version: "1.4.1" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGlwZWxpbmVzL3N0YWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseURBQXlEO0FBQ3pELGlEQUFpRDtBQUNqRCxpRUFBaUU7QUFFakUscURBQXFEO0FBQ3JELDJDQUF1QztBQWdCdkM7O0dBRUc7QUFDSCxNQUFzQixLQUFNLFNBQVEsc0JBQVM7SUF3QjNDOzs7OztPQUtHO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFpQjtRQUN6RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUM7SUFDdkMsQ0FBQzs7QUFuQ0gsc0JBb0NDOzs7QUF3Q0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBc0IsU0FBVSxTQUFRLEtBQUs7SUFVM0M7Ozs7O09BS0c7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxRQUFRLENBQUMsRUFBVSxFQUFFLEtBQWlCO1FBQ3BDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUN4QixJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRTtnQkFDN0IsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixr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LENBQUM7YUFDNUQsQ0FBQztTQUNILENBQUM7UUFFRixPQUFPO1lBQ0wsWUFBWTtZQUNaLE9BQU87WUFDUCxZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7O0FBM0RILDhDQTREQzs7O0FBT0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFzQixVQUFXLFNBQVEsS0FBSztJQUc1Qzs7Ozs7T0FLRztJQUNILFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFDM0IsQ0FBQzs7QUFiSCxnQ0FjQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNsb3Vkd2F0Y2ggZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoXCI7XG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCAqIGFzIGV2ZW50c190YXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgc2ZuIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3RlcGZ1bmN0aW9uc1wiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgYmFzZSBhYnN0cmFjdCBzdGFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFnZVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHN0YWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBzdGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIHN0YWdlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3RhZ2UgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgc3RhZ2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSBzdGFnZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5wdXQgdGFyZ2V0cyBmb3IgdGhlIHN0YWdlLlxuICAgKlxuICAgKiBUYXJnZXRzIGFyZSB1c2VkIGJ5IEV2ZW50IFJ1bGVzIHRvIGRlc2NyaWJlIHdoYXQgc2hvdWxkIGJlIGludm9rZWQgd2hlbiBhIHJ1bGUgbWF0Y2hlcyBhbiBldmVudC5cbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IHRhcmdldHM/OiBldmVudHMuSVJ1bGVUYXJnZXRbXTtcbiAgLyoqXG4gICAqIE91dHB1dCBldmVudCBwYXR0ZXJuIG9mIHRoZSBzdGFnZS5cbiAgICpcbiAgICogRXZlbnQgcGF0dGVybiBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiBvdXRwdXQgZXZlbnQocykgcHJvZHVjZWQgYnkgdGhpcyBzdGFnZS5cbiAgICogRXZlbnQgUnVsZXMgdXNlIGV2ZW50IHBhdHRlcm5zIHRvIHNlbGVjdCBldmVudHMgYW5kIHJvdXRlIHRoZW0gdG8gdGFyZ2V0cy5cbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IGV2ZW50UGF0dGVybj86IGV2ZW50cy5FdmVudFBhdHRlcm47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgdGhlIHN0YWdlLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGFnZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMubmFtZSA9IHByb3BzLm5hbWU7XG4gICAgdGhpcy5kZXNjcmlwdGlvbiA9IHByb3BzLmRlc2NyaXB0aW9uO1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIGBEYXRhU3RhZ2VgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTdGFnZVByb3BzIGV4dGVuZHMgU3RhZ2VQcm9wcyB7XG4gIC8qKlxuICAgKiBFbmFibGUvRGlzYWJsZSBhbGwgYWxhcm1zIGluIGEgRGF0YVN0YWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhbGFybXNFbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgYWxhcm0gYmVpbmcgYWRkZWQgdG8gdGhlIERhdGFTdGFnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbGFybVByb3BzIHtcbiAgLyoqXG4gICAqIE1ldHJpYyB0byB1c2UgZm9yIGNyZWF0aW5nIHRoZSBzdGFnZSdzIENsb3VkV2F0Y2ggQWxhcm0uXG4gICAqL1xuICByZWFkb25seSBtZXRyaWM6IGNsb3Vkd2F0Y2guSU1ldHJpYztcbiAgLyoqXG4gICAqIENvbXBhcmlzb24gb3BlcmF0b3IgdG8gdXNlIGZvciBhbGFybS5cbiAgICpcbiAgICogQGRlZmF1bHQgR1JFQVRFUl9USEFOX1RIUkVTSE9MRFxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGFyaXNvbk9wZXJhdG9yPzogY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3I7XG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgYWdhaW5zdCB3aGljaCB0aGUgc3BlY2lmaWVkIGFsYXJtIHN0YXRpc3RpYyBpcyBjb21wYXJlZC5cbiAgICogQGRlZmF1bHQgNVxuICAgKi9cbiAgcmVhZG9ubHkgZXZhbHVhdGlvblBlcmlvZHM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHBlcmlvZHMgb3ZlciB3aGljaCBkYXRhIGlzIGNvbXBhcmVkIHRvIHRoZSBzcGVjaWZpZWQgdGhyZXNob2xkLlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGEgZGF0YSBzdGFnZSB3aXRoaW4gYSBkYXRhIHBpcGVsaW5lLlxuICpcbiAqIFRvIGNyZWF0ZSBhIERhdGFTdGFnZSwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MsIGFkZCBpbmZyYXN0cnVjdHVyZSByZXF1aXJlZCBieSB0aGUgc3RhZ2UsXG4gKiBhbmQgaW1wbGVtZW50IGBldmVudFBhdHRlcm5zYCBhbmQgYHRhcmdldHNgIHByb3BlcnRpZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIE15U3RhZ2UgZXh0ZW5kcyBEYXRhU3RhZ2U6XG4gKiAgIHJlYWRvbmx5IHF1ZXVlOiBzcXMuUXVldWU7XG4gKlxuICogICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTXlTdGFnZVByb3BzKSB7XG4gKiAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICpcbiAqICAgICAgdGhpcy5xdWV1ZSA9IHNxcy5RdWV1ZSh0aGlzLCBcIlF1ZXVlXCIpO1xuICpcbiAqICAgICAgdGhpcy5ldmVudFBhdHRlcm5zID0ge1xuICogICAgICAgIGRldGFpbF90eXBlOiBbXCJteS1kZXRhaWwtdHlwZVwiXSxcbiAqICAgICAgfTtcbiAqICAgICAgdGhpcy50YXJnZXRzID0gW25ldyBldmVudHNfdGFyZ2V0cy5TcXNRdWV1ZSh0aGlzLnF1ZXVlKV07XG4gKiAgIH1cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERhdGFTdGFnZSBleHRlbmRzIFN0YWdlIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgQ2xvdWRXYXRjaCBBbGFybXMgbGlua2VkIHRvIHRoZSBzdGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGNsb3Vkd2F0Y2hBbGFybXM6IGNsb3Vkd2F0Y2guQWxhcm1bXTtcbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhbGFybXMgYXJlIGVuYWJsZWQgZm9yIHRoaXMgc3RhZ2UuXG4gICAqL1xuICByZWFkb25seSBhbGFybXNFbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHNjb3BlIFNjb3BlIHdpdGhpbiB3aGljaCB0aGlzIGNvbnN0cnVjdCBpcyBkZWZpbmVkLlxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgc3RhZ2UuXG4gICAqIEBwYXJhbSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB0aGUgc3RhZ2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogRGF0YVN0YWdlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuYWxhcm1zRW5hYmxlZCA9IHByb3BzLmFsYXJtc0VuYWJsZWQgPz8gdHJ1ZTtcbiAgICB0aGlzLmNsb3Vkd2F0Y2hBbGFybXMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBDbG91ZFdhdGNoIGFsYXJtIGZvciB0aGUgRGF0YVN0YWdlLlxuICAgKiBAcGFyYW0gaWQgSWRlbnRpZmllciBvZiB0aGUgQ2xvdWRXYXRjaCBBbGFybS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBhbGFybS5cbiAgICogQHJldHVybnMgdGhpcyBEYXRhU3RhZ2UuXG4gICAqL1xuICBhZGRBbGFybShpZDogc3RyaW5nLCBwcm9wczogQWxhcm1Qcm9wcyk6IERhdGFTdGFnZSB7XG4gICAgaWYgKHRoaXMuYWxhcm1zRW5hYmxlZCkge1xuICAgICAgdGhpcy5jbG91ZHdhdGNoQWxhcm1zLnB1c2goXG4gICAgICAgIG5ldyBjbG91ZHdhdGNoLkFsYXJtKHRoaXMsIGlkLCB7XG4gICAgICAgICAgbWV0cmljOiBwcm9wcy5tZXRyaWMsXG4gICAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBwcm9wcy5jb21wYXJpc29uT3BlcmF0b3IgPz8gY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgICAgICB0aHJlc2hvbGQ6IHByb3BzLnRocmVzaG9sZCA/PyAxLFxuICAgICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBwcm9wcy5ldmFsdWF0aW9uUGVyaW9kcyA/PyAxLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldERlZmluaXRpb25Cb2R5KGRlZmluaXRpb24/OiBzZm4uSUNoYWluYWJsZSB8IHN0cmluZywgZGVmaW5pdGlvbkZpbGU/OiBzdHJpbmcpOiBzZm4uRGVmaW5pdGlvbkJvZHkge1xuICBpZiAoZGVmaW5pdGlvbiAmJiBkZWZpbml0aW9uRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk9ubHkgb25lIG9mICdkZWZpbml0aW9uJyBvciAnZGVmaW5pdGlvbkZpbGUnIHNob3VsZCBiZSBwcm92aWRlZC5cIik7XG4gIH1cbiAgaWYgKCFkZWZpbml0aW9uICYmICFkZWZpbml0aW9uRmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIk9uZSBvZiAnZGVmaW5pdGlvbicgb3IgJ2RlZmluaXRpb25GaWxlJyBtdXN0IGJlIHByb3ZpZGVkLlwiKTtcbiAgfVxuXG4gIGlmIChkZWZpbml0aW9uRmlsZSkge1xuICAgIHJldHVybiBzZm4uRGVmaW5pdGlvbkJvZHkuZnJvbUZpbGUoZGVmaW5pdGlvbkZpbGUsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAodHlwZW9mIGRlZmluaXRpb24gPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHNmbi5EZWZpbml0aW9uQm9keS5mcm9tU3RyaW5nKGRlZmluaXRpb24pO1xuICAgIH1cbiAgICBpZiAoZGVmaW5pdGlvbikge1xuICAgICAgcmV0dXJuIHNmbi5EZWZpbml0aW9uQm9keS5mcm9tQ2hhaW5hYmxlKGRlZmluaXRpb24pO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgYWJsZSB0byBjcmVhdGUgYSBkZWZpbml0aW9uIGJvZHkuXCIpO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBzdGF0ZSBtYWNoaW5lIHN0YWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlTWFjaGluZVN0YWdlUHJvcHMgZXh0ZW5kcyBTdGFnZVByb3BzIHtcbiAgLyoqXG4gICAqIFN0ZXBzIGZvciB0aGUgc3RhdGUgbWFjaGluZS5cbiAgICogQ2FuIGVpdGhlciBiZSBwcm92aWRlZCBhcyAnc2ZuLklDaGFpbmFibGUnIG9yIGEgSlNPTiBzdHJpbmcuXG4gICAqL1xuICByZWFkb25seSBkZWZpbml0aW9uPzogc2ZuLklDaGFpbmFibGUgfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBGaWxlIGNvbnRhaW5pbmcgYSBKU09OIGRlZmluaXRpb24gZm9yIHRoZSBzdGF0ZSBtYWNoaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGVmaW5pdGlvbkZpbGU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBJbnB1dCBvZiB0aGUgc3RhdGUgbWFjaGluZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZUlucHV0PzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHN0YXRlIG1hY2hpbmUuXG4gICAqL1xuICByZWFkb25seSBzdGF0ZU1hY2hpbmVOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogQWRkaXRpb25hbCBJQU0gcG9saWN5IHN0YXRlbWVudHMgdG8gYWRkIHRvIHRoZSBzdGF0ZSBtYWNoaW5lIHJvbGUuXG4gICAqL1xuICByZWFkb25seSBhZGRpdGlvbmFsUm9sZVBvbGljeVN0YXRlbWVudHM/OiBpYW0uUG9saWN5U3RhdGVtZW50W107XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBzdGF0ZSBtYWNoaW5lIGV4ZWN1dGlvbnMgYmVmb3JlIHRyaWdnZXJpbmcgQ1cgYWxhcm0uXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZUZhaWxlZEV4ZWN1dGlvbnNBbGFybVRocmVzaG9sZD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgcGVyaW9kcyBvdmVyIHdoaWNoIGRhdGEgaXMgY29tcGFyZWQgdG8gdGhlIHNwZWNpZmllZCB0aHJlc2hvbGQuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZUZhaWxlZEV4ZWN1dGlvbnNBbGFybUV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyO1xuICAvKipcbiAgICogRW5hYmxlL0Rpc2FibGUgYWxsIGFsYXJtcyBpbiB0aGUgc3RhZ2UuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGFsYXJtc0VuYWJsZWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0YXRlTWFjaGluZVJlc3VsdCB7XG4gIHJlYWRvbmx5IGV2ZW50UGF0dGVybjogZXZlbnRzLkV2ZW50UGF0dGVybjtcbiAgcmVhZG9ubHkgdGFyZ2V0czogZXZlbnRzLklSdWxlVGFyZ2V0W107XG4gIHJlYWRvbmx5IHN0YXRlTWFjaGluZTogc2ZuLlN0YXRlTWFjaGluZTtcbn1cblxuLyoqXG4gKiBEYXRhU3RhZ2Ugd2l0aCBoZWxwZXIgbWV0aG9kcyB0byBzaW1wbGlmeSBTdGF0ZU1hY2hpbmUgc3RhZ2VzIGNyZWF0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU3RhdGVNYWNoaW5lU3RhZ2UgZXh0ZW5kcyBEYXRhU3RhZ2Uge1xuICAvKipcbiAgICogU3RhdGUgbWFjaGluZS5cbiAgICovXG4gIGFic3RyYWN0IHJlYWRvbmx5IHN0YXRlTWFjaGluZTogc2ZuLlN0YXRlTWFjaGluZTtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBzdGF0ZSBtYWNoaW5lIHN0YWdlLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTdGF0ZU1hY2hpbmVTdGFnZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIHN0YXRlIG1hY2hpbmUgZnJvbSB0aGUgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHByb3BzIFN0YXRlIG1hY2hpbmUgc3RhZ2UgcHJvcGVydGllcy5cbiAgICogQHJldHVybnMgRGljdGlvbmFyeSB3aXRoIGV2ZW50IHBhdHRlcm4sIHRhcmdldHMgYW5kIHN0YXRlIG1hY2hpbmUgY29uc3RydWN0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0YXRlTWFjaGluZShwcm9wczogU3RhdGVNYWNoaW5lU3RhZ2VQcm9wcyk6IENyZWF0ZVN0YXRlTWFjaGluZVJlc3VsdCB7XG4gICAgY29uc3Qgc3RhdGVNYWNoaW5lID0gbmV3IHNmbi5TdGF0ZU1hY2hpbmUodGhpcywgXCJTdGF0ZSBNYWNoaW5lXCIsIHtcbiAgICAgIGRlZmluaXRpb25Cb2R5OiBnZXREZWZpbml0aW9uQm9keShwcm9wcy5kZWZpbml0aW9uLCBwcm9wcy5kZWZpbml0aW9uRmlsZSksXG4gICAgICBzdGF0ZU1hY2hpbmVOYW1lOiBwcm9wcy5zdGF0ZU1hY2hpbmVOYW1lLFxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmFkZGl0aW9uYWxSb2xlUG9saWN5U3RhdGVtZW50cykge1xuICAgICAgcHJvcHMuYWRkaXRpb25hbFJvbGVQb2xpY3lTdGF0ZW1lbnRzLmZvckVhY2goKHMpID0+IHtcbiAgICAgICAgc3RhdGVNYWNoaW5lLmFkZFRvUm9sZVBvbGljeShzKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYWRkQWxhcm0oXCJTdGF0ZSBNYWNoaW5lIEZhaWx1cmUgQWxhcm1cIiwge1xuICAgICAgbWV0cmljOiBzdGF0ZU1hY2hpbmUubWV0cmljRmFpbGVkKCksXG4gICAgICB0aHJlc2hvbGQ6IHByb3BzLnN0YXRlTWFjaGluZUZhaWxlZEV4ZWN1dGlvbnNBbGFybVRocmVzaG9sZCxcbiAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBwcm9wcy5zdGF0ZU1hY2hpbmVGYWlsZWRFeGVjdXRpb25zQWxhcm1FdmFsdWF0aW9uUGVyaW9kcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IHN0YXRlTWFjaGluZUlucHV0ID0gcHJvcHMuc3RhdGVNYWNoaW5lSW5wdXQ7XG4gICAgY29uc3QgZXZlbnRQYXR0ZXJuID0ge1xuICAgICAgc291cmNlOiBbXCJhd3Muc3RhdGVzXCJdLFxuICAgICAgZGV0YWlsVHlwZTogW1wiU3RlcCBGdW5jdGlvbnMgRXhlY3V0aW9uIFN0YXR1cyBDaGFuZ2VcIl0sXG4gICAgICBkZXRhaWw6IHtcbiAgICAgICAgc3RhdHVzOiBbXCJTVUNDRUVERURcIl0sXG4gICAgICAgIHN0YXRlTWFjaGluZUFybjogW3N0YXRlTWFjaGluZS5zdGF0ZU1hY2hpbmVBcm5dLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IHRhcmdldHMgPSBbXG4gICAgICBuZXcgZXZlbnRzX3RhcmdldHMuU2ZuU3RhdGVNYWNoaW5lKHN0YXRlTWFjaGluZSwge1xuICAgICAgICBpbnB1dDogZXZlbnRzLlJ1bGVUYXJnZXRJbnB1dC5mcm9tT2JqZWN0KHN0YXRlTWFjaGluZUlucHV0KSxcbiAgICAgIH0pLFxuICAgIF07XG5cbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRQYXR0ZXJuLFxuICAgICAgdGFyZ2V0cyxcbiAgICAgIHN0YXRlTWFjaGluZSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIGV2ZW50IHN0YWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U3RhZ2VQcm9wcyBleHRlbmRzIFN0YWdlUHJvcHMge31cblxuLyoqXG4gKiBDbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gZXZlbnQgc3RhZ2Ugd2l0aGluIGEgZGF0YSBwaXBlbGluZS5cbiAqXG4gKiBUbyBjcmVhdGUgYW4gRXZlbnRTdGFnZSwgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MsIGFkZCBpbmZyYXN0cnVjdHVyZSByZXF1aXJlZCBieSB0aGUgc3RhZ2UsXG4gKiBhbmQgaW1wbGVtZW50IHRoZSBgZXZlbnRQYXR0ZXJuYCBwcm9wZXJ0eS5cbiAqXG4gKiBUaGUgYHRhcmdldHNgIHByb3BlcnR5IHdpbGwgYmUgc2V0IHRvIG51bGwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIE15U3RhZ2UgZXh0ZW5kcyBFdmVudFN0YWdlOlxuICogICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTXlTdGFnZVByb3BzKSB7XG4gKiAgICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICpcbiAqICAgICAgdGhpcy5ldmVudFBhdHRlcm5zID0ge1xuICogICAgICAgIHNvdXJjZTogW1wiYXdzLnMzXCJdLFxuICogICAgICAgIGRldGFpbDogcHJvcHMuZGV0YWlsLFxuICogICAgICAgIGRldGFpbF90eXBlOiBwcm9wcy5kZXRhaWxfdHlwZSxcbiAqICAgICAgfTtcbiAqICAgfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRXZlbnRTdGFnZSBleHRlbmRzIFN0YWdlIHtcbiAgcmVhZG9ubHkgdGFyZ2V0cz86IGV2ZW50cy5JUnVsZVRhcmdldFtdO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGV2ZW50IHN0YWdlLlxuICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgd2l0aGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCBJZGVudGlmaWVyIG9mIHRoZSBzdGFnZS5cbiAgICogQHBhcmFtIHByb3BzIFByb3BlcnRpZXMgZm9yIHRoZSBzdGFnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFdmVudFN0YWdlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMudGFyZ2V0cyA9IHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
;