@pipeline-builder/api-core 5.2.2 → 5.2.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/constants/ai-providers.d.ts +3 -22
- package/lib/constants/ai-providers.js +6 -56
- package/lib/errors/app-errors.d.ts +14 -0
- package/lib/errors/app-errors.js +21 -1
- package/lib/helpers/index.d.ts +1 -0
- package/lib/helpers/index.js +2 -1
- package/lib/helpers/sse-helpers.d.ts +33 -3
- package/lib/helpers/sse-helpers.js +91 -19
- package/lib/helpers/support-calendar.d.ts +69 -0
- package/lib/helpers/support-calendar.js +179 -0
- package/lib/middleware/auth.js +6 -3
- package/lib/middleware/deferred-quota-check.d.ts +5 -0
- package/lib/middleware/deferred-quota-check.js +33 -0
- package/lib/middleware/ecosystem-guard.d.ts +3 -3
- package/lib/middleware/ecosystem-guard.js +5 -5
- package/lib/middleware/index.d.ts +5 -2
- package/lib/middleware/index.js +6 -3
- package/lib/middleware/on-behalf.d.ts +37 -0
- package/lib/middleware/on-behalf.js +143 -0
- package/lib/middleware/permission-gates.d.ts +11 -0
- package/lib/middleware/permission-gates.js +7 -1
- package/lib/middleware/quota-exempt-routes.d.ts +36 -0
- package/lib/middleware/quota-exempt-routes.js +47 -0
- package/lib/middleware/route-table.d.ts +104 -0
- package/lib/middleware/route-table.js +72 -2
- package/lib/middleware/service-tokens.d.ts +8 -0
- package/lib/middleware/service-tokens.js +5 -3
- package/lib/middleware/step-up.js +11 -1
- package/lib/services/ai-call-weight.d.ts +24 -0
- package/lib/services/ai-call-weight.js +77 -0
- package/lib/services/alert-delivery.d.ts +99 -0
- package/lib/services/alert-delivery.js +132 -0
- package/lib/services/audit-context.d.ts +105 -0
- package/lib/services/audit-context.js +134 -0
- package/lib/services/index.d.ts +10 -2
- package/lib/services/index.js +10 -2
- package/lib/services/org-ai-client.d.ts +61 -0
- package/lib/services/org-ai-client.js +112 -0
- package/lib/services/pagerduty-inbound.d.ts +101 -0
- package/lib/services/pagerduty-inbound.js +195 -0
- package/lib/services/pagerduty.d.ts +109 -0
- package/lib/services/pagerduty.js +186 -0
- package/lib/services/quota-increment-batcher.d.ts +81 -0
- package/lib/services/quota-increment-batcher.js +166 -0
- package/lib/services/quota.d.ts +158 -14
- package/lib/services/quota.js +252 -22
- package/lib/services/remote-audit-client.d.ts +44 -1
- package/lib/services/remote-audit-client.js +106 -20
- package/lib/services/version-vuln-policy.d.ts +174 -0
- package/lib/services/version-vuln-policy.js +242 -0
- package/lib/types/ai-catalog.d.ts +63 -0
- package/lib/types/ai-catalog.js +82 -0
- package/lib/types/ask-proposals.js +6 -6
- package/lib/types/build-catalog.d.ts +154 -0
- package/lib/types/build-catalog.js +158 -0
- package/lib/types/common.d.ts +37 -3
- package/lib/types/common.js +20 -2
- package/lib/types/ecosystem-notifications.d.ts +5 -5
- package/lib/types/ecosystem-notifications.js +9 -3
- package/lib/types/error-codes.d.ts +13 -6
- package/lib/types/error-codes.js +18 -8
- package/lib/types/feature-flags.d.ts +71 -1
- package/lib/types/feature-flags.js +131 -11
- package/lib/types/index.d.ts +6 -4
- package/lib/types/index.js +12 -5
- package/lib/types/metadata-keys.d.ts +6 -0
- package/lib/types/metadata-keys.js +4 -1
- package/lib/types/permissions.d.ts +351 -3
- package/lib/types/permissions.js +610 -21
- package/lib/types/pipeline.d.ts +39 -0
- package/lib/types/pipeline.js +57 -1
- package/lib/types/plugin-health.d.ts +0 -2
- package/lib/types/plugin-health.js +1 -11
- package/lib/types/plugin-scan.d.ts +192 -42
- package/lib/types/plugin-scan.js +159 -43
- package/lib/types/quota-catalog.d.ts +247 -0
- package/lib/types/quota-catalog.js +122 -0
- package/lib/types/quota-tiers.d.ts +150 -0
- package/lib/types/quota-tiers.js +167 -2
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +217 -4
- package/lib/types/wire-vocabulary.js +8 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/response.d.ts +35 -2
- package/lib/utils/response.js +42 -3
- package/lib/validation/ai-schemas.d.ts +27 -0
- package/lib/validation/ai-schemas.js +31 -5
- package/lib/validation/plugin-schemas.d.ts +15 -0
- package/lib/validation/plugin-schemas.js +28 -1
- package/package.json +31 -2
package/lib/types/pipeline.d.ts
CHANGED
|
@@ -22,6 +22,45 @@ export declare const ComputeType: {
|
|
|
22
22
|
readonly X2_LARGE: 'X2_LARGE';
|
|
23
23
|
};
|
|
24
24
|
export type ComputeType = ValueOf<typeof ComputeType>;
|
|
25
|
+
/**
|
|
26
|
+
* vCPU each CodeBuild compute size provides, for turning a build's DURATION
|
|
27
|
+
* into `cpuCredits` (one credit = one vCPU-minute).
|
|
28
|
+
*
|
|
29
|
+
* Derived from the same AWS table the `ComputeType` doc above cites, and kept
|
|
30
|
+
* beside it on purpose: the memory/vCPU figures in that comment and the numbers
|
|
31
|
+
* here are the same fact, and splitting them is how one gets updated alone.
|
|
32
|
+
*
|
|
33
|
+
* `X2_LARGE` is 72 vCPU — thirty-six times SMALL. That ratio is why pipeline
|
|
34
|
+
* execution cannot be charged by wall-clock alone, and why ingesting it
|
|
35
|
+
* (Phase 4) re-derives the tier ladder rather than simply adding to it.
|
|
36
|
+
*/
|
|
37
|
+
export declare const CODEBUILD_COMPUTE_VCPU: Readonly<Record<ComputeType, number>>;
|
|
38
|
+
/**
|
|
39
|
+
* AWS's own spelling of a compute size, as `BatchGetBuilds` returns it
|
|
40
|
+
* (`environment.computeType`), narrowed to ours.
|
|
41
|
+
*
|
|
42
|
+
* Needed because the two vocabularies differ: the pipeline config stores
|
|
43
|
+
* `MEDIUM`, AWS answers `BUILD_GENERAL1_MEDIUM`, and a wrong match here would
|
|
44
|
+
* price a build at the wrong vCPU rather than failing visibly. Anything
|
|
45
|
+
* unrecognised returns `null` — an unknown size must be reported as unknown, not
|
|
46
|
+
* silently priced as SMALL, which is the cheapest and therefore the most
|
|
47
|
+
* flattering guess.
|
|
48
|
+
*/
|
|
49
|
+
export declare function normalizeComputeType(raw: string | undefined | null): ComputeType | null;
|
|
50
|
+
/**
|
|
51
|
+
* Credits one CodeBuild action consumed, from its duration and compute size.
|
|
52
|
+
*
|
|
53
|
+
* Rounds UP to the whole credit, matching the plugin-build meter
|
|
54
|
+
* (`creditsForBuild`) — two meters feeding one counter must round the same way
|
|
55
|
+
* or the counter means neither.
|
|
56
|
+
*
|
|
57
|
+
* Returns `null` rather than 0 when either input is missing, and the distinction
|
|
58
|
+
* is the point: a build with no measured duration was not observed, and
|
|
59
|
+
* reporting that as zero consumption would make the coverage gap look like
|
|
60
|
+
* idleness. The ingest counts those separately (`measured="false"`) so the
|
|
61
|
+
* coverage ratio is visible BEFORE anyone prices a tier off this series.
|
|
62
|
+
*/
|
|
63
|
+
export declare function computeCreditsFor(durationMs: number | null | undefined, computeType: ComputeType | null): number | null;
|
|
25
64
|
/**
|
|
26
65
|
* Types of pipeline steps that can be created by plugins
|
|
27
66
|
*
|
package/lib/types/pipeline.js
CHANGED
|
@@ -16,6 +16,62 @@ export const ComputeType = {
|
|
|
16
16
|
LARGE: 'LARGE',
|
|
17
17
|
X2_LARGE: 'X2_LARGE',
|
|
18
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* vCPU each CodeBuild compute size provides, for turning a build's DURATION
|
|
21
|
+
* into `cpuCredits` (one credit = one vCPU-minute).
|
|
22
|
+
*
|
|
23
|
+
* Derived from the same AWS table the `ComputeType` doc above cites, and kept
|
|
24
|
+
* beside it on purpose: the memory/vCPU figures in that comment and the numbers
|
|
25
|
+
* here are the same fact, and splitting them is how one gets updated alone.
|
|
26
|
+
*
|
|
27
|
+
* `X2_LARGE` is 72 vCPU — thirty-six times SMALL. That ratio is why pipeline
|
|
28
|
+
* execution cannot be charged by wall-clock alone, and why ingesting it
|
|
29
|
+
* (Phase 4) re-derives the tier ladder rather than simply adding to it.
|
|
30
|
+
*/
|
|
31
|
+
export const CODEBUILD_COMPUTE_VCPU = {
|
|
32
|
+
SMALL: 2,
|
|
33
|
+
MEDIUM: 4,
|
|
34
|
+
LARGE: 8,
|
|
35
|
+
X2_LARGE: 72,
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* AWS's own spelling of a compute size, as `BatchGetBuilds` returns it
|
|
39
|
+
* (`environment.computeType`), narrowed to ours.
|
|
40
|
+
*
|
|
41
|
+
* Needed because the two vocabularies differ: the pipeline config stores
|
|
42
|
+
* `MEDIUM`, AWS answers `BUILD_GENERAL1_MEDIUM`, and a wrong match here would
|
|
43
|
+
* price a build at the wrong vCPU rather than failing visibly. Anything
|
|
44
|
+
* unrecognised returns `null` — an unknown size must be reported as unknown, not
|
|
45
|
+
* silently priced as SMALL, which is the cheapest and therefore the most
|
|
46
|
+
* flattering guess.
|
|
47
|
+
*/
|
|
48
|
+
export function normalizeComputeType(raw) {
|
|
49
|
+
if (!raw)
|
|
50
|
+
return null;
|
|
51
|
+
const upper = raw.toUpperCase();
|
|
52
|
+
const bare = upper.startsWith('BUILD_GENERAL1_') ? upper.slice('BUILD_GENERAL1_'.length) : upper;
|
|
53
|
+
// AWS spells the largest one `2XLARGE`; ours is `X2_LARGE`.
|
|
54
|
+
const key = bare === '2XLARGE' || bare === 'X2LARGE' ? 'X2_LARGE' : bare;
|
|
55
|
+
return Object.keys(CODEBUILD_COMPUTE_VCPU).find((c) => c === key) ?? null;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Credits one CodeBuild action consumed, from its duration and compute size.
|
|
59
|
+
*
|
|
60
|
+
* Rounds UP to the whole credit, matching the plugin-build meter
|
|
61
|
+
* (`creditsForBuild`) — two meters feeding one counter must round the same way
|
|
62
|
+
* or the counter means neither.
|
|
63
|
+
*
|
|
64
|
+
* Returns `null` rather than 0 when either input is missing, and the distinction
|
|
65
|
+
* is the point: a build with no measured duration was not observed, and
|
|
66
|
+
* reporting that as zero consumption would make the coverage gap look like
|
|
67
|
+
* idleness. The ingest counts those separately (`measured="false"`) so the
|
|
68
|
+
* coverage ratio is visible BEFORE anyone prices a tier off this series.
|
|
69
|
+
*/
|
|
70
|
+
export function computeCreditsFor(durationMs, computeType) {
|
|
71
|
+
if (durationMs == null || !(durationMs > 0) || !computeType)
|
|
72
|
+
return null;
|
|
73
|
+
return Math.ceil((durationMs / 60_000) * CODEBUILD_COMPUTE_VCPU[computeType]);
|
|
74
|
+
}
|
|
19
75
|
/**
|
|
20
76
|
* Types of pipeline steps that can be created by plugins
|
|
21
77
|
*
|
|
@@ -28,4 +84,4 @@ export const PluginType = {
|
|
|
28
84
|
SHELL_STEP: 'ShellStep',
|
|
29
85
|
MANUAL_APPROVAL_STEP: 'ManualApprovalStep',
|
|
30
86
|
};
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
87
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQVd0Qzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUc7SUFDekIsS0FBSyxFQUFFLE9BQU87SUFDZCxNQUFNLEVBQUUsUUFBUTtJQUNoQixLQUFLLEVBQUUsT0FBTztJQUNkLFFBQVEsRUFBRSxVQUFVO0NBQ1osQ0FBQztBQUdYOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQTBDO0lBQzNFLEtBQUssRUFBRSxDQUFDO0lBQ1IsTUFBTSxFQUFFLENBQUM7SUFDVCxLQUFLLEVBQUUsQ0FBQztJQUNSLFFBQVEsRUFBRSxFQUFFO0NBQ2IsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsR0FBOEI7SUFDakUsSUFBSSxDQUFDLEdBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN0QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDaEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDakcsNERBQTREO0lBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDekUsT0FBUSxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQztBQUMvRixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFVBQXFDLEVBQUUsV0FBK0I7SUFDdEcsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekUsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixlQUFlLEVBQUUsZUFBZTtJQUNoQyxVQUFVLEVBQUUsV0FBVztJQUN2QixvQkFBb0IsRUFBRSxvQkFBb0I7Q0FDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNoYXJlZCBwaXBlbGluZSB0eXBlcyB1c2VkIGJ5IGJvdGggcGlwZWxpbmUtY29yZSBhbmQgcGlwZWxpbmUtZGF0YVxuICovXG5cbi8qKlxuICogVXRpbGl0eSB0eXBlIHRvIGV4dHJhY3QgdGhlIHVuaW9uIG9mIGFsbCB2YWx1ZXMgZnJvbSBhbiBvYmplY3QgdHlwZVxuICovXG50eXBlIFZhbHVlT2Y8VD4gPSBUW2tleW9mIFRdO1xuXG4vKipcbiAqIEFXUyBDb2RlQnVpbGQgY29tcHV0ZSByZXNvdXJjZSBzaXplc1xuICpcbiAqIEBwcm9wZXJ0eSBTTUFMTCAtIDMgR0IgbWVtb3J5LCAyIHZDUFVzXG4gKiBAcHJvcGVydHkgTUVESVVNIC0gNyBHQiBtZW1vcnksIDQgdkNQVXNcbiAqIEBwcm9wZXJ0eSBMQVJHRSAtIDE1IEdCIG1lbW9yeSwgOCB2Q1BVc1xuICogQHByb3BlcnR5IFgyX0xBUkdFIC0gMTQ1IEdCIG1lbW9yeSwgNzIgdkNQVXNcbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jb2RlYnVpbGQvbGF0ZXN0L3VzZXJndWlkZS9idWlsZC1lbnYtcmVmLWNvbXB1dGUtdHlwZXMuaHRtbFxuICovXG5leHBvcnQgY29uc3QgQ29tcHV0ZVR5cGUgPSB7XG4gIFNNQUxMOiAnU01BTEwnLFxuICBNRURJVU06ICdNRURJVU0nLFxuICBMQVJHRTogJ0xBUkdFJyxcbiAgWDJfTEFSR0U6ICdYMl9MQVJHRScsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ29tcHV0ZVR5cGUgPSBWYWx1ZU9mPHR5cGVvZiBDb21wdXRlVHlwZT47XG5cbi8qKlxuICogdkNQVSBlYWNoIENvZGVCdWlsZCBjb21wdXRlIHNpemUgcHJvdmlkZXMsIGZvciB0dXJuaW5nIGEgYnVpbGQncyBEVVJBVElPTlxuICogaW50byBgY3B1Q3JlZGl0c2AgKG9uZSBjcmVkaXQgPSBvbmUgdkNQVS1taW51dGUpLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0aGUgc2FtZSBBV1MgdGFibGUgdGhlIGBDb21wdXRlVHlwZWAgZG9jIGFib3ZlIGNpdGVzLCBhbmQga2VwdFxuICogYmVzaWRlIGl0IG9uIHB1cnBvc2U6IHRoZSBtZW1vcnkvdkNQVSBmaWd1cmVzIGluIHRoYXQgY29tbWVudCBhbmQgdGhlIG51bWJlcnNcbiAqIGhlcmUgYXJlIHRoZSBzYW1lIGZhY3QsIGFuZCBzcGxpdHRpbmcgdGhlbSBpcyBob3cgb25lIGdldHMgdXBkYXRlZCBhbG9uZS5cbiAqXG4gKiBgWDJfTEFSR0VgIGlzIDcyIHZDUFUg4oCUIHRoaXJ0eS1zaXggdGltZXMgU01BTEwuIFRoYXQgcmF0aW8gaXMgd2h5IHBpcGVsaW5lXG4gKiBleGVjdXRpb24gY2Fubm90IGJlIGNoYXJnZWQgYnkgd2FsbC1jbG9jayBhbG9uZSwgYW5kIHdoeSBpbmdlc3RpbmcgaXRcbiAqIChQaGFzZSA0KSByZS1kZXJpdmVzIHRoZSB0aWVyIGxhZGRlciByYXRoZXIgdGhhbiBzaW1wbHkgYWRkaW5nIHRvIGl0LlxuICovXG5leHBvcnQgY29uc3QgQ09ERUJVSUxEX0NPTVBVVEVfVkNQVTogUmVhZG9ubHk8UmVjb3JkPENvbXB1dGVUeXBlLCBudW1iZXI+PiA9IHtcbiAgU01BTEw6IDIsXG4gIE1FRElVTTogNCxcbiAgTEFSR0U6IDgsXG4gIFgyX0xBUkdFOiA3Mixcbn07XG5cbi8qKlxuICogQVdTJ3Mgb3duIHNwZWxsaW5nIG9mIGEgY29tcHV0ZSBzaXplLCBhcyBgQmF0Y2hHZXRCdWlsZHNgIHJldHVybnMgaXRcbiAqIChgZW52aXJvbm1lbnQuY29tcHV0ZVR5cGVgKSwgbmFycm93ZWQgdG8gb3Vycy5cbiAqXG4gKiBOZWVkZWQgYmVjYXVzZSB0aGUgdHdvIHZvY2FidWxhcmllcyBkaWZmZXI6IHRoZSBwaXBlbGluZSBjb25maWcgc3RvcmVzXG4gKiBgTUVESVVNYCwgQVdTIGFuc3dlcnMgYEJVSUxEX0dFTkVSQUwxX01FRElVTWAsIGFuZCBhIHdyb25nIG1hdGNoIGhlcmUgd291bGRcbiAqIHByaWNlIGEgYnVpbGQgYXQgdGhlIHdyb25nIHZDUFUgcmF0aGVyIHRoYW4gZmFpbGluZyB2aXNpYmx5LiBBbnl0aGluZ1xuICogdW5yZWNvZ25pc2VkIHJldHVybnMgYG51bGxgIOKAlCBhbiB1bmtub3duIHNpemUgbXVzdCBiZSByZXBvcnRlZCBhcyB1bmtub3duLCBub3RcbiAqIHNpbGVudGx5IHByaWNlZCBhcyBTTUFMTCwgd2hpY2ggaXMgdGhlIGNoZWFwZXN0IGFuZCB0aGVyZWZvcmUgdGhlIG1vc3RcbiAqIGZsYXR0ZXJpbmcgZ3Vlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb21wdXRlVHlwZShyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiBDb21wdXRlVHlwZSB8IG51bGwge1xuICBpZiAoIXJhdykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHVwcGVyID0gcmF3LnRvVXBwZXJDYXNlKCk7XG4gIGNvbnN0IGJhcmUgPSB1cHBlci5zdGFydHNXaXRoKCdCVUlMRF9HRU5FUkFMMV8nKSA/IHVwcGVyLnNsaWNlKCdCVUlMRF9HRU5FUkFMMV8nLmxlbmd0aCkgOiB1cHBlcjtcbiAgLy8gQVdTIHNwZWxscyB0aGUgbGFyZ2VzdCBvbmUgYDJYTEFSR0VgOyBvdXJzIGlzIGBYMl9MQVJHRWAuXG4gIGNvbnN0IGtleSA9IGJhcmUgPT09ICcyWExBUkdFJyB8fCBiYXJlID09PSAnWDJMQVJHRScgPyAnWDJfTEFSR0UnIDogYmFyZTtcbiAgcmV0dXJuIChPYmplY3Qua2V5cyhDT0RFQlVJTERfQ09NUFVURV9WQ1BVKSBhcyBDb21wdXRlVHlwZVtdKS5maW5kKChjKSA9PiBjID09PSBrZXkpID8/IG51bGw7XG59XG5cbi8qKlxuICogQ3JlZGl0cyBvbmUgQ29kZUJ1aWxkIGFjdGlvbiBjb25zdW1lZCwgZnJvbSBpdHMgZHVyYXRpb24gYW5kIGNvbXB1dGUgc2l6ZS5cbiAqXG4gKiBSb3VuZHMgVVAgdG8gdGhlIHdob2xlIGNyZWRpdCwgbWF0Y2hpbmcgdGhlIHBsdWdpbi1idWlsZCBtZXRlclxuICogKGBjcmVkaXRzRm9yQnVpbGRgKSDigJQgdHdvIG1ldGVycyBmZWVkaW5nIG9uZSBjb3VudGVyIG11c3Qgcm91bmQgdGhlIHNhbWUgd2F5XG4gKiBvciB0aGUgY291bnRlciBtZWFucyBuZWl0aGVyLlxuICpcbiAqIFJldHVybnMgYG51bGxgIHJhdGhlciB0aGFuIDAgd2hlbiBlaXRoZXIgaW5wdXQgaXMgbWlzc2luZywgYW5kIHRoZSBkaXN0aW5jdGlvblxuICogaXMgdGhlIHBvaW50OiBhIGJ1aWxkIHdpdGggbm8gbWVhc3VyZWQgZHVyYXRpb24gd2FzIG5vdCBvYnNlcnZlZCwgYW5kXG4gKiByZXBvcnRpbmcgdGhhdCBhcyB6ZXJvIGNvbnN1bXB0aW9uIHdvdWxkIG1ha2UgdGhlIGNvdmVyYWdlIGdhcCBsb29rIGxpa2VcbiAqIGlkbGVuZXNzLiBUaGUgaW5nZXN0IGNvdW50cyB0aG9zZSBzZXBhcmF0ZWx5IChgbWVhc3VyZWQ9XCJmYWxzZVwiYCkgc28gdGhlXG4gKiBjb3ZlcmFnZSByYXRpbyBpcyB2aXNpYmxlIEJFRk9SRSBhbnlvbmUgcHJpY2VzIGEgdGllciBvZmYgdGhpcyBzZXJpZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ3JlZGl0c0ZvcihkdXJhdGlvbk1zOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkLCBjb21wdXRlVHlwZTogQ29tcHV0ZVR5cGUgfCBudWxsKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChkdXJhdGlvbk1zID09IG51bGwgfHwgIShkdXJhdGlvbk1zID4gMCkgfHwgIWNvbXB1dGVUeXBlKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIE1hdGguY2VpbCgoZHVyYXRpb25NcyAvIDYwXzAwMCkgKiBDT0RFQlVJTERfQ09NUFVURV9WQ1BVW2NvbXB1dGVUeXBlXSk7XG59XG5cbi8qKlxuICogVHlwZXMgb2YgcGlwZWxpbmUgc3RlcHMgdGhhdCBjYW4gYmUgY3JlYXRlZCBieSBwbHVnaW5zXG4gKlxuICogQHByb3BlcnR5IENPREVfQlVJTERfU1RFUCAtIEZ1bGwgQ29kZUJ1aWxkIHN0ZXAgd2l0aCBjdXN0b20gYnVpbGQgZW52aXJvbm1lbnRcbiAqIEBwcm9wZXJ0eSBTSEVMTF9TVEVQIC0gU2ltcGxlIHNoZWxsIHN0ZXAgd2l0aG91dCBjdXN0b20gYnVpbGQgZW52aXJvbm1lbnRcbiAqIEBwcm9wZXJ0eSBNQU5VQUxfQVBQUk9WQUxfU1RFUCAtIE5hdGl2ZSBDREsgYXBwcm92YWwgZ2F0ZSAobm8gRG9ja2VyIGltYWdlLCBubyBjb21tYW5kcylcbiAqL1xuZXhwb3J0IGNvbnN0IFBsdWdpblR5cGUgPSB7XG4gIENPREVfQlVJTERfU1RFUDogJ0NvZGVCdWlsZFN0ZXAnLFxuICBTSEVMTF9TVEVQOiAnU2hlbGxTdGVwJyxcbiAgTUFOVUFMX0FQUFJPVkFMX1NURVA6ICdNYW51YWxBcHByb3ZhbFN0ZXAnLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFBsdWdpblR5cGUgPSBWYWx1ZU9mPHR5cGVvZiBQbHVnaW5UeXBlPjtcblxuLyoqXG4gKiBNZXRhZGF0YSB0eXBlIGZvciBzdG9yaW5nIGNvbmZpZ3VyYXRpb24gYW5kIGN1c3RvbSBwcm9wZXJ0aWVzXG4gKlxuICogU3VwcG9ydHM6XG4gKiAtIFN0YW5kYXJkIGtleS12YWx1ZSBwYWlycyAoc3RyaW5nLCBib29sZWFuLCBudW1iZXIpXG4gKiAtIEN1c3RvbSBBV1MgQ0RLIGtleXMgd2l0aCB0aGUgcGF0dGVybiBgYXdzOmNkazp7bmFtZXNwYWNlfTp7a2V5fWBcbiAqICAgKGFsbCBsb3dlcmNhc2Ug4oCUIG1hdGNoZXMgdGhlIGZvcm1hdCBwcm9kdWNlZCBieSBgZ2V0Q3VzdG9tS2V5YClcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgbWV0YWRhdGE6IE1ldGFEYXRhVHlwZSA9IHtcbiAqICAgQlVJTERfRU5WOiAncHJvZHVjdGlvbicsXG4gKiAgIE5PREVfVkVSU0lPTjogJzE4JyxcbiAqICAgRU5BQkxFX0NBQ0hFOiB0cnVlLFxuICogICBNQVhfUkVUUklFUzogM1xuICogfTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBNZXRhRGF0YVR5cGUgPVxuICBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBib29sZWFuIHwgbnVtYmVyPiAmXG4gIHsgW0sgaW4gYGF3czpjZGs6JHtzdHJpbmd9YF0/OiB1bmtub3duIH07XG4iXX0=
|
|
@@ -23,8 +23,6 @@ export declare const HEALTH_COMPONENTS: readonly ['runtime', 'vulns', 'freshness
|
|
|
23
23
|
export type HealthComponent = (typeof HEALTH_COMPONENTS)[number];
|
|
24
24
|
/** Nominal weight of each component (they sum to 100). */
|
|
25
25
|
export declare const HEALTH_WEIGHTS: Readonly<Record<HealthComponent, number>>;
|
|
26
|
-
/** Human labels for the breakdown panel. */
|
|
27
|
-
export declare const HEALTH_COMPONENT_LABELS: Readonly<Record<HealthComponent, string>>;
|
|
28
26
|
/** Fewer available components than this ⇒ no score. */
|
|
29
27
|
export declare const HEALTH_MIN_COMPONENTS = 3;
|
|
30
28
|
/** Runs needed in the window before the success rate counts. */
|
|
@@ -32,16 +32,6 @@ export const HEALTH_WEIGHTS = {
|
|
|
32
32
|
docs: 10,
|
|
33
33
|
rating: 10,
|
|
34
34
|
};
|
|
35
|
-
/** Human labels for the breakdown panel. */
|
|
36
|
-
export const HEALTH_COMPONENT_LABELS = {
|
|
37
|
-
runtime: 'Runtime success (30 days)',
|
|
38
|
-
vulns: 'Known vulnerabilities',
|
|
39
|
-
freshness: 'Freshness',
|
|
40
|
-
signed: 'Signed image',
|
|
41
|
-
smokeTest: 'Smoke test declared',
|
|
42
|
-
docs: 'README and license',
|
|
43
|
-
rating: 'Rating',
|
|
44
|
-
};
|
|
45
35
|
/** Fewer available components than this ⇒ no score. */
|
|
46
36
|
export const HEALTH_MIN_COMPONENTS = 3;
|
|
47
37
|
/** Runs needed in the window before the success rate counts. */
|
|
@@ -181,4 +171,4 @@ export function healthBand(score) {
|
|
|
181
171
|
return 'fair';
|
|
182
172
|
return 'poor';
|
|
183
173
|
}
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhlYWx0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wbHVnaW4taGVhbHRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQVUsQ0FBQztBQUdySCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUE4QztJQUN2RSxPQUFPLEVBQUUsRUFBRTtJQUNYLEtBQUssRUFBRSxFQUFFO0lBQ1QsU0FBUyxFQUFFLEVBQUU7SUFDYixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxFQUFFO0lBQ2IsSUFBSSxFQUFFLEVBQUU7SUFDUixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUFFRiw0Q0FBNEM7QUFDNUMsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQThDO0lBQ2hGLE9BQU8sRUFBRSwyQkFBMkI7SUFDcEMsS0FBSyxFQUFFLHVCQUF1QjtJQUM5QixTQUFTLEVBQUUsV0FBVztJQUN0QixNQUFNLEVBQUUsY0FBYztJQUN0QixTQUFTLEVBQUUscUJBQXFCO0lBQ2hDLElBQUksRUFBRSxvQkFBb0I7SUFDMUIsTUFBTSxFQUFFLFFBQVE7Q0FDakIsQ0FBQztBQUVGLHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDdkMsZ0VBQWdFO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDbEMsK0NBQStDO0FBQy9DLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUNwQyw4RkFBOEY7QUFDOUYsTUFBTSxDQUFDLE1BQU0s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QUMsY0FBYyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQztZQUFFLFNBQVM7UUFDaEcsSUFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDbEIsU0FBUyxJQUFJLENBQUMsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUlELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFnQztJQUN6RCxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDdkYsSUFBSSxLQUFLLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsSUFBSSxLQUFLLElBQUksZ0JBQWdCO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDN0MsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBwbHVnaW4gSEVBTFRIIFNDT1JFIChkb2NzL3BsdWdpbi1wdWJsaXNoaW5nLm1kKTogb25lIDDigJMxMDBcbiAqIG51bWJlciBwZXIgbGlzdGluZywgZnJvbSBzZXZlbiBjb21wb25lbnRzLiBQdXJlIGFuZCBkZXBlbmRlbmN5LWZyZWUgc28gdGhlXG4gKiBwbHVnaW4gc2VydmljZSAodGhlIHN0YXRzIHN3ZWVwKSwgdGhlIGZyb250ZW5kICh0aGUgYnJlYWtkb3duIHBhbmVsJ3NcbiAqIGxhYmVscykgYW5kIHRoZSB0ZXN0cyBzaGFyZSBvbmUgZGVmaW5pdGlvbi5cbiAqXG4gKiBFYWNoIGNvbXBvbmVudCBzY29yZXMgMC4uMSBhbmQgY2FycmllcyBhIGZpeGVkIHdlaWdodC4gQSBjb21wb25lbnQgd2hvc2VcbiAqIGlucHV0cyBhcmUgbWlzc2luZyBpcyBEUk9QUEVEIGFuZCB0aGUgcmVtYWluaW5nIHdlaWdodHMgYXJlIHJlbm9ybWFsaXplZDsgd2l0aFxuICogZmV3ZXIgdGhhbiB7QGxpbmsgSEVBTFRIX01JTl9DT01QT05FTlRTfSBjb21wb25lbnRzIHRoZSBzY29yZSBpcyBudWxsIChcIm5vdFxuICogZW5vdWdoIGRhdGFcIiksIG5ldmVyIGEgZ3Vlc3MuXG4gKlxuICogfCBjb21wb25lbnQgIHwgd2VpZ2h0IHwgc2NvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwtLS0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18XG4gKiB8IHJ1bnRpbWUgICAgfCAyNSAgICAgfCAzMC1kYXkgc3VjY2VzcyByYXRlOyBvbmx5IHdpdGgg4omlIDIwIHJ1bnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHZ1bG5zICAgICAgfCAyMCAgICAgfCAxIOKIkiAwLjXCt2NyaXRpY2FsIOKIkiAwLjHCt2hpZ2ggKGZsb29yIDApLCBsYXRlc3QgbGlzdGVkIHZlcnNpb247IHNjYW5uZWQgb25seSB8XG4gKiB8IGZyZXNobmVzcyAgfCAxNSAgICAgfCByZWxlYXNlIGFnZSAo4omkOTBkIDEg4oaSIDAgYXQgNTQwZCkgYXZlcmFnZWQgd2l0aCBiYXNlLWltYWdlIGFnZSAo4omkNjBkIDEg4oaSIDAgYXQgMzY1ZCkgd2hlbiByZWNvcmRlZCB8XG4gKiB8IHNpZ25lZCAgICAgfCAxMCAgICAgfCBpbWFnZSBkaWdlc3QgcHJlc2VudCBhbmQgc2lnbmVkIOKHkiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IHNtb2tlVGVzdCAgfCAxMCAgICAgfCBzbW9rZSB0ZXN0IGRlY2xhcmVkIOKHkiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8IGRvY3MgICAgICAgfCAxMCAgICAgfCBSRUFETUUgMC41ICsgbGljZW5zZSAwLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCByYXRpbmcgICAgIHwgMTAgICAgIHwgQmF5ZXNpYW4gcmF0aW5nIC8gNTsgb25seSB3aXRoIOKJpSAzIHJhdGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICovXG5cbmV4cG9ydCBjb25zdCBIRUFMVEhfQ09NUE9ORU5UUyA9IFsncnVudGltZScsICd2dWxucycsICdmcmVzaG5lc3MnLCAnc2lnbmVkJywgJ3Ntb2tlVGVzdCcsICdkb2NzJywgJ3JhdGluZyddIGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgSGVhbHRoQ29tcG9uZW50ID0gKHR5cGVvZiBIRUFMVEhfQ09NUE9ORU5UUylbbnVtYmVyXTtcblxuLyoqIE5vbWluYWwgd2VpZ2h0IG9mIGVhY2ggY29tcG9uZW50ICh0aGV5IHN1bSB0byAxMDApLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9XRUlHSFRTOiBSZWFkb25seTxSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBudW1iZXI+PiA9IHtcbiAgcnVudGltZTogMjUsXG4gIHZ1bG5zOiAyMCxcbiAgZnJlc2huZXNzOiAxNSxcbiAgc2lnbmVkOiAxMCxcbiAgc21va2VUZXN0OiAxMCxcbiAgZG9jczogMTAsXG4gIHJhdGluZzogMTAsXG59O1xuXG4vKiogSHVtYW4gbGFiZWxzIGZvciB0aGUgYnJlYWtkb3duIHBhbmVsLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9DT01QT05FTlRfTEFCRUxTOiBSZWFkb25seTxSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBzdHJpbmc+PiA9IHtcbiAgcnVudGltZTogJ1J1bnRpbWUgc3VjY2VzcyAoMzAgZGF5cyknLFxuICB2dWxuczogJ0tub3duIHZ1bG5lcmFiaWxpdGllcycsXG4gIGZyZXNobmVzczogJ0ZyZXNobmVzcycsXG4gIHNpZ25lZDogJ1NpZ25lZCBpbWFnZScsXG4gIHNtb2tlVGVzdDogJ1Ntb2tlIHRlc3QgZGVjbGFyZWQnLFxuICBkb2NzOiAnUkVBRE1FIGFuZCBsaWNlbnNlJyxcbiAgcmF0aW5nOiAnUmF0aW5nJyxcbn07XG5cbi8qKiBGZXdlciBhdmFpbGFibGUgY29tcG9uZW50cyB0aGFuIHRoaXMg4oeSIG5vIHNjb3JlLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9NSU5fQ09NUE9ORU5UUyA9IDM7XG4vKiogUnVucyBuZWVkZWQgaW4gdGhlIHdpbmRvdyBiZWZvcmUgdGhlIHN1Y2Nlc3MgcmF0ZSBjb3VudHMuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9SVU5TID0gMjA7XG4vKiogUmF0aW5ncyBuZWVkZWQgYmVmb3JlIHRoZSByYXRpbmcgY291bnRzLiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9NSU5fUkFUSU5HUyA9IDM7XG4vKiogUmVsZWFzZSBhZ2U6IGZ1bGwgbWFya3MgdXAgdG8gdGhpcyBtYW55IGRheXMsIHplcm8gYXQge0BsaW5rIEhFQUxUSF9SRUxFQVNFX1pFUk9fREFZU30uICovXG5leHBvcnQgY29uc3QgSEVBTFRIX1JFTEVBU0VfRlVMTF9EQVlTID0gOTA7XG5leHBvcnQgY29uc3QgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTID0gNTQwO1xuLyoqIEJhc2UtaW1hZ2UgYWdlOiBmdWxsIG1hcmtzIHVwIHRvIHRoaXMgbWFueSBkYXlzLCB6ZXJvIGF0IHtAbGluayBIRUFMVEhfQkFTRV9JTUFHRV9aRVJPX0RBWVN9LiAqL1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQVNFX0lNQUdFX0ZVTExfREFZUyA9IDYwO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZUyA9IDM2NTtcblxuLyoqIE9uZSBjb21wb25lbnQncyBjb250cmlidXRpb246IGl0cyAwLi4xIHNjb3JlIChudWxsID0gbWlzc2luZywgZHJvcHBlZCkgYW5kIGl0cyBub21pbmFsIHdlaWdodC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoQ29tcG9uZW50U2NvcmUge1xuICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgd2VpZ2h0OiBudW1iZXI7XG59XG5leHBvcnQgdHlwZSBIZWFsdGhCcmVha2Rvd24gPSBSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBIZWFsdGhDb21wb25lbnRTY29yZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoUmVzdWx0IHtcbiAgLyoqIDDigJMxMDAgaW50ZWdlciwgb3IgbnVsbCB3aXRoIGZld2VyIHRoYW4ge0BsaW5rIEhFQUxUSF9NSU5fQ09NUE9ORU5UU30gY29tcG9uZW50cy4gKi9cbiAgc2NvcmU6IG51bWJlciB8IG51bGw7XG4gIGJyZWFrZG93bjogSGVhbHRoQnJlYWtkb3duO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHNjb3JlIGlzIGNvbXB1dGVkIGZyb20uIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsOiBgdW5kZWZpbmVkYCAvIG51bGxcbiAqIG1lYW5zIFwibm90IGtub3duXCIsIHdoaWNoIGRyb3BzIHRoZSBjb21wb25lbnQgKG9yLCBmb3IgZnJlc2huZXNzLCB0aGF0IGhhbGYpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aElucHV0cyB7XG4gIC8qKiBUZXJtaW5hbCBydW5zIGluIHRoZSAzMC1kYXkgd2luZG93LCBhbmQgdGhlIHNoYXJlIHRoYXQgc3VjY2VlZGVkICgwLi4xKS4gKi9cbiAgcnVuczMwZD86IG51bWJlciB8IG51bGw7XG4gIHN1Y2Nlc3NSYXRlMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgLyoqIFRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24ncyBzY2FuOyBgc2Nhbm5lZEF0YCBudWxsIOKHkiBuZXZlciBzY2FubmVkLiAqL1xuICB2dWxuQ3JpdGljYWw/OiBudW1iZXIgfCBudWxsO1xuICB2dWxuSGlnaD86IG51bWJlciB8IG51bGw7XG4gIHNjYW5uZWRBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogV2hlbiB0aGUgbGF0ZXN0IGxpc3RlZCB2ZXJzaW9uIHdhcyBwdWJsaXNoZWQuICovXG4gIGxhc3RSZWxlYXNlQXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24ncyBiYXNlIGltYWdlIGBjcmVhdGVkYCB0aW1lLCB3aGVuIHJlY29yZGVkLiAqL1xuICBiYXNlSW1hZ2VDcmVhdGVkQXQ/OiBEYXRlIHwgc3RyaW5nIHwgbnVsbDtcbiAgLyoqIExhdGVzdCBsaXN0ZWQgdmVyc2lvbiBoYXMgYW4gaW1hZ2UgZGlnZXN0IEFORCBhIHNpZ25hdHVyZSAoaXRzIGBwdWJsaWMvKmAgY29weSkuICovXG4gIHNpZ25lZD86IGJvb2xlYW4gfCBudWxsO1xuICBzbW9rZVRlc3REZWNsYXJlZD86IGJvb2xlYW4gfCBudWxsO1xuICBoYXNSZWFkbWU/OiBib29sZWFuIHwgbnVsbDtcbiAgaGFzTGljZW5zZT86IGJvb2xlYW4gfCBudWxsO1xuICByYXRpbmdCYXllcz86IG51bWJlciB8IG51bGw7XG4gIHJhdGluZ0NvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cblxuY29uc3QgREFZX01TID0gODZfNDAwXzAwMDtcblxuY29uc3Qgcm91bmQzID0gKG46IG51bWJlcik6IG51bWJlciA9PiBNYXRoLnJvdW5kKG4gKiAxMDAwKSAvIDEwMDA7XG5jb25zdCBjbGFtcDAxID0gKG46IG51bWJlcik6IG51bWJlciA9PiBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCBuKSk7XG5cbmZ1bmN0aW9uIHRvVGltZShkOiBEYXRlIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB8IG51bGwge1xuICBpZiAoZCA9PT0gbnVsbCB8fCBkID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsO1xuICBjb25zdCB0ID0gbmV3IERhdGUoZCkuZ2V0VGltZSgpO1xuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpID8gdCA6IG51bGw7XG59XG5cbi8qKiAxIHVwIHRvIGBmdWxsRGF5c2AsIGZhbGxpbmcgbGluZWFybHkgdG8gMCBhdCBgemVyb0RheXNgIChhIGZ1dHVyZSBkYXRlIGNvdW50cyBhcyBmcmVzaCkuICovXG5leHBvcnQgZnVuY3Rpb24gYWdlU2NvcmUoYWdlRGF5czogbnVtYmVyLCBmdWxsRGF5czogbnVtYmVyLCB6ZXJvRGF5czogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGFnZURheXMgPD0gZnVsbERheXMpIHJldHVybiAxO1xuICBpZiAoYWdlRGF5cyA+PSB6ZXJvRGF5cykgcmV0dXJuIDA7XG4gIHJldHVybiBjbGFtcDAxKDEgLSAoYWdlRGF5cyAtIGZ1bGxEYXlzKSAvICh6ZXJvRGF5cyAtIGZ1bGxEYXlzKSk7XG59XG5cbi8qKiBUaGUgdnVsbmVyYWJpbGl0eSBjb21wb25lbnQ6IDEg4oiSIDAuNcK3Y3JpdGljYWwg4oiSIDAuMcK3aGlnaCwgZmxvb3JlZCBhdCAwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZ1bG5TY29yZShjcml0aWNhbDogbnVtYmVyLCBoaWdoOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gY2xhbXAwMSgxIC0gMC41ICogTWF0aC5tYXgoMCwgY3JpdGljYWwpIC0gMC4xICogTWF0aC5tYXgoMCwgaGlnaCkpO1xufVxuXG5mdW5jdGlvbiBydW50aW1lQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoaS5ydW5zMzBkID09PSBudWxsIHx8IGkucnVuczMwZCA9PT0gdW5kZWZpbmVkIHx8IGkucnVuczMwZCA8IEhFQUxUSF9NSU5fUlVOUykgcmV0dXJuIG51bGw7XG4gIGlmIChpLnN1Y2Nlc3NSYXRlMzBkID09PSBudWxsIHx8IGkuc3VjY2Vzc1JhdGUzMGQgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKGkuc3VjY2Vzc1JhdGUzMGQpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsYW1wMDEoaS5zdWNjZXNzUmF0ZTMwZCk7XG59XG5cbmZ1bmN0aW9uIHZ1bG5zQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAodG9UaW1lKGkuc2Nhbm5lZEF0KSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB2dWxuU2NvcmUoaS52dWxuQ3JpdGljYWwgPz8gMCwgaS52dWxuSGlnaCA/PyAwKTtcbn1cblxuZnVuY3Rpb24gZnJlc2huZXNzQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cywgbm93OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgcGFydHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHJlbGVhc2UgPSB0b1RpbWUoaS5sYXN0UmVsZWFzZUF0KTtcbiAgaWYgKHJlbGVhc2UgIT09IG51bGwpIHBhcnRzLnB1c2goYWdlU2NvcmUoKG5vdyAtIHJlbGVhc2UpIC8gREFZX01TLCBIRUFMVEhfUkVMRUFTRV9GVUxMX0RBWVMsIEhFQUxUSF9SRUxFQVNFX1pFUk9fREFZUykpO1xuICBjb25zdCBiYXNlID0gdG9UaW1lKGkuYmFzZUltYWdlQ3JlYXRlZEF0KTtcbiAgaWYgKGJhc2UgIT09IG51bGwpIHBhcnRzLnB1c2goYWdlU2NvcmUoKG5vdyAtIGJhc2UpIC8gREFZX01TLCBIRUFMVEhfQkFTRV9JTUFHRV9GVUxMX0RBWVMsIEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZUykpO1xuICBpZiAocGFydHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHBhcnRzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApIC8gcGFydHMubGVuZ3RoO1xufVxuXG5jb25zdCBmbGFnID0gKGI6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCA9PiAoYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQgPyBudWxsIDogYiA/IDEgOiAwKTtcblxuZnVuY3Rpb24gZG9jc0NvbXBvbmVudChpOiBIZWFsdGhJbnB1dHMpOiBudW1iZXIgfCBudWxsIHtcbiAgaWYgKChpLmhhc1JlYWRtZSA9PT0gbnVsbCB8fCBpLmhhc1JlYWRtZSA9PT0gdW5kZWZpbmVkKSAmJiAoaS5oYXNMaWNlbnNlID09PSBudWxsIHx8IGkuaGFzTGljZW5zZSA9PT0gdW5kZWZpbmVkKSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiAoaS5oYXNSZWFkbWUgPyAwLjUgOiAwKSArIChpLmhhc0xpY2Vuc2UgPyAwLjUgOiAwKTtcbn1cblxuZnVuY3Rpb24gcmF0aW5nQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoaS5yYXRpbmdDb3VudCA9PT0gbnVsbCB8fCBpLnJhdGluZ0NvdW50ID09PSB1bmRlZmluZWQgfHwgaS5yYXRpbmdDb3VudCA8IEhFQUxUSF9NSU5fUkFUSU5HUykgcmV0dXJuIG51bGw7XG4gIGlmIChpLnJhdGluZ0JheWVzID09PSBudWxsIHx8IGkucmF0aW5nQmF5ZXMgPT09IHVuZGVmaW5lZCB8fCAhTnVtYmVyLmlzRmluaXRlKGkucmF0aW5nQmF5ZXMpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGNsYW1wMDEoaS5yYXRpbmdCYXllcyAvIDUpO1xufVxuXG4vKiogVGhlIGhlYWx0aCBzY29yZSBhbmQgaXRzIHBlci1jb21wb25lbnQgYnJlYWtkb3duLiBQdXJlOyBgbm93YCBpcyBpbmplY3RhYmxlIGZvciB0ZXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlSGVhbHRoU2NvcmUoaW5wdXRzOiBIZWFsdGhJbnB1dHMsIG5vdzogRGF0ZSA9IG5ldyBEYXRlKCkpOiBIZWFsdGhSZXN1bHQge1xuICBjb25zdCB0ID0gbm93LmdldFRpbWUoKTtcbiAgY29uc3QgcmF3OiBSZWNvcmQ8SGVhbHRoQ29tcG9uZW50LCBudW1iZXIgfCBudWxsPiA9IHtcbiAgICBydW50aW1lOiBydW50aW1lQ29tcG9uZW50KGlucHV0cyksXG4gICAgdnVsbnM6IHZ1bG5zQ29tcG9uZW50KGlucHV0cyksXG4gICAgZnJlc2huZXNzOiBmcmVzaG5lc3NDb21wb25lbnQoaW5wdXRzLCB0KSxcbiAgICBzaWduZWQ6IGZsYWcoaW5wdXRzLnNpZ25lZCksXG4gICAgc21va2VUZXN0OiBmbGFnKGlucHV0cy5zbW9rZVRlc3REZWNsYXJlZCksXG4gICAgZG9jczogZG9jc0NvbXBvbmVudChpbnB1dHMpLFxuICAgIHJhdGluZzogcmF0aW5nQ29tcG9uZW50KGlucHV0cyksXG4gIH07XG4gIGNvbnN0IGJyZWFrZG93biA9IHt9IGFzIEhlYWx0aEJyZWFrZG93bjtcbiAgbGV0IHdlaWdodGVkID0gMDtcbiAgbGV0IHRvdGFsV2VpZ2h0ID0gMDtcbiAgbGV0IGF2YWlsYWJsZSA9IDA7XG4gIGZvciAoY29uc3QgYyBvZiBIRUFMVEhfQ09NUE9ORU5UUykge1xuICAgIGNvbnN0IHNjb3JlID0gcmF3W2NdO1xuICAgIGJyZWFrZG93bltjXSA9IHsgc2NvcmU6IHNjb3JlID09PSBudWxsID8gbnVsbCA6IHJvdW5kMyhzY29yZSksIHdlaWdodDogSEVBTFRIX1dFSUdIVFNbY10gfTtcbiAgICBpZiAoc2NvcmUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgIGF2YWlsYWJsZSsrO1xuICAgIHdlaWdodGVkICs9IHNjb3JlICogSEVBTFRIX1dFSUdIVFNbY107XG4gICAgdG90YWxXZWlnaHQgKz0gSEVBTFRIX1dFSUdIVFNbY107XG4gIH1cbiAgY29uc3Qgc2NvcmUgPSBhdmFpbGFibGUgPCBIRUFMVEhfTUlOX0NPTVBPTkVOVFMgfHwgdG90YWxXZWlnaHQgPT09IDAgPyBudWxsIDogTWF0aC5yb3VuZCgoMTAwICogd2VpZ2h0ZWQpIC8gdG90YWxXZWlnaHQpO1xuICByZXR1cm4geyBzY29yZSwgYnJlYWtkb3duIH07XG59XG5cbi8qKlxuICogQSBwdWJsaXNoZXIncyBoZWFsdGg6IHRoZSBpbnN0YWxsLXdlaWdodGVkIG1lYW4gb2YgaXRzIGxpc3RpbmdzJyBzY29yZXNcbiAqIChsaXN0aW5ncyB3aXRoIG5vIHNjb3JlIGFyZSBza2lwcGVkOyB3aGVuIG5vIGxpc3RpbmcgaGFzIGluc3RhbGxzLCB0aGUgcGxhaW5cbiAqIG1lYW4pLiBOdWxsIHdoZW4gbm8gbGlzdGluZyBoYXMgYSBzY29yZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hlckhlYWx0aFNjb3JlKGxpc3RpbmdzOiBSZWFkb25seUFycmF5PHsgaGVhbHRoU2NvcmU6IG51bWJlciB8IG51bGw7IGluc3RhbGxDb3VudDogbnVtYmVyIH0+KTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHNjb3JlZCA9IGxpc3RpbmdzLmZpbHRlcigobCk6IGwgaXMgeyBoZWFsdGhTY29yZTogbnVtYmVyOyBpbnN0YWxsQ291bnQ6IG51bWJlciB9ID0+XG4gICAgbC5oZWFsdGhTY29yZSAhPT0gbnVsbCAmJiBOdW1iZXIuaXNGaW5pdGUobC5oZWFsdGhTY29yZSkpO1xuICBpZiAoc2NvcmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHdlaWdodE9mID0gKG46IG51bWJlcikgPT4gTWF0aC5tYXgoMCwgbik7XG4gIGNvbnN0IHRvdGFsSW5zdGFsbHMgPSBzY29yZWQucmVkdWNlKChhLCBsKSA9PiBhICsgd2VpZ2h0T2YobC5pbnN0YWxsQ291bnQpLCAwKTtcbiAgaWYgKHRvdGFsSW5zdGFsbHMgPT09IDApIHJldHVybiBNYXRoLnJvdW5kKHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyBsLmhlYWx0aFNjb3JlLCAwKSAvIHNjb3JlZC5sZW5ndGgpO1xuICByZXR1cm4gTWF0aC5yb3VuZChzY29yZWQucmVkdWNlKChhLCBsKSA9PiBhICsgbC5oZWFsdGhTY29yZSAqIHdlaWdodE9mKGwuaW5zdGFsbENvdW50KSwgMCkgLyB0b3RhbEluc3RhbGxzKTtcbn1cblxuLyoqXG4gKiBBIHB1Ymxpc2hlcidzIDMwLWRheSBzdWNjZXNzIHJhdGUgYWNyb3NzIGl0cyBsaXN0aW5ncywgd2VpZ2h0ZWQgYnkgcnVucy5cbiAqIE51bGwgd2hlbiBub25lIG9mIGl0cyBsaXN0aW5ncyByYW4gaW4gdGhlIHdpbmRvdy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1Ymxpc2hlclN1Y2Nlc3NSYXRlKGxpc3RpbmdzOiBSZWFkb25seUFycmF5PHsgc3VjY2Vzc1JhdGUzMGQ6IG51bWJlciB8IG51bGw7IHJ1bnMzMGQ6IG51bWJlciB9Pik6IG51bWJlciB8IG51bGwge1xuICBsZXQgcnVucyA9IDA7XG4gIGxldCBzdWNjZWVkZWQgPSAwO1xuICBmb3IgKGNvbnN0IGwgb2YgbGlzdGluZ3MpIHtcbiAgICBpZiAobC5zdWNjZXNzUmF0ZTMwZCA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKGwuc3VjY2Vzc1JhdGUzMGQpIHx8IGwucnVuczMwZCA8PSAwKSBjb250aW51ZTtcbiAgICBydW5zICs9IGwucnVuczMwZDtcbiAgICBzdWNjZWVkZWQgKz0gbC5zdWNjZXNzUmF0ZTMwZCAqIGwucnVuczMwZDtcbiAgfVxuICByZXR1cm4gcnVucyA9PT0gMCA/IG51bGwgOiByb3VuZDMoc3VjY2VlZGVkIC8gcnVucyk7XG59XG5cbi8qKiBEaXNwbGF5IGJhbmQgZm9yIGEgc2NvcmU6IGdvb2Qg4omlIDgwLCBmYWlyIOKJpSA1MCwgcG9vciBiZWxvdywgdW5rbm93biB3aGVuIG51bGwuICovXG5leHBvcnQgdHlwZSBIZWFsdGhCYW5kID0gJ2dvb2QnIHwgJ2ZhaXInIHwgJ3Bvb3InIHwgJ3Vua25vd24nO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQU5EX0dPT0QgPSA4MDtcbmV4cG9ydCBjb25zdCBIRUFMVEhfQkFORF9GQUlSID0gNTA7XG5cbmV4cG9ydCBmdW5jdGlvbiBoZWFsdGhCYW5kKHNjb3JlOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkKTogSGVhbHRoQmFuZCB7XG4gIGlmIChzY29yZSA9PT0gbnVsbCB8fCBzY29yZSA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoc2NvcmUpKSByZXR1cm4gJ3Vua25vd24nO1xuICBpZiAoc2NvcmUgPj0gSEVBTFRIX0JBTkRfR09PRCkgcmV0dXJuICdnb29kJztcbiAgaWYgKHNjb3JlID49IEhFQUxUSF9CQU5EX0ZBSVIpIHJldHVybiAnZmFpcic7XG4gIHJldHVybiAncG9vcic7XG59XG4iXX0=
|
|
174
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLWhlYWx0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9wbHVnaW4taGVhbHRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBRUgsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQVUsQ0FBQztBQUdySCwwREFBMEQ7QUFDMUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUE4QztJQUN2RSxPQUFPLEVBQUUsRUFBRTtJQUNYLEtBQUssRUFBRSxFQUFFO0lBQ1QsU0FBUyxFQUFFLEVBQUU7SUFDYixNQUFNLEVBQUUsRUFBRTtJQUNWLFNBQVMsRUFBRSxFQUFFO0lBQ2IsSUFBSSxFQUFFLEVBQUU7SUFDUixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUFFRix1REFBdUQ7QUFDdkQsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZDLGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLCtDQUErQztBQUMvQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFDcEMsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFHLEVBQUUsQ0FBQztBQUMzQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxHQUFHLENBQUM7QUFDNUMsb0dBQW9HO0FBQ3BHLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLEVBQUUsQ0FBQztBQUM5QyxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxHQUFHLENBQUM7QUF3Qy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQztBQUUxQixNQUFNLE1BQU0s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QUNELE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFJRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFDbkMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBZ0M7SUFDekQsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3ZGLElBQUksS0FBSyxJQUFJLGdCQUFnQjtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdDLElBQUksS0FBSyxJQUFJLGdCQUFnQjtRQUFFLE9BQU8sTUFBTSxDQUFDO0lBQzdDLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBUaGUgcGx1Z2luIEhFQUxUSCBTQ09SRSAoZG9jcy9wbHVnaW4tcHVibGlzaGluZy5tZCk6IG9uZSAw4oCTMTAwXG4gKiBudW1iZXIgcGVyIGxpc3RpbmcsIGZyb20gc2V2ZW4gY29tcG9uZW50cy4gUHVyZSBhbmQgZGVwZW5kZW5jeS1mcmVlIHNvIHRoZVxuICogcGx1Z2luIHNlcnZpY2UgKHRoZSBzdGF0cyBzd2VlcCksIHRoZSBmcm9udGVuZCAodGhlIGJyZWFrZG93biBwYW5lbCdzXG4gKiBsYWJlbHMpIGFuZCB0aGUgdGVzdHMgc2hhcmUgb25lIGRlZmluaXRpb24uXG4gKlxuICogRWFjaCBjb21wb25lbnQgc2NvcmVzIDAuLjEgYW5kIGNhcnJpZXMgYSBmaXhlZCB3ZWlnaHQuIEEgY29tcG9uZW50IHdob3NlXG4gKiBpbnB1dHMgYXJlIG1pc3NpbmcgaXMgRFJPUFBFRCBhbmQgdGhlIHJlbWFpbmluZyB3ZWlnaHRzIGFyZSByZW5vcm1hbGl6ZWQ7IHdpdGhcbiAqIGZld2VyIHRoYW4ge0BsaW5rIEhFQUxUSF9NSU5fQ09NUE9ORU5UU30gY29tcG9uZW50cyB0aGUgc2NvcmUgaXMgbnVsbCAoXCJub3RcbiAqIGVub3VnaCBkYXRhXCIpLCBuZXZlciBhIGd1ZXNzLlxuICpcbiAqIHwgY29tcG9uZW50ICB8IHdlaWdodCB8IHNjb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiB8LS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfFxuICogfCBydW50aW1lICAgIHwgMjUgICAgIHwgMzAtZGF5IHN1Y2Nlc3MgcmF0ZTsgb25seSB3aXRoIOKJpSAyMCBydW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCB2dWxucyAgICAgIHwgMjAgICAgIHwgMSDiiJIgMC41wrdjcml0aWNhbCDiiJIgMC4xwrdoaWdoIChmbG9vciAwKSwgbGF0ZXN0IGxpc3RlZCB2ZXJzaW9uOyBzY2FubmVkIG9ubHkgfFxuICogfCBmcmVzaG5lc3MgIHwgMTUgICAgIHwgcmVsZWFzZSBhZ2UgKOKJpDkwZCAxIOKGkiAwIGF0IDU0MGQpIGF2ZXJhZ2VkIHdpdGggYmFzZS1pbWFnZSBhZ2UgKOKJpDYwZCAxIOKGkiAwIGF0IDM2NWQpIHdoZW4gcmVjb3JkZWQgfFxuICogfCBzaWduZWQgICAgIHwgMTAgICAgIHwgaW1hZ2UgZGlnZXN0IHByZXNlbnQgYW5kIHNpZ25lZCDih5IgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBzbW9rZVRlc3QgIHwgMTAgICAgIHwgc21va2UgdGVzdCBkZWNsYXJlZCDih5IgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogfCBkb2NzICAgICAgIHwgMTAgICAgIHwgUkVBRE1FIDAuNSArIGxpY2Vuc2UgMC41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqIHwgcmF0aW5nICAgICB8IDEwICAgICB8IEJheWVzaWFuIHJhdGluZyAvIDU7IG9ubHkgd2l0aCDiiaUgMyByYXRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqL1xuXG5leHBvcnQgY29uc3QgSEVBTFRIX0NPTVBPTkVOVFMgPSBbJ3J1bnRpbWUnLCAndnVsbnMnLCAnZnJlc2huZXNzJywgJ3NpZ25lZCcsICdzbW9rZVRlc3QnLCAnZG9jcycsICdyYXRpbmcnXSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEhlYWx0aENvbXBvbmVudCA9ICh0eXBlb2YgSEVBTFRIX0NPTVBPTkVOVFMpW251bWJlcl07XG5cbi8qKiBOb21pbmFsIHdlaWdodCBvZiBlYWNoIGNvbXBvbmVudCAodGhleSBzdW0gdG8gMTAwKS4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfV0VJR0hUUzogUmVhZG9ubHk8UmVjb3JkPEhlYWx0aENvbXBvbmVudCwgbnVtYmVyPj4gPSB7XG4gIHJ1bnRpbWU6IDI1LFxuICB2dWxuczogMjAsXG4gIGZyZXNobmVzczogMTUsXG4gIHNpZ25lZDogMTAsXG4gIHNtb2tlVGVzdDogMTAsXG4gIGRvY3M6IDEwLFxuICByYXRpbmc6IDEwLFxufTtcblxuLyoqIEZld2VyIGF2YWlsYWJsZSBjb21wb25lbnRzIHRoYW4gdGhpcyDih5Igbm8gc2NvcmUuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9DT01QT05FTlRTID0gMztcbi8qKiBSdW5zIG5lZWRlZCBpbiB0aGUgd2luZG93IGJlZm9yZSB0aGUgc3VjY2VzcyByYXRlIGNvdW50cy4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfTUlOX1JVTlMgPSAyMDtcbi8qKiBSYXRpbmdzIG5lZWRlZCBiZWZvcmUgdGhlIHJhdGluZyBjb3VudHMuICovXG5leHBvcnQgY29uc3QgSEVBTFRIX01JTl9SQVRJTkdTID0gMztcbi8qKiBSZWxlYXNlIGFnZTogZnVsbCBtYXJrcyB1cCB0byB0aGlzIG1hbnkgZGF5cywgemVybyBhdCB7QGxpbmsgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTfS4gKi9cbmV4cG9ydCBjb25zdCBIRUFMVEhfUkVMRUFTRV9GVUxMX0RBWVMgPSA5MDtcbmV4cG9ydCBjb25zdCBIRUFMVEhfUkVMRUFTRV9aRVJPX0RBWVMgPSA1NDA7XG4vKiogQmFzZS1pbWFnZSBhZ2U6IGZ1bGwgbWFya3MgdXAgdG8gdGhpcyBtYW55IGRheXMsIHplcm8gYXQge0BsaW5rIEhFQUxUSF9CQVNFX0lNQUdFX1pFUk9fREFZU30uICovXG5leHBvcnQgY29uc3QgSEVBTFRIX0JBU0VfSU1BR0VfRlVMTF9EQVlTID0gNjA7XG5leHBvcnQgY29uc3QgSEVBTFRIX0JBU0VfSU1BR0VfWkVST19EQVlTID0gMzY1O1xuXG4vKiogT25lIGNvbXBvbmVudCdzIGNvbnRyaWJ1dGlvbjogaXRzIDAuLjEgc2NvcmUgKG51bGwgPSBtaXNzaW5nLCBkcm9wcGVkKSBhbmQgaXRzIG5vbWluYWwgd2VpZ2h0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhDb21wb25lbnRTY29yZSB7XG4gIHNjb3JlOiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbn1cbmV4cG9ydCB0eXBlIEhlYWx0aEJyZWFrZG93biA9IFJlY29yZDxIZWFsdGhDb21wb25lbnQsIEhlYWx0aENvbXBvbmVudFNjb3JlPjtcblxuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhSZXN1bHQge1xuICAvKiogMOKAkzEwMCBpbnRlZ2VyLCBvciBudWxsIHdpdGggZmV3ZXIgdGhhbiB7QGxpbmsgSEVBTFRIX01JTl9DT01QT05FTlRTfSBjb21wb25lbnRzLiAqL1xuICBzY29yZTogbnVtYmVyIHwgbnVsbDtcbiAgYnJlYWtkb3duOiBIZWFsdGhCcmVha2Rvd247XG59XG5cbi8qKlxuICogV2hhdCB0aGUgc2NvcmUgaXMgY29tcHV0ZWQgZnJvbS4gRXZlcnkgZmllbGQgaXMgb3B0aW9uYWw6IGB1bmRlZmluZWRgIC8gbnVsbFxuICogbWVhbnMgXCJub3Qga25vd25cIiwgd2hpY2ggZHJvcHMgdGhlIGNvbXBvbmVudCAob3IsIGZvciBmcmVzaG5lc3MsIHRoYXQgaGFsZikuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoSW5wdXRzIHtcbiAgLyoqIFRlcm1pbmFsIHJ1bnMgaW4gdGhlIDMwLWRheSB3aW5kb3csIGFuZCB0aGUgc2hhcmUgdGhhdCBzdWNjZWVkZWQgKDAuLjEpLiAqL1xuICBydW5zMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgc3VjY2Vzc1JhdGUzMGQ/OiBudW1iZXIgfCBudWxsO1xuICAvKiogVGhlIGxhdGVzdCBsaXN0ZWQgdmVyc2lvbidzIHNjYW47IGBzY2FubmVkQXRgIG51bGwg4oeSIG5ldmVyIHNjYW5uZWQuICovXG4gIHZ1bG5Dcml0aWNhbD86IG51bWJlciB8IG51bGw7XG4gIHZ1bG5IaWdoPzogbnVtYmVyIHwgbnVsbDtcbiAgc2Nhbm5lZEF0PzogRGF0ZSB8IHN0cmluZyB8IG51bGw7XG4gIC8qKiBXaGVuIHRoZSBsYXRlc3QgbGlzdGVkIHZlcnNpb24gd2FzIHB1Ymxpc2hlZC4gKi9cbiAgbGFzdFJlbGVhc2VBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogVGhlIGxhdGVzdCBsaXN0ZWQgdmVyc2lvbidzIGJhc2UgaW1hZ2UgYGNyZWF0ZWRgIHRpbWUsIHdoZW4gcmVjb3JkZWQuICovXG4gIGJhc2VJbWFnZUNyZWF0ZWRBdD86IERhdGUgfCBzdHJpbmcgfCBudWxsO1xuICAvKiogTGF0ZXN0IGxpc3RlZCB2ZXJzaW9uIGhhcyBhbiBpbWFnZSBkaWdlc3QgQU5EIGEgc2lnbmF0dXJlIChpdHMgYHB1YmxpYy8qYCBjb3B5KS4gKi9cbiAgc2lnbmVkPzogYm9vbGVhbiB8IG51bGw7XG4gIHNtb2tlVGVzdERlY2xhcmVkPzogYm9vbGVhbiB8IG51bGw7XG4gIGhhc1JlYWRtZT86IGJvb2xlYW4gfCBudWxsO1xuICBoYXNMaWNlbnNlPzogYm9vbGVhbiB8IG51bGw7XG4gIHJhdGluZ0JheWVzPzogbnVtYmVyIHwgbnVsbDtcbiAgcmF0aW5nQ291bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuXG5jb25zdCBEQVlfTVMgPSA4Nl80MDBfMDAwO1xuXG5jb25zdCByb3VuZDMgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgucm91bmQobiAqIDEwMDApIC8gMTAwMDtcbmNvbnN0IGNsYW1wMDEgPSAobjogbnVtYmVyKTogbnVtYmVyID0+IE1hdGgubWluKDEsIE1hdGgubWF4KDAsIG4pKTtcblxuZnVuY3Rpb24gdG9UaW1lKGQ6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChkID09PSBudWxsIHx8IGQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHQgPSBuZXcgRGF0ZShkKS5nZXRUaW1lKCk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodCkgPyB0IDogbnVsbDtcbn1cblxuLyoqIDEgdXAgdG8gYGZ1bGxEYXlzYCwgZmFsbGluZyBsaW5lYXJseSB0byAwIGF0IGB6ZXJvRGF5c2AgKGEgZnV0dXJlIGRhdGUgY291bnRzIGFzIGZyZXNoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2VTY29yZShhZ2VEYXlzOiBudW1iZXIsIGZ1bGxEYXlzOiBudW1iZXIsIHplcm9EYXlzOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoYWdlRGF5cyA8PSBmdWxsRGF5cykgcmV0dXJuIDE7XG4gIGlmIChhZ2VEYXlzID49IHplcm9EYXlzKSByZXR1cm4gMDtcbiAgcmV0dXJuIGNsYW1wMDEoMSAtIChhZ2VEYXlzIC0gZnVsbERheXMpIC8gKHplcm9EYXlzIC0gZnVsbERheXMpKTtcbn1cblxuLyoqIFRoZSB2dWxuZXJhYmlsaXR5IGNvbXBvbmVudDogMSDiiJIgMC41wrdjcml0aWNhbCDiiJIgMC4xwrdoaWdoLCBmbG9vcmVkIGF0IDAuICovXG5leHBvcnQgZnVuY3Rpb24gdnVsblNjb3JlKGNyaXRpY2FsOiBudW1iZXIsIGhpZ2g6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBjbGFtcDAxKDEgLSAwLjUgKiBNYXRoLm1heCgwLCBjcml0aWNhbCkgLSAwLjEgKiBNYXRoLm1heCgwLCBoaWdoKSk7XG59XG5cbmZ1bmN0aW9uIHJ1bnRpbWVDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChpLnJ1bnMzMGQgPT09IG51bGwgfHwgaS5ydW5zMzBkID09PSB1bmRlZmluZWQgfHwgaS5ydW5zMzBkIDwgSEVBTFRIX01JTl9SVU5TKSByZXR1cm4gbnVsbDtcbiAgaWYgKGkuc3VjY2Vzc1JhdGUzMGQgPT09IG51bGwgfHwgaS5zdWNjZXNzUmF0ZTMwZCA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoaS5zdWNjZXNzUmF0ZTMwZCkpIHJldHVybiBudWxsO1xuICByZXR1cm4gY2xhbXAwMShpLnN1Y2Nlc3NSYXRlMzBkKTtcbn1cblxuZnVuY3Rpb24gdnVsbnNDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmICh0b1RpbWUoaS5zY2FubmVkQXQpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHZ1bG5TY29yZShpLnZ1bG5Dcml0aWNhbCA/PyAwLCBpLnZ1bG5IaWdoID8/IDApO1xufVxuXG5mdW5jdGlvbiBmcmVzaG5lc3NDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzLCBub3c6IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCBwYXJ0czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgcmVsZWFzZSA9IHRvVGltZShpLmxhc3RSZWxlYXNlQXQpO1xuICBpZiAocmVsZWFzZSAhPT0gbnVsbCkgcGFydHMucHVzaChhZ2VTY29yZSgobm93IC0gcmVsZWFzZSkgLyBEQVlfTVMsIEhFQUxUSF9SRUxFQVNFX0ZVTExfREFZUywgSEVBTFRIX1JFTEVBU0VfWkVST19EQVlTKSk7XG4gIGNvbnN0IGJhc2UgPSB0b1RpbWUoaS5iYXNlSW1hZ2VDcmVhdGVkQXQpO1xuICBpZiAoYmFzZSAhPT0gbnVsbCkgcGFydHMucHVzaChhZ2VTY29yZSgobm93IC0gYmFzZSkgLyBEQVlfTVMsIEhFQUxUSF9CQVNFX0lNQUdFX0ZVTExfREFZUywgSEVBTFRIX0JBU0VfSU1BR0VfWkVST19EQVlTKSk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICByZXR1cm4gcGFydHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCkgLyBwYXJ0cy5sZW5ndGg7XG59XG5cbmNvbnN0IGZsYWcgPSAoYjogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQpOiBudW1iZXIgfCBudWxsID0+IChiID09PSBudWxsIHx8IGIgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBiID8gMSA6IDApO1xuXG5mdW5jdGlvbiBkb2NzQ29tcG9uZW50KGk6IEhlYWx0aElucHV0cyk6IG51bWJlciB8IG51bGwge1xuICBpZiAoKGkuaGFzUmVhZG1lID09PSBudWxsIHx8IGkuaGFzUmVhZG1lID09PSB1bmRlZmluZWQpICYmIChpLmhhc0xpY2Vuc2UgPT09IG51bGwgfHwgaS5oYXNMaWNlbnNlID09PSB1bmRlZmluZWQpKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIChpLmhhc1JlYWRtZSA/IDAuNSA6IDApICsgKGkuaGFzTGljZW5zZSA/IDAuNSA6IDApO1xufVxuXG5mdW5jdGlvbiByYXRpbmdDb21wb25lbnQoaTogSGVhbHRoSW5wdXRzKTogbnVtYmVyIHwgbnVsbCB7XG4gIGlmIChpLnJhdGluZ0NvdW50ID09PSBudWxsIHx8IGkucmF0aW5nQ291bnQgPT09IHVuZGVmaW5lZCB8fCBpLnJhdGluZ0NvdW50IDwgSEVBTFRIX01JTl9SQVRJTkdTKSByZXR1cm4gbnVsbDtcbiAgaWYgKGkucmF0aW5nQmF5ZXMgPT09IG51bGwgfHwgaS5yYXRpbmdCYXllcyA9PT0gdW5kZWZpbmVkIHx8ICFOdW1iZXIuaXNGaW5pdGUoaS5yYXRpbmdCYXllcykpIHJldHVybiBudWxsO1xuICByZXR1cm4gY2xhbXAwMShpLnJhdGluZ0JheWVzIC8gNSk7XG59XG5cbi8qKiBUaGUgaGVhbHRoIHNjb3JlIGFuZCBpdHMgcGVyLWNvbXBvbmVudCBicmVha2Rvd24uIFB1cmU7IGBub3dgIGlzIGluamVjdGFibGUgZm9yIHRlc3RzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVIZWFsdGhTY29yZShpbnB1dHM6IEhlYWx0aElucHV0cywgbm93OiBEYXRlID0gbmV3IERhdGUoKSk6IEhlYWx0aFJlc3VsdCB7XG4gIGNvbnN0IHQgPSBub3cuZ2V0VGltZSgpO1xuICBjb25zdCByYXc6IFJlY29yZDxIZWFsdGhDb21wb25lbnQsIG51bWJlciB8IG51bGw+ID0ge1xuICAgIHJ1bnRpbWU6IHJ1bnRpbWVDb21wb25lbnQoaW5wdXRzKSxcbiAgICB2dWxuczogdnVsbnNDb21wb25lbnQoaW5wdXRzKSxcbiAgICBmcmVzaG5lc3M6IGZyZXNobmVzc0NvbXBvbmVudChpbnB1dHMsIHQpLFxuICAgIHNpZ25lZDogZmxhZyhpbnB1dHMuc2lnbmVkKSxcbiAgICBzbW9rZVRlc3Q6IGZsYWcoaW5wdXRzLnNtb2tlVGVzdERlY2xhcmVkKSxcbiAgICBkb2NzOiBkb2NzQ29tcG9uZW50KGlucHV0cyksXG4gICAgcmF0aW5nOiByYXRpbmdDb21wb25lbnQoaW5wdXRzKSxcbiAgfTtcbiAgY29uc3QgYnJlYWtkb3duID0ge30gYXMgSGVhbHRoQnJlYWtkb3duO1xuICBsZXQgd2VpZ2h0ZWQgPSAwO1xuICBsZXQgdG90YWxXZWlnaHQgPSAwO1xuICBsZXQgYXZhaWxhYmxlID0gMDtcbiAgZm9yIChjb25zdCBjIG9mIEhFQUxUSF9DT01QT05FTlRTKSB7XG4gICAgY29uc3Qgc2NvcmUgPSByYXdbY107XG4gICAgYnJlYWtkb3duW2NdID0geyBzY29yZTogc2NvcmUgPT09IG51bGwgPyBudWxsIDogcm91bmQzKHNjb3JlKSwgd2VpZ2h0OiBIRUFMVEhfV0VJR0hUU1tjXSB9O1xuICAgIGlmIChzY29yZSA9PT0gbnVsbCkgY29udGludWU7XG4gICAgYXZhaWxhYmxlKys7XG4gICAgd2VpZ2h0ZWQgKz0gc2NvcmUgKiBIRUFMVEhfV0VJR0hUU1tjXTtcbiAgICB0b3RhbFdlaWdodCArPSBIRUFMVEhfV0VJR0hUU1tjXTtcbiAgfVxuICBjb25zdCBzY29yZSA9IGF2YWlsYWJsZSA8IEhFQUxUSF9NSU5fQ09NUE9ORU5UUyB8fCB0b3RhbFdlaWdodCA9PT0gMCA/IG51bGwgOiBNYXRoLnJvdW5kKCgxMDAgKiB3ZWlnaHRlZCkgLyB0b3RhbFdlaWdodCk7XG4gIHJldHVybiB7IHNjb3JlLCBicmVha2Rvd24gfTtcbn1cblxuLyoqXG4gKiBBIHB1Ymxpc2hlcidzIGhlYWx0aDogdGhlIGluc3RhbGwtd2VpZ2h0ZWQgbWVhbiBvZiBpdHMgbGlzdGluZ3MnIHNjb3Jlc1xuICogKGxpc3RpbmdzIHdpdGggbm8gc2NvcmUgYXJlIHNraXBwZWQ7IHdoZW4gbm8gbGlzdGluZyBoYXMgaW5zdGFsbHMsIHRoZSBwbGFpblxuICogbWVhbikuIE51bGwgd2hlbiBubyBsaXN0aW5nIGhhcyBhIHNjb3JlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaGVySGVhbHRoU2NvcmUobGlzdGluZ3M6IFJlYWRvbmx5QXJyYXk8eyBoZWFsdGhTY29yZTogbnVtYmVyIHwgbnVsbDsgaW5zdGFsbENvdW50OiBudW1iZXIgfT4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3Qgc2NvcmVkID0gbGlzdGluZ3MuZmlsdGVyKChsKTogbCBpcyB7IGhlYWx0aFNjb3JlOiBudW1iZXI7IGluc3RhbGxDb3VudDogbnVtYmVyIH0gPT5cbiAgICBsLmhlYWx0aFNjb3JlICE9PSBudWxsICYmIE51bWJlci5pc0Zpbml0ZShsLmhlYWx0aFNjb3JlKSk7XG4gIGlmIChzY29yZWQubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgd2VpZ2h0T2YgPSAobjogbnVtYmVyKSA9PiBNYXRoLm1heCgwLCBuKTtcbiAgY29uc3QgdG90YWxJbnN0YWxscyA9IHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyB3ZWlnaHRPZihsLmluc3RhbGxDb3VudCksIDApO1xuICBpZiAodG90YWxJbnN0YWxscyA9PT0gMCkgcmV0dXJuIE1hdGgucm91bmQoc2NvcmVkLnJlZHVjZSgoYSwgbCkgPT4gYSArIGwuaGVhbHRoU2NvcmUsIDApIC8gc2NvcmVkLmxlbmd0aCk7XG4gIHJldHVybiBNYXRoLnJvdW5kKHNjb3JlZC5yZWR1Y2UoKGEsIGwpID0+IGEgKyBsLmhlYWx0aFNjb3JlICogd2VpZ2h0T2YobC5pbnN0YWxsQ291bnQpLCAwKSAvIHRvdGFsSW5zdGFsbHMpO1xufVxuXG4vKipcbiAqIEEgcHVibGlzaGVyJ3MgMzAtZGF5IHN1Y2Nlc3MgcmF0ZSBhY3Jvc3MgaXRzIGxpc3RpbmdzLCB3ZWlnaHRlZCBieSBydW5zLlxuICogTnVsbCB3aGVuIG5vbmUgb2YgaXRzIGxpc3RpbmdzIHJhbiBpbiB0aGUgd2luZG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGlzaGVyU3VjY2Vzc1JhdGUobGlzdGluZ3M6IFJlYWRvbmx5QXJyYXk8eyBzdWNjZXNzUmF0ZTMwZDogbnVtYmVyIHwgbnVsbDsgcnVuczMwZDogbnVtYmVyIH0+KTogbnVtYmVyIHwgbnVsbCB7XG4gIGxldCBydW5zID0gMDtcbiAgbGV0IHN1Y2NlZWRlZCA9IDA7XG4gIGZvciAoY29uc3QgbCBvZiBsaXN0aW5ncykge1xuICAgIGlmIChsLnN1Y2Nlc3NSYXRlMzBkID09PSBudWxsIHx8ICFOdW1iZXIuaXNGaW5pdGUobC5zdWNjZXNzUmF0ZTMwZCkgfHwgbC5ydW5zMzBkIDw9IDApIGNvbnRpbnVlO1xuICAgIHJ1bnMgKz0gbC5ydW5zMzBkO1xuICAgIHN1Y2NlZWRlZCArPSBsLnN1Y2Nlc3NSYXRlMzBkICogbC5ydW5zMzBkO1xuICB9XG4gIHJldHVybiBydW5zID09PSAwID8gbnVsbCA6IHJvdW5kMyhzdWNjZWVkZWQgLyBydW5zKTtcbn1cblxuLyoqIERpc3BsYXkgYmFuZCBmb3IgYSBzY29yZTogZ29vZCDiiaUgODAsIGZhaXIg4omlIDUwLCBwb29yIGJlbG93LCB1bmtub3duIHdoZW4gbnVsbC4gKi9cbmV4cG9ydCB0eXBlIEhlYWx0aEJhbmQgPSAnZ29vZCcgfCAnZmFpcicgfCAncG9vcicgfCAndW5rbm93bic7XG5leHBvcnQgY29uc3QgSEVBTFRIX0JBTkRfR09PRCA9IDgwO1xuZXhwb3J0IGNvbnN0IEhFQUxUSF9CQU5EX0ZBSVIgPSA1MDtcblxuZXhwb3J0IGZ1bmN0aW9uIGhlYWx0aEJhbmQoc2NvcmU6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBIZWFsdGhCYW5kIHtcbiAgaWYgKHNjb3JlID09PSBudWxsIHx8IHNjb3JlID09PSB1bmRlZmluZWQgfHwgIU51bWJlci5pc0Zpbml0ZShzY29yZSkpIHJldHVybiAndW5rbm93bic7XG4gIGlmIChzY29yZSA+PSBIRUFMVEhfQkFORF9HT09EKSByZXR1cm4gJ2dvb2QnO1xuICBpZiAoc2NvcmUgPj0gSEVBTFRIX0JBTkRfRkFJUikgcmV0dXJuICdmYWlyJztcbiAgcmV0dXJuICdwb29yJztcbn1cbiJdfQ==
|
|
@@ -7,25 +7,50 @@ export interface PluginScanFinding {
|
|
|
7
7
|
packageVersion: string;
|
|
8
8
|
/** Versions that fix it; empty = no fix available (not fixable). */
|
|
9
9
|
fixedIn: string[];
|
|
10
|
+
/**
|
|
11
|
+
* CISA lists it as KNOWN EXPLOITED (grype's `knownExploited`). Absent =
|
|
12
|
+
* not listed. A KEV Critical is gated even when unfixable, and only an
|
|
13
|
+
* ADVISORY-ID waiver can exempt it — see {@link applyVulnWaivers}.
|
|
14
|
+
*/
|
|
15
|
+
kev?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* EPSS probability (0–1) that it is exploited in the next 30 days, as grype
|
|
18
|
+
* reports it; absent when the DB carries no score. Context for a reader
|
|
19
|
+
* ranking findings, never a gate input — a probability is not a verdict.
|
|
20
|
+
*/
|
|
21
|
+
epss?: number;
|
|
10
22
|
}
|
|
11
23
|
/**
|
|
12
|
-
* `scan_flag` on a version the nightly rescan flagged: its
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* finds them resolved.
|
|
24
|
+
* `scan_flag` on a version the nightly rescan flagged: its GATED Critical
|
|
25
|
+
* count and fixable High count at that rescan, and the top gated findings. Set
|
|
26
|
+
* while gated findings exceed `PLUGIN_VULN_MAX_FINDINGS`, cleared when a
|
|
27
|
+
* rescan finds them resolved.
|
|
16
28
|
*/
|
|
17
29
|
export interface PluginScanFlag {
|
|
18
|
-
/**
|
|
19
|
-
|
|
30
|
+
/**
|
|
31
|
+
* Gated findings — at or above `failOn` (default Critical): fixable ones,
|
|
32
|
+
* plus unfixable KEV-listed ones under `PLUGIN_VULN_GATE_KEV`.
|
|
33
|
+
*/
|
|
34
|
+
gated: number;
|
|
35
|
+
/** Of `gated`, the KEV-listed ones (CISA known exploited). Absent = none. */
|
|
36
|
+
kev?: number;
|
|
20
37
|
/** Fixable High findings. */
|
|
21
38
|
high: number;
|
|
22
|
-
/** The floor it was compared against (`
|
|
23
|
-
|
|
39
|
+
/** The floor it was compared against (`PLUGIN_VULN_MAX_FINDINGS`). */
|
|
40
|
+
maxFindings: number;
|
|
41
|
+
/**
|
|
42
|
+
* The `PLUGIN_VULN_FAIL_ON` it was gated at, when that was `high` (then
|
|
43
|
+
* `gated` counts Critical AND High findings). Absent = `critical`.
|
|
44
|
+
* Carried on the flag because the services that RENDER it (the resolver,
|
|
45
|
+
* the dashboard) do not share the plugin service's environment.
|
|
46
|
+
*/
|
|
47
|
+
failOn?: 'high';
|
|
24
48
|
/** At most {@link SCAN_FLAG_TOP_FINDINGS} fixable findings, Criticals first. */
|
|
25
49
|
findings: PluginScanFinding[];
|
|
26
50
|
}
|
|
27
51
|
/**
|
|
28
|
-
* `scan_summary` on every
|
|
52
|
+
* `scan_summary` on every scanned version: the LATEST scan's findings — written
|
|
53
|
+
* by the build that established the version and rewritten by every rescan —
|
|
29
54
|
* whether or not the gate tripped.
|
|
30
55
|
*
|
|
31
56
|
* Distinct from {@link PluginScanFlag}, which exists only while a version is over
|
|
@@ -33,37 +58,137 @@ export interface PluginScanFlag {
|
|
|
33
58
|
* report whose job is to show Critical AND High exposure had no source to read.
|
|
34
59
|
* What a report SHOWS and what a build REFUSES are different questions, and
|
|
35
60
|
* conflating them meant the answer to the first was "nothing".
|
|
61
|
+
*
|
|
62
|
+
* It is also the rescan's BASELINE. "Is anything new?" is answered by diffing
|
|
63
|
+
* finding identities against the previous summary ({@link newScanFindings}),
|
|
64
|
+
* not by comparing counts: one CVE fixed and a different one published leaves
|
|
65
|
+
* the count unchanged and hides a brand-new Critical.
|
|
66
|
+
*
|
|
67
|
+
* CONTRACT — read by the reporting / exposure code in pipeline-data. Fields are
|
|
68
|
+
* only ever added; every field below is present on every summary written.
|
|
36
69
|
*/
|
|
37
70
|
export interface PluginScanSummary {
|
|
38
|
-
/** Fixable Critical findings
|
|
71
|
+
/** Fixable Critical findings. */
|
|
39
72
|
criticalFixable: number;
|
|
40
|
-
/** Fixable High findings
|
|
73
|
+
/** Fixable High findings. */
|
|
41
74
|
highFixable: number;
|
|
42
|
-
/** Totals including unfixable findings
|
|
75
|
+
/** Totals including unfixable findings. */
|
|
43
76
|
critical: number;
|
|
44
77
|
high: number;
|
|
45
|
-
|
|
78
|
+
medium: number;
|
|
79
|
+
low: number;
|
|
80
|
+
/** KEV-listed (CISA known exploited) Critical + High findings. */
|
|
81
|
+
kev: number;
|
|
82
|
+
/**
|
|
83
|
+
* EVERY Critical and High finding — fixable AND unfixable — Criticals first,
|
|
84
|
+
* capped at {@link SCAN_SUMMARY_MAX_FINDINGS}. `truncated` says whether the
|
|
85
|
+
* cap cut it; the counts above are never capped.
|
|
86
|
+
*/
|
|
46
87
|
findings: PluginScanFinding[];
|
|
47
|
-
|
|
88
|
+
truncated: boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Keys ({@link scanFindingKey}) of the findings a `PLUGIN_VULN_WAIVERS` entry
|
|
91
|
+
* exempted from the floor at this scan. They are still in `findings` — a
|
|
92
|
+
* waiver changes the verdict, not what the image contains.
|
|
93
|
+
*/
|
|
94
|
+
waived: string[];
|
|
95
|
+
/** When this scan ran (ISO). */
|
|
48
96
|
scannedAt: string;
|
|
97
|
+
/** Which path wrote it. */
|
|
98
|
+
trigger: 'build' | 'rescan' | 'promote';
|
|
49
99
|
/** The image this describes. A version rebuilt on a patched base is a
|
|
50
100
|
* different artifact, so a summary without its digest cannot be trusted. */
|
|
51
|
-
imageDigest
|
|
101
|
+
imageDigest: string;
|
|
102
|
+
/**
|
|
103
|
+
* When the vulnerability DB the scan matched against was BUILT (ISO), or null
|
|
104
|
+
* when it could not be read. A scan is only as current as its DB: a clean
|
|
105
|
+
* result from a week-old DB says nothing about this week's CVEs.
|
|
106
|
+
*/
|
|
107
|
+
dbBuiltAt: string | null;
|
|
108
|
+
/**
|
|
109
|
+
* Executables in the image that NO SBOM package accounts for — UPX-packed or
|
|
110
|
+
* stripped Go, Haskell, GraalVM native images, Node SEA bundles, vendored
|
|
111
|
+
* browsers. The scanner cannot see inside them, so their CVEs are invisible to
|
|
112
|
+
* every count above. Paths, sorted, capped at {@link SCAN_SUMMARY_MAX_BINARIES}.
|
|
113
|
+
* Informational: never a gate.
|
|
114
|
+
*/
|
|
115
|
+
uncataloguedBinaries: string[];
|
|
52
116
|
}
|
|
117
|
+
/** Findings a summary itemizes. Counts are never capped; this bounds the jsonb. */
|
|
118
|
+
export declare const SCAN_SUMMARY_MAX_FINDINGS = 500;
|
|
119
|
+
/** Uncatalogued binaries a summary lists. */
|
|
120
|
+
export declare const SCAN_SUMMARY_MAX_BINARIES = 200;
|
|
121
|
+
/**
|
|
122
|
+
* A finding's identity: the advisory in a specific package version. The same
|
|
123
|
+
* CVE in two packages is two findings; the same CVE reported again after a
|
|
124
|
+
* rescan is the same one.
|
|
125
|
+
*/
|
|
126
|
+
export declare function scanFindingKey(f: Pick<PluginScanFinding, 'id' | 'packageName' | 'packageVersion'>): string;
|
|
127
|
+
/**
|
|
128
|
+
* The Critical/High findings in `after` that the previous summary did not
|
|
129
|
+
* carry — what N31 and an advisory draft are about.
|
|
130
|
+
*
|
|
131
|
+
* No previous summary means no baseline: every finding is new. A TRUNCATED
|
|
132
|
+
* baseline knows only its first {@link SCAN_SUMMARY_MAX_FINDINGS} findings
|
|
133
|
+
* (Criticals first), so a finding missing from it is new only if the baseline
|
|
134
|
+
* provably listed every finding of that severity — otherwise it may simply have
|
|
135
|
+
* been cut, and reporting it as new would be a false alarm on every pass.
|
|
136
|
+
*/
|
|
137
|
+
export declare function newScanFindings(before: Pick<PluginScanSummary, 'findings' | 'truncated' | 'critical'> | null | undefined, after: readonly PluginScanFinding[]): PluginScanFinding[];
|
|
53
138
|
/** Findings a flag / gate message carries. */
|
|
54
139
|
export declare const SCAN_FLAG_TOP_FINDINGS = 10;
|
|
55
140
|
/** Lookup / resolution warning code for a flagged version. */
|
|
56
141
|
export declare const VULN_FLAGGED_WARNING = "VULN_FLAGGED";
|
|
57
142
|
/**
|
|
58
|
-
* `
|
|
59
|
-
*
|
|
143
|
+
* `PLUGIN_VULN_MAX_FINDINGS`: the platform floor — a version with MORE gated
|
|
144
|
+
* findings (fixable, or KEV-listed, at or above `PLUGIN_VULN_FAIL_ON`) than
|
|
145
|
+
* this fails its build (`PLUGIN_VULN_GATE`) and is
|
|
60
146
|
* flagged by the rescan. Default `0`; `-1` disables the floor (and the flag).
|
|
61
147
|
*/
|
|
62
|
-
export declare function
|
|
148
|
+
export declare function pluginVulnMaxFindings(): number;
|
|
149
|
+
/**
|
|
150
|
+
* The lowest severity the floor gates on — the plugin service's `--fail-on`.
|
|
151
|
+
* Only `critical` and `high` are possible: those are the severities a scan
|
|
152
|
+
* itemizes (Medium/Low are counted, never listed), and a floor can only gate on
|
|
153
|
+
* findings it can name, waive and report.
|
|
154
|
+
*/
|
|
155
|
+
export type PluginVulnFailOn = 'critical' | 'high';
|
|
156
|
+
/**
|
|
157
|
+
* `PLUGIN_VULN_FAIL_ON` (default `critical`): the severity at and above which a
|
|
158
|
+
* fixable (or KEV-listed) finding counts against `PLUGIN_VULN_MAX_FINDINGS`.
|
|
159
|
+
* `high` gates Critical AND High. Any other value resolves to `high`, the
|
|
160
|
+
* STRICTER setting: the failure mode of a typo must be "the gate blocks more",
|
|
161
|
+
* never "the gate blocks less".
|
|
162
|
+
*/
|
|
163
|
+
export declare function pluginVulnFailOn(): PluginVulnFailOn;
|
|
164
|
+
/** Whether a severity is at or above the gating threshold. */
|
|
165
|
+
export declare function atOrAboveFailOn(severity: PluginScanFinding['severity'], failOn?: PluginVulnFailOn): boolean;
|
|
166
|
+
/**
|
|
167
|
+
* The scanner's fixable count at or above the threshold — what the floor reads
|
|
168
|
+
* when a scan recorded counts but no findings to derive it from.
|
|
169
|
+
*/
|
|
170
|
+
export declare function gatedFixableCount(counts: {
|
|
171
|
+
vulnCriticalFixable: number | null;
|
|
172
|
+
vulnHighFixable: number | null;
|
|
173
|
+
}, failOn?: PluginVulnFailOn): number;
|
|
174
|
+
/** `Critical` / `Critical or High` — the gated severities, for messages. */
|
|
175
|
+
export declare function failOnLabel(failOn?: PluginVulnFailOn): string;
|
|
176
|
+
/**
|
|
177
|
+
* `PLUGIN_VULN_GATE_KEV` (default true): a Critical CISA lists as known
|
|
178
|
+
* exploited counts against the floor even when it has NO fix. Off, KEV findings
|
|
179
|
+
* are gated exactly like any other Critical (fixable only).
|
|
180
|
+
*/
|
|
181
|
+
export declare function pluginVulnGateKev(): boolean;
|
|
182
|
+
/**
|
|
183
|
+
* Whether a finding counts against the floor: a fixable finding at or above
|
|
184
|
+
* `PLUGIN_VULN_FAIL_ON` (default Critical), or — under `PLUGIN_VULN_GATE_KEV`
|
|
185
|
+
* — a KEV-listed one at or above it with or without a fix.
|
|
186
|
+
*/
|
|
187
|
+
export declare function isGatedFinding(f: Pick<PluginScanFinding, 'severity' | 'fixedIn' | 'kev'>, kevGate?: boolean, failOn?: PluginVulnFailOn): boolean;
|
|
63
188
|
/**
|
|
64
189
|
* A scoped, EXPIRING exemption from the vulnerability floor for one plugin.
|
|
65
190
|
*
|
|
66
|
-
* `
|
|
191
|
+
* `PLUGIN_VULN_MAX_FINDINGS` is the only other lever and it is far too blunt:
|
|
67
192
|
* raising it above 0 exempts every plugin from every Critical. Some images
|
|
68
193
|
* genuinely cannot reach zero — a browser-bundling test runner (artillery ships
|
|
69
194
|
* Chromium through its own @playwright/browser-chromium dependency, playwright
|
|
@@ -75,9 +200,10 @@ export declare function pluginVulnMaxCritical(): number;
|
|
|
75
200
|
* Three properties make this an exemption rather than a hole, and all three are
|
|
76
201
|
* enforced below rather than documented and hoped for:
|
|
77
202
|
*
|
|
78
|
-
* SCOPED to one plugin, to named
|
|
79
|
-
*
|
|
80
|
-
*
|
|
203
|
+
* SCOPED to one plugin (or, fleet-wide, to named advisories only), to
|
|
204
|
+
* named packages/advisories, AND to the system org. A new Critical
|
|
205
|
+
* in anything not named still fails the gate, so a waiver cannot
|
|
206
|
+
* grow silently into "this plugin is exempt". The org bound
|
|
81
207
|
* matters because plugin names are unique per (name, version,
|
|
82
208
|
* orgId) and NOT globally: without it, any tenant could inherit an
|
|
83
209
|
* exemption by naming their plugin `artillery`.
|
|
@@ -88,15 +214,27 @@ export declare function pluginVulnMaxCritical(): number;
|
|
|
88
214
|
* metric, the audit record and the build message instead of
|
|
89
215
|
* vanishing from the count.
|
|
90
216
|
*
|
|
91
|
-
* Format — entries `;`-separated, fields `:`-separated,
|
|
217
|
+
* Format — entries `;`-separated, fields `:`-separated, targets `,`-separated.
|
|
218
|
+
* A target is a package name (`chromium`) or an advisory id (`GO-2026-6612`),
|
|
219
|
+
* matched against the finding's package or id respectively:
|
|
92
220
|
*
|
|
93
221
|
* PLUGIN_VULN_WAIVERS=artillery:2026-12-31:chromium,chrome;playwright:2026-12-31:firefox
|
|
94
222
|
*
|
|
223
|
+
* FLEET-WIDE (`*` as the plugin) is for one advisory that every bundler of a
|
|
224
|
+
* toolchain inherits — a Go stdlib CVE reaches every prebuilt Go binary at once,
|
|
225
|
+
* and listing each plugin hides that it is one decision. It may name ADVISORY
|
|
226
|
+
* IDS ONLY: `*:2026-12-31:stdlib` would waive every present and future stdlib
|
|
227
|
+
* Critical in every plugin, including ones a rebuild could clear, so a package
|
|
228
|
+
* name under `*` is rejected. `*` takes no `@version` (versions are per plugin)
|
|
229
|
+
* and keeps the system-org bound and the expiry:
|
|
230
|
+
*
|
|
231
|
+
* PLUGIN_VULN_WAIVERS=*:2026-12-31:GO-2026-6612,GO-2026-6604
|
|
232
|
+
*
|
|
95
233
|
* A malformed entry is DROPPED, never treated as a wildcard: the failure mode
|
|
96
234
|
* of a typo must be "the gate still blocks", not "everything is waived".
|
|
97
235
|
*/
|
|
98
236
|
export interface VulnWaiver {
|
|
99
|
-
/** Plugin name the waiver applies to (exact match). */
|
|
237
|
+
/** Plugin name the waiver applies to (exact match), or {@link WAIVE_ALL_PLUGINS}. */
|
|
100
238
|
plugin: string;
|
|
101
239
|
/**
|
|
102
240
|
* Plugin version the waiver is limited to, or null for every version.
|
|
@@ -109,9 +247,14 @@ export interface VulnWaiver {
|
|
|
109
247
|
version: string | null;
|
|
110
248
|
/** Inclusive expiry (UTC date). After it the entry has no effect. */
|
|
111
249
|
expires: Date;
|
|
112
|
-
/**
|
|
250
|
+
/**
|
|
251
|
+
* Package names and/or advisory ids whose findings are exempt. Never empty —
|
|
252
|
+
* see parseVulnWaivers. Advisory ids only when `plugin` is `*`.
|
|
253
|
+
*/
|
|
113
254
|
packages: string[];
|
|
114
255
|
}
|
|
256
|
+
/** The `plugin` of a fleet-wide waiver. Advisory ids only — see VulnWaiver. */
|
|
257
|
+
export declare const WAIVE_ALL_PLUGINS = "*";
|
|
115
258
|
/** A dropped entry and why, so the operator can be told instead of guessing. */
|
|
116
259
|
export interface VulnWaiverProblem {
|
|
117
260
|
entry: string;
|
|
@@ -142,37 +285,46 @@ export interface WaiverOutcome {
|
|
|
142
285
|
counted: PluginScanFinding[];
|
|
143
286
|
/** Findings an unexpired waiver exempted (empty when none applied). */
|
|
144
287
|
waived: PluginScanFinding[];
|
|
288
|
+
/** The entries that exempted at least one finding — what "this waiver is still doing something" is measured by. */
|
|
289
|
+
matched: VulnWaiver[];
|
|
145
290
|
}
|
|
291
|
+
/** One waiver entry's identity: the plugin it names (with its pin) and its targets. */
|
|
292
|
+
export declare function vulnWaiverLabels(w: Pick<VulnWaiver, 'plugin' | 'version' | 'packages'>): {
|
|
293
|
+
plugin: string;
|
|
294
|
+
targets: string;
|
|
295
|
+
};
|
|
146
296
|
/**
|
|
147
297
|
* Split findings into what still counts and what an unexpired waiver exempts.
|
|
148
298
|
*
|
|
149
|
-
* Matching is on the package name a waiver names,
|
|
150
|
-
* for findings that are
|
|
151
|
-
*
|
|
299
|
+
* Matching is on the package name or advisory id a waiver names,
|
|
300
|
+
* case-insensitively, and only for findings that are GATED
|
|
301
|
+
* ({@link isGatedFinding}) — an ungated finding never counted toward the floor,
|
|
302
|
+
* so "waiving" it would overstate what the waiver does.
|
|
303
|
+
*
|
|
304
|
+
* A KEV-listed finding is exempted by an ADVISORY-ID target only, never by a
|
|
305
|
+
* package name. `artillery:…:chromium` is a judgement about Chromium's ordinary
|
|
306
|
+
* churn; it was not written about, and must not silently cover, the one
|
|
307
|
+
* Chromium CVE that is being exploited today. Naming that CVE is the deliberate
|
|
308
|
+
* act an exemption for it requires.
|
|
152
309
|
*/
|
|
153
310
|
export declare function applyVulnWaivers(pluginName: string, findings: readonly PluginScanFinding[], waivers?: readonly VulnWaiver[], now?: Date, orgId?: string, pluginVersion?: string): WaiverOutcome;
|
|
154
|
-
/** Whether `
|
|
155
|
-
export declare function exceedsVulnFloor(
|
|
156
|
-
/**
|
|
157
|
-
* `PLUGIN_BLOCK_ON_NEW_CRITICAL` (default false): resolution SKIPS flagged
|
|
158
|
-
* versions for ranges and the default (falling back to the newest unflagged
|
|
159
|
-
* one), and an exact pin to a flagged version is refused 409
|
|
160
|
-
* `PLUGIN_VERSION_VULN_BLOCKED`. Off: flagged versions resolve with a
|
|
161
|
-
* `VULN_FLAGGED` warning.
|
|
162
|
-
*/
|
|
163
|
-
export declare function blockOnNewCritical(): boolean;
|
|
311
|
+
/** Whether `gatedCritical` breaks the platform floor (never, when disabled). */
|
|
312
|
+
export declare function exceedsVulnFloor(gated: number | null | undefined, max?: number): boolean;
|
|
164
313
|
/** `pkg@1.2.3 → 1.2.4` / `pkg@1.2.3 (no fix)`. */
|
|
165
314
|
export declare function describeFix(f: Pick<PluginScanFinding, 'packageName' | 'packageVersion' | 'fixedIn'>): string;
|
|
166
315
|
/** `CVE-1 (openssl@3.0.1 → 3.0.2); CVE-2 (…)` for the first `limit` findings. */
|
|
167
316
|
export declare function describeFindings(findings: readonly PluginScanFinding[], limit?: number): string;
|
|
168
317
|
/** The warning text for a flagged version: `x@v has N fixable Critical findings — rebuild or upgrade`. */
|
|
169
|
-
export declare function vulnFlaggedMessage(ref: string, flag: Pick<PluginScanFlag, '
|
|
318
|
+
export declare function vulnFlaggedMessage(ref: string, flag: Pick<PluginScanFlag, 'gated' | 'kev' | 'failOn'>): string;
|
|
170
319
|
/** A `VULN_FLAGGED` lookup warning (the lookup envelope's `warnings[]` entry). */
|
|
171
320
|
export interface VulnFlaggedWarning {
|
|
172
321
|
code: typeof VULN_FLAGGED_WARNING;
|
|
322
|
+
/** `critical` when a gated finding is on CISA KEV, else `error` (a flag never refuses anything). */
|
|
323
|
+
severity: 'error' | 'critical';
|
|
173
324
|
plugin: string;
|
|
174
325
|
version: string;
|
|
175
|
-
|
|
326
|
+
/** The flag's gated count (see {@link PluginScanFlag.gated}). */
|
|
327
|
+
gated: number;
|
|
176
328
|
high: number;
|
|
177
329
|
message: string;
|
|
178
330
|
/** Top fixable findings with their fixed versions. */
|
|
@@ -180,7 +332,5 @@ export interface VulnFlaggedWarning {
|
|
|
180
332
|
}
|
|
181
333
|
/** Build the `VULN_FLAGGED` warning for `plugin@version`. */
|
|
182
334
|
export declare function vulnFlaggedWarning(plugin: string, version: string, flag: PluginScanFlag): VulnFlaggedWarning;
|
|
183
|
-
/** The 409 message for an exact pin to a flagged version while blocking. */
|
|
184
|
-
export declare function vulnBlockedMessage(plugin: string, version: string, flag: PluginScanFlag): string;
|
|
185
335
|
/** Narrow an unknown `scan_flag` jsonb value. */
|
|
186
336
|
export declare function asScanFlag(value: unknown): PluginScanFlag | null;
|