@softchef/cdk-iot-device-management
Version:
IoT device management is composed of things, thing types, thing groups, jobs, files API services. The constructs can be used independently, that are based on full-managed service to create an API Gateway & Lambda function.
265 lines • 31.9 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThingGroupApi = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const path = require("path");
const cdk_restapi_1 = require("@softchef/cdk-restapi");
const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
const aws_lambda_nodejs_1 = require("aws-cdk-lib/aws-lambda-nodejs");
const constructs_1 = require("constructs");
const LAMBDA_ASSETS_PATH = path.resolve(__dirname, '../lambda-assets/thing-groups');
/**
* Thing Group API construct.
*
* @stability stable
*/
class ThingGroupApi extends constructs_1.Construct {
/**
* @stability stable
*/
constructor(scope, id, props) {
var _b, _c;
super(scope, id);
this._restApi = new cdk_restapi_1.RestApi(this, 'ThingGroupRestApi', {
enableCors: true,
authorizationType: (_b = props === null || props === void 0 ? void 0 : props.authorizationType) !== null && _b !== void 0 ? _b : aws_apigateway_1.AuthorizationType.NONE,
authorizer: (_c = props === null || props === void 0 ? void 0 : props.authorizer) !== null && _c !== void 0 ? _c : undefined,
resources: [
{
path: '/thing-groups',
httpMethod: cdk_restapi_1.HttpMethod.POST,
lambdaFunction: this.createCreateThingGroupFunction(),
},
{
path: '/thing-groups',
httpMethod: cdk_restapi_1.HttpMethod.GET,
lambdaFunction: this.createListThingGroupsFunction(),
},
{
path: '/thing-groups/{thingGroupName}',
httpMethod: cdk_restapi_1.HttpMethod.GET,
lambdaFunction: this.createGetThingGroupFunction(),
},
{
path: '/thing-groups/{thingGroupName}',
httpMethod: cdk_restapi_1.HttpMethod.PUT,
lambdaFunction: this.createUpdateThingGroupFunction(),
},
{
path: '/thing-groups/{thingGroupName}',
httpMethod: cdk_restapi_1.HttpMethod.DELETE,
lambdaFunction: this.createDeleteThingGroupFunction(),
},
{
path: '/thing-groups/{thingGroupName}/things/{thingName}',
httpMethod: cdk_restapi_1.HttpMethod.PUT,
lambdaFunction: this.createAddThingToThingGroupFunction(),
},
{
path: '/thing-groups/{thingGroupName}/things/{thingName}',
httpMethod: cdk_restapi_1.HttpMethod.DELETE,
lambdaFunction: this.createRemoveThingFromThingGroupFunction(),
},
{
path: '/dynamic-thing-groups',
httpMethod: cdk_restapi_1.HttpMethod.POST,
lambdaFunction: this.createCreateDynamicThingGroupFunction(),
},
{
path: '/dynamic-thing-groups/{thingGroupName}',
httpMethod: cdk_restapi_1.HttpMethod.PUT,
lambdaFunction: this.createUpdateDynamicThingGroupFunction(),
},
{
path: '/dynamic-thing-groups/{thingGroupName}',
httpMethod: cdk_restapi_1.HttpMethod.DELETE,
lambdaFunction: this.createDeleteDynamicThingGroupFunction(),
},
],
});
}
/**
* Thing Group API API ID.
*
* @stability stable
*/
get restApiId() {
return this._restApi.restApiId;
}
createCreateThingGroupFunction() {
var _b;
const createThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'CreateThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/create-thing-group/app.ts`,
});
(_b = createThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-create-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:CreateThingGroup',
],
resources: ['*'],
}),
],
}));
return createThingGroupFunction;
}
createListThingGroupsFunction() {
var _b;
const listThingGroupsFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'ListThingGroupsFunction', {
entry: `${LAMBDA_ASSETS_PATH}/list-thing-groups/app.ts`,
});
(_b = listThingGroupsFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-list-things-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:ListThingGroups',
],
resources: ['*'],
}),
],
}));
return listThingGroupsFunction;
}
createGetThingGroupFunction() {
var _b;
const getThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'GetThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/get-thing-group/app.ts`,
});
(_b = getThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-describe-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:DescribeThingGroup',
],
resources: ['*'],
}),
],
}));
return getThingGroupFunction;
}
createUpdateThingGroupFunction() {
var _b;
const updateThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'UpdateThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/update-thing-group/app.ts`,
});
(_b = updateThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-update-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:UpdateThingGroup',
],
resources: ['*'],
}),
],
}));
return updateThingGroupFunction;
}
createDeleteThingGroupFunction() {
var _b;
const deleteThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'DeleteThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/delete-thing-group/app.ts`,
});
(_b = deleteThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-delete-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:DeleteThingGroup',
],
resources: ['*'],
}),
],
}));
return deleteThingGroupFunction;
}
createAddThingToThingGroupFunction() {
var _b;
const addThingToThingGroup = new aws_lambda_nodejs_1.NodejsFunction(this, 'AddThingToThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/add-thing-to-thing-group/app.ts`,
});
(_b = addThingToThingGroup.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-add-thing-to-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:AddThingToThingGroup',
],
resources: ['*'],
}),
],
}));
return addThingToThingGroup;
}
createRemoveThingFromThingGroupFunction() {
var _b;
const removeThingFromThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'RemoveThingFromThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/remove-thing-from-thing-group/app.ts`,
});
(_b = removeThingFromThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-remove-thing-from-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:RemoveThingFromThingGroup',
],
resources: ['*'],
}),
],
}));
return removeThingFromThingGroupFunction;
}
createCreateDynamicThingGroupFunction() {
var _b;
const createDynamicThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'CreateDynamicThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/create-dynamic-thing-group/app.ts`,
});
(_b = createDynamicThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-create-dynamic-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:CreateDynamicThingGroup',
],
resources: ['*'],
}),
],
}));
return createDynamicThingGroupFunction;
}
createUpdateDynamicThingGroupFunction() {
var _b;
const updateDynamicThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'UpdateDynamicThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/update-dynamic-thing-group/app.ts`,
});
(_b = updateDynamicThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-update-dynamic-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:UpdateDynamicThingGroup',
],
resources: ['*'],
}),
],
}));
return updateDynamicThingGroupFunction;
}
createDeleteDynamicThingGroupFunction() {
var _b;
const deleteDynamicThingGroupFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'DeleteDynamicThingGroupFunction', {
entry: `${LAMBDA_ASSETS_PATH}/delete-dynamic-thing-group/app.ts`,
});
(_b = deleteDynamicThingGroupFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-delete-dynamic-thing-group-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:DeleteDynamicThingGroup',
],
resources: ['*'],
}),
],
}));
return deleteDynamicThingGroupFunction;
}
}
exports.ThingGroupApi = ThingGroupApi;
_a = JSII_RTTI_SYMBOL_1;
ThingGroupApi[_a] = { fqn: "@softchef/cdk-iot-device-management.ThingGroupApi", version: "2.0.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhpbmctZ3JvdXAtYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RoaW5nLWdyb3VwLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZCQUE2QjtBQUM3Qix1REFHK0I7QUFDL0IsK0RBR29DO0FBQ3BDLGlEQUc2QjtBQUM3QixxRUFFdUM7QUFDdkMsMkNBRW9CO0FBRXBCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsK0JBQStCLENBQUMsQ0FBQzs7Ozs7O0FBV3BGLE1BQWEsYUFBYyxTQUFRLHNCQUFTOzs7O0lBTTFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7O1FBQ2xFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHFCQUFPLENBQUMsSUFBSSxFQUFFLG1CQUFtQixFQUFFO1lBQ3JELFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGlCQUFpQixRQUFFLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxpQkFBaUIsbUNBQUksa0NBQWlCLENBQUMsSUFBSTtZQUNyRSxVQUFVLFFBQUUsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLFVBQVUsbUNBQUksU0FBUztZQUMxQyxTQUFTLEVBQUU7Z0JBQ1Q7b0JBQ0UsSUFBSSxFQUFFLGVBQWU7b0JBQ3JCLFVBQVUsRUFBRSx3QkFBVSxDQUFDLElBQUk7b0JBQzNCLGNBQWMsRUFBRSxJQUFJLENBQUMsOEJBQThCLEVBQUU7aUJBQ3REO2dCQUNEO29CQUNFLElBQUksRUFBRSxlQUFlO29CQUNyQixVQUFVLEVBQUUsd0JBQVUsQ0FBQyxHQUFHO29CQUMxQixjQUFjLEVBQUUsSUFBSSxDQUFDLDZCQUE2QixFQUFFO2lCQUNyRDtnQkFDRDtvQkFDRSxJQUFJLEVBQUUsZ0NBQWdDO29CQUN0QyxVQUFVLEVBQUUsd0JBQVUsQ0FBQyxH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QUksZ0JBQU0sQ0FBQyxJQUFJLEVBQUUsdUNBQXVDLEVBQUU7WUFDeEQsVUFBVSxFQUFFO2dCQUNWLElBQUkseUJBQWUsQ0FBQztvQkFDbEIsT0FBTyxFQUFFO3dCQUNQLDZCQUE2QjtxQkFDOUI7b0JBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO2lCQUNqQixDQUFDO2FBQ0g7U0FDRixDQUFDLEVBQ0Y7UUFDRixPQUFPLCtCQUErQixDQUFDO0lBQ3pDLENBQUM7O0FBcFFILHNDQXFRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQge1xuICBSZXN0QXBpLFxuICBIdHRwTWV0aG9kLFxufSBmcm9tICdAc29mdGNoZWYvY2RrLXJlc3RhcGknO1xuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvblR5cGUsXG4gIElBdXRob3JpemVyLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQge1xuICBQb2xpY3ksXG4gIFBvbGljeVN0YXRlbWVudCxcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQge1xuICBOb2RlanNGdW5jdGlvbixcbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1xuaW1wb3J0IHtcbiAgQ29uc3RydWN0LFxufSBmcm9tICdjb25zdHJ1Y3RzJztcblxuY29uc3QgTEFNQkRBX0FTU0VUU19QQVRIID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4uL2xhbWJkYS1hc3NldHMvdGhpbmctZ3JvdXBzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgaW50ZXJmYWNlIFRoaW5nR3JvdXBBcGlQcm9wcyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGF1dGhvcml6YXRpb25UeXBlPzogQXV0aG9yaXphdGlvblR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGF1dGhvcml6ZXI/OiBJQXV0aG9yaXplciB8IHVuZGVmaW5lZDtcbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgVGhpbmdHcm91cEFwaSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBUaGUgVGhpbmcgR3JvdXAgQVBJIEdhdGV3YXlcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc3RBcGk6IFJlc3RBcGk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBUaGluZ0dyb3VwQXBpUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuX3Jlc3RBcGkgPSBuZXcgUmVzdEFwaSh0aGlzLCAnVGhpbmdHcm91cFJlc3RBcGknLCB7XG4gICAgICBlbmFibGVDb3JzOiB0cnVlLFxuICAgICAgYXV0aG9yaXphdGlvblR5cGU6IHByb3BzPy5hdXRob3JpemF0aW9uVHlwZSA/PyBBdXRob3JpemF0aW9uVHlwZS5OT05FLFxuICAgICAgYXV0aG9yaXplcjogcHJvcHM/LmF1dGhvcml6ZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5nLWdyb3VwcycsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUNyZWF0ZVRoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZy1ncm91cHMnLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuR0VULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUxpc3RUaGluZ0dyb3Vwc0Z1bmN0aW9uKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5nLWdyb3Vwcy97dGhpbmdHcm91cE5hbWV9JyxcbiAgICAgICAgICBodHRwTWV0aG9kOiBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jcmVhdGVHZXRUaGluZ0dyb3VwRnVuY3Rpb24oKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcvdGhpbmctZ3JvdXBzL3t0aGluZ0dyb3VwTmFtZX0nLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuUFVULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZVVwZGF0ZVRoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZy1ncm91cHMve3RoaW5nR3JvdXBOYW1lfScsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY3JlYXRlRGVsZXRlVGhpbmdHcm91cEZ1bmN0aW9uKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5nLWdyb3Vwcy97dGhpbmdHcm91cE5hbWV9L3RoaW5ncy97dGhpbmdOYW1lfScsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY3JlYXRlQWRkVGhpbmdUb1RoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZy1ncm91cHMve3RoaW5nR3JvdXBOYW1lfS90aGluZ3Mve3RoaW5nTmFtZX0nLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZVJlbW92ZVRoaW5nRnJvbVRoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy9keW5hbWljLXRoaW5nLWdyb3VwcycsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUNyZWF0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24oKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcvZHluYW1pYy10aGluZy1ncm91cHMve3RoaW5nR3JvdXBOYW1lfScsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY3JlYXRlVXBkYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy9keW5hbWljLXRoaW5nLWdyb3Vwcy97dGhpbmdHcm91cE5hbWV9JyxcbiAgICAgICAgICBodHRwTWV0aG9kOiBIdHRwTWV0aG9kLkRFTEVURSxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jcmVhdGVEZWxldGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uKCksXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICBnZXQgcmVzdEFwaUlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3Jlc3RBcGkucmVzdEFwaUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDcmVhdGVUaGluZ0dyb3VwRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGNyZWF0ZVRoaW5nR3JvdXBGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnQ3JlYXRlVGhpbmdHcm91cEZ1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vY3JlYXRlLXRoaW5nLWdyb3VwL2FwcC50c2AsXG4gICAgfSk7XG4gICAgY3JlYXRlVGhpbmdHcm91cEZ1bmN0aW9uLnJvbGU/LmF0dGFjaElubGluZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3kodGhpcywgJ2lvdC1jcmVhdGUtdGhpbmctZ3JvdXAtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6Q3JlYXRlVGhpbmdHcm91cCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZVRoaW5nR3JvdXBGdW5jdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTGlzdFRoaW5nR3JvdXBzRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGxpc3RUaGluZ0dyb3Vwc0Z1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdMaXN0VGhpbmdHcm91cHNGdW5jdGlvbicsIHtcbiAgICAgIGVudHJ5OiBgJHtMQU1CREFfQVNTRVRTX1BBVEh9L2xpc3QtdGhpbmctZ3JvdXBzL2FwcC50c2AsXG4gICAgfSk7XG4gICAgbGlzdFRoaW5nR3JvdXBzRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LWxpc3QtdGhpbmdzLXBvbGljeScsIHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAnaW90Okxpc3RUaGluZ0dyb3VwcycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGxpc3RUaGluZ0dyb3Vwc0Z1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVHZXRUaGluZ0dyb3VwRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGdldFRoaW5nR3JvdXBGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnR2V0VGhpbmdHcm91cEZ1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vZ2V0LXRoaW5nLWdyb3VwL2FwcC50c2AsXG4gICAgfSk7XG4gICAgZ2V0VGhpbmdHcm91cEZ1bmN0aW9uLnJvbGU/LmF0dGFjaElubGluZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3kodGhpcywgJ2lvdC1kZXNjcmliZS10aGluZy1ncm91cC1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpEZXNjcmliZVRoaW5nR3JvdXAnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBnZXRUaGluZ0dyb3VwRnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZVRoaW5nR3JvdXBGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgdXBkYXRlVGhpbmdHcm91cEZ1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdVcGRhdGVUaGluZ0dyb3VwRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS91cGRhdGUtdGhpbmctZ3JvdXAvYXBwLnRzYCxcbiAgICB9KTtcbiAgICB1cGRhdGVUaGluZ0dyb3VwRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LXVwZGF0ZS10aGluZy1ncm91cC1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpVcGRhdGVUaGluZ0dyb3VwJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlVGhpbmdHcm91cEZ1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZWxldGVUaGluZ0dyb3VwRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGRlbGV0ZVRoaW5nR3JvdXBGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnRGVsZXRlVGhpbmdHcm91cEZ1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vZGVsZXRlLXRoaW5nLWdyb3VwL2FwcC50c2AsXG4gICAgfSk7XG4gICAgZGVsZXRlVGhpbmdHcm91cEZ1bmN0aW9uLnJvbGU/LmF0dGFjaElubGluZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3kodGhpcywgJ2lvdC1kZWxldGUtdGhpbmctZ3JvdXAtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6RGVsZXRlVGhpbmdHcm91cCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGRlbGV0ZVRoaW5nR3JvdXBGdW5jdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQWRkVGhpbmdUb1RoaW5nR3JvdXBGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgYWRkVGhpbmdUb1RoaW5nR3JvdXAgPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgJ0FkZFRoaW5nVG9UaGluZ0dyb3VwRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9hZGQtdGhpbmctdG8tdGhpbmctZ3JvdXAvYXBwLnRzYCxcbiAgICB9KTtcbiAgICBhZGRUaGluZ1RvVGhpbmdHcm91cC5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtYWRkLXRoaW5nLXRvLXRoaW5nLWdyb3VwLXBvbGljeScsIHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAnaW90OkFkZFRoaW5nVG9UaGluZ0dyb3VwJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gYWRkVGhpbmdUb1RoaW5nR3JvdXA7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlbW92ZVRoaW5nRnJvbVRoaW5nR3JvdXBGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgcmVtb3ZlVGhpbmdGcm9tVGhpbmdHcm91cEZ1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdSZW1vdmVUaGluZ0Zyb21UaGluZ0dyb3VwRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9yZW1vdmUtdGhpbmctZnJvbS10aGluZy1ncm91cC9hcHAudHNgLFxuICAgIH0pO1xuICAgIHJlbW92ZVRoaW5nRnJvbVRoaW5nR3JvdXBGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtcmVtb3ZlLXRoaW5nLWZyb20tdGhpbmctZ3JvdXAtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6UmVtb3ZlVGhpbmdGcm9tVGhpbmdHcm91cCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHJlbW92ZVRoaW5nRnJvbVRoaW5nR3JvdXBGdW5jdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ3JlYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgY3JlYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnQ3JlYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbicsIHtcbiAgICAgIGVudHJ5OiBgJHtMQU1CREFfQVNTRVRTX1BBVEh9L2NyZWF0ZS1keW5hbWljLXRoaW5nLWdyb3VwL2FwcC50c2AsXG4gICAgfSk7XG4gICAgY3JlYXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtY3JlYXRlLWR5bmFtaWMtdGhpbmctZ3JvdXAtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6Q3JlYXRlRHluYW1pY1RoaW5nR3JvdXAnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBjcmVhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uKCk6IE5vZGVqc0Z1bmN0aW9uIHtcbiAgICBjb25zdCB1cGRhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdVcGRhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vdXBkYXRlLWR5bmFtaWMtdGhpbmctZ3JvdXAvYXBwLnRzYCxcbiAgICB9KTtcbiAgICB1cGRhdGVEeW5hbWljVGhpbmdHcm91cEZ1bmN0aW9uLnJvbGU/LmF0dGFjaElubGluZVBvbGljeShcbiAgICAgIG5ldyBQb2xpY3kodGhpcywgJ2lvdC11cGRhdGUtZHluYW1pYy10aGluZy1ncm91cC1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpVcGRhdGVEeW5hbWljVGhpbmdHcm91cCcsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGRlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24gPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgJ0RlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9kZWxldGUtZHluYW1pYy10aGluZy1ncm91cC9hcHAudHNgLFxuICAgIH0pO1xuICAgIGRlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LWRlbGV0ZS1keW5hbWljLXRoaW5nLWdyb3VwLXBvbGljeScsIHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAnaW90OkRlbGV0ZUR5bmFtaWNUaGluZ0dyb3VwJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gZGVsZXRlRHluYW1pY1RoaW5nR3JvdXBGdW5jdGlvbjtcbiAgfVxufVxuIl19