@digitraffic/common 2022.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/LICENSE +291 -0
  2. package/aws/infra/api/integration.d.ts +21 -0
  3. package/aws/infra/api/integration.js +52 -0
  4. package/aws/infra/api/response.d.ts +22 -0
  5. package/aws/infra/api/response.js +61 -0
  6. package/aws/infra/api/responses.d.ts +39 -0
  7. package/aws/infra/api/responses.js +79 -0
  8. package/aws/infra/api/static-integration.d.ts +15 -0
  9. package/aws/infra/api/static-integration.js +54 -0
  10. package/aws/infra/canaries/canary-alarm.d.ts +6 -0
  11. package/aws/infra/canaries/canary-alarm.js +26 -0
  12. package/aws/infra/canaries/canary-parameters.d.ts +18 -0
  13. package/aws/infra/canaries/canary-parameters.js +3 -0
  14. package/aws/infra/canaries/canary-role.d.ts +6 -0
  15. package/aws/infra/canaries/canary-role.js +46 -0
  16. package/aws/infra/canaries/canary.d.ts +8 -0
  17. package/aws/infra/canaries/canary.js +29 -0
  18. package/aws/infra/canaries/database-canary.d.ts +18 -0
  19. package/aws/infra/canaries/database-canary.js +55 -0
  20. package/aws/infra/canaries/database-checker.d.ts +21 -0
  21. package/aws/infra/canaries/database-checker.js +109 -0
  22. package/aws/infra/canaries/url-canary.d.ts +19 -0
  23. package/aws/infra/canaries/url-canary.js +46 -0
  24. package/aws/infra/canaries/url-checker.d.ts +46 -0
  25. package/aws/infra/canaries/url-checker.js +238 -0
  26. package/aws/infra/documentation.d.ts +56 -0
  27. package/aws/infra/documentation.js +95 -0
  28. package/aws/infra/scheduler.d.ts +12 -0
  29. package/aws/infra/scheduler.js +31 -0
  30. package/aws/infra/security-rule.d.ts +12 -0
  31. package/aws/infra/security-rule.js +39 -0
  32. package/aws/infra/sqs-integration.d.ts +7 -0
  33. package/aws/infra/sqs-integration.js +93 -0
  34. package/aws/infra/sqs-queue.d.ts +16 -0
  35. package/aws/infra/sqs-queue.js +130 -0
  36. package/aws/infra/stack/lambda-configs.d.ts +72 -0
  37. package/aws/infra/stack/lambda-configs.js +93 -0
  38. package/aws/infra/stack/monitoredfunction.d.ts +84 -0
  39. package/aws/infra/stack/monitoredfunction.js +135 -0
  40. package/aws/infra/stack/rest_apis.d.ts +40 -0
  41. package/aws/infra/stack/rest_apis.js +179 -0
  42. package/aws/infra/stack/stack-checking-aspect.d.ts +20 -0
  43. package/aws/infra/stack/stack-checking-aspect.js +163 -0
  44. package/aws/infra/stack/stack.d.ts +41 -0
  45. package/aws/infra/stack/stack.js +58 -0
  46. package/aws/infra/stack/subscription.d.ts +17 -0
  47. package/aws/infra/stack/subscription.js +41 -0
  48. package/aws/infra/usage-plans.d.ts +15 -0
  49. package/aws/infra/usage-plans.js +42 -0
  50. package/aws/runtime/apikey.d.ts +2 -0
  51. package/aws/runtime/apikey.js +13 -0
  52. package/aws/runtime/digitraffic-integration-response.d.ts +8 -0
  53. package/aws/runtime/digitraffic-integration-response.js +26 -0
  54. package/aws/runtime/messaging.d.ts +10 -0
  55. package/aws/runtime/messaging.js +31 -0
  56. package/aws/runtime/s3.d.ts +2 -0
  57. package/aws/runtime/s3.js +30 -0
  58. package/aws/runtime/secrets/dbsecret.d.ts +54 -0
  59. package/aws/runtime/secrets/dbsecret.js +96 -0
  60. package/aws/runtime/secrets/proxy-holder.d.ts +9 -0
  61. package/aws/runtime/secrets/proxy-holder.js +26 -0
  62. package/aws/runtime/secrets/rds-holder.d.ts +9 -0
  63. package/aws/runtime/secrets/rds-holder.js +26 -0
  64. package/aws/runtime/secrets/secret-holder.d.ts +26 -0
  65. package/aws/runtime/secrets/secret-holder.js +73 -0
  66. package/aws/runtime/secrets/secret.d.ts +8 -0
  67. package/aws/runtime/secrets/secret.js +43 -0
  68. package/aws/types/errors.d.ts +4 -0
  69. package/aws/types/errors.js +9 -0
  70. package/aws/types/lambda-response.d.ts +12 -0
  71. package/aws/types/lambda-response.js +28 -0
  72. package/aws/types/mediatypes.d.ts +10 -0
  73. package/aws/types/mediatypes.js +15 -0
  74. package/aws/types/model-with-reference.d.ts +7 -0
  75. package/aws/types/model-with-reference.js +3 -0
  76. package/aws/types/proxytypes.d.ts +26 -0
  77. package/aws/types/proxytypes.js +3 -0
  78. package/aws/types/tags.d.ts +2 -0
  79. package/aws/types/tags.js +7 -0
  80. package/database/cached.d.ts +7 -0
  81. package/database/cached.js +32 -0
  82. package/database/database.d.ts +19 -0
  83. package/database/database.js +62 -0
  84. package/database/last-updated.d.ts +16 -0
  85. package/database/last-updated.js +54 -0
  86. package/index.d.ts +1 -0
  87. package/index.js +18 -0
  88. package/marine/id_utils.d.ts +3 -0
  89. package/marine/id_utils.js +33 -0
  90. package/marine/rtz.d.ts +48 -0
  91. package/marine/rtz.js +3 -0
  92. package/package.json +55 -0
  93. package/src/aws/infra/api/integration.js +52 -0
  94. package/src/aws/infra/api/response.js +61 -0
  95. package/src/aws/infra/api/responses.js +79 -0
  96. package/src/aws/infra/api/static-integration.js +54 -0
  97. package/src/aws/infra/canaries/canary-alarm.js +26 -0
  98. package/src/aws/infra/canaries/canary-parameters.js +3 -0
  99. package/src/aws/infra/canaries/canary-role.js +46 -0
  100. package/src/aws/infra/canaries/canary.js +29 -0
  101. package/src/aws/infra/canaries/database-canary.js +55 -0
  102. package/src/aws/infra/canaries/database-checker.js +109 -0
  103. package/src/aws/infra/canaries/url-canary.js +46 -0
  104. package/src/aws/infra/canaries/url-checker.js +238 -0
  105. package/src/aws/infra/documentation.js +95 -0
  106. package/src/aws/infra/scheduler.js +31 -0
  107. package/src/aws/infra/security-rule.js +39 -0
  108. package/src/aws/infra/sqs-integration.js +93 -0
  109. package/src/aws/infra/sqs-queue.js +130 -0
  110. package/src/aws/infra/stack/lambda-configs.js +93 -0
  111. package/src/aws/infra/stack/monitoredfunction.js +135 -0
  112. package/src/aws/infra/stack/rest_apis.js +179 -0
  113. package/src/aws/infra/stack/stack-checking-aspect.js +163 -0
  114. package/src/aws/infra/stack/stack.js +58 -0
  115. package/src/aws/infra/stack/subscription.js +41 -0
  116. package/src/aws/infra/usage-plans.js +42 -0
  117. package/src/aws/runtime/apikey.js +13 -0
  118. package/src/aws/runtime/digitraffic-integration-response.js +26 -0
  119. package/src/aws/runtime/messaging.js +31 -0
  120. package/src/aws/runtime/s3.js +30 -0
  121. package/src/aws/runtime/secrets/dbsecret.js +96 -0
  122. package/src/aws/runtime/secrets/proxy-holder.js +26 -0
  123. package/src/aws/runtime/secrets/rds-holder.js +26 -0
  124. package/src/aws/runtime/secrets/secret-holder.js +73 -0
  125. package/src/aws/runtime/secrets/secret.js +43 -0
  126. package/src/aws/types/errors.js +9 -0
  127. package/src/aws/types/lambda-response.js +28 -0
  128. package/src/aws/types/mediatypes.js +15 -0
  129. package/src/aws/types/model-with-reference.js +3 -0
  130. package/src/aws/types/proxytypes.js +3 -0
  131. package/src/aws/types/tags.js +7 -0
  132. package/src/database/cached.js +32 -0
  133. package/src/database/database.js +62 -0
  134. package/src/database/last-updated.js +54 -0
  135. package/src/marine/id_utils.js +33 -0
  136. package/src/marine/rtz.js +3 -0
  137. package/src/test/asserter.js +45 -0
  138. package/src/test/db-testutils.js +31 -0
  139. package/src/test/httpserver.js +67 -0
  140. package/src/test/secret.js +25 -0
  141. package/src/test/secrets-manager.js +59 -0
  142. package/src/test/testutils.js +44 -0
  143. package/src/types/input-error.js +7 -0
  144. package/src/types/language.js +10 -0
  145. package/src/types/traffictype.js +13 -0
  146. package/src/types/validator.js +14 -0
  147. package/src/utils/api-model.js +129 -0
  148. package/src/utils/base64.js +21 -0
  149. package/src/utils/date-utils.js +34 -0
  150. package/src/utils/geojson-types.js +18 -0
  151. package/src/utils/geometry.js +140 -0
  152. package/src/utils/retry.js +50 -0
  153. package/src/utils/slack.js +25 -0
  154. package/src/utils/utils.js +40 -0
  155. package/test/asserter.d.ts +11 -0
  156. package/test/asserter.js +45 -0
  157. package/test/db-testutils.d.ts +2 -0
  158. package/test/db-testutils.js +31 -0
  159. package/test/httpserver.d.ts +18 -0
  160. package/test/httpserver.js +67 -0
  161. package/test/marine/id_utils.test.js +69 -0
  162. package/test/promise/promise.test.js +125 -0
  163. package/test/secret.d.ts +3 -0
  164. package/test/secret.js +25 -0
  165. package/test/secrets/dbsecret.test.js +71 -0
  166. package/test/secrets/secret-holder.test.js +124 -0
  167. package/test/secrets/secret.test.js +66 -0
  168. package/test/secrets-manager.d.ts +9 -0
  169. package/test/secrets-manager.js +59 -0
  170. package/test/test/httpserver.test.js +87 -0
  171. package/test/testutils.d.ts +12 -0
  172. package/test/testutils.js +44 -0
  173. package/test/utils/date-utils.test.js +51 -0
  174. package/test/utils/geometry.test.js +49 -0
  175. package/test/utils/utils.test.js +49 -0
  176. package/types/input-error.d.ts +2 -0
  177. package/types/input-error.js +7 -0
  178. package/types/language.d.ts +5 -0
  179. package/types/language.js +10 -0
  180. package/types/traffictype.d.ts +8 -0
  181. package/types/traffictype.js +13 -0
  182. package/types/validator.d.ts +4 -0
  183. package/types/validator.js +14 -0
  184. package/utils/api-model.d.ts +87 -0
  185. package/utils/api-model.js +129 -0
  186. package/utils/base64.d.ts +12 -0
  187. package/utils/base64.js +21 -0
  188. package/utils/date-utils.d.ts +17 -0
  189. package/utils/date-utils.js +34 -0
  190. package/utils/geojson-types.d.ts +14 -0
  191. package/utils/geojson-types.js +18 -0
  192. package/utils/geometry.d.ts +36 -0
  193. package/utils/geometry.js +140 -0
  194. package/utils/retry.d.ts +13 -0
  195. package/utils/retry.js +50 -0
  196. package/utils/slack.d.ts +5 -0
  197. package/utils/slack.js +25 -0
  198. package/utils/utils.d.ts +22 -0
  199. package/utils/utils.js +40 -0
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIpRestrictionPolicyDocument = exports.createDefaultPolicyDocument = exports.createRestApi = exports.setReturnCodeForMissingAuthenticationToken = exports.add401Support = exports.add404Support = exports.DigitrafficRestApi = void 0;
4
+ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
5
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
+ const usage_plans_1 = require("../usage-plans");
7
+ const api_model_1 = require("../../../utils/api-model");
8
+ const mediatypes_1 = require("../../types/mediatypes");
9
+ const R = require("ramda");
10
+ class DigitrafficRestApi extends aws_apigateway_1.RestApi {
11
+ constructor(stack, apiId, apiName, allowFromIpAddresses, config) {
12
+ const policyDocument = allowFromIpAddresses == null ? createDefaultPolicyDocument() : createIpRestrictionPolicyDocument(allowFromIpAddresses);
13
+ // override default config with given extra config
14
+ const apiConfig = { ...{
15
+ deployOptions: {
16
+ loggingLevel: aws_apigateway_1.MethodLoggingLevel.ERROR,
17
+ },
18
+ restApiName: apiName,
19
+ endpointTypes: [aws_apigateway_1.EndpointType.REGIONAL],
20
+ policy: policyDocument,
21
+ }, ...config };
22
+ super(stack, apiId, apiConfig);
23
+ this.apiKeyIds = [];
24
+ add404Support(this, stack);
25
+ }
26
+ hostname() {
27
+ return `${this.restApiId}.execute-api.${this.stack.region}.amazonaws.com`;
28
+ }
29
+ createUsagePlan(apiKeyId, apiKeyName) {
30
+ const newKeyId = (0, usage_plans_1.createUsagePlan)(this, apiKeyId, apiKeyName).keyId;
31
+ this.apiKeyIds.push(newKeyId);
32
+ return newKeyId;
33
+ }
34
+ createUsagePlanV2(apiName) {
35
+ const newKeyId = (0, usage_plans_1.createDefaultUsagePlan)(this, apiName).keyId;
36
+ this.apiKeyIds.push(newKeyId);
37
+ return newKeyId;
38
+ }
39
+ addJsonModel(modelName, schema) {
40
+ return this.getModelWithReference(this.addModel(modelName, {
41
+ contentType: mediatypes_1.MediaType.APPLICATION_JSON,
42
+ modelName,
43
+ schema,
44
+ }));
45
+ }
46
+ addCSVModel(modelName) {
47
+ return this.getModelWithReference(this.addModel(modelName, {
48
+ contentType: mediatypes_1.MediaType.TEXT_CSV,
49
+ modelName,
50
+ schema: {},
51
+ }));
52
+ }
53
+ getModelWithReference(model) {
54
+ return R.assoc('modelReference', (0, api_model_1.getModelReference)(model.modelId, this.restApiId), model);
55
+ }
56
+ addDocumentationPart(resource, parameterName, resourceName, type, properties) {
57
+ const location = {
58
+ type,
59
+ path: resource.path,
60
+ name: type !== 'METHOD' ? parameterName : undefined,
61
+ };
62
+ new aws_apigateway_1.CfnDocumentationPart(this.stack, resourceName, {
63
+ restApiId: resource.api.restApiId,
64
+ location,
65
+ properties: JSON.stringify(properties),
66
+ });
67
+ }
68
+ documentResource(resource, ...documentationPart) {
69
+ documentationPart.forEach(dp => this.addDocumentationPart(resource, dp.parameterName, `${resource.path}.${dp.parameterName}.Documentation`, dp.type, dp.documentationProperties));
70
+ }
71
+ }
72
+ exports.DigitrafficRestApi = DigitrafficRestApi;
73
+ /**
74
+ * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
75
+ * with a non-existent endpoint. This function translates this response to a 404.
76
+ * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
77
+ * @param restApi RestApi
78
+ * @param stack Construct
79
+ */
80
+ function add404Support(restApi, stack) {
81
+ new aws_apigateway_1.GatewayResponse(stack, `MissingAuthenticationTokenResponse-${restApi.restApiName}`, {
82
+ restApi,
83
+ type: aws_apigateway_1.ResponseType.MISSING_AUTHENTICATION_TOKEN,
84
+ statusCode: '404',
85
+ templates: {
86
+ 'application/json': '{"message": "Not found"}',
87
+ },
88
+ });
89
+ }
90
+ exports.add404Support = add404Support;
91
+ function add401Support(restApi, stack) {
92
+ new aws_apigateway_1.GatewayResponse(stack, `AuthenticationFailedResponse-${restApi.restApiName}`, {
93
+ restApi,
94
+ type: aws_apigateway_1.ResponseType.UNAUTHORIZED,
95
+ statusCode: "401",
96
+ responseHeaders: {
97
+ 'WWW-Authenticate': "'Basic'",
98
+ },
99
+ });
100
+ }
101
+ exports.add401Support = add401Support;
102
+ /**
103
+ * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
104
+ * with a non-existent endpoint. This function converts this response to a custom one.
105
+ * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
106
+ * @param returnCode
107
+ * @param message
108
+ * @param restApi RestApi
109
+ * @param stack Construct
110
+ */
111
+ function setReturnCodeForMissingAuthenticationToken(returnCode, message, restApi, stack) {
112
+ new aws_apigateway_1.GatewayResponse(stack, `MissingAuthenticationTokenResponse-${restApi.restApiName}`, {
113
+ restApi,
114
+ type: aws_apigateway_1.ResponseType.MISSING_AUTHENTICATION_TOKEN,
115
+ statusCode: `${returnCode}`,
116
+ templates: {
117
+ 'application/json': `{"message": ${message}}`,
118
+ },
119
+ });
120
+ }
121
+ exports.setReturnCodeForMissingAuthenticationToken = setReturnCodeForMissingAuthenticationToken;
122
+ function createRestApi(stack, apiId, apiName, allowFromIpAddresses) {
123
+ const policyDocument = allowFromIpAddresses == null ? createDefaultPolicyDocument() : createIpRestrictionPolicyDocument(allowFromIpAddresses);
124
+ const restApi = new aws_apigateway_1.RestApi(stack, apiId, {
125
+ deployOptions: {
126
+ loggingLevel: aws_apigateway_1.MethodLoggingLevel.ERROR,
127
+ },
128
+ restApiName: apiName,
129
+ endpointTypes: [aws_apigateway_1.EndpointType.REGIONAL],
130
+ policy: policyDocument,
131
+ });
132
+ add404Support(restApi, stack);
133
+ return restApi;
134
+ }
135
+ exports.createRestApi = createRestApi;
136
+ function createDefaultPolicyDocument() {
137
+ return new aws_iam_1.PolicyDocument({
138
+ statements: [
139
+ new aws_iam_1.PolicyStatement({
140
+ effect: aws_iam_1.Effect.ALLOW,
141
+ actions: [
142
+ "execute-api:Invoke",
143
+ ],
144
+ resources: [
145
+ "*",
146
+ ],
147
+ principals: [
148
+ new aws_iam_1.AnyPrincipal(),
149
+ ],
150
+ }),
151
+ ],
152
+ });
153
+ }
154
+ exports.createDefaultPolicyDocument = createDefaultPolicyDocument;
155
+ function createIpRestrictionPolicyDocument(allowFromIpAddresses) {
156
+ return new aws_iam_1.PolicyDocument({
157
+ statements: [
158
+ new aws_iam_1.PolicyStatement({
159
+ effect: aws_iam_1.Effect.ALLOW,
160
+ conditions: {
161
+ "IpAddress": {
162
+ "aws:SourceIp": allowFromIpAddresses,
163
+ },
164
+ },
165
+ actions: [
166
+ "execute-api:Invoke",
167
+ ],
168
+ resources: [
169
+ "*",
170
+ ],
171
+ principals: [
172
+ new aws_iam_1.AnyPrincipal(),
173
+ ],
174
+ }),
175
+ ],
176
+ });
177
+ }
178
+ exports.createIpRestrictionPolicyDocument = createIpRestrictionPolicyDocument;
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdF9hcGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zdGFjay9yZXN0X2FwaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0RBT29DO0FBQ3BDLGlEQUEwRjtBQUcxRixnREFBdUU7QUFFdkUsd0RBQTJEO0FBQzNELHVEQUFpRDtBQUdqRCwyQkFBNEI7QUFFNUIsTUFBYSxrQkFBbUIsU0FBUSx3QkFBTztJQUczQyxZQUNJLEtBQXVCLEVBQUUsS0FBYSxFQUFFLE9BQWUsRUFBRSxvQkFBMkMsRUFBRSxNQUE4QjtRQUVwSSxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFOUksa0RBQWtEO1FBQ2xELE1BQU0sU0FBUyxHQUFHLEVBQUMsR0FBRztnQkFDbEIsYUFBYSxFQUFFO29CQUNYLFlBQVksRUFBRSxtQ0FBa0IsQ0FBQyxLQUFLO2lCQUN6QztnQkFDRCxXQUFXLEVBQUUsT0FBTztnQkFDcEIsYUFBYSxFQUFFLENBQUMsNkJBQVksQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLE1BQU0sRUFBRSxjQUFjO2FBQ3pCLEVBQUUsR0FBRyxNQUFNLEVBQUMsQ0FBQztRQUVkLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXBCLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFFBQVE7UUFDSixPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsZ0JBQWlCLElBQUksQ0FBQyxLQUEwQixDQUFDLE1BQU0sZ0JBQWdCLENBQUM7SUFDcEcsQ0FBQztJQUVELGVBQWUsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO1FB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QUFDLENBQUM7SUFDSCxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlCLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFaRCxzQ0FZQztBQUVELFNBQWdCLDJCQUEyQjtJQUN2QyxPQUFPLElBQUksd0JBQWMsQ0FBQztRQUN0QixVQUFVLEVBQUU7WUFDUixJQUFJLHlCQUFlLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7Z0JBQ3BCLE9BQU8sRUFBRTtvQkFDTCxvQkFBb0I7aUJBQ3ZCO2dCQUNELFNBQVMsRUFBRTtvQkFDUCxHQUFHO2lCQUNOO2dCQUNELFVBQVUsRUFBRTtvQkFDUixJQUFJLHNCQUFZLEVBQUU7aUJBQ3JCO2FBQ0osQ0FBQztTQUNMO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWpCRCxrRUFpQkM7QUFHRCxTQUFnQixpQ0FBaUMsQ0FBQyxvQkFBOEI7SUFDNUUsT0FBTyxJQUFJLHdCQUFjLENBQUM7UUFDdEIsVUFBVSxFQUFFO1lBQ1IsSUFBSSx5QkFBZSxDQUFDO2dCQUNoQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixVQUFVLEVBQUU7b0JBQ1IsV0FBVyxFQUFFO3dCQUNULGNBQWMsRUFBRSxvQkFBb0I7cUJBQ3ZDO2lCQUNKO2dCQUNELE9BQU8sRUFBRTtvQkFDTCxvQkFBb0I7aUJBQ3ZCO2dCQUNELFNBQVMsRUFBRTtvQkFDUCxHQUFHO2lCQUNOO2dCQUNELFVBQVUsRUFBRTtvQkFDUixJQUFJLHNCQUFZLEVBQUU7aUJBQ3JCO2FBQ0osQ0FBQztTQUNMO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQXRCRCw4RUFzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgUmVzdEFwaSxcclxuICAgIE1ldGhvZExvZ2dpbmdMZXZlbCxcclxuICAgIEdhdGV3YXlSZXNwb25zZSxcclxuICAgIFJlc3BvbnNlVHlwZSxcclxuICAgIEVuZHBvaW50VHlwZSxcclxuICAgIFJlc3RBcGlQcm9wcywgSnNvblNjaGVtYSwgTW9kZWwsIENmbkRvY3VtZW50YXRpb25QYXJ0LCBSZXNvdXJjZSxcclxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XHJcbmltcG9ydCB7UG9saWN5RG9jdW1lbnQsIFBvbGljeVN0YXRlbWVudCwgRWZmZWN0LCBBbnlQcmluY2lwYWx9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xyXG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuaW1wb3J0IHtEaWdpdHJhZmZpY1N0YWNrfSBmcm9tIFwiLi9zdGFja1wiO1xyXG5pbXBvcnQge2NyZWF0ZURlZmF1bHRVc2FnZVBsYW4sIGNyZWF0ZVVzYWdlUGxhbn0gZnJvbSBcIi4uL3VzYWdlLXBsYW5zXCI7XHJcbmltcG9ydCB7TW9kZWxXaXRoUmVmZXJlbmNlfSBmcm9tIFwiLi4vLi4vdHlwZXMvbW9kZWwtd2l0aC1yZWZlcmVuY2VcIjtcclxuaW1wb3J0IHtnZXRNb2RlbFJlZmVyZW5jZX0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2FwaS1tb2RlbFwiO1xyXG5pbXBvcnQge01lZGlhVHlwZX0gZnJvbSBcIi4uLy4uL3R5cGVzL21lZGlhdHlwZXNcIjtcclxuaW1wb3J0IHtEb2N1bWVudGF0aW9uUGFydCwgRG9jdW1lbnRhdGlvblByb3BlcnRpZXN9IGZyb20gXCIuLi9kb2N1bWVudGF0aW9uXCI7XHJcblxyXG5pbXBvcnQgUiA9IHJlcXVpcmUoJ3JhbWRhJyk7XHJcblxyXG5leHBvcnQgY2xhc3MgRGlnaXRyYWZmaWNSZXN0QXBpIGV4dGVuZHMgUmVzdEFwaSB7XHJcbiAgICByZWFkb25seSBhcGlLZXlJZHM6IHN0cmluZ1tdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBhcGlJZDogc3RyaW5nLCBhcGlOYW1lOiBzdHJpbmcsIGFsbG93RnJvbUlwQWRkcmVzc2VzPzogc3RyaW5nW10gfCB1bmRlZmluZWQsIGNvbmZpZz86IFBhcnRpYWw8UmVzdEFwaVByb3BzPixcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IHBvbGljeURvY3VtZW50ID0gYWxsb3dGcm9tSXBBZGRyZXNzZXMgPT0gbnVsbCA/IGNyZWF0ZURlZmF1bHRQb2xpY3lEb2N1bWVudCgpIDogY3JlYXRlSXBSZXN0cmljdGlvblBvbGljeURvY3VtZW50KGFsbG93RnJvbUlwQWRkcmVzc2VzKTtcclxuXHJcbiAgICAgICAgLy8gb3ZlcnJpZGUgZGVmYXVsdCBjb25maWcgd2l0aCBnaXZlbiBleHRyYSBjb25maWdcclxuICAgICAgICBjb25zdCBhcGlDb25maWcgPSB7Li4ue1xyXG4gICAgICAgICAgICBkZXBsb3lPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICBsb2dnaW5nTGV2ZWw6IE1ldGhvZExvZ2dpbmdMZXZlbC5FUlJPUixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVzdEFwaU5hbWU6IGFwaU5hbWUsXHJcbiAgICAgICAgICAgIGVuZHBvaW50VHlwZXM6IFtFbmRwb2ludFR5cGUuUkVHSU9OQUxdLFxyXG4gICAgICAgICAgICBwb2xpY3k6IHBvbGljeURvY3VtZW50LFxyXG4gICAgICAgIH0sIC4uLmNvbmZpZ307XHJcblxyXG4gICAgICAgIHN1cGVyKHN0YWNrLCBhcGlJZCwgYXBpQ29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5hcGlLZXlJZHMgPSBbXTtcclxuXHJcbiAgICAgICAgYWRkNDA0U3VwcG9ydCh0aGlzLCBzdGFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgaG9zdG5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5yZXN0QXBpSWR9LmV4ZWN1dGUtYXBpLiR7KHRoaXMuc3RhY2sgYXMgRGlnaXRyYWZmaWNTdGFjaykucmVnaW9ufS5hbWF6b25hd3MuY29tYDtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVVc2FnZVBsYW4oYXBpS2V5SWQ6IHN0cmluZywgYXBpS2V5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBuZXdLZXlJZCA9IGNyZWF0ZVVzYWdlUGxhbih0aGlzLCBhcGlLZXlJZCwgYXBpS2V5TmFtZSkua2V5SWQ7XHJcblxyXG4gICAgICAgIHRoaXMuYXBpS2V5SWRzLnB1c2gobmV3S2V5SWQpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3S2V5SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVXNhZ2VQbGFuVjIoYXBpTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBuZXdLZXlJZCA9IGNyZWF0ZURlZmF1bHRVc2FnZVBsYW4odGhpcywgYXBpTmFtZSkua2V5SWQ7XHJcblxyXG4gICAgICAgIHRoaXMuYXBpS2V5SWRzLnB1c2gobmV3S2V5SWQpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3S2V5SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSnNvbk1vZGVsKG1vZGVsTmFtZTogc3RyaW5nLCBzY2hlbWE6IEpzb25TY2hlbWEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNb2RlbFdpdGhSZWZlcmVuY2UodGhpcy5hZGRNb2RlbChtb2RlbE5hbWUsIHtcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OLFxyXG4gICAgICAgICAgICBtb2RlbE5hbWUsXHJcbiAgICAgICAgICAgIHNjaGVtYSxcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ1NWTW9kZWwobW9kZWxOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNb2RlbFdpdGhSZWZlcmVuY2UodGhpcy5hZGRNb2RlbChtb2RlbE5hbWUsIHtcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IE1lZGlhVHlwZS5URVhUX0NTVixcclxuICAgICAgICAgICAgbW9kZWxOYW1lLFxyXG4gICAgICAgICAgICBzY2hlbWE6IHt9LFxyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1vZGVsV2l0aFJlZmVyZW5jZShtb2RlbDogTW9kZWwpOiBNb2RlbFdpdGhSZWZlcmVuY2Uge1xyXG4gICAgICAgIHJldHVybiBSLmFzc29jKCdtb2RlbFJlZmVyZW5jZScsIGdldE1vZGVsUmVmZXJlbmNlKG1vZGVsLm1vZGVsSWQsIHRoaXMucmVzdEFwaUlkKSwgbW9kZWwpIGFzIE1vZGVsV2l0aFJlZmVyZW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZERvY3VtZW50YXRpb25QYXJ0KFxyXG4gICAgICAgIHJlc291cmNlOiBSZXNvdXJjZSwgcGFyYW1ldGVyTmFtZTogc3RyaW5nLCByZXNvdXJjZU5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiBEb2N1bWVudGF0aW9uUHJvcGVydGllcyxcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uOiBDZm5Eb2N1bWVudGF0aW9uUGFydC5Mb2NhdGlvblByb3BlcnR5ID0ge1xyXG4gICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICBwYXRoOiByZXNvdXJjZS5wYXRoLFxyXG4gICAgICAgICAgICBuYW1lOiB0eXBlICE9PSAnTUVUSE9EJyA/IHBhcmFtZXRlck5hbWUgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbmV3IENmbkRvY3VtZW50YXRpb25QYXJ0KHRoaXMuc3RhY2ssIHJlc291cmNlTmFtZSwge1xyXG4gICAgICAgICAgICByZXN0QXBpSWQ6IHJlc291cmNlLmFwaS5yZXN0QXBpSWQsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uLFxyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBKU09OLnN0cmluZ2lmeShwcm9wZXJ0aWVzKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudFJlc291cmNlKHJlc291cmNlOiBSZXNvdXJjZSwgLi4uZG9jdW1lbnRhdGlvblBhcnQ6IERvY3VtZW50YXRpb25QYXJ0W10pIHtcclxuICAgICAgICBkb2N1bWVudGF0aW9uUGFydC5mb3JFYWNoKGRwID0+IHRoaXMuYWRkRG9jdW1lbnRhdGlvblBhcnQoXHJcbiAgICAgICAgICAgIHJlc291cmNlLCBkcC5wYXJhbWV0ZXJOYW1lLCBgJHtyZXNvdXJjZS5wYXRofS4ke2RwLnBhcmFtZXRlck5hbWV9LkRvY3VtZW50YXRpb25gLCBkcC50eXBlLCBkcC5kb2N1bWVudGF0aW9uUHJvcGVydGllcyxcclxuICAgICAgICApKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIER1ZSB0byBBV1MgQVBJIGRlc2lnbiBBUEkgR2F0ZXdheSB3aWxsIGFsd2F5cyByZXR1cm4gNDAzICdNaXNzaW5nIEF1dGhlbnRpY2F0aW9uIFRva2VuJyBmb3IgcmVxdWVzdHNcclxuICogd2l0aCBhIG5vbi1leGlzdGVudCBlbmRwb2ludC4gVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoaXMgcmVzcG9uc2UgdG8gYSA0MDQuXHJcbiAqIFJlcXVlc3RzIHdpdGggYW4gaW52YWxpZCBvciBtaXNzaW5nIEFQSSBrZXkgYXJlIG5vdCBhZmZlY3RlZCAoc3RpbGwgcmV0dXJuIDQwMyAnRm9yYmlkZGVuJykuXHJcbiAqIEBwYXJhbSByZXN0QXBpIFJlc3RBcGlcclxuICogQHBhcmFtIHN0YWNrIENvbnN0cnVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZDQwNFN1cHBvcnQocmVzdEFwaTogUmVzdEFwaSwgc3RhY2s6IENvbnN0cnVjdCkge1xyXG4gICAgbmV3IEdhdGV3YXlSZXNwb25zZShzdGFjaywgYE1pc3NpbmdBdXRoZW50aWNhdGlvblRva2VuUmVzcG9uc2UtJHtyZXN0QXBpLnJlc3RBcGlOYW1lfWAsIHtcclxuICAgICAgICByZXN0QXBpLFxyXG4gICAgICAgIHR5cGU6IFJlc3BvbnNlVHlwZS5NSVNTSU5HX0FVVEhFTlRJQ0FUSU9OX1RPS0VOLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICc0MDQnLFxyXG4gICAgICAgIHRlbXBsYXRlczoge1xyXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6ICd7XCJtZXNzYWdlXCI6IFwiTm90IGZvdW5kXCJ9JyxcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGQ0MDFTdXBwb3J0KHJlc3RBcGk6IFJlc3RBcGksIHN0YWNrOiBDb25zdHJ1Y3QpIHtcclxuICAgIG5ldyBHYXRld2F5UmVzcG9uc2Uoc3RhY2ssIGBBdXRoZW50aWNhdGlvbkZhaWxlZFJlc3BvbnNlLSR7cmVzdEFwaS5yZXN0QXBpTmFtZX1gLCB7XHJcbiAgICAgICAgcmVzdEFwaSxcclxuICAgICAgICB0eXBlOiBSZXNwb25zZVR5cGUuVU5BVVRIT1JJWkVELFxyXG4gICAgICAgIHN0YXR1c0NvZGU6IFwiNDAxXCIsXHJcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICdXV1ctQXV0aGVudGljYXRlJzogXCInQmFzaWMnXCIsXHJcbiAgICAgICAgfSxcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogRHVlIHRvIEFXUyBBUEkgZGVzaWduIEFQSSBHYXRld2F5IHdpbGwgYWx3YXlzIHJldHVybiA0MDMgJ01pc3NpbmcgQXV0aGVudGljYXRpb24gVG9rZW4nIGZvciByZXF1ZXN0c1xyXG4gKiB3aXRoIGEgbm9uLWV4aXN0ZW50IGVuZHBvaW50LiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoaXMgcmVzcG9uc2UgdG8gYSBjdXN0b20gb25lLlxyXG4gKiBSZXF1ZXN0cyB3aXRoIGFuIGludmFsaWQgb3IgbWlzc2luZyBBUEkga2V5IGFyZSBub3QgYWZmZWN0ZWQgKHN0aWxsIHJldHVybiA0MDMgJ0ZvcmJpZGRlbicpLlxyXG4gKiBAcGFyYW0gcmV0dXJuQ29kZVxyXG4gKiBAcGFyYW0gbWVzc2FnZVxyXG4gKiBAcGFyYW0gcmVzdEFwaSBSZXN0QXBpXHJcbiAqIEBwYXJhbSBzdGFjayBDb25zdHJ1Y3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRSZXR1cm5Db2RlRm9yTWlzc2luZ0F1dGhlbnRpY2F0aW9uVG9rZW4ocmV0dXJuQ29kZTogbnVtYmVyLFxyXG4gICAgbWVzc2FnZTogc3RyaW5nLFxyXG4gICAgcmVzdEFwaTogUmVzdEFwaSxcclxuICAgIHN0YWNrOiBDb25zdHJ1Y3QpIHtcclxuXHJcbiAgICBuZXcgR2F0ZXdheVJlc3BvbnNlKHN0YWNrLCBgTWlzc2luZ0F1dGhlbnRpY2F0aW9uVG9rZW5SZXNwb25zZS0ke3Jlc3RBcGkucmVzdEFwaU5hbWV9YCwge1xyXG4gICAgICAgIHJlc3RBcGksXHJcbiAgICAgICAgdHlwZTogUmVzcG9uc2VUeXBlLk1JU1NJTkdfQVVUSEVOVElDQVRJT05fVE9LRU4sXHJcbiAgICAgICAgc3RhdHVzQ29kZTogYCR7cmV0dXJuQ29kZX1gLFxyXG4gICAgICAgIHRlbXBsYXRlczoge1xyXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IGB7XCJtZXNzYWdlXCI6ICR7bWVzc2FnZX19YCxcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0QXBpKHN0YWNrOiBDb25zdHJ1Y3QsIGFwaUlkOiBzdHJpbmcsIGFwaU5hbWU6IHN0cmluZywgYWxsb3dGcm9tSXBBZGRyZXNzZXM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFJlc3RBcGkge1xyXG4gICAgY29uc3QgcG9saWN5RG9jdW1lbnQgPSBhbGxvd0Zyb21JcEFkZHJlc3NlcyA9PSBudWxsID8gY3JlYXRlRGVmYXVsdFBvbGljeURvY3VtZW50KCkgOiBjcmVhdGVJcFJlc3RyaWN0aW9uUG9saWN5RG9jdW1lbnQoYWxsb3dGcm9tSXBBZGRyZXNzZXMpO1xyXG4gICAgY29uc3QgcmVzdEFwaSA9IG5ldyBSZXN0QXBpKHN0YWNrLCBhcGlJZCwge1xyXG4gICAgICAgIGRlcGxveU9wdGlvbnM6IHtcclxuICAgICAgICAgICAgbG9nZ2luZ0xldmVsOiBNZXRob2RMb2dnaW5nTGV2ZWwuRVJST1IsXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXN0QXBpTmFtZTogYXBpTmFtZSxcclxuICAgICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcclxuICAgICAgICBwb2xpY3k6IHBvbGljeURvY3VtZW50LFxyXG4gICAgfSk7XHJcbiAgICBhZGQ0MDRTdXBwb3J0KHJlc3RBcGksIHN0YWNrKTtcclxuICAgIHJldHVybiByZXN0QXBpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFBvbGljeURvY3VtZW50KCkge1xyXG4gICAgcmV0dXJuIG5ldyBQb2xpY3lEb2N1bWVudCh7XHJcbiAgICAgICAgc3RhdGVtZW50czogW1xyXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcclxuICAgICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgIFwiZXhlY3V0ZS1hcGk6SW52b2tlXCIsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgXCIqXCIsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgcHJpbmNpcGFsczogW1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBBbnlQcmluY2lwYWwoKSxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgIF0sXHJcbiAgICB9KTtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJcFJlc3RyaWN0aW9uUG9saWN5RG9jdW1lbnQoYWxsb3dGcm9tSXBBZGRyZXNzZXM6IHN0cmluZ1tdKTogUG9saWN5RG9jdW1lbnQge1xyXG4gICAgcmV0dXJuIG5ldyBQb2xpY3lEb2N1bWVudCh7XHJcbiAgICAgICAgc3RhdGVtZW50czogW1xyXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcclxuICAgICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxyXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiSXBBZGRyZXNzXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhd3M6U291cmNlSXBcIjogYWxsb3dGcm9tSXBBZGRyZXNzZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgXCJleGVjdXRlLWFwaTpJbnZva2VcIixcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICBcIipcIixcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBwcmluY2lwYWxzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IEFueVByaW5jaXBhbCgpLFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgXSxcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StackCheckingAspect = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
7
+ const stack_1 = require("./stack");
8
+ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
9
+ const change_case_1 = require("change-case");
10
+ const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
11
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
12
+ const MAX_CONCURRENCY_LIMIT = 100;
13
+ const NODE_RUNTIME = aws_lambda_1.Runtime.NODEJS_14_X.name;
14
+ var ResourceType;
15
+ (function (ResourceType) {
16
+ ResourceType["stackName"] = "STACK_NAME";
17
+ ResourceType["reservedConcurrentConcurrency"] = "RESERVED_CONCURRENT_CONCURRENCY";
18
+ ResourceType["functionTimeout"] = "FUNCTION_TIMEOUT";
19
+ ResourceType["functionMemorySize"] = "FUNCTION_MEMORY_SIZE";
20
+ ResourceType["functionRuntime"] = "FUNCTION_RUNTIME";
21
+ ResourceType["functionName"] = "FUNCTION_NAME";
22
+ ResourceType["tagSolution"] = "TAG_SOLUTION";
23
+ ResourceType["bucketPublicity"] = "BUCKET_PUBLICITY";
24
+ ResourceType["resourcePath"] = "RESOURCE_PATH";
25
+ ResourceType["queueEncryption"] = "QUEUE_ENCRYPTION";
26
+ ResourceType["logGroupRetention"] = "LOG_GROUP_RETENTION";
27
+ })(ResourceType || (ResourceType = {}));
28
+ class StackCheckingAspect {
29
+ constructor(configuration) {
30
+ this.configuration = configuration;
31
+ }
32
+ static create(stack) {
33
+ return new StackCheckingAspect(stack.configuration);
34
+ }
35
+ visit(node) {
36
+ //console.info("visiting class " + node.constructor.name);
37
+ this.checkStack(node);
38
+ this.checkFunction(node);
39
+ this.checkTags(node);
40
+ this.checkBucket(node);
41
+ this.checkResourceCasing(node);
42
+ this.checkQueueEncryption(node);
43
+ this.checkLogGroupRetention(node);
44
+ }
45
+ isWhitelisted(key) {
46
+ return this?.configuration?.whitelistedResources?.some(wl => {
47
+ return key.matchAll(new RegExp(wl, 'g'));
48
+ });
49
+ }
50
+ addAnnotation(node, key, message, isError = true) {
51
+ const resourceKey = `${node.node.path}/${key}`;
52
+ const isWhiteListed = this.isWhitelisted(resourceKey);
53
+ const annotationMessage = `${resourceKey}:${message}`;
54
+ // error && whitelisted -> warning
55
+ // warning && whitelisted -> nothing
56
+ if (isError && !isWhiteListed) {
57
+ aws_cdk_lib_1.Annotations.of(node).addError(annotationMessage);
58
+ }
59
+ else if ((!isError && !isWhiteListed) || (isError && isWhiteListed)) {
60
+ aws_cdk_lib_1.Annotations.of(node).addWarning(annotationMessage);
61
+ }
62
+ }
63
+ checkStack(node) {
64
+ if (node instanceof stack_1.DigitrafficStack) {
65
+ if ((node.stackName.includes('Test') || node.stackName.includes('Tst')) && node.configuration?.production) {
66
+ this.addAnnotation(node, ResourceType.stackName, 'Production is set for Test-stack');
67
+ }
68
+ if ((node.stackName.includes('Prod') || node.stackName.includes('Prd')) && !node.configuration?.production) {
69
+ this.addAnnotation(node, ResourceType.stackName, 'Production is not set for Production-stack');
70
+ }
71
+ }
72
+ }
73
+ checkFunction(node) {
74
+ if (node instanceof aws_lambda_1.CfnFunction) {
75
+ if (!node.reservedConcurrentExecutions) {
76
+ this.addAnnotation(node, ResourceType.reservedConcurrentConcurrency, 'Function must have reservedConcurrentConcurrency');
77
+ }
78
+ else if (node.reservedConcurrentExecutions > MAX_CONCURRENCY_LIMIT) {
79
+ this.addAnnotation(node, ResourceType.reservedConcurrentConcurrency, 'Function reservedConcurrentConcurrency too high!');
80
+ }
81
+ if (!node.timeout) {
82
+ this.addAnnotation(node, ResourceType.functionTimeout, 'Function must have timeout');
83
+ }
84
+ if (!node.memorySize) {
85
+ this.addAnnotation(node, ResourceType.functionMemorySize, 'Function must have memorySize');
86
+ }
87
+ if (node.runtime !== NODE_RUNTIME) {
88
+ this.addAnnotation(node, ResourceType.functionRuntime, 'wrong runtime ' + node.runtime);
89
+ }
90
+ if (this.configuration?.shortName && node.functionName && node.functionName.indexOf(this.configuration.shortName) !== 0) {
91
+ this.addAnnotation(node, ResourceType.functionName, 'Function name does not begin with ' + this.configuration.shortName);
92
+ }
93
+ }
94
+ }
95
+ checkTags(node) {
96
+ if (node instanceof aws_cdk_lib_1.Stack) {
97
+ if (!node.tags.tagValues()[stack_1.SOLUTION_KEY]) {
98
+ this.addAnnotation(node, ResourceType.tagSolution, 'Solution tag is missing');
99
+ }
100
+ }
101
+ }
102
+ checkBucket(node) {
103
+ if (node instanceof aws_s3_1.CfnBucket) {
104
+ const c = node.publicAccessBlockConfiguration;
105
+ if (c) {
106
+ if (!c.blockPublicAcls || !c.blockPublicPolicy || !c.ignorePublicAcls || !c.restrictPublicBuckets) {
107
+ this.addAnnotation(node, ResourceType.bucketPublicity, 'Check bucket publicity');
108
+ }
109
+ }
110
+ }
111
+ }
112
+ static isValidPath(path) {
113
+ // if path includes . or { check only the trailing part of path
114
+ if (path.includes('.')) {
115
+ return this.isValidPath(path.split('.')[0]);
116
+ }
117
+ if (path.includes('{')) {
118
+ return this.isValidPath(path.split('{')[0]);
119
+ }
120
+ return (0, change_case_1.paramCase)(path) === path;
121
+ }
122
+ static isValidQueryString(name) {
123
+ return (0, change_case_1.snakeCase)(name) === name;
124
+ }
125
+ checkResourceCasing(node) {
126
+ if (node instanceof aws_apigateway_1.CfnResource) {
127
+ if (!StackCheckingAspect.isValidPath(node.pathPart)) {
128
+ this.addAnnotation(node, ResourceType.resourcePath, 'Path part should be in kebab-case');
129
+ }
130
+ }
131
+ else if (node instanceof aws_apigateway_1.CfnMethod) {
132
+ const integration = node.integration;
133
+ if (integration && integration.requestParameters) {
134
+ Object.keys(integration.requestParameters).forEach(key => {
135
+ const split = key.split('.');
136
+ const type = split[2];
137
+ const name = split[3];
138
+ if (type === 'querystring' && !StackCheckingAspect.isValidQueryString(name)) {
139
+ this.addAnnotation(node, name, 'Querystring should be in snake_case');
140
+ }
141
+ });
142
+ }
143
+ }
144
+ }
145
+ checkQueueEncryption(node) {
146
+ if (node instanceof aws_sqs_1.CfnQueue) {
147
+ if (!node.kmsMasterKeyId) {
148
+ this.addAnnotation(node, ResourceType.queueEncryption, 'Queue must have encryption enabled');
149
+ }
150
+ }
151
+ }
152
+ checkLogGroupRetention(node) {
153
+ if (node instanceof aws_logs_1.LogRetention) {
154
+ const child = node.node.defaultChild;
155
+ const retention = child._cfnProperties.RetentionInDays;
156
+ if (!retention) {
157
+ this.addAnnotation(node, ResourceType.logGroupRetention, 'Log group must define log group retention');
158
+ }
159
+ }
160
+ }
161
+ }
162
+ exports.StackCheckingAspect = StackCheckingAspect;
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stY2hlY2tpbmctYXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zdGFjay9zdGFjay1jaGVja2luZy1hc3BlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQXdEO0FBQ3hELHVEQUE0RDtBQUM1RCwrQ0FBNkM7QUFDN0MsbUNBQTJFO0FBRTNFLCtEQUFrRTtBQUNsRSw2Q0FBaUQ7QUFDakQsaURBQTZDO0FBQzdDLG1EQUFrRDtBQUdsRCxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUNsQyxNQUFNLFlBQVksR0FBRyxvQkFBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFFOUMsSUFBSyxZQVlKO0FBWkQsV0FBSyxZQUFZO0lBQ2Isd0NBQXdCLENBQUE7SUFDeEIsaUZBQWlFLENBQUE7SUFDakUsb0RBQW9DLENBQUE7SUFDcEMsMkRBQTJDLENBQUE7SUFDM0Msb0RBQW9DLENBQUE7SUFDcEMsOENBQThCLENBQUE7SUFDOUIsNENBQTRCLENBQUE7SUFDNUIsb0RBQW9DLENBQUE7SUFDcEMsOENBQThCLENBQUE7SUFDOUIsb0RBQW9DLENBQUE7SUFDcEMseURBQXlDLENBQUE7QUFDN0MsQ0FBQyxFQVpJLFlBQVksS0FBWixZQUFZLFFBWWhCO0FBRUQsTUFBYSxtQkFBbUI7SUFHNUIsWUFBWSxhQUFrQztRQUMxQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUF1QjtRQUNqQyxPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTSxLQUFLLENBQUMsSUFBZ0I7UUFDekIsMERBQTBEO1FBRTFELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxHQUFXO1FBQzdCLE9BQU8sSUFBSSxFQUFFLGFBQWEsRUFBRSxvQkFBb0IsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDeEQsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFnQixFQUFFLEdBQTBCLEVBQUUsT0FBZSxFQUFFLE9BQU8sR0FBRyxJQUFJO1FBQy9GLE1BQU0sV0FBVyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN0RCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsV0FBVyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRXRELGtDQUFrQztRQUNsQyxvQ0FBb0M7UUFDcEMsSUFBSSxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDM0IseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDcEQ7YUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxhQUFhLENBQUMsRUFBRTtZQUNuRSx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUN0RDtJQUNMLENBQUM7SUFFTyxVQUFVLENBQUMsSUFBZ0I7UUFDL0IsSUFBSSxJQUFJLFlBQVksd0JBQWdCLEVBQUU7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUU7Z0JBQ3ZHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsa0NBQWtDLENBQUMsQ0FBQzthQUN4RjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUU7Z0JBQ3hHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLEVBQUUsNENBQTRDLENBQUMsQ0FBQzthQUNsRztTQUNKO0lBQ0wsQ0FBQztJQUVPLGFBQWEsQ0FBQyxJQUFnQjtRQUNsQyxJQUFJLElBQUksWUFBWSx3QkFBVyxFQUFFO1lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyw2QkFBNkIsRUFBRSxrREFBa0QsQ0FBQyxDQUFDO2FBQzVIO2lCQUFNLElBQUksSUFBSSxDQUFDLDRCQUE0QixHQUFHLHFCQUFxQixFQUFFO2dCQUNsRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsNkJBQTZCLEVBQUUsa0RBQWtELENBQUMsQ0FBQzthQUM1SDtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNmLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxlQUFlLEVBQUUsNEJBQTRCLENBQUMsQ0FBQzthQUN4RjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNsQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsa0JBQWtCLEVBQUUsK0JBQStCLENBQUMsQ0FBQzthQUM5RjtZQUVELElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxZQUFZLEVBQUU7Z0JBQy9CLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxlQUFlLEVBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQzFGO1lBRUQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNySCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsWUFBWSxFQUFFLG9DQUFvQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDNUg7U0FDSjtJQUNMLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBZ0I7UUFDOUIsSUFBSSxJQUFJLFlBQVksbUJBQUssRUFBRTtZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxvQkFBWSxDQUFDLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUseUJBQXlCLENBQUMsQ0FBQzthQUNqRjtTQUNKO0lBQ0wsQ0FBQztJQUVPLFdBQVcsQ0FBQyxJQUFnQjtRQUNoQyxJQUFJLElBQUksWUFBWSxrQkFBUyxFQUFFO1lBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyw4QkFBa0YsQ0FBQztZQUVsRyxJQUFJLENBQUMsRUFBRTtnQkFDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsRUFBRTtvQkFDL0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLGVBQWUsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO2lCQUNwRjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFZO1FBQ25DLCtEQUErRDtRQUMvRCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMvQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNwQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9DO1FBRUQsT0FBTyxJQUFBLHVCQUFTLEVBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDO0lBQ3BDLENBQUM7SUFFTyxNQUFNLENBQUMsa0JBQWtCLENBQUMsSUFBWTtRQUMxQyxPQUFPLElBQUEsdUJBQVMsRUFBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVPLG1CQUFtQixDQUFDLElBQWdCO1FBQ3hDLElBQUksSUFBSSxZQUFZLDRCQUFXLEVBQUU7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxZQUFZLEVBQUUsbUNBQW1DLENBQUMsQ0FBQzthQUM1RjtTQUNKO2FBQU0sSUFBSSxJQUFJLFlBQVksMEJBQVMsRUFBRTtZQUNsQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBa0MsQ0FBQztZQUU1RCxJQUFJLFdBQVcsSUFBSSxXQUFXLENBQUMsaUJBQWlCLEVBQUU7Z0JBQzlDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUNyRCxNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUM3QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFFdEIsSUFBSSxJQUFJLEtBQUssYUFBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUU7d0JBQ3pFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxxQ0FBcUMsQ0FBQyxDQUFDO3FCQUN6RTtnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNOO1NBQ0o7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQUMsSUFBZ0I7UUFDekMsSUFBSSxJQUFJLFlBQVksa0JBQVEsRUFBRTtZQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLGVBQWUsRUFBRSxvQ0FBb0MsQ0FBQyxDQUFDO2FBQ2hHO1NBQ0o7SUFDTCxDQUFDO0lBRU8sc0JBQXNCLENBQUMsSUFBZ0I7UUFDM0MsSUFBSSxJQUFJLFlBQVksdUJBQVksRUFBRTtZQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQWlFLENBQUM7WUFDMUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUM7WUFFdkQsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDWixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsaUJBQWlCLEVBQUUsMkNBQTJDLENBQUMsQ0FBQzthQUN6RztTQUNKO0lBQ0wsQ0FBQztDQUNKO0FBOUpELGtEQThKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QW5ub3RhdGlvbnMsIElBc3BlY3QsIFN0YWNrfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7Q2ZuRnVuY3Rpb24sIFJ1bnRpbWV9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHtDZm5CdWNrZXR9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7RGlnaXRyYWZmaWNTdGFjaywgU09MVVRJT05fS0VZLCBTdGFja0NvbmZpZ3VyYXRpb259IGZyb20gXCIuL3N0YWNrXCI7XG5pbXBvcnQge0lDb25zdHJ1Y3R9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge0Nmbk1ldGhvZCwgQ2ZuUmVzb3VyY2V9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheVwiO1xuaW1wb3J0IHtwYXJhbUNhc2UsIHNuYWtlQ2FzZX0gZnJvbSBcImNoYW5nZS1jYXNlXCI7XG5pbXBvcnQge0NmblF1ZXVlfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHtMb2dSZXRlbnRpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IEludGVncmF0aW9uUHJvcGVydHkgPSBDZm5NZXRob2QuSW50ZWdyYXRpb25Qcm9wZXJ0eTtcblxuY29uc3QgTUFYX0NPTkNVUlJFTkNZX0xJTUlUID0gMTAwO1xuY29uc3QgTk9ERV9SVU5USU1FID0gUnVudGltZS5OT0RFSlNfMTRfWC5uYW1lO1xuXG5lbnVtIFJlc291cmNlVHlwZSB7XG4gICAgc3RhY2tOYW1lID0gXCJTVEFDS19OQU1FXCIsXG4gICAgcmVzZXJ2ZWRDb25jdXJyZW50Q29uY3VycmVuY3kgPSBcIlJFU0VSVkVEX0NPTkNVUlJFTlRfQ09OQ1VSUkVOQ1lcIixcbiAgICBmdW5jdGlvblRpbWVvdXQgPSBcIkZVTkNUSU9OX1RJTUVPVVRcIixcbiAgICBmdW5jdGlvbk1lbW9yeVNpemUgPSBcIkZVTkNUSU9OX01FTU9SWV9TSVpFXCIsXG4gICAgZnVuY3Rpb25SdW50aW1lID0gXCJGVU5DVElPTl9SVU5USU1FXCIsXG4gICAgZnVuY3Rpb25OYW1lID0gXCJGVU5DVElPTl9OQU1FXCIsXG4gICAgdGFnU29sdXRpb24gPSBcIlRBR19TT0xVVElPTlwiLFxuICAgIGJ1Y2tldFB1YmxpY2l0eSA9IFwiQlVDS0VUX1BVQkxJQ0lUWVwiLFxuICAgIHJlc291cmNlUGF0aCA9IFwiUkVTT1VSQ0VfUEFUSFwiLFxuICAgIHF1ZXVlRW5jcnlwdGlvbiA9IFwiUVVFVUVfRU5DUllQVElPTlwiLFxuICAgIGxvZ0dyb3VwUmV0ZW50aW9uID0gXCJMT0dfR1JPVVBfUkVURU5USU9OXCIsXG59XG5cbmV4cG9ydCBjbGFzcyBTdGFja0NoZWNraW5nQXNwZWN0IGltcGxlbWVudHMgSUFzcGVjdCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWd1cmF0aW9uPzogU3RhY2tDb25maWd1cmF0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlndXJhdGlvbj86IFN0YWNrQ29uZmlndXJhdGlvbikge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUoc3RhY2s6IERpZ2l0cmFmZmljU3RhY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFja0NoZWNraW5nQXNwZWN0KHN0YWNrLmNvbmZpZ3VyYXRpb24pO1xuICAgIH1cblxuICAgIHB1YmxpYyB2aXNpdChub2RlOiBJQ29uc3RydWN0KTogdm9pZCB7XG4gICAgICAgIC8vY29uc29sZS5pbmZvKFwidmlzaXRpbmcgY2xhc3MgXCIgKyBub2RlLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG4gICAgICAgIHRoaXMuY2hlY2tTdGFjayhub2RlKTtcbiAgICAgICAgdGhpcy5jaGVja0Z1bmN0aW9uKG5vZGUpO1xuICAgICAgICB0aGlzLmNoZWNrVGFncyhub2RlKTtcbiAgICAgICAgdGhpcy5jaGVja0J1Y2tldChub2RlKTtcbiAgICAgICAgdGhpcy5jaGVja1Jlc291cmNlQ2FzaW5nKG5vZGUpO1xuICAgICAgICB0aGlzLmNoZWNrUXVldWVFbmNyeXB0aW9uKG5vZGUpO1xuICAgICAgICB0aGlzLmNoZWNrTG9nR3JvdXBSZXRlbnRpb24obm9kZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1doaXRlbGlzdGVkKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzPy5jb25maWd1cmF0aW9uPy53aGl0ZWxpc3RlZFJlc291cmNlcz8uc29tZSh3bCA9PiB7XG4gICAgICAgICAgICByZXR1cm4ga2V5Lm1hdGNoQWxsKG5ldyBSZWdFeHAod2wsICdnJykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEFubm90YXRpb24obm9kZTogSUNvbnN0cnVjdCwga2V5OiBSZXNvdXJjZVR5cGUgfCBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgaXNFcnJvciA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VLZXkgPSBgJHtub2RlLm5vZGUucGF0aH0vJHtrZXl9YDtcbiAgICAgICAgY29uc3QgaXNXaGl0ZUxpc3RlZCA9IHRoaXMuaXNXaGl0ZWxpc3RlZChyZXNvdXJjZUtleSk7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25NZXNzYWdlID0gYCR7cmVzb3VyY2VLZXl9OiR7bWVzc2FnZX1gO1xuXG4gICAgICAgIC8vIGVycm9yICYmIHdoaXRlbGlzdGVkIC0+IHdhcm5pbmdcbiAgICAgICAgLy8gd2FybmluZyAmJiB3aGl0ZWxpc3RlZCAtPiBub3RoaW5nXG4gICAgICAgIGlmIChpc0Vycm9yICYmICFpc1doaXRlTGlzdGVkKSB7XG4gICAgICAgICAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRFcnJvcihhbm5vdGF0aW9uTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKCFpc0Vycm9yICYmICFpc1doaXRlTGlzdGVkKSB8fCAoaXNFcnJvciAmJiBpc1doaXRlTGlzdGVkKSkge1xuICAgICAgICAgICAgQW5ub3RhdGlvbnMub2Yobm9kZSkuYWRkV2FybmluZyhhbm5vdGF0aW9uTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrU3RhY2sobm9kZTogSUNvbnN0cnVjdCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIERpZ2l0cmFmZmljU3RhY2spIHtcbiAgICAgICAgICAgIGlmICgobm9kZS5zdGFja05hbWUuaW5jbHVkZXMoJ1Rlc3QnKSB8fCBub2RlLnN0YWNrTmFtZS5pbmNsdWRlcygnVHN0JykpICYmIG5vZGUuY29uZmlndXJhdGlvbj8ucHJvZHVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihub2RlLCBSZXNvdXJjZVR5cGUuc3RhY2tOYW1lLCAnUHJvZHVjdGlvbiBpcyBzZXQgZm9yIFRlc3Qtc3RhY2snKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKChub2RlLnN0YWNrTmFtZS5pbmNsdWRlcygnUHJvZCcpIHx8IG5vZGUuc3RhY2tOYW1lLmluY2x1ZGVzKCdQcmQnKSkgJiYgIW5vZGUuY29uZmlndXJhdGlvbj8ucHJvZHVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihub2RlLCBSZXNvdXJjZVR5cGUuc3RhY2tOYW1lLCAnUHJvZHVjdGlvbiBpcyBub3Qgc2V0IGZvciBQcm9kdWN0aW9uLXN0YWNrJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrRnVuY3Rpb24obm9kZTogSUNvbnN0cnVjdCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIENmbkZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBpZiAoIW5vZGUucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihub2RlLCBSZXNvdXJjZVR5cGUucmVzZXJ2ZWRDb25jdXJyZW50Q29uY3VycmVuY3ksICdGdW5jdGlvbiBtdXN0IGhhdmUgcmVzZXJ2ZWRDb25jdXJyZW50Q29uY3VycmVuY3knKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zID4gTUFYX0NPTkNVUlJFTkNZX0xJTUlUKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKG5vZGUsIFJlc291cmNlVHlwZS5yZXNlcnZlZENvbmN1cnJlbnRDb25jdXJyZW5jeSwgJ0Z1bmN0aW9uIHJlc2VydmVkQ29uY3VycmVudENvbmN1cnJlbmN5IHRvbyBoaWdoIScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIW5vZGUudGltZW91dCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihub2RlLCBSZXNvdXJjZVR5cGUuZnVuY3Rpb25UaW1lb3V0LCAnRnVuY3Rpb24gbXVzdCBoYXZlIHRpbWVvdXQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFub2RlLm1lbW9yeVNpemUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFubm90YXRpb24obm9kZSwgUmVzb3VyY2VUeXBlLmZ1bmN0aW9uTWVtb3J5U2l6ZSwgJ0Z1bmN0aW9uIG11c3QgaGF2ZSBtZW1vcnlTaXplJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlLnJ1bnRpbWUgIT09IE5PREVfUlVOVElNRSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihub2RlLCBSZXNvdXJjZVR5cGUuZnVuY3Rpb25SdW50aW1lLCd3cm9uZyBydW50aW1lICcgKyBub2RlLnJ1bnRpbWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9uPy5zaG9ydE5hbWUgJiYgbm9kZS5mdW5jdGlvbk5hbWUgJiYgbm9kZS5mdW5jdGlvbk5hbWUuaW5kZXhPZih0aGlzLmNvbmZpZ3VyYXRpb24uc2hvcnROYW1lKSAhPT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihub2RlLCBSZXNvdXJjZVR5cGUuZnVuY3Rpb25OYW1lLCAnRnVuY3Rpb24gbmFtZSBkb2VzIG5vdCBiZWdpbiB3aXRoICcgKyB0aGlzLmNvbmZpZ3VyYXRpb24uc2hvcnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tUYWdzKG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdGFjaykge1xuICAgICAgICAgICAgaWYgKCFub2RlLnRhZ3MudGFnVmFsdWVzKClbU09MVVRJT05fS0VZXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihub2RlLCBSZXNvdXJjZVR5cGUudGFnU29sdXRpb24sICdTb2x1dGlvbiB0YWcgaXMgbWlzc2luZycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0J1Y2tldChub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2ZuQnVja2V0KSB7XG4gICAgICAgICAgICBjb25zdCBjID0gbm9kZS5wdWJsaWNBY2Nlc3NCbG9ja0NvbmZpZ3VyYXRpb24gYXMgQ2ZuQnVja2V0LlB1YmxpY0FjY2Vzc0Jsb2NrQ29uZmlndXJhdGlvblByb3BlcnR5O1xuXG4gICAgICAgICAgICBpZiAoYykge1xuICAgICAgICAgICAgICAgIGlmICghYy5ibG9ja1B1YmxpY0FjbHMgfHwgIWMuYmxvY2tQdWJsaWNQb2xpY3kgfHwgIWMuaWdub3JlUHVibGljQWNscyB8fCAhYy5yZXN0cmljdFB1YmxpY0J1Y2tldHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKG5vZGUsIFJlc291cmNlVHlwZS5idWNrZXRQdWJsaWNpdHksICdDaGVjayBidWNrZXQgcHVibGljaXR5Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNWYWxpZFBhdGgocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIHBhdGggaW5jbHVkZXMgLiBvciB7IGNoZWNrIG9ubHkgdGhlIHRyYWlsaW5nIHBhcnQgb2YgcGF0aFxuICAgICAgICBpZiAocGF0aC5pbmNsdWRlcygnLicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkUGF0aChwYXRoLnNwbGl0KCcuJylbMF0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJ3snKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZFBhdGgocGF0aC5zcGxpdCgneycpWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJhbUNhc2UocGF0aCkgPT09IHBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNWYWxpZFF1ZXJ5U3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gc25ha2VDYXNlKG5hbWUpID09PSBuYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tSZXNvdXJjZUNhc2luZyhub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICghU3RhY2tDaGVja2luZ0FzcGVjdC5pc1ZhbGlkUGF0aChub2RlLnBhdGhQYXJ0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihub2RlLCBSZXNvdXJjZVR5cGUucmVzb3VyY2VQYXRoLCAnUGF0aCBwYXJ0IHNob3VsZCBiZSBpbiBrZWJhYi1jYXNlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENmbk1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZWdyYXRpb24gPSBub2RlLmludGVncmF0aW9uIGFzIEludGVncmF0aW9uUHJvcGVydHk7XG5cbiAgICAgICAgICAgIGlmIChpbnRlZ3JhdGlvbiAmJiBpbnRlZ3JhdGlvbi5yZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGludGVncmF0aW9uLnJlcXVlc3RQYXJhbWV0ZXJzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwbGl0ID0ga2V5LnNwbGl0KCcuJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBzcGxpdFsyXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHNwbGl0WzNdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAncXVlcnlzdHJpbmcnICYmICFTdGFja0NoZWNraW5nQXNwZWN0LmlzVmFsaWRRdWVyeVN0cmluZyhuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKG5vZGUsIG5hbWUsICdRdWVyeXN0cmluZyBzaG91bGQgYmUgaW4gc25ha2VfY2FzZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrUXVldWVFbmNyeXB0aW9uKG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDZm5RdWV1ZSkge1xuICAgICAgICAgICAgaWYgKCFub2RlLmttc01hc3RlcktleUlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKG5vZGUsIFJlc291cmNlVHlwZS5xdWV1ZUVuY3J5cHRpb24sICdRdWV1ZSBtdXN0IGhhdmUgZW5jcnlwdGlvbiBlbmFibGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrTG9nR3JvdXBSZXRlbnRpb24obm9kZTogSUNvbnN0cnVjdCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIExvZ1JldGVudGlvbikge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLm5vZGUuZGVmYXVsdENoaWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgICAgICAgICBjb25zdCByZXRlbnRpb24gPSBjaGlsZC5fY2ZuUHJvcGVydGllcy5SZXRlbnRpb25JbkRheXM7XG5cbiAgICAgICAgICAgIGlmICghcmV0ZW50aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKG5vZGUsIFJlc291cmNlVHlwZS5sb2dHcm91cFJldGVudGlvbiwgJ0xvZyBncm91cCBtdXN0IGRlZmluZSBsb2cgZ3JvdXAgcmV0ZW50aW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DigitrafficStack = exports.SSM_KEY_ALARM_TOPIC = exports.SSM_KEY_WARNING_TOPIC = exports.SOLUTION_KEY = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
6
+ const aws_sns_1 = require("aws-cdk-lib/aws-sns");
7
+ const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
8
+ const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
9
+ const stack_checking_aspect_1 = require("./stack-checking-aspect");
10
+ const SSM_ROOT = '/digitraffic';
11
+ exports.SOLUTION_KEY = 'Solution';
12
+ const MONITORING_ROOT = '/monitoring';
13
+ exports.SSM_KEY_WARNING_TOPIC = `${SSM_ROOT}${MONITORING_ROOT}/warning-topic`;
14
+ exports.SSM_KEY_ALARM_TOPIC = `${SSM_ROOT}${MONITORING_ROOT}/alarm-topic`;
15
+ class DigitrafficStack extends aws_cdk_lib_1.Stack {
16
+ constructor(scope, id, configuration) {
17
+ super(scope, id, configuration.stackProps);
18
+ this.configuration = configuration;
19
+ if (configuration.secretId) {
20
+ this.secret = aws_secretsmanager_1.Secret.fromSecretNameV2(this, 'Secret', configuration.secretId);
21
+ }
22
+ // VPC reference construction requires vpcId and availability zones
23
+ // private subnets are used in Lambda configuration
24
+ if (configuration.vpcId) {
25
+ this.vpc = aws_ec2_1.Vpc.fromVpcAttributes(this, 'vpc', {
26
+ vpcId: configuration.vpcId,
27
+ privateSubnetIds: configuration.privateSubnetIds,
28
+ availabilityZones: configuration.availabilityZones,
29
+ });
30
+ }
31
+ // security group that allows Lambda database access
32
+ if (configuration.lambdaDbSgId) {
33
+ this.lambdaDbSg = aws_ec2_1.SecurityGroup.fromSecurityGroupId(this, 'LambdaDbSG', configuration.lambdaDbSgId);
34
+ }
35
+ this.alarmTopic = aws_sns_1.Topic.fromTopicArn(this, 'AlarmTopic', aws_ssm_1.StringParameter.fromStringParameterName(this, 'AlarmTopicParam', exports.SSM_KEY_ALARM_TOPIC).stringValue);
36
+ this.warningTopic = aws_sns_1.Topic.fromTopicArn(this, 'WarningTopic', aws_ssm_1.StringParameter.fromStringParameterName(this, 'WarningTopicParam', exports.SSM_KEY_WARNING_TOPIC).stringValue);
37
+ this.addAspects();
38
+ }
39
+ addAspects() {
40
+ aws_cdk_lib_1.Aspects.of(this).add(stack_checking_aspect_1.StackCheckingAspect.create(this));
41
+ }
42
+ createLambdaEnvironment() {
43
+ return this.createDefaultLambdaEnvironment(this.configuration.shortName);
44
+ }
45
+ createDefaultLambdaEnvironment(dbApplication) {
46
+ return this.configuration.secretId ? {
47
+ SECRET_ID: this.configuration.secretId,
48
+ DB_APPLICATION: dbApplication,
49
+ } : {
50
+ DB_APPLICATION: dbApplication,
51
+ };
52
+ }
53
+ grantSecret(...lambdas) {
54
+ lambdas.forEach((l) => this.secret.grantRead(l));
55
+ }
56
+ }
57
+ exports.DigitrafficStack = DigitrafficStack;
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXdzL2luZnJhL3N0YWNrL3N0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF1RDtBQUN2RCxpREFBNkQ7QUFFN0QsaURBQWtEO0FBQ2xELGlEQUFvRDtBQUNwRCx1RUFBK0Q7QUFHL0QsbUVBQTREO0FBSzVELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQztBQUNuQixRQUFBLFlBQVksR0FBRyxVQUFVLENBQUM7QUFDdkMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDO0FBRXpCLFFBQUEscUJBQXFCLEdBQUcsR0FBRyxRQUFRLEdBQUcsZUFBZSxnQkFBZ0IsQ0FBQztBQUN0RSxRQUFBLG1CQUFtQixHQUFHLEdBQUcsUUFBUSxHQUFHLGVBQWUsY0FBYyxDQUFDO0FBc0IvRSxNQUFhLGdCQUFpQixTQUFRLG1CQUFLO0lBU3ZDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsYUFBaUM7UUFDdkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBRW5DLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRTtZQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLDJCQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDakY7UUFFRCxtRUFBbUU7UUFDbkUsbURBQW1EO1FBQ25ELElBQUksYUFBYSxDQUFDLEtBQUssRUFBRTtZQUNyQixJQUFJLENBQUMsR0FBRyxHQUFHLGFBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO2dCQUMxQyxLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7Z0JBQzFCLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxnQkFBZ0I7Z0JBQ2hELGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxpQkFBNkI7YUFDakUsQ0FBQyxDQUFDO1NBQ047UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxhQUFhLENBQUMsWUFBWSxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsdUJBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN2RztRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQ3JDLFlBQVksRUFDWix5QkFBZSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxpQkFBaUIsRUFBRSwyQkFBbUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZHLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUN2RCx5QkFBZSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRSw2QkFBcUIsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTNHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsVUFBVTtRQUNOLHFCQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQywyQ0FBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBbUIsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxhQUFxQjtRQUNoRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRO1lBQ3RDLGNBQWMsRUFBRSxhQUFhO1NBQ2hDLENBQUMsQ0FBQyxDQUFDO1lBQ0EsY0FBYyxFQUFFLGFBQWE7U0FDaEMsQ0FBQztJQUNOLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBRyxPQUFtQjtRQUM5QixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBVyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7Q0FDSjtBQTlERCw0Q0E4REMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzcGVjdHMsIFN0YWNrLCBTdGFja1Byb3BzfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7SVZwYywgU2VjdXJpdHlHcm91cCwgVnBjfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtJU2VjdXJpdHlHcm91cH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzIvbGliL3NlY3VyaXR5LWdyb3VwXCI7XG5pbXBvcnQge0lUb3BpYywgVG9waWN9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc25zXCI7XG5pbXBvcnQge1N0cmluZ1BhcmFtZXRlcn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zc21cIjtcbmltcG9ydCB7SVNlY3JldCwgU2VjcmV0fSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQge0Z1bmN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuXG5pbXBvcnQge1N0YWNrQ2hlY2tpbmdBc3BlY3R9IGZyb20gXCIuL3N0YWNrLWNoZWNraW5nLWFzcGVjdFwiO1xuaW1wb3J0IHtDb25zdHJ1Y3R9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1RyYWZmaWNUeXBlfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXMvdHJhZmZpY3R5cGVcIjtcbmltcG9ydCB7REJMYW1iZGFFbnZpcm9ubWVudH0gZnJvbSBcIi4vbGFtYmRhLWNvbmZpZ3NcIjtcblxuY29uc3QgU1NNX1JPT1QgPSAnL2RpZ2l0cmFmZmljJztcbmV4cG9ydCBjb25zdCBTT0xVVElPTl9LRVkgPSAnU29sdXRpb24nO1xuY29uc3QgTU9OSVRPUklOR19ST09UID0gJy9tb25pdG9yaW5nJztcblxuZXhwb3J0IGNvbnN0IFNTTV9LRVlfV0FSTklOR19UT1BJQyA9IGAke1NTTV9ST09UfSR7TU9OSVRPUklOR19ST09UfS93YXJuaW5nLXRvcGljYDtcbmV4cG9ydCBjb25zdCBTU01fS0VZX0FMQVJNX1RPUElDID0gYCR7U1NNX1JPT1R9JHtNT05JVE9SSU5HX1JPT1R9L2FsYXJtLXRvcGljYDtcblxuZXhwb3J0IHR5cGUgU3RhY2tDb25maWd1cmF0aW9uID0ge1xuICAgIHJlYWRvbmx5IHNob3J0TmFtZT86IHN0cmluZztcbiAgICByZWFkb25seSBzZWNyZXRJZD86IHN0cmluZztcbiAgICByZWFkb25seSBhbGFybVRvcGljQXJuOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgd2FybmluZ1RvcGljQXJuOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZW5hYmxlQ2FuYXJpZXM6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgbG9nc0Rlc3RpbmF0aW9uQXJuPzogc3RyaW5nO1xuXG4gICAgcmVhZG9ubHkgdnBjSWQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgbGFtYmRhRGJTZ0lkPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHByaXZhdGVTdWJuZXRJZHM/OiBzdHJpbmdbXTtcbiAgICByZWFkb25seSBhdmFpbGFiaWxpdHlab25lcz86IHN0cmluZ1tdO1xuXG4gICAgcmVhZG9ubHkgdHJhZmZpY1R5cGU6IFRyYWZmaWNUeXBlO1xuICAgIHJlYWRvbmx5IHByb2R1Y3Rpb246IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgc3RhY2tQcm9wczogU3RhY2tQcm9wcztcblxuICAgIHJlYWRvbmx5IHdoaXRlbGlzdGVkUmVzb3VyY2VzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBEaWdpdHJhZmZpY1N0YWNrIGV4dGVuZHMgU3RhY2sge1xuICAgIHJlYWRvbmx5IHZwYzogSVZwYztcbiAgICByZWFkb25seSBsYW1iZGFEYlNnOiBJU2VjdXJpdHlHcm91cDtcbiAgICByZWFkb25seSBhbGFybVRvcGljOiBJVG9waWM7XG4gICAgcmVhZG9ubHkgd2FybmluZ1RvcGljOiBJVG9waWM7XG4gICAgcmVhZG9ubHkgc2VjcmV0OiBJU2VjcmV0O1xuXG4gICAgcmVhZG9ubHkgY29uZmlndXJhdGlvbjogU3RhY2tDb25maWd1cmF0aW9uO1xuXG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29uZmlndXJhdGlvbjogU3RhY2tDb25maWd1cmF0aW9uKSB7XG4gICAgICAgIHN1cGVyKHNjb3BlLCBpZCwgY29uZmlndXJhdGlvbi5zdGFja1Byb3BzKTtcblxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uO1xuXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uLnNlY3JldElkKSB7XG4gICAgICAgICAgICB0aGlzLnNlY3JldCA9IFNlY3JldC5mcm9tU2VjcmV0TmFtZVYyKHRoaXMsICdTZWNyZXQnLCBjb25maWd1cmF0aW9uLnNlY3JldElkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZQQyByZWZlcmVuY2UgY29uc3RydWN0aW9uIHJlcXVpcmVzIHZwY0lkIGFuZCBhdmFpbGFiaWxpdHkgem9uZXNcbiAgICAgICAgLy8gcHJpdmF0ZSBzdWJuZXRzIGFyZSB1c2VkIGluIExhbWJkYSBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uLnZwY0lkKSB7XG4gICAgICAgICAgICB0aGlzLnZwYyA9IFZwYy5mcm9tVnBjQXR0cmlidXRlcyh0aGlzLCAndnBjJywge1xuICAgICAgICAgICAgICAgIHZwY0lkOiBjb25maWd1cmF0aW9uLnZwY0lkLFxuICAgICAgICAgICAgICAgIHByaXZhdGVTdWJuZXRJZHM6IGNvbmZpZ3VyYXRpb24ucHJpdmF0ZVN1Ym5ldElkcyxcbiAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlab25lczogY29uZmlndXJhdGlvbi5hdmFpbGFiaWxpdHlab25lcyBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VjdXJpdHkgZ3JvdXAgdGhhdCBhbGxvd3MgTGFtYmRhIGRhdGFiYXNlIGFjY2Vzc1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5sYW1iZGFEYlNnSWQpIHtcbiAgICAgICAgICAgIHRoaXMubGFtYmRhRGJTZyA9IFNlY3VyaXR5R3JvdXAuZnJvbVNlY3VyaXR5R3JvdXBJZCh0aGlzLCAnTGFtYmRhRGJTRycsIGNvbmZpZ3VyYXRpb24ubGFtYmRhRGJTZ0lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWxhcm1Ub3BpYyA9IFRvcGljLmZyb21Ub3BpY0Fybih0aGlzLFxuICAgICAgICAgICAgJ0FsYXJtVG9waWMnLFxuICAgICAgICAgICAgU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKHRoaXMsICdBbGFybVRvcGljUGFyYW0nLCBTU01fS0VZX0FMQVJNX1RPUElDKS5zdHJpbmdWYWx1ZSk7XG4gICAgICAgIHRoaXMud2FybmluZ1RvcGljID0gVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdXYXJuaW5nVG9waWMnLFxuICAgICAgICAgICAgU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKHRoaXMsICdXYXJuaW5nVG9waWNQYXJhbScsIFNTTV9LRVlfV0FSTklOR19UT1BJQykuc3RyaW5nVmFsdWUpO1xuXG4gICAgICAgIHRoaXMuYWRkQXNwZWN0cygpO1xuICAgIH1cblxuICAgIGFkZEFzcGVjdHMoKSB7XG4gICAgICAgIEFzcGVjdHMub2YodGhpcykuYWRkKFN0YWNrQ2hlY2tpbmdBc3BlY3QuY3JlYXRlKHRoaXMpKTtcbiAgICB9XG5cbiAgICBjcmVhdGVMYW1iZGFFbnZpcm9ubWVudCgpOiBEQkxhbWJkYUVudmlyb25tZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRGVmYXVsdExhbWJkYUVudmlyb25tZW50KHRoaXMuY29uZmlndXJhdGlvbi5zaG9ydE5hbWUgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBjcmVhdGVEZWZhdWx0TGFtYmRhRW52aXJvbm1lbnQoZGJBcHBsaWNhdGlvbjogc3RyaW5nKTogREJMYW1iZGFFbnZpcm9ubWVudCB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uc2VjcmV0SWQgPyB7XG4gICAgICAgICAgICBTRUNSRVRfSUQ6IHRoaXMuY29uZmlndXJhdGlvbi5zZWNyZXRJZCxcbiAgICAgICAgICAgIERCX0FQUExJQ0FUSU9OOiBkYkFwcGxpY2F0aW9uLFxuICAgICAgICB9IDoge1xuICAgICAgICAgICAgREJfQVBQTElDQVRJT046IGRiQXBwbGljYXRpb24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ3JhbnRTZWNyZXQoLi4ubGFtYmRhczogRnVuY3Rpb25bXSkge1xuICAgICAgICBsYW1iZGFzLmZvckVhY2goKGw6IEZ1bmN0aW9uKSA9PiB0aGlzLnNlY3JldC5ncmFudFJlYWQobCkpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DigitrafficLogSubscriptions = exports.createSubscription = void 0;
4
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
5
+ /**
6
+ * Creates a subscription filter that subscribes to a Lambda Log Group and delivers the logs to another destination.
7
+ * https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html
8
+ * @param lambda The Lambda function, needed to create a dependency
9
+ * @param lambdaName The Lambda name from which the Log Group name is derived
10
+ * @param logDestinationArn Destination for streamed logs
11
+ * @param stack CloudFormation stack
12
+ */
13
+ function createSubscription(lambda, lambdaName, logDestinationArn, stack) {
14
+ if (logDestinationArn == undefined) {
15
+ return undefined;
16
+ }
17
+ const filter = new aws_logs_1.CfnSubscriptionFilter(stack, `${lambdaName}LogsSubscription`, {
18
+ logGroupName: `/aws/lambda/${lambdaName}`,
19
+ filterPattern: '',
20
+ destinationArn: logDestinationArn,
21
+ });
22
+ filter.node.addDependency(lambda);
23
+ return filter;
24
+ }
25
+ exports.createSubscription = createSubscription;
26
+ class DigitrafficLogSubscriptions {
27
+ constructor(stack, ...lambdas) {
28
+ if (stack.configuration.logsDestinationArn) {
29
+ lambdas.forEach(lambda => {
30
+ const filter = new aws_logs_1.CfnSubscriptionFilter(stack, `${lambda.givenName}LogsSubscription`, {
31
+ logGroupName: `/aws/lambda/${lambda.givenName}`,
32
+ filterPattern: '',
33
+ destinationArn: stack.configuration.logsDestinationArn,
34
+ });
35
+ filter.node.addDependency(lambda);
36
+ });
37
+ }
38
+ }
39
+ }
40
+ exports.DigitrafficLogSubscriptions = DigitrafficLogSubscriptions;
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zdGFjay9zdWJzY3JpcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQTJEO0FBTTNEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxNQUFnQixFQUFFLFVBQWtCLEVBQUUsaUJBQXFDLEVBQUUsS0FBZ0I7SUFDNUgsSUFBSSxpQkFBaUIsSUFBSSxTQUFTLEVBQUU7UUFDaEMsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGdDQUFxQixDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUsa0JBQWtCLEVBQUU7UUFDN0UsWUFBWSxFQUFFLGVBQWUsVUFBVSxFQUFFO1FBQ3pDLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLGNBQWMsRUFBRSxpQkFBaUI7S0FDcEMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbEMsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQWJELGdEQWFDO0FBRUQsTUFBYSwyQkFBMkI7SUFDcEMsWUFBWSxLQUF1QixFQUFFLEdBQUcsT0FBNEI7UUFDaEUsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFO1lBQ3hDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksZ0NBQXFCLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsa0JBQWtCLEVBQUU7b0JBQ25GLFlBQVksRUFBRSxlQUFlLE1BQU0sQ0FBQyxTQUFTLEVBQUU7b0JBQy9DLGFBQWEsRUFBRSxFQUFFO29CQUNqQixjQUFjLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxrQkFBNEI7aUJBQ25FLENBQUMsQ0FBQztnQkFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztDQUNKO0FBZEQsa0VBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NmblN1YnNjcmlwdGlvbkZpbHRlcn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHtGdW5jdGlvbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQge0RpZ2l0cmFmZmljU3RhY2t9IGZyb20gXCIuL3N0YWNrXCI7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7TW9uaXRvcmVkRnVuY3Rpb259IGZyb20gXCIuL21vbml0b3JlZGZ1bmN0aW9uXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN1YnNjcmlwdGlvbiBmaWx0ZXIgdGhhdCBzdWJzY3JpYmVzIHRvIGEgTGFtYmRhIExvZyBHcm91cCBhbmQgZGVsaXZlcnMgdGhlIGxvZ3MgdG8gYW5vdGhlciBkZXN0aW5hdGlvbi5cbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1sb2dzLXN1YnNjcmlwdGlvbmZpbHRlci5odG1sXG4gKiBAcGFyYW0gbGFtYmRhIFRoZSBMYW1iZGEgZnVuY3Rpb24sIG5lZWRlZCB0byBjcmVhdGUgYSBkZXBlbmRlbmN5XG4gKiBAcGFyYW0gbGFtYmRhTmFtZSBUaGUgTGFtYmRhIG5hbWUgZnJvbSB3aGljaCB0aGUgTG9nIEdyb3VwIG5hbWUgaXMgZGVyaXZlZFxuICogQHBhcmFtIGxvZ0Rlc3RpbmF0aW9uQXJuIERlc3RpbmF0aW9uIGZvciBzdHJlYW1lZCBsb2dzXG4gKiBAcGFyYW0gc3RhY2sgQ2xvdWRGb3JtYXRpb24gc3RhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmlwdGlvbihsYW1iZGE6IEZ1bmN0aW9uLCBsYW1iZGFOYW1lOiBzdHJpbmcsIGxvZ0Rlc3RpbmF0aW9uQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YWNrOiBDb25zdHJ1Y3QpOiBDZm5TdWJzY3JpcHRpb25GaWx0ZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChsb2dEZXN0aW5hdGlvbkFybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gbmV3IENmblN1YnNjcmlwdGlvbkZpbHRlcihzdGFjaywgYCR7bGFtYmRhTmFtZX1Mb2dzU3Vic2NyaXB0aW9uYCwge1xuICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2xhbWJkYU5hbWV9YCxcbiAgICAgICAgZmlsdGVyUGF0dGVybjogJycsXG4gICAgICAgIGRlc3RpbmF0aW9uQXJuOiBsb2dEZXN0aW5hdGlvbkFybixcbiAgICB9KTtcblxuICAgIGZpbHRlci5ub2RlLmFkZERlcGVuZGVuY3kobGFtYmRhKTtcblxuICAgIHJldHVybiBmaWx0ZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBEaWdpdHJhZmZpY0xvZ1N1YnNjcmlwdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCAuLi5sYW1iZGFzOiBNb25pdG9yZWRGdW5jdGlvbltdKSB7XG4gICAgICAgIGlmIChzdGFjay5jb25maWd1cmF0aW9uLmxvZ3NEZXN0aW5hdGlvbkFybikge1xuICAgICAgICAgICAgbGFtYmRhcy5mb3JFYWNoKGxhbWJkYSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IENmblN1YnNjcmlwdGlvbkZpbHRlcihzdGFjaywgYCR7bGFtYmRhLmdpdmVuTmFtZX1Mb2dzU3Vic2NyaXB0aW9uYCwge1xuICAgICAgICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2xhbWJkYS5naXZlbk5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGF0dGVybjogJycsXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQXJuOiBzdGFjay5jb25maWd1cmF0aW9uLmxvZ3NEZXN0aW5hdGlvbkFybiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBmaWx0ZXIubm9kZS5hZGREZXBlbmRlbmN5KGxhbWJkYSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDefaultUsagePlan = exports.createUsagePlan = void 0;
4
+ /**
5
+ * Creates an usage plan for a REST API with a single API key
6
+ * @param api The REST API
7
+ * @param apiKeyId Id for the API key, this is a surrogate id for CDK, not displayed anywhere
8
+ * @param apiKeyName Name for the API key, this is displayed in the AWS Console
9
+ * @deprecated Creates randomized API key names, use createDefaultUsagePlan instead
10
+ */
11
+ function createUsagePlan(api, apiKeyId, apiKeyName) {
12
+ const apiKey = api.addApiKey(apiKeyId);
13
+ const plan = api.addUsagePlan(apiKeyName, {
14
+ name: apiKeyName,
15
+ });
16
+ plan.addApiStage({
17
+ stage: api.deploymentStage,
18
+ });
19
+ plan.addApiKey(apiKey);
20
+ return apiKey;
21
+ }
22
+ exports.createUsagePlan = createUsagePlan;
23
+ /**
24
+ * Creates a default usage plan for a REST API with a single API key
25
+ * @param api The REST API
26
+ * @param apiName Name of the api. Will generate key: apiName + ' API Key' and plan: apiName + ' API Usage Plan'
27
+ */
28
+ function createDefaultUsagePlan(api, apiName) {
29
+ const apiKeyName = apiName + ' API Key';
30
+ const usagePlanName = apiName + ' API Usage Plan';
31
+ const apiKey = api.addApiKey(apiKeyName, { apiKeyName: apiKeyName });
32
+ const plan = api.addUsagePlan(usagePlanName, {
33
+ name: usagePlanName,
34
+ });
35
+ plan.addApiStage({
36
+ stage: api.deploymentStage,
37
+ });
38
+ plan.addApiKey(apiKey);
39
+ return apiKey;
40
+ }
41
+ exports.createDefaultUsagePlan = createDefaultUsagePlan;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2UtcGxhbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2luZnJhL3VzYWdlLXBsYW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOzs7Ozs7R0FNRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxHQUFZLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQjtJQUM5RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFO1FBQ3RDLElBQUksRUFBRSxVQUFVO0tBQ25CLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxXQUFXLENBQUM7UUFDYixLQUFLLEVBQUUsR0FBRyxDQUFDLGVBQWU7S0FDN0IsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV2QixPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBWEQsMENBV0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsR0FBWSxFQUFFLE9BQWU7SUFDaEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUN4QyxNQUFNLGFBQWEsR0FBRyxPQUFPLEdBQUcsaUJBQWlCLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRTtRQUN6QyxJQUFJLEVBQUUsYUFBYTtLQUN0QixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxlQUFlO0tBQzdCLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdkIsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQWJELHdEQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJQXBpS2V5LCBSZXN0QXBpfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBhbiB1c2FnZSBwbGFuIGZvciBhIFJFU1QgQVBJIHdpdGggYSBzaW5nbGUgQVBJIGtleVxyXG4gKiBAcGFyYW0gYXBpIFRoZSBSRVNUIEFQSVxyXG4gKiBAcGFyYW0gYXBpS2V5SWQgSWQgZm9yIHRoZSBBUEkga2V5LCB0aGlzIGlzIGEgc3Vycm9nYXRlIGlkIGZvciBDREssIG5vdCBkaXNwbGF5ZWQgYW55d2hlcmVcclxuICogQHBhcmFtIGFwaUtleU5hbWUgTmFtZSBmb3IgdGhlIEFQSSBrZXksIHRoaXMgaXMgZGlzcGxheWVkIGluIHRoZSBBV1MgQ29uc29sZVxyXG4gKiBAZGVwcmVjYXRlZCBDcmVhdGVzIHJhbmRvbWl6ZWQgQVBJIGtleSBuYW1lcywgdXNlIGNyZWF0ZURlZmF1bHRVc2FnZVBsYW4gaW5zdGVhZFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzYWdlUGxhbihhcGk6IFJlc3RBcGksIGFwaUtleUlkOiBzdHJpbmcsIGFwaUtleU5hbWU6IHN0cmluZyk6IElBcGlLZXkge1xyXG4gICAgY29uc3QgYXBpS2V5ID0gYXBpLmFkZEFwaUtleShhcGlLZXlJZCk7XHJcbiAgICBjb25zdCBwbGFuID0gYXBpLmFkZFVzYWdlUGxhbihhcGlLZXlOYW1lLCB7XHJcbiAgICAgICAgbmFtZTogYXBpS2V5TmFtZSxcclxuICAgIH0pO1xyXG4gICAgcGxhbi5hZGRBcGlTdGFnZSh7XHJcbiAgICAgICAgc3RhZ2U6IGFwaS5kZXBsb3ltZW50U3RhZ2UsXHJcbiAgICB9KTtcclxuICAgIHBsYW4uYWRkQXBpS2V5KGFwaUtleSk7XHJcblxyXG4gICAgcmV0dXJuIGFwaUtleTtcclxufVxyXG5cclxuLyoqXHJcbiAqIENyZWF0ZXMgYSBkZWZhdWx0IHVzYWdlIHBsYW4gZm9yIGEgUkVTVCBBUEkgd2l0aCBhIHNpbmdsZSBBUEkga2V5XHJcbiAqIEBwYXJhbSBhcGkgVGhlIFJFU1QgQVBJXHJcbiAqIEBwYXJhbSBhcGlOYW1lIE5hbWUgb2YgdGhlIGFwaS4gV2lsbCBnZW5lcmF0ZSBrZXk6IGFwaU5hbWUgKyAnIEFQSSBLZXknIGFuZCBwbGFuOiBhcGlOYW1lICsgJyBBUEkgVXNhZ2UgUGxhbidcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0VXNhZ2VQbGFuKGFwaTogUmVzdEFwaSwgYXBpTmFtZTogc3RyaW5nKTogSUFwaUtleSB7XHJcbiAgICBjb25zdCBhcGlLZXlOYW1lID0gYXBpTmFtZSArICcgQVBJIEtleSc7XHJcbiAgICBjb25zdCB1c2FnZVBsYW5OYW1lID0gYXBpTmFtZSArICcgQVBJIFVzYWdlIFBsYW4nO1xyXG4gICAgY29uc3QgYXBpS2V5ID0gYXBpLmFkZEFwaUtleShhcGlLZXlOYW1lLCB7IGFwaUtleU5hbWU6IGFwaUtleU5hbWUgfSk7XHJcbiAgICBjb25zdCBwbGFuID0gYXBpLmFkZFVzYWdlUGxhbih1c2FnZVBsYW5OYW1lLCB7XHJcbiAgICAgICAgbmFtZTogdXNhZ2VQbGFuTmFtZSxcclxuICAgIH0pO1xyXG4gICAgcGxhbi5hZGRBcGlTdGFnZSh7XHJcbiAgICAgICAgc3RhZ2U6IGFwaS5kZXBsb3ltZW50U3RhZ2UsXHJcbiAgICB9KTtcclxuICAgIHBsYW4uYWRkQXBpS2V5KGFwaUtleSk7XHJcblxyXG4gICAgcmV0dXJuIGFwaUtleTtcclxufVxyXG4iXX0=
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getApiKeyFromAPIGateway = void 0;
4
+ const aws_sdk_1 = require("aws-sdk");
5
+ function getApiKeyFromAPIGateway(keyId) {
6
+ const agw = new aws_sdk_1.APIGateway();
7
+ return agw.getApiKey({
8
+ apiKey: keyId,
9
+ includeValue: true,
10
+ }).promise();
11
+ }
12
+ exports.getApiKeyFromAPIGateway = getApiKeyFromAPIGateway;
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpa2V5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9ydW50aW1lL2FwaWtleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBbUM7QUFFbkMsU0FBZ0IsdUJBQXVCLENBQUMsS0FBYTtJQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLG9CQUFVLEVBQUUsQ0FBQztJQUM3QixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDakIsTUFBTSxFQUFFLEtBQUs7UUFDYixZQUFZLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDakIsQ0FBQztBQU5ELDBEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBUElHYXRld2F5fSBmcm9tIFwiYXdzLXNka1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpS2V5RnJvbUFQSUdhdGV3YXkoa2V5SWQ6IHN0cmluZyk6IFByb21pc2U8QVBJR2F0ZXdheS5UeXBlcy5BcGlLZXk+IHtcbiAgICBjb25zdCBhZ3cgPSBuZXcgQVBJR2F0ZXdheSgpO1xuICAgIHJldHVybiBhZ3cuZ2V0QXBpS2V5KHtcbiAgICAgICAgYXBpS2V5OiBrZXlJZCxcbiAgICAgICAgaW5jbHVkZVZhbHVlOiB0cnVlLFxuICAgIH0pLnByb21pc2UoKTtcbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DigitrafficIntegrationResponse = void 0;
4
+ const mediatypes_1 = require("../types/mediatypes");
5
+ const response_1 = require("../infra/api/response");
6
+ class DigitrafficIntegrationResponse {
7
+ static ok(mediaType) {
8
+ return this.create("200", mediaType);
9
+ }
10
+ static badRequest(mediaType) {
11
+ return this.create("400", mediaType ?? mediatypes_1.MediaType.TEXT_PLAIN);
12
+ }
13
+ static notImplemented(mediaType) {
14
+ return this.create("501", mediaType ?? mediatypes_1.MediaType.TEXT_PLAIN);
15
+ }
16
+ static create(statusCode, mediaType) {
17
+ return {
18
+ statusCode,
19
+ responseTemplates: {
20
+ [mediaType]: response_1.RESPONSE_DEFAULT_LAMBDA,
21
+ },
22
+ };
23
+ }
24
+ }
25
+ exports.DigitrafficIntegrationResponse = DigitrafficIntegrationResponse;
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlnaXRyYWZmaWMtaW50ZWdyYXRpb24tcmVzcG9uc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL3J1bnRpbWUvZGlnaXRyYWZmaWMtaW50ZWdyYXRpb24tcmVzcG9uc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0Esb0RBQThDO0FBQzlDLG9EQUE4RDtBQUU5RCxNQUFzQiw4QkFBOEI7SUFFaEQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFvQjtRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLFNBQXFCO1FBQ25DLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxJQUFJLHNCQUFTLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVELE1BQU0sQ0FBQyxjQUFjLENBQUMsU0FBcUI7UUFDdkMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLElBQUksc0JBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFrQixFQUFFLFNBQW9CO1FBQ2xELE9BQU87WUFDSCxVQUFVO1lBQ1YsaUJBQWlCLEVBQUU7Z0JBQ2YsQ0FBQyxTQUFTLENBQUMsRUFBRSxrQ0FBdUI7YUFDdkM7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKO0FBdEJELHdFQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW50ZWdyYXRpb25SZXNwb25zZX0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQge01lZGlhVHlwZX0gZnJvbSBcIi4uL3R5cGVzL21lZGlhdHlwZXNcIjtcbmltcG9ydCB7UkVTUE9OU0VfREVGQVVMVF9MQU1CREF9IGZyb20gXCIuLi9pbmZyYS9hcGkvcmVzcG9uc2VcIjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIERpZ2l0cmFmZmljSW50ZWdyYXRpb25SZXNwb25zZSB7XG5cbiAgICBzdGF0aWMgb2sobWVkaWFUeXBlOiBNZWRpYVR5cGUpOiBJbnRlZ3JhdGlvblJlc3BvbnNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKFwiMjAwXCIsIG1lZGlhVHlwZSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGJhZFJlcXVlc3QobWVkaWFUeXBlPzogTWVkaWFUeXBlKTogSW50ZWdyYXRpb25SZXNwb25zZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZShcIjQwMFwiLCBtZWRpYVR5cGUgPz8gTWVkaWFUeXBlLlRFWFRfUExBSU4pO1xuICAgIH1cblxuICAgIHN0YXRpYyBub3RJbXBsZW1lbnRlZChtZWRpYVR5cGU/OiBNZWRpYVR5cGUpOiBJbnRlZ3JhdGlvblJlc3BvbnNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKFwiNTAxXCIsIG1lZGlhVHlwZSA/PyBNZWRpYVR5cGUuVEVYVF9QTEFJTik7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZShzdGF0dXNDb2RlOiBzdHJpbmcsIG1lZGlhVHlwZTogTWVkaWFUeXBlKTogSW50ZWdyYXRpb25SZXNwb25zZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXNDb2RlLFxuICAgICAgICAgICAgcmVzcG9uc2VUZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgICAgICBbbWVkaWFUeXBlXTogUkVTUE9OU0VfREVGQVVMVF9MQU1CREEsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn1cblxuIl19