@pipeline-builder/api-core 5.2.3 → 5.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/constants/ai-providers.d.ts +3 -22
- package/lib/constants/ai-providers.js +6 -56
- package/lib/errors/app-errors.d.ts +14 -0
- package/lib/errors/app-errors.js +21 -1
- package/lib/helpers/sse-helpers.d.ts +33 -3
- package/lib/helpers/sse-helpers.js +91 -19
- package/lib/middleware/auth.js +6 -3
- package/lib/middleware/deferred-quota-check.d.ts +5 -0
- package/lib/middleware/deferred-quota-check.js +33 -0
- package/lib/middleware/ecosystem-guard.d.ts +3 -3
- package/lib/middleware/ecosystem-guard.js +5 -5
- package/lib/middleware/index.d.ts +5 -2
- package/lib/middleware/index.js +6 -3
- package/lib/middleware/on-behalf.d.ts +37 -0
- package/lib/middleware/on-behalf.js +143 -0
- package/lib/middleware/permission-gates.d.ts +11 -0
- package/lib/middleware/permission-gates.js +7 -1
- package/lib/middleware/quota-exempt-routes.d.ts +36 -0
- package/lib/middleware/quota-exempt-routes.js +47 -0
- package/lib/middleware/route-table.d.ts +104 -0
- package/lib/middleware/route-table.js +72 -2
- package/lib/middleware/service-tokens.d.ts +8 -0
- package/lib/middleware/service-tokens.js +2 -1
- package/lib/middleware/step-up.js +11 -1
- package/lib/services/ai-call-weight.d.ts +24 -0
- package/lib/services/ai-call-weight.js +77 -0
- package/lib/services/audit-context.d.ts +105 -0
- package/lib/services/audit-context.js +134 -0
- package/lib/services/index.d.ts +7 -2
- package/lib/services/index.js +7 -2
- package/lib/services/org-ai-client.d.ts +61 -0
- package/lib/services/org-ai-client.js +112 -0
- package/lib/services/quota-increment-batcher.d.ts +81 -0
- package/lib/services/quota-increment-batcher.js +166 -0
- package/lib/services/quota.d.ts +158 -14
- package/lib/services/quota.js +252 -22
- package/lib/services/remote-audit-client.d.ts +44 -1
- package/lib/services/remote-audit-client.js +106 -20
- package/lib/services/version-vuln-policy.d.ts +174 -0
- package/lib/services/version-vuln-policy.js +242 -0
- package/lib/types/ai-catalog.d.ts +63 -0
- package/lib/types/ai-catalog.js +82 -0
- package/lib/types/ask-proposals.js +6 -6
- package/lib/types/build-catalog.d.ts +154 -0
- package/lib/types/build-catalog.js +158 -0
- package/lib/types/common.d.ts +37 -3
- package/lib/types/common.js +20 -2
- package/lib/types/ecosystem-notifications.d.ts +5 -5
- package/lib/types/ecosystem-notifications.js +9 -3
- package/lib/types/error-codes.d.ts +13 -6
- package/lib/types/error-codes.js +18 -8
- package/lib/types/feature-flags.d.ts +6 -4
- package/lib/types/feature-flags.js +11 -6
- package/lib/types/index.d.ts +6 -4
- package/lib/types/index.js +12 -5
- package/lib/types/metadata-keys.d.ts +6 -0
- package/lib/types/metadata-keys.js +4 -1
- package/lib/types/permissions.d.ts +344 -3
- package/lib/types/permissions.js +596 -21
- package/lib/types/pipeline.d.ts +39 -0
- package/lib/types/pipeline.js +57 -1
- package/lib/types/plugin-health.d.ts +0 -2
- package/lib/types/plugin-health.js +1 -11
- package/lib/types/plugin-scan.d.ts +192 -42
- package/lib/types/plugin-scan.js +159 -43
- package/lib/types/quota-catalog.d.ts +247 -0
- package/lib/types/quota-catalog.js +122 -0
- package/lib/types/quota-tiers.d.ts +118 -0
- package/lib/types/quota-tiers.js +153 -2
- package/lib/types/remote-audit-actions.d.ts +1 -1
- package/lib/types/remote-audit-actions.js +131 -1
- package/lib/types/wire-vocabulary.js +8 -1
- package/lib/utils/index.d.ts +1 -1
- package/lib/utils/index.js +2 -2
- package/lib/utils/response.d.ts +35 -2
- package/lib/utils/response.js +42 -3
- package/lib/validation/ai-schemas.d.ts +27 -0
- package/lib/validation/ai-schemas.js +31 -5
- package/lib/validation/plugin-schemas.d.ts +15 -0
- package/lib/validation/plugin-schemas.js +28 -1
- package/package.json +31 -2
|
@@ -1,25 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
id: string;
|
|
5
|
-
/** Human-readable display name (e.g. "Claude Sonnet 5"). */
|
|
6
|
-
name: string;
|
|
7
|
-
}
|
|
8
|
-
/** Metadata for an AI provider with its available models. */
|
|
9
|
-
export interface AIProviderInfo {
|
|
10
|
-
/** Provider identifier (e.g. "anthropic", "openai", "google"). */
|
|
11
|
-
id: string;
|
|
12
|
-
/** Human-readable display name (e.g. "Anthropic"). */
|
|
13
|
-
name: string;
|
|
14
|
-
/** Models available for this provider. */
|
|
15
|
-
models: AIModelInfo[];
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Standard AI provider catalog — single source of truth for all supported
|
|
19
|
-
* providers and their models. Used by both backend services and frontend
|
|
20
|
-
* components.
|
|
21
|
-
*/
|
|
22
|
-
export declare const AI_PROVIDER_CATALOG: Record<string, AIProviderInfo>;
|
|
1
|
+
import { type AIModelInfo, type AIProviderInfo } from '../types/ai-catalog.js';
|
|
2
|
+
export { AI_PROVIDER_CATALOG, AI_PROVIDER_NAMES, AI_PROVIDER_MODELS, AI_KEY_PROVIDER_IDS, isKeylessProviderId } from '../types/ai-catalog.js';
|
|
3
|
+
export type { AIModelInfo, AIProviderInfo } from '../types/ai-catalog.js';
|
|
23
4
|
/**
|
|
24
5
|
* Environment variable names for each AI provider's API key.
|
|
25
6
|
* Used by backend services to initialize the provider registry.
|
|
@@ -1,60 +1,10 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
*/
|
|
9
|
-
export const AI_PROVIDER_CATALOG = {
|
|
10
|
-
'anthropic': {
|
|
11
|
-
id: 'anthropic',
|
|
12
|
-
name: 'Anthropic',
|
|
13
|
-
models: [
|
|
14
|
-
{ id: 'claude-sonnet-5', name: 'Claude Sonnet 5' },
|
|
15
|
-
{ id: 'claude-opus-5', name: 'Claude Opus 5' },
|
|
16
|
-
{ id: 'claude-haiku-4-5-20251001', name: 'Claude Haiku 4.5' },
|
|
17
|
-
],
|
|
18
|
-
},
|
|
19
|
-
'openai': {
|
|
20
|
-
id: 'openai',
|
|
21
|
-
name: 'OpenAI',
|
|
22
|
-
models: [
|
|
23
|
-
{ id: 'gpt-5.6-sol', name: 'GPT-5.6 Sol' },
|
|
24
|
-
{ id: 'gpt-5.6-terra', name: 'GPT-5.6 Terra' },
|
|
25
|
-
{ id: 'gpt-5.6-luna', name: 'GPT-5.6 Luna' },
|
|
26
|
-
],
|
|
27
|
-
},
|
|
28
|
-
'google': {
|
|
29
|
-
id: 'google',
|
|
30
|
-
name: 'Google',
|
|
31
|
-
models: [
|
|
32
|
-
{ id: 'gemini-3.7-flash', name: 'Gemini 3.7 Flash' },
|
|
33
|
-
{ id: 'gemini-3.1-pro-preview', name: 'Gemini 3.1 Pro' },
|
|
34
|
-
],
|
|
35
|
-
},
|
|
36
|
-
'xai': {
|
|
37
|
-
id: 'xai',
|
|
38
|
-
name: 'xAI (Grok)',
|
|
39
|
-
models: [
|
|
40
|
-
{ id: 'grok-4.6', name: 'Grok 4.6' },
|
|
41
|
-
{ id: 'grok-4.5', name: 'Grok 4.5' },
|
|
42
|
-
{ id: 'grok-4.3', name: 'Grok 4.3' },
|
|
43
|
-
],
|
|
44
|
-
},
|
|
45
|
-
'amazon-bedrock': {
|
|
46
|
-
id: 'amazon-bedrock',
|
|
47
|
-
name: 'Amazon Bedrock',
|
|
48
|
-
// Bedrock ids are region-scoped cross-region inference profiles; the `us.`
|
|
49
|
-
// prefix targets US regions — swap the prefix (eu./apac./…) to match your
|
|
50
|
-
// deploy region, and confirm availability in the Bedrock console.
|
|
51
|
-
models: [
|
|
52
|
-
{ id: 'us.anthropic.claude-sonnet-4-5-20250929-v1:0', name: 'Claude Sonnet 4.5' },
|
|
53
|
-
{ id: 'us.amazon.nova-pro-v1:0', name: 'Amazon Nova Pro' },
|
|
54
|
-
{ id: 'us.amazon.nova-lite-v1:0', name: 'Amazon Nova Lite' },
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
};
|
|
3
|
+
import { AI_PROVIDER_CATALOG } from '../types/ai-catalog.js';
|
|
4
|
+
// The catalog itself is data-only and lives in `types/ai-catalog.ts` (the
|
|
5
|
+
// browser-safe `./ai-catalog` subpath); re-exported here so server code keeps one
|
|
6
|
+
// import site for everything AI-provider.
|
|
7
|
+
export { AI_PROVIDER_CATALOG, AI_PROVIDER_NAMES, AI_PROVIDER_MODELS, AI_KEY_PROVIDER_IDS, isKeylessProviderId } from '../types/ai-catalog.js';
|
|
58
8
|
/**
|
|
59
9
|
* Environment variable names for each AI provider's API key.
|
|
60
10
|
* Used by backend services to initialize the provider registry.
|
|
@@ -126,4 +76,4 @@ export function getAIProviderModels(providerId) {
|
|
|
126
76
|
}
|
|
127
77
|
return AI_PROVIDER_CATALOG[providerId]?.models ?? [];
|
|
128
78
|
}
|
|
129
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktcHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy9haS1wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQXNCdEMsVUFBVTtBQUVWOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBbUM7SUFDakUsV0FBVyxFQUFFO1FBQ1gsRUFBRSxFQUFFLFdBQVc7UUFDZixJQUFJLEVBQUUsV0FBVztRQUNqQixNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDbEQsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7WUFDOUMsRUFBRSxFQUFFLEVBQUUsMkJBQTJCLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1NBQzlEO0tBQ0Y7SUFDRCxRQUFRLEVBQUU7UUFDUixFQUFFLEVBQUUsUUFBUTtRQUNaLElBQUksRUFBRSxRQUFRO1FBQ2QsTUFBTSxFQUFFO1lBQ04sRUFBRSxFQUFFLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUU7WUFDMUMsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUU7WUFDOUMsRUFBRSxFQUFFLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUU7U0FDN0M7S0FDRjtJQUNELFFBQVEsRUFBRTtRQUNSLEVBQUUsRUFBRSxRQUFRO1FBQ1osSUFBSSxFQUFFLFFBQVE7UUFDZCxNQUFNLEVBQUU7WUFDTixFQUFFLEVBQUUsRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDcEQsRUFBRSxFQUFFLEVBQUUsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1NBQ3pEO0tBQ0Y7SUFDRCxLQUFLLEVBQUU7UUFDTCxFQUFF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QUFDLHNCQUFzQixJQUFJLGlDQUFpQztRQUM3RSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO0tBQzVFLENBQUM7QUFDSixDQUFDO0FBRUQsVUFBVTtBQUVWOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFVBQWtCO0lBQ3BELElBQUksVUFBVSxLQUFLLDZCQUE2QixFQUFFLENBQUM7UUFDakQsT0FBTywyQkFBMkIsRUFBRSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDckQsQ0FBQztJQUNELE9BQU8sbUJBQW1CLENBQUMsVUFBVSxDQUFDLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8vIFR5cGVzXG5cbi8qKiBNZXRhZGF0YSBmb3IgYSBzaW5nbGUgQUkgbW9kZWwuICovXG5leHBvcnQgaW50ZXJmYWNlIEFJTW9kZWxJbmZvIHtcbiAgLyoqIE1vZGVsIGlkZW50aWZpZXIgdXNlZCBpbiBBUEkgY2FsbHMgKGUuZy4gXCJjbGF1ZGUtc29ubmV0LTVcIikuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkaXNwbGF5IG5hbWUgKGUuZy4gXCJDbGF1ZGUgU29ubmV0IDVcIikuICovXG4gIG5hbWU6IHN0cmluZztcbn1cblxuLyoqIE1ldGFkYXRhIGZvciBhbiBBSSBwcm92aWRlciB3aXRoIGl0cyBhdmFpbGFibGUgbW9kZWxzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBSVByb3ZpZGVySW5mbyB7XG4gIC8qKiBQcm92aWRlciBpZGVudGlmaWVyIChlLmcuIFwiYW50aHJvcGljXCIsIFwib3BlbmFpXCIsIFwiZ29vZ2xlXCIpLiAqL1xuICBpZDogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGlzcGxheSBuYW1lIChlLmcuIFwiQW50aHJvcGljXCIpLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBNb2RlbHMgYXZhaWxhYmxlIGZvciB0aGlzIHByb3ZpZGVyLiAqL1xuICBtb2RlbHM6IEFJTW9kZWxJbmZvW107XG59XG5cbi8vIENhdGFsb2dcblxuLyoqXG4gKiBTdGFuZGFyZCBBSSBwcm92aWRlciBjYXRhbG9nIOKAlCBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBhbGwgc3VwcG9ydGVkXG4gKiBwcm92aWRlcnMgYW5kIHRoZWlyIG1vZGVscy4gVXNlZCBieSBib3RoIGJhY2tlbmQgc2VydmljZXMgYW5kIGZyb250ZW5kXG4gKiBjb21wb25lbnRzLlxuICovXG5leHBvcnQgY29uc3QgQUlfUFJPVklERVJfQ0FUQUxPRzogUmVjb3JkPHN0cmluZywgQUlQcm92aWRlckluZm8+ID0ge1xuICAnYW50aHJvcGljJzoge1xuICAgIGlkOiAnYW50aHJvcGljJyxcbiAgICBuYW1lOiAnQW50aHJvcGljJyxcbiAgICBtb2RlbHM6IFtcbiAgICAgIHsgaWQ6ICdjbGF1ZGUtc29ubmV0LTUnLCBuYW1lOiAnQ2xhdWRlIFNvbm5ldCA1JyB9LFxuICAgICAgeyBpZDogJ2NsYXVkZS1vcHVzLTUnLCBuYW1lOiAnQ2xhdWRlIE9wdXMgNScgfSxcbiAgICAgIHsgaWQ6ICdjbGF1ZGUtaGFpa3UtNC01LTIwMjUxMDAxJywgbmFtZTogJ0NsYXVkZSBIYWlrdSA0LjUnIH0sXG4gICAgXSxcbiAgfSxcbiAgJ29wZW5haSc6IHtcbiAgICBpZDogJ29wZW5haScsXG4gICAgbmFtZTogJ09wZW5BSScsXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAnZ3B0LTUuNi1zb2wnLCBuYW1lOiAnR1BULTUuNiBTb2wnIH0sXG4gICAgICB7IGlkOiAnZ3B0LTUuNi10ZXJyYScsIG5hbWU6ICdHUFQtNS42IFRlcnJhJyB9LFxuICAgICAgeyBpZDogJ2dwdC01LjYtbHVuYScsIG5hbWU6ICdHUFQtNS42IEx1bmEnIH0sXG4gICAgXSxcbiAgfSxcbiAgJ2dvb2dsZSc6IHtcbiAgICBpZDogJ2dvb2dsZScsXG4gICAgbmFtZTogJ0dvb2dsZScsXG4gICAgbW9kZWxzOiBbXG4gICAgICB7IGlkOiAnZ2VtaW5pLTMuNy1mbGFzaCcsIG5hbWU6ICdHZW1pbmkgMy43IEZsYXNoJyB9LFxuICAgICAgeyBpZDogJ2dlbWluaS0zLjEtcHJvLXByZXZpZXcnLCBuYW1lOiAnR2VtaW5pIDMuMSBQcm8nIH0sXG4gICAgXSxcbiAgfSxcbiAgJ3hhaSc6IHtcbiAgICBpZDogJ3hhaScsXG4gICAgbmFtZTogJ3hBSSAoR3JvayknLFxuICAgIG1vZGVsczogW1xuICAgICAgeyBpZDogJ2dyb2stNC42JywgbmFtZTogJ0dyb2sgNC42JyB9LFxuICAgICAgeyBpZDogJ2dyb2stNC41JywgbmFtZTogJ0dyb2sgNC41JyB9LFxuICAgICAgeyBpZDogJ2dyb2stNC4zJywgbmFtZTogJ0dyb2sgNC4zJyB9LFxuICAgIF0sXG4gIH0sXG4gICdhbWF6b24tYmVkcm9jayc6IHtcbiAgICBpZDogJ2FtYXpvbi1iZWRyb2NrJyxcbiAgICBuYW1lOiAnQW1hem9uIEJlZHJvY2snLFxuICAgIC8vIEJlZHJvY2sgaWRzIGFyZSByZWdpb24tc2NvcGVkIGNyb3NzLXJlZ2lvbiBpbmZlcmVuY2UgcHJvZmlsZXM7IHRoZSBgdXMuYFxuICAgIC8vIHByZWZpeCB0YXJnZXRzIFVTIHJlZ2lvbnMg4oCUIHN3YXAgdGhlIHByZWZpeCAoZXUuL2FwYWMuL+KApikgdG8gbWF0Y2ggeW91clxuICAgIC8vIGRlcGxveSByZWdpb24sIGFuZCBjb25maXJtIGF2YWlsYWJpbGl0eSBpbiB0aGUgQmVkcm9jayBjb25zb2xlLlxuICAgIG1vZGVsczogW1xuICAgICAgeyBpZDogJ3VzLmFudGhyb3BpYy5jbGF1ZGUtc29ubmV0LTQtNS0yMDI1MDkyOS12MTowJywgbmFtZTogJ0NsYXVkZSBTb25uZXQgNC41JyB9LFxuICAgICAgeyBpZDogJ3VzLmFtYXpvbi5ub3ZhLXByby12MTowJywgbmFtZTogJ0FtYXpvbiBOb3ZhIFBybycgfSxcbiAgICAgIHsgaWQ6ICd1cy5hbWF6b24ubm92YS1saXRlLXYxOjAnLCBuYW1lOiAnQW1hem9uIE5vdmEgTGl0ZScgfSxcbiAgICBdLFxuICB9LFxufTtcblxuLyoqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lcyBmb3IgZWFjaCBBSSBwcm92aWRlcidzIEFQSSBrZXkuXG4gKiBVc2VkIGJ5IGJhY2tlbmQgc2VydmljZXMgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvdmlkZXIgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBjb25zdCBBSV9QUk9WSURFUl9FTlZfVkFSUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgJ2FudGhyb3BpYyc6ICdBTlRIUk9QSUNfQVBJX0tFWScsXG4gICdvcGVuYWknOiAnT1BFTkFJX0FQSV9LRVknLFxuICAnZ29vZ2xlJzogJ0dPT0dMRV9HRU5FUkFUSVZFX0FJX0FQSV9LRVknLFxuICAneGFpJzogJ1hBSV9BUElfS0VZJyxcbiAgJ2FtYXpvbi1iZWRyb2NrJzogJ0FXU19BQ0NFU1NfS0VZX0lEJyxcbn07XG5cbi8qKlxuICogUHJvdmlkZXIgaWQgZm9yIGEgc2VsZi1ob3N0ZWQsIE9wZW5BSS1jb21wYXRpYmxlIGVuZHBvaW50IOKAlCBhIERvY2tlciBtb2RlbCBpbWFnZVxuICogKE9sbGFtYSwgRG9ja2VyIE1vZGVsIFJ1bm5lciwgdkxMTSkgb3IgYW55IG90aGVyIHNlcnZlciB0aGF0IHNwZWFrcyB0aGUgT3BlbkFJXG4gKiBjaGF0IEFQSS4gVW5saWtlIHRoZSBmaXhlZCBwcm92aWRlcnMgYWJvdmUsIHRoaXMgb25lIGlzIE5PVCBpbiB0aGUgc3RhdGljIGNhdGFsb2c6XG4gKiBpdHMgZW5kcG9pbnQgYW5kIG1vZGVsIGxpc3QgYXJlIGRlcGxveW1lbnQtZGVmaW5lZCBhbmQgcmVzb2x2ZWQgZnJvbSBlbnYgYXRcbiAqIHJ1bnRpbWUgYnkge0BsaW5rIGdldE9wZW5BSUNvbXBhdGlibGVQcm92aWRlcn0uXG4gKi9cbmV4cG9ydCBjb25zdCBPUEVOQUlfQ09NUEFUSUJMRV9QUk9WSURFUl9JRCA9ICdvcGVuYWktY29tcGF0aWJsZSc7XG5cbi8qKlxuICogUGFyc2UgYSBgaWRbfERpc3BsYXkgTmFtZV1bLGlkMlt8TmFtZTJdXWAgZW52IHN0cmluZyBpbnRvIG1vZGVsIG1ldGFkYXRhLiBUaGVcbiAqIGlkL25hbWUgc2VwYXJhdG9yIGlzIGB8YCAoTk9UIGA6YCkgYmVjYXVzZSBtb2RlbCBpZHMgY29tbW9ubHkgY29udGFpbiBjb2xvbnMg4oCUXG4gKiBlLmcuIE9sbGFtYSB0YWdzIChgcXdlbjIuNS1jb2Rlcjo3YmApIGFuZCBCZWRyb2NrIGluZmVyZW5jZSBwcm9maWxlcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VNb2RlbExpc3QocmF3OiBzdHJpbmcpOiBBSU1vZGVsSW5mb1tdIHtcbiAgcmV0dXJuIHJhd1xuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgocykgPT4gcy50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5tYXAoKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBpZHggPSBlbnRyeS5pbmRleE9mKCd8Jyk7XG4gICAgICBjb25zdCBpZCA9IChpZHggPT09IC0xID8gZW50cnkgOiBlbnRyeS5zbGljZSgwLCBpZHgpKS50cmltKCk7XG4gICAgICBjb25zdCBuYW1lID0gKGlkeCA9PT0gLTEgPyAnJyA6IGVudHJ5LnNsaWNlKGlkeCArIDEpKS50cmltKCkgfHwgaWQ7XG4gICAgICByZXR1cm4geyBpZCwgbmFtZSB9O1xuICAgIH0pXG4gICAgLmZpbHRlcigobSkgPT4gbS5pZC5sZW5ndGggPiAwKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBPcGVuQUktY29tcGF0aWJsZSAobG9jYWwgLyBzZWxmLWhvc3RlZCkgcHJvdmlkZXIgZnJvbSBlbnYsIG9yIGBudWxsYFxuICogd2hlbiBubyBlbmRwb2ludCBpcyBjb25maWd1cmVkLiBFbmFibGVkIGJ5IGBPUEVOQUlfQ09NUEFUSUJMRV9CQVNFX1VSTGA7IHRoZSBtb2RlbFxuICogbGlzdCBjb21lcyBmcm9tIGBPUEVOQUlfQ09NUEFUSUJMRV9NT0RFTFNgIChjb21tYSBsaXN0IG9mIGBpZFt8RGlzcGxheSBOYW1lXWApLFxuICogZmFsbGluZyBiYWNrIHRvIGBPUEVOQUlfQ09NUEFUSUJMRV9NT0RFTGAsIHRoZW4gYSBnZW5lcmljIGBsb2NhbGAgaWQuIFRoZSBkaXNwbGF5XG4gKiBuYW1lIGlzIG92ZXJyaWRhYmxlIHZpYSBgT1BFTkFJX0NPTVBBVElCTEVfTkFNRWAuXG4gKlxuICogQHJldHVybnMgUHJvdmlkZXIgaW5mbyBmb3IgdGhlIGNvbmZpZ3VyZWQgbG9jYWwgZW5kcG9pbnQsIG9yIG51bGwgaWYgdW5zZXRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE9wZW5BSUNvbXBhdGlibGVQcm92aWRlcigpOiBBSVByb3ZpZGVySW5mbyB8IG51bGwge1xuICBjb25zdCBiYXNlVVJMID0gcHJvY2Vzcy5lbnYuT1BFTkFJX0NPTVBBVElCTEVfQkFTRV9VUkw7XG4gIGlmICghYmFzZVVSTCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJhdyA9IHByb2Nlc3MuZW52Lk9QRU5BSV9DT01QQVRJQkxFX01PREVMUyA/PyBwcm9jZXNzLmVudi5PUEVOQUlfQ09NUEFUSUJMRV9NT0RFTCA/PyAnbG9jYWx8TG9jYWwgbW9kZWwnO1xuICBjb25zdCBtb2RlbHMgPSBwYXJzZU1vZGVsTGlzdChyYXcpO1xuICByZXR1cm4ge1xuICAgIGlkOiBPUEVOQUlfQ09NUEFUSUJMRV9QUk9WSURFUl9JRCxcbiAgICBuYW1lOiBwcm9jZXNzLmVudi5PUEVOQUlfQ09NUEFUSUJMRV9OQU1FIHx8ICdMb2NhbCBtb2RlbCAoT3BlbkFJLWNvbXBhdGlibGUpJyxcbiAgICBtb2RlbHM6IG1vZGVscy5sZW5ndGggPiAwID8gbW9kZWxzIDogW3sgaWQ6ICdsb2NhbCcsIG5hbWU6ICdMb2NhbCBtb2RlbCcgfV0sXG4gIH07XG59XG5cbi8vIEhlbHBlcnNcblxuLyoqXG4gKiBHZXQgdGhlIG1vZGVsIGxpc3QgZm9yIGEgZ2l2ZW4gcHJvdmlkZXIgSUQuXG4gKlxuICogQHBhcmFtIHByb3ZpZGVySWQgLSBQcm92aWRlciBpZGVudGlmaWVyIChlLmcuIFwiYW50aHJvcGljXCIpXG4gKiBAcmV0dXJucyBBcnJheSBvZiBtb2RlbHMsIG9yIGVtcHR5IGFycmF5IGlmIHRoZSBwcm92aWRlciBpcyB1bmtub3duXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRBSVByb3ZpZGVyTW9kZWxzKHByb3ZpZGVySWQ6IHN0cmluZyk6IEFJTW9kZWxJbmZvW10ge1xuICBpZiAocHJvdmlkZXJJZCA9PT0gT1BFTkFJX0NPTVBBVElCTEVfUFJPVklERVJfSUQpIHtcbiAgICByZXR1cm4gZ2V0T3BlbkFJQ29tcGF0aWJsZVByb3ZpZGVyKCk/Lm1vZGVscyA/PyBbXTtcbiAgfVxuICByZXR1cm4gQUlfUFJPVklERVJfQ0FUQUxPR1twcm92aWRlcklkXT8ubW9kZWxzID8/IFtdO1xufVxuIl19
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktcHJvdmlkZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0YW50cy9haS1wcm92aWRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUsbUJBQW1CLEVBQXlDLE1BQU0sd0JBQXdCLENBQUM7QUFFcEcsMEVBQTBFO0FBQzFFLGtGQUFrRjtBQUNsRiwwQ0FBMEM7QUFDMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHOUk7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQTJCO0lBQzFELFdBQVcsRUFBRSxtQkFBbUI7SUFDaEMsUUFBUSxFQUFFLGdCQUFnQjtJQUMxQixRQUFRLEVBQUUsOEJBQThCO0lBQ3hDLEtBQUssRUFBRSxhQUFhO0lBQ3BCLGdCQUFnQixFQUFFLG1CQUFtQjtDQUN0QyxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsbUJBQW1CLENBQUM7QUFFakU7Ozs7R0FJRztBQUNILFNBQVMsY0FBYyxDQUFDLEdBQVc7SUFDakMsT0FBTyxHQUFHO1NBQ1AsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3BCLE1BQU0sQ0FBQyxPQUFPLENBQUM7U0FDZixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtRQUNiLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3RCxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNuRSxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3RCLENBQUMsQ0FBQztTQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQjtJQUN6QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDO0lBQ3ZELElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDMUIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHVCQUF1QixJQUFJLG1CQUFtQixDQUFDO0lBQy9HLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxPQUFPO1FBQ0wsRUFBRSxFQUFFLDZCQUE2QjtRQUNqQyxJQUFJLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsSUFBSSxpQ0FBaUM7UUFDN0UsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQztLQUM1RSxDQUFDO0FBQ0osQ0FBQztBQUVELFVBQVU7QUFFVjs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUFrQjtJQUNwRCxJQUFJLFVBQVUsS0FBSyw2QkFBNkIsRUFBRSxDQUFDO1FBQ2pELE9BQU8sMkJBQTJCLEVBQUUsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3JELENBQUM7SUFDRCxPQUFPLG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBBSV9QUk9WSURFUl9DQVRBTE9HLCB0eXBlIEFJTW9kZWxJbmZvLCB0eXBlIEFJUHJvdmlkZXJJbmZvIH0gZnJvbSAnLi4vdHlwZXMvYWktY2F0YWxvZy5qcyc7XG5cbi8vIFRoZSBjYXRhbG9nIGl0c2VsZiBpcyBkYXRhLW9ubHkgYW5kIGxpdmVzIGluIGB0eXBlcy9haS1jYXRhbG9nLnRzYCAodGhlXG4vLyBicm93c2VyLXNhZmUgYC4vYWktY2F0YWxvZ2Agc3VicGF0aCk7IHJlLWV4cG9ydGVkIGhlcmUgc28gc2VydmVyIGNvZGUga2VlcHMgb25lXG4vLyBpbXBvcnQgc2l0ZSBmb3IgZXZlcnl0aGluZyBBSS1wcm92aWRlci5cbmV4cG9ydCB7IEFJX1BST1ZJREVSX0NBVEFMT0csIEFJX1BST1ZJREVSX05BTUVTLCBBSV9QUk9WSURFUl9NT0RFTFMsIEFJX0tFWV9QUk9WSURFUl9JRFMsIGlzS2V5bGVzc1Byb3ZpZGVySWQgfSBmcm9tICcuLi90eXBlcy9haS1jYXRhbG9nLmpzJztcbmV4cG9ydCB0eXBlIHsgQUlNb2RlbEluZm8sIEFJUHJvdmlkZXJJbmZvIH0gZnJvbSAnLi4vdHlwZXMvYWktY2F0YWxvZy5qcyc7XG5cbi8qKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMgZm9yIGVhY2ggQUkgcHJvdmlkZXIncyBBUEkga2V5LlxuICogVXNlZCBieSBiYWNrZW5kIHNlcnZpY2VzIHRvIGluaXRpYWxpemUgdGhlIHByb3ZpZGVyIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgY29uc3QgQUlfUFJPVklERVJfRU5WX1ZBUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdhbnRocm9waWMnOiAnQU5USFJPUElDX0FQSV9LRVknLFxuICAnb3BlbmFpJzogJ09QRU5BSV9BUElfS0VZJyxcbiAgJ2dvb2dsZSc6ICdHT09HTEVfR0VORVJBVElWRV9BSV9BUElfS0VZJyxcbiAgJ3hhaSc6ICdYQUlfQVBJX0tFWScsXG4gICdhbWF6b24tYmVkcm9jayc6ICdBV1NfQUNDRVNTX0tFWV9JRCcsXG59O1xuXG4vKipcbiAqIFByb3ZpZGVyIGlkIGZvciBhIHNlbGYtaG9zdGVkLCBPcGVuQUktY29tcGF0aWJsZSBlbmRwb2ludCDigJQgYSBEb2NrZXIgbW9kZWwgaW1hZ2VcbiAqIChPbGxhbWEsIERvY2tlciBNb2RlbCBSdW5uZXIsIHZMTE0pIG9yIGFueSBvdGhlciBzZXJ2ZXIgdGhhdCBzcGVha3MgdGhlIE9wZW5BSVxuICogY2hhdCBBUEkuIFVubGlrZSB0aGUgZml4ZWQgcHJvdmlkZXJzIGFib3ZlLCB0aGlzIG9uZSBpcyBOT1QgaW4gdGhlIHN0YXRpYyBjYXRhbG9nOlxuICogaXRzIGVuZHBvaW50IGFuZCBtb2RlbCBsaXN0IGFyZSBkZXBsb3ltZW50LWRlZmluZWQgYW5kIHJlc29sdmVkIGZyb20gZW52IGF0XG4gKiBydW50aW1lIGJ5IHtAbGluayBnZXRPcGVuQUlDb21wYXRpYmxlUHJvdmlkZXJ9LlxuICovXG5leHBvcnQgY29uc3QgT1BFTkFJX0NPTVBBVElCTEVfUFJPVklERVJfSUQgPSAnb3BlbmFpLWNvbXBhdGlibGUnO1xuXG4vKipcbiAqIFBhcnNlIGEgYGlkW3xEaXNwbGF5IE5hbWVdWyxpZDJbfE5hbWUyXV1gIGVudiBzdHJpbmcgaW50byBtb2RlbCBtZXRhZGF0YS4gVGhlXG4gKiBpZC9uYW1lIHNlcGFyYXRvciBpcyBgfGAgKE5PVCBgOmApIGJlY2F1c2UgbW9kZWwgaWRzIGNvbW1vbmx5IGNvbnRhaW4gY29sb25zIOKAlFxuICogZS5nLiBPbGxhbWEgdGFncyAoYHF3ZW4yLjUtY29kZXI6N2JgKSBhbmQgQmVkcm9jayBpbmZlcmVuY2UgcHJvZmlsZXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTW9kZWxMaXN0KHJhdzogc3RyaW5nKTogQUlNb2RlbEluZm9bXSB7XG4gIHJldHVybiByYXdcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAoKHMpID0+IHMudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAubWFwKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gZW50cnkuaW5kZXhPZignfCcpO1xuICAgICAgY29uc3QgaWQgPSAoaWR4ID09PSAtMSA/IGVudHJ5IDogZW50cnkuc2xpY2UoMCwgaWR4KSkudHJpbSgpO1xuICAgICAgY29uc3QgbmFtZSA9IChpZHggPT09IC0xID8gJycgOiBlbnRyeS5zbGljZShpZHggKyAxKSkudHJpbSgpIHx8IGlkO1xuICAgICAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbiAgICB9KVxuICAgIC5maWx0ZXIoKG0pID0+IG0uaWQubGVuZ3RoID4gMCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgT3BlbkFJLWNvbXBhdGlibGUgKGxvY2FsIC8gc2VsZi1ob3N0ZWQpIHByb3ZpZGVyIGZyb20gZW52LCBvciBgbnVsbGBcbiAqIHdoZW4gbm8gZW5kcG9pbnQgaXMgY29uZmlndXJlZC4gRW5hYmxlZCBieSBgT1BFTkFJX0NPTVBBVElCTEVfQkFTRV9VUkxgOyB0aGUgbW9kZWxcbiAqIGxpc3QgY29tZXMgZnJvbSBgT1BFTkFJX0NPTVBBVElCTEVfTU9ERUxTYCAoY29tbWEgbGlzdCBvZiBgaWRbfERpc3BsYXkgTmFtZV1gKSxcbiAqIGZhbGxpbmcgYmFjayB0byBgT1BFTkFJX0NPTVBBVElCTEVfTU9ERUxgLCB0aGVuIGEgZ2VuZXJpYyBgbG9jYWxgIGlkLiBUaGUgZGlzcGxheVxuICogbmFtZSBpcyBvdmVycmlkYWJsZSB2aWEgYE9QRU5BSV9DT01QQVRJQkxFX05BTUVgLlxuICpcbiAqIEByZXR1cm5zIFByb3ZpZGVyIGluZm8gZm9yIHRoZSBjb25maWd1cmVkIGxvY2FsIGVuZHBvaW50LCBvciBudWxsIGlmIHVuc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPcGVuQUlDb21wYXRpYmxlUHJvdmlkZXIoKTogQUlQcm92aWRlckluZm8gfCBudWxsIHtcbiAgY29uc3QgYmFzZVVSTCA9IHByb2Nlc3MuZW52Lk9QRU5BSV9DT01QQVRJQkxFX0JBU0VfVVJMO1xuICBpZiAoIWJhc2VVUkwpIHJldHVybiBudWxsO1xuICBjb25zdCByYXcgPSBwcm9jZXNzLmVudi5PUEVOQUlfQ09NUEFUSUJMRV9NT0RFTFMgPz8gcHJvY2Vzcy5lbnYuT1BFTkFJX0NPTVBBVElCTEVfTU9ERUwgPz8gJ2xvY2FsfExvY2FsIG1vZGVsJztcbiAgY29uc3QgbW9kZWxzID0gcGFyc2VNb2RlbExpc3QocmF3KTtcbiAgcmV0dXJuIHtcbiAgICBpZDogT1BFTkFJX0NPTVBBVElCTEVfUFJPVklERVJfSUQsXG4gICAgbmFtZTogcHJvY2Vzcy5lbnYuT1BFTkFJX0NPTVBBVElCTEVfTkFNRSB8fCAnTG9jYWwgbW9kZWwgKE9wZW5BSS1jb21wYXRpYmxlKScsXG4gICAgbW9kZWxzOiBtb2RlbHMubGVuZ3RoID4gMCA/IG1vZGVscyA6IFt7IGlkOiAnbG9jYWwnLCBuYW1lOiAnTG9jYWwgbW9kZWwnIH1dLFxuICB9O1xufVxuXG4vLyBIZWxwZXJzXG5cbi8qKlxuICogR2V0IHRoZSBtb2RlbCBsaXN0IGZvciBhIGdpdmVuIHByb3ZpZGVyIElELlxuICpcbiAqIEBwYXJhbSBwcm92aWRlcklkIC0gUHJvdmlkZXIgaWRlbnRpZmllciAoZS5nLiBcImFudGhyb3BpY1wiKVxuICogQHJldHVybnMgQXJyYXkgb2YgbW9kZWxzLCBvciBlbXB0eSBhcnJheSBpZiB0aGUgcHJvdmlkZXIgaXMgdW5rbm93blxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QUlQcm92aWRlck1vZGVscyhwcm92aWRlcklkOiBzdHJpbmcpOiBBSU1vZGVsSW5mb1tdIHtcbiAgaWYgKHByb3ZpZGVySWQgPT09IE9QRU5BSV9DT01QQVRJQkxFX1BST1ZJREVSX0lEKSB7XG4gICAgcmV0dXJuIGdldE9wZW5BSUNvbXBhdGlibGVQcm92aWRlcigpPy5tb2RlbHMgPz8gW107XG4gIH1cbiAgcmV0dXJuIEFJX1BST1ZJREVSX0NBVEFMT0dbcHJvdmlkZXJJZF0/Lm1vZGVscyA/PyBbXTtcbn1cbiJdfQ==
|
|
@@ -31,3 +31,17 @@ export declare class ValidationError extends AppError {
|
|
|
31
31
|
export declare class ConflictError extends AppError {
|
|
32
32
|
constructor(message: string, code?: ErrorCode, details?: Record<string, unknown>);
|
|
33
33
|
}
|
|
34
|
+
/** 403 — the organization's administrators switched AI features off. */
|
|
35
|
+
export declare class AIDisabledError extends AppError {
|
|
36
|
+
constructor(message?: string);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* An AI request could not be served AS ASKED — the org's own provider key could not
|
|
40
|
+
* be loaded, a bring-your-own key named a keyless provider, nothing is configured.
|
|
41
|
+
* The message is written by us and names configuration, never a secret, so it is
|
|
42
|
+
* safe to show; `handleAIError` surfaces it verbatim with this status. Thrown
|
|
43
|
+
* INSTEAD of silently serving the request on the platform's key.
|
|
44
|
+
*/
|
|
45
|
+
export declare class AIConfigurationError extends AppError {
|
|
46
|
+
constructor(message: string, statusCode?: number, code?: ErrorCode);
|
|
47
|
+
}
|
package/lib/errors/app-errors.js
CHANGED
|
@@ -50,4 +50,24 @@ export class ConflictError extends AppError {
|
|
|
50
50
|
this.name = 'ConflictError';
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
|
-
|
|
53
|
+
/** 403 — the organization's administrators switched AI features off. */
|
|
54
|
+
export class AIDisabledError extends AppError {
|
|
55
|
+
constructor(message = 'AI features are turned off for this organization. An organization administrator can turn them back on in Settings.') {
|
|
56
|
+
super(getStatusForErrorCode(ErrorCode.AI_DISABLED), ErrorCode.AI_DISABLED, message);
|
|
57
|
+
this.name = 'AIDisabledError';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* An AI request could not be served AS ASKED — the org's own provider key could not
|
|
62
|
+
* be loaded, a bring-your-own key named a keyless provider, nothing is configured.
|
|
63
|
+
* The message is written by us and names configuration, never a secret, so it is
|
|
64
|
+
* safe to show; `handleAIError` surfaces it verbatim with this status. Thrown
|
|
65
|
+
* INSTEAD of silently serving the request on the platform's key.
|
|
66
|
+
*/
|
|
67
|
+
export class AIConfigurationError extends AppError {
|
|
68
|
+
constructor(message, statusCode = 503, code = ErrorCode.SERVICE_UNAVAILABLE) {
|
|
69
|
+
super(statusCode, code, message);
|
|
70
|
+
this.name = 'AIConfigurationError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWVycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lcnJvcnMvYXBwLWVycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxTQUFTLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUyxTQUFRLEtBQUs7SUFFZixVQUFVO0lBQ1YsSUFBSTtJQUdKLE9BQU87SUFMekIsWUFDa0IsVUFBa0IsRUFDbEIsSUFBZSxFQUMvQixPQUFlO0lBQ2YsZ0ZBQWdGO0lBQ2hFLE9BQWlDO1FBRWpELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzswQkFOQyxVQUFVO29CQUNWLElBQUk7dUJBR0osT0FBTztRQUd2QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFFRCxnQ0FBZ0M7QUFDaEMsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBQ3pDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLElBQUksR0FBRyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBRUQsc0NBQXNDO0FBQ3RDLE1BQU0sT0FBTyxjQUFlLFNBQVEsUUFBUTtJQUMxQyxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFLFNBQVMsQ0FBQyx3QkFBd0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RyxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELHNDQUFzQztBQUN0QyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxRQUFRO0lBQzNDLFlBQVksT0FBZTtRQUN6QixLQUFLLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsU0FBUyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlGLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQ7OztvRUFHb0U7QUFDcEUsTUFBTSxPQUFPLGFBQWMsU0FBUSxRQUFRO0lBQ3pDLFlBQVksT0FBZSxFQUFFLElBQUksR0FBYyxTQUFTLENBQUMsUUFBUSxFQUFFLE9BQWlDO1FBQ2xHLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN6RSxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFFRCx3RUFBd0U7QUFDeEUsTUFBTSxPQUFPLGVBQWdCLFNBQVEsUUFBUTtJQUMzQyxZQUFZLE9BQU8sR0FBRyxvSEFBb0g7UUFDeEksS0FBSyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BGLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7SUFDaEMsQ0FBQztDQUNGO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLG9CQUFxQixTQUFRLFFBQVE7SUFDaEQsWUFBWSxPQUFlLEVBQUUsVUFBVSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQWMsU0FBUyxDQUFDLG1CQUFtQjtRQUM1RixLQUFLLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsSUFBSSxHQUFHLHNCQUFzQixDQUFDO0lBQ3JDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBFcnJvckNvZGUsIGdldFN0YXR1c0ZvckVycm9yQ29kZSB9IGZyb20gJy4uL3R5cGVzL2Vycm9yLWNvZGVzLmpzJztcblxuLyoqXG4gKiBCYXNlIGFwcGxpY2F0aW9uIGVycm9yIHdpdGggSFRUUCBzdGF0dXMgY29kZSBhbmQgZXJyb3IgY29kZS5cbiAqIEV4dGVuZCB0aGlzIGZvciBkb21haW4tc3BlY2lmaWMgZXJyb3IgdHlwZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgY29kZTogRXJyb3JDb2RlLFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAvKiogU3RydWN0dXJlZCBjb250ZXh0IHNlbnQgd2l0aCB0aGUgZXJyb3IgcmVzcG9uc2UgKGUuZy4gdGhlIGZhaWxpbmcgZ2F0ZXMpLiAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkZXRhaWxzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdBcHBFcnJvcic7XG4gIH1cbn1cblxuLyoqIDQwNCDigJQgUmVzb3VyY2Ugbm90IGZvdW5kLiAqL1xuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBBcHBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGdldFN0YXR1c0ZvckVycm9yQ29kZShFcnJvckNvZGUuTk9UX0ZPVU5EKSwgRXJyb3JDb2RlLk5PVF9GT1VORCwgbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ05vdEZvdW5kRXJyb3InO1xuICB9XG59XG5cbi8qKiA0MDMg4oCUIEluc3VmZmljaWVudCBwZXJtaXNzaW9ucy4gKi9cbmV4cG9ydCBjbGFzcyBGb3JiaWRkZW5FcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKEVycm9yQ29kZS5JTlNVRkZJQ0lFTlRfUEVSTUlTU0lPTlMpLCBFcnJvckNvZGUuSU5TVUZGSUNJRU5UX1BFUk1JU1NJT05TLCBtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnRm9yYmlkZGVuRXJyb3InO1xuICB9XG59XG5cbi8qKiA0MDAg4oCUIFZhbGlkYXRpb24gLyBiYWQgcmVxdWVzdC4gKi9cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBBcHBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGdldFN0YXR1c0ZvckVycm9yQ29kZShFcnJvckNvZGUuVkFMSURBVElPTl9FUlJPUiksIEVycm9yQ29kZS5WQUxJREFUSU9OX0VSUk9SLCBtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJztcbiAgfVxufVxuXG4vKiogNDA5IOKAlCBDb25mbGljdCAvIGR1cGxpY2F0ZS4gYGNvZGVgIG5hcnJvd3MgdGhlIGNvbmZsaWN0IGZvciBjbGllbnRzXG4gKiAgKGUuZy4gYFBMVUdJTl9WRVJTSU9OX0ZST1pFTmApOyBpdCBtdXN0IGJlIGEgNDA5LW1hcHBlZCBjb2RlLiBgZGV0YWlsc2BcbiAqICBjYXJyaWVzIHdoYXQgdGhlIGNsaWVudCBuZWVkcyB0byByZXNvbHZlIGl0IOKAlCBmb3IgYSB0YWtlbiBwaXBlbGluZSBzbG90LFxuICogIHRoZSBOT1JNQUxJWkVEIG5hbWVzIHRoYXQgY29sbGlkZWQgYW5kIHRoZSBpZCB0byBQVVQgaW5zdGVhZC4gKi9cbmV4cG9ydCBjbGFzcyBDb25mbGljdEVycm9yIGV4dGVuZHMgQXBwRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGNvZGU6IEVycm9yQ29kZSA9IEVycm9yQ29kZS5DT05GTElDVCwgZGV0YWlscz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKEVycm9yQ29kZS5DT05GTElDVCksIGNvZGUsIG1lc3NhZ2UsIGRldGFpbHMpO1xuICAgIHRoaXMubmFtZSA9ICdDb25mbGljdEVycm9yJztcbiAgfVxufVxuXG4vKiogNDAzIOKAlCB0aGUgb3JnYW5pemF0aW9uJ3MgYWRtaW5pc3RyYXRvcnMgc3dpdGNoZWQgQUkgZmVhdHVyZXMgb2ZmLiAqL1xuZXhwb3J0IGNsYXNzIEFJRGlzYWJsZWRFcnJvciBleHRlbmRzIEFwcEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdBSSBmZWF0dXJlcyBhcmUgdHVybmVkIG9mZiBmb3IgdGhpcyBvcmdhbml6YXRpb24uIEFuIG9yZ2FuaXphdGlvbiBhZG1pbmlzdHJhdG9yIGNhbiB0dXJuIHRoZW0gYmFjayBvbiBpbiBTZXR0aW5ncy4nKSB7XG4gICAgc3VwZXIoZ2V0U3RhdHVzRm9yRXJyb3JDb2RlKEVycm9yQ29kZS5BSV9ESVNBQkxFRCksIEVycm9yQ29kZS5BSV9ESVNBQkxFRCwgbWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ0FJRGlzYWJsZWRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBBSSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBzZXJ2ZWQgQVMgQVNLRUQg4oCUIHRoZSBvcmcncyBvd24gcHJvdmlkZXIga2V5IGNvdWxkIG5vdFxuICogYmUgbG9hZGVkLCBhIGJyaW5nLXlvdXItb3duIGtleSBuYW1lZCBhIGtleWxlc3MgcHJvdmlkZXIsIG5vdGhpbmcgaXMgY29uZmlndXJlZC5cbiAqIFRoZSBtZXNzYWdlIGlzIHdyaXR0ZW4gYnkgdXMgYW5kIG5hbWVzIGNvbmZpZ3VyYXRpb24sIG5ldmVyIGEgc2VjcmV0LCBzbyBpdCBpc1xuICogc2FmZSB0byBzaG93OyBgaGFuZGxlQUlFcnJvcmAgc3VyZmFjZXMgaXQgdmVyYmF0aW0gd2l0aCB0aGlzIHN0YXR1cy4gVGhyb3duXG4gKiBJTlNURUFEIG9mIHNpbGVudGx5IHNlcnZpbmcgdGhlIHJlcXVlc3Qgb24gdGhlIHBsYXRmb3JtJ3Mga2V5LlxuICovXG5leHBvcnQgY2xhc3MgQUlDb25maWd1cmF0aW9uRXJyb3IgZXh0ZW5kcyBBcHBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgc3RhdHVzQ29kZSA9IDUwMywgY29kZTogRXJyb3JDb2RlID0gRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUpIHtcbiAgICBzdXBlcihzdGF0dXNDb2RlLCBjb2RlLCBtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnQUlDb25maWd1cmF0aW9uRXJyb3InO1xuICB9XG59XG4iXX0=
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Request, Response } from 'express';
|
|
2
|
+
import { ErrorCode } from '../types/error-codes.js';
|
|
2
3
|
/**
|
|
3
4
|
* Set the four standard SSE response headers (does NOT flush — the caller flushes
|
|
4
5
|
* after any additional per-endpoint setup like `res.setTimeout`). The single
|
|
@@ -41,9 +42,38 @@ export interface SseStream {
|
|
|
41
42
|
* client-disconnect signal (see {@link clientAbortSignal}).
|
|
42
43
|
*/
|
|
43
44
|
export declare function initSSEStream(_req: Request, res: Response, timeoutMs: number): SseStream;
|
|
45
|
+
/** How an AI failure is answered: an HTTP status, a code, and a message WE wrote. */
|
|
46
|
+
export interface AIErrorResponse {
|
|
47
|
+
status: number;
|
|
48
|
+
code: ErrorCode;
|
|
49
|
+
/** Safe to show: never raw provider response text. */
|
|
50
|
+
message: string;
|
|
51
|
+
/** Seconds, from the provider's own `Retry-After` when it sent one. */
|
|
52
|
+
retryAfterSeconds?: number;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Classify an AI failure into the response a caller sends.
|
|
56
|
+
*
|
|
57
|
+
* Provider failures are matched on the provider's HTTP STATUS (`APICallError.statusCode`),
|
|
58
|
+
* never on message text, and answered with a sentence of ours: a provider's error body
|
|
59
|
+
* can carry account ids, request ids, quota details or an echo of the prompt, and none
|
|
60
|
+
* of it belongs in a response or an SSE frame. The full error still goes to the
|
|
61
|
+
* caller's log line.
|
|
62
|
+
*
|
|
63
|
+
* - 429 → 429 (with the provider's `Retry-After`): the provider is rate limiting.
|
|
64
|
+
* - 529 / 5xx → 503 (with `Retry-After`): the provider is overloaded or down.
|
|
65
|
+
* - 401 / 403 → 502: the provider refused the credential (a BYO or org key is wrong).
|
|
66
|
+
* - a timeout signal → 504.
|
|
67
|
+
* - an {@link AppError} (AIDisabledError, AIConfigurationError, …) → its own status and message.
|
|
68
|
+
* - otherwise the configuration messages the registry writes (they name env vars,
|
|
69
|
+
* never values) keep their text; anything else gets `fallbackMessage`.
|
|
70
|
+
*/
|
|
71
|
+
export declare function classifyAIError(error: unknown, fallbackMessage: string): AIErrorResponse;
|
|
44
72
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
73
|
+
* Answer an AI generation failure: an HTTP error before the stream started, or an
|
|
74
|
+
* SSE `error` event (then end) once it has. Takes the ERROR, not its message — the
|
|
75
|
+
* provider status is what decides the answer (see {@link classifyAIError}); a string
|
|
76
|
+
* is still accepted for the registry's configuration messages.
|
|
47
77
|
*/
|
|
48
|
-
export declare function handleAIError(res: Response,
|
|
78
|
+
export declare function handleAIError(res: Response, error: unknown, fallbackMessage: string): void;
|
|
49
79
|
export {};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// Copyright 2026 Pipeline Builder Contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import {
|
|
3
|
+
import { AppError } from '../errors/app-errors.js';
|
|
4
|
+
import { ErrorCode } from '../types/error-codes.js';
|
|
5
|
+
import { errorMessage, sendError } from '../utils/response.js';
|
|
4
6
|
/**
|
|
5
7
|
* Set the four standard SSE response headers (does NOT flush — the caller flushes
|
|
6
8
|
* after any additional per-endpoint setup like `res.setTimeout`). The single
|
|
@@ -60,28 +62,98 @@ export function initSSEStream(_req, res, timeoutMs) {
|
|
|
60
62
|
},
|
|
61
63
|
};
|
|
62
64
|
}
|
|
65
|
+
/** `Retry-After` as seconds — either form the header allows (delta-seconds or an HTTP date). */
|
|
66
|
+
function retryAfterSeconds(headers) {
|
|
67
|
+
const raw = headers?.['retry-after'] ?? headers?.['Retry-After'];
|
|
68
|
+
if (!raw)
|
|
69
|
+
return undefined;
|
|
70
|
+
const asNumber = Number(raw);
|
|
71
|
+
if (Number.isFinite(asNumber) && asNumber >= 0)
|
|
72
|
+
return Math.ceil(asNumber);
|
|
73
|
+
const at = Date.parse(raw);
|
|
74
|
+
return Number.isNaN(at) ? undefined : Math.max(0, Math.ceil((at - Date.now()) / 1000));
|
|
75
|
+
}
|
|
76
|
+
/** True for an abort that came from a TIMEOUT signal rather than a client disconnect. */
|
|
77
|
+
function isTimeout(error) {
|
|
78
|
+
const e = error;
|
|
79
|
+
return e?.name === 'TimeoutError' || e?.cause?.name === 'TimeoutError';
|
|
80
|
+
}
|
|
63
81
|
/**
|
|
64
|
-
* Classify AI
|
|
65
|
-
*
|
|
82
|
+
* Classify an AI failure into the response a caller sends.
|
|
83
|
+
*
|
|
84
|
+
* Provider failures are matched on the provider's HTTP STATUS (`APICallError.statusCode`),
|
|
85
|
+
* never on message text, and answered with a sentence of ours: a provider's error body
|
|
86
|
+
* can carry account ids, request ids, quota details or an echo of the prompt, and none
|
|
87
|
+
* of it belongs in a response or an SSE frame. The full error still goes to the
|
|
88
|
+
* caller's log line.
|
|
89
|
+
*
|
|
90
|
+
* - 429 → 429 (with the provider's `Retry-After`): the provider is rate limiting.
|
|
91
|
+
* - 529 / 5xx → 503 (with `Retry-After`): the provider is overloaded or down.
|
|
92
|
+
* - 401 / 403 → 502: the provider refused the credential (a BYO or org key is wrong).
|
|
93
|
+
* - a timeout signal → 504.
|
|
94
|
+
* - an {@link AppError} (AIDisabledError, AIConfigurationError, …) → its own status and message.
|
|
95
|
+
* - otherwise the configuration messages the registry writes (they name env vars,
|
|
96
|
+
* never values) keep their text; anything else gets `fallbackMessage`.
|
|
66
97
|
*/
|
|
67
|
-
export function
|
|
68
|
-
if (
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
98
|
+
export function classifyAIError(error, fallbackMessage) {
|
|
99
|
+
if (error instanceof AppError) {
|
|
100
|
+
return { status: error.statusCode, code: error.code, message: error.message };
|
|
101
|
+
}
|
|
102
|
+
const providerStatus = typeof error?.statusCode === 'number'
|
|
103
|
+
? error.statusCode
|
|
104
|
+
: undefined;
|
|
105
|
+
if (providerStatus !== undefined) {
|
|
106
|
+
const retryAfter = retryAfterSeconds(error.responseHeaders);
|
|
107
|
+
const withRetry = retryAfter !== undefined ? { retryAfterSeconds: retryAfter } : {};
|
|
108
|
+
if (providerStatus === 429) {
|
|
109
|
+
return { status: 429, code: ErrorCode.RATE_LIMIT_EXCEEDED, message: 'The AI provider is rate limiting requests. Try again shortly.', ...withRetry };
|
|
78
110
|
}
|
|
79
|
-
if (
|
|
80
|
-
return
|
|
111
|
+
if (providerStatus === 529 || providerStatus >= 500) {
|
|
112
|
+
return { status: 503, code: ErrorCode.SERVICE_UNAVAILABLE, message: 'The AI provider is temporarily unavailable. Try again shortly.', ...withRetry };
|
|
81
113
|
}
|
|
82
|
-
|
|
114
|
+
if (providerStatus === 401 || providerStatus === 403) {
|
|
115
|
+
return { status: 502, code: ErrorCode.INTERNAL_ERROR, message: 'The AI provider rejected the API key used for this request. Check the key in Settings, or the one you supplied.' };
|
|
116
|
+
}
|
|
117
|
+
return { status: 502, code: ErrorCode.INTERNAL_ERROR, message: fallbackMessage };
|
|
118
|
+
}
|
|
119
|
+
if (isTimeout(error)) {
|
|
120
|
+
return { status: 504, code: ErrorCode.SERVICE_UNAVAILABLE, message: 'The AI provider did not respond in time. Try again, or ask for something smaller.' };
|
|
121
|
+
}
|
|
122
|
+
const message = typeof error === 'string' ? error : errorMessage(error);
|
|
123
|
+
if (message.includes('not configured') || message.includes('API key')) {
|
|
124
|
+
// Surface the ORIGINAL message. Only the registry's own configuration errors
|
|
125
|
+
// reach here (a provider's response carries a status and was handled above):
|
|
126
|
+
// they name the MISSING CONFIGURATION — "no provider API key is set and
|
|
127
|
+
// OPENAI_COMPATIBLE_BASE_URL is unset", or which env var a named provider
|
|
128
|
+
// wants — never a secret VALUE, and are the only thing that makes this error
|
|
129
|
+
// actionable.
|
|
130
|
+
return { status: 500, code: ErrorCode.INTERNAL_ERROR, message };
|
|
131
|
+
}
|
|
132
|
+
if (message.includes('not available for provider')) {
|
|
133
|
+
return { status: 400, code: ErrorCode.VALIDATION_ERROR, message };
|
|
134
|
+
}
|
|
135
|
+
return { status: 500, code: ErrorCode.INTERNAL_ERROR, message: fallbackMessage };
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Answer an AI generation failure: an HTTP error before the stream started, or an
|
|
139
|
+
* SSE `error` event (then end) once it has. Takes the ERROR, not its message — the
|
|
140
|
+
* provider status is what decides the answer (see {@link classifyAIError}); a string
|
|
141
|
+
* is still accepted for the registry's configuration messages.
|
|
142
|
+
*/
|
|
143
|
+
export function handleAIError(res, error, fallbackMessage) {
|
|
144
|
+
const answer = classifyAIError(error, fallbackMessage);
|
|
145
|
+
if (!res.headersSent) {
|
|
146
|
+
if (answer.retryAfterSeconds !== undefined)
|
|
147
|
+
res.setHeader('Retry-After', String(answer.retryAfterSeconds));
|
|
148
|
+
return sendError(res, answer.status, answer.message, answer.code);
|
|
83
149
|
}
|
|
84
|
-
res.write(`data: ${JSON.stringify({
|
|
150
|
+
res.write(`data: ${JSON.stringify({
|
|
151
|
+
type: 'error',
|
|
152
|
+
message: answer.message,
|
|
153
|
+
code: answer.code,
|
|
154
|
+
status: answer.status,
|
|
155
|
+
...(answer.retryAfterSeconds !== undefined ? { retryAfterSeconds: answer.retryAfterSeconds } : {}),
|
|
156
|
+
})}\n\n`);
|
|
85
157
|
res.end();
|
|
86
158
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9zc2UtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBYTtJQUMzQyxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQVFEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQXFCO0lBQ3JELE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDekMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCO1lBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO0FBQzNCLENBQUM7QUFlRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWEsRUFBRSxHQUFhLEVBQUUsU0FBaUI7SUFDM0UsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLEdBQUcsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUIsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ25CLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBYyxFQUFRLEVBQUU7UUFDcEMsSUFBSSxNQUFNLENBQUMsT0FBTztZQUFFLE9BQU87UUFDM0IsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQztJQUNGLE9BQU87UUFDTCxNQUFNO1FBQ04sT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPO1FBQzdCLElBQUk7UUFDSixJQUFJLEVBQUUsQ0FBQyxLQUFlLEVBQVEsRUFBRTtZQUM5QixJQUFJLE1BQU0sQ0FBQyxPQUFPO2dCQUFFLE9BQU87WUFDM0IsSUFBSSxLQUFLLEtBQUssU0FBUztnQkFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsR0FBYSxFQUFFLE9BQWUsRUFBRSxlQUF1QjtJQUNuRixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxxRUFBcUU7WUFDckUsd0VBQXdFO1lBQ3hFLHdFQUF3RTtZQUN4RSxpRUFBaUU7WUFDakUsMEVBQTBFO1lBQzFFLHlFQUF5RTtZQUN6RSx5RUFBeUU7WUFDekUsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsQ0FBQyxFQUFFLENBQUM7WUFDbkQsT0FBTyxjQUFjLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFDRCxPQUFPLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxlQUFlLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUNaLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgc2VuZEJhZFJlcXVlc3QsIHNlbmRJbnRlcm5hbEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG4vKipcbiAqIFNldCB0aGUgZm91ciBzdGFuZGFyZCBTU0UgcmVzcG9uc2UgaGVhZGVycyAoZG9lcyBOT1QgZmx1c2gg4oCUIHRoZSBjYWxsZXIgZmx1c2hlc1xuICogYWZ0ZXIgYW55IGFkZGl0aW9uYWwgcGVyLWVuZHBvaW50IHNldHVwIGxpa2UgYHJlcy5zZXRUaW1lb3V0YCkuIFRoZSBzaW5nbGVcbiAqIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGB0ZXh0L2V2ZW50LXN0cmVhbWAgKyBuby1jYWNoZSArIGtlZXAtYWxpdmUgK1xuICogYFgtQWNjZWwtQnVmZmVyaW5nOiBub2AgKGRpc2FibGUgbmdpbnggYnVmZmVyaW5nKSBibG9jay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlU3NlSGVhZGVycyhyZXM6IFJlc3BvbnNlKTogdm9pZCB7XG4gIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2V2ZW50LXN0cmVhbScpO1xuICByZXMuc2V0SGVhZGVyKCdDYWNoZS1Db250cm9sJywgJ25vLWNhY2hlJyk7XG4gIHJlcy5zZXRIZWFkZXIoJ0Nvbm5lY3Rpb24nLCAna2VlcC1hbGl2ZScpO1xuICByZXMuc2V0SGVhZGVyKCdYLUFjY2VsLUJ1ZmZlcmluZycsICdubycpO1xufVxuXG4vKiogVGhlIHNsaWNlIG9mIGFuIEV4cHJlc3MvTm9kZSByZXNwb25zZSBuZWVkZWQgdG8gb2JzZXJ2ZSBhIGNsaWVudCBkaXNjb25uZWN0LiAqL1xuaW50ZXJmYWNlIENsb3NhYmxlUmVzcG9uc2Uge1xuICBvbihldmVudDogJ2Nsb3NlJywgbGlzdGVuZXI6ICgpID0+IHZvaWQpOiB1bmtub3duO1xuICByZWFkb25seSB3cml0YWJsZUZpbmlzaGVkOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIEFib3J0U2lnbmFsIHRoYXQgZmlyZXMgd2hlbiB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzIGJlZm9yZSB0aGUgcmVzcG9uc2VcbiAqIGZpbmlzaGVkIOKAlCBjYW5jZWxzIGEgcHJvdmlkZXIgY2FsbCAoYXZvaWRzIHdhc3RlZCBzcGVuZCkgYW5kIHRlbGxzIHRoZSByb3V0ZVxuICogdG8gc3RvcCB3cml0aW5nLlxuICpcbiAqIERpc2Nvbm5lY3QgaXMgZGV0ZWN0ZWQgb24gdGhlIFJFU1BPTlNFOiBgcmVzYCBlbWl0cyAnY2xvc2UnIHdoZW4gdGhlXG4gKiB1bmRlcmx5aW5nIGNvbm5lY3Rpb24gZ29lcyBhd2F5LCBhbmQgYHdyaXRhYmxlRmluaXNoZWRgIHRlbGxzIGFuIGVhcmx5IGNsb3NlXG4gKiAoY2xpZW50IGdvbmUpIGZyb20gdGhlIG5vcm1hbCBjbG9zZSBhZnRlciBgcmVzLmVuZCgpYC4gVGhlIHJlcXVlc3QncyBvd25cbiAqICdjbG9zZScgaXMgbm90IGEgZGlzY29ubmVjdCBzaWduYWwg4oCUIG9uIGN1cnJlbnQgTm9kZSBpdCBmaXJlcyBvbmNlIHRoZSByZXF1ZXN0XG4gKiBCT0RZIGhhcyBiZWVuIGNvbnN1bWVkIChleHByZXNzLmpzb24oKSBkb2VzIHRoYXQgYmVmb3JlIHRoZSBoYW5kbGVyIHJ1bnMpLCBzb1xuICogYSBkaXNjb25uZWN0IHdvdWxkIG5ldmVyIGJlIG9ic2VydmVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xpZW50QWJvcnRTaWduYWwocmVzOiBDbG9zYWJsZVJlc3BvbnNlKTogQWJvcnRTaWduYWwge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICByZXMub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGlmICghcmVzLndyaXRhYmxlRmluaXNoZWQpIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSk7XG4gIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbn1cblxuLyoqIEFuIG9wZW4gU1NFIHJlc3BvbnNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTc2VTdHJlYW0ge1xuICAvKiogQWJvcnRlZCB3aGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMgYmVmb3JlIHRoZSBzdHJlYW0gZmluaXNoZWQuICovXG4gIHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWw7XG4gIC8qKiBUcnVlIG9uY2UgdGhlIGNsaWVudCBoYXMgZGlzY29ubmVjdGVkLiAqL1xuICBhYm9ydGVkKCk6IGJvb2xlYW47XG4gIC8qKiBXcml0ZSBvbmUgYGRhdGE6YCBmcmFtZSBjYXJyeWluZyBgZXZlbnRgIGFzIEpTT04uIEEgbm8tb3AgYWZ0ZXIgYSBkaXNjb25uZWN0LiAqL1xuICBzZW5kKGV2ZW50OiB1bmtub3duKTogdm9pZDtcbiAgLyoqIFdyaXRlIHRoZSB0ZXJtaW5hbCBgZGF0YTogW0RPTkVdYCBmcmFtZSAocHJlY2VkZWQgYnkgYGV2ZW50YCwgd2hlbiBnaXZlbikuXG4gICAqICBBIG5vLW9wIGFmdGVyIGEgZGlzY29ubmVjdC4gVGhlIGNhbGxlciBzdGlsbCBlbmRzIHRoZSByZXNwb25zZS4gKi9cbiAgZG9uZShldmVudD86IHVua25vd24pOiB2b2lkO1xufVxuXG4vKipcbiAqIFNldCBTU0UgcmVzcG9uc2UgaGVhZGVycywgZmx1c2gsIGFuZCByZXR1cm4gdGhlIHN0cmVhbSdzIHdyaXRlciBwbHVzIGl0c1xuICogY2xpZW50LWRpc2Nvbm5lY3Qgc2lnbmFsIChzZWUge0BsaW5rIGNsaWVudEFib3J0U2lnbmFsfSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0U1NFU3RyZWFtKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIHRpbWVvdXRNczogbnVtYmVyKTogU3NlU3RyZWFtIHtcbiAgd3JpdGVTc2VIZWFkZXJzKHJlcyk7XG4gIHJlcy5zZXRUaW1lb3V0KHRpbWVvdXRNcyk7XG4gIHJlcy5mbHVzaEhlYWRlcnMoKTtcbiAgY29uc3Qgc2lnbmFsID0gY2xpZW50QWJvcnRTaWduYWwocmVzKTtcbiAgY29uc3Qgc2VuZCA9IChldmVudDogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkgcmV0dXJuO1xuICAgIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeShldmVudCl9XFxuXFxuYCk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgc2lnbmFsLFxuICAgIGFib3J0ZWQ6ICgpID0+IHNpZ25hbC5hYm9ydGVkLFxuICAgIHNlbmQsXG4gICAgZG9uZTogKGV2ZW50PzogdW5rbm93bik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgICBpZiAoZXZlbnQgIT09IHVuZGVmaW5lZCkgc2VuZChldmVudCk7XG4gICAgICByZXMud3JpdGUoJ2RhdGE6IFtET05FXVxcblxcbicpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQ2xhc3NpZnkgQUkgZ2VuZXJhdGlvbiBlcnJvcnMgYW5kIHNlbmQgdGhlIGFwcHJvcHJpYXRlIEhUVFAgcmVzcG9uc2Ugb3IgU1NFIGV2ZW50LlxuICogSWYgaGVhZGVycyBhcmUgYWxyZWFkeSBzZW50IChzdHJlYW1pbmcpLCB3cml0ZXMgYW4gU1NFIGVycm9yIGV2ZW50IGFuZCBlbmRzIHRoZSByZXNwb25zZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUFJRXJyb3IocmVzOiBSZXNwb25zZSwgbWVzc2FnZTogc3RyaW5nLCBmYWxsYmFja01lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXJlcy5oZWFkZXJzU2VudCkge1xuICAgIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdub3QgY29uZmlndXJlZCcpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ0FQSSBrZXknKSkge1xuICAgICAgLy8gU3VyZmFjZSB0aGUgT1JJR0lOQUwgbWVzc2FnZS4gSXQgbmFtZXMgdGhlIE1JU1NJTkcgQ09ORklHVVJBVElPTiDigJRcbiAgICAgIC8vIFwibm8gcHJvdmlkZXIgQVBJIGtleSBpcyBzZXQgYW5kIE9QRU5BSV9DT01QQVRJQkxFX0JBU0VfVVJMIGlzIHVuc2V0XCIsXG4gICAgICAvLyBvciB3aGljaCBlbnYgdmFyIGEgbmFtZWQgcHJvdmlkZXIgd2FudHMg4oCUIG5ldmVyIGEgc2VjcmV0IFZBTFVFLCBzbyBpdFxuICAgICAgLy8gaXMgc2FmZSB0byBzaG93IGFuZCBpdCBpcyB0aGUgb25seSB0aGluZyB0aGF0IG1ha2VzIHRoaXMgZXJyb3JcbiAgICAgIC8vIGFjdGlvbmFibGUuIFRoZSBnZW5lcmljIHJlcGxhY2VtZW50IGFsc28gbWlzLWRlc2NyaWJlZCB0aGUgY29tbW9uIGNhc2U6XG4gICAgICAvLyBpdCBzYWlkIFwiZm9yIHRoZSByZXF1ZXN0ZWQgcHJvdmlkZXJcIiB3aGVuIG5vIHByb3ZpZGVyIHdhcyByZXF1ZXN0ZWQgYXRcbiAgICAgIC8vIGFsbCwgcG9pbnRpbmcgb3BlcmF0b3JzIGF0IGEgcHJvdmlkZXIgYnVnIGluc3RlYWQgb2YgYXQgY29uZmlndXJhdGlvbi5cbiAgICAgIHJldHVybiBzZW5kSW50ZXJuYWxFcnJvcihyZXMsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5pbmNsdWRlcygnbm90IGF2YWlsYWJsZSBmb3IgcHJvdmlkZXInKSkge1xuICAgICAgcmV0dXJuIHNlbmRCYWRSZXF1ZXN0KHJlcywgbWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBzZW5kSW50ZXJuYWxFcnJvcihyZXMsIGZhbGxiYWNrTWVzc2FnZSwgeyBkZXRhaWxzOiBtZXNzYWdlIH0pO1xuICB9XG4gIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdlcnJvcicsIG1lc3NhZ2UgfSl9XFxuXFxuYCk7XG4gIHJlcy5lbmQoKTtcbn1cbiJdfQ==
|
|
159
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NlLWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaGVscGVycy9zc2UtaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBR3RDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUvRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBYTtJQUMzQyxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25ELEdBQUcsQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzNDLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQVFEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEdBQXFCO0lBQ3JELE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDekMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCO1lBQUUsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO0FBQzNCLENBQUM7QUFlRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBQWEsRUFBRSxHQUFhLEVBQUUsU0FBaUI7SUFDM0UsZUFBZSxDQUFDLEdBQUcs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LElBQUksQ0FBQyxTQUFTLENBQUM7UUFDaEMsSUFBSSxFQUFFLE9BQU87UUFDYixPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtRQUNyQixHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ25HLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDVixHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IEFwcEVycm9yIH0gZnJvbSAnLi4vZXJyb3JzL2FwcC1lcnJvcnMuanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBzZW5kRXJyb3IgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbi8qKlxuICogU2V0IHRoZSBmb3VyIHN0YW5kYXJkIFNTRSByZXNwb25zZSBoZWFkZXJzIChkb2VzIE5PVCBmbHVzaCDigJQgdGhlIGNhbGxlciBmbHVzaGVzXG4gKiBhZnRlciBhbnkgYWRkaXRpb25hbCBwZXItZW5kcG9pbnQgc2V0dXAgbGlrZSBgcmVzLnNldFRpbWVvdXRgKS4gVGhlIHNpbmdsZVxuICogc291cmNlIG9mIHRydXRoIGZvciB0aGUgYHRleHQvZXZlbnQtc3RyZWFtYCArIG5vLWNhY2hlICsga2VlcC1hbGl2ZSArXG4gKiBgWC1BY2NlbC1CdWZmZXJpbmc6IG5vYCAoZGlzYWJsZSBuZ2lueCBidWZmZXJpbmcpIGJsb2NrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVTc2VIZWFkZXJzKHJlczogUmVzcG9uc2UpOiB2b2lkIHtcbiAgcmVzLnNldEhlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvZXZlbnQtc3RyZWFtJyk7XG4gIHJlcy5zZXRIZWFkZXIoJ0NhY2hlLUNvbnRyb2wnLCAnbm8tY2FjaGUnKTtcbiAgcmVzLnNldEhlYWRlcignQ29ubmVjdGlvbicsICdrZWVwLWFsaXZlJyk7XG4gIHJlcy5zZXRIZWFkZXIoJ1gtQWNjZWwtQnVmZmVyaW5nJywgJ25vJyk7XG59XG5cbi8qKiBUaGUgc2xpY2Ugb2YgYW4gRXhwcmVzcy9Ob2RlIHJlc3BvbnNlIG5lZWRlZCB0byBvYnNlcnZlIGEgY2xpZW50IGRpc2Nvbm5lY3QuICovXG5pbnRlcmZhY2UgQ2xvc2FibGVSZXNwb25zZSB7XG4gIG9uKGV2ZW50OiAnY2xvc2UnLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHVua25vd247XG4gIHJlYWRvbmx5IHdyaXRhYmxlRmluaXNoZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gQWJvcnRTaWduYWwgdGhhdCBmaXJlcyB3aGVuIHRoZSBjbGllbnQgZGlzY29ubmVjdHMgYmVmb3JlIHRoZSByZXNwb25zZVxuICogZmluaXNoZWQg4oCUIGNhbmNlbHMgYSBwcm92aWRlciBjYWxsIChhdm9pZHMgd2FzdGVkIHNwZW5kKSBhbmQgdGVsbHMgdGhlIHJvdXRlXG4gKiB0byBzdG9wIHdyaXRpbmcuXG4gKlxuICogRGlzY29ubmVjdCBpcyBkZXRlY3RlZCBvbiB0aGUgUkVTUE9OU0U6IGByZXNgIGVtaXRzICdjbG9zZScgd2hlbiB0aGVcbiAqIHVuZGVybHlpbmcgY29ubmVjdGlvbiBnb2VzIGF3YXksIGFuZCBgd3JpdGFibGVGaW5pc2hlZGAgdGVsbHMgYW4gZWFybHkgY2xvc2VcbiAqIChjbGllbnQgZ29uZSkgZnJvbSB0aGUgbm9ybWFsIGNsb3NlIGFmdGVyIGByZXMuZW5kKClgLiBUaGUgcmVxdWVzdCdzIG93blxuICogJ2Nsb3NlJyBpcyBub3QgYSBkaXNjb25uZWN0IHNpZ25hbCDigJQgb24gY3VycmVudCBOb2RlIGl0IGZpcmVzIG9uY2UgdGhlIHJlcXVlc3RcbiAqIEJPRFkgaGFzIGJlZW4gY29uc3VtZWQgKGV4cHJlc3MuanNvbigpIGRvZXMgdGhhdCBiZWZvcmUgdGhlIGhhbmRsZXIgcnVucyksIHNvXG4gKiBhIGRpc2Nvbm5lY3Qgd291bGQgbmV2ZXIgYmUgb2JzZXJ2ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGllbnRBYm9ydFNpZ25hbChyZXM6IENsb3NhYmxlUmVzcG9uc2UpOiBBYm9ydFNpZ25hbCB7XG4gIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIHJlcy5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgaWYgKCFyZXMud3JpdGFibGVGaW5pc2hlZCkgY29udHJvbGxlci5hYm9ydCgpO1xuICB9KTtcbiAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xufVxuXG4vKiogQW4gb3BlbiBTU0UgcmVzcG9uc2UuICovXG5leHBvcnQgaW50ZXJmYWNlIFNzZVN0cmVhbSB7XG4gIC8qKiBBYm9ydGVkIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cyBiZWZvcmUgdGhlIHN0cmVhbSBmaW5pc2hlZC4gKi9cbiAgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgLyoqIFRydWUgb25jZSB0aGUgY2xpZW50IGhhcyBkaXNjb25uZWN0ZWQuICovXG4gIGFib3J0ZWQoKTogYm9vbGVhbjtcbiAgLyoqIFdyaXRlIG9uZSBgZGF0YTpgIGZyYW1lIGNhcnJ5aW5nIGBldmVudGAgYXMgSlNPTi4gQSBuby1vcCBhZnRlciBhIGRpc2Nvbm5lY3QuICovXG4gIHNlbmQoZXZlbnQ6IHVua25vd24pOiB2b2lkO1xuICAvKiogV3JpdGUgdGhlIHRlcm1pbmFsIGBkYXRhOiBbRE9ORV1gIGZyYW1lIChwcmVjZWRlZCBieSBgZXZlbnRgLCB3aGVuIGdpdmVuKS5cbiAgICogIEEgbm8tb3AgYWZ0ZXIgYSBkaXNjb25uZWN0LiBUaGUgY2FsbGVyIHN0aWxsIGVuZHMgdGhlIHJlc3BvbnNlLiAqL1xuICBkb25lKGV2ZW50PzogdW5rbm93bik6IHZvaWQ7XG59XG5cbi8qKlxuICogU2V0IFNTRSByZXNwb25zZSBoZWFkZXJzLCBmbHVzaCwgYW5kIHJldHVybiB0aGUgc3RyZWFtJ3Mgd3JpdGVyIHBsdXMgaXRzXG4gKiBjbGllbnQtZGlzY29ubmVjdCBzaWduYWwgKHNlZSB7QGxpbmsgY2xpZW50QWJvcnRTaWduYWx9KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRTU0VTdHJlYW0oX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgdGltZW91dE1zOiBudW1iZXIpOiBTc2VTdHJlYW0ge1xuICB3cml0ZVNzZUhlYWRlcnMocmVzKTtcbiAgcmVzLnNldFRpbWVvdXQodGltZW91dE1zKTtcbiAgcmVzLmZsdXNoSGVhZGVycygpO1xuICBjb25zdCBzaWduYWwgPSBjbGllbnRBYm9ydFNpZ25hbChyZXMpO1xuICBjb25zdCBzZW5kID0gKGV2ZW50OiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSByZXR1cm47XG4gICAgcmVzLndyaXRlKGBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1cXG5cXG5gKTtcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBzaWduYWwsXG4gICAgYWJvcnRlZDogKCkgPT4gc2lnbmFsLmFib3J0ZWQsXG4gICAgc2VuZCxcbiAgICBkb25lOiAoZXZlbnQ/OiB1bmtub3duKTogdm9pZCA9PiB7XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHJldHVybjtcbiAgICAgIGlmIChldmVudCAhPT0gdW5kZWZpbmVkKSBzZW5kKGV2ZW50KTtcbiAgICAgIHJlcy53cml0ZSgnZGF0YTogW0RPTkVdXFxuXFxuJyk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEhvdyBhbiBBSSBmYWlsdXJlIGlzIGFuc3dlcmVkOiBhbiBIVFRQIHN0YXR1cywgYSBjb2RlLCBhbmQgYSBtZXNzYWdlIFdFIHdyb3RlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBSUVycm9yUmVzcG9uc2Uge1xuICBzdGF0dXM6IG51bWJlcjtcbiAgY29kZTogRXJyb3JDb2RlO1xuICAvKiogU2FmZSB0byBzaG93OiBuZXZlciByYXcgcHJvdmlkZXIgcmVzcG9uc2UgdGV4dC4gKi9cbiAgbWVzc2FnZTogc3RyaW5nO1xuICAvKiogU2Vjb25kcywgZnJvbSB0aGUgcHJvdmlkZXIncyBvd24gYFJldHJ5LUFmdGVyYCB3aGVuIGl0IHNlbnQgb25lLiAqL1xuICByZXRyeUFmdGVyU2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqIFRoZSBmaWVsZHMgb2YgYW4gYWktc2RrIGBBUElDYWxsRXJyb3JgIHRoaXMgY2xhc3NpZmllciByZWFkcyAoZHVjay10eXBlZDogYXBpLWNvcmUgZG9lcyBub3QgZGVwZW5kIG9uIGBhaWApLiAqL1xuaW50ZXJmYWNlIFByb3ZpZGVyQ2FsbEVycm9yIHtcbiAgc3RhdHVzQ29kZT86IHVua25vd247XG4gIHJlc3BvbnNlSGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD47XG59XG5cbi8qKiBgUmV0cnktQWZ0ZXJgIGFzIHNlY29uZHMg4oCUIGVpdGhlciBmb3JtIHRoZSBoZWFkZXIgYWxsb3dzIChkZWx0YS1zZWNvbmRzIG9yIGFuIEhUVFAgZGF0ZSkuICovXG5mdW5jdGlvbiByZXRyeUFmdGVyU2Vjb25kcyhoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmF3ID0gaGVhZGVycz8uWydyZXRyeS1hZnRlciddID8/IGhlYWRlcnM/LlsnUmV0cnktQWZ0ZXInXTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGFzTnVtYmVyID0gTnVtYmVyKHJhdyk7XG4gIGlmIChOdW1iZXIuaXNGaW5pdGUoYXNOdW1iZXIpICYmIGFzTnVtYmVyID49IDApIHJldHVybiBNYXRoLmNlaWwoYXNOdW1iZXIpO1xuICBjb25zdCBhdCA9IERhdGUucGFyc2UocmF3KTtcbiAgcmV0dXJuIE51bWJlci5pc05hTihhdCkgPyB1bmRlZmluZWQgOiBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGF0IC0gRGF0ZS5ub3coKSkgLyAxMDAwKSk7XG59XG5cbi8qKiBUcnVlIGZvciBhbiBhYm9ydCB0aGF0IGNhbWUgZnJvbSBhIFRJTUVPVVQgc2lnbmFsIHJhdGhlciB0aGFuIGEgY2xpZW50IGRpc2Nvbm5lY3QuICovXG5mdW5jdGlvbiBpc1RpbWVvdXQoZXJyb3I6IHVua25vd24pOiBib29sZWFuIHtcbiAgY29uc3QgZSA9IGVycm9yIGFzIHsgbmFtZT86IHVua25vd247IGNhdXNlPzogeyBuYW1lPzogdW5rbm93biB9IH0gfCBudWxsO1xuICByZXR1cm4gZT8ubmFtZSA9PT0gJ1RpbWVvdXRFcnJvcicgfHwgZT8uY2F1c2U/Lm5hbWUgPT09ICdUaW1lb3V0RXJyb3InO1xufVxuXG4vKipcbiAqIENsYXNzaWZ5IGFuIEFJIGZhaWx1cmUgaW50byB0aGUgcmVzcG9uc2UgYSBjYWxsZXIgc2VuZHMuXG4gKlxuICogUHJvdmlkZXIgZmFpbHVyZXMgYXJlIG1hdGNoZWQgb24gdGhlIHByb3ZpZGVyJ3MgSFRUUCBTVEFUVVMgKGBBUElDYWxsRXJyb3Iuc3RhdHVzQ29kZWApLFxuICogbmV2ZXIgb24gbWVzc2FnZSB0ZXh0LCBhbmQgYW5zd2VyZWQgd2l0aCBhIHNlbnRlbmNlIG9mIG91cnM6IGEgcHJvdmlkZXIncyBlcnJvciBib2R5XG4gKiBjYW4gY2FycnkgYWNjb3VudCBpZHMsIHJlcXVlc3QgaWRzLCBxdW90YSBkZXRhaWxzIG9yIGFuIGVjaG8gb2YgdGhlIHByb21wdCwgYW5kIG5vbmVcbiAqIG9mIGl0IGJlbG9uZ3MgaW4gYSByZXNwb25zZSBvciBhbiBTU0UgZnJhbWUuIFRoZSBmdWxsIGVycm9yIHN0aWxsIGdvZXMgdG8gdGhlXG4gKiBjYWxsZXIncyBsb2cgbGluZS5cbiAqXG4gKiAgLSA0Mjkg4oaSIDQyOSAod2l0aCB0aGUgcHJvdmlkZXIncyBgUmV0cnktQWZ0ZXJgKTogdGhlIHByb3ZpZGVyIGlzIHJhdGUgbGltaXRpbmcuXG4gKiAgLSA1MjkgLyA1eHgg4oaSIDUwMyAod2l0aCBgUmV0cnktQWZ0ZXJgKTogdGhlIHByb3ZpZGVyIGlzIG92ZXJsb2FkZWQgb3IgZG93bi5cbiAqICAtIDQwMSAvIDQwMyDihpIgNTAyOiB0aGUgcHJvdmlkZXIgcmVmdXNlZCB0aGUgY3JlZGVudGlhbCAoYSBCWU8gb3Igb3JnIGtleSBpcyB3cm9uZykuXG4gKiAgLSBhIHRpbWVvdXQgc2lnbmFsIOKGkiA1MDQuXG4gKiAgLSBhbiB7QGxpbmsgQXBwRXJyb3J9IChBSURpc2FibGVkRXJyb3IsIEFJQ29uZmlndXJhdGlvbkVycm9yLCDigKYpIOKGkiBpdHMgb3duIHN0YXR1cyBhbmQgbWVzc2FnZS5cbiAqICAtIG90aGVyd2lzZSB0aGUgY29uZmlndXJhdGlvbiBtZXNzYWdlcyB0aGUgcmVnaXN0cnkgd3JpdGVzICh0aGV5IG5hbWUgZW52IHZhcnMsXG4gKiAgICBuZXZlciB2YWx1ZXMpIGtlZXAgdGhlaXIgdGV4dDsgYW55dGhpbmcgZWxzZSBnZXRzIGBmYWxsYmFja01lc3NhZ2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlBSUVycm9yKGVycm9yOiB1bmtub3duLCBmYWxsYmFja01lc3NhZ2U6IHN0cmluZyk6IEFJRXJyb3JSZXNwb25zZSB7XG4gIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwcEVycm9yKSB7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBlcnJvci5zdGF0dXNDb2RlLCBjb2RlOiBlcnJvci5jb2RlLCBtZXNzYWdlOiBlcnJvci5tZXNzYWdlIH07XG4gIH1cbiAgY29uc3QgcHJvdmlkZXJTdGF0dXMgPSB0eXBlb2YgKGVycm9yIGFzIFByb3ZpZGVyQ2FsbEVycm9yIHwgbnVsbCk/LnN0YXR1c0NvZGUgPT09ICdudW1iZXInXG4gICAgPyAoZXJyb3IgYXMgUHJvdmlkZXJDYWxsRXJyb3IpLnN0YXR1c0NvZGUgYXMgbnVtYmVyXG4gICAgOiB1bmRlZmluZWQ7XG4gIGlmIChwcm92aWRlclN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgcmV0cnlBZnRlciA9IHJldHJ5QWZ0ZXJTZWNvbmRzKChlcnJvciBhcyBQcm92aWRlckNhbGxFcnJvcikucmVzcG9uc2VIZWFkZXJzKTtcbiAgICBjb25zdCB3aXRoUmV0cnkgPSByZXRyeUFmdGVyICE9PSB1bmRlZmluZWQgPyB7IHJldHJ5QWZ0ZXJTZWNvbmRzOiByZXRyeUFmdGVyIH0gOiB7fTtcbiAgICBpZiAocHJvdmlkZXJTdGF0dXMgPT09IDQyOSkge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiA0MjksIGNvZGU6IEVycm9yQ29kZS5SQVRFX0xJTUlUX0VYQ0VFREVELCBtZXNzYWdlOiAnVGhlIEFJIHByb3ZpZGVyIGlzIHJhdGUgbGltaXRpbmcgcmVxdWVzdHMuIFRyeSBhZ2FpbiBzaG9ydGx5LicsIC4uLndpdGhSZXRyeSB9O1xuICAgIH1cbiAgICBpZiAocHJvdmlkZXJTdGF0dXMgPT09IDUyOSB8fCBwcm92aWRlclN0YXR1cyA+PSA1MDApIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogNTAzLCBjb2RlOiBFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRSwgbWVzc2FnZTogJ1RoZSBBSSBwcm92aWRlciBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZS4gVHJ5IGFnYWluIHNob3J0bHkuJywgLi4ud2l0aFJldHJ5IH07XG4gICAgfVxuICAgIGlmIChwcm92aWRlclN0YXR1cyA9PT0gNDAxIHx8IHByb3ZpZGVyU3RhdHVzID09PSA0MDMpIHtcbiAgICAgIHJldHVybiB7IHN0YXR1czogNTAyLCBjb2RlOiBFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsIG1lc3NhZ2U6ICdUaGUgQUkgcHJvdmlkZXIgcmVqZWN0ZWQgdGhlIEFQSSBrZXkgdXNlZCBmb3IgdGhpcyByZXF1ZXN0LiBDaGVjayB0aGUga2V5IGluIFNldHRpbmdzLCBvciB0aGUgb25lIHlvdSBzdXBwbGllZC4nIH07XG4gICAgfVxuICAgIHJldHVybiB7IHN0YXR1czogNTAyLCBjb2RlOiBFcnJvckNvZGUuSU5URVJOQUxfRVJST1IsIG1lc3NhZ2U6IGZhbGxiYWNrTWVzc2FnZSB9O1xuICB9XG4gIGlmIChpc1RpbWVvdXQoZXJyb3IpKSB7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiA1MDQsIGNvZGU6IEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLCBtZXNzYWdlOiAnVGhlIEFJIHByb3ZpZGVyIGRpZCBub3QgcmVzcG9uZCBpbiB0aW1lLiBUcnkgYWdhaW4sIG9yIGFzayBmb3Igc29tZXRoaW5nIHNtYWxsZXIuJyB9O1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZSA9IHR5cGVvZiBlcnJvciA9PT0gJ3N0cmluZycgPyBlcnJvciA6IGVycm9yTWVzc2FnZShlcnJvcik7XG4gIGlmIChtZXNzYWdlLmluY2x1ZGVzKCdub3QgY29uZmlndXJlZCcpIHx8IG1lc3NhZ2UuaW5jbHVkZXMoJ0FQSSBrZXknKSkge1xuICAgIC8vIFN1cmZhY2UgdGhlIE9SSUdJTkFMIG1lc3NhZ2UuIE9ubHkgdGhlIHJlZ2lzdHJ5J3Mgb3duIGNvbmZpZ3VyYXRpb24gZXJyb3JzXG4gICAgLy8gcmVhY2ggaGVyZSAoYSBwcm92aWRlcidzIHJlc3BvbnNlIGNhcnJpZXMgYSBzdGF0dXMgYW5kIHdhcyBoYW5kbGVkIGFib3ZlKTpcbiAgICAvLyB0aGV5IG5hbWUgdGhlIE1JU1NJTkcgQ09ORklHVVJBVElPTiDigJQgXCJubyBwcm92aWRlciBBUEkga2V5IGlzIHNldCBhbmRcbiAgICAvLyBPUEVOQUlfQ09NUEFUSUJMRV9CQVNFX1VSTCBpcyB1bnNldFwiLCBvciB3aGljaCBlbnYgdmFyIGEgbmFtZWQgcHJvdmlkZXJcbiAgICAvLyB3YW50cyDigJQgbmV2ZXIgYSBzZWNyZXQgVkFMVUUsIGFuZCBhcmUgdGhlIG9ubHkgdGhpbmcgdGhhdCBtYWtlcyB0aGlzIGVycm9yXG4gICAgLy8gYWN0aW9uYWJsZS5cbiAgICByZXR1cm4geyBzdGF0dXM6IDUwMCwgY29kZTogRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlIH07XG4gIH1cbiAgaWYgKG1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBhdmFpbGFibGUgZm9yIHByb3ZpZGVyJykpIHtcbiAgICByZXR1cm4geyBzdGF0dXM6IDQwMCwgY29kZTogRXJyb3JDb2RlLlZBTElEQVRJT05fRVJST1IsIG1lc3NhZ2UgfTtcbiAgfVxuICByZXR1cm4geyBzdGF0dXM6IDUwMCwgY29kZTogRXJyb3JDb2RlLklOVEVSTkFMX0VSUk9SLCBtZXNzYWdlOiBmYWxsYmFja01lc3NhZ2UgfTtcbn1cblxuLyoqXG4gKiBBbnN3ZXIgYW4gQUkgZ2VuZXJhdGlvbiBmYWlsdXJlOiBhbiBIVFRQIGVycm9yIGJlZm9yZSB0aGUgc3RyZWFtIHN0YXJ0ZWQsIG9yIGFuXG4gKiBTU0UgYGVycm9yYCBldmVudCAodGhlbiBlbmQpIG9uY2UgaXQgaGFzLiBUYWtlcyB0aGUgRVJST1IsIG5vdCBpdHMgbWVzc2FnZSDigJQgdGhlXG4gKiBwcm92aWRlciBzdGF0dXMgaXMgd2hhdCBkZWNpZGVzIHRoZSBhbnN3ZXIgKHNlZSB7QGxpbmsgY2xhc3NpZnlBSUVycm9yfSk7IGEgc3RyaW5nXG4gKiBpcyBzdGlsbCBhY2NlcHRlZCBmb3IgdGhlIHJlZ2lzdHJ5J3MgY29uZmlndXJhdGlvbiBtZXNzYWdlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZUFJRXJyb3IocmVzOiBSZXNwb25zZSwgZXJyb3I6IHVua25vd24sIGZhbGxiYWNrTWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFuc3dlciA9IGNsYXNzaWZ5QUlFcnJvcihlcnJvciwgZmFsbGJhY2tNZXNzYWdlKTtcbiAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICBpZiAoYW5zd2VyLnJldHJ5QWZ0ZXJTZWNvbmRzICE9PSB1bmRlZmluZWQpIHJlcy5zZXRIZWFkZXIoJ1JldHJ5LUFmdGVyJywgU3RyaW5nKGFuc3dlci5yZXRyeUFmdGVyU2Vjb25kcykpO1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBhbnN3ZXIuc3RhdHVzLCBhbnN3ZXIubWVzc2FnZSwgYW5zd2VyLmNvZGUpO1xuICB9XG4gIHJlcy53cml0ZShgZGF0YTogJHtKU09OLnN0cmluZ2lmeSh7XG4gICAgdHlwZTogJ2Vycm9yJyxcbiAgICBtZXNzYWdlOiBhbnN3ZXIubWVzc2FnZSxcbiAgICBjb2RlOiBhbnN3ZXIuY29kZSxcbiAgICBzdGF0dXM6IGFuc3dlci5zdGF0dXMsXG4gICAgLi4uKGFuc3dlci5yZXRyeUFmdGVyU2Vjb25kcyAhPT0gdW5kZWZpbmVkID8geyByZXRyeUFmdGVyU2Vjb25kczogYW5zd2VyLnJldHJ5QWZ0ZXJTZWNvbmRzIH0gOiB7fSksXG4gIH0pfVxcblxcbmApO1xuICByZXMuZW5kKCk7XG59XG4iXX0=
|
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 { runDeferredQuotaCheck } from './deferred-quota-check.js';
|
|
5
6
|
import { hasValidIdentityClaims, verifyBearerToken } from './jwt-verify.js';
|
|
6
7
|
import { recordAuthzDenial } from './permission-gates.js';
|
|
7
8
|
import { checkRevocation, isImpersonationWriteBlocked, needsRevocationCheck } from './revocation.js';
|
|
@@ -170,11 +171,13 @@ async function verifyAndAttach(options, rawToken, req, res, next) {
|
|
|
170
171
|
checkRevocation(decoded).then((refusal) => {
|
|
171
172
|
if (refusal)
|
|
172
173
|
return sendError(res, HttpStatus.UNAUTHORIZED, refusal, ErrorCode.TOKEN_REVOKED);
|
|
173
|
-
next
|
|
174
|
+
runDeferredQuotaCheck(req, res, next);
|
|
174
175
|
}).catch(next);
|
|
175
176
|
return;
|
|
176
177
|
}
|
|
177
|
-
|
|
178
|
+
// The apiCalls check a mount armed (api-server `apiCallsQuota`) runs here,
|
|
179
|
+
// now that tenancy is JWT-authoritative; a plain next() where none was armed.
|
|
180
|
+
runDeferredQuotaCheck(req, res, next);
|
|
178
181
|
}
|
|
179
182
|
catch (error) {
|
|
180
183
|
if (error instanceof jwt.TokenExpiredError) {
|
|
@@ -196,4 +199,4 @@ async function verifyAndAttach(options, rawToken, req, res, next) {
|
|
|
196
199
|
return sendError(res, HttpStatus.UNAUTHORIZED, 'Authentication failed', ErrorCode.UNAUTHORIZED);
|
|
197
200
|
}
|
|
198
201
|
}
|
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQVF0QyxPQUFPLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSwyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBdUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUF3QixNQUFNLHNCQUFzQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsV0FB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QUFJLEVBQUUsQ0FBQztJQUNULENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsSUFBSSxLQUFLLFlBQVksR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0MsT0FBTyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQy9GLENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSw0RUFBNEU7UUFDNUUsMEVBQTBFO1FBQzFFLG9FQUFvRTtRQUNwRSxJQUFJLEtBQUssWUFBWSxvQkFBb0IsSUFBSSxLQUFLLFlBQVksZUFBZSxFQUFFLENBQUM7WUFDOUUsTUFBTSxDQUFDLElBQUksQ0FBQyxtREFBbUQsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUMzRixPQUFPLFNBQVMsQ0FDZCxHQUFHLEVBQUUsVUFBVSxDQUFDLG1CQUFtQixFQUNuQyw2REFBNkQsRUFDN0QsU0FBUyxDQUFDLG1CQUFtQixDQUM5QixDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksS0FBSyxZQUFZLGVBQWUsSUFBSSxLQUFLLFlBQVksR0FBRyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDL0UsT0FBTyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzRixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxZQUFZLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2xHLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogYHJlcXVpcmVBdXRoYDogYmVhcmVyIC8gYWNjZXNzLWtleSBhdXRoZW50aWNhdGlvbiwgdGhlIGNoZWNrcyBldmVyeVxuICogdmVyaWZpZWQgcmVxdWVzdCBwYXNzZXMsIGFuZCB0aGUgdGVuYW50IGlkZW50aXR5IGl0IGF0dGFjaGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UsIE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGp3dCBmcm9tICdqc29ud2VidG9rZW4nO1xuaW1wb3J0IHsgcmVmdXNlRm9yQXNzdXJhbmNlIH0gZnJvbSAnLi9hc3N1cmFuY2UuanMnO1xuaW1wb3J0IHsgaGFzVmFsaWRJZGVudGl0eUNsYWltcywgdmVyaWZ5QmVhcmVyVG9rZW4gfSBmcm9tICcuL2p3dC12ZXJpZnkuanMnO1xuaW1wb3J0IHsgcmVjb3JkQXV0aHpEZW5pYWwgfSBmcm9tICcuL3Blcm1pc3Npb24tZ2F0ZXMuanMnO1xuaW1wb3J0IHsgY2hlY2tSZXZvY2F0aW9uLCBpc0ltcGVyc29uYXRpb25Xcml0ZUJsb2NrZWQsIG5lZWRzUmV2b2NhdGlvbkNoZWNrIH0gZnJvbSAnLi9yZXZvY2F0aW9uLmpzJztcbmltcG9ydCB7IHRhZ1JvdXRlR2F0ZSB9IGZyb20gJy4vcm91dGUtdGFibGUuanMnO1xuaW1wb3J0IHsgaXNTZXJ2aWNlVG9rZW5EZW5pZWQsIHNlcnZpY2VOYW1lT2YgfSBmcm9tICcuL3NlcnZpY2UtdG9rZW5zLmpzJztcbmltcG9ydCB7IEh0dHBTdGF0dXMgfSBmcm9tICcuLi9jb25zdGFudHMvaHR0cC1zdGF0dXMuanMnO1xuaW1wb3J0IHsgSndrc1VuYXZhaWxhYmxlRXJyb3IsIFVua25vd25LaWRFcnJvciB9IGZyb20gJy4uL3NlcnZpY2VzL2p3a3MtY2FjaGUuanMnO1xuaW1wb3J0IHsgU2VydmljZUtleUVycm9yLCBzZXJ2aWNlSWRlbnRpdHkgfSBmcm9tICcuLi9zZXJ2aWNlcy9zZXJ2aWNlLWtleXMuanMnO1xuaW1wb3J0IHsgdHlwZSBBc3N1cmFuY2VMZXZlbCB9IGZyb20gJy4uL3R5cGVzL2NvbW1vbi5qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGUgfSBmcm9tICcuLi90eXBlcy9lcnJvci1jb2Rlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEh0dHBSZXF1ZXN0IH0gZnJvbSAnLi4vdHlwZXMvaHR0cC5qcyc7XG5pbXBvcnQgeyBpc09wYXF1ZUFwaUtleSB9IGZyb20gJy4uL3V0aWxzL2FwaS1rZXkuanMnO1xuaW1wb3J0IHsgZ2V0SGVhZGVyU3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaGVhZGVycy5qcyc7XG5pbXBvcnQgeyBnZXRJZGVudGl0eSwgdHlwZSBSZXF1ZXN0SWRlbnRpdHkgfSBmcm9tICcuLi91dGlscy9pZGVudGl0eS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW1pdENvdW50ZXIgfSBmcm9tICcuLi91dGlscy9tZXRyaWMtZW1pdHRlci5qcyc7XG5pbXBvcnQgeyBzZW5kRXJyb3IgfSBmcm9tICcuLi91dGlscy9yZXNwb25zZS5qcyc7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcignYXV0aC1taWRkbGV3YXJlJyk7XG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVBdXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbGxvdyB4LW9yZy1pZC94LW9yZy1uYW1lIGhlYWRlcnMgdG8gb3ZlcnJpZGUgdGhlIEpXVCdzIG9yZ2FuaXphdGlvbiBmaWVsZHMuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIGB4LW9yZy1pZGAvYHgtb3JnLW5hbWVgIGhlYWRlcnMgb3ZlcnJpZGUgdGhlIGNhbGxlcidzIG9yZ1xuICAgKiDigJQgYnV0IE9OTFkgZm9yIGEgdmVyaWZpZWQgU1lTLUFETUlOIChgaXNTdXBlckFkbWluYCBjbGFpbSkuIEZvciBhbnkgb3JkaW5hcnlcbiAgICogYXV0aGVudGljYXRlZCB1c2VyIHRoZSBoZWFkZXJzIGFyZSBpZ25vcmVkLCBzbyBlbmFibGluZyB0aGlzIGNhbiBuZXZlciBsZXQgYVxuICAgKiBub3JtYWwgdXNlciBpbXBlcnNvbmF0ZSBhbm90aGVyIHRlbmFudCdzIG9yZy4gVXNlIGZvciBjcm9zcy1vcmcgYWRtaW4gdG9vbGluZ1xuICAgKiAoZS5nLiBhIHN5c2FkbWluIG1hbmFnaW5nIGEgZ2l2ZW4gb3JnJ3MgYmlsbGluZykuIElmIHVuc3VyZSwgbGVhdmUgaXQgZGlzYWJsZWQuXG4gICAqL1xuICBhbGxvd09yZ0hlYWRlck92ZXJyaWRlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERlbWFuZCB0aGF0IHRoZSB3aG9sZSBTRVNTSU9OIGJlIGF0IGxlYXN0IHRoaXMgYXNzdXJhbmNlIGxldmVsLlxuICAgKlxuICAgKiBgbWluQXNzdXJhbmNlOiAyYCBtZWFucyB0aGUgcGVyc29uIGF1dGhlbnRpY2F0ZWQgd2l0aCBhIHNlY29uZCBmYWN0b3Ig4oCUIGFcbiAgICogcGFzc2tleSB3aXRoIHVzZXIgdmVyaWZpY2F0aW9uLCBhIHBhc3N3b3JkIHBsdXMgYW4gYXV0aGVudGljYXRvciBjb2RlLCBvclxuICAgKiBTU08gdGhyb3VnaCBhbiBJZFAgdGhlIG9yZyBtYXJrZWQgYXMgZW5mb3JjaW5nIE1GQS4gQSB3ZWFrZXIgdG9rZW4gZ2V0c1xuICAgKiAqKjQwMSBgTUZBX1JFUVVJUkVEYCoqLCB3aGljaCB0aGUgY2xpZW50IGFuc3dlcnMgYnkgc2VuZGluZyB0aGUgcGVyc29uIHRvXG4gICAqIGVucm9sbWVudCBvciB0byBhIHN0cm9uZ2VyIHNpZ24taW47IHJlZnJlc2hpbmcgY2Fubm90IGhlbHAsIGJlY2F1c2UgYGFhbGBcbiAgICogbGl2ZXMgb24gdGhlIHNlc3Npb24gc2xvdCBhbmQgYSByZWZyZXNoIG5ldmVyIHJhaXNlcyBpdC5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgU0VTU0lPTi1sZXZlbCBjb3VudGVycGFydCB0byB7QGxpbmsgcmVxdWlyZVN0ZXBVcH0sIHdoaWNoIHN0YXlzXG4gICAqIGEgZnJlc2gsIHBlci1hY3Rpb24gY29uZmlybWF0aW9uLiBVc2UgYm90aCBvbiB0aGUgbW9zdCBkYW5nZXJvdXMgcm91dGVzLlxuICAgKlxuICAgKiBNQUNISU5FUyBORVZFUiBTQVRJU0ZZIElULiBBIHNlcnZpY2UgcHJpbmNpcGFsLCBhbiBvcmcgc2VydmljZSBhY2NvdW50IGFuZFxuICAgKiBhbiBleGNoYW5nZWQgYWNjZXNzIGtleSBhbGwgZ2V0ICoqNDAzIGBIVU1BTl9TRVNTSU9OX1JFUVVJUkVEYCoqIOKAlCB0aGVyZSBpc1xuICAgKiBubyBwZXJzb24gYmVoaW5kIHRoZW0gdG8gaGF2ZSBwcmVzZW50ZWQgYSBmYWN0b3IsIHNvIFwiYXNzdXJhbmNlXCIgaXMgbm90IGFcbiAgICogcXVlc3Rpb24gdGhlaXIgY3JlZGVudGlhbCBjYW4gYW5zd2VyLiBUaGF0IGlzIGRlbGliZXJhdGVseSBub3QgYSBzaWxlbnRcbiAgICogcGFzcy10aHJvdWdoIGZvciBpbnRlcm5hbCBzZXJ2aWNlczogYSByb3V0ZSB0aGF0IGRlbWFuZHMgTUZBIGlzIGEgcm91dGUgYVxuICAgKiBodW1hbiBpcyBkb2luZyBzb21ldGhpbmcgZGFuZ2Vyb3VzIG9uLlxuICAgKi9cbiAgbWluQXNzdXJhbmNlPzogQXNzdXJhbmNlTGV2ZWw7XG4gIC8qKlxuICAgKiBXaXRoIHtAbGluayBtaW5Bc3N1cmFuY2V9LCBhZGRpdGlvbmFsbHkgYm91bmQgaG93IGxvbmcgYWdvIHRoYXQgc2lnbi1pblxuICAgKiBoYXBwZW5lZCAoc2Vjb25kcywgY29tcGFyZWQgYWdhaW5zdCB0aGUgdG9rZW4ncyBgYXV0aF90aW1lYCkuIEEgc2Vzc2lvbiB0aGF0XG4gICAqIGlzIE1GQS1ncmFkZSBidXQgb2xkZXIgdGhhbiB0aGlzIGdldHMgKio0MDEgYFJFQVVUSF9SRVFVSVJFRGAqKi4gSWdub3JlZFxuICAgKiB3aXRob3V0IGBtaW5Bc3N1cmFuY2VgIOKAlCBcImhvdyByZWNlbnRcIiBpcyBvbmx5IG1lYW5pbmdmdWwgb25jZSBcImhvdyBzdHJvbmdcIlxuICAgKiBpcyBiZWluZyBhc2tlZC5cbiAgICovXG4gIG1heEFnZT86IG51bWJlcjtcbn1cblxuLyoqIEpXVCBhdXRoIG1pZGRsZXdhcmUuIFVzZSBkaXJlY3RseSBvciBjYWxsIHdpdGggb3B0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICBvcHRpb25zPzogUmVxdWlyZUF1dGhPcHRpb25zLFxuKTogKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVpcmVBdXRoKFxuICByZXFPck9wdGlvbnM/OiBSZXF1ZXN0IHwgUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXM/OiBSZXNwb25zZSxcbiAgbmV4dD86IE5leHRGdW5jdGlvbixcbik6IHZvaWQgfCAoKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKSA9PiB2b2lkKSB7XG4gIGlmIChyZXFPck9wdGlvbnMgJiYgcmVzICYmIG5leHQgJiYgJ2hlYWRlcnMnIGluIHJlcU9yT3B0aW9ucykge1xuICAgIHJldHVybiBfcmVxdWlyZUF1dGgoe30sIHJlcU9yT3B0aW9ucyBhcyBSZXF1ZXN0LCByZXMsIG5leHQpO1xuICB9XG5cbiAgY29uc3Qgb3B0aW9ucyA9IChyZXFPck9wdGlvbnMgYXMgUmVxdWlyZUF1dGhPcHRpb25zKSB8fCB7fTtcbiAgY29uc3QgZ2F0ZSA9IHRhZ1JvdXRlR2F0ZSgocmVxOiBSZXF1ZXN0LCByZXNJbm5lcjogUmVzcG9uc2UsIG5leHRJbm5lcjogTmV4dEZ1bmN0aW9uKSA9PiB7XG4gICAgX3JlcXVpcmVBdXRoKG9wdGlvbnMsIHJlcSwgcmVzSW5uZXIsIG5leHRJbm5lcik7XG4gIH0sIHsga2luZDogJ2F1dGgnIH0pO1xuICBpZiAob3B0aW9ucy5taW5Bc3N1cmFuY2UpIHtcbiAgICB0YWdSb3V0ZUdhdGUoZ2F0ZSwgeyBraW5kOiAnYXNzdXJhbmNlJywgbWluQXNzdXJhbmNlOiBvcHRpb25zLm1pbkFzc3VyYW5jZSwgLi4uKG9wdGlvbnMubWF4QWdlICE9PSB1bmRlZmluZWQgPyB7IG1heEFnZTogb3B0aW9ucy5tYXhBZ2UgfSA6IHt9KSB9KTtcbiAgfVxuICByZXR1cm4gZ2F0ZTtcbn1cbnRhZ1JvdXRlR2F0ZShyZXF1aXJlQXV0aCwgeyBraW5kOiAnYXV0aCcgfSk7XG5cbmZ1bmN0aW9uIF9yZXF1aXJlQXV0aChcbiAgb3B0aW9uczogUmVxdWlyZUF1dGhPcHRpb25zLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IHZvaWQge1xuICBjb25zdCBhdXRoSGVhZGVyID0gcmVxLmhlYWRlcnMuYXV0aG9yaXphdGlvbjtcblxuICBpZiAoIWF1dGhIZWFkZXIpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdBdXRob3JpemF0aW9uIGhlYWRlciByZXF1aXJlZCcsIEVycm9yQ29kZS5UT0tFTl9NSVNTSU5HKTtcbiAgfVxuXG4gIGNvbnN0IHBhcnRzID0gYXV0aEhlYWRlci5zcGxpdCgnICcpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAyIHx8IHBhcnRzWzBdICE9PSAnQmVhcmVyJykge1xuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgYXV0aG9yaXphdGlvbiBmb3JtYXQuIFVzZTogQmVhcmVyIDx0b2tlbj4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gIH1cblxuICAvLyBBbiBPUEFRVUUgQUNDRVNTIEtFWSAoYHBiX3BhdF/igKZgIC8gYHBiX3NhX+KApmApIGNhcnJpZXMgbm8gY2xhaW1zIGFuZCBub1xuICAvLyBzaWduYXR1cmUsIHNvIGl0IGNhbm5vdCBiZSB2ZXJpZmllZCBoZXJlLiBUcmFkZSBpdCBhdCBwbGF0Zm9ybSBmb3IgYVxuICAvLyBzaG9ydC1saXZlZCBKV1QgKGNhY2hlZCBpbi1wcm9jZXNzIHVudGlsIGl0IGV4cGlyZXMpIGFuZCB0aGVuIHZlcmlmeSB0aGF0XG4gIC8vIEpXVCBvbiB0aGUgbm9ybWFsIHBhdGgg4oCUIHNlcnZpY2VzIG5ldmVyIHJlYWQgYSBrZXkgaGFzaC4gU2VlXG4gIC8vIGBzZXJ2aWNlcy9hcGkta2V5LWV4Y2hhbmdlLnRzYC5cbiAgaWYgKGlzT3BhcXVlQXBpS2V5KHBhcnRzWzFdKSkge1xuICAgIHZvaWQgcmVzb2x2ZUFwaUtleShvcHRpb25zLCBwYXJ0c1sxXSwgcmVxLCByZXMsIG5leHQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGAuY2F0Y2gobmV4dClgIGZvcndhcmRzIGEgRE9XTlNUUkVBTSBzeW5jaHJvbm91cyB0aHJvdyBmcm9tIGBuZXh0KClgIHRvXG4gIC8vIEV4cHJlc3MncyBlcnJvciBtaWRkbGV3YXJlIOKAlCB2ZXJpZmljYXRpb24gaXRzZWxmIG5ldmVyIHJlamVjdHMgKGl0IG1hcHNcbiAgLy8gZXZlcnkgZmFpbHVyZSB0byBhIHJlc3BvbnNlKS5cbiAgdm9pZCB2ZXJpZnlBbmRBdHRhY2gob3B0aW9ucywgcGFydHNbMV0sIHJlcSwgcmVzLCBuZXh0KS5jYXRjaChuZXh0KTtcbn1cblxuLyoqXG4gKiBFeGNoYW5nZSBhbiBvcGFxdWUga2V5IGZvciBhIEpXVCwgdGhlbiBjb250aW51ZSBvbiB0aGUgbm9ybWFsIHZlcmlmaWNhdGlvblxuICogcGF0aC4gQSByZWZ1c2VkIGtleSBpcyBhIDQwMTsgYW4gdW5yZWFjaGFibGUgcGxhdGZvcm0gaXMgYSA1MDMgKG5ldmVyIGEgcGFzcyDigJRcbiAqIGFuIHVudmVyaWZpYWJsZSBjcmVkZW50aWFsIGlzIG5vdCBhbiBpZGVudGl0eSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBcGlLZXkoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAga2V5OiBzdHJpbmcsXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIC8vIExvYWRlZCBMQVpJTFksIG9uIHRoZSBmaXJzdCBrZXkgZXZlciBwcmVzZW50ZWQuIEEgc3RhdGljIGltcG9ydCB3b3VsZCBwdXRcbiAgLy8gdGhlIEhUVFAgY2xpZW50IChhbmQgcGxhdGZvcm0ncyBhZGRyZXNzKSBpbnRvIHRoZSBpbXBvcnQgZ3JhcGggb2YgZXZlcnlcbiAgLy8gbW9kdWxlIHRoYXQgbWVyZWx5IHVzZXMgYHJlcXVpcmVBdXRoYCwgd2hpY2ggYm90aCB3aWRlbnMgdGhlIGJvb3QgZ3JhcGggYW5kXG4gIC8vIGJyZWFrcyBhbnkgdGVzdCB0aGF0IG1vY2tzIGBodHRwLWNsaWVudC5qc2Agd2l0aCBhIHBhcnRpYWwgbW9kdWxlLlxuICBjb25zdCB7IGV4Y2hhbmdlQXBpS2V5LCBBcGlLZXlFeGNoYW5nZVVuYXZhaWxhYmxlRXJyb3IgfSA9IGF3YWl0IGltcG9ydCgnLi4vc2VydmljZXMvYXBpLWtleS1leGNoYW5nZS5qcycpO1xuICBsZXQgdG9rZW46IHN0cmluZztcbiAgdHJ5IHtcbiAgICB0b2tlbiA9IGF3YWl0IGV4Y2hhbmdlQXBpS2V5KGtleSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICAgJ0FjY2Vzcy1rZXkgdmVyaWZpY2F0aW9uIGlzIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlOyBwbGVhc2UgcmV0cnknLFxuICAgICAgICBFcnJvckNvZGUuU0VSVklDRV9VTkFWQUlMQUJMRSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgb3IgcmV2b2tlZCBhY2Nlc3Mga2V5JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG4gIGF3YWl0IHZlcmlmeUFuZEF0dGFjaChvcHRpb25zLCB0b2tlbiwgcmVxLCByZXMsIG5leHQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlBbmRBdHRhY2goXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmF3VG9rZW46IHN0cmluZyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBUd28gY2hhaW5zLCBvbmUgZW50cnkgcG9pbnQgKHNlZSBgdmVyaWZ5QmVhcmVyVG9rZW5gKTogYSB1c2VyIHRva2VuIG11c3RcbiAgICAvLyBiZSBFUzI1NiBzaWduZWQgYnkgcGxhdGZvcm0gYW5kIHZlcmlmaWVkIGFnYWluc3QgaXRzIHB1Ymxpc2hlZCBKV0tTOyBhblxuICAgIC8vIGludGVybmFsIHNlcnZpY2UgdG9rZW4gbXVzdCBiZSBFUzI1NiBzaWduZWQgYnkgdGhhdCBzZXJ2aWNlJ3MgT1dOIGtleSBhbmRcbiAgICAvLyBkZWNsYXJlIGl0c2VsZiBhIHNlcnZpY2UgcHJpbmNpcGFsLiBCb3RoIHBpbiB0aGUgYWxnb3JpdGhtIChub1xuICAgIC8vIGFsZy1jb25mdXNpb24sIG5vIGBhbGc6bm9uZWApIGFuZCBib3RoIGFwcGx5IHRoZSBvcHRpb25hbCBpc3N1ZXIvYXVkaWVuY2VcbiAgICAvLyBiaW5kaW5nLlxuICAgIGNvbnN0IGRlY29kZWQgPSBhd2FpdCB2ZXJpZnlCZWFyZXJUb2tlbihyYXdUb2tlbik7XG5cbiAgICBpZiAoZGVjb2RlZC50eXBlICE9PSAnYWNjZXNzJykge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnT25seSBhY2Nlc3MgdG9rZW5zIGNhbiBiZSB1c2VkIGZvciBBUEkgcmVxdWVzdHMnLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgaWYgKCFkZWNvZGVkLnN1YiB8fCAhZGVjb2RlZC5yb2xlIHx8ICFoYXNWYWxpZElkZW50aXR5Q2xhaW1zKGRlY29kZWQpKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdUb2tlbiBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcycsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgICB9XG5cbiAgICAvLyBTZXJ2aWNlLXRva2VuIGtpbGwtc3dpdGNoOiByZWplY3QgYSBzZXJ2aWNlIHByaW5jaXBhbCB3aG9zZSBzZXJ2aWNlIGhhc1xuICAgIC8vIGJlZW4gYWRkZWQgdG8gdGhlIGRlbnlsaXN0LiBPdGhlcndpc2UgdGhlIG9ubHkgd2F5IHRvIGludmFsaWRhdGUgYVxuICAgIC8vIHNlcnZpY2UncyB0b2tlbnMgYmVmb3JlIHRoZWlyIChzaG9ydCkgVFRMIGlzIHJvdGF0aW5nIHRoYXQgc2VydmljZSdzXG4gICAgLy8gc2lnbmluZyBrZXk7IHRoaXMgY3V0cyBvbmUgY29tcHJvbWlzZWQvcm9ndWUgc2VydmljZSBvZmYgaW1tZWRpYXRlbHkuIE8oMSkgU2V0IGxvb2t1cCwgemVybyBjb3N0IHdoZW4gdGhlIGRlbnlsaXN0XG4gICAgLy8gaXMgZW1wdHkgKHRoZSBkZWZhdWx0KSwgc28gaXQgbmV2ZXIgdGF4ZXMgdGhlIFMyUyBob3QgcGF0aCB1bmxlc3MgYXJtZWQuXG4gICAgaWYgKGlzU2VydmljZVRva2VuRGVuaWVkKGRlY29kZWQpKSB7XG4gICAgICBlbWl0Q291bnRlcignc2VydmljZV90b2tlbl9kZW5pZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VOYW1lT2YoZGVjb2RlZCkgPz8gJ3Vua25vd24nIH0pO1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlamVjdGVkIGRlbnlsaXN0ZWQgc2VydmljZSB0b2tlbicsIHsgc3ViOiBkZWNvZGVkLnN1YiB9KTtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ1NlcnZpY2UgdG9rZW4gcmV2b2tlZCcsIEVycm9yQ29kZS5UT0tFTl9SRVZPS0VEKTtcbiAgICB9XG5cbiAgICByZXEudXNlciA9IHsgLi4uZGVjb2RlZCB9O1xuXG4gICAgLy8gUkVBRC1PTkxZIElNUEVSU09OQVRJT04uIFRoZSB0b2tlbiBuYW1lcyB0aGUgb3BlcmF0b3IgQU5EIHNheXMgaXQgbWF5IG9ubHlcbiAgICAvLyBsb29rOiBldmVyeSBzZXJ2aWNlIHJlZnVzZXMgYSBzdGF0ZSBjaGFuZ2UgdW5kZXIgaXQsIG5vdCBvbmx5IHBsYXRmb3JtIOKAlFxuICAgIC8vIGEgc3VwcG9ydCBzZXNzaW9uIHRoYXQgY291bGQgd3JpdGUgdG8gcGx1Z2luL2NvbXBsaWFuY2UvYmlsbGluZyBpcyBub3RcbiAgICAvLyByZWFkLW9ubHkuIENoZWNrZWQgYmVmb3JlIGFueSBvdGhlciBnYXRlIHNvIG5vIHJvdXRlIGNhbiBmb3JnZXQgaXQuXG4gICAgaWYgKGlzSW1wZXJzb25hdGlvbldyaXRlQmxvY2tlZChyZXEubWV0aG9kLCBkZWNvZGVkKSkge1xuICAgICAgaWYgKHJlcS5tZXRob2QpIHJlY29yZEF1dGh6RGVuaWFsKHJlcSwgJ2ltcGVyc29uYXRpb24tcmVhZC1vbmx5Jyk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICAnV3JpdGUgcmVxdWVzdHMgYXJlIGRpc2FibGVkIGR1cmluZyByZWFkLW9ubHkgaW1wZXJzb25hdGlvbi4gU3RvcCBpbXBlcnNvbmF0aW5nIHRvIG1ha2UgY2hhbmdlcy4nLFxuICAgICAgICBFcnJvckNvZGUuSU1QRVJTT05BVElPTl9SRUFEX09OTFksXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEJPT1RTVFJBUC1BRE1JTiBFTlJPTE1FTlQgU0VTU0lPTi4gU3VjaCBhIHRva2VuIGV4aXN0cyBzb1xuICAgIC8vIHRoZSBpbnN0YWxsJ3Mgb25seSBhZG1pbiBjYW4gZW5yb2wgYSBmYWN0b3I7IGl0IGlzIGBhYWw6IDFgIGFuZCBtdXN0IG5vdFxuICAgIC8vIHJlYWNoIGFueXRoaW5nIGVsc2UuIFBsYXRmb3JtIOKAlCB3aGljaCBvd25zIHRoZSBleGNlcHRpb24gYW5kIGtub3dzIHdoaWNoXG4gICAgLy8gb2YgaXRzIG93biByb3V0ZXMgYGluaXQtcGxhdGZvcm0uc2hgIGNhbGxzIOKAlCBhbGxvd3MgYW4gZXhwbGljaXQgZmV3IGJlZm9yZVxuICAgIC8vIHRoaXMgcG9pbnQgKHNlZSBpdHMgb3duIGByZXF1aXJlQXV0aGApOyBpbiBFVkVSWSBvdGhlciBzZXJ2aWNlIHRoZSBhbnN3ZXJcbiAgICAvLyBpcyBzaW1wbHkgbm8sIHNvIHRoZSByZWFjaCByZXN0cmljdGlvbiBob2xkcyB3aXRob3V0IGEgcGVyLXNlcnZpY2VcbiAgICAvLyBhbGxvd2xpc3QgdG8ga2VlcCBpbiBzeW5jLlxuICAgIGlmIChkZWNvZGVkLm1mYUVucm9sbG1lbnRQZW5kaW5nID09PSB0cnVlKSB7XG4gICAgICBlbWl0Q291bnRlcignbWZhX2VuZm9yY2VtZW50X3JlZnVzZWRfdG90YWwnLCB7IHNlcnZpY2U6IHNlcnZpY2VJZGVudGl0eSgpLCByZWFzb246ICdib290c3RyYXBfc2Vzc2lvbicgfSk7XG4gICAgICByZWNvcmRBdXRoekRlbmlhbChyZXEsICdtZmEtZW5yb2xtZW50Jyk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKFxuICAgICAgICByZXMsIEh0dHBTdGF0dXMuRk9SQklEREVOLFxuICAgICAgICAnRmluaXNoIHNldHRpbmcgdXAgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbiBiZWZvcmUgdXNpbmcgdGhlIHJlc3Qgb2YgUGlwZWxpbmUgQnVpbGRlcicsXG4gICAgICAgIEVycm9yQ29kZS5NRkFfRU5ST0xMTUVOVF9SRVFVSVJFRCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU2Vzc2lvbi1sZXZlbCBhc3N1cmFuY2UgKGByZXF1aXJlQXV0aCh7IG1pbkFzc3VyYW5jZSwgbWF4QWdlIH0pYCkuXG4gICAgaWYgKG9wdGlvbnMubWluQXNzdXJhbmNlXG4gICAgICAmJiByZWZ1c2VGb3JBc3N1cmFuY2UoeyBtaW5Bc3N1cmFuY2U6IG9wdGlvbnMubWluQXNzdXJhbmNlLCAuLi4ob3B0aW9ucy5tYXhBZ2UgIT09IHVuZGVmaW5lZCA/IHsgbWF4QWdlOiBvcHRpb25zLm1heEFnZSB9IDoge30pIH0sIGRlY29kZWQsIHJlcSwgcmVzKSkgcmV0dXJuO1xuXG4gICAgLy8gVGhlIHgtb3JnLWlkL3gtb3JnLW5hbWUgb3ZlcnJpZGUgbGV0cyBhIFNZUy1BRE1JTiBhY3Qgb24gYSBjaG9zZW4gb3JnXG4gICAgLy8gKGNyb3NzLW9yZyBhZG1pbiB0b29saW5nKS4gSXQgaXMgZ2F0ZWQgb24gdGhlIHZlcmlmaWVkIGBpc1N1cGVyQWRtaW5gIGNsYWltXG4gICAgLy8gaGVyZSBzbyB0aGF0IGV2ZW4gYSByb3V0ZSB3aGljaCBtaXN0YWtlbmx5IGVuYWJsZXMgYGFsbG93T3JnSGVhZGVyT3ZlcnJpZGVgXG4gICAgLy8gY2FuIE5FVkVSIGxldCBhbiBvcmRpbmFyeSBhdXRoZW50aWNhdGVkIHVzZXIgc3Bvb2YgYW5vdGhlciB0ZW5hbnQncyBvcmcgdmlhXG4gICAgLy8gdGhlIGhlYWRlciDigJQgZGVmZW5jZS1pbi1kZXB0aCBhZ2FpbnN0IHRoZSBjcm9zcy10ZW5hbnQgYnJlYWsgdGhpcyBjYXVzZWQuXG4gICAgaWYgKG9wdGlvbnMuYWxsb3dPcmdIZWFkZXJPdmVycmlkZSAmJiBkZWNvZGVkLmlzU3VwZXJBZG1pbiA9PT0gdHJ1ZSkge1xuICAgICAgY29uc3QgaGVhZGVyT3JnSWQgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLWlkJ10pO1xuICAgICAgY29uc3QgaGVhZGVyT3JnTmFtZSA9IGdldEhlYWRlclN0cmluZyhyZXEuaGVhZGVyc1sneC1vcmctbmFtZSddKTtcbiAgICAgIGlmIChoZWFkZXJPcmdJZCkgcmVxLnVzZXIub3JnYW5pemF0aW9uSWQgPSBoZWFkZXJPcmdJZDtcbiAgICAgIGlmIChoZWFkZXJPcmdOYW1lKSByZXEudXNlci5vcmdhbml6YXRpb25OYW1lID0gaGVhZGVyT3JnTmFtZTtcbiAgICB9XG5cbiAgICAvLyBSZS1kZXJpdmUgdGhlIHJlcXVlc3QncyB0ZW5hbnQgaWRlbnRpdHkgZnJvbSB0aGUgTk9XLXZlcmlmaWVkIEpXVC5cbiAgICAvL1xuICAgIC8vIGBhdHRhY2hSZXF1ZXN0Q29udGV4dGAgcnVucyBhcyBhIGdsb2JhbCBtaWRkbGV3YXJlIEJFRk9SRSB0aGlzIHBlci1yb3V0ZVxuICAgIC8vIGByZXF1aXJlQXV0aGAsIHNvIGl0IGNhcHR1cmVkIGByZXEuY29udGV4dC5pZGVudGl0eWAgd2hpbGUgYHJlcS51c2VyYCB3YXNcbiAgICAvLyBzdGlsbCB1bmRlZmluZWQg4oCUIGF0IHdoaWNoIHBvaW50IGBnZXRJZGVudGl0eWAgZmFsbHMgYmFjayB0byB0aGUgcmF3LFxuICAgIC8vIGNsaWVudC1zZXR0YWJsZSBgeC1vcmctaWRgL2B4LXVzZXItaWRgIGhlYWRlcnMuIEV2ZXJ5IGRvd25zdHJlYW0gdGVuYW50LVxuICAgIC8vIGF1dGhvcml0eSBjb25zdW1lciAocmVxdWlyZU9yZ0lkLCB3aXRoVGVuYW50Q29udGV4dCdzIFJMUyBzY29wZSwgY2hlY2tRdW90YSxcbiAgICAvLyB3aXRoUm91dGUsIGFuZCB0aGUgaWRlbXBvdGVuY3kgbmFtZXNwYWNlKSByZWFkcyBgcmVxLmNvbnRleHQuaWRlbnRpdHlgLCBzb1xuICAgIC8vIHRoYXQgZnJvemVuIGhlYWRlci1kZXJpdmVkIHZhbHVlIOKAlCBub3QgdGhlIEpXVCDigJQgd2FzIGdvdmVybmluZyB0ZW5hbmN5IG9uXG4gICAgLy8gYW55IG5vbi1uZ2lueCBwYXRoLiBSZWNvbXB1dGluZyBoZXJlLCBhdCB0aGUgc2luZ2xlIHBvc3QtdmVyaWZpY2F0aW9uIGNob2tlXG4gICAgLy8gcG9pbnQsIG1ha2VzIGBnZXRJZGVudGl0eWAgcHJlZmVyIHRoZSB2ZXJpZmllZCBgcmVxLnVzZXJgIChzZWUgaWRlbnRpdHkudHMpXG4gICAgLy8gc28gdGVuYW5jeSBpcyBKV1QtYXV0aG9yaXRhdGl2ZS4gVGhlIG5naW54IGB4LW9yZy1pZGAgb3ZlcndyaXRlIHN0YXlzIGFzXG4gICAgLy8gZGVmZW5jZS1pbi1kZXB0aC4gR3VhcmRlZCBvbiBgcmVxLmNvbnRleHRgIHNvIHNlcnZpY2VzL3BhdGhzIHRoYXQgbmV2ZXJcbiAgICAvLyBhdHRhY2ggYSBjb250ZXh0IChvciBydW4gcmVxdWlyZUF1dGggcHJlLWNvbnRleHQpIGFyZSB1bmFmZmVjdGVkLlxuICAgIGNvbnN0IHJlcUN0eCA9IChyZXEgYXMgUmVxdWVzdCAmIHsgY29udGV4dD86IHsgaWRlbnRpdHk6IFJlcXVlc3RJZGVudGl0eSB9IH0pLmNvbnRleHQ7XG4gICAgaWYgKHJlcUN0eCkge1xuICAgICAgcmVxQ3R4LmlkZW50aXR5ID0gZ2V0SWRlbnRpdHkocmVxIGFzIHVua25vd24gYXMgSHR0cFJlcXVlc3QpO1xuICAgIH1cblxuICAgIC8vIFNlc3Npb24gaW52YWxpZGF0aW9uICh0b2tlbi12ZXJzaW9uIHN0b3JlICsgaW1wZXJzb25hdGlvbi1zZXNzaW9uXG4gICAgLy8gbGl2ZW5lc3MpLiBObyBzdG9yZSByZWdpc3RlcmVkIOKHkiBvbmx5IGltcGVyc29uYXRpb24gc2Vzc2lvbnMgYXJlIGNoZWNrZWQuXG4gICAgaWYgKG5lZWRzUmV2b2NhdGlvbkNoZWNrKGRlY29kZWQpKSB7XG4gICAgICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAgICAgLy8gRXhwcmVzcydzIGVycm9yIG1pZGRsZXdhcmUg4oCUIHRoaXMgYG5leHQoKWAgcnVucyBpbiBhIG1pY3JvdGFzaywgb3V0c2lkZVxuICAgICAgLy8gdGhlIHN1cnJvdW5kaW5nIHRyeS9jYXRjaC4gVGhlIGNoZWNrIGl0c2VsZiBuZXZlciByZWplY3RzLlxuICAgICAgY2hlY2tSZXZvY2F0aW9uKGRlY29kZWQpLnRoZW4oKHJlZnVzYWwpID0+IHtcbiAgICAgICAgaWYgKHJlZnVzYWwpIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgcmVmdXNhbCwgRXJyb3JDb2RlLlRPS0VOX1JFVk9LRUQpO1xuICAgICAgICBuZXh0KCk7XG4gICAgICB9KS5jYXRjaChuZXh0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBuZXh0KCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2Ygand0LlRva2VuRXhwaXJlZEVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdUb2tlbiBoYXMgZXhwaXJlZCcsIEVycm9yQ29kZS5UT0tFTl9FWFBJUkVEKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2lnbmluZyBrZXlzIGNvdWxkbid0IGJlIGZldGNoZWQsIHNvIHRoZSB0b2tlbidzIHZhbGlkaXR5IGlzIFVOS05PV04uXG4gICAgLy8gRmFpbCBDTE9TRUQgd2l0aCBhIHJldHJ5YWJsZSA1MDMg4oCUIG5ldmVyIGEgcGFzcywgYW5kIG5ldmVyIGEgNDAxIHRoYXRcbiAgICAvLyB3b3VsZCBzZW5kIGEgbGVnaXRpbWF0ZSBjbGllbnQgb2ZmIHRvIHJlLWF1dGhlbnRpY2F0ZSBvdmVyIG91ciBvdXRhZ2UuXG4gICAgLy8gU2FtZSByZWFzb25pbmcgZm9yIHRoZSBTRVJWSUNFIGNoYWluOiBubyByZWFkYWJsZSBrZXkgYnVuZGxlIG1lYW5zIG5vIHdheVxuICAgIC8vIHRvIHRlbGwgYSBwZWVyJ3MgdG9rZW4gZnJvbSBhIGZvcmdlcnksIHNvIHRoZSByZXF1ZXN0IGlzIHJlZnVzZWQgd2l0aCBhXG4gICAgLy8gcmV0cnlhYmxlIDUwMyByYXRoZXIgdGhhbiBhZG1pdHRlZCBvciBib3VuY2VkIHRvIHJlLWF1dGhlbnRpY2F0ZS5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBKd2tzVW5hdmFpbGFibGVFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIFNlcnZpY2VLZXlFcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlamVjdGluZyByZXF1ZXN0OiB0b2tlbiBzaWduaW5nIGtleXMgdW5hdmFpbGFibGUnLCB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICAgICdUb2tlbiB2ZXJpZmljYXRpb24gaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGU7IHBsZWFzZSByZXRyeScsXG4gICAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbmtub3duS2lkRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBqd3QuSnNvbldlYlRva2VuRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgdG9rZW4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gZmFpbGVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gIH1cbn1cblxuIl19
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL2F1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQVF0QyxPQUFPLEdBQUcsTUFBTSxjQUFjLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSwyQkFBMkIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JHLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9FLE9BQU8sRUFBdUIsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUF3QixNQUFNLHNCQUFzQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZ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LENBQUM7SUFDbEcsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBgcmVxdWlyZUF1dGhgOiBiZWFyZXIgLyBhY2Nlc3Mta2V5IGF1dGhlbnRpY2F0aW9uLCB0aGUgY2hlY2tzIGV2ZXJ5XG4gKiB2ZXJpZmllZCByZXF1ZXN0IHBhc3NlcywgYW5kIHRoZSB0ZW5hbnQgaWRlbnRpdHkgaXQgYXR0YWNoZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0LCBSZXNwb25zZSwgTmV4dEZ1bmN0aW9uIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgand0IGZyb20gJ2pzb253ZWJ0b2tlbic7XG5pbXBvcnQgeyByZWZ1c2VGb3JBc3N1cmFuY2UgfSBmcm9tICcuL2Fzc3VyYW5jZS5qcyc7XG5pbXBvcnQgeyBydW5EZWZlcnJlZFF1b3RhQ2hlY2sgfSBmcm9tICcuL2RlZmVycmVkLXF1b3RhLWNoZWNrLmpzJztcbmltcG9ydCB7IGhhc1ZhbGlkSWRlbnRpdHlDbGFpbXMsIHZlcmlmeUJlYXJlclRva2VuIH0gZnJvbSAnLi9qd3QtdmVyaWZ5LmpzJztcbmltcG9ydCB7IHJlY29yZEF1dGh6RGVuaWFsIH0gZnJvbSAnLi9wZXJtaXNzaW9uLWdhdGVzLmpzJztcbmltcG9ydCB7IGNoZWNrUmV2b2NhdGlvbiwgaXNJbXBlcnNvbmF0aW9uV3JpdGVCbG9ja2VkLCBuZWVkc1Jldm9jYXRpb25DaGVjayB9IGZyb20gJy4vcmV2b2NhdGlvbi5qcyc7XG5pbXBvcnQgeyB0YWdSb3V0ZUdhdGUgfSBmcm9tICcuL3JvdXRlLXRhYmxlLmpzJztcbmltcG9ydCB7IGlzU2VydmljZVRva2VuRGVuaWVkLCBzZXJ2aWNlTmFtZU9mIH0gZnJvbSAnLi9zZXJ2aWNlLXRva2Vucy5qcyc7XG5pbXBvcnQgeyBIdHRwU3RhdHVzIH0gZnJvbSAnLi4vY29uc3RhbnRzL2h0dHAtc3RhdHVzLmpzJztcbmltcG9ydCB7IEp3a3NVbmF2YWlsYWJsZUVycm9yLCBVbmtub3duS2lkRXJyb3IgfSBmcm9tICcuLi9zZXJ2aWNlcy9qd2tzLWNhY2hlLmpzJztcbmltcG9ydCB7IFNlcnZpY2VLZXlFcnJvciwgc2VydmljZUlkZW50aXR5IH0gZnJvbSAnLi4vc2VydmljZXMvc2VydmljZS1rZXlzLmpzJztcbmltcG9ydCB7IHR5cGUgQXNzdXJhbmNlTGV2ZWwgfSBmcm9tICcuLi90eXBlcy9jb21tb24uanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlIH0gZnJvbSAnLi4vdHlwZXMvZXJyb3ItY29kZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBIdHRwUmVxdWVzdCB9IGZyb20gJy4uL3R5cGVzL2h0dHAuanMnO1xuaW1wb3J0IHsgaXNPcGFxdWVBcGlLZXkgfSBmcm9tICcuLi91dGlscy9hcGkta2V5LmpzJztcbmltcG9ydCB7IGdldEhlYWRlclN0cmluZyB9IGZyb20gJy4uL3V0aWxzL2hlYWRlcnMuanMnO1xuaW1wb3J0IHsgZ2V0SWRlbnRpdHksIHR5cGUgUmVxdWVzdElkZW50aXR5IH0gZnJvbSAnLi4vdXRpbHMvaWRlbnRpdHkuanMnO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVtaXRDb3VudGVyIH0gZnJvbSAnLi4vdXRpbHMvbWV0cmljLWVtaXR0ZXIuanMnO1xuaW1wb3J0IHsgc2VuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvcmVzcG9uc2UuanMnO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIoJ2F1dGgtbWlkZGxld2FyZScpO1xuZXhwb3J0IGludGVyZmFjZSBSZXF1aXJlQXV0aE9wdGlvbnMge1xuICAvKipcbiAgICogQWxsb3cgeC1vcmctaWQveC1vcmctbmFtZSBoZWFkZXJzIHRvIG92ZXJyaWRlIHRoZSBKV1QncyBvcmdhbml6YXRpb24gZmllbGRzLlxuICAgKlxuICAgKiBXaGVuIGVuYWJsZWQsIHRoZSBgeC1vcmctaWRgL2B4LW9yZy1uYW1lYCBoZWFkZXJzIG92ZXJyaWRlIHRoZSBjYWxsZXIncyBvcmdcbiAgICog4oCUIGJ1dCBPTkxZIGZvciBhIHZlcmlmaWVkIFNZUy1BRE1JTiAoYGlzU3VwZXJBZG1pbmAgY2xhaW0pLiBGb3IgYW55IG9yZGluYXJ5XG4gICAqIGF1dGhlbnRpY2F0ZWQgdXNlciB0aGUgaGVhZGVycyBhcmUgaWdub3JlZCwgc28gZW5hYmxpbmcgdGhpcyBjYW4gbmV2ZXIgbGV0IGFcbiAgICogbm9ybWFsIHVzZXIgaW1wZXJzb25hdGUgYW5vdGhlciB0ZW5hbnQncyBvcmcuIFVzZSBmb3IgY3Jvc3Mtb3JnIGFkbWluIHRvb2xpbmdcbiAgICogKGUuZy4gYSBzeXNhZG1pbiBtYW5hZ2luZyBhIGdpdmVuIG9yZydzIGJpbGxpbmcpLiBJZiB1bnN1cmUsIGxlYXZlIGl0IGRpc2FibGVkLlxuICAgKi9cbiAgYWxsb3dPcmdIZWFkZXJPdmVycmlkZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEZW1hbmQgdGhhdCB0aGUgd2hvbGUgU0VTU0lPTiBiZSBhdCBsZWFzdCB0aGlzIGFzc3VyYW5jZSBsZXZlbC5cbiAgICpcbiAgICogYG1pbkFzc3VyYW5jZTogMmAgbWVhbnMgdGhlIHBlcnNvbiBhdXRoZW50aWNhdGVkIHdpdGggYSBzZWNvbmQgZmFjdG9yIOKAlCBhXG4gICAqIHBhc3NrZXkgd2l0aCB1c2VyIHZlcmlmaWNhdGlvbiwgYSBwYXNzd29yZCBwbHVzIGFuIGF1dGhlbnRpY2F0b3IgY29kZSwgb3JcbiAgICogU1NPIHRocm91Z2ggYW4gSWRQIHRoZSBvcmcgbWFya2VkIGFzIGVuZm9yY2luZyBNRkEuIEEgd2Vha2VyIHRva2VuIGdldHNcbiAgICogKio0MDEgYE1GQV9SRVFVSVJFRGAqKiwgd2hpY2ggdGhlIGNsaWVudCBhbnN3ZXJzIGJ5IHNlbmRpbmcgdGhlIHBlcnNvbiB0b1xuICAgKiBlbnJvbG1lbnQgb3IgdG8gYSBzdHJvbmdlciBzaWduLWluOyByZWZyZXNoaW5nIGNhbm5vdCBoZWxwLCBiZWNhdXNlIGBhYWxgXG4gICAqIGxpdmVzIG9uIHRoZSBzZXNzaW9uIHNsb3QgYW5kIGEgcmVmcmVzaCBuZXZlciByYWlzZXMgaXQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIFNFU1NJT04tbGV2ZWwgY291bnRlcnBhcnQgdG8ge0BsaW5rIHJlcXVpcmVTdGVwVXB9LCB3aGljaCBzdGF5c1xuICAgKiBhIGZyZXNoLCBwZXItYWN0aW9uIGNvbmZpcm1hdGlvbi4gVXNlIGJvdGggb24gdGhlIG1vc3QgZGFuZ2Vyb3VzIHJvdXRlcy5cbiAgICpcbiAgICogTUFDSElORVMgTkVWRVIgU0FUSVNGWSBJVC4gQSBzZXJ2aWNlIHByaW5jaXBhbCwgYW4gb3JnIHNlcnZpY2UgYWNjb3VudCBhbmRcbiAgICogYW4gZXhjaGFuZ2VkIGFjY2VzcyBrZXkgYWxsIGdldCAqKjQwMyBgSFVNQU5fU0VTU0lPTl9SRVFVSVJFRGAqKiDigJQgdGhlcmUgaXNcbiAgICogbm8gcGVyc29uIGJlaGluZCB0aGVtIHRvIGhhdmUgcHJlc2VudGVkIGEgZmFjdG9yLCBzbyBcImFzc3VyYW5jZVwiIGlzIG5vdCBhXG4gICAqIHF1ZXN0aW9uIHRoZWlyIGNyZWRlbnRpYWwgY2FuIGFuc3dlci4gVGhhdCBpcyBkZWxpYmVyYXRlbHkgbm90IGEgc2lsZW50XG4gICAqIHBhc3MtdGhyb3VnaCBmb3IgaW50ZXJuYWwgc2VydmljZXM6IGEgcm91dGUgdGhhdCBkZW1hbmRzIE1GQSBpcyBhIHJvdXRlIGFcbiAgICogaHVtYW4gaXMgZG9pbmcgc29tZXRoaW5nIGRhbmdlcm91cyBvbi5cbiAgICovXG4gIG1pbkFzc3VyYW5jZT86IEFzc3VyYW5jZUxldmVsO1xuICAvKipcbiAgICogV2l0aCB7QGxpbmsgbWluQXNzdXJhbmNlfSwgYWRkaXRpb25hbGx5IGJvdW5kIGhvdyBsb25nIGFnbyB0aGF0IHNpZ24taW5cbiAgICogaGFwcGVuZWQgKHNlY29uZHMsIGNvbXBhcmVkIGFnYWluc3QgdGhlIHRva2VuJ3MgYGF1dGhfdGltZWApLiBBIHNlc3Npb24gdGhhdFxuICAgKiBpcyBNRkEtZ3JhZGUgYnV0IG9sZGVyIHRoYW4gdGhpcyBnZXRzICoqNDAxIGBSRUFVVEhfUkVRVUlSRURgKiouIElnbm9yZWRcbiAgICogd2l0aG91dCBgbWluQXNzdXJhbmNlYCDigJQgXCJob3cgcmVjZW50XCIgaXMgb25seSBtZWFuaW5nZnVsIG9uY2UgXCJob3cgc3Ryb25nXCJcbiAgICogaXMgYmVpbmcgYXNrZWQuXG4gICAqL1xuICBtYXhBZ2U/OiBudW1iZXI7XG59XG5cbi8qKiBKV1QgYXV0aCBtaWRkbGV3YXJlLiBVc2UgZGlyZWN0bHkgb3IgY2FsbCB3aXRoIG9wdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWlyZUF1dGgoXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgb3B0aW9ucz86IFJlcXVpcmVBdXRoT3B0aW9ucyxcbik6IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiByZXF1aXJlQXV0aChcbiAgcmVxT3JPcHRpb25zPzogUmVxdWVzdCB8IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVzPzogUmVzcG9uc2UsXG4gIG5leHQ/OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHwgKChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbikgPT4gdm9pZCkge1xuICBpZiAocmVxT3JPcHRpb25zICYmIHJlcyAmJiBuZXh0ICYmICdoZWFkZXJzJyBpbiByZXFPck9wdGlvbnMpIHtcbiAgICByZXR1cm4gX3JlcXVpcmVBdXRoKHt9LCByZXFPck9wdGlvbnMgYXMgUmVxdWVzdCwgcmVzLCBuZXh0KTtcbiAgfVxuXG4gIGNvbnN0IG9wdGlvbnMgPSAocmVxT3JPcHRpb25zIGFzIFJlcXVpcmVBdXRoT3B0aW9ucykgfHwge307XG4gIGNvbnN0IGdhdGUgPSB0YWdSb3V0ZUdhdGUoKHJlcTogUmVxdWVzdCwgcmVzSW5uZXI6IFJlc3BvbnNlLCBuZXh0SW5uZXI6IE5leHRGdW5jdGlvbikgPT4ge1xuICAgIF9yZXF1aXJlQXV0aChvcHRpb25zLCByZXEsIHJlc0lubmVyLCBuZXh0SW5uZXIpO1xuICB9LCB7IGtpbmQ6ICdhdXRoJyB9KTtcbiAgaWYgKG9wdGlvbnMubWluQXNzdXJhbmNlKSB7XG4gICAgdGFnUm91dGVHYXRlKGdhdGUsIHsga2luZDogJ2Fzc3VyYW5jZScsIG1pbkFzc3VyYW5jZTogb3B0aW9ucy5taW5Bc3N1cmFuY2UsIC4uLihvcHRpb25zLm1heEFnZSAhPT0gdW5kZWZpbmVkID8geyBtYXhBZ2U6IG9wdGlvbnMubWF4QWdlIH0gOiB7fSkgfSk7XG4gIH1cbiAgcmV0dXJuIGdhdGU7XG59XG50YWdSb3V0ZUdhdGUocmVxdWlyZUF1dGgsIHsga2luZDogJ2F1dGgnIH0pO1xuXG5mdW5jdGlvbiBfcmVxdWlyZUF1dGgoXG4gIG9wdGlvbnM6IFJlcXVpcmVBdXRoT3B0aW9ucyxcbiAgcmVxOiBSZXF1ZXN0LFxuICByZXM6IFJlc3BvbnNlLFxuICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4pOiB2b2lkIHtcbiAgY29uc3QgYXV0aEhlYWRlciA9IHJlcS5oZWFkZXJzLmF1dGhvcml6YXRpb247XG5cbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aG9yaXphdGlvbiBoZWFkZXIgcmVxdWlyZWQnLCBFcnJvckNvZGUuVE9LRU5fTUlTU0lORyk7XG4gIH1cblxuICBjb25zdCBwYXJ0cyA9IGF1dGhIZWFkZXIuc3BsaXQoJyAnKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMiB8fCBwYXJ0c1swXSAhPT0gJ0JlYXJlcicpIHtcbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIGF1dGhvcml6YXRpb24gZm9ybWF0LiBVc2U6IEJlYXJlciA8dG9rZW4+JywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICB9XG5cbiAgLy8gQW4gT1BBUVVFIEFDQ0VTUyBLRVkgKGBwYl9wYXRf4oCmYCAvIGBwYl9zYV/igKZgKSBjYXJyaWVzIG5vIGNsYWltcyBhbmQgbm9cbiAgLy8gc2lnbmF0dXJlLCBzbyBpdCBjYW5ub3QgYmUgdmVyaWZpZWQgaGVyZS4gVHJhZGUgaXQgYXQgcGxhdGZvcm0gZm9yIGFcbiAgLy8gc2hvcnQtbGl2ZWQgSldUIChjYWNoZWQgaW4tcHJvY2VzcyB1bnRpbCBpdCBleHBpcmVzKSBhbmQgdGhlbiB2ZXJpZnkgdGhhdFxuICAvLyBKV1Qgb24gdGhlIG5vcm1hbCBwYXRoIOKAlCBzZXJ2aWNlcyBuZXZlciByZWFkIGEga2V5IGhhc2guIFNlZVxuICAvLyBgc2VydmljZXMvYXBpLWtleS1leGNoYW5nZS50c2AuXG4gIGlmIChpc09wYXF1ZUFwaUtleShwYXJ0c1sxXSkpIHtcbiAgICB2b2lkIHJlc29sdmVBcGlLZXkob3B0aW9ucywgcGFydHNbMV0sIHJlcSwgcmVzLCBuZXh0KTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBgLmNhdGNoKG5leHQpYCBmb3J3YXJkcyBhIERPV05TVFJFQU0gc3luY2hyb25vdXMgdGhyb3cgZnJvbSBgbmV4dCgpYCB0b1xuICAvLyBFeHByZXNzJ3MgZXJyb3IgbWlkZGxld2FyZSDigJQgdmVyaWZpY2F0aW9uIGl0c2VsZiBuZXZlciByZWplY3RzIChpdCBtYXBzXG4gIC8vIGV2ZXJ5IGZhaWx1cmUgdG8gYSByZXNwb25zZSkuXG4gIHZvaWQgdmVyaWZ5QW5kQXR0YWNoKG9wdGlvbnMsIHBhcnRzWzFdLCByZXEsIHJlcywgbmV4dCkuY2F0Y2gobmV4dCk7XG59XG5cbi8qKlxuICogRXhjaGFuZ2UgYW4gb3BhcXVlIGtleSBmb3IgYSBKV1QsIHRoZW4gY29udGludWUgb24gdGhlIG5vcm1hbCB2ZXJpZmljYXRpb25cbiAqIHBhdGguIEEgcmVmdXNlZCBrZXkgaXMgYSA0MDE7IGFuIHVucmVhY2hhYmxlIHBsYXRmb3JtIGlzIGEgNTAzIChuZXZlciBhIHBhc3Mg4oCUXG4gKiBhbiB1bnZlcmlmaWFibGUgY3JlZGVudGlhbCBpcyBub3QgYW4gaWRlbnRpdHkpLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXBpS2V5KFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIGtleTogc3RyaW5nLFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG5leHQ6IE5leHRGdW5jdGlvbixcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMb2FkZWQgTEFaSUxZLCBvbiB0aGUgZmlyc3Qga2V5IGV2ZXIgcHJlc2VudGVkLiBBIHN0YXRpYyBpbXBvcnQgd291bGQgcHV0XG4gIC8vIHRoZSBIVFRQIGNsaWVudCAoYW5kIHBsYXRmb3JtJ3MgYWRkcmVzcykgaW50byB0aGUgaW1wb3J0IGdyYXBoIG9mIGV2ZXJ5XG4gIC8vIG1vZHVsZSB0aGF0IG1lcmVseSB1c2VzIGByZXF1aXJlQXV0aGAsIHdoaWNoIGJvdGggd2lkZW5zIHRoZSBib290IGdyYXBoIGFuZFxuICAvLyBicmVha3MgYW55IHRlc3QgdGhhdCBtb2NrcyBgaHR0cC1jbGllbnQuanNgIHdpdGggYSBwYXJ0aWFsIG1vZHVsZS5cbiAgY29uc3QgeyBleGNoYW5nZUFwaUtleSwgQXBpS2V5RXhjaGFuZ2VVbmF2YWlsYWJsZUVycm9yIH0gPSBhd2FpdCBpbXBvcnQoJy4uL3NlcnZpY2VzL2FwaS1rZXktZXhjaGFuZ2UuanMnKTtcbiAgbGV0IHRva2VuOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgdG9rZW4gPSBhd2FpdCBleGNoYW5nZUFwaUtleShrZXkpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEFwaUtleUV4Y2hhbmdlVW5hdmFpbGFibGVFcnJvcikge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICAgICdBY2Nlc3Mta2V5IHZlcmlmaWNhdGlvbiBpcyB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZTsgcGxlYXNlIHJldHJ5JyxcbiAgICAgICAgRXJyb3JDb2RlLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdJbnZhbGlkIG9yIHJldm9rZWQgYWNjZXNzIGtleScsIEVycm9yQ29kZS5UT0tFTl9JTlZBTElEKTtcbiAgfVxuICBhd2FpdCB2ZXJpZnlBbmRBdHRhY2gob3B0aW9ucywgdG9rZW4sIHJlcSwgcmVzLCBuZXh0KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5QW5kQXR0YWNoKFxuICBvcHRpb25zOiBSZXF1aXJlQXV0aE9wdGlvbnMsXG4gIHJhd1Rva2VuOiBzdHJpbmcsXG4gIHJlcTogUmVxdWVzdCxcbiAgcmVzOiBSZXNwb25zZSxcbiAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgLy8gVHdvIGNoYWlucywgb25lIGVudHJ5IHBvaW50IChzZWUgYHZlcmlmeUJlYXJlclRva2VuYCk6IGEgdXNlciB0b2tlbiBtdXN0XG4gICAgLy8gYmUgRVMyNTYgc2lnbmVkIGJ5IHBsYXRmb3JtIGFuZCB2ZXJpZmllZCBhZ2FpbnN0IGl0cyBwdWJsaXNoZWQgSldLUzsgYW5cbiAgICAvLyBpbnRlcm5hbCBzZXJ2aWNlIHRva2VuIG11c3QgYmUgRVMyNTYgc2lnbmVkIGJ5IHRoYXQgc2VydmljZSdzIE9XTiBrZXkgYW5kXG4gICAgLy8gZGVjbGFyZSBpdHNlbGYgYSBzZXJ2aWNlIHByaW5jaXBhbC4gQm90aCBwaW4gdGhlIGFsZ29yaXRobSAobm9cbiAgICAvLyBhbGctY29uZnVzaW9uLCBubyBgYWxnOm5vbmVgKSBhbmQgYm90aCBhcHBseSB0aGUgb3B0aW9uYWwgaXNzdWVyL2F1ZGllbmNlXG4gICAgLy8gYmluZGluZy5cbiAgICBjb25zdCBkZWNvZGVkID0gYXdhaXQgdmVyaWZ5QmVhcmVyVG9rZW4ocmF3VG9rZW4pO1xuXG4gICAgaWYgKGRlY29kZWQudHlwZSAhPT0gJ2FjY2VzcycpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ09ubHkgYWNjZXNzIHRva2VucyBjYW4gYmUgdXNlZCBmb3IgQVBJIHJlcXVlc3RzJywgRXJyb3JDb2RlLlRPS0VOX0lOVkFMSUQpO1xuICAgIH1cblxuICAgIGlmICghZGVjb2RlZC5zdWIgfHwgIWRlY29kZWQucm9sZSB8fCAhaGFzVmFsaWRJZGVudGl0eUNsYWltcyhkZWNvZGVkKSkge1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnVG9rZW4gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgLy8gU2VydmljZS10b2tlbiBraWxsLXN3aXRjaDogcmVqZWN0IGEgc2VydmljZSBwcmluY2lwYWwgd2hvc2Ugc2VydmljZSBoYXNcbiAgICAvLyBiZWVuIGFkZGVkIHRvIHRoZSBkZW55bGlzdC4gT3RoZXJ3aXNlIHRoZSBvbmx5IHdheSB0byBpbnZhbGlkYXRlIGFcbiAgICAvLyBzZXJ2aWNlJ3MgdG9rZW5zIGJlZm9yZSB0aGVpciAoc2hvcnQpIFRUTCBpcyByb3RhdGluZyB0aGF0IHNlcnZpY2Unc1xuICAgIC8vIHNpZ25pbmcga2V5OyB0aGlzIGN1dHMgb25lIGNvbXByb21pc2VkL3JvZ3VlIHNlcnZpY2Ugb2ZmIGltbWVkaWF0ZWx5LiBPKDEpIFNldCBsb29rdXAsIHplcm8gY29zdCB3aGVuIHRoZSBkZW55bGlzdFxuICAgIC8vIGlzIGVtcHR5ICh0aGUgZGVmYXVsdCksIHNvIGl0IG5ldmVyIHRheGVzIHRoZSBTMlMgaG90IHBhdGggdW5sZXNzIGFybWVkLlxuICAgIGlmIChpc1NlcnZpY2VUb2tlbkRlbmllZChkZWNvZGVkKSkge1xuICAgICAgZW1pdENvdW50ZXIoJ3NlcnZpY2VfdG9rZW5fZGVuaWVkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlTmFtZU9mKGRlY29kZWQpID8/ICd1bmtub3duJyB9KTtcbiAgICAgIGxvZ2dlci53YXJuKCdSZWplY3RlZCBkZW55bGlzdGVkIHNlcnZpY2UgdG9rZW4nLCB7IHN1YjogZGVjb2RlZC5zdWIgfSk7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdTZXJ2aWNlIHRva2VuIHJldm9rZWQnLCBFcnJvckNvZGUuVE9LRU5fUkVWT0tFRCk7XG4gICAgfVxuXG4gICAgcmVxLnVzZXIgPSB7IC4uLmRlY29kZWQgfTtcblxuICAgIC8vIFJFQUQtT05MWSBJTVBFUlNPTkFUSU9OLiBUaGUgdG9rZW4gbmFtZXMgdGhlIG9wZXJhdG9yIEFORCBzYXlzIGl0IG1heSBvbmx5XG4gICAgLy8gbG9vazogZXZlcnkgc2VydmljZSByZWZ1c2VzIGEgc3RhdGUgY2hhbmdlIHVuZGVyIGl0LCBub3Qgb25seSBwbGF0Zm9ybSDigJRcbiAgICAvLyBhIHN1cHBvcnQgc2Vzc2lvbiB0aGF0IGNvdWxkIHdyaXRlIHRvIHBsdWdpbi9jb21wbGlhbmNlL2JpbGxpbmcgaXMgbm90XG4gICAgLy8gcmVhZC1vbmx5LiBDaGVja2VkIGJlZm9yZSBhbnkgb3RoZXIgZ2F0ZSBzbyBubyByb3V0ZSBjYW4gZm9yZ2V0IGl0LlxuICAgIGlmIChpc0ltcGVyc29uYXRpb25Xcml0ZUJsb2NrZWQocmVxLm1ldGhvZCwgZGVjb2RlZCkpIHtcbiAgICAgIGlmIChyZXEubWV0aG9kKSByZWNvcmRBdXRoekRlbmlhbChyZXEsICdpbXBlcnNvbmF0aW9uLXJlYWQtb25seScpO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICAgJ1dyaXRlIHJlcXVlc3RzIGFyZSBkaXNhYmxlZCBkdXJpbmcgcmVhZC1vbmx5IGltcGVyc29uYXRpb24uIFN0b3AgaW1wZXJzb25hdGluZyB0byBtYWtlIGNoYW5nZXMuJyxcbiAgICAgICAgRXJyb3JDb2RlLklNUEVSU09OQVRJT05fUkVBRF9PTkxZLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBCT09UU1RSQVAtQURNSU4gRU5ST0xNRU5UIFNFU1NJT04uIFN1Y2ggYSB0b2tlbiBleGlzdHMgc29cbiAgICAvLyB0aGUgaW5zdGFsbCdzIG9ubHkgYWRtaW4gY2FuIGVucm9sIGEgZmFjdG9yOyBpdCBpcyBgYWFsOiAxYCBhbmQgbXVzdCBub3RcbiAgICAvLyByZWFjaCBhbnl0aGluZyBlbHNlLiBQbGF0Zm9ybSDigJQgd2hpY2ggb3ducyB0aGUgZXhjZXB0aW9uIGFuZCBrbm93cyB3aGljaFxuICAgIC8vIG9mIGl0cyBvd24gcm91dGVzIGBpbml0LXBsYXRmb3JtLnNoYCBjYWxscyDigJQgYWxsb3dzIGFuIGV4cGxpY2l0IGZldyBiZWZvcmVcbiAgICAvLyB0aGlzIHBvaW50IChzZWUgaXRzIG93biBgcmVxdWlyZUF1dGhgKTsgaW4gRVZFUlkgb3RoZXIgc2VydmljZSB0aGUgYW5zd2VyXG4gICAgLy8gaXMgc2ltcGx5IG5vLCBzbyB0aGUgcmVhY2ggcmVzdHJpY3Rpb24gaG9sZHMgd2l0aG91dCBhIHBlci1zZXJ2aWNlXG4gICAgLy8gYWxsb3dsaXN0IHRvIGtlZXAgaW4gc3luYy5cbiAgICBpZiAoZGVjb2RlZC5tZmFFbnJvbGxtZW50UGVuZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgZW1pdENvdW50ZXIoJ21mYV9lbmZvcmNlbWVudF9yZWZ1c2VkX3RvdGFsJywgeyBzZXJ2aWNlOiBzZXJ2aWNlSWRlbnRpdHkoKSwgcmVhc29uOiAnYm9vdHN0cmFwX3Nlc3Npb24nIH0pO1xuICAgICAgcmVjb3JkQXV0aHpEZW5pYWwocmVxLCAnbWZhLWVucm9sbWVudCcpO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLkZPUkJJRERFTixcbiAgICAgICAgJ0ZpbmlzaCBzZXR0aW5nIHVwIHR3by1mYWN0b3IgYXV0aGVudGljYXRpb24gYmVmb3JlIHVzaW5nIHRoZSByZXN0IG9mIFBpcGVsaW5lIEJ1aWxkZXInLFxuICAgICAgICBFcnJvckNvZGUuTUZBX0VOUk9MTE1FTlRfUkVRVUlSRUQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNlc3Npb24tbGV2ZWwgYXNzdXJhbmNlIChgcmVxdWlyZUF1dGgoeyBtaW5Bc3N1cmFuY2UsIG1heEFnZSB9KWApLlxuICAgIGlmIChvcHRpb25zLm1pbkFzc3VyYW5jZVxuICAgICAgJiYgcmVmdXNlRm9yQXNzdXJhbmNlKHsgbWluQXNzdXJhbmNlOiBvcHRpb25zLm1pbkFzc3VyYW5jZSwgLi4uKG9wdGlvbnMubWF4QWdlICE9PSB1bmRlZmluZWQgPyB7IG1heEFnZTogb3B0aW9ucy5tYXhBZ2UgfSA6IHt9KSB9LCBkZWNvZGVkLCByZXEsIHJlcykpIHJldHVybjtcblxuICAgIC8vIFRoZSB4LW9yZy1pZC94LW9yZy1uYW1lIG92ZXJyaWRlIGxldHMgYSBTWVMtQURNSU4gYWN0IG9uIGEgY2hvc2VuIG9yZ1xuICAgIC8vIChjcm9zcy1vcmcgYWRtaW4gdG9vbGluZykuIEl0IGlzIGdhdGVkIG9uIHRoZSB2ZXJpZmllZCBgaXNTdXBlckFkbWluYCBjbGFpbVxuICAgIC8vIGhlcmUgc28gdGhhdCBldmVuIGEgcm91dGUgd2hpY2ggbWlzdGFrZW5seSBlbmFibGVzIGBhbGxvd09yZ0hlYWRlck92ZXJyaWRlYFxuICAgIC8vIGNhbiBORVZFUiBsZXQgYW4gb3JkaW5hcnkgYXV0aGVudGljYXRlZCB1c2VyIHNwb29mIGFub3RoZXIgdGVuYW50J3Mgb3JnIHZpYVxuICAgIC8vIHRoZSBoZWFkZXIg4oCUIGRlZmVuY2UtaW4tZGVwdGggYWdhaW5zdCB0aGUgY3Jvc3MtdGVuYW50IGJyZWFrIHRoaXMgY2F1c2VkLlxuICAgIGlmIChvcHRpb25zLmFsbG93T3JnSGVhZGVyT3ZlcnJpZGUgJiYgZGVjb2RlZC5pc1N1cGVyQWRtaW4gPT09IHRydWUpIHtcbiAgICAgIGNvbnN0IGhlYWRlck9yZ0lkID0gZ2V0SGVhZGVyU3RyaW5nKHJlcS5oZWFkZXJzWyd4LW9yZy1pZCddKTtcbiAgICAgIGNvbnN0IGhlYWRlck9yZ05hbWUgPSBnZXRIZWFkZXJTdHJpbmcocmVxLmhlYWRlcnNbJ3gtb3JnLW5hbWUnXSk7XG4gICAgICBpZiAoaGVhZGVyT3JnSWQpIHJlcS51c2VyLm9yZ2FuaXphdGlvbklkID0gaGVhZGVyT3JnSWQ7XG4gICAgICBpZiAoaGVhZGVyT3JnTmFtZSkgcmVxLnVzZXIub3JnYW5pemF0aW9uTmFtZSA9IGhlYWRlck9yZ05hbWU7XG4gICAgfVxuXG4gICAgLy8gUmUtZGVyaXZlIHRoZSByZXF1ZXN0J3MgdGVuYW50IGlkZW50aXR5IGZyb20gdGhlIE5PVy12ZXJpZmllZCBKV1QuXG4gICAgLy9cbiAgICAvLyBgYXR0YWNoUmVxdWVzdENvbnRleHRgIHJ1bnMgYXMgYSBnbG9iYWwgbWlkZGxld2FyZSBCRUZPUkUgdGhpcyBwZXItcm91dGVcbiAgICAvLyBgcmVxdWlyZUF1dGhgLCBzbyBpdCBjYXB0dXJlZCBgcmVxLmNvbnRleHQuaWRlbnRpdHlgIHdoaWxlIGByZXEudXNlcmAgd2FzXG4gICAgLy8gc3RpbGwgdW5kZWZpbmVkIOKAlCBhdCB3aGljaCBwb2ludCBgZ2V0SWRlbnRpdHlgIGZhbGxzIGJhY2sgdG8gdGhlIHJhdyxcbiAgICAvLyBjbGllbnQtc2V0dGFibGUgYHgtb3JnLWlkYC9geC11c2VyLWlkYCBoZWFkZXJzLiBFdmVyeSBkb3duc3RyZWFtIHRlbmFudC1cbiAgICAvLyBhdXRob3JpdHkgY29uc3VtZXIgKHJlcXVpcmVPcmdJZCwgd2l0aFRlbmFudENvbnRleHQncyBSTFMgc2NvcGUsIGNoZWNrUXVvdGEsXG4gICAgLy8gd2l0aFJvdXRlLCBhbmQgdGhlIGlkZW1wb3RlbmN5IG5hbWVzcGFjZSkgcmVhZHMgYHJlcS5jb250ZXh0LmlkZW50aXR5YCwgc29cbiAgICAvLyB0aGF0IGZyb3plbiBoZWFkZXItZGVyaXZlZCB2YWx1ZSDigJQgbm90IHRoZSBKV1Qg4oCUIHdhcyBnb3Zlcm5pbmcgdGVuYW5jeSBvblxuICAgIC8vIGFueSBub24tbmdpbnggcGF0aC4gUmVjb21wdXRpbmcgaGVyZSwgYXQgdGhlIHNpbmdsZSBwb3N0LXZlcmlmaWNhdGlvbiBjaG9rZVxuICAgIC8vIHBvaW50LCBtYWtlcyBgZ2V0SWRlbnRpdHlgIHByZWZlciB0aGUgdmVyaWZpZWQgYHJlcS51c2VyYCAoc2VlIGlkZW50aXR5LnRzKVxuICAgIC8vIHNvIHRlbmFuY3kgaXMgSldULWF1dGhvcml0YXRpdmUuIFRoZSBuZ2lueCBgeC1vcmctaWRgIG92ZXJ3cml0ZSBzdGF5cyBhc1xuICAgIC8vIGRlZmVuY2UtaW4tZGVwdGguIEd1YXJkZWQgb24gYHJlcS5jb250ZXh0YCBzbyBzZXJ2aWNlcy9wYXRocyB0aGF0IG5ldmVyXG4gICAgLy8gYXR0YWNoIGEgY29udGV4dCAob3IgcnVuIHJlcXVpcmVBdXRoIHByZS1jb250ZXh0KSBhcmUgdW5hZmZlY3RlZC5cbiAgICBjb25zdCByZXFDdHggPSAocmVxIGFzIFJlcXVlc3QgJiB7IGNvbnRleHQ/OiB7IGlkZW50aXR5OiBSZXF1ZXN0SWRlbnRpdHkgfSB9KS5jb250ZXh0O1xuICAgIGlmIChyZXFDdHgpIHtcbiAgICAgIHJlcUN0eC5pZGVudGl0eSA9IGdldElkZW50aXR5KHJlcSBhcyB1bmtub3duIGFzIEh0dHBSZXF1ZXN0KTtcbiAgICB9XG5cbiAgICAvLyBTZXNzaW9uIGludmFsaWRhdGlvbiAodG9rZW4tdmVyc2lvbiBzdG9yZSArIGltcGVyc29uYXRpb24tc2Vzc2lvblxuICAgIC8vIGxpdmVuZXNzKS4gTm8gc3RvcmUgcmVnaXN0ZXJlZCDih5Igb25seSBpbXBlcnNvbmF0aW9uIHNlc3Npb25zIGFyZSBjaGVja2VkLlxuICAgIGlmIChuZWVkc1Jldm9jYXRpb25DaGVjayhkZWNvZGVkKSkge1xuICAgICAgLy8gYC5jYXRjaChuZXh0KWAgZm9yd2FyZHMgYSBET1dOU1RSRUFNIHN5bmNocm9ub3VzIHRocm93IGZyb20gYG5leHQoKWAgdG9cbiAgICAgIC8vIEV4cHJlc3MncyBlcnJvciBtaWRkbGV3YXJlIOKAlCB0aGlzIGBuZXh0KClgIHJ1bnMgaW4gYSBtaWNyb3Rhc2ssIG91dHNpZGVcbiAgICAgIC8vIHRoZSBzdXJyb3VuZGluZyB0cnkvY2F0Y2guIFRoZSBjaGVjayBpdHNlbGYgbmV2ZXIgcmVqZWN0cy5cbiAgICAgIGNoZWNrUmV2b2NhdGlvbihkZWNvZGVkKS50aGVuKChyZWZ1c2FsKSA9PiB7XG4gICAgICAgIGlmIChyZWZ1c2FsKSByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsIHJlZnVzYWwsIEVycm9yQ29kZS5UT0tFTl9SRVZPS0VEKTtcbiAgICAgICAgcnVuRGVmZXJyZWRRdW90YUNoZWNrKHJlcSwgcmVzLCBuZXh0KTtcbiAgICAgIH0pLmNhdGNoKG5leHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBhcGlDYWxscyBjaGVjayBhIG1vdW50IGFybWVkIChhcGktc2VydmVyIGBhcGlDYWxsc1F1b3RhYCkgcnVucyBoZXJlLFxuICAgIC8vIG5vdyB0aGF0IHRlbmFuY3kgaXMgSldULWF1dGhvcml0YXRpdmU7IGEgcGxhaW4gbmV4dCgpIHdoZXJlIG5vbmUgd2FzIGFybWVkLlxuICAgIHJ1bkRlZmVycmVkUXVvdGFDaGVjayhyZXEsIHJlcywgbmV4dCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2Ygand0LlRva2VuRXhwaXJlZEVycm9yKSB7XG4gICAgICByZXR1cm4gc2VuZEVycm9yKHJlcywgSHR0cFN0YXR1cy5VTkFVVEhPUklaRUQsICdUb2tlbiBoYXMgZXhwaXJlZCcsIEVycm9yQ29kZS5UT0tFTl9FWFBJUkVEKTtcbiAgICB9XG5cbiAgICAvLyBUaGUgc2lnbmluZyBrZXlzIGNvdWxkbid0IGJlIGZldGNoZWQsIHNvIHRoZSB0b2tlbidzIHZhbGlkaXR5IGlzIFVOS05PV04uXG4gICAgLy8gRmFpbCBDTE9TRUQgd2l0aCBhIHJldHJ5YWJsZSA1MDMg4oCUIG5ldmVyIGEgcGFzcywgYW5kIG5ldmVyIGEgNDAxIHRoYXRcbiAgICAvLyB3b3VsZCBzZW5kIGEgbGVnaXRpbWF0ZSBjbGllbnQgb2ZmIHRvIHJlLWF1dGhlbnRpY2F0ZSBvdmVyIG91ciBvdXRhZ2UuXG4gICAgLy8gU2FtZSByZWFzb25pbmcgZm9yIHRoZSBTRVJWSUNFIGNoYWluOiBubyByZWFkYWJsZSBrZXkgYnVuZGxlIG1lYW5zIG5vIHdheVxuICAgIC8vIHRvIHRlbGwgYSBwZWVyJ3MgdG9rZW4gZnJvbSBhIGZvcmdlcnksIHNvIHRoZSByZXF1ZXN0IGlzIHJlZnVzZWQgd2l0aCBhXG4gICAgLy8gcmV0cnlhYmxlIDUwMyByYXRoZXIgdGhhbiBhZG1pdHRlZCBvciBib3VuY2VkIHRvIHJlLWF1dGhlbnRpY2F0ZS5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBKd2tzVW5hdmFpbGFibGVFcnJvciB8fCBlcnJvciBpbnN0YW5jZW9mIFNlcnZpY2VLZXlFcnJvcikge1xuICAgICAgbG9nZ2VyLndhcm4oJ1JlamVjdGluZyByZXF1ZXN0OiB0b2tlbiBzaWduaW5nIGtleXMgdW5hdmFpbGFibGUnLCB7IGVycm9yOiBlcnJvci5tZXNzYWdlIH0pO1xuICAgICAgcmV0dXJuIHNlbmRFcnJvcihcbiAgICAgICAgcmVzLCBIdHRwU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUsXG4gICAgICAgICdUb2tlbiB2ZXJpZmljYXRpb24gaXMgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGU7IHBsZWFzZSByZXRyeScsXG4gICAgICAgIEVycm9yQ29kZS5TRVJWSUNFX1VOQVZBSUxBQkxFLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBVbmtub3duS2lkRXJyb3IgfHwgZXJyb3IgaW5zdGFuY2VvZiBqd3QuSnNvbldlYlRva2VuRXJyb3IpIHtcbiAgICAgIHJldHVybiBzZW5kRXJyb3IocmVzLCBIdHRwU3RhdHVzLlVOQVVUSE9SSVpFRCwgJ0ludmFsaWQgdG9rZW4nLCBFcnJvckNvZGUuVE9LRU5fSU5WQUxJRCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbmRFcnJvcihyZXMsIEh0dHBTdGF0dXMuVU5BVVRIT1JJWkVELCAnQXV0aGVudGljYXRpb24gZmFpbGVkJywgRXJyb3JDb2RlLlVOQVVUSE9SSVpFRCk7XG4gIH1cbn1cblxuIl19
|