@pipeline-builder/api-core 5.2.7 → 5.2.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/middleware/auth.js +3 -2
- package/lib/middleware/client-version.d.ts +45 -0
- package/lib/middleware/client-version.js +97 -0
- package/lib/middleware/index.d.ts +1 -0
- package/lib/middleware/index.js +2 -1
- package/lib/services/api-key-exchange.d.ts +4 -2
- package/lib/services/api-key-exchange.js +15 -8
- package/lib/services/audit-context.d.ts +3 -0
- package/lib/services/audit-context.js +2 -1
- package/lib/services/scheduler.d.ts +20 -0
- package/lib/services/scheduler.js +33 -1
- package/lib/types/error-codes.d.ts +3 -0
- package/lib/types/error-codes.js +6 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +2 -1
- package/lib/utils/semver.d.ts +18 -0
- package/lib/utils/semver.js +120 -0
- package/package.json +1 -1
package/lib/middleware/auth.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
import jwt from 'jsonwebtoken';
|
|
4
4
|
import { refuseForAssurance } from './assurance.js';
|
|
5
|
+
import { clientVersionOf } from './client-version.js';
|
|
5
6
|
import { runDeferredQuotaCheck } from './deferred-quota-check.js';
|
|
6
7
|
import { hasValidIdentityClaims, verifyBearerToken } from './jwt-verify.js';
|
|
7
8
|
import { recordAuthzDenial } from './permission-gates.js';
|
|
@@ -70,7 +71,7 @@ async function resolveApiKey(options, key, req, res, next) {
|
|
|
70
71
|
const { exchangeApiKey, ApiKeyExchangeUnavailableError } = await import('../services/api-key-exchange.js');
|
|
71
72
|
let token;
|
|
72
73
|
try {
|
|
73
|
-
token = await exchangeApiKey(key);
|
|
74
|
+
token = await exchangeApiKey(key, clientVersionOf(req));
|
|
74
75
|
}
|
|
75
76
|
catch (error) {
|
|
76
77
|
if (error instanceof ApiKeyExchangeUnavailableError) {
|
|
@@ -199,4 +200,4 @@ async function verifyAndAttach(options, rawToken, req, res, next) {
|
|
|
199
200
|
return sendError(res, HttpStatus.UNAUTHORIZED, 'Authentication failed', ErrorCode.UNAUTHORIZED);
|
|
200
201
|
}
|
|
201
202
|
}
|
|
202
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZGRsZXdhcmUvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBUXRDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLDJCQUEyQixFQUFFLG9CQUFvQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckcsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0UsT0FBTyxFQUF1QixNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQXdCLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9C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O0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIGByZXF1aXJlQXV0aGA6IGJlYXJlciAvIGFjY2Vzcy1rZXkgYXV0aGVudGljYXRpb24sIHRoZSBjaGVja3MgZXZlcnlcbiAqIHZlcmlmaWVkIHJlcXVlc3QgcGFzc2VzLCBhbmQgdGhlIHRlbmFudCBpZGVudGl0eSBpdCBhdHRhY2hlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlLCBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBqd3QgZnJvbSAnanNvbndlYnRva2VuJztcbmltcG9ydCB7IHJlZnVzZUZvckFzc3VyYW5jZSB9IGZyb20gJy4vYXNzdXJhbmNlLmpzJztcbmltcG9ydCB7IHJ1bkRlZmVycmVkUXVvdGFDaGVjayB9IGZyb20gJy4vZGVmZXJyZWQtcXVvdGEtY2hlY2suanMnO1xuaW1wb3J0IHsgaGFzVmFsaWRJZGVudGl0eUNsYWltcywgdmVyaWZ5QmVhcmVyVG9rZW4gfSBmcm9tICcuL2p3dC12ZXJpZnkuanMnO1xuaW1wb3J0IHsgcmVjb3JkQXV0aHpEZW5pYWwgfSBmcm9tICcuL3Blcm1pc3Npb24tZ2F0ZXMuanMnO1xuaW1wb3J0IHsgY2hlY2tSZXZvY2F0aW9uLCBpc0ltcGVyc29uYXRpb25Xcml0ZUJsb2NrZWQsIG5lZWRzUmV2b2NhdGlvbkNoZWNrIH0gZnJvbSAnLi9yZXZvY2F0aW9uLmpzJztcbmltcG9ydCB7IHRhZ1JvdXRlR2F0ZSB9IGZyb20gJy4vcm91dGUtdGFibGUuanMnO1xuaW1wb3J0IHsgaXNTZXJ2aWNlVG9rZW5EZW5pZWQsIHNlcnZpY2VOYW1lT2YgfSBmcm9tICcuL3NlcnZpY2UtdG9rZW5zLmpzJztcbmltcG9ydCB7IEh0dHBTdGF0dXMgfSBmcm9tICcuLi9jb25zdGFudHMvaHR0cC1zdGF0dXMuanMnO1xuaW1wb3J0IHsgSndrc1VuYXZhaWxhYmxlRXJyb3IsIFVua25vd25LaWRFcnJvciB9IGZyb20gJy4uL3NlcnZpY2VzL2p3a3MtY2FjaGUuanMnO1xuaW1wb3J0IHsgU2VydmljZUtleUVycm9yLCBzZXJ2aWNlSWRlbnRpdHkgfSBmcm9tICcuLi9zZXJ2aWNlcy9zZXJ2aWNlLWtleXMuanMnO1xuaW1wb3J0IHsgdHlwZSBBc3N1cmFuY2VMZXZlbCB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEh0dHBSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMvaHR0cC5qcyc7XG5pbXBvcnQgeyBpc09wYXF1ZUFwaUtleSB9IGZyb20gJy4uL3V0aWxzL2FwaS1rZXkuanMnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaGVhZGVycy5qcyc7XG5pbXBvcnQgeyBnZXRJZGVudGl0eSwgdHlwZSBSZXF1ZXN0SWRlbnRpdHkgfSBmcm9tICcuLi91dGlscy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBzZW5kRXJyb3IgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXV0aC1taWRkbGV3YXJlJyk7XG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVBdXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbGxvdyB4LW9yZy1pZC94LW9yZy1uYW1lIGhlYWRlcnMgdG8gb3ZlcnJpZGUgdGhlIEpXVCdzIG9yZ2FuaXphdGlvbiBmaWVsZHMuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIGB4LW9yZy1pZGAvYHgtb3JnLW5hbWVgIGhlYWRlcnMgb3ZlcnJpZGUgdGhlIGNhbGxlcidzIG9yZ1xuICAgKiDigJQgYnV0IE9OTFkgZm9yIGEgdmVyaWZpZWQgU1lTLUFETUlOIChgaXNTdXBlckFkbWluYCBjbGFpbSkuIEZvciBhbnkgb3JkaW5hcnlcbiAgICogYXV0aGVudGljYXRlZCB1c2VyIHRoZSBoZWFkZXJzIGFyZSBpZ25vcmVkLCBzbyBlbmFibGluZyB0aGlzIGNhbiBuZXZlciBsZXQgYVxuICAgKiBub3JtYWwgdXNlciBpbXBlcnNvbmF0ZSBhbm90aGVyIHRlbmFudCdzIG9yZy4gVXNlIGZvciBjcm9zcy1vcmcgYWRtaW4gdG9vbGluZ1xuICAgKiAoZS5nLiBhIHN5c2FkbWluIG1hbmFnaW5nIGEgZ2l2ZW4gb3JnJ3MgYmlsbGluZykuIElmIHVuc3VyZSwgbGVhdmUgaXQgZGlzYWJsZWQuXG4gICAqL1xuICBhbGxvd09yZ0hlYWRlck92ZXJyaWRlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERlbWFuZCB0aGF0IHRoZSB3aG9sZSBTRVNTSU9OIGJlIGF0IGxlYXN0IHRoaXMgYXNzdXJhbmNlIGxldmVsLlxuICAgKlxuICAgKiBgbWluQXNzdXJhbmNlOiAyYCBtZWFucyB0aGUgcGVyc29uIGF1dGhlbnRpY2F0ZWQgd2l0aCBhIHNlY29uZCBmYWN0b3Ig4oCUIGFcbiAgICogcGFzc2tleSB3aXRoIHVzZXIgdmVyaWZpY2F0aW9uLCBhIHBhc3N3b3JkIHBsdXMgYW4gYXV0aGVudGljYXRvciBjb2RlLCBvclxuICAgKiBTU08gdGhyb3VnaCBhbiBJZFAgdGhlIG9yZyBtYXJrZWQgYXMgZW5mb3JjaW5nIE1GQS4gQSB3ZWFrZXIgdG9rZW4gZ2V0c1xuICAgKiAqKjQwMSBgTUZBX1JFUVVJUkVEYCoqLCB3aGljaCB0aGUgY2xpZW50IGFuc3dlcnMgYnkgc2VuZGluZyB0aGUgcGVyc29uIHRvXG4gICAqIGVucm9sbWVudCBvciB0byBhIHN0cm9uZ2VyIHNpZ24taW47IHJlZnJlc2hpbmcgY2Fubm90IGhlbHAsIGJlY2F1c2UgYGFhbGBcbiAgICogbGl2ZXMgb24gdGhlIHNlc3Npb24gc2xvdCBhbmQgYSByZWZyZXNoIG5ldmVyIHJhaXNlcyBpdC5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgU0VTU0lPTi1sZXZlbCBjb3VudGVycGFydCB0byB7QGxpbmsgcmVxdWlyZVN0ZXBVcH0sIHdoaWNoIHN0YXlzXG4gICAqIGEgZnJlc2gsIHBlci1hY3Rpb24gY29uZmlybWF0aW9uLiBVc2UgYm90aCBvbiB0aGUgbW9zdCBkYW5nZXJvdXMgcm91dGVzLlxuICAgKlxuICAgKiBNQUNISU5FUyBORVZFUiBTQVRJU0ZZIElULiBBIHNlcnZpY2UgcHJpbmNpcGFsLCBhbiBvcmcgc2VydmljZSBhY2NvdW50IGFuZFxuICAgKiBhbiBleGNoYW5nZWQgYWNjZXNzIGtleSBhbGwgZ2V0ICoqNDAzIGBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEYCoqIOKAlCB0aGVyZSBpc1xuICAgKiBubyBwZXJzb24gYmVoaW5kIHRoZW0gdG8gaGF2ZSBwcmVzZW50ZWQgYSBmYWN0b3IsIHNvIFwiYXNzdXJhbmNlXCIgaXMgbm90IGFcbiAgICogcXVlc3Rpb24gdGhlaXIgY3JlZGVudGlhbCBjYW4gYW5zd2VyLiBUaGF0IGlzIGRlbGliZXJhdGVseSBub3QgYSBzaWxlbnRcbiAgICogcGFzcy10aHJvdWdoIGZvciBpbnRlcm5hbCBzZXJ2aWNlczogYSByb3V0ZSB0aGF0IGRlbWFuZHMgTUZBIGlzIGEgcm91dGUgYVxuICAgKiBodW1hbiBpcyBkb2luZyBzb21ldGhpbmcgZGFuZ2Vyb3VzIG9uLlxuICAgKi9cbiAgbWluQXNzdXJhbmNlPzogQXNzdXJhbmNlTGV2ZWw7XG4gIC8qKlxuICAgKiBXaXRoIHtAbGluayBtaW5Bc3N1cmFuY2V9LCBhZGRpdGlvbmFsbHkgYm91bmQgaG93IGxvbmcgYWdvIHRoYXQgc2lnbi1pblxuICAgKiBoYXBwZW5lZCAoc2Vjb25kcywgY29tcGFyZWQgYWdhaW5zdCB0aGUgdG9rZW4ncyBgYXV0aF90aW1lYCkuIEEgc2Vzc2lvbiB0aGF0XG4gICAqIGlzIE1GQS1ncmFkZSBidXQgb2xkZXIgdGhhbiB0aGlzIGdldHMgKio0MDEgYFJFQVVUSF9SRVFVSVJFRGAqKi4gSWdub3JlZFxuICAgKiB3aXRob3V0IGBtaW5Bc3N1cmFuY2VgIOKAlCBcImhvdyByZWNlbnRcIiBpcyBvbmx5IG1lYW5pbmdmdWwgb25jZSBcImhvdyBzdHJvbmdcIlxuICAgKiBpcyBiZWluZyBhc2tlZC5cbiAgICovXG4gIG1heEFnZT86IG51bWJlcjtcbn1cblxuLyoqIEpXVCBhdXRoIG1pZGRsZXdhcmUuIFVzZSBkaXJlY3RseSBvciBjYWxsIHdpdGggb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICBvcHRpb25zPzogUmVxdWlyZUF1dGhPcHRpb25zLFxuKTogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICByZXFPck9wdGlvbnM/OiBSZXF1ZXN0IHwgUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXM/OiBSZXNwb25zZSxcbiAgbmV4dD86IE5leHRGdW5jdGlvbixcbik6IHZvaWQgfCAoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkKSB7XG4gIGlmIChyZXFPck9wdGlvbnMgJiYgcmVzICYmIG5leHQgJiYgJ2hlYWRlcnMnIGluIHJlcU9yT3B0aW9ucykge1xuICAgIHJldHVybiBfcmVxdWlyZUF1dGgoe30sIHJlcU9yT3B0aW9ucyBhcyBSZXF1ZXN0LCByZXMsIG5leHQpO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IChyZXFPck9wdGlvbnMgYXMgUmVxdWlyZUF1dGhPcHRpb25zKSB8fCB7fTtcbiAgY29uc3QgZ2F0ZSA9IHRhZ1JvdXRlR2F0ZSgocmVxOiBSZXF1ZXN0LCByZXNJbm5lcjogUmVzcG9uc2UsIG5leHRJbm5lcjogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgX3JlcXVpcmVBdXRoKG9wdGlvbnMsIHJlcSwgcmVzSW5uZXIsIG5leHRJbm5lcik7XG4gIH0sIHsga2luZDogJ2F1dGgnIH0pO1xuICBpZiAob3B0aW9ucy5taW5Bc3N1cmFuY2UpIHtcbiAgICB0YWdSb3V0ZUdhdGUoZ2F0ZSwgeyBraW5kOiAnYXNzdXJhbmNlJywgbWluQXNzdXJhbmNlOiBvcHRpb25zLm1pbkFzc3VyYW5jZSwgLi4uKG9wdGlvbnMubWF4QWdlICE9PSB1bmRlZmluZWQgPyB7IG1heEFnZTogb3B0aW9ucy5tYXhBZ2UgfSA6IHt9KSB9KTtcbiAgfVxuICByZXR1cm4gZ2F0ZTtcbn1cbnRhZ1JvdXRlR2F0ZShyZXF1aXJlQXV0aCwgeyBraW5kOiAnYXV0aCcgfSk7XG5cbmZ1bmN0aW9uIF9yZXF1aXJlQXV0aChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBjb25zdCBhdXRoSGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcblxuICBpZiAoIWF1dGhIZWFkZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRob3JpemF0aW9uIGhlYWRlciByZXF1aXJlZCcsIEVycm9yQ29kZS5UT0tFTl9NSVNTSU5HKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gYXV0aEhlYWRlci5zcGxpdCgnICcpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgYXV0aG9yaXphdGlvbiBmb3JtYXQuIFVzZTogQmVhcmVyIDx0b2tlbj4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cblxuICAvLyBBbiBPUEFRVUUgQUNDRVNTIEtFWSAoYHBiX3BhdF/igKZgIC8gYHBiX3NhX+KApmApIGNhcnJpZXMgbm8gY2xhaW1zIGFuZCBub1xuICAvLyBzaWduYXR1cmUsIHNvIGl0IGNhbm5vdCBiZSB2ZXJpZmllZCBoZXJlLiBUcmFkZSBpdCBhdCBwbGF0Zm9ybSBmb3IgYVxuICAvLyBzaG9ydC1saXZlZCBKV1QgKGNhY2hlZCBpbi1wcm9jZXNzIHVudGlsIGl0IGV4cGlyZXMpIGFuZCB0aGVuIHZlcmlmeSB0aGF0XG4gIC8vIEpXVCBvbiB0aGUgbm9ybWFsIHBhdGgg4oCUIHNlcnZpY2VzIG5ldmVyIHJlYWQgYSBrZXkgaGFzaC4gU2VlXG4gIC8vIGBzZXJ2aWNlcy9hcGkta2V5LWV4Y2hhbmdlLnRzYC5cbiAgaWYgKGlzT3BhcXVlQXBpS2V5KHBhcnRzWzFdKSkge1xuICAgIHZvaWQgcmVzb2x2ZUFwaUtleShvcHRpb25zLCBwYXJ0c1sxXSwgcmVxLCByZXMsIG5leHQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGAuY2F0Y2gobmV4dClgIGZvcndhcmRzIGEgRE9XTlNUUkVBTSBzeW5jaHJvbm91cyB0aHJvdyBmcm9tIGBuZXh0KClgIHRvXG4gIC8vIEV4cHJlc3MncyBlcnJvciBtaWRkbGV3YXJlIOKAlCB2ZXJpZmljYXRpb24gaXRzZWxmIG5ldmVyIHJlamVjdHMgKGl0IG1hcHNcbiAgLy8gZXZlcnkgZmFpbHVyZSB0byBhIHJlc3BvbnNlKS5cbiAgdm9pZCB2ZXJpZnlBbmRBdHRhY2gob3B0aW9ucywgcGFydHNbMV0sIHJlcSwgcmVzLCBuZXh0KS5jYXRjaChuZXh0KTtcbn1cblxuLyoqXG4gKiBFeGNoYW5nZSBhbiBvcGFxdWUga2V5IGZvciBhIEpXVCwgdGhlbiBjb250aW51ZSBvbiB0aGUgbm9ybWFsIHZlcmlmaWNhdGlvblxuICogcGF0aC4gQSByZWZ1c2VkIGtleSBpcyBhIDQwMTsgYW4gdW5yZWFjaGFibGUgcGxhdGZvcm0gaXMgYSA1MDMgKG5ldmVyIGEgcGFzcyDigJRcbiAqIGFuIHVudmVyaWZpYWJsZSBjcmVkZW50aWFsIGlzIG5vdCBhbiBpZGVudGl0eSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBcGlLZXkoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAga2V5OiBzdHJpbmcsXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIExvYWRlZCBMQVpJTFksIG9uIHRoZSBmaXJzdCBrZXkgZXZlciBwcmVzZW50ZWQuIEEgc3RhdGljIGltcG9ydCB3b3VsZCBwdXRcbiAgLy8gdGhlIEhUVFAgY2xpZW50IChhbmQgcGxhdGZvcm0ncyBhZGRyZXNzKSBpbnRvIHRoZSBpbXBvcnQgZ3JhcGggb2YgZXZlcnlcbiAgLy8gbW9kdWxlIHRoYXQgbWVyZWx5IHVzZXMgYHJlcXVpcmVBdXRoYCwgd2hpY2ggYm90aCB3aWRlbnMgdGhlIGJvb3QgZ3JhcGggYW5kXG4gIC8vIGJyZWFrcyBhbnkgdGVzdCB0aGF0IG1vY2tzIGBodHRwLWNsaWVudC5qc2Agd2l0aCBhIHBhcnRpYWwgbW9kdWxlLlxuICBjb25zdCB7IGV4Y2hhbmdlQXBpS2V5LCBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvYXBpLWtleS1leGNoYW5nZS5qcycpO1xuICBsZXQgdG9rZW46IHN0cmluZztcbiAgdHJ5IHtcbiAgICB0b2tlbiA9IGF3YWl0IGV4Y2hhbmdlQXBpS2V5KGtleSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICAgJ0FjY2Vzcy1rZXkgdmVyaWZpY2F0aW9uIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlOyBwbGVhc2UgcmV0cnknLFxuICAgICAgICBFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgb3IgcmV2b2tlZCBhY2Nlc3Mga2V5JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG4gIGF3YWl0IHZlcmlmeUFuZEF0dGFjaChvcHRpb25zLCB0b2tlbiwgcmVxLCByZXMsIG5leHQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlBbmRBdHRhY2goXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmF3VG9rZW46IHN0cmluZyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBUd28gY2hhaW5zLCBvbmUgZW50cnkgcG9pbnQgKHNlZSBgdmVyaWZ5QmVhcmVyVG9rZW5gKTogYSB1c2VyIHRva2VuIG11c3RcbiAgICAvLyBiZSBFUzI1NiBzaWduZWQgYnkgcGxhdGZvcm0gYW5kIHZlcmlmaWVkIGFnYWluc3QgaXRzIHB1Ymxpc2hlZCBKV0tTOyBhblxuICAgIC8vIGludGVybmFsIHNlcnZpY2UgdG9rZW4gbXVzdCBiZSBFUzI1NiBzaWduZWQgYnkgdGhhdCBzZXJ2aWNlJ3MgT1dOIGtleSBhbmRcbiAgICAvLyBkZWNsYXJlIGl0c2VsZiBhIHNlcnZpY2UgcHJpbmNpcGFsLiBCb3RoIHBpbiB0aGUgYWxnb3JpdGhtIChub1xuICAgIC8vIGFsZy1jb25mdXNpb24sIG5vIGBhbGc6bm9uZWApIGFuZCBib3RoIGFwcGx5IHRoZSBvcHRpb25hbCBpc3N1ZXIvYXVkaWVuY2VcbiAgICAvLyBiaW5kaW5nLlxuICAgIGNvbnN0IGRlY29kZWQgPSBhd2FpdCB2ZXJpZnlCZWFyZXJUb2tlbihyYXdUb2tlbik7XG5cbiAgICBpZiAoZGVjb2RlZC50eXBlICE9PSAnYWNjZXNzJykge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnT25seSBhY2Nlc3MgdG9rZW5zIGNhbiBiZSB1c2VkIGZvciBBUEkgcmVxdWVzdHMnLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgaWYgKCFkZWNvZGVkLnN1YiB8fCAhZGVjb2RlZC5yb2xlIHx8ICFoYXNWYWxpZElkZW50aXR5Q2xhaW1zKGRlY29kZWQpKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdUb2tlbiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICAvLyBTZXJ2aWNlLXRva2VuIGtpbGwtc3dpdGNoOiByZWplY3QgYSBzZXJ2aWNlIHByaW5jaXBhbCB3aG9zZSBzZXJ2aWNlIGhhc1xuICAgIC8vIGJlZW4gYWRkZWQgdG8gdGhlIGRlbnlsaXN0LiBPdGhlcndpc2UgdGhlIG9ubHkgd2F5IHRvIGludmFsaWRhdGUgYVxuICAgIC8vIHNlcnZpY2UncyB0b2tlbnMgYmVmb3JlIHRoZWlyIChzaG9ydCkgVFRMIGlzIHJvdGF0aW5nIHRoYXQgc2VydmljZSdzXG4gICAgLy8gc2lnbmluZyBrZXk7IHRoaXMgY3V0cyBvbmUgY29tcHJvbWlzZWQvcm9ndWUgc2VydmljZSBvZmYgaW1tZWRpYXRlbHkuIE8oMSkgU2V0IGxvb2t1cCwgemVybyBjb3N0IHdoZW4gdGhlIGRlbnlsaXN0XG4gICAgLy8gaXMgZW1wdHkgKHRoZSBkZWZhdWx0KSwgc28gaXQgbmV2ZXIgdGF4ZXMgdGhlIFMyUyBob3QgcGF0aCB1bmxlc3MgYXJtZWQuXG4gICAgaWYgKGlzU2VydmljZVRva2VuRGVuaWVkKGRlY29kZWQpKSB7XG4gICAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl9kZW5pZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lT2YoZGVjb2RlZCkgPz8gJ3Vua25vd24nIH0pO1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlamVjdGVkIGRlbnlsaXN0ZWQgc2VydmljZSB0b2tlbicsIHsgc3ViOiBkZWNvZGVkLnN1YiB9KTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1NlcnZpY2UgdG9rZW4gcmV2b2tlZCcsIEVycm9yQ29kZS5UT0tFTl9SRVZPS0VEKTtcbiAgICB9XG5cbiAgICByZXEudXNlciA9IHsgLi4uZGVjb2RlZCB9O1xuXG4gICAgLy8gUkVBRC1PTkxZIElNUEVSU09OQVRJT04uIFRoZSB0b2tlbiBuYW1lcyB0aGUgb3BlcmF0b3IgQU5EIHNheXMgaXQgbWF5IG9ubHlcbiAgICAvLyBsb29rOiBldmVyeSBzZXJ2aWNlIHJlZnVzZXMgYSBzdGF0ZSBjaGFuZ2UgdW5kZXIgaXQsIG5vdCBvbmx5IHBsYXRmb3JtIOKAlFxuICAgIC8vIGEgc3VwcG9ydCBzZXNzaW9uIHRoYXQgY291bGQgd3JpdGUgdG8gcGx1Z2luL2NvbXBsaWFuY2UvYmlsbGluZyBpcyBub3RcbiAgICAvLyByZWFkLW9ubHkuIENoZWNrZWQgYmVmb3JlIGFueSBvdGhlciBnYXRlIHNvIG5vIHJvdXRlIGNhbiBmb3JnZXQgaXQuXG4gICAgaWYgKGlzSW1wZXJzb25hdGlvbldyaXRlQmxvY2tlZChyZXEubWV0aG9kLCBkZWNvZGVkKSkge1xuICAgICAgaWYgKHJlcS5tZXRob2QpIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ2ltcGVyc29uYXRpb24tcmVhZC1vbmx5Jyk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICAnV3JpdGUgcmVxdWVzdHMgYXJlIGRpc2FibGVkIGR1cmluZyByZWFkLW9ubHkgaW1wZXJzb25hdGlvbi4gU3RvcCBpbXBlcnNvbmF0aW5nIHRvIG1ha2UgY2hhbmdlcy4nLFxuICAgICAgICBFcnJvckNvZGUuSU1QRVJTT05BVElPTl9SRUFEX09OTFksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEJPT1RTVFJBUC1BRE1JTiBFTlJPTE1FTlQgU0VTU0lPTi4gU3VjaCBhIHRva2VuIGV4aXN0cyBzb1xuICAgIC8vIHRoZSBpbnN0YWxsJ3Mgb25seSBhZG1pbiBjYW4gZW5yb2wgYSBmYWN0b3I7IGl0IGlzIGBhYWw6IDFgIGFuZCBtdXN0IG5vdFxuICAgIC8vIHJlYWNoIGFueXRoaW5nIGVsc2UuIFBsYXRmb3JtIOKAlCB3aGljaCBvd25zIHRoZSBleGNlcHRpb24gYW5kIGtub3dzIHdoaWNoXG4gICAgLy8gb2YgaXRzIG93biByb3V0ZXMgYGluaXQtcGxhdGZvcm0uc2hgIGNhbGxzIOKAlCBhbGxvd3MgYW4gZXhwbGljaXQgZmV3IGJlZm9yZVxuICAgIC8vIHRoaXMgcG9pbnQgKHNlZSBpdHMgb3duIGByZXF1aXJlQXV0aGApOyBpbiBFVkVSWSBvdGhlciBzZXJ2aWNlIHRoZSBhbnN3ZXJcbiAgICAvLyBpcyBzaW1wbHkgbm8sIHNvIHRoZSByZWFjaCByZXN0cmljdGlvbiBob2xkcyB3aXRob3V0IGEgcGVyLXNlcnZpY2VcbiAgICAvLyBhbGxvd2xpc3QgdG8ga2VlcCBpbiBzeW5jLlxuICAgIGlmIChkZWNvZGVkLm1mYUVucm9sbG1lbnRQZW5kaW5nID09PSB0cnVlKSB7XG4gICAgICBlbWl0Q291bnRlcignbWZhX2VuZm9yY2VtZW50X3JlZnVzZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VJZGVudGl0eSgpLCByZWFzb246ICdib290c3RyYXBfc2Vzc2lvbicgfSk7XG4gICAgICByZWNvcmRBdXRoekRlbmlhbChyZXEsICdtZmEtZW5yb2xtZW50Jyk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICAnRmluaXNoIHNldHRpbmcgdXAgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiBiZWZvcmUgdXNpbmcgdGhlIHJlc3Qgb2YgUGlwZWxpbmUgQnVpbGRlcicsXG4gICAgICAgIEVycm9yQ29kZS5NRkFfRU5ST0xMTUVOVF9SRVFVSVJFRCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2Vzc2lvbi1sZXZlbCBhc3N1cmFuY2UgKGByZXF1aXJlQXV0aCh7IG1pbkFzc3VyYW5jZSwgbWF4QWdlIH0pYCkuXG4gICAgaWYgKG9wdGlvbnMubWluQXNzdXJhbmNlXG4gICAgICAmJiByZWZ1c2VGb3JBc3N1cmFuY2UoeyBtaW5Bc3N1cmFuY2U6IG9wdGlvbnMubWluQXNzdXJhbmNlLCAuLi4ob3B0aW9ucy5tYXhBZ2UgIT09IHVuZGVmaW5lZCA/IHsgbWF4QWdlOiBvcHRpb25zLm1heEFnZSB9IDoge30pIH0sIGRlY29kZWQsIHJlcSwgcmVzKSkgcmV0dXJuO1xuXG4gICAgLy8gVGhlIHgtb3JnLWlkL3gtb3JnLW5hbWUgb3ZlcnJpZGUgbGV0cyBhIFNZUy1BRE1JTiBhY3Qgb24gYSBjaG9zZW4gb3JnXG4gICAgLy8gKGNyb3NzLW9yZyBhZG1pbiB0b29saW5nKS4gSXQgaXMgZ2F0ZWQgb24gdGhlIHZlcmlmaWVkIGBpc1N1cGVyQWRtaW5gIGNsYWltXG4gICAgLy8gaGVyZSBzbyB0aGF0IGV2ZW4gYSByb3V0ZSB3aGljaCBtaXN0YWtlbmx5IGVuYWJsZXMgYGFsbG93T3JnSGVhZGVyT3ZlcnJpZGVgXG4gICAgLy8gY2FuIE5FVkVSIGxldCBhbiBvcmRpbmFyeSBhdXRoZW50aWNhdGVkIHVzZXIgc3Bvb2YgYW5vdGhlciB0ZW5hbnQncyBvcmcgdmlhXG4gICAgLy8gdGhlIGhlYWRlciDigJQgZGVmZW5jZS1pbi1kZXB0aCBhZ2FpbnN0IHRoZSBjcm9zcy10ZW5hbnQgYnJlYWsgdGhpcyBjYXVzZWQuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dPcmdIZWFkZXJPdmVycmlkZSAmJiBkZWNvZGVkLmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaGVhZGVyT3JnSWQgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLWlkJ10pO1xuICAgICAgY29uc3QgaGVhZGVyT3JnTmFtZSA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctbmFtZSddKTtcbiAgICAgIGlmIChoZWFkZXJPcmdJZCkgcmVxLnVzZXIub3JnYW5pemF0aW9uSWQgPSBoZWFkZXJPcmdJZDtcbiAgICAgIGlmIChoZWFkZXJPcmdOYW1lKSByZXEudXNlci5vcmdhbml6YXRpb25OYW1lID0gaGVhZGVyT3JnTmFtZTtcbiAgICB9XG5cbiAgICAvLyBSZS1kZXJpdmUgdGhlIHJlcXVlc3QncyB0ZW5hbnQgaWRlbnRpdHkgZnJvbSB0aGUgTk9XLXZlcmlmaWVkIEpXVC5cbiAgICAvL1xuICAgIC8vIGBhdHRhY2hSZXF1ZXN0Q29udGV4dGAgcnVucyBhcyBhIGdsb2JhbCBtaWRkbGV3YXJlIEJFRk9SRSB0aGlzIHBlci1yb3V0ZVxuICAgIC8vIGByZXF1aXJlQXV0aGAsIHNvIGl0IGNhcHR1cmVkIGByZXEuY29udGV4dC5pZGVudGl0eWAgd2hpbGUgYHJlcS51c2VyYCB3YXNcbiAgICAvLyBzdGlsbCB1bmRlZmluZWQg4oCUIGF0IHdoaWNoIHBvaW50IGBnZXRJZGVudGl0eWAgZmFsbHMgYmFjayB0byB0aGUgcmF3LFxuICAgIC8vIGNsaWVudC1zZXR0YWJsZSBgeC1vcmctaWRgL2B4LXVzZXItaWRgIGhlYWRlcnMuIEV2ZXJ5IGRvd25zdHJlYW0gdGVuYW50LVxuICAgIC8vIGF1dGhvcml0eSBjb25zdW1lciAocmVxdWlyZU9yZ0lkLCB3aXRoVGVuYW50Q29udGV4dCdzIFJMUyBzY29wZSwgY2hlY2tRdW90YSxcbiAgICAvLyB3aXRoUm91dGUsIGFuZCB0aGUgaWRlbXBvdGVuY3kgbmFtZXNwYWNlKSByZWFkcyBgcmVxLmNvbnRleHQuaWRlbnRpdHlgLCBzb1xuICAgIC8vIHRoYXQgZnJvemVuIGhlYWRlci1kZXJpdmVkIHZhbHVlIOKAlCBub3QgdGhlIEpXVCDigJQgd2FzIGdvdmVybmluZyB0ZW5hbmN5IG9uXG4gICAgLy8gYW55IG5vbi1uZ2lueCBwYXRoLiBSZWNvbXB1dGluZyBoZXJlLCBhdCB0aGUgc2luZ2xlIHBvc3QtdmVyaWZpY2F0aW9uIGNob2tlXG4gICAgLy8gcG9pbnQsIG1ha2VzIGBnZXRJZGVudGl0eWAgcHJlZmVyIHRoZSB2ZXJpZmllZCBgcmVxLnVzZXJgIChzZWUgaWRlbnRpdHkudHMpXG4gICAgLy8gc28gdGVuYW5jeSBpcyBKV1QtYXV0aG9yaXRhdGl2ZS4gVGhlIG5naW54IGB4LW9yZy1pZGAgb3ZlcndyaXRlIHN0YXlzIGFzXG4gICAgLy8gZGVmZW5jZS1pbi1kZXB0aC4gR3VhcmRlZCBvbiBgcmVxLmNvbnRleHRgIHNvIHNlcnZpY2VzL3BhdGhzIHRoYXQgbmV2ZXJcbiAgICAvLyBhdHRhY2ggYSBjb250ZXh0IChvciBydW4gcmVxdWlyZUF1dGggcHJlLWNvbnRleHQpIGFyZSB1bmFmZmVjdGVkLlxuICAgIGNvbnN0IHJlcUN0eCA9IChyZXEgYXMgUmVxdWVzdCAmIHsgY29udGV4dD86IHsgaWRlbnRpdHk6IFJlcXVlc3RJZGVudGl0eSB9IH0pLmNvbnRleHQ7XG4gICAgaWYgKHJlcUN0eCkge1xuICAgICAgcmVxQ3R4LmlkZW50aXR5ID0gZ2V0SWRlbnRpdHkocmVxIGFzIHVua25vd24gYXMgSHR0cFJlcXVlc3QpO1xuICAgIH1cblxuICAgIC8vIFNlc3Npb24gaW52YWxpZGF0aW9uICh0b2tlbi12ZXJzaW9uIHN0b3JlICsgaW1wZXJzb25hdGlvbi1zZXNzaW9uXG4gICAgLy8gbGl2ZW5lc3MpLiBObyBzdG9yZSByZWdpc3RlcmVkIOKHkiBvbmx5IGltcGVyc29uYXRpb24gc2Vzc2lvbnMgYXJlIGNoZWNrZWQuXG4gICAgaWYgKG5lZWRzUmV2b2NhdGlvbkNoZWNrKGRlY29kZWQpKSB7XG4gICAgICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAgICAgLy8gRXhwcmVzcydzIGVycm9yIG1pZGRsZXdhcmUg4oCUIHRoaXMgYG5leHQoKWAgcnVucyBpbiBhIG1pY3JvdGFzaywgb3V0c2lkZVxuICAgICAgLy8gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaC4gVGhlIGNoZWNrIGl0c2VsZiBuZXZlciByZWplY3RzLlxuICAgICAgY2hlY2tSZXZvY2F0aW9uKGRlY29kZWQpLnRoZW4oKHJlZnVzYWwpID0+IHtcbiAgICAgICAgaWYgKHJlZnVzYWwpIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgcmVmdXNhbCwgRXJyb3JDb2RlLlRPS0VOX1JFVk9LRUQpO1xuICAgICAgICBydW5EZWZlcnJlZFF1b3RhQ2hlY2socmVxLCByZXMsIG5leHQpO1xuICAgICAgfSkuY2F0Y2gobmV4dCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGFwaUNhbGxzIGNoZWNrIGEgbW91bnQgYXJtZWQgKGFwaS1zZXJ2ZXIgYGFwaUNhbGxzUXVvdGFgKSBydW5zIGhlcmUsXG4gICAgLy8gbm93IHRoYXQgdGVuYW5jeSBpcyBKV1QtYXV0aG9yaXRhdGl2ZTsgYSBwbGFpbiBuZXh0KCkgd2hlcmUgbm9uZSB3YXMgYXJtZWQuXG4gICAgcnVuRGVmZXJyZWRRdW90YUNoZWNrKHJlcSwgcmVzLCBuZXh0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBqd3QuVG9rZW5FeHBpcmVkRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIGhhcyBleHBpcmVkJywgRXJyb3JDb2RlLlRPS0VOX0VYUElSRUQpO1xuICAgIH1cblxuICAgIC8vIFRoZSBzaWduaW5nIGtleXMgY291bGRuJ3QgYmUgZmV0Y2hlZCwgc28gdGhlIHRva2VuJ3MgdmFsaWRpdHkgaXMgVU5LTk9XTi5cbiAgICAvLyBGYWlsIENMT1NFRCB3aXRoIGEgcmV0cnlhYmxlIDUwMyDigJQgbmV2ZXIgYSBwYXNzLCBhbmQgbmV2ZXIgYSA0MDEgdGhhdFxuICAgIC8vIHdvdWxkIHNlbmQgYSBsZWdpdGltYXRlIGNsaWVudCBvZmYgdG8gcmUtYXV0aGVudGljYXRlIG92ZXIgb3VyIG91dGFnZS5cbiAgICAvLyBTYW1lIHJlYXNvbmluZyBmb3IgdGhlIFNFUlZJQ0UgY2hhaW46IG5vIHJlYWRhYmxlIGtleSBidW5kbGUgbWVhbnMgbm8gd2F5XG4gICAgLy8gdG8gdGVsbCBhIHBlZXIncyB0b2tlbiBmcm9tIGEgZm9yZ2VyeSwgc28gdGhlIHJlcXVlc3QgaXMgcmVmdXNlZCB3aXRoIGFcbiAgICAvLyByZXRyeWFibGUgNTAzIHJhdGhlciB0aGFuIGFkbWl0dGVkIG9yIGJvdW5jZWQgdG8gcmUtYXV0aGVudGljYXRlLlxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEp3a3NVbmF2YWlsYWJsZUVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgU2VydmljZUtleUVycm9yKSB7XG4gICAgICBsb2dnZXIud2FybignUmVqZWN0aW5nIHJlcXVlc3Q6IHRva2VuIHNpZ25pbmcga2V5cyB1bmF2YWlsYWJsZScsIHsgZXJyb3I6IGVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICAgJ1Rva2VuIHZlcmlmaWNhdGlvbiBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZTsgcGxlYXNlIHJldHJ5JyxcbiAgICAgICAgRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFVua25vd25LaWRFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIGp3dC5Kc29uV2ViVG9rZW5FcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCB0b2tlbicsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRoZW50aWNhdGlvbiBmYWlsZWQnLCBFcnJvckNvZGUuVU5BVVRIT1JJWkVEKTtcbiAgfVxufVxuXG4iXX0=
|
|
203
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZGRsZXdhcmUvYXV0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBUXRDLE9BQU8sR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSwyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBdUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUF3QixNQUFNLHNC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LFVBQVUsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xHLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogYHJlcXVpcmVBdXRoYDogYmVhcmVyIC8gYWNjZXNzLWtleSBhdXRoZW50aWNhdGlvbiwgdGhlIGNoZWNrcyBldmVyeVxuICogdmVyaWZpZWQgcmVxdWVzdCBwYXNzZXMsIGFuZCB0aGUgdGVuYW50IGlkZW50aXR5IGl0IGF0dGFjaGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nO1xuaW1wb3J0IHsgcmVmdXNlRm9yQXNzdXJhbmNlIH0gZnJvbSAnLi9hc3N1cmFuY2UuanMnO1xuaW1wb3J0IHsgY2xpZW50VmVyc2lvbk9mIH0gZnJvbSAnLi9jbGllbnQtdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBydW5EZWZlcnJlZFF1b3RhQ2hlY2sgfSBmcm9tICcuL2RlZmVycmVkLXF1b3RhLWNoZWNrLmpzJztcbmltcG9ydCB7IGhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMsIHZlcmlmeUJlYXJlclRva2VuIH0gZnJvbSAnLi9qd3QtdmVyaWZ5LmpzJztcbmltcG9ydCB7IHJlY29yZEF1dGh6RGVuaWFsIH0gZnJvbSAnLi9wZXJtaXNzaW9uLWdhdGVzLmpzJztcbmltcG9ydCB7IGNoZWNrUmV2b2NhdGlvbiwgaXNJbXBlcnNvbmF0aW9uV3JpdGVCbG9ja2VkLCBuZWVkc1Jldm9jYXRpb25DaGVjayB9IGZyb20gJy4vcmV2b2NhdGlvbi5qcyc7XG5pbXBvcnQgeyB0YWdSb3V0ZUdhdGUgfSBmcm9tICcuL3JvdXRlLXRhYmxlLmpzJztcbmltcG9ydCB7IGlzU2VydmljZVRva2VuRGVuaWVkLCBzZXJ2aWNlTmFtZU9mIH0gZnJvbSAnLi9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzLmpzJztcbmltcG9ydCB7IEp3a3NVbmF2YWlsYWJsZUVycm9yLCBVbmtub3duS2lkRXJyb3IgfSBmcm9tICcuLi9zZXJ2aWNlcy9qd2tzLWNhY2hlLmpzJztcbmltcG9ydCB7IFNlcnZpY2VLZXlFcnJvciwgc2VydmljZUlkZW50aXR5IH0gZnJvbSAnLi4vc2VydmljZXMvc2VydmljZS1rZXlzLmpzJztcbmltcG9ydCB7IHR5cGUgQXNzdXJhbmNlTGV2ZWwgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIdHRwUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzL2h0dHAuanMnO1xuaW1wb3J0IHsgaXNPcGFxdWVBcGlLZXkgfSBmcm9tICcuLi91dGlscy9hcGkta2V5LmpzJztcbmltcG9ydCB7IGdldEhlYWRlclN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2hlYWRlcnMuanMnO1xuaW1wb3J0IHsgZ2V0SWRlbnRpdHksIHR5cGUgUmVxdWVzdElkZW50aXR5IH0gZnJvbSAnLi4vdXRpbHMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2F1dGgtbWlkZGxld2FyZScpO1xuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlQXV0aE9wdGlvbnMge1xuICAvKipcbiAgICogQWxsb3cgeC1vcmctaWQveC1vcmctbmFtZSBoZWFkZXJzIHRvIG92ZXJyaWRlIHRoZSBKV1QncyBvcmdhbml6YXRpb24gZmllbGRzLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBgeC1vcmctaWRgL2B4LW9yZy1uYW1lYCBoZWFkZXJzIG92ZXJyaWRlIHRoZSBjYWxsZXIncyBvcmdcbiAgICog4oCUIGJ1dCBPTkxZIGZvciBhIHZlcmlmaWVkIFNZUy1BRE1JTiAoYGlzU3VwZXJBZG1pbmAgY2xhaW0pLiBGb3IgYW55IG9yZGluYXJ5XG4gICAqIGF1dGhlbnRpY2F0ZWQgdXNlciB0aGUgaGVhZGVycyBhcmUgaWdub3JlZCwgc28gZW5hYmxpbmcgdGhpcyBjYW4gbmV2ZXIgbGV0IGFcbiAgICogbm9ybWFsIHVzZXIgaW1wZXJzb25hdGUgYW5vdGhlciB0ZW5hbnQncyBvcmcuIFVzZSBmb3IgY3Jvc3Mtb3JnIGFkbWluIHRvb2xpbmdcbiAgICogKGUuZy4gYSBzeXNhZG1pbiBtYW5hZ2luZyBhIGdpdmVuIG9yZydzIGJpbGxpbmcpLiBJZiB1bnN1cmUsIGxlYXZlIGl0IGRpc2FibGVkLlxuICAgKi9cbiAgYWxsb3dPcmdIZWFkZXJPdmVycmlkZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEZW1hbmQgdGhhdCB0aGUgd2hvbGUgU0VTU0lPTiBiZSBhdCBsZWFzdCB0aGlzIGFzc3VyYW5jZSBsZXZlbC5cbiAgICpcbiAgICogYG1pbkFzc3VyYW5jZTogMmAgbWVhbnMgdGhlIHBlcnNvbiBhdXRoZW50aWNhdGVkIHdpdGggYSBzZWNvbmQgZmFjdG9yIOKAlCBhXG4gICAqIHBhc3NrZXkgd2l0aCB1c2VyIHZlcmlmaWNhdGlvbiwgYSBwYXNzd29yZCBwbHVzIGFuIGF1dGhlbnRpY2F0b3IgY29kZSwgb3JcbiAgICogU1NPIHRocm91Z2ggYW4gSWRQIHRoZSBvcmcgbWFya2VkIGFzIGVuZm9yY2luZyBNRkEuIEEgd2Vha2VyIHRva2VuIGdldHNcbiAgICogKio0MDEgYE1GQV9SRVFVSVJFRGAqKiwgd2hpY2ggdGhlIGNsaWVudCBhbnN3ZXJzIGJ5IHNlbmRpbmcgdGhlIHBlcnNvbiB0b1xuICAgKiBlbnJvbG1lbnQgb3IgdG8gYSBzdHJvbmdlciBzaWduLWluOyByZWZyZXNoaW5nIGNhbm5vdCBoZWxwLCBiZWNhdXNlIGBhYWxgXG4gICAqIGxpdmVzIG9uIHRoZSBzZXNzaW9uIHNsb3QgYW5kIGEgcmVmcmVzaCBuZXZlciByYWlzZXMgaXQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFNFU1NJT04tbGV2ZWwgY291bnRlcnBhcnQgdG8ge0BsaW5rIHJlcXVpcmVTdGVwVXB9LCB3aGljaCBzdGF5c1xuICAgKiBhIGZyZXNoLCBwZXItYWN0aW9uIGNvbmZpcm1hdGlvbi4gVXNlIGJvdGggb24gdGhlIG1vc3QgZGFuZ2Vyb3VzIHJvdXRlcy5cbiAgICpcbiAgICogTUFDSElORVMgTkVWRVIgU0FUSVNGWSBJVC4gQSBzZXJ2aWNlIHByaW5jaXBhbCwgYW4gb3JnIHNlcnZpY2UgYWNjb3VudCBhbmRcbiAgICogYW4gZXhjaGFuZ2VkIGFjY2VzcyBrZXkgYWxsIGdldCAqKjQwMyBgSFVNQU5fU0VTU0lPTl9SRVFVSVJFRGAqKiDigJQgdGhlcmUgaXNcbiAgICogbm8gcGVyc29uIGJlaGluZCB0aGVtIHRvIGhhdmUgcHJlc2VudGVkIGEgZmFjdG9yLCBzbyBcImFzc3VyYW5jZVwiIGlzIG5vdCBhXG4gICAqIHF1ZXN0aW9uIHRoZWlyIGNyZWRlbnRpYWwgY2FuIGFuc3dlci4gVGhhdCBpcyBkZWxpYmVyYXRlbHkgbm90IGEgc2lsZW50XG4gICAqIHBhc3MtdGhyb3VnaCBmb3IgaW50ZXJuYWwgc2VydmljZXM6IGEgcm91dGUgdGhhdCBkZW1hbmRzIE1GQSBpcyBhIHJvdXRlIGFcbiAgICogaHVtYW4gaXMgZG9pbmcgc29tZXRoaW5nIGRhbmdlcm91cyBvbi5cbiAgICovXG4gIG1pbkFzc3VyYW5jZT86IEFzc3VyYW5jZUxldmVsO1xuICAvKipcbiAgICogV2l0aCB7QGxpbmsgbWluQXNzdXJhbmNlfSwgYWRkaXRpb25hbGx5IGJvdW5kIGhvdyBsb25nIGFnbyB0aGF0IHNpZ24taW5cbiAgICogaGFwcGVuZWQgKHNlY29uZHMsIGNvbXBhcmVkIGFnYWluc3QgdGhlIHRva2VuJ3MgYGF1dGhfdGltZWApLiBBIHNlc3Npb24gdGhhdFxuICAgKiBpcyBNRkEtZ3JhZGUgYnV0IG9sZGVyIHRoYW4gdGhpcyBnZXRzICoqNDAxIGBSRUFVVEhfUkVRVUlSRURgKiouIElnbm9yZWRcbiAgICogd2l0aG91dCBgbWluQXNzdXJhbmNlYCDigJQgXCJob3cgcmVjZW50XCIgaXMgb25seSBtZWFuaW5nZnVsIG9uY2UgXCJob3cgc3Ryb25nXCJcbiAgICogaXMgYmVpbmcgYXNrZWQuXG4gICAqL1xuICBtYXhBZ2U/OiBudW1iZXI7XG59XG5cbi8qKiBKV1QgYXV0aCBtaWRkbGV3YXJlLiBVc2UgZGlyZWN0bHkgb3IgY2FsbCB3aXRoIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgb3B0aW9ucz86IFJlcXVpcmVBdXRoT3B0aW9ucyxcbik6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxT3JPcHRpb25zPzogUmVxdWVzdCB8IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVzPzogUmVzcG9uc2UsXG4gIG5leHQ/OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHwgKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCkge1xuICBpZiAocmVxT3JPcHRpb25zICYmIHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVBdXRoKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAocmVxT3JPcHRpb25zIGFzIFJlcXVpcmVBdXRoT3B0aW9ucykgfHwge307XG4gIGNvbnN0IGdhdGUgPSB0YWdSb3V0ZUdhdGUoKHJlcTogUmVxdWVzdCwgcmVzSW5uZXI6IFJlc3BvbnNlLCBuZXh0SW5uZXI6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIF9yZXF1aXJlQXV0aChvcHRpb25zLCByZXEsIHJlc0lubmVyLCBuZXh0SW5uZXIpO1xuICB9LCB7IGtpbmQ6ICdhdXRoJyB9KTtcbiAgaWYgKG9wdGlvbnMubWluQXNzdXJhbmNlKSB7XG4gICAgdGFnUm91dGVHYXRlKGdhdGUsIHsga2luZDogJ2Fzc3VyYW5jZScsIG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSk7XG4gIH1cbiAgcmV0dXJuIGdhdGU7XG59XG50YWdSb3V0ZUdhdGUocmVxdWlyZUF1dGgsIHsga2luZDogJ2F1dGgnIH0pO1xuXG5mdW5jdGlvbiBfcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb247XG5cbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aG9yaXphdGlvbiBoZWFkZXIgcmVxdWlyZWQnLCBFcnJvckNvZGUuVE9LRU5fTUlTU0lORyk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IGF1dGhIZWFkZXIuc3BsaXQoJyAnKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMiB8fCBwYXJ0c1swXSAhPT0gJ0JlYXJlcicpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIGF1dGhvcml6YXRpb24gZm9ybWF0LiBVc2U6IEJlYXJlciA8dG9rZW4+JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG5cbiAgLy8gQW4gT1BBUVVFIEFDQ0VTUyBLRVkgKGBwYl9wYXRf4oCmYCAvIGBwYl9zYV/igKZgKSBjYXJyaWVzIG5vIGNsYWltcyBhbmQgbm9cbiAgLy8gc2lnbmF0dXJlLCBzbyBpdCBjYW5ub3QgYmUgdmVyaWZpZWQgaGVyZS4gVHJhZGUgaXQgYXQgcGxhdGZvcm0gZm9yIGFcbiAgLy8gc2hvcnQtbGl2ZWQgSldUIChjYWNoZWQgaW4tcHJvY2VzcyB1bnRpbCBpdCBleHBpcmVzKSBhbmQgdGhlbiB2ZXJpZnkgdGhhdFxuICAvLyBKV1Qgb24gdGhlIG5vcm1hbCBwYXRoIOKAlCBzZXJ2aWNlcyBuZXZlciByZWFkIGEga2V5IGhhc2guIFNlZVxuICAvLyBgc2VydmljZXMvYXBpLWtleS1leGNoYW5nZS50c2AuXG4gIGlmIChpc09wYXF1ZUFwaUtleShwYXJ0c1sxXSkpIHtcbiAgICB2b2lkIHJlc29sdmVBcGlLZXkob3B0aW9ucywgcGFydHNbMV0sIHJlcSwgcmVzLCBuZXh0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgdmVyaWZpY2F0aW9uIGl0c2VsZiBuZXZlciByZWplY3RzIChpdCBtYXBzXG4gIC8vIGV2ZXJ5IGZhaWx1cmUgdG8gYSByZXNwb25zZSkuXG4gIHZvaWQgdmVyaWZ5QW5kQXR0YWNoKG9wdGlvbnMsIHBhcnRzWzFdLCByZXEsIHJlcywgbmV4dCkuY2F0Y2gobmV4dCk7XG59XG5cbi8qKlxuICogRXhjaGFuZ2UgYW4gb3BhcXVlIGtleSBmb3IgYSBKV1QsIHRoZW4gY29udGludWUgb24gdGhlIG5vcm1hbCB2ZXJpZmljYXRpb25cbiAqIHBhdGguIEEgcmVmdXNlZCBrZXkgaXMgYSA0MDE7IGFuIHVucmVhY2hhYmxlIHBsYXRmb3JtIGlzIGEgNTAzIChuZXZlciBhIHBhc3Mg4oCUXG4gKiBhbiB1bnZlcmlmaWFibGUgY3JlZGVudGlhbCBpcyBub3QgYW4gaWRlbnRpdHkpLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpS2V5KFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIGtleTogc3RyaW5nLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMb2FkZWQgTEFaSUxZLCBvbiB0aGUgZmlyc3Qga2V5IGV2ZXIgcHJlc2VudGVkLiBBIHN0YXRpYyBpbXBvcnQgd291bGQgcHV0XG4gIC8vIHRoZSBIVFRQIGNsaWVudCAoYW5kIHBsYXRmb3JtJ3MgYWRkcmVzcykgaW50byB0aGUgaW1wb3J0IGdyYXBoIG9mIGV2ZXJ5XG4gIC8vIG1vZHVsZSB0aGF0IG1lcmVseSB1c2VzIGByZXF1aXJlQXV0aGAsIHdoaWNoIGJvdGggd2lkZW5zIHRoZSBib290IGdyYXBoIGFuZFxuICAvLyBicmVha3MgYW55IHRlc3QgdGhhdCBtb2NrcyBgaHR0cC1jbGllbnQuanNgIHdpdGggYSBwYXJ0aWFsIG1vZHVsZS5cbiAgY29uc3QgeyBleGNoYW5nZUFwaUtleSwgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL2FwaS1rZXktZXhjaGFuZ2UuanMnKTtcbiAgbGV0IHRva2VuOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgdG9rZW4gPSBhd2FpdCBleGNoYW5nZUFwaUtleShrZXksIGNsaWVudFZlcnNpb25PZihyZXEpKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgICAnQWNjZXNzLWtleSB2ZXJpZmljYXRpb24gaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGU7IHBsZWFzZSByZXRyeScsXG4gICAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnSW52YWxpZCBvciByZXZva2VkIGFjY2VzcyBrZXknLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cbiAgYXdhaXQgdmVyaWZ5QW5kQXR0YWNoKG9wdGlvbnMsIHRva2VuLCByZXEsIHJlcywgbmV4dCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeUFuZEF0dGFjaChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByYXdUb2tlbjogc3RyaW5nLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4ge1xuICB0cnkge1xuICAgIC8vIFR3byBjaGFpbnMsIG9uZSBlbnRyeSBwb2ludCAoc2VlIGB2ZXJpZnlCZWFyZXJUb2tlbmApOiBhIHVzZXIgdG9rZW4gbXVzdFxuICAgIC8vIGJlIEVTMjU2IHNpZ25lZCBieSBwbGF0Zm9ybSBhbmQgdmVyaWZpZWQgYWdhaW5zdCBpdHMgcHVibGlzaGVkIEpXS1M7IGFuXG4gICAgLy8gaW50ZXJuYWwgc2VydmljZSB0b2tlbiBtdXN0IGJlIEVTMjU2IHNpZ25lZCBieSB0aGF0IHNlcnZpY2UncyBPV04ga2V5IGFuZFxuICAgIC8vIGRlY2xhcmUgaXRzZWxmIGEgc2VydmljZSBwcmluY2lwYWwuIEJvdGggcGluIHRoZSBhbGdvcml0aG0gKG5vXG4gICAgLy8gYWxnLWNvbmZ1c2lvbiwgbm8gYGFsZzpub25lYCkgYW5kIGJvdGggYXBwbHkgdGhlIG9wdGlvbmFsIGlzc3Vlci9hdWRpZW5jZVxuICAgIC8vIGJpbmRpbmcuXG4gICAgY29uc3QgZGVjb2RlZCA9IGF3YWl0IHZlcmlmeUJlYXJlclRva2VuKHJhd1Rva2VuKTtcblxuICAgIGlmIChkZWNvZGVkLnR5cGUgIT09ICdhY2Nlc3MnKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdPbmx5IGFjY2VzcyB0b2tlbnMgY2FuIGJlIHVzZWQgZm9yIEFQSSByZXF1ZXN0cycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICBpZiAoIWRlY29kZWQuc3ViIHx8ICFkZWNvZGVkLnJvbGUgfHwgIWhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMoZGVjb2RlZCkpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1Rva2VuIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIC8vIFNlcnZpY2UtdG9rZW4ga2lsbC1zd2l0Y2g6IHJlamVjdCBhIHNlcnZpY2UgcHJpbmNpcGFsIHdob3NlIHNlcnZpY2UgaGFzXG4gICAgLy8gYmVlbiBhZGRlZCB0byB0aGUgZGVueWxpc3QuIE90aGVyd2lzZSB0aGUgb25seSB3YXkgdG8gaW52YWxpZGF0ZSBhXG4gICAgLy8gc2VydmljZSdzIHRva2VucyBiZWZvcmUgdGhlaXIgKHNob3J0KSBUVEwgaXMgcm90YXRpbmcgdGhhdCBzZXJ2aWNlJ3NcbiAgICAvLyBzaWduaW5nIGtleTsgdGhpcyBjdXRzIG9uZSBjb21wcm9taXNlZC9yb2d1ZSBzZXJ2aWNlIG9mZiBpbW1lZGlhdGVseS4gTygxKSBTZXQgbG9va3VwLCB6ZXJvIGNvc3Qgd2hlbiB0aGUgZGVueWxpc3RcbiAgICAvLyBpcyBlbXB0eSAodGhlIGRlZmF1bHQpLCBzbyBpdCBuZXZlciB0YXhlcyB0aGUgUzJTIGhvdCBwYXRoIHVubGVzcyBhcm1lZC5cbiAgICBpZiAoaXNTZXJ2aWNlVG9rZW5EZW5pZWQoZGVjb2RlZCkpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdzZXJ2aWNlX3Rva2VuX2RlbmllZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZU5hbWVPZihkZWNvZGVkKSA/PyAndW5rbm93bicgfSk7XG4gICAgICBsb2dnZXIud2FybignUmVqZWN0ZWQgZGVueWxpc3RlZCBzZXJ2aWNlIHRva2VuJywgeyBzdWI6IGRlY29kZWQuc3ViIH0pO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnU2VydmljZSB0b2tlbiByZXZva2VkJywgRXJyb3JDb2RlLlRPS0VOX1JFVk9LRUQpO1xuICAgIH1cblxuICAgIHJlcS51c2VyID0geyAuLi5kZWNvZGVkIH07XG5cbiAgICAvLyBSRUFELU9OTFkgSU1QRVJTT05BVElPTi4gVGhlIHRva2VuIG5hbWVzIHRoZSBvcGVyYXRvciBBTkQgc2F5cyBpdCBtYXkgb25seVxuICAgIC8vIGxvb2s6IGV2ZXJ5IHNlcnZpY2UgcmVmdXNlcyBhIHN0YXRlIGNoYW5nZSB1bmRlciBpdCwgbm90IG9ubHkgcGxhdGZvcm0g4oCUXG4gICAgLy8gYSBzdXBwb3J0IHNlc3Npb24gdGhhdCBjb3VsZCB3cml0ZSB0byBwbHVnaW4vY29tcGxpYW5jZS9iaWxsaW5nIGlzIG5vdFxuICAgIC8vIHJlYWQtb25seS4gQ2hlY2tlZCBiZWZvcmUgYW55IG90aGVyIGdhdGUgc28gbm8gcm91dGUgY2FuIGZvcmdldCBpdC5cbiAgICBpZiAoaXNJbXBlcnNvbmF0aW9uV3JpdGVCbG9ja2VkKHJlcS5tZXRob2QsIGRlY29kZWQpKSB7XG4gICAgICBpZiAocmVxLm1ldGhvZCkgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCAnaW1wZXJzb25hdGlvbi1yZWFkLW9ubHknKTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgICdXcml0ZSByZXF1ZXN0cyBhcmUgZGlzYWJsZWQgZHVyaW5nIHJlYWQtb25seSBpbXBlcnNvbmF0aW9uLiBTdG9wIGltcGVyc29uYXRpbmcgdG8gbWFrZSBjaGFuZ2VzLicsXG4gICAgICAgIEVycm9yQ29kZS5JTVBFUlNPTkFUSU9OX1JFQURfT05MWSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQk9PVFNUUkFQLUFETUlOIEVOUk9MTUVOVCBTRVNTSU9OLiBTdWNoIGEgdG9rZW4gZXhpc3RzIHNvXG4gICAgLy8gdGhlIGluc3RhbGwncyBvbmx5IGFkbWluIGNhbiBlbnJvbCBhIGZhY3RvcjsgaXQgaXMgYGFhbDogMWAgYW5kIG11c3Qgbm90XG4gICAgLy8gcmVhY2ggYW55dGhpbmcgZWxzZS4gUGxhdGZvcm0g4oCUIHdoaWNoIG93bnMgdGhlIGV4Y2VwdGlvbiBhbmQga25vd3Mgd2hpY2hcbiAgICAvLyBvZiBpdHMgb3duIHJvdXRlcyBgaW5pdC1wbGF0Zm9ybS5zaGAgY2FsbHMg4oCUIGFsbG93cyBhbiBleHBsaWNpdCBmZXcgYmVmb3JlXG4gICAgLy8gdGhpcyBwb2ludCAoc2VlIGl0cyBvd24gYHJlcXVpcmVBdXRoYCk7IGluIEVWRVJZIG90aGVyIHNlcnZpY2UgdGhlIGFuc3dlclxuICAgIC8vIGlzIHNpbXBseSBubywgc28gdGhlIHJlYWNoIHJlc3RyaWN0aW9uIGhvbGRzIHdpdGhvdXQgYSBwZXItc2VydmljZVxuICAgIC8vIGFsbG93bGlzdCB0byBrZWVwIGluIHN5bmMuXG4gICAgaWYgKGRlY29kZWQubWZhRW5yb2xsbWVudFBlbmRpbmcgPT09IHRydWUpIHtcbiAgICAgIGVtaXRDb3VudGVyKCdtZmFfZW5mb3JjZW1lbnRfcmVmdXNlZF90b3RhbCcsIHsgc2VydmljZTogc2VydmljZUlkZW50aXR5KCksIHJlYXNvbjogJ2Jvb3RzdHJhcF9zZXNzaW9uJyB9KTtcbiAgICAgIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ21mYS1lbnJvbG1lbnQnKTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5GT1JCSURERU4sXG4gICAgICAgICdGaW5pc2ggc2V0dGluZyB1cCB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGJlZm9yZSB1c2luZyB0aGUgcmVzdCBvZiBQaXBlbGluZSBCdWlsZGVyJyxcbiAgICAgICAgRXJyb3JDb2RlLk1GQV9FTlJPTExNRU5UX1JFUVVJUkVELFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTZXNzaW9uLWxldmVsIGFzc3VyYW5jZSAoYHJlcXVpcmVBdXRoKHsgbWluQXNzdXJhbmNlLCBtYXhBZ2UgfSlgKS5cbiAgICBpZiAob3B0aW9ucy5taW5Bc3N1cmFuY2VcbiAgICAgICYmIHJlZnVzZUZvckFzc3VyYW5jZSh7IG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSwgZGVjb2RlZCwgcmVxLCByZXMpKSByZXR1cm47XG5cbiAgICAvLyBUaGUgeC1vcmctaWQveC1vcmctbmFtZSBvdmVycmlkZSBsZXRzIGEgU1lTLUFETUlOIGFjdCBvbiBhIGNob3NlbiBvcmdcbiAgICAvLyAoY3Jvc3Mtb3JnIGFkbWluIHRvb2xpbmcpLiBJdCBpcyBnYXRlZCBvbiB0aGUgdmVyaWZpZWQgYGlzU3VwZXJBZG1pbmAgY2xhaW1cbiAgICAvLyBoZXJlIHNvIHRoYXQgZXZlbiBhIHJvdXRlIHdoaWNoIG1pc3Rha2VubHkgZW5hYmxlcyBgYWxsb3dPcmdIZWFkZXJPdmVycmlkZWBcbiAgICAvLyBjYW4gTkVWRVIgbGV0IGFuIG9yZGluYXJ5IGF1dGhlbnRpY2F0ZWQgdXNlciBzcG9vZiBhbm90aGVyIHRlbmFudCdzIG9yZyB2aWFcbiAgICAvLyB0aGUgaGVhZGVyIOKAlCBkZWZlbmNlLWluLWRlcHRoIGFnYWluc3QgdGhlIGNyb3NzLXRlbmFudCBicmVhayB0aGlzIGNhdXNlZC5cbiAgICBpZiAob3B0aW9ucy5hbGxvd09yZ0hlYWRlck92ZXJyaWRlICYmIGRlY29kZWQuaXNTdXBlckFkbWluID09PSB0cnVlKSB7XG4gICAgICBjb25zdCBoZWFkZXJPcmdJZCA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctaWQnXSk7XG4gICAgICBjb25zdCBoZWFkZXJPcmdOYW1lID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1uYW1lJ10pO1xuICAgICAgaWYgKGhlYWRlck9yZ0lkKSByZXEudXNlci5vcmdhbml6YXRpb25JZCA9IGhlYWRlck9yZ0lkO1xuICAgICAgaWYgKGhlYWRlck9yZ05hbWUpIHJlcS51c2VyLm9yZ2FuaXphdGlvbk5hbWUgPSBoZWFkZXJPcmdOYW1lO1xuICAgIH1cblxuICAgIC8vIFJlLWRlcml2ZSB0aGUgcmVxdWVzdCdzIHRlbmFudCBpZGVudGl0eSBmcm9tIHRoZSBOT1ctdmVyaWZpZWQgSldULlxuICAgIC8vXG4gICAgLy8gYGF0dGFjaFJlcXVlc3RDb250ZXh0YCBydW5zIGFzIGEgZ2xvYmFsIG1pZGRsZXdhcmUgQkVGT1JFIHRoaXMgcGVyLXJvdXRlXG4gICAgLy8gYHJlcXVpcmVBdXRoYCwgc28gaXQgY2FwdHVyZWQgYHJlcS5jb250ZXh0LmlkZW50aXR5YCB3aGlsZSBgcmVxLnVzZXJgIHdhc1xuICAgIC8vIHN0aWxsIHVuZGVmaW5lZCDigJQgYXQgd2hpY2ggcG9pbnQgYGdldElkZW50aXR5YCBmYWxscyBiYWNrIHRvIHRoZSByYXcsXG4gICAgLy8gY2xpZW50LXNldHRhYmxlIGB4LW9yZy1pZGAvYHgtdXNlci1pZGAgaGVhZGVycy4gRXZlcnkgZG93bnN0cmVhbSB0ZW5hbnQtXG4gICAgLy8gYXV0aG9yaXR5IGNvbnN1bWVyIChyZXF1aXJlT3JnSWQsIHdpdGhUZW5hbnRDb250ZXh0J3MgUkxTIHNjb3BlLCBjaGVja1F1b3RhLFxuICAgIC8vIHdpdGhSb3V0ZSwgYW5kIHRoZSBpZGVtcG90ZW5jeSBuYW1lc3BhY2UpIHJlYWRzIGByZXEuY29udGV4dC5pZGVudGl0eWAsIHNvXG4gICAgLy8gdGhhdCBmcm96ZW4gaGVhZGVyLWRlcml2ZWQgdmFsdWUg4oCUIG5vdCB0aGUgSldUIOKAlCB3YXMgZ292ZXJuaW5nIHRlbmFuY3kgb25cbiAgICAvLyBhbnkgbm9uLW5naW54IHBhdGguIFJlY29tcHV0aW5nIGhlcmUsIGF0IHRoZSBzaW5nbGUgcG9zdC12ZXJpZmljYXRpb24gY2hva2VcbiAgICAvLyBwb2ludCwgbWFrZXMgYGdldElkZW50aXR5YCBwcmVmZXIgdGhlIHZlcmlmaWVkIGByZXEudXNlcmAgKHNlZSBpZGVudGl0eS50cylcbiAgICAvLyBzbyB0ZW5hbmN5IGlzIEpXVC1hdXRob3JpdGF0aXZlLiBUaGUgbmdpbnggYHgtb3JnLWlkYCBvdmVyd3JpdGUgc3RheXMgYXNcbiAgICAvLyBkZWZlbmNlLWluLWRlcHRoLiBHdWFyZGVkIG9uIGByZXEuY29udGV4dGAgc28gc2VydmljZXMvcGF0aHMgdGhhdCBuZXZlclxuICAgIC8vIGF0dGFjaCBhIGNvbnRleHQgKG9yIHJ1biByZXF1aXJlQXV0aCBwcmUtY29udGV4dCkgYXJlIHVuYWZmZWN0ZWQuXG4gICAgY29uc3QgcmVxQ3R4ID0gKHJlcSBhcyBSZXF1ZXN0ICYgeyBjb250ZXh0PzogeyBpZGVudGl0eTogUmVxdWVzdElkZW50aXR5IH0gfSkuY29udGV4dDtcbiAgICBpZiAocmVxQ3R4KSB7XG4gICAgICByZXFDdHguaWRlbnRpdHkgPSBnZXRJZGVudGl0eShyZXEgYXMgdW5rbm93biBhcyBIdHRwUmVxdWVzdCk7XG4gICAgfVxuXG4gICAgLy8gU2Vzc2lvbiBpbnZhbGlkYXRpb24gKHRva2VuLXZlcnNpb24gc3RvcmUgKyBpbXBlcnNvbmF0aW9uLXNlc3Npb25cbiAgICAvLyBsaXZlbmVzcykuIE5vIHN0b3JlIHJlZ2lzdGVyZWQg4oeSIG9ubHkgaW1wZXJzb25hdGlvbiBzZXNzaW9ucyBhcmUgY2hlY2tlZC5cbiAgICBpZiAobmVlZHNSZXZvY2F0aW9uQ2hlY2soZGVjb2RlZCkpIHtcbiAgICAgIC8vIGAuY2F0Y2gobmV4dClgIGZvcndhcmRzIGEgRE9XTlNUUkVBTSBzeW5jaHJvbm91cyB0aHJvdyBmcm9tIGBuZXh0KClgIHRvXG4gICAgICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgdGhpcyBgbmV4dCgpYCBydW5zIGluIGEgbWljcm90YXNrLCBvdXRzaWRlXG4gICAgICAvLyB0aGUgc3Vycm91bmRpbmcgdHJ5L2NhdGNoLiBUaGUgY2hlY2sgaXRzZWxmIG5ldmVyIHJlamVjdHMuXG4gICAgICBjaGVja1Jldm9jYXRpb24oZGVjb2RlZCkudGhlbigocmVmdXNhbCkgPT4ge1xuICAgICAgICBpZiAocmVmdXNhbCkgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCByZWZ1c2FsLCBFcnJvckNvZGUuVE9LRU5fUkVWT0tFRCk7XG4gICAgICAgIHJ1bkRlZmVycmVkUXVvdGFDaGVjayhyZXEsIHJlcywgbmV4dCk7XG4gICAgICB9KS5jYXRjaChuZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgYXBpQ2FsbHMgY2hlY2sgYSBtb3VudCBhcm1lZCAoYXBpLXNlcnZlciBgYXBpQ2FsbHNRdW90YWApIHJ1bnMgaGVyZSxcbiAgICAvLyBub3cgdGhhdCB0ZW5hbmN5IGlzIEpXVC1hdXRob3JpdGF0aXZlOyBhIHBsYWluIG5leHQoKSB3aGVyZSBub25lIHdhcyBhcm1lZC5cbiAgICBydW5EZWZlcnJlZFF1b3RhQ2hlY2socmVxLCByZXMsIG5leHQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIGp3dC5Ub2tlbkV4cGlyZWRFcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnVG9rZW4gaGFzIGV4cGlyZWQnLCBFcnJvckNvZGUuVE9LRU5fRVhQSVJFRCk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHNpZ25pbmcga2V5cyBjb3VsZG4ndCBiZSBmZXRjaGVkLCBzbyB0aGUgdG9rZW4ncyB2YWxpZGl0eSBpcyBVTktOT1dOLlxuICAgIC8vIEZhaWwgQ0xPU0VEIHdpdGggYSByZXRyeWFibGUgNTAzIOKAlCBuZXZlciBhIHBhc3MsIGFuZCBuZXZlciBhIDQwMSB0aGF0XG4gICAgLy8gd291bGQgc2VuZCBhIGxlZ2l0aW1hdGUgY2xpZW50IG9mZiB0byByZS1hdXRoZW50aWNhdGUgb3ZlciBvdXIgb3V0YWdlLlxuICAgIC8vIFNhbWUgcmVhc29uaW5nIGZvciB0aGUgU0VSVklDRSBjaGFpbjogbm8gcmVhZGFibGUga2V5IGJ1bmRsZSBtZWFucyBubyB3YXlcbiAgICAvLyB0byB0ZWxsIGEgcGVlcidzIHRva2VuIGZyb20gYSBmb3JnZXJ5LCBzbyB0aGUgcmVxdWVzdCBpcyByZWZ1c2VkIHdpdGggYVxuICAgIC8vIHJldHJ5YWJsZSA1MDMgcmF0aGVyIHRoYW4gYWRtaXR0ZWQgb3IgYm91bmNlZCB0byByZS1hdXRoZW50aWNhdGUuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSndrc1VuYXZhaWxhYmxlRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBTZXJ2aWNlS2V5RXJyb3IpIHtcbiAgICAgIGxvZ2dlci53YXJuKCdSZWplY3RpbmcgcmVxdWVzdDogdG9rZW4gc2lnbmluZyBrZXlzIHVuYXZhaWxhYmxlJywgeyBlcnJvcjogZXJyb3IubWVzc2FnZSB9KTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IoXG4gICAgICAgIHJlcywgSHR0cFN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgICAnVG9rZW4gdmVyaWZpY2F0aW9uIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlOyBwbGVhc2UgcmV0cnknLFxuICAgICAgICBFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgVW5rbm93bktpZEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2Ygand0Lkpzb25XZWJUb2tlbkVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIHRva2VuJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCcsIEVycm9yQ29kZS5VTkFVVEhPUklaRUQpO1xuICB9XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Request, RequestHandler } from 'express';
|
|
2
|
+
/** Sent by pipeline-manager on every platform call: its own version. */
|
|
3
|
+
export declare const CLIENT_VERSION_HEADER = "X-Pb-Client-Version";
|
|
4
|
+
/** Answered on every response to a versioned client while a minimum is set. */
|
|
5
|
+
export declare const MIN_CLIENT_VERSION_HEADER = "X-Pb-Min-Client-Version";
|
|
6
|
+
/** Requests per CLI version — what is still in use before raising the minimum. */
|
|
7
|
+
export declare const CLIENT_REQUESTS_METRIC = "pipeline_manager_requests_total";
|
|
8
|
+
/** 426s answered — raising the minimum shows as a visible spike, not silent failures. */
|
|
9
|
+
export declare const CLIENT_UPGRADE_REQUIRED_METRIC = "pipeline_manager_upgrade_required_total";
|
|
10
|
+
/**
|
|
11
|
+
* A CodeBuild step (pipeline-manager forwards `X-CodeBuild-Build-Id` there) runs
|
|
12
|
+
* the CLI baked into a plugin image: it can't `--upgrade` itself, so refusing
|
|
13
|
+
* it would break every org's pipelines until their images were rebuilt.
|
|
14
|
+
* Counted (`caller="ci"`), never refused. The header is caller-set, so this is
|
|
15
|
+
* no weaker than the gate already is — a compatibility gate, NOT a security
|
|
16
|
+
* control (a CLI can omit or overstate its version; a vulnerable version is
|
|
17
|
+
* shut out by revoking tokens, never by this).
|
|
18
|
+
*/
|
|
19
|
+
export declare const CI_CALLER_HEADER = "X-CodeBuild-Build-Id";
|
|
20
|
+
/** Distinct `version` label values one process will emit before folding the rest into `other`. */
|
|
21
|
+
export declare const MAX_VERSION_LABELS = 64;
|
|
22
|
+
/** `x.y.z` of a version (prerelease / build dropped). */
|
|
23
|
+
export declare function versionLabel(v: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* The CLI version a request CLAIMS (`X-Pb-Client-Version`), or undefined when
|
|
26
|
+
* absent / not a semver. Caller-set and unverified: fit for display and
|
|
27
|
+
* compatibility ("which CLI does this key still use"), never for a decision
|
|
28
|
+
* about access.
|
|
29
|
+
*/
|
|
30
|
+
export declare function clientVersionOf(req: Pick<Request, 'headers'>): string | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Refuse a pipeline-manager CLI older than `PIPELINE_MANAGER_MIN_VERSION`
|
|
33
|
+
* with 426 `CLIENT_UPGRADE_REQUIRED`, so an API change surfaces as "run
|
|
34
|
+
* `pipeline-manager --upgrade`" rather than as a confusing 400 or a silently
|
|
35
|
+
* misread response.
|
|
36
|
+
*
|
|
37
|
+
* - Unset / blank minimum: nothing is refused (the default); versions are still counted.
|
|
38
|
+
* - A request WITHOUT the version header passes: browsers, other clients and
|
|
39
|
+
* CLIs released before the header existed are not identified, so they are
|
|
40
|
+
* not gated. Forward-only, by design.
|
|
41
|
+
* - A CI caller (CodeBuild) is counted but never refused — see {@link CI_CALLER_HEADER}.
|
|
42
|
+
* - A malformed header value passes too (nothing to compare), but a malformed
|
|
43
|
+
* MINIMUM throws at startup: a typo must not silently disable the gate.
|
|
44
|
+
*/
|
|
45
|
+
export declare function clientVersionGate(minVersion?: string | undefined): RequestHandler;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { ErrorCode } from '../types/error-codes.js';
|
|
4
|
+
import { emitCounter } from '../utils/metric-emitter.js';
|
|
5
|
+
import { sendError } from '../utils/response.js';
|
|
6
|
+
import { compareSemver, isSemver } from '../utils/semver.js';
|
|
7
|
+
/** Sent by pipeline-manager on every platform call: its own version. */
|
|
8
|
+
export const CLIENT_VERSION_HEADER = 'X-Pb-Client-Version';
|
|
9
|
+
/** Answered on every response to a versioned client while a minimum is set. */
|
|
10
|
+
export const MIN_CLIENT_VERSION_HEADER = 'X-Pb-Min-Client-Version';
|
|
11
|
+
/** Requests per CLI version — what is still in use before raising the minimum. */
|
|
12
|
+
export const CLIENT_REQUESTS_METRIC = 'pipeline_manager_requests_total';
|
|
13
|
+
/** 426s answered — raising the minimum shows as a visible spike, not silent failures. */
|
|
14
|
+
export const CLIENT_UPGRADE_REQUIRED_METRIC = 'pipeline_manager_upgrade_required_total';
|
|
15
|
+
/**
|
|
16
|
+
* A CodeBuild step (pipeline-manager forwards `X-CodeBuild-Build-Id` there) runs
|
|
17
|
+
* the CLI baked into a plugin image: it can't `--upgrade` itself, so refusing
|
|
18
|
+
* it would break every org's pipelines until their images were rebuilt.
|
|
19
|
+
* Counted (`caller="ci"`), never refused. The header is caller-set, so this is
|
|
20
|
+
* no weaker than the gate already is — a compatibility gate, NOT a security
|
|
21
|
+
* control (a CLI can omit or overstate its version; a vulnerable version is
|
|
22
|
+
* shut out by revoking tokens, never by this).
|
|
23
|
+
*/
|
|
24
|
+
export const CI_CALLER_HEADER = 'X-CodeBuild-Build-Id';
|
|
25
|
+
/** Distinct `version` label values one process will emit before folding the rest into `other`. */
|
|
26
|
+
export const MAX_VERSION_LABELS = 64;
|
|
27
|
+
const seenVersions = new Set();
|
|
28
|
+
/** `x.y.z` of a version (prerelease / build dropped). */
|
|
29
|
+
export function versionLabel(v) {
|
|
30
|
+
return v.replace(/^v/, '').split(/[-+]/, 1)[0];
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The `version` label for a request. The gate runs BEFORE auth, so the header
|
|
34
|
+
* is attacker-controlled: past {@link MAX_VERSION_LABELS} distinct values a
|
|
35
|
+
* new one counts as `other`, keeping Prometheus cardinality bounded.
|
|
36
|
+
*/
|
|
37
|
+
function boundedVersionLabel(v) {
|
|
38
|
+
const label = versionLabel(v);
|
|
39
|
+
if (seenVersions.has(label))
|
|
40
|
+
return label;
|
|
41
|
+
if (seenVersions.size >= MAX_VERSION_LABELS)
|
|
42
|
+
return 'other';
|
|
43
|
+
seenVersions.add(label);
|
|
44
|
+
return label;
|
|
45
|
+
}
|
|
46
|
+
/** @internal Test-only: forget the seen version labels. */
|
|
47
|
+
export function _resetVersionLabelsForTests() {
|
|
48
|
+
seenVersions.clear();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The CLI version a request CLAIMS (`X-Pb-Client-Version`), or undefined when
|
|
52
|
+
* absent / not a semver. Caller-set and unverified: fit for display and
|
|
53
|
+
* compatibility ("which CLI does this key still use"), never for a decision
|
|
54
|
+
* about access.
|
|
55
|
+
*/
|
|
56
|
+
export function clientVersionOf(req) {
|
|
57
|
+
const raw = req.headers?.[CLIENT_VERSION_HEADER.toLowerCase()];
|
|
58
|
+
const v = (Array.isArray(raw) ? raw[0] : raw)?.trim();
|
|
59
|
+
return v && isSemver(v) ? v : undefined;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Refuse a pipeline-manager CLI older than `PIPELINE_MANAGER_MIN_VERSION`
|
|
63
|
+
* with 426 `CLIENT_UPGRADE_REQUIRED`, so an API change surfaces as "run
|
|
64
|
+
* `pipeline-manager --upgrade`" rather than as a confusing 400 or a silently
|
|
65
|
+
* misread response.
|
|
66
|
+
*
|
|
67
|
+
* - Unset / blank minimum: nothing is refused (the default); versions are still counted.
|
|
68
|
+
* - A request WITHOUT the version header passes: browsers, other clients and
|
|
69
|
+
* CLIs released before the header existed are not identified, so they are
|
|
70
|
+
* not gated. Forward-only, by design.
|
|
71
|
+
* - A CI caller (CodeBuild) is counted but never refused — see {@link CI_CALLER_HEADER}.
|
|
72
|
+
* - A malformed header value passes too (nothing to compare), but a malformed
|
|
73
|
+
* MINIMUM throws at startup: a typo must not silently disable the gate.
|
|
74
|
+
*/
|
|
75
|
+
export function clientVersionGate(minVersion = process.env.PIPELINE_MANAGER_MIN_VERSION) {
|
|
76
|
+
const min = minVersion?.trim() || undefined;
|
|
77
|
+
if (min && !isSemver(min))
|
|
78
|
+
throw new Error(`PIPELINE_MANAGER_MIN_VERSION is not a semver version: ${min}`);
|
|
79
|
+
// Counted whether or not a minimum is set: the version mix is what an
|
|
80
|
+
// operator needs BEFORE choosing one.
|
|
81
|
+
return (req, res, next) => {
|
|
82
|
+
const sent = req.get(CLIENT_VERSION_HEADER)?.trim();
|
|
83
|
+
if (!sent || !isSemver(sent))
|
|
84
|
+
return next();
|
|
85
|
+
const version = boundedVersionLabel(sent);
|
|
86
|
+
const caller = req.get(CI_CALLER_HEADER) ? 'ci' : 'interactive';
|
|
87
|
+
emitCounter(CLIENT_REQUESTS_METRIC, { version, caller });
|
|
88
|
+
if (!min)
|
|
89
|
+
return next();
|
|
90
|
+
res.setHeader(MIN_CLIENT_VERSION_HEADER, min);
|
|
91
|
+
if (compareSemver(sent, min) >= 0 || caller === 'ci')
|
|
92
|
+
return next();
|
|
93
|
+
emitCounter(CLIENT_UPGRADE_REQUIRED_METRIC, { version, min: versionLabel(min) });
|
|
94
|
+
sendError(res, 426, `pipeline-manager ${sent} is no longer supported by this platform (minimum ${min}); run: pipeline-manager --upgrade`, ErrorCode.CLIENT_UPGRADE_REQUIRED, { minVersion: min, clientVersion: sent });
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LXZlcnNpb24uanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2NsaWVudC12ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFHdEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU3RCx3RUFBd0U7QUFDeEUsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcscUJBQXFCLENBQUM7QUFDM0QsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLHlCQUF5QixDQUFDO0FBQ25FLGtGQUFrRjtBQUNsRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUN4RSx5RkFBeUY7QUFDekYsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcseUNBQXlDLENBQUM7QUFFeEY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQztBQUV2RCxrR0FBa0c7QUFDbEcsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFdkMseURBQXlEO0FBQ3pELE1BQU0sVUFBVSxZQUFZLENBQUMsQ0FBUztJQUNwQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFDbEQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG1C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SixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgTmV4dEZ1bmN0aW9uLCBSZXF1ZXN0LCBSZXF1ZXN0SGFuZGxlciwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IEVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgY29tcGFyZVNlbXZlciwgaXNTZW12ZXIgfSBmcm9tICcuLi91dGlscy9zZW12ZXIuanMnO1xuXG4vKiogU2VudCBieSBwaXBlbGluZS1tYW5hZ2VyIG9uIGV2ZXJ5IHBsYXRmb3JtIGNhbGw6IGl0cyBvd24gdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBDTElFTlRfVkVSU0lPTl9IRUFERVIgPSAnWC1QYi1DbGllbnQtVmVyc2lvbic7XG4vKiogQW5zd2VyZWQgb24gZXZlcnkgcmVzcG9uc2UgdG8gYSB2ZXJzaW9uZWQgY2xpZW50IHdoaWxlIGEgbWluaW11bSBpcyBzZXQuICovXG5leHBvcnQgY29uc3QgTUlOX0NMSUVOVF9WRVJTSU9OX0hFQURFUiA9ICdYLVBiLU1pbi1DbGllbnQtVmVyc2lvbic7XG4vKiogUmVxdWVzdHMgcGVyIENMSSB2ZXJzaW9uIOKAlCB3aGF0IGlzIHN0aWxsIGluIHVzZSBiZWZvcmUgcmFpc2luZyB0aGUgbWluaW11bS4gKi9cbmV4cG9ydCBjb25zdCBDTElFTlRfUkVRVUVTVFNfTUVUUklDID0gJ3BpcGVsaW5lX21hbmFnZXJfcmVxdWVzdHNfdG90YWwnO1xuLyoqIDQyNnMgYW5zd2VyZWQg4oCUIHJhaXNpbmcgdGhlIG1pbmltdW0gc2hvd3MgYXMgYSB2aXNpYmxlIHNwaWtlLCBub3Qgc2lsZW50IGZhaWx1cmVzLiAqL1xuZXhwb3J0IGNvbnN0IENMSUVOVF9VUEdSQURFX1JFUVVJUkVEX01FVFJJQyA9ICdwaXBlbGluZV9tYW5hZ2VyX3VwZ3JhZGVfcmVxdWlyZWRfdG90YWwnO1xuXG4vKipcbiAqIEEgQ29kZUJ1aWxkIHN0ZXAgKHBpcGVsaW5lLW1hbmFnZXIgZm9yd2FyZHMgYFgtQ29kZUJ1aWxkLUJ1aWxkLUlkYCB0aGVyZSkgcnVuc1xuICogdGhlIENMSSBiYWtlZCBpbnRvIGEgcGx1Z2luIGltYWdlOiBpdCBjYW4ndCBgLS11cGdyYWRlYCBpdHNlbGYsIHNvIHJlZnVzaW5nXG4gKiBpdCB3b3VsZCBicmVhayBldmVyeSBvcmcncyBwaXBlbGluZXMgdW50aWwgdGhlaXIgaW1hZ2VzIHdlcmUgcmVidWlsdC5cbiAqIENvdW50ZWQgKGBjYWxsZXI9XCJjaVwiYCksIG5ldmVyIHJlZnVzZWQuIFRoZSBoZWFkZXIgaXMgY2FsbGVyLXNldCwgc28gdGhpcyBpc1xuICogbm8gd2Vha2VyIHRoYW4gdGhlIGdhdGUgYWxyZWFkeSBpcyDigJQgYSBjb21wYXRpYmlsaXR5IGdhdGUsIE5PVCBhIHNlY3VyaXR5XG4gKiBjb250cm9sIChhIENMSSBjYW4gb21pdCBvciBvdmVyc3RhdGUgaXRzIHZlcnNpb247IGEgdnVsbmVyYWJsZSB2ZXJzaW9uIGlzXG4gKiBzaHV0IG91dCBieSByZXZva2luZyB0b2tlbnMsIG5ldmVyIGJ5IHRoaXMpLlxuICovXG5leHBvcnQgY29uc3QgQ0lfQ0FMTEVSX0hFQURFUiA9ICdYLUNvZGVCdWlsZC1CdWlsZC1JZCc7XG5cbi8qKiBEaXN0aW5jdCBgdmVyc2lvbmAgbGFiZWwgdmFsdWVzIG9uZSBwcm9jZXNzIHdpbGwgZW1pdCBiZWZvcmUgZm9sZGluZyB0aGUgcmVzdCBpbnRvIGBvdGhlcmAuICovXG5leHBvcnQgY29uc3QgTUFYX1ZFUlNJT05fTEFCRUxTID0gNjQ7XG5jb25zdCBzZWVuVmVyc2lvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqIGB4LnkuemAgb2YgYSB2ZXJzaW9uIChwcmVyZWxlYXNlIC8gYnVpbGQgZHJvcHBlZCkuICovXG5leHBvcnQgZnVuY3Rpb24gdmVyc2lvbkxhYmVsKHY6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2LnJlcGxhY2UoL152LywgJycpLnNwbGl0KC9bLStdLywgMSlbMF0hO1xufVxuXG4vKipcbiAqIFRoZSBgdmVyc2lvbmAgbGFiZWwgZm9yIGEgcmVxdWVzdC4gVGhlIGdhdGUgcnVucyBCRUZPUkUgYXV0aCwgc28gdGhlIGhlYWRlclxuICogaXMgYXR0YWNrZXItY29udHJvbGxlZDogcGFzdCB7QGxpbmsgTUFYX1ZFUlNJT05fTEFCRUxTfSBkaXN0aW5jdCB2YWx1ZXMgYVxuICogbmV3IG9uZSBjb3VudHMgYXMgYG90aGVyYCwga2VlcGluZyBQcm9tZXRoZXVzIGNhcmRpbmFsaXR5IGJvdW5kZWQuXG4gKi9cbmZ1bmN0aW9uIGJvdW5kZWRWZXJzaW9uTGFiZWwodjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbGFiZWwgPSB2ZXJzaW9uTGFiZWwodik7XG4gIGlmIChzZWVuVmVyc2lvbnMuaGFzKGxhYmVsKSkgcmV0dXJuIGxhYmVsO1xuICBpZiAoc2VlblZlcnNpb25zLnNpemUgPj0gTUFYX1ZFUlNJT05fTEFCRUxTKSByZXR1cm4gJ290aGVyJztcbiAgc2VlblZlcnNpb25zLmFkZChsYWJlbCk7XG4gIHJldHVybiBsYWJlbDtcbn1cblxuLyoqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IGZvcmdldCB0aGUgc2VlbiB2ZXJzaW9uIGxhYmVscy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRWZXJzaW9uTGFiZWxzRm9yVGVzdHMoKTogdm9pZCB7XG4gIHNlZW5WZXJzaW9ucy5jbGVhcigpO1xufVxuXG4vKipcbiAqIFRoZSBDTEkgdmVyc2lvbiBhIHJlcXVlc3QgQ0xBSU1TIChgWC1QYi1DbGllbnQtVmVyc2lvbmApLCBvciB1bmRlZmluZWQgd2hlblxuICogYWJzZW50IC8gbm90IGEgc2VtdmVyLiBDYWxsZXItc2V0IGFuZCB1bnZlcmlmaWVkOiBmaXQgZm9yIGRpc3BsYXkgYW5kXG4gKiBjb21wYXRpYmlsaXR5IChcIndoaWNoIENMSSBkb2VzIHRoaXMga2V5IHN0aWxsIHVzZVwiKSwgbmV2ZXIgZm9yIGEgZGVjaXNpb25cbiAqIGFib3V0IGFjY2Vzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsaWVudFZlcnNpb25PZihyZXE6IFBpY2s8UmVxdWVzdCwgJ2hlYWRlcnMnPik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHJhdyA9IHJlcS5oZWFkZXJzPy5bQ0xJRU5UX1ZFUlNJT05fSEVBREVSLnRvTG93ZXJDYXNlKCldO1xuICBjb25zdCB2ID0gKEFycmF5LmlzQXJyYXkocmF3KSA/IHJhd1swXSA6IHJhdyk/LnRyaW0oKTtcbiAgcmV0dXJuIHYgJiYgaXNTZW12ZXIodikgPyB2IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlZnVzZSBhIHBpcGVsaW5lLW1hbmFnZXIgQ0xJIG9sZGVyIHRoYW4gYFBJUEVMSU5FX01BTkFHRVJfTUlOX1ZFUlNJT05gXG4gKiB3aXRoIDQyNiBgQ0xJRU5UX1VQR1JBREVfUkVRVUlSRURgLCBzbyBhbiBBUEkgY2hhbmdlIHN1cmZhY2VzIGFzIFwicnVuXG4gKiBgcGlwZWxpbmUtbWFuYWdlciAtLXVwZ3JhZGVgXCIgcmF0aGVyIHRoYW4gYXMgYSBjb25mdXNpbmcgNDAwIG9yIGEgc2lsZW50bHlcbiAqIG1pc3JlYWQgcmVzcG9uc2UuXG4gKlxuICogLSBVbnNldCAvIGJsYW5rIG1pbmltdW06IG5vdGhpbmcgaXMgcmVmdXNlZCAodGhlIGRlZmF1bHQpOyB2ZXJzaW9ucyBhcmUgc3RpbGwgY291bnRlZC5cbiAqIC0gQSByZXF1ZXN0IFdJVEhPVVQgdGhlIHZlcnNpb24gaGVhZGVyIHBhc3NlczogYnJvd3NlcnMsIG90aGVyIGNsaWVudHMgYW5kXG4gKiAgIENMSXMgcmVsZWFzZWQgYmVmb3JlIHRoZSBoZWFkZXIgZXhpc3RlZCBhcmUgbm90IGlkZW50aWZpZWQsIHNvIHRoZXkgYXJlXG4gKiAgIG5vdCBnYXRlZC4gRm9yd2FyZC1vbmx5LCBieSBkZXNpZ24uXG4gKiAtIEEgQ0kgY2FsbGVyIChDb2RlQnVpbGQpIGlzIGNvdW50ZWQgYnV0IG5ldmVyIHJlZnVzZWQg4oCUIHNlZSB7QGxpbmsgQ0lfQ0FMTEVSX0hFQURFUn0uXG4gKiAtIEEgbWFsZm9ybWVkIGhlYWRlciB2YWx1ZSBwYXNzZXMgdG9vIChub3RoaW5nIHRvIGNvbXBhcmUpLCBidXQgYSBtYWxmb3JtZWRcbiAqICAgTUlOSU1VTSB0aHJvd3MgYXQgc3RhcnR1cDogYSB0eXBvIG11c3Qgbm90IHNpbGVudGx5IGRpc2FibGUgdGhlIGdhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGllbnRWZXJzaW9uR2F0ZShtaW5WZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBwcm9jZXNzLmVudi5QSVBFTElORV9NQU5BR0VSX01JTl9WRVJTSU9OKTogUmVxdWVzdEhhbmRsZXIge1xuICBjb25zdCBtaW4gPSBtaW5WZXJzaW9uPy50cmltKCkgfHwgdW5kZWZpbmVkO1xuICBpZiAobWluICYmICFpc1NlbXZlcihtaW4pKSB0aHJvdyBuZXcgRXJyb3IoYFBJUEVMSU5FX01BTkFHRVJfTUlOX1ZFUlNJT04gaXMgbm90IGEgc2VtdmVyIHZlcnNpb246ICR7bWlufWApO1xuXG4gIC8vIENvdW50ZWQgd2hldGhlciBvciBub3QgYSBtaW5pbXVtIGlzIHNldDogdGhlIHZlcnNpb24gbWl4IGlzIHdoYXQgYW5cbiAgLy8gb3BlcmF0b3IgbmVlZHMgQkVGT1JFIGNob29zaW5nIG9uZS5cbiAgcmV0dXJuIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIGNvbnN0IHNlbnQgPSByZXEuZ2V0KENMSUVOVF9WRVJTSU9OX0hFQURFUik/LnRyaW0oKTtcbiAgICBpZiAoIXNlbnQgfHwgIWlzU2VtdmVyKHNlbnQpKSByZXR1cm4gbmV4dCgpO1xuICAgIGNvbnN0IHZlcnNpb24gPSBib3VuZGVkVmVyc2lvbkxhYmVsKHNlbnQpO1xuICAgIGNvbnN0IGNhbGxlciA9IHJlcS5nZXQoQ0lfQ0FMTEVSX0hFQURFUikgPyAnY2knIDogJ2ludGVyYWN0aXZlJztcbiAgICBlbWl0Q291bnRlcihDTElFTlRfUkVRVUVTVFNfTUVUUklDLCB7IHZlcnNpb24sIGNhbGxlciB9KTtcbiAgICBpZiAoIW1pbikgcmV0dXJuIG5leHQoKTtcbiAgICByZXMuc2V0SGVhZGVyKE1JTl9DTElFTlRfVkVSU0lPTl9IRUFERVIsIG1pbik7XG4gICAgaWYgKGNvbXBhcmVTZW12ZXIoc2VudCwgbWluKSA+PSAwIHx8IGNhbGxlciA9PT0gJ2NpJykgcmV0dXJuIG5leHQoKTtcbiAgICBlbWl0Q291bnRlcihDTElFTlRfVVBHUkFERV9SRVFVSVJFRF9NRVRSSUMsIHsgdmVyc2lvbiwgbWluOiB2ZXJzaW9uTGFiZWwobWluKSB9KTtcbiAgICBzZW5kRXJyb3IoXG4gICAgICByZXMsXG4gICAgICA0MjYsXG4gICAgICBgcGlwZWxpbmUtbWFuYWdlciAke3NlbnR9IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybSAobWluaW11bSAke21pbn0pOyBydW46IHBpcGVsaW5lLW1hbmFnZXIgLS11cGdyYWRlYCxcbiAgICAgIEVycm9yQ29kZS5DTElFTlRfVVBHUkFERV9SRVFVSVJFRCxcbiAgICAgIHsgbWluVmVyc2lvbjogbWluLCBjbGllbnRWZXJzaW9uOiBzZW50IH0sXG4gICAgKTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -13,3 +13,4 @@ export { tagRouteGate, getRouteGates, audited, dynamicAuthz, buildRouteTable, is
|
|
|
13
13
|
export { armDeferredQuotaCheck, runDeferredQuotaCheck, } from './deferred-quota-check.js';
|
|
14
14
|
export { ON_BEHALF_HEADER, ON_BEHALF_CALLERS, onBehalfHeaders, onBehalfCaller, type OnBehalfSubject, } from './on-behalf.js';
|
|
15
15
|
export { QUOTA_EXEMPT_ROUTES, isQuotaExemptRoute, type QuotaExemptRoute, } from './quota-exempt-routes.js';
|
|
16
|
+
export { clientVersionGate, CLIENT_VERSION_HEADER, MIN_CLIENT_VERSION_HEADER, CI_CALLER_HEADER, clientVersionOf, } from './client-version.js';
|
package/lib/middleware/index.js
CHANGED
|
@@ -15,4 +15,5 @@ export { tagRouteGate, getRouteGates, audited, dynamicAuthz, buildRouteTable, is
|
|
|
15
15
|
export { armDeferredQuotaCheck, runDeferredQuotaCheck, } from './deferred-quota-check.js';
|
|
16
16
|
export { ON_BEHALF_HEADER, ON_BEHALF_CALLERS, onBehalfHeaders, onBehalfCaller, } from './on-behalf.js';
|
|
17
17
|
export { QUOTA_EXEMPT_ROUTES, isQuotaExemptRoute, } from './quota-exempt-routes.js';
|
|
18
|
-
|
|
18
|
+
export { clientVersionGate, CLIENT_VERSION_HEADER, MIN_CLIENT_VERSION_HEADER, CI_CALLER_HEADER, clientVersionOf, } from './client-version.js';
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxFQUNMLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsc0JBQXNCLEdBQ3ZCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLFdBQVcsR0FDWixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLG9CQUFvQixHQUNyQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLDBCQUEwQixFQUMxQix3QkFBd0IsR0FFekIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQiwwQkFBMEIsRUFDMUIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixhQUFhLEVBQ2IsUUFBUSxFQUNSLGtCQUFrQixFQUNsQixjQUFjLEdBRWYsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQ0wsYUFBYSxFQUNiLGFBQWEsRUFDYixlQUFlLEdBQ2hCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIseUJBQXlCLEVBQ3pCLHVCQUF1QixFQUN2QixzQkFBc0IsR0FDdkIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRixPQUFPLEVBQ0wsYUFBYSxFQUNiLGtCQUFrQixHQUNuQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFDTCxVQUFVLEVBQ1YsOEJBQThCLEdBQy9CLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGFBQWEsRUFFYixzQkFBc0IsR0FDdkIsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IsT0FBTyxFQUNQLFlBQVksRUFDWixlQUFlLEVBQ2YsYUFBYSxFQUNiLG1CQUFtQixFQUNuQixrQkFBa0IsR0FHbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHFCQUFxQixHQUN0QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixjQUFjLEdBRWYsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGtCQUFrQixHQUVuQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6QixnQkFBZ0IsRUFDaEIsZUFBZSxHQUNoQixNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmV4cG9ydCB7XG4gIHZlcmlmeVVzZXJKd3QsXG4gIHZlcmlmeUJlYXJlclRva2VuLFxuICBoYXNWYWxpZElkZW50aXR5Q2xhaW1zLFxufSBmcm9tICcuL2p3dC12ZXJpZnkuanMnO1xuZXhwb3J0IHtcbiAgcmVxdWlyZUF1dGgsXG59IGZyb20gJy4vYXV0aC5qcyc7XG5leHBvcnQge1xuICBzZXRUb2tlblJldm9jYXRpb25TdG9yZSxcbiAgaXNBY2Nlc3NUb2tlblJldm9rZWQsXG59IGZyb20gJy4vcmV2b2NhdGlvbi5qcyc7XG5leHBvcnQge1xuICByZXF1aXJlQXNzdXJhbmNlLFxuICByZWZ1c2VXZWFrU2Vzc2lvbixcbiAgcmVmdXNlRm9yT3JnQWRtaW5Bc3N1cmFuY2UsXG4gIHJlcXVpcmVPcmdBZG1pbkFzc3VyYW5jZSxcbiAgdHlwZSBBc3N1cmFuY2VPcHRpb25zLFxufSBmcm9tICcuL2Fzc3VyYW5jZS5qcyc7XG5leHBvcnQge1xuICB1c2VySGFzUGVybWlzc2lvbixcbiAgc2V0QXV0aHpEZW5pYWxBdWRpdG9yLFxuICByZWNvcmRBdXRoekRlbmlhbCxcbiAgcmVxdWlyZVBlcm1pc3Npb24sXG4gIHJlcXVpcmVBbGxQZXJtaXNzaW9ucyxcbiAgcmVxdWlyZVBlcm1pc3Npb25PclNlcnZpY2UsXG4gIHJlcXVpcmVTZXJ2aWNlUHJpbmNpcGFsLFxuICByZXF1aXJlSW50ZXJuYWxTZXJ2aWNlLFxuICBpc1N5c3RlbUFkbWluLFxuICBoYXNTY29wZSxcbiAgcmVxdWlyZVN5c3RlbUFkbWluLFxuICByZXF1aXJlRmVhdHVyZSxcbiAgdHlwZSBBdXRoekRlbmlhbEluZm8sXG59IGZyb20gJy4vcGVybWlzc2lvbi1nYXRlcy5qcyc7XG5leHBvcnQge1xuICBpc1N5c3RlbU9yZ0lkLFxuICBTWVNURU1fT1JHX0lELFxuICBTWVNURU1fT1JHX1NMVUcsXG59IGZyb20gJy4vc3lzdGVtLW9yZy5qcyc7XG5leHBvcnQge1xuICBzZXJ2aWNlTmFtZU9mLFxuICBpc1NlcnZpY2VUb2tlbkRlbmllZCxcbiAgc2lnblNlcnZpY2VUb2tlbixcbiAgZ2V0U2VydmljZUF1dGhIZWFkZXIsXG4gIGlzU2VydmljZVByaW5jaXBhbCxcbiAgaXNTZXJ2aWNlQWNjb3VudFByaW5jaXBhbCxcbiAgaXNTZXJ2aWNlUHJpbmNpcGFsTmFtZWQsXG4gIHZlcmlmeVNlcnZpY2VQcmluY2lwYWwsXG59IGZyb20gJy4vc2VydmljZS10b2tlbnMuanMnO1xuZXhwb3J0IHsgcmVxdWlyZVN5c3RlbU9yZywgcmVxdWlyZVN5c3RlbU9yZ1Blcm1pc3Npb24gfSBmcm9tICcuL2Vjb3N5c3RlbS1ndWFyZC5qcyc7XG5leHBvcnQge1xuICBtb25nb1Nhbml0aXplLFxuICBNQVhfU0FOSVRJWkVfREVQVEgsXG59IGZyb20gJy4vbW9uZ28tc2FuaXRpemUuanMnO1xuZXhwb3J0IHtcbiAgcHJvcG9zYWJsZSxcbiAgQVNLX1BST1ZFTkFOQ0VfUkVGVVNFRF9DT1VOVEVSLFxufSBmcm9tICcuL2Fzay1wcm92ZW5hbmNlLmpzJztcbmV4cG9ydCB7XG4gIHJlcXVpcmVTdGVwVXAsXG4gIHR5cGUgU3RlcFVwTWV0aG9kLFxuICBTVFJPTkdfU1RFUF9VUF9NRVRIT0RTLFxufSBmcm9tICcuL3N0ZXAtdXAuanMnO1xuZXhwb3J0IHtcbiAgdGFnUm91dGVHYXRlLFxuICBnZXRSb3V0ZUdhdGVzLFxuICBhdWRpdGVkLFxuICBkeW5hbWljQXV0aHosXG4gIGJ1aWxkUm91dGVUYWJsZSxcbiAgaXNXcml0ZU1ldGhvZCxcbiAgc3VtbWFyaXplUm91dGVUYWJsZSxcbiAgRFlOQU1JQ19QUklOQ0lQQUxTLFxuICB0eXBlIER5bmFtaWNQcmluY2lwYWwsXG4gIHR5cGUgUm91dGVUYWJsZUVudHJ5LFxufSBmcm9tICcuL3JvdXRlLXRhYmxlLmpzJztcbmV4cG9ydCB7XG4gIGFybURlZmVycmVkUXVvdGFDaGVjayxcbiAgcnVuRGVmZXJyZWRRdW90YUNoZWNrLFxufSBmcm9tICcuL2RlZmVycmVkLXF1b3RhLWNoZWNrLmpzJztcbmV4cG9ydCB7XG4gIE9OX0JFSEFMRl9IRUFERVIsXG4gIE9OX0JFSEFMRl9DQUxMRVJTLFxuICBvbkJlaGFsZkhlYWRlcnMsXG4gIG9uQmVoYWxmQ2FsbGVyLFxuICB0eXBlIE9uQmVoYWxmU3ViamVjdCxcbn0gZnJvbSAnLi9vbi1iZWhhbGYuanMnO1xuZXhwb3J0IHtcbiAgUVVPVEFfRVhFTVBUX1JPVVRFUyxcbiAgaXNRdW90YUV4ZW1wdFJvdXRlLFxuICB0eXBlIFF1b3RhRXhlbXB0Um91dGUsXG59IGZyb20gJy4vcXVvdGEtZXhlbXB0LXJvdXRlcy5qcyc7XG5leHBvcnQge1xuICBjbGllbnRWZXJzaW9uR2F0ZSxcbiAgQ0xJRU5UX1ZFUlNJT05fSEVBREVSLFxuICBNSU5fQ0xJRU5UX1ZFUlNJT05fSEVBREVSLFxuICBDSV9DQUxMRVJfSEVBREVSLFxuICBjbGllbnRWZXJzaW9uT2YsXG59IGZyb20gJy4vY2xpZW50LXZlcnNpb24uanMnO1xuIl19
|
|
@@ -15,9 +15,11 @@ export declare function setApiKeyExchangeServiceName(name: string): void;
|
|
|
15
15
|
/**
|
|
16
16
|
* The JWT for `key`, from cache when possible. Throws {@link ApiKeyRejectedError}
|
|
17
17
|
* when platform refused the key and {@link ApiKeyExchangeUnavailableError} when
|
|
18
|
-
* it could not be asked.
|
|
18
|
+
* it could not be asked. `clientVersion` is the presenting request's
|
|
19
|
+
* `X-Pb-Client-Version` (already validated — see `clientVersionOf`), forwarded
|
|
20
|
+
* so platform can record which CLI the key is used with.
|
|
19
21
|
*/
|
|
20
|
-
export declare function exchangeApiKey(key: string): Promise<string>;
|
|
22
|
+
export declare function exchangeApiKey(key: string, clientVersion?: string): Promise<string>;
|
|
21
23
|
/**
|
|
22
24
|
* Drop every cached exchange. For tests and for a process that wants to force
|
|
23
25
|
* re-validation; production relies on the TTLs above.
|
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
* pod's exchanges would otherwise share one bucket) and names the caller in
|
|
32
32
|
* platform's audit trail.
|
|
33
33
|
*/
|
|
34
|
+
import { CLIENT_VERSION_HEADER } from '../middleware/client-version.js';
|
|
34
35
|
import { getServiceAuthHeader } from '../middleware/service-tokens.js';
|
|
35
36
|
import { SYSTEM_ORG_ID } from '../middleware/system-org.js';
|
|
36
37
|
import { InternalHttpClient } from '../services/http-client.js';
|
|
@@ -115,7 +116,7 @@ function evictIfFull() {
|
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
118
|
/** One real round-trip to platform. Throws the two typed errors above. */
|
|
118
|
-
async function performExchange(key, hash) {
|
|
119
|
+
async function performExchange(key, hash, clientVersion) {
|
|
119
120
|
const client = platformClient();
|
|
120
121
|
let status;
|
|
121
122
|
let body;
|
|
@@ -123,6 +124,10 @@ async function performExchange(key, hash) {
|
|
|
123
124
|
const res = await client.post('/auth/token/exchange', { key }, {
|
|
124
125
|
headers: {
|
|
125
126
|
Authorization: getServiceAuthHeader({ serviceName, role: 'member', orgId: SYSTEM_ORG_ID }),
|
|
127
|
+
// The CLI version the key's holder is calling with (validated by the
|
|
128
|
+
// caller), so platform can stamp it on the key ("last CLI version") for
|
|
129
|
+
// org admins. Absent → platform keeps the version it already has.
|
|
130
|
+
...(clientVersion ? { [CLIENT_VERSION_HEADER]: clientVersion } : {}),
|
|
126
131
|
},
|
|
127
132
|
// The exchange is a pure read of the key record plus a token mint — safe to
|
|
128
133
|
// retry, and a lost retry only costs one extra mint.
|
|
@@ -169,20 +174,22 @@ async function performExchange(key, hash) {
|
|
|
169
174
|
return entry;
|
|
170
175
|
}
|
|
171
176
|
/** Exchange, sharing a single in-flight round-trip per key. */
|
|
172
|
-
function exchangeOnce(key, hash) {
|
|
177
|
+
function exchangeOnce(key, hash, clientVersion) {
|
|
173
178
|
const pending = inFlight.get(hash);
|
|
174
179
|
if (pending)
|
|
175
180
|
return pending;
|
|
176
|
-
const promise = performExchange(key, hash).finally(() => inFlight.delete(hash));
|
|
181
|
+
const promise = performExchange(key, hash, clientVersion).finally(() => inFlight.delete(hash));
|
|
177
182
|
inFlight.set(hash, promise);
|
|
178
183
|
return promise;
|
|
179
184
|
}
|
|
180
185
|
/**
|
|
181
186
|
* The JWT for `key`, from cache when possible. Throws {@link ApiKeyRejectedError}
|
|
182
187
|
* when platform refused the key and {@link ApiKeyExchangeUnavailableError} when
|
|
183
|
-
* it could not be asked.
|
|
188
|
+
* it could not be asked. `clientVersion` is the presenting request's
|
|
189
|
+
* `X-Pb-Client-Version` (already validated — see `clientVersionOf`), forwarded
|
|
190
|
+
* so platform can record which CLI the key is used with.
|
|
184
191
|
*/
|
|
185
|
-
export async function exchangeApiKey(key) {
|
|
192
|
+
export async function exchangeApiKey(key, clientVersion) {
|
|
186
193
|
const hash = hashApiKey(key);
|
|
187
194
|
const now = Date.now();
|
|
188
195
|
const rejectedUntil = rejectionCache.get(hash);
|
|
@@ -200,7 +207,7 @@ export async function exchangeApiKey(key) {
|
|
|
200
207
|
// background refresh is not this request's problem — the cached token is
|
|
201
208
|
// still valid, and the next request past expiry exchanges inline.
|
|
202
209
|
emitCounter('api_key_exchange_cache_total', { result: 'refresh' });
|
|
203
|
-
void exchangeOnce(key, hash).catch(() => { });
|
|
210
|
+
void exchangeOnce(key, hash, clientVersion).catch(() => { });
|
|
204
211
|
}
|
|
205
212
|
else {
|
|
206
213
|
emitCounter('api_key_exchange_cache_total', { result: 'hit' });
|
|
@@ -208,7 +215,7 @@ export async function exchangeApiKey(key) {
|
|
|
208
215
|
return cached.token;
|
|
209
216
|
}
|
|
210
217
|
emitCounter('api_key_exchange_cache_total', { result: 'miss' });
|
|
211
|
-
return (await exchangeOnce(key, hash)).token;
|
|
218
|
+
return (await exchangeOnce(key, hash, clientVersion)).token;
|
|
212
219
|
}
|
|
213
220
|
/**
|
|
214
221
|
* Drop every cached exchange. For tests and for a process that wants to force
|
|
@@ -219,4 +226,4 @@ export function resetApiKeyExchangeCache() {
|
|
|
219
226
|
rejectionCache.clear();
|
|
220
227
|
inFlight.clear();
|
|
221
228
|
}
|
|
222
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWtleS1leGNoYW5nZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2FwaS1rZXktZXhjaGFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBRUgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRWhELHVGQUF1RjtBQUN2RixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFFN0Isd0RBQXdEO0FBQ3hELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUUvQixrRkFBa0Y7QUFDbEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFakM7OzJEQUUyRDtBQUMzRCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUVwQyxpRkFBaUY7QUFDakYsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDNUMsWUFBWSxPQUFPLEdBQUcsMkNBQTJDO1FBQy9ELEtBQUssQ0FBQyxPQUFPLENB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QU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDckMsSUFBSSxNQUFNLENBQUMsU0FBUyxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNuRCwyRUFBMkU7WUFDM0UseUVBQXlFO1lBQ3pFLGtFQUFrRTtZQUNsRSxXQUFXLENBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUNuRSxLQUFLLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUE2QyxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDO2FBQU0sQ0FBQztZQUNOLFdBQVcsQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUVELFdBQVcsQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sQ0FBQyxNQUFNLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDL0MsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx3QkFBd0I7SUFDdEMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ25CLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN2QixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKipcbiAqIFRyYWRlIGFuIG9wYXF1ZSBhY2Nlc3Mga2V5IGZvciBhIHNob3J0LWxpdmVkIEpXVCwgb25jZSwgYW5kIGNhY2hlIGl0LlxuICpcbiAqIE9ubHkgcGxhdGZvcm0sIGJpbGxpbmcgYW5kIHF1b3RhIGhhdmUgTW9uZ29EQiwgc28gdGhlIHN0YXRlbGVzcyBzZXJ2aWNlc1xuICogY2Fubm90IGxvb2sgdXAgYSBrZXkgaGFzaCDigJQgYW5kIGFza2luZyBwbGF0Zm9ybSB0byB2YWxpZGF0ZSBFVkVSWSByZXF1ZXN0XG4gKiB3b3VsZCBwdXQgaXQgb24gdGhlIGhvdCBwYXRoIG9mIHRoZSB3aG9sZSBmbGVldC4gSW5zdGVhZCB0aGlzIG1vZHVsZSBkb2VzIHRoZVxuICogZXhjaGFuZ2Ugb25jZSBwZXIga2V5IChgUE9TVCAvYXV0aC90b2tlbi9leGNoYW5nZWApIGFuZCBjYWNoZXMgdGhlIHJldHVybmVkXG4gKiBKV1QgaW4tcHJvY2VzcyB1bnRpbCBpdCBleHBpcmVzLCBzbyBgcmVxdWlyZUF1dGhgIG9ubHkgZXZlciB2ZXJpZmllcyBhIEpXVC5cbiAqXG4gKiBQcm9wZXJ0aWVzIHRoYXQgbWF0dGVyOlxuICpcbiAqIC0gKipSZXZvY2F0aW9uIGxhdGVuY3kgaXMgYm91bmRlZCBieSB0aGUgdG9rZW4gVFRMKiogKDUgbWludXRlcykuIEEgcmV2b2tlZFxuICogICBrZXkgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQsIGFuZCB0aGUgY2FjaGVkIHRva2VuIGl0IGFscmVhZHkgcHJvZHVjZWRcbiAqICAgZGllcyBvbiBpdHMgb3duLlxuICogLSAqKkVhcmx5LCBqaXR0ZXJlZCByZWZyZXNoLioqIFRoZSBjYWNoZWQgdG9rZW4gaXMgcmUtZXhjaGFuZ2VkIGluIHRoZVxuICogICBiYWNrZ3JvdW5kIGF0IH43NSUgb2YgaXRzIGxpZmUgKMKxMjAlIGppdHRlcikgc28gbm8gcmVxdWVzdCBldmVyIGJsb2NrcyBvblxuICogICB0aGUgZXhjaGFuZ2UsIGFuZCBhIGZsZWV0IG9mIHBvZHMgaG9sZGluZyB0aGUgc2FtZSBrZXkgZG9lc24ndCBzdGFtcGVkZVxuICogICBwbGF0Zm9ybSBhdCB0aGUgc2FtZSBpbnN0YW50LlxuICogLSAqKk9uZSBpbi1mbGlnaHQgZXhjaGFuZ2UgcGVyIGtleS4qKiBDb25jdXJyZW50IHJlcXVlc3RzIHNoYXJlIGEgcHJvbWlzZS5cbiAqIC0gKipTaG9ydCBuZWdhdGl2ZSBjYWNoZS4qKiBBIGtleSBwbGF0Zm9ybSByZWplY3RlZCBpcyByZW1lbWJlcmVkIGZvciAzMHMsIHNvXG4gKiAgIGEgbWlzY29uZmlndXJlZCBjbGllbnQgKG9yIGEgc2Nhbm5lcikgY2FuJ3QgdHVybiBldmVyeSByZXF1ZXN0IGludG8gYVxuICogICBwbGF0Zm9ybSByb3VuZC10cmlwLlxuICogLSAqKlBsYXRmb3JtIGRvd24gaXMgYSA1MDMsIG5ldmVyIGEgMjAwLioqIFRoZSBjYWxsZXIgbWFwc1xuICogICB7QGxpbmsgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yfSB0byBcInRyeSBhZ2FpblwiLCB3aXRoIGEgbWV0cmljIOKAlCBpdCBpc1xuICogICBkZWxpYmVyYXRlbHkgTk9UIGZhaWwtb3BlbjogYW4gdW52ZXJpZmlhYmxlIGNyZWRlbnRpYWwgaXMgbm90IGFuIGlkZW50aXR5LlxuICpcbiAqIFRoZSBleGNoYW5nZSByZXF1ZXN0IGl0c2VsZiBjYXJyaWVzIHRoaXMgc2VydmljZSdzIG93biBzaWduZWQgc2VydmljZSB0b2tlbixcbiAqIHdoaWNoIGlzIHdoYXQgZXhlbXB0cyBpdCBmcm9tIHBsYXRmb3JtJ3MgSVAta2V5ZWQgYC9hdXRoYCByYXRlIGxpbWl0ZXIgKGV2ZXJ5XG4gKiBwb2QncyBleGNoYW5nZXMgd291bGQgb3RoZXJ3aXNlIHNoYXJlIG9uZSBidWNrZXQpIGFuZCBuYW1lcyB0aGUgY2FsbGVyIGluXG4gKiBwbGF0Zm9ybSdzIGF1ZGl0IHRyYWlsLlxuICovXG5cbmltcG9ydCB7IGdldFNlcnZpY2VBdXRoSGVhZGVyIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgeyBTWVNURU1fT1JHX0lEIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9zeXN0ZW0tb3JnLmpzJztcbmltcG9ydCB7IEludGVybmFsSHR0cENsaWVudCB9IGZyb20gJy4uL3NlcnZpY2VzL2h0dHAtY2xpZW50LmpzJztcbmltcG9ydCB7IGhhc2hBcGlLZXkgfSBmcm9tICcuLi91dGlscy9hcGkta2V5LmpzJztcbmltcG9ydCB7IGVudkludCB9IGZyb20gJy4uL3V0aWxzL2Vudi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5pbXBvcnQgeyBzZXJ2aWNlRW5kcG9pbnQgfSBmcm9tICcuLi91dGlscy9zZXJ2aWNlLXJlZ2lzdHJ5LmpzJztcblxuY29uc3QgbG9nZ2VyID0gY3JlYXRlTG9nZ2VyKCdhcGkta2V5LWV4Y2hhbmdlJyk7XG5cbi8qKiBNb3N0IGRpc3RpbmN0IGtleXMgaGVsZCBpbiB0aGUgcHJvY2Vzcy13aWRlIGNhY2hlIGJlZm9yZSB0aGUgb2xkZXN0IGFyZSBkcm9wcGVkLiAqL1xuY29uc3QgTUFYX0NBQ0hFRF9LRVlTID0gMTAwMDtcblxuLyoqIEhvdyBsb25nIGEgcGxhdGZvcm0gUkVKRUNUSU9OIGlzIHJlbWVtYmVyZWQgKG1zKS4gKi9cbmNvbnN0IE5FR0FUSVZFX1RUTF9NUyA9IDMwXzAwMDtcblxuLyoqIEZyYWN0aW9uIG9mIGEgdG9rZW4ncyBsaWZlIGFmdGVyIHdoaWNoIGEgYmFja2dyb3VuZCByZS1leGNoYW5nZSBpcyBzdGFydGVkLiAqL1xuY29uc3QgUkVGUkVTSF9BVF9GUkFDVElPTiA9IDAuNzU7XG5cbi8qKiDCsSBqaXR0ZXIgYXBwbGllZCB0byB0aGUgcmVmcmVzaCBwb2ludCwgYXMgYSBmcmFjdGlvbiBvZiB0aGUgdG9rZW4ncyBsaWZlLlxuICogIFdpZGUgZW5vdWdoIHRvIGRlLXN5bmNocm9uaXplIGEgZmxlZXQsIG5hcnJvdyBlbm91Z2ggdG8gbGVhdmUgYSBjbGVhciB0YWlsIG9mXG4gKiAgc3RpbGwtdmFsaWQgdG9rZW4gYWZ0ZXIgdGhlIGxhdGVzdCBwb3NzaWJsZSByZWZyZXNoLiAqL1xuY29uc3QgUkVGUkVTSF9KSVRURVJfRlJBQ1RJT04gPSAwLjE7XG5cbi8qKiBUaGUga2V5IHdhcyBwcmVzZW50ZWQgdG8gcGxhdGZvcm0gYW5kIHJlZnVzZWQgKHVua25vd24sIHJldm9rZWQsIGV4cGlyZWQpLiAqL1xuZXhwb3J0IGNsYXNzIEFwaUtleVJlamVjdGVkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnQWNjZXNzIGtleSBpcyBpbnZhbGlkLCByZXZva2VkIG9yIGV4cGlyZWQnKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0FwaUtleVJlamVjdGVkRXJyb3InO1xuICB9XG59XG5cbi8qKiBQbGF0Zm9ybSBjb3VsZCBub3QgYmUgcmVhY2hlZCAob3IgYW5zd2VyZWQgNXh4KSDigJQgdGhlIGtleSdzIHZhbGlkaXR5IGlzIHVua25vd24uICovXG5leHBvcnQgY2xhc3MgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0FjY2Vzcy1rZXkgdmVyaWZpY2F0aW9uIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlJykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3InO1xuICB9XG59XG5cbmludGVyZmFjZSBDYWNoZUVudHJ5IHtcbiAgLyoqIFRoZSBleGNoYW5nZWQgSldULiAqL1xuICB0b2tlbjogc3RyaW5nO1xuICAvKiogRXBvY2ggbXMgYXQgd2hpY2ggdGhlIEpXVCBzdG9wcyBiZWluZyB1c2FibGUuICovXG4gIGV4cGlyZXNBdDogbnVtYmVyO1xuICAvKiogRXBvY2ggbXMgYWZ0ZXIgd2hpY2ggYSBiYWNrZ3JvdW5kIHJlLWV4Y2hhbmdlIHNob3VsZCBiZSBzdGFydGVkLiAqL1xuICByZWZyZXNoQXQ6IG51bWJlcjtcbn1cblxuLyoqIENhY2hlIG9mIHN1Y2Nlc3NmdWwgZXhjaGFuZ2VzLCBrZXllZCBieSBgc2hhMjU2KGtleSlgIOKAlCBuZXZlciBieSB0aGUga2V5IGl0c2VsZi4gKi9cbmNvbnN0IHRva2VuQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgQ2FjaGVFbnRyeT4oKTtcbi8qKiBDYWNoZSBvZiByZWplY3Rpb25zLCBrZXllZCB0aGUgc2FtZSB3YXk7IHZhbHVlIGlzIHRoZSBlcG9jaCBtcyBpdCBleHBpcmVzLiAqL1xuY29uc3QgcmVqZWN0aW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuLyoqIEluLWZsaWdodCBleGNoYW5nZXMsIHNvIGNvbmN1cnJlbnQgcmVxdWVzdHMgZm9yIG9uZSBrZXkgc2hhcmUgYSByb3VuZC10cmlwLiAqL1xuY29uc3QgaW5GbGlnaHQgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxDYWNoZUVudHJ5Pj4oKTtcblxuLyoqIFRoZSBzZXJ2aWNlIG5hbWUgbWludGVkIGludG8gdGhlIGV4Y2hhbmdlIGNhbGwncyBvd24gc2VydmljZSB0b2tlbi4gKi9cbmxldCBzZXJ2aWNlTmFtZSA9IHByb2Nlc3MuZW52LlNFUlZJQ0VfTkFNRSB8fCAndW5rbm93bic7XG5cbi8qKlxuICogTmFtZSB0aGlzIHByb2Nlc3MgaW4gdGhlIGV4Y2hhbmdlIGNhbGwncyBzZXJ2aWNlIHRva2VuLiBDYWxsZWQgZnJvbVxuICogYHdpcmVTZXJ2aWNlU2VjdXJpdHlgIGF0IGJvb3QgKGFuZCBieSB0aGUgcGx1Z2luIHNlcnZpY2UsIHdoaWNoIHdpcmVzIGl0c1xuICogYm9vdCBzZWN1cml0eSBieSBoYW5kKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEFwaUtleUV4Y2hhbmdlU2VydmljZU5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIHNlcnZpY2VOYW1lID0gbmFtZTtcbn1cblxuLyoqIFBsYXRmb3JtJ3MgaW4tY2x1c3RlciBhZGRyZXNzIOKAlCB0aGUgc2FtZSBlbnYgcGFpciBldmVyeSBvdGhlciBjYWxsZXIgdXNlcy4gKi9cbmZ1bmN0aW9uIHBsYXRmb3JtQ2xpZW50KCk6IEludGVybmFsSHR0cENsaWVudCB7XG4gIHJldHVybiBuZXcgSW50ZXJuYWxIdHRwQ2xpZW50KHtcbiAgICAuLi5zZXJ2aWNlRW5kcG9pbnQoJ3BsYXRmb3JtJyksXG4gICAgdGltZW91dDogZW52SW50KCdBUElfS0VZX0VYQ0hBTkdFX1RJTUVPVVRfTVMnLCAzMDAwLCB7IG1pbjogMSB9KSxcbiAgfSk7XG59XG5cbi8qKiBUaGUgZXBvY2ggbXMgYXQgd2hpY2ggYSB0b2tlbiB3aXRoIGB0dGxTZWNvbmRzYCBvZiBsaWZlIHNob3VsZCBiZSByZWZyZXNoZWQgZWFybHkuICovXG5mdW5jdGlvbiBqaXR0ZXJlZFJlZnJlc2hBdChpc3N1ZWRBdDogbnVtYmVyLCB0dGxTZWNvbmRzOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBsaWZlTXMgPSB0dGxTZWNvbmRzICogMTAwMDtcbiAgY29uc3Qgaml0dGVyID0gKE1hdGgucmFuZG9tKCkgKiAyIC0gMSkgKiBSRUZSRVNIX0pJVFRFUl9GUkFDVElPTjtcbiAgLy8gQ2xhbXAgaW50byAoMCwgMSkgc28gdGhlIHJlZnJlc2ggcG9pbnQgaXMgYWx3YXlzIGJlZm9yZSBleHBpcnkgYW5kIG5ldmVyIGluXG4gIC8vIHRoZSBwYXN0LCB3aGF0ZXZlciBUVEwgcGxhdGZvcm0gcmV0dXJucy5cbiAgY29uc3QgZnJhY3Rpb24gPSBNYXRoLm1pbigwLjk1LCBNYXRoLm1heCgwLjEsIFJFRlJFU0hfQVRfRlJBQ1RJT04gKyBqaXR0ZXIpKTtcbiAgcmV0dXJuIGlzc3VlZEF0ICsgbGlmZU1zICogZnJhY3Rpb247XG59XG5cbi8qKiBEcm9wIHRoZSBvbGRlc3QgZW50cmllcyBvbmNlIHRoZSBjYWNoZSBpcyBvdmVyIGl0cyBjYXAgKGtleXMgYXJlIGxvbmctbGl2ZWQsIHRva2VucyBhcmUgbm90KS4gKi9cbmZ1bmN0aW9uIGV2aWN0SWZGdWxsKCk6IHZvaWQge1xuICBpZiAodG9rZW5DYWNoZS5zaXplIDw9IE1BWF9DQUNIRURfS0VZUykgcmV0dXJuO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBmb3IgKGNvbnN0IFtoYXNoLCBlbnRyeV0gb2YgdG9rZW5DYWNoZSkge1xuICAgIGlmIChlbnRyeS5leHBpcmVzQXQgPD0gbm93KSB0b2tlbkNhY2hlLmRlbGV0ZShoYXNoKTtcbiAgfVxuICAvLyBNYXAgcHJlc2VydmVzIGluc2VydGlvbiBvcmRlciDigJQgZHJvcCBmcm9tIHRoZSBmcm9udCB1bnRpbCBiYWNrIHVuZGVyIHRoZSBjYXAuXG4gIHdoaWxlICh0b2tlbkNhY2hlLnNpemUgPiBNQVhfQ0FDSEVEX0tFWVMpIHtcbiAgICBjb25zdCBvbGRlc3QgPSB0b2tlbkNhY2hlLmtleXMoKS5uZXh0KCk7XG4gICAgaWYgKG9sZGVzdC5kb25lKSBicmVhaztcbiAgICB0b2tlbkNhY2hlLmRlbGV0ZShvbGRlc3QudmFsdWUpO1xuICB9XG59XG5cbmludGVyZmFjZSBFeGNoYW5nZVJlc3BvbnNlIHtcbiAgc3VjY2Vzcz86IGJvb2xlYW47XG4gIGRhdGE/OiB7IGFjY2Vzc1Rva2VuPzogc3RyaW5nOyBleHBpcmVzSW4/OiBudW1iZXIgfTtcbn1cblxuLyoqIE9uZSByZWFsIHJvdW5kLXRyaXAgdG8gcGxhdGZvcm0uIFRocm93cyB0aGUgdHdvIHR5cGVkIGVycm9ycyBhYm92ZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1FeGNoYW5nZShrZXk6IHN0cmluZywgaGFzaDogc3RyaW5nKTogUHJvbWlzZTxDYWNoZUVudHJ5PiB7XG4gIGNvbnN0IGNsaWVudCA9IHBsYXRmb3JtQ2xpZW50KCk7XG4gIGxldCBzdGF0dXM6IG51bWJlcjtcbiAgbGV0IGJvZHk6IEV4Y2hhbmdlUmVzcG9uc2U7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgY2xpZW50LnBvc3Q8RXhjaGFuZ2VSZXNwb25zZT4oJy9hdXRoL3Rva2VuL2V4Y2hhbmdlJywgeyBrZXkgfSwge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBdXRob3JpemF0aW9uOiBnZXRTZXJ2aWNlQXV0aEhlYWRlcih7IHNlcnZpY2VOYW1lLCByb2xlOiAnbWVtYmVyJywgb3JnSWQ6IFNZU1RFTV9PUkdfSUQgfSksXG4gICAgICB9LFxuICAgICAgLy8gVGhlIGV4Y2hhbmdlIGlzIGEgcHVyZSByZWFkIG9mIHRoZSBrZXkgcmVjb3JkIHBsdXMgYSB0b2tlbiBtaW50IOKAlCBzYWZlIHRvXG4gICAgICAvLyByZXRyeSwgYW5kIGEgbG9zdCByZXRyeSBvbmx5IGNvc3RzIG9uZSBleHRyYSBtaW50LlxuICAgICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICB9KTtcbiAgICBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZTtcbiAgICBib2R5ID0gcmVzLmJvZHk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX3RvdGFsJywgeyByZXN1bHQ6ICd1bmF2YWlsYWJsZScgfSk7XG4gICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogJ3VuYXZhaWxhYmxlJyB9KTtcbiAgICBsb2dnZXIud2FybignQWNjZXNzLWtleSBleGNoYW5nZSBmYWlsZWQgdG8gcmVhY2ggcGxhdGZvcm0nLCB7XG4gICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEFwaUtleUV4Y2hhbmdlVW5hdmFpbGFibGVFcnJvcigpO1xuICB9XG5cbiAgaWYgKHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDAwIHx8IHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgcmVqZWN0aW9uQ2FjaGUuc2V0KGhhc2gsIERhdGUubm93KCkgKyBORUdBVElWRV9UVExfTVMpO1xuICAgIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX3RvdGFsJywgeyByZXN1bHQ6ICdyZWplY3RlZCcgfSk7XG4gICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogJ3JlamVjdGVkJyB9KTtcbiAgICB0aHJvdyBuZXcgQXBpS2V5UmVqZWN0ZWRFcnJvcigpO1xuICB9XG5cbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBib2R5Py5kYXRhPy5hY2Nlc3NUb2tlbjtcbiAgaWYgKHN0YXR1cyA+PSA0MDAgfHwgdHlwZW9mIGFjY2Vzc1Rva2VuICE9PSAnc3RyaW5nJyB8fCBhY2Nlc3NUb2tlbi5sZW5ndGggPT09IDApIHtcbiAgICAvLyA0MjkgYW5kIDV4eCBsYW5kIGhlcmU6IHBsYXRmb3JtIGlzIHVwIGJ1dCBjYW4ndCBhbnN3ZXIgcmlnaHQgbm93LCB3aGljaCBpc1xuICAgIC8vIFwidW5rbm93blwiLCBub3QgXCJpbnZhbGlkXCIg4oCUIG5ldmVyIGNhY2hlIGl0IGFzIGEgcmVqZWN0aW9uLlxuICAgIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX3RvdGFsJywgeyByZXN1bHQ6ICd1bmF2YWlsYWJsZScgfSk7XG4gICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogc3RhdHVzID09PSA0MjkgPyAndGhyb3R0bGVkJyA6ICdzZXJ2ZXJfZXJyb3InIH0pO1xuICAgIHRocm93IG5ldyBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IoKTtcbiAgfVxuXG4gIGNvbnN0IHR0bFNlY29uZHMgPSB0eXBlb2YgYm9keT8uZGF0YT8uZXhwaXJlc0luID09PSAnbnVtYmVyJyAmJiBib2R5LmRhdGEuZXhwaXJlc0luID4gMFxuICAgID8gYm9keS5kYXRhLmV4cGlyZXNJblxuICAgIDogNjA7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGVudHJ5OiBDYWNoZUVudHJ5ID0ge1xuICAgIHRva2VuOiBhY2Nlc3NUb2tlbixcbiAgICBleHBpcmVzQXQ6IG5vdyArIHR0bFNlY29uZHMgKiAxMDAwLFxuICAgIHJlZnJlc2hBdDogaml0dGVyZWRSZWZyZXNoQXQobm93LCB0dGxTZWNvbmRzKSxcbiAgfTtcbiAgdG9rZW5DYWNoZS5zZXQoaGFzaCwgZW50cnkpO1xuICByZWplY3Rpb25DYWNoZS5kZWxldGUoaGFzaCk7XG4gIGV2aWN0SWZGdWxsKCk7XG4gIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX3RvdGFsJywgeyByZXN1bHQ6ICdzdWNjZXNzJyB9KTtcbiAgcmV0dXJuIGVudHJ5O1xufVxuXG4vKiogRXhjaGFuZ2UsIHNoYXJpbmcgYSBzaW5nbGUgaW4tZmxpZ2h0IHJvdW5kLXRyaXAgcGVyIGtleS4gKi9cbmZ1bmN0aW9uIGV4Y2hhbmdlT25jZShrZXk6IHN0cmluZywgaGFzaDogc3RyaW5nKTogUHJvbWlzZTxDYWNoZUVudHJ5PiB7XG4gIGNvbnN0IHBlbmRpbmcgPSBpbkZsaWdodC5nZXQoaGFzaCk7XG4gIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZztcbiAgY29uc3QgcHJvbWlzZSA9IHBlcmZvcm1FeGNoYW5nZShrZXksIGhhc2gpLmZpbmFsbHkoKCkgPT4gaW5GbGlnaHQuZGVsZXRlKGhhc2gpKTtcbiAgaW5GbGlnaHQuc2V0KGhhc2gsIHByb21pc2UpO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLyoqXG4gKiBUaGUgSldUIGZvciBga2V5YCwgZnJvbSBjYWNoZSB3aGVuIHBvc3NpYmxlLiBUaHJvd3Mge0BsaW5rIEFwaUtleVJlamVjdGVkRXJyb3J9XG4gKiB3aGVuIHBsYXRmb3JtIHJlZnVzZWQgdGhlIGtleSBhbmQge0BsaW5rIEFwaUtleUV4Y2hhbmdlVW5hdmFpbGFibGVFcnJvcn0gd2hlblxuICogaXQgY291bGQgbm90IGJlIGFza2VkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhjaGFuZ2VBcGlLZXkoa2V5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBoYXNoID0gaGFzaEFwaUtleShrZXkpO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gIGNvbnN0IHJlamVjdGVkVW50aWwgPSByZWplY3Rpb25DYWNoZS5nZXQoaGFzaCk7XG4gIGlmIChyZWplY3RlZFVudGlsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocmVqZWN0ZWRVbnRpbCA+IG5vdykge1xuICAgICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfY2FjaGVfdG90YWwnLCB7IHJlc3VsdDogJ3JlamVjdGVkJyB9KTtcbiAgICAgIHRocm93IG5ldyBBcGlLZXlSZWplY3RlZEVycm9yKCk7XG4gICAgfVxuICAgIHJlamVjdGlvbkNhY2hlLmRlbGV0ZShoYXNoKTtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlZCA9IHRva2VuQ2FjaGUuZ2V0KGhhc2gpO1xuICBpZiAoY2FjaGVkICYmIGNhY2hlZC5leHBpcmVzQXQgPiBub3cpIHtcbiAgICBpZiAoY2FjaGVkLnJlZnJlc2hBdCA8PSBub3cgJiYgIWluRmxpZ2h0LmhhcyhoYXNoKSkge1xuICAgICAgLy8gRWFybHkgcmVmcmVzaDogd2FybSB0aGUgY2FjaGUgV0lUSE9VVCBtYWtpbmcgdGhpcyByZXF1ZXN0IHdhaXQuIEEgZmFpbGVkXG4gICAgICAvLyBiYWNrZ3JvdW5kIHJlZnJlc2ggaXMgbm90IHRoaXMgcmVxdWVzdCdzIHByb2JsZW0g4oCUIHRoZSBjYWNoZWQgdG9rZW4gaXNcbiAgICAgIC8vIHN0aWxsIHZhbGlkLCBhbmQgdGhlIG5leHQgcmVxdWVzdCBwYXN0IGV4cGlyeSBleGNoYW5nZXMgaW5saW5lLlxuICAgICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfY2FjaGVfdG90YWwnLCB7IHJlc3VsdDogJ3JlZnJlc2gnIH0pO1xuICAgICAgdm9pZCBleGNoYW5nZU9uY2Uoa2V5LCBoYXNoKS5jYXRjaCgoKSA9PiB7IC8qIGxvZ2dlZCArIGNvdW50ZWQgaW4gcGVyZm9ybUV4Y2hhbmdlICovIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0Q291bnRlcignYXBpX2tleV9leGNoYW5nZV9jYWNoZV90b3RhbCcsIHsgcmVzdWx0OiAnaGl0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZC50b2tlbjtcbiAgfVxuXG4gIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX2NhY2hlX3RvdGFsJywgeyByZXN1bHQ6ICdtaXNzJyB9KTtcbiAgcmV0dXJuIChhd2FpdCBleGNoYW5nZU9uY2Uoa2V5LCBoYXNoKSkudG9rZW47XG59XG5cbi8qKlxuICogRHJvcCBldmVyeSBjYWNoZWQgZXhjaGFuZ2UuIEZvciB0ZXN0cyBhbmQgZm9yIGEgcHJvY2VzcyB0aGF0IHdhbnRzIHRvIGZvcmNlXG4gKiByZS12YWxpZGF0aW9uOyBwcm9kdWN0aW9uIHJlbGllcyBvbiB0aGUgVFRMcyBhYm92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0QXBpS2V5RXhjaGFuZ2VDYWNoZSgpOiB2b2lkIHtcbiAgdG9rZW5DYWNoZS5jbGVhcigpO1xuICByZWplY3Rpb25DYWNoZS5jbGVhcigpO1xuICBpbkZsaWdodC5jbGVhcigpO1xufVxuIl19
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWtleS1leGNoYW5nZS5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL2FwaS1rZXktZXhjaGFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBOEJHO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzVELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRS9ELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBRWhELHVGQUF1RjtBQUN2RixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFFN0Isd0RBQXdEO0FBQ3hELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQztBQUUvQixrRkFBa0Y7QUFDbEYsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFakM7OzJEQUUyRDtBQUMzRCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsQ0FBQztBQUVwQyxpRkFBaUY7QUFDakYsTUFBTSxPQUFPLG1CQUFvQixTQUFRLEtBQUs7SUFDNUMs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QUM7SUFDbkIsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogVHJhZGUgYW4gb3BhcXVlIGFjY2VzcyBrZXkgZm9yIGEgc2hvcnQtbGl2ZWQgSldULCBvbmNlLCBhbmQgY2FjaGUgaXQuXG4gKlxuICogT25seSBwbGF0Zm9ybSwgYmlsbGluZyBhbmQgcXVvdGEgaGF2ZSBNb25nb0RCLCBzbyB0aGUgc3RhdGVsZXNzIHNlcnZpY2VzXG4gKiBjYW5ub3QgbG9vayB1cCBhIGtleSBoYXNoIOKAlCBhbmQgYXNraW5nIHBsYXRmb3JtIHRvIHZhbGlkYXRlIEVWRVJZIHJlcXVlc3RcbiAqIHdvdWxkIHB1dCBpdCBvbiB0aGUgaG90IHBhdGggb2YgdGhlIHdob2xlIGZsZWV0LiBJbnN0ZWFkIHRoaXMgbW9kdWxlIGRvZXMgdGhlXG4gKiBleGNoYW5nZSBvbmNlIHBlciBrZXkgKGBQT1NUIC9hdXRoL3Rva2VuL2V4Y2hhbmdlYCkgYW5kIGNhY2hlcyB0aGUgcmV0dXJuZWRcbiAqIEpXVCBpbi1wcm9jZXNzIHVudGlsIGl0IGV4cGlyZXMsIHNvIGByZXF1aXJlQXV0aGAgb25seSBldmVyIHZlcmlmaWVzIGEgSldULlxuICpcbiAqIFByb3BlcnRpZXMgdGhhdCBtYXR0ZXI6XG4gKlxuICogLSAqKlJldm9jYXRpb24gbGF0ZW5jeSBpcyBib3VuZGVkIGJ5IHRoZSB0b2tlbiBUVEwqKiAoNSBtaW51dGVzKS4gQSByZXZva2VkXG4gKiAgIGtleSBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCwgYW5kIHRoZSBjYWNoZWQgdG9rZW4gaXQgYWxyZWFkeSBwcm9kdWNlZFxuICogICBkaWVzIG9uIGl0cyBvd24uXG4gKiAtICoqRWFybHksIGppdHRlcmVkIHJlZnJlc2guKiogVGhlIGNhY2hlZCB0b2tlbiBpcyByZS1leGNoYW5nZWQgaW4gdGhlXG4gKiAgIGJhY2tncm91bmQgYXQgfjc1JSBvZiBpdHMgbGlmZSAowrEyMCUgaml0dGVyKSBzbyBubyByZXF1ZXN0IGV2ZXIgYmxvY2tzIG9uXG4gKiAgIHRoZSBleGNoYW5nZSwgYW5kIGEgZmxlZXQgb2YgcG9kcyBob2xkaW5nIHRoZSBzYW1lIGtleSBkb2Vzbid0IHN0YW1wZWRlXG4gKiAgIHBsYXRmb3JtIGF0IHRoZSBzYW1lIGluc3RhbnQuXG4gKiAtICoqT25lIGluLWZsaWdodCBleGNoYW5nZSBwZXIga2V5LioqIENvbmN1cnJlbnQgcmVxdWVzdHMgc2hhcmUgYSBwcm9taXNlLlxuICogLSAqKlNob3J0IG5lZ2F0aXZlIGNhY2hlLioqIEEga2V5IHBsYXRmb3JtIHJlamVjdGVkIGlzIHJlbWVtYmVyZWQgZm9yIDMwcywgc29cbiAqICAgYSBtaXNjb25maWd1cmVkIGNsaWVudCAob3IgYSBzY2FubmVyKSBjYW4ndCB0dXJuIGV2ZXJ5IHJlcXVlc3QgaW50byBhXG4gKiAgIHBsYXRmb3JtIHJvdW5kLXRyaXAuXG4gKiAtICoqUGxhdGZvcm0gZG93biBpcyBhIDUwMywgbmV2ZXIgYSAyMDAuKiogVGhlIGNhbGxlciBtYXBzXG4gKiAgIHtAbGluayBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3J9IHRvIFwidHJ5IGFnYWluXCIsIHdpdGggYSBtZXRyaWMg4oCUIGl0IGlzXG4gKiAgIGRlbGliZXJhdGVseSBOT1QgZmFpbC1vcGVuOiBhbiB1bnZlcmlmaWFibGUgY3JlZGVudGlhbCBpcyBub3QgYW4gaWRlbnRpdHkuXG4gKlxuICogVGhlIGV4Y2hhbmdlIHJlcXVlc3QgaXRzZWxmIGNhcnJpZXMgdGhpcyBzZXJ2aWNlJ3Mgb3duIHNpZ25lZCBzZXJ2aWNlIHRva2VuLFxuICogd2hpY2ggaXMgd2hhdCBleGVtcHRzIGl0IGZyb20gcGxhdGZvcm0ncyBJUC1rZXllZCBgL2F1dGhgIHJhdGUgbGltaXRlciAoZXZlcnlcbiAqIHBvZCdzIGV4Y2hhbmdlcyB3b3VsZCBvdGhlcndpc2Ugc2hhcmUgb25lIGJ1Y2tldCkgYW5kIG5hbWVzIHRoZSBjYWxsZXIgaW5cbiAqIHBsYXRmb3JtJ3MgYXVkaXQgdHJhaWwuXG4gKi9cblxuaW1wb3J0IHsgQ0xJRU5UX1ZFUlNJT05fSEVBREVSIH0gZnJvbSAnLi4vbWlkZGxld2FyZS9jbGllbnQtdmVyc2lvbi5qcyc7XG5pbXBvcnQgeyBnZXRTZXJ2aWNlQXV0aEhlYWRlciB9IGZyb20gJy4uL21pZGRsZXdhcmUvc2VydmljZS10b2tlbnMuanMnO1xuaW1wb3J0IHsgU1lTVEVNX09SR19JRCB9IGZyb20gJy4uL21pZGRsZXdhcmUvc3lzdGVtLW9yZy5qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbEh0dHBDbGllbnQgfSBmcm9tICcuLi9zZXJ2aWNlcy9odHRwLWNsaWVudC5qcyc7XG5pbXBvcnQgeyBoYXNoQXBpS2V5IH0gZnJvbSAnLi4vdXRpbHMvYXBpLWtleS5qcyc7XG5pbXBvcnQgeyBlbnZJbnQgfSBmcm9tICcuLi91dGlscy9lbnYuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuaW1wb3J0IHsgc2VydmljZUVuZHBvaW50IH0gZnJvbSAnLi4vdXRpbHMvc2VydmljZS1yZWdpc3RyeS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXBpLWtleS1leGNoYW5nZScpO1xuXG4vKiogTW9zdCBkaXN0aW5jdCBrZXlzIGhlbGQgaW4gdGhlIHByb2Nlc3Mtd2lkZSBjYWNoZSBiZWZvcmUgdGhlIG9sZGVzdCBhcmUgZHJvcHBlZC4gKi9cbmNvbnN0IE1BWF9DQUNIRURfS0VZUyA9IDEwMDA7XG5cbi8qKiBIb3cgbG9uZyBhIHBsYXRmb3JtIFJFSkVDVElPTiBpcyByZW1lbWJlcmVkIChtcykuICovXG5jb25zdCBORUdBVElWRV9UVExfTVMgPSAzMF8wMDA7XG5cbi8qKiBGcmFjdGlvbiBvZiBhIHRva2VuJ3MgbGlmZSBhZnRlciB3aGljaCBhIGJhY2tncm91bmQgcmUtZXhjaGFuZ2UgaXMgc3RhcnRlZC4gKi9cbmNvbnN0IFJFRlJFU0hfQVRfRlJBQ1RJT04gPSAwLjc1O1xuXG4vKiogwrEgaml0dGVyIGFwcGxpZWQgdG8gdGhlIHJlZnJlc2ggcG9pbnQsIGFzIGEgZnJhY3Rpb24gb2YgdGhlIHRva2VuJ3MgbGlmZS5cbiAqICBXaWRlIGVub3VnaCB0byBkZS1zeW5jaHJvbml6ZSBhIGZsZWV0LCBuYXJyb3cgZW5vdWdoIHRvIGxlYXZlIGEgY2xlYXIgdGFpbCBvZlxuICogIHN0aWxsLXZhbGlkIHRva2VuIGFmdGVyIHRoZSBsYXRlc3QgcG9zc2libGUgcmVmcmVzaC4gKi9cbmNvbnN0IFJFRlJFU0hfSklUVEVSX0ZSQUNUSU9OID0gMC4xO1xuXG4vKiogVGhlIGtleSB3YXMgcHJlc2VudGVkIHRvIHBsYXRmb3JtIGFuZCByZWZ1c2VkICh1bmtub3duLCByZXZva2VkLCBleHBpcmVkKS4gKi9cbmV4cG9ydCBjbGFzcyBBcGlLZXlSZWplY3RlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ0FjY2VzcyBrZXkgaXMgaW52YWxpZCwgcmV2b2tlZCBvciBleHBpcmVkJykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdBcGlLZXlSZWplY3RlZEVycm9yJztcbiAgfVxufVxuXG4vKiogUGxhdGZvcm0gY291bGQgbm90IGJlIHJlYWNoZWQgKG9yIGFuc3dlcmVkIDV4eCkg4oCUIHRoZSBrZXkncyB2YWxpZGl0eSBpcyB1bmtub3duLiAqL1xuZXhwb3J0IGNsYXNzIEFwaUtleUV4Y2hhbmdlVW5hdmFpbGFibGVFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdBY2Nlc3Mta2V5IHZlcmlmaWNhdGlvbiBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZScpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yJztcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ2FjaGVFbnRyeSB7XG4gIC8qKiBUaGUgZXhjaGFuZ2VkIEpXVC4gKi9cbiAgdG9rZW46IHN0cmluZztcbiAgLyoqIEVwb2NoIG1zIGF0IHdoaWNoIHRoZSBKV1Qgc3RvcHMgYmVpbmcgdXNhYmxlLiAqL1xuICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgLyoqIEVwb2NoIG1zIGFmdGVyIHdoaWNoIGEgYmFja2dyb3VuZCByZS1leGNoYW5nZSBzaG91bGQgYmUgc3RhcnRlZC4gKi9cbiAgcmVmcmVzaEF0OiBudW1iZXI7XG59XG5cbi8qKiBDYWNoZSBvZiBzdWNjZXNzZnVsIGV4Y2hhbmdlcywga2V5ZWQgYnkgYHNoYTI1NihrZXkpYCDigJQgbmV2ZXIgYnkgdGhlIGtleSBpdHNlbGYuICovXG5jb25zdCB0b2tlbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlRW50cnk+KCk7XG4vKiogQ2FjaGUgb2YgcmVqZWN0aW9ucywga2V5ZWQgdGhlIHNhbWUgd2F5OyB2YWx1ZSBpcyB0aGUgZXBvY2ggbXMgaXQgZXhwaXJlcy4gKi9cbmNvbnN0IHJlamVjdGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbi8qKiBJbi1mbGlnaHQgZXhjaGFuZ2VzLCBzbyBjb25jdXJyZW50IHJlcXVlc3RzIGZvciBvbmUga2V5IHNoYXJlIGEgcm91bmQtdHJpcC4gKi9cbmNvbnN0IGluRmxpZ2h0ID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8Q2FjaGVFbnRyeT4+KCk7XG5cbi8qKiBUaGUgc2VydmljZSBuYW1lIG1pbnRlZCBpbnRvIHRoZSBleGNoYW5nZSBjYWxsJ3Mgb3duIHNlcnZpY2UgdG9rZW4uICovXG5sZXQgc2VydmljZU5hbWUgPSBwcm9jZXNzLmVudi5TRVJWSUNFX05BTUUgfHwgJ3Vua25vd24nO1xuXG4vKipcbiAqIE5hbWUgdGhpcyBwcm9jZXNzIGluIHRoZSBleGNoYW5nZSBjYWxsJ3Mgc2VydmljZSB0b2tlbi4gQ2FsbGVkIGZyb21cbiAqIGB3aXJlU2VydmljZVNlY3VyaXR5YCBhdCBib290IChhbmQgYnkgdGhlIHBsdWdpbiBzZXJ2aWNlLCB3aGljaCB3aXJlcyBpdHNcbiAqIGJvb3Qgc2VjdXJpdHkgYnkgaGFuZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRBcGlLZXlFeGNoYW5nZVNlcnZpY2VOYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBzZXJ2aWNlTmFtZSA9IG5hbWU7XG59XG5cbi8qKiBQbGF0Zm9ybSdzIGluLWNsdXN0ZXIgYWRkcmVzcyDigJQgdGhlIHNhbWUgZW52IHBhaXIgZXZlcnkgb3RoZXIgY2FsbGVyIHVzZXMuICovXG5mdW5jdGlvbiBwbGF0Zm9ybUNsaWVudCgpOiBJbnRlcm5hbEh0dHBDbGllbnQge1xuICByZXR1cm4gbmV3IEludGVybmFsSHR0cENsaWVudCh7XG4gICAgLi4uc2VydmljZUVuZHBvaW50KCdwbGF0Zm9ybScpLFxuICAgIHRpbWVvdXQ6IGVudkludCgnQVBJX0tFWV9FWENIQU5HRV9USU1FT1VUX01TJywgMzAwMCwgeyBtaW46IDEgfSksXG4gIH0pO1xufVxuXG4vKiogVGhlIGVwb2NoIG1zIGF0IHdoaWNoIGEgdG9rZW4gd2l0aCBgdHRsU2Vjb25kc2Agb2YgbGlmZSBzaG91bGQgYmUgcmVmcmVzaGVkIGVhcmx5LiAqL1xuZnVuY3Rpb24gaml0dGVyZWRSZWZyZXNoQXQoaXNzdWVkQXQ6IG51bWJlciwgdHRsU2Vjb25kczogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgbGlmZU1zID0gdHRsU2Vjb25kcyAqIDEwMDA7XG4gIGNvbnN0IGppdHRlciA9IChNYXRoLnJhbmRvbSgpICogMiAtIDEpICogUkVGUkVTSF9KSVRURVJfRlJBQ1RJT047XG4gIC8vIENsYW1wIGludG8gKDAsIDEpIHNvIHRoZSByZWZyZXNoIHBvaW50IGlzIGFsd2F5cyBiZWZvcmUgZXhwaXJ5IGFuZCBuZXZlciBpblxuICAvLyB0aGUgcGFzdCwgd2hhdGV2ZXIgVFRMIHBsYXRmb3JtIHJldHVybnMuXG4gIGNvbnN0IGZyYWN0aW9uID0gTWF0aC5taW4oMC45NSwgTWF0aC5tYXgoMC4xLCBSRUZSRVNIX0FUX0ZSQUNUSU9OICsgaml0dGVyKSk7XG4gIHJldHVybiBpc3N1ZWRBdCArIGxpZmVNcyAqIGZyYWN0aW9uO1xufVxuXG4vKiogRHJvcCB0aGUgb2xkZXN0IGVudHJpZXMgb25jZSB0aGUgY2FjaGUgaXMgb3ZlciBpdHMgY2FwIChrZXlzIGFyZSBsb25nLWxpdmVkLCB0b2tlbnMgYXJlIG5vdCkuICovXG5mdW5jdGlvbiBldmljdElmRnVsbCgpOiB2b2lkIHtcbiAgaWYgKHRva2VuQ2FjaGUuc2l6ZSA8PSBNQVhfQ0FDSEVEX0tFWVMpIHJldHVybjtcbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgZm9yIChjb25zdCBbaGFzaCwgZW50cnldIG9mIHRva2VuQ2FjaGUpIHtcbiAgICBpZiAoZW50cnkuZXhwaXJlc0F0IDw9IG5vdykgdG9rZW5DYWNoZS5kZWxldGUoaGFzaCk7XG4gIH1cbiAgLy8gTWFwIHByZXNlcnZlcyBpbnNlcnRpb24gb3JkZXIg4oCUIGRyb3AgZnJvbSB0aGUgZnJvbnQgdW50aWwgYmFjayB1bmRlciB0aGUgY2FwLlxuICB3aGlsZSAodG9rZW5DYWNoZS5zaXplID4gTUFYX0NBQ0hFRF9LRVlTKSB7XG4gICAgY29uc3Qgb2xkZXN0ID0gdG9rZW5DYWNoZS5rZXlzKCkubmV4dCgpO1xuICAgIGlmIChvbGRlc3QuZG9uZSkgYnJlYWs7XG4gICAgdG9rZW5DYWNoZS5kZWxldGUob2xkZXN0LnZhbHVlKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgRXhjaGFuZ2VSZXNwb25zZSB7XG4gIHN1Y2Nlc3M/OiBib29sZWFuO1xuICBkYXRhPzogeyBhY2Nlc3NUb2tlbj86IHN0cmluZzsgZXhwaXJlc0luPzogbnVtYmVyIH07XG59XG5cbi8qKiBPbmUgcmVhbCByb3VuZC10cmlwIHRvIHBsYXRmb3JtLiBUaHJvd3MgdGhlIHR3byB0eXBlZCBlcnJvcnMgYWJvdmUuICovXG5hc3luYyBmdW5jdGlvbiBwZXJmb3JtRXhjaGFuZ2Uoa2V5OiBzdHJpbmcsIGhhc2g6IHN0cmluZywgY2xpZW50VmVyc2lvbj86IHN0cmluZyk6IFByb21pc2U8Q2FjaGVFbnRyeT4ge1xuICBjb25zdCBjbGllbnQgPSBwbGF0Zm9ybUNsaWVudCgpO1xuICBsZXQgc3RhdHVzOiBudW1iZXI7XG4gIGxldCBib2R5OiBFeGNoYW5nZVJlc3BvbnNlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5wb3N0PEV4Y2hhbmdlUmVzcG9uc2U+KCcvYXV0aC90b2tlbi9leGNoYW5nZScsIHsga2V5IH0sIHtcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgQXV0aG9yaXphdGlvbjogZ2V0U2VydmljZUF1dGhIZWFkZXIoeyBzZXJ2aWNlTmFtZSwgcm9sZTogJ21lbWJlcicsIG9yZ0lkOiBTWVNURU1fT1JHX0lEIH0pLFxuICAgICAgICAvLyBUaGUgQ0xJIHZlcnNpb24gdGhlIGtleSdzIGhvbGRlciBpcyBjYWxsaW5nIHdpdGggKHZhbGlkYXRlZCBieSB0aGVcbiAgICAgICAgLy8gY2FsbGVyKSwgc28gcGxhdGZvcm0gY2FuIHN0YW1wIGl0IG9uIHRoZSBrZXkgKFwibGFzdCBDTEkgdmVyc2lvblwiKSBmb3JcbiAgICAgICAgLy8gb3JnIGFkbWlucy4gQWJzZW50IOKGkiBwbGF0Zm9ybSBrZWVwcyB0aGUgdmVyc2lvbiBpdCBhbHJlYWR5IGhhcy5cbiAgICAgICAgLi4uKGNsaWVudFZlcnNpb24gPyB7IFtDTElFTlRfVkVSU0lPTl9IRUFERVJdOiBjbGllbnRWZXJzaW9uIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgLy8gVGhlIGV4Y2hhbmdlIGlzIGEgcHVyZSByZWFkIG9mIHRoZSBrZXkgcmVjb3JkIHBsdXMgYSB0b2tlbiBtaW50IOKAlCBzYWZlIHRvXG4gICAgICAvLyByZXRyeSwgYW5kIGEgbG9zdCByZXRyeSBvbmx5IGNvc3RzIG9uZSBleHRyYSBtaW50LlxuICAgICAgaWRlbXBvdGVudDogdHJ1ZSxcbiAgICB9KTtcbiAgICBzdGF0dXMgPSByZXMuc3RhdHVzQ29kZTtcbiAgICBib2R5ID0gcmVzLmJvZHk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX3RvdGFsJywgeyByZXN1bHQ6ICd1bmF2YWlsYWJsZScgfSk7XG4gICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogJ3VuYXZhaWxhYmxlJyB9KTtcbiAgICBsb2dnZXIud2FybignQWNjZXNzLWtleSBleGNoYW5nZSBmYWlsZWQgdG8gcmVhY2ggcGxhdGZvcm0nLCB7XG4gICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgdGhyb3cgbmV3IEFwaUtleUV4Y2hhbmdlVW5hdmFpbGFibGVFcnJvcigpO1xuICB9XG5cbiAgaWYgKHN0YXR1cyA9PT0gNDAxIHx8IHN0YXR1cyA9PT0gNDAzIHx8IHN0YXR1cyA9PT0gNDAwIHx8IHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgcmVqZWN0aW9uQ2FjaGUuc2V0KGhhc2gsIERhdGUubm93KCkgKyBORUdBVElWRV9UVExfTVMpO1xuICAgIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX3RvdGFsJywgeyByZXN1bHQ6ICdyZWplY3RlZCcgfSk7XG4gICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogJ3JlamVjdGVkJyB9KTtcbiAgICB0aHJvdyBuZXcgQXBpS2V5UmVqZWN0ZWRFcnJvcigpO1xuICB9XG5cbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBib2R5Py5kYXRhPy5hY2Nlc3NUb2tlbjtcbiAgaWYgKHN0YXR1cyA+PSA0MDAgfHwgdHlwZW9mIGFjY2Vzc1Rva2VuICE9PSAnc3RyaW5nJyB8fCBhY2Nlc3NUb2tlbi5sZW5ndGggPT09IDApIHtcbiAgICAvLyA0MjkgYW5kIDV4eCBsYW5kIGhlcmU6IHBsYXRmb3JtIGlzIHVwIGJ1dCBjYW4ndCBhbnN3ZXIgcmlnaHQgbm93LCB3aGljaCBpc1xuICAgIC8vIFwidW5rbm93blwiLCBub3QgXCJpbnZhbGlkXCIg4oCUIG5ldmVyIGNhY2hlIGl0IGFzIGEgcmVqZWN0aW9uLlxuICAgIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX3RvdGFsJywgeyByZXN1bHQ6ICd1bmF2YWlsYWJsZScgfSk7XG4gICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfZmFpbHVyZXNfdG90YWwnLCB7IHJlYXNvbjogc3RhdHVzID09PSA0MjkgPyAndGhyb3R0bGVkJyA6ICdzZXJ2ZXJfZXJyb3InIH0pO1xuICAgIHRocm93IG5ldyBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IoKTtcbiAgfVxuXG4gIGNvbnN0IHR0bFNlY29uZHMgPSB0eXBlb2YgYm9keT8uZGF0YT8uZXhwaXJlc0luID09PSAnbnVtYmVyJyAmJiBib2R5LmRhdGEuZXhwaXJlc0luID4gMFxuICAgID8gYm9keS5kYXRhLmV4cGlyZXNJblxuICAgIDogNjA7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IGVudHJ5OiBDYWNoZUVudHJ5ID0ge1xuICAgIHRva2VuOiBhY2Nlc3NUb2tlbixcbiAgICBleHBpcmVzQXQ6IG5vdyArIHR0bFNlY29uZHMgKiAxMDAwLFxuICAgIHJlZnJlc2hBdDogaml0dGVyZWRSZWZyZXNoQXQobm93LCB0dGxTZWNvbmRzKSxcbiAgfTtcbiAgdG9rZW5DYWNoZS5zZXQoaGFzaCwgZW50cnkpO1xuICByZWplY3Rpb25DYWNoZS5kZWxldGUoaGFzaCk7XG4gIGV2aWN0SWZGdWxsKCk7XG4gIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX3RvdGFsJywgeyByZXN1bHQ6ICdzdWNjZXNzJyB9KTtcbiAgcmV0dXJuIGVudHJ5O1xufVxuXG4vKiogRXhjaGFuZ2UsIHNoYXJpbmcgYSBzaW5nbGUgaW4tZmxpZ2h0IHJvdW5kLXRyaXAgcGVyIGtleS4gKi9cbmZ1bmN0aW9uIGV4Y2hhbmdlT25jZShrZXk6IHN0cmluZywgaGFzaDogc3RyaW5nLCBjbGllbnRWZXJzaW9uPzogc3RyaW5nKTogUHJvbWlzZTxDYWNoZUVudHJ5PiB7XG4gIGNvbnN0IHBlbmRpbmcgPSBpbkZsaWdodC5nZXQoaGFzaCk7XG4gIGlmIChwZW5kaW5nKSByZXR1cm4gcGVuZGluZztcbiAgY29uc3QgcHJvbWlzZSA9IHBlcmZvcm1FeGNoYW5nZShrZXksIGhhc2gsIGNsaWVudFZlcnNpb24pLmZpbmFsbHkoKCkgPT4gaW5GbGlnaHQuZGVsZXRlKGhhc2gpKTtcbiAgaW5GbGlnaHQuc2V0KGhhc2gsIHByb21pc2UpO1xuICByZXR1cm4gcHJvbWlzZTtcbn1cblxuLyoqXG4gKiBUaGUgSldUIGZvciBga2V5YCwgZnJvbSBjYWNoZSB3aGVuIHBvc3NpYmxlLiBUaHJvd3Mge0BsaW5rIEFwaUtleVJlamVjdGVkRXJyb3J9XG4gKiB3aGVuIHBsYXRmb3JtIHJlZnVzZWQgdGhlIGtleSBhbmQge0BsaW5rIEFwaUtleUV4Y2hhbmdlVW5hdmFpbGFibGVFcnJvcn0gd2hlblxuICogaXQgY291bGQgbm90IGJlIGFza2VkLiBgY2xpZW50VmVyc2lvbmAgaXMgdGhlIHByZXNlbnRpbmcgcmVxdWVzdCdzXG4gKiBgWC1QYi1DbGllbnQtVmVyc2lvbmAgKGFscmVhZHkgdmFsaWRhdGVkIOKAlCBzZWUgYGNsaWVudFZlcnNpb25PZmApLCBmb3J3YXJkZWRcbiAqIHNvIHBsYXRmb3JtIGNhbiByZWNvcmQgd2hpY2ggQ0xJIHRoZSBrZXkgaXMgdXNlZCB3aXRoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhjaGFuZ2VBcGlLZXkoa2V5OiBzdHJpbmcsIGNsaWVudFZlcnNpb24/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBoYXNoID0gaGFzaEFwaUtleShrZXkpO1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuXG4gIGNvbnN0IHJlamVjdGVkVW50aWwgPSByZWplY3Rpb25DYWNoZS5nZXQoaGFzaCk7XG4gIGlmIChyZWplY3RlZFVudGlsICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAocmVqZWN0ZWRVbnRpbCA+IG5vdykge1xuICAgICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfY2FjaGVfdG90YWwnLCB7IHJlc3VsdDogJ3JlamVjdGVkJyB9KTtcbiAgICAgIHRocm93IG5ldyBBcGlLZXlSZWplY3RlZEVycm9yKCk7XG4gICAgfVxuICAgIHJlamVjdGlvbkNhY2hlLmRlbGV0ZShoYXNoKTtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlZCA9IHRva2VuQ2FjaGUuZ2V0KGhhc2gpO1xuICBpZiAoY2FjaGVkICYmIGNhY2hlZC5leHBpcmVzQXQgPiBub3cpIHtcbiAgICBpZiAoY2FjaGVkLnJlZnJlc2hBdCA8PSBub3cgJiYgIWluRmxpZ2h0LmhhcyhoYXNoKSkge1xuICAgICAgLy8gRWFybHkgcmVmcmVzaDogd2FybSB0aGUgY2FjaGUgV0lUSE9VVCBtYWtpbmcgdGhpcyByZXF1ZXN0IHdhaXQuIEEgZmFpbGVkXG4gICAgICAvLyBiYWNrZ3JvdW5kIHJlZnJlc2ggaXMgbm90IHRoaXMgcmVxdWVzdCdzIHByb2JsZW0g4oCUIHRoZSBjYWNoZWQgdG9rZW4gaXNcbiAgICAgIC8vIHN0aWxsIHZhbGlkLCBhbmQgdGhlIG5leHQgcmVxdWVzdCBwYXN0IGV4cGlyeSBleGNoYW5nZXMgaW5saW5lLlxuICAgICAgZW1pdENvdW50ZXIoJ2FwaV9rZXlfZXhjaGFuZ2VfY2FjaGVfdG90YWwnLCB7IHJlc3VsdDogJ3JlZnJlc2gnIH0pO1xuICAgICAgdm9pZCBleGNoYW5nZU9uY2Uoa2V5LCBoYXNoLCBjbGllbnRWZXJzaW9uKS5jYXRjaCgoKSA9PiB7IC8qIGxvZ2dlZCArIGNvdW50ZWQgaW4gcGVyZm9ybUV4Y2hhbmdlICovIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbWl0Q291bnRlcignYXBpX2tleV9leGNoYW5nZV9jYWNoZV90b3RhbCcsIHsgcmVzdWx0OiAnaGl0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZC50b2tlbjtcbiAgfVxuXG4gIGVtaXRDb3VudGVyKCdhcGlfa2V5X2V4Y2hhbmdlX2NhY2hlX3RvdGFsJywgeyByZXN1bHQ6ICdtaXNzJyB9KTtcbiAgcmV0dXJuIChhd2FpdCBleGNoYW5nZU9uY2Uoa2V5LCBoYXNoLCBjbGllbnRWZXJzaW9uKSkudG9rZW47XG59XG5cbi8qKlxuICogRHJvcCBldmVyeSBjYWNoZWQgZXhjaGFuZ2UuIEZvciB0ZXN0cyBhbmQgZm9yIGEgcHJvY2VzcyB0aGF0IHdhbnRzIHRvIGZvcmNlXG4gKiByZS12YWxpZGF0aW9uOyBwcm9kdWN0aW9uIHJlbGllcyBvbiB0aGUgVFRMcyBhYm92ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0QXBpS2V5RXhjaGFuZ2VDYWNoZSgpOiB2b2lkIHtcbiAgdG9rZW5DYWNoZS5jbGVhcigpO1xuICByZWplY3Rpb25DYWNoZS5jbGVhcigpO1xuICBpbkZsaWdodC5jbGVhcigpO1xufVxuIl19
|
|
@@ -8,6 +8,8 @@ export interface AuditCorrelation {
|
|
|
8
8
|
codebuildBuildId?: string;
|
|
9
9
|
/** `X-Source-Event-Id` — the upstream event (EventBridge / webhook) being handled. */
|
|
10
10
|
sourceEventId?: string;
|
|
11
|
+
/** `X-Pb-Client-Version` — the pipeline-manager CLI version that made the call. */
|
|
12
|
+
clientVersion?: string;
|
|
11
13
|
}
|
|
12
14
|
/** Background-work identity for events recorded outside any request. */
|
|
13
15
|
export interface AuditJobContext {
|
|
@@ -76,6 +78,7 @@ export declare const AUDIT_CORRELATION_HEADERS: {
|
|
|
76
78
|
readonly pipelineExecutionId: 'x-pipeline-execution-id';
|
|
77
79
|
readonly codebuildBuildId: 'x-codebuild-build-id';
|
|
78
80
|
readonly sourceEventId: 'x-source-event-id';
|
|
81
|
+
readonly clientVersion: 'x-pb-client-version';
|
|
79
82
|
};
|
|
80
83
|
/**
|
|
81
84
|
* Validate an inbound correlation id (`X-Request-Id`, `X-CodeBuild-Build-Id`, …):
|