@pipeline-builder/pipeline-events 4.3.2 → 4.3.4
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/lib/failure-reason.d.ts +37 -0
- package/lib/failure-reason.js +111 -0
- package/lib/health.d.ts +3 -2
- package/lib/health.js +11 -9
- package/lib/index.d.ts +2 -2
- package/lib/index.js +201 -43
- package/lib/parse.d.ts +18 -0
- package/lib/parse.js +45 -2
- package/lib/tags.js +8 -8
- package/lib/util.d.ts +7 -0
- package/lib/util.js +11 -1
- package/package.json +4 -3
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type SynthFailure } from '@pipeline-builder/pipeline-core/lib/core/synth-failure.js';
|
|
2
|
+
/**
|
|
3
|
+
* The build id of a failed CodeBuild action, from the event detail; null for a
|
|
4
|
+
* non-CodeBuild action or an event that carries no external execution id.
|
|
5
|
+
*/
|
|
6
|
+
export declare function codeBuildIdOf(detail: Record<string, unknown>): string | null;
|
|
7
|
+
/**
|
|
8
|
+
* The compute size a finished CodeBuild action ran on, AS AWS SPELLS IT
|
|
9
|
+
* (`BUILD_GENERAL1_MEDIUM`), or null.
|
|
10
|
+
*
|
|
11
|
+
* Returned raw and narrowed server-side rather than here, for one hard reason:
|
|
12
|
+
* this Lambda ships as a SINGLE bundled file, and the vocabulary lives in the
|
|
13
|
+
* pipeline-core barrel, which carries dynamic imports that break that constraint
|
|
14
|
+
* (`test/single-file-constraint.test.ts` is the check). Sending the raw string
|
|
15
|
+
* also keeps the stored `detail.computeType` the observation rather than an
|
|
16
|
+
* interpretation of it.
|
|
17
|
+
*
|
|
18
|
+
* WHY IT IS READ FROM AWS rather than from our own stored pipeline config: the
|
|
19
|
+
* config holds a step's REQUESTED compute type, and what the build actually ran
|
|
20
|
+
* on is what consumed vCPU — a pipeline edited between the start and the finish
|
|
21
|
+
* would otherwise be priced against the new value. `BatchGetBuilds` answers the
|
|
22
|
+
* authoritative one, and this Lambda already holds that permission for the
|
|
23
|
+
* failure-reason read below.
|
|
24
|
+
*
|
|
25
|
+
* Best-effort, like everything else here: a throttle or a missing permission
|
|
26
|
+
* yields null, the event forwards without the field, and the ingest records that
|
|
27
|
+
* action as unmeasured rather than as free. A size that cannot be read must not
|
|
28
|
+
* be guessed — SMALL is the cheapest and therefore the most flattering guess.
|
|
29
|
+
*
|
|
30
|
+
* NOT folded into {@link readSynthFailure}, which makes the same call: that one
|
|
31
|
+
* runs on FAILED actions only, this one on every terminal CodeBuild action, and
|
|
32
|
+
* sharing a cache between them would mean holding build records for the whole
|
|
33
|
+
* batch to save one call on the minority path.
|
|
34
|
+
*/
|
|
35
|
+
export declare function readBuildCompute(region: string, buildId: string): Promise<string | null>;
|
|
36
|
+
/** Find the `PB_SYNTH_FAILURE` line in a failed build's log, or null. */
|
|
37
|
+
export declare function readSynthFailure(region: string, buildId: string): Promise<SynthFailure | null>;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { parseSynthFailure, SYNTH_FAILURE_MARKER } from '@pipeline-builder/pipeline-core/lib/core/synth-failure.js';
|
|
4
|
+
import { loadSdk, log } from './util.js';
|
|
5
|
+
let loader = loadSdk;
|
|
6
|
+
const clients = new Map();
|
|
7
|
+
/** @internal Test-only: substitute the SDK loader (and drop cached clients). */
|
|
8
|
+
export function _setFailureReasonLoaderForTests(next) {
|
|
9
|
+
loader = next ?? loadSdk;
|
|
10
|
+
clients.clear();
|
|
11
|
+
}
|
|
12
|
+
async function client(kind, region) {
|
|
13
|
+
const mod = kind === 'codebuild'
|
|
14
|
+
? await loader('@aws-sdk/client-codebuild')
|
|
15
|
+
: await loader('@aws-sdk/client-cloudwatch-logs');
|
|
16
|
+
const key = `${kind}:${region}`;
|
|
17
|
+
let c = clients.get(key);
|
|
18
|
+
if (!c) {
|
|
19
|
+
c = kind === 'codebuild'
|
|
20
|
+
? new mod.CodeBuildClient({ region })
|
|
21
|
+
: new mod.CloudWatchLogsClient({ region });
|
|
22
|
+
clients.set(key, c);
|
|
23
|
+
}
|
|
24
|
+
return { client: c, mod };
|
|
25
|
+
}
|
|
26
|
+
/** A CodeBuild build id: `<project>:<uuid>`. */
|
|
27
|
+
const BUILD_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{1,254}:[0-9a-f-]{36}$/;
|
|
28
|
+
/**
|
|
29
|
+
* The build id of a failed CodeBuild action, from the event detail; null for a
|
|
30
|
+
* non-CodeBuild action or an event that carries no external execution id.
|
|
31
|
+
*/
|
|
32
|
+
export function codeBuildIdOf(detail) {
|
|
33
|
+
const type = detail.type;
|
|
34
|
+
if (type?.provider !== undefined && type.provider !== 'CodeBuild')
|
|
35
|
+
return null;
|
|
36
|
+
const result = detail['execution-result'];
|
|
37
|
+
const id = result?.['external-execution-id'];
|
|
38
|
+
return typeof id === 'string' && BUILD_ID_RE.test(id) ? id : null;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The compute size a finished CodeBuild action ran on, AS AWS SPELLS IT
|
|
42
|
+
* (`BUILD_GENERAL1_MEDIUM`), or null.
|
|
43
|
+
*
|
|
44
|
+
* Returned raw and narrowed server-side rather than here, for one hard reason:
|
|
45
|
+
* this Lambda ships as a SINGLE bundled file, and the vocabulary lives in the
|
|
46
|
+
* pipeline-core barrel, which carries dynamic imports that break that constraint
|
|
47
|
+
* (`test/single-file-constraint.test.ts` is the check). Sending the raw string
|
|
48
|
+
* also keeps the stored `detail.computeType` the observation rather than an
|
|
49
|
+
* interpretation of it.
|
|
50
|
+
*
|
|
51
|
+
* WHY IT IS READ FROM AWS rather than from our own stored pipeline config: the
|
|
52
|
+
* config holds a step's REQUESTED compute type, and what the build actually ran
|
|
53
|
+
* on is what consumed vCPU — a pipeline edited between the start and the finish
|
|
54
|
+
* would otherwise be priced against the new value. `BatchGetBuilds` answers the
|
|
55
|
+
* authoritative one, and this Lambda already holds that permission for the
|
|
56
|
+
* failure-reason read below.
|
|
57
|
+
*
|
|
58
|
+
* Best-effort, like everything else here: a throttle or a missing permission
|
|
59
|
+
* yields null, the event forwards without the field, and the ingest records that
|
|
60
|
+
* action as unmeasured rather than as free. A size that cannot be read must not
|
|
61
|
+
* be guessed — SMALL is the cheapest and therefore the most flattering guess.
|
|
62
|
+
*
|
|
63
|
+
* NOT folded into {@link readSynthFailure}, which makes the same call: that one
|
|
64
|
+
* runs on FAILED actions only, this one on every terminal CodeBuild action, and
|
|
65
|
+
* sharing a cache between them would mean holding build records for the whole
|
|
66
|
+
* batch to save one call on the minority path.
|
|
67
|
+
*/
|
|
68
|
+
export async function readBuildCompute(region, buildId) {
|
|
69
|
+
try {
|
|
70
|
+
const cb = await client('codebuild', region);
|
|
71
|
+
const out = await cb.client.send(new cb.mod.BatchGetBuildsCommand({ ids: [buildId] }));
|
|
72
|
+
return out.builds?.[0]?.environment?.computeType ?? null;
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
log.warn('Could not read the build\'s compute size (forwarding without it)', {
|
|
76
|
+
buildId, error: String(err),
|
|
77
|
+
});
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Find the `PB_SYNTH_FAILURE` line in a failed build's log, or null. */
|
|
82
|
+
export async function readSynthFailure(region, buildId) {
|
|
83
|
+
try {
|
|
84
|
+
const cb = await client('codebuild', region);
|
|
85
|
+
const out = await cb.client.send(new cb.mod.BatchGetBuildsCommand({ ids: [buildId] }));
|
|
86
|
+
const logs = out.builds?.[0]?.logs;
|
|
87
|
+
if (!logs?.groupName || !logs.streamName)
|
|
88
|
+
return null;
|
|
89
|
+
const cw = await client('logs', region);
|
|
90
|
+
const res = await cw.client.send(new cw.mod.FilterLogEventsCommand({
|
|
91
|
+
logGroupName: logs.groupName,
|
|
92
|
+
logStreamNames: [logs.streamName],
|
|
93
|
+
filterPattern: `"${SYNTH_FAILURE_MARKER}"`,
|
|
94
|
+
limit: 5,
|
|
95
|
+
}));
|
|
96
|
+
for (const event of res.events ?? []) {
|
|
97
|
+
const failure = typeof event.message === 'string' ? parseSynthFailure(event.message) : null;
|
|
98
|
+
if (failure)
|
|
99
|
+
return failure;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
log.warn('Could not read the failed build\'s structured failure reason (forwarding without it)', {
|
|
105
|
+
buildId,
|
|
106
|
+
error: err instanceof Error ? err.message : String(err),
|
|
107
|
+
});
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFpbHVyZS1yZWFzb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZmFpbHVyZS1yZWFzb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsb0JBQW9CLEVBQXFCLE1BQU0sMkRBQTJELENBQUM7QUFDdkksT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUF5Q3pDLElBQUksTUFBTSxHQUFXLE9BQU8sQ0FBQztBQUM3QixNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUU3QyxnRkFBZ0Y7QUFDaEYsTUFBTSxVQUFVLCtCQUErQixDQUFDLElBQXdCO0lBQ3RFLE1BQU0sR0FBRyxJQUFJLElBQUksT0FBTyxDQUFDO0lBQ3pCLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNsQixDQUFDO0FBRUQsS0FBSyxVQUFVLE1BQU0sQ0FBQyxJQUEwQixFQUFFLE1BQWM7SUFDOUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLFdBQVc7UUFDOUIsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFrQiwyQkFBMkIsQ0FBQztRQUM1RCxDQUFDLENBQUMsTUFBTSxNQUFNLENBQWEsaUNBQWlDLENBQUMsQ0FBQztJQUNoRSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUNoQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLENBQUMsR0FBRyxJQUFJLEtBQUssV0FBVztZQUN0QixDQUFDLENBQUMsSUFBSyxHQUF1QixDQUFDLGVBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzFELENBQUMsQ0FBQyxJQUFLLEdBQWtCLENBQUMsb0JBQW9CLENBQUMsRUFBRSxN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LFVBQVUsQ0FBQztZQUNqQyxhQUFhLEVBQUUsSUFBSSxvQkFBb0IsR0FBRztZQUMxQyxLQUFLLEVBQUUsQ0FBQztTQUNULENBQUMsQ0FBNkMsQ0FBQztRQUNoRCxLQUFLLE1BQU0sS0FBSyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLENBQUM7WUFDckMsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDNUYsSUFBSSxPQUFPO2dCQUFFLE9BQU8sT0FBTyxDQUFDO1FBQzlCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsR0FBRyxDQUFDLElBQUksQ0FBQyxzRkFBc0YsRUFBRTtZQUMvRixPQUFPO1lBQ1AsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7U0FDeEQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBwYXJzZVN5bnRoRmFpbHVyZSwgU1lOVEhfRkFJTFVSRV9NQVJLRVIsIHR5cGUgU3ludGhGYWlsdXJlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZS9saWIvY29yZS9zeW50aC1mYWlsdXJlLmpzJztcbmltcG9ydCB7IGxvYWRTZGssIGxvZyB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8vIFN0cnVjdHVyZWQgZmFpbHVyZSByZWFzb25zIGZvciBmYWlsZWQgQ29kZUJ1aWxkIGFjdGlvbnMuXG4vL1xuLy8gQSBDb2RlUGlwZWxpbmUgYWN0aW9uLWZhaWx1cmUgZXZlbnQgY2FycmllcyBvbmx5IENvZGVCdWlsZCdzIGdlbmVyaWMgc3VtbWFyeVxuLy8gKFwiRXJyb3Igd2hpbGUgZXhlY3V0aW5nIGNvbW1hbmQ6IOKApiBleGl0IHN0YXR1cyAxXCIpLCBuZXZlciB0aGUgYnVpbGQgb3V0cHV0IOKAlFxuLy8gc28gV0hZIGEgc3ludGggcmVmdXNlZCBhIHBsdWdpbiAobm90IGluc3RhbGxlZCwgZGVuaWVkIGJ5IHBvbGljeSwgYmFkIHNpZ25hdHVyZSlcbi8vIHdhcyByZWFkYWJsZSBvbmx5IGluIHRoZSBidWlsZCBsb2cuIGBwaXBlbGluZS1tYW5hZ2VyIHBpcGVsaW5lIHN5bnRoYCBwcmludHNcbi8vIG9uZSBgUEJfU1lOVEhfRkFJTFVSRSB74oCmfWAgbGluZSB3aGVuIGl0IGZhaWxzIGluc2lkZSBDb2RlQnVpbGQ7IHRoaXMgbW9kdWxlXG4vLyBmaW5kcyB0aGF0IGxpbmUgaW4gdGhlIGZhaWxlZCBidWlsZCdzIENsb3VkV2F0Y2ggbG9nIHN0cmVhbS5cbi8vXG4vLyBJbi1hY2NvdW50IGFuZCBiZXN0LWVmZm9ydDogQmF0Y2hHZXRCdWlsZHMg4oaSIHRoZSBidWlsZCdzIGxvZyBncm91cC9zdHJlYW0g4oaSXG4vLyBGaWx0ZXJMb2dFdmVudHMgZm9yIHRoZSBtYXJrZXIuIEFueSBmYWlsdXJlIChubyBwZXJtaXNzaW9uLCBsb2dzIG5vdCB5ZXRcbi8vIGZsdXNoZWQsIG5vIG1hcmtlcikgeWllbGRzIG51bGwgYW5kIHRoZSBldmVudCBpcyBmb3J3YXJkZWQgd2l0aG91dCBpdCDigJQgYVxuLy8gbWlzc2luZyByZWFzb24gbXVzdCBuZXZlciBob2xkIHVwIGV2ZW50IGluZ2VzdGlvbi4gUmVxdWlyZXNcbi8vIGBjb2RlYnVpbGQ6QmF0Y2hHZXRCdWlsZHNgICsgYGxvZ3M6RmlsdGVyTG9nRXZlbnRzYCAoZXZlbnRzLXN0YWNrLmpzb24pLlxuLy9cbi8vIFRoZSBTREsgY2xpZW50cyBjb21lIGZyb20gdGhlIExhbWJkYSBydW50aW1lICh2YXJpYWJsZS1zcGVjaWZpZXIgbG9hZCwgbGlrZVxuLy8gQ29kZUNvbW1pdC9TUVMpLCBzbyB0aGV5IGFyZSBub3QgZGVwZW5kZW5jaWVzIG9mIHRoaXMgcGFja2FnZS5cblxuaW50ZXJmYWNlIFNka0NsaWVudCB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfVxuaW50ZXJmYWNlIENvZGVCdWlsZE1vZHVsZSB7XG4gIENvZGVCdWlsZENsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gU2RrQ2xpZW50O1xuICBCYXRjaEdldEJ1aWxkc0NvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgaWRzOiBzdHJpbmdbXSB9KSA9PiB1bmtub3duO1xufVxuXG4vKiogV2hhdCBgQmF0Y2hHZXRCdWlsZHNgIGFuc3dlcnMsIGZvciB0aGUgdHdvIHRoaW5ncyB0aGlzIG1vZHVsZSByZWFkcyBvZmYgaXQuICovXG5pbnRlcmZhY2UgQmF0Y2hHZXRCdWlsZHNPdXRwdXQge1xuICBidWlsZHM/OiBBcnJheTx7XG4gICAgbG9ncz86IHsgZ3JvdXBOYW1lPzogc3RyaW5nOyBzdHJlYW1OYW1lPzogc3RyaW5nIH07XG4gICAgZW52aXJvbm1lbnQ/OiB7IGNvbXB1dGVUeXBlPzogc3RyaW5nIH07XG4gIH0+O1xufVxuaW50ZXJmYWNlIExvZ3NNb2R1bGUge1xuICBDbG91ZFdhdGNoTG9nc0NsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gU2RrQ2xpZW50O1xuICBGaWx0ZXJMb2dFdmVudHNDb21tYW5kOiBuZXcgKGlucHV0OiB7XG4gICAgbG9nR3JvdXBOYW1lOiBzdHJpbmc7IGxvZ1N0cmVhbU5hbWVzOiBzdHJpbmdbXTsgZmlsdGVyUGF0dGVybjogc3RyaW5nOyBsaW1pdDogbnVtYmVyO1xuICB9KSA9PiB1bmtub3duO1xufVxuXG50eXBlIExvYWRlciA9IDxUPihwa2c6IHN0cmluZykgPT4gUHJvbWlzZTxUPjtcbmxldCBsb2FkZXI6IExvYWRlciA9IGxvYWRTZGs7XG5jb25zdCBjbGllbnRzID0gbmV3IE1hcDxzdHJpbmcsIFNka0NsaWVudD4oKTtcblxuLyoqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IHN1YnN0aXR1dGUgdGhlIFNESyBsb2FkZXIgKGFuZCBkcm9wIGNhY2hlZCBjbGllbnRzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfc2V0RmFpbHVyZVJlYXNvbkxvYWRlckZvclRlc3RzKG5leHQ6IExvYWRlciB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBsb2FkZXIgPSBuZXh0ID8/IGxvYWRTZGs7XG4gIGNsaWVudHMuY2xlYXIoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xpZW50KGtpbmQ6ICdjb2RlYnVpbGQnIHwgJ2xvZ3MnLCByZWdpb246IHN0cmluZyk6IFByb21pc2U8eyBjbGllbnQ6IFNka0NsaWVudDsgbW9kOiBDb2RlQnVpbGRNb2R1bGUgfCBMb2dzTW9kdWxlIH0+IHtcbiAgY29uc3QgbW9kID0ga2luZCA9PT0gJ2NvZGVidWlsZCdcbiAgICA/IGF3YWl0IGxvYWRlcjxDb2RlQnVpbGRNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtY29kZWJ1aWxkJylcbiAgICA6IGF3YWl0IGxvYWRlcjxMb2dzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LWNsb3Vkd2F0Y2gtbG9ncycpO1xuICBjb25zdCBrZXkgPSBgJHtraW5kfToke3JlZ2lvbn1gO1xuICBsZXQgYyA9IGNsaWVudHMuZ2V0KGtleSk7XG4gIGlmICghYykge1xuICAgIGMgPSBraW5kID09PSAnY29kZWJ1aWxkJ1xuICAgICAgPyBuZXcgKG1vZCBhcyBDb2RlQnVpbGRNb2R1bGUpLkNvZGVCdWlsZENsaWVudCh7IHJlZ2lvbiB9KVxuICAgICAgOiBuZXcgKG1vZCBhcyBMb2dzTW9kdWxlKS5DbG91ZFdhdGNoTG9nc0NsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjbGllbnRzLnNldChrZXksIGMpO1xuICB9XG4gIHJldHVybiB7IGNsaWVudDogYywgbW9kIH07XG59XG5cbi8qKiBBIENvZGVCdWlsZCBidWlsZCBpZDogYDxwcm9qZWN0Pjo8dXVpZD5gLiAqL1xuY29uc3QgQlVJTERfSURfUkUgPSAvXltBLVphLXowLTldW0EtWmEtejAtOV8tXXsxLDI1NH06WzAtOWEtZi1dezM2fSQvO1xuXG4vKipcbiAqIFRoZSBidWlsZCBpZCBvZiBhIGZhaWxlZCBDb2RlQnVpbGQgYWN0aW9uLCBmcm9tIHRoZSBldmVudCBkZXRhaWw7IG51bGwgZm9yIGFcbiAqIG5vbi1Db2RlQnVpbGQgYWN0aW9uIG9yIGFuIGV2ZW50IHRoYXQgY2FycmllcyBubyBleHRlcm5hbCBleGVjdXRpb24gaWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlQnVpbGRJZE9mKGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgdHlwZSA9IGRldGFpbC50eXBlIGFzIHsgcHJvdmlkZXI/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIGlmICh0eXBlPy5wcm92aWRlciAhPT0gdW5kZWZpbmVkICYmIHR5cGUucHJvdmlkZXIgIT09ICdDb2RlQnVpbGQnKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgeyAnZXh0ZXJuYWwtZXhlY3V0aW9uLWlkJz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3QgaWQgPSByZXN1bHQ/LlsnZXh0ZXJuYWwtZXhlY3V0aW9uLWlkJ107XG4gIHJldHVybiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnICYmIEJVSUxEX0lEX1JFLnRlc3QoaWQpID8gaWQgOiBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBjb21wdXRlIHNpemUgYSBmaW5pc2hlZCBDb2RlQnVpbGQgYWN0aW9uIHJhbiBvbiwgQVMgQVdTIFNQRUxMUyBJVFxuICogKGBCVUlMRF9HRU5FUkFMMV9NRURJVU1gKSwgb3IgbnVsbC5cbiAqXG4gKiBSZXR1cm5lZCByYXcgYW5kIG5hcnJvd2VkIHNlcnZlci1zaWRlIHJhdGhlciB0aGFuIGhlcmUsIGZvciBvbmUgaGFyZCByZWFzb246XG4gKiB0aGlzIExhbWJkYSBzaGlwcyBhcyBhIFNJTkdMRSBidW5kbGVkIGZpbGUsIGFuZCB0aGUgdm9jYWJ1bGFyeSBsaXZlcyBpbiB0aGVcbiAqIHBpcGVsaW5lLWNvcmUgYmFycmVsLCB3aGljaCBjYXJyaWVzIGR5bmFtaWMgaW1wb3J0cyB0aGF0IGJyZWFrIHRoYXQgY29uc3RyYWludFxuICogKGB0ZXN0L3NpbmdsZS1maWxlLWNvbnN0cmFpbnQudGVzdC50c2AgaXMgdGhlIGNoZWNrKS4gU2VuZGluZyB0aGUgcmF3IHN0cmluZ1xuICogYWxzbyBrZWVwcyB0aGUgc3RvcmVkIGBkZXRhaWwuY29tcHV0ZVR5cGVgIHRoZSBvYnNlcnZhdGlvbiByYXRoZXIgdGhhbiBhblxuICogaW50ZXJwcmV0YXRpb24gb2YgaXQuXG4gKlxuICogV0hZIElUIElTIFJFQUQgRlJPTSBBV1MgcmF0aGVyIHRoYW4gZnJvbSBvdXIgb3duIHN0b3JlZCBwaXBlbGluZSBjb25maWc6IHRoZVxuICogY29uZmlnIGhvbGRzIGEgc3RlcCdzIFJFUVVFU1RFRCBjb21wdXRlIHR5cGUsIGFuZCB3aGF0IHRoZSBidWlsZCBhY3R1YWxseSByYW5cbiAqIG9uIGlzIHdoYXQgY29uc3VtZWQgdkNQVSDigJQgYSBwaXBlbGluZSBlZGl0ZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIHRoZSBmaW5pc2hcbiAqIHdvdWxkIG90aGVyd2lzZSBiZSBwcmljZWQgYWdhaW5zdCB0aGUgbmV3IHZhbHVlLiBgQmF0Y2hHZXRCdWlsZHNgIGFuc3dlcnMgdGhlXG4gKiBhdXRob3JpdGF0aXZlIG9uZSwgYW5kIHRoaXMgTGFtYmRhIGFscmVhZHkgaG9sZHMgdGhhdCBwZXJtaXNzaW9uIGZvciB0aGVcbiAqIGZhaWx1cmUtcmVhc29uIHJlYWQgYmVsb3cuXG4gKlxuICogQmVzdC1lZmZvcnQsIGxpa2UgZXZlcnl0aGluZyBlbHNlIGhlcmU6IGEgdGhyb3R0bGUgb3IgYSBtaXNzaW5nIHBlcm1pc3Npb25cbiAqIHlpZWxkcyBudWxsLCB0aGUgZXZlbnQgZm9yd2FyZHMgd2l0aG91dCB0aGUgZmllbGQsIGFuZCB0aGUgaW5nZXN0IHJlY29yZHMgdGhhdFxuICogYWN0aW9uIGFzIHVubWVhc3VyZWQgcmF0aGVyIHRoYW4gYXMgZnJlZS4gQSBzaXplIHRoYXQgY2Fubm90IGJlIHJlYWQgbXVzdCBub3RcbiAqIGJlIGd1ZXNzZWQg4oCUIFNNQUxMIGlzIHRoZSBjaGVhcGVzdCBhbmQgdGhlcmVmb3JlIHRoZSBtb3N0IGZsYXR0ZXJpbmcgZ3Vlc3MuXG4gKlxuICogTk9UIGZvbGRlZCBpbnRvIHtAbGluayByZWFkU3ludGhGYWlsdXJlfSwgd2hpY2ggbWFrZXMgdGhlIHNhbWUgY2FsbDogdGhhdCBvbmVcbiAqIHJ1bnMgb24gRkFJTEVEIGFjdGlvbnMgb25seSwgdGhpcyBvbmUgb24gZXZlcnkgdGVybWluYWwgQ29kZUJ1aWxkIGFjdGlvbiwgYW5kXG4gKiBzaGFyaW5nIGEgY2FjaGUgYmV0d2VlbiB0aGVtIHdvdWxkIG1lYW4gaG9sZGluZyBidWlsZCByZWNvcmRzIGZvciB0aGUgd2hvbGVcbiAqIGJhdGNoIHRvIHNhdmUgb25lIGNhbGwgb24gdGhlIG1pbm9yaXR5IHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQnVpbGRDb21wdXRlKHJlZ2lvbjogc3RyaW5nLCBidWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjYiA9IGF3YWl0IGNsaWVudCgnY29kZWJ1aWxkJywgcmVnaW9uKTtcbiAgICBjb25zdCBvdXQgPSBhd2FpdCBjYi5jbGllbnQuc2VuZChcbiAgICAgIG5ldyAoY2IubW9kIGFzIENvZGVCdWlsZE1vZHVsZSkuQmF0Y2hHZXRCdWlsZHNDb21tYW5kKHsgaWRzOiBbYnVpbGRJZF0gfSksXG4gICAgKSBhcyBCYXRjaEdldEJ1aWxkc091dHB1dDtcbiAgICByZXR1cm4gb3V0LmJ1aWxkcz8uWzBdPy5lbnZpcm9ubWVudD8uY29tcHV0ZVR5cGUgPz8gbnVsbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCByZWFkIHRoZSBidWlsZFxcJ3MgY29tcHV0ZSBzaXplIChmb3J3YXJkaW5nIHdpdGhvdXQgaXQpJywge1xuICAgICAgYnVpbGRJZCwgZXJyb3I6IFN0cmluZyhlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKiBGaW5kIHRoZSBgUEJfU1lOVEhfRkFJTFVSRWAgbGluZSBpbiBhIGZhaWxlZCBidWlsZCdzIGxvZywgb3IgbnVsbC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU3ludGhGYWlsdXJlKHJlZ2lvbjogc3RyaW5nLCBidWlsZElkOiBzdHJpbmcpOiBQcm9taXNlPFN5bnRoRmFpbHVyZSB8IG51bGw+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjYiA9IGF3YWl0IGNsaWVudCgnY29kZWJ1aWxkJywgcmVnaW9uKTtcbiAgICBjb25zdCBvdXQgPSBhd2FpdCBjYi5jbGllbnQuc2VuZChcbiAgICAgIG5ldyAoY2IubW9kIGFzIENvZGVCdWlsZE1vZHVsZSkuQmF0Y2hHZXRCdWlsZHNDb21tYW5kKHsgaWRzOiBbYnVpbGRJZF0gfSksXG4gICAgKSBhcyBCYXRjaEdldEJ1aWxkc091dHB1dDtcbiAgICBjb25zdCBsb2dzID0gb3V0LmJ1aWxkcz8uWzBdPy5sb2dzO1xuICAgIGlmICghbG9ncz8uZ3JvdXBOYW1lIHx8ICFsb2dzLnN0cmVhbU5hbWUpIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgY3cgPSBhd2FpdCBjbGllbnQoJ2xvZ3MnLCByZWdpb24pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGN3LmNsaWVudC5zZW5kKG5ldyAoY3cubW9kIGFzIExvZ3NNb2R1bGUpLkZpbHRlckxvZ0V2ZW50c0NvbW1hbmQoe1xuICAgICAgbG9nR3JvdXBOYW1lOiBsb2dzLmdyb3VwTmFtZSxcbiAgICAgIGxvZ1N0cmVhbU5hbWVzOiBbbG9ncy5zdHJlYW1OYW1lXSxcbiAgICAgIGZpbHRlclBhdHRlcm46IGBcIiR7U1lOVEhfRkFJTFVSRV9NQVJLRVJ9XCJgLFxuICAgICAgbGltaXQ6IDUsXG4gICAgfSkpIGFzIHsgZXZlbnRzPzogQXJyYXk8eyBtZXNzYWdlPzogc3RyaW5nIH0+IH07XG4gICAgZm9yIChjb25zdCBldmVudCBvZiByZXMuZXZlbnRzID8/IFtdKSB7XG4gICAgICBjb25zdCBmYWlsdXJlID0gdHlwZW9mIGV2ZW50Lm1lc3NhZ2UgPT09ICdzdHJpbmcnID8gcGFyc2VTeW50aEZhaWx1cmUoZXZlbnQubWVzc2FnZSkgOiBudWxsO1xuICAgICAgaWYgKGZhaWx1cmUpIHJldHVybiBmYWlsdXJlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ0NvdWxkIG5vdCByZWFkIHRoZSBmYWlsZWQgYnVpbGRcXCdzIHN0cnVjdHVyZWQgZmFpbHVyZSByZWFzb24gKGZvcndhcmRpbmcgd2l0aG91dCBpdCknLCB7XG4gICAgICBidWlsZElkLFxuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuIl19
|
package/lib/health.d.ts
CHANGED
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
* Throttled, best-effort post-success work: emit per-org ingest-health and self-heal
|
|
3
3
|
* the DLQ. Never throws. `forwarded`/`lastEventAt` accumulate PER ORG across batches
|
|
4
4
|
* between health posts; `dropped` is the shared fleet DLQ depth snapshot. A per-org
|
|
5
|
-
* counter is zeroed only after that org's health POST is confirmed 2xx.
|
|
5
|
+
* counter is zeroed only after that org's health POST is confirmed 2xx. `requestId`
|
|
6
|
+
* is the batch's request id (see index.ts), sent as `X-Request-Id`.
|
|
6
7
|
*/
|
|
7
|
-
export declare function reportHealthAndRedrive(baseUrl: string, mainQueueArn: string | undefined): Promise<void>;
|
|
8
|
+
export declare function reportHealthAndRedrive(baseUrl: string, mainQueueArn: string | undefined, requestId: string): Promise<void>;
|
|
8
9
|
/** Count a forwarded batch toward each resolved org's delivery-health report. */
|
|
9
10
|
export declare function recordForwarded(events: ReadonlyArray<{
|
|
10
11
|
orgId: string | null;
|
package/lib/health.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { correlationHeaders } from '@pipeline-builder/pipeline-core/lib/core/audit-correlation.js';
|
|
3
4
|
import { getAuthToken } from './auth.js';
|
|
4
|
-
import { BoundedMap, CACHE_MAX_ENTRIES, fetchWithTimeout, loadSdk, log } from './util.js';
|
|
5
|
+
import { arnRef, BoundedMap, CACHE_MAX_ENTRIES, fetchWithTimeout, loadSdk, log } from './util.js';
|
|
5
6
|
let sqsMod;
|
|
6
7
|
let sqsClientsByRegion;
|
|
7
8
|
async function sqsClient(region) {
|
|
@@ -78,12 +79,12 @@ async function startMoveTask(region, dlqArn, mainArn) {
|
|
|
78
79
|
/** POST one org's ingest-health signal. Returns true only on a confirmed 2xx so the
|
|
79
80
|
* caller resets that org's `forwarded` counter ONLY when the signal was accepted
|
|
80
81
|
* (a dropped/failed POST must not silently zero the accumulated count). */
|
|
81
|
-
async function postIngestHealth(baseUrl, body) {
|
|
82
|
+
async function postIngestHealth(baseUrl, body, requestId) {
|
|
82
83
|
try {
|
|
83
84
|
const token = await getAuthToken();
|
|
84
85
|
const res = await fetchWithTimeout(`${baseUrl}/api/reports/ingest-health`, {
|
|
85
86
|
method: 'POST',
|
|
86
|
-
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}
|
|
87
|
+
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}`, ...correlationHeaders({ requestId }) },
|
|
87
88
|
body: JSON.stringify(body),
|
|
88
89
|
});
|
|
89
90
|
if (!res.ok) {
|
|
@@ -101,9 +102,10 @@ async function postIngestHealth(baseUrl, body) {
|
|
|
101
102
|
* Throttled, best-effort post-success work: emit per-org ingest-health and self-heal
|
|
102
103
|
* the DLQ. Never throws. `forwarded`/`lastEventAt` accumulate PER ORG across batches
|
|
103
104
|
* between health posts; `dropped` is the shared fleet DLQ depth snapshot. A per-org
|
|
104
|
-
* counter is zeroed only after that org's health POST is confirmed 2xx.
|
|
105
|
+
* counter is zeroed only after that org's health POST is confirmed 2xx. `requestId`
|
|
106
|
+
* is the batch's request id (see index.ts), sent as `X-Request-Id`.
|
|
105
107
|
*/
|
|
106
|
-
export async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
|
|
108
|
+
export async function reportHealthAndRedrive(baseUrl, mainQueueArn, requestId) {
|
|
107
109
|
const now = Date.now();
|
|
108
110
|
if (now - lastHealthAt < HEALTH_THROTTLE_MS)
|
|
109
111
|
return;
|
|
@@ -136,7 +138,7 @@ export async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
|
|
|
136
138
|
forwarded,
|
|
137
139
|
dropped: depth,
|
|
138
140
|
lastEventAt,
|
|
139
|
-
});
|
|
141
|
+
}, requestId);
|
|
140
142
|
// Reset the forwarded counter ONLY on a confirmed 2xx — a failed/dropped POST
|
|
141
143
|
// keeps the count so the next tick re-reports it instead of losing it.
|
|
142
144
|
if (ok)
|
|
@@ -147,7 +149,7 @@ export async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
|
|
|
147
149
|
// past the ceiling — that message keeps failing and would loop DLQ→main→DLQ.
|
|
148
150
|
if (oldestAgeSec > MAX_DLQ_REDRIVE_AGE_SEC) {
|
|
149
151
|
log.warn('DLQ oldest message exceeds poison-age ceiling — skipping redrive (needs manual attention)', {
|
|
150
|
-
|
|
152
|
+
dlq: arnRef(q.dlqArn), dropped: depth, oldestAgeSec, ceilingSec: MAX_DLQ_REDRIVE_AGE_SEC,
|
|
151
153
|
});
|
|
152
154
|
}
|
|
153
155
|
else {
|
|
@@ -155,7 +157,7 @@ export async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
|
|
|
155
157
|
if (!(await hasActiveMoveTask(q.region, q.dlqArn))) {
|
|
156
158
|
lastRedriveAt = now;
|
|
157
159
|
await startMoveTask(q.region, q.dlqArn, q.mainArn);
|
|
158
|
-
log.info('Started self-healing DLQ→main redrive', {
|
|
160
|
+
log.info('Started self-healing DLQ→main redrive', { dlq: arnRef(q.dlqArn), dropped: depth, oldestAgeSec });
|
|
159
161
|
}
|
|
160
162
|
}
|
|
161
163
|
catch (err) {
|
|
@@ -188,4 +190,4 @@ export function _resetHealthForTests() {
|
|
|
188
190
|
lastHealthAt = 0;
|
|
189
191
|
lastRedriveAt = 0;
|
|
190
192
|
}
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlYWx0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBeUIxRixJQUFJLE1BQTZCLENBQUM7QUFDbEMsSUFBSSxrQkFBMEQsQ0FBQztBQUMvRCxLQUFLLFVBQVUsU0FBUyxDQUFDLE1BQWM7SUFDckMsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQVkscUJBQXFCLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsa0JBQWtCO1FBQUUsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixrRkFBa0Y7QUFDbEYsbUZBQW1GO0FBQ25GLG9GQUFvRjtBQUNwRixzRkFBc0Y7QUFDdEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxVQUFVLENBQWlCLGlCQUFpQixDQUFDLENBQUM7QUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsQ0FBaUIsaUJBQWlCLENBQUMsQ0FBQztBQUMzRSxJQUFJLFlBQVksR0FB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Q3ZILEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4QyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUk7Z0JBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNqQixhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZ2V0QXV0aFRva2VuIH0gZnJvbSAnLi9hdXRoLmpzJztcbmltcG9ydCB7IEJvdW5kZWRNYXAsIENBQ0hFX01BWF9FTlRSSUVTLCBmZXRjaFdpdGhUaW1lb3V0LCBsb2FkU2RrLCBsb2cgfSBmcm9tICcuL3V0aWwuanMnO1xuXG4vLyBEZWxpdmVyeSBoZWFsdGggKyBzZWxmLWhlYWxpbmcgRExRIHJlZHJpdmUuXG4vLyBBZnRlciBhIFNVQ0NFU1NGVUwgYmF0Y2ggUE9TVCB3ZSAodGhyb3R0bGVkLCBiZXN0LWVmZm9ydCk6XG4vLyAgIDEuIFBPU1QgYW4gaW5nZXN0LWhlYWx0aCBzaWduYWwgdG8gL2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGggc28gdGhlIFJlcG9ydHMgVUlcbi8vICAgICAgY2FuIHNob3cgZmxvd2luZyAvIHN0YWxlIC8gZHJvcHBpbmcuXG4vLyAgIDIuIElmIHRoZSBETFEgaXMgbm9uLWVtcHR5LCBubyBtb3ZlIHRhc2sgaXMgYWxyZWFkeSBydW5uaW5nLCBBTkQgdGhlIG9sZGVzdCBETFFcbi8vICAgICAgbWVzc2FnZSBpcyB5b3VuZ2VyIHRoYW4gdGhlIHBvaXNvbi1hZ2UgY2VpbGluZywga2ljayBvZmYgYW4gU1FTXG4vLyAgICAgIE1lc3NhZ2VNb3ZlVGFzayAoRExRIOKGkiBtYWluIHF1ZXVlKSBzbyByZXRyeWFibGUgZmFpbHVyZXMgc2VsZi1oZWFsIHdpdGhvdXQgYVxuLy8gICAgICBuZXcgQVdTIHNlcnZpY2UuIFRoZSByZXBvcnRpbmcgaW5nZXN0J3MgcGFydGlhbC11bmlxdWUgaW5kZXggZGVkdXBlcyBhbnlcbi8vICAgICAgcmVkZWxpdmVyZWQgZXZlbnQsIHNvIGEgcmVkcml2ZSBjYW4ndCBkb3VibGUtY291bnQuXG4vLyBHdWFyZHM6IG9ubHkgb24gc3VjY2Vzcywgb25lLWF0LWEtdGltZSAoTGlzdE1lc3NhZ2VNb3ZlVGFza3MpLCBhIHBvaXNvbi1hZ2UgY2VpbGluZ1xuLy8gKHNvIGEgbWVzc2FnZSB0aGF0IGFsd2F5cyBmYWlscyBjYW4ndCBsb29wIERMUeKGkm1haW7ihpJETFEgZm9yZXZlciksIGFuZCB0aHJvdHRsZWQgdmlhXG4vLyBtb2R1bGUgdGltZXN0YW1wcy4gTkVWRVIgdGhyb3dzIOKAlCBhIGZhaWx1cmUgaGVyZSBtdXN0IG5vdCBmYWlsIHRoZSBiYXRjaC5cbi8vXG4vLyBJQU0gcmVxdWlyZWQgKGRvY3VtZW50IG9ubHkg4oCUIGdyYW50ZWQgb24gdGhlIGV2ZW50cyBzdGFjayk6XG4vLyAgIHNxczpHZXRRdWV1ZUF0dHJpYnV0ZXMsIHNxczpMaXN0TWVzc2FnZU1vdmVUYXNrcywgc3FzOlN0YXJ0TWVzc2FnZU1vdmVUYXNrIChvbiB0aGUgRExRKVxuXG5pbnRlcmZhY2UgU3FzQ2xpZW50TGlrZSB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfVxuaW50ZXJmYWNlIFNxc01vZHVsZSB7XG4gIFNRU0NsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gU3FzQ2xpZW50TGlrZTtcbiAgR2V0UXVldWVBdHRyaWJ1dGVzQ29tbWFuZDogbmV3IChpbnB1dDogeyBRdWV1ZVVybDogc3RyaW5nOyBBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10gfSkgPT4gdW5rbm93bjtcbiAgTGlzdE1lc3NhZ2VNb3ZlVGFza3NDb21tYW5kOiBuZXcgKGlucHV0OiB7IFNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG4gIFN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZDogbmV3IChpbnB1dDogeyBTb3VyY2VBcm46IHN0cmluZzsgRGVzdGluYXRpb25Bcm4/OiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbn1cbmxldCBzcXNNb2Q6IFNxc01vZHVsZSB8IHVuZGVmaW5lZDtcbmxldCBzcXNDbGllbnRzQnlSZWdpb246IE1hcDxzdHJpbmcsIFNxc0NsaWVudExpa2U+IHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gc3FzQ2xpZW50KHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxTcXNDbGllbnRMaWtlPiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgaWYgKCFzcXNDbGllbnRzQnlSZWdpb24pIHNxc0NsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXAoKTtcbiAgbGV0IGNsaWVudCA9IHNxc0NsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjbGllbnQgPSBuZXcgc3FzTW9kLlNRU0NsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBzcXNDbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vLyBEZWxpdmVyeS1oZWFsdGggY291bnRlcnMgYXJlIGF0dHJpYnV0ZWQgUEVSIFJFU09MVkVEIE9SRyAodGhlIGZvcndhcmRlciBpcyBhIGZsZWV0XG4vLyBMYW1iZGEgc2VydmluZyBtYW55IG9yZ3M7IGEgc2luZ2xlIGdsb2JhbCBjb3VudGVyIHdvdWxkIG1pcy1hdHRyaWJ1dGUgb25lIG9yZydzXG4vLyB0aHJvdWdocHV0IHRvIGFub3RoZXIpLiBLZXllZCBieSBvcmdJZCAoJycgYnVja2V0ID0gcGlwZWxpbmUgd2l0aCBubyBPcmdJZCB0YWcpLlxuLy8gVGhlIERMUSBkZXB0aCAoYGRyb3BwZWRgKSBpcyBnZW51aW5lbHkgZmxlZXQtZ2xvYmFsIOKAlCBvbmUgc2hhcmVkIERMUSDigJQgc28gaXQgaXMgYVxuLy8gc2luZ2xlIHNuYXBzaG90IHBvc3RlZCBhbG9uZ3NpZGUgZWFjaCBvcmcncyBoZWFsdGgsIGRvY3VtZW50ZWQgYXMgdGhlIHNoYXJlZCBkZXB0aC5cbmNvbnN0IGZvcndhcmRlZEJ5T3JnID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCBudW1iZXI+KENBQ0hFX01BWF9FTlRSSUVTKTtcbmNvbnN0IGxhc3RFdmVudEF0QnlPcmcgPSBuZXcgQm91bmRlZE1hcDxzdHJpbmcsIHN0cmluZz4oQ0FDSEVfTUFYX0VOVFJJRVMpO1xubGV0IGxhc3RIZWFsdGhBdCA9IDA7XG5sZXQgbGFzdFJlZHJpdmVBdCA9IDA7XG5jb25zdCBIRUFMVEhfVEhST1RUTEVfTVMgPSA2MCAqIDEwMDA7XG5jb25zdCBSRURSSVZFX1RIUk9UVExFX01TID0gNSAqIDYwICogMTAwMDtcbi8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IGlmIHRoZSBvbGRlc3QgRExRIG1lc3NhZ2UgaXMgb2xkZXIgdGhhbiB0aGlzLCB3ZSBTVE9QXG4vLyByZWRyaXZpbmcgaXQgKERMUeKGkm1haW7ihpJmYWls4oaSRExRIHdvdWxkIGxvb3AgZm9yZXZlcikuIFN1Y2ggbWVzc2FnZXMgYXJlIGxlZnQgZm9yIGFuXG4vLyBhbGFybSAvIG1hbnVhbCBpbnNwZWN0aW9uIGluc3RlYWQgb2YgY2h1cm5pbmcgdGhlIGZsZWV0IGluZGVmaW5pdGVseS5cbmNvbnN0IE1BWF9ETFFfUkVEUklWRV9BR0VfU0VDID0gNiAqIDYwICogNjA7IC8vIDYgaG91cnNcblxuLyoqIFBhcnNlIHRoZSBTUVMgdHJpZ2dlciBBUk4gYW5kIGRlcml2ZSB0aGUgbWFpbiArIERMUSBBUk5zIGFuZCB0aGUgRExRIFVSTC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVF1ZXVlcyhtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcmVnaW9uOiBzdHJpbmc7IG1haW5Bcm46IHN0cmluZzsgZGxxQXJuOiBzdHJpbmc7IGRscVVybDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIW1haW5RdWV1ZUFybikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gYXJuOmF3czpzcXM6e3JlZ2lvbn06e2FjY291bnR9OntuYW1lfVxuICBjb25zdCBwYXJ0cyA9IG1haW5RdWV1ZUFybi5zcGxpdCgnOicpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgNiB8fCBwYXJ0c1syXSAhPT0gJ3NxcycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFssICwgLCByZWdpb24sIGFjY291bnQsIG5hbWVdID0gcGFydHM7XG4gIGNvbnN0IGRscUFybiA9IHByb2Nlc3MuZW52LkVWRU5UX0RMUV9BUk4gfHwgYGFybjphd3M6c3FzOiR7cmVnaW9ufToke2FjY291bnR9OiR7bmFtZX0tZGxxYDtcbiAgY29uc3QgZGxxTmFtZSA9IGRscUFybi5zcGxpdCgnOicpLnBvcCgpID8/IGAke25hbWV9LWRscWA7XG4gIGNvbnN0IGRscVVybCA9IGBodHRwczovL3Nxcy4ke3JlZ2lvbn0uYW1hem9uYXdzLmNvbS8ke2FjY291bnR9LyR7ZGxxTmFtZX1gO1xuICByZXR1cm4geyByZWdpb24sIG1haW5Bcm46IG1haW5RdWV1ZUFybiwgZGxxQXJuLCBkbHFVcmwgfTtcbn1cblxuLyoqIFNuYXBzaG90IHRoZSBETFEgZGVwdGggKyB0aGUgYWdlIChzZWNvbmRzKSBvZiBpdHMgb2xkZXN0IG1lc3NhZ2UgKGZvciB0aGVcbiAqICBwb2lzb24tbWVzc2FnZSByZWRyaXZlIGNlaWxpbmcpLiBNaXNzaW5nL05hTiBhdHRyaWJ1dGVzIGZhbGwgYmFjayB0byAwLiAqL1xuYXN5bmMgZnVuY3Rpb24gZGxxU3RhdHMocmVnaW9uOiBzdHJpbmcsIGRscVVybDogc3RyaW5nKTogUHJvbWlzZTx7IGRlcHRoOiBudW1iZXI7IG9sZGVzdEFnZVNlYzogbnVtYmVyIH0+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5HZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kKHtcbiAgICBRdWV1ZVVybDogZGxxVXJsLFxuICAgIEF0dHJpYnV0ZU5hbWVzOiBbJ0FwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcycsICdBcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZSddLFxuICB9KSkgYXMgeyBBdHRyaWJ1dGVzPzogeyBBcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXM/OiBzdHJpbmc7IEFwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlPzogc3RyaW5nIH0gfTtcbiAgY29uc3QgbiA9IE51bWJlcihvdXQuQXR0cmlidXRlcz8uQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzID8/ICcwJyk7XG4gIGNvbnN0IGFnZSA9IE51bWJlcihvdXQuQXR0cmlidXRlcz8uQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2UgPz8gJzAnKTtcbiAgcmV0dXJuIHtcbiAgICBkZXB0aDogTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDAsXG4gICAgb2xkZXN0QWdlU2VjOiBOdW1iZXIuaXNGaW5pdGUoYWdlKSA/IGFnZSA6IDAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FjdGl2ZU1vdmVUYXNrKHJlZ2lvbjogc3RyaW5nLCBkbHFBcm46IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLkxpc3RNZXNzYWdlTW92ZVRhc2tzQ29tbWFuZCh7IFNvdXJjZUFybjogZGxxQXJuIH0pKSBhcyB7XG4gICAgUmVzdWx0cz86IEFycmF5PHsgU3RhdHVzPzogc3RyaW5nIH0+O1xuICB9O1xuICByZXR1cm4gKG91dC5SZXN1bHRzID8/IFtdKS5zb21lKHQgPT4gdC5TdGF0dXMgPT09ICdSVU5OSU5HJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TW92ZVRhc2socmVnaW9uOiBzdHJpbmcsIGRscUFybjogc3RyaW5nLCBtYWluQXJuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5TdGFydE1lc3NhZ2VNb3ZlVGFza0NvbW1hbmQoeyBTb3VyY2VBcm46IGRscUFybiwgRGVzdGluYXRpb25Bcm46IG1haW5Bcm4gfSkpO1xufVxuXG4vKiogUE9TVCBvbmUgb3JnJ3MgaW5nZXN0LWhlYWx0aCBzaWduYWwuIFJldHVybnMgdHJ1ZSBvbmx5IG9uIGEgY29uZmlybWVkIDJ4eCBzbyB0aGVcbiAqICBjYWxsZXIgcmVzZXRzIHRoYXQgb3JnJ3MgYGZvcndhcmRlZGAgY291bnRlciBPTkxZIHdoZW4gdGhlIHNpZ25hbCB3YXMgYWNjZXB0ZWRcbiAqICAoYSBkcm9wcGVkL2ZhaWxlZCBQT1NUIG11c3Qgbm90IHNpbGVudGx5IHplcm8gdGhlIGFjY3VtdWxhdGVkIGNvdW50KS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RJbmdlc3RIZWFsdGgoYmFzZVVybDogc3RyaW5nLCBib2R5OiB7IG9yZ0lkPzogc3RyaW5nOyBmb3J3YXJkZWQ6IG51bWJlcjsgZHJvcHBlZDogbnVtYmVyOyBsYXN0RXZlbnRBdD86IHN0cmluZyB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBdXRoVG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGAke2Jhc2VVcmx9L2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGhgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGxvZy53YXJuKCdpbmdlc3QtaGVhbHRoIFBPU1QgcmV0dXJuZWQgbm9uLTJ4eCAoaWdub3JlZCknLCB7IHN0YXR1czogcmVzLnN0YXR1cywgb3JnSWQ6IGJvZHkub3JnSWQgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignaW5nZXN0LWhlYWx0aCBQT1NUIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiBTdHJpbmcoZXJyKSwgb3JnSWQ6IGJvZHkub3JnSWQgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3R0bGVkLCBiZXN0LWVmZm9ydCBwb3N0LXN1Y2Nlc3Mgd29yazogZW1pdCBwZXItb3JnIGluZ2VzdC1oZWFsdGggYW5kIHNlbGYtaGVhbFxuICogdGhlIERMUS4gTmV2ZXIgdGhyb3dzLiBgZm9yd2FyZGVkYC9gbGFzdEV2ZW50QXRgIGFjY3VtdWxhdGUgUEVSIE9SRyBhY3Jvc3MgYmF0Y2hlc1xuICogYmV0d2VlbiBoZWFsdGggcG9zdHM7IGBkcm9wcGVkYCBpcyB0aGUgc2hhcmVkIGZsZWV0IERMUSBkZXB0aCBzbmFwc2hvdC4gQSBwZXItb3JnXG4gKiBjb3VudGVyIGlzIHplcm9lZCBvbmx5IGFmdGVyIHRoYXQgb3JnJ3MgaGVhbHRoIFBPU1QgaXMgY29uZmlybWVkIDJ4eC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcG9ydEhlYWx0aEFuZFJlZHJpdmUoYmFzZVVybDogc3RyaW5nLCBtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAobm93IC0gbGFzdEhlYWx0aEF0IDwgSEVBTFRIX1RIUk9UVExFX01TKSByZXR1cm47XG4gIGxhc3RIZWFsdGhBdCA9IG5vdztcbiAgdHJ5IHtcbiAgICBjb25zdCBxID0gZGVyaXZlUXVldWVzKG1haW5RdWV1ZUFybik7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgb2xkZXN0QWdlU2VjID0gMDtcbiAgICBpZiAocSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBkbHFTdGF0cyhxLnJlZ2lvbiwgcS5kbHFVcmwpO1xuICAgICAgICBkZXB0aCA9IHN0YXRzLmRlcHRoO1xuICAgICAgICBvbGRlc3RBZ2VTZWMgPSBzdGF0cy5vbGRlc3RBZ2VTZWM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBzdGF0cyBjaGVjayBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUG9zdCBvbmUgaGVhbHRoIHNpZ25hbCBwZXIgcmVzb2x2ZWQgb3JnLCBhdHRyaWJ1dGluZyBpdHMgb3duIGZvcndhcmRlZCBjb3VudCArXG4gICAgLy8gbGFzdCBldmVudCB0aW1lLiBgZHJvcHBlZGAgKHRoZSBzaGFyZWQgZmxlZXQgRExRIGRlcHRoKSByaWRlcyBhbG9uZyBvbiBlYWNoLlxuICAgIC8vIFNuYXBzaG90IHRoZSBrZXlzIGZpcnN0IHNvIHdlIGRvbid0IG11dGF0ZSB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZy5cbiAgICBjb25zdCBvcmdLZXlzID0gbmV3IFNldChbLi4uZm9yd2FyZGVkQnlPcmcua2V5cygpLCAuLi5sYXN0RXZlbnRBdEJ5T3JnLmtleXMoKV0pO1xuICAgIGlmIChvcmdLZXlzLnNpemUgPT09IDApIG9yZ0tleXMuYWRkKCcnKTsgLy8gbm90aGluZyBmb3J3YXJkZWQgeWV0IOKGkiBzdGlsbCByZXBvcnQgZGVwdGhcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvcmdLZXlzKSB7XG4gICAgICBjb25zdCBmb3J3YXJkZWQgPSBmb3J3YXJkZWRCeU9yZy5nZXQoa2V5KSA/PyAwO1xuICAgICAgY29uc3QgbGFzdEV2ZW50QXQgPSBsYXN0RXZlbnRBdEJ5T3JnLmdldChrZXkpO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCBwb3N0SW5nZXN0SGVhbHRoKGJhc2VVcmwsIHtcbiAgICAgICAgLi4uKGtleSA/IHsgb3JnSWQ6IGtleSB9IDoge30pLFxuICAgICAgICBmb3J3YXJkZWQsXG4gICAgICAgIGRyb3BwZWQ6IGRlcHRoLFxuICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgIH0pO1xuICAgICAgLy8gUmVzZXQgdGhlIGZvcndhcmRlZCBjb3VudGVyIE9OTFkgb24gYSBjb25maXJtZWQgMnh4IOKAlCBhIGZhaWxlZC9kcm9wcGVkIFBPU1RcbiAgICAgIC8vIGtlZXBzIHRoZSBjb3VudCBzbyB0aGUgbmV4dCB0aWNrIHJlLXJlcG9ydHMgaXQgaW5zdGVhZCBvZiBsb3NpbmcgaXQuXG4gICAgICBpZiAob2spIGZvcndhcmRlZEJ5T3JnLnNldChrZXksIDApO1xuICAgIH1cblxuICAgIGlmIChxICYmIGRlcHRoID4gMCAmJiBub3cgLSBsYXN0UmVkcml2ZUF0ID49IFJFRFJJVkVfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IG5ldmVyIHJlZHJpdmUgYSBETFEgd2hvc2Ugb2xkZXN0IG1lc3NhZ2UgaGFzIGFnZWRcbiAgICAgIC8vIHBhc3QgdGhlIGNlaWxpbmcg4oCUIHRoYXQgbWVzc2FnZSBrZWVwcyBmYWlsaW5nIGFuZCB3b3VsZCBsb29wIERMUeKGkm1haW7ihpJETFEuXG4gICAgICBpZiAob2xkZXN0QWdlU2VjID4gTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBvbGRlc3QgbWVzc2FnZSBleGNlZWRzIHBvaXNvbi1hZ2UgY2VpbGluZyDigJQgc2tpcHBpbmcgcmVkcml2ZSAobmVlZHMgbWFudWFsIGF0dGVudGlvbiknLCB7XG4gICAgICAgICAgZGxxQXJuOiBxLmRscUFybiwgZHJvcHBlZDogZGVwdGgsIG9sZGVzdEFnZVNlYywgY2VpbGluZ1NlYzogTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShhd2FpdCBoYXNBY3RpdmVNb3ZlVGFzayhxLnJlZ2lvbiwgcS5kbHFBcm4pKSkge1xuICAgICAgICAgICAgbGFzdFJlZHJpdmVBdCA9IG5vdztcbiAgICAgICAgICAgIGF3YWl0IHN0YXJ0TW92ZVRhc2socS5yZWdpb24sIHEuZGxxQXJuLCBxLm1haW5Bcm4pO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1N0YXJ0ZWQgc2VsZi1oZWFsaW5nIERMUeKGkm1haW4gcmVkcml2ZScsIHsgZGxxQXJuOiBxLmRscUFybiwgZHJvcHBlZDogZGVwdGgsIG9sZGVzdEFnZVNlYyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy53YXJuKCdETFEgcmVkcml2ZSBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdoZWFsdGgvcmVkcml2ZSBzdGVwIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgfVxufVxuXG4vKiogQ291bnQgYSBmb3J3YXJkZWQgYmF0Y2ggdG93YXJkIGVhY2ggcmVzb2x2ZWQgb3JnJ3MgZGVsaXZlcnktaGVhbHRoIHJlcG9ydC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRGb3J3YXJkZWQoZXZlbnRzOiBSZWFkb25seUFycmF5PHsgb3JnSWQ6IHN0cmluZyB8IG51bGw7IGNvbXBsZXRlZEF0Pzogc3RyaW5nOyBzdGFydGVkQXQ/OiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGNvbnN0IGtleSA9IGUub3JnSWQgPz8gJyc7XG4gICAgZm9yd2FyZGVkQnlPcmcuc2V0KGtleSwgKGZvcndhcmRlZEJ5T3JnLmdldChrZXkpID8/IDApICsgMSk7XG4gICAgY29uc3QgYXQgPSBlLmNvbXBsZXRlZEF0IHx8IGUuc3RhcnRlZEF0O1xuICAgIGlmIChhdCkge1xuICAgICAgY29uc3QgcHJldiA9IGxhc3RFdmVudEF0QnlPcmcuZ2V0KGtleSk7XG4gICAgICBpZiAoIXByZXYgfHwgYXQgPiBwcmV2KSBsYXN0RXZlbnRBdEJ5T3JnLnNldChrZXksIGF0KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IGZvcmdldCBoZWFsdGggY291bnRlcnMgYW5kIHRocm90dGxlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRIZWFsdGhGb3JUZXN0cygpOiB2b2lkIHtcbiAgZm9yd2FyZGVkQnlPcmcuY2xlYXIoKTtcbiAgbGFzdEV2ZW50QXRCeU9yZy5jbGVhcigpO1xuICBsYXN0SGVhbHRoQXQgPSAwO1xuICBsYXN0UmVkcml2ZUF0ID0gMDtcbn1cbiJdfQ==
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlYWx0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLCtEQUErRCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQXlCbEcsSUFBSSxNQUE2QixDQUFDO0FBQ2xDLElBQUksa0JBQTBELENBQUM7QUFDL0QsS0FBSyxVQUFVLFNBQVMsQ0FBQyxNQUFjO0lBQ3JDLElBQUksQ0FBQyxNQUFNO1FBQUUsTUFBTSxHQUFHLE1BQU0sT0FBTyxDQUFZLHFCQUFxQixDQUFDLENBQUM7SUFDdEUsSUFBSSxDQUFDLGtCQUFrQjtRQUFFLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDeEQsSUFBSSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxxRkFBcUY7QUFDckYsa0ZBQWtGO0FBQ2xGLG1GQUFtRjtBQUNuRixvRkFBb0Y7QUFDcEYsc0ZBQXNGO0FBQ3RGLE1BQU0sY0FBYyxHQUFHLElBQUksVUFBVSxDQUFpQixpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pFLE1BQU0sZ0JBQWdCLEdB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LENBQUM7UUFDYixHQUFHLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDM0UsQ0FBQztBQUNILENBQUM7QUFFRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUF5RjtJQUN2SCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFCLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDeEMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJO2dCQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakIsYUFBYSxHQUFHLENBQUMsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNvcnJlbGF0aW9uSGVhZGVycyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUvbGliL2NvcmUvYXVkaXQtY29ycmVsYXRpb24uanMnO1xuaW1wb3J0IHsgZ2V0QXV0aFRva2VuIH0gZnJvbSAnLi9hdXRoLmpzJztcbmltcG9ydCB7IGFyblJlZiwgQm91bmRlZE1hcCwgQ0FDSEVfTUFYX0VOVFJJRVMsIGZldGNoV2l0aFRpbWVvdXQsIGxvYWRTZGssIGxvZyB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8vIERlbGl2ZXJ5IGhlYWx0aCArIHNlbGYtaGVhbGluZyBETFEgcmVkcml2ZS5cbi8vIEFmdGVyIGEgU1VDQ0VTU0ZVTCBiYXRjaCBQT1NUIHdlICh0aHJvdHRsZWQsIGJlc3QtZWZmb3J0KTpcbi8vICAgMS4gUE9TVCBhbiBpbmdlc3QtaGVhbHRoIHNpZ25hbCB0byAvYXBpL3JlcG9ydHMvaW5nZXN0LWhlYWx0aCBzbyB0aGUgUmVwb3J0cyBVSVxuLy8gICAgICBjYW4gc2hvdyBmbG93aW5nIC8gc3RhbGUgLyBkcm9wcGluZy5cbi8vICAgMi4gSWYgdGhlIERMUSBpcyBub24tZW1wdHksIG5vIG1vdmUgdGFzayBpcyBhbHJlYWR5IHJ1bm5pbmcsIEFORCB0aGUgb2xkZXN0IERMUVxuLy8gICAgICBtZXNzYWdlIGlzIHlvdW5nZXIgdGhhbiB0aGUgcG9pc29uLWFnZSBjZWlsaW5nLCBraWNrIG9mZiBhbiBTUVNcbi8vICAgICAgTWVzc2FnZU1vdmVUYXNrIChETFEg4oaSIG1haW4gcXVldWUpIHNvIHJldHJ5YWJsZSBmYWlsdXJlcyBzZWxmLWhlYWwgd2l0aG91dCBhXG4vLyAgICAgIG5ldyBBV1Mgc2VydmljZS4gVGhlIHJlcG9ydGluZyBpbmdlc3QncyBwYXJ0aWFsLXVuaXF1ZSBpbmRleCBkZWR1cGVzIGFueVxuLy8gICAgICByZWRlbGl2ZXJlZCBldmVudCwgc28gYSByZWRyaXZlIGNhbid0IGRvdWJsZS1jb3VudC5cbi8vIEd1YXJkczogb25seSBvbiBzdWNjZXNzLCBvbmUtYXQtYS10aW1lIChMaXN0TWVzc2FnZU1vdmVUYXNrcyksIGEgcG9pc29uLWFnZSBjZWlsaW5nXG4vLyAoc28gYSBtZXNzYWdlIHRoYXQgYWx3YXlzIGZhaWxzIGNhbid0IGxvb3AgRExR4oaSbWFpbuKGkkRMUSBmb3JldmVyKSwgYW5kIHRocm90dGxlZCB2aWFcbi8vIG1vZHVsZSB0aW1lc3RhbXBzLiBORVZFUiB0aHJvd3Mg4oCUIGEgZmFpbHVyZSBoZXJlIG11c3Qgbm90IGZhaWwgdGhlIGJhdGNoLlxuLy9cbi8vIElBTSByZXF1aXJlZCAoZG9jdW1lbnQgb25seSDigJQgZ3JhbnRlZCBvbiB0aGUgZXZlbnRzIHN0YWNrKTpcbi8vICAgc3FzOkdldFF1ZXVlQXR0cmlidXRlcywgc3FzOkxpc3RNZXNzYWdlTW92ZVRhc2tzLCBzcXM6U3RhcnRNZXNzYWdlTW92ZVRhc2sgKG9uIHRoZSBETFEpXG5cbmludGVyZmFjZSBTcXNDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB9XG5pbnRlcmZhY2UgU3FzTW9kdWxlIHtcbiAgU1FTQ2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiBTcXNDbGllbnRMaWtlO1xuICBHZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kOiBuZXcgKGlucHV0OiB7IFF1ZXVlVXJsOiBzdHJpbmc7IEF0dHJpYnV0ZU5hbWVzOiBzdHJpbmdbXSB9KSA9PiB1bmtub3duO1xuICBMaXN0TWVzc2FnZU1vdmVUYXNrc0NvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgU291cmNlQXJuOiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbiAgU3RhcnRNZXNzYWdlTW92ZVRhc2tDb21tYW5kOiBuZXcgKGlucHV0OiB7IFNvdXJjZUFybjogc3RyaW5nOyBEZXN0aW5hdGlvbkFybj86IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IHNxc01vZDogU3FzTW9kdWxlIHwgdW5kZWZpbmVkO1xubGV0IHNxc0NsaWVudHNCeVJlZ2lvbjogTWFwPHN0cmluZywgU3FzQ2xpZW50TGlrZT4gfCB1bmRlZmluZWQ7XG5hc3luYyBmdW5jdGlvbiBzcXNDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPFNxc0NsaWVudExpa2U+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBpZiAoIXNxc0NsaWVudHNCeVJlZ2lvbikgc3FzQ2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcCgpO1xuICBsZXQgY2xpZW50ID0gc3FzQ2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNsaWVudCA9IG5ldyBzcXNNb2QuU1FTQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIHNxc0NsaWVudHNCeVJlZ2lvbi5zZXQocmVnaW9uLCBjbGllbnQpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8vIERlbGl2ZXJ5LWhlYWx0aCBjb3VudGVycyBhcmUgYXR0cmlidXRlZCBQRVIgUkVTT0xWRUQgT1JHICh0aGUgZm9yd2FyZGVyIGlzIGEgZmxlZXRcbi8vIExhbWJkYSBzZXJ2aW5nIG1hbnkgb3JnczsgYSBzaW5nbGUgZ2xvYmFsIGNvdW50ZXIgd291bGQgbWlzLWF0dHJpYnV0ZSBvbmUgb3JnJ3Ncbi8vIHRocm91Z2hwdXQgdG8gYW5vdGhlcikuIEtleWVkIGJ5IG9yZ0lkICgnJyBidWNrZXQgPSBwaXBlbGluZSB3aXRoIG5vIE9yZ0lkIHRhZykuXG4vLyBUaGUgRExRIGRlcHRoIChgZHJvcHBlZGApIGlzIGdlbnVpbmVseSBmbGVldC1nbG9iYWwg4oCUIG9uZSBzaGFyZWQgRExRIOKAlCBzbyBpdCBpcyBhXG4vLyBzaW5nbGUgc25hcHNob3QgcG9zdGVkIGFsb25nc2lkZSBlYWNoIG9yZydzIGhlYWx0aCwgZG9jdW1lbnRlZCBhcyB0aGUgc2hhcmVkIGRlcHRoLlxuY29uc3QgZm9yd2FyZGVkQnlPcmcgPSBuZXcgQm91bmRlZE1hcDxzdHJpbmcsIG51bWJlcj4oQ0FDSEVfTUFYX0VOVFJJRVMpO1xuY29uc3QgbGFzdEV2ZW50QXRCeU9yZyA9IG5ldyBCb3VuZGVkTWFwPHN0cmluZywgc3RyaW5nPihDQUNIRV9NQVhfRU5UUklFUyk7XG5sZXQgbGFzdEhlYWx0aEF0ID0gMDtcbmxldCBsYXN0UmVkcml2ZUF0ID0gMDtcbmNvbnN0IEhFQUxUSF9USFJPVFRMRV9NUyA9IDYwICogMTAwMDtcbmNvbnN0IFJFRFJJVkVfVEhST1RUTEVfTVMgPSA1ICogNjAgKiAxMDAwO1xuLy8gUG9pc29uLW1lc3NhZ2UgY2VpbGluZzogaWYgdGhlIG9sZGVzdCBETFEgbWVzc2FnZSBpcyBvbGRlciB0aGFuIHRoaXMsIHdlIFNUT1Bcbi8vIHJlZHJpdmluZyBpdCAoRExR4oaSbWFpbuKGkmZhaWzihpJETFEgd291bGQgbG9vcCBmb3JldmVyKS4gU3VjaCBtZXNzYWdlcyBhcmUgbGVmdCBmb3IgYW5cbi8vIGFsYXJtIC8gbWFudWFsIGluc3BlY3Rpb24gaW5zdGVhZCBvZiBjaHVybmluZyB0aGUgZmxlZXQgaW5kZWZpbml0ZWx5LlxuY29uc3QgTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMgPSA2ICogNjAgKiA2MDsgLy8gNiBob3Vyc1xuXG4vKiogUGFyc2UgdGhlIFNRUyB0cmlnZ2VyIEFSTiBhbmQgZGVyaXZlIHRoZSBtYWluICsgRExRIEFSTnMgYW5kIHRoZSBETFEgVVJMLiAqL1xuZnVuY3Rpb24gZGVyaXZlUXVldWVzKG1haW5RdWV1ZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyByZWdpb246IHN0cmluZzsgbWFpbkFybjogc3RyaW5nOyBkbHFBcm46IHN0cmluZzsgZGxxVXJsOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGlmICghbWFpblF1ZXVlQXJuKSByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyBhcm46YXdzOnNxczp7cmVnaW9ufTp7YWNjb3VudH06e25hbWV9XG4gIGNvbnN0IHBhcnRzID0gbWFpblF1ZXVlQXJuLnNwbGl0KCc6Jyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPCA2IHx8IHBhcnRzWzJdICE9PSAnc3FzJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgWywgLCAsIHJlZ2lvbiwgYWNjb3VudCwgbmFtZV0gPSBwYXJ0cztcbiAgY29uc3QgZGxxQXJuID0gcHJvY2Vzcy5lbnYuRVZFTlRfRExRX0FSTiB8fCBgYXJuOmF3czpzcXM6JHtyZWdpb259OiR7YWNjb3VudH06JHtuYW1lfS1kbHFgO1xuICBjb25zdCBkbHFOYW1lID0gZGxxQXJuLnNwbGl0KCc6JykucG9wKCkgPz8gYCR7bmFtZX0tZGxxYDtcbiAgY29uc3QgZGxxVXJsID0gYGh0dHBzOi8vc3FzLiR7cmVnaW9ufS5hbWF6b25hd3MuY29tLyR7YWNjb3VudH0vJHtkbHFOYW1lfWA7XG4gIHJldHVybiB7IHJlZ2lvbiwgbWFpbkFybjogbWFpblF1ZXVlQXJuLCBkbHFBcm4sIGRscVVybCB9O1xufVxuXG4vKiogU25hcHNob3QgdGhlIERMUSBkZXB0aCArIHRoZSBhZ2UgKHNlY29uZHMpIG9mIGl0cyBvbGRlc3QgbWVzc2FnZSAoZm9yIHRoZVxuICogIHBvaXNvbi1tZXNzYWdlIHJlZHJpdmUgY2VpbGluZykuIE1pc3NpbmcvTmFOIGF0dHJpYnV0ZXMgZmFsbCBiYWNrIHRvIDAuICovXG5hc3luYyBmdW5jdGlvbiBkbHFTdGF0cyhyZWdpb246IHN0cmluZywgZGxxVXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVwdGg6IG51bWJlcjsgb2xkZXN0QWdlU2VjOiBudW1iZXIgfT4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLkdldFF1ZXVlQXR0cmlidXRlc0NvbW1hbmQoe1xuICAgIFF1ZXVlVXJsOiBkbHFVcmwsXG4gICAgQXR0cmlidXRlTmFtZXM6IFsnQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzJywgJ0FwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlJ10sXG4gIH0pKSBhcyB7IEF0dHJpYnV0ZXM/OiB7IEFwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcz86IHN0cmluZzsgQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2U/OiBzdHJpbmcgfSB9O1xuICBjb25zdCBuID0gTnVtYmVyKG91dC5BdHRyaWJ1dGVzPy5BcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXMgPz8gJzAnKTtcbiAgY29uc3QgYWdlID0gTnVtYmVyKG91dC5BdHRyaWJ1dGVzPy5BcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZSA/PyAnMCcpO1xuICByZXR1cm4ge1xuICAgIGRlcHRoOiBOdW1iZXIuaXNGaW5pdGUobikgPyBuIDogMCxcbiAgICBvbGRlc3RBZ2VTZWM6IE51bWJlci5pc0Zpbml0ZShhZ2UpID8gYWdlIDogMCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFzQWN0aXZlTW92ZVRhc2socmVnaW9uOiBzdHJpbmcsIGRscUFybjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgc3FzQ2xpZW50KHJlZ2lvbik7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBzcXNNb2QuTGlzdE1lc3NhZ2VNb3ZlVGFza3NDb21tYW5kKHsgU291cmNlQXJuOiBkbHFBcm4gfSkpIGFzIHtcbiAgICBSZXN1bHRzPzogQXJyYXk8eyBTdGF0dXM/OiBzdHJpbmcgfT47XG4gIH07XG4gIHJldHVybiAob3V0LlJlc3VsdHMgPz8gW10pLnNvbWUodCA9PiB0LlN0YXR1cyA9PT0gJ1JVTk5JTkcnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3RhcnRNb3ZlVGFzayhyZWdpb246IHN0cmluZywgZGxxQXJuOiBzdHJpbmcsIG1haW5Bcm46IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLlN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZCh7IFNvdXJjZUFybjogZGxxQXJuLCBEZXN0aW5hdGlvbkFybjogbWFpbkFybiB9KSk7XG59XG5cbi8qKiBQT1NUIG9uZSBvcmcncyBpbmdlc3QtaGVhbHRoIHNpZ25hbC4gUmV0dXJucyB0cnVlIG9ubHkgb24gYSBjb25maXJtZWQgMnh4IHNvIHRoZVxuICogIGNhbGxlciByZXNldHMgdGhhdCBvcmcncyBgZm9yd2FyZGVkYCBjb3VudGVyIE9OTFkgd2hlbiB0aGUgc2lnbmFsIHdhcyBhY2NlcHRlZFxuICogIChhIGRyb3BwZWQvZmFpbGVkIFBPU1QgbXVzdCBub3Qgc2lsZW50bHkgemVybyB0aGUgYWNjdW11bGF0ZWQgY291bnQpLiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdEluZ2VzdEhlYWx0aChiYXNlVXJsOiBzdHJpbmcsIGJvZHk6IHsgb3JnSWQ/OiBzdHJpbmc7IGZvcndhcmRlZDogbnVtYmVyOyBkcm9wcGVkOiBudW1iZXI7IGxhc3RFdmVudEF0Pzogc3RyaW5nIH0sIHJlcXVlc3RJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBdXRoVG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGAke2Jhc2VVcmx9L2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGhgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCwgLi4uY29ycmVsYXRpb25IZWFkZXJzKHsgcmVxdWVzdElkIH0pIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgbG9nLndhcm4oJ2luZ2VzdC1oZWFsdGggUE9TVCByZXR1cm5lZCBub24tMnh4IChpZ25vcmVkKScsIHsgc3RhdHVzOiByZXMuc3RhdHVzLCBvcmdJZDogYm9keS5vcmdJZCB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdpbmdlc3QtaGVhbHRoIFBPU1QgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IFN0cmluZyhlcnIpLCBvcmdJZDogYm9keS5vcmdJZCB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdHRsZWQsIGJlc3QtZWZmb3J0IHBvc3Qtc3VjY2VzcyB3b3JrOiBlbWl0IHBlci1vcmcgaW5nZXN0LWhlYWx0aCBhbmQgc2VsZi1oZWFsXG4gKiB0aGUgRExRLiBOZXZlciB0aHJvd3MuIGBmb3J3YXJkZWRgL2BsYXN0RXZlbnRBdGAgYWNjdW11bGF0ZSBQRVIgT1JHIGFjcm9zcyBiYXRjaGVzXG4gKiBiZXR3ZWVuIGhlYWx0aCBwb3N0czsgYGRyb3BwZWRgIGlzIHRoZSBzaGFyZWQgZmxlZXQgRExRIGRlcHRoIHNuYXBzaG90LiBBIHBlci1vcmdcbiAqIGNvdW50ZXIgaXMgemVyb2VkIG9ubHkgYWZ0ZXIgdGhhdCBvcmcncyBoZWFsdGggUE9TVCBpcyBjb25maXJtZWQgMnh4LiBgcmVxdWVzdElkYFxuICogaXMgdGhlIGJhdGNoJ3MgcmVxdWVzdCBpZCAoc2VlIGluZGV4LnRzKSwgc2VudCBhcyBgWC1SZXF1ZXN0LUlkYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcG9ydEhlYWx0aEFuZFJlZHJpdmUoYmFzZVVybDogc3RyaW5nLCBtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCwgcmVxdWVzdElkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgaWYgKG5vdyAtIGxhc3RIZWFsdGhBdCA8IEhFQUxUSF9USFJPVFRMRV9NUykgcmV0dXJuO1xuICBsYXN0SGVhbHRoQXQgPSBub3c7XG4gIHRyeSB7XG4gICAgY29uc3QgcSA9IGRlcml2ZVF1ZXVlcyhtYWluUXVldWVBcm4pO1xuICAgIGxldCBkZXB0aCA9IDA7XG4gICAgbGV0IG9sZGVzdEFnZVNlYyA9IDA7XG4gICAgaWYgKHEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZGxxU3RhdHMocS5yZWdpb24sIHEuZGxxVXJsKTtcbiAgICAgICAgZGVwdGggPSBzdGF0cy5kZXB0aDtcbiAgICAgICAgb2xkZXN0QWdlU2VjID0gc3RhdHMub2xkZXN0QWdlU2VjO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGxvZy53YXJuKCdETFEgc3RhdHMgY2hlY2sgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lID8/IFN0cmluZyhlcnIpIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBvc3Qgb25lIGhlYWx0aCBzaWduYWwgcGVyIHJlc29sdmVkIG9yZywgYXR0cmlidXRpbmcgaXRzIG93biBmb3J3YXJkZWQgY291bnQgK1xuICAgIC8vIGxhc3QgZXZlbnQgdGltZS4gYGRyb3BwZWRgICh0aGUgc2hhcmVkIGZsZWV0IERMUSBkZXB0aCkgcmlkZXMgYWxvbmcgb24gZWFjaC5cbiAgICAvLyBTbmFwc2hvdCB0aGUga2V5cyBmaXJzdCBzbyB3ZSBkb24ndCBtdXRhdGUgdGhlIG1hcCB3aGlsZSBpdGVyYXRpbmcuXG4gICAgY29uc3Qgb3JnS2V5cyA9IG5ldyBTZXQoWy4uLmZvcndhcmRlZEJ5T3JnLmtleXMoKSwgLi4ubGFzdEV2ZW50QXRCeU9yZy5rZXlzKCldKTtcbiAgICBpZiAob3JnS2V5cy5zaXplID09PSAwKSBvcmdLZXlzLmFkZCgnJyk7IC8vIG5vdGhpbmcgZm9yd2FyZGVkIHlldCDihpIgc3RpbGwgcmVwb3J0IGRlcHRoXG4gICAgZm9yIChjb25zdCBrZXkgb2Ygb3JnS2V5cykge1xuICAgICAgY29uc3QgZm9yd2FyZGVkID0gZm9yd2FyZGVkQnlPcmcuZ2V0KGtleSkgPz8gMDtcbiAgICAgIGNvbnN0IGxhc3RFdmVudEF0ID0gbGFzdEV2ZW50QXRCeU9yZy5nZXQoa2V5KTtcbiAgICAgIGNvbnN0IG9rID0gYXdhaXQgcG9zdEluZ2VzdEhlYWx0aChiYXNlVXJsLCB7XG4gICAgICAgIC4uLihrZXkgPyB7IG9yZ0lkOiBrZXkgfSA6IHt9KSxcbiAgICAgICAgZm9yd2FyZGVkLFxuICAgICAgICBkcm9wcGVkOiBkZXB0aCxcbiAgICAgICAgbGFzdEV2ZW50QXQsXG4gICAgICB9LCByZXF1ZXN0SWQpO1xuICAgICAgLy8gUmVzZXQgdGhlIGZvcndhcmRlZCBjb3VudGVyIE9OTFkgb24gYSBjb25maXJtZWQgMnh4IOKAlCBhIGZhaWxlZC9kcm9wcGVkIFBPU1RcbiAgICAgIC8vIGtlZXBzIHRoZSBjb3VudCBzbyB0aGUgbmV4dCB0aWNrIHJlLXJlcG9ydHMgaXQgaW5zdGVhZCBvZiBsb3NpbmcgaXQuXG4gICAgICBpZiAob2spIGZvcndhcmRlZEJ5T3JnLnNldChrZXksIDApO1xuICAgIH1cblxuICAgIGlmIChxICYmIGRlcHRoID4gMCAmJiBub3cgLSBsYXN0UmVkcml2ZUF0ID49IFJFRFJJVkVfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IG5ldmVyIHJlZHJpdmUgYSBETFEgd2hvc2Ugb2xkZXN0IG1lc3NhZ2UgaGFzIGFnZWRcbiAgICAgIC8vIHBhc3QgdGhlIGNlaWxpbmcg4oCUIHRoYXQgbWVzc2FnZSBrZWVwcyBmYWlsaW5nIGFuZCB3b3VsZCBsb29wIERMUeKGkm1haW7ihpJETFEuXG4gICAgICBpZiAob2xkZXN0QWdlU2VjID4gTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBvbGRlc3QgbWVzc2FnZSBleGNlZWRzIHBvaXNvbi1hZ2UgY2VpbGluZyDigJQgc2tpcHBpbmcgcmVkcml2ZSAobmVlZHMgbWFudWFsIGF0dGVudGlvbiknLCB7XG4gICAgICAgICAgZGxxOiBhcm5SZWYocS5kbHFBcm4pLCBkcm9wcGVkOiBkZXB0aCwgb2xkZXN0QWdlU2VjLCBjZWlsaW5nU2VjOiBNQVhfRExRX1JFRFJJVkVfQUdFX1NFQyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghKGF3YWl0IGhhc0FjdGl2ZU1vdmVUYXNrKHEucmVnaW9uLCBxLmRscUFybikpKSB7XG4gICAgICAgICAgICBsYXN0UmVkcml2ZUF0ID0gbm93O1xuICAgICAgICAgICAgYXdhaXQgc3RhcnRNb3ZlVGFzayhxLnJlZ2lvbiwgcS5kbHFBcm4sIHEubWFpbkFybik7XG4gICAgICAgICAgICBsb2cuaW5mbygnU3RhcnRlZCBzZWxmLWhlYWxpbmcgRExR4oaSbWFpbiByZWRyaXZlJywgeyBkbHE6IGFyblJlZihxLmRscUFybiksIGRyb3BwZWQ6IGRlcHRoLCBvbGRlc3RBZ2VTZWMgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBsb2cud2FybignRExRIHJlZHJpdmUgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IChlcnIgYXMgeyBuYW1lPzogc3RyaW5nIH0pPy5uYW1lID8/IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignaGVhbHRoL3JlZHJpdmUgc3RlcCBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gIH1cbn1cblxuLyoqIENvdW50IGEgZm9yd2FyZGVkIGJhdGNoIHRvd2FyZCBlYWNoIHJlc29sdmVkIG9yZydzIGRlbGl2ZXJ5LWhlYWx0aCByZXBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkRm9yd2FyZGVkKGV2ZW50czogUmVhZG9ubHlBcnJheTx7IG9yZ0lkOiBzdHJpbmcgfCBudWxsOyBjb21wbGV0ZWRBdD86IHN0cmluZzsgc3RhcnRlZEF0Pzogc3RyaW5nIH0+KTogdm9pZCB7XG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBjb25zdCBrZXkgPSBlLm9yZ0lkID8/ICcnO1xuICAgIGZvcndhcmRlZEJ5T3JnLnNldChrZXksIChmb3J3YXJkZWRCeU9yZy5nZXQoa2V5KSA/PyAwKSArIDEpO1xuICAgIGNvbnN0IGF0ID0gZS5jb21wbGV0ZWRBdCB8fCBlLnN0YXJ0ZWRBdDtcbiAgICBpZiAoYXQpIHtcbiAgICAgIGNvbnN0IHByZXYgPSBsYXN0RXZlbnRBdEJ5T3JnLmdldChrZXkpO1xuICAgICAgaWYgKCFwcmV2IHx8IGF0ID4gcHJldikgbGFzdEV2ZW50QXRCeU9yZy5zZXQoa2V5LCBhdCk7XG4gICAgfVxuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgVGVzdC1vbmx5OiBmb3JnZXQgaGVhbHRoIGNvdW50ZXJzIGFuZCB0aHJvdHRsZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0SGVhbHRoRm9yVGVzdHMoKTogdm9pZCB7XG4gIGZvcndhcmRlZEJ5T3JnLmNsZWFyKCk7XG4gIGxhc3RFdmVudEF0QnlPcmcuY2xlYXIoKTtcbiAgbGFzdEhlYWx0aEF0ID0gMDtcbiAgbGFzdFJlZHJpdmVBdCA9IDA7XG59XG4iXX0=
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SQSBatchResponse, SQSEvent } from 'aws-lambda';
|
|
1
|
+
import type { Context, SQSBatchResponse, SQSEvent } from 'aws-lambda';
|
|
2
2
|
/**
|
|
3
3
|
* Pipeline event ingestion Lambda handler.
|
|
4
4
|
*
|
|
@@ -24,4 +24,4 @@ import type { SQSBatchResponse, SQSEvent } from 'aws-lambda';
|
|
|
24
24
|
* self-healing redrive; defaults to `<main-queue-arn>-dlq` derived from the SQS
|
|
25
25
|
* trigger's eventSourceARN.
|
|
26
26
|
*/
|
|
27
|
-
export declare const handler: (event: SQSEvent) => Promise<SQSBatchResponse>;
|
|
27
|
+
export declare const handler: (event: SQSEvent, context?: Pick<Context, 'awsRequestId'>) => Promise<SQSBatchResponse>;
|
package/lib/index.js
CHANGED
|
@@ -1,3 +1,31 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
|
|
4
|
+
// ../pipeline-core/lib/core/audit-correlation.js
|
|
5
|
+
var REQUEST_ID_HEADER = "X-Request-Id";
|
|
6
|
+
var PIPELINE_EXECUTION_ID_HEADER = "X-Pipeline-Execution-Id";
|
|
7
|
+
var CODEBUILD_BUILD_ID_HEADER = "X-CodeBuild-Build-Id";
|
|
8
|
+
var MAX_CORRELATION_VALUE = 128;
|
|
9
|
+
function sanitizeCorrelationValue(value) {
|
|
10
|
+
if (typeof value !== "string")
|
|
11
|
+
return void 0;
|
|
12
|
+
const clean = value.replace(/[^\x21-\x7e]/g, "").slice(0, MAX_CORRELATION_VALUE);
|
|
13
|
+
return clean.length > 0 ? clean : void 0;
|
|
14
|
+
}
|
|
15
|
+
function correlationHeaders(ids) {
|
|
16
|
+
const headers = {};
|
|
17
|
+
const requestId = sanitizeCorrelationValue(ids.requestId);
|
|
18
|
+
const executionId = sanitizeCorrelationValue(ids.pipelineExecutionId);
|
|
19
|
+
const buildId = sanitizeCorrelationValue(ids.codeBuildBuildId);
|
|
20
|
+
if (requestId)
|
|
21
|
+
headers[REQUEST_ID_HEADER] = requestId;
|
|
22
|
+
if (executionId)
|
|
23
|
+
headers[PIPELINE_EXECUTION_ID_HEADER] = executionId;
|
|
24
|
+
if (buildId)
|
|
25
|
+
headers[CODEBUILD_BUILD_ID_HEADER] = buildId;
|
|
26
|
+
return headers;
|
|
27
|
+
}
|
|
28
|
+
|
|
1
29
|
// ../pipeline-core/lib/handlers/platform-credential.js
|
|
2
30
|
import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
|
|
3
31
|
var ACCESS_KEY_PREFIXES = ["pb_sa_", "pb_pat_"];
|
|
@@ -7,8 +35,8 @@ function assertAccessKey(value, source) {
|
|
|
7
35
|
const looksLikeJwt = value.split(".").length === 3;
|
|
8
36
|
throw new Error(`${source} does not hold an opaque access key (expected a "pb_sa_\u2026" value)` + (looksLikeJwt ? ' \u2014 it holds a JWT, not a service-account key. Re-run "pipeline-manager infra store-token" to issue one.' : "."));
|
|
9
37
|
}
|
|
10
|
-
async function readCredentialSecret(secretName,
|
|
11
|
-
const response = await
|
|
38
|
+
async function readCredentialSecret(secretName, client2 = new SecretsManagerClient({})) {
|
|
39
|
+
const response = await client2.send(new GetSecretValueCommand({ SecretId: secretName }));
|
|
12
40
|
if (!response.SecretString)
|
|
13
41
|
throw new Error(`Secret "${secretName}" is empty`);
|
|
14
42
|
return JSON.parse(response.SecretString);
|
|
@@ -56,6 +84,7 @@ function createPlatformCredential(opts) {
|
|
|
56
84
|
}
|
|
57
85
|
|
|
58
86
|
// src/util.ts
|
|
87
|
+
import { createHash } from "node:crypto";
|
|
59
88
|
var log = {
|
|
60
89
|
info: (msg, data) => console.log(JSON.stringify({ level: "INFO", message: msg, data, ts: (/* @__PURE__ */ new Date()).toISOString() })),
|
|
61
90
|
warn: (msg, data) => console.log(JSON.stringify({ level: "WARN", message: msg, data, ts: (/* @__PURE__ */ new Date()).toISOString() })),
|
|
@@ -77,6 +106,9 @@ var BoundedMap = class extends Map {
|
|
|
77
106
|
return super.set(key, value);
|
|
78
107
|
}
|
|
79
108
|
};
|
|
109
|
+
function arnRef(arn) {
|
|
110
|
+
return `arn#${createHash("sha256").update(arn).digest("hex").slice(0, 12)}`;
|
|
111
|
+
}
|
|
80
112
|
var CACHE_MAX_ENTRIES = 5e3;
|
|
81
113
|
async function loadSdk(pkg) {
|
|
82
114
|
return await import(pkg);
|
|
@@ -140,12 +172,12 @@ var sqsClientsByRegion;
|
|
|
140
172
|
async function sqsClient(region) {
|
|
141
173
|
if (!sqsMod) sqsMod = await loadSdk("@aws-sdk/client-sqs");
|
|
142
174
|
if (!sqsClientsByRegion) sqsClientsByRegion = /* @__PURE__ */ new Map();
|
|
143
|
-
let
|
|
144
|
-
if (!
|
|
145
|
-
|
|
146
|
-
sqsClientsByRegion.set(region,
|
|
175
|
+
let client2 = sqsClientsByRegion.get(region);
|
|
176
|
+
if (!client2) {
|
|
177
|
+
client2 = new sqsMod.SQSClient({ region });
|
|
178
|
+
sqsClientsByRegion.set(region, client2);
|
|
147
179
|
}
|
|
148
|
-
return
|
|
180
|
+
return client2;
|
|
149
181
|
}
|
|
150
182
|
var forwardedByOrg = new BoundedMap(CACHE_MAX_ENTRIES);
|
|
151
183
|
var lastEventAtByOrg = new BoundedMap(CACHE_MAX_ENTRIES);
|
|
@@ -166,8 +198,8 @@ function deriveQueues(mainQueueArn) {
|
|
|
166
198
|
}
|
|
167
199
|
async function dlqStats(region, dlqUrl) {
|
|
168
200
|
if (!sqsMod) sqsMod = await loadSdk("@aws-sdk/client-sqs");
|
|
169
|
-
const
|
|
170
|
-
const out = await
|
|
201
|
+
const client2 = await sqsClient(region);
|
|
202
|
+
const out = await client2.send(new sqsMod.GetQueueAttributesCommand({
|
|
171
203
|
QueueUrl: dlqUrl,
|
|
172
204
|
AttributeNames: ["ApproximateNumberOfMessages", "ApproximateAgeOfOldestMessage"]
|
|
173
205
|
}));
|
|
@@ -180,21 +212,21 @@ async function dlqStats(region, dlqUrl) {
|
|
|
180
212
|
}
|
|
181
213
|
async function hasActiveMoveTask(region, dlqArn) {
|
|
182
214
|
if (!sqsMod) sqsMod = await loadSdk("@aws-sdk/client-sqs");
|
|
183
|
-
const
|
|
184
|
-
const out = await
|
|
215
|
+
const client2 = await sqsClient(region);
|
|
216
|
+
const out = await client2.send(new sqsMod.ListMessageMoveTasksCommand({ SourceArn: dlqArn }));
|
|
185
217
|
return (out.Results ?? []).some((t) => t.Status === "RUNNING");
|
|
186
218
|
}
|
|
187
219
|
async function startMoveTask(region, dlqArn, mainArn) {
|
|
188
220
|
if (!sqsMod) sqsMod = await loadSdk("@aws-sdk/client-sqs");
|
|
189
|
-
const
|
|
190
|
-
await
|
|
221
|
+
const client2 = await sqsClient(region);
|
|
222
|
+
await client2.send(new sqsMod.StartMessageMoveTaskCommand({ SourceArn: dlqArn, DestinationArn: mainArn }));
|
|
191
223
|
}
|
|
192
|
-
async function postIngestHealth(baseUrl, body) {
|
|
224
|
+
async function postIngestHealth(baseUrl, body, requestId) {
|
|
193
225
|
try {
|
|
194
226
|
const token = await getAuthToken();
|
|
195
227
|
const res = await fetchWithTimeout(`${baseUrl}/api/reports/ingest-health`, {
|
|
196
228
|
method: "POST",
|
|
197
|
-
headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}
|
|
229
|
+
headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}`, ...correlationHeaders({ requestId }) },
|
|
198
230
|
body: JSON.stringify(body)
|
|
199
231
|
});
|
|
200
232
|
if (!res.ok) {
|
|
@@ -207,7 +239,7 @@ async function postIngestHealth(baseUrl, body) {
|
|
|
207
239
|
return false;
|
|
208
240
|
}
|
|
209
241
|
}
|
|
210
|
-
async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
|
|
242
|
+
async function reportHealthAndRedrive(baseUrl, mainQueueArn, requestId) {
|
|
211
243
|
const now = Date.now();
|
|
212
244
|
if (now - lastHealthAt < HEALTH_THROTTLE_MS) return;
|
|
213
245
|
lastHealthAt = now;
|
|
@@ -234,13 +266,13 @@ async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
|
|
|
234
266
|
forwarded,
|
|
235
267
|
dropped: depth,
|
|
236
268
|
lastEventAt
|
|
237
|
-
});
|
|
269
|
+
}, requestId);
|
|
238
270
|
if (ok) forwardedByOrg.set(key, 0);
|
|
239
271
|
}
|
|
240
272
|
if (q && depth > 0 && now - lastRedriveAt >= REDRIVE_THROTTLE_MS) {
|
|
241
273
|
if (oldestAgeSec > MAX_DLQ_REDRIVE_AGE_SEC) {
|
|
242
274
|
log.warn("DLQ oldest message exceeds poison-age ceiling \u2014 skipping redrive (needs manual attention)", {
|
|
243
|
-
|
|
275
|
+
dlq: arnRef(q.dlqArn),
|
|
244
276
|
dropped: depth,
|
|
245
277
|
oldestAgeSec,
|
|
246
278
|
ceilingSec: MAX_DLQ_REDRIVE_AGE_SEC
|
|
@@ -250,7 +282,7 @@ async function reportHealthAndRedrive(baseUrl, mainQueueArn) {
|
|
|
250
282
|
if (!await hasActiveMoveTask(q.region, q.dlqArn)) {
|
|
251
283
|
lastRedriveAt = now;
|
|
252
284
|
await startMoveTask(q.region, q.dlqArn, q.mainArn);
|
|
253
|
-
log.info("Started self-healing DLQ\u2192main redrive", {
|
|
285
|
+
log.info("Started self-healing DLQ\u2192main redrive", { dlq: arnRef(q.dlqArn), dropped: depth, oldestAgeSec });
|
|
254
286
|
}
|
|
255
287
|
} catch (err) {
|
|
256
288
|
log.warn("DLQ redrive failed (ignored)", { error: err?.name ?? String(err) });
|
|
@@ -279,6 +311,105 @@ function _resetHealthForTests() {
|
|
|
279
311
|
lastRedriveAt = 0;
|
|
280
312
|
}
|
|
281
313
|
|
|
314
|
+
// ../pipeline-core/lib/core/synth-failure.js
|
|
315
|
+
var SYNTH_FAILURE_MARKER = "PB_SYNTH_FAILURE";
|
|
316
|
+
var MAX_MESSAGE = 1e3;
|
|
317
|
+
var MAX_PLUGINS = 10;
|
|
318
|
+
var MAX_PLUGIN_MESSAGE = 300;
|
|
319
|
+
var clip = (s, max) => s.length > max ? `${s.slice(0, max - 1)}\u2026` : s;
|
|
320
|
+
function synthFailure(message, plugins = []) {
|
|
321
|
+
const codes = [...new Set(plugins.map((p) => p.code))];
|
|
322
|
+
const code = plugins.length === 0 ? "SYNTH_FAILED" : codes.length === 1 ? codes[0] : "PLUGINS_REFUSED";
|
|
323
|
+
return {
|
|
324
|
+
code,
|
|
325
|
+
message: clip(message, MAX_MESSAGE),
|
|
326
|
+
plugins: plugins.slice(0, MAX_PLUGINS).map((p) => ({
|
|
327
|
+
plugin: clip(p.plugin, 100),
|
|
328
|
+
code: clip(p.code, 100),
|
|
329
|
+
message: clip(p.message, MAX_PLUGIN_MESSAGE)
|
|
330
|
+
}))
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
function parseSynthFailure(line) {
|
|
334
|
+
const at = line.indexOf(`${SYNTH_FAILURE_MARKER} {`);
|
|
335
|
+
if (at === -1)
|
|
336
|
+
return null;
|
|
337
|
+
try {
|
|
338
|
+
const parsed = JSON.parse(line.slice(at + SYNTH_FAILURE_MARKER.length + 1).trim());
|
|
339
|
+
if (typeof parsed.code !== "string" || typeof parsed.message !== "string")
|
|
340
|
+
return null;
|
|
341
|
+
const plugins = Array.isArray(parsed.plugins) ? parsed.plugins.filter((p) => !!p && typeof p.plugin === "string" && typeof p.code === "string" && typeof p.message === "string") : [];
|
|
342
|
+
return { ...synthFailure(parsed.message, plugins), code: clip(parsed.code, 100) };
|
|
343
|
+
} catch {
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// src/failure-reason.ts
|
|
349
|
+
var loader = loadSdk;
|
|
350
|
+
var clients = /* @__PURE__ */ new Map();
|
|
351
|
+
async function client(kind, region) {
|
|
352
|
+
const mod = kind === "codebuild" ? await loader("@aws-sdk/client-codebuild") : await loader("@aws-sdk/client-cloudwatch-logs");
|
|
353
|
+
const key = `${kind}:${region}`;
|
|
354
|
+
let c = clients.get(key);
|
|
355
|
+
if (!c) {
|
|
356
|
+
c = kind === "codebuild" ? new mod.CodeBuildClient({ region }) : new mod.CloudWatchLogsClient({ region });
|
|
357
|
+
clients.set(key, c);
|
|
358
|
+
}
|
|
359
|
+
return { client: c, mod };
|
|
360
|
+
}
|
|
361
|
+
var BUILD_ID_RE = /^[A-Za-z0-9][A-Za-z0-9_-]{1,254}:[0-9a-f-]{36}$/;
|
|
362
|
+
function codeBuildIdOf(detail) {
|
|
363
|
+
const type = detail.type;
|
|
364
|
+
if (type?.provider !== void 0 && type.provider !== "CodeBuild") return null;
|
|
365
|
+
const result = detail["execution-result"];
|
|
366
|
+
const id = result?.["external-execution-id"];
|
|
367
|
+
return typeof id === "string" && BUILD_ID_RE.test(id) ? id : null;
|
|
368
|
+
}
|
|
369
|
+
async function readBuildCompute(region, buildId) {
|
|
370
|
+
try {
|
|
371
|
+
const cb = await client("codebuild", region);
|
|
372
|
+
const out = await cb.client.send(
|
|
373
|
+
new cb.mod.BatchGetBuildsCommand({ ids: [buildId] })
|
|
374
|
+
);
|
|
375
|
+
return out.builds?.[0]?.environment?.computeType ?? null;
|
|
376
|
+
} catch (err) {
|
|
377
|
+
log.warn("Could not read the build's compute size (forwarding without it)", {
|
|
378
|
+
buildId,
|
|
379
|
+
error: String(err)
|
|
380
|
+
});
|
|
381
|
+
return null;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
async function readSynthFailure(region, buildId) {
|
|
385
|
+
try {
|
|
386
|
+
const cb = await client("codebuild", region);
|
|
387
|
+
const out = await cb.client.send(
|
|
388
|
+
new cb.mod.BatchGetBuildsCommand({ ids: [buildId] })
|
|
389
|
+
);
|
|
390
|
+
const logs = out.builds?.[0]?.logs;
|
|
391
|
+
if (!logs?.groupName || !logs.streamName) return null;
|
|
392
|
+
const cw = await client("logs", region);
|
|
393
|
+
const res = await cw.client.send(new cw.mod.FilterLogEventsCommand({
|
|
394
|
+
logGroupName: logs.groupName,
|
|
395
|
+
logStreamNames: [logs.streamName],
|
|
396
|
+
filterPattern: `"${SYNTH_FAILURE_MARKER}"`,
|
|
397
|
+
limit: 5
|
|
398
|
+
}));
|
|
399
|
+
for (const event of res.events ?? []) {
|
|
400
|
+
const failure = typeof event.message === "string" ? parseSynthFailure(event.message) : null;
|
|
401
|
+
if (failure) return failure;
|
|
402
|
+
}
|
|
403
|
+
return null;
|
|
404
|
+
} catch (err) {
|
|
405
|
+
log.warn("Could not read the failed build's structured failure reason (forwarding without it)", {
|
|
406
|
+
buildId,
|
|
407
|
+
error: err instanceof Error ? err.message : String(err)
|
|
408
|
+
});
|
|
409
|
+
return null;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
282
413
|
// src/scm.ts
|
|
283
414
|
import { GetSecretValueCommand as GetSecretValueCommand2, SecretsManagerClient as SecretsManagerClient2 } from "@aws-sdk/client-secrets-manager";
|
|
284
415
|
var commitResultCache = new BoundedMap(CACHE_MAX_ENTRIES);
|
|
@@ -312,8 +443,8 @@ async function getGitHubToken(orgId) {
|
|
|
312
443
|
}
|
|
313
444
|
let token;
|
|
314
445
|
try {
|
|
315
|
-
const
|
|
316
|
-
const res = await
|
|
446
|
+
const client2 = new SecretsManagerClient2({});
|
|
447
|
+
const res = await client2.send(new GetSecretValueCommand2({ SecretId: secretName }));
|
|
317
448
|
token = res.SecretString && res.SecretString.length > 0 ? res.SecretString.trim() : null;
|
|
318
449
|
} catch (err) {
|
|
319
450
|
log.warn("No github-token secret \u2014 GitHub commit resolution will be unauthenticated", { orgId, error: err?.name });
|
|
@@ -358,19 +489,19 @@ var codecommitMod;
|
|
|
358
489
|
async function codeCommitClient(region) {
|
|
359
490
|
if (!codecommitMod) codecommitMod = await loadSdk("@aws-sdk/client-codecommit");
|
|
360
491
|
if (!codecommitClientsByRegion) codecommitClientsByRegion = /* @__PURE__ */ new Map();
|
|
361
|
-
let
|
|
362
|
-
if (!
|
|
363
|
-
|
|
364
|
-
codecommitClientsByRegion.set(region,
|
|
492
|
+
let client2 = codecommitClientsByRegion.get(region);
|
|
493
|
+
if (!client2) {
|
|
494
|
+
client2 = new codecommitMod.CodeCommitClient({ region });
|
|
495
|
+
codecommitClientsByRegion.set(region, client2);
|
|
365
496
|
}
|
|
366
|
-
return
|
|
497
|
+
return client2;
|
|
367
498
|
}
|
|
368
499
|
async function codeCommitMeta(region, repositoryName, commitId) {
|
|
369
500
|
const cached = commitMetaCache.get(commitId);
|
|
370
501
|
if (cached) return cached;
|
|
371
502
|
if (!codecommitMod) codecommitMod = await loadSdk("@aws-sdk/client-codecommit");
|
|
372
|
-
const
|
|
373
|
-
const out = await
|
|
503
|
+
const client2 = await codeCommitClient(region);
|
|
504
|
+
const out = await client2.send(new codecommitMod.GetCommitCommand({ repositoryName, commitId }));
|
|
374
505
|
const commit = out.commit;
|
|
375
506
|
const meta = { date: toIso(commit?.committer?.date ?? commit?.author?.date), parents: commit?.parents };
|
|
376
507
|
commitMetaCache.set(commitId, meta);
|
|
@@ -538,13 +669,13 @@ function parseDeploys(value) {
|
|
|
538
669
|
return map;
|
|
539
670
|
}
|
|
540
671
|
async function pipelineClient(region) {
|
|
541
|
-
let
|
|
542
|
-
if (!
|
|
672
|
+
let client2 = clientsByRegion.get(region);
|
|
673
|
+
if (!client2) {
|
|
543
674
|
const { CodePipelineClient } = await loadCodePipeline();
|
|
544
|
-
|
|
545
|
-
clientsByRegion.set(region,
|
|
675
|
+
client2 = new CodePipelineClient({ region });
|
|
676
|
+
clientsByRegion.set(region, client2);
|
|
546
677
|
}
|
|
547
|
-
return
|
|
678
|
+
return client2;
|
|
548
679
|
}
|
|
549
680
|
async function resolvePipeline(arn, region) {
|
|
550
681
|
const cached = resolvedByArn.get(arn);
|
|
@@ -552,29 +683,29 @@ async function resolvePipeline(arn, region) {
|
|
|
552
683
|
return { pipelineId: cached.pipelineId, orgId: cached.orgId, deploys: cached.deploys };
|
|
553
684
|
}
|
|
554
685
|
try {
|
|
555
|
-
const
|
|
686
|
+
const client2 = await pipelineClient(region);
|
|
556
687
|
const { ListTagsForResourceCommand } = await loadCodePipeline();
|
|
557
|
-
const out = await
|
|
688
|
+
const out = await client2.send(new ListTagsForResourceCommand({ resourceArn: arn }));
|
|
558
689
|
const pipelineId = out.tags?.find((t) => t.key === PIPELINE_ID_TAG)?.value ?? null;
|
|
559
690
|
const orgId = out.tags?.find((t) => t.key === ORG_ID_TAG)?.value ?? null;
|
|
560
691
|
const deploys = parseDeploys(out.tags?.find((t) => t.key === DEPLOYS_TAG)?.value);
|
|
561
|
-
if (!pipelineId) log.warn("Pipeline missing pb.pipeline-id tag \u2014 skipping (register it?)", { arn });
|
|
692
|
+
if (!pipelineId) log.warn("Pipeline missing pb.pipeline-id tag \u2014 skipping (register it?)", { pipeline: arnRef(arn) });
|
|
562
693
|
resolvedByArn.set(arn, { pipelineId, orgId, deploys, ts: Date.now() });
|
|
563
694
|
return { pipelineId, orgId, deploys };
|
|
564
695
|
} catch (err) {
|
|
565
696
|
const name = err?.name;
|
|
566
697
|
if (name === "AccessDeniedException") {
|
|
567
|
-
log.error("AccessDenied calling codepipeline:ListTagsForResource \u2014 grant it to the Lambda role", { arn, error: name });
|
|
698
|
+
log.error("AccessDenied calling codepipeline:ListTagsForResource \u2014 grant it to the Lambda role", { pipeline: arnRef(arn), error: name });
|
|
568
699
|
throw err;
|
|
569
700
|
}
|
|
570
701
|
const e = err;
|
|
571
702
|
const status = e.$metadata?.httpStatusCode;
|
|
572
703
|
const retryable = e.$retryable != null || typeof status === "number" && status >= 500 || /throttl|timeout|toomanyrequests|serviceunavailable|econnreset|networkingerror/i.test(name ?? "");
|
|
573
704
|
if (retryable) {
|
|
574
|
-
log.error("Transient error resolving pb.pipeline-id tag \u2014 will retry the batch", { arn, error: name ?? String(err) });
|
|
705
|
+
log.error("Transient error resolving pb.pipeline-id tag \u2014 will retry the batch", { pipeline: arnRef(arn), error: name ?? String(err) });
|
|
575
706
|
throw err;
|
|
576
707
|
}
|
|
577
|
-
log.error("Failed to resolve pb.pipeline-id tag", { arn, error: name ?? String(err) });
|
|
708
|
+
log.error("Failed to resolve pb.pipeline-id tag", { pipeline: arnRef(arn), error: name ?? String(err) });
|
|
578
709
|
return { pipelineId: null, orgId: null, deploys: /* @__PURE__ */ new Map() };
|
|
579
710
|
}
|
|
580
711
|
}
|
|
@@ -583,7 +714,12 @@ function _resetTagsForTests() {
|
|
|
583
714
|
}
|
|
584
715
|
|
|
585
716
|
// src/parse.ts
|
|
717
|
+
var MAX_SOURCE_ID = 128;
|
|
718
|
+
function sourceId(v) {
|
|
719
|
+
return typeof v === "string" && v.length > 0 ? v.slice(0, MAX_SOURCE_ID) : void 0;
|
|
720
|
+
}
|
|
586
721
|
var MAX_ERROR_MESSAGE = 4e3;
|
|
722
|
+
var MAX_DETAIL_BYTES = 7500;
|
|
587
723
|
function firstAttr(...vals) {
|
|
588
724
|
for (const v of vals) {
|
|
589
725
|
if (typeof v === "string" && v.length > 0) return v.slice(0, MAX_ATTR);
|
|
@@ -654,7 +790,25 @@ async function parseRecord(record) {
|
|
|
654
790
|
}
|
|
655
791
|
const result = detail["execution-result"];
|
|
656
792
|
const summary = result?.["external-execution-summary"];
|
|
657
|
-
|
|
793
|
+
let errorMessage = typeof summary === "string" && summary.length > 0 ? summary.slice(0, MAX_ERROR_MESSAGE) : void 0;
|
|
794
|
+
let computeType;
|
|
795
|
+
if (eventType === "ACTION" && ["SUCCEEDED", "FAILED", "STOPPED"].includes(state)) {
|
|
796
|
+
const cbId = codeBuildIdOf(detail);
|
|
797
|
+
computeType = (cbId ? await readBuildCompute(event.region, cbId) : null) ?? void 0;
|
|
798
|
+
}
|
|
799
|
+
if (eventType === "ACTION" && state === "FAILED") {
|
|
800
|
+
const buildId = codeBuildIdOf(detail);
|
|
801
|
+
const failure = buildId ? await readSynthFailure(event.region, buildId) : null;
|
|
802
|
+
if (failure) {
|
|
803
|
+
detail.pbFailure = failure;
|
|
804
|
+
if (JSON.stringify(detail).length >= MAX_DETAIL_BYTES) {
|
|
805
|
+
detail.pbFailure = { ...failure, plugins: failure.plugins.map(({ plugin, code }) => ({ plugin, code })) };
|
|
806
|
+
}
|
|
807
|
+
errorMessage = `${failure.code}: ${failure.message}`.slice(0, MAX_ERROR_MESSAGE);
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
const sourceEventId = sourceId(event.id);
|
|
811
|
+
const sourceMessageId = sourceId(record.messageId);
|
|
658
812
|
const { commitSha, commitRef, revisionUrl } = extractCommit(detail);
|
|
659
813
|
const executionId = detail["execution-id"];
|
|
660
814
|
const stageName = detail.stage;
|
|
@@ -686,14 +840,18 @@ async function parseRecord(record) {
|
|
|
686
840
|
...commitTimestamp && { commitTimestamp },
|
|
687
841
|
...commitCount && { commitCount },
|
|
688
842
|
...environment && { environment },
|
|
843
|
+
...computeType && { computeType },
|
|
844
|
+
...sourceEventId && { sourceEventId },
|
|
845
|
+
...sourceMessageId && { sourceMessageId },
|
|
689
846
|
detail
|
|
690
847
|
};
|
|
691
848
|
}
|
|
692
849
|
|
|
693
850
|
// src/index.ts
|
|
694
|
-
var handler = async (event) => {
|
|
851
|
+
var handler = async (event, context) => {
|
|
695
852
|
const baseUrl = process.env.PLATFORM_BASE_URL;
|
|
696
853
|
if (!baseUrl) throw new Error("PLATFORM_BASE_URL environment variable is required");
|
|
854
|
+
const requestId = context?.awsRequestId || randomUUID();
|
|
697
855
|
const settled = await Promise.all(event.Records.map(async (record) => {
|
|
698
856
|
try {
|
|
699
857
|
return { record, parsed: await parseRecord(record) };
|
|
@@ -715,7 +873,7 @@ var handler = async (event) => {
|
|
|
715
873
|
const payloadEvents = events.map(({ orgId: _orgId, ...rest }) => rest);
|
|
716
874
|
const post = (token) => fetchWithTimeout(`${baseUrl}/api/reports/events`, {
|
|
717
875
|
method: "POST",
|
|
718
|
-
headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}
|
|
876
|
+
headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}`, ...correlationHeaders({ requestId }) },
|
|
719
877
|
body: JSON.stringify({ events: payloadEvents })
|
|
720
878
|
});
|
|
721
879
|
let res = await post(await getAuthToken());
|
|
@@ -735,7 +893,7 @@ var handler = async (event) => {
|
|
|
735
893
|
const result = await res.json().catch(() => ({}));
|
|
736
894
|
log.info(`Ingested ${events.length} events`, { inserted: result.data });
|
|
737
895
|
recordForwarded(events);
|
|
738
|
-
await reportHealthAndRedrive(baseUrl, event.Records[0]?.eventSourceARN);
|
|
896
|
+
await reportHealthAndRedrive(baseUrl, event.Records[0]?.eventSourceARN, requestId);
|
|
739
897
|
return batchResponse(failures);
|
|
740
898
|
};
|
|
741
899
|
function batchResponse(failed) {
|
package/lib/parse.d.ts
CHANGED
|
@@ -31,9 +31,27 @@ export interface ParsedEvent {
|
|
|
31
31
|
commitTimestamp?: string;
|
|
32
32
|
/** Number of commits in the resolved range (≥1). Undefined when unresolvable. */
|
|
33
33
|
commitCount?: number;
|
|
34
|
+
/**
|
|
35
|
+
* The compute size a terminal CodeBuild action ran on (`SMALL` … `X2_LARGE`),
|
|
36
|
+
* read from AWS. Undefined for a non-CodeBuild action, a non-terminal event,
|
|
37
|
+
* or when the read failed — the ingest then records the action as UNMEASURED
|
|
38
|
+
* rather than as free, which is what makes the coverage gap visible instead of
|
|
39
|
+
* looking like idleness.
|
|
40
|
+
*
|
|
41
|
+
* Its own field rather than a `detail` key, for the reason `failure` has one:
|
|
42
|
+
* `detail` is bounded at 8 KB and already sheds content under that bound, so a
|
|
43
|
+
* one-word field riding inside it is a field that can be dropped by an
|
|
44
|
+
* unrelated payload getting large.
|
|
45
|
+
*/
|
|
46
|
+
computeType?: string;
|
|
34
47
|
/** Deploy environment — set only when the event's stage is listed in the
|
|
35
48
|
* pipeline's `pb.deploys` tag. Undefined otherwise (⇒ not a deploy). */
|
|
36
49
|
environment?: string;
|
|
50
|
+
/** The EventBridge event `id` (≤128) — lets the server's audit trail name the
|
|
51
|
+
* exact AWS event a row came from. Undefined when the body carries none. */
|
|
52
|
+
sourceEventId?: string;
|
|
53
|
+
/** The SQS record's messageId (≤128) — the delivery that carried the event. */
|
|
54
|
+
sourceMessageId?: string;
|
|
37
55
|
detail: Record<string, unknown>;
|
|
38
56
|
}
|
|
39
57
|
/** Parse + resolve one record to a reportable event, or null to skip it. */
|
package/lib/parse.js
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { codeBuildIdOf, readBuildCompute, readSynthFailure } from './failure-reason.js';
|
|
3
4
|
import { classifySource, resolveCommitInfo } from './scm.js';
|
|
4
5
|
import { MAX_ATTR, resolvePipeline } from './tags.js';
|
|
5
6
|
import { log } from './util.js';
|
|
7
|
+
/** Cap on `sourceEventId` / `sourceMessageId` — the reporting ingest's max. */
|
|
8
|
+
const MAX_SOURCE_ID = 128;
|
|
9
|
+
/** A non-empty string capped to `MAX_SOURCE_ID`, else undefined. */
|
|
10
|
+
function sourceId(v) {
|
|
11
|
+
return typeof v === 'string' && v.length > 0 ? v.slice(0, MAX_SOURCE_ID) : undefined;
|
|
12
|
+
}
|
|
6
13
|
/** Cap on the stored failure summary — CodeBuild/Deploy summaries can be long. */
|
|
7
14
|
const MAX_ERROR_MESSAGE = 4000;
|
|
15
|
+
/** Headroom under the reporting ingest's 8 KB serialized `detail` bound. */
|
|
16
|
+
const MAX_DETAIL_BYTES = 7500;
|
|
8
17
|
/** First non-empty string among the candidates, capped to the ingest max. */
|
|
9
18
|
function firstAttr(...vals) {
|
|
10
19
|
for (const v of vals) {
|
|
@@ -110,9 +119,40 @@ export async function parseRecord(record) {
|
|
|
110
119
|
// under `execution-result`.
|
|
111
120
|
const result = detail['execution-result'];
|
|
112
121
|
const summary = result?.['external-execution-summary'];
|
|
113
|
-
|
|
122
|
+
let errorMessage = typeof summary === 'string' && summary.length > 0
|
|
114
123
|
? summary.slice(0, MAX_ERROR_MESSAGE)
|
|
115
124
|
: undefined;
|
|
125
|
+
// A failed CodeBuild action may have printed a structured reason (the synth's
|
|
126
|
+
// `PB_SYNTH_FAILURE` line — a refused plugin, with its code). CodeBuild's
|
|
127
|
+
// summary never carries the build output, so read it from the build's log and
|
|
128
|
+
// promote it: the code + message become the failure reason, the per-plugin
|
|
129
|
+
// list rides in `detail.pbFailure`. Best-effort (see failure-reason.ts).
|
|
130
|
+
// The compute size this action ran on, for the vCPU-minute figure Phase 4
|
|
131
|
+
// measures. Only on a TERMINAL CodeBuild action: an in-progress event has no
|
|
132
|
+
// duration to pair it with, so reading it there would spend an AWS call to
|
|
133
|
+
// learn nothing. Best-effort — null forwards without the field.
|
|
134
|
+
let computeType;
|
|
135
|
+
if (eventType === 'ACTION' && ['SUCCEEDED', 'FAILED', 'STOPPED'].includes(state)) {
|
|
136
|
+
const cbId = codeBuildIdOf(detail);
|
|
137
|
+
computeType = (cbId ? await readBuildCompute(event.region, cbId) : null) ?? undefined;
|
|
138
|
+
}
|
|
139
|
+
if (eventType === 'ACTION' && state === 'FAILED') {
|
|
140
|
+
const buildId = codeBuildIdOf(detail);
|
|
141
|
+
const failure = buildId ? await readSynthFailure(event.region, buildId) : null;
|
|
142
|
+
if (failure) {
|
|
143
|
+
detail.pbFailure = failure;
|
|
144
|
+
// The ingest bounds `detail` at 8 KB serialized; keep the codes, drop the
|
|
145
|
+
// per-plugin prose if the whole thing would not fit.
|
|
146
|
+
if (JSON.stringify(detail).length >= MAX_DETAIL_BYTES) {
|
|
147
|
+
detail.pbFailure = { ...failure, plugins: failure.plugins.map(({ plugin, code }) => ({ plugin, code })) };
|
|
148
|
+
}
|
|
149
|
+
errorMessage = `${failure.code}: ${failure.message}`.slice(0, MAX_ERROR_MESSAGE);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// Audit correlation back to the AWS side: which EventBridge event, carried by
|
|
153
|
+
// which SQS delivery. Both are opaque ids (no ARN, no account).
|
|
154
|
+
const sourceEventId = sourceId(event.id);
|
|
155
|
+
const sourceMessageId = sourceId(record.messageId);
|
|
116
156
|
// DORA deploy attribution — all optional: omitted (undefined) when the
|
|
117
157
|
// event/pipeline doesn't carry them.
|
|
118
158
|
const { commitSha, commitRef, revisionUrl } = extractCommit(detail);
|
|
@@ -153,7 +193,10 @@ export async function parseRecord(record) {
|
|
|
153
193
|
...(commitTimestamp && { commitTimestamp }),
|
|
154
194
|
...(commitCount && { commitCount }),
|
|
155
195
|
...(environment && { environment }),
|
|
196
|
+
...(computeType && { computeType }),
|
|
197
|
+
...(sourceEventId && { sourceEventId }),
|
|
198
|
+
...(sourceMessageId && { sourceMessageId }),
|
|
156
199
|
detail,
|
|
157
200
|
};
|
|
158
201
|
}
|
|
159
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUd0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUEwQ2hDLGtGQUFrRjtBQUNsRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQiw2RUFBNkU7QUFDN0UsU0FBUyxTQUFTLENBQUMsR0FBRyxJQUFlO0lBQ25DLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxhQUFhLENBQUMsTUFBK0I7SUFDcEQscUZBQXFGO0lBQ3JGLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FDcEIsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMzRCx5RUFBeUU7SUFDekUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUF3QyxDQUFDO0lBRXJGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FDekIs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O0lBQy9FLElBQUksZUFBbUMsQ0FBQztJQUN4QyxJQUFJLFdBQStCLENBQUM7SUFDcEMsSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDckQsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEcsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDdkMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLO1FBQ0wsVUFBVTtRQUNWLFdBQVc7UUFDWCxTQUFTO1FBQ1QsTUFBTSxFQUFFLEtBQUs7UUFDYixXQUFXO1FBQ1gsU0FBUztRQUNULFVBQVU7UUFDVixZQUFZO1FBQ1osU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDM0MsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGNsYXNzaWZ5U291cmNlLCByZXNvbHZlQ29tbWl0SW5mbyB9IGZyb20gJy4vc2NtLmpzJztcbmltcG9ydCB7IE1BWF9BVFRSLCByZXNvbHZlUGlwZWxpbmUgfSBmcm9tICcuL3RhZ3MuanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi91dGlsLmpzJztcblxuLy8gRXZlbnQgcGFyc2luZzogYW4gU1FTIHJlY29yZCDihpIgdGhlIG5vcm1hbGl6ZWQgcmVwb3J0aW5nIGV2ZW50LlxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHBsYXRmb3JtIG9yZ0lkIChmcm9tIHRoZSBwaXBlbGluZSdzIE9yZ0lkIHRhZzsgbnVsbCB3aGVuIHVudGFnZ2VkKS5cbiAgICogSU5URVJOQUwg4oCUIHVzZWQgb25seSB0byBrZXkgdGhlIHBlci1vcmcgR2l0SHViIHRva2VuIGFuZCB0byBhdHRyaWJ1dGVcbiAgICogaW5nZXN0LWhlYWx0aC4gU3RyaXBwZWQgZnJvbSB0aGUgcGF5bG9hZCBQT1NUZWQgdG8gL3JlcG9ydHMvZXZlbnRzICh3aGljaFxuICAgKiByZXNvbHZlcyBvcmcgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIG5vdCB0aGUgYm9keSkuXG4gICAqL1xuICBvcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdGhlIGV2ZW50XG4gICAqICBjYXJyaWVzIG5vIHNvdXJjZSByZXZpc2lvbiDigJQgc3RvcmVkIE5VTEwgZG93bnN0cmVhbS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIGJyYW5jaC9yZWYgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdW5hdmFpbGFibGUuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIE9sZGVzdC11bnNoaXBwZWQgY29tbWl0IHRpbWVzdGFtcCAoSVNPIDg2MDEpIGZvciB0aGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3RcbiAgICogIGRlcGxveSDigJQgcmVzb2x2ZWQgaW4tYWNjb3VudC4gVW5kZWZpbmVkIHdoZW4gdW5yZXNvbHZhYmxlLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgcmVzb2x2ZWQgcmFuZ2UgKOKJpTEpLiBVbmRlZmluZWQgd2hlbiB1bnJlc29sdmFibGUuICovXG4gIGNvbW1pdENvdW50PzogbnVtYmVyO1xuICAvKiogRGVwbG95IGVudmlyb25tZW50IOKAlCBzZXQgb25seSB3aGVuIHRoZSBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgICogIHBpcGVsaW5lJ3MgYHBiLmRlcGxveXNgIHRhZy4gVW5kZWZpbmVkIG90aGVyd2lzZSAo4oeSIG5vdCBhIGRlcGxveSkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQ2FwIG9uIHRoZSBzdG9yZWQgZmFpbHVyZSBzdW1tYXJ5IOKAlCBDb2RlQnVpbGQvRGVwbG95IHN1bW1hcmllcyBjYW4gYmUgbG9uZy4gKi9cbmNvbnN0IE1BWF9FUlJPUl9NRVNTQUdFID0gNDAwMDtcblxuLyoqIEZpcnN0IG5vbi1lbXB0eSBzdHJpbmcgYW1vbmcgdGhlIGNhbmRpZGF0ZXMsIGNhcHBlZCB0byB0aGUgaW5nZXN0IG1heC4gKi9cbmZ1bmN0aW9uIGZpcnN0QXR0ciguLi52YWxzOiB1bmtub3duW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHYgb2YgdmFscykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwKSByZXR1cm4gdi5zbGljZSgwLCBNQVhfQVRUUik7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBleHRyYWN0aW9uIG9mIHRoZSBzb3VyY2UgY29tbWl0IGlkICsgcmVmIChhbmQgdGhlIHJldmlzaW9uIFVSTCwgdXNlZFxuICogb25seSBpbi1hY2NvdW50IHRvIGNsYXNzaWZ5IHRoZSBzb3VyY2UgdHlwZSBmb3IgY29tbWl0LXJhbmdlIHJlc29sdXRpb24pIGZyb20gYVxuICogQ29kZVBpcGVsaW5lIGV2ZW50IGRldGFpbC4gQ29kZVBpcGVsaW5lIHN1cmZhY2VzIHRoZSBzb3VyY2UgcmV2aXNpb24gdW5kZXIgYSBmZXdcbiAqIHNoYXBlcyBkZXBlbmRpbmcgb24gdGhlIGV2ZW50IHR5cGUgLyBzb3VyY2UtYWN0aW9uOyB3ZSBjaGVjayB0aGUga25vd24gb25lcyBhbmRcbiAqIGxlYXZlIHRoZSBmaWVsZHMgdW5kZWZpbmVkIHdoZW4gbm9uZSBhcmUgcHJlc2VudCAoTlVMTCBkb3duc3RyZWFtKS4gTmV2ZXIgcHVsbHMgYW5cbiAqIEFSTi9hY2NvdW50IGlkOiBvbmx5IHJldmlzaW9uL2JyYW5jaC91cmwgc3RyaW5nIGZpZWxkcyBhcmUgcmVhZDsgdGhlIHJldmlzaW9uVXJsXG4gKiBpcyBjb25zdW1lZCBpbi1hY2NvdW50IChzb3VyY2UgY2xhc3NpZmljYXRpb24pIGFuZCBuZXZlciBmb3J3YXJkZWQgb24gaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbW1pdChkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogeyBjb21taXRTaGE/OiBzdHJpbmc7IGNvbW1pdFJlZj86IHN0cmluZzsgcmV2aXNpb25Vcmw/OiBzdHJpbmcgfSB7XG4gIC8vIGBzb3VyY2UtcmV2aXNpb25zYCAoa2ViYWIsIEV2ZW50QnJpZGdlKSAvIGBzb3VyY2VSZXZpc2lvbnNgIChjYW1lbCkg4oCUIGZpcnN0IGVudHJ5LlxuICBjb25zdCByZXZzID0gKGRldGFpbFsnc291cmNlLXJldmlzaW9ucyddID8/IGRldGFpbC5zb3VyY2VSZXZpc2lvbnMpIGFzXG4gICAgfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0UmV2ID0gQXJyYXkuaXNBcnJheShyZXZzKSA/IHJldnNbMF0gOiB1bmRlZmluZWQ7XG4gIC8vIE9uIHNvdXJjZSBhY3Rpb25zIHRoZSByZXZpc2lvbiBpZCBjYW4gYWxzbyByaWRlIG9uIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvbW1pdFNoYSA9IGZpcnN0QXR0cihcbiAgICBkZXRhaWwuY29tbWl0SWQsXG4gICAgZGV0YWlsLnJldmlzaW9uSWQsXG4gICAgZmlyc3RSZXY/LnJldmlzaW9uSWQsXG4gICAgZXhlY1Jlc3VsdD8ucmV2aXNpb25JZCxcbiAgKTtcbiAgY29uc3QgY29tbWl0UmVmID0gZmlyc3RBdHRyKFxuICAgIGRldGFpbC5jb21taXRSZWYsXG4gICAgZGV0YWlsLmJyYW5jaCxcbiAgICBkZXRhaWwuc291cmNlQnJhbmNoLFxuICAgIGZpcnN0UmV2Py5icmFuY2hOYW1lLFxuICAgIGZpcnN0UmV2Py5icmFuY2gsXG4gICk7XG4gIGNvbnN0IHJldmlzaW9uVXJsID0gdHlwZW9mIGZpcnN0UmV2Py5yZXZpc2lvblVybCA9PT0gJ3N0cmluZycgPyBmaXJzdFJldi5yZXZpc2lvblVybCA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4geyAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLCAuLi4oY29tbWl0UmVmICYmIHsgY29tbWl0UmVmIH0pLCAuLi4ocmV2aXNpb25VcmwgJiYgeyByZXZpc2lvblVybCB9KSB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2lmeUV2ZW50KGRldGFpbFR5cGU6IHN0cmluZyk6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGV2ZW50U291cmNlOiBzdHJpbmcgfSB7XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdQaXBlbGluZSBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1N0YWdlIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdTVEFHRScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQWN0aW9uIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdBQ1RJT04nLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLCBzb1xuICAvLyBwYXJzZVJlY29yZCBkcm9wcyB0aGVtIG9uIHRoZSBgZXZlbnRTb3VyY2UgIT09ICdjb2RlcGlwZWxpbmUnYCBjaGVjayBiZWxvdyDigJRcbiAgLy8gdGhlICdCVUlMRCcgZXZlbnRUeXBlIGlzIG5ldmVyIHBlcnNpc3RlZCBoZXJlIChwbHVnaW4gQlVJTEQgZXZlbnRzIGFyZVxuICAvLyByZWNvcmRlZCBkaXJlY3RseSBieSB0aGUgcGx1Z2luIHNlcnZpY2UpLiBUaGUgJ2NvZGVidWlsZCcgc291cmNlIGlzIHdoYXRcbiAgLy8gcm91dGVzIHRoZSBkcm9wOyBrZWVwIHRoaXMgYnJhbmNoIG9ubHkgZm9yIHRoYXQuXG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdCdWlsZCBTdGF0ZScpKSByZXR1cm4geyBldmVudFR5cGU6ICdCVUlMRCcsIGV2ZW50U291cmNlOiAnY29kZWJ1aWxkJyB9O1xuICByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xufVxuXG4vKiogUGFyc2UgKyByZXNvbHZlIG9uZSByZWNvcmQgdG8gYSByZXBvcnRhYmxlIGV2ZW50LCBvciBudWxsIHRvIHNraXAgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBsZXQgZXZlbnQ6IHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcbiAgLy8gQSBtYWxmb3JtZWQgYm9keSBpcyBhIGRlYWQgbWVzc2FnZSAocmV0cnlpbmcgd29uJ3QgaGVscCkg4oCUIGxvZyArIHNraXAgaXQgc29cbiAgLy8gaXQgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2guIFJlc29sdXRpb24gZXJyb3JzIGJlbG93IChlLmcuIEFjY2Vzc0RlbmllZClcbiAgLy8gYXJlIE5PVCBjYXVnaHQgaGVyZTogdGhvc2UgYXJlIHRyYW5zaWVudC9pbmZyYSBhbmQgbXVzdCBwcm9wYWdhdGUgdG8gcmV0cnkuXG4gIHRyeSB7XG4gICAgZXZlbnQgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ1NraXBwaW5nIFNRUyByZWNvcmQgd2l0aCB1bnBhcnNlYWJsZSBib2R5JywgeyBtZXNzYWdlSWQ6IHJlY29yZC5tZXNzYWdlSWQsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgZXZlbnRUeXBlLCBldmVudFNvdXJjZSB9ID0gY2xhc3NpZnlFdmVudChldmVudFsnZGV0YWlsLXR5cGUnXSk7XG4gIGNvbnN0IGRldGFpbCA9IHsgLi4uZXZlbnQuZGV0YWlsIH07XG4gIC8vIFRoZSByYXcgYWNjb3VudCBuZXZlciBuZWVkcyB0byBsZWF2ZSBBV1Mgbm93IOKAlCBkcm9wIGl0IGZyb20gdGhlIHBheWxvYWQuXG4gIGRlbGV0ZSBkZXRhaWwuYWNjb3VudDtcblxuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsXG4gIC8vIGFuZCBhIHByb2plY3QgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgcGlwZWxpbmVzIOKAlCB0aGVyZSdzIG5vIGNsZWFuIDE6MSBtYXBwaW5nXG4gIC8vIHRvIGEgcGlwZWxpbmUgaWQsIHNvIHNraXAgdGhlbS5cbiAgaWYgKGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJykge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBub24tQ29kZVBpcGVsaW5lIGV2ZW50IChubyBwaXBlbGluZSB0YWcgdG8gcmVzb2x2ZSknLCB7IGRldGFpbFR5cGU6IGV2ZW50WydkZXRhaWwtdHlwZSddIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGlwZWxpbmVOYW1lID0gZGV0YWlsLnBpcGVsaW5lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwaXBlbGluZU5hbWUpIHtcbiAgICBsb2cud2FybignQ29kZVBpcGVsaW5lIGV2ZW50IG1pc3NpbmcgcGlwZWxpbmUgbmFtZSDigJQgc2tpcHBpbmcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIHBpcGVsaW5lJ3MgcGIucGlwZWxpbmUtaWQgKD0gcGxhdGZvcm0gcGlwZWxpbmVJZCkgKyBwYi5kZXBsb3lzIG1hcC5cbiAgLy8gVGhlIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgb3JnSWQsIGRlcGxveXMgfSA9IGF3YWl0IHJlc29sdmVQaXBlbGluZShhcm4sIGV2ZW50LnJlZ2lvbik7XG4gIGlmICghcGlwZWxpbmVJZCkgcmV0dXJuIG51bGw7IC8vIHVudGFnZ2VkIC8gdW5yZWdpc3RlcmVkIOKGkiBza2lwXG5cbiAgLy8gQVdTIGRvZXMgbm90IGFsd2F5cyBzZW5kIGBzdGFydC10aW1lYC4gYGV2ZW50LnRpbWVgIHN0YW5kcyBpbiBmb3IgaXQgc28gdGhlXG4gIC8vIHJvdyBzdGlsbCBsYW5kcyBpbiB0aGUgcmVwb3J0IHdpbmRvd3MsIHdoaWNoIGZpbHRlciBvbiBgc3RhcnRlZF9hdGAg4oCUIGJ1dCBpdFxuICAvLyBpcyBOT1QgYSBtZWFzdXJlbWVudCwgYW5kIHRoZSBkdXJhdGlvbiBiZWxvdyBtdXN0IG5vdCBiZSBjb21wdXRlZCBmcm9tIGl0LlxuICBjb25zdCBkZWNsYXJlZFN0YXJ0ID0gZGV0YWlsWydzdGFydC10aW1lJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdGFydGVkQXQgPSBkZWNsYXJlZFN0YXJ0IHx8IGV2ZW50LnRpbWU7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlsLnN0YXRlIGFzIHN0cmluZztcblxuICBsZXQgZHVyYXRpb25NczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tcGxldGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJywgJ1NUT1BQRUQnXS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICBjb21wbGV0ZWRBdCA9IGV2ZW50LnRpbWU7XG4gICAgLy8gT05MWSBmcm9tIGEgc3RhcnQgQVdTIGFjdHVhbGx5IGRlY2xhcmVkLiBXaXRoIHRoZSBmYWxsYmFjaywgYHN0YXJ0ZWRBdGAgYW5kXG4gICAgLy8gYGNvbXBsZXRlZEF0YCBhcmUgYm90aCBgZXZlbnQudGltZWAgb24gYSB0ZXJtaW5hbCBldmVudCwgc28gdGhlIGR1cmF0aW9uIGNhbWVcbiAgICAvLyBvdXQgYXMgZXhhY3RseSAwIOKAlCByZXBvcnRlZCBhcyBhIHJlYWwgbWVhc3VyZW1lbnQsIGRyYWdnaW5nIGV2ZXJ5IGF2ZXJhZ2UgYW5kXG4gICAgLy8gcDk1IHN0YWdlIGR1cmF0aW9uIHRvd2FyZCB6ZXJvIHdpdGggbm8gc2lnbiBhbnl0aGluZyB3YXMgbWlzc2luZy4gVW5rbm93biBpc1xuICAgIC8vIGxlZnQgdW5rbm93biAoTlVMTCksIHdoaWNoIHRoZSByZXBvcnRzIGFscmVhZHkgaGFuZGxlLlxuICAgIGlmIChkZWNsYXJlZFN0YXJ0KSB7XG4gICAgICBjb25zdCBtcyA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShkZWNsYXJlZFN0YXJ0KS5nZXRUaW1lKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG1zKSAmJiBtcyA+PSAwKSBkdXJhdGlvbk1zID0gbXM7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvbW90ZSB0aGUgZmFpbHVyZSByZWFzb24gdG8gYSB0eXBlZCBmaWVsZC4gT24gQWN0aW9uIGV2ZW50cyBBV1MgcHV0cyB0aGVcbiAgLy8gaHVtYW4tcmVhZGFibGUgc3VtbWFyeSAoYW5kIGEgbG9nIFVSTCArIGVycm9yLWNvZGUsIHdoaWNoIHN0YXkgaW4gYGRldGFpbGApXG4gIC8vIHVuZGVyIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgcmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgeyAnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdW1tYXJ5ID0gcmVzdWx0Py5bJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5J107XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHR5cGVvZiBzdW1tYXJ5ID09PSAnc3RyaW5nJyAmJiBzdW1tYXJ5Lmxlbmd0aCA+IDBcbiAgICA/IHN1bW1hcnkuc2xpY2UoMCwgTUFYX0VSUk9SX01FU1NBR0UpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gRE9SQSBkZXBsb3kgYXR0cmlidXRpb24g4oCUIGFsbCBvcHRpb25hbDogb21pdHRlZCAodW5kZWZpbmVkKSB3aGVuIHRoZVxuICAvLyBldmVudC9waXBlbGluZSBkb2Vzbid0IGNhcnJ5IHRoZW0uXG4gIGNvbnN0IHsgY29tbWl0U2hhLCBjb21taXRSZWYsIHJldmlzaW9uVXJsIH0gPSBleHRyYWN0Q29tbWl0KGRldGFpbCk7XG5cbiAgY29uc3QgZXhlY3V0aW9uSWQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1pZCddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhZ2VOYW1lID0gZGV0YWlsLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYWN0aW9uTmFtZSA9IGRldGFpbC5hY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEVudmlyb25tZW50ICjih5IgaXNEZXBsb3kpIGlzIHNldCBPTkxZIHdoZW4gdGhpcyBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgLy8gcGlwZWxpbmUncyBwYi5kZXBsb3lzIHRhZy4gUElQRUxJTkUgZXZlbnRzIGhhdmUgbm8gc3RhZ2Ug4oaSIG5ldmVyIGEgZGVwbG95LlxuICBjb25zdCBlbnZpcm9ubWVudCA9IHN0YWdlTmFtZSA/IGRlcGxveXMuZ2V0KHN0YWdlTmFtZSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gUmVzb2x2ZSB0aGUgY29tbWl0IHJhbmdlIChvbGRlc3QtdW5zaGlwcGVkIHRpbWVzdGFtcCArIGNvdW50KSBmb3IgYW55XG4gIC8vIGV2ZW50IGNhcnJ5aW5nIGEgY29tbWl0LiBCZXN0LWVmZm9ydC9pbi1hY2NvdW50OyBvbWl0dGVkIG9uIGFueSBmYWlsdXJlLlxuICAvLyBHQVRFRCBvbiBgRE9SQV9FTkFCTEVEYCAoc2V0IGJ5IGBzZXR1cC1ldmVudHMgLS13aXRoLWRvcmFgKTogRE9SQSBsZWFkIHRpbWUgaXMgYW5cbiAgLy8gYWR2YW5jZWRfcmVwb3J0aW5nIGFkZC1vbiwgc28gb3JncyB3aXRob3V0IGl0IHNraXAgdGhlIFNDTS9zZWNyZXQgY29zdCBlbnRpcmVseSDigJRcbiAgLy8gc3RhbmRhcmQgcmVwb3J0aW5nIChjb21taXRTaGEgKyBhbGwgb3RoZXIgZmllbGRzKSBzdGlsbCBmb3J3YXJkcyByZWdhcmRsZXNzLlxuICBsZXQgY29tbWl0VGltZXN0YW1wOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21taXRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoY29tbWl0U2hhICYmIHByb2Nlc3MuZW52LkRPUkFfRU5BQkxFRCA9PT0gJ3RydWUnKSB7XG4gICAgY29uc3Qgc3JjID0gY2xhc3NpZnlTb3VyY2UocmV2aXNpb25VcmwpO1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCByZXNvbHZlQ29tbWl0SW5mbyhwaXBlbGluZUlkLCBvcmdJZCwgZXZlbnQucmVnaW9uLCB7IHNoYTogY29tbWl0U2hhLCAuLi5zcmMgfSk7XG4gICAgY29tbWl0VGltZXN0YW1wID0gaW5mby5jb21taXRUaW1lc3RhbXA7XG4gICAgY29tbWl0Q291bnQgPSBpbmZvLmNvbW1pdENvdW50O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvcmdJZCxcbiAgICBwaXBlbGluZUlkLFxuICAgIGV2ZW50U291cmNlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBzdGF0dXM6IHN0YXRlLFxuICAgIGV4ZWN1dGlvbklkLFxuICAgIHN0YWdlTmFtZSxcbiAgICBhY3Rpb25OYW1lLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBzdGFydGVkQXQsXG4gICAgY29tcGxldGVkQXQsXG4gICAgZHVyYXRpb25NcyxcbiAgICAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLFxuICAgIC4uLihjb21taXRSZWYgJiYgeyBjb21taXRSZWYgfSksXG4gICAgLi4uKGNvbW1pdFRpbWVzdGFtcCAmJiB7IGNvbW1pdFRpbWVzdGFtcCB9KSxcbiAgICAuLi4oY29tbWl0Q291bnQgJiYgeyBjb21taXRDb3VudCB9KSxcbiAgICAuLi4oZW52aXJvbm1lbnQgJiYgeyBlbnZpcm9ubWVudCB9KSxcbiAgICBkZXRhaWwsXG4gIH07XG59XG4iXX0=
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUd0QyxPQUFPLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBNERoQywrRUFBK0U7QUFDL0UsTUFBTSxhQUFhLEdBQUcsR0FBRyxDQUFDO0FBRTFCLG9FQUFvRTtBQUNwRSxTQUFTLFFBQVEsQ0FBQyxDQUFVO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3ZGLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFFL0IsNEVBQTRFO0FBQzVFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0FBRTlCLDZFQUE2RTtBQUM3RSxTQUFTLFNBQVMsQ0FBQyxHQUFHLElBQWU7SUFDbkMsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNu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QUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEcsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDdkMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLO1FBQ0wsVUFBVTtRQUNWLFdBQVc7UUFDWCxTQUFTO1FBQ1QsTUFBTSxFQUFFLEtBQUs7UUFDYixXQUFXO1FBQ1gsU0FBUztRQUNULFVBQVU7UUFDVixZQUFZO1FBQ1osU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDM0MsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDbkMsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3ZDLEdBQUcsQ0FBQyxlQUFlLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUMzQyxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGNvZGVCdWlsZElkT2YsIHJlYWRCdWlsZENvbXB1dGUsIHJlYWRTeW50aEZhaWx1cmUgfSBmcm9tICcuL2ZhaWx1cmUtcmVhc29uLmpzJztcbmltcG9ydCB7IGNsYXNzaWZ5U291cmNlLCByZXNvbHZlQ29tbWl0SW5mbyB9IGZyb20gJy4vc2NtLmpzJztcbmltcG9ydCB7IE1BWF9BVFRSLCByZXNvbHZlUGlwZWxpbmUgfSBmcm9tICcuL3RhZ3MuanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi91dGlsLmpzJztcblxuLy8gRXZlbnQgcGFyc2luZzogYW4gU1FTIHJlY29yZCDihpIgdGhlIG5vcm1hbGl6ZWQgcmVwb3J0aW5nIGV2ZW50LlxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHBsYXRmb3JtIG9yZ0lkIChmcm9tIHRoZSBwaXBlbGluZSdzIE9yZ0lkIHRhZzsgbnVsbCB3aGVuIHVudGFnZ2VkKS5cbiAgICogSU5URVJOQUwg4oCUIHVzZWQgb25seSB0byBrZXkgdGhlIHBlci1vcmcgR2l0SHViIHRva2VuIGFuZCB0byBhdHRyaWJ1dGVcbiAgICogaW5nZXN0LWhlYWx0aC4gU3RyaXBwZWQgZnJvbSB0aGUgcGF5bG9hZCBQT1NUZWQgdG8gL3JlcG9ydHMvZXZlbnRzICh3aGljaFxuICAgKiByZXNvbHZlcyBvcmcgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIG5vdCB0aGUgYm9keSkuXG4gICAqL1xuICBvcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdGhlIGV2ZW50XG4gICAqICBjYXJyaWVzIG5vIHNvdXJjZSByZXZpc2lvbiDigJQgc3RvcmVkIE5VTEwgZG93bnN0cmVhbS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIGJyYW5jaC9yZWYgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdW5hdmFpbGFibGUuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIE9sZGVzdC11bnNoaXBwZWQgY29tbWl0IHRpbWVzdGFtcCAoSVNPIDg2MDEpIGZvciB0aGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3RcbiAgICogIGRlcGxveSDigJQgcmVzb2x2ZWQgaW4tYWNjb3VudC4gVW5kZWZpbmVkIHdoZW4gdW5yZXNvbHZhYmxlLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgcmVzb2x2ZWQgcmFuZ2UgKOKJpTEpLiBVbmRlZmluZWQgd2hlbiB1bnJlc29sdmFibGUuICovXG4gIGNvbW1pdENvdW50PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGNvbXB1dGUgc2l6ZSBhIHRlcm1pbmFsIENvZGVCdWlsZCBhY3Rpb24gcmFuIG9uIChgU01BTExgIOKApiBgWDJfTEFSR0VgKSxcbiAgICogcmVhZCBmcm9tIEFXUy4gVW5kZWZpbmVkIGZvciBhIG5vbi1Db2RlQnVpbGQgYWN0aW9uLCBhIG5vbi10ZXJtaW5hbCBldmVudCxcbiAgICogb3Igd2hlbiB0aGUgcmVhZCBmYWlsZWQg4oCUIHRoZSBpbmdlc3QgdGhlbiByZWNvcmRzIHRoZSBhY3Rpb24gYXMgVU5NRUFTVVJFRFxuICAgKiByYXRoZXIgdGhhbiBhcyBmcmVlLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZSBjb3ZlcmFnZSBnYXAgdmlzaWJsZSBpbnN0ZWFkIG9mXG4gICAqIGxvb2tpbmcgbGlrZSBpZGxlbmVzcy5cbiAgICpcbiAgICogSXRzIG93biBmaWVsZCByYXRoZXIgdGhhbiBhIGBkZXRhaWxgIGtleSwgZm9yIHRoZSByZWFzb24gYGZhaWx1cmVgIGhhcyBvbmU6XG4gICAqIGBkZXRhaWxgIGlzIGJvdW5kZWQgYXQgOCBLQiBhbmQgYWxyZWFkeSBzaGVkcyBjb250ZW50IHVuZGVyIHRoYXQgYm91bmQsIHNvIGFcbiAgICogb25lLXdvcmQgZmllbGQgcmlkaW5nIGluc2lkZSBpdCBpcyBhIGZpZWxkIHRoYXQgY2FuIGJlIGRyb3BwZWQgYnkgYW5cbiAgICogdW5yZWxhdGVkIHBheWxvYWQgZ2V0dGluZyBsYXJnZS5cbiAgICovXG4gIGNvbXB1dGVUeXBlPzogc3RyaW5nO1xuICAvKiogRGVwbG95IGVudmlyb25tZW50IOKAlCBzZXQgb25seSB3aGVuIHRoZSBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgICogIHBpcGVsaW5lJ3MgYHBiLmRlcGxveXNgIHRhZy4gVW5kZWZpbmVkIG90aGVyd2lzZSAo4oeSIG5vdCBhIGRlcGxveSkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICAvKiogVGhlIEV2ZW50QnJpZGdlIGV2ZW50IGBpZGAgKOKJpDEyOCkg4oCUIGxldHMgdGhlIHNlcnZlcidzIGF1ZGl0IHRyYWlsIG5hbWUgdGhlXG4gICAqICBleGFjdCBBV1MgZXZlbnQgYSByb3cgY2FtZSBmcm9tLiBVbmRlZmluZWQgd2hlbiB0aGUgYm9keSBjYXJyaWVzIG5vbmUuICovXG4gIHNvdXJjZUV2ZW50SWQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgU1FTIHJlY29yZCdzIG1lc3NhZ2VJZCAo4omkMTI4KSDigJQgdGhlIGRlbGl2ZXJ5IHRoYXQgY2FycmllZCB0aGUgZXZlbnQuICovXG4gIHNvdXJjZU1lc3NhZ2VJZD86IHN0cmluZztcbiAgZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENhcCBvbiBgc291cmNlRXZlbnRJZGAgLyBgc291cmNlTWVzc2FnZUlkYCDigJQgdGhlIHJlcG9ydGluZyBpbmdlc3QncyBtYXguICovXG5jb25zdCBNQVhfU09VUkNFX0lEID0gMTI4O1xuXG4vKiogQSBub24tZW1wdHkgc3RyaW5nIGNhcHBlZCB0byBgTUFYX1NPVVJDRV9JRGAsIGVsc2UgdW5kZWZpbmVkLiAqL1xuZnVuY3Rpb24gc291cmNlSWQodjogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwID8gdi5zbGljZSgwLCBNQVhfU09VUkNFX0lEKSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIENhcCBvbiB0aGUgc3RvcmVkIGZhaWx1cmUgc3VtbWFyeSDigJQgQ29kZUJ1aWxkL0RlcGxveSBzdW1tYXJpZXMgY2FuIGJlIGxvbmcuICovXG5jb25zdCBNQVhfRVJST1JfTUVTU0FHRSA9IDQwMDA7XG5cbi8qKiBIZWFkcm9vbSB1bmRlciB0aGUgcmVwb3J0aW5nIGluZ2VzdCdzIDggS0Igc2VyaWFsaXplZCBgZGV0YWlsYCBib3VuZC4gKi9cbmNvbnN0IE1BWF9ERVRBSUxfQllURVMgPSA3NTAwO1xuXG4vKiogRmlyc3Qgbm9uLWVtcHR5IHN0cmluZyBhbW9uZyB0aGUgY2FuZGlkYXRlcywgY2FwcGVkIHRvIHRoZSBpbmdlc3QgbWF4LiAqL1xuZnVuY3Rpb24gZmlyc3RBdHRyKC4uLnZhbHM6IHVua25vd25bXSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgdiBvZiB2YWxzKSB7XG4gICAgaWYgKHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2Lmxlbmd0aCA+IDApIHJldHVybiB2LnNsaWNlKDAsIE1BWF9BVFRSKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEJlc3QtZWZmb3J0IGV4dHJhY3Rpb24gb2YgdGhlIHNvdXJjZSBjb21taXQgaWQgKyByZWYgKGFuZCB0aGUgcmV2aXNpb24gVVJMLCB1c2VkXG4gKiBvbmx5IGluLWFjY291bnQgdG8gY2xhc3NpZnkgdGhlIHNvdXJjZSB0eXBlIGZvciBjb21taXQtcmFuZ2UgcmVzb2x1dGlvbikgZnJvbSBhXG4gKiBDb2RlUGlwZWxpbmUgZXZlbnQgZGV0YWlsLiBDb2RlUGlwZWxpbmUgc3VyZmFjZXMgdGhlIHNvdXJjZSByZXZpc2lvbiB1bmRlciBhIGZld1xuICogc2hhcGVzIGRlcGVuZGluZyBvbiB0aGUgZXZlbnQgdHlwZSAvIHNvdXJjZS1hY3Rpb247IHdlIGNoZWNrIHRoZSBrbm93biBvbmVzIGFuZFxuICogbGVhdmUgdGhlIGZpZWxkcyB1bmRlZmluZWQgd2hlbiBub25lIGFyZSBwcmVzZW50IChOVUxMIGRvd25zdHJlYW0pLiBOZXZlciBwdWxscyBhblxuICogQVJOL2FjY291bnQgaWQ6IG9ubHkgcmV2aXNpb24vYnJhbmNoL3VybCBzdHJpbmcgZmllbGRzIGFyZSByZWFkOyB0aGUgcmV2aXNpb25VcmxcbiAqIGlzIGNvbnN1bWVkIGluLWFjY291bnQgKHNvdXJjZSBjbGFzc2lmaWNhdGlvbikgYW5kIG5ldmVyIGZvcndhcmRlZCBvbiBpdHMgb3duLlxuICovXG5mdW5jdGlvbiBleHRyYWN0Q29tbWl0KGRldGFpbDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB7IGNvbW1pdFNoYT86IHN0cmluZzsgY29tbWl0UmVmPzogc3RyaW5nOyByZXZpc2lvblVybD86IHN0cmluZyB9IHtcbiAgLy8gYHNvdXJjZS1yZXZpc2lvbnNgIChrZWJhYiwgRXZlbnRCcmlkZ2UpIC8gYHNvdXJjZVJldmlzaW9uc2AgKGNhbWVsKSDigJQgZmlyc3QgZW50cnkuXG4gIGNvbnN0IHJldnMgPSAoZGV0YWlsWydzb3VyY2UtcmV2aXNpb25zJ10gPz8gZGV0YWlsLnNvdXJjZVJldmlzaW9ucykgYXNcbiAgICB8IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZmlyc3RSZXYgPSBBcnJheS5pc0FycmF5KHJldnMpID8gcmV2c1swXSA6IHVuZGVmaW5lZDtcbiAgLy8gT24gc291cmNlIGFjdGlvbnMgdGhlIHJldmlzaW9uIGlkIGNhbiBhbHNvIHJpZGUgb24gYGV4ZWN1dGlvbi1yZXN1bHRgLlxuICBjb25zdCBleGVjUmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY29tbWl0U2hhID0gZmlyc3RBdHRyKFxuICAgIGRldGFpbC5jb21taXRJZCxcbiAgICBkZXRhaWwucmV2aXNpb25JZCxcbiAgICBmaXJzdFJldj8ucmV2aXNpb25JZCxcbiAgICBleGVjUmVzdWx0Py5yZXZpc2lvbklkLFxuICApO1xuICBjb25zdCBjb21taXRSZWYgPSBmaXJzdEF0dHIoXG4gICAgZGV0YWlsLmNvbW1pdFJlZixcbiAgICBkZXRhaWwuYnJhbmNoLFxuICAgIGRldGFpbC5zb3VyY2VCcmFuY2gsXG4gICAgZmlyc3RSZXY/LmJyYW5jaE5hbWUsXG4gICAgZmlyc3RSZXY/LmJyYW5jaCxcbiAgKTtcbiAgY29uc3QgcmV2aXNpb25VcmwgPSB0eXBlb2YgZmlyc3RSZXY/LnJldmlzaW9uVXJsID09PSAnc3RyaW5nJyA/IGZpcnN0UmV2LnJldmlzaW9uVXJsIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7IC4uLihjb21taXRTaGEgJiYgeyBjb21taXRTaGEgfSksIC4uLihjb21taXRSZWYgJiYgeyBjb21taXRSZWYgfSksIC4uLihyZXZpc2lvblVybCAmJiB7IHJldmlzaW9uVXJsIH0pIH07XG59XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RXZlbnQoZGV0YWlsVHlwZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZXZlbnRTb3VyY2U6IHN0cmluZyB9IHtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1BpcGVsaW5lIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnU3RhZ2UgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1NUQUdFJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdBY3Rpb24gRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0FDVElPTicsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsIHNvXG4gIC8vIHBhcnNlUmVjb3JkIGRyb3BzIHRoZW0gb24gdGhlIGBldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZSdgIGNoZWNrIGJlbG93IOKAlFxuICAvLyB0aGUgJ0JVSUxEJyBldmVudFR5cGUgaXMgbmV2ZXIgcGVyc2lzdGVkIGhlcmUgKHBsdWdpbiBCVUlMRCBldmVudHMgYXJlXG4gIC8vIHJlY29yZGVkIGRpcmVjdGx5IGJ5IHRoZSBwbHVnaW4gc2VydmljZSkuIFRoZSAnY29kZWJ1aWxkJyBzb3VyY2UgaXMgd2hhdFxuICAvLyByb3V0ZXMgdGhlIGRyb3A7IGtlZXAgdGhpcyBicmFuY2ggb25seSBmb3IgdGhhdC5cbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ0J1aWxkIFN0YXRlJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0JVSUxEJywgZXZlbnRTb3VyY2U6ICdjb2RlYnVpbGQnIH07XG4gIHJldHVybiB7IGV2ZW50VHlwZTogJ1BJUEVMSU5FJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG59XG5cbi8qKiBQYXJzZSArIHJlc29sdmUgb25lIHJlY29yZCB0byBhIHJlcG9ydGFibGUgZXZlbnQsIG9yIG51bGwgdG8gc2tpcCBpdC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwYXJzZVJlY29yZChyZWNvcmQ6IFNRU1JlY29yZCk6IFByb21pc2U8UGFyc2VkRXZlbnQgfCBudWxsPiB7XG4gIGxldCBldmVudDoge1xuICAgICdpZCc/OiBzdHJpbmc7XG4gICAgJ2RldGFpbC10eXBlJzogc3RyaW5nO1xuICAgICdzb3VyY2UnOiBzdHJpbmc7XG4gICAgJ2RldGFpbCc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICd0aW1lJzogc3RyaW5nO1xuICAgICdyZWdpb24nOiBzdHJpbmc7XG4gICAgJ2FjY291bnQnOiBzdHJpbmc7XG4gIH07XG4gIC8vIEEgbWFsZm9ybWVkIGJvZHkgaXMgYSBkZWFkIG1lc3NhZ2UgKHJldHJ5aW5nIHdvbid0IGhlbHApIOKAlCBsb2cgKyBza2lwIGl0IHNvXG4gIC8vIGl0IGNhbid0IGZhaWwgdGhlIHdob2xlIGJhdGNoLiBSZXNvbHV0aW9uIGVycm9ycyBiZWxvdyAoZS5nLiBBY2Nlc3NEZW5pZWQpXG4gIC8vIGFyZSBOT1QgY2F1Z2h0IGhlcmU6IHRob3NlIGFyZSB0cmFuc2llbnQvaW5mcmEgYW5kIG11c3QgcHJvcGFnYXRlIHRvIHJldHJ5LlxuICB0cnkge1xuICAgIGV2ZW50ID0gSlNPTi5wYXJzZShyZWNvcmQuYm9keSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBTUVMgcmVjb3JkIHdpdGggdW5wYXJzZWFibGUgYm9keScsIHsgbWVzc2FnZUlkOiByZWNvcmQubWVzc2FnZUlkLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGV2ZW50VHlwZSwgZXZlbnRTb3VyY2UgfSA9IGNsYXNzaWZ5RXZlbnQoZXZlbnRbJ2RldGFpbC10eXBlJ10pO1xuICBjb25zdCBkZXRhaWwgPSB7IC4uLmV2ZW50LmRldGFpbCB9O1xuICAvLyBUaGUgcmF3IGFjY291bnQgbmV2ZXIgbmVlZHMgdG8gbGVhdmUgQVdTIG5vdyDigJQgZHJvcCBpdCBmcm9tIHRoZSBwYXlsb2FkLlxuICBkZWxldGUgZGV0YWlsLmFjY291bnQ7XG5cbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLFxuICAvLyBhbmQgYSBwcm9qZWN0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lcyDigJQgdGhlcmUncyBubyBjbGVhbiAxOjEgbWFwcGluZ1xuICAvLyB0byBhIHBpcGVsaW5lIGlkLCBzbyBza2lwIHRoZW0uXG4gIGlmIChldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZScpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgbm9uLUNvZGVQaXBlbGluZSBldmVudCAobm8gcGlwZWxpbmUgdGFnIHRvIHJlc29sdmUpJywgeyBkZXRhaWxUeXBlOiBldmVudFsnZGV0YWlsLXR5cGUnXSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghcGlwZWxpbmVOYW1lKSB7XG4gICAgbG9nLndhcm4oJ0NvZGVQaXBlbGluZSBldmVudCBtaXNzaW5nIHBpcGVsaW5lIG5hbWUg4oCUIHNraXBwaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBwaXBlbGluZSdzIHBiLnBpcGVsaW5lLWlkICg9IHBsYXRmb3JtIHBpcGVsaW5lSWQpICsgcGIuZGVwbG95cyBtYXAuXG4gIC8vIFRoZSBBUk4gaXMgb25seSBhIHRyYW5zaWVudCBoYW5kbGUgZm9yIHRoZSB0YWcgbG9va3VwOyBpdCBpcyBuZXZlciBzdG9yZWQuXG4gIGNvbnN0IGFybiA9IGBhcm46YXdzOmNvZGVwaXBlbGluZToke2V2ZW50LnJlZ2lvbn06JHtldmVudC5hY2NvdW50fToke3BpcGVsaW5lTmFtZX1gO1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzIH0gPSBhd2FpdCByZXNvbHZlUGlwZWxpbmUoYXJuLCBldmVudC5yZWdpb24pO1xuICBpZiAoIXBpcGVsaW5lSWQpIHJldHVybiBudWxsOyAvLyB1bnRhZ2dlZCAvIHVucmVnaXN0ZXJlZCDihpIgc2tpcFxuXG4gIC8vIEFXUyBkb2VzIG5vdCBhbHdheXMgc2VuZCBgc3RhcnQtdGltZWAuIGBldmVudC50aW1lYCBzdGFuZHMgaW4gZm9yIGl0IHNvIHRoZVxuICAvLyByb3cgc3RpbGwgbGFuZHMgaW4gdGhlIHJlcG9ydCB3aW5kb3dzLCB3aGljaCBmaWx0ZXIgb24gYHN0YXJ0ZWRfYXRgIOKAlCBidXQgaXRcbiAgLy8gaXMgTk9UIGEgbWVhc3VyZW1lbnQsIGFuZCB0aGUgZHVyYXRpb24gYmVsb3cgbXVzdCBub3QgYmUgY29tcHV0ZWQgZnJvbSBpdC5cbiAgY29uc3QgZGVjbGFyZWRTdGFydCA9IGRldGFpbFsnc3RhcnQtdGltZSddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhcnRlZEF0ID0gZGVjbGFyZWRTdGFydCB8fCBldmVudC50aW1lO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbC5zdGF0ZSBhcyBzdHJpbmc7XG5cbiAgbGV0IGR1cmF0aW9uTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbXBsZXRlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKFsnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJ10uaW5jbHVkZXMoc3RhdGUpKSB7XG4gICAgY29tcGxldGVkQXQgPSBldmVudC50aW1lO1xuICAgIC8vIE9OTFkgZnJvbSBhIHN0YXJ0IEFXUyBhY3R1YWxseSBkZWNsYXJlZC4gV2l0aCB0aGUgZmFsbGJhY2ssIGBzdGFydGVkQXRgIGFuZFxuICAgIC8vIGBjb21wbGV0ZWRBdGAgYXJlIGJvdGggYGV2ZW50LnRpbWVgIG9uIGEgdGVybWluYWwgZXZlbnQsIHNvIHRoZSBkdXJhdGlvbiBjYW1lXG4gICAgLy8gb3V0IGFzIGV4YWN0bHkgMCDigJQgcmVwb3J0ZWQgYXMgYSByZWFsIG1lYXN1cmVtZW50LCBkcmFnZ2luZyBldmVyeSBhdmVyYWdlIGFuZFxuICAgIC8vIHA5NSBzdGFnZSBkdXJhdGlvbiB0b3dhcmQgemVybyB3aXRoIG5vIHNpZ24gYW55dGhpbmcgd2FzIG1pc3NpbmcuIFVua25vd24gaXNcbiAgICAvLyBsZWZ0IHVua25vd24gKE5VTEwpLCB3aGljaCB0aGUgcmVwb3J0cyBhbHJlYWR5IGhhbmRsZS5cbiAgICBpZiAoZGVjbGFyZWRTdGFydCkge1xuICAgICAgY29uc3QgbXMgPSBuZXcgRGF0ZShjb21wbGV0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoZGVjbGFyZWRTdGFydCkuZ2V0VGltZSgpO1xuICAgICAgaWYgKE51bWJlci5pc0Zpbml0ZShtcykgJiYgbXMgPj0gMCkgZHVyYXRpb25NcyA9IG1zO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb21vdGUgdGhlIGZhaWx1cmUgcmVhc29uIHRvIGEgdHlwZWQgZmllbGQuIE9uIEFjdGlvbiBldmVudHMgQVdTIHB1dHMgdGhlXG4gIC8vIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgKGFuZCBhIGxvZyBVUkwgKyBlcnJvci1jb2RlLCB3aGljaCBzdGF5IGluIGBkZXRhaWxgKVxuICAvLyB1bmRlciBgZXhlY3V0aW9uLXJlc3VsdGAuXG4gIGNvbnN0IHJlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIHsgJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5Jz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VtbWFyeSA9IHJlc3VsdD8uWydleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSddO1xuICBsZXQgZXJyb3JNZXNzYWdlID0gdHlwZW9mIHN1bW1hcnkgPT09ICdzdHJpbmcnICYmIHN1bW1hcnkubGVuZ3RoID4gMFxuICAgID8gc3VtbWFyeS5zbGljZSgwLCBNQVhfRVJST1JfTUVTU0FHRSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBBIGZhaWxlZCBDb2RlQnVpbGQgYWN0aW9uIG1heSBoYXZlIHByaW50ZWQgYSBzdHJ1Y3R1cmVkIHJlYXNvbiAodGhlIHN5bnRoJ3NcbiAgLy8gYFBCX1NZTlRIX0ZBSUxVUkVgIGxpbmUg4oCUIGEgcmVmdXNlZCBwbHVnaW4sIHdpdGggaXRzIGNvZGUpLiBDb2RlQnVpbGQnc1xuICAvLyBzdW1tYXJ5IG5ldmVyIGNhcnJpZXMgdGhlIGJ1aWxkIG91dHB1dCwgc28gcmVhZCBpdCBmcm9tIHRoZSBidWlsZCdzIGxvZyBhbmRcbiAgLy8gcHJvbW90ZSBpdDogdGhlIGNvZGUgKyBtZXNzYWdlIGJlY29tZSB0aGUgZmFpbHVyZSByZWFzb24sIHRoZSBwZXItcGx1Z2luXG4gIC8vIGxpc3QgcmlkZXMgaW4gYGRldGFpbC5wYkZhaWx1cmVgLiBCZXN0LWVmZm9ydCAoc2VlIGZhaWx1cmUtcmVhc29uLnRzKS5cbiAgLy8gVGhlIGNvbXB1dGUgc2l6ZSB0aGlzIGFjdGlvbiByYW4gb24sIGZvciB0aGUgdkNQVS1taW51dGUgZmlndXJlIFBoYXNlIDRcbiAgLy8gbWVhc3VyZXMuIE9ubHkgb24gYSBURVJNSU5BTCBDb2RlQnVpbGQgYWN0aW9uOiBhbiBpbi1wcm9ncmVzcyBldmVudCBoYXMgbm9cbiAgLy8gZHVyYXRpb24gdG8gcGFpciBpdCB3aXRoLCBzbyByZWFkaW5nIGl0IHRoZXJlIHdvdWxkIHNwZW5kIGFuIEFXUyBjYWxsIHRvXG4gIC8vIGxlYXJuIG5vdGhpbmcuIEJlc3QtZWZmb3J0IOKAlCBudWxsIGZvcndhcmRzIHdpdGhvdXQgdGhlIGZpZWxkLlxuICBsZXQgY29tcHV0ZVR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKGV2ZW50VHlwZSA9PT0gJ0FDVElPTicgJiYgWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ1NUT1BQRUQnXS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICBjb25zdCBjYklkID0gY29kZUJ1aWxkSWRPZihkZXRhaWwpO1xuICAgIGNvbXB1dGVUeXBlID0gKGNiSWQgPyBhd2FpdCByZWFkQnVpbGRDb21wdXRlKGV2ZW50LnJlZ2lvbiwgY2JJZCkgOiBudWxsKSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoZXZlbnRUeXBlID09PSAnQUNUSU9OJyAmJiBzdGF0ZSA9PT0gJ0ZBSUxFRCcpIHtcbiAgICBjb25zdCBidWlsZElkID0gY29kZUJ1aWxkSWRPZihkZXRhaWwpO1xuICAgIGNvbnN0IGZhaWx1cmUgPSBidWlsZElkID8gYXdhaXQgcmVhZFN5bnRoRmFpbHVyZShldmVudC5yZWdpb24sIGJ1aWxkSWQpIDogbnVsbDtcbiAgICBpZiAoZmFpbHVyZSkge1xuICAgICAgZGV0YWlsLnBiRmFpbHVyZSA9IGZhaWx1cmU7XG4gICAgICAvLyBUaGUgaW5nZXN0IGJvdW5kcyBgZGV0YWlsYCBhdCA4IEtCIHNlcmlhbGl6ZWQ7IGtlZXAgdGhlIGNvZGVzLCBkcm9wIHRoZVxuICAgICAgLy8gcGVyLXBsdWdpbiBwcm9zZSBpZiB0aGUgd2hvbGUgdGhpbmcgd291bGQgbm90IGZpdC5cbiAgICAgIGlmIChKU09OLnN0cmluZ2lmeShkZXRhaWwpLmxlbmd0aCA+PSBNQVhfREVUQUlMX0JZVEVTKSB7XG4gICAgICAgIGRldGFpbC5wYkZhaWx1cmUgPSB7IC4uLmZhaWx1cmUsIHBsdWdpbnM6IGZhaWx1cmUucGx1Z2lucy5tYXAoKHsgcGx1Z2luLCBjb2RlIH0pID0+ICh7IHBsdWdpbiwgY29kZSB9KSkgfTtcbiAgICAgIH1cbiAgICAgIGVycm9yTWVzc2FnZSA9IGAke2ZhaWx1cmUuY29kZX06ICR7ZmFpbHVyZS5tZXNzYWdlfWAuc2xpY2UoMCwgTUFYX0VSUk9SX01FU1NBR0UpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEF1ZGl0IGNvcnJlbGF0aW9uIGJhY2sgdG8gdGhlIEFXUyBzaWRlOiB3aGljaCBFdmVudEJyaWRnZSBldmVudCwgY2FycmllZCBieVxuICAvLyB3aGljaCBTUVMgZGVsaXZlcnkuIEJvdGggYXJlIG9wYXF1ZSBpZHMgKG5vIEFSTiwgbm8gYWNjb3VudCkuXG4gIGNvbnN0IHNvdXJjZUV2ZW50SWQgPSBzb3VyY2VJZChldmVudC5pZCk7XG4gIGNvbnN0IHNvdXJjZU1lc3NhZ2VJZCA9IHNvdXJjZUlkKHJlY29yZC5tZXNzYWdlSWQpO1xuXG4gIC8vIERPUkEgZGVwbG95IGF0dHJpYnV0aW9uIOKAlCBhbGwgb3B0aW9uYWw6IG9taXR0ZWQgKHVuZGVmaW5lZCkgd2hlbiB0aGVcbiAgLy8gZXZlbnQvcGlwZWxpbmUgZG9lc24ndCBjYXJyeSB0aGVtLlxuICBjb25zdCB7IGNvbW1pdFNoYSwgY29tbWl0UmVmLCByZXZpc2lvblVybCB9ID0gZXh0cmFjdENvbW1pdChkZXRhaWwpO1xuXG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gZGV0YWlsWydleGVjdXRpb24taWQnXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YWdlTmFtZSA9IGRldGFpbC5zdGFnZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBkZXRhaWwuYWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBFbnZpcm9ubWVudCAo4oeSIGlzRGVwbG95KSBpcyBzZXQgT05MWSB3aGVuIHRoaXMgZXZlbnQncyBzdGFnZSBpcyBsaXN0ZWQgaW4gdGhlXG4gIC8vIHBpcGVsaW5lJ3MgcGIuZGVwbG95cyB0YWcuIFBJUEVMSU5FIGV2ZW50cyBoYXZlIG5vIHN0YWdlIOKGkiBuZXZlciBhIGRlcGxveS5cbiAgY29uc3QgZW52aXJvbm1lbnQgPSBzdGFnZU5hbWUgPyBkZXBsb3lzLmdldChzdGFnZU5hbWUpIDogdW5kZWZpbmVkO1xuXG4gIC8vIFJlc29sdmUgdGhlIGNvbW1pdCByYW5nZSAob2xkZXN0LXVuc2hpcHBlZCB0aW1lc3RhbXAgKyBjb3VudCkgZm9yIGFueVxuICAvLyBldmVudCBjYXJyeWluZyBhIGNvbW1pdC4gQmVzdC1lZmZvcnQvaW4tYWNjb3VudDsgb21pdHRlZCBvbiBhbnkgZmFpbHVyZS5cbiAgLy8gR0FURUQgb24gYERPUkFfRU5BQkxFRGAgKHNldCBieSBgc2V0dXAtZXZlbnRzIC0td2l0aC1kb3JhYCk6IERPUkEgbGVhZCB0aW1lIGlzIGFuXG4gIC8vIGFkdmFuY2VkX3JlcG9ydGluZyBhZGQtb24sIHNvIG9yZ3Mgd2l0aG91dCBpdCBza2lwIHRoZSBTQ00vc2VjcmV0IGNvc3QgZW50aXJlbHkg4oCUXG4gIC8vIHN0YW5kYXJkIHJlcG9ydGluZyAoY29tbWl0U2hhICsgYWxsIG90aGVyIGZpZWxkcykgc3RpbGwgZm9yd2FyZHMgcmVnYXJkbGVzcy5cbiAgbGV0IGNvbW1pdFRpbWVzdGFtcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tbWl0Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWYgKGNvbW1pdFNoYSAmJiBwcm9jZXNzLmVudi5ET1JBX0VOQUJMRUQgPT09ICd0cnVlJykge1xuICAgIGNvbnN0IHNyYyA9IGNsYXNzaWZ5U291cmNlKHJldmlzaW9uVXJsKTtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZUNvbW1pdEluZm8ocGlwZWxpbmVJZCwgb3JnSWQsIGV2ZW50LnJlZ2lvbiwgeyBzaGE6IGNvbW1pdFNoYSwgLi4uc3JjIH0pO1xuICAgIGNvbW1pdFRpbWVzdGFtcCA9IGluZm8uY29tbWl0VGltZXN0YW1wO1xuICAgIGNvbW1pdENvdW50ID0gaW5mby5jb21taXRDb3VudDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3JnSWQsXG4gICAgcGlwZWxpbmVJZCxcbiAgICBldmVudFNvdXJjZSxcbiAgICBldmVudFR5cGUsXG4gICAgc3RhdHVzOiBzdGF0ZSxcbiAgICBleGVjdXRpb25JZCxcbiAgICBzdGFnZU5hbWUsXG4gICAgYWN0aW9uTmFtZSxcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgLi4uKGNvbW1pdFNoYSAmJiB7IGNvbW1pdFNoYSB9KSxcbiAgICAuLi4oY29tbWl0UmVmICYmIHsgY29tbWl0UmVmIH0pLFxuICAgIC4uLihjb21taXRUaW1lc3RhbXAgJiYgeyBjb21taXRUaW1lc3RhbXAgfSksXG4gICAgLi4uKGNvbW1pdENvdW50ICYmIHsgY29tbWl0Q291bnQgfSksXG4gICAgLi4uKGVudmlyb25tZW50ICYmIHsgZW52aXJvbm1lbnQgfSksXG4gICAgLi4uKGNvbXB1dGVUeXBlICYmIHsgY29tcHV0ZVR5cGUgfSksXG4gICAgLi4uKHNvdXJjZUV2ZW50SWQgJiYgeyBzb3VyY2VFdmVudElkIH0pLFxuICAgIC4uLihzb3VyY2VNZXNzYWdlSWQgJiYgeyBzb3VyY2VNZXNzYWdlSWQgfSksXG4gICAgZGV0YWlsLFxuICB9O1xufVxuIl19
|
package/lib/tags.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { BoundedMap, CACHE_MAX_ENTRIES, log } from './util.js';
|
|
3
|
+
import { arnRef, BoundedMap, CACHE_MAX_ENTRIES, log } from './util.js';
|
|
4
4
|
let codepipelineMod;
|
|
5
5
|
async function loadCodePipeline() {
|
|
6
6
|
if (!codepipelineMod)
|
|
@@ -13,8 +13,8 @@ async function loadCodePipeline() {
|
|
|
13
13
|
// pb.deploys = <stage>:<env> pairs joined by '+', e.g.
|
|
14
14
|
// "Deploy-stg:staging+Deploy-prod:production"
|
|
15
15
|
// We resolve those tags from the live CodePipeline (region-aware). The ARN/account
|
|
16
|
-
// never leave AWS,
|
|
17
|
-
// hammering the ListTags API.
|
|
16
|
+
// never leave AWS, and never reach a log line either: logs carry `arnRef(arn)`, a
|
|
17
|
+
// short digest. Cached per ARN (warm-container) to avoid hammering the ListTags API.
|
|
18
18
|
//
|
|
19
19
|
// Requires the Lambda execution role to allow `codepipeline:ListTagsForResource`.
|
|
20
20
|
// AccessDenied is a config error (alert loudly); a missing pb.pipeline-id tag is
|
|
@@ -89,7 +89,7 @@ export async function resolvePipeline(arn, region) {
|
|
|
89
89
|
const orgId = out.tags?.find(t => t.key === ORG_ID_TAG)?.value ?? null;
|
|
90
90
|
const deploys = parseDeploys(out.tags?.find(t => t.key === DEPLOYS_TAG)?.value);
|
|
91
91
|
if (!pipelineId)
|
|
92
|
-
log.warn('Pipeline missing pb.pipeline-id tag — skipping (register it?)', { arn });
|
|
92
|
+
log.warn('Pipeline missing pb.pipeline-id tag — skipping (register it?)', { pipeline: arnRef(arn) });
|
|
93
93
|
resolvedByArn.set(arn, { pipelineId, orgId, deploys, ts: Date.now() });
|
|
94
94
|
return { pipelineId, orgId, deploys };
|
|
95
95
|
}
|
|
@@ -97,7 +97,7 @@ export async function resolvePipeline(arn, region) {
|
|
|
97
97
|
const name = err?.name;
|
|
98
98
|
if (name === 'AccessDeniedException') {
|
|
99
99
|
// Don't cache — this is a fixable misconfig, not a property of the pipeline.
|
|
100
|
-
log.error('AccessDenied calling codepipeline:ListTagsForResource — grant it to the Lambda role', { arn, error: name });
|
|
100
|
+
log.error('AccessDenied calling codepipeline:ListTagsForResource — grant it to the Lambda role', { pipeline: arnRef(arn), error: name });
|
|
101
101
|
throw err;
|
|
102
102
|
}
|
|
103
103
|
// Transient/infra errors (throttling, timeouts, 5xx) MUST propagate so the SQS
|
|
@@ -111,10 +111,10 @@ export async function resolvePipeline(arn, region) {
|
|
|
111
111
|
|| (typeof status === 'number' && status >= 500)
|
|
112
112
|
|| /throttl|timeout|toomanyrequests|serviceunavailable|econnreset|networkingerror/i.test(name ?? '');
|
|
113
113
|
if (retryable) {
|
|
114
|
-
log.error('Transient error resolving pb.pipeline-id tag — will retry the batch', { arn, error: name ?? String(err) });
|
|
114
|
+
log.error('Transient error resolving pb.pipeline-id tag — will retry the batch', { pipeline: arnRef(arn), error: name ?? String(err) });
|
|
115
115
|
throw err;
|
|
116
116
|
}
|
|
117
|
-
log.error('Failed to resolve pb.pipeline-id tag', { arn, error: name ?? String(err) });
|
|
117
|
+
log.error('Failed to resolve pb.pipeline-id tag', { pipeline: arnRef(arn), error: name ?? String(err) });
|
|
118
118
|
return { pipelineId: null, orgId: null, deploys: new Map() };
|
|
119
119
|
}
|
|
120
120
|
}
|
|
@@ -122,4 +122,4 @@ export async function resolvePipeline(arn, region) {
|
|
|
122
122
|
export function _resetTagsForTests() {
|
|
123
123
|
resolvedByArn.clear();
|
|
124
124
|
}
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFZL0QsSUFBSSxlQUErQyxDQUFDO0FBQ3BELEtBQUssVUFBVSxnQkFBZ0I7SUFDN0IsSUFBSSxDQUFDLGVBQWU7UUFBRSxlQUFlLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFrQyxDQUFDO0lBQ3hILE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsMENBQTBDO0FBQzFDLDJDQUEyQztBQUMzQyw2REFBNkQ7QUFDN0QsaUVBQWlFO0FBQ2pFLG1GQUFtRjtBQUNuRixtRkFBbUY7QUFDbkYsOEJBQThCO0FBQzlCLEVBQUU7QUFDRixrRkFBa0Y7QUFDbEYsaUZBQWlGO0FBQ2pGLDBDQUEwQztBQUUxQyxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQztBQUN6QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUFDakMsZ0ZBQWdGO0FBQ2hGLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQztBQUMzQixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztBQUdsRSwwRUFBMEU7QUFDMUUsZ0ZBQWdGO0FBQ2hGLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsaUVBQWlFO0FBQ2pFLE1BQU0sYUFBYSxHQUFHLElBQUksVUFBVSxDQUF3RyxpQkFBaUIsQ0FBQyxDQUFDO0FBQy9KLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFDdkMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElB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LENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUM7ZUFDN0MsZ0ZBQWdGLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxDQUFDLEtBQUssQ0FBQyxxRUFBcUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDdEgsTUFBTSxHQUFHLENBQUM7UUFDWixDQUFDO1FBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkYsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQy9ELENBQUM7QUFDSCxDQUFDO0FBRUQsc0RBQXNEO0FBQ3RELE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQm91bmRlZE1hcCwgQ0FDSEVfTUFYX0VOVFJJRVMsIGxvZyB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8vIEFXUyBMYW1iZGEncyBOb2RlIHJ1bnRpbWUgcHJvdmlkZXMgQGF3cy1zZGsgdjMsIHNvIHRoZSBDb2RlUGlwZWxpbmUgY2xpZW50IGlzXG4vLyBsb2FkZWQgbGF6aWx5IHZpYSBkeW5hbWljIGltcG9ydCgpIOKAlCBhIHN0YXRpYyB3b3Jrc3BhY2UgZGVwZW5kZW5jeSB3b3VsZFxuLy8gcGVydHVyYiB0aGUgc2hhcmVkIEBhd3Mtc2RrIHZlcnNpb24gdHJlZS4gTWluaW1hbCBsb2NhbCB0eXBlcyBrZWVwIHRoZSBjYWxsXG4vLyBzaXRlcyB0eXBlLWNoZWNrZWQuXG5pbnRlcmZhY2UgTGlzdFRhZ3NPdXRwdXQgeyB0YWdzPzogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH0+IH1cbmludGVyZmFjZSBDb2RlUGlwZWxpbmVDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTxMaXN0VGFnc091dHB1dD4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZU1vZHVsZSB7XG4gIENvZGVQaXBlbGluZUNsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gQ29kZVBpcGVsaW5lQ2xpZW50TGlrZTtcbiAgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgcmVzb3VyY2VBcm46IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IGNvZGVwaXBlbGluZU1vZDogQ29kZVBpcGVsaW5lTW9kdWxlIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvZGVQaXBlbGluZSgpOiBQcm9taXNlPENvZGVQaXBlbGluZU1vZHVsZT4ge1xuICBpZiAoIWNvZGVwaXBlbGluZU1vZCkgY29kZXBpcGVsaW5lTW9kID0gKGF3YWl0IGltcG9ydCgnQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZScpKSBhcyB1bmtub3duIGFzIENvZGVQaXBlbGluZU1vZHVsZTtcbiAgcmV0dXJuIGNvZGVwaXBlbGluZU1vZDtcbn1cblxuLy8gVGFnIHJlc29sdXRpb246IHBiLnBpcGVsaW5lLWlkICsgcGIuZGVwbG95cy5cbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGF0IENESyBzeW50aCB3aXRoOlxuLy8gICBwYi5waXBlbGluZS1pZCA9IDxwbGF0Zm9ybSBwaXBlbGluZUlkPlxuLy8gICBwYi5kZXBsb3lzICAgICA9IDxzdGFnZT46PGVudj4gcGFpcnMgam9pbmVkIGJ5ICcrJywgZS5nLlxuLy8gICAgICAgICAgICAgICAgICAgIFwiRGVwbG95LXN0ZzpzdGFnaW5nK0RlcGxveS1wcm9kOnByb2R1Y3Rpb25cIlxuLy8gV2UgcmVzb2x2ZSB0aG9zZSB0YWdzIGZyb20gdGhlIGxpdmUgQ29kZVBpcGVsaW5lIChyZWdpb24tYXdhcmUpLiBUaGUgQVJOL2FjY291bnRcbi8vIG5ldmVyIGxlYXZlIEFXUywgc28gdGhlcmUncyBubyBtYXNraW5nLiBDYWNoZWQgcGVyIEFSTiAod2FybS1jb250YWluZXIpIHRvIGF2b2lkXG4vLyBoYW1tZXJpbmcgdGhlIExpc3RUYWdzIEFQSS5cbi8vXG4vLyBSZXF1aXJlcyB0aGUgTGFtYmRhIGV4ZWN1dGlvbiByb2xlIHRvIGFsbG93IGBjb2RlcGlwZWxpbmU6TGlzdFRhZ3NGb3JSZXNvdXJjZWAuXG4vLyBBY2Nlc3NEZW5pZWQgaXMgYSBjb25maWcgZXJyb3IgKGFsZXJ0IGxvdWRseSk7IGEgbWlzc2luZyBwYi5waXBlbGluZS1pZCB0YWcgaXNcbi8vIHRyZWF0ZWQgYXMgXCJub3QgeWV0IHJlZ2lzdGVyZWRcIiAoc2tpcCkuXG5cbmNvbnN0IFBJUEVMSU5FX0lEX1RBRyA9ICdwYi5waXBlbGluZS1pZCc7XG5jb25zdCBERVBMT1lTX1RBRyA9ICdwYi5kZXBsb3lzJztcbi8vIENhbm9uaWNhbCBwZXItcGlwZWxpbmUgb3JnIHRhZyAoYXBwbGllZCBhdCBzeW50aCBieSBwaXBlbGluZS1jb3JlKS4gSXQgaXMgdGhlXG4vLyBSRVNPTFZFRCBvcmcgZm9yIGV2ZXJ5IGV2ZW50IG9mIHRoaXMgcGlwZWxpbmUg4oCUIHVzZWQgdG8ga2V5IHRoZSBwZXItb3JnIEdpdEh1YlxuLy8gdG9rZW4gYW5kIHRvIGF0dHJpYnV0ZSBpbmdlc3QtaGVhbHRoLiBvcmdJZCBpcyBhIHBsYXRmb3JtIGlkLCBuZXZlciBhbiBBV1Ncbi8vIGFjY291bnQgaWQsIHNvIGl0IGlzIHNhZmUgdG8gcmVhZC9mb3J3YXJkLlxuY29uc3QgT1JHX0lEX1RBRyA9ICdPcmdJZCc7XG5jb25zdCBjbGllbnRzQnlSZWdpb24gPSBuZXcgTWFwPHN0cmluZywgQ29kZVBpcGVsaW5lQ2xpZW50TGlrZT4oKTtcblxuXG4vLyBgdHNgIGxldHMgQk9USCBvdXRjb21lcyBleHBpcmU6IGEgbmVnYXRpdmUgKHJlc29sdmVkLWJ1dC11bnRhZ2dlZCkgc28gYVxuLy8gcGlwZWxpbmUgdGFnZ2VkIEFGVEVSIGl0cyBmaXJzdCBldmVudCBiZWNvbWVzIHJlc29sdmFibGUsIGFuZCBhIHBvc2l0aXZlIHNvIGFcbi8vIHJlLXN5bnRoIHRoYXQgY2hhbmdlcyBgcGIuZGVwbG95c2AgKGEgc3RhZ2UgcmVuYW1lZCwgYW4gZW52aXJvbm1lbnQgYWRkZWQpIG9yXG4vLyBgT3JnSWRgIGlzIHBpY2tlZCB1cCB3aXRob3V0IHJlY3ljbGluZyB0aGUgd2FybSBjb250YWluZXIg4oCUIGEgbGlmZXRpbWUgY2FjaGVcbi8vIHdvdWxkIGtlZXAgYXR0cmlidXRpbmcgZGVwbG95cyB0byBzdGFnZXMgdGhhdCBubyBsb25nZXIgZXhpc3QuXG5jb25zdCByZXNvbHZlZEJ5QXJuID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCB7IHBpcGVsaW5lSWQ6IHN0cmluZyB8IG51bGw7IG9yZ0lkOiBzdHJpbmcgfCBudWxsOyBkZXBsb3lzOiBNYXA8c3RyaW5nLCBzdHJpbmc+OyB0czogbnVtYmVyIH0+KENBQ0hFX01BWF9FTlRSSUVTKTtcbmNvbnN0IE5FR19DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuY29uc3QgUE9TX0NBQ0hFX1RUTF9NUyA9IDE1ICogNjAgKiAxMDAwO1xuXG4vKiogUmVzb2x2ZWQgcGlwZWxpbmUgbWV0YWRhdGEgcmVhZCBmcm9tIHRoZSBDb2RlUGlwZWxpbmUgcmVzb3VyY2UgdGFncy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRQaXBlbGluZSB7XG4gIC8qKiBQbGF0Zm9ybSBwaXBlbGluZUlkIChwYi5waXBlbGluZS1pZCB0YWcpOyBudWxsIHdoZW4gdW50YWdnZWQvdW5yZWdpc3RlcmVkLiAqL1xuICBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsO1xuICAvKiogUGxhdGZvcm0gb3JnSWQgKE9yZ0lkIHRhZyk7IG51bGwgd2hlbiB0aGUgcGlwZWxpbmUgY2FycmllcyBubyBvcmcgdGFnLiAqL1xuICBvcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIE1hcCBvZiBkZXBsb3ktc3RhZ2UgbmFtZSDihpIgZW52aXJvbm1lbnQgKHBhcnNlZCBmcm9tIHBiLmRlcGxveXMpLiBFbXB0eSB3aGVuIG5vbmUuICovXG4gIGRlcGxveXM6IE1hcDxzdHJpbmcsIHN0cmluZz47XG59XG5cbi8qKiBDYXAgb24gY29tbWl0L3JlZi9lbnZpcm9ubWVudCBmaWVsZHMg4oCUIHRoZSBpbmdlc3QgY29udHJhY3QgYWxsb3dzIG1heCAyNTUuICovXG5leHBvcnQgY29uc3QgTUFYX0FUVFIgPSAyNTU7XG5cbi8qKlxuICogUGFyc2UgdGhlIGBwYi5kZXBsb3lzYCB0YWcgdmFsdWUgaW50byBhIHN0YWdl4oaSZW52aXJvbm1lbnQgbWFwLiBUaGUgdmFsdWUgaXNcbiAqIGA8c3RhZ2U+OjxlbnY+YCBwYWlycyBqb2luZWQgYnkgYCtgIChDb2RlUGlwZWxpbmUtdGFnLXNhZmU7IG5vIEpTT04pLiBBIHN0YWdlXG4gKiBwcmVzZW50IGhlcmUgaXMgYSBkZXBsb3k7IGl0cyBtYXBwZWQgZW52aXJvbm1lbnQgaXMgd2hhdCB0aGUgZm9yd2FyZGVyIHN0YW1wcyBvblxuICogdGhhdCBzdGFnZSdzIFNUQUdFL0FDVElPTiBldmVudHMgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gTWFsZm9ybWVkIHBhaXJzIGFyZVxuICogc2tpcHBlZCBkZWZlbnNpdmVseS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VEZXBsb3lzKHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIG1hcDtcbiAgZm9yIChjb25zdCBwYWlyIG9mIHZhbHVlLnNwbGl0KCcrJykpIHtcbiAgICBjb25zdCBpZHggPSBwYWlyLmluZGV4T2YoJzonKTtcbiAgICBpZiAoaWR4IDw9IDApIGNvbnRpbnVlO1xuICAgIGNvbnN0IHN0YWdlID0gcGFpci5zbGljZSgwLCBpZHgpLnRyaW0oKTtcbiAgICBjb25zdCBlbnYgPSBwYWlyLnNsaWNlKGlkeCArIDEpLnRyaW0oKTtcbiAgICBpZiAoc3RhZ2UgJiYgZW52KSBtYXAuc2V0KHN0YWdlLCBlbnYuc2xpY2UoMCwgTUFYX0FUVFIpKTtcbiAgfVxuICByZXR1cm4gbWFwO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwaXBlbGluZUNsaWVudChyZWdpb246IHN0cmluZyk6IFByb21pc2U8Q29kZVBpcGVsaW5lQ2xpZW50TGlrZT4ge1xuICBsZXQgY2xpZW50ID0gY2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNvbnN0IHsgQ29kZVBpcGVsaW5lQ2xpZW50IH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY2xpZW50ID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBDb2RlUGlwZWxpbmUncyB0YWdzIOKGkiB0aGUgcGxhdGZvcm0gcGlwZWxpbmVJZCAocGIucGlwZWxpbmUtaWQpIHBsdXMgdGhlXG4gKiBkZXBsb3ktc3RhZ2XihpJlbnZpcm9ubWVudCBtYXAgKHBiLmRlcGxveXMpLiBgcGlwZWxpbmVJZGAgaXMgbnVsbCB3aGVuIHRoZSBwaXBlbGluZVxuICogaGFzIG5vIHBiLnBpcGVsaW5lLWlkIHRhZyAodW5yZWdpc3RlcmVkKS4gVGhyb3dzIG9uIEFjY2Vzc0RlbmllZCBzbyBhIG1pc3NpbmcgSUFNXG4gKiBncmFudCBzdXJmYWNlcyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseSBkcm9wcGluZyBldmVyeSBldmVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQaXBlbGluZShhcm46IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPFJlc29sdmVkUGlwZWxpbmU+IHtcbiAgY29uc3QgY2FjaGVkID0gcmVzb2x2ZWRCeUFybi5nZXQoYXJuKTtcbiAgLy8gU2VydmUgYSBoaXQgdW50aWwgaXRzIFRUTCAoc2hvcnQgZm9yIGEgbmVnYXRpdmUsIGxvbmdlciBmb3IgYSBwb3NpdGl2ZSksXG4gIC8vIHRoZW4gcmUtcmVzb2x2ZSBzbyB0YWcgY2hhbmdlcyBsYW5kLlxuICBpZiAoY2FjaGVkICYmIERhdGUubm93KCkgLSBjYWNoZWQudHMgPCAoY2FjaGVkLnBpcGVsaW5lSWQgIT09IG51bGwgPyBQT1NfQ0FDSEVfVFRMX01TIDogTkVHX0NBQ0hFX1RUTF9NUykpIHtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiBjYWNoZWQucGlwZWxpbmVJZCwgb3JnSWQ6IGNhY2hlZC5vcmdJZCwgZGVwbG95czogY2FjaGVkLmRlcGxveXMgfTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBpcGVsaW5lQ2xpZW50KHJlZ2lvbik7XG4gICAgY29uc3QgeyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCh7IHJlc291cmNlQXJuOiBhcm4gfSkpO1xuICAgIGNvbnN0IHBpcGVsaW5lSWQgPSBvdXQudGFncz8uZmluZCh0ID0+IHQua2V5ID09PSBQSVBFTElORV9JRF9UQUcpPy52YWx1ZSA/PyBudWxsO1xuICAgIGNvbnN0IG9yZ0lkID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gT1JHX0lEX1RBRyk/LnZhbHVlID8/IG51bGw7XG4gICAgY29uc3QgZGVwbG95cyA9IHBhcnNlRGVwbG95cyhvdXQudGFncz8uZmluZCh0ID0+IHQua2V5ID09PSBERVBMT1lTX1RBRyk/LnZhbHVlKTtcbiAgICBpZiAoIXBpcGVsaW5lSWQpIGxvZy53YXJuKCdQaXBlbGluZSBtaXNzaW5nIHBiLnBpcGVsaW5lLWlkIHRhZyDigJQgc2tpcHBpbmcgKHJlZ2lzdGVyIGl0PyknLCB7IGFybiB9KTtcbiAgICByZXNvbHZlZEJ5QXJuLnNldChhcm4sIHsgcGlwZWxpbmVJZCwgb3JnSWQsIGRlcGxveXMsIHRzOiBEYXRlLm5vdygpIH0pO1xuICAgIHJldHVybiB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgLy8gVHJhbnNpZW50L2luZnJhIGVycm9ycyAodGhyb3R0bGluZywgdGltZW91dHMsIDV4eCkgTVVTVCBwcm9wYWdhdGUgc28gdGhlIFNRU1xuICAgIC8vIGJhdGNoIGlzIHJldHJpZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkgZHJvcHBpbmcgdGhlIGV2ZW50IOKAlCBhbiBldmVudCBkcm9wcGVkXG4gICAgLy8gQkVGT1JFIGl0IHJlYWNoZXMgdGhlIGluZ2VzdCBpcyBsb3N0IHBlcm1hbmVudGx5ICh0aGUgaW5nZXN0J3MgcGFydGlhbC11bmlxdWVcbiAgICAvLyBpbmRleCBvbmx5IGRlZHVwZXMgZXZlbnRzIHRoYXQgd2VyZSBhY3R1YWxseSBQT1NUZWQpLiBPbmx5IHN3YWxsb3cgd2hlbiB0aGVcbiAgICAvLyBmYWlsdXJlIGlzIGEgZGVmaW5pdGl2ZSBhbnN3ZXIgdGhhdCB0aGlzIEFSTiBoYXMgbm8gdXNhYmxlIHRhZy5cbiAgICBjb25zdCBlID0gZXJyIGFzIHsgbmFtZT86IHN0cmluZzsgJHJldHJ5YWJsZT86IHVua25vd247ICRtZXRhZGF0YT86IHsgaHR0cFN0YXR1c0NvZGU/OiBudW1iZXIgfSB9O1xuICAgIGNvbnN0IHN0YXR1cyA9IGUuJG1ldGFkYXRhPy5odHRwU3RhdHVzQ29kZTtcbiAgICBjb25zdCByZXRyeWFibGUgPSBlLiRyZXRyeWFibGUgIT0gbnVsbFxuICAgICAgfHwgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInICYmIHN0YXR1cyA+PSA1MDApXG4gICAgICB8fCAvdGhyb3R0bHx0aW1lb3V0fHRvb21hbnlyZXF1ZXN0c3xzZXJ2aWNldW5hdmFpbGFibGV8ZWNvbm5yZXNldHxuZXR3b3JraW5nZXJyb3IvaS50ZXN0KG5hbWUgPz8gJycpO1xuICAgIGlmIChyZXRyeWFibGUpIHtcbiAgICAgIGxvZy5lcnJvcignVHJhbnNpZW50IGVycm9yIHJlc29sdmluZyBwYi5waXBlbGluZS1pZCB0YWcg4oCUIHdpbGwgcmV0cnkgdGhlIGJhdGNoJywgeyBhcm4sIGVycm9yOiBuYW1lID8/IFN0cmluZyhlcnIpIH0pO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byByZXNvbHZlIHBiLnBpcGVsaW5lLWlkIHRhZycsIHsgYXJuLCBlcnJvcjogbmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkOiBudWxsLCBvcmdJZDogbnVsbCwgZGVwbG95czogbmV3IE1hcCgpIH07XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IGZvcmdldCByZXNvbHZlZCBwaXBlbGluZXMuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0VGFnc0ZvclRlc3RzKCk6IHZvaWQge1xuICByZXNvbHZlZEJ5QXJuLmNsZWFyKCk7XG59XG4iXX0=
|
|
125
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy90YWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBWXZFLElBQUksZUFBK0MsQ0FBQztBQUNwRCxLQUFLLFVBQVUsZ0JBQWdCO0lBQzdCLElBQUksQ0FBQyxlQUFlO1FBQUUsZUFBZSxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsOEJBQThCLENBQUMsQ0FBa0MsQ0FBQztJQUN4SCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsK0NBQStDO0FBQy9DLDBDQUEwQztBQUMxQywyQ0FBMkM7QUFDM0MsNkRBQTZEO0FBQzdELGlFQUFpRTtBQUNqRSxtRkFBbUY7QUFDbkYsa0ZBQWtGO0FBQ2xGLHFGQUFxRjtBQUNyRixFQUFFO0FBQ0Ysa0ZBQWtGO0FBQ2xGLGlGQUFpRjtBQUNqRiwwQ0FBMEM7QUFFMUMsTUFBTSxlQUFlLEdBQUcsZ0JBQWdCLENBQUM7QUFDekMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDO0FBQ2pDLGdGQUFnRjtBQUNoRixpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLDZDQUE2QztBQUM3QyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUM7QUFDM0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7QUFHbEUsMEVBQTBFO0FBQzFFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsK0VBQStFO0FBQy9FLGlFQUFpRTtBQUNqRSxNQUFNLGFBQWEsR0FBRyxJQUFJLFVBQVUsQ0FBd0csaUJBQWlCLENBQUMsQ0FBQztBQUMvSixNQUFNLGdCQUFnQixHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxHQUFHLEVB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QUFjLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxJQUFJO2VBQ2pDLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUM7ZUFDN0MsZ0ZBQWdGLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsR0FBRyxDQUFDLEtBQUssQ0FBQyxxRUFBcUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hJLE1BQU0sR0FBRyxDQUFDO1FBQ1osQ0FBQztRQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsc0NBQXNDLEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLENBQUM7SUFDL0QsQ0FBQztBQUNILENBQUM7QUFFRCxzREFBc0Q7QUFDdEQsTUFBTSxVQUFVLGtCQUFrQjtJQUNoQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBhcm5SZWYsIEJvdW5kZWRNYXAsIENBQ0hFX01BWF9FTlRSSUVTLCBsb2cgfSBmcm9tICcuL3V0aWwuanMnO1xuXG4vLyBBV1MgTGFtYmRhJ3MgTm9kZSBydW50aW1lIHByb3ZpZGVzIEBhd3Mtc2RrIHYzLCBzbyB0aGUgQ29kZVBpcGVsaW5lIGNsaWVudCBpc1xuLy8gbG9hZGVkIGxhemlseSB2aWEgZHluYW1pYyBpbXBvcnQoKSDigJQgYSBzdGF0aWMgd29ya3NwYWNlIGRlcGVuZGVuY3kgd291bGRcbi8vIHBlcnR1cmIgdGhlIHNoYXJlZCBAYXdzLXNkayB2ZXJzaW9uIHRyZWUuIE1pbmltYWwgbG9jYWwgdHlwZXMga2VlcCB0aGUgY2FsbFxuLy8gc2l0ZXMgdHlwZS1jaGVja2VkLlxuaW50ZXJmYWNlIExpc3RUYWdzT3V0cHV0IHsgdGFncz86IEFycmF5PHsga2V5Pzogc3RyaW5nOyB2YWx1ZT86IHN0cmluZyB9PiB9XG5pbnRlcmZhY2UgQ29kZVBpcGVsaW5lQ2xpZW50TGlrZSB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8TGlzdFRhZ3NPdXRwdXQ+IH1cbmludGVyZmFjZSBDb2RlUGlwZWxpbmVNb2R1bGUge1xuICBDb2RlUGlwZWxpbmVDbGllbnQ6IG5ldyAoY29uZmlnOiB7IHJlZ2lvbjogc3RyaW5nIH0pID0+IENvZGVQaXBlbGluZUNsaWVudExpa2U7XG4gIExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kOiBuZXcgKGlucHV0OiB7IHJlc291cmNlQXJuOiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbn1cbmxldCBjb2RlcGlwZWxpbmVNb2Q6IENvZGVQaXBlbGluZU1vZHVsZSB8IHVuZGVmaW5lZDtcbmFzeW5jIGZ1bmN0aW9uIGxvYWRDb2RlUGlwZWxpbmUoKTogUHJvbWlzZTxDb2RlUGlwZWxpbmVNb2R1bGU+IHtcbiAgaWYgKCFjb2RlcGlwZWxpbmVNb2QpIGNvZGVwaXBlbGluZU1vZCA9IChhd2FpdCBpbXBvcnQoJ0Bhd3Mtc2RrL2NsaWVudC1jb2RlcGlwZWxpbmUnKSkgYXMgdW5rbm93biBhcyBDb2RlUGlwZWxpbmVNb2R1bGU7XG4gIHJldHVybiBjb2RlcGlwZWxpbmVNb2Q7XG59XG5cbi8vIFRhZyByZXNvbHV0aW9uOiBwYi5waXBlbGluZS1pZCArIHBiLmRlcGxveXMuXG4vLyBQaXBlbGluZXMgYXJlIHRhZ2dlZCBhdCBDREsgc3ludGggd2l0aDpcbi8vICAgcGIucGlwZWxpbmUtaWQgPSA8cGxhdGZvcm0gcGlwZWxpbmVJZD5cbi8vICAgcGIuZGVwbG95cyAgICAgPSA8c3RhZ2U+OjxlbnY+IHBhaXJzIGpvaW5lZCBieSAnKycsIGUuZy5cbi8vICAgICAgICAgICAgICAgICAgICBcIkRlcGxveS1zdGc6c3RhZ2luZytEZXBsb3ktcHJvZDpwcm9kdWN0aW9uXCJcbi8vIFdlIHJlc29sdmUgdGhvc2UgdGFncyBmcm9tIHRoZSBsaXZlIENvZGVQaXBlbGluZSAocmVnaW9uLWF3YXJlKS4gVGhlIEFSTi9hY2NvdW50XG4vLyBuZXZlciBsZWF2ZSBBV1MsIGFuZCBuZXZlciByZWFjaCBhIGxvZyBsaW5lIGVpdGhlcjogbG9ncyBjYXJyeSBgYXJuUmVmKGFybilgLCBhXG4vLyBzaG9ydCBkaWdlc3QuIENhY2hlZCBwZXIgQVJOICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgcGIucGlwZWxpbmUtaWQgdGFnIGlzXG4vLyB0cmVhdGVkIGFzIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9JRF9UQUcgPSAncGIucGlwZWxpbmUtaWQnO1xuY29uc3QgREVQTE9ZU19UQUcgPSAncGIuZGVwbG95cyc7XG4vLyBDYW5vbmljYWwgcGVyLXBpcGVsaW5lIG9yZyB0YWcgKGFwcGxpZWQgYXQgc3ludGggYnkgcGlwZWxpbmUtY29yZSkuIEl0IGlzIHRoZVxuLy8gUkVTT0xWRUQgb3JnIGZvciBldmVyeSBldmVudCBvZiB0aGlzIHBpcGVsaW5lIOKAlCB1c2VkIHRvIGtleSB0aGUgcGVyLW9yZyBHaXRIdWJcbi8vIHRva2VuIGFuZCB0byBhdHRyaWJ1dGUgaW5nZXN0LWhlYWx0aC4gb3JnSWQgaXMgYSBwbGF0Zm9ybSBpZCwgbmV2ZXIgYW4gQVdTXG4vLyBhY2NvdW50IGlkLCBzbyBpdCBpcyBzYWZlIHRvIHJlYWQvZm9yd2FyZC5cbmNvbnN0IE9SR19JRF9UQUcgPSAnT3JnSWQnO1xuY29uc3QgY2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcDxzdHJpbmcsIENvZGVQaXBlbGluZUNsaWVudExpa2U+KCk7XG5cblxuLy8gYHRzYCBsZXRzIEJPVEggb3V0Y29tZXMgZXhwaXJlOiBhIG5lZ2F0aXZlIChyZXNvbHZlZC1idXQtdW50YWdnZWQpIHNvIGFcbi8vIHBpcGVsaW5lIHRhZ2dlZCBBRlRFUiBpdHMgZmlyc3QgZXZlbnQgYmVjb21lcyByZXNvbHZhYmxlLCBhbmQgYSBwb3NpdGl2ZSBzbyBhXG4vLyByZS1zeW50aCB0aGF0IGNoYW5nZXMgYHBiLmRlcGxveXNgIChhIHN0YWdlIHJlbmFtZWQsIGFuIGVudmlyb25tZW50IGFkZGVkKSBvclxuLy8gYE9yZ0lkYCBpcyBwaWNrZWQgdXAgd2l0aG91dCByZWN5Y2xpbmcgdGhlIHdhcm0gY29udGFpbmVyIOKAlCBhIGxpZmV0aW1lIGNhY2hlXG4vLyB3b3VsZCBrZWVwIGF0dHJpYnV0aW5nIGRlcGxveXMgdG8gc3RhZ2VzIHRoYXQgbm8gbG9uZ2VyIGV4aXN0LlxuY29uc3QgcmVzb2x2ZWRCeUFybiA9IG5ldyBCb3VuZGVkTWFwPHN0cmluZywgeyBwaXBlbGluZUlkOiBzdHJpbmcgfCBudWxsOyBvcmdJZDogc3RyaW5nIHwgbnVsbDsgZGVwbG95czogTWFwPHN0cmluZywgc3RyaW5nPjsgdHM6IG51bWJlciB9PihDQUNIRV9NQVhfRU5UUklFUyk7XG5jb25zdCBORUdfQ0FDSEVfVFRMX01TID0gNSAqIDYwICogMTAwMDtcbmNvbnN0IFBPU19DQUNIRV9UVExfTVMgPSAxNSAqIDYwICogMTAwMDtcblxuLyoqIFJlc29sdmVkIHBpcGVsaW5lIG1ldGFkYXRhIHJlYWQgZnJvbSB0aGUgQ29kZVBpcGVsaW5lIHJlc291cmNlIHRhZ3MuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVkUGlwZWxpbmUge1xuICAvKiogUGxhdGZvcm0gcGlwZWxpbmVJZCAocGIucGlwZWxpbmUtaWQgdGFnKTsgbnVsbCB3aGVuIHVudGFnZ2VkL3VucmVnaXN0ZXJlZC4gKi9cbiAgcGlwZWxpbmVJZDogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFBsYXRmb3JtIG9yZ0lkIChPcmdJZCB0YWcpOyBudWxsIHdoZW4gdGhlIHBpcGVsaW5lIGNhcnJpZXMgbm8gb3JnIHRhZy4gKi9cbiAgb3JnSWQ6IHN0cmluZyB8IG51bGw7XG4gIC8qKiBNYXAgb2YgZGVwbG95LXN0YWdlIG5hbWUg4oaSIGVudmlyb25tZW50IChwYXJzZWQgZnJvbSBwYi5kZXBsb3lzKS4gRW1wdHkgd2hlbiBub25lLiAqL1xuICBkZXBsb3lzOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xufVxuXG4vKiogQ2FwIG9uIGNvbW1pdC9yZWYvZW52aXJvbm1lbnQgZmllbGRzIOKAlCB0aGUgaW5nZXN0IGNvbnRyYWN0IGFsbG93cyBtYXggMjU1LiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9BVFRSID0gMjU1O1xuXG4vKipcbiAqIFBhcnNlIHRoZSBgcGIuZGVwbG95c2AgdGFnIHZhbHVlIGludG8gYSBzdGFnZeKGkmVudmlyb25tZW50IG1hcC4gVGhlIHZhbHVlIGlzXG4gKiBgPHN0YWdlPjo8ZW52PmAgcGFpcnMgam9pbmVkIGJ5IGArYCAoQ29kZVBpcGVsaW5lLXRhZy1zYWZlOyBubyBKU09OKS4gQSBzdGFnZVxuICogcHJlc2VudCBoZXJlIGlzIGEgZGVwbG95OyBpdHMgbWFwcGVkIGVudmlyb25tZW50IGlzIHdoYXQgdGhlIGZvcndhcmRlciBzdGFtcHMgb25cbiAqIHRoYXQgc3RhZ2UncyBTVEFHRS9BQ1RJT04gZXZlbnRzIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuIE1hbGZvcm1lZCBwYWlycyBhcmVcbiAqIHNraXBwZWQgZGVmZW5zaXZlbHkuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRGVwbG95cyh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IG1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGlmICghdmFsdWUpIHJldHVybiBtYXA7XG4gIGZvciAoY29uc3QgcGFpciBvZiB2YWx1ZS5zcGxpdCgnKycpKSB7XG4gICAgY29uc3QgaWR4ID0gcGFpci5pbmRleE9mKCc6Jyk7XG4gICAgaWYgKGlkeCA8PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBzdGFnZSA9IHBhaXIuc2xpY2UoMCwgaWR4KS50cmltKCk7XG4gICAgY29uc3QgZW52ID0gcGFpci5zbGljZShpZHggKyAxKS50cmltKCk7XG4gICAgaWYgKHN0YWdlICYmIGVudikgbWFwLnNldChzdGFnZSwgZW52LnNsaWNlKDAsIE1BWF9BVFRSKSk7XG4gIH1cbiAgcmV0dXJuIG1hcDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcGlwZWxpbmVDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPENvZGVQaXBlbGluZUNsaWVudExpa2U+IHtcbiAgbGV0IGNsaWVudCA9IGNsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjb25zdCB7IENvZGVQaXBlbGluZUNsaWVudCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNsaWVudCA9IG5ldyBDb2RlUGlwZWxpbmVDbGllbnQoeyByZWdpb24gfSk7XG4gICAgY2xpZW50c0J5UmVnaW9uLnNldChyZWdpb24sIGNsaWVudCk7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgQ29kZVBpcGVsaW5lJ3MgdGFncyDihpIgdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQgKHBiLnBpcGVsaW5lLWlkKSBwbHVzIHRoZVxuICogZGVwbG95LXN0YWdl4oaSZW52aXJvbm1lbnQgbWFwIChwYi5kZXBsb3lzKS4gYHBpcGVsaW5lSWRgIGlzIG51bGwgd2hlbiB0aGUgcGlwZWxpbmVcbiAqIGhhcyBubyBwYi5waXBlbGluZS1pZCB0YWcgKHVucmVnaXN0ZXJlZCkuIFRocm93cyBvbiBBY2Nlc3NEZW5pZWQgc28gYSBtaXNzaW5nIElBTVxuICogZ3JhbnQgc3VyZmFjZXMgbG91ZGx5IGluc3RlYWQgb2Ygc2lsZW50bHkgZHJvcHBpbmcgZXZlcnkgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlUGlwZWxpbmUoYXJuOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxSZXNvbHZlZFBpcGVsaW5lPiB7XG4gIGNvbnN0IGNhY2hlZCA9IHJlc29sdmVkQnlBcm4uZ2V0KGFybik7XG4gIC8vIFNlcnZlIGEgaGl0IHVudGlsIGl0cyBUVEwgKHNob3J0IGZvciBhIG5lZ2F0aXZlLCBsb25nZXIgZm9yIGEgcG9zaXRpdmUpLFxuICAvLyB0aGVuIHJlLXJlc29sdmUgc28gdGFnIGNoYW5nZXMgbGFuZC5cbiAgaWYgKGNhY2hlZCAmJiBEYXRlLm5vdygpIC0gY2FjaGVkLnRzIDwgKGNhY2hlZC5waXBlbGluZUlkICE9PSBudWxsID8gUE9TX0NBQ0hFX1RUTF9NUyA6IE5FR19DQUNIRV9UVExfTVMpKSB7XG4gICAgcmV0dXJuIHsgcGlwZWxpbmVJZDogY2FjaGVkLnBpcGVsaW5lSWQsIG9yZ0lkOiBjYWNoZWQub3JnSWQsIGRlcGxveXM6IGNhY2hlZC5kZXBsb3lzIH07XG4gIH1cbiAgdHJ5IHtcbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCBwaXBlbGluZUNsaWVudChyZWdpb24pO1xuICAgIGNvbnN0IHsgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQgfSA9IGF3YWl0IGxvYWRDb2RlUGlwZWxpbmUoKTtcbiAgICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQoeyByZXNvdXJjZUFybjogYXJuIH0pKTtcbiAgICBjb25zdCBwaXBlbGluZUlkID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gUElQRUxJTkVfSURfVEFHKT8udmFsdWUgPz8gbnVsbDtcbiAgICBjb25zdCBvcmdJZCA9IG91dC50YWdzPy5maW5kKHQgPT4gdC5rZXkgPT09IE9SR19JRF9UQUcpPy52YWx1ZSA/PyBudWxsO1xuICAgIGNvbnN0IGRlcGxveXMgPSBwYXJzZURlcGxveXMob3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gREVQTE9ZU19UQUcpPy52YWx1ZSk7XG4gICAgaWYgKCFwaXBlbGluZUlkKSBsb2cud2FybignUGlwZWxpbmUgbWlzc2luZyBwYi5waXBlbGluZS1pZCB0YWcg4oCUIHNraXBwaW5nIChyZWdpc3RlciBpdD8pJywgeyBwaXBlbGluZTogYXJuUmVmKGFybikgfSk7XG4gICAgcmVzb2x2ZWRCeUFybi5zZXQoYXJuLCB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzLCB0czogRGF0ZS5ub3coKSB9KTtcbiAgICByZXR1cm4geyBwaXBlbGluZUlkLCBvcmdJZCwgZGVwbG95cyB9O1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zdCBuYW1lID0gKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWU7XG4gICAgaWYgKG5hbWUgPT09ICdBY2Nlc3NEZW5pZWRFeGNlcHRpb24nKSB7XG4gICAgICAvLyBEb24ndCBjYWNoZSDigJQgdGhpcyBpcyBhIGZpeGFibGUgbWlzY29uZmlnLCBub3QgYSBwcm9wZXJ0eSBvZiB0aGUgcGlwZWxpbmUuXG4gICAgICBsb2cuZXJyb3IoJ0FjY2Vzc0RlbmllZCBjYWxsaW5nIGNvZGVwaXBlbGluZTpMaXN0VGFnc0ZvclJlc291cmNlIOKAlCBncmFudCBpdCB0byB0aGUgTGFtYmRhIHJvbGUnLCB7IHBpcGVsaW5lOiBhcm5SZWYoYXJuKSwgZXJyb3I6IG5hbWUgfSk7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIC8vIFRyYW5zaWVudC9pbmZyYSBlcnJvcnMgKHRocm90dGxpbmcsIHRpbWVvdXRzLCA1eHgpIE1VU1QgcHJvcGFnYXRlIHNvIHRoZSBTUVNcbiAgICAvLyBiYXRjaCBpcyByZXRyaWVkIHJhdGhlciB0aGFuIHNpbGVudGx5IGRyb3BwaW5nIHRoZSBldmVudCDigJQgYW4gZXZlbnQgZHJvcHBlZFxuICAgIC8vIEJFRk9SRSBpdCByZWFjaGVzIHRoZSBpbmdlc3QgaXMgbG9zdCBwZXJtYW5lbnRseSAodGhlIGluZ2VzdCdzIHBhcnRpYWwtdW5pcXVlXG4gICAgLy8gaW5kZXggb25seSBkZWR1cGVzIGV2ZW50cyB0aGF0IHdlcmUgYWN0dWFsbHkgUE9TVGVkKS4gT25seSBzd2FsbG93IHdoZW4gdGhlXG4gICAgLy8gZmFpbHVyZSBpcyBhIGRlZmluaXRpdmUgYW5zd2VyIHRoYXQgdGhpcyBBUk4gaGFzIG5vIHVzYWJsZSB0YWcuXG4gICAgY29uc3QgZSA9IGVyciBhcyB7IG5hbWU/OiBzdHJpbmc7ICRyZXRyeWFibGU/OiB1bmtub3duOyAkbWV0YWRhdGE/OiB7IGh0dHBTdGF0dXNDb2RlPzogbnVtYmVyIH0gfTtcbiAgICBjb25zdCBzdGF0dXMgPSBlLiRtZXRhZGF0YT8uaHR0cFN0YXR1c0NvZGU7XG4gICAgY29uc3QgcmV0cnlhYmxlID0gZS4kcmV0cnlhYmxlICE9IG51bGxcbiAgICAgIHx8ICh0eXBlb2Ygc3RhdHVzID09PSAnbnVtYmVyJyAmJiBzdGF0dXMgPj0gNTAwKVxuICAgICAgfHwgL3Rocm90dGx8dGltZW91dHx0b29tYW55cmVxdWVzdHN8c2VydmljZXVuYXZhaWxhYmxlfGVjb25ucmVzZXR8bmV0d29ya2luZ2Vycm9yL2kudGVzdChuYW1lID8/ICcnKTtcbiAgICBpZiAocmV0cnlhYmxlKSB7XG4gICAgICBsb2cuZXJyb3IoJ1RyYW5zaWVudCBlcnJvciByZXNvbHZpbmcgcGIucGlwZWxpbmUtaWQgdGFnIOKAlCB3aWxsIHJldHJ5IHRoZSBiYXRjaCcsIHsgcGlwZWxpbmU6IGFyblJlZihhcm4pLCBlcnJvcjogbmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBwYi5waXBlbGluZS1pZCB0YWcnLCB7IHBpcGVsaW5lOiBhcm5SZWYoYXJuKSwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIHsgcGlwZWxpbmVJZDogbnVsbCwgb3JnSWQ6IG51bGwsIGRlcGxveXM6IG5ldyBNYXAoKSB9O1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgVGVzdC1vbmx5OiBmb3JnZXQgcmVzb2x2ZWQgcGlwZWxpbmVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFRhZ3NGb3JUZXN0cygpOiB2b2lkIHtcbiAgcmVzb2x2ZWRCeUFybi5jbGVhcigpO1xufVxuIl19
|
package/lib/util.d.ts
CHANGED
|
@@ -16,6 +16,13 @@ export declare class BoundedMap<K, V> extends Map<K, V> {
|
|
|
16
16
|
constructor(max: number);
|
|
17
17
|
set(key: K, value: V): this;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* A log-safe stand-in for an ARN: `arn#<12 hex of sha256>`. Every ARN embeds the
|
|
21
|
+
* AWS account id, which must never reach CloudWatch — but a stable digest still
|
|
22
|
+
* lets an operator correlate log lines for the same resource (and match it by
|
|
23
|
+
* hashing an ARN they already hold).
|
|
24
|
+
*/
|
|
25
|
+
export declare function arnRef(arn: string): string;
|
|
19
26
|
/** Upper bound for every per-key cache below. */
|
|
20
27
|
export declare const CACHE_MAX_ENTRIES = 5000;
|
|
21
28
|
export declare function loadSdk<T>(pkg: string): Promise<T>;
|
package/lib/util.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
3
4
|
/** Shared plumbing for the event-ingestion Lambda modules. */
|
|
4
5
|
export const log = {
|
|
5
6
|
info: (msg, data) => console.log(JSON.stringify({ level: 'INFO', message: msg, data, ts: new Date().toISOString() })),
|
|
@@ -31,6 +32,15 @@ export class BoundedMap extends Map {
|
|
|
31
32
|
return super.set(key, value);
|
|
32
33
|
}
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* A log-safe stand-in for an ARN: `arn#<12 hex of sha256>`. Every ARN embeds the
|
|
37
|
+
* AWS account id, which must never reach CloudWatch — but a stable digest still
|
|
38
|
+
* lets an operator correlate log lines for the same resource (and match it by
|
|
39
|
+
* hashing an ARN they already hold).
|
|
40
|
+
*/
|
|
41
|
+
export function arnRef(arn) {
|
|
42
|
+
return `arn#${createHash('sha256').update(arn).digest('hex').slice(0, 12)}`;
|
|
43
|
+
}
|
|
34
44
|
/** Upper bound for every per-key cache below. */
|
|
35
45
|
export const CACHE_MAX_ENTRIES = 5000;
|
|
36
46
|
// Variable-specifier loader for SDK clients that are NOT devDependencies of this
|
|
@@ -63,4 +73,4 @@ export const FETCH_TIMEOUT_MS = Number(process.env.REPORTING_FETCH_TIMEOUT_MS ??
|
|
|
63
73
|
export function fetchWithTimeout(url, init = {}, timeoutMs = FETCH_TIMEOUT_MS) {
|
|
64
74
|
return fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
|
|
65
75
|
}
|
|
66
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV6Qyw4REFBOEQ7QUFFOUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHO0lBQ2pCLElBQUksRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZJLElBQUksRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZJLEtBQUssRUFBRSxDQUFDLEdBQVcsRUFBRSxJQUFjLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQzVJLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sVUFBaUIsU0FBUSxHQUFTO0lBQ2hCLEdBQUc7SUFBaEMsWUFBNkIsR0FBVztRQUFJLEtBQUssRUFBRSxDQUFDO21CQUF2QixHQUFHO0lBQXFCLENBQUM7SUFDN0MsR0FBRyxDQUFDLEdBQU0sRUFBRSxLQUFRO1FBQzNCLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25CLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7UUFDdkMsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN4QyxJQUFJLE1BQU0sS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEdBQVc7SUFDaEMsT0FBTyxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztBQUM5RSxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUV0QyxpRkFBaUY7QUFDakYsaUZBQWlGO0FBQ2pGLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLEtBQUssVUFBVSxPQUFPLENBQUksR0FBVztJQUMxQyxPQUFPLENBQUMsTUFBTSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQU0sQ0FBQztBQUNsQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQztBQUUvRjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEdBQVcsRUFBRSxJQUFJLEdBQWdCLEVBQUUsRUFBRSxTQUFTLEdBQUcsZ0JBQWdCO0lBQ2hHLE9BQU8sS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdub2RlOmNyeXB0byc7XG5cbi8qKiBTaGFyZWQgcGx1bWJpbmcgZm9yIHRoZSBldmVudC1pbmdlc3Rpb24gTGFtYmRhIG1vZHVsZXMuICovXG5cbmV4cG9ydCBjb25zdCBsb2cgPSB7XG4gIGluZm86IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdJTkZPJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbiAgd2FybjogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ1dBUk4nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICBlcnJvcjogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5lcnJvcihKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnRVJST1InLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxufTtcblxuLyoqXG4gKiBBIE1hcCB0aGF0IGhvbGRzIGF0IG1vc3QgYG1heGAgZW50cmllcywgZXZpY3RpbmcgdGhlIGxlYXN0IHJlY2VudGx5IFNFVCBvbmUuXG4gKiBFdmVyeSBwZXIta2V5IGNhY2hlIGluIHRoaXMgbW9kdWxlIGlzIGtleWVkIGJ5IHNvbWV0aGluZyB1bmJvdW5kZWQgKHBpcGVsaW5lXG4gKiBBUk4sIHBpcGVsaW5lIMOXIGNvbW1pdCwgb3JnKSwgYW5kIGEgZmxlZXQgZm9yd2FyZGVyJ3Mgd2FybSBjb250YWluZXIgY2FuIGxpdmVcbiAqIGZvciBob3VycyBhY3Jvc3MgdGhvdXNhbmRzIG9mIHBpcGVsaW5lcyDigJQgYW4gdW5ib3VuZGVkIE1hcCBpcyBhIHNsb3cgbGVhayB0aGF0XG4gKiBlbmRzIGluIGFuIE9PTS1raWxsZWQgTGFtYmRhIGFuZCBhIHJlZGVsaXZlcmVkIGJhdGNoLlxuICovXG5leHBvcnQgY2xhc3MgQm91bmRlZE1hcDxLLCBWPiBleHRlbmRzIE1hcDxLLCBWPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWF4OiBudW1iZXIpIHsgc3VwZXIoKTsgfVxuICBvdmVycmlkZSBzZXQoa2V5OiBLLCB2YWx1ZTogVik6IHRoaXMge1xuICAgIGlmIChzdXBlci5oYXMoa2V5KSkge1xuICAgICAgc3VwZXIuZGVsZXRlKGtleSk7IC8vIHJlZnJlc2ggcmVjZW5jeVxuICAgIH0gZWxzZSBpZiAodGhpcy5zaXplID49IHRoaXMubWF4KSB7XG4gICAgICBjb25zdCBvbGRlc3QgPSB0aGlzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIHN1cGVyLmRlbGV0ZShvbGRlc3QpO1xuICAgIH1cbiAgICByZXR1cm4gc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICB9XG59XG5cbi8qKlxuICogQSBsb2ctc2FmZSBzdGFuZC1pbiBmb3IgYW4gQVJOOiBgYXJuIzwxMiBoZXggb2Ygc2hhMjU2PmAuIEV2ZXJ5IEFSTiBlbWJlZHMgdGhlXG4gKiBBV1MgYWNjb3VudCBpZCwgd2hpY2ggbXVzdCBuZXZlciByZWFjaCBDbG91ZFdhdGNoIOKAlCBidXQgYSBzdGFibGUgZGlnZXN0IHN0aWxsXG4gKiBsZXRzIGFuIG9wZXJhdG9yIGNvcnJlbGF0ZSBsb2cgbGluZXMgZm9yIHRoZSBzYW1lIHJlc291cmNlIChhbmQgbWF0Y2ggaXQgYnlcbiAqIGhhc2hpbmcgYW4gQVJOIHRoZXkgYWxyZWFkeSBob2xkKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyblJlZihhcm46IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgYXJuIyR7Y3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGFybikuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxMil9YDtcbn1cblxuLyoqIFVwcGVyIGJvdW5kIGZvciBldmVyeSBwZXIta2V5IGNhY2hlIGJlbG93LiAqL1xuZXhwb3J0IGNvbnN0IENBQ0hFX01BWF9FTlRSSUVTID0gNTAwMDtcblxuLy8gVmFyaWFibGUtc3BlY2lmaWVyIGxvYWRlciBmb3IgU0RLIGNsaWVudHMgdGhhdCBhcmUgTk9UIGRldkRlcGVuZGVuY2llcyBvZiB0aGlzXG4vLyBwYWNrYWdlIChgQGF3cy1zZGsvY2xpZW50LWNvZGVjb21taXRgLCBgQGF3cy1zZGsvY2xpZW50LXNxc2Ag4oCUIHByZXNlbnQgb25seSBpblxuLy8gdGhlIExhbWJkYSBydW50aW1lIC8gamVzdCBtb2NrcykuIEEgYHN0cmluZ2Agc3BlY2lmaWVyIGtlZXBzIGB0c2NgIGZyb21cbi8vIHJlc29sdmluZyB0aGVtIGF0IGJ1aWxkIHRpbWUsIGFuZCB0aGUgYnVuZGxlIGxlYXZlcyBgQGF3cy1zZGsvKmAgZXh0ZXJuYWwuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFNkazxUPihwa2c6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICByZXR1cm4gKGF3YWl0IGltcG9ydChwa2cpKSBhcyBUO1xufVxuXG4vKipcbiAqIEhvdyBsb25nIG9uZSBvdXRib3VuZCBjYWxsIHRvIHRoZSByZXBvcnRpbmcgc2VydmljZSBtYXkgdGFrZS5cbiAqXG4gKiBBIExhbWJkYSBoYXMgbm8gc3VwZXJ2aXNvciB0byBub3RpY2UgaXQgaXMgc3R1Y2s6IGFuIHVudGltZWQgYGZldGNoYCBhZ2FpbnN0IGEgd2VkZ2VkXG4gKiByZXBvcnRpbmcgc2VydmljZSBob2xkcyB0aGUgaW52b2NhdGlvbiB1bnRpbCB0aGUgRlVOQ1RJT04ncyBvd24gdGltZW91dCwgd2hpY2ggYnVybnNcbiAqIHRoZSB3aG9sZSBidWRnZXQsIHJldHVybnMgbm8gYmF0Y2ggcmVzcG9uc2UsIGFuZCBsZXRzIFNRUyByZWRlbGl2ZXIgdGhlIHNhbWUgcmVjb3Jkc1xuICogdG8gdGhlIHNhbWUgd2VkZ2VkIGVuZHBvaW50LiBBIGJvdW5kZWQgY2FsbCBmYWlscyBmYXN0LCByZXBvcnRzIHRoZSBiYXRjaCBhcyBmYWlsZWQsXG4gKiBhbmQgbGV0cyB0aGUgcmV0cnkgaGFwcGVuIG9uIFNRUydzIHNjaGVkdWxlIHJhdGhlciB0aGFuIGJ5IGV4aGF1c3RpbmcgdGhlIGNsb2NrLlxuICpcbiAqIERlZmF1bHQgNXMsIHdlbGwgaW5zaWRlIGEgdHlwaWNhbCAzMHMgZnVuY3Rpb24gdGltZW91dCBldmVuIHdpdGggb25lIGF1dGggcmV0cnkuXG4gKi9cbmV4cG9ydCBjb25zdCBGRVRDSF9USU1FT1VUX01TID0gTnVtYmVyKHByb2Nlc3MuZW52LlJFUE9SVElOR19GRVRDSF9USU1FT1VUX01TID8/IDUwMDApIHx8IDUwMDA7XG5cbi8qKlxuICogYGZldGNoYCB3aXRoIGEgZGVhZGxpbmUuXG4gKlxuICogYEFib3J0U2lnbmFsLnRpbWVvdXRgIHJhdGhlciB0aGFuIGEgaGFuZC1yb2xsZWQgY29udHJvbGxlcjogaXQgaXMgb25lIGNhbGwsIGl0IGNhbm5vdFxuICogbGVhayB0aGUgdGltZXIsIGFuZCBpdCByZWplY3RzIHdpdGggYSBgVGltZW91dEVycm9yYCB0aGUgY2FsbGVycyBhbHJlYWR5IHRyZWF0IGFzIGFcbiAqIGZhaWxlZCBQT1NULiBFdmVyeSBvdXRib3VuZCBjYWxsIGluIHRoaXMgcGFja2FnZSBnb2VzIHRocm91Z2ggaGVyZSBzbyBhIG5ldyBvbmUgY2Fubm90XG4gKiBiZSBhZGRlZCB3aXRob3V0IGEgZGVhZGxpbmUgYnkgc2ltcGx5IGZvcmdldHRpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmZXRjaFdpdGhUaW1lb3V0KHVybDogc3RyaW5nLCBpbml0OiBSZXF1ZXN0SW5pdCA9IHt9LCB0aW1lb3V0TXMgPSBGRVRDSF9USU1FT1VUX01TKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICByZXR1cm4gZmV0Y2godXJsLCB7IC4uLmluaXQsIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCh0aW1lb3V0TXMpIH0pO1xufVxuIl19
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"@aws-sdk/client-codepipeline": "3.1160.0",
|
|
10
10
|
"@aws-sdk/client-secrets-manager": "3.1160.0",
|
|
11
11
|
"@jest/globals": "30.5.2",
|
|
12
|
-
"@pipeline-builder/pipeline-core": "4.4.
|
|
12
|
+
"@pipeline-builder/pipeline-core": "4.4.4",
|
|
13
13
|
"@stylistic/eslint-plugin": "^2",
|
|
14
14
|
"@types/aws-lambda": "8.10.164",
|
|
15
15
|
"@types/node": "^26",
|
|
@@ -80,9 +80,10 @@
|
|
|
80
80
|
"homepage": "https://mwashburn160.github.io/pipeline-builder/",
|
|
81
81
|
"publishConfig": {
|
|
82
82
|
"access": "public",
|
|
83
|
-
"registry": "https://registry.npmjs.org/"
|
|
83
|
+
"registry": "https://registry.npmjs.org/",
|
|
84
|
+
"provenance": true
|
|
84
85
|
},
|
|
85
|
-
"version": "4.3.
|
|
86
|
+
"version": "4.3.4",
|
|
86
87
|
"bugs": {
|
|
87
88
|
"url": "https://github.com/mwashburn160/pipeline-builder/issues"
|
|
88
89
|
},
|