@pipeline-builder/api-core 5.2.7 → 5.2.9
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/middleware/auth.js +3 -2
- package/lib/middleware/client-version.d.ts +45 -0
- package/lib/middleware/client-version.js +97 -0
- package/lib/middleware/index.d.ts +1 -0
- package/lib/middleware/index.js +2 -1
- package/lib/services/api-key-exchange.d.ts +4 -2
- package/lib/services/api-key-exchange.js +15 -8
- package/lib/services/audit-context.d.ts +3 -0
- package/lib/services/audit-context.js +2 -1
- package/lib/services/scheduler.d.ts +20 -0
- package/lib/services/scheduler.js +33 -1
- package/lib/types/error-codes.d.ts +3 -0
- package/lib/types/error-codes.js +6 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +2 -1
- package/lib/utils/semver.d.ts +18 -0
- package/lib/utils/semver.js +120 -0
- package/package.json +1 -1
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* The small slice of semver the platform needs without a dependency: ordering
|
|
5
|
+
* versions (SemVer 2.0 §11, prereleases included) and checking a version
|
|
6
|
+
* against an `engines`-style range. Shared by the CLI's `--upgrade` and the
|
|
7
|
+
* server's minimum-client-version gate so both order versions identically.
|
|
8
|
+
*/
|
|
9
|
+
const SEMVER = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
10
|
+
function parse(v) {
|
|
11
|
+
const m = SEMVER.exec(v.trim());
|
|
12
|
+
if (!m)
|
|
13
|
+
return null;
|
|
14
|
+
return { nums: [Number(m[1]), Number(m[2]), Number(m[3])], pre: m[4] ? m[4].split('.') : [] };
|
|
15
|
+
}
|
|
16
|
+
/** True for a full `x.y.z[-pre][+build]` version (a leading `v` is allowed). */
|
|
17
|
+
export function isSemver(v) {
|
|
18
|
+
return parse(v) !== null;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* -1 / 0 / 1 ordering of two versions per SemVer §11: numeric x.y.z, a
|
|
22
|
+
* prerelease sorts before its release, and prerelease identifiers compare
|
|
23
|
+
* numerically when both are numeric (`rc.2` < `rc.10`), else as ASCII, with a
|
|
24
|
+
* numeric identifier below an alphanumeric one and a shorter set below a
|
|
25
|
+
* longer one that it prefixes. Throws on a value that isn't a version.
|
|
26
|
+
*/
|
|
27
|
+
export function compareSemver(a, b) {
|
|
28
|
+
const x = parse(a);
|
|
29
|
+
const y = parse(b);
|
|
30
|
+
if (!x || !y)
|
|
31
|
+
throw new Error(`Not a semver version: ${!x ? a : b}`);
|
|
32
|
+
for (let i = 0; i < 3; i++) {
|
|
33
|
+
if (x.nums[i] !== y.nums[i])
|
|
34
|
+
return x.nums[i] < y.nums[i] ? -1 : 1;
|
|
35
|
+
}
|
|
36
|
+
if (!x.pre.length || !y.pre.length) {
|
|
37
|
+
if (x.pre.length === y.pre.length)
|
|
38
|
+
return 0;
|
|
39
|
+
return x.pre.length ? -1 : 1;
|
|
40
|
+
}
|
|
41
|
+
for (let i = 0; i < Math.max(x.pre.length, y.pre.length); i++) {
|
|
42
|
+
const p = x.pre[i];
|
|
43
|
+
const q = y.pre[i];
|
|
44
|
+
if (p === undefined)
|
|
45
|
+
return -1;
|
|
46
|
+
if (q === undefined)
|
|
47
|
+
return 1;
|
|
48
|
+
if (p === q)
|
|
49
|
+
continue;
|
|
50
|
+
const pn = /^\d+$/.test(p);
|
|
51
|
+
const qn = /^\d+$/.test(q);
|
|
52
|
+
if (pn && qn)
|
|
53
|
+
return Number(p) < Number(q) ? -1 : 1;
|
|
54
|
+
if (pn !== qn)
|
|
55
|
+
return pn ? -1 : 1;
|
|
56
|
+
return p < q ? -1 : 1;
|
|
57
|
+
}
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
/** A partial version (`26`, `26.13`) padded to x.y.z, or null. */
|
|
61
|
+
function padded(v) {
|
|
62
|
+
const m = /^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(-[0-9A-Za-z.-]+)?$/.exec(v);
|
|
63
|
+
if (!m)
|
|
64
|
+
return null;
|
|
65
|
+
return `${m[1]}.${m[2] ?? 0}.${m[3] ?? 0}${m[4] ?? ''}`;
|
|
66
|
+
}
|
|
67
|
+
function satisfiesComparator(version, comparator) {
|
|
68
|
+
const m = /^(>=|<=|>|<|=|\^|~)?\s*(.+)$/.exec(comparator);
|
|
69
|
+
if (!m)
|
|
70
|
+
return null;
|
|
71
|
+
const op = m[1] ?? '=';
|
|
72
|
+
const base = padded(m[2]);
|
|
73
|
+
if (!base)
|
|
74
|
+
return null;
|
|
75
|
+
const c = compareSemver(version, base);
|
|
76
|
+
switch (op) {
|
|
77
|
+
case '>=': return c >= 0;
|
|
78
|
+
case '>': return c > 0;
|
|
79
|
+
case '<=': return c <= 0;
|
|
80
|
+
case '<': return c < 0;
|
|
81
|
+
case '=': return c === 0;
|
|
82
|
+
default: {
|
|
83
|
+
// ^ keeps the left-most non-zero part fixed; ~ keeps major.minor fixed.
|
|
84
|
+
const [maj, min] = base.split(/[.-]/).map(Number);
|
|
85
|
+
const upper = op === '~' ? `${maj}.${min + 1}.0` : maj > 0 ? `${maj + 1}.0.0` : `0.${min + 1}.0`;
|
|
86
|
+
return c >= 0 && compareSemver(version, `${upper}-0`) < 0;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Whether `version` satisfies an `engines`-style range: comparator sets joined
|
|
92
|
+
* by `||`, each a space-separated AND of `>=`, `>`, `<=`, `<`, `=`, `^`, `~` or
|
|
93
|
+
* bare versions (partials like `>= 26` allowed). `*` / empty match anything.
|
|
94
|
+
* Returns null when the range uses syntax outside that (hyphen ranges, `x`
|
|
95
|
+
* wildcards), so the caller can decide rather than guess.
|
|
96
|
+
*/
|
|
97
|
+
export function satisfiesRange(version, range) {
|
|
98
|
+
if (!isSemver(version))
|
|
99
|
+
return null;
|
|
100
|
+
const trimmed = range.trim();
|
|
101
|
+
if (trimmed === '' || trimmed === '*')
|
|
102
|
+
return true;
|
|
103
|
+
let any = false;
|
|
104
|
+
for (const set of trimmed.split('||')) {
|
|
105
|
+
// Join an operator to its version (`>= 26.13.0` → `>=26.13.0`), then split.
|
|
106
|
+
const comparators = set.trim().replace(/(>=|<=|>|<|=|\^|~)\s+/g, '$1').split(/\s+/).filter(Boolean);
|
|
107
|
+
let all = true;
|
|
108
|
+
for (const comparator of comparators) {
|
|
109
|
+
const ok = satisfiesComparator(version, comparator);
|
|
110
|
+
if (ok === null)
|
|
111
|
+
return null;
|
|
112
|
+
if (!ok)
|
|
113
|
+
all = false;
|
|
114
|
+
}
|
|
115
|
+
if (all)
|
|
116
|
+
any = true;
|
|
117
|
+
}
|
|
118
|
+
return any;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtdmVyLmpzIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvc2VtdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7O0dBS0c7QUFFSCxNQUFNLE1BQU0sR0FBRyxvRUFBb0UsQ0FBQztBQUlwRixTQUFTLEtBQUssQ0FBQyxDQUFTO0lBQ3RCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEMsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQixPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztBQUNoRyxDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLE1BQU0sVUFBVSxRQUFRLENBQUMsQ0FBUztJQUNoQyxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUM7QUFDM0IsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDaEQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQixJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBQ0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzlELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxTQUFTO1lBQUUsT0FBTyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFLFNBQVM7UUFDdEIsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNCLElBQUksRUFBRSxJQUFJLEVBQUU7WUFBRSxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDO0FBRUQsa0VBQWtFO0FBQ2xFLFNBQVMsTUFBTSxDQUFDLENBQVM7SUFDdkIsTUFBTSxDQUFDLEdBQUcscURBQXFELENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDcEIsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO0FBQzFELENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLE9BQWUsRUFBRSxVQUFrQjtJQUM5RCxNQUFNLENBQUMsR0FBRyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUQsSUFBSSxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNwQixNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDO0lBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUMsQ0FBQztJQUMzQixJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNYLEtBQUssSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6QixLQUFLLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkIsS0FBSyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pCLEtBQUssR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2QixLQUFLLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekIsU0FBUyxDQUFDO1lBQ1Isd0VBQXdFO1lBQ3hFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFxQixDQUFDO1lBQ3RFLE1BQU0sS0FBSyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO1lBQ2pHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxPQUFlLEVBQUUsS0FBYTtJQUMzRCxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixJQUFJLE9BQU8sS0FBSyxFQUFFLElBQUksT0FBTyxLQUFLLEdBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNuRCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7SUFDaEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDdEMsNEVBQTRFO1FBQzVFLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDZixLQUFLLE1BQU0sVUFBVSxJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sRUFBRSxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztZQUNwRCxJQUFJLEVBQUUsS0FBSyxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxFQUFFO2dCQUFFLEdBQUcsR0FBRyxLQUFLLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksR0FBRztZQUFFLEdBQUcsR0FBRyxJQUFJLENBQUM7SUFDdEIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRoZSBzbWFsbCBzbGljZSBvZiBzZW12ZXIgdGhlIHBsYXRmb3JtIG5lZWRzIHdpdGhvdXQgYSBkZXBlbmRlbmN5OiBvcmRlcmluZ1xuICogdmVyc2lvbnMgKFNlbVZlciAyLjAgwqcxMSwgcHJlcmVsZWFzZXMgaW5jbHVkZWQpIGFuZCBjaGVja2luZyBhIHZlcnNpb25cbiAqIGFnYWluc3QgYW4gYGVuZ2luZXNgLXN0eWxlIHJhbmdlLiBTaGFyZWQgYnkgdGhlIENMSSdzIGAtLXVwZ3JhZGVgIGFuZCB0aGVcbiAqIHNlcnZlcidzIG1pbmltdW0tY2xpZW50LXZlcnNpb24gZ2F0ZSBzbyBib3RoIG9yZGVyIHZlcnNpb25zIGlkZW50aWNhbGx5LlxuICovXG5cbmNvbnN0IFNFTVZFUiA9IC9edj8oXFxkKylcXC4oXFxkKylcXC4oXFxkKykoPzotKFswLTlBLVphLXouLV0rKSk/KD86XFwrWzAtOUEtWmEtei4tXSspPyQvO1xuXG5pbnRlcmZhY2UgUGFyc2VkIHsgbnVtczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBwcmU6IHN0cmluZ1tdIH1cblxuZnVuY3Rpb24gcGFyc2Uodjogc3RyaW5nKTogUGFyc2VkIHwgbnVsbCB7XG4gIGNvbnN0IG0gPSBTRU1WRVIuZXhlYyh2LnRyaW0oKSk7XG4gIGlmICghbSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiB7IG51bXM6IFtOdW1iZXIobVsxXSksIE51bWJlcihtWzJdKSwgTnVtYmVyKG1bM10pXSwgcHJlOiBtWzRdID8gbVs0XS5zcGxpdCgnLicpIDogW10gfTtcbn1cblxuLyoqIFRydWUgZm9yIGEgZnVsbCBgeC55LnpbLXByZV1bK2J1aWxkXWAgdmVyc2lvbiAoYSBsZWFkaW5nIGB2YCBpcyBhbGxvd2VkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbXZlcih2OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHBhcnNlKHYpICE9PSBudWxsO1xufVxuXG4vKipcbiAqIC0xIC8gMCAvIDEgb3JkZXJpbmcgb2YgdHdvIHZlcnNpb25zIHBlciBTZW1WZXIgwqcxMTogbnVtZXJpYyB4LnkueiwgYVxuICogcHJlcmVsZWFzZSBzb3J0cyBiZWZvcmUgaXRzIHJlbGVhc2UsIGFuZCBwcmVyZWxlYXNlIGlkZW50aWZpZXJzIGNvbXBhcmVcbiAqIG51bWVyaWNhbGx5IHdoZW4gYm90aCBhcmUgbnVtZXJpYyAoYHJjLjJgIDwgYHJjLjEwYCksIGVsc2UgYXMgQVNDSUksIHdpdGggYVxuICogbnVtZXJpYyBpZGVudGlmaWVyIGJlbG93IGFuIGFscGhhbnVtZXJpYyBvbmUgYW5kIGEgc2hvcnRlciBzZXQgYmVsb3cgYVxuICogbG9uZ2VyIG9uZSB0aGF0IGl0IHByZWZpeGVzLiBUaHJvd3Mgb24gYSB2YWx1ZSB0aGF0IGlzbid0IGEgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVTZW12ZXIoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiAtMSB8IDAgfCAxIHtcbiAgY29uc3QgeCA9IHBhcnNlKGEpO1xuICBjb25zdCB5ID0gcGFyc2UoYik7XG4gIGlmICgheCB8fCAheSkgdGhyb3cgbmV3IEVycm9yKGBOb3QgYSBzZW12ZXIgdmVyc2lvbjogJHsheCA/IGEgOiBifWApO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIGlmICh4Lm51bXNbaV0gIT09IHkubnVtc1tpXSkgcmV0dXJuIHgubnVtc1tpXSEgPCB5Lm51bXNbaV0hID8gLTEgOiAxO1xuICB9XG4gIGlmICgheC5wcmUubGVuZ3RoIHx8ICF5LnByZS5sZW5ndGgpIHtcbiAgICBpZiAoeC5wcmUubGVuZ3RoID09PSB5LnByZS5sZW5ndGgpIHJldHVybiAwO1xuICAgIHJldHVybiB4LnByZS5sZW5ndGggPyAtMSA6IDE7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLm1heCh4LnByZS5sZW5ndGgsIHkucHJlLmxlbmd0aCk7IGkrKykge1xuICAgIGNvbnN0IHAgPSB4LnByZVtpXTtcbiAgICBjb25zdCBxID0geS5wcmVbaV07XG4gICAgaWYgKHAgPT09IHVuZGVmaW5lZCkgcmV0dXJuIC0xO1xuICAgIGlmIChxID09PSB1bmRlZmluZWQpIHJldHVybiAxO1xuICAgIGlmIChwID09PSBxKSBjb250aW51ZTtcbiAgICBjb25zdCBwbiA9IC9eXFxkKyQvLnRlc3QocCk7XG4gICAgY29uc3QgcW4gPSAvXlxcZCskLy50ZXN0KHEpO1xuICAgIGlmIChwbiAmJiBxbikgcmV0dXJuIE51bWJlcihwKSA8IE51bWJlcihxKSA/IC0xIDogMTtcbiAgICBpZiAocG4gIT09IHFuKSByZXR1cm4gcG4gPyAtMSA6IDE7XG4gICAgcmV0dXJuIHAgPCBxID8gLTEgOiAxO1xuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKiogQSBwYXJ0aWFsIHZlcnNpb24gKGAyNmAsIGAyNi4xM2ApIHBhZGRlZCB0byB4Lnkueiwgb3IgbnVsbC4gKi9cbmZ1bmN0aW9uIHBhZGRlZCh2OiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgbSA9IC9edj8oXFxkKykoPzpcXC4oXFxkKykpPyg/OlxcLihcXGQrKSk/KC1bMC05QS1aYS16Li1dKyk/JC8uZXhlYyh2KTtcbiAgaWYgKCFtKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIGAke21bMV19LiR7bVsyXSA/PyAwfS4ke21bM10gPz8gMH0ke21bNF0gPz8gJyd9YDtcbn1cblxuZnVuY3Rpb24gc2F0aXNmaWVzQ29tcGFyYXRvcih2ZXJzaW9uOiBzdHJpbmcsIGNvbXBhcmF0b3I6IHN0cmluZyk6IGJvb2xlYW4gfCBudWxsIHtcbiAgY29uc3QgbSA9IC9eKD49fDw9fD58PHw9fFxcXnx+KT9cXHMqKC4rKSQvLmV4ZWMoY29tcGFyYXRvcik7XG4gIGlmICghbSkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IG9wID0gbVsxXSA/PyAnPSc7XG4gIGNvbnN0IGJhc2UgPSBwYWRkZWQobVsyXSEpO1xuICBpZiAoIWJhc2UpIHJldHVybiBudWxsO1xuICBjb25zdCBjID0gY29tcGFyZVNlbXZlcih2ZXJzaW9uLCBiYXNlKTtcbiAgc3dpdGNoIChvcCkge1xuICAgIGNhc2UgJz49JzogcmV0dXJuIGMgPj0gMDtcbiAgICBjYXNlICc+JzogcmV0dXJuIGMgPiAwO1xuICAgIGNhc2UgJzw9JzogcmV0dXJuIGMgPD0gMDtcbiAgICBjYXNlICc8JzogcmV0dXJuIGMgPCAwO1xuICAgIGNhc2UgJz0nOiByZXR1cm4gYyA9PT0gMDtcbiAgICBkZWZhdWx0OiB7XG4gICAgICAvLyBeIGtlZXBzIHRoZSBsZWZ0LW1vc3Qgbm9uLXplcm8gcGFydCBmaXhlZDsgfiBrZWVwcyBtYWpvci5taW5vciBmaXhlZC5cbiAgICAgIGNvbnN0IFttYWosIG1pbl0gPSBiYXNlLnNwbGl0KC9bLi1dLykubWFwKE51bWJlcikgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgIGNvbnN0IHVwcGVyID0gb3AgPT09ICd+JyA/IGAke21han0uJHttaW4gKyAxfS4wYCA6IG1haiA+IDAgPyBgJHttYWogKyAxfS4wLjBgIDogYDAuJHttaW4gKyAxfS4wYDtcbiAgICAgIHJldHVybiBjID49IDAgJiYgY29tcGFyZVNlbXZlcih2ZXJzaW9uLCBgJHt1cHBlcn0tMGApIDwgMDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGB2ZXJzaW9uYCBzYXRpc2ZpZXMgYW4gYGVuZ2luZXNgLXN0eWxlIHJhbmdlOiBjb21wYXJhdG9yIHNldHMgam9pbmVkXG4gKiBieSBgfHxgLCBlYWNoIGEgc3BhY2Utc2VwYXJhdGVkIEFORCBvZiBgPj1gLCBgPmAsIGA8PWAsIGA8YCwgYD1gLCBgXmAsIGB+YCBvclxuICogYmFyZSB2ZXJzaW9ucyAocGFydGlhbHMgbGlrZSBgPj0gMjZgIGFsbG93ZWQpLiBgKmAgLyBlbXB0eSBtYXRjaCBhbnl0aGluZy5cbiAqIFJldHVybnMgbnVsbCB3aGVuIHRoZSByYW5nZSB1c2VzIHN5bnRheCBvdXRzaWRlIHRoYXQgKGh5cGhlbiByYW5nZXMsIGB4YFxuICogd2lsZGNhcmRzKSwgc28gdGhlIGNhbGxlciBjYW4gZGVjaWRlIHJhdGhlciB0aGFuIGd1ZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2F0aXNmaWVzUmFuZ2UodmVyc2lvbjogc3RyaW5nLCByYW5nZTogc3RyaW5nKTogYm9vbGVhbiB8IG51bGwge1xuICBpZiAoIWlzU2VtdmVyKHZlcnNpb24pKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgdHJpbW1lZCA9IHJhbmdlLnRyaW0oKTtcbiAgaWYgKHRyaW1tZWQgPT09ICcnIHx8IHRyaW1tZWQgPT09ICcqJykgcmV0dXJuIHRydWU7XG4gIGxldCBhbnkgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBzZXQgb2YgdHJpbW1lZC5zcGxpdCgnfHwnKSkge1xuICAgIC8vIEpvaW4gYW4gb3BlcmF0b3IgdG8gaXRzIHZlcnNpb24gKGA+PSAyNi4xMy4wYCDihpIgYD49MjYuMTMuMGApLCB0aGVuIHNwbGl0LlxuICAgIGNvbnN0IGNvbXBhcmF0b3JzID0gc2V0LnRyaW0oKS5yZXBsYWNlKC8oPj18PD18Pnw8fD18XFxefH4pXFxzKy9nLCAnJDEnKS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbiAgICBsZXQgYWxsID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGNvbXBhcmF0b3Igb2YgY29tcGFyYXRvcnMpIHtcbiAgICAgIGNvbnN0IG9rID0gc2F0aXNmaWVzQ29tcGFyYXRvcih2ZXJzaW9uLCBjb21wYXJhdG9yKTtcbiAgICAgIGlmIChvayA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICBpZiAoIW9rKSBhbGwgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGFsbCkgYW55ID0gdHJ1ZTtcbiAgfVxuICByZXR1cm4gYW55O1xufVxuIl19
|