@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 • 30.3 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ThingApi = 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/things');
/**
* Thing API construct.
*
* @stability stable
*/
class ThingApi extends constructs_1.Construct {
/**
* @stability stable
*/
constructor(scope, id, props) {
var _b, _c;
super(scope, id);
this._restApi = new cdk_restapi_1.RestApi(this, 'ThingRestApi', {
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: '/things',
httpMethod: cdk_restapi_1.HttpMethod.POST,
lambdaFunction: this.createCreateThingFunction(),
},
{
path: '/things',
httpMethod: cdk_restapi_1.HttpMethod.GET,
lambdaFunction: this.createListThingsFunction(),
},
{
path: '/things/{thingName}',
httpMethod: cdk_restapi_1.HttpMethod.GET,
lambdaFunction: this.createGetThingFunction(),
},
{
path: '/things/{thingName}',
httpMethod: cdk_restapi_1.HttpMethod.PUT,
lambdaFunction: this.createUpdateThingFunction(),
},
{
path: '/things/{thingName}',
httpMethod: cdk_restapi_1.HttpMethod.DELETE,
lambdaFunction: this.createDeleteThingFunction(),
},
{
path: '/things/{thingName}/shadows',
httpMethod: cdk_restapi_1.HttpMethod.GET,
lambdaFunction: this.createListThingShadowsFunction(),
},
{
path: '/things/{thingName}/shadows/{shadowName}',
httpMethod: cdk_restapi_1.HttpMethod.GET,
lambdaFunction: this.createGetThingShadowFunction(),
},
{
path: '/things/{thingName}/shadows/{shadowName}',
httpMethod: cdk_restapi_1.HttpMethod.PUT,
lambdaFunction: this.createUpdateThingShadowFunction(),
},
{
path: '/things/{thingName}/shadows/{shadowName}',
httpMethod: cdk_restapi_1.HttpMethod.DELETE,
lambdaFunction: this.createDeleteThingShadowFunction(),
},
{
path: '/things/search',
httpMethod: cdk_restapi_1.HttpMethod.GET,
lambdaFunction: this.createSearchThingsFunction(),
},
],
});
}
/**
* Thing API API ID.
*
* @stability stable
*/
get restApiId() {
return this._restApi.restApiId;
}
createCreateThingFunction() {
var _b;
const createThingFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'CreateThingFunction', {
entry: `${LAMBDA_ASSETS_PATH}/create-thing/app.ts`,
});
(_b = createThingFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-create-thing-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:CreateThing',
],
resources: ['*'],
}),
],
}));
return createThingFunction;
}
createListThingsFunction() {
var _b;
const listThingsFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'ListThingsFunction', {
entry: `${LAMBDA_ASSETS_PATH}/list-things/app.ts`,
});
(_b = listThingsFunction.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:ListThings',
],
resources: ['*'],
}),
],
}));
return listThingsFunction;
}
createGetThingFunction() {
var _b;
const getThingFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'GetThingFunction', {
entry: `${LAMBDA_ASSETS_PATH}/get-thing/app.ts`,
});
(_b = getThingFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-describe-thing-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:DescribeThing',
],
resources: ['*'],
}),
],
}));
return getThingFunction;
}
createUpdateThingFunction() {
var _b;
const updateThingFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'UpdateThingFunction', {
entry: `${LAMBDA_ASSETS_PATH}/update-thing/app.ts`,
});
(_b = updateThingFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-update-thing-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:UpdateThing',
],
resources: ['*'],
}),
],
}));
return updateThingFunction;
}
createDeleteThingFunction() {
var _b;
const deleteThingFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'DeleteThingFunction', {
entry: `${LAMBDA_ASSETS_PATH}/delete-thing/app.ts`,
});
(_b = deleteThingFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-delete-thing-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:DeleteThing',
],
resources: ['*'],
}),
],
}));
return deleteThingFunction;
}
createListThingShadowsFunction() {
var _b;
const listThingShadowsFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'ListThingShadowsFunction', {
entry: `${LAMBDA_ASSETS_PATH}/list-thing-shadows/app.ts`,
});
(_b = listThingShadowsFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-list-thing-shadows-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:ListNamedShadowsForThing',
],
resources: ['*'],
}),
],
}));
return listThingShadowsFunction;
}
createGetThingShadowFunction() {
var _b;
const getThingShadowFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'GetThingShadowFunction', {
entry: `${LAMBDA_ASSETS_PATH}/get-thing-shadow/app.ts`,
});
(_b = getThingShadowFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-get-thing-shadow-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:GetThingShadow',
],
resources: ['*'],
}),
],
}));
return getThingShadowFunction;
}
createUpdateThingShadowFunction() {
var _b;
const updateThingShadowFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'UpdateThingShadowFunction', {
entry: `${LAMBDA_ASSETS_PATH}/update-thing-shadow/app.ts`,
});
(_b = updateThingShadowFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-update-thing-shadow-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:UpdateThingShadow',
],
resources: ['*'],
}),
],
}));
return updateThingShadowFunction;
}
createDeleteThingShadowFunction() {
var _b;
const deleteThingShadowFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'DeleteThingShadowFunction', {
entry: `${LAMBDA_ASSETS_PATH}/delete-thing-shadow/app.ts`,
});
(_b = deleteThingShadowFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-delete-thing-shadow-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:DeleteThingShadow',
],
resources: ['*'],
}),
],
}));
return deleteThingShadowFunction;
}
createSearchThingsFunction() {
var _b;
const searchThingsFunction = new aws_lambda_nodejs_1.NodejsFunction(this, 'SearchThingsFunction', {
entry: `${LAMBDA_ASSETS_PATH}/search-things/app.ts`,
});
(_b = searchThingsFunction.role) === null || _b === void 0 ? void 0 : _b.attachInlinePolicy(new aws_iam_1.Policy(this, 'iot-search-things-policy', {
statements: [
new aws_iam_1.PolicyStatement({
actions: [
'iot:SearchIndex',
],
resources: ['*'],
}),
],
}));
return searchThingsFunction;
}
}
exports.ThingApi = ThingApi;
_a = JSII_RTTI_SYMBOL_1;
ThingApi[_a] = { fqn: "@softchef/cdk-iot-device-management.ThingApi", version: "2.0.0" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhpbmctYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RoaW5nLWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZCQUE2QjtBQUM3Qix1REFHK0I7QUFDL0IsK0RBR29DO0FBQ3BDLGlEQUc2QjtBQUM3QixxRUFFdUM7QUFDdkMsMkNBRW9CO0FBRXBCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FBQzs7Ozs7O0FBVzlFLE1BQWEsUUFBUyxTQUFRLHNCQUFTOzs7O0lBTXJDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUI7O1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHFCQUFPLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNoRCxVQUFVLEVBQUUsSUFBSTtZQUNoQixpQkFBaUIsUUFBRSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsaUJBQWlCLG1DQUFJLGtDQUFpQixDQUFDLElBQUk7WUFDckUsVUFBVSxRQUFFLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxVQUFVLG1DQUFJLFNBQVM7WUFDMUMsU0FBUyxFQUFFO2dCQUNUO29CQUNFLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSx3QkFBVSxDQUFDLElBQUk7b0JBQzNCLGNBQWMsRUFBRSxJQUFJLENBQUMseUJBQXlCLEVBQUU7aUJBQ2pEO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSx3QkFBVSxDQUFDLEdBQUc7b0JBQzFCLGNBQWMsRUFBRSxJQUFJLENBQUMsd0JBQXdCLEVBQUU7aUJBQ2hEO2dCQUNEO29CQUNFLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLFVBQVUsRUFBRSx3QkFBVSxDQUFDLEdBQUc7b0JBQzFCLGNBQWMs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QUksRUFBRSwwQkFBMEIsRUFBRTtZQUMzQyxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSx5QkFBZSxDQUFDO29CQUNsQixPQUFPLEVBQUU7d0JBQ1AsaUJBQWlCO3FCQUNsQjtvQkFDRCxTQUFTLEVBQUUsQ0FBQyxHQUFHLENBQUM7aUJBQ2pCLENBQUM7YUFDSDtTQUNGLENBQUMsRUFDRjtRQUNGLE9BQU8sb0JBQW9CLENBQUM7SUFDOUIsQ0FBQzs7QUFwUUgsNEJBcVFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7XG4gIFJlc3RBcGksXG4gIEh0dHBNZXRob2QsXG59IGZyb20gJ0Bzb2Z0Y2hlZi9jZGstcmVzdGFwaSc7XG5pbXBvcnQge1xuICBBdXRob3JpemF0aW9uVHlwZSxcbiAgSUF1dGhvcml6ZXIsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCB7XG4gIFBvbGljeSxcbiAgUG9saWN5U3RhdGVtZW50LFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7XG4gIE5vZGVqc0Z1bmN0aW9uLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhLW5vZGVqcyc7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3QsXG59IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG5jb25zdCBMQU1CREFfQVNTRVRTX1BBVEggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi4vbGFtYmRhLWFzc2V0cy90aGluZ3MnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICBcbmV4cG9ydCBpbnRlcmZhY2UgVGhpbmdBcGlQcm9wcyB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGF1dGhvcml6YXRpb25UeXBlPzogQXV0aG9yaXphdGlvblR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gIHJlYWRvbmx5IGF1dGhvcml6ZXI/OiBJQXV0aG9yaXplciB8IHVuZGVmaW5lZDtcbn1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5leHBvcnQgY2xhc3MgVGhpbmdBcGkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlIFRoaW5nIEFQSSBHYXRld2F5XG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZXN0QXBpOiBSZXN0QXBpO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogVGhpbmdBcGlQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5fcmVzdEFwaSA9IG5ldyBSZXN0QXBpKHRoaXMsICdUaGluZ1Jlc3RBcGknLCB7XG4gICAgICBlbmFibGVDb3JzOiB0cnVlLFxuICAgICAgYXV0aG9yaXphdGlvblR5cGU6IHByb3BzPy5hdXRob3JpemF0aW9uVHlwZSA/PyBBdXRob3JpemF0aW9uVHlwZS5OT05FLFxuICAgICAgYXV0aG9yaXplcjogcHJvcHM/LmF1dGhvcml6ZXIgPz8gdW5kZWZpbmVkLFxuICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5ncycsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QT1NULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUNyZWF0ZVRoaW5nRnVuY3Rpb24oKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcvdGhpbmdzJyxcbiAgICAgICAgICBodHRwTWV0aG9kOiBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jcmVhdGVMaXN0VGhpbmdzRnVuY3Rpb24oKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcvdGhpbmdzL3t0aGluZ05hbWV9JyxcbiAgICAgICAgICBodHRwTWV0aG9kOiBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jcmVhdGVHZXRUaGluZ0Z1bmN0aW9uKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5ncy97dGhpbmdOYW1lfScsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5QVVQsXG4gICAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY3JlYXRlVXBkYXRlVGhpbmdGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZ3Mve3RoaW5nTmFtZX0nLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuREVMRVRFLFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZURlbGV0ZVRoaW5nRnVuY3Rpb24oKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcvdGhpbmdzL3t0aGluZ05hbWV9L3NoYWRvd3MnLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuR0VULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUxpc3RUaGluZ1NoYWRvd3NGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZ3Mve3RoaW5nTmFtZX0vc2hhZG93cy97c2hhZG93TmFtZX0nLFxuICAgICAgICAgIGh0dHBNZXRob2Q6IEh0dHBNZXRob2QuR0VULFxuICAgICAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNyZWF0ZUdldFRoaW5nU2hhZG93RnVuY3Rpb24oKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHBhdGg6ICcvdGhpbmdzL3t0aGluZ05hbWV9L3NoYWRvd3Mve3NoYWRvd05hbWV9JyxcbiAgICAgICAgICBodHRwTWV0aG9kOiBIdHRwTWV0aG9kLlBVVCxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jcmVhdGVVcGRhdGVUaGluZ1NoYWRvd0Z1bmN0aW9uKCksXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBwYXRoOiAnL3RoaW5ncy97dGhpbmdOYW1lfS9zaGFkb3dzL3tzaGFkb3dOYW1lfScsXG4gICAgICAgICAgaHR0cE1ldGhvZDogSHR0cE1ldGhvZC5ERUxFVEUsXG4gICAgICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY3JlYXRlRGVsZXRlVGhpbmdTaGFkb3dGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgcGF0aDogJy90aGluZ3Mvc2VhcmNoJyxcbiAgICAgICAgICBodHRwTWV0aG9kOiBIdHRwTWV0aG9kLkdFVCxcbiAgICAgICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5jcmVhdGVTZWFyY2hUaGluZ3NGdW5jdGlvbigpLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgZ2V0IHJlc3RBcGlJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9yZXN0QXBpLnJlc3RBcGlJZDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ3JlYXRlVGhpbmdGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgY3JlYXRlVGhpbmdGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnQ3JlYXRlVGhpbmdGdW5jdGlvbicsIHtcbiAgICAgIGVudHJ5OiBgJHtMQU1CREFfQVNTRVRTX1BBVEh9L2NyZWF0ZS10aGluZy9hcHAudHNgLFxuICAgIH0pO1xuICAgIGNyZWF0ZVRoaW5nRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LWNyZWF0ZS10aGluZy1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpDcmVhdGVUaGluZycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZVRoaW5nRnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxpc3RUaGluZ3NGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgbGlzdFRoaW5nc0Z1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdMaXN0VGhpbmdzRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9saXN0LXRoaW5ncy9hcHAudHNgLFxuICAgIH0pO1xuICAgIGxpc3RUaGluZ3NGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtbGlzdC10aGluZ3MtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6TGlzdFRoaW5ncycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGxpc3RUaGluZ3NGdW5jdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlR2V0VGhpbmdGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgZ2V0VGhpbmdGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnR2V0VGhpbmdGdW5jdGlvbicsIHtcbiAgICAgIGVudHJ5OiBgJHtMQU1CREFfQVNTRVRTX1BBVEh9L2dldC10aGluZy9hcHAudHNgLFxuICAgIH0pO1xuICAgIGdldFRoaW5nRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LWRlc2NyaWJlLXRoaW5nLXBvbGljeScsIHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAnaW90OkRlc2NyaWJlVGhpbmcnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBnZXRUaGluZ0Z1bmN0aW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVVcGRhdGVUaGluZ0Z1bmN0aW9uKCk6IE5vZGVqc0Z1bmN0aW9uIHtcbiAgICBjb25zdCB1cGRhdGVUaGluZ0Z1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdVcGRhdGVUaGluZ0Z1bmN0aW9uJywge1xuICAgICAgZW50cnk6IGAke0xBTUJEQV9BU1NFVFNfUEFUSH0vdXBkYXRlLXRoaW5nL2FwcC50c2AsXG4gICAgfSk7XG4gICAgdXBkYXRlVGhpbmdGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtdXBkYXRlLXRoaW5nLXBvbGljeScsIHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgIG5ldyBQb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAnaW90OlVwZGF0ZVRoaW5nJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgKTtcbiAgICByZXR1cm4gdXBkYXRlVGhpbmdGdW5jdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVsZXRlVGhpbmdGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgZGVsZXRlVGhpbmdGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnRGVsZXRlVGhpbmdGdW5jdGlvbicsIHtcbiAgICAgIGVudHJ5OiBgJHtMQU1CREFfQVNTRVRTX1BBVEh9L2RlbGV0ZS10aGluZy9hcHAudHNgLFxuICAgIH0pO1xuICAgIGRlbGV0ZVRoaW5nRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LWRlbGV0ZS10aGluZy1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpEZWxldGVUaGluZycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGRlbGV0ZVRoaW5nRnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUxpc3RUaGluZ1NoYWRvd3NGdW5jdGlvbigpOiBOb2RlanNGdW5jdGlvbiB7XG4gICAgY29uc3QgbGlzdFRoaW5nU2hhZG93c0Z1bmN0aW9uID0gbmV3IE5vZGVqc0Z1bmN0aW9uKHRoaXMsICdMaXN0VGhpbmdTaGFkb3dzRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9saXN0LXRoaW5nLXNoYWRvd3MvYXBwLnRzYCxcbiAgICB9KTtcbiAgICBsaXN0VGhpbmdTaGFkb3dzRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LWxpc3QtdGhpbmctc2hhZG93cy1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpMaXN0TmFtZWRTaGFkb3dzRm9yVGhpbmcnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBsaXN0VGhpbmdTaGFkb3dzRnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUdldFRoaW5nU2hhZG93RnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGdldFRoaW5nU2hhZG93RnVuY3Rpb24gPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgJ0dldFRoaW5nU2hhZG93RnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9nZXQtdGhpbmctc2hhZG93L2FwcC50c2AsXG4gICAgfSk7XG4gICAgZ2V0VGhpbmdTaGFkb3dGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtZ2V0LXRoaW5nLXNoYWRvdy1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpHZXRUaGluZ1NoYWRvdycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGdldFRoaW5nU2hhZG93RnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZVRoaW5nU2hhZG93RnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IHVwZGF0ZVRoaW5nU2hhZG93RnVuY3Rpb24gPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgJ1VwZGF0ZVRoaW5nU2hhZG93RnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS91cGRhdGUtdGhpbmctc2hhZG93L2FwcC50c2AsXG4gICAgfSk7XG4gICAgdXBkYXRlVGhpbmdTaGFkb3dGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtdXBkYXRlLXRoaW5nLXNoYWRvdy1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpVcGRhdGVUaGluZ1NoYWRvdycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIHVwZGF0ZVRoaW5nU2hhZG93RnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURlbGV0ZVRoaW5nU2hhZG93RnVuY3Rpb24oKTogTm9kZWpzRnVuY3Rpb24ge1xuICAgIGNvbnN0IGRlbGV0ZVRoaW5nU2hhZG93RnVuY3Rpb24gPSBuZXcgTm9kZWpzRnVuY3Rpb24odGhpcywgJ0RlbGV0ZVRoaW5nU2hhZG93RnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9kZWxldGUtdGhpbmctc2hhZG93L2FwcC50c2AsXG4gICAgfSk7XG4gICAgZGVsZXRlVGhpbmdTaGFkb3dGdW5jdGlvbi5yb2xlPy5hdHRhY2hJbmxpbmVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5KHRoaXMsICdpb3QtZGVsZXRlLXRoaW5nLXNoYWRvdy1wb2xpY3knLCB7XG4gICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICAgICAgJ2lvdDpEZWxldGVUaGluZ1NoYWRvdycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVzb3VyY2VzOiBbJyonXSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGRlbGV0ZVRoaW5nU2hhZG93RnVuY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVNlYXJjaFRoaW5nc0Z1bmN0aW9uKCk6IE5vZGVqc0Z1bmN0aW9uIHtcbiAgICBjb25zdCBzZWFyY2hUaGluZ3NGdW5jdGlvbiA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCAnU2VhcmNoVGhpbmdzRnVuY3Rpb24nLCB7XG4gICAgICBlbnRyeTogYCR7TEFNQkRBX0FTU0VUU19QQVRIfS9zZWFyY2gtdGhpbmdzL2FwcC50c2AsXG4gICAgfSk7XG4gICAgc2VhcmNoVGhpbmdzRnVuY3Rpb24ucm9sZT8uYXR0YWNoSW5saW5lUG9saWN5KFxuICAgICAgbmV3IFBvbGljeSh0aGlzLCAnaW90LXNlYXJjaC10aGluZ3MtcG9saWN5Jywge1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICAgICdpb3Q6U2VhcmNoSW5kZXgnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHJlc291cmNlczogWycqJ10sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBzZWFyY2hUaGluZ3NGdW5jdGlvbjtcbiAgfVxufSJdfQ==