@rio-cloud/cdk-v2-constructs 4.13.2 → 4.15.0

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 (66) hide show
  1. package/.jsii +7555 -3383
  2. package/CHANGELOG.md +26 -0
  3. package/lib/datadog/datadog-log-index-monitoring.d.ts +2 -2
  4. package/lib/datadog/datadog-log-index-monitoring.js +1 -1
  5. package/lib/datadogv2/datadog-dashboard.d.ts +28 -0
  6. package/lib/datadogv2/datadog-dashboard.js +31 -0
  7. package/lib/datadogv2/datadog-log-index-monitoring.d.ts +61 -0
  8. package/lib/datadogv2/datadog-log-index-monitoring.js +115 -0
  9. package/lib/datadogv2/datadog-monitor.d.ts +234 -0
  10. package/lib/datadogv2/datadog-monitor.js +134 -0
  11. package/lib/datadogv2/datadog-notification.d.ts +100 -0
  12. package/lib/datadogv2/datadog-notification.js +94 -0
  13. package/lib/datadogv2/index.d.ts +4 -0
  14. package/lib/datadogv2/index.js +17 -0
  15. package/lib/fargate/datadog.js +2 -2
  16. package/lib/fargate/index.d.ts +1 -0
  17. package/lib/fargate/index.js +14 -0
  18. package/lib/fargate/rio-fargate-service.d.ts +18 -18
  19. package/lib/fargate/rio-fargate-service.js +1 -1
  20. package/lib/index.d.ts +7 -13
  21. package/lib/index.js +8 -14
  22. package/lib/kafka/kafka-topic.d.ts +5 -5
  23. package/lib/kafka/kafka-topic.js +1 -1
  24. package/lib/kafka/rio-kafka-event-source.d.ts +1 -1
  25. package/lib/kafka/rio-kafka-event-source.js +1 -1
  26. package/lib/pipeline/rio-backup-secrets-restore-stage.d.ts +1 -1
  27. package/lib/pipeline/rio-backup-secrets-restore-stage.js +1 -1
  28. package/lib/pipeline/rio-bitbucket-source-action.d.ts +1 -1
  29. package/lib/pipeline/rio-bitbucket-source-action.js +1 -1
  30. package/lib/rio-landing-zone.d.ts +6 -0
  31. package/lib/rio-landing-zone.js +19 -1
  32. package/lib/watchful/alb.d.ts +2 -2
  33. package/lib/watchful/alb.js +1 -1
  34. package/lib/watchful/aspect.d.ts +6 -6
  35. package/lib/watchful/aspect.js +12 -7
  36. package/lib/watchful/cloudfront.d.ts +2 -2
  37. package/lib/watchful/cloudfront.js +1 -1
  38. package/lib/watchful/docdb.d.ts +4 -4
  39. package/lib/watchful/docdb.js +1 -1
  40. package/lib/watchful/dynamodb.d.ts +5 -5
  41. package/lib/watchful/dynamodb.js +1 -1
  42. package/lib/watchful/ecs.d.ts +2 -2
  43. package/lib/watchful/ecs.js +1 -1
  44. package/lib/watchful/index.d.ts +13 -0
  45. package/lib/watchful/index.js +26 -0
  46. package/lib/watchful/lambda.d.ts +3 -3
  47. package/lib/watchful/lambda.js +1 -1
  48. package/lib/watchful/metric-alarm.d.ts +16 -16
  49. package/lib/watchful/metric-alarm.js +1 -1
  50. package/lib/watchful/rds.d.ts +2 -2
  51. package/lib/watchful/rds.js +1 -1
  52. package/lib/watchful/targetgroup.d.ts +2 -2
  53. package/lib/watchful/targetgroup.js +1 -1
  54. package/lib/watchful/upperToLower.js +3 -2
  55. package/lib/watchful/watchful.d.ts +52 -48
  56. package/lib/watchful/watchful.js +103 -98
  57. package/lib/watchfulv2/datadog-log-alarm.d.ts +37 -0
  58. package/lib/watchfulv2/datadog-log-alarm.js +61 -0
  59. package/lib/watchfulv2/datadog-metric-alarm.d.ts +29 -0
  60. package/lib/watchfulv2/datadog-metric-alarm.js +132 -0
  61. package/lib/watchfulv2/index.d.ts +1 -0
  62. package/lib/watchfulv2/index.js +14 -0
  63. package/lib/watchfulv2/watchful.d.ts +53 -0
  64. package/lib/watchfulv2/watchful.js +76 -0
  65. package/package.json +19 -9
  66. package/version.json +1 -1
@@ -1,17 +1,110 @@
1
1
  "use strict";
2
- var _a;
2
+ var _a, _b;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.Watchful = void 0;
4
+ exports.Watchful = exports.AbstractWatchful = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const aws_cdk_lib_1 = require("aws-cdk-lib");
7
7
  const cw_actions = require("aws-cdk-lib/aws-cloudwatch-actions");
8
8
  const ssm = require("aws-cdk-lib/aws-ssm");
9
9
  const constructs_1 = require("constructs");
10
- const __1 = require("..");
10
+ const _1 = require("./");
11
+ class AbstractWatchful extends constructs_1.Construct {
12
+ /**
13
+ * Adds alarms for the given lambda function.
14
+ * @param fn - A lambda function that should be watched [disable-awslint:ref-via-interface]
15
+ */
16
+ watchLambdaFunction(fn, options = {}) {
17
+ new _1.WatchLambdaFunction(this, fn.node.id, {
18
+ watchful: this,
19
+ fn,
20
+ ...options,
21
+ });
22
+ }
23
+ /**
24
+ * Adds alarms for the given Cloudfront Distribution.
25
+ * @param cf - A Cloudfront Distribution that should be watched [disable-awslint:ref-via-interface]
26
+ */
27
+ watchCloudfrontDistribution(cf, options = {}) {
28
+ new _1.WatchCloudfrontDistribution(this, cf.node.id, {
29
+ watchful: this,
30
+ cf,
31
+ ...options,
32
+ });
33
+ }
34
+ /**
35
+ * Adds alarms for the given ECS service.
36
+ * @param service - An ECS service that should be watched [disable-awslint:ref-via-interface]
37
+ */
38
+ watchEcsService(service, options = {}) {
39
+ new _1.WatchEcsService(this, service.node.id, {
40
+ watchful: this,
41
+ service,
42
+ ...options,
43
+ });
44
+ }
45
+ /**
46
+ * Adds alarms for the given application load balancer.
47
+ * @param alb - An application load balancer that should be watched [disable-awslint:ref-via-interface]
48
+ */
49
+ watchAlb(alb, options = {}) {
50
+ new _1.WatchApplicationLoadBalancer(this, alb.node.id, {
51
+ watchful: this,
52
+ alb,
53
+ ...options,
54
+ });
55
+ }
56
+ /**
57
+ * Adds alarms for the given application target gorup.
58
+ * @param atg - An application target group that should be watched [disable-awslint:ref-via-interface]
59
+ */
60
+ watchApplicationTargetGroup(atg, options = {}) {
61
+ new _1.WatchApplicationTargetGroup(this, atg.node.id, {
62
+ watchful: this,
63
+ atg,
64
+ ...options,
65
+ });
66
+ }
67
+ /**
68
+ * Adds alarms for the given DocDb cluster.
69
+ * @param docDb - An DocDb cluster that should be watched [disable-awslint:ref-via-interface]
70
+ */
71
+ watchDocDb(docDb, options = {}) {
72
+ new _1.WatchDocDbCluster(this, docDb.node.id, {
73
+ watchful: this,
74
+ docDb,
75
+ ...options,
76
+ });
77
+ }
78
+ /**
79
+ * Adds alarms for the given database cluster.
80
+ * @param databaseCluster - An database cluster that should be watched [disable-awslint:ref-via-interface]
81
+ */
82
+ watchDatabaseCluster(databaseCluster, options = {}) {
83
+ new _1.WatchDatabaseCluster(this, databaseCluster.node.id, {
84
+ watchful: this,
85
+ databaseCluster,
86
+ ...options,
87
+ });
88
+ }
89
+ /**
90
+ * Adds alarms for the given DynamoDb table.
91
+ * @param dynamoDbTable - An database cluster that should be watched [disable-awslint:ref-via-interface]
92
+ */
93
+ watchDynamoDbTable(dynamoDbTable, options = {}) {
94
+ new _1.WatchDynamoDbTable(this, dynamoDbTable.node.id, {
95
+ watchful: this,
96
+ dynamoDbTable: dynamoDbTable,
97
+ ...options,
98
+ });
99
+ }
100
+ }
101
+ exports.AbstractWatchful = AbstractWatchful;
102
+ _a = JSII_RTTI_SYMBOL_1;
103
+ AbstractWatchful[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.AbstractWatchful", version: "0.0.0" };
11
104
  /**
12
105
  * A construct to watch given scope or resources. Opinionated DataDog alarms are automatically created for watched resources.
13
106
  */
14
- class Watchful extends constructs_1.Construct {
107
+ class Watchful extends AbstractWatchful {
15
108
  constructor(scope, id, props = {}) {
16
109
  super(scope, id);
17
110
  // const opsGenieAlarmTopicArn = Fn.importValue('opsgenie-cloudwatch-alarm-sns-topic-arn');
@@ -42,7 +135,7 @@ class Watchful extends constructs_1.Construct {
42
135
  }
43
136
  }
44
137
  if (this.dataDogMonitorServiceToken !== undefined) {
45
- new __1.DataDogMetricAlarm(scope, id, {
138
+ new _1.DataDogMetricAlarm(scope, id, {
46
139
  serviceToken: this.dataDogMonitorServiceToken ?? '',
47
140
  serviceName: this.dataDogMonitorServiceName,
48
141
  dataDogOpsGenieIntegrationName: this.dataDogOpsGenieIntegrationName ?? '',
@@ -61,7 +154,7 @@ class Watchful extends constructs_1.Construct {
61
154
  */
62
155
  createLogAlarm(scope, id, alarm) {
63
156
  if (this.dataDogMonitorServiceToken !== undefined) {
64
- new __1.DataDogLogAlarm(scope, id, {
157
+ new _1.DataDogLogAlarm(scope, id, {
65
158
  serviceToken: this.dataDogMonitorServiceToken ?? '',
66
159
  serviceName: alarm.lambdaCloudwatchGroupName ?? this.dataDogMonitorServiceName,
67
160
  autoCloseOpsGenieAlerts: alarm.autoCloseOpsGenieAlerts,
@@ -82,99 +175,11 @@ class Watchful extends constructs_1.Construct {
82
175
  * Watches the given scope and adds alarms for known resources.
83
176
  */
84
177
  watchScope(scope) {
85
- const aspect = new __1.WatchfulAspect(this);
178
+ const aspect = new _1.WatchfulAspect(this);
86
179
  aws_cdk_lib_1.Aspects.of(scope).add(aspect);
87
180
  }
88
- /**
89
- * Adds alarms for the given lambda function.
90
- * @param fn A lambda function that should be watched [disable-awslint:ref-via-interface]
91
- */
92
- watchLambdaFunction(fn, options = {}) {
93
- new __1.WatchLambdaFunction(this, fn.node.id, {
94
- watchful: this,
95
- fn,
96
- ...options,
97
- });
98
- }
99
- /**
100
- * Adds alarms for the given Cloudfront Distribution.
101
- * @param cf A Cloudfront Distribution that should be watched [disable-awslint:ref-via-interface]
102
- */
103
- watchCloudfrontDistribution(cf, options = {}) {
104
- new __1.WatchCloudfrontDistribution(this, cf.node.id, {
105
- watchful: this,
106
- cf,
107
- ...options,
108
- });
109
- }
110
- /**
111
- * Adds alarms for the given ECS service.
112
- * @param service An ECS service that should be watched [disable-awslint:ref-via-interface]
113
- */
114
- watchEcsService(service, options = {}) {
115
- new __1.WatchEcsService(this, service.node.id, {
116
- watchful: this,
117
- service,
118
- ...options,
119
- });
120
- }
121
- /**
122
- * Adds alarms for the given application load balancer.
123
- * @param alb An application load balancer that should be watched [disable-awslint:ref-via-interface]
124
- */
125
- watchAlb(alb, options = {}) {
126
- new __1.WatchApplicationLoadBalancer(this, alb.node.id, {
127
- watchful: this,
128
- alb,
129
- ...options,
130
- });
131
- }
132
- /**
133
- * Adds alarms for the given application target gorup.
134
- * @param atg An application target group that should be watched [disable-awslint:ref-via-interface]
135
- */
136
- watchApplicationTargetGroup(atg, options = {}) {
137
- new __1.WatchApplicationTargetGroup(this, atg.node.id, {
138
- watchful: this,
139
- atg,
140
- ...options,
141
- });
142
- }
143
- /**
144
- * Adds alarms for the given DocDb cluster.
145
- * @param docDb An DocDb cluster that should be watched [disable-awslint:ref-via-interface]
146
- */
147
- watchDocDb(docDb, options = {}) {
148
- new __1.WatchDocDbCluster(this, docDb.node.id, {
149
- watchful: this,
150
- docDb,
151
- ...options,
152
- });
153
- }
154
- /**
155
- * Adds alarms for the given database cluster.
156
- * @param databaseCluster An database cluster that should be watched [disable-awslint:ref-via-interface]
157
- */
158
- watchDatabaseCluster(databaseCluster, options = {}) {
159
- new __1.WatchDatabaseCluster(this, databaseCluster.node.id, {
160
- watchful: this,
161
- databaseCluster,
162
- ...options,
163
- });
164
- }
165
- /**
166
- * Adds alarms for the given DynamoDb table.
167
- * @param dynamoDbTable An database cluster that should be watched [disable-awslint:ref-via-interface]
168
- */
169
- watchDynamoDbTable(dynamoDbTable, options = {}) {
170
- new __1.WatchDynamoDbTable(this, dynamoDbTable.node.id, {
171
- watchful: this,
172
- dynamoDbTable: dynamoDbTable,
173
- ...options,
174
- });
175
- }
176
181
  }
177
182
  exports.Watchful = Watchful;
178
- _a = JSII_RTTI_SYMBOL_1;
179
- Watchful[_a] = { fqn: "@rio-cloud/cdk-v2-constructs.Watchful", version: "0.0.0" };
180
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hmdWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvd2F0Y2hmdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNkM7QUFFN0MsaUVBQWlFO0FBUWpFLDJDQUEyQztBQUMzQywyQ0FBbUQ7QUFDbkQsMEJBc0JZO0FBb0RaOztHQUVHO0FBQ0gsTUFBYSxRQUFTLFNBQVEsc0JBQVM7SUFNckMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxRQUF1QixFQUFFO1FBQ2pFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsMkZBQTJGO1FBQzNGLG1HQUFtRztRQUNuRyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDakMsSUFBSSxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQywwQkFBMEIsQ0FBQztRQUVuRSxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDLHlCQUF5QixJQUFJLG1CQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUU3RixJQUFJLEtBQUssQ0FBQywwQkFBMEIsS0FBSyxTQUFTLEVBQUU7WUFFbEQsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FDL0QsSUFBSSxFQUNKLGVBQWUsRUFDZixtQkFBbUIsQ0FDcEIsQ0FBQztZQUNGLElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUMsOEJBQThCLElBQUksYUFBYSxDQUFDLFdBQVcsQ0FBQztTQUN6RztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSSxXQUFXLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBdUI7UUFDdEUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVB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U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksb0JBQW9CLENBQUMsZUFBb0MsRUFBRSxVQUF1QyxFQUFFO1FBQ3pHLElBQUksd0JBQW9CLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQ3RELFFBQVEsRUFBRSxJQUFJO1lBQ2QsZUFBZTtZQUNmLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxrQkFBa0IsQ0FBQyxhQUE2QixFQUFFLFVBQXFDLEVBQUU7UUFDOUYsSUFBSSxzQkFBa0IsQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDbEQsUUFBUSxFQUFFLElBQUk7WUFDZCxhQUFhLEVBQUUsYUFBYTtZQUM1QixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDOztBQWxNSCw0QkFtTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3BlY3RzLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgY3dfYWN0aW9ucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaC1hY3Rpb25zJztcbmltcG9ydCAqIGFzIGRvY2RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1kb2NkYic7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgZWNzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xuaW1wb3J0ICogYXMgZWxidjIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgcmRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yZHMnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBXYXRjaGZ1bEFzcGVjdCxcbiAgV2F0Y2hMYW1iZGFGdW5jdGlvbixcbiAgV2F0Y2hMYW1iZGFGdW5jdGlvbk9wdGlvbnMsXG4gIFdhdGNoQ2xvdWRmcm9udERpc3RyaWJ1dGlvbixcbiAgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uT3B0aW9ucyxcbiAgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck9wdGlvbnMsXG4gIFdhdGNoRWNzU2VydmljZSxcbiAgV2F0Y2hFY3NTZXJ2aWNlT3B0aW9ucyxcbiAgV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwLFxuICBXYXRjaEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBPcHRpb25zLFxuICBEYXRhRG9nTWV0cmljQWxhcm0sXG4gIERhdGFEb2dMb2dBbGFybSxcbiAgTWV0cmljQWxhcm1Qcm9wcyxcbiAgV2F0Y2hEb2NEYkNsdXN0ZXIsXG4gIFdhdGNoRG9jRGJDbHVzdGVyT3B0aW9ucyxcbiAgV2F0Y2hEYXRhYmFzZUNsdXN0ZXIsXG4gIFdhdGNoRGF0YWJhc2VDbHVzdGVyT3B0aW9ucyxcbiAgV2F0Y2hEeW5hbW9EYlRhYmxlLFxuICBXYXRjaER5bmFtb0RiVGFibGVPcHRpb25zLFxuICBMb2dBbGFybVByb3BzLFxufSBmcm9tICcuLic7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBXYXRjaGZ1bCBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2F0Y2hmdWwgZXh0ZW5kcyBJQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEFkZHMgYW5kIGFsZXJ0IGZvciBlcnJvciBsb2dzXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZVxuICAgKi9cbiAgY3JlYXRlTG9nQWxhcm0oc2NvcGU6IENvbnN0cnVjdCwgc2VydmljZU5hbWU6IHN0cmluZywgYWxhcm06IExvZ0FsYXJtUHJvcHMpOiB2b2lkO1xuICAvKipcbiAgICogQWRkcyB0aGUgYWxhcm1Ub3BpYyBhcyBhbGFybSBhY3Rpb24gdG8gdGhlIGdpdmVuIGFsYXJtLlxuICAgKiBAcGFyYW0gYWxhcm0gVGhlIHdhdGNoZnVsIHRvIGFkZCB0aG9zZSByZXNvdXJjZXMgdG9cbiAgICpcbiAgICovXG4gIGNyZWF0ZUFsYXJtKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGFsYXJtOiBNZXRyaWNBbGFybVByb3BzKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBkZWZpbmluZyBXYXRjaGZ1bFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoZnVsUHJvcHMge1xuICAvKipcbiAgICogQW4gU05TIHRvcGljIGFzIHRhcmdldCBmb3IgYWxhcm0gYWN0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQ6IFRoZSBTTlMgdG9waWMgcHJvdmlkZWQgYnkgT3BzR2VuaWUgSW50ZWdyYXRpb24gYWNjb3VudCBtb2R1bGUuXG4gICAqL1xuICByZWFkb25seSBhbGFybVNucz86IHNucy5JVG9waWM7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIHRva2VuIGZvciB0aGUgRGF0YURvZyBNb25pdG9yIGN1c3RvbSByZXNvdXJjZS5cbiAgICpcbiAgICogQGRlZmF1bHQ6IEVtcHR5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0OiBUaGUgc3RhY2sgYW5tZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFEb2dNb25pdG9yU2VydmljZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBPcHNHZW5pZSBoYW5kbGUgdXNlZCBpbiBEYXRhRG9nIHRvIGZvcndhcmQgdGhlIEREIG1vbml0b3IgdG8gT3BzR2VuaWUuXG4gICAqXG4gICAqIEBkZWZhdWx0OiBFbXB0eSBpZiBkYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiBpcyBub3Qgc2V0LiBPdGhlcndpc2UsIHRlYW0gU1NNIHBhcmFtZXRlciBmcm9tIExhbmRpbmdab25lIGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBkYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb25zdHJ1Y3QgdG8gd2F0Y2ggZ2l2ZW4gc2NvcGUgb3IgcmVzb3VyY2VzLiBPcGluaW9uYXRlZCBEYXRhRG9nIGFsYXJtcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciB3YXRjaGVkIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhdGNoZnVsIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVdhdGNoZnVsIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbGFybVRvcGljPzogc25zLklUb3BpYztcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbj86IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWU/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXYXRjaGZ1bFByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gY29uc3Qgb3BzR2VuaWVBbGFybVRvcGljQXJuID0gRm4uaW1wb3J0VmFsdWUoJ29wc2dlbmllLWNsb3Vkd2F0Y2gtYWxhcm0tc25zLXRvcGljLWFybicpO1xuICAgIC8vIGNvbnN0IG9wc0dlbmllQWxhcm1Ub3BpYyA9IHNucy5Ub3BpYy5mcm9tVG9waWNBcm4odGhpcywgJ09wc0dlbmllVG9waWMnLCBvcHNHZW5pZUFsYXJtVG9waWNBcm4pO1xuICAgIHRoaXMuYWxhcm1Ub3BpYyA9IHByb3BzLmFsYXJtU25zO1xuICAgIHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4gPSBwcm9wcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbjtcblxuICAgIHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZSA9IHByb3BzLmRhdGFEb2dNb25pdG9yU2VydmljZU5hbWUgPz8gU3RhY2sub2YodGhpcykuc3RhY2tOYW1lO1xuXG4gICAgaWYgKHByb3BzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuICE9PSB1bmRlZmluZWQpIHtcblxuICAgICAgY29uc3QgdGVhbU5hbWVQYXJhbSA9IHNzbS5TdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUoXG4gICAgICAgIHRoaXMsXG4gICAgICAgICdUZWFtTmFtZVBhcmFtJyxcbiAgICAgICAgJy9jb25maWcvdGVhbS9uYW1lJyxcbiAgICAgICk7XG4gICAgICB0aGlzLmRhdGFEb2dPcHNHZW5pZUludGVncmF0aW9uTmFtZSA9IHByb3BzLmRhdGFEb2dPcHNHZW5pZUludGVncmF0aW9uTmFtZSA/PyB0ZWFtTmFtZVBhcmFtLnN0cmluZ1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBhbGFybVRvcGljIGFzIGFsYXJtIGFjdGlvbiB0byB0aGUgZ2l2ZW4gYWxhcm0uXG4gICAqIEBwYXJhbSBhbGFybSBUaGUgd2F0Y2hmdWwgdG8gYWRkIHRob3NlIHJlc291cmNlcyB0b1xuICAgKi9cbiAgcHVibGljIGNyZWF0ZUFsYXJtKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGFsYXJtOiBNZXRyaWNBbGFybVByb3BzKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWxhcm1Ub3BpYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBjd0FsYXJtID0gYWxhcm0ubWV0cmljLmNyZWF0ZUFsYXJtKHNjb3BlLCBpZCwge1xuICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBhbGFybS5hbGFybURlc2NyaXB0aW9uLFxuICAgICAgICB0aHJlc2hvbGQ6IGFsYXJtLnRocmVzaG9sZCxcbiAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBhbGFybS5jb21wYXJpc29uT3BlcmF0b3IsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBhbGFybS5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMuYWxhcm1Ub3BpYykge1xuICAgICAgICBjd0FsYXJtLmFkZEFsYXJtQWN0aW9uKG5ldyBjd19hY3Rpb25zLlNuc0FjdGlvbih0aGlzLmFsYXJtVG9waWMpKTtcbiAgICAgICAgY3dBbGFybS5hZGRPa0FjdGlvbihuZXcgY3dfYWN0aW9ucy5TbnNBY3Rpb24odGhpcy5hbGFybVRvcGljKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV3IERhdGFEb2dNZXRyaWNBbGFybShzY29wZSwgaWQsIHtcbiAgICAgICAgc2VydmljZVRva2VuOiB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuID8/ICcnLFxuICAgICAgICBzZXJ2aWNlTmFtZTogdGhpcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VOYW1lLFxuICAgICAgICBkYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWU6IHRoaXMuZGF0YURvZ09wc0dlbmllSW50ZWdyYXRpb25OYW1lID8/ICcnLFxuICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBhbGFybS5hbGFybURlc2NyaXB0aW9uLFxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGFsYXJtLmNvbXBhcmlzb25PcGVyYXRvcixcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IGFsYXJtLmV2YWx1YXRpb25QZXJpb2RzLFxuICAgICAgICBtZXRyaWM6IGFsYXJtLm1ldHJpYyxcbiAgICAgICAgdGhyZXNob2xkOiBhbGFybS50aHJlc2hvbGQsXG4gICAgICAgIHRyZWF0TWlzc2luZ0RhdGE6IGFsYXJtLnRyZWF0TWlzc2luZ0RhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBhbGVydCBmb3IgZXJyb3IgbG9nc1xuICAgKiBAcGFyYW0gc2NvcGVcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVMb2dBbGFybShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhbGFybTogTG9nQWxhcm1Qcm9wcyk6dm9pZCB7XG5cbiAgICBpZiAodGhpcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuZXcgRGF0YURvZ0xvZ0FsYXJtKHNjb3BlLCBpZCwge1xuICAgICAgICBzZXJ2aWNlVG9rZW46IHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4gPz8gJycsXG4gICAgICAgIHNlcnZpY2VOYW1lOiBhbGFybS5sYW1iZGFDbG91ZHdhdGNoR3JvdXBOYW1lID8/IHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZSxcbiAgICAgICAgYXV0b0Nsb3NlT3BzR2VuaWVBbGVydHM6IGFsYXJtLmF1dG9DbG9zZU9wc0dlbmllQWxlcnRzLFxuICAgICAgICBwZXJpb2Q6IGFsYXJtLnBlcmlvZCxcbiAgICAgICAgdW5pdE9mUGVyaW9kOiBhbGFybS51bml0T2ZQZXJpb2QsIC8vIHRvRG86IG1vdmUgdGhhdCBzb21ld2hlcmUgZWxzZSBhbmQgc2V0IGRlZmF1bHRzIHRoZXJlP1xuICAgICAgICBwZXJpb2RPcGVyYXRvcjogYWxhcm0ucGVyaW9kT3BlcmF0b3IsXG4gICAgICAgIHN0YXRpc3RpYzogYWxhcm0uc3RhdGlzdGljLFxuICAgICAgICBxdWVyeUZpbHRlcnM6IGFsYXJtLnF1ZXJ5RmlsdGVycywgLy8gdG9EbzogbW92ZSB0aGF0IHNvbWV3aGVyZSBlbHNlIGFuZCBzZXQgZGVmYXVsdHMgdGhlcmU/XG4gICAgICAgIGFsYXJtRGVzY3JpcHRpb246IGFsYXJtLmFsYXJtRGVzY3JpcHRpb24sXG4gICAgICAgIHRocmVzaG9sZDogYWxhcm0udGhyZXNob2xkLFxuICAgICAgICBwcmlvcml0eTogYWxhcm0ucHJpb3JpdHksXG4gICAgICAgIGluZGV4OiBhbGFybS5pbmRleCxcbiAgICAgICAgbGFtYmRhQ2xvdWR3YXRjaEdyb3VwTmFtZTogYWxhcm0ubGFtYmRhQ2xvdWR3YXRjaEdyb3VwTmFtZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaGVzIHRoZSBnaXZlbiBzY29wZSBhbmQgYWRkcyBhbGFybXMgZm9yIGtub3duIHJlc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyB3YXRjaFNjb3BlKHNjb3BlOiBDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBjb25zdCBhc3BlY3QgPSBuZXcgV2F0Y2hmdWxBc3BlY3QodGhpcyk7XG4gICAgQXNwZWN0cy5vZihzY29wZSkuYWRkKGFzcGVjdCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBmbiBBIGxhbWJkYSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSB3YXRjaGVkIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAqL1xuICBwdWJsaWMgd2F0Y2hMYW1iZGFGdW5jdGlvbihmbjogbGFtYmRhLkZ1bmN0aW9uLCBvcHRpb25zOiBXYXRjaExhbWJkYUZ1bmN0aW9uT3B0aW9ucyA9IHt9KTogdm9pZCB7XG5cbiAgICBuZXcgV2F0Y2hMYW1iZGFGdW5jdGlvbih0aGlzLCBmbi5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGZuLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsYXJtcyBmb3IgdGhlIGdpdmVuIENsb3VkZnJvbnQgRGlzdHJpYnV0aW9uLlxuICAgKiBAcGFyYW0gY2YgQSBDbG91ZGZyb250IERpc3RyaWJ1dGlvbiB0aGF0IHNob3VsZCBiZSB3YXRjaGVkIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAqL1xuICBwdWJsaWMgd2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uKFxuICAgIGNmOiBjbG91ZGZyb250LkRpc3RyaWJ1dGlvbixcbiAgICBvcHRpb25zOiBXYXRjaENsb3VkZnJvbnREaXN0cmlidXRpb25PcHRpb25zID0ge30sXG4gICk6IHZvaWQge1xuICAgIG5ldyBXYXRjaENsb3VkZnJvbnREaXN0cmlidXRpb24odGhpcywgY2Yubm9kZS5pZCwge1xuICAgICAgd2F0Y2hmdWw6IHRoaXMsXG4gICAgICBjZixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBFQ1Mgc2VydmljZS5cbiAgICogQHBhcmFtIHNlcnZpY2UgQW4gRUNTIHNlcnZpY2UgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoRWNzU2VydmljZShzZXJ2aWNlOiBlY3MuQmFzZVNlcnZpY2UsIG9wdGlvbnM6IFdhdGNoRWNzU2VydmljZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaEVjc1NlcnZpY2UodGhpcywgc2VydmljZS5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIHNlcnZpY2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gbG9hZCBiYWxhbmNlci5cbiAgICogQHBhcmFtIGFsYiBBbiBhcHBsaWNhdGlvbiBsb2FkIGJhbGFuY2VyIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaEFsYihhbGI6IGVsYnYyLkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLCBvcHRpb25zOiBXYXRjaEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgbmV3IFdhdGNoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIodGhpcywgYWxiLm5vZGUuaWQsIHtcbiAgICAgIHdhdGNoZnVsOiB0aGlzLFxuICAgICAgYWxiLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsYXJtcyBmb3IgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHRhcmdldCBnb3J1cC5cbiAgICogQHBhcmFtIGF0ZyBBbiBhcHBsaWNhdGlvbiB0YXJnZXQgZ3JvdXAgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoQXBwbGljYXRpb25UYXJnZXRHcm91cChcbiAgICBhdGc6IGVsYnYyLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAsXG4gICAgb3B0aW9uczogV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwT3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwKHRoaXMsIGF0Zy5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGF0ZyxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBEb2NEYiBjbHVzdGVyLlxuICAgKiBAcGFyYW0gZG9jRGIgQW4gIERvY0RiIGNsdXN0ZXIgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoRG9jRGIoZG9jRGI6IGRvY2RiLkRhdGFiYXNlQ2x1c3Rlciwgb3B0aW9uczogV2F0Y2hEb2NEYkNsdXN0ZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hEb2NEYkNsdXN0ZXIodGhpcywgZG9jRGIubm9kZS5pZCwge1xuICAgICAgd2F0Y2hmdWw6IHRoaXMsXG4gICAgICBkb2NEYixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBkYXRhYmFzZSBjbHVzdGVyLlxuICAgKiBAcGFyYW0gZGF0YWJhc2VDbHVzdGVyIEFuIGRhdGFiYXNlIGNsdXN0ZXIgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoRGF0YWJhc2VDbHVzdGVyKGRhdGFiYXNlQ2x1c3RlcjogcmRzLkRhdGFiYXNlQ2x1c3Rlciwgb3B0aW9uczogV2F0Y2hEYXRhYmFzZUNsdXN0ZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hEYXRhYmFzZUNsdXN0ZXIodGhpcywgZGF0YWJhc2VDbHVzdGVyLm5vZGUuaWQsIHtcbiAgICAgIHdhdGNoZnVsOiB0aGlzLFxuICAgICAgZGF0YWJhc2VDbHVzdGVyLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsYXJtcyBmb3IgdGhlIGdpdmVuIER5bmFtb0RiIHRhYmxlLlxuICAgKiBAcGFyYW0gZHluYW1vRGJUYWJsZSBBbiBkYXRhYmFzZSBjbHVzdGVyIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaER5bmFtb0RiVGFibGUoZHluYW1vRGJUYWJsZTogZHluYW1vZGIuVGFibGUsIG9wdGlvbnM6IFdhdGNoRHluYW1vRGJUYWJsZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaER5bmFtb0RiVGFibGUodGhpcywgZHluYW1vRGJUYWJsZS5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGR5bmFtb0RiVGFibGU6IGR5bmFtb0RiVGFibGUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
183
+ _b = JSII_RTTI_SYMBOL_1;
184
+ Watchful[_b] = { fqn: "@rio-cloud/cdk-v2-constructs.Watchful", version: "0.0.0" };
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hmdWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWwvd2F0Y2hmdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2Q0FBNkM7QUFFN0MsaUVBQWlFO0FBUWpFLDJDQUEyQztBQUMzQywyQ0FBbUQ7QUFDbkQseUJBc0JZO0FBbUJaLE1BQXNCLGdCQUFpQixTQUFRLHNCQUFTO0lBSXREOzs7T0FHRztJQUNJLG1CQUFtQixDQUFDLEVBQW1CLEVBQUUsVUFBc0MsRUFBRTtRQUV0RixJQUFJLHNCQUFtQixDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxRQUFRLEVBQUUsSUFBSTtZQUNkLEVBQUU7WUFDRixHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksMkJBQTJCLENBQ2hDLEVBQTJCLEVBQzNCLFVBQThDLEVBQUU7UUFFaEQsSUFBSSw4QkFBMkIsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDaEQsUUFBUSxFQUFFLElBQUk7WUFDZCxFQUFFO1lBQ0YsR0FBRyxPQUFPO1NBQ1gsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGVBQWUsQ0FBQyxPQUF3QixFQUFFLFVBQWtDLEVBQUU7UUFDbkYsSUFBSSxrQkFBZSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUN6QyxRQUFRLEVBQUUsSUFBSTtZQUNkLE9BQU87WUFDUCxHQUFHLE9BQU87U0FDWCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksUUFBUSxDQUFDLEdBQWtDLEVBQUUsVUFBK0MsRUFBRTtRQUNuRyxJQUFJLCtCQUE0QixDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNsRCxRQUFRLEVBQUUs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Q2hDLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztnQkFDcEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO2dCQUMxQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7Z0JBQ2hDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQ3hDLFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDMUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO2dCQUN4QixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLHlCQUF5QixFQUFFLEtBQUssQ0FBQyx5QkFBeUI7YUFDM0QsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxVQUFVLENBQUMsS0FBZ0I7UUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxpQkFBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLHFCQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDOztBQTNGSCw0QkE2RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3BlY3RzLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGNsb3VkZnJvbnQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3VkZnJvbnQnO1xuaW1wb3J0ICogYXMgY3dfYWN0aW9ucyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaC1hY3Rpb25zJztcbmltcG9ydCAqIGFzIGRvY2RiIGZyb20gJ2F3cy1jZGstbGliL2F3cy1kb2NkYic7XG5pbXBvcnQgKiBhcyBkeW5hbW9kYiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGInO1xuaW1wb3J0ICogYXMgZWNzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xuaW1wb3J0ICogYXMgZWxidjIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0ICogYXMgcmRzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1yZHMnO1xuaW1wb3J0ICogYXMgc25zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0ICogYXMgc3NtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1zc20nO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBXYXRjaGZ1bEFzcGVjdCxcbiAgV2F0Y2hMYW1iZGFGdW5jdGlvbixcbiAgV2F0Y2hMYW1iZGFGdW5jdGlvbk9wdGlvbnMsXG4gIFdhdGNoQ2xvdWRmcm9udERpc3RyaWJ1dGlvbixcbiAgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uT3B0aW9ucyxcbiAgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcixcbiAgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlck9wdGlvbnMsXG4gIFdhdGNoRWNzU2VydmljZSxcbiAgV2F0Y2hFY3NTZXJ2aWNlT3B0aW9ucyxcbiAgV2F0Y2hBcHBsaWNhdGlvblRhcmdldEdyb3VwLFxuICBXYXRjaEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXBPcHRpb25zLFxuICBEYXRhRG9nTWV0cmljQWxhcm0sXG4gIERhdGFEb2dMb2dBbGFybSxcbiAgTWV0cmljQWxhcm1Qcm9wcyxcbiAgV2F0Y2hEb2NEYkNsdXN0ZXIsXG4gIFdhdGNoRG9jRGJDbHVzdGVyT3B0aW9ucyxcbiAgV2F0Y2hEYXRhYmFzZUNsdXN0ZXIsXG4gIFdhdGNoRGF0YWJhc2VDbHVzdGVyT3B0aW9ucyxcbiAgV2F0Y2hEeW5hbW9EYlRhYmxlLFxuICBXYXRjaER5bmFtb0RiVGFibGVPcHRpb25zLFxuICBMb2dBbGFybVByb3BzLFxufSBmcm9tICcuLyc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBXYXRjaGZ1bCBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJV2F0Y2hmdWwgZXh0ZW5kcyBJQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEFkZHMgYW5kIGFsZXJ0IGZvciBlcnJvciBsb2dzXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlXG4gICAqL1xuICBjcmVhdGVMb2dBbGFybShzY29wZTogQ29uc3RydWN0LCBzZXJ2aWNlTmFtZTogc3RyaW5nLCBhbGFybTogTG9nQWxhcm1Qcm9wcyk6IHZvaWQ7XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBhbGFybVRvcGljIGFzIGFsYXJtIGFjdGlvbiB0byB0aGUgZ2l2ZW4gYWxhcm0uXG4gICAqIEBwYXJhbSBhbGFybSAtIFRoZSB3YXRjaGZ1bCB0byBhZGQgdGhvc2UgcmVzb3VyY2VzIHRvXG4gICAqXG4gICAqL1xuICBjcmVhdGVBbGFybShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhbGFybTogTWV0cmljQWxhcm1Qcm9wcyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdhdGNoZnVsIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVdhdGNoZnVsIHtcbiAgYWJzdHJhY3QgY3JlYXRlTG9nQWxhcm0oc2NvcGU6IENvbnN0cnVjdCwgc2VydmljZU5hbWU6IHN0cmluZywgYWxhcm06IExvZ0FsYXJtUHJvcHMpOiB2b2lkXG4gIGFic3RyYWN0IGNyZWF0ZUFsYXJtKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGFsYXJtOiBNZXRyaWNBbGFybVByb3BzKTogdm9pZDtcblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBsYW1iZGEgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSBmbiAtIEEgbGFtYmRhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaExhbWJkYUZ1bmN0aW9uKGZuOiBsYW1iZGEuRnVuY3Rpb24sIG9wdGlvbnM6IFdhdGNoTGFtYmRhRnVuY3Rpb25PcHRpb25zID0ge30pOiB2b2lkIHtcblxuICAgIG5ldyBXYXRjaExhbWJkYUZ1bmN0aW9uKHRoaXMsIGZuLm5vZGUuaWQsIHtcbiAgICAgIHdhdGNoZnVsOiB0aGlzLFxuICAgICAgZm4sXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gQ2xvdWRmcm9udCBEaXN0cmlidXRpb24uXG4gICAqIEBwYXJhbSBjZiAtIEEgQ2xvdWRmcm9udCBEaXN0cmlidXRpb24gdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoQ2xvdWRmcm9udERpc3RyaWJ1dGlvbihcbiAgICBjZjogY2xvdWRmcm9udC5EaXN0cmlidXRpb24sXG4gICAgb3B0aW9uczogV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uT3B0aW9ucyA9IHt9LFxuICApOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hDbG91ZGZyb250RGlzdHJpYnV0aW9uKHRoaXMsIGNmLm5vZGUuaWQsIHtcbiAgICAgIHdhdGNoZnVsOiB0aGlzLFxuICAgICAgY2YsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gRUNTIHNlcnZpY2UuXG4gICAqIEBwYXJhbSBzZXJ2aWNlIC0gQW4gRUNTIHNlcnZpY2UgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoRWNzU2VydmljZShzZXJ2aWNlOiBlY3MuQmFzZVNlcnZpY2UsIG9wdGlvbnM6IFdhdGNoRWNzU2VydmljZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaEVjc1NlcnZpY2UodGhpcywgc2VydmljZS5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIHNlcnZpY2UsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gbG9hZCBiYWxhbmNlci5cbiAgICogQHBhcmFtIGFsYiAtIEFuIGFwcGxpY2F0aW9uIGxvYWQgYmFsYW5jZXIgdGhhdCBzaG91bGQgYmUgd2F0Y2hlZCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgcHVibGljIHdhdGNoQWxiKGFsYjogZWxidjIuQXBwbGljYXRpb25Mb2FkQmFsYW5jZXIsIG9wdGlvbnM6IFdhdGNoQXBwbGljYXRpb25Mb2FkQmFsYW5jZXJPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgICBuZXcgV2F0Y2hBcHBsaWNhdGlvbkxvYWRCYWxhbmNlcih0aGlzLCBhbGIubm9kZS5pZCwge1xuICAgICAgd2F0Y2hmdWw6IHRoaXMsXG4gICAgICBhbGIsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gYXBwbGljYXRpb24gdGFyZ2V0IGdvcnVwLlxuICAgKiBAcGFyYW0gYXRnIC0gQW4gYXBwbGljYXRpb24gdGFyZ2V0IGdyb3VwIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaEFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAoXG4gICAgYXRnOiBlbGJ2Mi5BcHBsaWNhdGlvblRhcmdldEdyb3VwLFxuICAgIG9wdGlvbnM6IFdhdGNoQXBwbGljYXRpb25UYXJnZXRHcm91cE9wdGlvbnMgPSB7fSxcbiAgKTogdm9pZCB7XG4gICAgbmV3IFdhdGNoQXBwbGljYXRpb25UYXJnZXRHcm91cCh0aGlzLCBhdGcubm9kZS5pZCwge1xuICAgICAgd2F0Y2hmdWw6IHRoaXMsXG4gICAgICBhdGcsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYWxhcm1zIGZvciB0aGUgZ2l2ZW4gRG9jRGIgY2x1c3Rlci5cbiAgICogQHBhcmFtIGRvY0RiIC0gQW4gRG9jRGIgY2x1c3RlciB0aGF0IHNob3VsZCBiZSB3YXRjaGVkIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAqL1xuICBwdWJsaWMgd2F0Y2hEb2NEYihkb2NEYjogZG9jZGIuRGF0YWJhc2VDbHVzdGVyLCBvcHRpb25zOiBXYXRjaERvY0RiQ2x1c3Rlck9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaERvY0RiQ2x1c3Rlcih0aGlzLCBkb2NEYi5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGRvY0RiLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFsYXJtcyBmb3IgdGhlIGdpdmVuIGRhdGFiYXNlIGNsdXN0ZXIuXG4gICAqIEBwYXJhbSBkYXRhYmFzZUNsdXN0ZXIgLSBBbiBkYXRhYmFzZSBjbHVzdGVyIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaERhdGFiYXNlQ2x1c3RlcihkYXRhYmFzZUNsdXN0ZXI6IHJkcy5EYXRhYmFzZUNsdXN0ZXIsIG9wdGlvbnM6IFdhdGNoRGF0YWJhc2VDbHVzdGVyT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gICAgbmV3IFdhdGNoRGF0YWJhc2VDbHVzdGVyKHRoaXMsIGRhdGFiYXNlQ2x1c3Rlci5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGRhdGFiYXNlQ2x1c3RlcixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbGFybXMgZm9yIHRoZSBnaXZlbiBEeW5hbW9EYiB0YWJsZS5cbiAgICogQHBhcmFtIGR5bmFtb0RiVGFibGUgLSBBbiBkYXRhYmFzZSBjbHVzdGVyIHRoYXQgc2hvdWxkIGJlIHdhdGNoZWQgW2Rpc2FibGUtYXdzbGludDpyZWYtdmlhLWludGVyZmFjZV1cbiAgICovXG4gIHB1YmxpYyB3YXRjaER5bmFtb0RiVGFibGUoZHluYW1vRGJUYWJsZTogZHluYW1vZGIuVGFibGUsIG9wdGlvbnM6IFdhdGNoRHluYW1vRGJUYWJsZU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICAgIG5ldyBXYXRjaER5bmFtb0RiVGFibGUodGhpcywgZHluYW1vRGJUYWJsZS5ub2RlLmlkLCB7XG4gICAgICB3YXRjaGZ1bDogdGhpcyxcbiAgICAgIGR5bmFtb0RiVGFibGU6IGR5bmFtb0RiVGFibGUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgZGVmaW5pbmcgV2F0Y2hmdWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGZ1bFByb3BzIHtcbiAgLyoqXG4gICAqIEFuIFNOUyB0b3BpYyBhcyB0YXJnZXQgZm9yIGFsYXJtIGFjdGlvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgIFRoZSBTTlMgdG9waWMgcHJvdmlkZWQgYnkgT3BzR2VuaWUgSW50ZWdyYXRpb24gYWNjb3VudCBtb2R1bGUuXG4gICAqL1xuICByZWFkb25seSBhbGFybVNucz86IHNucy5JVG9waWM7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2aWNlIHRva2VuIGZvciB0aGUgRGF0YURvZyBNb25pdG9yIGN1c3RvbSByZXNvdXJjZS5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBFbXB0eS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIFRoZSBzdGFjayBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIE9wc0dlbmllIGhhbmRsZSB1c2VkIGluIERhdGFEb2cgdG8gZm9yd2FyZCB0aGUgREQgbW9uaXRvciB0byBPcHNHZW5pZS5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBFbXB0eSBpZiBkYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiBpcyBub3Qgc2V0LiBPdGhlcndpc2UsIHRlYW0gU1NNIHBhcmFtZXRlciBmcm9tIExhbmRpbmdab25lIGlzIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBkYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb25zdHJ1Y3QgdG8gd2F0Y2ggZ2l2ZW4gc2NvcGUgb3IgcmVzb3VyY2VzLiBPcGluaW9uYXRlZCBEYXRhRG9nIGFsYXJtcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGZvciB3YXRjaGVkIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdhdGNoZnVsIGV4dGVuZHMgQWJzdHJhY3RXYXRjaGZ1bCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxhcm1Ub3BpYz86IHNucy5JVG9waWM7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4/OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YURvZ09wc0dlbmllSW50ZWdyYXRpb25OYW1lPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFEb2dNb25pdG9yU2VydmljZU5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2F0Y2hmdWxQcm9wcyA9IHt9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIGNvbnN0IG9wc0dlbmllQWxhcm1Ub3BpY0FybiA9IEZuLmltcG9ydFZhbHVlKCdvcHNnZW5pZS1jbG91ZHdhdGNoLWFsYXJtLXNucy10b3BpYy1hcm4nKTtcbiAgICAvLyBjb25zdCBvcHNHZW5pZUFsYXJtVG9waWMgPSBzbnMuVG9waWMuZnJvbVRvcGljQXJuKHRoaXMsICdPcHNHZW5pZVRvcGljJywgb3BzR2VuaWVBbGFybVRvcGljQXJuKTtcbiAgICB0aGlzLmFsYXJtVG9waWMgPSBwcm9wcy5hbGFybVNucztcbiAgICB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuID0gcHJvcHMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW47XG5cbiAgICB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZU5hbWUgPSBwcm9wcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VOYW1lID8/IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIGlmIChwcm9wcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgIGNvbnN0IHRlYW1OYW1lUGFyYW0gPSBzc20uU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKFxuICAgICAgICB0aGlzLFxuICAgICAgICAnVGVhbU5hbWVQYXJhbScsXG4gICAgICAgICcvY29uZmlnL3RlYW0vbmFtZScsXG4gICAgICApO1xuICAgICAgdGhpcy5kYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWUgPSBwcm9wcy5kYXRhRG9nT3BzR2VuaWVJbnRlZ3JhdGlvbk5hbWUgPz8gdGVhbU5hbWVQYXJhbS5zdHJpbmdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyB0aGUgYWxhcm1Ub3BpYyBhcyBhbGFybSBhY3Rpb24gdG8gdGhlIGdpdmVuIGFsYXJtLlxuICAgKiBAcGFyYW0gYWxhcm0gVGhlIHdhdGNoZnVsIHRvIGFkZCB0aG9zZSByZXNvdXJjZXMgdG9cbiAgICovXG4gIHB1YmxpYyBjcmVhdGVBbGFybShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhbGFybTogTWV0cmljQWxhcm1Qcm9wcyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFsYXJtVG9waWMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgY3dBbGFybSA9IGFsYXJtLm1ldHJpYy5jcmVhdGVBbGFybShzY29wZSwgaWQsIHtcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYWxhcm0uYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgICAgdGhyZXNob2xkOiBhbGFybS50aHJlc2hvbGQsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogYWxhcm0uY29tcGFyaXNvbk9wZXJhdG9yLFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogYWxhcm0uZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLmFsYXJtVG9waWMpIHtcbiAgICAgICAgY3dBbGFybS5hZGRBbGFybUFjdGlvbihuZXcgY3dfYWN0aW9ucy5TbnNBY3Rpb24odGhpcy5hbGFybVRvcGljKSk7XG4gICAgICAgIGN3QWxhcm0uYWRkT2tBY3Rpb24obmV3IGN3X2FjdGlvbnMuU25zQWN0aW9uKHRoaXMuYWxhcm1Ub3BpYykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG5ldyBEYXRhRG9nTWV0cmljQWxhcm0oc2NvcGUsIGlkLCB7XG4gICAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5kYXRhRG9nTW9uaXRvclNlcnZpY2VUb2tlbiA/PyAnJyxcbiAgICAgICAgc2VydmljZU5hbWU6IHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlTmFtZSxcbiAgICAgICAgZGF0YURvZ09wc0dlbmllSW50ZWdyYXRpb25OYW1lOiB0aGlzLmRhdGFEb2dPcHNHZW5pZUludGVncmF0aW9uTmFtZSA/PyAnJyxcbiAgICAgICAgYWxhcm1EZXNjcmlwdGlvbjogYWxhcm0uYWxhcm1EZXNjcmlwdGlvbixcbiAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yOiBhbGFybS5jb21wYXJpc29uT3BlcmF0b3IsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBhbGFybS5ldmFsdWF0aW9uUGVyaW9kcyxcbiAgICAgICAgbWV0cmljOiBhbGFybS5tZXRyaWMsXG4gICAgICAgIHRocmVzaG9sZDogYWxhcm0udGhyZXNob2xkLFxuICAgICAgICB0cmVhdE1pc3NpbmdEYXRhOiBhbGFybS50cmVhdE1pc3NpbmdEYXRhLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gYWxlcnQgZm9yIGVycm9yIGxvZ3NcbiAgICogQHBhcmFtIHNjb3BlXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTG9nQWxhcm0oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYWxhcm06IExvZ0FsYXJtUHJvcHMpOnZvaWQge1xuXG4gICAgaWYgKHRoaXMuZGF0YURvZ01vbml0b3JTZXJ2aWNlVG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgbmV3IERhdGFEb2dMb2dBbGFybShzY29wZSwgaWQsIHtcbiAgICAgICAgc2VydmljZVRva2VuOiB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZVRva2VuID8/ICcnLFxuICAgICAgICBzZXJ2aWNlTmFtZTogYWxhcm0ubGFtYmRhQ2xvdWR3YXRjaEdyb3VwTmFtZSA/PyB0aGlzLmRhdGFEb2dNb25pdG9yU2VydmljZU5hbWUsXG4gICAgICAgIGF1dG9DbG9zZU9wc0dlbmllQWxlcnRzOiBhbGFybS5hdXRvQ2xvc2VPcHNHZW5pZUFsZXJ0cyxcbiAgICAgICAgcGVyaW9kOiBhbGFybS5wZXJpb2QsXG4gICAgICAgIHVuaXRPZlBlcmlvZDogYWxhcm0udW5pdE9mUGVyaW9kLCAvLyB0b0RvOiBtb3ZlIHRoYXQgc29tZXdoZXJlIGVsc2UgYW5kIHNldCBkZWZhdWx0cyB0aGVyZT9cbiAgICAgICAgcGVyaW9kT3BlcmF0b3I6IGFsYXJtLnBlcmlvZE9wZXJhdG9yLFxuICAgICAgICBzdGF0aXN0aWM6IGFsYXJtLnN0YXRpc3RpYyxcbiAgICAgICAgcXVlcnlGaWx0ZXJzOiBhbGFybS5xdWVyeUZpbHRlcnMsIC8vIHRvRG86IG1vdmUgdGhhdCBzb21ld2hlcmUgZWxzZSBhbmQgc2V0IGRlZmF1bHRzIHRoZXJlP1xuICAgICAgICBhbGFybURlc2NyaXB0aW9uOiBhbGFybS5hbGFybURlc2NyaXB0aW9uLFxuICAgICAgICB0aHJlc2hvbGQ6IGFsYXJtLnRocmVzaG9sZCxcbiAgICAgICAgcHJpb3JpdHk6IGFsYXJtLnByaW9yaXR5LFxuICAgICAgICBpbmRleDogYWxhcm0uaW5kZXgsXG4gICAgICAgIGxhbWJkYUNsb3Vkd2F0Y2hHcm91cE5hbWU6IGFsYXJtLmxhbWJkYUNsb3Vkd2F0Y2hHcm91cE5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcyB0aGUgZ2l2ZW4gc2NvcGUgYW5kIGFkZHMgYWxhcm1zIGZvciBrbm93biByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgd2F0Y2hTY29wZShzY29wZTogQ29uc3RydWN0KTogdm9pZCB7XG4gICAgY29uc3QgYXNwZWN0ID0gbmV3IFdhdGNoZnVsQXNwZWN0KHRoaXMpO1xuICAgIEFzcGVjdHMub2Yoc2NvcGUpLmFkZChhc3BlY3QpO1xuICB9XG5cbn1cbiJdfQ==
@@ -0,0 +1,37 @@
1
+ import { Duration } from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+ export interface DataDogLogQueryAlarmProps extends DataDogProps, LogAlarmProps {
4
+ }
5
+ export declare enum UnitOfPeriod {
6
+ SECONDS = "s",
7
+ MINUTES = "m",
8
+ HOURS = "h",
9
+ DAYS = "d"
10
+ }
11
+ export declare enum ComparisonOperator {
12
+ GREATER_THAN_OR_EQUAL_TO_THRESHOLD = ">=",
13
+ GREATER_THAN_THRESHOLD = ">",
14
+ LESS_THAN_OR_EQUAL_TO_THRESHOLD = "<=",
15
+ LESS_THAN_THRESHOLD = "<"
16
+ }
17
+ export interface DataDogProps {
18
+ readonly serviceName: string;
19
+ }
20
+ export interface LogAlarmProps {
21
+ readonly autoCloseOpsGenieAlerts: boolean;
22
+ readonly period: Duration;
23
+ readonly unitOfPeriod?: UnitOfPeriod;
24
+ readonly periodOperator: ComparisonOperator;
25
+ readonly statistic: 'count';
26
+ readonly queryFilters: 'error' | 'warn';
27
+ readonly alarmDescription: string;
28
+ readonly threshold: number;
29
+ readonly priority: number;
30
+ readonly index: string;
31
+ readonly lambdaCloudwatchGroupName?: string;
32
+ }
33
+ export declare class DataDogLogAlarm extends Construct {
34
+ constructor(scope: Construct, id: string, props: DataDogLogQueryAlarmProps);
35
+ private alarmToDataDogQuery;
36
+ private convertToDatadogPeriod;
37
+ }
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataDogLogAlarm = exports.ComparisonOperator = exports.UnitOfPeriod = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const constructs_1 = require("constructs");
6
+ const datadogv2_1 = require("../datadogv2");
7
+ var UnitOfPeriod;
8
+ (function (UnitOfPeriod) {
9
+ UnitOfPeriod["SECONDS"] = "s";
10
+ UnitOfPeriod["MINUTES"] = "m";
11
+ UnitOfPeriod["HOURS"] = "h";
12
+ UnitOfPeriod["DAYS"] = "d";
13
+ })(UnitOfPeriod = exports.UnitOfPeriod || (exports.UnitOfPeriod = {}));
14
+ const DEFAULT_UNIT_OF_PERIOD = UnitOfPeriod.SECONDS;
15
+ var ComparisonOperator;
16
+ (function (ComparisonOperator) {
17
+ ComparisonOperator["GREATER_THAN_OR_EQUAL_TO_THRESHOLD"] = ">=";
18
+ ComparisonOperator["GREATER_THAN_THRESHOLD"] = ">";
19
+ ComparisonOperator["LESS_THAN_OR_EQUAL_TO_THRESHOLD"] = "<=";
20
+ ComparisonOperator["LESS_THAN_THRESHOLD"] = "<";
21
+ })(ComparisonOperator = exports.ComparisonOperator || (exports.ComparisonOperator = {}));
22
+ class DataDogLogAlarm extends constructs_1.Construct {
23
+ constructor(scope, id, props) {
24
+ super(scope, id);
25
+ new datadogv2_1.DatadogMonitor(scope, 'ErrorMonitorLogAlert', {
26
+ serviceName: props.serviceName,
27
+ monitorType: datadogv2_1.DatadogMonitorQueryAlertType.LOG_ALERT,
28
+ name: `${this.node.scope?.node.id} ${id}`,
29
+ query: this.alarmToDataDogQuery(props),
30
+ message: `${props.alarmDescription}: {{log.link}}`,
31
+ });
32
+ }
33
+ alarmToDataDogQuery(alarm) {
34
+ const [periodValue, periodUnit] = this.convertToDatadogPeriod(alarm.period, alarm.unitOfPeriod);
35
+ let comparisonOperator = alarm.periodOperator;
36
+ const filters = new Map([
37
+ ['service', alarm.serviceName],
38
+ ['account_id', aws_cdk_lib_1.Stack.of(this).account],
39
+ ['status', alarm.queryFilters],
40
+ ]);
41
+ const concatenatedFilters = Array.from(filters.entries())
42
+ .map(([filterKey, filterValue]) => `${filterKey}:${filterValue}`)
43
+ .join(' ');
44
+ return `logs("${concatenatedFilters}").index("${alarm.index}").rollup("${alarm.statistic}").last("${periodValue}${periodUnit}") ${comparisonOperator} ${alarm.threshold}`;
45
+ }
46
+ convertToDatadogPeriod(period, unitOfPeriod) {
47
+ const unit = unitOfPeriod ?? DEFAULT_UNIT_OF_PERIOD;
48
+ const mapPeriodToDatadogTime = {
49
+ [UnitOfPeriod.SECONDS]: () => period.toSeconds(),
50
+ [UnitOfPeriod.MINUTES]: () => period.toMinutes(),
51
+ [UnitOfPeriod.HOURS]: () => period.toHours(),
52
+ [UnitOfPeriod.DAYS]: () => period.toDays(),
53
+ };
54
+ return [
55
+ mapPeriodToDatadogTime[unit](),
56
+ unit.toString(),
57
+ ];
58
+ }
59
+ }
60
+ exports.DataDogLogAlarm = DataDogLogAlarm;
61
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy1sb2ctYWxhcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWx2Mi9kYXRhZG9nLWxvZy1hbGFybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBOEM7QUFDOUMsMkNBQXVDO0FBQ3ZDLDRDQUE0RTtBQUs1RSxJQUFZLFlBS1g7QUFMRCxXQUFZLFlBQVk7SUFDdEIsNkJBQWEsQ0FBQTtJQUNiLDZCQUFhLENBQUE7SUFDYiwyQkFBVyxDQUFBO0lBQ1gsMEJBQVUsQ0FBQTtBQUNaLENBQUMsRUFMVyxZQUFZLEdBQVosb0JBQVksS0FBWixvQkFBWSxRQUt2QjtBQUVELE1BQU0sc0JBQXNCLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQztBQUVwRCxJQUFZLGtCQUtYO0FBTEQsV0FBWSxrQkFBa0I7SUFDNUIsK0RBQXlDLENBQUE7SUFDekMsa0RBQTRCLENBQUE7SUFDNUIsNERBQXNDLENBQUE7SUFDdEMsK0NBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxXLGtCQUFrQixHQUFsQiwwQkFBa0IsS0FBbEIsMEJBQWtCLFFBSzdCO0FBb0JELE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQUM1QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWdDO1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSwwQkFBYyxDQUFDLEtBQUssRUFDdEIsc0JBQXNCLEVBQ3RCO1lBQ0UsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLFdBQVcsRUFBRSx3Q0FBNEIsQ0FBQyxTQUFTO1lBQ25ELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pDLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsZ0JBQWdCO1NBQ25ELENBQUMsQ0FBQztJQUVQLENBQUM7SUFDTyxtQkFBbUIsQ0FBQyxLQUFnQztRQUUxRCxNQUFNLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVoRyxJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFFOUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUM7WUFDdEIsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUM5QixDQUFDLFlBQVksRUFBRSxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDdEMsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQztTQUMvQixDQUFDLENBQUM7UUFFSCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ3RELEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFNBQVMsSUFBSSxXQUFXLEVBQUUsQ0FBQzthQUNoRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFYixPQUFPLFNBQVMsbUJBQW1CLGFBQWEsS0FBSyxDQUFDLEtBQUssY0FBYyxLQUFLLENBQUMsU0FBUyxZQUFZLFdBQVcsR0FBRyxVQUFVLE1BQU0sa0JBQWtCLElBQUksS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQzVLLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFnQixFQUFFLFlBQTJCO1FBQzFFLE1BQU0sSUFBSSxHQUFHLFlBQVksSUFBSSxzQkFBc0IsQ0FBQztRQUNwRCxNQUFNLHNCQUFzQixHQUFHO1lBQzdCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDaEQsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNoRCxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQzVDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUU7U0FDM0MsQ0FBQztRQUNGLE9BQU87WUFDTCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsUUFBUSxFQUFFO1NBQ2hCLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUEvQ0QsMENBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBEYXRhZG9nTW9uaXRvciwgRGF0YWRvZ01vbml0b3JRdWVyeUFsZXJ0VHlwZSB9IGZyb20gJy4uL2RhdGFkb2d2Mic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YURvZ0xvZ1F1ZXJ5QWxhcm1Qcm9wcyBleHRlbmRzIERhdGFEb2dQcm9wcywgTG9nQWxhcm1Qcm9wcyB7XG59XG5cbmV4cG9ydCBlbnVtIFVuaXRPZlBlcmlvZCB7XG4gIFNFQ09ORFMgPSAncycsXG4gIE1JTlVURVMgPSAnbScsXG4gIEhPVVJTID0gJ2gnLFxuICBEQVlTID0gJ2QnLFxufVxuXG5jb25zdCBERUZBVUxUX1VOSVRfT0ZfUEVSSU9EID0gVW5pdE9mUGVyaW9kLlNFQ09ORFM7XG5cbmV4cG9ydCBlbnVtIENvbXBhcmlzb25PcGVyYXRvciB7XG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQgPSAnPj0nLFxuICBHUkVBVEVSX1RIQU5fVEhSRVNIT0xEID0gJz4nLFxuICBMRVNTX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xEID0gJzw9JyxcbiAgTEVTU19USEFOX1RIUkVTSE9MRCA9ICc8Jyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhRG9nUHJvcHMge1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nOyAvLyBuZWVkcyB0byBtYXRjaCB0aGUgc2VydmljZSBuYW1lIHVzZWQgaW4gZGF0YWRvZy1pbnRlZ3JhdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExvZ0FsYXJtUHJvcHMge1xuICByZWFkb25seSBhdXRvQ2xvc2VPcHNHZW5pZUFsZXJ0czogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcGVyaW9kOiBEdXJhdGlvbjtcbiAgcmVhZG9ubHkgdW5pdE9mUGVyaW9kPzogVW5pdE9mUGVyaW9kOyAvLyB1bml0IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGFsZXJ0LiBpZiBub25lIGlzIHByb3ZpZGVkIHRoZSBwZXJpb2RzIHVuaXQgd2lsbCBkZWZhdWx0IHRvIHNlY29uZHNcbiAgcmVhZG9ubHkgcGVyaW9kT3BlcmF0b3I6IENvbXBhcmlzb25PcGVyYXRvcjtcbiAgcmVhZG9ubHkgc3RhdGlzdGljOiAnY291bnQnOyAvLyBhZ2dyZWdhdGlvbiBmdW5jdGlvblxuICByZWFkb25seSBxdWVyeUZpbHRlcnM6ICdlcnJvcid8J3dhcm4nOyAvLyBpdCBzaG91bGQgZWl0aGVyIHNheSBlcnJvciBvciB3YXJuXG4gIHJlYWRvbmx5IGFsYXJtRGVzY3JpcHRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgdGhyZXNob2xkOiBudW1iZXI7XG4gIHJlYWRvbmx5IHByaW9yaXR5OiBudW1iZXI7XG4gIHJlYWRvbmx5IGluZGV4OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGxhbWJkYUNsb3Vkd2F0Y2hHcm91cE5hbWU/OiBzdHJpbmc7IC8vIFNob3VsZCBvbmx5IGJlIHNldCBpbiBjYXNlIG9mIGxhbWJkYSBmdW5jdGlvbi4gVGhlIGNsb3Vkd2F0Y2ggbG9nIGdyb3VwIG5hbWUgaXMgc2FtZSB0aGUgbGFtYmRhIGZ1bmN0aW9uIG5hbWVcbn1cblxuZXhwb3J0IGNsYXNzIERhdGFEb2dMb2dBbGFybSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBEYXRhRG9nTG9nUXVlcnlBbGFybVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBEYXRhZG9nTW9uaXRvcihzY29wZSxcbiAgICAgICdFcnJvck1vbml0b3JMb2dBbGVydCcsXG4gICAgICB7XG4gICAgICAgIHNlcnZpY2VOYW1lOiBwcm9wcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgbW9uaXRvclR5cGU6IERhdGFkb2dNb25pdG9yUXVlcnlBbGVydFR5cGUuTE9HX0FMRVJULFxuICAgICAgICBuYW1lOiBgJHt0aGlzLm5vZGUuc2NvcGU/Lm5vZGUuaWR9ICR7aWR9YCxcbiAgICAgICAgcXVlcnk6IHRoaXMuYWxhcm1Ub0RhdGFEb2dRdWVyeShwcm9wcyksXG4gICAgICAgIG1lc3NhZ2U6IGAke3Byb3BzLmFsYXJtRGVzY3JpcHRpb259OiB7e2xvZy5saW5rfX1gLFxuICAgICAgfSk7XG5cbiAgfVxuICBwcml2YXRlIGFsYXJtVG9EYXRhRG9nUXVlcnkoYWxhcm06IERhdGFEb2dMb2dRdWVyeUFsYXJtUHJvcHMpOiBzdHJpbmcge1xuXG4gICAgY29uc3QgW3BlcmlvZFZhbHVlLCBwZXJpb2RVbml0XSA9IHRoaXMuY29udmVydFRvRGF0YWRvZ1BlcmlvZChhbGFybS5wZXJpb2QsIGFsYXJtLnVuaXRPZlBlcmlvZCk7XG5cbiAgICBsZXQgY29tcGFyaXNvbk9wZXJhdG9yID0gYWxhcm0ucGVyaW9kT3BlcmF0b3I7XG5cbiAgICBjb25zdCBmaWx0ZXJzID0gbmV3IE1hcChbXG4gICAgICBbJ3NlcnZpY2UnLCBhbGFybS5zZXJ2aWNlTmFtZV0sXG4gICAgICBbJ2FjY291bnRfaWQnLCBTdGFjay5vZih0aGlzKS5hY2NvdW50XSxcbiAgICAgIFsnc3RhdHVzJywgYWxhcm0ucXVlcnlGaWx0ZXJzXSxcbiAgICBdKTtcblxuICAgIGNvbnN0IGNvbmNhdGVuYXRlZEZpbHRlcnMgPSBBcnJheS5mcm9tKGZpbHRlcnMuZW50cmllcygpKVxuICAgICAgLm1hcCgoW2ZpbHRlcktleSwgZmlsdGVyVmFsdWVdKSA9PiBgJHtmaWx0ZXJLZXl9OiR7ZmlsdGVyVmFsdWV9YClcbiAgICAgIC5qb2luKCcgJyk7XG5cbiAgICByZXR1cm4gYGxvZ3MoXCIke2NvbmNhdGVuYXRlZEZpbHRlcnN9XCIpLmluZGV4KFwiJHthbGFybS5pbmRleH1cIikucm9sbHVwKFwiJHthbGFybS5zdGF0aXN0aWN9XCIpLmxhc3QoXCIke3BlcmlvZFZhbHVlfSR7cGVyaW9kVW5pdH1cIikgJHtjb21wYXJpc29uT3BlcmF0b3J9ICR7YWxhcm0udGhyZXNob2xkfWA7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUb0RhdGFkb2dQZXJpb2QocGVyaW9kOiBEdXJhdGlvbiwgdW5pdE9mUGVyaW9kPzogVW5pdE9mUGVyaW9kKTogW251bWJlciwgc3RyaW5nXSB7XG4gICAgY29uc3QgdW5pdCA9IHVuaXRPZlBlcmlvZCA/PyBERUZBVUxUX1VOSVRfT0ZfUEVSSU9EO1xuICAgIGNvbnN0IG1hcFBlcmlvZFRvRGF0YWRvZ1RpbWUgPSB7XG4gICAgICBbVW5pdE9mUGVyaW9kLlNFQ09ORFNdOiAoKSA9PiBwZXJpb2QudG9TZWNvbmRzKCksXG4gICAgICBbVW5pdE9mUGVyaW9kLk1JTlVURVNdOiAoKSA9PiBwZXJpb2QudG9NaW51dGVzKCksXG4gICAgICBbVW5pdE9mUGVyaW9kLkhPVVJTXTogKCkgPT4gcGVyaW9kLnRvSG91cnMoKSxcbiAgICAgIFtVbml0T2ZQZXJpb2QuREFZU106ICgpID0+IHBlcmlvZC50b0RheXMoKSxcbiAgICB9O1xuICAgIHJldHVybiBbXG4gICAgICBtYXBQZXJpb2RUb0RhdGFkb2dUaW1lW3VuaXRdKCksXG4gICAgICB1bml0LnRvU3RyaW5nKCksXG4gICAgXTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,29 @@
1
+ import { Construct } from 'constructs';
2
+ import { INotification } from '../datadogv2';
3
+ import { MetricAlarmProps } from '../watchful/metric-alarm';
4
+ /**
5
+ * Interface for DataDogMonitor implementation.
6
+ */
7
+ export interface DataDogMetricAlarmProps extends MetricAlarmProps {
8
+ /**
9
+ * The service name used to name and tag the monitors.
10
+ */
11
+ readonly serviceName: string;
12
+ /**
13
+ * The name of DataDog's OpsGenie integration. Used to automatically create OpsGenie alarms for the created DataDog Monitor.
14
+ */
15
+ readonly notification?: INotification;
16
+ }
17
+ /**
18
+ * A wrapper for a custom resource that creates a DataDog Monitor.
19
+ *
20
+ * To use this construct, the DataDog integration needs to be installed.
21
+ */
22
+ export declare class DataDogMetricAlarm extends Construct {
23
+ constructor(scope: Construct, id: string, props: DataDogMetricAlarmProps);
24
+ private getMessage;
25
+ /**
26
+ * Helper function to convert a generic alarm into a DataDog query string.
27
+ */
28
+ alarmToDataDogQuery(alarm: MetricAlarmProps): string;
29
+ }
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataDogMetricAlarm = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const constructs_1 = require("constructs");
7
+ const datadogv2_1 = require("../datadogv2");
8
+ const upperToLower_1 = require("../watchful/upperToLower");
9
+ /**
10
+ * A wrapper for a custom resource that creates a DataDog Monitor.
11
+ *
12
+ * To use this construct, the DataDog integration needs to be installed.
13
+ */
14
+ class DataDogMetricAlarm extends constructs_1.Construct {
15
+ constructor(scope, id, props) {
16
+ super(scope, id);
17
+ new datadogv2_1.DatadogMonitor(this, 'ErrorMonitorMetricAlert', {
18
+ serviceName: props.serviceName,
19
+ name: `${this.node.scope?.node.id} ${id}`,
20
+ monitorType: datadogv2_1.DatadogMonitorQueryAlertType.QUERY_ALERT,
21
+ query: this.alarmToDataDogQuery(props),
22
+ message: this.getMessage(props),
23
+ notification: props.notification,
24
+ });
25
+ }
26
+ getMessage(props) {
27
+ return `
28
+ {{#is_alert}}
29
+ ${props.alarmDescription}
30
+ {{/is_alert}}
31
+
32
+ {{#is_alert_recovery}}
33
+ ${props.alarmDescription} is back to normal.
34
+ {{/is_alert_recovery}}`;
35
+ }
36
+ /**
37
+ * Helper function to convert a generic alarm into a DataDog query string.
38
+ */
39
+ alarmToDataDogQuery(alarm) {
40
+ let unit;
41
+ let totalPeriod;
42
+ if (alarm.metric.period.toSeconds() < 60) {
43
+ totalPeriod = alarm.metric.period.toSeconds() * alarm.evaluationPeriods;
44
+ unit = 's';
45
+ }
46
+ else if (alarm.metric.period.toMinutes() < 1440) {
47
+ totalPeriod = alarm.metric.period.toMinutes() * alarm.evaluationPeriods;
48
+ unit = 'm';
49
+ }
50
+ else {
51
+ totalPeriod = alarm.metric.period.toDays() * alarm.evaluationPeriods;
52
+ unit = 'd';
53
+ }
54
+ // avg(last_15m):max:aws.fargate.cpu.percent{ecs_container_name:$ServiceName$} > 95
55
+ const namespace = alarm.metric.namespace.toLocaleLowerCase().replace('/', '.');
56
+ let metricName = alarm.metric.metricName;
57
+ // Special case for ALB / TargetGroup metrics
58
+ switch (metricName) {
59
+ case 'HTTPCode_ELB_5XX_Count':
60
+ metricName = 'HTTPCode_ELB_5XX';
61
+ break;
62
+ case 'HTTPCode_Target_5XX_Count':
63
+ metricName = 'HTTPCode_Target_5XX';
64
+ break;
65
+ }
66
+ if (!metricName.includes('_')) {
67
+ metricName = metricName.replace(/([a-z])([A-Z])/g, '$1_$2');
68
+ }
69
+ metricName = metricName.toLocaleLowerCase();
70
+ const metric = `${namespace}.${metricName}`;
71
+ // statistics must be lowerCase and probably also converted (see allowed values in cw.Metric)
72
+ let comparisonOperator = 'not supported';
73
+ switch (alarm.comparisonOperator) {
74
+ case cdk.aws_cloudwatch.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD:
75
+ comparisonOperator = '>=';
76
+ break;
77
+ case cdk.aws_cloudwatch.ComparisonOperator.GREATER_THAN_THRESHOLD:
78
+ comparisonOperator = '>';
79
+ break;
80
+ case cdk.aws_cloudwatch.ComparisonOperator.LESS_THAN_OR_EQUAL_TO_THRESHOLD:
81
+ comparisonOperator = '<=';
82
+ break;
83
+ case cdk.aws_cloudwatch.ComparisonOperator.LESS_THAN_THRESHOLD:
84
+ comparisonOperator = '<';
85
+ break;
86
+ }
87
+ let alarmStatistic = 'not supported';
88
+ switch (alarm.metric.statistic) {
89
+ case cdk.aws_cloudwatch.Statistic.AVERAGE:
90
+ alarmStatistic = 'avg';
91
+ break;
92
+ case cdk.aws_cloudwatch.Statistic.MAXIMUM:
93
+ alarmStatistic = 'max';
94
+ break;
95
+ case cdk.aws_cloudwatch.Statistic.MINIMUM:
96
+ alarmStatistic = 'min';
97
+ break;
98
+ case cdk.aws_cloudwatch.Statistic.SAMPLE_COUNT:
99
+ break;
100
+ case cdk.aws_cloudwatch.Statistic.SUM:
101
+ alarmStatistic = 'sum';
102
+ break;
103
+ default:
104
+ alarmStatistic = 'avg';
105
+ break;
106
+ }
107
+ let dimensions = `account_id:${aws_cdk_lib_1.Stack.of(this).account}`;
108
+ if (alarm.metric.dimensions) {
109
+ for (const key in alarm.metric.dimensions) {
110
+ const upperToLowerCr = new aws_cdk_lib_1.CustomResource(this, `${key}UpperToLower`, {
111
+ resourceType: 'Custom::UpperToLower',
112
+ serviceToken: upperToLower_1.UpperToLower.getOrCreate(this).provider.serviceToken,
113
+ properties: {
114
+ Upper: alarm.metric.dimensions[key],
115
+ },
116
+ });
117
+ const value = upperToLowerCr.getAtt('Lower');
118
+ dimensions += `,${key.toLocaleLowerCase()}:${value}`;
119
+ }
120
+ }
121
+ switch (alarm.treatMissingData) {
122
+ case cdk.aws_cloudwatch.TreatMissingData.NOT_BREACHING:
123
+ return `${alarmStatistic}(last_${totalPeriod}${unit}):default_zero(${alarmStatistic}:${metric}{${dimensions}}) ${comparisonOperator} ${alarm.threshold}`;
124
+ case cdk.aws_cloudwatch.TreatMissingData.BREACHING:
125
+ case cdk.aws_cloudwatch.TreatMissingData.IGNORE:
126
+ default:
127
+ return `${alarmStatistic}(last_${totalPeriod}${unit}):${alarmStatistic}:${metric}{${dimensions}} ${comparisonOperator} ${alarm.threshold}`;
128
+ }
129
+ }
130
+ }
131
+ exports.DataDogMetricAlarm = DataDogMetricAlarm;
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWRvZy1tZXRyaWMtYWxhcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWx2Mi9kYXRhZG9nLW1ldHJpYy1hbGFybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBbUM7QUFDbkMsNkNBQW9EO0FBQ3BELDJDQUF1QztBQUN2Qyw0Q0FBMkY7QUFFM0YsMkRBQXdEO0FBbUJ4RDs7OztHQUlHO0FBQ0gsTUFBYSxrQkFBbUIsU0FBUSxzQkFBUztJQUUvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQThCO1FBQ3RFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSwwQkFBYyxDQUFDLElBQUksRUFDckIseUJBQXlCLEVBQ3pCO1lBQ0UsV0FBVyxFQUFFLEtBQUssQ0FBQyxXQUFXO1lBQzlCLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1lBQ3pDLFdBQVcsRUFBRSx3Q0FBNEIsQ0FBQyxXQUFXO1lBQ3JELEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1lBQ3RDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUMvQixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7U0FDakMsQ0FBQyxDQUFDO0lBRVAsQ0FBQztJQUVPLFVBQVUsQ0FBQyxLQUE4QjtRQUMvQyxPQUFPOztFQUVULEtBQUssQ0FBQyxnQkFBZ0I7Ozs7RUFJdEIsS0FBSyxDQUFDLGdCQUFnQjt1QkFDRCxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQixDQUFDLEtBQXVCO1FBQ3pDLElBQUksSUFBWSxDQUFDO1FBQ2pCLElBQUksV0FBbUIsQ0FBQztRQUN4QixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMs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Y0FBYyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztZQUNuRCxLQUFLLEdBQUcsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1lBQ2hEO2dCQUNFLE9BQU8sR0FBRyxjQUFjLFNBQVMsV0FBVyxHQUFHLElBQUksS0FBSyxjQUFjLElBQUksTUFBTSxJQUFJLFVBQVUsS0FBSyxrQkFBa0IsSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDOUk7SUFDSCxDQUFDO0NBQ0Y7QUFsSUQsZ0RBa0lDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBTdGFjayB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgRGF0YWRvZ01vbml0b3IsIERhdGFkb2dNb25pdG9yUXVlcnlBbGVydFR5cGUsIElOb3RpZmljYXRpb24gfSBmcm9tICcuLi9kYXRhZG9ndjInO1xuaW1wb3J0IHsgTWV0cmljQWxhcm1Qcm9wcyB9IGZyb20gJy4uL3dhdGNoZnVsL21ldHJpYy1hbGFybSc7XG5pbXBvcnQgeyBVcHBlclRvTG93ZXIgfSBmcm9tICcuLi93YXRjaGZ1bC91cHBlclRvTG93ZXInO1xuXG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBEYXRhRG9nTW9uaXRvciBpbXBsZW1lbnRhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhRG9nTWV0cmljQWxhcm1Qcm9wcyBleHRlbmRzIE1ldHJpY0FsYXJtUHJvcHMge1xuXG4gIC8qKlxuICAgICAqIFRoZSBzZXJ2aWNlIG5hbWUgdXNlZCB0byBuYW1lIGFuZCB0YWcgdGhlIG1vbml0b3JzLlxuICAgICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIERhdGFEb2cncyBPcHNHZW5pZSBpbnRlZ3JhdGlvbi4gVXNlZCB0byBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBPcHNHZW5pZSBhbGFybXMgZm9yIHRoZSBjcmVhdGVkIERhdGFEb2cgTW9uaXRvci5cbiAgICAgKi9cbiAgcmVhZG9ubHkgbm90aWZpY2F0aW9uPzogSU5vdGlmaWNhdGlvbjtcbn1cblxuLyoqXG4gKiBBIHdyYXBwZXIgZm9yIGEgY3VzdG9tIHJlc291cmNlIHRoYXQgY3JlYXRlcyBhIERhdGFEb2cgTW9uaXRvci5cbiAqXG4gKiBUbyB1c2UgdGhpcyBjb25zdHJ1Y3QsIHRoZSBEYXRhRG9nIGludGVncmF0aW9uIG5lZWRzIHRvIGJlIGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFEb2dNZXRyaWNBbGFybSBleHRlbmRzIENvbnN0cnVjdCB7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IERhdGFEb2dNZXRyaWNBbGFybVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIG5ldyBEYXRhZG9nTW9uaXRvcih0aGlzLFxuICAgICAgJ0Vycm9yTW9uaXRvck1ldHJpY0FsZXJ0JyxcbiAgICAgIHtcbiAgICAgICAgc2VydmljZU5hbWU6IHByb3BzLnNlcnZpY2VOYW1lLFxuICAgICAgICBuYW1lOiBgJHt0aGlzLm5vZGUuc2NvcGU/Lm5vZGUuaWR9ICR7aWR9YCxcbiAgICAgICAgbW9uaXRvclR5cGU6IERhdGFkb2dNb25pdG9yUXVlcnlBbGVydFR5cGUuUVVFUllfQUxFUlQsXG4gICAgICAgIHF1ZXJ5OiB0aGlzLmFsYXJtVG9EYXRhRG9nUXVlcnkocHJvcHMpLFxuICAgICAgICBtZXNzYWdlOiB0aGlzLmdldE1lc3NhZ2UocHJvcHMpLFxuICAgICAgICBub3RpZmljYXRpb246IHByb3BzLm5vdGlmaWNhdGlvbixcbiAgICAgIH0pO1xuXG4gIH1cblxuICBwcml2YXRlIGdldE1lc3NhZ2UocHJvcHM6IERhdGFEb2dNZXRyaWNBbGFybVByb3BzKSB7XG4gICAgcmV0dXJuIGBcbnt7I2lzX2FsZXJ0fX1cbiR7cHJvcHMuYWxhcm1EZXNjcmlwdGlvbn1cbnt7L2lzX2FsZXJ0fX0gXG5cbnt7I2lzX2FsZXJ0X3JlY292ZXJ5fX1cbiR7cHJvcHMuYWxhcm1EZXNjcmlwdGlvbn0gaXMgYmFjayB0byBub3JtYWwuXG57ey9pc19hbGVydF9yZWNvdmVyeX19YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBhIGdlbmVyaWMgYWxhcm0gaW50byBhIERhdGFEb2cgcXVlcnkgc3RyaW5nLlxuICAgKi9cbiAgYWxhcm1Ub0RhdGFEb2dRdWVyeShhbGFybTogTWV0cmljQWxhcm1Qcm9wcyk6IHN0cmluZyB7XG4gICAgbGV0IHVuaXQ6IHN0cmluZztcbiAgICBsZXQgdG90YWxQZXJpb2Q6IG51bWJlcjtcbiAgICBpZiAoYWxhcm0ubWV0cmljLnBlcmlvZC50b1NlY29uZHMoKSA8IDYwKSB7XG4gICAgICB0b3RhbFBlcmlvZCA9IGFsYXJtLm1ldHJpYy5wZXJpb2QudG9TZWNvbmRzKCkgKiBhbGFybS5ldmFsdWF0aW9uUGVyaW9kcztcbiAgICAgIHVuaXQgPSAncyc7XG4gICAgfSBlbHNlIGlmIChhbGFybS5tZXRyaWMucGVyaW9kLnRvTWludXRlcygpIDwgMTQ0MCkge1xuICAgICAgdG90YWxQZXJpb2QgPSBhbGFybS5tZXRyaWMucGVyaW9kLnRvTWludXRlcygpICogYWxhcm0uZXZhbHVhdGlvblBlcmlvZHM7XG4gICAgICB1bml0ID0gJ20nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0b3RhbFBlcmlvZCA9IGFsYXJtLm1ldHJpYy5wZXJpb2QudG9EYXlzKCkgKiBhbGFybS5ldmFsdWF0aW9uUGVyaW9kcztcbiAgICAgIHVuaXQgPSAnZCc7XG4gICAgfVxuXG4gICAgLy8gYXZnKGxhc3RfMTVtKTptYXg6YXdzLmZhcmdhdGUuY3B1LnBlcmNlbnR7ZWNzX2NvbnRhaW5lcl9uYW1lOiRTZXJ2aWNlTmFtZSR9ID4gOTVcbiAgICBjb25zdCBuYW1lc3BhY2UgPSBhbGFybS5tZXRyaWMubmFtZXNwYWNlLnRvTG9jYWxlTG93ZXJDYXNlKCkucmVwbGFjZSgnLycsICcuJyk7XG5cbiAgICBsZXQgbWV0cmljTmFtZSA9IGFsYXJtLm1ldHJpYy5tZXRyaWNOYW1lO1xuXG4gICAgLy8gU3BlY2lhbCBjYXNlIGZvciBBTEIgLyBUYXJnZXRHcm91cCBtZXRyaWNzXG4gICAgc3dpdGNoIChtZXRyaWNOYW1lKSB7XG4gICAgICBjYXNlICdIVFRQQ29kZV9FTEJfNVhYX0NvdW50JzpcbiAgICAgICAgbWV0cmljTmFtZSA9ICdIVFRQQ29kZV9FTEJfNVhYJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdIVFRQQ29kZV9UYXJnZXRfNVhYX0NvdW50JzpcbiAgICAgICAgbWV0cmljTmFtZSA9ICdIVFRQQ29kZV9UYXJnZXRfNVhYJztcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghbWV0cmljTmFtZS5pbmNsdWRlcygnXycpKSB7XG4gICAgICBtZXRyaWNOYW1lID0gbWV0cmljTmFtZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDFfJDInKTtcbiAgICB9XG4gICAgbWV0cmljTmFtZSA9IG1ldHJpY05hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcblxuICAgIGNvbnN0IG1ldHJpYyA9IGAke25hbWVzcGFjZX0uJHttZXRyaWNOYW1lfWA7XG5cbiAgICAvLyBzdGF0aXN0aWNzIG11c3QgYmUgbG93ZXJDYXNlIGFuZCBwcm9iYWJseSBhbHNvIGNvbnZlcnRlZCAoc2VlIGFsbG93ZWQgdmFsdWVzIGluIGN3Lk1ldHJpYylcbiAgICBsZXQgY29tcGFyaXNvbk9wZXJhdG9yID0gJ25vdCBzdXBwb3J0ZWQnO1xuICAgIHN3aXRjaCAoYWxhcm0uY29tcGFyaXNvbk9wZXJhdG9yKSB7XG4gICAgICBjYXNlIGNkay5hd3NfY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX09SX0VRVUFMX1RPX1RIUkVTSE9MRDpcbiAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yID0gJz49JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGNkay5hd3NfY2xvdWR3YXRjaC5Db21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRDpcbiAgICAgICAgY29tcGFyaXNvbk9wZXJhdG9yID0gJz4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgY2RrLmF3c19jbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fT1JfRVFVQUxfVE9fVEhSRVNIT0xEOlxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3IgPSAnPD0nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgY2RrLmF3c19jbG91ZHdhdGNoLkNvbXBhcmlzb25PcGVyYXRvci5MRVNTX1RIQU5fVEhSRVNIT0xEOlxuICAgICAgICBjb21wYXJpc29uT3BlcmF0b3IgPSAnPCc7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGxldCBhbGFybVN0YXRpc3RpYyA9ICdub3Qgc3VwcG9ydGVkJztcbiAgICBzd2l0Y2ggKGFsYXJtLm1ldHJpYy5zdGF0aXN0aWMpIHtcbiAgICAgIGNhc2UgY2RrLmF3c19jbG91ZHdhdGNoLlN0YXRpc3RpYy5BVkVSQUdFOlxuICAgICAgICBhbGFybVN0YXRpc3RpYyA9ICdhdmcnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgY2RrLmF3c19jbG91ZHdhdGNoLlN0YXRpc3RpYy5NQVhJTVVNOlxuICAgICAgICBhbGFybVN0YXRpc3RpYyA9ICdtYXgnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgY2RrLmF3c19jbG91ZHdhdGNoLlN0YXRpc3RpYy5NSU5JTVVNOlxuICAgICAgICBhbGFybVN0YXRpc3RpYyA9ICdtaW4nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgY2RrLmF3c19jbG91ZHdhdGNoLlN0YXRpc3RpYy5TQU1QTEVfQ09VTlQ6XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBjZGsuYXdzX2Nsb3Vkd2F0Y2guU3RhdGlzdGljLlNVTTpcbiAgICAgICAgYWxhcm1TdGF0aXN0aWMgPSAnc3VtJztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhbGFybVN0YXRpc3RpYyA9ICdhdmcnO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBsZXQgZGltZW5zaW9ucyA9IGBhY2NvdW50X2lkOiR7U3RhY2sub2YodGhpcykuYWNjb3VudH1gO1xuXG4gICAgaWYgKGFsYXJtLm1ldHJpYy5kaW1lbnNpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBhbGFybS5tZXRyaWMuZGltZW5zaW9ucykge1xuICAgICAgICBjb25zdCB1cHBlclRvTG93ZXJDciA9IG5ldyBDdXN0b21SZXNvdXJjZSh0aGlzLCBgJHtrZXl9VXBwZXJUb0xvd2VyYCwge1xuICAgICAgICAgIHJlc291cmNlVHlwZTogJ0N1c3RvbTo6VXBwZXJUb0xvd2VyJyxcbiAgICAgICAgICBzZXJ2aWNlVG9rZW46IFVwcGVyVG9Mb3dlci5nZXRPckNyZWF0ZSh0aGlzKS5wcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgVXBwZXI6IGFsYXJtLm1ldHJpYy5kaW1lbnNpb25zW2tleV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdXBwZXJUb0xvd2VyQ3IuZ2V0QXR0KCdMb3dlcicpO1xuICAgICAgICBkaW1lbnNpb25zICs9IGAsJHtrZXkudG9Mb2NhbGVMb3dlckNhc2UoKX06JHt2YWx1ZX1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN3aXRjaCAoYWxhcm0udHJlYXRNaXNzaW5nRGF0YSkge1xuICAgICAgY2FzZSBjZGsuYXdzX2Nsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5OT1RfQlJFQUNISU5HOlxuICAgICAgICByZXR1cm4gYCR7YWxhcm1TdGF0aXN0aWN9KGxhc3RfJHt0b3RhbFBlcmlvZH0ke3VuaXR9KTpkZWZhdWx0X3plcm8oJHthbGFybVN0YXRpc3RpY306JHttZXRyaWN9eyR7ZGltZW5zaW9uc319KSAke2NvbXBhcmlzb25PcGVyYXRvcn0gJHthbGFybS50aHJlc2hvbGR9YDtcbiAgICAgIGNhc2UgY2RrLmF3c19jbG91ZHdhdGNoLlRyZWF0TWlzc2luZ0RhdGEuQlJFQUNISU5HOlxuICAgICAgY2FzZSBjZGsuYXdzX2Nsb3Vkd2F0Y2guVHJlYXRNaXNzaW5nRGF0YS5JR05PUkU6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCR7YWxhcm1TdGF0aXN0aWN9KGxhc3RfJHt0b3RhbFBlcmlvZH0ke3VuaXR9KToke2FsYXJtU3RhdGlzdGljfToke21ldHJpY317JHtkaW1lbnNpb25zfX0gJHtjb21wYXJpc29uT3BlcmF0b3J9ICR7YWxhcm0udGhyZXNob2xkfWA7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export * from './watchful';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./watchful"), exports);
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2F0Y2hmdWx2Mi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3dhdGNoZnVsJzsiXX0=