ec2-instance-running-scheduler 0.2.7 → 0.3.1
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.
- package/.jsii +357 -47
- package/API.md +402 -27
- package/README.md +55 -17
- package/assets/funcs/running-scheduler.lambda/index.js +333 -212
- package/assets/funcs/running-scheduler.lambda/index.js.map +4 -4
- package/lib/constructs/ec2-instance-running-scheduler.d.ts +31 -14
- package/lib/constructs/ec2-instance-running-scheduler.js +26 -13
- package/lib/constructs/running-scheduler-failure-detection.d.ts +87 -0
- package/lib/constructs/running-scheduler-failure-detection.js +185 -0
- package/lib/funcs/running-scheduler-predicates.d.ts +24 -24
- package/lib/funcs/running-scheduler-predicates.js +18 -18
- package/lib/funcs/running-scheduler-wait-config.d.ts +17 -0
- package/lib/funcs/running-scheduler-wait-config.js +21 -0
- package/lib/funcs/running-scheduler-wait-env.d.ts +9 -0
- package/lib/funcs/running-scheduler-wait-env.js +54 -0
- package/lib/funcs/running-scheduler.lambda.d.ts +11 -4
- package/lib/funcs/running-scheduler.lambda.js +88 -50
- package/lib/index.d.ts +2 -1
- package/lib/index.js +3 -2
- package/lib/stacks/ec2-instance-running-schedule-stack.d.ts +9 -3
- package/lib/stacks/ec2-instance-running-schedule-stack.js +8 -3
- package/package.json +6 -7
- package/lib/funcs/running-scheduler-polling-config.d.ts +0 -17
- package/lib/funcs/running-scheduler-polling-config.js +0 -21
- package/lib/funcs/running-scheduler-polling-env.d.ts +0 -8
- package/lib/funcs/running-scheduler-polling-env.js +0 -53
|
@@ -14,20 +14,31 @@ const client_ec2_1 = require("@aws-sdk/client-ec2");
|
|
|
14
14
|
const client_resource_groups_tagging_api_1 = require("@aws-sdk/client-resource-groups-tagging-api");
|
|
15
15
|
const web_api_1 = require("@slack/web-api");
|
|
16
16
|
const aws_lambda_secret_fetcher_1 = require("aws-lambda-secret-fetcher");
|
|
17
|
-
const
|
|
18
|
-
const running_scheduler_polling_env_1 = require("./running-scheduler-polling-env");
|
|
17
|
+
const strict_env_resolver_1 = require("strict-env-resolver");
|
|
19
18
|
const running_scheduler_predicates_1 = require("./running-scheduler-predicates");
|
|
19
|
+
const running_scheduler_wait_env_1 = require("./running-scheduler-wait-env");
|
|
20
20
|
/** Mapping of EC2 instance state to display name and emoji for Slack. */
|
|
21
21
|
const STATE_LIST = [
|
|
22
22
|
{ name: 'RUNNING', emoji: '😆', state: 'running' },
|
|
23
23
|
{ name: 'STOPPED', emoji: '😴', state: 'stopped' },
|
|
24
24
|
];
|
|
25
25
|
/**
|
|
26
|
-
* Seconds to wait between
|
|
26
|
+
* Seconds to wait between describe iterations after start/stop or while transitioning.
|
|
27
27
|
*
|
|
28
28
|
* Used with {@link processOneResource} durable `wait` calls between describe iterations.
|
|
29
29
|
*/
|
|
30
30
|
const STATUS_CHANGE_WAIT_SECONDS = 20;
|
|
31
|
+
/**
|
|
32
|
+
* Options passed to {@link secretFetcher.getSecretValue} when loading the Slack secret.
|
|
33
|
+
*
|
|
34
|
+
* Retries cover transient extension HTTP errors (5xx, 429) and the extension
|
|
35
|
+
* "not ready to serve traffic" response during cold starts.
|
|
36
|
+
*/
|
|
37
|
+
const SLACK_SECRET_FETCH_OPTIONS = {
|
|
38
|
+
timeoutMs: 3000,
|
|
39
|
+
retries: 5,
|
|
40
|
+
baseBackoffMs: 300,
|
|
41
|
+
};
|
|
31
42
|
/**
|
|
32
43
|
* Returns display name and emoji for an EC2 instance state.
|
|
33
44
|
*
|
|
@@ -39,22 +50,22 @@ const getStateDisplay = (current) => {
|
|
|
39
50
|
return found ? { emoji: found.emoji, name: found.name } : undefined;
|
|
40
51
|
};
|
|
41
52
|
/**
|
|
42
|
-
* Processes one EC2 instance: describes state, issues start/stop when needed, then
|
|
53
|
+
* Processes one EC2 instance: describes state, issues start/stop when needed, then waits until
|
|
43
54
|
* {@link isDesiredStableState} is satisfied (durable `step` / `wait` between attempts).
|
|
44
55
|
*
|
|
45
|
-
* Each loop iteration checks {@link
|
|
46
|
-
* {@link
|
|
56
|
+
* Each loop iteration checks {@link getWaitAbortReason} before describe. Failures use
|
|
57
|
+
* {@link formatResourceWaitFailure} (`ResourceWaitFailed:*` message prefix).
|
|
47
58
|
*
|
|
48
59
|
* @param ctx - Durable execution context (child context per instance recommended).
|
|
49
60
|
* @param targetResource - EC2 instance ARN.
|
|
50
61
|
* @param params - Scheduler params (`TagKey`, `TagValues`, `Mode`).
|
|
51
62
|
* @param resourceIndex - Index used in durable step names for this resource.
|
|
52
|
-
* @param
|
|
63
|
+
* @param waitLimits - Per-instance caps from {@link parseResourceWaitLimitsFromEnv} (set by the CDK construct).
|
|
53
64
|
* @returns Final resource ARN, EC2 state name, parsed account, region, and instance id.
|
|
54
|
-
* @throws {Error} When
|
|
65
|
+
* @throws {Error} When wait limits are exceeded (`MaxLoopCountExceeded`, `MaxElapsedTimeExceeded`),
|
|
55
66
|
* the instance is in an unexpected state (`UnexpectedInstanceState`), or the loop exits without a stable goal state.
|
|
56
67
|
*/
|
|
57
|
-
const processOneResource = async (ctx, targetResource, params, resourceIndex,
|
|
68
|
+
const processOneResource = async (ctx, targetResource, params, resourceIndex, waitLimits) => {
|
|
58
69
|
const parts = targetResource.split('/');
|
|
59
70
|
const identifier = parts[parts.length - 1] ?? 'unknown';
|
|
60
71
|
const arnParts = targetResource.split(':');
|
|
@@ -67,29 +78,29 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, po
|
|
|
67
78
|
region,
|
|
68
79
|
account,
|
|
69
80
|
mode: params.Mode,
|
|
70
|
-
maxLoopCount:
|
|
71
|
-
maxElapsedSeconds:
|
|
81
|
+
maxLoopCount: waitLimits.maxLoopCount,
|
|
82
|
+
maxElapsedSeconds: waitLimits.maxElapsedSeconds,
|
|
72
83
|
});
|
|
73
|
-
const startedAtMs = await ctx.step(`${stepPrefix}-
|
|
84
|
+
const startedAtMs = await ctx.step(`${stepPrefix}-wait-started-at`, async () => Date.now());
|
|
74
85
|
let loopCount = 0;
|
|
75
86
|
let currentState = '';
|
|
76
87
|
do {
|
|
77
|
-
const abortReason = await ctx.step(`${stepPrefix}-
|
|
88
|
+
const abortReason = await ctx.step(`${stepPrefix}-wait-limit-check-${loopCount}`, async () => (0, running_scheduler_predicates_1.getWaitAbortReason)(loopCount, startedAtMs, Date.now(), waitLimits));
|
|
78
89
|
if (abortReason) {
|
|
79
|
-
const message = (0, running_scheduler_predicates_1.
|
|
90
|
+
const message = (0, running_scheduler_predicates_1.formatResourceWaitFailure)(abortReason, {
|
|
80
91
|
identifier,
|
|
81
92
|
mode: params.Mode,
|
|
82
93
|
currentState: currentState || 'unknown',
|
|
83
94
|
loopCount,
|
|
84
|
-
limits:
|
|
95
|
+
limits: waitLimits,
|
|
85
96
|
});
|
|
86
|
-
ctx.logger.error('processOneResource:
|
|
97
|
+
ctx.logger.error('processOneResource: wait limit exceeded', {
|
|
87
98
|
identifier,
|
|
88
99
|
abortReason,
|
|
89
100
|
loopCount,
|
|
90
101
|
currentState,
|
|
91
|
-
maxLoopCount:
|
|
92
|
-
maxElapsedSeconds:
|
|
102
|
+
maxLoopCount: waitLimits.maxLoopCount,
|
|
103
|
+
maxElapsedSeconds: waitLimits.maxElapsedSeconds,
|
|
93
104
|
});
|
|
94
105
|
throw new Error(message);
|
|
95
106
|
}
|
|
@@ -146,12 +157,12 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, po
|
|
|
146
157
|
loopCount += 1;
|
|
147
158
|
continue;
|
|
148
159
|
}
|
|
149
|
-
const message = (0, running_scheduler_predicates_1.
|
|
160
|
+
const message = (0, running_scheduler_predicates_1.formatResourceWaitFailure)('UnexpectedInstanceState', {
|
|
150
161
|
identifier,
|
|
151
162
|
mode,
|
|
152
163
|
currentState,
|
|
153
164
|
loopCount,
|
|
154
|
-
limits:
|
|
165
|
+
limits: waitLimits,
|
|
155
166
|
});
|
|
156
167
|
ctx.logger.error('processOneResource: unexpected state', {
|
|
157
168
|
identifier,
|
|
@@ -183,16 +194,23 @@ const processOneResource = async (ctx, targetResource, params, resourceIndex, po
|
|
|
183
194
|
* in parallel (bounded concurrency), posts a parent Slack message and per-instance thread replies,
|
|
184
195
|
* and uses durable `step` / `wait` / `map` so the run can resume across suspensions.
|
|
185
196
|
*
|
|
186
|
-
* Reads per-instance
|
|
187
|
-
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS` via {@link
|
|
197
|
+
* Reads per-instance wait limits from `PROCESS_RESOURCE_MAX_LOOP_COUNT` and
|
|
198
|
+
* `PROCESS_RESOURCE_MAX_ELAPSED_SECONDS` via {@link parseResourceWaitLimitsFromEnv}.
|
|
199
|
+
* Loads the Slack secret via {@link secretFetcher} (Parameters and Secrets Lambda Extension).
|
|
200
|
+
* Slack API failures are logged as `running-scheduler: Slack post failed` for CloudWatch log filters.
|
|
188
201
|
*
|
|
189
202
|
* @param event - Payload from EventBridge Scheduler; must include `Params.TagKey`, `Params.TagValues`, `Params.Mode`.
|
|
190
203
|
* @param ctx - Root durable execution context.
|
|
191
204
|
* @returns
|
|
192
205
|
* - `{ status: 'TargetResourcesNotFound' }` when no instances match the tag filter.
|
|
193
206
|
* - `{ status: 'Completed', processed, results }` when instances were handled (`results` entries match {@link processOneResource} return shape).
|
|
194
|
-
* @throws {Error} If `Params` is invalid,
|
|
195
|
-
* the Slack secret is incomplete,
|
|
207
|
+
* @throws {Error} If `Params` is invalid, wait env vars are not positive integers,
|
|
208
|
+
* the Slack secret is incomplete, instance processing fails (including `ResourceWaitFailed:*` errors),
|
|
209
|
+
* or the secret cannot be read from the extension (e.g. outside Lambda or missing `AWS_SESSION_TOKEN`).
|
|
210
|
+
* @throws {import('strict-env-resolver').StrictEnvValidationError} When required env vars are missing or not valid numbers.
|
|
211
|
+
* @throws {import('fetch-retrier').FetchRetrierHttpError} When the extension returns a non-retriable HTTP error.
|
|
212
|
+
* @throws {import('fetch-retrier').FetchRetrierNetworkError} When extension requests fail at the network level.
|
|
213
|
+
* @throws {import('fetch-retrier').FetchRetrierAbortError} When extension requests time out after all retries.
|
|
196
214
|
*/
|
|
197
215
|
exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (event, ctx) => {
|
|
198
216
|
const params = event.Params;
|
|
@@ -204,12 +222,11 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
204
222
|
if (!params?.TagKey || !params?.TagValues || !params?.Mode) {
|
|
205
223
|
throw new Error('Invalid event: Params.TagKey, Params.TagValues, Params.Mode are required.');
|
|
206
224
|
}
|
|
207
|
-
const
|
|
208
|
-
|
|
209
|
-
const slackSecretName = safe_env_getter_1.SafeEnvGetter.getEnv('SLACK_SECRET_NAME');
|
|
225
|
+
const waitLimits = (0, running_scheduler_wait_env_1.parseResourceWaitLimitsFromEnv)();
|
|
226
|
+
const slackSecretName = strict_env_resolver_1.StrictEnvResolver.resolve('SLACK_SECRET_NAME', strict_env_resolver_1.StrictEnvType.String);
|
|
210
227
|
const slackSecretValue = await ctx.step('fetch-slack-secret', async () => {
|
|
211
228
|
ctx.logger.info('running-scheduler: fetching Slack secret', { secretName: slackSecretName });
|
|
212
|
-
return aws_lambda_secret_fetcher_1.secretFetcher.getSecretValue(slackSecretName);
|
|
229
|
+
return aws_lambda_secret_fetcher_1.secretFetcher.getSecretValue(slackSecretName, SLACK_SECRET_FETCH_OPTIONS);
|
|
213
230
|
});
|
|
214
231
|
ctx.logger.info('running-scheduler: Slack secret loaded');
|
|
215
232
|
if (!slackSecretValue?.token || !slackSecretValue?.channel) {
|
|
@@ -238,10 +255,20 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
238
255
|
});
|
|
239
256
|
// send slack message
|
|
240
257
|
const slackParentMessageResult = await ctx.step('post-slack-messages', async () => {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
258
|
+
try {
|
|
259
|
+
return await client.chat.postMessage({
|
|
260
|
+
channel,
|
|
261
|
+
text: `${params.Mode === 'Start' ? '😆 Starts' : '🥱 Stops'} the scheduled EC2 Instance.`,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
ctx.logger.error('running-scheduler: Slack post failed', {
|
|
266
|
+
step: 'post-slack-messages',
|
|
267
|
+
channel,
|
|
268
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
269
|
+
});
|
|
270
|
+
throw error;
|
|
271
|
+
}
|
|
245
272
|
});
|
|
246
273
|
ctx.logger.info('running-scheduler: parent Slack message posted', {
|
|
247
274
|
threadTs: slackParentMessageResult?.ts ?? null,
|
|
@@ -257,7 +284,7 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
257
284
|
// ),
|
|
258
285
|
async (mapCtx, targetResource, index) => {
|
|
259
286
|
return mapCtx.runInChildContext(`resource-${index}`, async (childCtx) => {
|
|
260
|
-
const result = await processOneResource(childCtx, targetResource, params, index,
|
|
287
|
+
const result = await processOneResource(childCtx, targetResource, params, index, waitLimits);
|
|
261
288
|
// if (result.status === 'skipped') {
|
|
262
289
|
// return result;
|
|
263
290
|
// }
|
|
@@ -269,22 +296,33 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
269
296
|
// send slack thread message
|
|
270
297
|
await childCtx.step('post-slack-child-messages', async () => {
|
|
271
298
|
const display = getStateDisplay(result.status);
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
299
|
+
try {
|
|
300
|
+
return await client.chat.postMessage({
|
|
301
|
+
channel,
|
|
302
|
+
thread_ts: slackParentMessageResult?.ts,
|
|
303
|
+
attachments: [
|
|
304
|
+
{
|
|
305
|
+
color: '#36a64f',
|
|
306
|
+
pretext: `${display?.emoji} The status of the EC2 Instance ${result.identifier} changed to ${display?.name} due to the schedule.`,
|
|
307
|
+
fields: [
|
|
308
|
+
{ title: 'Account', value: result.account, short: true },
|
|
309
|
+
{ title: 'Region', value: result.region, short: true },
|
|
310
|
+
{ title: 'Identifier', value: result.identifier, short: true },
|
|
311
|
+
{ title: 'Status', value: (display?.name ?? 'Unknown'), short: true },
|
|
312
|
+
],
|
|
313
|
+
},
|
|
314
|
+
],
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
childCtx.logger.error('running-scheduler: Slack post failed', {
|
|
319
|
+
step: 'post-slack-child-messages',
|
|
320
|
+
channel,
|
|
321
|
+
identifier: result.identifier,
|
|
322
|
+
errorMessage: error instanceof Error ? error.message : String(error),
|
|
323
|
+
});
|
|
324
|
+
throw error;
|
|
325
|
+
}
|
|
288
326
|
});
|
|
289
327
|
return result;
|
|
290
328
|
});
|
|
@@ -300,4 +338,4 @@ exports.handler = (0, durable_execution_sdk_js_1.withDurableExecution)(async (ev
|
|
|
300
338
|
results: resultList,
|
|
301
339
|
};
|
|
302
340
|
});
|
|
303
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUEwRDtBQUMxRCxxREFBZ0Q7QUFDaEQsbUZBQW9GO0FBQ3BGLGlGQU13QztBQUV4Qyx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUc7SUFDakIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQzFDLENBQUM7QUFFWDs7OztHQUlHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUEyQnRDOzs7OztHQUtHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxPQUFlLEVBQStDLEVBQUU7SUFDdkYsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQztJQUMxRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDdEUsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLEVBQzlCLEdBQW1CLEVBQ25CLGNBQXNCLEVBQ3RCLE1BQWdDLEVBQ2hDLGFBQXFCLEVBQ3JC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QzlDLFNBQVMsRUFBRSxlQUFlLENBQUMsTUFBTTtRQUNqQyxXQUFXLEVBQUUsVUFBVSxDQUFDLE1BQU07S0FDL0IsQ0FBQyxDQUFDO0lBQ0gsT0FBTztRQUNMLE1BQU0sRUFBRSxXQUFvQjtRQUM1QixTQUFTLEVBQUUsZUFBZSxDQUFDLE1BQU07UUFDakMsT0FBTyxFQUFFLFVBQVU7S0FDcEIsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFQzIgUnVubmluZyBTY2hlZHVsZXIg4oCTIER1cmFibGUgRnVuY3Rpb25zIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEltcGxlbWVudHMgdGhlIHJ1bm5pbmctY29udHJvbCBmbG93IHVzaW5nIEFXUyBMYW1iZGEgRHVyYWJsZSBFeGVjdXRpb24uXG4gKiBTdGVwIGNoZWNrcG9pbnRzLCB3YWl0IChubyBjaGFyZ2UpLCBhbmQgcGFyYWxsZWwgbWFwIHByb3ZpZGUgYSBmbG93IGVxdWl2YWxlbnQgdG8gU3RlcCBGdW5jdGlvbnMuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2xhdGVzdC9kZy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGsuaHRtbFxuICovXG5cbmltcG9ydCB7IHdpdGhEdXJhYmxlRXhlY3V0aW9uLCB0eXBlIER1cmFibGVDb250ZXh0IH0gZnJvbSAnQGF3cy9kdXJhYmxlLWV4ZWN1dGlvbi1zZGstanMnO1xuaW1wb3J0IHtcbiAgRUMyQ2xpZW50LFxuICBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQsXG4gIFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCxcbiAgU3RvcEluc3RhbmNlc0NvbW1hbmQsXG59IGZyb20gJ0Bhd3Mtc2RrL2NsaWVudC1lYzInO1xuaW1wb3J0IHsgR2V0UmVzb3VyY2VzQ29tbWFuZCwgUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXJlc291cmNlLWdyb3Vwcy10YWdnaW5nLWFwaSc7XG5pbXBvcnQgeyBXZWJDbGllbnQgfSBmcm9tICdAc2xhY2svd2ViLWFwaSc7XG5pbXBvcnQgeyBzZWNyZXRGZXRjaGVyIH0gZnJvbSAnYXdzLWxhbWJkYS1zZWNyZXQtZmV0Y2hlcic7XG5pbXBvcnQgeyBTYWZlRW52R2V0dGVyIH0gZnJvbSAnc2FmZS1lbnYtZ2V0dGVyJztcbmltcG9ydCB7IHBhcnNlUmVzb3VyY2VQb2xsaW5nTGltaXRzRnJvbUVudiB9IGZyb20gJy4vcnVubmluZy1zY2hlZHVsZXItcG9sbGluZy1lbnYnO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZSxcbiAgZ2V0UG9sbGluZ0Fib3J0UmVhc29uLFxuICBpc0Rlc2lyZWRTdGFibGVTdGF0ZSxcbiAgaXNUcmFuc2l0aW9uaW5nU3RhdGUsXG4gIHR5cGUgUmVzb3VyY2VQb2xsaW5nTGltaXRzLFxufSBmcm9tICcuL3J1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMnO1xuXG4vKiogTWFwcGluZyBvZiBFQzIgaW5zdGFuY2Ugc3RhdGUgdG8gZGlzcGxheSBuYW1lIGFuZCBlbW9qaSBmb3IgU2xhY2suICovXG5jb25zdCBTVEFURV9MSVNUID0gW1xuICB7IG5hbWU6ICdSVU5OSU5HJywgZW1vamk6ICfwn5iGJywgc3RhdGU6ICdydW5uaW5nJyB9LFxuICB7IG5hbWU6ICdTVE9QUEVEJywgZW1vamk6ICfwn5i0Jywgc3RhdGU6ICdzdG9wcGVkJyB9LFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBTZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiBwb2xsaW5nIGluc3RhbmNlIHN0YXRlIGFmdGVyIHN0YXJ0L3N0b3Agb3Igd2hpbGUgdHJhbnNpdGlvbmluZy5cbiAqXG4gKiBVc2VkIHdpdGgge0BsaW5rIHByb2Nlc3NPbmVSZXNvdXJjZX0gZHVyYWJsZSBgd2FpdGAgY2FsbHMgYmV0d2VlbiBkZXNjcmliZSBpdGVyYXRpb25zLlxuICovXG5jb25zdCBTVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EUyA9IDIwO1xuXG4vKipcbiAqIEV2ZW50IHBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXIgaW52b2tpbmcgdGhpcyBMYW1iZGEuXG4gKlxuICogQHNlZSB7QGxpbmsgaGFuZGxlcn1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJFdmVudCB7XG4gIC8qKiBTY2hlZHVsZXIgaW52b2NhdGlvbiBwYXJhbWV0ZXJzICh0YWcgZmlsdGVyIGFuZCBzdGFydC9zdG9wIG1vZGUpLiAqL1xuICBQYXJhbXM6IHtcbiAgICAvKiogVGFnIGtleSB1c2VkIHRvIHNlbGVjdCBFQzIgaW5zdGFuY2VzLiAqL1xuICAgIFRhZ0tleTogc3RyaW5nO1xuICAgIC8qKiBUYWcgdmFsdWVzIHRvIG1hdGNoLiAqL1xuICAgIFRhZ1ZhbHVlczogc3RyaW5nW107XG4gICAgLyoqIFdoZXRoZXIgdG8gc3RhcnQgb3Igc3RvcCBpbnN0YW5jZXMuICovXG4gICAgTW9kZTogJ1N0YXJ0JyB8ICdTdG9wJztcbiAgfTtcbn1cblxuLyoqIFNsYWNrIGNyZWRlbnRpYWxzIGFuZCBkZWZhdWx0IGNoYW5uZWwgbG9hZGVkIGZyb20gU2VjcmV0cyBNYW5hZ2VyIChgU0xBQ0tfU0VDUkVUX05BTUVgKS4gKi9cbmludGVyZmFjZSBTbGFja1NlY3JldCB7XG4gIC8qKiBTbGFjayBib3QgdG9rZW4gZm9yIHRoZSBTbGFjayBgV2ViQ2xpZW50YC4gKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIENoYW5uZWwgSUQgb3IgbmFtZSBwYXNzZWQgdG8gYGNoYXQucG9zdE1lc3NhZ2VgLiAqL1xuICBjaGFubmVsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmV0dXJucyBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBhbiBFQzIgaW5zdGFuY2Ugc3RhdGUuXG4gKlxuICogQHBhcmFtIGN1cnJlbnQgLSBDdXJyZW50IGluc3RhbmNlIHN0YXRlIChlLmcuICdydW5uaW5nJywgJ3N0b3BwZWQnKS5cbiAqIEByZXR1cm5zIERpc3BsYXkgaW5mbyBvciB1bmRlZmluZWQgaWYgc3RhdGUgaXMgbm90IGluIFNUQVRFX0xJU1QuXG4gKi9cbmNvbnN0IGdldFN0YXRlRGlzcGxheSA9IChjdXJyZW50OiBzdHJpbmcpOiB7IGVtb2ppOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9IHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3QgZm91bmQgPSBTVEFURV9MSVNULmZpbmQoKHMpID0+IHMuc3RhdGUgPT09IGN1cnJlbnQpO1xuICByZXR1cm4gZm91bmQgPyB7IGVtb2ppOiBmb3VuZC5lbW9qaSwgbmFtZTogZm91bmQubmFtZSB9IDogdW5kZWZpbmVkO1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgb25lIEVDMiBpbnN0YW5jZTogZGVzY3JpYmVzIHN0YXRlLCBpc3N1ZXMgc3RhcnQvc3RvcCB3aGVuIG5lZWRlZCwgdGhlbiBwb2xscyB1bnRpbFxuICoge0BsaW5rIGlzRGVzaXJlZFN0YWJsZVN0YXRlfSBpcyBzYXRpc2ZpZWQgKGR1cmFibGUgYHN0ZXBgIC8gYHdhaXRgIGJldHdlZW4gYXR0ZW1wdHMpLlxuICpcbiAqIEVhY2ggbG9vcCBpdGVyYXRpb24gY2hlY2tzIHtAbGluayBnZXRQb2xsaW5nQWJvcnRSZWFzb259IGJlZm9yZSBkZXNjcmliZS4gRmFpbHVyZXMgdXNlXG4gKiB7QGxpbmsgZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZX0gKGBSZXNvdXJjZVBvbGxpbmdGYWlsZWQ6KmAgbWVzc2FnZSBwcmVmaXgpLlxuICpcbiAqIEBwYXJhbSBjdHggLSBEdXJhYmxlIGV4ZWN1dGlvbiBjb250ZXh0IChjaGlsZCBjb250ZXh0IHBlciBpbnN0YW5jZSByZWNvbW1lbmRlZCkuXG4gKiBAcGFyYW0gdGFyZ2V0UmVzb3VyY2UgLSBFQzIgaW5zdGFuY2UgQVJOLlxuICogQHBhcmFtIHBhcmFtcyAtIFNjaGVkdWxlciBwYXJhbXMgKGBUYWdLZXlgLCBgVGFnVmFsdWVzYCwgYE1vZGVgKS5cbiAqIEBwYXJhbSByZXNvdXJjZUluZGV4IC0gSW5kZXggdXNlZCBpbiBkdXJhYmxlIHN0ZXAgbmFtZXMgZm9yIHRoaXMgcmVzb3VyY2UuXG4gKiBAcGFyYW0gcG9sbGluZ0xpbWl0cyAtIFBlci1pbnN0YW5jZSBjYXBzIGZyb20ge0BsaW5rIHBhcnNlUmVzb3VyY2VQb2xsaW5nTGltaXRzRnJvbUVudn0gKHNldCBieSB0aGUgQ0RLIGNvbnN0cnVjdCkuXG4gKiBAcmV0dXJucyBGaW5hbCByZXNvdXJjZSBBUk4sIEVDMiBzdGF0ZSBuYW1lLCBwYXJzZWQgYWNjb3VudCwgcmVnaW9uLCBhbmQgaW5zdGFuY2UgaWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gV2hlbiBwb2xsaW5nIGxpbWl0cyBhcmUgZXhjZWVkZWQgKGBNYXhMb29wQ291bnRFeGNlZWRlZGAsIGBNYXhFbGFwc2VkVGltZUV4Y2VlZGVkYCksXG4gKiAgIHRoZSBpbnN0YW5jZSBpcyBpbiBhbiB1bmV4cGVjdGVkIHN0YXRlIChgVW5leHBlY3RlZEluc3RhbmNlU3RhdGVgKSwgb3IgdGhlIGxvb3AgZXhpdHMgd2l0aG91dCBhIHN0YWJsZSBnb2FsIHN0YXRlLlxuICovXG5jb25zdCBwcm9jZXNzT25lUmVzb3VyY2UgPSBhc3luYyAoXG4gIGN0eDogRHVyYWJsZUNvbnRleHQsXG4gIHRhcmdldFJlc291cmNlOiBzdHJpbmcsXG4gIHBhcmFtczogU2NoZWR1bGVyRXZlbnRbJ1BhcmFtcyddLFxuICByZXNvdXJjZUluZGV4OiBudW1iZXIsXG4gIHBvbGxpbmdMaW1pdHM6IFJlc291cmNlUG9sbGluZ0xpbWl0cyxcbik6IFByb21pc2U8eyByZXNvdXJjZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgYWNjb3VudDogc3RyaW5nOyByZWdpb246IHN0cmluZzsgaWRlbnRpZmllcjogc3RyaW5nIH0+ID0+IHtcbiAgY29uc3QgcGFydHMgPSB0YXJnZXRSZXNvdXJjZS5zcGxpdCgnLycpO1xuICBjb25zdCBpZGVudGlmaWVyID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0gPz8gJ3Vua25vd24nO1xuICBjb25zdCBhcm5QYXJ0cyA9IHRhcmdldFJlc291cmNlLnNwbGl0KCc6Jyk7XG4gIGNvbnN0IGFjY291bnQgPSBhcm5QYXJ0c1s0XSA/PyAnJztcbiAgY29uc3QgcmVnaW9uID0gYXJuUGFydHNbM10gPz8gJyc7XG4gIGNvbnN0IHN0ZXBQcmVmaXggPSBgcmVzb3VyY2UtJHtyZXNvdXJjZUluZGV4fS0ke2lkZW50aWZpZXJ9YDtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RhcnQnLCB7XG4gICAgcmVzb3VyY2VJbmRleCxcbiAgICBpZGVudGlmaWVyLFxuICAgIHJlZ2lvbixcbiAgICBhY2NvdW50LFxuICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIG1heExvb3BDb3VudDogcG9sbGluZ0xpbWl0cy5tYXhMb29wQ291bnQsXG4gICAgbWF4RWxhcHNlZFNlY29uZHM6IHBvbGxpbmdMaW1pdHMubWF4RWxhcHNlZFNlY29uZHMsXG4gIH0pO1xuXG4gIGNvbnN0IHN0YXJ0ZWRBdE1zID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tcG9sbGluZy1zdGFydGVkLWF0YCwgYXN5bmMgKCkgPT4gRGF0ZS5ub3coKSk7XG5cbiAgbGV0IGxvb3BDb3VudCA9IDA7XG4gIGxldCBjdXJyZW50U3RhdGUgPSAnJztcbiAgZG8ge1xuICAgIGNvbnN0IGFib3J0UmVhc29uID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tcG9sbC1saW1pdC1jaGVjay0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PlxuICAgICAgZ2V0UG9sbGluZ0Fib3J0UmVhc29uKGxvb3BDb3VudCwgc3RhcnRlZEF0TXMsIERhdGUubm93KCksIHBvbGxpbmdMaW1pdHMpLFxuICAgICk7XG4gICAgaWYgKGFib3J0UmVhc29uKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZm9ybWF0UmVzb3VyY2VQb2xsaW5nRmFpbHVyZShhYm9ydFJlYXNvbiwge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICAgICAgY3VycmVudFN0YXRlOiBjdXJyZW50U3RhdGUgfHwgJ3Vua25vd24nLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGxpbWl0czogcG9sbGluZ0xpbWl0cyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiBwb2xsaW5nIGxpbWl0IGV4Y2VlZGVkJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBhYm9ydFJlYXNvbixcbiAgICAgICAgbG9vcENvdW50LFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIG1heExvb3BDb3VudDogcG9sbGluZ0xpbWl0cy5tYXhMb29wQ291bnQsXG4gICAgICAgIG1heEVsYXBzZWRTZWNvbmRzOiBwb2xsaW5nTGltaXRzLm1heEVsYXBzZWRTZWNvbmRzLFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgY3VycmVudFN0YXRlID0gYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tZGVzY3JpYmUtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICBjb25zdCBvdXQgPSBhd2FpdCBlYzIuc2VuZChuZXcgRGVzY3JpYmVJbnN0YW5jZXNDb21tYW5kKHsgSW5zdGFuY2VJZHM6IFtpZGVudGlmaWVyXSB9KSk7XG4gICAgICByZXR1cm4gb3V0LlJlc2VydmF0aW9ucz8uWzBdPy5JbnN0YW5jZXM/LlswXT8uU3RhdGU/Lk5hbWUgPz8gJ3Vua25vd24nO1xuICAgIH0pO1xuXG4gICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IGRlc2NyaWJlZCcsIHtcbiAgICAgIGlkZW50aWZpZXIsXG4gICAgICBsb29wQ291bnQsXG4gICAgICBjdXJyZW50U3RhdGUsXG4gICAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZGUgPSBwYXJhbXMuTW9kZTtcblxuICAgIGlmIChtb2RlID09PSAnU3RhcnQnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3N0b3BwZWQnKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RhcnRpbmcgaW5zdGFuY2UnLCB7IGlkZW50aWZpZXIsIGxvb3BDb3VudCB9KTtcbiAgICAgIGF3YWl0IGN0eC5zdGVwKGAke3N0ZXBQcmVmaXh9LXN0YXJ0LSR7bG9vcENvdW50fWAsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZWMyID0gbmV3IEVDMkNsaWVudCh7fSk7XG4gICAgICAgIGF3YWl0IGVjMi5zZW5kKG5ldyBTdGFydEluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgYWZ0ZXIgc3RhcnQnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgbG9vcENvdW50ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobW9kZSA9PT0gJ1N0b3AnICYmIGN1cnJlbnRTdGF0ZSA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogc3RvcHBpbmcgaW5zdGFuY2UnLCB7IGlkZW50aWZpZXIsIGxvb3BDb3VudCB9KTtcbiAgICAgIGF3YWl0IGN0eC5zdGVwKGAke3N0ZXBQcmVmaXh9LXN0b3AtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0b3BJbnN0YW5jZXNDb21tYW5kKHsgSW5zdGFuY2VJZHM6IFtpZGVudGlmaWVyXSB9KSk7XG4gICAgICB9KTtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiB3YWl0IGFmdGVyIHN0b3AnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTLFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgbG9vcENvdW50ICs9IDE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIWlzRGVzaXJlZFN0YWJsZVN0YXRlKG1vZGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgIGlmIChpc1RyYW5zaXRpb25pbmdTdGF0ZShtb2RlLCBjdXJyZW50U3RhdGUpKSB7XG4gICAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiB3YWl0IHdoaWxlIHRyYW5zaXRpb25pbmcnLCB7XG4gICAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgICBsb29wQ291bnQsXG4gICAgICAgICAgY3VycmVudFN0YXRlLFxuICAgICAgICAgIG1vZGUsXG4gICAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBjdHgud2FpdCh7IHNlY29uZHM6IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTIH0pO1xuICAgICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRSZXNvdXJjZVBvbGxpbmdGYWlsdXJlKCdVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZScsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgbW9kZSxcbiAgICAgICAgY3VycmVudFN0YXRlLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGxpbWl0czogcG9sbGluZ0xpbWl0cyxcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5lcnJvcigncHJvY2Vzc09uZVJlc291cmNlOiB1bmV4cGVjdGVkIHN0YXRlJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgfSB3aGlsZSAoIWlzRGVzaXJlZFN0YWJsZVN0YXRlKHBhcmFtcy5Nb2RlLCBjdXJyZW50U3RhdGUpKTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogcmVhY2hlZCBkZXNpcmVkIHN0YWJsZSBzdGF0ZScsIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIGZpbmFsU3RhdGU6IGN1cnJlbnRTdGF0ZSxcbiAgICBtb2RlOiBwYXJhbXMuTW9kZSxcbiAgICBsb29wQ291bnQsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaWRlbnRpZmllcixcbiAgICBhY2NvdW50LFxuICAgIHJlZ2lvbixcbiAgICByZXNvdXJjZTogdGFyZ2V0UmVzb3VyY2UsXG4gICAgc3RhdHVzOiBjdXJyZW50U3RhdGUsXG4gIH07XG59O1xuXG4vKipcbiAqIER1cmFibGUgTGFtYmRhIGVudHJ5IHBvaW50IGZvciB0aGUgRUMyIHJ1bm5pbmcgc2NoZWR1bGVyLlxuICpcbiAqIFJlc29sdmVzIGluc3RhbmNlcyB2aWEgUmVzb3VyY2UgR3JvdXBzIFRhZ2dpbmcgQVBJLCBydW5zIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9IGZvciBlYWNoIEFSTlxuICogaW4gcGFyYWxsZWwgKGJvdW5kZWQgY29uY3VycmVuY3kpLCBwb3N0cyBhIHBhcmVudCBTbGFjayBtZXNzYWdlIGFuZCBwZXItaW5zdGFuY2UgdGhyZWFkIHJlcGxpZXMsXG4gKiBhbmQgdXNlcyBkdXJhYmxlIGBzdGVwYCAvIGB3YWl0YCAvIGBtYXBgIHNvIHRoZSBydW4gY2FuIHJlc3VtZSBhY3Jvc3Mgc3VzcGVuc2lvbnMuXG4gKlxuICogUmVhZHMgcGVyLWluc3RhbmNlIHBvbGxpbmcgbGltaXRzIGZyb20gYFBST0NFU1NfUkVTT1VSQ0VfTUFYX0xPT1BfQ09VTlRgIGFuZFxuICogYFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU2AgdmlhIHtAbGluayBwYXJzZVJlc291cmNlUG9sbGluZ0xpbWl0c0Zyb21FbnZ9LlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFBheWxvYWQgZnJvbSBFdmVudEJyaWRnZSBTY2hlZHVsZXI7IG11c3QgaW5jbHVkZSBgUGFyYW1zLlRhZ0tleWAsIGBQYXJhbXMuVGFnVmFsdWVzYCwgYFBhcmFtcy5Nb2RlYC5cbiAqIEBwYXJhbSBjdHggLSBSb290IGR1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQuXG4gKiBAcmV0dXJuc1xuICogLSBgeyBzdGF0dXM6ICdUYXJnZXRSZXNvdXJjZXNOb3RGb3VuZCcgfWAgd2hlbiBubyBpbnN0YW5jZXMgbWF0Y2ggdGhlIHRhZyBmaWx0ZXIuXG4gKiAtIGB7IHN0YXR1czogJ0NvbXBsZXRlZCcsIHByb2Nlc3NlZCwgcmVzdWx0cyB9YCB3aGVuIGluc3RhbmNlcyB3ZXJlIGhhbmRsZWQgKGByZXN1bHRzYCBlbnRyaWVzIG1hdGNoIHtAbGluayBwcm9jZXNzT25lUmVzb3VyY2V9IHJldHVybiBzaGFwZSkuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYFBhcmFtc2AgaXMgaW52YWxpZCwgcG9sbGluZyBlbnYgdmFycyBhcmUgaW52YWxpZCwgYFNMQUNLX1NFQ1JFVF9OQU1FYCBpcyB1bnNldCxcbiAqICAgdGhlIFNsYWNrIHNlY3JldCBpcyBpbmNvbXBsZXRlLCBvciBpbnN0YW5jZSBwcm9jZXNzaW5nIGZhaWxzIChpbmNsdWRpbmcgYFJlc291cmNlUG9sbGluZ0ZhaWxlZDoqYCBlcnJvcnMpLlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IHdpdGhEdXJhYmxlRXhlY3V0aW9uKGFzeW5jIChldmVudDogU2NoZWR1bGVyRXZlbnQsIGN0eDogRHVyYWJsZUNvbnRleHQpID0+IHtcblxuICBjb25zdCBwYXJhbXMgPSBldmVudC5QYXJhbXM7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogaW52b2NhdGlvbicsIHtcbiAgICBtb2RlOiBwYXJhbXM/Lk1vZGUsXG4gICAgdGFnS2V5OiBwYXJhbXM/LlRhZ0tleSxcbiAgICB0YWdWYWx1ZUNvdW50OiBwYXJhbXM/LlRhZ1ZhbHVlcz8ubGVuZ3RoID8/IDAsXG4gIH0pO1xuXG4gIGlmICghcGFyYW1zPy5UYWdLZXkgfHwgIXBhcmFtcz8uVGFnVmFsdWVzIHx8ICFwYXJhbXM/Lk1vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQ6IFBhcmFtcy5UYWdLZXksIFBhcmFtcy5UYWdWYWx1ZXMsIFBhcmFtcy5Nb2RlIGFyZSByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIGNvbnN0IHBvbGxpbmdMaW1pdHMgPSBwYXJzZVJlc291cmNlUG9sbGluZ0xpbWl0c0Zyb21FbnYoKTtcblxuICAvLyBzYWZlIGdldCBTZWNyZXRzIG5hbWUgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZVxuICBjb25zdCBzbGFja1NlY3JldE5hbWUgPSBTYWZlRW52R2V0dGVyLmdldEVudignU0xBQ0tfU0VDUkVUX05BTUUnKTtcblxuICBjb25zdCBzbGFja1NlY3JldFZhbHVlID0gYXdhaXQgY3R4LnN0ZXAoJ2ZldGNoLXNsYWNrLXNlY3JldCcsIGFzeW5jICgpID0+IHtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBmZXRjaGluZyBTbGFjayBzZWNyZXQnLCB7IHNlY3JldE5hbWU6IHNsYWNrU2VjcmV0TmFtZSB9KTtcbiAgICByZXR1cm4gc2VjcmV0RmV0Y2hlci5nZXRTZWNyZXRWYWx1ZTxTbGFja1NlY3JldD4oc2xhY2tTZWNyZXROYW1lKTtcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogU2xhY2sgc2VjcmV0IGxvYWRlZCcpO1xuXG4gIGlmICghc2xhY2tTZWNyZXRWYWx1ZT8udG9rZW4gfHwgIXNsYWNrU2VjcmV0VmFsdWU/LmNoYW5uZWwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NsYWNrIHNlY3JldCBtdXN0IGNvbnRhaW4gdG9rZW4gYW5kIGNoYW5uZWwuJyk7XG4gIH1cblxuICBjb25zdCB0YXJnZXRSZXNvdXJjZXMgPSBhd2FpdCBjdHguc3RlcCgnZ2V0LXRhcmdldC1yZXNvdXJjZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSUNsaWVudCh7fSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnNlbmQoXG4gICAgICBuZXcgR2V0UmVzb3VyY2VzQ29tbWFuZCh7XG4gICAgICAgIFJlc291cmNlVHlwZUZpbHRlcnM6IFsnZWMyOmluc3RhbmNlJ10sXG4gICAgICAgIFRhZ0ZpbHRlcnM6IFt7IEtleTogcGFyYW1zLlRhZ0tleSwgVmFsdWVzOiBwYXJhbXMuVGFnVmFsdWVzIH1dLFxuICAgICAgfSksXG4gICAgKTtcbiAgICBjb25zdCBhcm5zID0gKHJlc3VsdC5SZXNvdXJjZVRhZ01hcHBpbmdMaXN0ID8/IFtdKVxuICAgICAgLm1hcCgobTogeyBSZXNvdXJjZUFSTj86IHN0cmluZyB9KSA9PiBtLlJlc291cmNlQVJOKVxuICAgICAgLmZpbHRlcigoYXJuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBhcm4gaXMgc3RyaW5nID0+IGFybiAhPSBudWxsKTtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBnZXQtdGFyZ2V0LXJlc291cmNlcyBkb25lJywgeyBjb3VudDogYXJucy5sZW5ndGggfSk7XG4gICAgcmV0dXJuIGFybnM7XG4gIH0pO1xuXG4gIGlmICh0YXJnZXRSZXNvdXJjZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogbm8gbWF0Y2hpbmcgaW5zdGFuY2VzJywgeyB0YWdLZXk6IHBhcmFtcy5UYWdLZXkgfSk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiAnVGFyZ2V0UmVzb3VyY2VzTm90Rm91bmQnIGFzIGNvbnN0IH07XG4gIH1cblxuICBjb25zdCBjbGllbnQgPSBuZXcgV2ViQ2xpZW50KHNsYWNrU2VjcmV0VmFsdWUudG9rZW4pO1xuICBjb25zdCBjaGFubmVsID0gc2xhY2tTZWNyZXRWYWx1ZS5jaGFubmVsO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgcGFyZW50IFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgaW5zdGFuY2VDb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgfSk7XG5cbiAgLy8gc2VuZCBzbGFjayBtZXNzYWdlXG4gIGNvbnN0IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdCA9IGF3YWl0IGN0eC5zdGVwKCdwb3N0LXNsYWNrLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIHJldHVybiBjbGllbnQuY2hhdC5wb3N0TWVzc2FnZSh7XG4gICAgICBjaGFubmVsLFxuICAgICAgdGV4dDogYCR7cGFyYW1zLk1vZGUgPT09ICdTdGFydCcgPyAn8J+YhiBTdGFydHMnIDogJ/CfpbEgU3RvcHMnfSB0aGUgc2NoZWR1bGVkIEVDMiBJbnN0YW5jZS5gLFxuICAgIH0pO1xuICB9KTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwYXJlbnQgU2xhY2sgbWVzc2FnZSBwb3N0ZWQnLCB7XG4gICAgdGhyZWFkVHM6IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdD8udHMgPz8gbnVsbCxcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogc3RhcnRpbmcgcGFyYWxsZWwgaW5zdGFuY2UgcHJvY2Vzc2luZycsIHtcbiAgICBjb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICBtYXhDb25jdXJyZW5jeTogMTAsXG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBjdHgubWFwKFxuICAgIHRhcmdldFJlc291cmNlcyxcbiAgICAvLyBhc3luYyAoY3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAvLyAgIGN0eC5zdGVwKGBwcm9jZXNzLXJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKCkgPT5cbiAgICAvLyAgICAgcHJvY2Vzc09uZVJlc291cmNlKGN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgpLFxuICAgIC8vICAgKSxcbiAgICBhc3luYyAobWFwQ3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIG1hcEN0eC5ydW5JbkNoaWxkQ29udGV4dChgcmVzb3VyY2UtJHtpbmRleH1gLCBhc3luYyAoY2hpbGRDdHg6IER1cmFibGVDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NPbmVSZXNvdXJjZShjaGlsZEN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgsIHBvbGxpbmdMaW1pdHMpO1xuICAgICAgICAvLyBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3NraXBwZWQnKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgLy8gfVxuICAgICAgICBjaGlsZEN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgdGhyZWFkIFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaWRlbnRpZmllcjogcmVzdWx0LmlkZW50aWZpZXIsXG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gc2VuZCBzbGFjayB0aHJlYWQgbWVzc2FnZVxuICAgICAgICBhd2FpdCBjaGlsZEN0eC5zdGVwKCdwb3N0LXNsYWNrLWNoaWxkLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXkgPSBnZXRTdGF0ZURpc3BsYXkocmVzdWx0LnN0YXR1cyk7XG5cbiAgICAgICAgICByZXR1cm4gY2xpZW50LmNoYXQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgIHRocmVhZF90czogc2xhY2tQYXJlbnRNZXNzYWdlUmVzdWx0Py50cyxcbiAgICAgICAgICAgIGF0dGFjaG1lbnRzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb2xvcjogJyMzNmE2NGYnLFxuICAgICAgICAgICAgICAgIHByZXRleHQ6IGAke2Rpc3BsYXk/LmVtb2ppfSBUaGUgc3RhdHVzIG9mIHRoZSBFQzIgSW5zdGFuY2UgJHtyZXN1bHQuaWRlbnRpZmllcn0gY2hhbmdlZCB0byAke2Rpc3BsYXk/Lm5hbWV9IGR1ZSB0byB0aGUgc2NoZWR1bGUuYCxcbiAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdBY2NvdW50JywgdmFsdWU6IHJlc3VsdC5hY2NvdW50LCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ1JlZ2lvbicsIHZhbHVlOiByZXN1bHQucmVnaW9uLCBzaG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0lkZW50aWZpZXInLCB2YWx1ZTogcmVzdWx0LmlkZW50aWZpZXIsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICB7IHRpdGxlOiAnU3RhdHVzJywgdmFsdWU6IChkaXNwbGF5Py5uYW1lID8/ICdVbmtub3duJyksIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICB7IG1heENvbmN1cnJlbmN5OiAxMCB9LFxuICApO1xuXG4gIGNvbnN0IHJlc3VsdExpc3QgPSBBcnJheS5pc0FycmF5KHJlc3VsdHMpID8gcmVzdWx0cyA6IFtdO1xuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBjb21wbGV0ZWQnLCB7XG4gICAgcHJvY2Vzc2VkOiB0YXJnZXRSZXNvdXJjZXMubGVuZ3RoLFxuICAgIHJlc3VsdENvdW50OiByZXN1bHRMaXN0Lmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgc3RhdHVzOiAnQ29tcGxldGVkJyBhcyBjb25zdCxcbiAgICBwcm9jZXNzZWQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgcmVzdWx0czogcmVzdWx0TGlzdCxcbiAgfTtcbn0pO1xuIl19
|
|
341
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXIubGFtYmRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Z1bmNzL3J1bm5pbmctc2NoZWR1bGVyLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7R0FPRzs7O0FBRUgsNEVBQTBGO0FBQzFGLG9EQUs2QjtBQUM3QixvR0FBa0g7QUFDbEgsNENBQTJDO0FBQzNDLHlFQUFzRjtBQUN0Riw2REFBdUU7QUFDdkUsaUZBTXdDO0FBQ3hDLDZFQUE4RTtBQUU5RSx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLEdBQUc7SUFDakIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQzFDLENBQUM7QUFFWDs7OztHQUlHO0FBQ0gsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUM7QUFFdEM7Ozs7O0dBS0c7QUFDSCxNQUFNLDBCQUEwQixHQUEwQjtJQUN4RCxTQUFTLEVBQUUsSUFBSTtJQUNmLE9BQU8sRUFBRSxDQUFDO0lBQ1YsYUFBYSxFQUFFLEdBQUc7Q0FDbkIsQ0FBQztBQTJCRjs7Ozs7R0FLRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBZSxFQUErQyxFQUFFO0lBQ3ZGLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUM7SUFDMUQsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3RFLENBQUMs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QUNwQixDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVDMiBSdW5uaW5nIFNjaGVkdWxlciDigJMgRHVyYWJsZSBGdW5jdGlvbnMgaW1wbGVtZW50YXRpb24uXG4gKlxuICogSW1wbGVtZW50cyB0aGUgcnVubmluZy1jb250cm9sIGZsb3cgdXNpbmcgQVdTIExhbWJkYSBEdXJhYmxlIEV4ZWN1dGlvbi5cbiAqIFN0ZXAgY2hlY2twb2ludHMsIHdhaXQgKG5vIGNoYXJnZSksIGFuZCBwYXJhbGxlbCBtYXAgcHJvdmlkZSBhIGZsb3cgZXF1aXZhbGVudCB0byBTdGVwIEZ1bmN0aW9ucy5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9sYW1iZGEvbGF0ZXN0L2RnL2R1cmFibGUtZXhlY3V0aW9uLXNkay5odG1sXG4gKi9cblxuaW1wb3J0IHsgd2l0aER1cmFibGVFeGVjdXRpb24sIHR5cGUgRHVyYWJsZUNvbnRleHQgfSBmcm9tICdAYXdzL2R1cmFibGUtZXhlY3V0aW9uLXNkay1qcyc7XG5pbXBvcnQge1xuICBFQzJDbGllbnQsXG4gIERlc2NyaWJlSW5zdGFuY2VzQ29tbWFuZCxcbiAgU3RhcnRJbnN0YW5jZXNDb21tYW5kLFxuICBTdG9wSW5zdGFuY2VzQ29tbWFuZCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjMic7XG5pbXBvcnQgeyBHZXRSZXNvdXJjZXNDb21tYW5kLCBSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUElDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtcmVzb3VyY2UtZ3JvdXBzLXRhZ2dpbmctYXBpJztcbmltcG9ydCB7IFdlYkNsaWVudCB9IGZyb20gJ0BzbGFjay93ZWItYXBpJztcbmltcG9ydCB7IHNlY3JldEZldGNoZXIsIHR5cGUgR2V0U2VjcmV0VmFsdWVPcHRpb25zIH0gZnJvbSAnYXdzLWxhbWJkYS1zZWNyZXQtZmV0Y2hlcic7XG5pbXBvcnQgeyBTdHJpY3RFbnZSZXNvbHZlciwgU3RyaWN0RW52VHlwZSB9IGZyb20gJ3N0cmljdC1lbnYtcmVzb2x2ZXInO1xuaW1wb3J0IHtcbiAgZm9ybWF0UmVzb3VyY2VXYWl0RmFpbHVyZSxcbiAgZ2V0V2FpdEFib3J0UmVhc29uLFxuICBpc0Rlc2lyZWRTdGFibGVTdGF0ZSxcbiAgaXNUcmFuc2l0aW9uaW5nU3RhdGUsXG4gIHR5cGUgUmVzb3VyY2VXYWl0TGltaXRzLFxufSBmcm9tICcuL3J1bm5pbmctc2NoZWR1bGVyLXByZWRpY2F0ZXMnO1xuaW1wb3J0IHsgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52IH0gZnJvbSAnLi9ydW5uaW5nLXNjaGVkdWxlci13YWl0LWVudic7XG5cbi8qKiBNYXBwaW5nIG9mIEVDMiBpbnN0YW5jZSBzdGF0ZSB0byBkaXNwbGF5IG5hbWUgYW5kIGVtb2ppIGZvciBTbGFjay4gKi9cbmNvbnN0IFNUQVRFX0xJU1QgPSBbXG4gIHsgbmFtZTogJ1JVTk5JTkcnLCBlbW9qaTogJ/CfmIYnLCBzdGF0ZTogJ3J1bm5pbmcnIH0sXG4gIHsgbmFtZTogJ1NUT1BQRUQnLCBlbW9qaTogJ/CfmLQnLCBzdGF0ZTogJ3N0b3BwZWQnIH0sXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIFNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuIGRlc2NyaWJlIGl0ZXJhdGlvbnMgYWZ0ZXIgc3RhcnQvc3RvcCBvciB3aGlsZSB0cmFuc2l0aW9uaW5nLlxuICpcbiAqIFVzZWQgd2l0aCB7QGxpbmsgcHJvY2Vzc09uZVJlc291cmNlfSBkdXJhYmxlIGB3YWl0YCBjYWxscyBiZXR3ZWVuIGRlc2NyaWJlIGl0ZXJhdGlvbnMuXG4gKi9cbmNvbnN0IFNUQVRVU19DSEFOR0VfV0FJVF9TRUNPTkRTID0gMjA7XG5cbi8qKlxuICogT3B0aW9ucyBwYXNzZWQgdG8ge0BsaW5rIHNlY3JldEZldGNoZXIuZ2V0U2VjcmV0VmFsdWV9IHdoZW4gbG9hZGluZyB0aGUgU2xhY2sgc2VjcmV0LlxuICpcbiAqIFJldHJpZXMgY292ZXIgdHJhbnNpZW50IGV4dGVuc2lvbiBIVFRQIGVycm9ycyAoNXh4LCA0MjkpIGFuZCB0aGUgZXh0ZW5zaW9uXG4gKiBcIm5vdCByZWFkeSB0byBzZXJ2ZSB0cmFmZmljXCIgcmVzcG9uc2UgZHVyaW5nIGNvbGQgc3RhcnRzLlxuICovXG5jb25zdCBTTEFDS19TRUNSRVRfRkVUQ0hfT1BUSU9OUzogR2V0U2VjcmV0VmFsdWVPcHRpb25zID0ge1xuICB0aW1lb3V0TXM6IDMwMDAsXG4gIHJldHJpZXM6IDUsXG4gIGJhc2VCYWNrb2ZmTXM6IDMwMCxcbn07XG5cbi8qKlxuICogRXZlbnQgcGF5bG9hZCBmcm9tIEV2ZW50QnJpZGdlIFNjaGVkdWxlciBpbnZva2luZyB0aGlzIExhbWJkYS5cbiAqXG4gKiBAc2VlIHtAbGluayBoYW5kbGVyfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjaGVkdWxlckV2ZW50IHtcbiAgLyoqIFNjaGVkdWxlciBpbnZvY2F0aW9uIHBhcmFtZXRlcnMgKHRhZyBmaWx0ZXIgYW5kIHN0YXJ0L3N0b3AgbW9kZSkuICovXG4gIFBhcmFtczoge1xuICAgIC8qKiBUYWcga2V5IHVzZWQgdG8gc2VsZWN0IEVDMiBpbnN0YW5jZXMuICovXG4gICAgVGFnS2V5OiBzdHJpbmc7XG4gICAgLyoqIFRhZyB2YWx1ZXMgdG8gbWF0Y2guICovXG4gICAgVGFnVmFsdWVzOiBzdHJpbmdbXTtcbiAgICAvKiogV2hldGhlciB0byBzdGFydCBvciBzdG9wIGluc3RhbmNlcy4gKi9cbiAgICBNb2RlOiAnU3RhcnQnIHwgJ1N0b3AnO1xuICB9O1xufVxuXG4vKiogU2xhY2sgY3JlZGVudGlhbHMgYW5kIGRlZmF1bHQgY2hhbm5lbCBsb2FkZWQgZnJvbSBTZWNyZXRzIE1hbmFnZXIgKGBTTEFDS19TRUNSRVRfTkFNRWApLiAqL1xuaW50ZXJmYWNlIFNsYWNrU2VjcmV0IHtcbiAgLyoqIFNsYWNrIGJvdCB0b2tlbiBmb3IgdGhlIFNsYWNrIGBXZWJDbGllbnRgLiAqL1xuICB0b2tlbjogc3RyaW5nO1xuICAvKiogQ2hhbm5lbCBJRCBvciBuYW1lIHBhc3NlZCB0byBgY2hhdC5wb3N0TWVzc2FnZWAuICovXG4gIGNoYW5uZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGRpc3BsYXkgbmFtZSBhbmQgZW1vamkgZm9yIGFuIEVDMiBpbnN0YW5jZSBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0gY3VycmVudCAtIEN1cnJlbnQgaW5zdGFuY2Ugc3RhdGUgKGUuZy4gJ3J1bm5pbmcnLCAnc3RvcHBlZCcpLlxuICogQHJldHVybnMgRGlzcGxheSBpbmZvIG9yIHVuZGVmaW5lZCBpZiBzdGF0ZSBpcyBub3QgaW4gU1RBVEVfTElTVC5cbiAqL1xuY29uc3QgZ2V0U3RhdGVEaXNwbGF5ID0gKGN1cnJlbnQ6IHN0cmluZyk6IHsgZW1vamk6IHN0cmluZzsgbmFtZTogc3RyaW5nIH0gfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBmb3VuZCA9IFNUQVRFX0xJU1QuZmluZCgocykgPT4gcy5zdGF0ZSA9PT0gY3VycmVudCk7XG4gIHJldHVybiBmb3VuZCA/IHsgZW1vamk6IGZvdW5kLmVtb2ppLCBuYW1lOiBmb3VuZC5uYW1lIH0gOiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBvbmUgRUMyIGluc3RhbmNlOiBkZXNjcmliZXMgc3RhdGUsIGlzc3VlcyBzdGFydC9zdG9wIHdoZW4gbmVlZGVkLCB0aGVuIHdhaXRzIHVudGlsXG4gKiB7QGxpbmsgaXNEZXNpcmVkU3RhYmxlU3RhdGV9IGlzIHNhdGlzZmllZCAoZHVyYWJsZSBgc3RlcGAgLyBgd2FpdGAgYmV0d2VlbiBhdHRlbXB0cykuXG4gKlxuICogRWFjaCBsb29wIGl0ZXJhdGlvbiBjaGVja3Mge0BsaW5rIGdldFdhaXRBYm9ydFJlYXNvbn0gYmVmb3JlIGRlc2NyaWJlLiBGYWlsdXJlcyB1c2VcbiAqIHtAbGluayBmb3JtYXRSZXNvdXJjZVdhaXRGYWlsdXJlfSAoYFJlc291cmNlV2FpdEZhaWxlZDoqYCBtZXNzYWdlIHByZWZpeCkuXG4gKlxuICogQHBhcmFtIGN0eCAtIER1cmFibGUgZXhlY3V0aW9uIGNvbnRleHQgKGNoaWxkIGNvbnRleHQgcGVyIGluc3RhbmNlIHJlY29tbWVuZGVkKS5cbiAqIEBwYXJhbSB0YXJnZXRSZXNvdXJjZSAtIEVDMiBpbnN0YW5jZSBBUk4uXG4gKiBAcGFyYW0gcGFyYW1zIC0gU2NoZWR1bGVyIHBhcmFtcyAoYFRhZ0tleWAsIGBUYWdWYWx1ZXNgLCBgTW9kZWApLlxuICogQHBhcmFtIHJlc291cmNlSW5kZXggLSBJbmRleCB1c2VkIGluIGR1cmFibGUgc3RlcCBuYW1lcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAqIEBwYXJhbSB3YWl0TGltaXRzIC0gUGVyLWluc3RhbmNlIGNhcHMgZnJvbSB7QGxpbmsgcGFyc2VSZXNvdXJjZVdhaXRMaW1pdHNGcm9tRW52fSAoc2V0IGJ5IHRoZSBDREsgY29uc3RydWN0KS5cbiAqIEByZXR1cm5zIEZpbmFsIHJlc291cmNlIEFSTiwgRUMyIHN0YXRlIG5hbWUsIHBhcnNlZCBhY2NvdW50LCByZWdpb24sIGFuZCBpbnN0YW5jZSBpZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBXaGVuIHdhaXQgbGltaXRzIGFyZSBleGNlZWRlZCAoYE1heExvb3BDb3VudEV4Y2VlZGVkYCwgYE1heEVsYXBzZWRUaW1lRXhjZWVkZWRgKSxcbiAqICAgdGhlIGluc3RhbmNlIGlzIGluIGFuIHVuZXhwZWN0ZWQgc3RhdGUgKGBVbmV4cGVjdGVkSW5zdGFuY2VTdGF0ZWApLCBvciB0aGUgbG9vcCBleGl0cyB3aXRob3V0IGEgc3RhYmxlIGdvYWwgc3RhdGUuXG4gKi9cbmNvbnN0IHByb2Nlc3NPbmVSZXNvdXJjZSA9IGFzeW5jIChcbiAgY3R4OiBEdXJhYmxlQ29udGV4dCxcbiAgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZyxcbiAgcGFyYW1zOiBTY2hlZHVsZXJFdmVudFsnUGFyYW1zJ10sXG4gIHJlc291cmNlSW5kZXg6IG51bWJlcixcbiAgd2FpdExpbWl0czogUmVzb3VyY2VXYWl0TGltaXRzLFxuKTogUHJvbWlzZTx7IHJlc291cmNlOiBzdHJpbmc7IHN0YXR1czogc3RyaW5nOyBhY2NvdW50OiBzdHJpbmc7IHJlZ2lvbjogc3RyaW5nOyBpZGVudGlmaWVyOiBzdHJpbmcgfT4gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHRhcmdldFJlc291cmNlLnNwbGl0KCcvJyk7XG4gIGNvbnN0IGlkZW50aWZpZXIgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSA/PyAndW5rbm93bic7XG4gIGNvbnN0IGFyblBhcnRzID0gdGFyZ2V0UmVzb3VyY2Uuc3BsaXQoJzonKTtcbiAgY29uc3QgYWNjb3VudCA9IGFyblBhcnRzWzRdID8/ICcnO1xuICBjb25zdCByZWdpb24gPSBhcm5QYXJ0c1szXSA/PyAnJztcbiAgY29uc3Qgc3RlcFByZWZpeCA9IGByZXNvdXJjZS0ke3Jlc291cmNlSW5kZXh9LSR7aWRlbnRpZmllcn1gO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdGFydCcsIHtcbiAgICByZXNvdXJjZUluZGV4LFxuICAgIGlkZW50aWZpZXIsXG4gICAgcmVnaW9uLFxuICAgIGFjY291bnQsXG4gICAgbW9kZTogcGFyYW1zLk1vZGUsXG4gICAgbWF4TG9vcENvdW50OiB3YWl0TGltaXRzLm1heExvb3BDb3VudCxcbiAgICBtYXhFbGFwc2VkU2Vjb25kczogd2FpdExpbWl0cy5tYXhFbGFwc2VkU2Vjb25kcyxcbiAgfSk7XG5cbiAgY29uc3Qgc3RhcnRlZEF0TXMgPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS13YWl0LXN0YXJ0ZWQtYXRgLCBhc3luYyAoKSA9PiBEYXRlLm5vdygpKTtcblxuICBsZXQgbG9vcENvdW50ID0gMDtcbiAgbGV0IGN1cnJlbnRTdGF0ZSA9ICcnO1xuICBkbyB7XG4gICAgY29uc3QgYWJvcnRSZWFzb24gPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS13YWl0LWxpbWl0LWNoZWNrLSR7bG9vcENvdW50fWAsIGFzeW5jICgpID0+XG4gICAgICBnZXRXYWl0QWJvcnRSZWFzb24obG9vcENvdW50LCBzdGFydGVkQXRNcywgRGF0ZS5ub3coKSwgd2FpdExpbWl0cyksXG4gICAgKTtcbiAgICBpZiAoYWJvcnRSZWFzb24pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRSZXNvdXJjZVdhaXRGYWlsdXJlKGFib3J0UmVhc29uLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGU6IGN1cnJlbnRTdGF0ZSB8fCAndW5rbm93bicsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgbGltaXRzOiB3YWl0TGltaXRzLFxuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmVycm9yKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgbGltaXQgZXhjZWVkZWQnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIGFib3J0UmVhc29uLFxuICAgICAgICBsb29wQ291bnQsXG4gICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgbWF4TG9vcENvdW50OiB3YWl0TGltaXRzLm1heExvb3BDb3VudCxcbiAgICAgICAgbWF4RWxhcHNlZFNlY29uZHM6IHdhaXRMaW1pdHMubWF4RWxhcHNlZFNlY29uZHMsXG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICB9XG5cbiAgICBjdXJyZW50U3RhdGUgPSBhd2FpdCBjdHguc3RlcChgJHtzdGVwUHJlZml4fS1kZXNjcmliZS0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgIGNvbnN0IG91dCA9IGF3YWl0IGVjMi5zZW5kKG5ldyBEZXNjcmliZUluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIHJldHVybiBvdXQuUmVzZXJ2YXRpb25zPy5bMF0/Lkluc3RhbmNlcz8uWzBdPy5TdGF0ZT8uTmFtZSA/PyAndW5rbm93bic7XG4gICAgfSk7XG5cbiAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogZGVzY3JpYmVkJywge1xuICAgICAgaWRlbnRpZmllcixcbiAgICAgIGxvb3BDb3VudCxcbiAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbW9kZSA9IHBhcmFtcy5Nb2RlO1xuXG4gICAgaWYgKG1vZGUgPT09ICdTdGFydCcgJiYgY3VycmVudFN0YXRlID09PSAnc3RvcHBlZCcpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdGFydGluZyBpbnN0YW5jZScsIHsgaWRlbnRpZmllciwgbG9vcENvdW50IH0pO1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RhcnQtJHtsb29wQ291bnR9YCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBlYzIgPSBuZXcgRUMyQ2xpZW50KHt9KTtcbiAgICAgICAgYXdhaXQgZWMyLnNlbmQobmV3IFN0YXJ0SW5zdGFuY2VzQ29tbWFuZCh7IEluc3RhbmNlSWRzOiBbaWRlbnRpZmllcl0gfSkpO1xuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmluZm8oJ3Byb2Nlc3NPbmVSZXNvdXJjZTogd2FpdCBhZnRlciBzdGFydCcsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChtb2RlID09PSAnU3RvcCcgJiYgY3VycmVudFN0YXRlID09PSAncnVubmluZycpIHtcbiAgICAgIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiBzdG9wcGluZyBpbnN0YW5jZScsIHsgaWRlbnRpZmllciwgbG9vcENvdW50IH0pO1xuICAgICAgYXdhaXQgY3R4LnN0ZXAoYCR7c3RlcFByZWZpeH0tc3RvcC0ke2xvb3BDb3VudH1gLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGVjMiA9IG5ldyBFQzJDbGllbnQoe30pO1xuICAgICAgICBhd2FpdCBlYzIuc2VuZChuZXcgU3RvcEluc3RhbmNlc0NvbW1hbmQoeyBJbnN0YW5jZUlkczogW2lkZW50aWZpZXJdIH0pKTtcbiAgICAgIH0pO1xuICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgYWZ0ZXIgc3RvcCcsIHtcbiAgICAgICAgaWRlbnRpZmllcixcbiAgICAgICAgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICBsb29wQ291bnQgKz0gMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghaXNEZXNpcmVkU3RhYmxlU3RhdGUobW9kZSwgY3VycmVudFN0YXRlKSkge1xuICAgICAgaWYgKGlzVHJhbnNpdGlvbmluZ1N0YXRlKG1vZGUsIGN1cnJlbnRTdGF0ZSkpIHtcbiAgICAgICAgY3R4LmxvZ2dlci5pbmZvKCdwcm9jZXNzT25lUmVzb3VyY2U6IHdhaXQgd2hpbGUgdHJhbnNpdGlvbmluZycsIHtcbiAgICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgICAgbW9kZSxcbiAgICAgICAgICBzZWNvbmRzOiBTVEFUVVNfQ0hBTkdFX1dBSVRfU0VDT05EUyxcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IGN0eC53YWl0KHsgc2Vjb25kczogU1RBVFVTX0NIQU5HRV9XQUlUX1NFQ09ORFMgfSk7XG4gICAgICAgIGxvb3BDb3VudCArPSAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZSA9IGZvcm1hdFJlc291cmNlV2FpdEZhaWx1cmUoJ1VuZXhwZWN0ZWRJbnN0YW5jZVN0YXRlJywge1xuICAgICAgICBpZGVudGlmaWVyLFxuICAgICAgICBtb2RlLFxuICAgICAgICBjdXJyZW50U3RhdGUsXG4gICAgICAgIGxvb3BDb3VudCxcbiAgICAgICAgbGltaXRzOiB3YWl0TGltaXRzLFxuICAgICAgfSk7XG4gICAgICBjdHgubG9nZ2VyLmVycm9yKCdwcm9jZXNzT25lUmVzb3VyY2U6IHVuZXhwZWN0ZWQgc3RhdGUnLCB7XG4gICAgICAgIGlkZW50aWZpZXIsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIGN1cnJlbnRTdGF0ZSxcbiAgICAgICAgbG9vcENvdW50LFxuICAgICAgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9IHdoaWxlICghaXNEZXNpcmVkU3RhYmxlU3RhdGUocGFyYW1zLk1vZGUsIGN1cnJlbnRTdGF0ZSkpO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncHJvY2Vzc09uZVJlc291cmNlOiByZWFjaGVkIGRlc2lyZWQgc3RhYmxlIHN0YXRlJywge1xuICAgIGlkZW50aWZpZXIsXG4gICAgZmluYWxTdGF0ZTogY3VycmVudFN0YXRlLFxuICAgIG1vZGU6IHBhcmFtcy5Nb2RlLFxuICAgIGxvb3BDb3VudCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBpZGVudGlmaWVyLFxuICAgIGFjY291bnQsXG4gICAgcmVnaW9uLFxuICAgIHJlc291cmNlOiB0YXJnZXRSZXNvdXJjZSxcbiAgICBzdGF0dXM6IGN1cnJlbnRTdGF0ZSxcbiAgfTtcbn07XG5cbi8qKlxuICogRHVyYWJsZSBMYW1iZGEgZW50cnkgcG9pbnQgZm9yIHRoZSBFQzIgcnVubmluZyBzY2hlZHVsZXIuXG4gKlxuICogUmVzb2x2ZXMgaW5zdGFuY2VzIHZpYSBSZXNvdXJjZSBHcm91cHMgVGFnZ2luZyBBUEksIHJ1bnMge0BsaW5rIHByb2Nlc3NPbmVSZXNvdXJjZX0gZm9yIGVhY2ggQVJOXG4gKiBpbiBwYXJhbGxlbCAoYm91bmRlZCBjb25jdXJyZW5jeSksIHBvc3RzIGEgcGFyZW50IFNsYWNrIG1lc3NhZ2UgYW5kIHBlci1pbnN0YW5jZSB0aHJlYWQgcmVwbGllcyxcbiAqIGFuZCB1c2VzIGR1cmFibGUgYHN0ZXBgIC8gYHdhaXRgIC8gYG1hcGAgc28gdGhlIHJ1biBjYW4gcmVzdW1lIGFjcm9zcyBzdXNwZW5zaW9ucy5cbiAqXG4gKiBSZWFkcyBwZXItaW5zdGFuY2Ugd2FpdCBsaW1pdHMgZnJvbSBgUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVGAgYW5kXG4gKiBgUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTYCB2aWEge0BsaW5rIHBhcnNlUmVzb3VyY2VXYWl0TGltaXRzRnJvbUVudn0uXG4gKiBMb2FkcyB0aGUgU2xhY2sgc2VjcmV0IHZpYSB7QGxpbmsgc2VjcmV0RmV0Y2hlcn0gKFBhcmFtZXRlcnMgYW5kIFNlY3JldHMgTGFtYmRhIEV4dGVuc2lvbikuXG4gKiBTbGFjayBBUEkgZmFpbHVyZXMgYXJlIGxvZ2dlZCBhcyBgcnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHBvc3QgZmFpbGVkYCBmb3IgQ2xvdWRXYXRjaCBsb2cgZmlsdGVycy5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgLSBQYXlsb2FkIGZyb20gRXZlbnRCcmlkZ2UgU2NoZWR1bGVyOyBtdXN0IGluY2x1ZGUgYFBhcmFtcy5UYWdLZXlgLCBgUGFyYW1zLlRhZ1ZhbHVlc2AsIGBQYXJhbXMuTW9kZWAuXG4gKiBAcGFyYW0gY3R4IC0gUm9vdCBkdXJhYmxlIGV4ZWN1dGlvbiBjb250ZXh0LlxuICogQHJldHVybnNcbiAqIC0gYHsgc3RhdHVzOiAnVGFyZ2V0UmVzb3VyY2VzTm90Rm91bmQnIH1gIHdoZW4gbm8gaW5zdGFuY2VzIG1hdGNoIHRoZSB0YWcgZmlsdGVyLlxuICogLSBgeyBzdGF0dXM6ICdDb21wbGV0ZWQnLCBwcm9jZXNzZWQsIHJlc3VsdHMgfWAgd2hlbiBpbnN0YW5jZXMgd2VyZSBoYW5kbGVkIChgcmVzdWx0c2AgZW50cmllcyBtYXRjaCB7QGxpbmsgcHJvY2Vzc09uZVJlc291cmNlfSByZXR1cm4gc2hhcGUpLlxuICogQHRocm93cyB7RXJyb3J9IElmIGBQYXJhbXNgIGlzIGludmFsaWQsIHdhaXQgZW52IHZhcnMgYXJlIG5vdCBwb3NpdGl2ZSBpbnRlZ2VycyxcbiAqICAgdGhlIFNsYWNrIHNlY3JldCBpcyBpbmNvbXBsZXRlLCBpbnN0YW5jZSBwcm9jZXNzaW5nIGZhaWxzIChpbmNsdWRpbmcgYFJlc291cmNlV2FpdEZhaWxlZDoqYCBlcnJvcnMpLFxuICogICBvciB0aGUgc2VjcmV0IGNhbm5vdCBiZSByZWFkIGZyb20gdGhlIGV4dGVuc2lvbiAoZS5nLiBvdXRzaWRlIExhbWJkYSBvciBtaXNzaW5nIGBBV1NfU0VTU0lPTl9UT0tFTmApLlxuICogQHRocm93cyB7aW1wb3J0KCdzdHJpY3QtZW52LXJlc29sdmVyJykuU3RyaWN0RW52VmFsaWRhdGlvbkVycm9yfSBXaGVuIHJlcXVpcmVkIGVudiB2YXJzIGFyZSBtaXNzaW5nIG9yIG5vdCB2YWxpZCBudW1iZXJzLlxuICogQHRocm93cyB7aW1wb3J0KCdmZXRjaC1yZXRyaWVyJykuRmV0Y2hSZXRyaWVySHR0cEVycm9yfSBXaGVuIHRoZSBleHRlbnNpb24gcmV0dXJucyBhIG5vbi1yZXRyaWFibGUgSFRUUCBlcnJvci5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnZmV0Y2gtcmV0cmllcicpLkZldGNoUmV0cmllck5ldHdvcmtFcnJvcn0gV2hlbiBleHRlbnNpb24gcmVxdWVzdHMgZmFpbCBhdCB0aGUgbmV0d29yayBsZXZlbC5cbiAqIEB0aHJvd3Mge2ltcG9ydCgnZmV0Y2gtcmV0cmllcicpLkZldGNoUmV0cmllckFib3J0RXJyb3J9IFdoZW4gZXh0ZW5zaW9uIHJlcXVlc3RzIHRpbWUgb3V0IGFmdGVyIGFsbCByZXRyaWVzLlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IHdpdGhEdXJhYmxlRXhlY3V0aW9uKGFzeW5jIChldmVudDogU2NoZWR1bGVyRXZlbnQsIGN0eDogRHVyYWJsZUNvbnRleHQpID0+IHtcblxuICBjb25zdCBwYXJhbXMgPSBldmVudC5QYXJhbXM7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogaW52b2NhdGlvbicsIHtcbiAgICBtb2RlOiBwYXJhbXM/Lk1vZGUsXG4gICAgdGFnS2V5OiBwYXJhbXM/LlRhZ0tleSxcbiAgICB0YWdWYWx1ZUNvdW50OiBwYXJhbXM/LlRhZ1ZhbHVlcz8ubGVuZ3RoID8/IDAsXG4gIH0pO1xuXG4gIGlmICghcGFyYW1zPy5UYWdLZXkgfHwgIXBhcmFtcz8uVGFnVmFsdWVzIHx8ICFwYXJhbXM/Lk1vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZXZlbnQ6IFBhcmFtcy5UYWdLZXksIFBhcmFtcy5UYWdWYWx1ZXMsIFBhcmFtcy5Nb2RlIGFyZSByZXF1aXJlZC4nKTtcbiAgfVxuXG4gIGNvbnN0IHdhaXRMaW1pdHMgPSBwYXJzZVJlc291cmNlV2FpdExpbWl0c0Zyb21FbnYoKTtcblxuICBjb25zdCBzbGFja1NlY3JldE5hbWUgPSBTdHJpY3RFbnZSZXNvbHZlci5yZXNvbHZlKCdTTEFDS19TRUNSRVRfTkFNRScsIFN0cmljdEVudlR5cGUuU3RyaW5nKTtcblxuICBjb25zdCBzbGFja1NlY3JldFZhbHVlID0gYXdhaXQgY3R4LnN0ZXAoJ2ZldGNoLXNsYWNrLXNlY3JldCcsIGFzeW5jICgpID0+IHtcbiAgICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBmZXRjaGluZyBTbGFjayBzZWNyZXQnLCB7IHNlY3JldE5hbWU6IHNsYWNrU2VjcmV0TmFtZSB9KTtcbiAgICByZXR1cm4gc2VjcmV0RmV0Y2hlci5nZXRTZWNyZXRWYWx1ZTxTbGFja1NlY3JldD4oc2xhY2tTZWNyZXROYW1lLCBTTEFDS19TRUNSRVRfRkVUQ0hfT1BUSU9OUyk7XG4gIH0pO1xuXG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IFNsYWNrIHNlY3JldCBsb2FkZWQnKTtcblxuICBpZiAoIXNsYWNrU2VjcmV0VmFsdWU/LnRva2VuIHx8ICFzbGFja1NlY3JldFZhbHVlPy5jaGFubmVsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTbGFjayBzZWNyZXQgbXVzdCBjb250YWluIHRva2VuIGFuZCBjaGFubmVsLicpO1xuICB9XG5cbiAgY29uc3QgdGFyZ2V0UmVzb3VyY2VzID0gYXdhaXQgY3R4LnN0ZXAoJ2dldC10YXJnZXQtcmVzb3VyY2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUElDbGllbnQoe30pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNsaWVudC5zZW5kKFxuICAgICAgbmV3IEdldFJlc291cmNlc0NvbW1hbmQoe1xuICAgICAgICBSZXNvdXJjZVR5cGVGaWx0ZXJzOiBbJ2VjMjppbnN0YW5jZSddLFxuICAgICAgICBUYWdGaWx0ZXJzOiBbeyBLZXk6IHBhcmFtcy5UYWdLZXksIFZhbHVlczogcGFyYW1zLlRhZ1ZhbHVlcyB9XSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgY29uc3QgYXJucyA9IChyZXN1bHQuUmVzb3VyY2VUYWdNYXBwaW5nTGlzdCA/PyBbXSlcbiAgICAgIC5tYXAoKG06IHsgUmVzb3VyY2VBUk4/OiBzdHJpbmcgfSkgPT4gbS5SZXNvdXJjZUFSTilcbiAgICAgIC5maWx0ZXIoKGFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogYXJuIGlzIHN0cmluZyA9PiBhcm4gIT0gbnVsbCk7XG4gICAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogZ2V0LXRhcmdldC1yZXNvdXJjZXMgZG9uZScsIHsgY291bnQ6IGFybnMubGVuZ3RoIH0pO1xuICAgIHJldHVybiBhcm5zO1xuICB9KTtcblxuICBpZiAodGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IG5vIG1hdGNoaW5nIGluc3RhbmNlcycsIHsgdGFnS2V5OiBwYXJhbXMuVGFnS2V5IH0pO1xuICAgIHJldHVybiB7IHN0YXR1czogJ1RhcmdldFJlc291cmNlc05vdEZvdW5kJyBhcyBjb25zdCB9O1xuICB9XG5cbiAgY29uc3QgY2xpZW50ID0gbmV3IFdlYkNsaWVudChzbGFja1NlY3JldFZhbHVlLnRva2VuKTtcbiAgY29uc3QgY2hhbm5lbCA9IHNsYWNrU2VjcmV0VmFsdWUuY2hhbm5lbDtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwb3N0aW5nIHBhcmVudCBTbGFjayBtZXNzYWdlJywge1xuICAgIGluc3RhbmNlQ291bnQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gIH0pO1xuXG4gIC8vIHNlbmQgc2xhY2sgbWVzc2FnZVxuICBjb25zdCBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQgPSBhd2FpdCBjdHguc3RlcCgncG9zdC1zbGFjay1tZXNzYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5jaGF0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgdGV4dDogYCR7cGFyYW1zLk1vZGUgPT09ICdTdGFydCcgPyAn8J+YhiBTdGFydHMnIDogJ/CfpbEgU3RvcHMnfSB0aGUgc2NoZWR1bGVkIEVDMiBJbnN0YW5jZS5gLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGN0eC5sb2dnZXIuZXJyb3IoJ3J1bm5pbmctc2NoZWR1bGVyOiBTbGFjayBwb3N0IGZhaWxlZCcsIHtcbiAgICAgICAgc3RlcDogJ3Bvc3Qtc2xhY2stbWVzc2FnZXMnLFxuICAgICAgICBjaGFubmVsLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICAgIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9KTtcblxuICBjdHgubG9nZ2VyLmluZm8oJ3J1bm5pbmctc2NoZWR1bGVyOiBwYXJlbnQgU2xhY2sgbWVzc2FnZSBwb3N0ZWQnLCB7XG4gICAgdGhyZWFkVHM6IHNsYWNrUGFyZW50TWVzc2FnZVJlc3VsdD8udHMgPz8gbnVsbCxcbiAgfSk7XG5cbiAgY3R4LmxvZ2dlci5pbmZvKCdydW5uaW5nLXNjaGVkdWxlcjogc3RhcnRpbmcgcGFyYWxsZWwgaW5zdGFuY2UgcHJvY2Vzc2luZycsIHtcbiAgICBjb3VudDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICBtYXhDb25jdXJyZW5jeTogMTAsXG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBjdHgubWFwKFxuICAgIHRhcmdldFJlc291cmNlcyxcbiAgICAvLyBhc3luYyAoY3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT5cbiAgICAvLyAgIGN0eC5zdGVwKGBwcm9jZXNzLXJlc291cmNlLSR7aW5kZXh9YCwgYXN5bmMgKCkgPT5cbiAgICAvLyAgICAgcHJvY2Vzc09uZVJlc291cmNlKGN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgpLFxuICAgIC8vICAgKSxcbiAgICBhc3luYyAobWFwQ3R4OiBEdXJhYmxlQ29udGV4dCwgdGFyZ2V0UmVzb3VyY2U6IHN0cmluZywgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgcmV0dXJuIG1hcEN0eC5ydW5JbkNoaWxkQ29udGV4dChgcmVzb3VyY2UtJHtpbmRleH1gLCBhc3luYyAoY2hpbGRDdHg6IER1cmFibGVDb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHByb2Nlc3NPbmVSZXNvdXJjZShjaGlsZEN0eCwgdGFyZ2V0UmVzb3VyY2UsIHBhcmFtcywgaW5kZXgsIHdhaXRMaW1pdHMpO1xuICAgICAgICAvLyBpZiAocmVzdWx0LnN0YXR1cyA9PT0gJ3NraXBwZWQnKSB7XG4gICAgICAgIC8vICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgLy8gfVxuICAgICAgICBjaGlsZEN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IHBvc3RpbmcgdGhyZWFkIFNsYWNrIG1lc3NhZ2UnLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaWRlbnRpZmllcjogcmVzdWx0LmlkZW50aWZpZXIsXG4gICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gc2VuZCBzbGFjayB0aHJlYWQgbWVzc2FnZVxuICAgICAgICBhd2FpdCBjaGlsZEN0eC5zdGVwKCdwb3N0LXNsYWNrLWNoaWxkLW1lc3NhZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BsYXkgPSBnZXRTdGF0ZURpc3BsYXkocmVzdWx0LnN0YXR1cyk7XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNsaWVudC5jaGF0LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgdGhyZWFkX3RzOiBzbGFja1BhcmVudE1lc3NhZ2VSZXN1bHQ/LnRzLFxuICAgICAgICAgICAgICBhdHRhY2htZW50czogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnIzM2YTY0ZicsXG4gICAgICAgICAgICAgICAgICBwcmV0ZXh0OiBgJHtkaXNwbGF5Py5lbW9qaX0gVGhlIHN0YXR1cyBvZiB0aGUgRUMyIEluc3RhbmNlICR7cmVzdWx0LmlkZW50aWZpZXJ9IGNoYW5nZWQgdG8gJHtkaXNwbGF5Py5uYW1lfSBkdWUgdG8gdGhlIHNjaGVkdWxlLmAsXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0FjY291bnQnLCB2YWx1ZTogcmVzdWx0LmFjY291bnQsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdSZWdpb24nLCB2YWx1ZTogcmVzdWx0LnJlZ2lvbiwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgICAgeyB0aXRsZTogJ0lkZW50aWZpZXInLCB2YWx1ZTogcmVzdWx0LmlkZW50aWZpZXIsIHNob3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICdTdGF0dXMnLCB2YWx1ZTogKGRpc3BsYXk/Lm5hbWUgPz8gJ1Vua25vd24nKSwgc2hvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgICBjaGlsZEN0eC5sb2dnZXIuZXJyb3IoJ3J1bm5pbmctc2NoZWR1bGVyOiBTbGFjayBwb3N0IGZhaWxlZCcsIHtcbiAgICAgICAgICAgICAgc3RlcDogJ3Bvc3Qtc2xhY2stY2hpbGQtbWVzc2FnZXMnLFxuICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICBpZGVudGlmaWVyOiByZXN1bHQuaWRlbnRpZmllcixcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHsgbWF4Q29uY3VycmVuY3k6IDEwIH0sXG4gICk7XG5cbiAgY29uc3QgcmVzdWx0TGlzdCA9IEFycmF5LmlzQXJyYXkocmVzdWx0cykgPyByZXN1bHRzIDogW107XG4gIGN0eC5sb2dnZXIuaW5mbygncnVubmluZy1zY2hlZHVsZXI6IGNvbXBsZXRlZCcsIHtcbiAgICBwcm9jZXNzZWQ6IHRhcmdldFJlc291cmNlcy5sZW5ndGgsXG4gICAgcmVzdWx0Q291bnQ6IHJlc3VsdExpc3QubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBzdGF0dXM6ICdDb21wbGV0ZWQnIGFzIGNvbnN0LFxuICAgIHByb2Nlc3NlZDogdGFyZ2V0UmVzb3VyY2VzLmxlbmd0aCxcbiAgICByZXN1bHRzOiByZXN1bHRMaXN0LFxuICB9O1xufSk7XG4iXX0=
|
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Public API for the EC2 instance running scheduler CDK library.
|
|
3
3
|
*
|
|
4
|
-
* Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack},
|
|
4
|
+
* Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack},
|
|
5
|
+
* optional {@link FailureDetectionAlarms} / {@link RunningSchedulerFailureDetection}, and related prop types.
|
|
5
6
|
*/
|
|
6
7
|
export * from './constructs/ec2-instance-running-scheduler';
|
|
7
8
|
export * from './stacks/ec2-instance-running-schedule-stack';
|
package/lib/index.js
CHANGED
|
@@ -17,8 +17,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
/**
|
|
18
18
|
* Public API for the EC2 instance running scheduler CDK library.
|
|
19
19
|
*
|
|
20
|
-
* Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack},
|
|
20
|
+
* Exports {@link EC2InstanceRunningScheduler}, {@link EC2InstanceRunningScheduleStack},
|
|
21
|
+
* optional {@link FailureDetectionAlarms} / {@link RunningSchedulerFailureDetection}, and related prop types.
|
|
21
22
|
*/
|
|
22
23
|
__exportStar(require("./constructs/ec2-instance-running-scheduler"), exports);
|
|
23
24
|
__exportStar(require("./stacks/ec2-instance-running-schedule-stack"), exports);
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7OztHQUtHO0FBQ0gsOEVBQTREO0FBQzVELCtFQUE2RCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVibGljIEFQSSBmb3IgdGhlIEVDMiBpbnN0YW5jZSBydW5uaW5nIHNjaGVkdWxlciBDREsgbGlicmFyeS5cbiAqXG4gKiBFeHBvcnRzIHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJ9LCB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFja30sXG4gKiBvcHRpb25hbCB7QGxpbmsgRmFpbHVyZURldGVjdGlvbkFsYXJtc30gLyB7QGxpbmsgUnVubmluZ1NjaGVkdWxlckZhaWx1cmVEZXRlY3Rpb259LCBhbmQgcmVsYXRlZCBwcm9wIHR5cGVzLlxuICovXG5leHBvcnQgKiBmcm9tICcuL2NvbnN0cnVjdHMvZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RhY2tzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlLXN0YWNrJzsiXX0=
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Stack, StackProps } from 'aws-cdk-lib';
|
|
2
2
|
import { Construct } from 'constructs';
|
|
3
|
-
import { TargetResource, Secrets, Schedule } from '../constructs/ec2-instance-running-scheduler';
|
|
3
|
+
import { TargetResource, Secrets, Schedule, type FailureDetectionAlarms } from '../constructs/ec2-instance-running-scheduler';
|
|
4
4
|
/**
|
|
5
5
|
* Props for the EC2 instance running schedule CDK stack.
|
|
6
6
|
*
|
|
7
|
-
* @see {@link EC2InstanceRunningSchedulerProps} for construct-level options not exposed here (e.g. `
|
|
7
|
+
* @see {@link EC2InstanceRunningSchedulerProps} for construct-level options not exposed here (e.g. `resourceWait`).
|
|
8
8
|
*/
|
|
9
9
|
export interface EC2InstanceRunningScheduleStackProps extends StackProps {
|
|
10
10
|
/** Tag-based target resource for EC2 instances to start/stop. */
|
|
@@ -17,9 +17,15 @@ export interface EC2InstanceRunningScheduleStackProps extends StackProps {
|
|
|
17
17
|
readonly stopSchedule?: Schedule;
|
|
18
18
|
/** Cron schedule for starting instances. */
|
|
19
19
|
readonly startSchedule?: Schedule;
|
|
20
|
+
/** Optional CloudWatch failure detection alarms and log-based metrics. */
|
|
21
|
+
readonly failureDetection?: FailureDetectionAlarms;
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
22
24
|
* CDK stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
|
|
25
|
+
*
|
|
26
|
+
* Wires {@link EC2InstanceRunningScheduler} with targeting, schedules, secrets, scheduling toggle,
|
|
27
|
+
* and optional {@link FailureDetectionAlarms}. Does not expose {@link ResourceWaitLimits}; use the
|
|
28
|
+
* construct directly when custom per-instance wait limits are required.
|
|
23
29
|
*/
|
|
24
30
|
export declare class EC2InstanceRunningScheduleStack extends Stack {
|
|
25
31
|
/**
|
|
@@ -27,7 +33,7 @@ export declare class EC2InstanceRunningScheduleStack extends Stack {
|
|
|
27
33
|
*
|
|
28
34
|
* @param scope - Parent construct or app.
|
|
29
35
|
* @param id - Stack id.
|
|
30
|
-
* @param props - Target resource, schedules, secrets, and standard stack props.
|
|
36
|
+
* @param props - Target resource, schedules, secrets, optional failure detection, and standard stack props.
|
|
31
37
|
*/
|
|
32
38
|
constructor(scope: Construct, id: string, props: EC2InstanceRunningScheduleStackProps);
|
|
33
39
|
}
|
|
@@ -6,15 +6,19 @@ const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
|
6
6
|
const ec2_instance_running_scheduler_1 = require("../constructs/ec2-instance-running-scheduler");
|
|
7
7
|
/**
|
|
8
8
|
* CDK stack that deploys the EC2 instance running scheduler (EventBridge Scheduler + Durable Lambda).
|
|
9
|
+
*
|
|
10
|
+
* Wires {@link EC2InstanceRunningScheduler} with targeting, schedules, secrets, scheduling toggle,
|
|
11
|
+
* and optional {@link FailureDetectionAlarms}. Does not expose {@link ResourceWaitLimits}; use the
|
|
12
|
+
* construct directly when custom per-instance wait limits are required.
|
|
9
13
|
*/
|
|
10
14
|
class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
|
|
11
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "0.
|
|
15
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "ec2-instance-running-scheduler.EC2InstanceRunningScheduleStack", version: "0.3.1" };
|
|
12
16
|
/**
|
|
13
17
|
* Creates the stack and wires {@link EC2InstanceRunningScheduler}.
|
|
14
18
|
*
|
|
15
19
|
* @param scope - Parent construct or app.
|
|
16
20
|
* @param id - Stack id.
|
|
17
|
-
* @param props - Target resource, schedules, secrets, and standard stack props.
|
|
21
|
+
* @param props - Target resource, schedules, secrets, optional failure detection, and standard stack props.
|
|
18
22
|
*/
|
|
19
23
|
constructor(scope, id, props) {
|
|
20
24
|
super(scope, id, props);
|
|
@@ -24,8 +28,9 @@ class EC2InstanceRunningScheduleStack extends aws_cdk_lib_1.Stack {
|
|
|
24
28
|
secrets: props.secrets,
|
|
25
29
|
stopSchedule: props.stopSchedule,
|
|
26
30
|
startSchedule: props.startSchedule,
|
|
31
|
+
failureDetection: props.failureDetection,
|
|
27
32
|
});
|
|
28
33
|
}
|
|
29
34
|
}
|
|
30
35
|
exports.EC2InstanceRunningScheduleStack = EC2InstanceRunningScheduleStack;
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWMyLWluc3RhbmNlLXJ1bm5pbmctc2NoZWR1bGUtc3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RhY2tzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSw2Q0FBZ0Q7QUFFaEQsaUdBQTJKO0FBc0IzSjs7Ozs7O0dBTUc7QUFDSCxNQUFhLCtCQUFnQyxTQUFRLG1CQUFLOztJQUN4RDs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJDO1FBQ25GLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksNERBQTJCLENBQUMsSUFBSSxFQUFFLDZCQUE2QixFQUFFO1lBQ25FLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYztZQUNwQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsZ0JBQWdCO1lBQ3hDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTztZQUN0QixZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxhQUFhO1lBQ2xDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFuQkgsMEVBb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RhY2ssIFN0YWNrUHJvcHMgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlciwgVGFyZ2V0UmVzb3VyY2UsIFNlY3JldHMsIFNjaGVkdWxlLCB0eXBlIEZhaWx1cmVEZXRlY3Rpb25BbGFybXMgfSBmcm9tICcuLi9jb25zdHJ1Y3RzL2VjMi1pbnN0YW5jZS1ydW5uaW5nLXNjaGVkdWxlcic7XG5cbi8qKlxuICogUHJvcHMgZm9yIHRoZSBFQzIgaW5zdGFuY2UgcnVubmluZyBzY2hlZHVsZSBDREsgc3RhY2suXG4gKlxuICogQHNlZSB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyUHJvcHN9IGZvciBjb25zdHJ1Y3QtbGV2ZWwgb3B0aW9ucyBub3QgZXhwb3NlZCBoZXJlIChlLmcuIGByZXNvdXJjZVdhaXRgKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZVN0YWNrUHJvcHMgZXh0ZW5kcyBTdGFja1Byb3BzIHtcbiAgLyoqIFRhZy1iYXNlZCB0YXJnZXQgcmVzb3VyY2UgZm9yIEVDMiBpbnN0YW5jZXMgdG8gc3RhcnQvc3RvcC4gKi9cbiAgcmVhZG9ubHkgdGFyZ2V0UmVzb3VyY2U6IFRhcmdldFJlc291cmNlO1xuICAvKiogV2hldGhlciBzY2hlZHVsaW5nIGlzIGVuYWJsZWQuIERlZmF1bHRzIHRvIHRydWUgaWYgb21pdHRlZC4gKi9cbiAgcmVhZG9ubHkgZW5hYmxlU2NoZWR1bGluZz86IGJvb2xlYW47XG4gIC8qKiBTZWNyZXRzIChlLmcuIFNsYWNrKSBmb3IgdGhlIHNjaGVkdWxlci4gKi9cbiAgcmVhZG9ubHkgc2VjcmV0czogU2VjcmV0cztcbiAgLyoqIENyb24gc2NoZWR1bGUgZm9yIHN0b3BwaW5nIGluc3RhbmNlcy4gKi9cbiAgcmVhZG9ubHkgc3RvcFNjaGVkdWxlPzogU2NoZWR1bGU7XG4gIC8qKiBDcm9uIHNjaGVkdWxlIGZvciBzdGFydGluZyBpbnN0YW5jZXMuICovXG4gIHJlYWRvbmx5IHN0YXJ0U2NoZWR1bGU/OiBTY2hlZHVsZTtcbiAgLyoqIE9wdGlvbmFsIENsb3VkV2F0Y2ggZmFpbHVyZSBkZXRlY3Rpb24gYWxhcm1zIGFuZCBsb2ctYmFzZWQgbWV0cmljcy4gKi9cbiAgcmVhZG9ubHkgZmFpbHVyZURldGVjdGlvbj86IEZhaWx1cmVEZXRlY3Rpb25BbGFybXM7XG59XG5cbi8qKlxuICogQ0RLIHN0YWNrIHRoYXQgZGVwbG95cyB0aGUgRUMyIGluc3RhbmNlIHJ1bm5pbmcgc2NoZWR1bGVyIChFdmVudEJyaWRnZSBTY2hlZHVsZXIgKyBEdXJhYmxlIExhbWJkYSkuXG4gKlxuICogV2lyZXMge0BsaW5rIEVDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcn0gd2l0aCB0YXJnZXRpbmcsIHNjaGVkdWxlcywgc2VjcmV0cywgc2NoZWR1bGluZyB0b2dnbGUsXG4gKiBhbmQgb3B0aW9uYWwge0BsaW5rIEZhaWx1cmVEZXRlY3Rpb25BbGFybXN9LiBEb2VzIG5vdCBleHBvc2Uge0BsaW5rIFJlc291cmNlV2FpdExpbWl0c307IHVzZSB0aGVcbiAqIGNvbnN0cnVjdCBkaXJlY3RseSB3aGVuIGN1c3RvbSBwZXItaW5zdGFuY2Ugd2FpdCBsaW1pdHMgYXJlIHJlcXVpcmVkLlxuICovXG5leHBvcnQgY2xhc3MgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVTdGFjayBleHRlbmRzIFN0YWNrIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIHN0YWNrIGFuZCB3aXJlcyB7QGxpbmsgRUMySW5zdGFuY2VSdW5uaW5nU2NoZWR1bGVyfS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gUGFyZW50IGNvbnN0cnVjdCBvciBhcHAuXG4gICAqIEBwYXJhbSBpZCAtIFN0YWNrIGlkLlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUYXJnZXQgcmVzb3VyY2UsIHNjaGVkdWxlcywgc2VjcmV0cywgb3B0aW9uYWwgZmFpbHVyZSBkZXRlY3Rpb24sIGFuZCBzdGFuZGFyZCBzdGFjayBwcm9wcy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZVN0YWNrUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIG5ldyBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXIodGhpcywgJ0VDMkluc3RhbmNlUnVubmluZ1NjaGVkdWxlcicsIHtcbiAgICAgIHRhcmdldFJlc291cmNlOiBwcm9wcy50YXJnZXRSZXNvdXJjZSxcbiAgICAgIGVuYWJsZVNjaGVkdWxpbmc6IHByb3BzLmVuYWJsZVNjaGVkdWxpbmcsXG4gICAgICBzZWNyZXRzOiBwcm9wcy5zZWNyZXRzLFxuICAgICAgc3RvcFNjaGVkdWxlOiBwcm9wcy5zdG9wU2NoZWR1bGUsXG4gICAgICBzdGFydFNjaGVkdWxlOiBwcm9wcy5zdGFydFNjaGVkdWxlLFxuICAgICAgZmFpbHVyZURldGVjdGlvbjogcHJvcHMuZmFpbHVyZURldGVjdGlvbixcbiAgICB9KTtcbiAgfVxufSJdfQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ec2-instance-running-scheduler",
|
|
3
|
-
"description": "AWS CDK construct library that starts and stops EC2 instances on a cron schedule using EventBridge Scheduler and a Durable Execution Lambda. The handler discovers instances with the Resource Groups Tagging API, issues start/stop,
|
|
3
|
+
"description": "AWS CDK construct library that starts and stops EC2 instances on a cron schedule using EventBridge Scheduler and a Durable Execution Lambda. The handler discovers instances with the Resource Groups Tagging API, issues start/stop, waits until each instance reaches a stable target state (durable step / wait), processes multiple instances in parallel (bounded concurrency), and posts Slack summary and per-instance thread messages using a secret from Secrets Manager. The Lambda emits structured application logs alongside JSON platform logs.",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/gammarers-aws-cdk-constructs/ec2-instance-running-scheduler.git"
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"@typescript-eslint/eslint-plugin": "^8",
|
|
50
50
|
"@typescript-eslint/parser": "^8",
|
|
51
51
|
"aws-cdk-lib": "2.232.0",
|
|
52
|
-
"aws-lambda-secret-fetcher": "^0.
|
|
52
|
+
"aws-lambda-secret-fetcher": "^0.6.1",
|
|
53
53
|
"aws-sdk-client-mock": "^2",
|
|
54
54
|
"aws-sdk-client-mock-jest": "^2",
|
|
55
55
|
"commit-and-tag-version": "^12",
|
|
@@ -65,8 +65,8 @@
|
|
|
65
65
|
"jsii-docgen": "^10.5.0",
|
|
66
66
|
"jsii-pacmak": "^1.138.0",
|
|
67
67
|
"jsii-rosetta": "5.9.x",
|
|
68
|
-
"projen": "^0.101.
|
|
69
|
-
"
|
|
68
|
+
"projen": "^0.101.11",
|
|
69
|
+
"strict-env-resolver": "^0.5.1",
|
|
70
70
|
"ts-jest": "^29.4.11",
|
|
71
71
|
"ts-node": "^10.9.2",
|
|
72
72
|
"typescript": "5.9.x"
|
|
@@ -89,8 +89,7 @@
|
|
|
89
89
|
},
|
|
90
90
|
"devEngines": {
|
|
91
91
|
"packageManager": {
|
|
92
|
-
"name": "
|
|
93
|
-
"version": "1.22.22",
|
|
92
|
+
"name": "npm",
|
|
94
93
|
"onFail": "ignore"
|
|
95
94
|
}
|
|
96
95
|
},
|
|
@@ -100,7 +99,7 @@
|
|
|
100
99
|
"publishConfig": {
|
|
101
100
|
"access": "public"
|
|
102
101
|
},
|
|
103
|
-
"version": "0.
|
|
102
|
+
"version": "0.3.1",
|
|
104
103
|
"jest": {
|
|
105
104
|
"coverageProvider": "v8",
|
|
106
105
|
"testMatch": [
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Environment variable names for per-instance polling limits.
|
|
3
|
-
*
|
|
4
|
-
* Values are set by {@link EC2InstanceRunningScheduler} and read at handler cold start.
|
|
5
|
-
*/
|
|
6
|
-
/**
|
|
7
|
-
* Lambda environment variable name for max poll loop count.
|
|
8
|
-
*
|
|
9
|
-
* @see {@link parseResourcePollingLimitsFromEnv} in `running-scheduler-polling-env.ts`
|
|
10
|
-
*/
|
|
11
|
-
export declare const PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = "PROCESS_RESOURCE_MAX_LOOP_COUNT";
|
|
12
|
-
/**
|
|
13
|
-
* Lambda environment variable name for max poll elapsed seconds.
|
|
14
|
-
*
|
|
15
|
-
* @see {@link parseResourcePollingLimitsFromEnv} in `running-scheduler-polling-env.ts`
|
|
16
|
-
*/
|
|
17
|
-
export declare const PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = "PROCESS_RESOURCE_MAX_ELAPSED_SECONDS";
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Environment variable names for per-instance polling limits.
|
|
4
|
-
*
|
|
5
|
-
* Values are set by {@link EC2InstanceRunningScheduler} and read at handler cold start.
|
|
6
|
-
*/
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = exports.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = void 0;
|
|
9
|
-
/**
|
|
10
|
-
* Lambda environment variable name for max poll loop count.
|
|
11
|
-
*
|
|
12
|
-
* @see {@link parseResourcePollingLimitsFromEnv} in `running-scheduler-polling-env.ts`
|
|
13
|
-
*/
|
|
14
|
-
exports.PROCESS_RESOURCE_MAX_LOOP_COUNT_ENV = 'PROCESS_RESOURCE_MAX_LOOP_COUNT';
|
|
15
|
-
/**
|
|
16
|
-
* Lambda environment variable name for max poll elapsed seconds.
|
|
17
|
-
*
|
|
18
|
-
* @see {@link parseResourcePollingLimitsFromEnv} in `running-scheduler-polling-env.ts`
|
|
19
|
-
*/
|
|
20
|
-
exports.PROCESS_RESOURCE_MAX_ELAPSED_SECONDS_ENV = 'PROCESS_RESOURCE_MAX_ELAPSED_SECONDS';
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVubmluZy1zY2hlZHVsZXItcG9sbGluZy1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZnVuY3MvcnVubmluZy1zY2hlZHVsZXItcG9sbGluZy1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7O0dBSUc7OztBQUVIOzs7O0dBSUc7QUFDVSxRQUFBLG1DQUFtQyxHQUFHLGlDQUFpQyxDQUFDO0FBRXJGOzs7O0dBSUc7QUFDVSxRQUFBLHdDQUF3QyxHQUFHLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyBmb3IgcGVyLWluc3RhbmNlIHBvbGxpbmcgbGltaXRzLlxuICpcbiAqIFZhbHVlcyBhcmUgc2V0IGJ5IHtAbGluayBFQzJJbnN0YW5jZVJ1bm5pbmdTY2hlZHVsZXJ9IGFuZCByZWFkIGF0IGhhbmRsZXIgY29sZCBzdGFydC5cbiAqL1xuXG4vKipcbiAqIExhbWJkYSBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lIGZvciBtYXggcG9sbCBsb29wIGNvdW50LlxuICpcbiAqIEBzZWUge0BsaW5rIHBhcnNlUmVzb3VyY2VQb2xsaW5nTGltaXRzRnJvbUVudn0gaW4gYHJ1bm5pbmctc2NoZWR1bGVyLXBvbGxpbmctZW52LnRzYFxuICovXG5leHBvcnQgY29uc3QgUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVF9FTlYgPSAnUFJPQ0VTU19SRVNPVVJDRV9NQVhfTE9PUF9DT1VOVCc7XG5cbi8qKlxuICogTGFtYmRhIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWUgZm9yIG1heCBwb2xsIGVsYXBzZWQgc2Vjb25kcy5cbiAqXG4gKiBAc2VlIHtAbGluayBwYXJzZVJlc291cmNlUG9sbGluZ0xpbWl0c0Zyb21FbnZ9IGluIGBydW5uaW5nLXNjaGVkdWxlci1wb2xsaW5nLWVudi50c2BcbiAqL1xuZXhwb3J0IGNvbnN0IFBST0NFU1NfUkVTT1VSQ0VfTUFYX0VMQVBTRURfU0VDT05EU19FTlYgPSAnUFJPQ0VTU19SRVNPVVJDRV9NQVhfRUxBUFNFRF9TRUNPTkRTJztcbiJdfQ==
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { type ResourcePollingLimits } from './running-scheduler-predicates';
|
|
2
|
-
/**
|
|
3
|
-
* Reads per-instance polling limits from Lambda environment variables set by the CDK construct.
|
|
4
|
-
*
|
|
5
|
-
* @returns Parsed limits, using {@link DEFAULT_RESOURCE_POLLING_LIMITS} when variables are unset.
|
|
6
|
-
* @throws {Error} When a set variable is not a positive integer.
|
|
7
|
-
*/
|
|
8
|
-
export declare const parseResourcePollingLimitsFromEnv: () => ResourcePollingLimits;
|