@pipeline-builder/api-core 4.1.13 → 4.1.15
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/README.md +3 -2
- package/lib/constants/index.d.ts +0 -1
- package/lib/constants/index.js +1 -2
- package/lib/errors/app-errors.d.ts +8 -3
- package/lib/errors/app-errors.js +10 -5
- package/lib/helpers/access-helpers.d.ts +4 -6
- package/lib/helpers/access-helpers.js +6 -8
- package/lib/helpers/index.d.ts +3 -3
- package/lib/helpers/index.js +4 -4
- package/lib/helpers/org-hierarchy-http.d.ts +11 -10
- package/lib/helpers/org-hierarchy-http.js +24 -35
- package/lib/helpers/org-hierarchy.d.ts +37 -3
- package/lib/helpers/org-hierarchy.js +45 -4
- package/lib/helpers/restore-helpers.d.ts +44 -24
- package/lib/helpers/restore-helpers.js +41 -52
- package/lib/helpers/sse-helpers.d.ts +29 -7
- package/lib/helpers/sse-helpers.js +36 -9
- package/lib/index.d.ts +16 -14
- package/lib/index.js +17 -15
- package/lib/middleware/assurance.d.ts +116 -0
- package/lib/middleware/assurance.js +176 -0
- package/lib/middleware/auth.d.ts +5 -427
- package/lib/middleware/auth.js +36 -789
- package/lib/middleware/ecosystem-guard.d.ts +47 -0
- package/lib/middleware/ecosystem-guard.js +60 -0
- package/lib/middleware/index.d.ts +11 -4
- package/lib/middleware/index.js +12 -5
- package/lib/middleware/jwt-verify.d.ts +52 -0
- package/lib/middleware/jwt-verify.js +105 -0
- package/lib/middleware/permission-gates.d.ts +133 -0
- package/lib/middleware/permission-gates.js +260 -0
- package/lib/middleware/revocation.d.ts +96 -0
- package/lib/middleware/revocation.js +162 -0
- package/lib/middleware/route-table.d.ts +11 -0
- package/lib/middleware/route-table.js +4 -1
- package/lib/middleware/service-tokens.d.ts +83 -0
- package/lib/middleware/service-tokens.js +158 -0
- package/lib/middleware/step-up.d.ts +2 -2
- package/lib/middleware/step-up.js +8 -7
- package/lib/middleware/system-org.d.ts +20 -0
- package/lib/middleware/system-org.js +25 -0
- package/lib/openapi/routes/plugin-routes.js +133 -10
- package/lib/openapi/schema-registry.js +2 -5
- package/lib/routes/index.d.ts +1 -1
- package/lib/routes/index.js +2 -2
- package/lib/services/api-key-exchange.js +7 -5
- package/lib/services/audit-spool.d.ts +34 -10
- package/lib/services/audit-spool.js +75 -34
- package/lib/services/cache-service.d.ts +7 -0
- package/lib/services/cache-service.js +1 -1
- package/lib/services/circuit-breaker.d.ts +14 -1
- package/lib/services/circuit-breaker.js +36 -10
- package/lib/services/compliance-client.d.ts +10 -2
- package/lib/services/compliance-client.js +17 -10
- package/lib/services/compliance-event-subscriber.js +6 -6
- package/lib/services/durable-event-bus.js +8 -11
- package/lib/services/ecosystem-notify-client.d.ts +32 -0
- package/lib/services/ecosystem-notify-client.js +71 -0
- package/lib/services/env-redis.d.ts +4 -1
- package/lib/services/env-redis.js +32 -3
- package/lib/services/http-client.d.ts +19 -0
- package/lib/services/http-client.js +98 -19
- package/lib/services/index.d.ts +25 -24
- package/lib/services/index.js +25 -22
- package/lib/services/jwks-cache.js +5 -4
- package/lib/services/leader-lock.d.ts +22 -5
- package/lib/services/leader-lock.js +61 -6
- package/lib/services/quota.d.ts +9 -4
- package/lib/services/quota.js +34 -40
- package/lib/services/remote-audit-client.d.ts +28 -32
- package/lib/services/remote-audit-client.js +166 -49
- package/lib/services/retry-forever.js +5 -11
- package/lib/services/retry-strategy.d.ts +1 -1
- package/lib/services/retry-strategy.js +5 -4
- package/lib/services/scheduler.d.ts +8 -3
- package/lib/services/scheduler.js +17 -5
- package/lib/services/service-boot.d.ts +14 -13
- package/lib/services/service-boot.js +18 -15
- package/lib/services/service-keys.d.ts +1 -1
- package/lib/services/service-keys.js +12 -18
- package/lib/services/sse-ticket-store.d.ts +9 -1
- package/lib/services/sse-ticket-store.js +24 -9
- package/lib/services/system-notification.d.ts +27 -0
- package/lib/services/system-notification.js +50 -0
- package/lib/services/token-revocation.d.ts +50 -1
- package/lib/services/token-revocation.js +103 -3
- package/lib/types/audit-events.d.ts +6 -6
- package/lib/types/audit-events.js +1 -1
- package/lib/types/common.d.ts +32 -13
- package/lib/types/common.js +2 -1
- package/lib/types/ecosystem-notifications.d.ts +142 -0
- package/lib/types/ecosystem-notifications.js +210 -0
- package/lib/types/ecosystem.d.ts +77 -0
- package/lib/types/ecosystem.js +119 -0
- package/lib/types/error-codes.d.ts +81 -0
- package/lib/types/error-codes.js +108 -1
- package/lib/types/feature-flags.d.ts +21 -1
- package/lib/types/feature-flags.js +36 -2
- package/lib/types/index.d.ts +14 -9
- package/lib/types/index.js +15 -10
- package/lib/types/permissions.d.ts +46 -8
- package/lib/types/permissions.js +75 -12
- package/lib/types/plugin-catalog.d.ts +35 -0
- package/lib/types/plugin-catalog.js +39 -0
- package/lib/types/plugin-health.d.ts +102 -0
- package/lib/types/plugin-health.js +184 -0
- package/lib/types/quota-tiers.d.ts +15 -0
- package/lib/types/quota-tiers.js +23 -3
- package/lib/types/wire-vocabulary.d.ts +102 -0
- package/lib/types/wire-vocabulary.js +94 -0
- package/lib/utils/alias-resolver.js +2 -2
- package/lib/utils/audit.d.ts +5 -2
- package/lib/utils/audit.js +6 -3
- package/lib/utils/compliance-attributes.js +3 -4
- package/lib/utils/concurrency.d.ts +7 -0
- package/lib/utils/concurrency.js +13 -1
- package/lib/utils/env.d.ts +3 -4
- package/lib/utils/env.js +4 -5
- package/lib/utils/identity.d.ts +13 -4
- package/lib/utils/identity.js +18 -10
- package/lib/utils/index.d.ts +13 -10
- package/lib/utils/index.js +13 -10
- package/lib/utils/jwk.d.ts +4 -0
- package/lib/utils/jwk.js +13 -1
- package/lib/utils/logger.d.ts +1 -1
- package/lib/utils/logger.js +1 -1
- package/lib/utils/object.d.ts +11 -0
- package/lib/utils/object.js +24 -1
- package/lib/utils/params.d.ts +8 -22
- package/lib/utils/params.js +15 -43
- package/lib/utils/plugin-compliance.d.ts +98 -0
- package/lib/utils/plugin-compliance.js +78 -0
- package/lib/utils/proof-of-work.d.ts +69 -0
- package/lib/utils/proof-of-work.js +139 -0
- package/lib/utils/response.d.ts +16 -6
- package/lib/utils/response.js +18 -15
- package/lib/utils/retention.d.ts +17 -0
- package/lib/utils/retention.js +30 -0
- package/lib/utils/secret-encryption.d.ts +7 -7
- package/lib/utils/secret-encryption.js +9 -10
- package/lib/utils/secret-rotation.js +2 -2
- package/lib/utils/sensitive-patterns.js +4 -5
- package/lib/utils/service-registry.d.ts +15 -0
- package/lib/utils/service-registry.js +24 -0
- package/lib/utils/ssrf.d.ts +11 -2
- package/lib/utils/ssrf.js +112 -33
- package/lib/validation/ai-schemas.js +3 -2
- package/lib/validation/common-schemas.d.ts +0 -9
- package/lib/validation/common-schemas.js +1 -7
- package/lib/validation/dockerfile-static.d.ts +26 -0
- package/lib/validation/dockerfile-static.js +210 -0
- package/lib/validation/index.d.ts +13 -4
- package/lib/validation/index.js +14 -5
- package/lib/validation/message-schemas.js +6 -4
- package/lib/validation/pipeline-schemas.d.ts +8 -2
- package/lib/validation/pipeline-schemas.js +30 -4
- package/lib/validation/plugin-base-images.d.ts +20 -0
- package/lib/validation/plugin-base-images.js +17 -0
- package/lib/validation/plugin-catalog-detect.d.ts +86 -0
- package/lib/validation/plugin-catalog-detect.js +237 -0
- package/lib/validation/plugin-catalog-metadata.d.ts +141 -0
- package/lib/validation/plugin-catalog-metadata.js +162 -0
- package/lib/validation/plugin-heuristics.d.ts +41 -0
- package/lib/validation/plugin-heuristics.js +211 -0
- package/lib/validation/plugin-lint.d.ts +18 -0
- package/lib/validation/plugin-lint.js +136 -0
- package/lib/validation/plugin-name-confusable.d.ts +15 -0
- package/lib/validation/plugin-name-confusable.js +81 -0
- package/lib/validation/plugin-schemas.d.ts +40 -26
- package/lib/validation/plugin-schemas.js +26 -23
- package/lib/validation/plugin-spec-schema.d.ts +112 -0
- package/lib/validation/plugin-spec-schema.js +163 -0
- package/lib/validation/plugin-template-contract.d.ts +64 -0
- package/lib/validation/plugin-template-contract.js +113 -0
- package/package.json +69 -4
- package/lib/testing/mock-api-core.d.ts +0 -150
- package/lib/testing/mock-api-core.js +0 -246
- package/lib/testing/mock-drizzle.d.ts +0 -6
- package/lib/testing/mock-drizzle.js +0 -57
- package/lib/testing/route-coverage.d.ts +0 -64
- package/lib/testing/route-coverage.js +0 -183
- package/lib/testing/service-tokens.d.ts +0 -66
- package/lib/testing/service-tokens.js +0 -137
- package/lib/testing/tier-mock.d.ts +0 -44
- package/lib/testing/tier-mock.js +0 -65
- package/lib/testing/user-tokens.d.ts +0 -75
- package/lib/testing/user-tokens.js +0 -115
|
@@ -37,9 +37,6 @@ const DEFAULT_BATCH = 16;
|
|
|
37
37
|
const DEFAULT_BLOCK_MS = 5_000;
|
|
38
38
|
const DEFAULT_MIN_IDLE_MS = 60_000;
|
|
39
39
|
const DEFAULT_MAX_DELIVERIES = 10;
|
|
40
|
-
function errMsg(err) {
|
|
41
|
-
return errorMessage(err);
|
|
42
|
-
}
|
|
43
40
|
function streamKey(topic) {
|
|
44
41
|
return `evt:${topic}`;
|
|
45
42
|
}
|
|
@@ -54,7 +51,7 @@ function publishedAtFromId(id) {
|
|
|
54
51
|
}
|
|
55
52
|
/** True when the error is Redis' "group already exists" (idempotent create). */
|
|
56
53
|
function isBusyGroup(err) {
|
|
57
|
-
return
|
|
54
|
+
return errorMessage(err).includes('BUSYGROUP');
|
|
58
55
|
}
|
|
59
56
|
/**
|
|
60
57
|
* Parse the nested array shape XREADGROUP / XAUTOCLAIM return into flat envelopes.
|
|
@@ -112,7 +109,7 @@ export function createRedisDurableEventBus(redis, opts = {}) {
|
|
|
112
109
|
}
|
|
113
110
|
catch (err) {
|
|
114
111
|
emitCounter('event_bus_publish_failed_total', { topic });
|
|
115
|
-
logger.warn('Event bus publish failed (event dropped)', { topic, error:
|
|
112
|
+
logger.warn('Event bus publish failed (event dropped)', { topic, error: errorMessage(err) });
|
|
116
113
|
return null;
|
|
117
114
|
}
|
|
118
115
|
},
|
|
@@ -129,7 +126,7 @@ export function createRedisDurableEventBus(redis, opts = {}) {
|
|
|
129
126
|
const reader = redis.duplicate();
|
|
130
127
|
// A duplicated ioredis connection doesn't inherit listeners; without one a
|
|
131
128
|
// connection error is an unhandled 'error' event that crashes the process.
|
|
132
|
-
reader.on?.('error', (err) => logger.warn('Event bus reader connection error', { topic, group, error:
|
|
129
|
+
reader.on?.('error', (err) => logger.warn('Event bus reader connection error', { topic, group, error: errorMessage(err) }));
|
|
133
130
|
let stopped = false;
|
|
134
131
|
const deliver = async (envs) => {
|
|
135
132
|
for (const env of envs) {
|
|
@@ -145,7 +142,7 @@ export function createRedisDurableEventBus(redis, opts = {}) {
|
|
|
145
142
|
// Leave it pending (no XACK) — XAUTOCLAIM redelivers it after minIdle.
|
|
146
143
|
emitCounter('event_bus_handler_failed_total', { topic, group });
|
|
147
144
|
logger.warn('Event handler failed; leaving message pending for redelivery', {
|
|
148
|
-
topic, group, id: env.id, error:
|
|
145
|
+
topic, group, id: env.id, error: errorMessage(err),
|
|
149
146
|
});
|
|
150
147
|
}
|
|
151
148
|
}
|
|
@@ -187,7 +184,7 @@ export function createRedisDurableEventBus(redis, opts = {}) {
|
|
|
187
184
|
};
|
|
188
185
|
// The consumer group must exist before XREADGROUP can succeed. Creating it
|
|
189
186
|
// is retried inside the loop: at startup the client may not have connected
|
|
190
|
-
// yet, and a single failed attempt
|
|
187
|
+
// yet, and a single failed attempt would leave the consumer reading a
|
|
191
188
|
// group that was never created — forever.
|
|
192
189
|
let groupReady = false;
|
|
193
190
|
const ensureGroup = async () => {
|
|
@@ -228,9 +225,9 @@ export function createRedisDurableEventBus(redis, opts = {}) {
|
|
|
228
225
|
if (stopped)
|
|
229
226
|
break;
|
|
230
227
|
// The stream or group was deleted out from under us — recreate it.
|
|
231
|
-
if (/NOGROUP/i.test(
|
|
228
|
+
if (/NOGROUP/i.test(errorMessage(err)))
|
|
232
229
|
groupReady = false;
|
|
233
|
-
logger.warn('Event bus consumer loop error; backing off', { topic, group, error:
|
|
230
|
+
logger.warn('Event bus consumer loop error; backing off', { topic, group, error: errorMessage(err) });
|
|
234
231
|
// Back off so a persistent Redis error doesn't hot-spin.
|
|
235
232
|
await new Promise((r) => setTimeout(r, 1000));
|
|
236
233
|
}
|
|
@@ -264,4 +261,4 @@ export function createEnvRedisDurableEventBus(opts = {}) {
|
|
|
264
261
|
logger.info('Redis durable event bus initialized');
|
|
265
262
|
return createRedisDurableEventBus(inst, opts);
|
|
266
263
|
}
|
|
267
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYWJsZS1ldmVudC1idXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZHVyYWJsZS1ldmVudC1idXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQXVFakQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBQzlCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUVsQyxTQUFTLE1BQU0sQ0FBQyxHQUFZO0lBQzFCLE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFhO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhO0lBQy9DLE9BQU8sT0FBTyxLQUFLLE1BQU0sQ0FBQztBQUM1QixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQVMsaUJBQWlCLENBQUMsRUFBVTtJQUNuQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxH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WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7WUFFckYsT0FBTztnQkFDTCxLQUFLLENBQUMsSUFBSTtvQkFDUixPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNmLHdFQUF3RTtvQkFDeEUsd0VBQXdFO29CQUN4RSx5RUFBeUU7b0JBQ3pFLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRSxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUFDLElBQUksR0FBd0IsRUFBRTtJQUMxRSxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBb0IsV0FBVyxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDbkQsT0FBTywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIER1cmFibGUsIGF0LWxlYXN0LW9uY2UgZXZlbnQgYmFja2JvbmUgKFJlZGlzIFN0cmVhbXMpLlxuICpcbiAqIFRoZSBwbGF0Zm9ybSdzIGNyb3NzLXNlcnZpY2Ugc2lnbmFsbGluZyB0b2RheSBpcyBwb2ludC10by1wb2ludCBIVFRQIHBsdXNcbiAqIHBvbGxpbmcgcmVjb25jaWxlcnMgcGx1cyBhbiBJTi1QUk9DRVNTIGJlc3QtZWZmb3J0IGVtaXR0ZXIgKHtAbGluayBlbnRpdHlFdmVudHN9KS5cbiAqIFRoZXJlIGlzIG5vIGR1cmFibGUgYnVzLCBzbyBhIHNpZ25hbCBwcm9kdWNlZCBvbiBvbmUgcG9kIGlzIGVpdGhlciBkZWxpdmVyZWRcbiAqIHN5bmNocm9ub3VzbHkgb3ZlciBIVFRQIChjb3VwbGluZyArIHJldHJ5LXN0b3JtIHJpc2spIG9yIGxvc3QgaWYgdGhlIGNvbnN1bWVyXG4gKiBpcyBtb21lbnRhcmlseSBkb3duICh0aGUgcmVjb25jaWxlcnMgZXhpc3QgdG8gcGFwZXIgb3ZlciBleGFjdGx5IHRoYXQpLlxuICpcbiAqIFRoaXMgaXMgdGhhdCBtaXNzaW5nIGJ1cywgYXMgYSByZXVzYWJsZSBwcmltaXRpdmU6XG4gKiAgLSAqKnB1Ymxpc2godG9waWMsIHBheWxvYWQpKiog4oaSIGBYQUREYCBvbnRvIGEgYm91bmRlZCAoYE1BWExFTiB+YCkgcGVyLXRvcGljXG4gKiAgICBzdHJlYW0uIER1cmFibGUgYWNyb3NzIHJlc3RhcnRzLCBzaGFyZWQgYnkgYWxsIHJlcGxpY2FzLlxuICogIC0gKipzdWJzY3JpYmUoe3RvcGljLCBncm91cCwgY29uc3VtZXIsIGhhbmRsZXJ9KSoqIOKGkiBhIGBYUkVBREdST1VQYCBjb25zdW1lclxuICogICAgb24gaXRzIE9XTiBjb25uZWN0aW9uIChgZHVwbGljYXRlKClgKSwgc28gYSBibG9ja2luZyByZWFkIG5ldmVyIGRlbGF5cyBhXG4gKiAgICBwdWJsaXNoLiBDb25zdW1lciBHUk9VUFMgZ2l2ZSBhdC1sZWFzdC1vbmNlOiBlYWNoIGdyb3VwIGdldHMgZXZlcnkgbWVzc2FnZVxuICogICAgb25jZSwgYSBtZXNzYWdlIHN0YXlzIHBlbmRpbmcgdW50aWwgdGhlIGhhbmRsZXIgYFhBQ0tgcyBpdCwgYW5kIGBYQVVUT0NMQUlNYFxuICogICAgcmVjbGFpbXMgbWVzc2FnZXMgc3RyYW5kZWQgYnkgYSBjcmFzaGVkIGNvbnN1bWVyLiBBIG1lc3NhZ2UgdGhhdCBoYXMgYmVlblxuICogICAgZGVsaXZlcmVkIGBtYXhEZWxpdmVyaWVzYCB0aW1lcyB3aXRob3V0IGFuIGFjayBpcyBtb3ZlZCB0byBhIGRlYWQtbGV0dGVyXG4gKiAgICBzdHJlYW0gKGBldnQ6PHRvcGljPjpkbHFgKSBhbmQgYWNrZWQsIHNvIGEgcG9pc29uIG1lc3NhZ2UgY2FuJ3QgcmVkZWxpdmVyXG4gKiAgICBmb3JldmVyLiBNdWx0aXBsZSBncm91cHMgb24gb25lIHRvcGljID0gaW5kZXBlbmRlbnQgZmFuLW91dC5cbiAqXG4gKiBGQUlMLVNBRkUgKyBPUFQtSU4sIGV4YWN0bHkgbGlrZSB0aGUgYXVkaXQgc3Bvb2w6IHtAbGluayBjcmVhdGVFbnZSZWRpc0R1cmFibGVFdmVudEJ1c31cbiAqIHJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCwgc28gYSBzZXJ2aWNlIHdpdGhvdXQgaXQgc2ltcGx5XG4gKiBkb2Vzbid0IHVzZSB0aGUgYnVzIChrZWVwcyB0b2RheSdzIGJlaGF2aW9yKS4gQSBwdWJsaXNoIGZhaWx1cmUgaXMgZHJvcHBlZC13aXRoLVxuICogLW1ldHJpYywgbmV2ZXIgdGhyb3duOyBhIGhhbmRsZXIgdGhyb3cgbGVhdmVzIHRoZSBtZXNzYWdlIHVuLWFja2VkIGZvciByZWRlbGl2ZXJ5LlxuICpcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdkdXJhYmxlLWV2ZW50LWJ1cycpO1xuXG4vKiogQSBkZWxpdmVyZWQgZXZlbnQ6IGl0cyBzdHJlYW0gaWQsIHRvcGljLCBwdWJsaXNoIHRpbWUsIGFuZCBkZWNvZGVkIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50RW52ZWxvcGU8VCA9IHVua25vd24+IHtcbiAgLyoqIFJlZGlzIFN0cmVhbSBlbnRyeSBpZCAoYDxtcz4tPHNlcT5gKSDigJQgYWxzbyB0aGUgaWRlbXBvdGVuY3kgaGFuZGxlLiAqL1xuICBpZDogc3RyaW5nO1xuICB0b3BpYzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGUgZXZlbnQgd2FzIHB1Ymxpc2hlZCAodGhlIFJlZGlzIHNlcnZlciB0aW1lIGVtYmVkZGVkIGluIHRoZSBzdHJlYW1cbiAgICogaWQpLiBBIHJlZGVsaXZlcnkga2VlcHMgaXRzIE9SSUdJTkFMIHB1Ymxpc2ggdGltZSwgc28gYSBjb25zdW1lciBhcHBseWluZ1xuICAgKiBsYXN0LXdyaXRlci13aW5zIHN0YXRlIChlLmcuIGFuIGVudGl0bGVtZW50IHN5bmMpIGNhbiBvcmRlciBldmVudHMgYnkgaXRcbiAgICogaW5zdGVhZCBvZiBieSBkZWxpdmVyeSB0aW1lIGFuZCByZWZ1c2UgdG8gbGV0IGEgc3RhbGUgcmV0cnkgb3ZlcndyaXRlIGFcbiAgICogbmV3ZXIgc3RhdGUuXG4gICAqL1xuICBwdWJsaXNoZWRBdDogRGF0ZTtcbiAgcGF5bG9hZDogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpYmVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gIC8qKiBUb3BpYyAoc3RyZWFtKSB0byBjb25zdW1lLiAqL1xuICB0b3BpYzogc3RyaW5nO1xuICAvKiogQ29uc3VtZXIgZ3JvdXAg4oCUIG9uZSBkZWxpdmVyeSBwZXIgZ3JvdXA7IGRpc3RpbmN0IGdyb3VwcyBmYW4gb3V0LiAqL1xuICBncm91cDogc3RyaW5nO1xuICAvKiogVGhpcyBjb25zdW1lcidzIGlkIHdpdGhpbiB0aGUgZ3JvdXAgKGUuZy4gYCR7c2VydmljZX0tJHtwaWR9YCkuICovXG4gIGNvbnN1bWVyOiBzdHJpbmc7XG4gIC8qKiBBc3luYyBoYW5kbGVyLiBSZXNvbHZlcyDih5IgdGhlIG1lc3NhZ2UgaXMgYWNrZWQ7IHRocm93cyDih5IgbGVmdCBwZW5kaW5nIGZvciByZWRlbGl2ZXJ5LiAqL1xuICBoYW5kbGVyOiAoZW52OiBFdmVudEVudmVsb3BlPFQ+KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogTWF4IG1lc3NhZ2VzIHBlciByZWFkIChkZWZhdWx0IDE2KS4gKi9cbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKiogWFJFQURHUk9VUCBibG9jayB0aW1lIGluIG1zIChkZWZhdWx0IDUwMDApLiAqL1xuICBibG9ja01zPzogbnVtYmVyO1xuICAvKiogQSBwZW5kaW5nIG1lc3NhZ2UgaWRsZSB0aGlzIGxvbmcgKG1zKSBpcyByZWNsYWltZWQgZnJvbSBhIGRlYWQgY29uc3VtZXIgKGRlZmF1bHQgNjAwMDApLiAqL1xuICBtaW5JZGxlTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBEZWxpdmVyaWVzIGFmdGVyIHdoaWNoIGFuIHVuLWFja2VkIG1lc3NhZ2UgaXMgZGVhZC1sZXR0ZXJlZCB0b1xuICAgKiBgZXZ0Ojx0b3BpYz46ZGxxYCBhbmQgYWNrZWQgaW5zdGVhZCBvZiBiZWluZyByZWRlbGl2ZXJlZCBhZ2FpbiAoZGVmYXVsdCAxMCkuXG4gICAqL1xuICBtYXhEZWxpdmVyaWVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U3Vic2NyaXB0aW9uIHtcbiAgLyoqIFN0b3AgdGhlIGNvbnN1bWVyIGxvb3AuIFJlc29sdmVzIG9uY2UgdGhlIGluLWZsaWdodCByZWFkIHJldHVybnMuICovXG4gIHN0b3AoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhYmxlRXZlbnRCdXMge1xuICAvKiogUHVibGlzaCBhIHBheWxvYWQgdG8gYSB0b3BpYy4gUmV0dXJucyB0aGUgc3RyZWFtIGlkLCBvciBudWxsIG9uIGZhaWx1cmUgKGRyb3BwZWQsIG5ldmVyIHRocm93cykuICovXG4gIHB1Ymxpc2g8VD4odG9waWM6IHN0cmluZywgcGF5bG9hZDogVCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIC8qKiBTdGFydCBhIGNvbnN1bWVyLWdyb3VwIHJlYWRlciBmb3IgYSB0b3BpYy4gRmlyZS1hbmQtZm9yZ2V0IGxvb3A7IGNhbGwgYHN0b3AoKWAgdG8gZW5kIGl0LiAqL1xuICBzdWJzY3JpYmU8VD4ob3B0czogU3Vic2NyaWJlT3B0aW9uczxUPik6IEV2ZW50U3Vic2NyaXB0aW9uO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgaW9yZWRpcycgU3RyZWFtIEFQSSB0aGUgYnVzIHVzZXMuIEtlcHQgbWluaW1hbCBzbyBhIHRlc3QgY2FuXG4gKiBzdXBwbHkgYW4gaW4tbWVtb3J5IGZha2UgYW5kIHNvIG1lcmVseSBpbXBvcnRpbmcgdGhpcyBuZXZlciBoYXJkLWRlcGVuZHMgb25cbiAqIGlvcmVkaXMgKGNvbnN0cnVjdGVkIHZpYSB0aGUgc2hhcmVkIGVudiBoZWxwZXIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzU3RyZWFtQ2xpZW50IHtcbiAgeGFkZChrZXk6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHhncm91cCguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeHJlYWRncm91cCguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeGFjayhrZXk6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgLi4uaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgeGF1dG9jbGFpbSguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeHBlbmRpbmcoa2V5OiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICB4cmFuZ2Uoa2V5OiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqIEEgbmV3IGNvbm5lY3Rpb24gd2l0aCB0aGUgc2FtZSBvcHRpb25zIOKAlCBlYWNoIHN1YnNjcmliZXIgcmVhZHMgb24gaXRzIG93bi4gKi9cbiAgZHVwbGljYXRlKCk6IFJlZGlzU3RyZWFtQ2xpZW50O1xuICBxdWl0PygpOiBQcm9taXNlPHVua25vd24+O1xuICBvbj8oZXZlbnQ6ICdlcnJvcicsIGNiOiAoZXJyOiB1bmtub3duKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuY29uc3QgREVGQVVMVF9NQVhMRU4gPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX0JBVENIID0gMTY7XG5jb25zdCBERUZBVUxUX0JMT0NLX01TID0gNV8wMDA7XG5jb25zdCBERUZBVUxUX01JTl9JRExFX01TID0gNjBfMDAwO1xuY29uc3QgREVGQVVMVF9NQVhfREVMSVZFUklFUyA9IDEwO1xuXG5mdW5jdGlvbiBlcnJNc2coZXJyOiB1bmtub3duKTogc3RyaW5nIHtcbiAgcmV0dXJuIGVycm9yTWVzc2FnZShlcnIpO1xufVxuXG5mdW5jdGlvbiBzdHJlYW1LZXkodG9waWM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZXZ0OiR7dG9waWN9YDtcbn1cblxuLyoqIERlYWQtbGV0dGVyIHN0cmVhbSBmb3IgYSB0b3BpYy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWFkTGV0dGVyU3RyZWFtS2V5KHRvcGljOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGV2dDoke3RvcGljfTpkbHFgO1xufVxuXG4vKiogUHVibGlzaCB0aW1lIGZyb20gYSBzdHJlYW0gaWQgKGA8bXM+LTxzZXE+YCk7IGVwb2NoIDAgZm9yIGFuIHVucGFyc2VhYmxlIGlkLiAqL1xuZnVuY3Rpb24gcHVibGlzaGVkQXRGcm9tSWQoaWQ6IHN0cmluZyk6IERhdGUge1xuICBjb25zdCBtcyA9IE51bWJlcihpZC5zcGxpdCgnLScpWzBdKTtcbiAgcmV0dXJuIG5ldyBEYXRlKE51bWJlci5pc0Zpbml0ZShtcykgPyBtcyA6IDApO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoZSBlcnJvciBpcyBSZWRpcycgXCJncm91cCBhbHJlYWR5IGV4aXN0c1wiIChpZGVtcG90ZW50IGNyZWF0ZSkuICovXG5mdW5jdGlvbiBpc0J1c3lHcm91cChlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVyck1zZyhlcnIpLmluY2x1ZGVzKCdCVVNZR1JPVVAnKTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgbmVzdGVkIGFycmF5IHNoYXBlIFhSRUFER1JPVVAgLyBYQVVUT0NMQUlNIHJldHVybiBpbnRvIGZsYXQgZW52ZWxvcGVzLlxuICogWFJFQURHUk9VUDogYFtbc3RyZWFtS2V5LCBbW2lkLCBbZiwgdiwgLi4uXV0sIC4uLl1dXWAuXG4gKiBYQVVUT0NMQUlNOiBgW25leHRDdXJzb3IsIFtbaWQsIFtmLCB2LCAuLi5dXSwgLi4uXSwgZGVsZXRlZElkc11gLlxuICogV2Ugc3RvcmUgdGhlIEpTT04gcGF5bG9hZCB1bmRlciBhIHNpbmdsZSBmaWVsZCBgZGAuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRW50cmllczxUPih0b3BpYzogc3RyaW5nLCBlbnRyaWVzOiB1bmtub3duKTogRXZlbnRFbnZlbG9wZTxUPltdIHtcbiAgY29uc3Qgb3V0OiBFdmVudEVudmVsb3BlPFQ+W10gPSBbXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpKSByZXR1cm4gb3V0O1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cnkpIHx8IGVudHJ5Lmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGlkID0gU3RyaW5nKGVudHJ5WzBdKTtcbiAgICBjb25zdCBmaWVsZHMgPSBlbnRyeVsxXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRzKSkgY29udGludWU7XG4gICAgLy8gZmllbGRzIGlzIFtuYW1lLCB2YWx1ZSwgbmFtZSwgdmFsdWUsIC4uLl07IGZpbmQgJ2QnLlxuICAgIGxldCByYXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSArIDEgPCBmaWVsZHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmIChTdHJpbmcoZmllbGRzW2ldKSA9PT0gJ2QnKSB7IHJhdyA9IFN0cmluZyhmaWVsZHNbaSArIDFdKTsgYnJlYWs7IH1cbiAgICB9XG4gICAgLy8gQSBtaXNzaW5nIGBkYCBmaWVsZCAoYW4gZW50cnkgbm90IHdyaXR0ZW4gYnkgcHVibGlzaCgpKSBPUiBhIGNvcnJ1cHQgSlNPTlxuICAgIC8vIHBheWxvYWQgYm90aCB5aWVsZCBhbiB1bmRlZmluZWQtcGF5bG9hZCBlbnZlbG9wZSBzbyBgZGVsaXZlcigpYCBBQ0tzIGl0IOKAlFxuICAgIC8vIGEgcG9pc29uIG1lc3NhZ2UgbXVzdCBuZXZlciB3ZWRnZSB0aGUgZ3JvdXAgYnkgc3RheWluZyBwZXJwZXR1YWxseSBwZW5kaW5nLlxuICAgIGNvbnN0IHB1Ymxpc2hlZEF0ID0gcHVibGlzaGVkQXRGcm9tSWQoaWQpO1xuICAgIGlmIChyYXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3V0LnB1c2goeyBpZCwgdG9waWMsIHB1Ymxpc2hlZEF0LCBwYXlsb2FkOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBvdXQucHVzaCh7IGlkLCB0b3BpYywgcHVibGlzaGVkQXQsIHBheWxvYWQ6IEpTT04ucGFyc2UocmF3KSBhcyBUIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgb3V0LnB1c2goeyBpZCwgdG9waWMsIHB1Ymxpc2hlZEF0LCBwYXlsb2FkOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQnVpbGQgYSBkdXJhYmxlIGV2ZW50IGJ1cyBvdmVyIGEgUmVkaXMgU3RyZWFtcyBjbGllbnQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNEdXJhYmxlRXZlbnRCdXMoXG4gIHJlZGlzOiBSZWRpc1N0cmVhbUNsaWVudCxcbiAgb3B0czogeyBtYXhMZW4/OiBudW1iZXIgfSA9IHt9LFxuKTogRHVyYWJsZUV2ZW50QnVzIHtcbiAgY29uc3QgbWF4TGVuID0gTWF0aC5tYXgoMSwgb3B0cy5tYXhMZW4gPz8gREVGQVVMVF9NQVhMRU4pO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgcHVibGlzaDxUPih0b3BpYzogc3RyaW5nLCBwYXlsb2FkOiBUKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICBjb25zdCBrZXkgPSBzdHJlYW1LZXkodG9waWMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gTUFYTEVOIH4gPG4+IGJvdW5kcyB0aGUgc3RyZWFtIGFwcHJveGltYXRlbHkgKGNoZWFwKTsgYCpgID0gc2VydmVyIGlkLlxuICAgICAgICBjb25zdCBpZCA9IGF3YWl0IHJlZGlzLnhhZGQoa2V5LCAnTUFYTEVOJywgJ34nLCBtYXhMZW4sICcqJywgJ2QnLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfcHVibGlzaGVkX3RvdGFsJywgeyB0b3BpYyB9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfcHVibGlzaF9mYWlsZWRfdG90YWwnLCB7IHRvcGljIH0pO1xuICAgICAgICBsb2dnZXIud2FybignRXZlbnQgYnVzIHB1Ymxpc2ggZmFpbGVkIChldmVudCBkcm9wcGVkKScsIHsgdG9waWMsIGVycm9yOiBlcnJNc2coZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN1YnNjcmliZTxUPihzdWJPcHRzOiBTdWJzY3JpYmVPcHRpb25zPFQ+KTogRXZlbnRTdWJzY3JpcHRpb24ge1xuICAgICAgY29uc3QgeyB0b3BpYywgZ3JvdXAsIGNvbnN1bWVyLCBoYW5kbGVyIH0gPSBzdWJPcHRzO1xuICAgICAgY29uc3Qga2V5ID0gc3RyZWFtS2V5KHRvcGljKTtcbiAgICAgIGNvbnN0IGRscUtleSA9IGRlYWRMZXR0ZXJTdHJlYW1LZXkodG9waWMpO1xuICAgICAgY29uc3QgYmF0Y2ggPSBNYXRoLm1heCgxLCBzdWJPcHRzLmJhdGNoU2l6ZSA/PyBERUZBVUxUX0JBVENIKTtcbiAgICAgIGNvbnN0IGJsb2NrTXMgPSBNYXRoLm1heCgwLCBzdWJPcHRzLmJsb2NrTXMgPz8gREVGQVVMVF9CTE9DS19NUyk7XG4gICAgICBjb25zdCBtaW5JZGxlID0gTWF0aC5tYXgoMCwgc3ViT3B0cy5taW5JZGxlTXMgPz8gREVGQVVMVF9NSU5fSURMRV9NUyk7XG4gICAgICBjb25zdCBtYXhEZWxpdmVyaWVzID0gTWF0aC5tYXgoMSwgc3ViT3B0cy5tYXhEZWxpdmVyaWVzID8/IERFRkFVTFRfTUFYX0RFTElWRVJJRVMpO1xuXG4gICAgICAvLyBgWFJFQURHUk9VUCBCTE9DS2AgaG9sZHMgaXRzIGNvbm5lY3Rpb24gZm9yIHVwIHRvIGBibG9ja01zYDsgb24gdGhlXG4gICAgICAvLyBzaGFyZWQgY2xpZW50IGV2ZXJ5IHB1Ymxpc2ggcXVldWVkIGJlaGluZCBpdC4gUmVhZCBvbiBhIGRlZGljYXRlZCBvbmUuXG4gICAgICBjb25zdCByZWFkZXIgPSByZWRpcy5kdXBsaWNhdGUoKTtcbiAgICAgIC8vIEEgZHVwbGljYXRlZCBpb3JlZGlzIGNvbm5lY3Rpb24gZG9lc24ndCBpbmhlcml0IGxpc3RlbmVyczsgd2l0aG91dCBvbmUgYVxuICAgICAgLy8gY29ubmVjdGlvbiBlcnJvciBpcyBhbiB1bmhhbmRsZWQgJ2Vycm9yJyBldmVudCB0aGF0IGNyYXNoZXMgdGhlIHByb2Nlc3MuXG4gICAgICByZWFkZXIub24/LignZXJyb3InLCAoZXJyKSA9PiBsb2dnZXIud2FybignRXZlbnQgYnVzIHJlYWRlciBjb25uZWN0aW9uIGVycm9yJywgeyB0b3BpYywgZ3JvdXAsIGVycm9yOiBlcnJNc2coZXJyKSB9KSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGRlbGl2ZXIgPSBhc3luYyAoZW52czogRXZlbnRFbnZlbG9wZTxUPltdKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZW52IG9mIGVudnMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGVudi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIGF3YWl0IGhhbmRsZXIoZW52KTtcbiAgICAgICAgICAgIC8vIEFjayBvbiBzdWNjZXNzIE9SIG9uIGFuIHVuZGVmaW5lZCAoY29ycnVwdCkgcGF5bG9hZCDigJQgYSBwb2lzb25cbiAgICAgICAgICAgIC8vIG1lc3NhZ2UgbXVzdCBub3QgYmxvY2sgdGhlIGdyb3VwIGZvcmV2ZXIuXG4gICAgICAgICAgICBhd2FpdCByZWFkZXIueGFjayhrZXksIGdyb3VwLCBlbnYuaWQpO1xuICAgICAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19kZWxpdmVyZWRfdG90YWwnLCB7IHRvcGljLCBncm91cCB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIExlYXZlIGl0IHBlbmRpbmcgKG5vIFhBQ0spIOKAlCBYQVVUT0NMQUlNIHJlZGVsaXZlcnMgaXQgYWZ0ZXIgbWluSWRsZS5cbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfaGFuZGxlcl9mYWlsZWRfdG90YWwnLCB7IHRvcGljLCBncm91cCB9KTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFdmVudCBoYW5kbGVyIGZhaWxlZDsgbGVhdmluZyBtZXNzYWdlIHBlbmRpbmcgZm9yIHJlZGVsaXZlcnknLCB7XG4gICAgICAgICAgICAgIHRvcGljLCBncm91cCwgaWQ6IGVudi5pZCwgZXJyb3I6IGVyck1zZyhlcnIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIE1vdmUgZXZlcnkgaWRsZSBwZW5kaW5nIG1lc3NhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRlbGl2ZXJlZFxuICAgICAgICogYG1heERlbGl2ZXJpZXNgIHRpbWVzIHRvIHRoZSBkZWFkLWxldHRlciBzdHJlYW0gYW5kIGFjayBpdC4gVGhlIGVudHJ5XG4gICAgICAgKiBrZWVwcyBpdHMgcGF5bG9hZCBwbHVzIHdoZXJlIGl0IGNhbWUgZnJvbSwgc28gYW4gb3BlcmF0b3IgY2FuIGluc3BlY3Qgb3JcbiAgICAgICAqIHJlcGxheSBpdC4gSWYgY29weWluZyBmYWlscyB0aGUgbWVzc2FnZSBpcyBsZWZ0IHBlbmRpbmcgKHJldHJpZWQgbmV4dFxuICAgICAgICogcGFzcykg4oCUIGl0IGlzIG5ldmVyIGFja2VkIHdpdGhvdXQgYmVpbmcgcHJlc2VydmVkLlxuICAgICAgICovXG4gICAgICBjb25zdCBkZWFkTGV0dGVyRXhoYXVzdGVkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgcmVhZGVyLnhwZW5kaW5nKGtleSwgZ3JvdXAsICdJRExFJywgbWluSWRsZSwgJy0nLCAnKycsIGJhdGNoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBlbmRpbmcpKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwZW5kaW5nKSB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHApIHx8IHAubGVuZ3RoIDwgNCkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgaWQgPSBTdHJpbmcocFswXSk7XG4gICAgICAgICAgY29uc3QgZGVsaXZlcmllcyA9IE51bWJlcihwWzNdKTtcbiAgICAgICAgICBpZiAoIShkZWxpdmVyaWVzID49IG1heERlbGl2ZXJpZXMpKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGVyLnhyYW5nZShrZXksIGlkLCBpZCk7XG4gICAgICAgICAgY29uc3QgZmllbGRzID0gQXJyYXkuaXNBcnJheShlbnRyaWVzKSAmJiBBcnJheS5pc0FycmF5KGVudHJpZXNbMF0pICYmIEFycmF5LmlzQXJyYXkoZW50cmllc1swXVsxXSkgPyBlbnRyaWVzWzBdWzFdIDogW107XG4gICAgICAgICAgbGV0IHJhdyA9ICcnO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpICsgMSA8IGZpZWxkcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgaWYgKFN0cmluZyhmaWVsZHNbaV0pID09PSAnZCcpIHsgcmF3ID0gU3RyaW5nKGZpZWxkc1tpICsgMV0pOyBicmVhazsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCByZWFkZXIueGFkZChcbiAgICAgICAgICAgIGRscUtleSwgJ01BWExFTicsICd+JywgbWF4TGVuLCAnKicsXG4gICAgICAgICAgICAnZCcsIHJhdywgJ3NvdXJjZUlkJywgaWQsICdncm91cCcsIGdyb3VwLCAnZGVsaXZlcmllcycsIGRlbGl2ZXJpZXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCByZWFkZXIueGFjayhrZXksIGdyb3VwLCBpZCk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19kZWFkX2xldHRlcmVkX3RvdGFsJywgeyB0b3BpYywgZ3JvdXAgfSk7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdFdmVudCBleGNlZWRlZCBtYXggZGVsaXZlcmllczsgbW92ZWQgdG8gZGVhZC1sZXR0ZXIgc3RyZWFtJywge1xuICAgICAgICAgICAgdG9waWMsIGdyb3VwLCBpZCwgZGVsaXZlcmllcywgZGVhZExldHRlclN0cmVhbTogZGxxS2V5LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBUaGUgY29uc3VtZXIgZ3JvdXAgbXVzdCBleGlzdCBiZWZvcmUgWFJFQURHUk9VUCBjYW4gc3VjY2VlZC4gQ3JlYXRpbmcgaXRcbiAgICAgIC8vIGlzIHJldHJpZWQgaW5zaWRlIHRoZSBsb29wOiBhdCBzdGFydHVwIHRoZSBjbGllbnQgbWF5IG5vdCBoYXZlIGNvbm5lY3RlZFxuICAgICAgLy8geWV0LCBhbmQgYSBzaW5nbGUgZmFpbGVkIGF0dGVtcHQgdXNlZCB0byBsZWF2ZSB0aGUgY29uc3VtZXIgcmVhZGluZyBhXG4gICAgICAvLyBncm91cCB0aGF0IHdhcyBuZXZlciBjcmVhdGVkIOKAlCBmb3JldmVyLlxuICAgICAgbGV0IGdyb3VwUmVhZHkgPSBmYWxzZTtcbiAgICAgIGNvbnN0IGVuc3VyZUdyb3VwID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIE1LU1RSRUFNIHNvIHRoZSBzdHJlYW0gbmVlZCBub3QgZXhpc3QgeWV0OyAnJCcgPSBvbmx5IG5ldyBtZXNzYWdlcy5cbiAgICAgICAgICBhd2FpdCByZWFkZXIueGdyb3VwKCdDUkVBVEUnLCBrZXksIGdyb3VwLCAnJCcsICdNS1NUUkVBTScpO1xuICAgICAgICAgIGdyb3VwUmVhZHkgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoIWlzQnVzeUdyb3VwKGVycikpIHRocm93IGVycjtcbiAgICAgICAgICBncm91cFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgbG9vcCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgd2hpbGUgKCFzdG9wcGVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghZ3JvdXBSZWFkeSkgYXdhaXQgZW5zdXJlR3JvdXAoKTtcbiAgICAgICAgICAgIC8vIDEpIERlYWQtbGV0dGVyIG1lc3NhZ2VzIHRoYXQgaGF2ZSBleGhhdXN0ZWQgdGhlaXIgZGVsaXZlcmllcywgdGhlblxuICAgICAgICAgICAgLy8gICAgcmVjbGFpbSB0aGUgcmVzdCBzdHJhbmRlZCBieSBhIGZhaWxlZC9jcmFzaGVkIGNvbnN1bWVyLlxuICAgICAgICAgICAgYXdhaXQgZGVhZExldHRlckV4aGF1c3RlZCgpO1xuICAgICAgICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IHJlYWRlci54YXV0b2NsYWltKGtleSwgZ3JvdXAsIGNvbnN1bWVyLCBtaW5JZGxlLCAnMCcsICdDT1VOVCcsIGJhdGNoKTtcbiAgICAgICAgICAgIC8vIFhBVVRPQ0xBSU0gcmVwbHk6IFtuZXh0Q3Vyc29yLCBlbnRyaWVzLCBkZWxldGVkSWRzXVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2xhaW1lZCkgJiYgY2xhaW1lZC5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgICBhd2FpdCBkZWxpdmVyKHBhcnNlRW50cmllczxUPih0b3BpYywgY2xhaW1lZFsxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN0b3BwZWQpIGJyZWFrO1xuXG4gICAgICAgICAgICAvLyAyKSBSZWFkIG5ldywgbmV2ZXItZGVsaXZlcmVkIG1lc3NhZ2VzIGZvciB0aGlzIGdyb3VwICgnPicpLlxuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcmVhZGVyLnhyZWFkZ3JvdXAoXG4gICAgICAgICAgICAgICdHUk9VUCcsIGdyb3VwLCBjb25zdW1lciwgJ0NPVU5UJywgYmF0Y2gsICdCTE9DSycsIGJsb2NrTXMsICdTVFJFQU1TJywga2V5LCAnPicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8gWFJFQURHUk9VUCByZXBseTogW1tzdHJlYW1LZXksIGVudHJpZXNdXSB8IG51bGwgKG9uIGJsb2NrIHRpbWVvdXQpXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXMpICYmIHJlcy5sZW5ndGggPiAwICYmIEFycmF5LmlzQXJyYXkocmVzWzBdKSAmJiByZXNbMF0ubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcihwYXJzZUVudHJpZXM8VD4odG9waWMsIHJlc1swXVsxXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgaWYgKHN0b3BwZWQpIGJyZWFrO1xuICAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBvciBncm91cCB3YXMgZGVsZXRlZCBvdXQgZnJvbSB1bmRlciB1cyDigJQgcmVjcmVhdGUgaXQuXG4gICAgICAgICAgICBpZiAoL05PR1JPVVAvaS50ZXN0KGVyck1zZyhlcnIpKSkgZ3JvdXBSZWFkeSA9IGZhbHNlO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0V2ZW50IGJ1cyBjb25zdW1lciBsb29wIGVycm9yOyBiYWNraW5nIG9mZicsIHsgdG9waWMsIGdyb3VwLCBlcnJvcjogZXJyTXNnKGVycikgfSk7XG4gICAgICAgICAgICAvLyBCYWNrIG9mZiBzbyBhIHBlcnNpc3RlbnQgUmVkaXMgZXJyb3IgZG9lc24ndCBob3Qtc3Bpbi5cbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDEwMDApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGxvb3BQcm9taXNlID0gbG9vcCgpO1xuICAgICAgbG9nZ2VyLmluZm8oJ0V2ZW50IGJ1cyBjb25zdW1lciBzdGFydGVkJywgeyB0b3BpYywgZ3JvdXAsIGNvbnN1bWVyLCBtYXhEZWxpdmVyaWVzIH0pO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICAgIHN0b3BwZWQgPSB0cnVlO1xuICAgICAgICAgIC8vIEF3YWl0IHRoZSBpbi1mbGlnaHQgcmVhZC9oYW5kbGVyIHNvIGEgY2FsbGVyIChlLmcuIGEgc2VydmljZSBzaHV0dGluZ1xuICAgICAgICAgIC8vIGRvd24gaXRzIERCKSBkb2Vzbid0IHJhY2UgYSBtZXNzYWdlIHN0aWxsIGJlaW5nIHByb2Nlc3NlZC4gQm91bmRlZCBieVxuICAgICAgICAgIC8vIHRoZSBYUkVBREdST1VQIEJMT0NLIHdpbmRvdy4gTmV2ZXIgcmVqZWN0cyDigJQgdGhlIGxvb3Agc3dhbGxvd3MgZXJyb3JzLlxuICAgICAgICAgIGF3YWl0IGxvb3BQcm9taXNlLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKHJlYWRlci5xdWl0Py4oKSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGR1cmFibGUgZXZlbnQgYnVzIGZyb20gdGhlIGFtYmllbnQgUmVkaXMgZW52IHZpYSB0aGUgc2hhcmVkXG4gKiBgY3JlYXRlRW52UmVkaXNDbGllbnRgLiBSZXR1cm5zIGBudWxsYCB3aGVuIFJlZGlzIGlzIG5vdCBjb25maWd1cmVkIOKAlCB0aGVcbiAqIGNhbGxlciB0aGVuIHJ1bnMgd2l0aG91dCBhIGJ1cyAodG9kYXkncyBIVFRQL3JlY29uY2lsZXIgYmVoYXZpb3IpLCBuZXZlclxuICogY3Jhc2hpbmcuIE9wdCBpbiB3aXRoIGEgc2luZ2xlIGJvb3QgbGluZSB3aGVyZSBhIHNlcnZpY2Ugd2FudHMgZHVyYWJsZSBldmVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc0R1cmFibGVFdmVudEJ1cyhvcHRzOiB7IG1heExlbj86IG51bWJlciB9ID0ge30pOiBEdXJhYmxlRXZlbnRCdXMgfCBudWxsIHtcbiAgY29uc3QgaW5zdCA9IGNyZWF0ZUVudlJlZGlzQ2xpZW50PFJlZGlzU3RyZWFtQ2xpZW50PignZXZlbnQtYnVzJyk7XG4gIGlmICghaW5zdCkgcmV0dXJuIG51bGw7XG4gIGxvZ2dlci5pbmZvKCdSZWRpcyBkdXJhYmxlIGV2ZW50IGJ1cyBpbml0aWFsaXplZCcpO1xuICByZXR1cm4gY3JlYXRlUmVkaXNEdXJhYmxlRXZlbnRCdXMoaW5zdCwgb3B0cyk7XG59XG4iXX0=
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVyYWJsZS1ldmVudC1idXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZHVyYWJsZS1ldmVudC1idXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFFSCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQXVFakQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0FBQzlCLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztBQUN6QixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUMvQixNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQztBQUNuQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUVsQyxTQUFTLFNBQVMsQ0FBQyxLQUFhO0lBQzlCLE9BQU8sT0FBTyxLQUFLLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxLQUFhO0lBQy9DLE9BQU8sT0FBTyxLQUFLLE1BQU0sQ0FBQztBQUM1QixDQUFDO0FBRUQsbUZBQW1GO0FBQ25GLFNBQVMsaUJBQWlCLENBQUMsRUFBVTtJQUNuQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFB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LGFBQWEsRUFBRSxDQUFDLENBQUM7WUFFckYsT0FBTztnQkFDTCxLQUFLLENBQUMsSUFBSTtvQkFDUixPQUFPLEdBQUcsSUFBSSxDQUFDO29CQUNmLHdFQUF3RTtvQkFDeEUsd0VBQXdFO29CQUN4RSx5RUFBeUU7b0JBQ3pFLE1BQU0sV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDekMsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRSxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUFDLElBQUksR0FBd0IsRUFBRTtJQUMxRSxNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBb0IsV0FBVyxDQUFDLENBQUM7SUFDbEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDbkQsT0FBTywwQkFBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIER1cmFibGUsIGF0LWxlYXN0LW9uY2UgZXZlbnQgYmFja2JvbmUgKFJlZGlzIFN0cmVhbXMpLlxuICpcbiAqIFRoZSBwbGF0Zm9ybSdzIGNyb3NzLXNlcnZpY2Ugc2lnbmFsbGluZyB0b2RheSBpcyBwb2ludC10by1wb2ludCBIVFRQIHBsdXNcbiAqIHBvbGxpbmcgcmVjb25jaWxlcnMgcGx1cyBhbiBJTi1QUk9DRVNTIGJlc3QtZWZmb3J0IGVtaXR0ZXIgKHtAbGluayBlbnRpdHlFdmVudHN9KS5cbiAqIFRoZXJlIGlzIG5vIGR1cmFibGUgYnVzLCBzbyBhIHNpZ25hbCBwcm9kdWNlZCBvbiBvbmUgcG9kIGlzIGVpdGhlciBkZWxpdmVyZWRcbiAqIHN5bmNocm9ub3VzbHkgb3ZlciBIVFRQIChjb3VwbGluZyArIHJldHJ5LXN0b3JtIHJpc2spIG9yIGxvc3QgaWYgdGhlIGNvbnN1bWVyXG4gKiBpcyBtb21lbnRhcmlseSBkb3duICh0aGUgcmVjb25jaWxlcnMgZXhpc3QgdG8gcGFwZXIgb3ZlciBleGFjdGx5IHRoYXQpLlxuICpcbiAqIFRoaXMgaXMgdGhhdCBtaXNzaW5nIGJ1cywgYXMgYSByZXVzYWJsZSBwcmltaXRpdmU6XG4gKiAgLSAqKnB1Ymxpc2godG9waWMsIHBheWxvYWQpKiog4oaSIGBYQUREYCBvbnRvIGEgYm91bmRlZCAoYE1BWExFTiB+YCkgcGVyLXRvcGljXG4gKiAgICBzdHJlYW0uIER1cmFibGUgYWNyb3NzIHJlc3RhcnRzLCBzaGFyZWQgYnkgYWxsIHJlcGxpY2FzLlxuICogIC0gKipzdWJzY3JpYmUoe3RvcGljLCBncm91cCwgY29uc3VtZXIsIGhhbmRsZXJ9KSoqIOKGkiBhIGBYUkVBREdST1VQYCBjb25zdW1lclxuICogICAgb24gaXRzIE9XTiBjb25uZWN0aW9uIChgZHVwbGljYXRlKClgKSwgc28gYSBibG9ja2luZyByZWFkIG5ldmVyIGRlbGF5cyBhXG4gKiAgICBwdWJsaXNoLiBDb25zdW1lciBHUk9VUFMgZ2l2ZSBhdC1sZWFzdC1vbmNlOiBlYWNoIGdyb3VwIGdldHMgZXZlcnkgbWVzc2FnZVxuICogICAgb25jZSwgYSBtZXNzYWdlIHN0YXlzIHBlbmRpbmcgdW50aWwgdGhlIGhhbmRsZXIgYFhBQ0tgcyBpdCwgYW5kIGBYQVVUT0NMQUlNYFxuICogICAgcmVjbGFpbXMgbWVzc2FnZXMgc3RyYW5kZWQgYnkgYSBjcmFzaGVkIGNvbnN1bWVyLiBBIG1lc3NhZ2UgdGhhdCBoYXMgYmVlblxuICogICAgZGVsaXZlcmVkIGBtYXhEZWxpdmVyaWVzYCB0aW1lcyB3aXRob3V0IGFuIGFjayBpcyBtb3ZlZCB0byBhIGRlYWQtbGV0dGVyXG4gKiAgICBzdHJlYW0gKGBldnQ6PHRvcGljPjpkbHFgKSBhbmQgYWNrZWQsIHNvIGEgcG9pc29uIG1lc3NhZ2UgY2FuJ3QgcmVkZWxpdmVyXG4gKiAgICBmb3JldmVyLiBNdWx0aXBsZSBncm91cHMgb24gb25lIHRvcGljID0gaW5kZXBlbmRlbnQgZmFuLW91dC5cbiAqXG4gKiBGQUlMLVNBRkUgKyBPUFQtSU4sIGV4YWN0bHkgbGlrZSB0aGUgYXVkaXQgc3Bvb2w6IHtAbGluayBjcmVhdGVFbnZSZWRpc0R1cmFibGVFdmVudEJ1c31cbiAqIHJldHVybnMgYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCwgc28gYSBzZXJ2aWNlIHdpdGhvdXQgaXQgc2ltcGx5XG4gKiBkb2Vzbid0IHVzZSB0aGUgYnVzIChrZWVwcyB0b2RheSdzIGJlaGF2aW9yKS4gQSBwdWJsaXNoIGZhaWx1cmUgaXMgZHJvcHBlZC13aXRoLVxuICogLW1ldHJpYywgbmV2ZXIgdGhyb3duOyBhIGhhbmRsZXIgdGhyb3cgbGVhdmVzIHRoZSBtZXNzYWdlIHVuLWFja2VkIGZvciByZWRlbGl2ZXJ5LlxuICpcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVFbnZSZWRpc0NsaWVudCB9IGZyb20gJy4vZW52LXJlZGlzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBlbWl0Q291bnRlciB9IGZyb20gJy4uL3V0aWxzL21ldHJpYy1lbWl0dGVyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdkdXJhYmxlLWV2ZW50LWJ1cycpO1xuXG4vKiogQSBkZWxpdmVyZWQgZXZlbnQ6IGl0cyBzdHJlYW0gaWQsIHRvcGljLCBwdWJsaXNoIHRpbWUsIGFuZCBkZWNvZGVkIHBheWxvYWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50RW52ZWxvcGU8VCA9IHVua25vd24+IHtcbiAgLyoqIFJlZGlzIFN0cmVhbSBlbnRyeSBpZCAoYDxtcz4tPHNlcT5gKSDigJQgYWxzbyB0aGUgaWRlbXBvdGVuY3kgaGFuZGxlLiAqL1xuICBpZDogc3RyaW5nO1xuICB0b3BpYzogc3RyaW5nO1xuICAvKipcbiAgICogV2hlbiB0aGUgZXZlbnQgd2FzIHB1Ymxpc2hlZCAodGhlIFJlZGlzIHNlcnZlciB0aW1lIGVtYmVkZGVkIGluIHRoZSBzdHJlYW1cbiAgICogaWQpLiBBIHJlZGVsaXZlcnkga2VlcHMgaXRzIE9SSUdJTkFMIHB1Ymxpc2ggdGltZSwgc28gYSBjb25zdW1lciBhcHBseWluZ1xuICAgKiBsYXN0LXdyaXRlci13aW5zIHN0YXRlIChlLmcuIGFuIGVudGl0bGVtZW50IHN5bmMpIGNhbiBvcmRlciBldmVudHMgYnkgaXRcbiAgICogaW5zdGVhZCBvZiBieSBkZWxpdmVyeSB0aW1lIGFuZCByZWZ1c2UgdG8gbGV0IGEgc3RhbGUgcmV0cnkgb3ZlcndyaXRlIGFcbiAgICogbmV3ZXIgc3RhdGUuXG4gICAqL1xuICBwdWJsaXNoZWRBdDogRGF0ZTtcbiAgcGF5bG9hZDogVDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpYmVPcHRpb25zPFQgPSB1bmtub3duPiB7XG4gIC8qKiBUb3BpYyAoc3RyZWFtKSB0byBjb25zdW1lLiAqL1xuICB0b3BpYzogc3RyaW5nO1xuICAvKiogQ29uc3VtZXIgZ3JvdXAg4oCUIG9uZSBkZWxpdmVyeSBwZXIgZ3JvdXA7IGRpc3RpbmN0IGdyb3VwcyBmYW4gb3V0LiAqL1xuICBncm91cDogc3RyaW5nO1xuICAvKiogVGhpcyBjb25zdW1lcidzIGlkIHdpdGhpbiB0aGUgZ3JvdXAgKGUuZy4gYCR7c2VydmljZX0tJHtwaWR9YCkuICovXG4gIGNvbnN1bWVyOiBzdHJpbmc7XG4gIC8qKiBBc3luYyBoYW5kbGVyLiBSZXNvbHZlcyDih5IgdGhlIG1lc3NhZ2UgaXMgYWNrZWQ7IHRocm93cyDih5IgbGVmdCBwZW5kaW5nIGZvciByZWRlbGl2ZXJ5LiAqL1xuICBoYW5kbGVyOiAoZW52OiBFdmVudEVudmVsb3BlPFQ+KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAvKiogTWF4IG1lc3NhZ2VzIHBlciByZWFkIChkZWZhdWx0IDE2KS4gKi9cbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuICAvKiogWFJFQURHUk9VUCBibG9jayB0aW1lIGluIG1zIChkZWZhdWx0IDUwMDApLiAqL1xuICBibG9ja01zPzogbnVtYmVyO1xuICAvKiogQSBwZW5kaW5nIG1lc3NhZ2UgaWRsZSB0aGlzIGxvbmcgKG1zKSBpcyByZWNsYWltZWQgZnJvbSBhIGRlYWQgY29uc3VtZXIgKGRlZmF1bHQgNjAwMDApLiAqL1xuICBtaW5JZGxlTXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBEZWxpdmVyaWVzIGFmdGVyIHdoaWNoIGFuIHVuLWFja2VkIG1lc3NhZ2UgaXMgZGVhZC1sZXR0ZXJlZCB0b1xuICAgKiBgZXZ0Ojx0b3BpYz46ZGxxYCBhbmQgYWNrZWQgaW5zdGVhZCBvZiBiZWluZyByZWRlbGl2ZXJlZCBhZ2FpbiAoZGVmYXVsdCAxMCkuXG4gICAqL1xuICBtYXhEZWxpdmVyaWVzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50U3Vic2NyaXB0aW9uIHtcbiAgLyoqIFN0b3AgdGhlIGNvbnN1bWVyIGxvb3AuIFJlc29sdmVzIG9uY2UgdGhlIGluLWZsaWdodCByZWFkIHJldHVybnMuICovXG4gIHN0b3AoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEdXJhYmxlRXZlbnRCdXMge1xuICAvKiogUHVibGlzaCBhIHBheWxvYWQgdG8gYSB0b3BpYy4gUmV0dXJucyB0aGUgc3RyZWFtIGlkLCBvciBudWxsIG9uIGZhaWx1cmUgKGRyb3BwZWQsIG5ldmVyIHRocm93cykuICovXG4gIHB1Ymxpc2g8VD4odG9waWM6IHN0cmluZywgcGF5bG9hZDogVCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIC8qKiBTdGFydCBhIGNvbnN1bWVyLWdyb3VwIHJlYWRlciBmb3IgYSB0b3BpYy4gRmlyZS1hbmQtZm9yZ2V0IGxvb3A7IGNhbGwgYHN0b3AoKWAgdG8gZW5kIGl0LiAqL1xuICBzdWJzY3JpYmU8VD4ob3B0czogU3Vic2NyaWJlT3B0aW9uczxUPik6IEV2ZW50U3Vic2NyaXB0aW9uO1xufVxuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgaW9yZWRpcycgU3RyZWFtIEFQSSB0aGUgYnVzIHVzZXMuIEtlcHQgbWluaW1hbCBzbyBhIHRlc3QgY2FuXG4gKiBzdXBwbHkgYW4gaW4tbWVtb3J5IGZha2UgYW5kIHNvIG1lcmVseSBpbXBvcnRpbmcgdGhpcyBuZXZlciBoYXJkLWRlcGVuZHMgb25cbiAqIGlvcmVkaXMgKGNvbnN0cnVjdGVkIHZpYSB0aGUgc2hhcmVkIGVudiBoZWxwZXIpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzU3RyZWFtQ2xpZW50IHtcbiAgeGFkZChrZXk6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHhncm91cCguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeHJlYWRncm91cCguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeGFjayhrZXk6IHN0cmluZywgZ3JvdXA6IHN0cmluZywgLi4uaWRzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPjtcbiAgeGF1dG9jbGFpbSguLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgeHBlbmRpbmcoa2V5OiBzdHJpbmcsIGdyb3VwOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xuICB4cmFuZ2Uoa2V5OiBzdHJpbmcsIHN0YXJ0OiBzdHJpbmcsIGVuZDogc3RyaW5nLCAuLi5hcmdzOiAoc3RyaW5nIHwgbnVtYmVyKVtdKTogUHJvbWlzZTx1bmtub3duPjtcbiAgLyoqIEEgbmV3IGNvbm5lY3Rpb24gd2l0aCB0aGUgc2FtZSBvcHRpb25zIOKAlCBlYWNoIHN1YnNjcmliZXIgcmVhZHMgb24gaXRzIG93bi4gKi9cbiAgZHVwbGljYXRlKCk6IFJlZGlzU3RyZWFtQ2xpZW50O1xuICBxdWl0PygpOiBQcm9taXNlPHVua25vd24+O1xuICBvbj8oZXZlbnQ6ICdlcnJvcicsIGNiOiAoZXJyOiB1bmtub3duKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuY29uc3QgREVGQVVMVF9NQVhMRU4gPSAxMF8wMDA7XG5jb25zdCBERUZBVUxUX0JBVENIID0gMTY7XG5jb25zdCBERUZBVUxUX0JMT0NLX01TID0gNV8wMDA7XG5jb25zdCBERUZBVUxUX01JTl9JRExFX01TID0gNjBfMDAwO1xuY29uc3QgREVGQVVMVF9NQVhfREVMSVZFUklFUyA9IDEwO1xuXG5mdW5jdGlvbiBzdHJlYW1LZXkodG9waWM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgZXZ0OiR7dG9waWN9YDtcbn1cblxuLyoqIERlYWQtbGV0dGVyIHN0cmVhbSBmb3IgYSB0b3BpYy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWFkTGV0dGVyU3RyZWFtS2V5KHRvcGljOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGV2dDoke3RvcGljfTpkbHFgO1xufVxuXG4vKiogUHVibGlzaCB0aW1lIGZyb20gYSBzdHJlYW0gaWQgKGA8bXM+LTxzZXE+YCk7IGVwb2NoIDAgZm9yIGFuIHVucGFyc2VhYmxlIGlkLiAqL1xuZnVuY3Rpb24gcHVibGlzaGVkQXRGcm9tSWQoaWQ6IHN0cmluZyk6IERhdGUge1xuICBjb25zdCBtcyA9IE51bWJlcihpZC5zcGxpdCgnLScpWzBdKTtcbiAgcmV0dXJuIG5ldyBEYXRlKE51bWJlci5pc0Zpbml0ZShtcykgPyBtcyA6IDApO1xufVxuXG4vKiogVHJ1ZSB3aGVuIHRoZSBlcnJvciBpcyBSZWRpcycgXCJncm91cCBhbHJlYWR5IGV4aXN0c1wiIChpZGVtcG90ZW50IGNyZWF0ZSkuICovXG5mdW5jdGlvbiBpc0J1c3lHcm91cChlcnI6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGVycm9yTWVzc2FnZShlcnIpLmluY2x1ZGVzKCdCVVNZR1JPVVAnKTtcbn1cblxuLyoqXG4gKiBQYXJzZSB0aGUgbmVzdGVkIGFycmF5IHNoYXBlIFhSRUFER1JPVVAgLyBYQVVUT0NMQUlNIHJldHVybiBpbnRvIGZsYXQgZW52ZWxvcGVzLlxuICogWFJFQURHUk9VUDogYFtbc3RyZWFtS2V5LCBbW2lkLCBbZiwgdiwgLi4uXV0sIC4uLl1dXWAuXG4gKiBYQVVUT0NMQUlNOiBgW25leHRDdXJzb3IsIFtbaWQsIFtmLCB2LCAuLi5dXSwgLi4uXSwgZGVsZXRlZElkc11gLlxuICogV2Ugc3RvcmUgdGhlIEpTT04gcGF5bG9hZCB1bmRlciBhIHNpbmdsZSBmaWVsZCBgZGAuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlRW50cmllczxUPih0b3BpYzogc3RyaW5nLCBlbnRyaWVzOiB1bmtub3duKTogRXZlbnRFbnZlbG9wZTxUPltdIHtcbiAgY29uc3Qgb3V0OiBFdmVudEVudmVsb3BlPFQ+W10gPSBbXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGVudHJpZXMpKSByZXR1cm4gb3V0O1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZW50cnkpIHx8IGVudHJ5Lmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGlkID0gU3RyaW5nKGVudHJ5WzBdKTtcbiAgICBjb25zdCBmaWVsZHMgPSBlbnRyeVsxXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZmllbGRzKSkgY29udGludWU7XG4gICAgLy8gZmllbGRzIGlzIFtuYW1lLCB2YWx1ZSwgbmFtZSwgdmFsdWUsIC4uLl07IGZpbmQgJ2QnLlxuICAgIGxldCByYXc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSArIDEgPCBmaWVsZHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgIGlmIChTdHJpbmcoZmllbGRzW2ldKSA9PT0gJ2QnKSB7IHJhdyA9IFN0cmluZyhmaWVsZHNbaSArIDFdKTsgYnJlYWs7IH1cbiAgICB9XG4gICAgLy8gQSBtaXNzaW5nIGBkYCBmaWVsZCAoYW4gZW50cnkgbm90IHdyaXR0ZW4gYnkgcHVibGlzaCgpKSBPUiBhIGNvcnJ1cHQgSlNPTlxuICAgIC8vIHBheWxvYWQgYm90aCB5aWVsZCBhbiB1bmRlZmluZWQtcGF5bG9hZCBlbnZlbG9wZSBzbyBgZGVsaXZlcigpYCBBQ0tzIGl0IOKAlFxuICAgIC8vIGEgcG9pc29uIG1lc3NhZ2UgbXVzdCBuZXZlciB3ZWRnZSB0aGUgZ3JvdXAgYnkgc3RheWluZyBwZXJwZXR1YWxseSBwZW5kaW5nLlxuICAgIGNvbnN0IHB1Ymxpc2hlZEF0ID0gcHVibGlzaGVkQXRGcm9tSWQoaWQpO1xuICAgIGlmIChyYXcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3V0LnB1c2goeyBpZCwgdG9waWMsIHB1Ymxpc2hlZEF0LCBwYXlsb2FkOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBvdXQucHVzaCh7IGlkLCB0b3BpYywgcHVibGlzaGVkQXQsIHBheWxvYWQ6IEpTT04ucGFyc2UocmF3KSBhcyBUIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgb3V0LnB1c2goeyBpZCwgdG9waWMsIHB1Ymxpc2hlZEF0LCBwYXlsb2FkOiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBUIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQnVpbGQgYSBkdXJhYmxlIGV2ZW50IGJ1cyBvdmVyIGEgUmVkaXMgU3RyZWFtcyBjbGllbnQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNEdXJhYmxlRXZlbnRCdXMoXG4gIHJlZGlzOiBSZWRpc1N0cmVhbUNsaWVudCxcbiAgb3B0czogeyBtYXhMZW4/OiBudW1iZXIgfSA9IHt9LFxuKTogRHVyYWJsZUV2ZW50QnVzIHtcbiAgY29uc3QgbWF4TGVuID0gTWF0aC5tYXgoMSwgb3B0cy5tYXhMZW4gPz8gREVGQVVMVF9NQVhMRU4pO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgcHVibGlzaDxUPih0b3BpYzogc3RyaW5nLCBwYXlsb2FkOiBUKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gICAgICBjb25zdCBrZXkgPSBzdHJlYW1LZXkodG9waWMpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gTUFYTEVOIH4gPG4+IGJvdW5kcyB0aGUgc3RyZWFtIGFwcHJveGltYXRlbHkgKGNoZWFwKTsgYCpgID0gc2VydmVyIGlkLlxuICAgICAgICBjb25zdCBpZCA9IGF3YWl0IHJlZGlzLnhhZGQoa2V5LCAnTUFYTEVOJywgJ34nLCBtYXhMZW4sICcqJywgJ2QnLCBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSk7XG4gICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfcHVibGlzaGVkX3RvdGFsJywgeyB0b3BpYyB9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfcHVibGlzaF9mYWlsZWRfdG90YWwnLCB7IHRvcGljIH0pO1xuICAgICAgICBsb2dnZXIud2FybignRXZlbnQgYnVzIHB1Ymxpc2ggZmFpbGVkIChldmVudCBkcm9wcGVkKScsIHsgdG9waWMsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN1YnNjcmliZTxUPihzdWJPcHRzOiBTdWJzY3JpYmVPcHRpb25zPFQ+KTogRXZlbnRTdWJzY3JpcHRpb24ge1xuICAgICAgY29uc3QgeyB0b3BpYywgZ3JvdXAsIGNvbnN1bWVyLCBoYW5kbGVyIH0gPSBzdWJPcHRzO1xuICAgICAgY29uc3Qga2V5ID0gc3RyZWFtS2V5KHRvcGljKTtcbiAgICAgIGNvbnN0IGRscUtleSA9IGRlYWRMZXR0ZXJTdHJlYW1LZXkodG9waWMpO1xuICAgICAgY29uc3QgYmF0Y2ggPSBNYXRoLm1heCgxLCBzdWJPcHRzLmJhdGNoU2l6ZSA/PyBERUZBVUxUX0JBVENIKTtcbiAgICAgIGNvbnN0IGJsb2NrTXMgPSBNYXRoLm1heCgwLCBzdWJPcHRzLmJsb2NrTXMgPz8gREVGQVVMVF9CTE9DS19NUyk7XG4gICAgICBjb25zdCBtaW5JZGxlID0gTWF0aC5tYXgoMCwgc3ViT3B0cy5taW5JZGxlTXMgPz8gREVGQVVMVF9NSU5fSURMRV9NUyk7XG4gICAgICBjb25zdCBtYXhEZWxpdmVyaWVzID0gTWF0aC5tYXgoMSwgc3ViT3B0cy5tYXhEZWxpdmVyaWVzID8/IERFRkFVTFRfTUFYX0RFTElWRVJJRVMpO1xuXG4gICAgICAvLyBgWFJFQURHUk9VUCBCTE9DS2AgaG9sZHMgaXRzIGNvbm5lY3Rpb24gZm9yIHVwIHRvIGBibG9ja01zYDsgb24gdGhlXG4gICAgICAvLyBzaGFyZWQgY2xpZW50IGV2ZXJ5IHB1Ymxpc2ggcXVldWVkIGJlaGluZCBpdC4gUmVhZCBvbiBhIGRlZGljYXRlZCBvbmUuXG4gICAgICBjb25zdCByZWFkZXIgPSByZWRpcy5kdXBsaWNhdGUoKTtcbiAgICAgIC8vIEEgZHVwbGljYXRlZCBpb3JlZGlzIGNvbm5lY3Rpb24gZG9lc24ndCBpbmhlcml0IGxpc3RlbmVyczsgd2l0aG91dCBvbmUgYVxuICAgICAgLy8gY29ubmVjdGlvbiBlcnJvciBpcyBhbiB1bmhhbmRsZWQgJ2Vycm9yJyBldmVudCB0aGF0IGNyYXNoZXMgdGhlIHByb2Nlc3MuXG4gICAgICByZWFkZXIub24/LignZXJyb3InLCAoZXJyKSA9PiBsb2dnZXIud2FybignRXZlbnQgYnVzIHJlYWRlciBjb25uZWN0aW9uIGVycm9yJywgeyB0b3BpYywgZ3JvdXAsIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyKSB9KSk7XG5cbiAgICAgIGxldCBzdG9wcGVkID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IGRlbGl2ZXIgPSBhc3luYyAoZW52czogRXZlbnRFbnZlbG9wZTxUPltdKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZW52IG9mIGVudnMpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKGVudi5wYXlsb2FkICE9PSB1bmRlZmluZWQpIGF3YWl0IGhhbmRsZXIoZW52KTtcbiAgICAgICAgICAgIC8vIEFjayBvbiBzdWNjZXNzIE9SIG9uIGFuIHVuZGVmaW5lZCAoY29ycnVwdCkgcGF5bG9hZCDigJQgYSBwb2lzb25cbiAgICAgICAgICAgIC8vIG1lc3NhZ2UgbXVzdCBub3QgYmxvY2sgdGhlIGdyb3VwIGZvcmV2ZXIuXG4gICAgICAgICAgICBhd2FpdCByZWFkZXIueGFjayhrZXksIGdyb3VwLCBlbnYuaWQpO1xuICAgICAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19kZWxpdmVyZWRfdG90YWwnLCB7IHRvcGljLCBncm91cCB9KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIC8vIExlYXZlIGl0IHBlbmRpbmcgKG5vIFhBQ0spIOKAlCBYQVVUT0NMQUlNIHJlZGVsaXZlcnMgaXQgYWZ0ZXIgbWluSWRsZS5cbiAgICAgICAgICAgIGVtaXRDb3VudGVyKCdldmVudF9idXNfaGFuZGxlcl9mYWlsZWRfdG90YWwnLCB7IHRvcGljLCBncm91cCB9KTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFdmVudCBoYW5kbGVyIGZhaWxlZDsgbGVhdmluZyBtZXNzYWdlIHBlbmRpbmcgZm9yIHJlZGVsaXZlcnknLCB7XG4gICAgICAgICAgICAgIHRvcGljLCBncm91cCwgaWQ6IGVudi5pZCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKipcbiAgICAgICAqIE1vdmUgZXZlcnkgaWRsZSBwZW5kaW5nIG1lc3NhZ2UgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRlbGl2ZXJlZFxuICAgICAgICogYG1heERlbGl2ZXJpZXNgIHRpbWVzIHRvIHRoZSBkZWFkLWxldHRlciBzdHJlYW0gYW5kIGFjayBpdC4gVGhlIGVudHJ5XG4gICAgICAgKiBrZWVwcyBpdHMgcGF5bG9hZCBwbHVzIHdoZXJlIGl0IGNhbWUgZnJvbSwgc28gYW4gb3BlcmF0b3IgY2FuIGluc3BlY3Qgb3JcbiAgICAgICAqIHJlcGxheSBpdC4gSWYgY29weWluZyBmYWlscyB0aGUgbWVzc2FnZSBpcyBsZWZ0IHBlbmRpbmcgKHJldHJpZWQgbmV4dFxuICAgICAgICogcGFzcykg4oCUIGl0IGlzIG5ldmVyIGFja2VkIHdpdGhvdXQgYmVpbmcgcHJlc2VydmVkLlxuICAgICAgICovXG4gICAgICBjb25zdCBkZWFkTGV0dGVyRXhoYXVzdGVkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgcmVhZGVyLnhwZW5kaW5nKGtleSwgZ3JvdXAsICdJRExFJywgbWluSWRsZSwgJy0nLCAnKycsIGJhdGNoKTtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBlbmRpbmcpKSByZXR1cm47XG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBwZW5kaW5nKSB7XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHApIHx8IHAubGVuZ3RoIDwgNCkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgaWQgPSBTdHJpbmcocFswXSk7XG4gICAgICAgICAgY29uc3QgZGVsaXZlcmllcyA9IE51bWJlcihwWzNdKTtcbiAgICAgICAgICBpZiAoIShkZWxpdmVyaWVzID49IG1heERlbGl2ZXJpZXMpKSBjb250aW51ZTtcbiAgICAgICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgcmVhZGVyLnhyYW5nZShrZXksIGlkLCBpZCk7XG4gICAgICAgICAgY29uc3QgZmllbGRzID0gQXJyYXkuaXNBcnJheShlbnRyaWVzKSAmJiBBcnJheS5pc0FycmF5KGVudHJpZXNbMF0pICYmIEFycmF5LmlzQXJyYXkoZW50cmllc1swXVsxXSkgPyBlbnRyaWVzWzBdWzFdIDogW107XG4gICAgICAgICAgbGV0IHJhdyA9ICcnO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpICsgMSA8IGZpZWxkcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgaWYgKFN0cmluZyhmaWVsZHNbaV0pID09PSAnZCcpIHsgcmF3ID0gU3RyaW5nKGZpZWxkc1tpICsgMV0pOyBicmVhazsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCByZWFkZXIueGFkZChcbiAgICAgICAgICAgIGRscUtleSwgJ01BWExFTicsICd+JywgbWF4TGVuLCAnKicsXG4gICAgICAgICAgICAnZCcsIHJhdywgJ3NvdXJjZUlkJywgaWQsICdncm91cCcsIGdyb3VwLCAnZGVsaXZlcmllcycsIGRlbGl2ZXJpZXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCByZWFkZXIueGFjayhrZXksIGdyb3VwLCBpZCk7XG4gICAgICAgICAgZW1pdENvdW50ZXIoJ2V2ZW50X2J1c19kZWFkX2xldHRlcmVkX3RvdGFsJywgeyB0b3BpYywgZ3JvdXAgfSk7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKCdFdmVudCBleGNlZWRlZCBtYXggZGVsaXZlcmllczsgbW92ZWQgdG8gZGVhZC1sZXR0ZXIgc3RyZWFtJywge1xuICAgICAgICAgICAgdG9waWMsIGdyb3VwLCBpZCwgZGVsaXZlcmllcywgZGVhZExldHRlclN0cmVhbTogZGxxS2V5LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBUaGUgY29uc3VtZXIgZ3JvdXAgbXVzdCBleGlzdCBiZWZvcmUgWFJFQURHUk9VUCBjYW4gc3VjY2VlZC4gQ3JlYXRpbmcgaXRcbiAgICAgIC8vIGlzIHJldHJpZWQgaW5zaWRlIHRoZSBsb29wOiBhdCBzdGFydHVwIHRoZSBjbGllbnQgbWF5IG5vdCBoYXZlIGNvbm5lY3RlZFxuICAgICAgLy8geWV0LCBhbmQgYSBzaW5nbGUgZmFpbGVkIGF0dGVtcHQgd291bGQgbGVhdmUgdGhlIGNvbnN1bWVyIHJlYWRpbmcgYVxuICAgICAgLy8gZ3JvdXAgdGhhdCB3YXMgbmV2ZXIgY3JlYXRlZCDigJQgZm9yZXZlci5cbiAgICAgIGxldCBncm91cFJlYWR5ID0gZmFsc2U7XG4gICAgICBjb25zdCBlbnN1cmVHcm91cCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBNS1NUUkVBTSBzbyB0aGUgc3RyZWFtIG5lZWQgbm90IGV4aXN0IHlldDsgJyQnID0gb25seSBuZXcgbWVzc2FnZXMuXG4gICAgICAgICAgYXdhaXQgcmVhZGVyLnhncm91cCgnQ1JFQVRFJywga2V5LCBncm91cCwgJyQnLCAnTUtTVFJFQU0nKTtcbiAgICAgICAgICBncm91cFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFpc0J1c3lHcm91cChlcnIpKSB0aHJvdyBlcnI7XG4gICAgICAgICAgZ3JvdXBSZWFkeSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGxvb3AgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHdoaWxlICghc3RvcHBlZCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIWdyb3VwUmVhZHkpIGF3YWl0IGVuc3VyZUdyb3VwKCk7XG4gICAgICAgICAgICAvLyAxKSBEZWFkLWxldHRlciBtZXNzYWdlcyB0aGF0IGhhdmUgZXhoYXVzdGVkIHRoZWlyIGRlbGl2ZXJpZXMsIHRoZW5cbiAgICAgICAgICAgIC8vICAgIHJlY2xhaW0gdGhlIHJlc3Qgc3RyYW5kZWQgYnkgYSBmYWlsZWQvY3Jhc2hlZCBjb25zdW1lci5cbiAgICAgICAgICAgIGF3YWl0IGRlYWRMZXR0ZXJFeGhhdXN0ZWQoKTtcbiAgICAgICAgICAgIGNvbnN0IGNsYWltZWQgPSBhd2FpdCByZWFkZXIueGF1dG9jbGFpbShrZXksIGdyb3VwLCBjb25zdW1lciwgbWluSWRsZSwgJzAnLCAnQ09VTlQnLCBiYXRjaCk7XG4gICAgICAgICAgICAvLyBYQVVUT0NMQUlNIHJlcGx5OiBbbmV4dEN1cnNvciwgZW50cmllcywgZGVsZXRlZElkc11cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNsYWltZWQpICYmIGNsYWltZWQubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgYXdhaXQgZGVsaXZlcihwYXJzZUVudHJpZXM8VD4odG9waWMsIGNsYWltZWRbMV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdG9wcGVkKSBicmVhaztcblxuICAgICAgICAgICAgLy8gMikgUmVhZCBuZXcsIG5ldmVyLWRlbGl2ZXJlZCBtZXNzYWdlcyBmb3IgdGhpcyBncm91cCAoJz4nKS5cbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlYWRlci54cmVhZGdyb3VwKFxuICAgICAgICAgICAgICAnR1JPVVAnLCBncm91cCwgY29uc3VtZXIsICdDT1VOVCcsIGJhdGNoLCAnQkxPQ0snLCBibG9ja01zLCAnU1RSRUFNUycsIGtleSwgJz4nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIFhSRUFER1JPVVAgcmVwbHk6IFtbc3RyZWFtS2V5LCBlbnRyaWVzXV0gfCBudWxsIChvbiBibG9jayB0aW1lb3V0KVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzKSAmJiByZXMubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KHJlc1swXSkgJiYgcmVzWzBdLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgIGF3YWl0IGRlbGl2ZXIocGFyc2VFbnRyaWVzPFQ+KHRvcGljLCByZXNbMF1bMV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGlmIChzdG9wcGVkKSBicmVhaztcbiAgICAgICAgICAgIC8vIFRoZSBzdHJlYW0gb3IgZ3JvdXAgd2FzIGRlbGV0ZWQgb3V0IGZyb20gdW5kZXIgdXMg4oCUIHJlY3JlYXRlIGl0LlxuICAgICAgICAgICAgaWYgKC9OT0dST1VQL2kudGVzdChlcnJvck1lc3NhZ2UoZXJyKSkpIGdyb3VwUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKCdFdmVudCBidXMgY29uc3VtZXIgbG9vcCBlcnJvcjsgYmFja2luZyBvZmYnLCB7IHRvcGljLCBncm91cCwgZXJyb3I6IGVycm9yTWVzc2FnZShlcnIpIH0pO1xuICAgICAgICAgICAgLy8gQmFjayBvZmYgc28gYSBwZXJzaXN0ZW50IFJlZGlzIGVycm9yIGRvZXNuJ3QgaG90LXNwaW4uXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMDAwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBsb29wUHJvbWlzZSA9IGxvb3AoKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdFdmVudCBidXMgY29uc3VtZXIgc3RhcnRlZCcsIHsgdG9waWMsIGdyb3VwLCBjb25zdW1lciwgbWF4RGVsaXZlcmllcyB9KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTtcbiAgICAgICAgICAvLyBBd2FpdCB0aGUgaW4tZmxpZ2h0IHJlYWQvaGFuZGxlciBzbyBhIGNhbGxlciAoZS5nLiBhIHNlcnZpY2Ugc2h1dHRpbmdcbiAgICAgICAgICAvLyBkb3duIGl0cyBEQikgZG9lc24ndCByYWNlIGEgbWVzc2FnZSBzdGlsbCBiZWluZyBwcm9jZXNzZWQuIEJvdW5kZWQgYnlcbiAgICAgICAgICAvLyB0aGUgWFJFQURHUk9VUCBCTE9DSyB3aW5kb3cuIE5ldmVyIHJlamVjdHMg4oCUIHRoZSBsb29wIHN3YWxsb3dzIGVycm9ycy5cbiAgICAgICAgICBhd2FpdCBsb29wUHJvbWlzZS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgIGF3YWl0IFByb21pc2UucmVzb2x2ZShyZWFkZXIucXVpdD8uKCkpLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBkdXJhYmxlIGV2ZW50IGJ1cyBmcm9tIHRoZSBhbWJpZW50IFJlZGlzIGVudiB2aWEgdGhlIHNoYXJlZFxuICogYGNyZWF0ZUVudlJlZGlzQ2xpZW50YC4gUmV0dXJucyBgbnVsbGAgd2hlbiBSZWRpcyBpcyBub3QgY29uZmlndXJlZCDigJQgdGhlXG4gKiBjYWxsZXIgdGhlbiBydW5zIHdpdGhvdXQgYSBidXMgKHRvZGF5J3MgSFRUUC9yZWNvbmNpbGVyIGJlaGF2aW9yKSwgbmV2ZXJcbiAqIGNyYXNoaW5nLiBPcHQgaW4gd2l0aCBhIHNpbmdsZSBib290IGxpbmUgd2hlcmUgYSBzZXJ2aWNlIHdhbnRzIGR1cmFibGUgZXZlbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNEdXJhYmxlRXZlbnRCdXMob3B0czogeyBtYXhMZW4/OiBudW1iZXIgfSA9IHt9KTogRHVyYWJsZUV2ZW50QnVzIHwgbnVsbCB7XG4gIGNvbnN0IGluc3QgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxSZWRpc1N0cmVhbUNsaWVudD4oJ2V2ZW50LWJ1cycpO1xuICBpZiAoIWluc3QpIHJldHVybiBudWxsO1xuICBsb2dnZXIuaW5mbygnUmVkaXMgZHVyYWJsZSBldmVudCBidXMgaW5pdGlhbGl6ZWQnKTtcbiAgcmV0dXJuIGNyZWF0ZVJlZGlzRHVyYWJsZUV2ZW50QnVzKGluc3QsIG9wdHMpO1xufVxuIl19
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type EcosystemNotifyRequest } from '../types/ecosystem-notifications.js';
|
|
2
|
+
/** The relay path on platform. */
|
|
3
|
+
export declare const ECOSYSTEM_NOTIFY_PATH = "/internal/notify-email";
|
|
4
|
+
/** What one send achieved. `ok: false` means nothing was confirmed delivered. */
|
|
5
|
+
export interface EcosystemNotifyResult {
|
|
6
|
+
ok: boolean;
|
|
7
|
+
/** HTTP status from platform (absent when it was unreachable). */
|
|
8
|
+
status?: number;
|
|
9
|
+
/** Users (and addresses) the rules resolved to. */
|
|
10
|
+
recipientCount?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface EcosystemNotifyClient {
|
|
13
|
+
send(request: EcosystemNotifyRequest): Promise<EcosystemNotifyResult>;
|
|
14
|
+
}
|
|
15
|
+
export interface EcosystemNotifyClientConfig {
|
|
16
|
+
/** The calling service — must be one of the relay's allowed callers. */
|
|
17
|
+
serviceName: string;
|
|
18
|
+
/** Platform host (default env PLATFORM_SERVICE_HOST or 'platform'). */
|
|
19
|
+
host?: string;
|
|
20
|
+
/** Platform port (default env PLATFORM_SERVICE_PORT or 3000). */
|
|
21
|
+
port?: number;
|
|
22
|
+
/** Request timeout ms (default 10 000 — a fan-out to many recipients). */
|
|
23
|
+
timeout?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create the relay client. Never throws from `send` for a transport problem —
|
|
27
|
+
* it resolves `{ ok: false }` and counts `ecosystem_notification_failed_total
|
|
28
|
+
* {event}` so the caller (the digest dispatcher) can keep the row for retry.
|
|
29
|
+
* It DOES throw for an invalid request: that is a programming error, and
|
|
30
|
+
* retrying it would never succeed.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createEcosystemNotifyClient(config: EcosystemNotifyClientConfig): EcosystemNotifyClient;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
/**
|
|
4
|
+
* Sender side of the plugin-ecosystem notification relay
|
|
5
|
+
* (docs/plugin-publishing.md).
|
|
6
|
+
*
|
|
7
|
+
* Platform owns SMTP, the user directory and the Roles, so an ecosystem notice
|
|
8
|
+
* is ONE internal call — `POST /internal/notify-email` with an
|
|
9
|
+
* {@link EcosystemNotifyRequest} — and platform resolves the recipient RULES,
|
|
10
|
+
* applies each user's `ecosystem.*` email preferences, mails every recipient
|
|
11
|
+
* individually and drops the in-app copy into their inbox through the message
|
|
12
|
+
* service. The calling service never sees an address or a member list.
|
|
13
|
+
*
|
|
14
|
+
* The request is validated HERE with the same parser the relay uses, so a
|
|
15
|
+
* malformed notice fails at the call site rather than as a 400 at flush time.
|
|
16
|
+
*/
|
|
17
|
+
import { createSafeClient } from './http-client.js';
|
|
18
|
+
import { getServiceAuthHeader } from '../middleware/service-tokens.js';
|
|
19
|
+
import { SYSTEM_ORG_ID } from '../middleware/system-org.js';
|
|
20
|
+
import { parseEcosystemNotifyRequest } from '../types/ecosystem-notifications.js';
|
|
21
|
+
import { createLogger } from '../utils/logger.js';
|
|
22
|
+
import { emitCounter } from '../utils/metric-emitter.js';
|
|
23
|
+
import { errorMessage } from '../utils/response.js';
|
|
24
|
+
import { serviceEndpoint } from '../utils/service-registry.js';
|
|
25
|
+
const logger = createLogger('ecosystem-notify-client');
|
|
26
|
+
/** The relay path on platform. */
|
|
27
|
+
export const ECOSYSTEM_NOTIFY_PATH = '/internal/notify-email';
|
|
28
|
+
/**
|
|
29
|
+
* Create the relay client. Never throws from `send` for a transport problem —
|
|
30
|
+
* it resolves `{ ok: false }` and counts `ecosystem_notification_failed_total
|
|
31
|
+
* {event}` so the caller (the digest dispatcher) can keep the row for retry.
|
|
32
|
+
* It DOES throw for an invalid request: that is a programming error, and
|
|
33
|
+
* retrying it would never succeed.
|
|
34
|
+
*/
|
|
35
|
+
export function createEcosystemNotifyClient(config) {
|
|
36
|
+
const serviceConfig = {
|
|
37
|
+
host: config.host ?? serviceEndpoint('platform').host,
|
|
38
|
+
port: config.port ?? serviceEndpoint('platform').port,
|
|
39
|
+
timeout: config.timeout ?? 10_000,
|
|
40
|
+
};
|
|
41
|
+
const client = createSafeClient(serviceConfig);
|
|
42
|
+
return {
|
|
43
|
+
async send(request) {
|
|
44
|
+
const parsed = parseEcosystemNotifyRequest(request);
|
|
45
|
+
if (typeof parsed === 'string')
|
|
46
|
+
throw new Error(`Invalid ecosystem notification: ${parsed}`);
|
|
47
|
+
try {
|
|
48
|
+
// System-org scoped, least privilege: the relay authorizes the CALLER by
|
|
49
|
+
// its key-bound service name, not by a role or permission on the token.
|
|
50
|
+
const authorization = getServiceAuthHeader({ serviceName: config.serviceName, orgId: SYSTEM_ORG_ID, role: 'member' });
|
|
51
|
+
const response = await client.post(ECOSYSTEM_NOTIFY_PATH, parsed, { headers: { Authorization: authorization } });
|
|
52
|
+
const status = response?.statusCode;
|
|
53
|
+
const ok = status !== undefined && status >= 200 && status < 300;
|
|
54
|
+
if (!ok) {
|
|
55
|
+
emitCounter('ecosystem_notification_failed_total', { event: parsed.event });
|
|
56
|
+
logger.warn('Ecosystem notification not delivered', { event: parsed.event, status: status ?? 'unreachable' });
|
|
57
|
+
return { ok: false, ...(status !== undefined ? { status } : {}) };
|
|
58
|
+
}
|
|
59
|
+
const body = response.body ?? {};
|
|
60
|
+
const recipientCount = body.data?.recipientCount ?? body.recipientCount;
|
|
61
|
+
return { ok: true, status, ...(typeof recipientCount === 'number' ? { recipientCount } : {}) };
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
emitCounter('ecosystem_notification_failed_total', { event: parsed.event });
|
|
65
|
+
logger.warn('Ecosystem notification failed', { event: parsed.event, error: errorMessage(err) });
|
|
66
|
+
return { ok: false };
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VydmljZXMvZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7OztHQWFHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTVELE9BQU8sRUFBRSwyQkFBMkIsRUFBK0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFFdkQsa0NBQWtDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLHdCQUF3QixDQUFDO0FBMEI5RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsTUFBbUM7SUFDN0UsTUFBTSxhQUFhLEdBQWtCO1FBQ25DLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJO1FBQ3JELElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJO1FBQ3JELE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU07S0FDbEMsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRS9DLE9BQU87UUFDTCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQStCO1lBQ3hDLE1BQU0sTUFBTSxHQUFHLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BELElBQUksT0FBTyxNQUFNLEtBQUssUUFBUTtnQkFBRSxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzdGLElBQUksQ0FBQztnQkFDSCx5RUFBeUU7Z0JBQ3pFLHdFQUF3RTtnQkFDeEUsTUFBTSxhQUFhLEdBQUcsb0JBQW9CLENBQUMsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUN0SCxNQUFNLFFBQVEsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLENBQ2hDLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUM3RSxDQUFDO2dCQUNGLE1BQU0sTUFBTSxHQUFHLFFBQVEsRUFBRSxVQUFVLENBQUM7Z0JBQ3BDLE1BQU0sRUFBRSxHQUFHLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxJQUFJLEdBQUcsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUNqRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7b0JBQ1IsV0FBVyxDQUFDLHFDQUFxQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO29CQUM1RSxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sSUFBSSxhQUFhLEVBQUUsQ0FBQyxDQUFDO29CQUM5RyxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztnQkFDcEUsQ0FBQztnQkFDRCxNQUFNLElBQUksR0FBRyxRQUFTLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFDeEUsT0FBTyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxPQUFPLGNBQWMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDakcsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsV0FBVyxDQUFDLHFDQUFxQyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RSxNQUFNLENBQUMsSUFBSSxDQUFDLCtCQUErQixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFlBQVksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ2hHLE9BQU8sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFNlbmRlciBzaWRlIG9mIHRoZSBwbHVnaW4tZWNvc3lzdGVtIG5vdGlmaWNhdGlvbiByZWxheVxuICogKGRvY3MvcGx1Z2luLXB1Ymxpc2hpbmcubWQpLlxuICpcbiAqIFBsYXRmb3JtIG93bnMgU01UUCwgdGhlIHVzZXIgZGlyZWN0b3J5IGFuZCB0aGUgUm9sZXMsIHNvIGFuIGVjb3N5c3RlbSBub3RpY2VcbiAqIGlzIE9ORSBpbnRlcm5hbCBjYWxsIOKAlCBgUE9TVCAvaW50ZXJuYWwvbm90aWZ5LWVtYWlsYCB3aXRoIGFuXG4gKiB7QGxpbmsgRWNvc3lzdGVtTm90aWZ5UmVxdWVzdH0g4oCUIGFuZCBwbGF0Zm9ybSByZXNvbHZlcyB0aGUgcmVjaXBpZW50IFJVTEVTLFxuICogYXBwbGllcyBlYWNoIHVzZXIncyBgZWNvc3lzdGVtLipgIGVtYWlsIHByZWZlcmVuY2VzLCBtYWlscyBldmVyeSByZWNpcGllbnRcbiAqIGluZGl2aWR1YWxseSBhbmQgZHJvcHMgdGhlIGluLWFwcCBjb3B5IGludG8gdGhlaXIgaW5ib3ggdGhyb3VnaCB0aGUgbWVzc2FnZVxuICogc2VydmljZS4gVGhlIGNhbGxpbmcgc2VydmljZSBuZXZlciBzZWVzIGFuIGFkZHJlc3Mgb3IgYSBtZW1iZXIgbGlzdC5cbiAqXG4gKiBUaGUgcmVxdWVzdCBpcyB2YWxpZGF0ZWQgSEVSRSB3aXRoIHRoZSBzYW1lIHBhcnNlciB0aGUgcmVsYXkgdXNlcywgc28gYVxuICogbWFsZm9ybWVkIG5vdGljZSBmYWlscyBhdCB0aGUgY2FsbCBzaXRlIHJhdGhlciB0aGFuIGFzIGEgNDAwIGF0IGZsdXNoIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlU2FmZUNsaWVudCB9IGZyb20gJy4vaHR0cC1jbGllbnQuanMnO1xuaW1wb3J0IHsgZ2V0U2VydmljZUF1dGhIZWFkZXIgfSBmcm9tICcuLi9taWRkbGV3YXJlL3NlcnZpY2UtdG9rZW5zLmpzJztcbmltcG9ydCB7IFNZU1RFTV9PUkdfSUQgfSBmcm9tICcuLi9taWRkbGV3YXJlL3N5c3RlbS1vcmcuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2aWNlQ29uZmlnIH0gZnJvbSAnLi4vdHlwZXMvY29tbW9uLmpzJztcbmltcG9ydCB7IHBhcnNlRWNvc3lzdGVtTm90aWZ5UmVxdWVzdCwgdHlwZSBFY29zeXN0ZW1Ob3RpZnlSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMvZWNvc3lzdGVtLW5vdGlmaWNhdGlvbnMuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignZWNvc3lzdGVtLW5vdGlmeS1jbGllbnQnKTtcblxuLyoqIFRoZSByZWxheSBwYXRoIG9uIHBsYXRmb3JtLiAqL1xuZXhwb3J0IGNvbnN0IEVDT1NZU1RFTV9OT1RJRllfUEFUSCA9ICcvaW50ZXJuYWwvbm90aWZ5LWVtYWlsJztcblxuLyoqIFdoYXQgb25lIHNlbmQgYWNoaWV2ZWQuIGBvazogZmFsc2VgIG1lYW5zIG5vdGhpbmcgd2FzIGNvbmZpcm1lZCBkZWxpdmVyZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEVjb3N5c3RlbU5vdGlmeVJlc3VsdCB7XG4gIG9rOiBib29sZWFuO1xuICAvKiogSFRUUCBzdGF0dXMgZnJvbSBwbGF0Zm9ybSAoYWJzZW50IHdoZW4gaXQgd2FzIHVucmVhY2hhYmxlKS4gKi9cbiAgc3RhdHVzPzogbnVtYmVyO1xuICAvKiogVXNlcnMgKGFuZCBhZGRyZXNzZXMpIHRoZSBydWxlcyByZXNvbHZlZCB0by4gKi9cbiAgcmVjaXBpZW50Q291bnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRWNvc3lzdGVtTm90aWZ5Q2xpZW50IHtcbiAgc2VuZChyZXF1ZXN0OiBFY29zeXN0ZW1Ob3RpZnlSZXF1ZXN0KTogUHJvbWlzZTxFY29zeXN0ZW1Ob3RpZnlSZXN1bHQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVjb3N5c3RlbU5vdGlmeUNsaWVudENvbmZpZyB7XG4gIC8qKiBUaGUgY2FsbGluZyBzZXJ2aWNlIOKAlCBtdXN0IGJlIG9uZSBvZiB0aGUgcmVsYXkncyBhbGxvd2VkIGNhbGxlcnMuICovXG4gIHNlcnZpY2VOYW1lOiBzdHJpbmc7XG4gIC8qKiBQbGF0Zm9ybSBob3N0IChkZWZhdWx0IGVudiBQTEFURk9STV9TRVJWSUNFX0hPU1Qgb3IgJ3BsYXRmb3JtJykuICovXG4gIGhvc3Q/OiBzdHJpbmc7XG4gIC8qKiBQbGF0Zm9ybSBwb3J0IChkZWZhdWx0IGVudiBQTEFURk9STV9TRVJWSUNFX1BPUlQgb3IgMzAwMCkuICovXG4gIHBvcnQ/OiBudW1iZXI7XG4gIC8qKiBSZXF1ZXN0IHRpbWVvdXQgbXMgKGRlZmF1bHQgMTAgMDAwIOKAlCBhIGZhbi1vdXQgdG8gbWFueSByZWNpcGllbnRzKS4gKi9cbiAgdGltZW91dD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDcmVhdGUgdGhlIHJlbGF5IGNsaWVudC4gTmV2ZXIgdGhyb3dzIGZyb20gYHNlbmRgIGZvciBhIHRyYW5zcG9ydCBwcm9ibGVtIOKAlFxuICogaXQgcmVzb2x2ZXMgYHsgb2s6IGZhbHNlIH1gIGFuZCBjb3VudHMgYGVjb3N5c3RlbV9ub3RpZmljYXRpb25fZmFpbGVkX3RvdGFsXG4gKiB7ZXZlbnR9YCBzbyB0aGUgY2FsbGVyICh0aGUgZGlnZXN0IGRpc3BhdGNoZXIpIGNhbiBrZWVwIHRoZSByb3cgZm9yIHJldHJ5LlxuICogSXQgRE9FUyB0aHJvdyBmb3IgYW4gaW52YWxpZCByZXF1ZXN0OiB0aGF0IGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IsIGFuZFxuICogcmV0cnlpbmcgaXQgd291bGQgbmV2ZXIgc3VjY2VlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVjb3N5c3RlbU5vdGlmeUNsaWVudChjb25maWc6IEVjb3N5c3RlbU5vdGlmeUNsaWVudENvbmZpZyk6IEVjb3N5c3RlbU5vdGlmeUNsaWVudCB7XG4gIGNvbnN0IHNlcnZpY2VDb25maWc6IFNlcnZpY2VDb25maWcgPSB7XG4gICAgaG9zdDogY29uZmlnLmhvc3QgPz8gc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpLmhvc3QsXG4gICAgcG9ydDogY29uZmlnLnBvcnQgPz8gc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpLnBvcnQsXG4gICAgdGltZW91dDogY29uZmlnLnRpbWVvdXQgPz8gMTBfMDAwLFxuICB9O1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVTYWZlQ2xpZW50KHNlcnZpY2VDb25maWcpO1xuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgc2VuZChyZXF1ZXN0OiBFY29zeXN0ZW1Ob3RpZnlSZXF1ZXN0KTogUHJvbWlzZTxFY29zeXN0ZW1Ob3RpZnlSZXN1bHQ+IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRWNvc3lzdGVtTm90aWZ5UmVxdWVzdChyZXF1ZXN0KTtcbiAgICAgIGlmICh0eXBlb2YgcGFyc2VkID09PSAnc3RyaW5nJykgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGVjb3N5c3RlbSBub3RpZmljYXRpb246ICR7cGFyc2VkfWApO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gU3lzdGVtLW9yZyBzY29wZWQsIGxlYXN0IHByaXZpbGVnZTogdGhlIHJlbGF5IGF1dGhvcml6ZXMgdGhlIENBTExFUiBieVxuICAgICAgICAvLyBpdHMga2V5LWJvdW5kIHNlcnZpY2UgbmFtZSwgbm90IGJ5IGEgcm9sZSBvciBwZXJtaXNzaW9uIG9uIHRoZSB0b2tlbi5cbiAgICAgICAgY29uc3QgYXV0aG9yaXphdGlvbiA9IGdldFNlcnZpY2VBdXRoSGVhZGVyKHsgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlTmFtZSwgb3JnSWQ6IFNZU1RFTV9PUkdfSUQsIHJvbGU6ICdtZW1iZXInIH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0PHsgZGF0YT86IHsgcmVjaXBpZW50Q291bnQ/OiBudW1iZXIgfTsgcmVjaXBpZW50Q291bnQ/OiBudW1iZXIgfT4oXG4gICAgICAgICAgRUNPU1lTVEVNX05PVElGWV9QQVRILCBwYXJzZWQsIHsgaGVhZGVyczogeyBBdXRob3JpemF0aW9uOiBhdXRob3JpemF0aW9uIH0gfSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gcmVzcG9uc2U/LnN0YXR1c0NvZGU7XG4gICAgICAgIGNvbnN0IG9rID0gc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICBlbWl0Q291bnRlcignZWNvc3lzdGVtX25vdGlmaWNhdGlvbl9mYWlsZWRfdG90YWwnLCB7IGV2ZW50OiBwYXJzZWQuZXZlbnQgfSk7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0Vjb3N5c3RlbSBub3RpZmljYXRpb24gbm90IGRlbGl2ZXJlZCcsIHsgZXZlbnQ6IHBhcnNlZC5ldmVudCwgc3RhdHVzOiBzdGF0dXMgPz8gJ3VucmVhY2hhYmxlJyB9KTtcbiAgICAgICAgICByZXR1cm4geyBvazogZmFsc2UsIC4uLihzdGF0dXMgIT09IHVuZGVmaW5lZCA/IHsgc3RhdHVzIH0gOiB7fSkgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBib2R5ID0gcmVzcG9uc2UhLmJvZHkgPz8ge307XG4gICAgICAgIGNvbnN0IHJlY2lwaWVudENvdW50ID0gYm9keS5kYXRhPy5yZWNpcGllbnRDb3VudCA/PyBib2R5LnJlY2lwaWVudENvdW50O1xuICAgICAgICByZXR1cm4geyBvazogdHJ1ZSwgc3RhdHVzLCAuLi4odHlwZW9mIHJlY2lwaWVudENvdW50ID09PSAnbnVtYmVyJyA/IHsgcmVjaXBpZW50Q291bnQgfSA6IHt9KSB9O1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGVtaXRDb3VudGVyKCdlY29zeXN0ZW1fbm90aWZpY2F0aW9uX2ZhaWxlZF90b3RhbCcsIHsgZXZlbnQ6IHBhcnNlZC5ldmVudCB9KTtcbiAgICAgICAgbG9nZ2VyLndhcm4oJ0Vjb3N5c3RlbSBub3RpZmljYXRpb24gZmFpbGVkJywgeyBldmVudDogcGFyc2VkLmV2ZW50LCBlcnJvcjogZXJyb3JNZXNzYWdlKGVycikgfSk7XG4gICAgICAgIHJldHVybiB7IG9rOiBmYWxzZSB9O1xuICAgICAgfVxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
@@ -80,7 +80,10 @@ export declare function createRedisClient<T = unknown>(conn: RedisConnection, la
|
|
|
80
80
|
* configured but `ioredis` can't be loaded — both are deployment errors that
|
|
81
81
|
* must not quietly turn Redis-backed guarantees off.
|
|
82
82
|
*/
|
|
83
|
-
export declare function createEnvRedisClient<T = unknown>(label: string
|
|
83
|
+
export declare function createEnvRedisClient<T = unknown>(label: string, opts?: {
|
|
84
|
+
readyGate?: boolean;
|
|
85
|
+
readyTimeoutMs?: number;
|
|
86
|
+
}): T | null;
|
|
84
87
|
/** The subset of ioredis needed to wait for a connection. */
|
|
85
88
|
export interface ReadyAwareRedis {
|
|
86
89
|
status?: string;
|
|
@@ -145,13 +145,42 @@ export function createRedisClient(conn, label, options = {}) {
|
|
|
145
145
|
* configured but `ioredis` can't be loaded — both are deployment errors that
|
|
146
146
|
* must not quietly turn Redis-backed guarantees off.
|
|
147
147
|
*/
|
|
148
|
-
export function createEnvRedisClient(label) {
|
|
148
|
+
export function createEnvRedisClient(label, opts = {}) {
|
|
149
149
|
const conn = resolveRedisConnection();
|
|
150
150
|
if (!conn)
|
|
151
151
|
return null;
|
|
152
152
|
const inst = createRedisClient(conn, label, { maxRetriesPerRequest: 1, enableOfflineQueue: false });
|
|
153
153
|
logger.info(`Redis ${label} client created`, describeRedisConnection(conn));
|
|
154
|
-
return
|
|
154
|
+
return opts.readyGate === false
|
|
155
|
+
? inst
|
|
156
|
+
: withReadyGate(inst, createRedisReadyGate(inst, opts.readyTimeoutMs));
|
|
157
|
+
}
|
|
158
|
+
/** Client methods that are synchronous, manage the connection itself, or build
|
|
159
|
+
* a batch — never deferred behind the readiness gate. */
|
|
160
|
+
const UNGATED_METHODS = new Set([
|
|
161
|
+
'on', 'once', 'off', 'addListener', 'removeListener', 'removeAllListeners', 'emit',
|
|
162
|
+
'listeners', 'listenerCount', 'setMaxListeners', 'getMaxListeners', 'prependListener',
|
|
163
|
+
'connect', 'disconnect', 'quit', 'duplicate', 'pipeline', 'multi', 'defineCommand',
|
|
164
|
+
]);
|
|
165
|
+
/**
|
|
166
|
+
* Wrap a no-offline-queue client so every command first waits (bounded, never
|
|
167
|
+
* rejecting — see {@link createRedisReadyGate}) for the connection. Without it
|
|
168
|
+
* the first command a caller issues right after a lazy construction is rejected
|
|
169
|
+
* outright, e.g. a startup consumer-group create or the first idempotency check.
|
|
170
|
+
*/
|
|
171
|
+
function withReadyGate(client, ready) {
|
|
172
|
+
return new Proxy(client, {
|
|
173
|
+
get(target, prop, receiver) {
|
|
174
|
+
const value = Reflect.get(target, prop, receiver);
|
|
175
|
+
if (typeof value !== 'function' || typeof prop !== 'string' || UNGATED_METHODS.has(prop)) {
|
|
176
|
+
return typeof value === 'function' ? value.bind(target) : value;
|
|
177
|
+
}
|
|
178
|
+
return async (...args) => {
|
|
179
|
+
await ready();
|
|
180
|
+
return value.apply(target, args);
|
|
181
|
+
};
|
|
182
|
+
},
|
|
183
|
+
});
|
|
155
184
|
}
|
|
156
185
|
/**
|
|
157
186
|
* Resolve once `client` is connected and ready for commands, or reject after
|
|
@@ -234,4 +263,4 @@ export async function incrWindow(redis, key, windowMs) {
|
|
|
234
263
|
const n = await redis.eval(INCR_WINDOW_SCRIPT, 1, key, Math.max(1, Math.ceil(windowMs)));
|
|
235
264
|
return Number(n);
|
|
236
265
|
}
|
|
237
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LXJlZGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Vudi1yZWRpcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFekM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFFSCxvRUFBb0U7QUFDcEUsTUFBTSxPQUFPLGdCQUFpQixTQUFRLEtBQUs7SUFDekMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBaUJEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQXVCO0lBQ3BELElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDcEIsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3ZFLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENB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QUFNO1lBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2QsUUFBUSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDO2lCQUN6QyxLQUFLLENBQUMsR0FBRyxFQUFFO2dCQUNWLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2Qsa0RBQWtEO2dCQUNsRCxNQUFNLENBQUMsSUFBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbkQsQ0FBQyxDQUFDO2lCQUNELE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFPRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sa0JBQWtCLEdBQUc7Ozs7O1NBS2xCLENBQUM7QUFFVjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxLQUFzQixFQUFFLEdBQVcsRUFBRSxRQUFnQjtJQUNwRixNQUFNLENBQUMsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdtb2R1bGUnO1xuXG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2Vudi1yZWRpcycpO1xuXG4vKipcbiAqIFRoZSBPTkUgcGxhY2UgUmVkaXMgY29ubmVjdGlvbiBzZXR0aW5ncyBhcmUgcmVhZCBmcm9tIHRoZSBlbnZpcm9ubWVudC5cbiAqXG4gKiBUd28gc2hhcGVzLCBleGFjdGx5IG9uZSBvZiB3aGljaCBtYXkgYmUgc2V0OlxuICpcbiAqIC0gKipTdGFuZGFsb25lKiog4oCUIGBSRURJU19VUkxgIChgcmVkaXM6Ly9ob3N0OjYzNzlbL2RiXWAsIG9yIGByZWRpc3M6Ly9gIGZvclxuICogICBUTFMpLiBDcmVkZW50aWFscyBtYXkgc2l0IGluIHRoZSBVUkwgb3IgaW4gYFJFRElTX1BBU1NXT1JEYC5cbiAqIC0gKipIQSAoU2VudGluZWwpKiog4oCUIGBSRURJU19TRU5USU5FTFNgIChjb21tYS1zZXBhcmF0ZWQgYGhvc3Q6cG9ydGApIHBsdXNcbiAqICAgYFJFRElTX1NFTlRJTkVMX01BU1RFUmAgKGRlZmF1bHQgYG15bWFzdGVyYCkgYW5kIG9wdGlvbmFsXG4gKiAgIGBSRURJU19TRU5USU5FTF9QQVNTV09SRGAuIGBSRURJU19QQVNTV09SRGAgYXV0aGVudGljYXRlcyB0byB0aGUgZGF0YSBub2Rlcy5cbiAqICAgaW9yZWRpcyBmb2xsb3dzIHRoZSBtYXN0ZXIgYWNyb3NzIGEgZmFpbG92ZXIuXG4gKlxuICogTmVpdGhlciBzZXQg4oaSIFJlZGlzIGlzIG9mZiwgYW5kIGVhY2ggY2FsbGVyIGRlZ3JhZGVzIHRvIGl0cyBkb2N1bWVudGVkXG4gKiBuby1SZWRpcyBiZWhhdmlvci5cbiAqXG4gKiBgUkVESVNfSE9TVGAgLyBgUkVESVNfUE9SVGAgYXJlIG5vdCByZWFkLiBgUkVESVNfSE9TVGAgaXMgcmVmdXNlZCBvdXRyaWdodCBzbyBhXG4gKiBzdGFsZSBjb25maWcgZmFpbHMgYXQgc3RhcnR1cCBpbnN0ZWFkIG9mIHNpbGVudGx5IHJ1bm5pbmcgd2l0aG91dCBSZWRpcy5cbiAqIGBSRURJU19QT1JUYCBjYW4ndCBiZSByZWZ1c2VkOiBLdWJlcm5ldGVzIGluamVjdHMgYFJFRElTX1BPUlQ9dGNwOi8vPGlwPjo2Mzc5YFxuICogaW50byBldmVyeSBwb2QgaW4gYSBuYW1lc3BhY2Ugd2l0aCBhIFNlcnZpY2UgbmFtZWQgYHJlZGlzYCwgd2hpY2ggaXMgZXhhY3RseVxuICogd2h5IGEgaG9zdC9wb3J0IHBhaXIgd2FzIHVuc2FmZSB0byBwYXJzZS5cbiAqXG4gKiBNaXNjb25maWd1cmF0aW9uIHRocm93cyB7QGxpbmsgUmVkaXNDb25maWdFcnJvcn0uIFdyaXRlcnMgYW5kIHJlYWRlcnMgb2YgdGhlXG4gKiBzYW1lIGtleXMgKHJldm9jYXRpb24sIHN0ZXAtdXAsIGxlYWRlciBsb2NrcykgbXVzdCByZXNvbHZlIFJlZGlzIGlkZW50aWNhbGx5O1xuICogYSBjb25maWcgdGhhdCBxdWlldGx5IHJlc29sdmVkIHRvIFwibm8gUmVkaXNcIiBvbiBvbmUgc2lkZSBpcyBob3cgcmV2b2NhdGlvblxuICogb25jZSBkaWQgbm90aGluZyBhdCBhbGwuXG4gKi9cblxuLyoqIFRocm93biBmb3IgYSBSZWRpcyBlbnZpcm9ubWVudCB0aGF0IGNhbid0IGJlIHVzZWQgYXMgd3JpdHRlbi4gKi9cbmV4cG9ydCBjbGFzcyBSZWRpc0NvbmZpZ0Vycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnUmVkaXNDb25maWdFcnJvcic7XG4gIH1cbn1cblxuLyoqIFJlc29sdmVkIGNvbm5lY3Rpb24sIGluZGVwZW5kZW50IG9mIGFueSBjbGllbnQgbGlicmFyeS4gKi9cbmV4cG9ydCB0eXBlIFJlZGlzQ29ubmVjdGlvbiA9XG4gIHwge1xuICAgIG1vZGU6ICdzZW50aW5lbCc7XG4gICAgc2VudGluZWxzOiBBcnJheTx7IGhvc3Q6IHN0cmluZzsgcG9ydDogbnVtYmVyIH0+O1xuICAgIG1hc3Rlck5hbWU6IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBzZW50aW5lbFBhc3N3b3JkPzogc3RyaW5nO1xuICB9XG4gIHwge1xuICAgIG1vZGU6ICd1cmwnO1xuICAgIHVybDogc3RyaW5nO1xuICAgIHBhc3N3b3JkPzogc3RyaW5nO1xuICB9O1xuXG4vKipcbiAqIFBhcnNlIGBSRURJU19TRU5USU5FTFNgIGludG8gYHsgaG9zdCwgcG9ydCB9W11gLiBCbGFuayBlbnRyaWVzIGFyZSBza2lwcGVkIGFuZFxuICogYSBtaXNzaW5nIHBvcnQgbWVhbnMgdGhlIFNlbnRpbmVsIGRlZmF1bHQgMjYzNzk7IGEgcG9ydCB0aGF0IGlzbid0IGEgdmFsaWRcbiAqIFRDUCBwb3J0IGlzIGEgY29uZmlndXJhdGlvbiBlcnJvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU2VudGluZWxzKHJhdzogc3RyaW5nIHwgdW5kZWZpbmVkKTogQXJyYXk8eyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9PiB7XG4gIGlmICghcmF3KSByZXR1cm4gW107XG4gIHJldHVybiByYXcuc3BsaXQoJywnKS5tYXAoKHMpID0+IHMudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikubWFwKChlbnRyeSkgPT4ge1xuICAgIGNvbnN0IGlkeCA9IGVudHJ5Lmxhc3RJbmRleE9mKCc6Jyk7XG4gICAgY29uc3QgaG9zdCA9IGlkeCA9PT0gLTEgPyBlbnRyeSA6IGVudHJ5LnNsaWNlKDAsIGlkeCk7XG4gICAgY29uc3QgcG9ydFRleHQgPSBpZHggPT09IC0xID8gJycgOiBlbnRyeS5zbGljZShpZHggKyAxKTtcbiAgICBjb25zdCBwb3J0ID0gcG9ydFRleHQgPT09ICcnID8gMjYzNzkgOiBOdW1iZXIocG9ydFRleHQpO1xuICAgIGlmICghaG9zdCB8fCAhTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDwgMSB8fCBwb3J0ID4gNjU1MzUpIHtcbiAgICAgIHRocm93IG5ldyBSZWRpc0NvbmZpZ0Vycm9yKGBSRURJU19TRU5USU5FTFMgZW50cnkgXCIke2VudHJ5fVwiIGlzIG5vdCBob3N0OnBvcnRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaG9zdCwgcG9ydCB9O1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBSZWRpcyBjb25uZWN0aW9uIGZyb20gYGVudmAsIG9yIGBudWxsYCB3aGVuIFJlZGlzIGlzbid0XG4gKiBjb25maWd1cmVkLiBUaHJvd3Mge0BsaW5rIFJlZGlzQ29uZmlnRXJyb3J9IGZvciBhbiB1bnVzYWJsZSBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlZGlzQ29ubmVjdGlvbihlbnY6IE5vZGVKUy5Qcm9jZXNzRW52ID0gcHJvY2Vzcy5lbnYpOiBSZWRpc0Nvbm5lY3Rpb24gfCBudWxsIHtcbiAgaWYgKGVudi5SRURJU19IT1NUKSB7XG4gICAgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoXG4gICAgICAnUkVESVNfSE9TVCBpcyBub3Qgc3VwcG9ydGVkLiBTZXQgUkVESVNfVVJMPXJlZGlzOi8vPGhvc3Q+Ojxwb3J0PiAob3IgUkVESVNfU0VOVElORUxTIGZvciBIQSkgYW5kIHJlbW92ZSBSRURJU19IT1NUL1JFRElTX1BPUlQuJyxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc2VudGluZWxzID0gcGFyc2VTZW50aW5lbHMoZW52LlJFRElTX1NFTlRJTkVMUyk7XG4gIGNvbnN0IHVybCA9IGVudi5SRURJU19VUkw/LnRyaW0oKTtcbiAgY29uc3QgcGFzc3dvcmQgPSBlbnYuUkVESVNfUEFTU1dPUkQgfHwgdW5kZWZpbmVkO1xuXG4gIGlmIChzZW50aW5lbHMubGVuZ3RoID4gMCAmJiB1cmwpIHtcbiAgICB0aHJvdyBuZXcgUmVkaXNDb25maWdFcnJvcignU2V0IFJFRElTX1VSTCBvciBSRURJU19TRU5USU5FTFMsIG5vdCBib3RoLicpO1xuICB9XG5cbiAgaWYgKHNlbnRpbmVscy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1vZGU6ICdzZW50aW5lbCcsXG4gICAgICBzZW50aW5lbHMsXG4gICAgICBtYXN0ZXJOYW1lOiBlbnYuUkVESVNfU0VOVElORUxfTUFTVEVSIHx8ICdteW1hc3RlcicsXG4gICAgICBwYXNzd29yZCxcbiAgICAgIHNlbnRpbmVsUGFzc3dvcmQ6IGVudi5SRURJU19TRU5USU5FTF9QQVNTV09SRCB8fCB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIGlmICh1cmwpIHtcbiAgICBsZXQgcGFyc2VkOiBVUkw7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBSZWRpc0NvbmZpZ0Vycm9yKCdSRURJU19VUkwgaXMgbm90IGEgdmFsaWQgVVJMIChleHBlY3RlZCByZWRpczovLzxob3N0Pjo8cG9ydD4pLicpO1xuICAgIH1cbiAgICBpZiAocGFyc2VkLnByb3RvY29sICE9PSAncmVkaXM6JyAmJiBwYXJzZWQucHJvdG9jb2wgIT09ICdyZWRpc3M6Jykge1xuICAgICAgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoYFJFRElTX1VSTCBtdXN0IHVzZSByZWRpczovLyBvciByZWRpc3M6Ly8sIGdvdCAke3BhcnNlZC5wcm90b2NvbH0vL2ApO1xuICAgIH1cbiAgICBpZiAoIXBhcnNlZC5ob3N0bmFtZSkgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoJ1JFRElTX1VSTCBoYXMgbm8gaG9zdC4nKTtcbiAgICByZXR1cm4geyBtb2RlOiAndXJsJywgdXJsLCBwYXNzd29yZCB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBBIGxvZy1zYWZlIGRlc2NyaXB0aW9uIG9mIGEgY29ubmVjdGlvbiAobmV2ZXIgaW5jbHVkZXMgY3JlZGVudGlhbHMpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlc2NyaWJlUmVkaXNDb25uZWN0aW9uKGNvbm46IFJlZGlzQ29ubmVjdGlvbik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKGNvbm4ubW9kZSA9PT0gJ3NlbnRpbmVsJykge1xuICAgIHJldHVybiB7IG1vZGU6ICdzZW50aW5lbCcsIG1hc3RlcjogY29ubi5tYXN0ZXJOYW1lLCBzZW50aW5lbHM6IGNvbm4uc2VudGluZWxzLmxlbmd0aCB9O1xuICB9XG4gIGNvbnN0IHUgPSBuZXcgVVJMKGNvbm4udXJsKTtcbiAgcmV0dXJuIHsgbW9kZTogJ3VybCcsIGhvc3Q6IHUuaG9zdG5hbWUsIHBvcnQ6IHUucG9ydCB8fCAnNjM3OScsIHRsczogdS5wcm90b2NvbCA9PT0gJ3JlZGlzczonIH07XG59XG5cbnR5cGUgUmVkaXNDdG9yPFQ+ID0gbmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQ7XG5cbmZ1bmN0aW9uIGxvYWRJb3JlZGlzPFQ+KCk6IFJlZGlzQ3RvcjxUPiB7XG4gIGNvbnN0IHJlcSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgY29uc3QgbW9kID0gcmVxKCdpb3JlZGlzJykgYXMgeyBSZWRpcz86IFJlZGlzQ3RvcjxUPjsgZGVmYXVsdD86IFJlZGlzQ3RvcjxUPiB9O1xuICByZXR1cm4gKG1vZC5SZWRpcyA/PyBtb2QuZGVmYXVsdCA/PyBtb2QpIGFzIFJlZGlzQ3RvcjxUPjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgYW4gaW9yZWRpcyBjbGllbnQgZm9yIGEgcmVzb2x2ZWQgY29ubmVjdGlvbi4gYG9wdGlvbnNgIGFyZSBtZXJnZWRcbiAqIGludG8gdGhlIGNsaWVudCBvcHRpb25zIChlLmcuIGB7IGRiLCBtYXhSZXRyaWVzUGVyUmVxdWVzdDogbnVsbCB9YCBmb3IgQnVsbE1RKS5cbiAqIEFuIGBlcnJvcmAgbGlzdGVuZXIgaXMgYWx3YXlzIGF0dGFjaGVkIHNvIGEgZHJvcHBlZCBjb25uZWN0aW9uIGlzIGxvZ2dlZFxuICogcmF0aGVyIHRoYW4gc3VyZmFjaW5nIGFzIGFuIHVuaGFuZGxlZCBgJ2Vycm9yJ2AgZXZlbnQgdGhhdCBjcmFzaGVzIE5vZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc0NsaWVudDxUID0gdW5rbm93bj4oXG4gIGNvbm46IFJlZGlzQ29ubmVjdGlvbixcbiAgbGFiZWw6IHN0cmluZyxcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbik6IFQge1xuICBjb25zdCBDdG9yID0gbG9hZElvcmVkaXM8VD4oKTtcbiAgY29uc3QgYXV0aCA9IGNvbm4ucGFzc3dvcmQgPyB7IHBhc3N3b3JkOiBjb25uLnBhc3N3b3JkIH0gOiB7fTtcbiAgY29uc3QgaW5zdCA9IGNvbm4ubW9kZSA9PT0gJ3NlbnRpbmVsJ1xuICAgID8gbmV3IEN0b3Ioe1xuICAgICAgc2VudGluZWxzOiBjb25uLnNlbnRpbmVscyxcbiAgICAgIG5hbWU6IGNvbm4ubWFzdGVyTmFtZSxcbiAgICAgIC4uLihjb25uLnNlbnRpbmVsUGFzc3dvcmQgPyB7IHNlbnRpbmVsUGFzc3dvcmQ6IGNvbm4uc2VudGluZWxQYXNzd29yZCB9IDoge30pLFxuICAgICAgLi4uYXV0aCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSlcbiAgICA6IG5ldyBDdG9yKGNvbm4udXJsLCB7IC4uLmF1dGgsIC4uLm9wdGlvbnMgfSk7XG4gIChpbnN0IGFzIHVua25vd24gYXMgeyBvbjogKGV2dDogc3RyaW5nLCBjYjogKGU6IHVua25vd24pID0+IHZvaWQpID0+IHZvaWQgfSlcbiAgICAub24oJ2Vycm9yJywgKGUpID0+IGxvZ2dlci53YXJuKGBSZWRpcyAke2xhYmVsfSBjbGllbnQgZXJyb3JgLCB7IGVycm9yOiBlcnJvck1lc3NhZ2UoZSkgfSkpO1xuICByZXR1cm4gaW5zdDtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcmVkIGFwcGxpY2F0aW9uIFJlZGlzIGNsaWVudDogYG51bGxgIHdoZW4gUmVkaXMgaXNuJ3QgY29uZmlndXJlZCwgc29cbiAqIHRoZSBjYWxsZXIgZGVncmFkZXMgdG8gaXRzIG5vLVJlZGlzIGJlaGF2aW9yLlxuICpcbiAqIENvbW1hbmRzIGZhaWwgZmFzdCAoYG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxYCwgbm8gb2ZmbGluZSBxdWV1ZSkgYmVjYXVzZSB0aGVcbiAqIHJlcXVlc3QtcGF0aCBjYWxsZXJzIGFyZSBiZXN0LWVmZm9ydCBvciBmYWlsIGNsb3NlZCBvbiB0aGVpciBvd24gdGVybXMg4oCUIGFcbiAqIHJlcXVlc3QgbXVzdCBub3QgaGFuZyBiZWhpbmQgYSBSZWRpcyBvdXRhZ2UuIFRoYXQgaW5jbHVkZXMgdGhlIG1vbWVudHMgYmVmb3JlXG4gKiB0aGUgZmlyc3QgY29ubmVjdGlvbiBjb21wbGV0ZXM6IGEgYmFja2dyb3VuZCBjYWxsZXIgdGhhdCBydW5zIGF0IHN0YXJ0dXAgbXVzdFxuICogZWl0aGVyIHRvbGVyYXRlIGEgcmVqZWN0ZWQgY29tbWFuZCBvciB3YWl0IHdpdGgge0BsaW5rIHdoZW5SZWRpc1JlYWR5fS5cbiAqXG4gKiBUaHJvd3Mge0BsaW5rIFJlZGlzQ29uZmlnRXJyb3J9IGZvciBhIGJhZCBjb25maWd1cmF0aW9uLCBhbmQgaWYgUmVkaXMgaXNcbiAqIGNvbmZpZ3VyZWQgYnV0IGBpb3JlZGlzYCBjYW4ndCBiZSBsb2FkZWQg4oCUIGJvdGggYXJlIGRlcGxveW1lbnQgZXJyb3JzIHRoYXRcbiAqIG11c3Qgbm90IHF1aWV0bHkgdHVybiBSZWRpcy1iYWNrZWQgZ3VhcmFudGVlcyBvZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc0NsaWVudDxUID0gdW5rbm93bj4obGFiZWw6IHN0cmluZyk6IFQgfCBudWxsIHtcbiAgY29uc3QgY29ubiA9IHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24oKTtcbiAgaWYgKCFjb25uKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaW5zdCA9IGNyZWF0ZVJlZGlzQ2xpZW50PFQ+KGNvbm4sIGxhYmVsLCB7IG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxLCBlbmFibGVPZmZsaW5lUXVldWU6IGZhbHNlIH0pO1xuICBsb2dnZXIuaW5mbyhgUmVkaXMgJHtsYWJlbH0gY2xpZW50IGNyZWF0ZWRgLCBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbihjb25uKSk7XG4gIHJldHVybiBpbnN0O1xufVxuXG4vKiogVGhlIHN1YnNldCBvZiBpb3JlZGlzIG5lZWRlZCB0byB3YWl0IGZvciBhIGNvbm5lY3Rpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlYWR5QXdhcmVSZWRpcyB7XG4gIHN0YXR1cz86IHN0cmluZztcbiAgb25jZT8oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpOiB1bmtub3duO1xuICBvZmY/KGV2ZW50OiBzdHJpbmcsIGNiOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkKTogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9uY2UgYGNsaWVudGAgaXMgY29ubmVjdGVkIGFuZCByZWFkeSBmb3IgY29tbWFuZHMsIG9yIHJlamVjdCBhZnRlclxuICogYHRpbWVvdXRNc2AuIEZvciBzdGFydHVwIHdvcmsgKGNyZWF0aW5nIGEgY29uc3VtZXIgZ3JvdXAsIHN1YnNjcmliaW5nKSB0aGF0XG4gKiBvdGhlcndpc2UgcmFjZXMgdGhlIGZpcnN0IGNvbm5lY3Rpb24uIEEgY2xpZW50IHdpdGhvdXQgaW9yZWRpcycgYHN0YXR1c2BcbiAqIChlLmcuIGEgdGVzdCBkb3VibGUpIGNvdW50cyBhcyByZWFkeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdoZW5SZWRpc1JlYWR5KGNsaWVudDogUmVhZHlBd2FyZVJlZGlzLCB0aW1lb3V0TXMgPSAzMF8wMDApOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGNsaWVudC5zdGF0dXMgPT09IHVuZGVmaW5lZCB8fCBjbGllbnQuc3RhdHVzID09PSAncmVhZHknIHx8ICFjbGllbnQub25jZSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IG9uUmVhZHkgPSAoKSA9PiB7IGNsZWFyVGltZW91dCh0aW1lcik7IHJlc29sdmUoKTsgfTtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY2xpZW50Lm9mZj8uKCdyZWFkeScsIG9uUmVhZHkpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgUmVkaXMgbm90IHJlYWR5IGFmdGVyICR7dGltZW91dE1zfW1zYCkpO1xuICAgIH0sIHRpbWVvdXRNcyk7XG4gICAgdGltZXIudW5yZWY/LigpO1xuICAgIGNsaWVudC5vbmNlISgncmVhZHknLCBvblJlYWR5KTtcbiAgfSk7XG59XG5cbi8qKiBEZWZhdWx0IGJvdW5kIGZvciB7QGxpbmsgY3JlYXRlUmVkaXNSZWFkeUdhdGV9OiBzaG9ydCBlbm91Z2ggZm9yIGEgcmVxdWVzdCBwYXRoLiAqL1xuZXhwb3J0IGNvbnN0IFJFUVVFU1RfUEFUSF9SRURJU19SRUFEWV9USU1FT1VUX01TID0gMl8wMDA7XG5cbi8qKlxuICogQSByZXF1ZXN0LXBhdGggcmVhZGluZXNzIGdhdGUgZm9yIGEgbGF6aWx5IGJ1aWx0IGVudiBSZWRpcyBjbGllbnQuXG4gKlxuICogVGhlIGVudiBjbGllbnQgaGFzIG5vIG9mZmxpbmUgcXVldWUsIHNvIGEgY29tbWFuZCBpc3N1ZWQgYmVmb3JlIHRoZSBmaXJzdFxuICogY29ubmVjdGlvbiBjb21wbGV0ZXMgaXMgcmVqZWN0ZWQgb3V0cmlnaHQg4oCUIHRoZSBmaXJzdCByZXF1ZXN0IGFmdGVyIGEgbGF6eVxuICogY29uc3RydWN0aW9uIHdvdWxkIG90aGVyd2lzZSBoaXQgdGhhdCByZWplY3Rpb24gKGUuZy4gdGhlIGZpcnN0IHN0ZXAtdXAgcGVyXG4gKiBwb2QgZmFpbGluZywgb3IgdGhlIGZpcnN0IGltcGVyc29uYXRpb24gY2hlY2sgcmVhZGluZyBcInVuYXZhaWxhYmxlXCIpLlxuICpcbiAqIFRoZSByZXR1cm5lZCBmdW5jdGlvbiByZXNvbHZlcyBvbmNlIHRoZSBjbGllbnQgaXMgcmVhZHksIG9yIGFmdGVyXG4gKiBgdGltZW91dE1zYCDigJQgaXQgTkVWRVIgcmVqZWN0czogdGhlIGNhbGxlciB0aGVuIHJ1bnMgaXRzIGNvbW1hbmQgYW5kIGtlZXBzIGl0c1xuICogb3duIGZhaWwtb3BlbiAvIGZhaWwtY2xvc2VkIHNlbWFudGljcy4gQ29uY3VycmVudCBjYWxsZXJzIHNoYXJlIG9uZSB3YWl0LiBBZnRlclxuICogYSB3YWl0IHRpbWVzIG91dCAoUmVkaXMgZ2VudWluZWx5IGRvd24pIGxhdGVyIGNhbGxzIHN0b3Agd2FpdGluZyB1bnRpbCB0aGVcbiAqIGNsaWVudCByZXBvcnRzIGByZWFkeWAgYWdhaW4sIHNvIGFuIG91dGFnZSBjb3N0cyBvbmUgYm91bmRlZCB3YWl0IGluc3RlYWQgb2ZcbiAqIGFkZGluZyBgdGltZW91dE1zYCB0byBldmVyeSByZXF1ZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNSZWFkeUdhdGUoXG4gIGNsaWVudDogUmVhZHlBd2FyZVJlZGlzLFxuICB0aW1lb3V0TXMgPSBSRVFVRVNUX1BBVEhfUkVESVNfUkVBRFlfVElNRU9VVF9NUyxcbik6ICgpID0+IFByb21pc2U8dm9pZD4ge1xuICBsZXQgaW5mbGlnaHQ6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgbGV0IGdhdmVVcCA9IGZhbHNlO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGlmIChjbGllbnQuc3RhdHVzID09PSB1bmRlZmluZWQgfHwgY2xpZW50LnN0YXR1cyA9PT0gJ3JlYWR5JyB8fCAhY2xpZW50Lm9uY2UpIHtcbiAgICAgIGdhdmVVcCA9IGZhbHNlO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBpZiAoZ2F2ZVVwKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgaWYgKCFpbmZsaWdodCkge1xuICAgICAgaW5mbGlnaHQgPSB3aGVuUmVkaXNSZWFkeShjbGllbnQsIHRpbWVvdXRNcylcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBnYXZlVXAgPSB0cnVlO1xuICAgICAgICAgIC8vIFJlLWFybSB0aGUgd2FpdCBvbmNlIHRoZSBjb25uZWN0aW9uIGNvbWVzIGJhY2suXG4gICAgICAgICAgY2xpZW50Lm9uY2UhKCdyZWFkeScsICgpID0+IHsgZ2F2ZVVwID0gZmFsc2U7IH0pO1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7IGluZmxpZ2h0ID0gbnVsbDsgfSk7XG4gICAgfVxuICAgIHJldHVybiBpbmZsaWdodDtcbiAgfTtcbn1cblxuLyoqIFRoZSBzdWJzZXQgb2YgaW9yZWRpcyBuZWVkZWQgYnkge0BsaW5rIGluY3JXaW5kb3d9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRpc0V2YWxDbGllbnQge1xuICBldmFsKHNjcmlwdDogc3RyaW5nLCBudW1LZXlzOiBudW1iZXIsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHVua25vd24+O1xufVxuXG4vKipcbiAqIElOQ1IgYSBmaXhlZC13aW5kb3cgY291bnRlciBhbmQgbWFrZSBzdXJlIGl0IGNhcnJpZXMgYSBUVEwsIGF0b21pY2FsbHkuXG4gKlxuICogQSBzZXBhcmF0ZSBgSU5DUmAgdGhlbiBgRVhQSVJFYCBpcyBub3QgYXRvbWljOiBpZiB0aGUgRVhQSVJFIGlzIGxvc3QgKGFcbiAqIGNvbm5lY3Rpb24gZHJvcCwgYSBmYWlsb3ZlciBiZXR3ZWVuIHRoZSB0d28gY29tbWFuZHMpIHRoZSBrZXkgbmV2ZXIgZXhwaXJlc1xuICogYW5kIHRoZSBjb3VudGVyIHN0YXlzIG92ZXIgaXRzIGxpbWl0IGZvcmV2ZXIuIFRoZSBzY3JpcHQgYWxzbyBoZWFscyBhIGtleVxuICogdGhhdCBzb21laG93IGxhY2tzIGEgVFRMIChgUFRUTGAgPSAtMSkgcmF0aGVyIHRoYW4gb25seSBzZXR0aW5nIGl0IG9uIHRoZVxuICogZmlyc3QgaGl0LlxuICovXG5jb25zdCBJTkNSX1dJTkRPV19TQ1JJUFQgPSBgXG5sb2NhbCBuID0gcmVkaXMuY2FsbCgnSU5DUicsIEtFWVNbMV0pXG5pZiBuID09IDEgb3IgcmVkaXMuY2FsbCgnUFRUTCcsIEtFWVNbMV0pIDwgMCB0aGVuXG4gIHJlZGlzLmNhbGwoJ1BFWFBJUkUnLCBLRVlTWzFdLCBBUkdWWzFdKVxuZW5kXG5yZXR1cm4gbmA7XG5cbi8qKlxuICogSW5jcmVtZW50IGBrZXlgIHdpdGhpbiBhIHdpbmRvdyBvZiBgd2luZG93TXNgIGFuZCByZXR1cm4gdGhlIG5ldyBjb3VudC5cbiAqIFRocm93cyB3aGVuIFJlZGlzIGVycm9ycyDigJQgY2FsbGVycyBjaG9vc2UgdGhlaXIgb3duIGZhaWx1cmUgcG9saWN5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5jcldpbmRvdyhyZWRpczogUmVkaXNFdmFsQ2xpZW50LCBrZXk6IHN0cmluZywgd2luZG93TXM6IG51bWJlcik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGNvbnN0IG4gPSBhd2FpdCByZWRpcy5ldmFsKElOQ1JfV0lORE9XX1NDUklQVCwgMSwga2V5LCBNYXRoLm1heCgxLCBNYXRoLmNlaWwod2luZG93TXMpKSk7XG4gIHJldHVybiBOdW1iZXIobik7XG59XG4iXX0=
|
|
266
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LXJlZGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2Vudi1yZWRpcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFekM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFFSCxvRUFBb0U7QUFDcEUsTUFBTSxPQUFPLGdCQUFpQixTQUFRLEtBQUs7SUFDekMsWUFBWSxPQUFlO1FBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBaUJEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEdBQXVCO0lBQ3BELElBQUksQ0FBQyxHQUFHO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDcEIsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3ZFLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENB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IEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcblxuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3V0aWxzL3Jlc3BvbnNlLmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdlbnYtcmVkaXMnKTtcblxuLyoqXG4gKiBUaGUgT05FIHBsYWNlIFJlZGlzIGNvbm5lY3Rpb24gc2V0dGluZ3MgYXJlIHJlYWQgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gKlxuICogVHdvIHNoYXBlcywgZXhhY3RseSBvbmUgb2Ygd2hpY2ggbWF5IGJlIHNldDpcbiAqXG4gKiAtICoqU3RhbmRhbG9uZSoqIOKAlCBgUkVESVNfVVJMYCAoYHJlZGlzOi8vaG9zdDo2Mzc5Wy9kYl1gLCBvciBgcmVkaXNzOi8vYCBmb3JcbiAqICAgVExTKS4gQ3JlZGVudGlhbHMgbWF5IHNpdCBpbiB0aGUgVVJMIG9yIGluIGBSRURJU19QQVNTV09SRGAuXG4gKiAtICoqSEEgKFNlbnRpbmVsKSoqIOKAlCBgUkVESVNfU0VOVElORUxTYCAoY29tbWEtc2VwYXJhdGVkIGBob3N0OnBvcnRgKSBwbHVzXG4gKiAgIGBSRURJU19TRU5USU5FTF9NQVNURVJgIChkZWZhdWx0IGBteW1hc3RlcmApIGFuZCBvcHRpb25hbFxuICogICBgUkVESVNfU0VOVElORUxfUEFTU1dPUkRgLiBgUkVESVNfUEFTU1dPUkRgIGF1dGhlbnRpY2F0ZXMgdG8gdGhlIGRhdGEgbm9kZXMuXG4gKiAgIGlvcmVkaXMgZm9sbG93cyB0aGUgbWFzdGVyIGFjcm9zcyBhIGZhaWxvdmVyLlxuICpcbiAqIE5laXRoZXIgc2V0IOKGkiBSZWRpcyBpcyBvZmYsIGFuZCBlYWNoIGNhbGxlciBkZWdyYWRlcyB0byBpdHMgZG9jdW1lbnRlZFxuICogbm8tUmVkaXMgYmVoYXZpb3IuXG4gKlxuICogYFJFRElTX0hPU1RgIC8gYFJFRElTX1BPUlRgIGFyZSBub3QgcmVhZC4gYFJFRElTX0hPU1RgIGlzIHJlZnVzZWQgb3V0cmlnaHQgc28gYVxuICogc3RhbGUgY29uZmlnIGZhaWxzIGF0IHN0YXJ0dXAgaW5zdGVhZCBvZiBzaWxlbnRseSBydW5uaW5nIHdpdGhvdXQgUmVkaXMuXG4gKiBgUkVESVNfUE9SVGAgY2FuJ3QgYmUgcmVmdXNlZDogS3ViZXJuZXRlcyBpbmplY3RzIGBSRURJU19QT1JUPXRjcDovLzxpcD46NjM3OWBcbiAqIGludG8gZXZlcnkgcG9kIGluIGEgbmFtZXNwYWNlIHdpdGggYSBTZXJ2aWNlIG5hbWVkIGByZWRpc2AsIHdoaWNoIGlzIGV4YWN0bHlcbiAqIHdoeSBhIGhvc3QvcG9ydCBwYWlyIHdhcyB1bnNhZmUgdG8gcGFyc2UuXG4gKlxuICogTWlzY29uZmlndXJhdGlvbiB0aHJvd3Mge0BsaW5rIFJlZGlzQ29uZmlnRXJyb3J9LiBXcml0ZXJzIGFuZCByZWFkZXJzIG9mIHRoZVxuICogc2FtZSBrZXlzIChyZXZvY2F0aW9uLCBzdGVwLXVwLCBsZWFkZXIgbG9ja3MpIG11c3QgcmVzb2x2ZSBSZWRpcyBpZGVudGljYWxseTtcbiAqIGEgY29uZmlnIHRoYXQgcXVpZXRseSByZXNvbHZlZCB0byBcIm5vIFJlZGlzXCIgb24gb25lIHNpZGUgaXMgaG93IHJldm9jYXRpb25cbiAqIG9uY2UgZGlkIG5vdGhpbmcgYXQgYWxsLlxuICovXG5cbi8qKiBUaHJvd24gZm9yIGEgUmVkaXMgZW52aXJvbm1lbnQgdGhhdCBjYW4ndCBiZSB1c2VkIGFzIHdyaXR0ZW4uICovXG5leHBvcnQgY2xhc3MgUmVkaXNDb25maWdFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1JlZGlzQ29uZmlnRXJyb3InO1xuICB9XG59XG5cbi8qKiBSZXNvbHZlZCBjb25uZWN0aW9uLCBpbmRlcGVuZGVudCBvZiBhbnkgY2xpZW50IGxpYnJhcnkuICovXG5leHBvcnQgdHlwZSBSZWRpc0Nvbm5lY3Rpb24gPVxuICB8IHtcbiAgICBtb2RlOiAnc2VudGluZWwnO1xuICAgIHNlbnRpbmVsczogQXJyYXk8eyBob3N0OiBzdHJpbmc7IHBvcnQ6IG51bWJlciB9PjtcbiAgICBtYXN0ZXJOYW1lOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ/OiBzdHJpbmc7XG4gICAgc2VudGluZWxQYXNzd29yZD86IHN0cmluZztcbiAgfVxuICB8IHtcbiAgICBtb2RlOiAndXJsJztcbiAgICB1cmw6IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgfTtcblxuLyoqXG4gKiBQYXJzZSBgUkVESVNfU0VOVElORUxTYCBpbnRvIGB7IGhvc3QsIHBvcnQgfVtdYC4gQmxhbmsgZW50cmllcyBhcmUgc2tpcHBlZCBhbmRcbiAqIGEgbWlzc2luZyBwb3J0IG1lYW5zIHRoZSBTZW50aW5lbCBkZWZhdWx0IDI2Mzc5OyBhIHBvcnQgdGhhdCBpc24ndCBhIHZhbGlkXG4gKiBUQ1AgcG9ydCBpcyBhIGNvbmZpZ3VyYXRpb24gZXJyb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNlbnRpbmVscyhyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IEFycmF5PHsgaG9zdDogc3RyaW5nOyBwb3J0OiBudW1iZXIgfT4ge1xuICBpZiAoIXJhdykgcmV0dXJuIFtdO1xuICByZXR1cm4gcmF3LnNwbGl0KCcsJykubWFwKChzKSA9PiBzLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pLm1hcCgoZW50cnkpID0+IHtcbiAgICBjb25zdCBpZHggPSBlbnRyeS5sYXN0SW5kZXhPZignOicpO1xuICAgIGNvbnN0IGhvc3QgPSBpZHggPT09IC0xID8gZW50cnkgOiBlbnRyeS5zbGljZSgwLCBpZHgpO1xuICAgIGNvbnN0IHBvcnRUZXh0ID0gaWR4ID09PSAtMSA/ICcnIDogZW50cnkuc2xpY2UoaWR4ICsgMSk7XG4gICAgY29uc3QgcG9ydCA9IHBvcnRUZXh0ID09PSAnJyA/IDI2Mzc5IDogTnVtYmVyKHBvcnRUZXh0KTtcbiAgICBpZiAoIWhvc3QgfHwgIU51bWJlci5pc0ludGVnZXIocG9ydCkgfHwgcG9ydCA8IDEgfHwgcG9ydCA+IDY1NTM1KSB7XG4gICAgICB0aHJvdyBuZXcgUmVkaXNDb25maWdFcnJvcihgUkVESVNfU0VOVElORUxTIGVudHJ5IFwiJHtlbnRyeX1cIiBpcyBub3QgaG9zdDpwb3J0YCk7XG4gICAgfVxuICAgIHJldHVybiB7IGhvc3QsIHBvcnQgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgUmVkaXMgY29ubmVjdGlvbiBmcm9tIGBlbnZgLCBvciBgbnVsbGAgd2hlbiBSZWRpcyBpc24ndFxuICogY29uZmlndXJlZC4gVGhyb3dzIHtAbGluayBSZWRpc0NvbmZpZ0Vycm9yfSBmb3IgYW4gdW51c2FibGUgY29uZmlndXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24oZW52OiBOb2RlSlMuUHJvY2Vzc0VudiA9IHByb2Nlc3MuZW52KTogUmVkaXNDb25uZWN0aW9uIHwgbnVsbCB7XG4gIGlmIChlbnYuUkVESVNfSE9TVCkge1xuICAgIHRocm93IG5ldyBSZWRpc0NvbmZpZ0Vycm9yKFxuICAgICAgJ1JFRElTX0hPU1QgaXMgbm90IHN1cHBvcnRlZC4gU2V0IFJFRElTX1VSTD1yZWRpczovLzxob3N0Pjo8cG9ydD4gKG9yIFJFRElTX1NFTlRJTkVMUyBmb3IgSEEpIGFuZCByZW1vdmUgUkVESVNfSE9TVC9SRURJU19QT1JULicsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNlbnRpbmVscyA9IHBhcnNlU2VudGluZWxzKGVudi5SRURJU19TRU5USU5FTFMpO1xuICBjb25zdCB1cmwgPSBlbnYuUkVESVNfVVJMPy50cmltKCk7XG4gIGNvbnN0IHBhc3N3b3JkID0gZW52LlJFRElTX1BBU1NXT1JEIHx8IHVuZGVmaW5lZDtcblxuICBpZiAoc2VudGluZWxzLmxlbmd0aCA+IDAgJiYgdXJsKSB7XG4gICAgdGhyb3cgbmV3IFJlZGlzQ29uZmlnRXJyb3IoJ1NldCBSRURJU19VUkwgb3IgUkVESVNfU0VOVElORUxTLCBub3QgYm90aC4nKTtcbiAgfVxuXG4gIGlmIChzZW50aW5lbHMubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB7XG4gICAgICBtb2RlOiAnc2VudGluZWwnLFxuICAgICAgc2VudGluZWxzLFxuICAgICAgbWFzdGVyTmFtZTogZW52LlJFRElTX1NFTlRJTkVMX01BU1RFUiB8fCAnbXltYXN0ZXInLFxuICAgICAgcGFzc3dvcmQsXG4gICAgICBzZW50aW5lbFBhc3N3b3JkOiBlbnYuUkVESVNfU0VOVElORUxfUEFTU1dPUkQgfHwgdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICBpZiAodXJsKSB7XG4gICAgbGV0IHBhcnNlZDogVVJMO1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWQgPSBuZXcgVVJMKHVybCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgUmVkaXNDb25maWdFcnJvcignUkVESVNfVVJMIGlzIG5vdCBhIHZhbGlkIFVSTCAoZXhwZWN0ZWQgcmVkaXM6Ly88aG9zdD46PHBvcnQ+KS4nKTtcbiAgICB9XG4gICAgaWYgKHBhcnNlZC5wcm90b2NvbCAhPT0gJ3JlZGlzOicgJiYgcGFyc2VkLnByb3RvY29sICE9PSAncmVkaXNzOicpIHtcbiAgICAgIHRocm93IG5ldyBSZWRpc0NvbmZpZ0Vycm9yKGBSRURJU19VUkwgbXVzdCB1c2UgcmVkaXM6Ly8gb3IgcmVkaXNzOi8vLCBnb3QgJHtwYXJzZWQucHJvdG9jb2x9Ly9gKTtcbiAgICB9XG4gICAgaWYgKCFwYXJzZWQuaG9zdG5hbWUpIHRocm93IG5ldyBSZWRpc0NvbmZpZ0Vycm9yKCdSRURJU19VUkwgaGFzIG5vIGhvc3QuJyk7XG4gICAgcmV0dXJuIHsgbW9kZTogJ3VybCcsIHVybCwgcGFzc3dvcmQgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQSBsb2ctc2FmZSBkZXNjcmlwdGlvbiBvZiBhIGNvbm5lY3Rpb24gKG5ldmVyIGluY2x1ZGVzIGNyZWRlbnRpYWxzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbihjb25uOiBSZWRpc0Nvbm5lY3Rpb24pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmIChjb25uLm1vZGUgPT09ICdzZW50aW5lbCcpIHtcbiAgICByZXR1cm4geyBtb2RlOiAnc2VudGluZWwnLCBtYXN0ZXI6IGNvbm4ubWFzdGVyTmFtZSwgc2VudGluZWxzOiBjb25uLnNlbnRpbmVscy5sZW5ndGggfTtcbiAgfVxuICBjb25zdCB1ID0gbmV3IFVSTChjb25uLnVybCk7XG4gIHJldHVybiB7IG1vZGU6ICd1cmwnLCBob3N0OiB1Lmhvc3RuYW1lLCBwb3J0OiB1LnBvcnQgfHwgJzYzNzknLCB0bHM6IHUucHJvdG9jb2wgPT09ICdyZWRpc3M6JyB9O1xufVxuXG50eXBlIFJlZGlzQ3RvcjxUPiA9IG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBUO1xuXG5mdW5jdGlvbiBsb2FkSW9yZWRpczxUPigpOiBSZWRpc0N0b3I8VD4ge1xuICBjb25zdCByZXEgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gIGNvbnN0IG1vZCA9IHJlcSgnaW9yZWRpcycpIGFzIHsgUmVkaXM/OiBSZWRpc0N0b3I8VD47IGRlZmF1bHQ/OiBSZWRpc0N0b3I8VD4gfTtcbiAgcmV0dXJuIChtb2QuUmVkaXMgPz8gbW9kLmRlZmF1bHQgPz8gbW9kKSBhcyBSZWRpc0N0b3I8VD47XG59XG5cbi8qKlxuICogQ29uc3RydWN0IGFuIGlvcmVkaXMgY2xpZW50IGZvciBhIHJlc29sdmVkIGNvbm5lY3Rpb24uIGBvcHRpb25zYCBhcmUgbWVyZ2VkXG4gKiBpbnRvIHRoZSBjbGllbnQgb3B0aW9ucyAoZS5nLiBgeyBkYiwgbWF4UmV0cmllc1BlclJlcXVlc3Q6IG51bGwgfWAgZm9yIEJ1bGxNUSkuXG4gKiBBbiBgZXJyb3JgIGxpc3RlbmVyIGlzIGFsd2F5cyBhdHRhY2hlZCBzbyBhIGRyb3BwZWQgY29ubmVjdGlvbiBpcyBsb2dnZWRcbiAqIHJhdGhlciB0aGFuIHN1cmZhY2luZyBhcyBhbiB1bmhhbmRsZWQgYCdlcnJvcidgIGV2ZW50IHRoYXQgY3Jhc2hlcyBOb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNDbGllbnQ8VCA9IHVua25vd24+KFxuICBjb25uOiBSZWRpc0Nvbm5lY3Rpb24sXG4gIGxhYmVsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4pOiBUIHtcbiAgY29uc3QgQ3RvciA9IGxvYWRJb3JlZGlzPFQ+KCk7XG4gIGNvbnN0IGF1dGggPSBjb25uLnBhc3N3b3JkID8geyBwYXNzd29yZDogY29ubi5wYXNzd29yZCB9IDoge307XG4gIGNvbnN0IGluc3QgPSBjb25uLm1vZGUgPT09ICdzZW50aW5lbCdcbiAgICA/IG5ldyBDdG9yKHtcbiAgICAgIHNlbnRpbmVsczogY29ubi5zZW50aW5lbHMsXG4gICAgICBuYW1lOiBjb25uLm1hc3Rlck5hbWUsXG4gICAgICAuLi4oY29ubi5zZW50aW5lbFBhc3N3b3JkID8geyBzZW50aW5lbFBhc3N3b3JkOiBjb25uLnNlbnRpbmVsUGFzc3dvcmQgfSA6IHt9KSxcbiAgICAgIC4uLmF1dGgsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pXG4gICAgOiBuZXcgQ3Rvcihjb25uLnVybCwgeyAuLi5hdXRoLCAuLi5vcHRpb25zIH0pO1xuICAoaW5zdCBhcyB1bmtub3duIGFzIHsgb246IChldnQ6IHN0cmluZywgY2I6IChlOiB1bmtub3duKSA9PiB2b2lkKSA9PiB2b2lkIH0pXG4gICAgLm9uKCdlcnJvcicsIChlKSA9PiBsb2dnZXIud2FybihgUmVkaXMgJHtsYWJlbH0gY2xpZW50IGVycm9yYCwgeyBlcnJvcjogZXJyb3JNZXNzYWdlKGUpIH0pKTtcbiAgcmV0dXJuIGluc3Q7XG59XG5cbi8qKlxuICogVGhlIHNoYXJlZCBhcHBsaWNhdGlvbiBSZWRpcyBjbGllbnQ6IGBudWxsYCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQsIHNvXG4gKiB0aGUgY2FsbGVyIGRlZ3JhZGVzIHRvIGl0cyBuby1SZWRpcyBiZWhhdmlvci5cbiAqXG4gKiBDb21tYW5kcyBmYWlsIGZhc3QgKGBtYXhSZXRyaWVzUGVyUmVxdWVzdDogMWAsIG5vIG9mZmxpbmUgcXVldWUpIGJlY2F1c2UgdGhlXG4gKiByZXF1ZXN0LXBhdGggY2FsbGVycyBhcmUgYmVzdC1lZmZvcnQgb3IgZmFpbCBjbG9zZWQgb24gdGhlaXIgb3duIHRlcm1zIOKAlCBhXG4gKiByZXF1ZXN0IG11c3Qgbm90IGhhbmcgYmVoaW5kIGEgUmVkaXMgb3V0YWdlLiBUaGF0IGluY2x1ZGVzIHRoZSBtb21lbnRzIGJlZm9yZVxuICogdGhlIGZpcnN0IGNvbm5lY3Rpb24gY29tcGxldGVzOiBhIGJhY2tncm91bmQgY2FsbGVyIHRoYXQgcnVucyBhdCBzdGFydHVwIG11c3RcbiAqIGVpdGhlciB0b2xlcmF0ZSBhIHJlamVjdGVkIGNvbW1hbmQgb3Igd2FpdCB3aXRoIHtAbGluayB3aGVuUmVkaXNSZWFkeX0uXG4gKlxuICogVGhyb3dzIHtAbGluayBSZWRpc0NvbmZpZ0Vycm9yfSBmb3IgYSBiYWQgY29uZmlndXJhdGlvbiwgYW5kIGlmIFJlZGlzIGlzXG4gKiBjb25maWd1cmVkIGJ1dCBgaW9yZWRpc2AgY2FuJ3QgYmUgbG9hZGVkIOKAlCBib3RoIGFyZSBkZXBsb3ltZW50IGVycm9ycyB0aGF0XG4gKiBtdXN0IG5vdCBxdWlldGx5IHR1cm4gUmVkaXMtYmFja2VkIGd1YXJhbnRlZXMgb2ZmLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNDbGllbnQ8VCA9IHVua25vd24+KFxuICBsYWJlbDogc3RyaW5nLFxuICBvcHRzOiB7IHJlYWR5R2F0ZT86IGJvb2xlYW47IHJlYWR5VGltZW91dE1zPzogbnVtYmVyIH0gPSB7fSxcbik6IFQgfCBudWxsIHtcbiAgY29uc3QgY29ubiA9IHJlc29sdmVSZWRpc0Nvbm5lY3Rpb24oKTtcbiAgaWYgKCFjb25uKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgaW5zdCA9IGNyZWF0ZVJlZGlzQ2xpZW50PFQ+KGNvbm4sIGxhYmVsLCB7IG1heFJldHJpZXNQZXJSZXF1ZXN0OiAxLCBlbmFibGVPZmZsaW5lUXVldWU6IGZhbHNlIH0pO1xuICBsb2dnZXIuaW5mbyhgUmVkaXMgJHtsYWJlbH0gY2xpZW50IGNyZWF0ZWRgLCBkZXNjcmliZVJlZGlzQ29ubmVjdGlvbihjb25uKSk7XG4gIHJldHVybiBvcHRzLnJlYWR5R2F0ZSA9PT0gZmFsc2VcbiAgICA/IGluc3RcbiAgICA6IHdpdGhSZWFkeUdhdGUoaW5zdCBhcyBUICYgUmVhZHlBd2FyZVJlZGlzLCBjcmVhdGVSZWRpc1JlYWR5R2F0ZShpbnN0IGFzIFJlYWR5QXdhcmVSZWRpcywgb3B0cy5yZWFkeVRpbWVvdXRNcykpO1xufVxuXG4vKiogQ2xpZW50IG1ldGhvZHMgdGhhdCBhcmUgc3luY2hyb25vdXMsIG1hbmFnZSB0aGUgY29ubmVjdGlvbiBpdHNlbGYsIG9yIGJ1aWxkXG4gKiAgYSBiYXRjaCDigJQgbmV2ZXIgZGVmZXJyZWQgYmVoaW5kIHRoZSByZWFkaW5lc3MgZ2F0ZS4gKi9cbmNvbnN0IFVOR0FURURfTUVUSE9EUzogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAnb24nLCAnb25jZScsICdvZmYnLCAnYWRkTGlzdGVuZXInLCAncmVtb3ZlTGlzdGVuZXInLCAncmVtb3ZlQWxsTGlzdGVuZXJzJywgJ2VtaXQnLFxuICAnbGlzdGVuZXJzJywgJ2xpc3RlbmVyQ291bnQnLCAnc2V0TWF4TGlzdGVuZXJzJywgJ2dldE1heExpc3RlbmVycycsICdwcmVwZW5kTGlzdGVuZXInLFxuICAnY29ubmVjdCcsICdkaXNjb25uZWN0JywgJ3F1aXQnLCAnZHVwbGljYXRlJywgJ3BpcGVsaW5lJywgJ211bHRpJywgJ2RlZmluZUNvbW1hbmQnLFxuXSk7XG5cbi8qKlxuICogV3JhcCBhIG5vLW9mZmxpbmUtcXVldWUgY2xpZW50IHNvIGV2ZXJ5IGNvbW1hbmQgZmlyc3Qgd2FpdHMgKGJvdW5kZWQsIG5ldmVyXG4gKiByZWplY3Rpbmcg4oCUIHNlZSB7QGxpbmsgY3JlYXRlUmVkaXNSZWFkeUdhdGV9KSBmb3IgdGhlIGNvbm5lY3Rpb24uIFdpdGhvdXQgaXRcbiAqIHRoZSBmaXJzdCBjb21tYW5kIGEgY2FsbGVyIGlzc3VlcyByaWdodCBhZnRlciBhIGxhenkgY29uc3RydWN0aW9uIGlzIHJlamVjdGVkXG4gKiBvdXRyaWdodCwgZS5nLiBhIHN0YXJ0dXAgY29uc3VtZXItZ3JvdXAgY3JlYXRlIG9yIHRoZSBmaXJzdCBpZGVtcG90ZW5jeSBjaGVjay5cbiAqL1xuZnVuY3Rpb24gd2l0aFJlYWR5R2F0ZTxUIGV4dGVuZHMgb2JqZWN0PihjbGllbnQ6IFQsIHJlYWR5OiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogVCB7XG4gIHJldHVybiBuZXcgUHJveHkoY2xpZW50LCB7XG4gICAgZ2V0KHRhcmdldCwgcHJvcCwgcmVjZWl2ZXIpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wLCByZWNlaXZlcik7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJyB8fCBVTkdBVEVEX01FVEhPRFMuaGFzKHByb3ApKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5iaW5kKHRhcmdldCkgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgIGF3YWl0IHJlYWR5KCk7XG4gICAgICAgIHJldHVybiAodmFsdWUgYXMgKC4uLmE6IHVua25vd25bXSkgPT4gdW5rbm93bikuYXBwbHkodGFyZ2V0LCBhcmdzKTtcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKiBUaGUgc3Vic2V0IG9mIGlvcmVkaXMgbmVlZGVkIHRvIHdhaXQgZm9yIGEgY29ubmVjdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHlBd2FyZVJlZGlzIHtcbiAgc3RhdHVzPzogc3RyaW5nO1xuICBvbmNlPyhldmVudDogc3RyaW5nLCBjYjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCk6IHVua25vd247XG4gIG9mZj8oZXZlbnQ6IHN0cmluZywgY2I6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpOiB1bmtub3duO1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25jZSBgY2xpZW50YCBpcyBjb25uZWN0ZWQgYW5kIHJlYWR5IGZvciBjb21tYW5kcywgb3IgcmVqZWN0IGFmdGVyXG4gKiBgdGltZW91dE1zYC4gRm9yIHN0YXJ0dXAgd29yayAoY3JlYXRpbmcgYSBjb25zdW1lciBncm91cCwgc3Vic2NyaWJpbmcpIHRoYXRcbiAqIG90aGVyd2lzZSByYWNlcyB0aGUgZmlyc3QgY29ubmVjdGlvbi4gQSBjbGllbnQgd2l0aG91dCBpb3JlZGlzJyBgc3RhdHVzYFxuICogKGUuZy4gYSB0ZXN0IGRvdWJsZSkgY291bnRzIGFzIHJlYWR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2hlblJlZGlzUmVhZHkoY2xpZW50OiBSZWFkeUF3YXJlUmVkaXMsIHRpbWVvdXRNcyA9IDMwXzAwMCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY2xpZW50LnN0YXR1cyA9PT0gdW5kZWZpbmVkIHx8IGNsaWVudC5zdGF0dXMgPT09ICdyZWFkeScgfHwgIWNsaWVudC5vbmNlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25SZWFkeSA9ICgpID0+IHsgY2xlYXJUaW1lb3V0KHRpbWVyKTsgcmVzb2x2ZSgpOyB9O1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjbGllbnQub2ZmPy4oJ3JlYWR5Jywgb25SZWFkeSk7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBSZWRpcyBub3QgcmVhZHkgYWZ0ZXIgJHt0aW1lb3V0TXN9bXNgKSk7XG4gICAgfSwgdGltZW91dE1zKTtcbiAgICB0aW1lci51bnJlZj8uKCk7XG4gICAgY2xpZW50Lm9uY2UhKCdyZWFkeScsIG9uUmVhZHkpO1xuICB9KTtcbn1cblxuLyoqIERlZmF1bHQgYm91bmQgZm9yIHtAbGluayBjcmVhdGVSZWRpc1JlYWR5R2F0ZX06IHNob3J0IGVub3VnaCBmb3IgYSByZXF1ZXN0IHBhdGguICovXG5leHBvcnQgY29uc3QgUkVRVUVTVF9QQVRIX1JFRElTX1JFQURZX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqXG4gKiBBIHJlcXVlc3QtcGF0aCByZWFkaW5lc3MgZ2F0ZSBmb3IgYSBsYXppbHkgYnVpbHQgZW52IFJlZGlzIGNsaWVudC5cbiAqXG4gKiBUaGUgZW52IGNsaWVudCBoYXMgbm8gb2ZmbGluZSBxdWV1ZSwgc28gYSBjb21tYW5kIGlzc3VlZCBiZWZvcmUgdGhlIGZpcnN0XG4gKiBjb25uZWN0aW9uIGNvbXBsZXRlcyBpcyByZWplY3RlZCBvdXRyaWdodCDigJQgdGhlIGZpcnN0IHJlcXVlc3QgYWZ0ZXIgYSBsYXp5XG4gKiBjb25zdHJ1Y3Rpb24gd291bGQgb3RoZXJ3aXNlIGhpdCB0aGF0IHJlamVjdGlvbiAoZS5nLiB0aGUgZmlyc3Qgc3RlcC11cCBwZXJcbiAqIHBvZCBmYWlsaW5nLCBvciB0aGUgZmlyc3QgaW1wZXJzb25hdGlvbiBjaGVjayByZWFkaW5nIFwidW5hdmFpbGFibGVcIikuXG4gKlxuICogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHJlc29sdmVzIG9uY2UgdGhlIGNsaWVudCBpcyByZWFkeSwgb3IgYWZ0ZXJcbiAqIGB0aW1lb3V0TXNgIOKAlCBpdCBORVZFUiByZWplY3RzOiB0aGUgY2FsbGVyIHRoZW4gcnVucyBpdHMgY29tbWFuZCBhbmQga2VlcHMgaXRzXG4gKiBvd24gZmFpbC1vcGVuIC8gZmFpbC1jbG9zZWQgc2VtYW50aWNzLiBDb25jdXJyZW50IGNhbGxlcnMgc2hhcmUgb25lIHdhaXQuIEFmdGVyXG4gKiBhIHdhaXQgdGltZXMgb3V0IChSZWRpcyBnZW51aW5lbHkgZG93bikgbGF0ZXIgY2FsbHMgc3RvcCB3YWl0aW5nIHVudGlsIHRoZVxuICogY2xpZW50IHJlcG9ydHMgYHJlYWR5YCBhZ2Fpbiwgc28gYW4gb3V0YWdlIGNvc3RzIG9uZSBib3VuZGVkIHdhaXQgaW5zdGVhZCBvZlxuICogYWRkaW5nIGB0aW1lb3V0TXNgIHRvIGV2ZXJ5IHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWRpc1JlYWR5R2F0ZShcbiAgY2xpZW50OiBSZWFkeUF3YXJlUmVkaXMsXG4gIHRpbWVvdXRNcyA9IFJFUVVFU1RfUEFUSF9SRURJU19SRUFEWV9USU1FT1VUX01TLFxuKTogKCkgPT4gUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpbmZsaWdodDogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuICBsZXQgZ2F2ZVVwID0gZmFsc2U7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKGNsaWVudC5zdGF0dXMgPT09IHVuZGVmaW5lZCB8fCBjbGllbnQuc3RhdHVzID09PSAncmVhZHknIHx8ICFjbGllbnQub25jZSkge1xuICAgICAgZ2F2ZVVwID0gZmFsc2U7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGlmIChnYXZlVXApIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBpZiAoIWluZmxpZ2h0KSB7XG4gICAgICBpbmZsaWdodCA9IHdoZW5SZWRpc1JlYWR5KGNsaWVudCwgdGltZW91dE1zKVxuICAgICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgIGdhdmVVcCA9IHRydWU7XG4gICAgICAgICAgLy8gUmUtYXJtIHRoZSB3YWl0IG9uY2UgdGhlIGNvbm5lY3Rpb24gY29tZXMgYmFjay5cbiAgICAgICAgICBjbGllbnQub25jZSEoJ3JlYWR5JywgKCkgPT4geyBnYXZlVXAgPSBmYWxzZTsgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHsgaW5mbGlnaHQgPSBudWxsOyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGluZmxpZ2h0O1xuICB9O1xufVxuXG4vKiogVGhlIHN1YnNldCBvZiBpb3JlZGlzIG5lZWRlZCBieSB7QGxpbmsgaW5jcldpbmRvd30uICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzRXZhbENsaWVudCB7XG4gIGV2YWwoc2NyaXB0OiBzdHJpbmcsIG51bUtleXM6IG51bWJlciwgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKlxuICogSU5DUiBhIGZpeGVkLXdpbmRvdyBjb3VudGVyIGFuZCBtYWtlIHN1cmUgaXQgY2FycmllcyBhIFRUTCwgYXRvbWljYWxseS5cbiAqXG4gKiBBIHNlcGFyYXRlIGBJTkNSYCB0aGVuIGBFWFBJUkVgIGlzIG5vdCBhdG9taWM6IGlmIHRoZSBFWFBJUkUgaXMgbG9zdCAoYVxuICogY29ubmVjdGlvbiBkcm9wLCBhIGZhaWxvdmVyIGJldHdlZW4gdGhlIHR3byBjb21tYW5kcykgdGhlIGtleSBuZXZlciBleHBpcmVzXG4gKiBhbmQgdGhlIGNvdW50ZXIgc3RheXMgb3ZlciBpdHMgbGltaXQgZm9yZXZlci4gVGhlIHNjcmlwdCBhbHNvIGhlYWxzIGEga2V5XG4gKiB0aGF0IHNvbWVob3cgbGFja3MgYSBUVEwgKGBQVFRMYCA9IC0xKSByYXRoZXIgdGhhbiBvbmx5IHNldHRpbmcgaXQgb24gdGhlXG4gKiBmaXJzdCBoaXQuXG4gKi9cbmNvbnN0IElOQ1JfV0lORE9XX1NDUklQVCA9IGBcbmxvY2FsIG4gPSByZWRpcy5jYWxsKCdJTkNSJywgS0VZU1sxXSlcbmlmIG4gPT0gMSBvciByZWRpcy5jYWxsKCdQVFRMJywgS0VZU1sxXSkgPCAwIHRoZW5cbiAgcmVkaXMuY2FsbCgnUEVYUElSRScsIEtFWVNbMV0sIEFSR1ZbMV0pXG5lbmRcbnJldHVybiBuYDtcblxuLyoqXG4gKiBJbmNyZW1lbnQgYGtleWAgd2l0aGluIGEgd2luZG93IG9mIGB3aW5kb3dNc2AgYW5kIHJldHVybiB0aGUgbmV3IGNvdW50LlxuICogVGhyb3dzIHdoZW4gUmVkaXMgZXJyb3JzIOKAlCBjYWxsZXJzIGNob29zZSB0aGVpciBvd24gZmFpbHVyZSBwb2xpY3kuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmNyV2luZG93KHJlZGlzOiBSZWRpc0V2YWxDbGllbnQsIGtleTogc3RyaW5nLCB3aW5kb3dNczogbnVtYmVyKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgY29uc3QgbiA9IGF3YWl0IHJlZGlzLmV2YWwoSU5DUl9XSU5ET1dfU0NSSVBULCAxLCBrZXksIE1hdGgubWF4KDEsIE1hdGguY2VpbCh3aW5kb3dNcykpKTtcbiAgcmV0dXJuIE51bWJlcihuKTtcbn1cbiJdfQ==
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import * as http from 'http';
|
|
2
2
|
import type { ServiceConfig } from '../types/common.js';
|
|
3
|
+
/** A response body exceeded the client's `maxResponseBytes`. Not retried. */
|
|
4
|
+
export declare class ResponseTooLargeError extends Error {
|
|
5
|
+
readonly code = "RESPONSE_TOO_LARGE";
|
|
6
|
+
constructor(limit: number);
|
|
7
|
+
}
|
|
3
8
|
/**
|
|
4
9
|
* HTTP request options.
|
|
5
10
|
*/
|
|
@@ -23,6 +28,14 @@ export interface RequestOptions {
|
|
|
23
28
|
* non-idempotent methods are NOT retried on those failures, only on 429.
|
|
24
29
|
*/
|
|
25
30
|
idempotent?: boolean;
|
|
31
|
+
/** Cap on this response's body in bytes (default: the client's, else 10 MiB). */
|
|
32
|
+
maxResponseBytes?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Route class for the circuit breaker (default: the client's, else
|
|
35
|
+
* `'default'`). Requests in different classes to the same `host:port` trip
|
|
36
|
+
* independent breakers — see `circuitBreakerKey`.
|
|
37
|
+
*/
|
|
38
|
+
breakerClass?: string;
|
|
26
39
|
}
|
|
27
40
|
/**
|
|
28
41
|
* HTTP client response wrapper.
|
|
@@ -61,6 +74,10 @@ export interface HttpClientOptions {
|
|
|
61
74
|
agent?: http.Agent;
|
|
62
75
|
/** Cap on concurrent keep-alive sockets for the shared agent (default 64). */
|
|
63
76
|
maxSockets?: number;
|
|
77
|
+
/** Default circuit-breaker route class for this client's requests. */
|
|
78
|
+
breakerClass?: string;
|
|
79
|
+
/** Default response-body cap (bytes) for this client's requests. */
|
|
80
|
+
maxResponseBytes?: number;
|
|
64
81
|
}
|
|
65
82
|
/**
|
|
66
83
|
* Close every shared keep-alive agent (idle sockets are released; in-flight
|
|
@@ -71,6 +88,8 @@ export declare function destroySharedHttpAgents(): void;
|
|
|
71
88
|
export declare class InternalHttpClient {
|
|
72
89
|
private config;
|
|
73
90
|
private agent;
|
|
91
|
+
private breakerClass?;
|
|
92
|
+
private maxResponseBytes;
|
|
74
93
|
/**
|
|
75
94
|
* Create a new HTTP client instance.
|
|
76
95
|
*
|