@pipeline-builder/api-server 4.1.4 → 4.1.5
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 +1 -1
- package/lib/api/app-factory.d.ts +8 -1
- package/lib/api/app-factory.js +68 -59
- package/lib/api/idempotency-middleware.js +14 -1
- package/lib/api/index.d.ts +0 -1
- package/lib/api/index.js +1 -2
- package/lib/api/metrics.d.ts +9 -0
- package/lib/api/metrics.js +23 -1
- package/lib/api/middleware-factory.js +2 -2
- package/lib/api/quota-helpers.d.ts +2 -4
- package/lib/api/quota-helpers.js +3 -3
- package/lib/api/rate-limit-by-org.js +10 -5
- package/lib/api/request-types.d.ts +1 -1
- package/lib/api/request-types.js +7 -2
- package/lib/api/server.js +19 -2
- package/lib/http/index.d.ts +0 -1
- package/lib/http/index.js +1 -2
- package/lib/http/sse-connection-manager.d.ts +59 -29
- package/lib/http/sse-connection-manager.js +89 -42
- package/lib/http/sse-relay.d.ts +16 -5
- package/lib/http/sse-relay.js +28 -16
- package/lib/http/sse-ticket-channel.d.ts +4 -2
- package/lib/http/sse-ticket-channel.js +13 -10
- package/package.json +5 -6
- package/lib/api/middleware.d.ts +0 -1
- package/lib/api/middleware.js +0 -8
- package/lib/http/sse-ticket-store.d.ts +0 -75
- package/lib/http/sse-ticket-store.js +0 -160
|
@@ -161,6 +161,14 @@ export function setIdempotencyStore(store) {
|
|
|
161
161
|
export function getIdempotencyStore() {
|
|
162
162
|
return defaultStore;
|
|
163
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Marks a request idempotency has already handled. Route chains are stacked —
|
|
166
|
+
* several `app.use(prefix, ...createAuthenticatedWithOrgRoute(), router)` mounts
|
|
167
|
+
* share a prefix, and a request that falls through the first router runs the
|
|
168
|
+
* next chain's idempotency middleware again. That second pass found its OWN
|
|
169
|
+
* pending reservation and answered 409.
|
|
170
|
+
*/
|
|
171
|
+
const IDEMPOTENCY_HANDLED = Symbol('pipeline-builder.idempotency.handled');
|
|
164
172
|
/**
|
|
165
173
|
* Middleware that supports idempotency keys for POST/PUT/DELETE mutations.
|
|
166
174
|
*
|
|
@@ -187,6 +195,10 @@ export function idempotencyMiddleware(options = {}) {
|
|
|
187
195
|
// Only apply to mutation methods
|
|
188
196
|
if (!['POST', 'PUT', 'DELETE'].includes(req.method))
|
|
189
197
|
return next();
|
|
198
|
+
// One pass per request: a later stacked chain must not re-check the key.
|
|
199
|
+
const marked = req;
|
|
200
|
+
if (marked[IDEMPOTENCY_HANDLED])
|
|
201
|
+
return next();
|
|
190
202
|
// Namespace by orgId to prevent cross-org cache collisions. Prefer the
|
|
191
203
|
// VERIFIED auth org (`req.user`, populated by requireAuth after signature
|
|
192
204
|
// verification) over `req.context.identity`, which some services populate
|
|
@@ -195,6 +207,7 @@ export function idempotencyMiddleware(options = {}) {
|
|
|
195
207
|
const orgId = req.user?.organizationId || req.context?.identity?.orgId;
|
|
196
208
|
if (!orgId)
|
|
197
209
|
return next(); // skip idempotency for unauthenticated requests
|
|
210
|
+
marked[IDEMPOTENCY_HANDLED] = true;
|
|
198
211
|
// Namespace the stored key by (method, route, org, body) so an Idempotency-Key
|
|
199
212
|
// is scoped to ONE specific endpoint+payload. Reusing a single key across two
|
|
200
213
|
// routes (e.g. POST /pipelines then POST /plugins) previously replayed the
|
|
@@ -336,4 +349,4 @@ export function idempotencyMiddleware(options = {}) {
|
|
|
336
349
|
});
|
|
337
350
|
};
|
|
338
351
|
}
|
|
339
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvaWRlbXBvdGVuY3ktbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDeEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNsRixNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFDO0lBQzdDLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcs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RUFBRSxDQUFDO1FBQ1QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyLCBzZW5kRXJyb3IsIEVycm9yQ29kZSwgY3JlYXRlRW52UmVkaXNDbGllbnQgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBDb3JlQ29uc3RhbnRzIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdpZGVtcG90ZW5jeScpO1xuXG4vKipcbiAqIENhbm9uaWNhbCAoa2V5LXNvcnRlZCkgSlNPTiBzZXJpYWxpemF0aW9uIHNvIHRoZSBTQU1FIGxvZ2ljYWwgcGF5bG9hZCBoYXNoZXNcbiAqIGlkZW50aWNhbGx5IHJlZ2FyZGxlc3Mgb2YgcHJvcGVydHkgaW5zZXJ0aW9uIG9yZGVyIOKAlCBhIHBsYWluIGBKU09OLnN0cmluZ2lmeWBcbiAqIHdvdWxkIGxldCBge2EsYn1gIGFuZCBge2IsYX1gIHByb2R1Y2UgZGlmZmVyZW50IGZpbmdlcnByaW50cyBmb3Igb25lIHJlcXVlc3QuXG4gKi9cbmZ1bmN0aW9uIHN0YWJsZVN0cmluZ2lmeSh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpID8/ICdudWxsJztcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gJ1snICsgdmFsdWUubWFwKHN0YWJsZVN0cmluZ2lmeSkuam9pbignLCcpICsgJ10nO1xuICBjb25zdCBvYmogPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmV0dXJuICd7JyArIE9iamVjdC5rZXlzKG9iaikuc29ydCgpLm1hcCgoaykgPT4gSlNPTi5zdHJpbmdpZnkoaykgKyAnOicgKyBzdGFibGVTdHJpbmdpZnkob2JqW2tdKSkuam9pbignLCcpICsgJ30nO1xufVxuXG4vKipcbiAqIFNob3J0LCBzdGFibGUgZmluZ2VycHJpbnQgb2YgYSByZXF1ZXN0IGJvZHkuIEZvbGRzIHRoZSBwYXlsb2FkIGludG8gdGhlXG4gKiBpZGVtcG90ZW5jeSBrZXkgc28gcmVwbGF5aW5nIHRoZSBTQU1FIGtleSB3aXRoIGEgRElGRkVSRU5UIGJvZHkgaXMgdHJlYXRlZCBhc1xuICogYSBkaXN0aW5jdCBvcGVyYXRpb24gKGZyZXNoIGV4ZWN1dGlvbikgcmF0aGVyIHRoYW4gcmVwbGF5aW5nIHRoZSBvbGQgcmVzcG9uc2UuXG4gKiBFbXB0eS9hYnNlbnQgYm9kaWVzIGNvbGxhcHNlIHRvICctJyBzbyBib2R5LWxlc3MgbXV0YXRpb25zIHN0YXkgdW5hZmZlY3RlZC5cbiAqL1xuZnVuY3Rpb24gYm9keUZpbmdlcnByaW50KGJvZHk6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAoYm9keSA9PT0gdW5kZWZpbmVkIHx8IGJvZHkgPT09IG51bGwpIHJldHVybiAnLSc7XG4gIGlmICh0eXBlb2YgYm9keSA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoYm9keSBhcyBvYmplY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuICctJztcbiAgdHJ5IHtcbiAgICByZXR1cm4gY3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKHN0YWJsZVN0cmluZ2lmeShib2R5KSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCAxNik7XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vbi1zZXJpYWxpemFibGUgYm9keSAoZS5nLiBhIHN0cmVhbS9jaXJjdWxhciByZWYpOiBza2lwIGZpbmdlcnByaW50aW5nXG4gICAgLy8gcmF0aGVyIHRoYW4gZmFpbCB0aGUgcmVxdWVzdCDigJQga2V5IHN0YXlzIHNjb3BlZCBieSBtZXRob2Qrcm91dGUrb3JnLlxuICAgIHJldHVybiAnLSc7XG4gIH1cbn1cblxuaW50ZXJmYWNlIENhY2hlZEVudHJ5IHtcbiAgc3RhdHVzQ29kZTogbnVtYmVyO1xuICBib2R5OiB1bmtub3duO1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgLyoqIFJlc2VydmF0aW9uIHBsYWNlaG9sZGVyOiB0aGUgcmVxdWVzdCBpcyBpbi1mbGlnaHQsIG5vIHJlYWwgcmVzcG9uc2UgeWV0LlxuICAgKiAgQSBkdXBsaWNhdGUgdGhhdCBzZWVzIGEgcGVuZGluZyBlbnRyeSBpcyByZWplY3RlZCB3aXRoIDQwOSwgbm90IHJlcGxheWVkLiAqL1xuICBwZW5kaW5nPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQbHVnZ2FibGUgYmFja2VuZCBmb3IgaWRlbXBvdGVuY3kta2V5IHJlcGxheSBjYWNoZS4gVGhlIGRlZmF1bHQgaW4tbWVtb3J5XG4gKiBpbXBsZW1lbnRhdGlvbiB3b3JrcyBmaW5lIHNpbmdsZS1yZXBsaWNhOyBhIFJlZGlzLWJhY2tlZCBpbXBsZW1lbnRhdGlvblxuICogaXMgcmVxdWlyZWQgZm9yIGNvcnJlY3QgZGVkdXBsaWNhdGlvbiBhY3Jvc3MgaG9yaXpvbnRhbGx5LXNjYWxlZCByZXBsaWNhc1xuICogKG90aGVyd2lzZSB0d28gcmVwbGljYXMgYmVoaW5kIGEgbG9hZC1iYWxhbmNlciBjYWNoZSBpbmRlcGVuZGVudGx5IGFuZCBhXG4gKiByZXRyeSBoaXR0aW5nIGEgZGlmZmVyZW50IHBvZCB3b24ndCByZXBsYXkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW1wb3RlbmN5U3RvcmUge1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPENhY2hlZEVudHJ5IHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgZW50cnk6IENhY2hlZEVudHJ5LCB0dGxTZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+O1xuICAvKipcbiAgICogQXRvbWljYWxseSBjbGFpbSBga2V5YCBJRkYgaXQgaXMgY3VycmVudGx5IGFic2VudC4gUmV0dXJucyBgdHJ1ZWAgd2hlbiBUSElTXG4gICAqIGNhbGxlciBzZXQgdGhlIGVudHJ5ICh3b24gdGhlIHJhY2UpLCBgZmFsc2VgIHdoZW4gYW4gZW50cnkgYWxyZWFkeSBleGlzdHMuXG4gICAqIFRoaXMgaXMgd2hhdCBzZXJpYWxpemVzIGNvbmN1cnJlbnQgZmlyc3QtdGltZSByZXF1ZXN0cyB0aGF0IHNoYXJlIGFuXG4gICAqIElkZW1wb3RlbmN5LUtleSDigJQgYSBwbGFpbiBnZXQtdGhlbi1zZXQgbGVhdmVzIGEgd2luZG93IHdoZXJlIHR3byByZXF1ZXN0c1xuICAgKiBib3RoIHNlZSBcIm5vdCBjYWNoZWRcIiBhbmQgYm90aCBleGVjdXRlIHRoZSBtdXRhdGlvbi5cbiAgICovXG4gIHJlc2VydmUoa2V5OiBzdHJpbmcsIGVudHJ5OiBDYWNoZWRFbnRyeSwgdHRsU2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPjtcbiAgLyoqIFJlbW92ZSBhIGtleSDigJQgcmVsZWFzZXMgYSByZXNlcnZhdGlvbiBhZnRlciBhIG5vbi1jYWNoZWFibGUgKG5vbi0yeHgpIHJlc3BvbnNlLiAqL1xuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogRGVmYXVsdCBpbi1tZW1vcnkgc3RvcmUuIFNpbmdsZS1yZXBsaWNhIG9ubHkuIEV4cG9ydGVkIGZvciB0ZXN0aW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1lbW9yeVN0b3JlKCk6IElkZW1wb3RlbmN5U3RvcmUge1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVkRW50cnk+KCk7XG4gIGNvbnN0IGNsZWFudXBUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIG1hcCkge1xuICAgICAgaWYgKG5vdyA+IHYuZXhwaXJlc0F0KSBtYXAuZGVsZXRlKGspO1xuICAgIH1cbiAgfSwgQ29yZUNvbnN0YW50cy5JREVNUE9URU5DWV9DTEVBTlVQX0lOVEVSVkFMX01TKTtcbiAgY2xlYW51cFRpbWVyLnVucmVmKCk7XG5cbiAgLyoqIFJldHVybiB0aGUgbGl2ZSAobm9uLWV4cGlyZWQpIGVudHJ5LCBldmljdGluZyBpdCBsYXppbHkgaWYgZXhwaXJlZC4gKi9cbiAgY29uc3QgbGl2ZSA9IChrZXk6IHN0cmluZyk6IENhY2hlZEVudHJ5IHwgbnVsbCA9PiB7XG4gICAgY29uc3QgZW50cnkgPSBtYXAuZ2V0KGtleSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKERhdGUubm93KCkgPiBlbnRyeS5leHBpcmVzQXQpIHtcbiAgICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH07XG4gIC8qKlxuICAgKiBBdCBjYXBhY2l0eSwgZXZpY3QgdGhlIE9MREVTVCBlbnRyeSAoTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIpIHJhdGhlclxuICAgKiB0aGFuIHNpbGVudGx5IGRyb3BwaW5nIHRoZSBORVcga2V5IOKAlCBvdGhlcndpc2UsIG9uY2UgZnVsbCwgdGhlIHN0b3JlIHN0b3BzXG4gICAqIGRlZHVwbGljYXRpbmcgZnJlc2ggcmVxdWVzdHMgdW50aWwgdGhlIFRUTCBzd2VlcCBydW5zLiBTdGF5cyBib3VuZGVkOyBmYXZvcnNcbiAgICogcmVjZW50IGtleXMgKG1vc3QgbGlrZWx5IHRvIGJlIHJldHJpZWQpLlxuICAgKi9cbiAgY29uc3QgZXZpY3RJZkZ1bGwgPSAoa2V5OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAoIW1hcC5oYXMoa2V5KSAmJiBtYXAuc2l6ZSA+PSBDb3JlQ29uc3RhbnRzLklERU1QT1RFTkNZX01BWF9TVE9SRV9TSVpFKSB7XG4gICAgICBjb25zdCBvbGRlc3QgPSBtYXAua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChvbGRlc3QgIT09IHVuZGVmaW5lZCkgbWFwLmRlbGV0ZShvbGRlc3QpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXQoa2V5KSB7XG4gICAgICByZXR1cm4gbGl2ZShrZXkpO1xuICAgIH0sXG4gICAgYXN5bmMgc2V0KGtleSwgZW50cnkpIHtcbiAgICAgIGV2aWN0SWZGdWxsKGtleSk7XG4gICAgICBtYXAuc2V0KGtleSwgZW50cnkpO1xuICAgIH0sXG4gICAgYXN5bmMgcmVzZXJ2ZShrZXksIGVudHJ5KSB7XG4gICAgICAvLyBBdG9taWMgaW4gYSBzaW5nbGUtdGhyZWFkZWQgcnVudGltZTogbm8gYXdhaXQgYmV0d2VlbiB0aGUgbGl2ZW5lc3MgY2hlY2tcbiAgICAgIC8vIGFuZCB0aGUgc2V0LCBzbyB0d28gY29uY3VycmVudCBjYWxsZXJzIGNhbid0IGJvdGggb2JzZXJ2ZSBcImFic2VudFwiLlxuICAgICAgaWYgKGxpdmUoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgZXZpY3RJZkZ1bGwoa2V5KTtcbiAgICAgIG1hcC5zZXQoa2V5LCBlbnRyeSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGFzeW5jIGRlbGV0ZShrZXkpIHtcbiAgICAgIG1hcC5kZWxldGUoa2V5KTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIE1pbmltYWwgUmVkaXMgc3VyZmFjZSB0aGUgaWRlbXBvdGVuY3kgc3RvcmUgbmVlZHMgKGFuIGlvcmVkaXMgc3Vic2V0KS5cbiAqIGBzZXRgIHN1cHBvcnRzIHRoZSB2YXJpYWRpYyBvcHRpb24gdGFpbDogYFNFVCBrZXkgdmFsIEVYIDx0dGw+IFtOWF1gLCB3aGljaFxuICogcmV0dXJucyBgJ09LJ2Agb24gc3VjY2VzcyBhbmQgYG51bGxgIHdoZW4gYW4gYE5YYCBzZXQgd2FzIHJlZnVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkaXNJZGVtcG90ZW5jeUNsaWVudCB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgLi4uYXJnczogKHN0cmluZyB8IG51bWJlcilbXSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIGRlbChrZXk6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPjtcbn1cblxuY29uc3QgUkVESVNfS0VZX1BSRUZJWCA9ICdpZGVtOic7XG5cbi8qKlxuICogUmVkaXMtYmFja2VkIHtAbGluayBJZGVtcG90ZW5jeVN0b3JlfSBmb3IgY29ycmVjdCBkZWR1cGxpY2F0aW9uIGFjcm9zc1xuICogaG9yaXpvbnRhbGx5LXNjYWxlZCByZXBsaWNhcy4gYHJlc2VydmVgIG1hcHMgdG8gYW4gYXRvbWljIGBTRVQg4oCmIE5YYCBzbyB0d29cbiAqIHBvZHMgYmVoaW5kIGEgbG9hZC1iYWxhbmNlciBjYW4ndCBib3RoIHdpbiBhIGZpcnN0LXRpbWUgcmVxdWVzdCBzaGFyaW5nIGFuXG4gKiBJZGVtcG90ZW5jeS1LZXk7IGEgcmV0cnkgbGFuZGluZyBvbiBBTlkgcG9kIHNlZXMgdGhlIHNhbWUgY29tbWl0dGVkIHJlc3BvbnNlLlxuICogUmVkaXMgVFRMIG93bnMgZXhwaXJ5ICh0aGUgYENhY2hlZEVudHJ5LmV4cGlyZXNBdGAgZmllbGQgaXMgY2FycmllZCBvbmx5IGZvclxuICogQVBJLXNoYXBlIHBhcml0eSB3aXRoIHRoZSBtZW1vcnkgc3RvcmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVkaXNJZGVtcG90ZW5jeVN0b3JlKHJlZGlzOiBSZWRpc0lkZW1wb3RlbmN5Q2xpZW50KTogSWRlbXBvdGVuY3lTdG9yZSB7XG4gIGNvbnN0IGsgPSAoa2V5OiBzdHJpbmcpOiBzdHJpbmcgPT4gYCR7UkVESVNfS0VZX1BSRUZJWH0ke2tleX1gO1xuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldChrZXkpIHtcbiAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IHJlZGlzLmdldChrKGtleSkpO1xuICAgICAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmF3KSBhcyBDYWNoZWRFbnRyeTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBDb3JydXB0IGVudHJ5IOKGkiB0cmVhdCBhcyBhYnNlbnQgc28gdGhlIHJlcXVlc3QgcHJvY2VlZHMgZnJlc2guXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0sXG4gICAgYXN5bmMgc2V0KGtleSwgZW50cnksIHR0bFNlY29uZHMpIHtcbiAgICAgIGF3YWl0IHJlZGlzLnNldChrKGtleSksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSwgJ0VYJywgTWF0aC5tYXgoMSwgdHRsU2Vjb25kcykpO1xuICAgIH0sXG4gICAgYXN5bmMgcmVzZXJ2ZShrZXksIGVudHJ5LCB0dGxTZWNvbmRzKSB7XG4gICAgICAvLyBBdG9taWMgY2xhaW06IFNFVCBrZXkgdmFsIEVYIHR0bCBOWCDihpIgJ09LJyBvbmx5IGlmIHRoZSBrZXkgd2FzIGFic2VudC5cbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHJlZGlzLnNldChrKGtleSksIEpTT04uc3RyaW5naWZ5KGVudHJ5KSwgJ0VYJywgTWF0aC5tYXgoMSwgdHRsU2Vjb25kcyksICdOWCcpO1xuICAgICAgcmV0dXJuIHJlcyA9PT0gJ09LJztcbiAgICB9LFxuICAgIGFzeW5jIGRlbGV0ZShrZXkpIHtcbiAgICAgIGF3YWl0IHJlZGlzLmRlbChrKGtleSkpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBSZWRpcy1iYWNrZWQgaWRlbXBvdGVuY3kgc3RvcmUgZnJvbSB0aGUgc2hhcmVkIGVudiBSZWRpcyAodGhlIHNhbWVcbiAqIGBSRURJU19VUkxgIC8gYFJFRElTX1NFTlRJTkVMU2Agd2lyaW5nIHRoZSByYXRlLWxpbWl0ZXIgYW5kIGF1ZGl0LXNwb29sIHVzZSkuXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIFJlZGlzIGlzbid0IGNvbmZpZ3VyZWQvYXZhaWxhYmxlIHNvIHRoZSBjYWxsZXIga2VlcHMgdGhlXG4gKiBpbi1tZW1vcnkgZGVmYXVsdCAoc2luZ2xlLXJlcGxpY2EgY29ycmVjdG5lc3MpLiBOZXZlciB0aHJvd3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbnZSZWRpc0lkZW1wb3RlbmN5U3RvcmUoKTogSWRlbXBvdGVuY3lTdG9yZSB8IG51bGwge1xuICBjb25zdCBjbGllbnQgPSBjcmVhdGVFbnZSZWRpc0NsaWVudDxSZWRpc0lkZW1wb3RlbmN5Q2xpZW50PignaWRlbXBvdGVuY3knKTtcbiAgaWYgKCFjbGllbnQpIHJldHVybiBudWxsO1xuICBsb2dnZXIuaW5mbygnUmVkaXMgaWRlbXBvdGVuY3kgc3RvcmUgaW5pdGlhbGl6ZWQnKTtcbiAgcmV0dXJuIGNyZWF0ZVJlZGlzSWRlbXBvdGVuY3lTdG9yZShjbGllbnQpO1xufVxuXG5jb25zdCBtZW1vcnlTdG9yZSA9IGNyZWF0ZU1lbW9yeVN0b3JlKCk7XG5cbi8qKlxuICogUHJvY2Vzcy13aWRlIGRlZmF1bHQgc3RvcmUgdXNlZCBieSBgaWRlbXBvdGVuY3lNaWRkbGV3YXJlKClgIHdoZW4gbm8gZXhwbGljaXRcbiAqIGBzdG9yZWAgaXMgcGFzc2VkLiBEZWZhdWx0cyB0byB0aGUgaW4tbWVtb3J5IHN0b3JlOyBgY3JlYXRlQXBwYCBwcm9tb3RlcyBpdCB0b1xuICogdGhlIHNoYXJlZCBlbnYtUmVkaXMgc3RvcmUgKG11bHRpLXJlcGxpY2EgZGVkdXApIGF0IHN0YXJ0dXAgdmlhXG4gKiB7QGxpbmsgc2V0SWRlbXBvdGVuY3lTdG9yZX0uIFRoZSByb3V0ZSBmYWN0b3JpZXMga2VlcCBjYWxsaW5nXG4gKiBgaWRlbXBvdGVuY3lNaWRkbGV3YXJlKClgIHdpdGggbm8gYXJncyBhbmQgdHJhbnNwYXJlbnRseSBwaWNrIHRoaXMgdXAuXG4gKi9cbmxldCBkZWZhdWx0U3RvcmU6IElkZW1wb3RlbmN5U3RvcmUgPSBtZW1vcnlTdG9yZTtcblxuLyoqIEluamVjdCB0aGUgcHJvY2Vzcy13aWRlIGlkZW1wb3RlbmN5IHN0b3JlIChlLmcuIGEgUmVkaXMtYmFja2VkIG9uZSkuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0SWRlbXBvdGVuY3lTdG9yZShzdG9yZTogSWRlbXBvdGVuY3lTdG9yZSk6IHZvaWQge1xuICBkZWZhdWx0U3RvcmUgPSBzdG9yZTtcbn1cblxuLyoqIFRoZSBjdXJyZW50IHByb2Nlc3Mtd2lkZSBkZWZhdWx0IHN0b3JlIChpbi1tZW1vcnkgdW5sZXNzIG92ZXJyaWRkZW4pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldElkZW1wb3RlbmN5U3RvcmUoKTogSWRlbXBvdGVuY3lTdG9yZSB7XG4gIHJldHVybiBkZWZhdWx0U3RvcmU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbXBvdGVuY3lNaWRkbGV3YXJlT3B0aW9ucyB7XG4gIC8qKiBDdXN0b20gc3RvcmUgYmFja2VuZC4gRGVmYXVsdHMgdG8gdGhlIHByb2Nlc3Mtd2lkZSBzdG9yZSBzZXQgdmlhXG4gICAqICB7QGxpbmsgc2V0SWRlbXBvdGVuY3lTdG9yZX0gKGluLW1lbW9yeSB1bnRpbCBgY3JlYXRlQXBwYCB3aXJlcyBSZWRpcykuICovXG4gIHN0b3JlPzogSWRlbXBvdGVuY3lTdG9yZTtcbn1cblxuLyoqXG4gKiBNaWRkbGV3YXJlIHRoYXQgc3VwcG9ydHMgaWRlbXBvdGVuY3kga2V5cyBmb3IgUE9TVC9QVVQvREVMRVRFIG11dGF0aW9ucy5cbiAqXG4gKiBXaGVuIGEgcmVxdWVzdCBpbmNsdWRlcyB0aGUgYElkZW1wb3RlbmN5LUtleWAgaGVhZGVyOlxuICogLSBGaXJzdCBjYWxsOiBwcm9jZXNzZXMgbm9ybWFsbHksIGNhY2hlcyB0aGUgcmVzcG9uc2VcbiAqIC0gU3Vic2VxdWVudCBjYWxscyB3aXRoIHNhbWUga2V5OiByZXR1cm5zIGNhY2hlZCByZXNwb25zZSAocHJldmVudHMgZHVwbGljYXRlIG11dGF0aW9ucylcbiAqXG4gKiBEZWZhdWx0cyB0byBhbiBpbi1tZW1vcnkgc3RvcmUgKHNpbmdsZS1yZXBsaWNhKS4gUGFzcyBhIGN1c3RvbVxuICogY3Jvc3MtcmVwbGljYSBgeyBzdG9yZSB9YCBpbXBsZW1lbnRpbmcgYElkZW1wb3RlbmN5U3RvcmVgIHRvIGRlZHVwZSBhY3Jvc3NcbiAqIHJlcGxpY2FzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbXBvdGVuY3lNaWRkbGV3YXJlKG9wdGlvbnM6IElkZW1wb3RlbmN5TWlkZGxld2FyZU9wdGlvbnMgPSB7fSkge1xuICAvLyBSZXNvbHZlIHRoZSBzdG9yZSBQRVIgUkVRVUVTVCAobm90IGF0IGZhY3RvcnkgdGltZSkgc28gYSBzdG9yZSBpbmplY3RlZCBieVxuICAvLyBjcmVhdGVBcHAgQUZURVIgdGhlIHJvdXRlIGNoYWlucyBhcmUgYnVpbHQgc3RpbGwgdGFrZXMgZWZmZWN0LiBBbiBleHBsaWNpdFxuICAvLyBgb3B0aW9ucy5zdG9yZWAgYWx3YXlzIHdpbnMuXG4gIGNvbnN0IGV4cGxpY2l0U3RvcmUgPSBvcHRpb25zLnN0b3JlO1xuICBjb25zdCB0dGxNcyA9IENvcmVDb25zdGFudHMuSURFTVBPVEVOQ1lfVFRMX01TO1xuICBjb25zdCB0dGxTZWMgPSBNYXRoLmZsb29yKHR0bE1zIC8gMTAwMCk7XG5cbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHN0b3JlID0gZXhwbGljaXRTdG9yZSA/PyBkZWZhdWx0U3RvcmU7XG4gICAgY29uc3Qga2V5ID0gcmVxLmhlYWRlcnNbJ2lkZW1wb3RlbmN5LWtleSddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIWtleSkgcmV0dXJuIG5leHQoKTtcblxuICAgIC8vIE9ubHkgYXBwbHkgdG8gbXV0YXRpb24gbWV0aG9kc1xuICAgIGlmICghWydQT1NUJywgJ1BVVCcsICdERUxFVEUnXS5pbmNsdWRlcyhyZXEubWV0aG9kKSkgcmV0dXJuIG5leHQoKTtcblxuICAgIC8vIE5hbWVzcGFjZSBieSBvcmdJZCB0byBwcmV2ZW50IGNyb3NzLW9yZyBjYWNoZSBjb2xsaXNpb25zLiBQcmVmZXIgdGhlXG4gICAgLy8gVkVSSUZJRUQgYXV0aCBvcmcgKGByZXEudXNlcmAsIHBvcHVsYXRlZCBieSByZXF1aXJlQXV0aCBhZnRlciBzaWduYXR1cmVcbiAgICAvLyB2ZXJpZmljYXRpb24pIG92ZXIgYHJlcS5jb250ZXh0LmlkZW50aXR5YCwgd2hpY2ggc29tZSBzZXJ2aWNlcyBwb3B1bGF0ZVxuICAgIC8vIHByZS1hdXRoIGZyb20gYW4gVU5WRVJJRklFRCB0b2tlbiBwZWVrIOKAlCBuYW1lc3BhY2luZyBhIG11dGF0aW9uJ3MgcmVwbGF5XG4gICAgLy8gY2FjaGUgb24gYW4gdW52ZXJpZmllZCwgY2FsbGVyLWluZmx1ZW5jZWQgb3JnIGlkIHdvdWxkIGJlIHVuc2FmZS5cbiAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZCB8fCByZXEuY29udGV4dD8uaWRlbnRpdHk/Lm9yZ0lkO1xuICAgIGlmICghb3JnSWQpIHJldHVybiBuZXh0KCk7IC8vIHNraXAgaWRlbXBvdGVuY3kgZm9yIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0c1xuXG4gICAgLy8gTmFtZXNwYWNlIHRoZSBzdG9yZWQga2V5IGJ5IChtZXRob2QsIHJvdXRlLCBvcmcsIGJvZHkpIHNvIGFuIElkZW1wb3RlbmN5LUtleVxuICAgIC8vIGlzIHNjb3BlZCB0byBPTkUgc3BlY2lmaWMgZW5kcG9pbnQrcGF5bG9hZC4gUmV1c2luZyBhIHNpbmdsZSBrZXkgYWNyb3NzIHR3b1xuICAgIC8vIHJvdXRlcyAoZS5nLiBQT1NUIC9waXBlbGluZXMgdGhlbiBQT1NUIC9wbHVnaW5zKSBwcmV2aW91c2x5IHJlcGxheWVkIHRoZVxuICAgIC8vIGZpcnN0IGVuZHBvaW50J3MgMnh4IGZvciB0aGUgc2Vjb25kIOKAlCB0aGUgc3RvcmUgaXMgYSBtb2R1bGUtbGV2ZWwgc2luZ2xldG9uXG4gICAgLy8gc2hhcmVkIGJ5IGV2ZXJ5IHJvdXRlLiBGb2xkaW5nIGluIG1ldGhvZCArIHJvdXRlIHBhdGggKyBhIGJvZHkgZmluZ2VycHJpbnRcbiAgICAvLyBvbmx5IG1ha2VzIGtleXMgTU9SRSBzcGVjaWZpYywgc28gdGhlcmUgaXMgbm8gY3Jvc3MtY29udGFtaW5hdGlvbiByaXNrLlxuICAgIC8vIEFsc28gbmFtZXNwYWNlIGJ5IHRoZSBWRVJJRklFRCB1c2VyLiBgSWRlbXBvdGVuY3ktS2V5YCBpcyBjaG9zZW4gYnkgdGhlXG4gICAgLy8gY2xpZW50LCBzbyB0d28gdXNlcnMgaW4gdGhlIHNhbWUgb3JnIHNlbmRpbmcgdGhlIHNhbWUgYm9keSB3aXRoIHRoZSBzYW1lXG4gICAgLy8ga2V5IGNvbGxpZGVkOiB0aGUgc2Vjb25kIHVzZXIncyBtdXRhdGlvbiB3YXMgU0tJUFBFRCBhbmQgdGhleSB3ZXJlIHNlcnZlZFxuICAgIC8vIHRoZSBmaXJzdCB1c2VyJ3MgY2FjaGVkIHJlc3BvbnNlLiBGYWxscyBiYWNrIHRvIHRoZSBvcmcgYWxvbmUgb25seSB3aGVuXG4gICAgLy8gdGhlcmUgaXMgbm8gdmVyaWZpZWQgc3ViamVjdCAoc2VydmljZSBwcmluY2lwYWxzIGNhcnJ5IG9uZSkuXG4gICAgY29uc3Qgc3ViID0gcmVxLnVzZXI/LnN1YjtcbiAgICBjb25zdCByb3V0ZVBhdGggPSAocmVxLmJhc2VVcmwgPz8gJycpICsgKHJlcS5yb3V0ZT8ucGF0aCA/PyByZXEucGF0aCA/PyAnJyk7XG4gICAgY29uc3QgZnVsbEtleSA9IGAke3JlcS5tZXRob2R9OiR7cm91dGVQYXRofToke29yZ0lkfToke3N1YiA/PyAnLSd9OiR7Ym9keUZpbmdlcnByaW50KHJlcS5ib2R5KX06JHtrZXl9YDtcblxuICAgIC8qKiBSZWplY3QgYSBkdXBsaWNhdGUgd2hvc2Ugb3JpZ2luYWwgaXMgc3RpbGwgaW4tZmxpZ2h0LiAqL1xuICAgIGNvbnN0IHNlbmRJblByb2dyZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgcmVzLnNldEhlYWRlcignUmV0cnktQWZ0ZXInLCAnMScpO1xuICAgICAgc2VuZEVycm9yKHJlcywgNDA5LCAnQSByZXF1ZXN0IHdpdGggdGhpcyBJZGVtcG90ZW5jeS1LZXkgaXMgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQnLCBFcnJvckNvZGUuQ09ORkxJQ1QpO1xuICAgIH07XG5cbiAgICBzdG9yZS5nZXQoZnVsbEtleSkudGhlbihhc3luYyAoY2FjaGVkKSA9PiB7XG4gICAgICBpZiAoY2FjaGVkICYmICFjYWNoZWQucGVuZGluZykge1xuICAgICAgICAvLyBDb21wbGV0ZWQgcmVzcG9uc2Ugb24gcmVjb3JkIOKGkiByZXBsYXkgaXQuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnSWRlbXBvdGVudCByZXF1ZXN0IHJlcGxheWVkJywgeyBrZXk6IGZ1bGxLZXkgfSk7XG4gICAgICAgIHJlcy5zZXRIZWFkZXIoJ1gtSWRlbXBvdGVudC1SZXBsYXllZCcsICd0cnVlJyk7XG4gICAgICAgIHJlcy5zdGF0dXMoY2FjaGVkLnN0YXR1c0NvZGUpLmpzb24oY2FjaGVkLmJvZHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoY2FjaGVkICYmIGNhY2hlZC5wZW5kaW5nKSB7XG4gICAgICAgIC8vIFRoZSBvcmlnaW5hbCBpcyBzdGlsbCBydW5uaW5nIOKAlCBkb24ndCBydW4gdGhlIG11dGF0aW9uIGEgc2Vjb25kIHRpbWUuXG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnSWRlbXBvdGVudCByZXF1ZXN0IHJlamVjdGVkIChpbiBwcm9ncmVzcyknLCB7IGtleTogZnVsbEtleSB9KTtcbiAgICAgICAgcmV0dXJuIHNlbmRJblByb2dyZXNzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEF0b21pY2FsbHkgcmVzZXJ2ZSB0aGUga2V5LiBMb3NpbmcgdGhpcyByYWNlIG1lYW5zIGEgY29uY3VycmVudCByZXF1ZXN0XG4gICAgICAvLyB3aXRoIHRoZSBzYW1lIGtleSBnb3QgdGhlcmUgZmlyc3QgYW5kIGlzIGluLWZsaWdodCDihpIgNDA5LlxuICAgICAgY29uc3Qgd29uID0gYXdhaXQgc3RvcmUucmVzZXJ2ZShcbiAgICAgICAgZnVsbEtleSxcbiAgICAgICAgeyBzdGF0dXNDb2RlOiAwLCBib2R5OiBudWxsLCBwZW5kaW5nOiB0cnVlLCBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyB9LFxuICAgICAgICB0dGxTZWMsXG4gICAgICApO1xuICAgICAgaWYgKCF3b24pIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdJZGVtcG90ZW50IHJlcXVlc3QgcmVqZWN0ZWQgKGxvc3QgcmVzZXJ2ZSByYWNlKScsIHsga2V5OiBmdWxsS2V5IH0pO1xuICAgICAgICByZXR1cm4gc2VuZEluUHJvZ3Jlc3MoKTtcbiAgICAgIH1cblxuICAgICAgLy8gV2Ugb3duIHRoZSByZXNlcnZhdGlvbi4gSXQgTVVTVCBiZSByZXNvbHZlZCBleGFjdGx5IG9uY2Ug4oCUIGVpdGhlciB0aGVcbiAgICAgIC8vIHJlYWwgMnh4IHJlc3BvbnNlIGlzIGNhY2hlZCBmb3IgcmVwbGF5LCBvciB0aGUgcmVzZXJ2YXRpb24gaXMgcmVsZWFzZWQgc29cbiAgICAgIC8vIGEgcmV0cnkgY2FuIHByb2NlZWQuIGBzZXR0bGVkYCBndWFyZHMgYWdhaW5zdCBhIGRvdWJsZS1yZXNvbHZlLlxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBjYXB0dXJlZEJvZHk6IHVua25vd247XG4gICAgICBsZXQgYm9keUNhcHR1cmVkID0gZmFsc2U7XG5cbiAgICAgIC8qKiBSZW1lbWJlciB0aGUgcmVzcG9uc2UgYm9keSBmb3IgcmVwbGF5IChmaXJzdCBjYXB0dXJlIHdpbnMpLiAqL1xuICAgICAgY29uc3QgY2FwdHVyZUJvZHkgPSAoYm9keTogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWJvZHlDYXB0dXJlZCkge1xuICAgICAgICAgIGNhcHR1cmVkQm9keSA9IGJvZHk7XG4gICAgICAgICAgYm9keUNhcHR1cmVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVsZWFzZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHN0b3JlLmRlbGV0ZShmdWxsS2V5KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0lkZW1wb3RlbmN5IHJlc2VydmF0aW9uIHJlbGVhc2UgZmFpbGVkJywgeyBrZXk6IGZ1bGxLZXksIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgY2FjaGVTdWNjZXNzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgc3RvcmUuc2V0KGZ1bGxLZXksIHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSxcbiAgICAgICAgICBib2R5OiBib2R5Q2FwdHVyZWQgPyBjYXB0dXJlZEJvZHkgOiBudWxsLFxuICAgICAgICAgIGV4cGlyZXNBdDogRGF0ZS5ub3coKSArIHR0bE1zLFxuICAgICAgICB9LCB0dGxTZWMpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBsb2dnZXIud2FybignSWRlbXBvdGVuY3kgc3RvcmUuc2V0IGZhaWxlZCcsIHsga2V5OiBmdWxsS2V5LCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIC8qKiBSZXNvbHZlIHRoZSByZXNlcnZhdGlvbiBmcm9tIHRoZSBBQ1RVQUwgZmluYWwgc3RhdHVzOiBjYWNoZSAyeHgsIGVsc2UgcmVsZWFzZS4gKi9cbiAgICAgIGNvbnN0IHNldHRsZUZyb21TdGF0dXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDApIGNhY2hlU3VjY2VzcygpO1xuICAgICAgICBlbHNlIHJlbGVhc2UoKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEZhc3QgcGF0aDogcmVzLmpzb24gaXMgdGhlIGNvbW1vbiBjb21wbGV0aW9uLiBDYXB0dXJlIHRoZSBib2R5IGFuZCBzZXR0bGVcbiAgICAgIC8vIGltbWVkaWF0ZWx5IG9mZiB0aGUgc3RhdHVzIHNldCBieSByZXMuc3RhdHVzKC4uLikuanNvbiguLi4pLlxuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uID0gcmVzLmpzb24uYmluZChyZXMpO1xuICAgICAgcmVzLmpzb24gPSAoYm9keTogdW5rbm93bikgPT4ge1xuICAgICAgICByZXMuc2V0SGVhZGVyKCdYLUlkZW1wb3RlbnQtUmVwbGF5ZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgY2FwdHVyZUJvZHkoYm9keSk7XG4gICAgICAgIHNldHRsZUZyb21TdGF0dXMoKTtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsSnNvbihib2R5KTtcbiAgICAgIH07XG5cbiAgICAgIC8vIEJvZHktY2FwdHVyZSBiYWNrc3RvcHMgZm9yIGNvbXBsZXRpb25zIHRoYXQgYnlwYXNzIHJlcy5qc29uXG4gICAgICAvLyAocmVzLnNlbmQgLyByZXMuZW5kIC8gcmVzLnNlbmRGaWxlIOKGkiByZXMuZW5kKS4gVGhlc2Ugb25seSBSRUNPUkQgdGhlIGJvZHk7XG4gICAgICAvLyB0aGUgYWN0dWFsIHNldHRsZSBoYXBwZW5zIG9uIGBmaW5pc2hgIGZyb20gdGhlIHJlYWwgc3RhdHVzIGNvZGUuIEZpcnN0XG4gICAgICAvLyBjYXB0dXJlIHdpbnMsIHNvIHJlcy5qc29uJ3MgYm9keSBpcyBuZXZlciBjbG9iYmVyZWQgYnkgaXRzIGludGVybmFsXG4gICAgICAvLyByZXMuc2VuZC9yZXMuZW5kIGNhbGxzLlxuICAgICAgY29uc3QgcGF0Y2hlZCA9IHJlcyBhcyB1bmtub3duIGFzIHtcbiAgICAgICAgc2VuZD86IChib2R5PzogdW5rbm93bikgPT4gdW5rbm93bjtcbiAgICAgICAgZW5kPzogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdW5rbm93bjtcbiAgICAgICAgb24/OiAoZXZlbnQ6IHN0cmluZywgY2I6ICgpID0+IHZvaWQpID0+IHVua25vd247XG4gICAgICB9O1xuICAgICAgaWYgKHR5cGVvZiBwYXRjaGVkLnNlbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxTZW5kID0gcGF0Y2hlZC5zZW5kLmJpbmQocmVzKTtcbiAgICAgICAgcGF0Y2hlZC5zZW5kID0gKGJvZHk/OiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgY2FwdHVyZUJvZHkoYm9keSk7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsU2VuZChib2R5KTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgcGF0Y2hlZC5lbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxFbmQgPSBwYXRjaGVkLmVuZC5iaW5kKHJlcyk7XG4gICAgICAgIHBhdGNoZWQuZW5kID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNodW5rID0gYXJnc1swXTtcbiAgICAgICAgICBpZiAoY2h1bmsgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgY2h1bmsgIT09ICdmdW5jdGlvbicpIGNhcHR1cmVCb2R5KGNodW5rKTtcbiAgICAgICAgICByZXR1cm4gb3JpZ2luYWxFbmQoLi4uYXJncyk7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIC8vIEJhY2tzdG9wIGZvciBBTlkgY29tcGxldGlvbiBwYXRoIOKAlCBpbmNsdWRpbmcgYSAyeHggdGhhdCBmaW5pc2hlZCB2aWFcbiAgICAgIC8vIHJlcy5zZW5kL3Jlcy5lbmQvcmVzLnNlbmRGaWxlLzIwNCBhbmQgbmV2ZXIgaGl0IHRoZSBwYXRjaGVkIHJlcy5qc29uLlxuICAgICAgLy8gRGVjaWRpbmcgb24gdGhlIHJlYWwgZmluYWwgc3RhdHVzIGhlcmUgbWVhbnMgYSBzdWNjZXNzZnVsIG9wIGlzIGNhY2hlZFxuICAgICAgLy8gKG9yIGEgZmFpbGVkIG9uZSByZWxlYXNlZCkgaW5zdGVhZCBvZiBzdHJhbmRpbmcgdGhlIHJlc2VydmF0aW9uIGFuZFxuICAgICAgLy8gNDA5LWluZyBldmVyeSByZXRyeSBmb3IgdGhlIGZ1bGwgVFRMLiBHdWFyZGVkIOKAlCB0ZXN0IGRvdWJsZXMgbWF5IG5vdCBiZVxuICAgICAgLy8gRXZlbnRFbWl0dGVyczsgcmVzLmpzb24ncyBmYXN0IHBhdGggYWxyZWFkeSBzZXR0bGVkIHRoZSBjb21tb24gY2FzZS5cbiAgICAgIGlmICh0eXBlb2YgcGF0Y2hlZC5vbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwYXRjaGVkLm9uKCdmaW5pc2gnLCBzZXR0bGVGcm9tU3RhdHVzKTtcbiAgICAgICAgLy8gQSBjbGllbnQgdGhhdCBkaXNjb25uZWN0cyAob3IgYSBwcm9jZXNzIGtpbGxlZCBtaWQtaGFuZGxlcikgZW1pdHNcbiAgICAgICAgLy8gJ2Nsb3NlJyBXSVRIT1VUICdmaW5pc2gnLCB3aGljaCB1c2VkIHRvIGxlYXZlIHRoZSByZXNlcnZhdGlvblxuICAgICAgICAvLyBgcGVuZGluZ2AgZm9yIHRoZSBmdWxsIElERU1QT1RFTkNZX1RUTF9NUyDigJQgc28gZXZlcnkgcmV0cnkgZ290IGEgNDA5XG4gICAgICAgIC8vIGFuZCBhIHJldHJ5IHN0b3JtIGJlY2FtZSBhIG11bHRpLW1pbnV0ZSBvdXRhZ2UgZm9yIHRoYXQga2V5LlxuICAgICAgICAvLyBSRUxFQVNFIHJhdGhlciB0aGFuIGNhY2hlOiB0aGUgcmVzcG9uc2UgbmV2ZXIgY29tcGxldGVkLCBzbyB0aGVyZSBpc1xuICAgICAgICAvLyBubyByZXN1bHQgdG8gcmVwbGF5LCBhbmQgdGhlIHJldHJ5IHNob3VsZCBnZW51aW5lbHkgcmUtcnVuLlxuICAgICAgICBwYXRjaGVkLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICAgIGlmICghcmVzLndyaXRhYmxlRmluaXNoZWQpIHJlbGVhc2UoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAvLyBJZiB0aGUgc3RvcmUgYmFja2VuZCBpcyBkb3duLCBmYWlsIG9wZW4g4oCUIHByb2Nlc3MgdGhlIHJlcXVlc3Qgbm9ybWFsbHkuXG4gICAgICBsb2dnZXIud2FybignSWRlbXBvdGVuY3kgc3RvcmUuZ2V0IGZhaWxlZDsgcHJvY2VlZGluZyB3aXRob3V0IGRlZHVwJywgeyBrZXk6IGZ1bGxLZXksIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycikgfSk7XG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH07XG59XG4iXX0=
|
|
352
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlbXBvdGVuY3ktbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvaWRlbXBvdGVuY3ktbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDcEMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUM7SUFDeEYsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sR0FBRyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNsRixNQUFNLEdBQUcsR0FBRyxLQUFnQyxDQUFDO0lBQzdDLE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcs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Q0FBQyxHQUFHLEVBQUUsRUFBRTtZQUNmLDBFQUEwRTtZQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqSixJQUFJLEVBQUUsQ0FBQztRQUNULENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB7IGNyZWF0ZUxvZ2dlciwgc2VuZEVycm9yLCBFcnJvckNvZGUsIGNyZWF0ZUVudlJlZGlzQ2xpZW50IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29yZUNvbnN0YW50cyB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL3BpcGVsaW5lLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignaWRlbXBvdGVuY3knKTtcblxuLyoqXG4gKiBDYW5vbmljYWwgKGtleS1zb3J0ZWQpIEpTT04gc2VyaWFsaXphdGlvbiBzbyB0aGUgU0FNRSBsb2dpY2FsIHBheWxvYWQgaGFzaGVzXG4gKiBpZGVudGljYWxseSByZWdhcmRsZXNzIG9mIHByb3BlcnR5IGluc2VydGlvbiBvcmRlciDigJQgYSBwbGFpbiBgSlNPTi5zdHJpbmdpZnlgXG4gKiB3b3VsZCBsZXQgYHthLGJ9YCBhbmQgYHtiLGF9YCBwcm9kdWNlIGRpZmZlcmVudCBmaW5nZXJwcmludHMgZm9yIG9uZSByZXF1ZXN0LlxuICovXG5mdW5jdGlvbiBzdGFibGVTdHJpbmdpZnkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKSA/PyAnbnVsbCc7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICdbJyArIHZhbHVlLm1hcChzdGFibGVTdHJpbmdpZnkpLmpvaW4oJywnKSArICddJztcbiAgY29uc3Qgb2JqID0gdmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiAneycgKyBPYmplY3Qua2V5cyhvYmopLnNvcnQoKS5tYXAoKGspID0+IEpTT04uc3RyaW5naWZ5KGspICsgJzonICsgc3RhYmxlU3RyaW5naWZ5KG9ialtrXSkpLmpvaW4oJywnKSArICd9Jztcbn1cblxuLyoqXG4gKiBTaG9ydCwgc3RhYmxlIGZpbmdlcnByaW50IG9mIGEgcmVxdWVzdCBib2R5LiBGb2xkcyB0aGUgcGF5bG9hZCBpbnRvIHRoZVxuICogaWRlbXBvdGVuY3kga2V5IHNvIHJlcGxheWluZyB0aGUgU0FNRSBrZXkgd2l0aCBhIERJRkZFUkVOVCBib2R5IGlzIHRyZWF0ZWQgYXNcbiAqIGEgZGlzdGluY3Qgb3BlcmF0aW9uIChmcmVzaCBleGVjdXRpb24pIHJhdGhlciB0aGFuIHJlcGxheWluZyB0aGUgb2xkIHJlc3BvbnNlLlxuICogRW1wdHkvYWJzZW50IGJvZGllcyBjb2xsYXBzZSB0byAnLScgc28gYm9keS1sZXNzIG11dGF0aW9ucyBzdGF5IHVuYWZmZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGJvZHlGaW5nZXJwcmludChib2R5OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKGJvZHkgPT09IHVuZGVmaW5lZCB8fCBib2R5ID09PSBudWxsKSByZXR1cm4gJy0nO1xuICBpZiAodHlwZW9mIGJvZHkgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKGJvZHkgYXMgb2JqZWN0KS5sZW5ndGggPT09IDApIHJldHVybiAnLSc7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShzdGFibGVTdHJpbmdpZnkoYm9keSkpLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgMTYpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOb24tc2VyaWFsaXphYmxlIGJvZHkgKGUuZy4gYSBzdHJlYW0vY2lyY3VsYXIgcmVmKTogc2tpcCBmaW5nZXJwcmludGluZ1xuICAgIC8vIHJhdGhlciB0aGFuIGZhaWwgdGhlIHJlcXVlc3Qg4oCUIGtleSBzdGF5cyBzY29wZWQgYnkgbWV0aG9kK3JvdXRlK29yZy5cbiAgICByZXR1cm4gJy0nO1xuICB9XG59XG5cbmludGVyZmFjZSBDYWNoZWRFbnRyeSB7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgYm9keTogdW5rbm93bjtcbiAgZXhwaXJlc0F0OiBudW1iZXI7XG4gIC8qKiBSZXNlcnZhdGlvbiBwbGFjZWhvbGRlcjogdGhlIHJlcXVlc3QgaXMgaW4tZmxpZ2h0LCBubyByZWFsIHJlc3BvbnNlIHlldC5cbiAgICogIEEgZHVwbGljYXRlIHRoYXQgc2VlcyBhIHBlbmRpbmcgZW50cnkgaXMgcmVqZWN0ZWQgd2l0aCA0MDksIG5vdCByZXBsYXllZC4gKi9cbiAgcGVuZGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGx1Z2dhYmxlIGJhY2tlbmQgZm9yIGlkZW1wb3RlbmN5LWtleSByZXBsYXkgY2FjaGUuIFRoZSBkZWZhdWx0IGluLW1lbW9yeVxuICogaW1wbGVtZW50YXRpb24gd29ya3MgZmluZSBzaW5nbGUtcmVwbGljYTsgYSBSZWRpcy1iYWNrZWQgaW1wbGVtZW50YXRpb25cbiAqIGlzIHJlcXVpcmVkIGZvciBjb3JyZWN0IGRlZHVwbGljYXRpb24gYWNyb3NzIGhvcml6b250YWxseS1zY2FsZWQgcmVwbGljYXNcbiAqIChvdGhlcndpc2UgdHdvIHJlcGxpY2FzIGJlaGluZCBhIGxvYWQtYmFsYW5jZXIgY2FjaGUgaW5kZXBlbmRlbnRseSBhbmQgYVxuICogcmV0cnkgaGl0dGluZyBhIGRpZmZlcmVudCBwb2Qgd29uJ3QgcmVwbGF5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVtcG90ZW5jeVN0b3JlIHtcbiAgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTxDYWNoZWRFbnRyeSB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIGVudHJ5OiBDYWNoZWRFbnRyeSwgdHRsU2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPjtcbiAgLyoqXG4gICAqIEF0b21pY2FsbHkgY2xhaW0gYGtleWAgSUZGIGl0IGlzIGN1cnJlbnRseSBhYnNlbnQuIFJldHVybnMgYHRydWVgIHdoZW4gVEhJU1xuICAgKiBjYWxsZXIgc2V0IHRoZSBlbnRyeSAod29uIHRoZSByYWNlKSwgYGZhbHNlYCB3aGVuIGFuIGVudHJ5IGFscmVhZHkgZXhpc3RzLlxuICAgKiBUaGlzIGlzIHdoYXQgc2VyaWFsaXplcyBjb25jdXJyZW50IGZpcnN0LXRpbWUgcmVxdWVzdHMgdGhhdCBzaGFyZSBhblxuICAgKiBJZGVtcG90ZW5jeS1LZXkg4oCUIGEgcGxhaW4gZ2V0LXRoZW4tc2V0IGxlYXZlcyBhIHdpbmRvdyB3aGVyZSB0d28gcmVxdWVzdHNcbiAgICogYm90aCBzZWUgXCJub3QgY2FjaGVkXCIgYW5kIGJvdGggZXhlY3V0ZSB0aGUgbXV0YXRpb24uXG4gICAqL1xuICByZXNlcnZlKGtleTogc3RyaW5nLCBlbnRyeTogQ2FjaGVkRW50cnksIHR0bFNlY29uZHM6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj47XG4gIC8qKiBSZW1vdmUgYSBrZXkg4oCUIHJlbGVhc2VzIGEgcmVzZXJ2YXRpb24gYWZ0ZXIgYSBub24tY2FjaGVhYmxlIChub24tMnh4KSByZXNwb25zZS4gKi9cbiAgZGVsZXRlKGtleTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIERlZmF1bHQgaW4tbWVtb3J5IHN0b3JlLiBTaW5nbGUtcmVwbGljYSBvbmx5LiBFeHBvcnRlZCBmb3IgdGVzdGluZy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlTdG9yZSgpOiBJZGVtcG90ZW5jeVN0b3JlIHtcbiAgY29uc3QgbWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZEVudHJ5PigpO1xuICBjb25zdCBjbGVhbnVwVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBtYXApIHtcbiAgICAgIGlmIChub3cgPiB2LmV4cGlyZXNBdCkgbWFwLmRlbGV0ZShrKTtcbiAgICB9XG4gIH0sIENvcmVDb25zdGFudHMuSURFTVBPVEVOQ1lfQ0xFQU5VUF9JTlRFUlZBTF9NUyk7XG4gIGNsZWFudXBUaW1lci51bnJlZigpO1xuXG4gIC8qKiBSZXR1cm4gdGhlIGxpdmUgKG5vbi1leHBpcmVkKSBlbnRyeSwgZXZpY3RpbmcgaXQgbGF6aWx5IGlmIGV4cGlyZWQuICovXG4gIGNvbnN0IGxpdmUgPSAoa2V5OiBzdHJpbmcpOiBDYWNoZWRFbnRyeSB8IG51bGwgPT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gbWFwLmdldChrZXkpO1xuICAgIGlmICghZW50cnkpIHJldHVybiBudWxsO1xuICAgIGlmIChEYXRlLm5vdygpID4gZW50cnkuZXhwaXJlc0F0KSB7XG4gICAgICBtYXAuZGVsZXRlKGtleSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9O1xuICAvKipcbiAgICogQXQgY2FwYWNpdHksIGV2aWN0IHRoZSBPTERFU1QgZW50cnkgKE1hcCBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyKSByYXRoZXJcbiAgICogdGhhbiBzaWxlbnRseSBkcm9wcGluZyB0aGUgTkVXIGtleSDigJQgb3RoZXJ3aXNlLCBvbmNlIGZ1bGwsIHRoZSBzdG9yZSBzdG9wc1xuICAgKiBkZWR1cGxpY2F0aW5nIGZyZXNoIHJlcXVlc3RzIHVudGlsIHRoZSBUVEwgc3dlZXAgcnVucy4gU3RheXMgYm91bmRlZDsgZmF2b3JzXG4gICAqIHJlY2VudCBrZXlzIChtb3N0IGxpa2VseSB0byBiZSByZXRyaWVkKS5cbiAgICovXG4gIGNvbnN0IGV2aWN0SWZGdWxsID0gKGtleTogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgaWYgKCFtYXAuaGFzKGtleSkgJiYgbWFwLnNpemUgPj0gQ29yZUNvbnN0YW50cy5JREVNUE9URU5DWV9NQVhfU1RPUkVfU0laRSkge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gbWFwLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICBpZiAob2xkZXN0ICE9PSB1bmRlZmluZWQpIG1hcC5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIGxpdmUoa2V5KTtcbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXksIGVudHJ5KSB7XG4gICAgICBldmljdElmRnVsbChrZXkpO1xuICAgICAgbWFwLnNldChrZXksIGVudHJ5KTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc2VydmUoa2V5LCBlbnRyeSkge1xuICAgICAgLy8gQXRvbWljIGluIGEgc2luZ2xlLXRocmVhZGVkIHJ1bnRpbWU6IG5vIGF3YWl0IGJldHdlZW4gdGhlIGxpdmVuZXNzIGNoZWNrXG4gICAgICAvLyBhbmQgdGhlIHNldCwgc28gdHdvIGNvbmN1cnJlbnQgY2FsbGVycyBjYW4ndCBib3RoIG9ic2VydmUgXCJhYnNlbnRcIi5cbiAgICAgIGlmIChsaXZlKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIGV2aWN0SWZGdWxsKGtleSk7XG4gICAgICBtYXAuc2V0KGtleSwgZW50cnkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBhc3luYyBkZWxldGUoa2V5KSB7XG4gICAgICBtYXAuZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIFJlZGlzIHN1cmZhY2UgdGhlIGlkZW1wb3RlbmN5IHN0b3JlIG5lZWRzIChhbiBpb3JlZGlzIHN1YnNldCkuXG4gKiBgc2V0YCBzdXBwb3J0cyB0aGUgdmFyaWFkaWMgb3B0aW9uIHRhaWw6IGBTRVQga2V5IHZhbCBFWCA8dHRsPiBbTlhdYCwgd2hpY2hcbiAqIHJldHVybnMgYCdPSydgIG9uIHN1Y2Nlc3MgYW5kIGBudWxsYCB3aGVuIGFuIGBOWGAgc2V0IHdhcyByZWZ1c2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGlzSWRlbXBvdGVuY3lDbGllbnQge1xuICBnZXQoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIC4uLmFyZ3M6IChzdHJpbmcgfCBudW1iZXIpW10pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+O1xuICBkZWwoa2V5OiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbmNvbnN0IFJFRElTX0tFWV9QUkVGSVggPSAnaWRlbTonO1xuXG4vKipcbiAqIFJlZGlzLWJhY2tlZCB7QGxpbmsgSWRlbXBvdGVuY3lTdG9yZX0gZm9yIGNvcnJlY3QgZGVkdXBsaWNhdGlvbiBhY3Jvc3NcbiAqIGhvcml6b250YWxseS1zY2FsZWQgcmVwbGljYXMuIGByZXNlcnZlYCBtYXBzIHRvIGFuIGF0b21pYyBgU0VUIOKApiBOWGAgc28gdHdvXG4gKiBwb2RzIGJlaGluZCBhIGxvYWQtYmFsYW5jZXIgY2FuJ3QgYm90aCB3aW4gYSBmaXJzdC10aW1lIHJlcXVlc3Qgc2hhcmluZyBhblxuICogSWRlbXBvdGVuY3ktS2V5OyBhIHJldHJ5IGxhbmRpbmcgb24gQU5ZIHBvZCBzZWVzIHRoZSBzYW1lIGNvbW1pdHRlZCByZXNwb25zZS5cbiAqIFJlZGlzIFRUTCBvd25zIGV4cGlyeSAodGhlIGBDYWNoZWRFbnRyeS5leHBpcmVzQXRgIGZpZWxkIGlzIGNhcnJpZWQgb25seSBmb3JcbiAqIEFQSS1zaGFwZSBwYXJpdHkgd2l0aCB0aGUgbWVtb3J5IHN0b3JlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZGlzSWRlbXBvdGVuY3lTdG9yZShyZWRpczogUmVkaXNJZGVtcG90ZW5jeUNsaWVudCk6IElkZW1wb3RlbmN5U3RvcmUge1xuICBjb25zdCBrID0gKGtleTogc3RyaW5nKTogc3RyaW5nID0+IGAke1JFRElTX0tFWV9QUkVGSVh9JHtrZXl9YDtcbiAgcmV0dXJuIHtcbiAgICBhc3luYyBnZXQoa2V5KSB7XG4gICAgICBjb25zdCByYXcgPSBhd2FpdCByZWRpcy5nZXQoayhrZXkpKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm4gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ2FjaGVkRW50cnk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gQ29ycnVwdCBlbnRyeSDihpIgdHJlYXQgYXMgYWJzZW50IHNvIHRoZSByZXF1ZXN0IHByb2NlZWRzIGZyZXNoLlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9LFxuICAgIGFzeW5jIHNldChrZXksIGVudHJ5LCB0dGxTZWNvbmRzKSB7XG4gICAgICBhd2FpdCByZWRpcy5zZXQoayhrZXkpLCBKU09OLnN0cmluZ2lmeShlbnRyeSksICdFWCcsIE1hdGgubWF4KDEsIHR0bFNlY29uZHMpKTtcbiAgICB9LFxuICAgIGFzeW5jIHJlc2VydmUoa2V5LCBlbnRyeSwgdHRsU2Vjb25kcykge1xuICAgICAgLy8gQXRvbWljIGNsYWltOiBTRVQga2V5IHZhbCBFWCB0dGwgTlgg4oaSICdPSycgb25seSBpZiB0aGUga2V5IHdhcyBhYnNlbnQuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCByZWRpcy5zZXQoayhrZXkpLCBKU09OLnN0cmluZ2lmeShlbnRyeSksICdFWCcsIE1hdGgubWF4KDEsIHR0bFNlY29uZHMpLCAnTlgnKTtcbiAgICAgIHJldHVybiByZXMgPT09ICdPSyc7XG4gICAgfSxcbiAgICBhc3luYyBkZWxldGUoa2V5KSB7XG4gICAgICBhd2FpdCByZWRpcy5kZWwoayhrZXkpKTtcbiAgICB9LFxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgUmVkaXMtYmFja2VkIGlkZW1wb3RlbmN5IHN0b3JlIGZyb20gdGhlIHNoYXJlZCBlbnYgUmVkaXMgKHRoZSBzYW1lXG4gKiBgUkVESVNfVVJMYCAvIGBSRURJU19TRU5USU5FTFNgIHdpcmluZyB0aGUgcmF0ZS1saW1pdGVyIGFuZCBhdWRpdC1zcG9vbCB1c2UpLlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiBSZWRpcyBpc24ndCBjb25maWd1cmVkL2F2YWlsYWJsZSBzbyB0aGUgY2FsbGVyIGtlZXBzIHRoZVxuICogaW4tbWVtb3J5IGRlZmF1bHQgKHNpbmdsZS1yZXBsaWNhIGNvcnJlY3RuZXNzKS4gTmV2ZXIgdGhyb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRW52UmVkaXNJZGVtcG90ZW5jeVN0b3JlKCk6IElkZW1wb3RlbmN5U3RvcmUgfCBudWxsIHtcbiAgY29uc3QgY2xpZW50ID0gY3JlYXRlRW52UmVkaXNDbGllbnQ8UmVkaXNJZGVtcG90ZW5jeUNsaWVudD4oJ2lkZW1wb3RlbmN5Jyk7XG4gIGlmICghY2xpZW50KSByZXR1cm4gbnVsbDtcbiAgbG9nZ2VyLmluZm8oJ1JlZGlzIGlkZW1wb3RlbmN5IHN0b3JlIGluaXRpYWxpemVkJyk7XG4gIHJldHVybiBjcmVhdGVSZWRpc0lkZW1wb3RlbmN5U3RvcmUoY2xpZW50KTtcbn1cblxuY29uc3QgbWVtb3J5U3RvcmUgPSBjcmVhdGVNZW1vcnlTdG9yZSgpO1xuXG4vKipcbiAqIFByb2Nlc3Mtd2lkZSBkZWZhdWx0IHN0b3JlIHVzZWQgYnkgYGlkZW1wb3RlbmN5TWlkZGxld2FyZSgpYCB3aGVuIG5vIGV4cGxpY2l0XG4gKiBgc3RvcmVgIGlzIHBhc3NlZC4gRGVmYXVsdHMgdG8gdGhlIGluLW1lbW9yeSBzdG9yZTsgYGNyZWF0ZUFwcGAgcHJvbW90ZXMgaXQgdG9cbiAqIHRoZSBzaGFyZWQgZW52LVJlZGlzIHN0b3JlIChtdWx0aS1yZXBsaWNhIGRlZHVwKSBhdCBzdGFydHVwIHZpYVxuICoge0BsaW5rIHNldElkZW1wb3RlbmN5U3RvcmV9LiBUaGUgcm91dGUgZmFjdG9yaWVzIGtlZXAgY2FsbGluZ1xuICogYGlkZW1wb3RlbmN5TWlkZGxld2FyZSgpYCB3aXRoIG5vIGFyZ3MgYW5kIHRyYW5zcGFyZW50bHkgcGljayB0aGlzIHVwLlxuICovXG5sZXQgZGVmYXVsdFN0b3JlOiBJZGVtcG90ZW5jeVN0b3JlID0gbWVtb3J5U3RvcmU7XG5cbi8qKiBJbmplY3QgdGhlIHByb2Nlc3Mtd2lkZSBpZGVtcG90ZW5jeSBzdG9yZSAoZS5nLiBhIFJlZGlzLWJhY2tlZCBvbmUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldElkZW1wb3RlbmN5U3RvcmUoc3RvcmU6IElkZW1wb3RlbmN5U3RvcmUpOiB2b2lkIHtcbiAgZGVmYXVsdFN0b3JlID0gc3RvcmU7XG59XG5cbi8qKiBUaGUgY3VycmVudCBwcm9jZXNzLXdpZGUgZGVmYXVsdCBzdG9yZSAoaW4tbWVtb3J5IHVubGVzcyBvdmVycmlkZGVuKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJZGVtcG90ZW5jeVN0b3JlKCk6IElkZW1wb3RlbmN5U3RvcmUge1xuICByZXR1cm4gZGVmYXVsdFN0b3JlO1xufVxuXG4vKipcbiAqIE1hcmtzIGEgcmVxdWVzdCBpZGVtcG90ZW5jeSBoYXMgYWxyZWFkeSBoYW5kbGVkLiBSb3V0ZSBjaGFpbnMgYXJlIHN0YWNrZWQg4oCUXG4gKiBzZXZlcmFsIGBhcHAudXNlKHByZWZpeCwgLi4uY3JlYXRlQXV0aGVudGljYXRlZFdpdGhPcmdSb3V0ZSgpLCByb3V0ZXIpYCBtb3VudHNcbiAqIHNoYXJlIGEgcHJlZml4LCBhbmQgYSByZXF1ZXN0IHRoYXQgZmFsbHMgdGhyb3VnaCB0aGUgZmlyc3Qgcm91dGVyIHJ1bnMgdGhlXG4gKiBuZXh0IGNoYWluJ3MgaWRlbXBvdGVuY3kgbWlkZGxld2FyZSBhZ2Fpbi4gVGhhdCBzZWNvbmQgcGFzcyBmb3VuZCBpdHMgT1dOXG4gKiBwZW5kaW5nIHJlc2VydmF0aW9uIGFuZCBhbnN3ZXJlZCA0MDkuXG4gKi9cbmNvbnN0IElERU1QT1RFTkNZX0hBTkRMRUQgPSBTeW1ib2woJ3BpcGVsaW5lLWJ1aWxkZXIuaWRlbXBvdGVuY3kuaGFuZGxlZCcpO1xuXG5leHBvcnQgaW50ZXJmYWNlIElkZW1wb3RlbmN5TWlkZGxld2FyZU9wdGlvbnMge1xuICAvKiogQ3VzdG9tIHN0b3JlIGJhY2tlbmQuIERlZmF1bHRzIHRvIHRoZSBwcm9jZXNzLXdpZGUgc3RvcmUgc2V0IHZpYVxuICAgKiAge0BsaW5rIHNldElkZW1wb3RlbmN5U3RvcmV9IChpbi1tZW1vcnkgdW50aWwgYGNyZWF0ZUFwcGAgd2lyZXMgUmVkaXMpLiAqL1xuICBzdG9yZT86IElkZW1wb3RlbmN5U3RvcmU7XG59XG5cbi8qKlxuICogTWlkZGxld2FyZSB0aGF0IHN1cHBvcnRzIGlkZW1wb3RlbmN5IGtleXMgZm9yIFBPU1QvUFVUL0RFTEVURSBtdXRhdGlvbnMuXG4gKlxuICogV2hlbiBhIHJlcXVlc3QgaW5jbHVkZXMgdGhlIGBJZGVtcG90ZW5jeS1LZXlgIGhlYWRlcjpcbiAqIC0gRmlyc3QgY2FsbDogcHJvY2Vzc2VzIG5vcm1hbGx5LCBjYWNoZXMgdGhlIHJlc3BvbnNlXG4gKiAtIFN1YnNlcXVlbnQgY2FsbHMgd2l0aCBzYW1lIGtleTogcmV0dXJucyBjYWNoZWQgcmVzcG9uc2UgKHByZXZlbnRzIGR1cGxpY2F0ZSBtdXRhdGlvbnMpXG4gKlxuICogRGVmYXVsdHMgdG8gYW4gaW4tbWVtb3J5IHN0b3JlIChzaW5nbGUtcmVwbGljYSkuIFBhc3MgYSBjdXN0b21cbiAqIGNyb3NzLXJlcGxpY2EgYHsgc3RvcmUgfWAgaW1wbGVtZW50aW5nIGBJZGVtcG90ZW5jeVN0b3JlYCB0byBkZWR1cGUgYWNyb3NzXG4gKiByZXBsaWNhcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlkZW1wb3RlbmN5TWlkZGxld2FyZShvcHRpb25zOiBJZGVtcG90ZW5jeU1pZGRsZXdhcmVPcHRpb25zID0ge30pIHtcbiAgLy8gUmVzb2x2ZSB0aGUgc3RvcmUgUEVSIFJFUVVFU1QgKG5vdCBhdCBmYWN0b3J5IHRpbWUpIHNvIGEgc3RvcmUgaW5qZWN0ZWQgYnlcbiAgLy8gY3JlYXRlQXBwIEFGVEVSIHRoZSByb3V0ZSBjaGFpbnMgYXJlIGJ1aWx0IHN0aWxsIHRha2VzIGVmZmVjdC4gQW4gZXhwbGljaXRcbiAgLy8gYG9wdGlvbnMuc3RvcmVgIGFsd2F5cyB3aW5zLlxuICBjb25zdCBleHBsaWNpdFN0b3JlID0gb3B0aW9ucy5zdG9yZTtcbiAgY29uc3QgdHRsTXMgPSBDb3JlQ29uc3RhbnRzLklERU1QT1RFTkNZX1RUTF9NUztcbiAgY29uc3QgdHRsU2VjID0gTWF0aC5mbG9vcih0dGxNcyAvIDEwMDApO1xuXG4gIHJldHVybiAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBuZXh0OiBOZXh0RnVuY3Rpb24pID0+IHtcbiAgICBjb25zdCBzdG9yZSA9IGV4cGxpY2l0U3RvcmUgPz8gZGVmYXVsdFN0b3JlO1xuICAgIGNvbnN0IGtleSA9IHJlcS5oZWFkZXJzWydpZGVtcG90ZW5jeS1rZXknXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKCFrZXkpIHJldHVybiBuZXh0KCk7XG5cbiAgICAvLyBPbmx5IGFwcGx5IHRvIG11dGF0aW9uIG1ldGhvZHNcbiAgICBpZiAoIVsnUE9TVCcsICdQVVQnLCAnREVMRVRFJ10uaW5jbHVkZXMocmVxLm1ldGhvZCkpIHJldHVybiBuZXh0KCk7XG5cbiAgICAvLyBPbmUgcGFzcyBwZXIgcmVxdWVzdDogYSBsYXRlciBzdGFja2VkIGNoYWluIG11c3Qgbm90IHJlLWNoZWNrIHRoZSBrZXkuXG4gICAgY29uc3QgbWFya2VkID0gcmVxIGFzIFJlcXVlc3QgJiB7IFtJREVNUE9URU5DWV9IQU5ETEVEXT86IHRydWUgfTtcbiAgICBpZiAobWFya2VkW0lERU1QT1RFTkNZX0hBTkRMRURdKSByZXR1cm4gbmV4dCgpO1xuXG4gICAgLy8gTmFtZXNwYWNlIGJ5IG9yZ0lkIHRvIHByZXZlbnQgY3Jvc3Mtb3JnIGNhY2hlIGNvbGxpc2lvbnMuIFByZWZlciB0aGVcbiAgICAvLyBWRVJJRklFRCBhdXRoIG9yZyAoYHJlcS51c2VyYCwgcG9wdWxhdGVkIGJ5IHJlcXVpcmVBdXRoIGFmdGVyIHNpZ25hdHVyZVxuICAgIC8vIHZlcmlmaWNhdGlvbikgb3ZlciBgcmVxLmNvbnRleHQuaWRlbnRpdHlgLCB3aGljaCBzb21lIHNlcnZpY2VzIHBvcHVsYXRlXG4gICAgLy8gcHJlLWF1dGggZnJvbSBhbiBVTlZFUklGSUVEIHRva2VuIHBlZWsg4oCUIG5hbWVzcGFjaW5nIGEgbXV0YXRpb24ncyByZXBsYXlcbiAgICAvLyBjYWNoZSBvbiBhbiB1bnZlcmlmaWVkLCBjYWxsZXItaW5mbHVlbmNlZCBvcmcgaWQgd291bGQgYmUgdW5zYWZlLlxuICAgIGNvbnN0IG9yZ0lkID0gcmVxLnVzZXI/Lm9yZ2FuaXphdGlvbklkIHx8IHJlcS5jb250ZXh0Py5pZGVudGl0eT8ub3JnSWQ7XG4gICAgaWYgKCFvcmdJZCkgcmV0dXJuIG5leHQoKTsgLy8gc2tpcCBpZGVtcG90ZW5jeSBmb3IgdW5hdXRoZW50aWNhdGVkIHJlcXVlc3RzXG4gICAgbWFya2VkW0lERU1QT1RFTkNZX0hBTkRMRURdID0gdHJ1ZTtcblxuICAgIC8vIE5hbWVzcGFjZSB0aGUgc3RvcmVkIGtleSBieSAobWV0aG9kLCByb3V0ZSwgb3JnLCBib2R5KSBzbyBhbiBJZGVtcG90ZW5jeS1LZXlcbiAgICAvLyBpcyBzY29wZWQgdG8gT05FIHNwZWNpZmljIGVuZHBvaW50K3BheWxvYWQuIFJldXNpbmcgYSBzaW5nbGUga2V5IGFjcm9zcyB0d29cbiAgICAvLyByb3V0ZXMgKGUuZy4gUE9TVCAvcGlwZWxpbmVzIHRoZW4gUE9TVCAvcGx1Z2lucykgcHJldmlvdXNseSByZXBsYXllZCB0aGVcbiAgICAvLyBmaXJzdCBlbmRwb2ludCdzIDJ4eCBmb3IgdGhlIHNlY29uZCDigJQgdGhlIHN0b3JlIGlzIGEgbW9kdWxlLWxldmVsIHNpbmdsZXRvblxuICAgIC8vIHNoYXJlZCBieSBldmVyeSByb3V0ZS4gRm9sZGluZyBpbiBtZXRob2QgKyByb3V0ZSBwYXRoICsgYSBib2R5IGZpbmdlcnByaW50XG4gICAgLy8gb25seSBtYWtlcyBrZXlzIE1PUkUgc3BlY2lmaWMsIHNvIHRoZXJlIGlzIG5vIGNyb3NzLWNvbnRhbWluYXRpb24gcmlzay5cbiAgICAvLyBBbHNvIG5hbWVzcGFjZSBieSB0aGUgVkVSSUZJRUQgdXNlci4gYElkZW1wb3RlbmN5LUtleWAgaXMgY2hvc2VuIGJ5IHRoZVxuICAgIC8vIGNsaWVudCwgc28gdHdvIHVzZXJzIGluIHRoZSBzYW1lIG9yZyBzZW5kaW5nIHRoZSBzYW1lIGJvZHkgd2l0aCB0aGUgc2FtZVxuICAgIC8vIGtleSBjb2xsaWRlZDogdGhlIHNlY29uZCB1c2VyJ3MgbXV0YXRpb24gd2FzIFNLSVBQRUQgYW5kIHRoZXkgd2VyZSBzZXJ2ZWRcbiAgICAvLyB0aGUgZmlyc3QgdXNlcidzIGNhY2hlZCByZXNwb25zZS4gRmFsbHMgYmFjayB0byB0aGUgb3JnIGFsb25lIG9ubHkgd2hlblxuICAgIC8vIHRoZXJlIGlzIG5vIHZlcmlmaWVkIHN1YmplY3QgKHNlcnZpY2UgcHJpbmNpcGFscyBjYXJyeSBvbmUpLlxuICAgIGNvbnN0IHN1YiA9IHJlcS51c2VyPy5zdWI7XG4gICAgY29uc3Qgcm91dGVQYXRoID0gKHJlcS5iYXNlVXJsID8/ICcnKSArIChyZXEucm91dGU/LnBhdGggPz8gcmVxLnBhdGggPz8gJycpO1xuICAgIGNvbnN0IGZ1bGxLZXkgPSBgJHtyZXEubWV0aG9kfToke3JvdXRlUGF0aH06JHtvcmdJZH06JHtzdWIgPz8gJy0nfToke2JvZHlGaW5nZXJwcmludChyZXEuYm9keSl9OiR7a2V5fWA7XG5cbiAgICAvKiogUmVqZWN0IGEgZHVwbGljYXRlIHdob3NlIG9yaWdpbmFsIGlzIHN0aWxsIGluLWZsaWdodC4gKi9cbiAgICBjb25zdCBzZW5kSW5Qcm9ncmVzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHJlcy5zZXRIZWFkZXIoJ1JldHJ5LUFmdGVyJywgJzEnKTtcbiAgICAgIHNlbmRFcnJvcihyZXMsIDQwOSwgJ0EgcmVxdWVzdCB3aXRoIHRoaXMgSWRlbXBvdGVuY3ktS2V5IGlzIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkJywgRXJyb3JDb2RlLkNPTkZMSUNUKTtcbiAgICB9O1xuXG4gICAgc3RvcmUuZ2V0KGZ1bGxLZXkpLnRoZW4oYXN5bmMgKGNhY2hlZCkgPT4ge1xuICAgICAgaWYgKGNhY2hlZCAmJiAhY2FjaGVkLnBlbmRpbmcpIHtcbiAgICAgICAgLy8gQ29tcGxldGVkIHJlc3BvbnNlIG9uIHJlY29yZCDihpIgcmVwbGF5IGl0LlxuICAgICAgICBsb2dnZXIuZGVidWcoJ0lkZW1wb3RlbnQgcmVxdWVzdCByZXBsYXllZCcsIHsga2V5OiBmdWxsS2V5IH0pO1xuICAgICAgICByZXMuc2V0SGVhZGVyKCdYLUlkZW1wb3RlbnQtUmVwbGF5ZWQnLCAndHJ1ZScpO1xuICAgICAgICByZXMuc3RhdHVzKGNhY2hlZC5zdGF0dXNDb2RlKS5qc29uKGNhY2hlZC5ib2R5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGNhY2hlZCAmJiBjYWNoZWQucGVuZGluZykge1xuICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaXMgc3RpbGwgcnVubmluZyDigJQgZG9uJ3QgcnVuIHRoZSBtdXRhdGlvbiBhIHNlY29uZCB0aW1lLlxuICAgICAgICBsb2dnZXIuZGVidWcoJ0lkZW1wb3RlbnQgcmVxdWVzdCByZWplY3RlZCAoaW4gcHJvZ3Jlc3MpJywgeyBrZXk6IGZ1bGxLZXkgfSk7XG4gICAgICAgIHJldHVybiBzZW5kSW5Qcm9ncmVzcygpO1xuICAgICAgfVxuXG4gICAgICAvLyBBdG9taWNhbGx5IHJlc2VydmUgdGhlIGtleS4gTG9zaW5nIHRoaXMgcmFjZSBtZWFucyBhIGNvbmN1cnJlbnQgcmVxdWVzdFxuICAgICAgLy8gd2l0aCB0aGUgc2FtZSBrZXkgZ290IHRoZXJlIGZpcnN0IGFuZCBpcyBpbi1mbGlnaHQg4oaSIDQwOS5cbiAgICAgIGNvbnN0IHdvbiA9IGF3YWl0IHN0b3JlLnJlc2VydmUoXG4gICAgICAgIGZ1bGxLZXksXG4gICAgICAgIHsgc3RhdHVzQ29kZTogMCwgYm9keTogbnVsbCwgcGVuZGluZzogdHJ1ZSwgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdHRsTXMgfSxcbiAgICAgICAgdHRsU2VjLFxuICAgICAgKTtcbiAgICAgIGlmICghd29uKSB7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnSWRlbXBvdGVudCByZXF1ZXN0IHJlamVjdGVkIChsb3N0IHJlc2VydmUgcmFjZSknLCB7IGtleTogZnVsbEtleSB9KTtcbiAgICAgICAgcmV0dXJuIHNlbmRJblByb2dyZXNzKCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFdlIG93biB0aGUgcmVzZXJ2YXRpb24uIEl0IE1VU1QgYmUgcmVzb2x2ZWQgZXhhY3RseSBvbmNlIOKAlCBlaXRoZXIgdGhlXG4gICAgICAvLyByZWFsIDJ4eCByZXNwb25zZSBpcyBjYWNoZWQgZm9yIHJlcGxheSwgb3IgdGhlIHJlc2VydmF0aW9uIGlzIHJlbGVhc2VkIHNvXG4gICAgICAvLyBhIHJldHJ5IGNhbiBwcm9jZWVkLiBgc2V0dGxlZGAgZ3VhcmRzIGFnYWluc3QgYSBkb3VibGUtcmVzb2x2ZS5cbiAgICAgIGxldCBzZXR0bGVkID0gZmFsc2U7XG4gICAgICBsZXQgY2FwdHVyZWRCb2R5OiB1bmtub3duO1xuICAgICAgbGV0IGJvZHlDYXB0dXJlZCA9IGZhbHNlO1xuXG4gICAgICAvKiogUmVtZW1iZXIgdGhlIHJlc3BvbnNlIGJvZHkgZm9yIHJlcGxheSAoZmlyc3QgY2FwdHVyZSB3aW5zKS4gKi9cbiAgICAgIGNvbnN0IGNhcHR1cmVCb2R5ID0gKGJvZHk6IHVua25vd24pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCFib2R5Q2FwdHVyZWQpIHtcbiAgICAgICAgICBjYXB0dXJlZEJvZHkgPSBib2R5O1xuICAgICAgICAgIGJvZHlDYXB0dXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBzdG9yZS5kZWxldGUoZnVsbEtleSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGxvZ2dlci53YXJuKCdJZGVtcG90ZW5jeSByZXNlcnZhdGlvbiByZWxlYXNlIGZhaWxlZCcsIHsga2V5OiBmdWxsS2V5LCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGNhY2hlU3VjY2VzcyA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIHN0b3JlLnNldChmdWxsS2V5LCB7XG4gICAgICAgICAgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUsXG4gICAgICAgICAgYm9keTogYm9keUNhcHR1cmVkID8gY2FwdHVyZWRCb2R5IDogbnVsbCxcbiAgICAgICAgICBleHBpcmVzQXQ6IERhdGUubm93KCkgKyB0dGxNcyxcbiAgICAgICAgfSwgdHRsU2VjKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgbG9nZ2VyLndhcm4oJ0lkZW1wb3RlbmN5IHN0b3JlLnNldCBmYWlsZWQnLCB7IGtleTogZnVsbEtleSwgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICAvKiogUmVzb2x2ZSB0aGUgcmVzZXJ2YXRpb24gZnJvbSB0aGUgQUNUVUFMIGZpbmFsIHN0YXR1czogY2FjaGUgMnh4LCBlbHNlIHJlbGVhc2UuICovXG4gICAgICBjb25zdCBzZXR0bGVGcm9tU3RhdHVzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDwgMzAwKSBjYWNoZVN1Y2Nlc3MoKTtcbiAgICAgICAgZWxzZSByZWxlYXNlKCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBGYXN0IHBhdGg6IHJlcy5qc29uIGlzIHRoZSBjb21tb24gY29tcGxldGlvbi4gQ2FwdHVyZSB0aGUgYm9keSBhbmQgc2V0dGxlXG4gICAgICAvLyBpbW1lZGlhdGVseSBvZmYgdGhlIHN0YXR1cyBzZXQgYnkgcmVzLnN0YXR1cyguLi4pLmpzb24oLi4uKS5cbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbiA9IHJlcy5qc29uLmJpbmQocmVzKTtcbiAgICAgIHJlcy5qc29uID0gKGJvZHk6IHVua25vd24pID0+IHtcbiAgICAgICAgcmVzLnNldEhlYWRlcignWC1JZGVtcG90ZW50LVJlcGxheWVkJywgJ2ZhbHNlJyk7XG4gICAgICAgIGNhcHR1cmVCb2R5KGJvZHkpO1xuICAgICAgICBzZXR0bGVGcm9tU3RhdHVzKCk7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbEpzb24oYm9keSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBCb2R5LWNhcHR1cmUgYmFja3N0b3BzIGZvciBjb21wbGV0aW9ucyB0aGF0IGJ5cGFzcyByZXMuanNvblxuICAgICAgLy8gKHJlcy5zZW5kIC8gcmVzLmVuZCAvIHJlcy5zZW5kRmlsZSDihpIgcmVzLmVuZCkuIFRoZXNlIG9ubHkgUkVDT1JEIHRoZSBib2R5O1xuICAgICAgLy8gdGhlIGFjdHVhbCBzZXR0bGUgaGFwcGVucyBvbiBgZmluaXNoYCBmcm9tIHRoZSByZWFsIHN0YXR1cyBjb2RlLiBGaXJzdFxuICAgICAgLy8gY2FwdHVyZSB3aW5zLCBzbyByZXMuanNvbidzIGJvZHkgaXMgbmV2ZXIgY2xvYmJlcmVkIGJ5IGl0cyBpbnRlcm5hbFxuICAgICAgLy8gcmVzLnNlbmQvcmVzLmVuZCBjYWxscy5cbiAgICAgIGNvbnN0IHBhdGNoZWQgPSByZXMgYXMgdW5rbm93biBhcyB7XG4gICAgICAgIHNlbmQ/OiAoYm9keT86IHVua25vd24pID0+IHVua25vd247XG4gICAgICAgIGVuZD86ICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd247XG4gICAgICAgIG9uPzogKGV2ZW50OiBzdHJpbmcsIGNiOiAoKSA9PiB2b2lkKSA9PiB1bmtub3duO1xuICAgICAgfTtcbiAgICAgIGlmICh0eXBlb2YgcGF0Y2hlZC5zZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsU2VuZCA9IHBhdGNoZWQuc2VuZC5iaW5kKHJlcyk7XG4gICAgICAgIHBhdGNoZWQuc2VuZCA9IChib2R5PzogdW5rbm93bikgPT4ge1xuICAgICAgICAgIGNhcHR1cmVCb2R5KGJvZHkpO1xuICAgICAgICAgIHJldHVybiBvcmlnaW5hbFNlbmQoYm9keSk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHBhdGNoZWQuZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gcGF0Y2hlZC5lbmQuYmluZChyZXMpO1xuICAgICAgICBwYXRjaGVkLmVuZCA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBjb25zdCBjaHVuayA9IGFyZ3NbMF07XG4gICAgICAgICAgaWYgKGNodW5rICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGNodW5rICE9PSAnZnVuY3Rpb24nKSBjYXB0dXJlQm9keShjaHVuayk7XG4gICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRW5kKC4uLmFyZ3MpO1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvLyBCYWNrc3RvcCBmb3IgQU5ZIGNvbXBsZXRpb24gcGF0aCDigJQgaW5jbHVkaW5nIGEgMnh4IHRoYXQgZmluaXNoZWQgdmlhXG4gICAgICAvLyByZXMuc2VuZC9yZXMuZW5kL3Jlcy5zZW5kRmlsZS8yMDQgYW5kIG5ldmVyIGhpdCB0aGUgcGF0Y2hlZCByZXMuanNvbi5cbiAgICAgIC8vIERlY2lkaW5nIG9uIHRoZSByZWFsIGZpbmFsIHN0YXR1cyBoZXJlIG1lYW5zIGEgc3VjY2Vzc2Z1bCBvcCBpcyBjYWNoZWRcbiAgICAgIC8vIChvciBhIGZhaWxlZCBvbmUgcmVsZWFzZWQpIGluc3RlYWQgb2Ygc3RyYW5kaW5nIHRoZSByZXNlcnZhdGlvbiBhbmRcbiAgICAgIC8vIDQwOS1pbmcgZXZlcnkgcmV0cnkgZm9yIHRoZSBmdWxsIFRUTC4gR3VhcmRlZCDigJQgdGVzdCBkb3VibGVzIG1heSBub3QgYmVcbiAgICAgIC8vIEV2ZW50RW1pdHRlcnM7IHJlcy5qc29uJ3MgZmFzdCBwYXRoIGFscmVhZHkgc2V0dGxlZCB0aGUgY29tbW9uIGNhc2UuXG4gICAgICBpZiAodHlwZW9mIHBhdGNoZWQub24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcGF0Y2hlZC5vbignZmluaXNoJywgc2V0dGxlRnJvbVN0YXR1cyk7XG4gICAgICAgIC8vIEEgY2xpZW50IHRoYXQgZGlzY29ubmVjdHMgKG9yIGEgcHJvY2VzcyBraWxsZWQgbWlkLWhhbmRsZXIpIGVtaXRzXG4gICAgICAgIC8vICdjbG9zZScgV0lUSE9VVCAnZmluaXNoJywgd2hpY2ggdXNlZCB0byBsZWF2ZSB0aGUgcmVzZXJ2YXRpb25cbiAgICAgICAgLy8gYHBlbmRpbmdgIGZvciB0aGUgZnVsbCBJREVNUE9URU5DWV9UVExfTVMg4oCUIHNvIGV2ZXJ5IHJldHJ5IGdvdCBhIDQwOVxuICAgICAgICAvLyBhbmQgYSByZXRyeSBzdG9ybSBiZWNhbWUgYSBtdWx0aS1taW51dGUgb3V0YWdlIGZvciB0aGF0IGtleS5cbiAgICAgICAgLy8gUkVMRUFTRSByYXRoZXIgdGhhbiBjYWNoZTogdGhlIHJlc3BvbnNlIG5ldmVyIGNvbXBsZXRlZCwgc28gdGhlcmUgaXNcbiAgICAgICAgLy8gbm8gcmVzdWx0IHRvIHJlcGxheSwgYW5kIHRoZSByZXRyeSBzaG91bGQgZ2VudWluZWx5IHJlLXJ1bi5cbiAgICAgICAgcGF0Y2hlZC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgICBpZiAoIXJlcy53cml0YWJsZUZpbmlzaGVkKSByZWxlYXNlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgLy8gSWYgdGhlIHN0b3JlIGJhY2tlbmQgaXMgZG93biwgZmFpbCBvcGVuIOKAlCBwcm9jZXNzIHRoZSByZXF1ZXN0IG5vcm1hbGx5LlxuICAgICAgbG9nZ2VyLndhcm4oJ0lkZW1wb3RlbmN5IHN0b3JlLmdldCBmYWlsZWQ7IHByb2NlZWRpbmcgd2l0aG91dCBkZWR1cCcsIHsga2V5OiBmdWxsS2V5LCBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpIH0pO1xuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9O1xufVxuIl19
|
package/lib/api/index.d.ts
CHANGED
package/lib/api/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
// Middleware
|
|
4
|
-
export * from './middleware.js';
|
|
5
4
|
export * from './middleware-factory.js';
|
|
6
5
|
export * from './context-middleware.js';
|
|
7
6
|
export * from './check-quota.js';
|
|
@@ -32,4 +31,4 @@ export * from './readiness.js';
|
|
|
32
31
|
export * from './route-wrapper.js';
|
|
33
32
|
// Request/Response types
|
|
34
33
|
export * from './request-types.js';
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsYUFBYTtBQUNiLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQyxjQUFjO0FBQ2QsY0FBYyxrQkFBa0IsQ0FBQztBQUVqQyx1QkFBdUI7QUFDdkIsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQywyREFBMkQ7QUFDM0QsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQyxnQkFBZ0I7QUFDaEIsY0FBYyxvQkFBb0IsQ0FBQztBQUVuQyxjQUFjO0FBQ2QsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QyxnQkFBZ0I7QUFDaEIsY0FBYyxjQUFjLENBQUM7QUFDN0IsY0FBYyxjQUFjLENBQUM7QUFFN0IsbUJBQW1CO0FBQ25CLGNBQWMsYUFBYSxDQUFDO0FBRTVCLHFDQUFxQztBQUNyQyxjQUFjLGdCQUFnQixDQUFDO0FBRS9CLGdCQUFnQjtBQUNoQixjQUFjLG9CQUFvQixDQUFDO0FBRW5DLHlCQUF5QjtBQUN6QixjQUFjLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8vIE1pZGRsZXdhcmVcbmV4cG9ydCAqIGZyb20gJy4vbWlkZGxld2FyZS1mYWN0b3J5LmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udGV4dC1taWRkbGV3YXJlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vY2hlY2stcXVvdGEuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRlci1xdW90YS5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3JhdGUtbGltaXQtYnktb3JnLmpzJztcbmV4cG9ydCB7IGNyZWF0ZVNoYXJlZFJhdGVMaW1pdFN0b3JlIH0gZnJvbSAnLi9yYXRlLWxpbWl0LXN0b3JlLmpzJztcbmV4cG9ydCAqIGZyb20gJy4vcmVxdWlyZS1vcmctaWQuanMnO1xuZXhwb3J0ICogZnJvbSAnLi90ZW5hbnQtY29udGV4dC5qcyc7XG5leHBvcnQgKiBmcm9tICcuL2dldC1jb250ZXh0LmpzJztcblxuLy8gQXBwIGZhY3RvcnlcbmV4cG9ydCAqIGZyb20gJy4vYXBwLWZhY3RvcnkuanMnO1xuXG4vLyBIZWFsdGgtY2hlY2sgaGVscGVyc1xuZXhwb3J0ICogZnJvbSAnLi9oZWFsdGgtY2hlY2tzLmpzJztcblxuLy8gTW9uZ29EQiBjb25uZWN0aW9uIGhlbHBlciAoZGVwZW5kZW5jeS1pbmplY3RlZCBtb25nb29zZSlcbmV4cG9ydCAqIGZyb20gJy4vbW9uZ28tY29ubmVjdC5qcyc7XG5cbi8vIFF1b3RhIGhlbHBlcnNcbmV4cG9ydCAqIGZyb20gJy4vcXVvdGEtaGVscGVycy5qcyc7XG5cbi8vIElkZW1wb3RlbmN5XG5leHBvcnQgKiBmcm9tICcuL2lkZW1wb3RlbmN5LW1pZGRsZXdhcmUuanMnO1xuXG4vLyBPYnNlcnZhYmlsaXR5XG5leHBvcnQgKiBmcm9tICcuL3RyYWNpbmcuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXRyaWNzLmpzJztcblxuLy8gU2VydmVyIHV0aWxpdGllc1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2ZXIuanMnO1xuXG4vLyBSZWFkaW5lc3Mgc3RhdGUgKyBndWFyZCBtaWRkbGV3YXJlXG5leHBvcnQgKiBmcm9tICcuL3JlYWRpbmVzcy5qcyc7XG5cbi8vIFJvdXRlIHdyYXBwZXJcbmV4cG9ydCAqIGZyb20gJy4vcm91dGUtd3JhcHBlci5qcyc7XG5cbi8vIFJlcXVlc3QvUmVzcG9uc2UgdHlwZXNcbmV4cG9ydCAqIGZyb20gJy4vcmVxdWVzdC10eXBlcy5qcyc7XG4iXX0=
|
package/lib/api/metrics.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { Request, Response, NextFunction } from 'express';
|
|
2
|
+
import { Registry, Gauge } from 'prom-client';
|
|
3
|
+
/**
|
|
4
|
+
* Register the `secret_rotation_previous_set{secret}` gauge on `registry`: 1
|
|
5
|
+
* while a secret's `*_PREVIOUS` rotation value is still set, 0 otherwise. The
|
|
6
|
+
* value is read from api-core's probe registry at scrape time, so it always
|
|
7
|
+
* reflects the live process. Exported so platform (own registry) exposes the
|
|
8
|
+
* identical series; the `SecretRotationPreviousLingering` alert keys on it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerSecretRotationGauge(registry: Registry): Gauge<'secret'>;
|
|
2
11
|
/**
|
|
3
12
|
* Express middleware that records request duration and count.
|
|
4
13
|
*
|
package/lib/api/metrics.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { previousSecretStates, SECRET_ROTATION_PREVIOUS_GAUGE } from '@pipeline-builder/api-core';
|
|
3
4
|
import { Config } from '@pipeline-builder/pipeline-core';
|
|
4
5
|
import { Registry, collectDefaultMetrics, Counter, Histogram, Gauge } from 'prom-client';
|
|
5
6
|
const SERVICE_NAME = Config.getAny('observability').serviceName;
|
|
@@ -9,6 +10,27 @@ const register = new Registry();
|
|
|
9
10
|
register.setDefaultLabels({ service: SERVICE_NAME });
|
|
10
11
|
// Collect default Node.js process metrics (CPU, memory, heap, event loop lag, GC)
|
|
11
12
|
collectDefaultMetrics({ register });
|
|
13
|
+
/**
|
|
14
|
+
* Register the `secret_rotation_previous_set{secret}` gauge on `registry`: 1
|
|
15
|
+
* while a secret's `*_PREVIOUS` rotation value is still set, 0 otherwise. The
|
|
16
|
+
* value is read from api-core's probe registry at scrape time, so it always
|
|
17
|
+
* reflects the live process. Exported so platform (own registry) exposes the
|
|
18
|
+
* identical series; the `SecretRotationPreviousLingering` alert keys on it.
|
|
19
|
+
*/
|
|
20
|
+
export function registerSecretRotationGauge(registry) {
|
|
21
|
+
return new Gauge({
|
|
22
|
+
name: SECRET_ROTATION_PREVIOUS_GAUGE,
|
|
23
|
+
help: '1 while a secret rotation previous value (e.g. SECRET_ENCRYPTION_KEY_PREVIOUS) or a retiring signing key is still accepted; see docs/runbooks/secret-rotation.md',
|
|
24
|
+
labelNames: ['secret'],
|
|
25
|
+
registers: [registry],
|
|
26
|
+
collect() {
|
|
27
|
+
for (const { secret, previousSet } of previousSecretStates()) {
|
|
28
|
+
this.set({ secret }, previousSet ? 1 : 0);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
registerSecretRotationGauge(register);
|
|
12
34
|
/** HTTP request duration histogram (seconds) */
|
|
13
35
|
const httpRequestDuration = new Histogram({
|
|
14
36
|
name: 'http_request_duration_seconds',
|
|
@@ -230,4 +252,4 @@ function humanizeName(metricName) {
|
|
|
230
252
|
.replace(/_/g, ' ')
|
|
231
253
|
.replace(/^./, (c) => c.toUpperCase());
|
|
232
254
|
}
|
|
233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUE2QixDQUFDLFdBQVcsQ0FBQztBQUU3RixpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUVoQyxxQ0FBcUM7QUFDckMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFckQsa0ZBQWtGO0FBQ2xGLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUVwQyxnREFBZ0Q7QUFDaEQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFNBQVMsQ0FBQztJQUN4QyxJQUFJLEVBQUUsK0JBQStCO0lBQ3JDLElBQUksRUFBRSxzQ0FBc0M7SUFDNUMsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQVU7SUFDdkQsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUNsRSxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsMkJBQTJCO0FBQzNCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxPQUFPLENBQUM7SUFDcEMsSUFB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LENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDO1lBQ2hCLElBQUk7WUFDSixJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksQ0FBQztZQUN4QixVQUFVLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDL0IsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3RCLENBQUMsQ0FBQztRQUNILGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsVUFBa0I7SUFDdEMsNERBQTREO0lBQzVELE9BQU8sVUFBVTtTQUNkLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1NBQ2xCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0FBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IFJlZ2lzdHJ5LCBjb2xsZWN0RGVmYXVsdE1ldHJpY3MsIENvdW50ZXIsIEhpc3RvZ3JhbSwgR2F1Z2UgfSBmcm9tICdwcm9tLWNsaWVudCc7XG5cbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IChDb25maWcuZ2V0QW55KCdvYnNlcnZhYmlsaXR5JykgYXMgeyBzZXJ2aWNlTmFtZTogc3RyaW5nIH0pLnNlcnZpY2VOYW1lO1xuXG4vKiogU2hhcmVkIFByb21ldGhldXMgcmVnaXN0cnkgKi9cbmNvbnN0IHJlZ2lzdGVyID0gbmV3IFJlZ2lzdHJ5KCk7XG5cbi8vIFNldCBkZWZhdWx0IGxhYmVscyBmb3IgYWxsIG1ldHJpY3NcbnJlZ2lzdGVyLnNldERlZmF1bHRMYWJlbHMoeyBzZXJ2aWNlOiBTRVJWSUNFX05BTUUgfSk7XG5cbi8vIENvbGxlY3QgZGVmYXVsdCBOb2RlLmpzIHByb2Nlc3MgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGhlYXAsIGV2ZW50IGxvb3AgbGFnLCBHQylcbmNvbGxlY3REZWZhdWx0TWV0cmljcyh7IHJlZ2lzdGVyIH0pO1xuXG4vKiogSFRUUCByZXF1ZXN0IGR1cmF0aW9uIGhpc3RvZ3JhbSAoc2Vjb25kcykgKi9cbmNvbnN0IGh0dHBSZXF1ZXN0RHVyYXRpb24gPSBuZXcgSGlzdG9ncmFtKHtcbiAgbmFtZTogJ2h0dHBfcmVxdWVzdF9kdXJhdGlvbl9zZWNvbmRzJyxcbiAgaGVscDogJ0R1cmF0aW9uIG9mIEhUVFAgcmVxdWVzdHMgaW4gc2Vjb25kcycsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJ10gYXMgY29uc3QsXG4gIGJ1Y2tldHM6IFswLjAwNSwgMC4wMSwgMC4wMjUsIDAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwXSxcbiAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxufSk7XG5cbi8qKiBIVFRQIHJlcXVlc3QgY291bnRlciAqL1xuY29uc3QgaHR0cFJlcXVlc3RzVG90YWwgPSBuZXcgQ291bnRlcih7XG4gIG5hbWU6ICdodHRwX3JlcXVlc3RzX3RvdGFsJyxcbiAgaGVscDogJ1RvdGFsIG51bWJlciBvZiBIVFRQIHJlcXVlc3RzJyxcbiAgbGFiZWxOYW1lczogWydtZXRob2QnLCAncm91dGUnLCAnc3RhdHVzX2NvZGUnXSBhcyBjb25zdCxcbiAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxufSk7XG5cbi8qKlxuICogUGVyLW9yZyBIVFRQIHJlcXVlc3QgY291bnRlciDigJQgU0FNUExFRCB0byBrZWVwIFByb21ldGhldXMgY2FyZGluYWxpdHlcbiAqIHVuZGVyIGNvbnRyb2wuIENhcmRpbmFsaXR5IG9mIGBvcmdfaWQgKiBtZXRob2QgKiByb3V0ZSAqIHN0YXR1c19jb2RlYFxuICogZ3Jvd3MgbXVsdGlwbGljYXRpdmVseTsgd2l0aCBOIG9yZ3MgKiA1MCByb3V0ZXMgKiA1IHN0YXR1c19jb2RlcyB0aGF0J3NcbiAqIDI1MMOXTiBzZXJpZXMuIFdlIHNhbXBsZSAxLWluLU4gcmVxdWVzdHMgKGNvbmZpZ3VyYWJsZSB2aWFcbiAqIGBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFYCwgZGVmYXVsdCAxLjAgPSBldmVyeSByZXF1ZXN0KS5cbiAqXG4gKiBPcGVyYXRvcnMgYW5zd2VyIFwid2hhdCdzIG9yZyBYJ3MgcDk5P1wiIHZpYSBzZXBhcmF0ZSBwZXItb3JnIGhpc3RvZ3JhbXNcbiAqIHNjcmFwZWQgYXQgYSBsb3dlciByYXRlLCBPUiB2aWEgTG9raSBMb2dRTCBxdWVyaWVzIGFnYWluc3QgdGhlXG4gKiB1bnNhbXBsZWQgYWNjZXNzLWxvZyBzdHJlYW0uIFRoaXMgY291bnRlciBpcyB0aGUgZmFzdC1wYXRoIFwibm9pc3lcbiAqIG5laWdoYm9yIGRldGVjdGlvblwiIOKAlCBvcGVyYXRvcnMgYWxlcnQgd2hlbiBvbmUgb3JnJ3MgcmVxdWVzdCByYXRlXG4gKiBkZXZpYXRlcyBmcm9tIHRoZSBmbGVldCBtZWRpYW4uXG4gKlxuICogTk9UIGEgaGlzdG9ncmFtOiBoaXN0b2dyYW0gbGFiZWwgY2FyZGluYWxpdHkgaXMgZXZlbiBtb3JlIHNlbnNpdGl2ZVxuICogKGVhY2ggYnVja2V0IGlzIGEgc2VwYXJhdGUgc2VyaWVzKS4gSWYgcGVyLW9yZyBsYXRlbmN5IHBlcmNlbnRpbGVzIGFyZVxuICogbmVlZGVkIGxhdGVyLCBhZGQgYSBzZXBhcmF0ZSBoaXN0b2dyYW0gd2l0aCBhIGNvYXJzZXIgYnVja2V0IHNldCBhbmRcbiAqIGxvd2VyIHNhbXBsZSByYXRlLlxuICovXG5jb25zdCBodHRwUmVxdWVzdHNCeU9yZ1RvdGFsID0gbmV3IENvdW50ZXIoe1xuICBuYW1lOiAnaHR0cF9yZXF1ZXN0c19ieV9vcmdfdG90YWwnLFxuICBoZWxwOiAnU2FtcGxlZCBwZXItb3JnIEhUVFAgcmVxdWVzdCBjb3VudCAoc2FtcGxlIHJhdGUgdmlhIEhUVFBfTUVUUklDU19PUkdfU0FNUExFX1JBVEUpJyxcbiAgbGFiZWxOYW1lczogWydtZXRob2QnLCAncm91dGUnLCAnc3RhdHVzX2NvZGUnLCAnb3JnX2lkJ10gYXMgY29uc3QsXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKipcbiAqIFNhbXBsZSByYXRlIGZvciB0aGUgcGVyLW9yZyBjb3VudGVyLiAxLjAgPSBldmVyeSByZXF1ZXN0LCAwLjAgPSBkaXNhYmxlZC5cbiAqIFBhcnNlZCBvbmNlIGF0IG1vZHVsZSBsb2FkIOKAlCBvcGVyYXRvcnMgdHVuZSBieSByZXN0YXJ0aW5nIHRoZSBzZXJ2aWNlLlxuICpcbiAqIERlZmF1bHRzIHRvIDAgKE9GRikuIGBvcmdfaWRgIGlzIGFuIFVOQk9VTkRFRCwgdGVuYW50LWlkZW50aWZ5aW5nIGxhYmVsIGFuZFxuICogcHJvbS1jbGllbnQgY291bnRlcnMgbmV2ZXIgZXhwaXJlLCBzbyBhdCB0aGUgb2xkIGRlZmF1bHQgb2YgMS4wIGV2ZXJ5IHNlcnZpY2VcbiAqIGFjY3VtdWxhdGVkIGEgc2VyaWVzIHBlciAob3JnIMOXIHJvdXRlIMOXIHN0YXR1cykgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLCBhbmRcbiAqIGAvbWV0cmljc2Ag4oCUIHdoaWNoIGlzIG5vdCBhdXRoLWdhdGVkIOKAlCBlbnVtZXJhdGVkIGV2ZXJ5IHRlbmFudCBpZCBhbG9uZyB3aXRoXG4gKiBpdHMgcmVxdWVzdCB2b2x1bWUgYW5kIGVycm9yIHJhdGUgdG8gYW55b25lIHdobyBjb3VsZCByZWFjaCB0aGUgcG9ydC5cbiAqXG4gKiBUdXJuIGl0IG9uIGRlbGliZXJhdGVseSAoYW5kIGlkZWFsbHkgd2l0aCBhIHNhbXBsZSByYXRlIHdlbGwgdW5kZXIgMS4wLCBwbHVzXG4gKiBgTUVUUklDU19TQ1JBUEVfVE9LRU5gIHNldCkgd2hlbiB5b3UgYWN0dWFsbHkgd2FudCBwZXItb3JnIG5vaXN5LW5laWdoYm91clxuICogZGV0ZWN0aW9uIGZyb20gbWV0cmljcyByYXRoZXIgdGhhbiBmcm9tIHRoZSBhY2Nlc3MtbG9nIHN0cmVhbS5cbiAqL1xuY29uc3QgT1JHX1NBTVBMRV9SQVRFID0gKCgpID0+IHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiAwO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHJhdyk7XG4gIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSB8fCBwYXJzZWQgPCAwIHx8IHBhcnNlZCA+IDEpIHJldHVybiAwO1xuICByZXR1cm4gcGFyc2VkO1xufSkoKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYW4gRXhwcmVzcyByb3V0ZSBwYXRoIHRvIHByZXZlbnQgbGFiZWwgY2FyZGluYWxpdHkgZXhwbG9zaW9uLlxuICpcbiAqIFVzZXMgRXhwcmVzcydzIG1hdGNoZWQgcm91dGUgcGF0dGVybiAoZS5nLiBgL3BsdWdpbnMvOmlkYCkgd2hlbiBhdmFpbGFibGUsXG4gKiBvdGhlcndpc2UgZmFsbHMgYmFjayB0byB0aGUgcmF3IHBhdGggd2l0aCBVVUlEL251bWVyaWMgc2VnbWVudHMgcmVwbGFjZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlKHJlcTogUmVxdWVzdCk6IHN0cmluZyB7XG4gIC8vIFByZWZlciBFeHByZXNzIG1hdGNoZWQgcm91dGUgcGF0dGVyblxuICBpZiAocmVxLnJvdXRlPy5wYXRoKSB7XG4gICAgcmV0dXJuIHJlcS5iYXNlVXJsICsgcmVxLnJvdXRlLnBhdGg7XG4gIH1cblxuICAvLyBGYWxsYmFjazogcmVwbGFjZSBVVUlEcyBhbmQgbnVtZXJpYyBJRHMgd2l0aCA6aWRcbiAgcmV0dXJuIHJlcS5wYXRoXG4gICAgLnJlcGxhY2UoL1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfS9naSwgJzppZCcpXG4gICAgLnJlcGxhY2UoL1xcL1xcZCsoPz1cXC98JCkvZywgJy86aWQnKTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCByZWNvcmRzIHJlcXVlc3QgZHVyYXRpb24gYW5kIGNvdW50LlxuICpcbiAqIE11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgcm91dGUgaGFuZGxlcnMgc28gYHJlcy5vbignZmluaXNoJylgIGZpcmVzXG4gKiBhZnRlciB0aGUgcmVzcG9uc2UgaXMgc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY3NNaWRkbGV3YXJlKCkge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgLy8gTk9URTogbm8gL21ldHJpY3Mgb3IgL2hlYWx0aCBza2lwIG5lZWRlZCBoZXJlIOKAlCBib3RoIGVuZHBvaW50cyBhcmVcbiAgICAvLyByZWdpc3RlcmVkIGluIGFwcC1mYWN0b3J5IEJFRk9SRSB0aGlzIG1pZGRsZXdhcmUgKGNyZWF0ZUhlYWx0aFJvdXRlciBhbmRcbiAgICAvLyBhcHAuZ2V0KCcvbWV0cmljcycpIGJvdGggdGVybWluYXRlIHRoZSByZXNwb25zZSksIHNvIG5laXRoZXIgZXZlciByZWFjaGVzXG4gICAgLy8gdGhpcyBoYW5kbGVyLlxuICAgIGNvbnN0IGVuZCA9IGh0dHBSZXF1ZXN0RHVyYXRpb24uc3RhcnRUaW1lcigpO1xuXG4gICAgcmVzLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZSA9IG5vcm1hbGl6ZVJvdXRlKHJlcSk7XG4gICAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcm91dGUsXG4gICAgICAgIHN0YXR1c19jb2RlOiBTdHJpbmcocmVzLnN0YXR1c0NvZGUpLFxuICAgICAgfTtcblxuICAgICAgZW5kKGxhYmVscyk7XG4gICAgICBodHRwUmVxdWVzdHNUb3RhbC5pbmMobGFiZWxzKTtcblxuICAgICAgLy8gUGVyLW9yZyBzYW1wbGVkIGNvdW50ZXIuIFNraXAgd2hlbjpcbiAgICAgIC8vICAgLSBubyBvcmcgY29udGV4dCBvbiB0aGUgcmVxdWVzdCAoYW5vbnltb3VzIC8gaGVhbHRoIGVuZHBvaW50cylcbiAgICAgIC8vICAgLSBzYW1wbGUgcmF0ZSBpcyAwIChkaXNhYmxlZClcbiAgICAgIC8vICAgLSBkaWNlIHJvbGwgZmFpbHNcbiAgICAgIC8vIFVzaW5nIE1hdGgucmFuZG9tIGZvciB0aGUgc2FtcGxlciDigJQgZm9yIHVuYmlhc2VkIGxvdy1yYXRlIHNhbXBsaW5nXG4gICAgICAvLyBhIGRldGVybWluaXN0aWMgcGVyLXJlcXVlc3QgaGFzaCB3b3VsZCBiZSBtb3JlIHVuaWZvcm0sIGJ1dCBhdCB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmF0ZSBvZiAxLjAgZXZlcnkgcmVxdWVzdCBsYW5kcyBzbyB0aGlzIGlzIGZpbmUuXG4gICAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZDtcbiAgICAgIGlmIChvcmdJZCAmJiBPUkdfU0FNUExFX1JBVEUgPiAwICYmIE1hdGgucmFuZG9tKCkgPCBPUkdfU0FNUExFX1JBVEUpIHtcbiAgICAgICAgaHR0cFJlcXVlc3RzQnlPcmdUb3RhbC5pbmMoeyAuLi5sYWJlbHMsIG9yZ19pZDogb3JnSWQgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59XG5cbi8qKlxuICogRXhwcmVzcyBoYW5kbGVyIHRoYXQgcmV0dXJucyBQcm9tZXRoZXVzIG1ldHJpY3MgaW4gdGV4dCBleHBvc2l0aW9uIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY3NIYW5kbGVyKCkge1xuICByZXR1cm4gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCByZWdpc3Rlci5jb250ZW50VHlwZSk7XG4gICAgcmVzLmVuZChhd2FpdCByZWdpc3Rlci5tZXRyaWNzKCkpO1xuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJ1c2luZXNzIC8gZG9tYWluIG1ldHJpY3Ncbi8vXG4vLyBTZXJ2aWNlcyBzaG91bGQgZW1pdCBjb3VudGVycyBmb3IgdGhlIHRoaW5ncyBvcGVyYXRvcnMgYWN0dWFsbHkgY2FyZSBhYm91dFxuLy8gKHBpcGVsaW5lcyBnZW5lcmF0ZWQsIHBsdWdpbiBidWlsZHMgY29tcGxldGVkLCBjb21wbGlhbmNlIHZpb2xhdGlvbnMsXG4vLyBBSSB0b2tlbnMgY29uc3VtZWQpIOKAlCBub3QganVzdCBIVFRQIHRyYWZmaWMuIFRoZSBoZWxwZXJzIGJlbG93IHJlZ2lzdGVyXG4vLyBjb3VudGVycyBsYXppbHkgb24gdGhlIHNoYXJlZCByZWdpc3RyeSBzbyBtdWx0aXBsZSBzZXJ2aWNlcyBjYW4gY2FsbFxuLy8gYGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ2NvbXBsZXRlZCcgfSlgIHdpdGhvdXRcbi8vIHdvcnJ5aW5nIGFib3V0IGRvdWJsZS1yZWdpc3RyYXRpb24uXG4vL1xuLy8gTmFtaW5nIGNvbnZlbnRpb246IGA8ZG9tYWluPl88bm91bj5fdG90YWxgIGZvciBjb3VudGVycywgYF9zZWNvbmRzYCBmb3Jcbi8vIGhpc3RvZ3JhbXMg4oCUIG1hdGNoZXMgUHJvbWV0aGV1cyBiZXN0LXByYWN0aWNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IGJ1c2luZXNzQ291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgQ291bnRlcjxzdHJpbmc+PigpO1xuY29uc3QgYnVzaW5lc3NIaXN0b2dyYW1zID0gbmV3IE1hcDxzdHJpbmcsIEhpc3RvZ3JhbTxzdHJpbmc+PigpO1xuY29uc3QgYnVzaW5lc3NHYXVnZXMgPSBuZXcgTWFwPHN0cmluZywgR2F1Z2U8c3RyaW5nPj4oKTtcblxuLyoqXG4gKiBJbmNyZW1lbnQgYSBidXNpbmVzcyBjb3VudGVyLCBjcmVhdGluZyBpdCBvbiBmaXJzdCB1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGluY0NvdW50ZXIoJ3BpcGVsaW5lc19nZW5lcmF0ZWRfdG90YWwnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJyB9KTtcbiAqIGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ2NvbXBsZXRlZCcgfSk7XG4gKiBpbmNDb3VudGVyKCdxdW90YV90aHJlc2hvbGRfY3Jvc3NlZF90b3RhbCcsIHsgdHlwZTogJ2FpQ2FsbHMnLCB0aWVyOiAncHJvJyB9KTtcbiAqIGluY0NvdW50ZXIoJ2NvbXBsaWFuY2VfdmlvbGF0aW9uc19mb3VuZF90b3RhbCcsIHsgc2V2ZXJpdHk6ICdjcml0aWNhbCcgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY0NvdW50ZXIobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSwgdmFsdWUgPSAxKTogdm9pZCB7XG4gIGxldCBjb3VudGVyID0gYnVzaW5lc3NDb3VudGVycy5nZXQobmFtZSk7XG4gIGlmICghY291bnRlcikge1xuICAgIGNvdW50ZXIgPSBuZXcgQ291bnRlcih7XG4gICAgICBuYW1lLFxuICAgICAgaGVscDogaHVtYW5pemVOYW1lKG5hbWUpLFxuICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbiAgICB9KTtcbiAgICBidXNpbmVzc0NvdW50ZXJzLnNldChuYW1lLCBjb3VudGVyKTtcbiAgfVxuICBjb3VudGVyLmluYyhsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYW4gb2JzZXJ2YXRpb24gb24gYSBidXNpbmVzcyBoaXN0b2dyYW0sIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS5cbiAqIFVzZSBmb3IgZHVyYXRpb25zLCBzaXplcywgYW55dGhpbmcgd2hlcmUgcGVyY2VudGlsZXMgbWF0dGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBvYnNlcnZlKCdhaV9nZW5lcmF0aW9uX2R1cmF0aW9uX3NlY29uZHMnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJywgbW9kZWw6ICdzb25uZXQnIH0sIGR1cmF0aW9uU2VjKTtcbiAqIG9ic2VydmUoJ3BsdWdpbl9idWlsZF9kdXJhdGlvbl9zZWNvbmRzJywgeyBidWlsZFR5cGU6ICdkb2NrZXInIH0sIGR1cmF0aW9uU2VjKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBsZXQgaGlzdCA9IGJ1c2luZXNzSGlzdG9ncmFtcy5nZXQobmFtZSk7XG4gIGlmICghaGlzdCkge1xuICAgIGhpc3QgPSBuZXcgSGlzdG9ncmFtKHtcbiAgICAgIG5hbWUsXG4gICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgLy8gRGVmYXVsdCBidWNrZXRzIHRhcmdldCBzdWItc2Vjb25kIHRocm91Z2ggc2V2ZXJhbC1taW51dGUgb2JzZXJ2YXRpb25zLlxuICAgICAgLy8gT3ZlcnJpZGUgYnkgcmVnaXN0ZXJpbmcgdGhlIGhpc3RvZ3JhbSBleHBsaWNpdGx5IGJlZm9yZSBmaXJzdCBjYWxsXG4gICAgICAvLyBpZiB5b3UgbmVlZCBhIGRpZmZlcmVudCBidWNrZXQgZGlzdHJpYnV0aW9uLlxuICAgICAgYnVja2V0czogWzAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwLCAzMCwgNjAsIDEyMCwgMzAwXSxcbiAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbiAgICB9KTtcbiAgICBidXNpbmVzc0hpc3RvZ3JhbXMuc2V0KG5hbWUsIGhpc3QpO1xuICB9XG4gIGhpc3Qub2JzZXJ2ZShsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGEgYnVzaW5lc3MgZ2F1Z2UsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gVXNlIGZvclxuICogcG9pbnQtaW4tdGltZSBvYnNlcnZhdGlvbnMgc2FtcGxlZCBieSBhIHNjcmFwZXIg4oCUIHF1ZXVlIGRlcHRoLCBhY3RpdmVcbiAqIGNvbm5lY3Rpb24gY291bnRzLCBpbi1mbGlnaHQgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ3dhaXRpbmcnIH0sIDEyKTtcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ2FjdGl2ZScgfSwgMyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGxldCBnYXVnZSA9IGJ1c2luZXNzR2F1Z2VzLmdldChuYW1lKTtcbiAgaWYgKCFnYXVnZSkge1xuICAgIGdhdWdlID0gbmV3IEdhdWdlKHtcbiAgICAgIG5hbWUsXG4gICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxuICAgIH0pO1xuICAgIGJ1c2luZXNzR2F1Z2VzLnNldChuYW1lLCBnYXVnZSk7XG4gIH1cbiAgZ2F1Z2Uuc2V0KGxhYmVscywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBodW1hbml6ZU5hbWUobWV0cmljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gYHBpcGVsaW5lc19nZW5lcmF0ZWRfdG90YWxgIOKGkiBcIlBpcGVsaW5lcyBnZW5lcmF0ZWQgdG90YWxcIlxuICByZXR1cm4gbWV0cmljTmFtZVxuICAgIC5yZXBsYWNlKC9fL2csICcgJylcbiAgICAucmVwbGFjZSgvXi4vLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbn1cbiJdfQ==
|
|
255
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvbWV0cmljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSw4QkFBOEIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2xHLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUV6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXpGLE1BQU0sWUFBWSxHQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUE2QixDQUFDLFdBQVcsQ0FBQztBQUU3RixpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztBQUVoQyxxQ0FBcUM7QUFDckMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFckQsa0ZBQWtGO0FBQ2xGLHFCQUFxQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUVwQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsUUFBa0I7SUFDNUQsT0FBTyxJQUFJLEtBQUssQ0FBQztRQUNmLElBQUksRUFBRSw4QkFBOEI7UUFDcEMsSUFBSSxFQUFFLGtLQUFrSztRQUN4SyxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQVU7UUFDL0IsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3JCLE9BQU87WUFDTCxLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLElBQUksb0JBQW9CLEVBQUUsRUFBRSxDQUFDO2dCQUM3RCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxD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T0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7U0FDbEIsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBwcmV2aW91c1NlY3JldFN0YXRlcywgU0VDUkVUX1JPVEFUSU9OX1BSRVZJT1VTX0dBVUdFIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IFJlZ2lzdHJ5LCBjb2xsZWN0RGVmYXVsdE1ldHJpY3MsIENvdW50ZXIsIEhpc3RvZ3JhbSwgR2F1Z2UgfSBmcm9tICdwcm9tLWNsaWVudCc7XG5cbmNvbnN0IFNFUlZJQ0VfTkFNRSA9IChDb25maWcuZ2V0QW55KCdvYnNlcnZhYmlsaXR5JykgYXMgeyBzZXJ2aWNlTmFtZTogc3RyaW5nIH0pLnNlcnZpY2VOYW1lO1xuXG4vKiogU2hhcmVkIFByb21ldGhldXMgcmVnaXN0cnkgKi9cbmNvbnN0IHJlZ2lzdGVyID0gbmV3IFJlZ2lzdHJ5KCk7XG5cbi8vIFNldCBkZWZhdWx0IGxhYmVscyBmb3IgYWxsIG1ldHJpY3NcbnJlZ2lzdGVyLnNldERlZmF1bHRMYWJlbHMoeyBzZXJ2aWNlOiBTRVJWSUNFX05BTUUgfSk7XG5cbi8vIENvbGxlY3QgZGVmYXVsdCBOb2RlLmpzIHByb2Nlc3MgbWV0cmljcyAoQ1BVLCBtZW1vcnksIGhlYXAsIGV2ZW50IGxvb3AgbGFnLCBHQylcbmNvbGxlY3REZWZhdWx0TWV0cmljcyh7IHJlZ2lzdGVyIH0pO1xuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBgc2VjcmV0X3JvdGF0aW9uX3ByZXZpb3VzX3NldHtzZWNyZXR9YCBnYXVnZSBvbiBgcmVnaXN0cnlgOiAxXG4gKiB3aGlsZSBhIHNlY3JldCdzIGAqX1BSRVZJT1VTYCByb3RhdGlvbiB2YWx1ZSBpcyBzdGlsbCBzZXQsIDAgb3RoZXJ3aXNlLiBUaGVcbiAqIHZhbHVlIGlzIHJlYWQgZnJvbSBhcGktY29yZSdzIHByb2JlIHJlZ2lzdHJ5IGF0IHNjcmFwZSB0aW1lLCBzbyBpdCBhbHdheXNcbiAqIHJlZmxlY3RzIHRoZSBsaXZlIHByb2Nlc3MuIEV4cG9ydGVkIHNvIHBsYXRmb3JtIChvd24gcmVnaXN0cnkpIGV4cG9zZXMgdGhlXG4gKiBpZGVudGljYWwgc2VyaWVzOyB0aGUgYFNlY3JldFJvdGF0aW9uUHJldmlvdXNMaW5nZXJpbmdgIGFsZXJ0IGtleXMgb24gaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclNlY3JldFJvdGF0aW9uR2F1Z2UocmVnaXN0cnk6IFJlZ2lzdHJ5KTogR2F1Z2U8J3NlY3JldCc+IHtcbiAgcmV0dXJuIG5ldyBHYXVnZSh7XG4gICAgbmFtZTogU0VDUkVUX1JPVEFUSU9OX1BSRVZJT1VTX0dBVUdFLFxuICAgIGhlbHA6ICcxIHdoaWxlIGEgc2VjcmV0IHJvdGF0aW9uIHByZXZpb3VzIHZhbHVlIChlLmcuIFNFQ1JFVF9FTkNSWVBUSU9OX0tFWV9QUkVWSU9VUykgb3IgYSByZXRpcmluZyBzaWduaW5nIGtleSBpcyBzdGlsbCBhY2NlcHRlZDsgc2VlIGRvY3MvcnVuYm9va3Mvc2VjcmV0LXJvdGF0aW9uLm1kJyxcbiAgICBsYWJlbE5hbWVzOiBbJ3NlY3JldCddIGFzIGNvbnN0LFxuICAgIHJlZ2lzdGVyczogW3JlZ2lzdHJ5XSxcbiAgICBjb2xsZWN0KCkge1xuICAgICAgZm9yIChjb25zdCB7IHNlY3JldCwgcHJldmlvdXNTZXQgfSBvZiBwcmV2aW91c1NlY3JldFN0YXRlcygpKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgc2VjcmV0IH0sIHByZXZpb3VzU2V0ID8gMSA6IDApO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufVxuXG5yZWdpc3RlclNlY3JldFJvdGF0aW9uR2F1Z2UocmVnaXN0ZXIpO1xuXG4vKiogSFRUUCByZXF1ZXN0IGR1cmF0aW9uIGhpc3RvZ3JhbSAoc2Vjb25kcykgKi9cbmNvbnN0IGh0dHBSZXF1ZXN0RHVyYXRpb24gPSBuZXcgSGlzdG9ncmFtKHtcbiAgbmFtZTogJ2h0dHBfcmVxdWVzdF9kdXJhdGlvbl9zZWNvbmRzJyxcbiAgaGVscDogJ0R1cmF0aW9uIG9mIEhUVFAgcmVxdWVzdHMgaW4gc2Vjb25kcycsXG4gIGxhYmVsTmFtZXM6IFsnbWV0aG9kJywgJ3JvdXRlJywgJ3N0YXR1c19jb2RlJ10gYXMgY29uc3QsXG4gIGJ1Y2tldHM6IFswLjAwNSwgMC4wMSwgMC4wMjUsIDAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwXSxcbiAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxufSk7XG5cbi8qKiBIVFRQIHJlcXVlc3QgY291bnRlciAqL1xuY29uc3QgaHR0cFJlcXVlc3RzVG90YWwgPSBuZXcgQ291bnRlcih7XG4gIG5hbWU6ICdodHRwX3JlcXVlc3RzX3RvdGFsJyxcbiAgaGVscDogJ1RvdGFsIG51bWJlciBvZiBIVFRQIHJlcXVlc3RzJyxcbiAgbGFiZWxOYW1lczogWydtZXRob2QnLCAncm91dGUnLCAnc3RhdHVzX2NvZGUnXSBhcyBjb25zdCxcbiAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxufSk7XG5cbi8qKlxuICogUGVyLW9yZyBIVFRQIHJlcXVlc3QgY291bnRlciDigJQgU0FNUExFRCB0byBrZWVwIFByb21ldGhldXMgY2FyZGluYWxpdHlcbiAqIHVuZGVyIGNvbnRyb2wuIENhcmRpbmFsaXR5IG9mIGBvcmdfaWQgKiBtZXRob2QgKiByb3V0ZSAqIHN0YXR1c19jb2RlYFxuICogZ3Jvd3MgbXVsdGlwbGljYXRpdmVseTsgd2l0aCBOIG9yZ3MgKiA1MCByb3V0ZXMgKiA1IHN0YXR1c19jb2RlcyB0aGF0J3NcbiAqIDI1MMOXTiBzZXJpZXMuIFdlIHNhbXBsZSAxLWluLU4gcmVxdWVzdHMgKGNvbmZpZ3VyYWJsZSB2aWFcbiAqIGBIVFRQX01FVFJJQ1NfT1JHX1NBTVBMRV9SQVRFYCwgZGVmYXVsdCAxLjAgPSBldmVyeSByZXF1ZXN0KS5cbiAqXG4gKiBPcGVyYXRvcnMgYW5zd2VyIFwid2hhdCdzIG9yZyBYJ3MgcDk5P1wiIHZpYSBzZXBhcmF0ZSBwZXItb3JnIGhpc3RvZ3JhbXNcbiAqIHNjcmFwZWQgYXQgYSBsb3dlciByYXRlLCBPUiB2aWEgTG9raSBMb2dRTCBxdWVyaWVzIGFnYWluc3QgdGhlXG4gKiB1bnNhbXBsZWQgYWNjZXNzLWxvZyBzdHJlYW0uIFRoaXMgY291bnRlciBpcyB0aGUgZmFzdC1wYXRoIFwibm9pc3lcbiAqIG5laWdoYm9yIGRldGVjdGlvblwiIOKAlCBvcGVyYXRvcnMgYWxlcnQgd2hlbiBvbmUgb3JnJ3MgcmVxdWVzdCByYXRlXG4gKiBkZXZpYXRlcyBmcm9tIHRoZSBmbGVldCBtZWRpYW4uXG4gKlxuICogTk9UIGEgaGlzdG9ncmFtOiBoaXN0b2dyYW0gbGFiZWwgY2FyZGluYWxpdHkgaXMgZXZlbiBtb3JlIHNlbnNpdGl2ZVxuICogKGVhY2ggYnVja2V0IGlzIGEgc2VwYXJhdGUgc2VyaWVzKS4gSWYgcGVyLW9yZyBsYXRlbmN5IHBlcmNlbnRpbGVzIGFyZVxuICogbmVlZGVkIGxhdGVyLCBhZGQgYSBzZXBhcmF0ZSBoaXN0b2dyYW0gd2l0aCBhIGNvYXJzZXIgYnVja2V0IHNldCBhbmRcbiAqIGxvd2VyIHNhbXBsZSByYXRlLlxuICovXG5jb25zdCBodHRwUmVxdWVzdHNCeU9yZ1RvdGFsID0gbmV3IENvdW50ZXIoe1xuICBuYW1lOiAnaHR0cF9yZXF1ZXN0c19ieV9vcmdfdG90YWwnLFxuICBoZWxwOiAnU2FtcGxlZCBwZXItb3JnIEhUVFAgcmVxdWVzdCBjb3VudCAoc2FtcGxlIHJhdGUgdmlhIEhUVFBfTUVUUklDU19PUkdfU0FNUExFX1JBVEUpJyxcbiAgbGFiZWxOYW1lczogWydtZXRob2QnLCAncm91dGUnLCAnc3RhdHVzX2NvZGUnLCAnb3JnX2lkJ10gYXMgY29uc3QsXG4gIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbn0pO1xuXG4vKipcbiAqIFNhbXBsZSByYXRlIGZvciB0aGUgcGVyLW9yZyBjb3VudGVyLiAxLjAgPSBldmVyeSByZXF1ZXN0LCAwLjAgPSBkaXNhYmxlZC5cbiAqIFBhcnNlZCBvbmNlIGF0IG1vZHVsZSBsb2FkIOKAlCBvcGVyYXRvcnMgdHVuZSBieSByZXN0YXJ0aW5nIHRoZSBzZXJ2aWNlLlxuICpcbiAqIERlZmF1bHRzIHRvIDAgKE9GRikuIGBvcmdfaWRgIGlzIGFuIFVOQk9VTkRFRCwgdGVuYW50LWlkZW50aWZ5aW5nIGxhYmVsIGFuZFxuICogcHJvbS1jbGllbnQgY291bnRlcnMgbmV2ZXIgZXhwaXJlLCBzbyBhdCB0aGUgb2xkIGRlZmF1bHQgb2YgMS4wIGV2ZXJ5IHNlcnZpY2VcbiAqIGFjY3VtdWxhdGVkIGEgc2VyaWVzIHBlciAob3JnIMOXIHJvdXRlIMOXIHN0YXR1cykgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLCBhbmRcbiAqIGAvbWV0cmljc2Ag4oCUIHdoaWNoIGlzIG5vdCBhdXRoLWdhdGVkIOKAlCBlbnVtZXJhdGVkIGV2ZXJ5IHRlbmFudCBpZCBhbG9uZyB3aXRoXG4gKiBpdHMgcmVxdWVzdCB2b2x1bWUgYW5kIGVycm9yIHJhdGUgdG8gYW55b25lIHdobyBjb3VsZCByZWFjaCB0aGUgcG9ydC5cbiAqXG4gKiBUdXJuIGl0IG9uIGRlbGliZXJhdGVseSAoYW5kIGlkZWFsbHkgd2l0aCBhIHNhbXBsZSByYXRlIHdlbGwgdW5kZXIgMS4wLCBwbHVzXG4gKiBgTUVUUklDU19TQ1JBUEVfVE9LRU5gIHNldCkgd2hlbiB5b3UgYWN0dWFsbHkgd2FudCBwZXItb3JnIG5vaXN5LW5laWdoYm91clxuICogZGV0ZWN0aW9uIGZyb20gbWV0cmljcyByYXRoZXIgdGhhbiBmcm9tIHRoZSBhY2Nlc3MtbG9nIHN0cmVhbS5cbiAqL1xuY29uc3QgT1JHX1NBTVBMRV9SQVRFID0gKCgpID0+IHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnYuSFRUUF9NRVRSSUNTX09SR19TQU1QTEVfUkFURTtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gJycpIHJldHVybiAwO1xuICBjb25zdCBwYXJzZWQgPSBwYXJzZUZsb2F0KHJhdyk7XG4gIGlmIChOdW1iZXIuaXNOYU4ocGFyc2VkKSB8fCBwYXJzZWQgPCAwIHx8IHBhcnNlZCA+IDEpIHJldHVybiAwO1xuICByZXR1cm4gcGFyc2VkO1xufSkoKTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYW4gRXhwcmVzcyByb3V0ZSBwYXRoIHRvIHByZXZlbnQgbGFiZWwgY2FyZGluYWxpdHkgZXhwbG9zaW9uLlxuICpcbiAqIFVzZXMgRXhwcmVzcydzIG1hdGNoZWQgcm91dGUgcGF0dGVybiAoZS5nLiBgL3BsdWdpbnMvOmlkYCkgd2hlbiBhdmFpbGFibGUsXG4gKiBvdGhlcndpc2UgZmFsbHMgYmFjayB0byB0aGUgcmF3IHBhdGggd2l0aCBVVUlEL251bWVyaWMgc2VnbWVudHMgcmVwbGFjZWQuXG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlKHJlcTogUmVxdWVzdCk6IHN0cmluZyB7XG4gIC8vIFByZWZlciBFeHByZXNzIG1hdGNoZWQgcm91dGUgcGF0dGVyblxuICBpZiAocmVxLnJvdXRlPy5wYXRoKSB7XG4gICAgcmV0dXJuIHJlcS5iYXNlVXJsICsgcmVxLnJvdXRlLnBhdGg7XG4gIH1cblxuICAvLyBGYWxsYmFjazogcmVwbGFjZSBVVUlEcyBhbmQgbnVtZXJpYyBJRHMgd2l0aCA6aWRcbiAgcmV0dXJuIHJlcS5wYXRoXG4gICAgLnJlcGxhY2UoL1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfS9naSwgJzppZCcpXG4gICAgLnJlcGxhY2UoL1xcL1xcZCsoPz1cXC98JCkvZywgJy86aWQnKTtcbn1cblxuLyoqXG4gKiBFeHByZXNzIG1pZGRsZXdhcmUgdGhhdCByZWNvcmRzIHJlcXVlc3QgZHVyYXRpb24gYW5kIGNvdW50LlxuICpcbiAqIE11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgcm91dGUgaGFuZGxlcnMgc28gYHJlcy5vbignZmluaXNoJylgIGZpcmVzXG4gKiBhZnRlciB0aGUgcmVzcG9uc2UgaXMgc2VudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY3NNaWRkbGV3YXJlKCkge1xuICByZXR1cm4gKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgLy8gTk9URTogbm8gL21ldHJpY3Mgb3IgL2hlYWx0aCBza2lwIG5lZWRlZCBoZXJlIOKAlCBib3RoIGVuZHBvaW50cyBhcmVcbiAgICAvLyByZWdpc3RlcmVkIGluIGFwcC1mYWN0b3J5IEJFRk9SRSB0aGlzIG1pZGRsZXdhcmUgKGNyZWF0ZUhlYWx0aFJvdXRlciBhbmRcbiAgICAvLyBhcHAuZ2V0KCcvbWV0cmljcycpIGJvdGggdGVybWluYXRlIHRoZSByZXNwb25zZSksIHNvIG5laXRoZXIgZXZlciByZWFjaGVzXG4gICAgLy8gdGhpcyBoYW5kbGVyLlxuICAgIGNvbnN0IGVuZCA9IGh0dHBSZXF1ZXN0RHVyYXRpb24uc3RhcnRUaW1lcigpO1xuXG4gICAgcmVzLm9uKCdmaW5pc2gnLCAoKSA9PiB7XG4gICAgICBjb25zdCByb3V0ZSA9IG5vcm1hbGl6ZVJvdXRlKHJlcSk7XG4gICAgICBjb25zdCBsYWJlbHMgPSB7XG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCxcbiAgICAgICAgcm91dGUsXG4gICAgICAgIHN0YXR1c19jb2RlOiBTdHJpbmcocmVzLnN0YXR1c0NvZGUpLFxuICAgICAgfTtcblxuICAgICAgZW5kKGxhYmVscyk7XG4gICAgICBodHRwUmVxdWVzdHNUb3RhbC5pbmMobGFiZWxzKTtcblxuICAgICAgLy8gUGVyLW9yZyBzYW1wbGVkIGNvdW50ZXIuIFNraXAgd2hlbjpcbiAgICAgIC8vICAgLSBubyBvcmcgY29udGV4dCBvbiB0aGUgcmVxdWVzdCAoYW5vbnltb3VzIC8gaGVhbHRoIGVuZHBvaW50cylcbiAgICAgIC8vICAgLSBzYW1wbGUgcmF0ZSBpcyAwIChkaXNhYmxlZClcbiAgICAgIC8vICAgLSBkaWNlIHJvbGwgZmFpbHNcbiAgICAgIC8vIFVzaW5nIE1hdGgucmFuZG9tIGZvciB0aGUgc2FtcGxlciDigJQgZm9yIHVuYmlhc2VkIGxvdy1yYXRlIHNhbXBsaW5nXG4gICAgICAvLyBhIGRldGVybWluaXN0aWMgcGVyLXJlcXVlc3QgaGFzaCB3b3VsZCBiZSBtb3JlIHVuaWZvcm0sIGJ1dCBhdCB0aGVcbiAgICAgIC8vIGRlZmF1bHQgcmF0ZSBvZiAxLjAgZXZlcnkgcmVxdWVzdCBsYW5kcyBzbyB0aGlzIGlzIGZpbmUuXG4gICAgICBjb25zdCBvcmdJZCA9IHJlcS51c2VyPy5vcmdhbml6YXRpb25JZDtcbiAgICAgIGlmIChvcmdJZCAmJiBPUkdfU0FNUExFX1JBVEUgPiAwICYmIE1hdGgucmFuZG9tKCkgPCBPUkdfU0FNUExFX1JBVEUpIHtcbiAgICAgICAgaHR0cFJlcXVlc3RzQnlPcmdUb3RhbC5pbmMoeyAuLi5sYWJlbHMsIG9yZ19pZDogb3JnSWQgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBuZXh0KCk7XG4gIH07XG59XG5cbi8qKlxuICogRXhwcmVzcyBoYW5kbGVyIHRoYXQgcmV0dXJucyBQcm9tZXRoZXVzIG1ldHJpY3MgaW4gdGV4dCBleHBvc2l0aW9uIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldHJpY3NIYW5kbGVyKCkge1xuICByZXR1cm4gYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZXMuc2V0KCdDb250ZW50LVR5cGUnLCByZWdpc3Rlci5jb250ZW50VHlwZSk7XG4gICAgcmVzLmVuZChhd2FpdCByZWdpc3Rlci5tZXRyaWNzKCkpO1xuICB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJ1c2luZXNzIC8gZG9tYWluIG1ldHJpY3Ncbi8vXG4vLyBTZXJ2aWNlcyBzaG91bGQgZW1pdCBjb3VudGVycyBmb3IgdGhlIHRoaW5ncyBvcGVyYXRvcnMgYWN0dWFsbHkgY2FyZSBhYm91dFxuLy8gKHBpcGVsaW5lcyBnZW5lcmF0ZWQsIHBsdWdpbiBidWlsZHMgY29tcGxldGVkLCBjb21wbGlhbmNlIHZpb2xhdGlvbnMsXG4vLyBBSSB0b2tlbnMgY29uc3VtZWQpIOKAlCBub3QganVzdCBIVFRQIHRyYWZmaWMuIFRoZSBoZWxwZXJzIGJlbG93IHJlZ2lzdGVyXG4vLyBjb3VudGVycyBsYXppbHkgb24gdGhlIHNoYXJlZCByZWdpc3RyeSBzbyBtdWx0aXBsZSBzZXJ2aWNlcyBjYW4gY2FsbFxuLy8gYGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ2NvbXBsZXRlZCcgfSlgIHdpdGhvdXRcbi8vIHdvcnJ5aW5nIGFib3V0IGRvdWJsZS1yZWdpc3RyYXRpb24uXG4vL1xuLy8gTmFtaW5nIGNvbnZlbnRpb246IGA8ZG9tYWluPl88bm91bj5fdG90YWxgIGZvciBjb3VudGVycywgYF9zZWNvbmRzYCBmb3Jcbi8vIGhpc3RvZ3JhbXMg4oCUIG1hdGNoZXMgUHJvbWV0aGV1cyBiZXN0LXByYWN0aWNlLlxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IGJ1c2luZXNzQ291bnRlcnMgPSBuZXcgTWFwPHN0cmluZywgQ291bnRlcjxzdHJpbmc+PigpO1xuY29uc3QgYnVzaW5lc3NIaXN0b2dyYW1zID0gbmV3IE1hcDxzdHJpbmcsIEhpc3RvZ3JhbTxzdHJpbmc+PigpO1xuY29uc3QgYnVzaW5lc3NHYXVnZXMgPSBuZXcgTWFwPHN0cmluZywgR2F1Z2U8c3RyaW5nPj4oKTtcblxuLyoqXG4gKiBJbmNyZW1lbnQgYSBidXNpbmVzcyBjb3VudGVyLCBjcmVhdGluZyBpdCBvbiBmaXJzdCB1c2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGluY0NvdW50ZXIoJ3BpcGVsaW5lc19nZW5lcmF0ZWRfdG90YWwnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJyB9KTtcbiAqIGluY0NvdW50ZXIoJ3BsdWdpbl9idWlsZHNfdG90YWwnLCB7IHN0YXR1czogJ2NvbXBsZXRlZCcgfSk7XG4gKiBpbmNDb3VudGVyKCdxdW90YV90aHJlc2hvbGRfY3Jvc3NlZF90b3RhbCcsIHsgdHlwZTogJ2FpQ2FsbHMnLCB0aWVyOiAncHJvJyB9KTtcbiAqIGluY0NvdW50ZXIoJ2NvbXBsaWFuY2VfdmlvbGF0aW9uc19mb3VuZF90b3RhbCcsIHsgc2V2ZXJpdHk6ICdjcml0aWNhbCcgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluY0NvdW50ZXIobmFtZTogc3RyaW5nLCBsYWJlbHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSwgdmFsdWUgPSAxKTogdm9pZCB7XG4gIGxldCBjb3VudGVyID0gYnVzaW5lc3NDb3VudGVycy5nZXQobmFtZSk7XG4gIGlmICghY291bnRlcikge1xuICAgIGNvdW50ZXIgPSBuZXcgQ291bnRlcih7XG4gICAgICBuYW1lLFxuICAgICAgaGVscDogaHVtYW5pemVOYW1lKG5hbWUpLFxuICAgICAgbGFiZWxOYW1lczogT2JqZWN0LmtleXMobGFiZWxzKSxcbiAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbiAgICB9KTtcbiAgICBidXNpbmVzc0NvdW50ZXJzLnNldChuYW1lLCBjb3VudGVyKTtcbiAgfVxuICBjb3VudGVyLmluYyhsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZWNvcmQgYW4gb2JzZXJ2YXRpb24gb24gYSBidXNpbmVzcyBoaXN0b2dyYW0sIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS5cbiAqIFVzZSBmb3IgZHVyYXRpb25zLCBzaXplcywgYW55dGhpbmcgd2hlcmUgcGVyY2VudGlsZXMgbWF0dGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBvYnNlcnZlKCdhaV9nZW5lcmF0aW9uX2R1cmF0aW9uX3NlY29uZHMnLCB7IHByb3ZpZGVyOiAnYW50aHJvcGljJywgbW9kZWw6ICdzb25uZXQnIH0sIGR1cmF0aW9uU2VjKTtcbiAqIG9ic2VydmUoJ3BsdWdpbl9idWlsZF9kdXJhdGlvbl9zZWNvbmRzJywgeyBidWlsZFR5cGU6ICdkb2NrZXInIH0sIGR1cmF0aW9uU2VjKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZShuYW1lOiBzdHJpbmcsIGxhYmVsczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiwgdmFsdWU6IG51bWJlcik6IHZvaWQge1xuICBsZXQgaGlzdCA9IGJ1c2luZXNzSGlzdG9ncmFtcy5nZXQobmFtZSk7XG4gIGlmICghaGlzdCkge1xuICAgIGhpc3QgPSBuZXcgSGlzdG9ncmFtKHtcbiAgICAgIG5hbWUsXG4gICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgLy8gRGVmYXVsdCBidWNrZXRzIHRhcmdldCBzdWItc2Vjb25kIHRocm91Z2ggc2V2ZXJhbC1taW51dGUgb2JzZXJ2YXRpb25zLlxuICAgICAgLy8gT3ZlcnJpZGUgYnkgcmVnaXN0ZXJpbmcgdGhlIGhpc3RvZ3JhbSBleHBsaWNpdGx5IGJlZm9yZSBmaXJzdCBjYWxsXG4gICAgICAvLyBpZiB5b3UgbmVlZCBhIGRpZmZlcmVudCBidWNrZXQgZGlzdHJpYnV0aW9uLlxuICAgICAgYnVja2V0czogWzAuMDUsIDAuMSwgMC4yNSwgMC41LCAxLCAyLjUsIDUsIDEwLCAzMCwgNjAsIDEyMCwgMzAwXSxcbiAgICAgIHJlZ2lzdGVyczogW3JlZ2lzdGVyXSxcbiAgICB9KTtcbiAgICBidXNpbmVzc0hpc3RvZ3JhbXMuc2V0KG5hbWUsIGhpc3QpO1xuICB9XG4gIGhpc3Qub2JzZXJ2ZShsYWJlbHMsIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIHZhbHVlIG9mIGEgYnVzaW5lc3MgZ2F1Z2UsIGNyZWF0aW5nIGl0IG9uIGZpcnN0IHVzZS4gVXNlIGZvclxuICogcG9pbnQtaW4tdGltZSBvYnNlcnZhdGlvbnMgc2FtcGxlZCBieSBhIHNjcmFwZXIg4oCUIHF1ZXVlIGRlcHRoLCBhY3RpdmVcbiAqIGNvbm5lY3Rpb24gY291bnRzLCBpbi1mbGlnaHQgcmVxdWVzdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ3dhaXRpbmcnIH0sIDEyKTtcbiAqIHNldEdhdWdlKCdwbHVnaW5fcXVldWVfam9icycsIHsgcXVldWU6ICdwbHVnaW4tYnVpbGQnLCBzdGF0ZTogJ2FjdGl2ZScgfSwgMyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEdhdWdlKG5hbWU6IHN0cmluZywgbGFiZWxzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LCB2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gIGxldCBnYXVnZSA9IGJ1c2luZXNzR2F1Z2VzLmdldChuYW1lKTtcbiAgaWYgKCFnYXVnZSkge1xuICAgIGdhdWdlID0gbmV3IEdhdWdlKHtcbiAgICAgIG5hbWUsXG4gICAgICBoZWxwOiBodW1hbml6ZU5hbWUobmFtZSksXG4gICAgICBsYWJlbE5hbWVzOiBPYmplY3Qua2V5cyhsYWJlbHMpLFxuICAgICAgcmVnaXN0ZXJzOiBbcmVnaXN0ZXJdLFxuICAgIH0pO1xuICAgIGJ1c2luZXNzR2F1Z2VzLnNldChuYW1lLCBnYXVnZSk7XG4gIH1cbiAgZ2F1Z2Uuc2V0KGxhYmVscywgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBodW1hbml6ZU5hbWUobWV0cmljTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gYHBpcGVsaW5lc19nZW5lcmF0ZWRfdG90YWxgIOKGkiBcIlBpcGVsaW5lcyBnZW5lcmF0ZWQgdG90YWxcIlxuICByZXR1cm4gbWV0cmljTmFtZVxuICAgIC5yZXBsYWNlKC9fL2csICcgJylcbiAgICAucmVwbGFjZSgvXi4vLCAoYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbn1cbiJdfQ==
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { requireAuth } from '@pipeline-builder/api-core';
|
|
3
4
|
import { checkQuota } from './check-quota.js';
|
|
4
5
|
import { idempotencyMiddleware } from './idempotency-middleware.js';
|
|
5
|
-
import { requireAuth } from './middleware.js';
|
|
6
6
|
import { requireOrgId } from './require-org-id.js';
|
|
7
7
|
import { withTenantContext } from './tenant-context.js';
|
|
8
8
|
/**
|
|
@@ -77,4 +77,4 @@ export function createAuthenticatedWithOrgRoute() {
|
|
|
77
77
|
withTenantContext(),
|
|
78
78
|
];
|
|
79
79
|
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9taWRkbGV3YXJlLWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV4RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFlBQTBCLEVBQzFCLFNBQW9CO0lBRXBCLE9BQU87UUFDTCxXQUE2QjtRQUM3QixZQUFZLEVBQW9CO1FBQ2hDLHFCQUFxQixFQUFvQjtRQUN6QyxpQkFBaUIsRUFBb0I7UUFDckMsVUFBVSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQW1CO0tBQ3RELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sVUFBVSwrQkFBK0I7SUFDN0MsT0FBTztRQUNMLFdBQTZCO1FBQzdCLFlBQVksRUFBb0I7UUFDaEMsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0UscUJBQXFCLEVBQW9CO1FBQ3pDLGlCQUFpQixFQUFvQjtLQUN0QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByZXF1aXJlQXV0aCB9IGZyb20gJ0BwaXBlbGluZS1idWlsZGVyL2FwaS1jb3JlJztcbmltcG9ydCB0eXBlIHsgUXVvdGFUeXBlLCBRdW90YVNlcnZpY2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RIYW5kbGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBjaGVja1F1b3RhIH0gZnJvbSAnLi9jaGVjay1xdW90YS5qcyc7XG5pbXBvcnQgeyBpZGVtcG90ZW5jeU1pZGRsZXdhcmUgfSBmcm9tICcuL2lkZW1wb3RlbmN5LW1pZGRsZXdhcmUuanMnO1xuaW1wb3J0IHsgcmVxdWlyZU9yZ0lkIH0gZnJvbSAnLi9yZXF1aXJlLW9yZy1pZC5qcyc7XG5pbXBvcnQgeyB3aXRoVGVuYW50Q29udGV4dCB9IGZyb20gJy4vdGVuYW50LWNvbnRleHQuanMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtaWRkbGV3YXJlIGNoYWluIGZvciBwcm90ZWN0ZWQgcm91dGVzIHJlcXVpcmluZyBhdXRoZW50aWNhdGlvbiwgb3JnIElELCBhbmQgcXVvdGEgY2hlY2suXG4gKlxuICogQXBwbGllcyBtaWRkbGV3YXJlIGluIG9yZGVyOlxuICogMS4gcmVxdWlyZUF1dGggLSBWYWxpZGF0ZXMgSldUIGFuZCBleHRyYWN0cyB1c2VyIGlkZW50aXR5XG4gKiAyLiByZXF1aXJlT3JnSWQgLSBFbnN1cmVzIHJlcXVlc3QgaGFzIHgtb3JnLWlkIGhlYWRlclxuICogMy4gaWRlbXBvdGVuY3lNaWRkbGV3YXJlIC0gRGVkdXBlcyBrZXllZCBtdXRhdGlvbiByZXRyaWVzIChuby1vcCB3aXRob3V0IGFuXG4gKiAgICBJZGVtcG90ZW5jeS1LZXkgaGVhZGVyIG9yIG9uIG5vbi1tdXRhdGlvbiBtZXRob2RzKVxuICogNC4gd2l0aFRlbmFudENvbnRleHQgLSBPcGVucyB0aGUgUkxTIHRlbmFudCBzY29wZSAob3JnSWQgKyBpc1N1cGVyQWRtaW4pIGZvciB0aGUgcmVxdWVzdFxuICogNS4gY2hlY2tRdW90YSAtIFZhbGlkYXRlcyBxdW90YSBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSB0eXBlXG4gKlxuICogSWRlbXBvdGVuY3kgc2l0cyBBRlRFUiBhdXRoK29yZ0lkIChzbyBpdCBjYW4gbmFtZXNwYWNlIHRoZSByZXBsYXkgY2FjaGUgb24gdGhlXG4gKiBWRVJJRklFRCBvcmcg4oCUIGEgcHJlLWF1dGggZ2xvYmFsIG1vdW50IHNhdyBubyBpZGVudGl0eSBhbmQgd2FzIGEgcGVybWFuZW50XG4gKiBuby1vcCkgYW5kIEJFRk9SRSB3aXRoVGVuYW50Q29udGV4dC9jaGVja1F1b3RhIChzbyBhIHJlcGxheWVkIHJlcXVlc3Qgc2hvcnQtXG4gKiBjaXJjdWl0cyB3aXRob3V0IG9wZW5pbmcgYW4gUkxTIHNjb3BlIG9yIHNwZW5kaW5nIGEgcXVvdGEgY2hlY2spLlxuICpcbiAqIEBwYXJhbSBxdW90YVNlcnZpY2UgLSBRdW90YSBzZXJ2aWNlIGNsaWVudFxuICogQHBhcmFtIHF1b3RhVHlwZSAtIFdoaWNoIHF1b3RhIHRvIGNoZWNrIChlLmcuLCAnYXBpQ2FsbHMnLCAncGlwZWxpbmVzJywgJ3BsdWdpbnMnKVxuICogQHJldHVybnMgQXJyYXkgb2YgbWlkZGxld2FyZSBoYW5kbGVycyByZWFkeSB0byBzcHJlYWQgaW50byByb3V0ZSBkZWZpbml0aW9uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHJvdXRlci5wb3N0KCcvJyxcbiAqICAgLi4uY3JlYXRlUHJvdGVjdGVkUm91dGUocXVvdGFTZXJ2aWNlLCAncGlwZWxpbmVzJyksXG4gKiAgIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICogICAgIC8vIEhhbmRsZXIgaW1wbGVtZW50YXRpb25cbiAqICAgfVxuICogKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvdGVjdGVkUm91dGUoXG4gIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICBxdW90YVR5cGU6IFF1b3RhVHlwZSxcbik6IFJlcXVlc3RIYW5kbGVyW10ge1xuICByZXR1cm4gW1xuICAgIHJlcXVpcmVBdXRoIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIHJlcXVpcmVPcmdJZCgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIGlkZW1wb3RlbmN5TWlkZGxld2FyZSgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICAgIHdpdGhUZW5hbnRDb250ZXh0KCkgYXMgUmVxdWVzdEhhbmRsZXIsXG4gICAgY2hlY2tRdW90YShxdW90YVNlcnZpY2UsIHF1b3RhVHlwZSkgYXMgUmVxdWVzdEhhbmRsZXIsXG4gIF07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1pZGRsZXdhcmUgY2hhaW4gZm9yIGF1dGhlbnRpY2F0ZWQgcm91dGVzIHdpdGggb3JnIElEIHJlcXVpcmVtZW50IGJ1dCBubyBxdW90YSBjaGVjay5cbiAqXG4gKiBBcHBsaWVzIG1pZGRsZXdhcmUgaW4gb3JkZXI6XG4gKiAxLiByZXF1aXJlQXV0aCAtIFZhbGlkYXRlcyBKV1QgYW5kIGV4dHJhY3RzIHVzZXIgaWRlbnRpdHlcbiAqIDIuIHJlcXVpcmVPcmdJZCAtIEVuc3VyZXMgcmVxdWVzdCBoYXMgeC1vcmctaWQgaGVhZGVyXG4gKiAzLiB3aXRoVGVuYW50Q29udGV4dCAtIE9wZW5zIHRoZSBSTFMgdGVuYW50IHNjb3BlIChvcmdJZCArIGlzU3VwZXJBZG1pbikgZm9yIHRoZSByZXF1ZXN0XG4gKlxuICogVXNlIHRoaXMgZm9yIHJlYWQtb25seSByb3V0ZXMgdGhhdCBkb24ndCBjb25zdW1lIHF1b3RhLlxuICpcbiAqIEByZXR1cm5zIEFycmF5IG9mIG1pZGRsZXdhcmUgaGFuZGxlcnMgcmVhZHkgdG8gc3ByZWFkIGludG8gcm91dGUgZGVmaW5pdGlvblxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiByb3V0ZXIuZ2V0KCcvJyxcbiAqICAgLi4uY3JlYXRlQXV0aGVudGljYXRlZFdpdGhPcmdSb3V0ZSgpLFxuICogICBhc3luYyAocmVxLCByZXMpID0+IHtcbiAqICAgICAvLyBIYW5kbGVyIGltcGxlbWVudGF0aW9uXG4gKiAgIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUF1dGhlbnRpY2F0ZWRXaXRoT3JnUm91dGUoKTogUmVxdWVzdEhhbmRsZXJbXSB7XG4gIHJldHVybiBbXG4gICAgcmVxdWlyZUF1dGggYXMgUmVxdWVzdEhhbmRsZXIsXG4gICAgcmVxdWlyZU9yZ0lkKCkgYXMgUmVxdWVzdEhhbmRsZXIsXG4gICAgLy8gTW91bnRlZCBwb3N0LW9yZ0lkIChpZGVudGl0eSBwb3B1bGF0ZWQpIHNvIGtleWVkIG11dGF0aW9uIHJldHJpZXMgb24gdGhlXG4gICAgLy8gbm9uLXF1b3RhIHJvdXRlcyDigJQgbm90YWJseSB0aGUgY3JlYXRlIHBhdGhzLCB3aGljaCB1c2UgdGhpcyBmYWN0b3J5IHRvXG4gICAgLy8gYXZvaWQgdGhlIGNoZWNrUXVvdGEgcHJlLWZsaWdodCByYWNpbmcgdGhlaXIgcmVzZXJ2ZSDigJQgYXJlIGRlZHVwbGljYXRlZC5cbiAgICBpZGVtcG90ZW5jeU1pZGRsZXdhcmUoKSBhcyBSZXF1ZXN0SGFuZGxlcixcbiAgICB3aXRoVGVuYW50Q29udGV4dCgpIGFzIFJlcXVlc3RIYW5kbGVyLFxuICBdO1xufVxuIl19
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { type QuotaService, type QuotaType } from '@pipeline-builder/api-core';
|
|
2
|
-
import type { Request } from 'express';
|
|
3
2
|
import type { RequestContext } from './request-types.js';
|
|
4
3
|
/**
|
|
5
4
|
* Increment (meter) a quota counter using values pulled from a route context.
|
|
@@ -11,14 +10,13 @@ import type { RequestContext } from './request-types.js';
|
|
|
11
10
|
*
|
|
12
11
|
* @example
|
|
13
12
|
* ```typescript
|
|
14
|
-
* router.get('/', withRoute(async ({
|
|
13
|
+
* router.get('/', withRoute(async ({ res, ctx, orgId }) => {
|
|
15
14
|
* // ...
|
|
16
|
-
* incrementQuotaFromCtx(quotaService, {
|
|
15
|
+
* incrementQuotaFromCtx(quotaService, { ctx, orgId }, 'apiCalls');
|
|
17
16
|
* }));
|
|
18
17
|
* ```
|
|
19
18
|
*/
|
|
20
19
|
export declare function incrementQuotaFromCtx(quotaService: QuotaService, rc: {
|
|
21
|
-
req: Request;
|
|
22
20
|
ctx: RequestContext;
|
|
23
21
|
orgId: string;
|
|
24
22
|
}, type: QuotaType): void;
|
package/lib/api/quota-helpers.js
CHANGED
|
@@ -11,13 +11,13 @@ import { incrementQuota } from '@pipeline-builder/api-core';
|
|
|
11
11
|
*
|
|
12
12
|
* @example
|
|
13
13
|
* ```typescript
|
|
14
|
-
* router.get('/', withRoute(async ({
|
|
14
|
+
* router.get('/', withRoute(async ({ res, ctx, orgId }) => {
|
|
15
15
|
* // ...
|
|
16
|
-
* incrementQuotaFromCtx(quotaService, {
|
|
16
|
+
* incrementQuotaFromCtx(quotaService, { ctx, orgId }, 'apiCalls');
|
|
17
17
|
* }));
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
20
|
export function incrementQuotaFromCtx(quotaService, rc, type) {
|
|
21
21
|
incrementQuota(quotaService, rc.orgId, type, rc.ctx.log.bind(null, 'WARN'));
|
|
22
22
|
}
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGEtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcXVvdGEtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxjQUFjLEVBQXFDLE1BQU0sNEJBQTRCLENBQUM7QUFHL0Y7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNuQyxZQUEwQixFQUMxQixFQUEwQyxFQUMxQyxJQUFlO0lBRWYsY0FBYyxDQUNaLFlBQVksRUFDWixFQUFFLENBQUMsS0FBSyxFQUNSLElBQUksRUFDSixFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUM5QixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBpbmNyZW1lbnRRdW90YSwgdHlwZSBRdW90YVNlcnZpY2UsIHR5cGUgUXVvdGFUeXBlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gJy4vcmVxdWVzdC10eXBlcy5qcyc7XG5cbi8qKlxuICogSW5jcmVtZW50IChtZXRlcikgYSBxdW90YSBjb3VudGVyIHVzaW5nIHZhbHVlcyBwdWxsZWQgZnJvbSBhIHJvdXRlIGNvbnRleHQuXG4gKlxuICogV3JhcHMgYGluY3JlbWVudFF1b3RhKHF1b3RhU2VydmljZSwgb3JnSWQsIHR5cGUsIGxvZ1dhcm4pYCBzbyByb3V0ZSBoYW5kbGVyc1xuICogZG9uJ3QgaGF2ZSB0byByZS1kZXJpdmUgYGN0eC5sb2cuYmluZChudWxsLCAnV0FSTicpYCBhdCBldmVyeSBjYWxsIHNpdGUuIFRoZVxuICogaW5jcmVtZW50IGF1dGhlbnRpY2F0ZXMgYXMgdGhlIGNhbGxpbmcgc2VydmljZSAoc2VlIGBpbmNyZW1lbnRRdW90YWApLCBuZXZlclxuICogd2l0aCB0aGUgZW5kIHVzZXIncyB0b2tlbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogcm91dGVyLmdldCgnLycsIHdpdGhSb3V0ZShhc3luYyAoeyByZXMsIGN0eCwgb3JnSWQgfSkgPT4ge1xuICogICAvLyAuLi5cbiAqICAgaW5jcmVtZW50UXVvdGFGcm9tQ3R4KHF1b3RhU2VydmljZSwgeyBjdHgsIG9yZ0lkIH0sICdhcGlDYWxscycpO1xuICogfSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmNyZW1lbnRRdW90YUZyb21DdHgoXG4gIHF1b3RhU2VydmljZTogUXVvdGFTZXJ2aWNlLFxuICByYzogeyBjdHg6IFJlcXVlc3RDb250ZXh0OyBvcmdJZDogc3RyaW5nIH0sXG4gIHR5cGU6IFF1b3RhVHlwZSxcbik6IHZvaWQge1xuICBpbmNyZW1lbnRRdW90YShcbiAgICBxdW90YVNlcnZpY2UsXG4gICAgcmMub3JnSWQsXG4gICAgdHlwZSxcbiAgICByYy5jdHgubG9nLmJpbmQobnVsbCwgJ1dBUk4nKSxcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -31,11 +31,16 @@ export function rateLimitByOrg(opts) {
|
|
|
31
31
|
skip: (req) => verifyServicePrincipal(req),
|
|
32
32
|
// Redis store failure degrades to "not limited", never a 500 on the route.
|
|
33
33
|
passOnStoreError: true,
|
|
34
|
-
// Bucket by VERIFIED
|
|
35
|
-
// header.
|
|
36
|
-
//
|
|
37
|
-
//
|
|
34
|
+
// Bucket by VERIFIED identity (set by requireAuth), NOT the spoofable
|
|
35
|
+
// `x-org-id` header. An ORG SERVICE ACCOUNT gets its OWN bucket rather than
|
|
36
|
+
// its org's: automation is exactly the traffic shape that would otherwise
|
|
37
|
+
// drain the window its org's people share, and the plan requires machine
|
|
38
|
+
// rate limits to be keyed per account. Falls back to a normalized client-IP
|
|
39
|
+
// bucket when unauthenticated so pre-auth traffic is still bounded.
|
|
40
|
+
// Namespaced (`sa:`/`org:`/`ip:`) so no two id spaces can collide.
|
|
38
41
|
keyGenerator: (req) => {
|
|
42
|
+
if (req.user?.principalType === 'service_account' && req.user.sub)
|
|
43
|
+
return `sa:${req.user.sub}`;
|
|
39
44
|
const orgId = req.user?.organizationId;
|
|
40
45
|
return orgId ? `org:${orgId.toLowerCase()}` : `ip:${ipKeyGenerator(req.ip || 'anon', 64)}`;
|
|
41
46
|
},
|
|
@@ -50,4 +55,4 @@ export function rateLimitByOrg(opts) {
|
|
|
50
55
|
options.store = createSharedRateLimitStore(`${process.env.SERVICE_NAME || 'api'}:${name}`);
|
|
51
56
|
return rateLimit(options);
|
|
52
57
|
}
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdC1ieS1vcmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL3JhdGUtbGltaXQtYnktb3JnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRixPQUFPLFNBQVMsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9ELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBY25FOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUF5QjtJQUN0RCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRTlDLE1BQU0sT0FBTyxHQUFvQztRQUMvQyxHQUFHO1FBQ0gsUUFBUTtRQUNSLGVBQWUsRUFBRSxJQUFJO1FBQ3JCLGFBQWEsRUFBRSxLQUFLO1FBQ3BCLDJFQUEyRTtRQUMzRSxJQUFJLEVBQUUsQ0FBQyxHQUFZLEVBQUUsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQztRQUNuRCwyRUFBMkU7UUFDM0UsZ0JBQWdCLEVBQUUsSUFBSTtRQUN0QixzRUFBc0U7UUFDdEUsNEVBQTRFO1FBQzVFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUsNEVBQTRFO1FBQzVFLG9FQUFvRTtRQUNwRSxtRUFBbUU7UUFDbkUsWUFBWSxFQUFFLENBQUMsR0FBWSxFQUFVLEVBQUU7WUFDckMsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsS0FBSyxpQkFBaUIsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUc7Z0JBQUUsT0FBTyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDL0YsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUM7WUFDdkMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDN0YsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDLElBQWEsRUFBRSxHQUFhLEVBQVEsRUFBRTtZQUM5QyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxPQUFPLElBQUksWUFBWSxJQUFJLDhCQUE4QixFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2hILENBQUM7S0FDRixDQUFDO0lBRUYsK0VBQStFO0lBQy9FLGlGQUFpRjtJQUNqRiwyRUFBMkU7SUFDM0UsbUJBQW1CO0lBQ25CLE9BQU8sQ0FBQyxLQUFLLEdBQUcsMEJBQTBCLENBQUMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUzRixPQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IHNlbmRFcnJvciwgRXJyb3JDb2RlLCB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHJhdGVMaW1pdCwgeyBpcEtleUdlbmVyYXRvciB9IGZyb20gJ2V4cHJlc3MtcmF0ZS1saW1pdCc7XG5pbXBvcnQgeyBjcmVhdGVTaGFyZWRSYXRlTGltaXRTdG9yZSB9IGZyb20gJy4vcmF0ZS1saW1pdC1zdG9yZS5qcyc7XG5cbi8qKiBDb25maWcgZm9yIGEge0BsaW5rIHJhdGVMaW1pdEJ5T3JnfSBsaW1pdGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmdSYXRlTGltaXRPcHRpb25zIHtcbiAgLyoqIFVuaXF1ZSBuYW1lIOKAlCBuYW1lc3BhY2VzIHRoZSBSZWRpcyBidWNrZXQgKyBsYWJlbHMgbG9ncy4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogTWF4IHJlcXVlc3RzIHBlciB3aW5kb3cgcGVyIG9yZyAob3IgcGVyIGNsaWVudCBJUCB3aGVuIHVuYXV0aGVudGljYXRlZCkuICovXG4gIG1heDogbnVtYmVyO1xuICAvKiogV2luZG93IGxlbmd0aCBpbiBtcy4gKi9cbiAgd2luZG93TXM6IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIDQyOSBtZXNzYWdlIG92ZXJyaWRlLiAqL1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBlci1PUkdBTklaQVRJT04gcmF0ZSBsaW1pdGVyIGZvciBhIHNwZWNpZmljIGhvdC9leHBlbnNpdmUgcm91dGUsIGtleWVkIG9uIHRoZVxuICogVkVSSUZJRUQgYXV0aCBvcmcg4oCUIHRoZSBjb21wbGVtZW50IHRvIHRoZSBjb2Fyc2UgZ2xvYmFsIHBlci1JUCBsaW1pdGVyIGluXG4gKiBgY3JlYXRlQXBwYCAod2hpY2ggYSB3aG9sZSBvcmcgYmVoaW5kIG9uZSBOQVQgc2hhcmVzLCBhbmQgYSBkaXN0cmlidXRlZFxuICogYXR0YWNrZXIgc3ByZWFkcyBhY3Jvc3MgSVAgYnVja2V0cyB0byBldmFkZSkuXG4gKlxuICogTVVTVCBiZSBtb3VudGVkIEFGVEVSIGByZXF1aXJlQXV0aGAgc28gYHJlcS51c2VyLm9yZ2FuaXphdGlvbklkYCBpcyBwb3B1bGF0ZWQ7XG4gKiBhbiB1bmF1dGhlbnRpY2F0ZWQgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYSBjbGllbnQtSVAgYnVja2V0IChuZXZlciBhIHNwb29mYWJsZVxuICogaGVhZGVyKSBzbyBpdCBzdGF5cyBib3VuZGVkLiBWZXJpZmllZCBpbnRlcm5hbCBzZXJ2aWNlIHByaW5jaXBhbHMgYXJlIGV4ZW1wdFxuICogKHRoZXkgY2FycnkgYSBzaWduZWQgc2VydmljZSBKV1QpLiBVc2VzIHRoZSBzaGFyZWQgZW52IFJlZGlzIHN0b3JlXG4gKiAoY3Jvc3MtcmVwbGljYSwgbmFtZXNwYWNlZCBieSBgbmFtZWApIHdoZW4gY29uZmlndXJlZCwgZWxzZSBpbi1tZW1vcnkuXG4gKlxuICogQGV4YW1wbGVcbiAqICAgcm91dGVyLnBvc3QoJy8nLCAuLi5jcmVhdGVBdXRoZW50aWNhdGVkV2l0aE9yZ1JvdXRlKCksIHJlcXVpcmVQZXJtaXNzaW9uKCdtZXNzYWdlczp3cml0ZScpLFxuICogICAgIHJhdGVMaW1pdEJ5T3JnKHsgbmFtZTogJ21lc3NhZ2Utc2VuZCcsIG1heDogNjAsIHdpbmRvd01zOiA2MF8wMDAgfSksXG4gKiAgICAgd2l0aFJvdXRlKGhhbmRsZXIpKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhdGVMaW1pdEJ5T3JnKG9wdHM6IE9yZ1JhdGVMaW1pdE9wdGlvbnMpIHtcbiAgY29uc3QgeyBuYW1lLCBtYXgsIHdpbmRvd01zLCBtZXNzYWdlIH0gPSBvcHRzO1xuXG4gIGNvbnN0IG9wdGlvbnM6IFBhcmFtZXRlcnM8dHlwZW9mIHJhdGVMaW1pdD5bMF0gPSB7XG4gICAgbWF4LFxuICAgIHdpbmRvd01zLFxuICAgIHN0YW5kYXJkSGVhZGVyczogdHJ1ZSxcbiAgICBsZWdhY3lIZWFkZXJzOiBmYWxzZSxcbiAgICAvLyBFeGVtcHQgY3J5cHRvZ3JhcGhpY2FsbHktdmVyaWZpZWQgaW50ZXJuYWwgc2VydmljZSBjYWxsZXJzIChzaWduZWQgSldUKS5cbiAgICBza2lwOiAocmVxOiBSZXF1ZXN0KSA9PiB2ZXJpZnlTZXJ2aWNlUHJpbmNpcGFsKHJlcSksXG4gICAgLy8gUmVkaXMgc3RvcmUgZmFpbHVyZSBkZWdyYWRlcyB0byBcIm5vdCBsaW1pdGVkXCIsIG5ldmVyIGEgNTAwIG9uIHRoZSByb3V0ZS5cbiAgICBwYXNzT25TdG9yZUVycm9yOiB0cnVlLFxuICAgIC8vIEJ1Y2tldCBieSBWRVJJRklFRCBpZGVudGl0eSAoc2V0IGJ5IHJlcXVpcmVBdXRoKSwgTk9UIHRoZSBzcG9vZmFibGVcbiAgICAvLyBgeC1vcmctaWRgIGhlYWRlci4gQW4gT1JHIFNFUlZJQ0UgQUNDT1VOVCBnZXRzIGl0cyBPV04gYnVja2V0IHJhdGhlciB0aGFuXG4gICAgLy8gaXRzIG9yZydzOiBhdXRvbWF0aW9uIGlzIGV4YWN0bHkgdGhlIHRyYWZmaWMgc2hhcGUgdGhhdCB3b3VsZCBvdGhlcndpc2VcbiAgICAvLyBkcmFpbiB0aGUgd2luZG93IGl0cyBvcmcncyBwZW9wbGUgc2hhcmUsIGFuZCB0aGUgcGxhbiByZXF1aXJlcyBtYWNoaW5lXG4gICAgLy8gcmF0ZSBsaW1pdHMgdG8gYmUga2V5ZWQgcGVyIGFjY291bnQuIEZhbGxzIGJhY2sgdG8gYSBub3JtYWxpemVkIGNsaWVudC1JUFxuICAgIC8vIGJ1Y2tldCB3aGVuIHVuYXV0aGVudGljYXRlZCBzbyBwcmUtYXV0aCB0cmFmZmljIGlzIHN0aWxsIGJvdW5kZWQuXG4gICAgLy8gTmFtZXNwYWNlZCAoYHNhOmAvYG9yZzpgL2BpcDpgKSBzbyBubyB0d28gaWQgc3BhY2VzIGNhbiBjb2xsaWRlLlxuICAgIGtleUdlbmVyYXRvcjogKHJlcTogUmVxdWVzdCk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAocmVxLnVzZXI/LnByaW5jaXBhbFR5cGUgPT09ICdzZXJ2aWNlX2FjY291bnQnICYmIHJlcS51c2VyLnN1YikgcmV0dXJuIGBzYToke3JlcS51c2VyLnN1Yn1gO1xuICAgICAgY29uc3Qgb3JnSWQgPSByZXEudXNlcj8ub3JnYW5pemF0aW9uSWQ7XG4gICAgICByZXR1cm4gb3JnSWQgPyBgb3JnOiR7b3JnSWQudG9Mb3dlckNhc2UoKX1gIDogYGlwOiR7aXBLZXlHZW5lcmF0b3IocmVxLmlwIHx8ICdhbm9uJywgNjQpfWA7XG4gICAgfSxcbiAgICBoYW5kbGVyOiAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSk6IHZvaWQgPT4ge1xuICAgICAgc2VuZEVycm9yKHJlcywgNDI5LCBtZXNzYWdlID8/IGBUb28gbWFueSAke25hbWV9IHJlcXVlc3RzLCBwbGVhc2Ugc2xvdyBkb3duLmAsIEVycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVEKTtcbiAgICB9LFxuICB9O1xuXG4gIC8vIFNoYXJlZCBjcm9zcy1yZXBsaWNhIHN0b3JlIChvbmUgcHJvY2Vzcy13aWRlIFJlZGlzIGNvbm5lY3Rpb24pIHdoZW4gUmVkaXMgaXNcbiAgLy8gY29uZmlndXJlZCwgZWxzZSBwZXItcHJvY2VzcyBtZW1vcnkuIE5hbWVzcGFjZWQgYnkgc2VydmljZSBBTkQgbGltaXRlciBuYW1lIHNvXG4gIC8vIGRpc3RpbmN0IGxpbWl0ZXJzIOKAlCBvciBzYW1lLW5hbWVkIGxpbWl0ZXJzIGluIGRpZmZlcmVudCBzZXJ2aWNlcyDigJQgbmV2ZXJcbiAgLy8gc2hhcmUgYSBjb3VudGVyLlxuICBvcHRpb25zLnN0b3JlID0gY3JlYXRlU2hhcmVkUmF0ZUxpbWl0U3RvcmUoYCR7cHJvY2Vzcy5lbnYuU0VSVklDRV9OQU1FIHx8ICdhcGknfToke25hbWV9YCk7XG5cbiAgcmV0dXJuIHJhdGVMaW1pdChvcHRpb25zKTtcbn1cbiJdfQ==
|
|
@@ -23,7 +23,7 @@ export interface RequestContext {
|
|
|
23
23
|
requestId: string;
|
|
24
24
|
/** Identity from headers */
|
|
25
25
|
identity: RequestIdentity;
|
|
26
|
-
/** Logging function
|
|
26
|
+
/** Logging function: logger always, plus the SSE log stream when the service enables it */
|
|
27
27
|
log: RequestLogger;
|
|
28
28
|
}
|
|
29
29
|
/**
|
package/lib/api/request-types.js
CHANGED
|
@@ -49,12 +49,17 @@ export function createRequestContext(req, sseManager) {
|
|
|
49
49
|
logger.info(message, meta);
|
|
50
50
|
break;
|
|
51
51
|
}
|
|
52
|
+
// Only a service that serves a log stream (createApp `logStream: true`)
|
|
53
|
+
// pushes the line to SSE — otherwise every log line of every service would
|
|
54
|
+
// be serialized, written and relayed across Redis for no subscriber.
|
|
52
55
|
// The Winston call above is redacted by the logger's `redactFormat`, but the
|
|
53
56
|
// SSE frame bypasses the logger entirely — apply the SAME key-pattern
|
|
54
57
|
// redaction to `data` before it's pushed to the client so a secret in the
|
|
55
58
|
// log payload (e.g. an accidental `token`/`password` field) isn't streamed
|
|
56
59
|
// out over the build-log SSE channel.
|
|
57
|
-
sseManager.
|
|
60
|
+
if (sseManager.logStreamEnabled) {
|
|
61
|
+
sseManager.send(requestId, type, message, redactSensitive(data));
|
|
62
|
+
}
|
|
58
63
|
};
|
|
59
64
|
return {
|
|
60
65
|
requestId,
|
|
@@ -62,4 +67,4 @@ export function createRequestContext(req, sseManager) {
|
|
|
62
67
|
log,
|
|
63
68
|
};
|
|
64
69
|
}
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC10eXBlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvcmVxdWVzdC10eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBMEMsTUFBTSw0QkFBNEIsQ0FBQztBQUVoSSxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLG1DQUFtQyxDQUFDO0FBY2xGLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztBQW1CMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEdBQVksRUFDWixVQUFzQjtJQUV0QixNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsR0FBa0IsQ0FBQyxDQUFDO0lBQ2pELG1FQUFtRTtJQUNuRSx5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsSUFBSSxRQUFRLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBRWhFLGdEQUFnRDtJQUNoRCxNQUFNLEdBQUcsR0FBa0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ2pELE1BQU0sSUFBSSxHQUFHLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5RCxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxPQUFPO2dCQUNWLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUM1QixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzQixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQzNCLE1BQU07UUFDVixDQUFDO1FBQ0Qsd0VBQXdFO1FBQ3hFLDJFQUEyRTtRQUMzRSxxRUFBcUU7UUFDckUsNkVBQTZFO1FBQzdFLHNFQUFzRTtRQUN0RSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLHNDQUFzQztRQUN0QyxJQUFJLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUMsQ0FBQztJQUVGLE9BQU87UUFDTCxTQUFTO1FBQ1QsUUFBUTtRQUNSLEdBQUc7S0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBnZXRJZGVudGl0eSwgY3JlYXRlTG9nZ2VyLCByZWRhY3RTZW5zaXRpdmUsIHR5cGUgUmVxdWVzdElkZW50aXR5LCB0eXBlIEh0dHBSZXF1ZXN0IH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0IH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyB2NyBhcyB1dWlkIH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBTU0VNYW5hZ2VyLCB0eXBlIFNTRUV2ZW50VHlwZSB9IGZyb20gJy4uL2h0dHAvc3NlLWNvbm5lY3Rpb24tbWFuYWdlci5qcyc7XG5cbi8vIENvbnNvbGlkYXRlZCBFeHByZXNzIFJlcXVlc3QgYXVnbWVudGF0aW9uc1xuZGVjbGFyZSBnbG9iYWwge1xuICBuYW1lc3BhY2UgRXhwcmVzcyB7XG4gICAgaW50ZXJmYWNlIFJlcXVlc3Qge1xuICAgICAgLyoqIFVuaXF1ZSByZXF1ZXN0IElEIChzZXQgYnkgYXBwLWZhY3RvcnkgbWlkZGxld2FyZSkgKi9cbiAgICAgIHJlcXVlc3RJZD86IHN0cmluZztcbiAgICAgIC8qKiBSZXF1ZXN0IGNvbnRleHQgd2l0aCBpZGVudGl0eSwgbG9nZ2luZywgYW5kIFNTRSAqL1xuICAgICAgY29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xuICAgIH1cbiAgfVxufVxuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2FwaS1zZXJ2ZXInKTtcblxuLyoqXG4gKiBSZXF1ZXN0IGxvZ2dlciBmdW5jdGlvbiB0eXBlXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVlc3RMb2dnZXIgPSAodHlwZTogU1NFRXZlbnRUeXBlLCBtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuXG4vKipcbiAqIFJlcXVlc3QgY29udGV4dCB3aXRoIGlkZW50aXR5IGFuZCBsb2dnaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdENvbnRleHQge1xuICAvKiogVW5pcXVlIHJlcXVlc3QgSUQgKi9cbiAgcmVxdWVzdElkOiBzdHJpbmc7XG4gIC8qKiBJZGVudGl0eSBmcm9tIGhlYWRlcnMgKi9cbiAgaWRlbnRpdHk6IFJlcXVlc3RJZGVudGl0eTtcbiAgLyoqIExvZ2dpbmcgZnVuY3Rpb246IGxvZ2dlciBhbHdheXMsIHBsdXMgdGhlIFNTRSBsb2cgc3RyZWFtIHdoZW4gdGhlIHNlcnZpY2UgZW5hYmxlcyBpdCAqL1xuICBsb2c6IFJlcXVlc3RMb2dnZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVxdWVzdCBjb250ZXh0IHdpdGggaWRlbnRpdHkgYW5kIGxvZ2dpbmdcbiAqXG4gKiBDcmVhdGVzIGEgbG9nZ2VyIHRoYXQgb3V0cHV0cyB0byBib3RoIGNvbnNvbGUgYW5kIFNTRS5cbiAqXG4gKiBAcGFyYW0gcmVxIC0gRXhwcmVzcyByZXF1ZXN0XG4gKiBAcGFyYW0gc3NlTWFuYWdlciAtIFNTRSBtYW5hZ2VyIGZvciByZWFsLXRpbWUgbG9nc1xuICogQHJldHVybnMgUmVxdWVzdCBjb250ZXh0IHdpdGggaWRlbnRpdHkgYW5kIGxvZ2dlclxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBhcHAucG9zdCgnL2FwaS9yZXNvdXJjZScsIHJlcXVpcmVBdXRoLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAqICAgY29uc3QgY3R4ID0gY3JlYXRlUmVxdWVzdENvbnRleHQocmVxLCBzc2VNYW5hZ2VyKTtcbiAqXG4gKiAgIGN0eC5sb2coJ0lORk8nLCAnUHJvY2Vzc2luZyByZXF1ZXN0JywgeyBkYXRhOiByZXEuYm9keSB9KTtcbiAqXG4gKiAgIGlmICghY3R4LmlkZW50aXR5Lm9yZ0lkKSB7XG4gKiAgICAgY3R4LmxvZygnRVJST1InLCAnTWlzc2luZyBvcmdhbml6YXRpb24gSUQnKTtcbiAqICAgICByZXR1cm4gc2VuZEJhZFJlcXVlc3QocmVzLCAneC1vcmctaWQgaGVhZGVyIHJlcXVpcmVkJyk7XG4gKiAgIH1cbiAqXG4gKiAgIC8vIFByb2Nlc3MgcmVxdWVzdC4uLlxuICogICBjdHgubG9nKCdDT01QTEVURUQnLCAnUmVxdWVzdCBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVxdWVzdENvbnRleHQoXG4gIHJlcTogUmVxdWVzdCxcbiAgc3NlTWFuYWdlcjogU1NFTWFuYWdlcixcbik6IFJlcXVlc3RDb250ZXh0IHtcbiAgY29uc3QgaWRlbnRpdHkgPSBnZXRJZGVudGl0eShyZXEgYXMgSHR0cFJlcXVlc3QpO1xuICAvLyBQcmVmZXIgdGhlIGFscmVhZHktcGFyc2VkIHJlcXVlc3RJZCBmcm9tIGFwcC1mYWN0b3J5IG1pZGRsZXdhcmUsXG4gIC8vIGZhbGwgYmFjayB0byBpZGVudGl0eSBoZWFkZXIsIHRoZW4gZ2VuZXJhdGUgYSBuZXcgb25lLlxuICBjb25zdCByZXF1ZXN0SWQgPSByZXEucmVxdWVzdElkIHx8IGlkZW50aXR5LnJlcXVlc3RJZCB8fCB1dWlkKCk7XG5cbiAgLy8gQ3JlYXRlIGxvZ2dlciB0aGF0IG91dHB1dHMgdG8gV2luc3RvbiBhbmQgU1NFXG4gIGNvbnN0IGxvZzogUmVxdWVzdExvZ2dlciA9ICh0eXBlLCBtZXNzYWdlLCBkYXRhKSA9PiB7XG4gICAgY29uc3QgbWV0YSA9IHsgcmVxdWVzdElkLCBvcmdJZDogaWRlbnRpdHkub3JnSWQsIHR5cGUsIGRhdGEgfTtcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgJ0VSUk9SJzpcbiAgICAgICAgbG9nZ2VyLmVycm9yKG1lc3NhZ2UsIG1ldGEpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1dBUk4nOlxuICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlLCBtZXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2dnZXIuaW5mbyhtZXNzYWdlLCBtZXRhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIC8vIE9ubHkgYSBzZXJ2aWNlIHRoYXQgc2VydmVzIGEgbG9nIHN0cmVhbSAoY3JlYXRlQXBwIGBsb2dTdHJlYW06IHRydWVgKVxuICAgIC8vIHB1c2hlcyB0aGUgbGluZSB0byBTU0Ug4oCUIG90aGVyd2lzZSBldmVyeSBsb2cgbGluZSBvZiBldmVyeSBzZXJ2aWNlIHdvdWxkXG4gICAgLy8gYmUgc2VyaWFsaXplZCwgd3JpdHRlbiBhbmQgcmVsYXllZCBhY3Jvc3MgUmVkaXMgZm9yIG5vIHN1YnNjcmliZXIuXG4gICAgLy8gVGhlIFdpbnN0b24gY2FsbCBhYm92ZSBpcyByZWRhY3RlZCBieSB0aGUgbG9nZ2VyJ3MgYHJlZGFjdEZvcm1hdGAsIGJ1dCB0aGVcbiAgICAvLyBTU0UgZnJhbWUgYnlwYXNzZXMgdGhlIGxvZ2dlciBlbnRpcmVseSDigJQgYXBwbHkgdGhlIFNBTUUga2V5LXBhdHRlcm5cbiAgICAvLyByZWRhY3Rpb24gdG8gYGRhdGFgIGJlZm9yZSBpdCdzIHB1c2hlZCB0byB0aGUgY2xpZW50IHNvIGEgc2VjcmV0IGluIHRoZVxuICAgIC8vIGxvZyBwYXlsb2FkIChlLmcuIGFuIGFjY2lkZW50YWwgYHRva2VuYC9gcGFzc3dvcmRgIGZpZWxkKSBpc24ndCBzdHJlYW1lZFxuICAgIC8vIG91dCBvdmVyIHRoZSBidWlsZC1sb2cgU1NFIGNoYW5uZWwuXG4gICAgaWYgKHNzZU1hbmFnZXIubG9nU3RyZWFtRW5hYmxlZCkge1xuICAgICAgc3NlTWFuYWdlci5zZW5kKHJlcXVlc3RJZCwgdHlwZSwgbWVzc2FnZSwgcmVkYWN0U2Vuc2l0aXZlKGRhdGEpKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICByZXF1ZXN0SWQsXG4gICAgaWRlbnRpdHksXG4gICAgbG9nLFxuICB9O1xufVxuIl19
|