@aws-cdk/aws-bedrock-agentcore-alpha 2.253.0-alpha.0 → 2.254.0-alpha.0
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/.jsii +17116 -11830
- package/.jsii.tabl.json.gz +0 -0
- package/README.md +140 -10
- package/lib/evaluation/custom-evaluator.d.ts +9 -0
- package/lib/evaluation/custom-evaluator.js +8 -2
- package/lib/evaluation/data-source.js +1 -1
- package/lib/evaluation/evaluator-base.js +1 -1
- package/lib/evaluation/evaluator-config.js +2 -2
- package/lib/evaluation/evaluator.js +1 -1
- package/lib/evaluation/online-evaluation-base.js +1 -1
- package/lib/evaluation/online-evaluation.d.ts +9 -0
- package/lib/evaluation/online-evaluation.js +8 -2
- package/lib/evaluation/types.js +5 -5
- package/lib/evaluation/validation-helpers.d.ts +8 -0
- package/lib/evaluation/validation-helpers.js +62 -1
- package/lib/gateway/gateway-base.js +1 -1
- package/lib/gateway/gateway.d.ts +3 -2
- package/lib/gateway/gateway.js +3 -3
- package/lib/gateway/inbound-auth/authorizer.js +4 -4
- package/lib/gateway/inbound-auth/custom-claim.js +1 -1
- package/lib/gateway/interceptor.js +1 -1
- package/lib/gateway/outbound-auth/api-key.d.ts +13 -4
- package/lib/gateway/outbound-auth/api-key.js +63 -21
- package/lib/gateway/outbound-auth/credential-provider.d.ts +48 -4
- package/lib/gateway/outbound-auth/credential-provider.js +49 -2
- package/lib/gateway/outbound-auth/iam-role.d.ts +4 -3
- package/lib/gateway/outbound-auth/iam-role.js +3 -5
- package/lib/gateway/outbound-auth/oauth.d.ts +11 -3
- package/lib/gateway/outbound-auth/oauth.js +70 -20
- package/lib/gateway/perms.d.ts +15 -3
- package/lib/gateway/perms.js +24 -9
- package/lib/gateway/protocol.js +2 -2
- package/lib/gateway/targets/schema/api-schema.js +4 -4
- package/lib/gateway/targets/schema/tool-schema.js +4 -4
- package/lib/gateway/targets/target-base.js +1 -1
- package/lib/gateway/targets/target-configuration.js +6 -6
- package/lib/gateway/targets/target.js +3 -3
- package/lib/identity/api-key-credential-provider.d.ts +217 -0
- package/lib/identity/api-key-credential-provider.js +249 -0
- package/lib/identity/grant-helpers.d.ts +74 -0
- package/lib/identity/grant-helpers.js +132 -0
- package/lib/identity/oauth2-credential-provider.d.ts +679 -0
- package/lib/identity/oauth2-credential-provider.js +863 -0
- package/lib/identity/perms.d.ts +119 -0
- package/lib/identity/perms.js +178 -0
- package/lib/identity/validation-helpers.d.ts +61 -0
- package/lib/identity/validation-helpers.js +156 -0
- package/lib/identity/workload-identity.d.ts +186 -0
- package/lib/identity/workload-identity.js +212 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +8 -1
- package/lib/memory/memory-strategy.js +1 -1
- package/lib/memory/memory.js +2 -2
- package/lib/memory/strategies/managed-strategy.js +1 -1
- package/lib/memory/strategies/self-managed-strategy.js +1 -1
- package/lib/memory/validation-helpers.js +2 -2
- package/lib/network/network-configuration.js +4 -4
- package/lib/policy/policy-base.js +1 -1
- package/lib/policy/policy-engine-base.js +1 -1
- package/lib/policy/policy-engine.js +1 -1
- package/lib/policy/policy-statement.d.ts +2 -1
- package/lib/policy/policy-statement.js +14 -12
- package/lib/policy/policy-types.js +1 -1
- package/lib/policy/policy.js +1 -1
- package/lib/runtime/inbound-auth/custom-claim.js +1 -1
- package/lib/runtime/inbound-auth/runtime-authorizer-configuration.js +1 -1
- package/lib/runtime/observability.js +2 -2
- package/lib/runtime/runtime-artifact.d.ts +11 -3
- package/lib/runtime/runtime-artifact.js +12 -4
- package/lib/runtime/runtime-base.js +1 -1
- package/lib/runtime/runtime-endpoint-base.js +1 -1
- package/lib/runtime/runtime-endpoint.js +1 -1
- package/lib/runtime/runtime.js +1 -1
- package/lib/runtime/types.d.ts +7 -1
- package/lib/runtime/types.js +7 -1
- package/lib/tools/browser.js +2 -2
- package/lib/tools/code-interpreter.js +2 -2
- package/package.json +18 -10
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
|
|
3
|
+
var useValue = arguments.length > 2;
|
|
4
|
+
for (var i = 0; i < initializers.length; i++) {
|
|
5
|
+
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
|
|
6
|
+
}
|
|
7
|
+
return useValue ? value : void 0;
|
|
8
|
+
};
|
|
9
|
+
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
|
|
10
|
+
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
|
|
11
|
+
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
|
|
12
|
+
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
|
|
13
|
+
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
|
|
14
|
+
var _, done = false;
|
|
15
|
+
for (var i = decorators.length - 1; i >= 0; i--) {
|
|
16
|
+
var context = {};
|
|
17
|
+
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
|
|
18
|
+
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
|
|
19
|
+
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
|
|
20
|
+
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
|
|
21
|
+
if (kind === "accessor") {
|
|
22
|
+
if (result === void 0) continue;
|
|
23
|
+
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
|
|
24
|
+
if (_ = accept(result.get)) descriptor.get = _;
|
|
25
|
+
if (_ = accept(result.set)) descriptor.set = _;
|
|
26
|
+
if (_ = accept(result.init)) initializers.unshift(_);
|
|
27
|
+
}
|
|
28
|
+
else if (_ = accept(result)) {
|
|
29
|
+
if (kind === "field") initializers.unshift(_);
|
|
30
|
+
else descriptor[key] = _;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (target) Object.defineProperty(target, contextIn.name, descriptor);
|
|
34
|
+
done = true;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.ApiKeyCredentialProvider = void 0;
|
|
38
|
+
const jsiiDeprecationWarnings = require("../../.warnings.jsii.js");
|
|
39
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
40
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
41
|
+
const aws_bedrockagentcore_1 = require("aws-cdk-lib/aws-bedrockagentcore");
|
|
42
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
43
|
+
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
|
|
44
|
+
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
|
|
45
|
+
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
|
|
46
|
+
const grant_helpers_1 = require("./grant-helpers");
|
|
47
|
+
const perms_1 = require("./perms");
|
|
48
|
+
const validation_helpers_1 = require("./validation-helpers");
|
|
49
|
+
/******************************************************************************
|
|
50
|
+
* Abstract base
|
|
51
|
+
*****************************************************************************/
|
|
52
|
+
class ApiKeyCredentialProviderBase extends aws_cdk_lib_1.Resource {
|
|
53
|
+
grantPrincipal = new iam.UnknownPrincipal({ resource: this });
|
|
54
|
+
get apiKeyCredentialProviderRef() {
|
|
55
|
+
return { credentialProviderArn: this.credentialProviderArn };
|
|
56
|
+
}
|
|
57
|
+
constructor(scope, id, props) {
|
|
58
|
+
super(scope, id, props);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* [disable-awslint:no-grants]
|
|
62
|
+
*/
|
|
63
|
+
grant(grantee, ...actions) {
|
|
64
|
+
return iam.Grant.addToPrincipal({
|
|
65
|
+
grantee,
|
|
66
|
+
actions,
|
|
67
|
+
resourceArns: (0, grant_helpers_1.buildIdentityResourceArns)(this, this.credentialProviderArn, grant_helpers_1.TOKEN_VAULT_API_KEY_PARENT_RESOURCES),
|
|
68
|
+
scope: this,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* [disable-awslint:no-grants]
|
|
73
|
+
*/
|
|
74
|
+
grantRead(grantee) {
|
|
75
|
+
return (0, grant_helpers_1.grantReadWithList)(this, grantee, this.credentialProviderArn, perms_1.ApiKeyCredentialProviderIdentityPerms.READ_PERMS, perms_1.ApiKeyCredentialProviderIdentityPerms.LIST_PERMS, grant_helpers_1.TOKEN_VAULT_API_KEY_PARENT_RESOURCES);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* [disable-awslint:no-grants]
|
|
79
|
+
*/
|
|
80
|
+
grantAdmin(grantee) {
|
|
81
|
+
const bedrock = this.grant(grantee, ...perms_1.ApiKeyCredentialProviderIdentityPerms.ADMIN_PERMS);
|
|
82
|
+
const secret = (0, grant_helpers_1.grantCredentialSecret)(this, grantee, this.apiKeySecretArn, [...perms_1.TOKEN_VAULT_CREDENTIAL_SECRET_WRITE_PERMS]);
|
|
83
|
+
return secret ? bedrock.combine(secret) : bedrock;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* [disable-awslint:no-grants]
|
|
87
|
+
*/
|
|
88
|
+
grantUse(grantee) {
|
|
89
|
+
const bedrock = iam.Grant.addToPrincipal({
|
|
90
|
+
grantee,
|
|
91
|
+
actions: [...perms_1.ApiKeyCredentialProviderIdentityPerms.USE_PERMS],
|
|
92
|
+
resourceArns: (0, grant_helpers_1.buildIdentityResourceArns)(this, this.credentialProviderArn, [...grant_helpers_1.TOKEN_VAULT_API_KEY_PARENT_RESOURCES, ...grant_helpers_1.WORKLOAD_IDENTITY_USE_RESOURCES]),
|
|
93
|
+
scope: this,
|
|
94
|
+
});
|
|
95
|
+
const secret = (0, grant_helpers_1.grantCredentialSecret)(this, grantee, this.apiKeySecretArn, [...perms_1.TOKEN_VAULT_CREDENTIAL_SECRET_READ_PERMS]);
|
|
96
|
+
return secret ? bedrock.combine(secret) : bedrock;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* [disable-awslint:no-grants]
|
|
100
|
+
*/
|
|
101
|
+
grantFullAccess(grantee) {
|
|
102
|
+
const bedrock = iam.Grant.addToPrincipal({
|
|
103
|
+
grantee,
|
|
104
|
+
actions: [...perms_1.ApiKeyCredentialProviderIdentityPerms.FULL_ACCESS_PERMS],
|
|
105
|
+
resourceArns: (0, grant_helpers_1.buildIdentityResourceArns)(this, this.credentialProviderArn, [...grant_helpers_1.TOKEN_VAULT_API_KEY_PARENT_RESOURCES, ...grant_helpers_1.WORKLOAD_IDENTITY_USE_RESOURCES]),
|
|
106
|
+
scope: this,
|
|
107
|
+
});
|
|
108
|
+
const secret = (0, grant_helpers_1.grantCredentialSecret)(this, grantee, this.apiKeySecretArn, [...perms_1.TOKEN_VAULT_CREDENTIAL_SECRET_READ_PERMS, ...perms_1.TOKEN_VAULT_CREDENTIAL_SECRET_WRITE_PERMS]);
|
|
109
|
+
return secret ? bedrock.combine(secret) : bedrock;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/******************************************************************************
|
|
113
|
+
* Class
|
|
114
|
+
*****************************************************************************/
|
|
115
|
+
/**
|
|
116
|
+
* L2 construct for `AWS::BedrockAgentCore::ApiKeyCredentialProvider`.
|
|
117
|
+
*
|
|
118
|
+
* Use this to register an API key identity in AgentCore Token Vault. To attach the identity to a
|
|
119
|
+
* gateway target, use {@link GatewayCredentialProvider.fromApiKeyIdentity} with this construct, or
|
|
120
|
+
* {@link ApiKeyCredentialProvider.bindForGatewayApiKeyTarget} with {@link GatewayCredentialProvider.fromApiKeyIdentityArn}.
|
|
121
|
+
*
|
|
122
|
+
* @see https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-bedrockagentcore-apikeycredentialprovider.html
|
|
123
|
+
* @resource AWS::BedrockAgentCore::ApiKeyCredentialProvider
|
|
124
|
+
*/
|
|
125
|
+
let ApiKeyCredentialProvider = (() => {
|
|
126
|
+
let _classDecorators = [prop_injectable_1.propertyInjectable];
|
|
127
|
+
let _classDescriptor;
|
|
128
|
+
let _classExtraInitializers = [];
|
|
129
|
+
let _classThis;
|
|
130
|
+
let _classSuper = ApiKeyCredentialProviderBase;
|
|
131
|
+
let _instanceExtraInitializers = [];
|
|
132
|
+
let _bindForGatewayApiKeyTarget_decorators;
|
|
133
|
+
var ApiKeyCredentialProvider = class extends _classSuper {
|
|
134
|
+
static { _classThis = this; }
|
|
135
|
+
static {
|
|
136
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
137
|
+
_bindForGatewayApiKeyTarget_decorators = [(0, metadata_resource_1.MethodMetadata)()];
|
|
138
|
+
__esDecorate(this, null, _bindForGatewayApiKeyTarget_decorators, { kind: "method", name: "bindForGatewayApiKeyTarget", static: false, private: false, access: { has: obj => "bindForGatewayApiKeyTarget" in obj, get: obj => obj.bindForGatewayApiKeyTarget }, metadata: _metadata }, null, _instanceExtraInitializers);
|
|
139
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
140
|
+
ApiKeyCredentialProvider = _classThis = _classDescriptor.value;
|
|
141
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
142
|
+
}
|
|
143
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.ApiKeyCredentialProvider", version: "2.254.0-alpha.0" };
|
|
144
|
+
/** Uniquely identifies this class. */
|
|
145
|
+
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-bedrock-agentcore-alpha.ApiKeyCredentialProvider';
|
|
146
|
+
/**
|
|
147
|
+
* Import an existing API key credential provider.
|
|
148
|
+
*/
|
|
149
|
+
static fromApiKeyCredentialProviderAttributes(scope, id, attrs) {
|
|
150
|
+
try {
|
|
151
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_ApiKeyCredentialProviderAttributes(attrs);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
155
|
+
Error.captureStackTrace(error, this.fromApiKeyCredentialProviderAttributes);
|
|
156
|
+
}
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
class Import extends ApiKeyCredentialProviderBase {
|
|
160
|
+
credentialProviderArn = attrs.credentialProviderArn;
|
|
161
|
+
apiKeySecretArn = attrs.apiKeySecretArn;
|
|
162
|
+
createdTime = attrs.createdTime;
|
|
163
|
+
lastUpdatedTime = attrs.lastUpdatedTime;
|
|
164
|
+
constructor(s, i) {
|
|
165
|
+
super(s, i);
|
|
166
|
+
}
|
|
167
|
+
bindForGatewayApiKeyTarget() {
|
|
168
|
+
if (this.apiKeySecretArn == null || this.apiKeySecretArn === '') {
|
|
169
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `MissingApiKeySecretArn`, 'apiKeySecretArn is not available on this ApiKeyCredentialProvider (imported providers must pass apiKeySecretArn in fromApiKeyCredentialProviderAttributes).', this);
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
providerArn: this.credentialProviderArn,
|
|
173
|
+
secretArn: this.apiKeySecretArn,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return new Import(scope, id);
|
|
178
|
+
}
|
|
179
|
+
credentialProviderArn = __runInitializers(this, _instanceExtraInitializers);
|
|
180
|
+
/**
|
|
181
|
+
* The name of this API key credential provider.
|
|
182
|
+
* @attribute
|
|
183
|
+
*/
|
|
184
|
+
apiKeyCredentialProviderName;
|
|
185
|
+
createdTime;
|
|
186
|
+
lastUpdatedTime;
|
|
187
|
+
_apiKeySecretArn;
|
|
188
|
+
__resource;
|
|
189
|
+
get apiKeySecretArn() {
|
|
190
|
+
if (this._apiKeySecretArn === undefined) {
|
|
191
|
+
this._apiKeySecretArn = aws_cdk_lib_1.Token.asString(this.__resource.attrApiKeySecretArn);
|
|
192
|
+
}
|
|
193
|
+
return this._apiKeySecretArn;
|
|
194
|
+
}
|
|
195
|
+
constructor(scope, id, props = {}) {
|
|
196
|
+
super(scope, id, {
|
|
197
|
+
physicalName: props.apiKeyCredentialProviderName
|
|
198
|
+
?? aws_cdk_lib_1.Lazy.string({
|
|
199
|
+
produce: () => aws_cdk_lib_1.Names.uniqueResourceName(this, { maxLength: 128 }),
|
|
200
|
+
}),
|
|
201
|
+
});
|
|
202
|
+
try {
|
|
203
|
+
jsiiDeprecationWarnings._aws_cdk_aws_bedrock_agentcore_alpha_ApiKeyCredentialProviderResourceProps(props);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
|
|
207
|
+
Error.captureStackTrace(error, ApiKeyCredentialProvider);
|
|
208
|
+
}
|
|
209
|
+
throw error;
|
|
210
|
+
}
|
|
211
|
+
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
212
|
+
this.apiKeyCredentialProviderName = this.physicalName;
|
|
213
|
+
const apiKeyValue = props.apiKey?.unsafeUnwrap();
|
|
214
|
+
(0, validation_helpers_1.throwIfInvalid)(validation_helpers_1.validateCredentialProviderName, this.apiKeyCredentialProviderName, this);
|
|
215
|
+
(0, validation_helpers_1.throwIfInvalid)(validation_helpers_1.validateApiKeyValue, apiKeyValue, this);
|
|
216
|
+
(0, validation_helpers_1.throwIfInvalid)(validation_helpers_1.validateCredentialProviderTags, props.tags, this);
|
|
217
|
+
const cfnProps = {
|
|
218
|
+
name: this.apiKeyCredentialProviderName,
|
|
219
|
+
apiKey: apiKeyValue,
|
|
220
|
+
tags: props.tags && Object.keys(props.tags).length > 0
|
|
221
|
+
? Object.entries(props.tags).map(([key, value]) => ({ key, value }))
|
|
222
|
+
: undefined,
|
|
223
|
+
};
|
|
224
|
+
this.__resource = new aws_bedrockagentcore_1.CfnApiKeyCredentialProvider(this, 'Resource', cfnProps);
|
|
225
|
+
this.credentialProviderArn = this.__resource.attrCredentialProviderArn;
|
|
226
|
+
this.createdTime = this.__resource.attrCreatedTime;
|
|
227
|
+
this.lastUpdatedTime = this.__resource.attrLastUpdatedTime;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* ARNs for {@link GatewayCredentialProvider.fromApiKeyIdentity} / {@link GatewayCredentialProvider.fromApiKeyIdentityArn}.
|
|
231
|
+
*/
|
|
232
|
+
bindForGatewayApiKeyTarget() {
|
|
233
|
+
const secretArn = this.apiKeySecretArn;
|
|
234
|
+
if (secretArn == null) {
|
|
235
|
+
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `MissingApiKeySecretArn`, 'apiKeySecretArn is not available — the CloudFormation attribute has not resolved yet.', this);
|
|
236
|
+
}
|
|
237
|
+
return {
|
|
238
|
+
providerArn: this.credentialProviderArn,
|
|
239
|
+
secretArn,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
static {
|
|
243
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
return ApiKeyCredentialProvider = _classThis;
|
|
247
|
+
})();
|
|
248
|
+
exports.ApiKeyCredentialProvider = ApiKeyCredentialProvider;
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLWtleS1jcmVkZW50aWFsLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBpLWtleS1jcmVkZW50aWFsLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLDZDQUE0RTtBQU01RSwyRUFBK0U7QUFDL0UsMkNBQTJDO0FBQzNDLDRFQUE0RDtBQUM1RCw4RUFBOEY7QUFDOUYsMEVBQTBFO0FBRTFFLG1EQUE2SztBQUM3SyxtQ0FBcUo7QUFDckosNkRBSzhCO0FBcUo5Qjs7K0VBRStFO0FBRS9FLE1BQWUsNEJBQTZCLFNBQVEsc0JBQVE7SUFLMUMsY0FBYyxHQUFtQixJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTlGLElBQVcsMkJBQTJCO1FBQ3BDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztLQUM5RDtJQUVELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBcUI7UUFDN0QsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDekI7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxPQUF1QixFQUFFLEdBQUcsT0FBaUI7UUFDeEQsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTztZQUNQLFlBQVksRUFBRSxJQUFBLHlDQUF5QixFQUFDLElBQUksRUFBRSxJQUFJLENBQUMscUJBQXFCLEVBQUUsb0RBQW9DLENBQUM7WUFDL0csS0FBSyxFQUFFLElBQUk7U0FDWixDQUFDLENBQUM7S0FDSjtJQUVEOztPQUVHO0lBQ0ksU0FBUyxDQUFDLE9BQXVCO1FBQ3RDLE9BQU8sSUFBQSxpQ0FBaUIsRUFDdEIsSUFBSSxFQUNKLE9BQU8sRUFDUCxJQUFJ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QUMsQ0FBQztvQkFDcEUsQ0FBQyxDQUFDLFNBQVM7YUFDZCxDQUFDO1lBRUYsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGtEQUEyQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFOUUsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUM7WUFDdkUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQztZQUNuRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUM7U0FDNUQ7UUFFRDs7V0FFRztRQUVJLDBCQUEwQjtZQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3ZDLElBQUksU0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksNkJBQWUsQ0FDdkIsSUFBQSxzQkFBRyxFQUFBLHdCQUF3QixFQUMzQix1RkFBdUYsRUFDdkYsSUFBSSxDQUNMLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTztnQkFDTCxXQUFXLEVBQUUsSUFBSSxDQUFDLHFCQUFxQjtnQkFDdkMsU0FBUzthQUNWLENBQUM7U0FDSDs7WUE1R1UsdURBQXdCOzs7OztBQUF4Qiw0REFBd0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogIHdpdGggdGhlIExpY2Vuc2UuIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgb3IgaW4gdGhlICdsaWNlbnNlJyBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVNcbiAqICBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuICogIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElSZXNvdXJjZSwgUmVzb3VyY2VQcm9wcywgU2VjcmV0VmFsdWUgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBMYXp5LCBOYW1lcywgUmVzb3VyY2UsIFRva2VuLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7XG4gIEFwaUtleUNyZWRlbnRpYWxQcm92aWRlclJlZmVyZW5jZSxcbiAgQ2ZuQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyUHJvcHMsXG4gIElBcGlLZXlDcmVkZW50aWFsUHJvdmlkZXJSZWYsXG59IGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlJztcbmltcG9ydCB7IENmbkFwaUtleUNyZWRlbnRpYWxQcm92aWRlciB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1iZWRyb2NrYWdlbnRjb3JlJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBidWlsZElkZW50aXR5UmVzb3VyY2VBcm5zLCBncmFudENyZWRlbnRpYWxTZWNyZXQsIGdyYW50UmVhZFdpdGhMaXN0LCBUT0tFTl9WQVVMVF9BUElfS0VZX1BBUkVOVF9SRVNPVVJDRVMsIFdPUktMT0FEX0lERU5USVRZX1VTRV9SRVNPVVJDRVMgfSBmcm9tICcuL2dyYW50LWhlbHBlcnMnO1xuaW1wb3J0IHsgQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVySWRlbnRpdHlQZXJtcywgVE9LRU5fVkFVTFRfQ1JFREVOVElBTF9TRUNSRVRfUkVBRF9QRVJNUywgVE9LRU5fVkFVTFRfQ1JFREVOVElBTF9TRUNSRVRfV1JJVEVfUEVSTVMgfSBmcm9tICcuL3Blcm1zJztcbmltcG9ydCB7XG4gIHRocm93SWZJbnZhbGlkLFxuICB2YWxpZGF0ZUFwaUtleVZhbHVlLFxuICB2YWxpZGF0ZUNyZWRlbnRpYWxQcm92aWRlck5hbWUsXG4gIHZhbGlkYXRlQ3JlZGVudGlhbFByb3ZpZGVyVGFncyxcbn0gZnJvbSAnLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQW4gQVBJIGtleSBjcmVkZW50aWFsIHByb3ZpZGVyIHJlZ2lzdGVyZWQgaW4gQWdlbnRDb3JlIFRva2VuIFZhdWx0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBcGlLZXlDcmVkZW50aWFsUHJvdmlkZXIgZXh0ZW5kcyBJUmVzb3VyY2UsIGlhbS5JR3JhbnRhYmxlLCBJQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyUmVmIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhpcyBjcmVkZW50aWFsIHByb3ZpZGVyLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBjcmVkZW50aWFsUHJvdmlkZXJBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCB0aGF0IHN0b3JlcyB0aGUgQVBJIGtleSBhZnRlciB0aGUgcmVzb3VyY2UgaXMgY3JlYXRlZC5cbiAgICpcbiAgICogTWF5IGJlIHVuZGVmaW5lZCBmb3IgcmVzb3VyY2VzIGltcG9ydGVkIHdpdGhvdXQgdGhpcyBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGFwaUtleVNlY3JldEFybj86IHN0cmluZztcblxuICAvKipcbiAgICogVGltZXN0YW1wIHdoZW4gdGhlIGNyZWRlbnRpYWwgcHJvdmlkZXIgd2FzIGNyZWF0ZWQuXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGNyZWF0ZWRUaW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgY3JlZGVudGlhbCBwcm92aWRlciB3YXMgbGFzdCB1cGRhdGVkLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBsYXN0VXBkYXRlZFRpbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEdyYW50cyBJQU0gYWN0aW9ucyB0byB0aGUgSUFNIHByaW5jaXBhbC5cbiAgICovXG4gIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCAuLi5hY3Rpb25zOiBzdHJpbmdbXSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnQgYEdldEFwaUtleUNyZWRlbnRpYWxQcm92aWRlcmAgYW5kIGBMaXN0QXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyc2AsIHNjb3BlZCB0byB0aGlzXG4gICAqIHByb3ZpZGVyIGFuZCBwYXJlbnQgcmVzb3VyY2VzIHJlcXVpcmVkIGJ5IHRoZSBCZWRyb2NrIEFnZW50Q29yZSBhdXRob3JpemF0aW9uIG1vZGVsLlxuICAgKi9cbiAgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBHcmFudCBjb250cm9sIHBsYW5lIHBlcm1pc3Npb25zIHRvIG1hbmFnZSB0aGlzIHByb3ZpZGVyLlxuICAgKi9cbiAgZ3JhbnRBZG1pbihncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnQgcGVybWlzc2lvbiB0byByZXRyaWV2ZSBBUEkga2V5IG1hdGVyaWFsIGZvciBvdXRib3VuZCBjYWxscyAoYEdldFJlc291cmNlQXBpS2V5YCkuXG4gICAqL1xuICBncmFudFVzZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogR3JhbnQgcmVhZCwgYWRtaW4sIGFuZCBjcmVkZW50aWFsIHJldHJpZXZhbCBwZXJtaXNzaW9ucy5cbiAgICovXG4gIGdyYW50RnVsbEFjY2VzcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcblxuICAvKipcbiAgICogQVJOcyBmb3IgdXNlIHdpdGggZ2F0ZXdheSB0YXJnZXRzIChgR2F0ZXdheUNyZWRlbnRpYWxQcm92aWRlci5mcm9tQXBpS2V5SWRlbnRpdHlgIG9yIGBmcm9tQXBpS2V5SWRlbnRpdHlBcm5gKS5cbiAgICovXG4gIGJpbmRGb3JHYXRld2F5QXBpS2V5VGFyZ2V0KCk6IEdhdGV3YXlBcGlLZXlJZGVudGl0eUJpbmRpbmc7XG59XG5cbi8qKlxuICogUHJvdmlkZXIgYW5kIHNlY3JldCBBUk5zIGZvciB3aXJpbmcgYSBUb2tlbiBWYXVsdCBBUEkga2V5IGlkZW50aXR5IGludG8gYSBnYXRld2F5IHRhcmdldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHYXRld2F5QXBpS2V5SWRlbnRpdHlCaW5kaW5nIHtcbiAgLyoqXG4gICAqIEFQSSBrZXkgY3JlZGVudGlhbCBwcm92aWRlciBBUk4uXG4gICAqL1xuICByZWFkb25seSBwcm92aWRlckFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IEFSTiBmb3IgdGhlIEFQSSBrZXkgbWF0ZXJpYWwuXG4gICAqL1xuICByZWFkb25seSBzZWNyZXRBcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhIG5ldyB7QGxpbmsgQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyfSAoVG9rZW4gVmF1bHQgcmVzb3VyY2UpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUtleUNyZWRlbnRpYWxQcm92aWRlclJlc291cmNlUHJvcHMge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgY3JlZGVudGlhbCBwcm92aWRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgYSBuYW1lIGdlbmVyYXRlZCBieSBDREtcbiAgICovXG4gIHJlYWRvbmx5IGFwaUtleUNyZWRlbnRpYWxQcm92aWRlck5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBUEkga2V5IHZhbHVlLlxuICAgKlxuICAgKiAqKk5PVEU6KiogVGhlIEFQSSBrZXkgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUgYXMgcGFydCBvZiBzeW50aGVzaXMuXG4gICAqIFRoZSBzZXJ2aWNlIHN0b3JlcyB0aGUga2V5IGluIFNlY3JldHMgTWFuYWdlciBhZnRlciBjcmVhdGlvbiwgYnV0IHRoZSB2YWx1ZSBpcyB2aXNpYmxlXG4gICAqIGluIHRoZSB0ZW1wbGF0ZSBhbmQgZGVwbG95bWVudCBoaXN0b3J5LiBVc2UgYFNlY3JldFZhbHVlLnVuc2FmZVBsYWluVGV4dCgpYCB0byBleHBsaWNpdGx5XG4gICAqIGFja25vd2xlZGdlIHBsYWludGV4dCwgb3IgcGFzcyBhIHJlZmVyZW5jZSBmcm9tIGFub3RoZXIgY29uc3RydWN0IHRvIGF2b2lkIGVtYmVkZGluZyB0aGVcbiAgICogbGl0ZXJhbCB2YWx1ZS5cbiAgICpcbiAgICogSWYgb21pdHRlZCwgeW91IGNhbiBzdXBwbHkgdGhlIGtleSB0aHJvdWdoIGFub3RoZXIgbWVjaGFuaXNtIHN1cHBvcnRlZCBieSB0aGUgc2VydmljZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBrZXkgaW4gdGVtcGxhdGUgKHByb3ZpZGVyIG1heSBzdGlsbCBiZSBjcmVhdGVkIGRlcGVuZGluZyBvbiBzZXJ2aWNlIGJlaGF2aW9yKVxuICAgKi9cbiAgcmVhZG9ubHkgYXBpS2V5PzogU2VjcmV0VmFsdWU7XG5cbiAgLyoqXG4gICAqIFRhZ3MgZm9yIHRoaXMgY3JlZGVudGlhbCBwcm92aWRlci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyB0YWdzXG4gICAqL1xuICByZWFkb25seSB0YWdzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgQVBJIGtleSBjcmVkZW50aWFsIHByb3ZpZGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUtleUNyZWRlbnRpYWxQcm92aWRlckF0dHJpYnV0ZXMge1xuICAvKipcbiAgICogQVJOIG9mIHRoZSBjcmVkZW50aWFsIHByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JlZGVudGlhbFByb3ZpZGVyQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFSTiBvZiB0aGUgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBmb3IgdGhlIEFQSSBrZXksIGlmIGtub3duLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdCBzZXQ7IHJlcXVpcmVkIGZvciB7QGxpbmsgQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyLmJpbmRGb3JHYXRld2F5QXBpS2V5VGFyZ2V0fSBvbiBpbXBvcnRlZCBwcm92aWRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGFwaUtleVNlY3JldEFybj86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgY3JlYXRpb24gdGltZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub3Qgc2V0XG4gICAqL1xuICByZWFkb25seSBjcmVhdGVkVGltZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmVzb3VyY2UgbGFzdC11cGRhdGVkIHRpbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90IHNldFxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdFVwZGF0ZWRUaW1lPzogc3RyaW5nO1xufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdCBiYXNlXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmFic3RyYWN0IGNsYXNzIEFwaUtleUNyZWRlbnRpYWxQcm92aWRlckJhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElBcGlLZXlDcmVkZW50aWFsUHJvdmlkZXIge1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgY3JlZGVudGlhbFByb3ZpZGVyQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBhcGlLZXlTZWNyZXRBcm4/OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBjcmVhdGVkVGltZT86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGxhc3RVcGRhdGVkVGltZT86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbCA9IG5ldyBpYW0uVW5rbm93blByaW5jaXBhbCh7IHJlc291cmNlOiB0aGlzIH0pO1xuXG4gIHB1YmxpYyBnZXQgYXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyUmVmKCk6IEFwaUtleUNyZWRlbnRpYWxQcm92aWRlclJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIHsgY3JlZGVudGlhbFByb3ZpZGVyQXJuOiB0aGlzLmNyZWRlbnRpYWxQcm92aWRlckFybiB9O1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBSZXNvdXJjZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKipcbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zLFxuICAgICAgcmVzb3VyY2VBcm5zOiBidWlsZElkZW50aXR5UmVzb3VyY2VBcm5zKHRoaXMsIHRoaXMuY3JlZGVudGlhbFByb3ZpZGVyQXJuLCBUT0tFTl9WQVVMVF9BUElfS0VZX1BBUkVOVF9SRVNPVVJDRVMpLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gZ3JhbnRSZWFkV2l0aExpc3QoXG4gICAgICB0aGlzLFxuICAgICAgZ3JhbnRlZSxcbiAgICAgIHRoaXMuY3JlZGVudGlhbFByb3ZpZGVyQXJuLFxuICAgICAgQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVySWRlbnRpdHlQZXJtcy5SRUFEX1BFUk1TLFxuICAgICAgQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVySWRlbnRpdHlQZXJtcy5MSVNUX1BFUk1TLFxuICAgICAgVE9LRU5fVkFVTFRfQVBJX0tFWV9QQVJFTlRfUkVTT1VSQ0VTLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRBZG1pbihncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgY29uc3QgYmVkcm9jayA9IHRoaXMuZ3JhbnQoZ3JhbnRlZSwgLi4uQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVySWRlbnRpdHlQZXJtcy5BRE1JTl9QRVJNUyk7XG4gICAgY29uc3Qgc2VjcmV0ID0gZ3JhbnRDcmVkZW50aWFsU2VjcmV0KFxuICAgICAgdGhpcyxcbiAgICAgIGdyYW50ZWUsXG4gICAgICB0aGlzLmFwaUtleVNlY3JldEFybixcbiAgICAgIFsuLi5UT0tFTl9WQVVMVF9DUkVERU5USUFMX1NFQ1JFVF9XUklURV9QRVJNU10sXG4gICAgKTtcbiAgICByZXR1cm4gc2VjcmV0ID8gYmVkcm9jay5jb21iaW5lKHNlY3JldCkgOiBiZWRyb2NrO1xuICB9XG5cbiAgLyoqXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50VXNlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBjb25zdCBiZWRyb2NrID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBbLi4uQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVySWRlbnRpdHlQZXJtcy5VU0VfUEVSTVNdLFxuICAgICAgcmVzb3VyY2VBcm5zOiBidWlsZElkZW50aXR5UmVzb3VyY2VBcm5zKFxuICAgICAgICB0aGlzLCB0aGlzLmNyZWRlbnRpYWxQcm92aWRlckFybiwgWy4uLlRPS0VOX1ZBVUxUX0FQSV9LRVlfUEFSRU5UX1JFU09VUkNFUywgLi4uV09SS0xPQURfSURFTlRJVFlfVVNFX1JFU09VUkNFU10sXG4gICAgICApLFxuICAgICAgc2NvcGU6IHRoaXMsXG4gICAgfSk7XG4gICAgY29uc3Qgc2VjcmV0ID0gZ3JhbnRDcmVkZW50aWFsU2VjcmV0KFxuICAgICAgdGhpcyxcbiAgICAgIGdyYW50ZWUsXG4gICAgICB0aGlzLmFwaUtleVNlY3JldEFybixcbiAgICAgIFsuLi5UT0tFTl9WQVVMVF9DUkVERU5USUFMX1NFQ1JFVF9SRUFEX1BFUk1TXSxcbiAgICApO1xuICAgIHJldHVybiBzZWNyZXQgPyBiZWRyb2NrLmNvbWJpbmUoc2VjcmV0KSA6IGJlZHJvY2s7XG4gIH1cblxuICAvKipcbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqL1xuICBwdWJsaWMgZ3JhbnRGdWxsQWNjZXNzKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICBjb25zdCBiZWRyb2NrID0gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICBhY3Rpb25zOiBbLi4uQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVySWRlbnRpdHlQZXJtcy5GVUxMX0FDQ0VTU19QRVJNU10sXG4gICAgICByZXNvdXJjZUFybnM6IGJ1aWxkSWRlbnRpdHlSZXNvdXJjZUFybnMoXG4gICAgICAgIHRoaXMsIHRoaXMuY3JlZGVudGlhbFByb3ZpZGVyQXJuLCBbLi4uVE9LRU5fVkFVTFRfQVBJX0tFWV9QQVJFTlRfUkVTT1VSQ0VTLCAuLi5XT1JLTE9BRF9JREVOVElUWV9VU0VfUkVTT1VSQ0VTXSxcbiAgICAgICksXG4gICAgICBzY29wZTogdGhpcyxcbiAgICB9KTtcbiAgICBjb25zdCBzZWNyZXQgPSBncmFudENyZWRlbnRpYWxTZWNyZXQoXG4gICAgICB0aGlzLFxuICAgICAgZ3JhbnRlZSxcbiAgICAgIHRoaXMuYXBpS2V5U2VjcmV0QXJuLFxuICAgICAgWy4uLlRPS0VOX1ZBVUxUX0NSRURFTlRJQUxfU0VDUkVUX1JFQURfUEVSTVMsIC4uLlRPS0VOX1ZBVUxUX0NSRURFTlRJQUxfU0VDUkVUX1dSSVRFX1BFUk1TXSxcbiAgICApO1xuICAgIHJldHVybiBzZWNyZXQgPyBiZWRyb2NrLmNvbWJpbmUoc2VjcmV0KSA6IGJlZHJvY2s7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgYmluZEZvckdhdGV3YXlBcGlLZXlUYXJnZXQoKTogR2F0ZXdheUFwaUtleUlkZW50aXR5QmluZGluZztcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogTDIgY29uc3RydWN0IGZvciBgQVdTOjpCZWRyb2NrQWdlbnRDb3JlOjpBcGlLZXlDcmVkZW50aWFsUHJvdmlkZXJgLlxuICpcbiAqIFVzZSB0aGlzIHRvIHJlZ2lzdGVyIGFuIEFQSSBrZXkgaWRlbnRpdHkgaW4gQWdlbnRDb3JlIFRva2VuIFZhdWx0LiBUbyBhdHRhY2ggdGhlIGlkZW50aXR5IHRvIGFcbiAqIGdhdGV3YXkgdGFyZ2V0LCB1c2Uge0BsaW5rIEdhdGV3YXlDcmVkZW50aWFsUHJvdmlkZXIuZnJvbUFwaUtleUlkZW50aXR5fSB3aXRoIHRoaXMgY29uc3RydWN0LCBvclxuICoge0BsaW5rIEFwaUtleUNyZWRlbnRpYWxQcm92aWRlci5iaW5kRm9yR2F0ZXdheUFwaUtleVRhcmdldH0gd2l0aCB7QGxpbmsgR2F0ZXdheUNyZWRlbnRpYWxQcm92aWRlci5mcm9tQXBpS2V5SWRlbnRpdHlBcm59LlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FXU0Nsb3VkRm9ybWF0aW9uL2xhdGVzdC9Vc2VyR3VpZGUvYXdzLXJlc291cmNlLWJlZHJvY2thZ2VudGNvcmUtYXBpa2V5Y3JlZGVudGlhbHByb3ZpZGVyLmh0bWxcbiAqIEByZXNvdXJjZSBBV1M6OkJlZHJvY2tBZ2VudENvcmU6OkFwaUtleUNyZWRlbnRpYWxQcm92aWRlclxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyIGV4dGVuZHMgQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyQmFzZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWJlZHJvY2stYWdlbnRjb3JlLWFscGhhLkFwaUtleUNyZWRlbnRpYWxQcm92aWRlcic7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBBUEkga2V5IGNyZWRlbnRpYWwgcHJvdmlkZXIuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BcGlLZXlDcmVkZW50aWFsUHJvdmlkZXJBdHRyaWJ1dGVzKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBhdHRyczogQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyQXR0cmlidXRlcyxcbiAgKTogSUFwaUtleUNyZWRlbnRpYWxQcm92aWRlciB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyQmFzZSB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgY3JlZGVudGlhbFByb3ZpZGVyQXJuID0gYXR0cnMuY3JlZGVudGlhbFByb3ZpZGVyQXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGFwaUtleVNlY3JldEFybiA9IGF0dHJzLmFwaUtleVNlY3JldEFybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBjcmVhdGVkVGltZSA9IGF0dHJzLmNyZWF0ZWRUaW1lO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGxhc3RVcGRhdGVkVGltZSA9IGF0dHJzLmxhc3RVcGRhdGVkVGltZTtcblxuICAgICAgY29uc3RydWN0b3IoczogQ29uc3RydWN0LCBpOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIocywgaSk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBiaW5kRm9yR2F0ZXdheUFwaUtleVRhcmdldCgpOiBHYXRld2F5QXBpS2V5SWRlbnRpdHlCaW5kaW5nIHtcbiAgICAgICAgaWYgKHRoaXMuYXBpS2V5U2VjcmV0QXJuID09IG51bGwgfHwgdGhpcy5hcGlLZXlTZWNyZXRBcm4gPT09ICcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGxpdGBNaXNzaW5nQXBpS2V5U2VjcmV0QXJuYCxcbiAgICAgICAgICAgICdhcGlLZXlTZWNyZXRBcm4gaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIEFwaUtleUNyZWRlbnRpYWxQcm92aWRlciAoaW1wb3J0ZWQgcHJvdmlkZXJzIG11c3QgcGFzcyBhcGlLZXlTZWNyZXRBcm4gaW4gZnJvbUFwaUtleUNyZWRlbnRpYWxQcm92aWRlckF0dHJpYnV0ZXMpLicsXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm92aWRlckFybjogdGhpcy5jcmVkZW50aWFsUHJvdmlkZXJBcm4sXG4gICAgICAgICAgc2VjcmV0QXJuOiB0aGlzLmFwaUtleVNlY3JldEFybixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBjcmVkZW50aWFsUHJvdmlkZXJBcm46IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoaXMgQVBJIGtleSBjcmVkZW50aWFsIHByb3ZpZGVyLlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgY3JlYXRlZFRpbWU/OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBsYXN0VXBkYXRlZFRpbWU/OiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfYXBpS2V5U2VjcmV0QXJuPzogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9fcmVzb3VyY2U6IENmbkFwaUtleUNyZWRlbnRpYWxQcm92aWRlcjtcblxuICBwdWJsaWMgZ2V0IGFwaUtleVNlY3JldEFybigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLl9hcGlLZXlTZWNyZXRBcm4gPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5fYXBpS2V5U2VjcmV0QXJuID0gVG9rZW4uYXNTdHJpbmcodGhpcy5fX3Jlc291cmNlLmF0dHJBcGlLZXlTZWNyZXRBcm4pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXBpS2V5U2VjcmV0QXJuO1xuICB9XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IEFwaUtleUNyZWRlbnRpYWxQcm92aWRlclJlc291cmNlUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgcGh5c2ljYWxOYW1lOiBwcm9wcy5hcGlLZXlDcmVkZW50aWFsUHJvdmlkZXJOYW1lXG4gICAgICAgID8/IExhenkuc3RyaW5nKHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywgeyBtYXhMZW5ndGg6IDEyOCB9KSxcbiAgICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLmFwaUtleUNyZWRlbnRpYWxQcm92aWRlck5hbWUgPSB0aGlzLnBoeXNpY2FsTmFtZTtcblxuICAgIGNvbnN0IGFwaUtleVZhbHVlID0gcHJvcHMuYXBpS2V5Py51bnNhZmVVbndyYXAoKTtcblxuICAgIHRocm93SWZJbnZhbGlkKHZhbGlkYXRlQ3JlZGVudGlhbFByb3ZpZGVyTmFtZSwgdGhpcy5hcGlLZXlDcmVkZW50aWFsUHJvdmlkZXJOYW1lLCB0aGlzKTtcbiAgICB0aHJvd0lmSW52YWxpZCh2YWxpZGF0ZUFwaUtleVZhbHVlLCBhcGlLZXlWYWx1ZSwgdGhpcyk7XG4gICAgdGhyb3dJZkludmFsaWQodmFsaWRhdGVDcmVkZW50aWFsUHJvdmlkZXJUYWdzLCBwcm9wcy50YWdzLCB0aGlzKTtcblxuICAgIGNvbnN0IGNmblByb3BzOiBDZm5BcGlLZXlDcmVkZW50aWFsUHJvdmlkZXJQcm9wcyA9IHtcbiAgICAgIG5hbWU6IHRoaXMuYXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyTmFtZSxcbiAgICAgIGFwaUtleTogYXBpS2V5VmFsdWUsXG4gICAgICB0YWdzOiBwcm9wcy50YWdzICYmIE9iamVjdC5rZXlzKHByb3BzLnRhZ3MpLmxlbmd0aCA+IDBcbiAgICAgICAgPyBPYmplY3QuZW50cmllcyhwcm9wcy50YWdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gKHsga2V5LCB2YWx1ZSB9KSlcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIHRoaXMuX19yZXNvdXJjZSA9IG5ldyBDZm5BcGlLZXlDcmVkZW50aWFsUHJvdmlkZXIodGhpcywgJ1Jlc291cmNlJywgY2ZuUHJvcHMpO1xuXG4gICAgdGhpcy5jcmVkZW50aWFsUHJvdmlkZXJBcm4gPSB0aGlzLl9fcmVzb3VyY2UuYXR0ckNyZWRlbnRpYWxQcm92aWRlckFybjtcbiAgICB0aGlzLmNyZWF0ZWRUaW1lID0gdGhpcy5fX3Jlc291cmNlLmF0dHJDcmVhdGVkVGltZTtcbiAgICB0aGlzLmxhc3RVcGRhdGVkVGltZSA9IHRoaXMuX19yZXNvdXJjZS5hdHRyTGFzdFVwZGF0ZWRUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFSTnMgZm9yIHtAbGluayBHYXRld2F5Q3JlZGVudGlhbFByb3ZpZGVyLmZyb21BcGlLZXlJZGVudGl0eX0gLyB7QGxpbmsgR2F0ZXdheUNyZWRlbnRpYWxQcm92aWRlci5mcm9tQXBpS2V5SWRlbnRpdHlBcm59LlxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGJpbmRGb3JHYXRld2F5QXBpS2V5VGFyZ2V0KCk6IEdhdGV3YXlBcGlLZXlJZGVudGl0eUJpbmRpbmcge1xuICAgIGNvbnN0IHNlY3JldEFybiA9IHRoaXMuYXBpS2V5U2VjcmV0QXJuO1xuICAgIGlmIChzZWNyZXRBcm4gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YE1pc3NpbmdBcGlLZXlTZWNyZXRBcm5gLFxuICAgICAgICAnYXBpS2V5U2VjcmV0QXJuIGlzIG5vdCBhdmFpbGFibGUg4oCUIHRoZSBDbG91ZEZvcm1hdGlvbiBhdHRyaWJ1dGUgaGFzIG5vdCByZXNvbHZlZCB5ZXQuJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBwcm92aWRlckFybjogdGhpcy5jcmVkZW50aWFsUHJvdmlkZXJBcm4sXG4gICAgICBzZWNyZXRBcm4sXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
|
|
5
|
+
* with the License. A copy of the License is located at
|
|
6
|
+
*
|
|
7
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
*
|
|
9
|
+
* or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
|
|
10
|
+
* OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
|
|
11
|
+
* and limitations under the License.
|
|
12
|
+
*/
|
|
13
|
+
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
14
|
+
import type { IConstruct } from 'constructs';
|
|
15
|
+
/**
|
|
16
|
+
* Parent/collection resource ARN segments for Token Vault credential providers.
|
|
17
|
+
*
|
|
18
|
+
* Bedrock AgentCore uses a hierarchical authorization model where Get/List actions
|
|
19
|
+
* require IAM permission on the parent and collection resources in addition to the
|
|
20
|
+
* specific resource instance. For example, GetApiKeyCredentialProvider needs:
|
|
21
|
+
* - token-vault/default (vault)
|
|
22
|
+
* - token-vault/default/apikeycredentialprovider (collection)
|
|
23
|
+
* - token-vault/default/apikeycredentialprovider/* (instance)
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export declare const TOKEN_VAULT_API_KEY_PARENT_RESOURCES: readonly ["token-vault/default", "token-vault/default/apikeycredentialprovider"];
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
export declare const TOKEN_VAULT_OAUTH2_PARENT_RESOURCES: readonly ["token-vault/default", "token-vault/default/oauth2credentialprovider"];
|
|
32
|
+
/**
|
|
33
|
+
* @internal
|
|
34
|
+
*/
|
|
35
|
+
export declare const WORKLOAD_IDENTITY_PARENT_RESOURCES: readonly ["workload-identity-directory/default", "workload-identity-directory/default/workload-identity"];
|
|
36
|
+
/**
|
|
37
|
+
* Workload identity resource ARN segments required by data-plane actions
|
|
38
|
+
* (GetResourceApiKey, GetResourceOauth2Token, CompleteResourceTokenAuth).
|
|
39
|
+
*
|
|
40
|
+
* These actions require both the workload identity directory and a wildcard
|
|
41
|
+
* over workload identities because the specific identity is created dynamically
|
|
42
|
+
* by the gateway/service at runtime.
|
|
43
|
+
*
|
|
44
|
+
* @internal
|
|
45
|
+
*/
|
|
46
|
+
export declare const WORKLOAD_IDENTITY_USE_RESOURCES: readonly ["workload-identity-directory/default", "workload-identity-directory/default/workload-identity/*"];
|
|
47
|
+
/**
|
|
48
|
+
* Build the full set of resource ARNs for an identity grant: the instance ARN
|
|
49
|
+
* plus all parent/collection ARNs that the service's authorization model requires.
|
|
50
|
+
*
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
export declare function buildIdentityResourceArns(scope: IConstruct, instanceArn: string, parentResources: readonly string[]): string[];
|
|
54
|
+
/**
|
|
55
|
+
* Grant read and list permissions on a specific identity resource, including
|
|
56
|
+
* parent/collection ARNs required by the Bedrock AgentCore authorization model.
|
|
57
|
+
*
|
|
58
|
+
* @internal
|
|
59
|
+
*/
|
|
60
|
+
export declare function grantReadWithList(scope: IConstruct, grantee: iam.IGrantable, resourceArn: string, resourceReadActions: string[], listActions: string[], parentResources: readonly string[]): iam.Grant;
|
|
61
|
+
/**
|
|
62
|
+
* Grants Secrets Manager actions on the credential secret when an ARN is available
|
|
63
|
+
* (e.g. not omitted on import). Used for both read (GetSecretValue) and write
|
|
64
|
+
* (PutSecretValue) grants.
|
|
65
|
+
*
|
|
66
|
+
* The CFN attribute for the secret ARN (e.g. `attrApiKeySecretArn`) resolves to an
|
|
67
|
+
* object `{ SecretArn: string }` at deploy time, not a plain string, so the Token
|
|
68
|
+
* cannot be placed directly in IAM Resource fields. When the secret ARN is unresolved
|
|
69
|
+
* (Token), we fall back to a service-managed prefix wildcard. When a literal ARN is
|
|
70
|
+
* supplied (e.g. via `fromApiKeyCredentialProviderAttributes`), we scope tightly.
|
|
71
|
+
*
|
|
72
|
+
* @internal
|
|
73
|
+
*/
|
|
74
|
+
export declare function grantCredentialSecret(scope: IConstruct, grantee: iam.IGrantable, secretArn: string | undefined, secretActions: string[]): iam.Grant | undefined;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance
|
|
6
|
+
* with the License. A copy of the License is located at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* or in the 'license' file accompanying this file. This file is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES
|
|
11
|
+
* OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions
|
|
12
|
+
* and limitations under the License.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.WORKLOAD_IDENTITY_USE_RESOURCES = exports.WORKLOAD_IDENTITY_PARENT_RESOURCES = exports.TOKEN_VAULT_OAUTH2_PARENT_RESOURCES = exports.TOKEN_VAULT_API_KEY_PARENT_RESOURCES = void 0;
|
|
16
|
+
exports.buildIdentityResourceArns = buildIdentityResourceArns;
|
|
17
|
+
exports.grantReadWithList = grantReadWithList;
|
|
18
|
+
exports.grantCredentialSecret = grantCredentialSecret;
|
|
19
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
20
|
+
const iam = require("aws-cdk-lib/aws-iam");
|
|
21
|
+
/**
|
|
22
|
+
* Parent/collection resource ARN segments for Token Vault credential providers.
|
|
23
|
+
*
|
|
24
|
+
* Bedrock AgentCore uses a hierarchical authorization model where Get/List actions
|
|
25
|
+
* require IAM permission on the parent and collection resources in addition to the
|
|
26
|
+
* specific resource instance. For example, GetApiKeyCredentialProvider needs:
|
|
27
|
+
* - token-vault/default (vault)
|
|
28
|
+
* - token-vault/default/apikeycredentialprovider (collection)
|
|
29
|
+
* - token-vault/default/apikeycredentialprovider/* (instance)
|
|
30
|
+
*
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
exports.TOKEN_VAULT_API_KEY_PARENT_RESOURCES = [
|
|
34
|
+
'token-vault/default',
|
|
35
|
+
'token-vault/default/apikeycredentialprovider',
|
|
36
|
+
];
|
|
37
|
+
/**
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
exports.TOKEN_VAULT_OAUTH2_PARENT_RESOURCES = [
|
|
41
|
+
'token-vault/default',
|
|
42
|
+
'token-vault/default/oauth2credentialprovider',
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* @internal
|
|
46
|
+
*/
|
|
47
|
+
exports.WORKLOAD_IDENTITY_PARENT_RESOURCES = [
|
|
48
|
+
'workload-identity-directory/default',
|
|
49
|
+
'workload-identity-directory/default/workload-identity',
|
|
50
|
+
];
|
|
51
|
+
/**
|
|
52
|
+
* Workload identity resource ARN segments required by data-plane actions
|
|
53
|
+
* (GetResourceApiKey, GetResourceOauth2Token, CompleteResourceTokenAuth).
|
|
54
|
+
*
|
|
55
|
+
* These actions require both the workload identity directory and a wildcard
|
|
56
|
+
* over workload identities because the specific identity is created dynamically
|
|
57
|
+
* by the gateway/service at runtime.
|
|
58
|
+
*
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
exports.WORKLOAD_IDENTITY_USE_RESOURCES = [
|
|
62
|
+
'workload-identity-directory/default',
|
|
63
|
+
'workload-identity-directory/default/workload-identity/*',
|
|
64
|
+
];
|
|
65
|
+
/**
|
|
66
|
+
* Build the full set of resource ARNs for an identity grant: the instance ARN
|
|
67
|
+
* plus all parent/collection ARNs that the service's authorization model requires.
|
|
68
|
+
*
|
|
69
|
+
* @internal
|
|
70
|
+
*/
|
|
71
|
+
function buildIdentityResourceArns(scope, instanceArn, parentResources) {
|
|
72
|
+
const stack = aws_cdk_lib_1.Stack.of(scope);
|
|
73
|
+
const parentArns = parentResources.map(resource => stack.formatArn({
|
|
74
|
+
service: 'bedrock-agentcore',
|
|
75
|
+
resource,
|
|
76
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.NO_RESOURCE_NAME,
|
|
77
|
+
}));
|
|
78
|
+
return [instanceArn, ...parentArns];
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Grant read and list permissions on a specific identity resource, including
|
|
82
|
+
* parent/collection ARNs required by the Bedrock AgentCore authorization model.
|
|
83
|
+
*
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
function grantReadWithList(scope, grantee, resourceArn, resourceReadActions, listActions, parentResources) {
|
|
87
|
+
return iam.Grant.addToPrincipal({
|
|
88
|
+
grantee,
|
|
89
|
+
actions: [...resourceReadActions, ...listActions],
|
|
90
|
+
resourceArns: buildIdentityResourceArns(scope, resourceArn, parentResources),
|
|
91
|
+
scope,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Grants Secrets Manager actions on the credential secret when an ARN is available
|
|
96
|
+
* (e.g. not omitted on import). Used for both read (GetSecretValue) and write
|
|
97
|
+
* (PutSecretValue) grants.
|
|
98
|
+
*
|
|
99
|
+
* The CFN attribute for the secret ARN (e.g. `attrApiKeySecretArn`) resolves to an
|
|
100
|
+
* object `{ SecretArn: string }` at deploy time, not a plain string, so the Token
|
|
101
|
+
* cannot be placed directly in IAM Resource fields. When the secret ARN is unresolved
|
|
102
|
+
* (Token), we fall back to a service-managed prefix wildcard. When a literal ARN is
|
|
103
|
+
* supplied (e.g. via `fromApiKeyCredentialProviderAttributes`), we scope tightly.
|
|
104
|
+
*
|
|
105
|
+
* @internal
|
|
106
|
+
*/
|
|
107
|
+
function grantCredentialSecret(scope, grantee, secretArn, secretActions) {
|
|
108
|
+
if (secretArn == null || secretArn === '') {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
let secretResourceArns;
|
|
112
|
+
if (aws_cdk_lib_1.Token.isUnresolved(secretArn)) {
|
|
113
|
+
aws_cdk_lib_1.Annotations.of(scope).addWarningV2('@aws-cdk/aws-bedrock-agentcore-alpha:wildcardSecretArnGrant', 'The secret ARN is an unresolved token. Granting access using a wildcard prefix (bedrock-agentcore-identity!*). ' +
|
|
114
|
+
'To scope the grant to a specific secret, import the credential provider with an explicit secretArn.');
|
|
115
|
+
secretResourceArns = [aws_cdk_lib_1.Stack.of(scope).formatArn({
|
|
116
|
+
service: 'secretsmanager',
|
|
117
|
+
resource: 'secret',
|
|
118
|
+
resourceName: 'bedrock-agentcore-identity!*',
|
|
119
|
+
arnFormat: aws_cdk_lib_1.ArnFormat.COLON_RESOURCE_NAME,
|
|
120
|
+
})];
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
secretResourceArns = [secretArn];
|
|
124
|
+
}
|
|
125
|
+
return iam.Grant.addToPrincipal({
|
|
126
|
+
grantee,
|
|
127
|
+
actions: secretActions,
|
|
128
|
+
resourceArns: secretResourceArns,
|
|
129
|
+
scope,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhbnQtaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImdyYW50LWhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOzs7QUE0REgsOERBY0M7QUFRRCw4Q0FjQztBQWVELHNEQStCQztBQTVJRCw2Q0FBbUU7QUFDbkUsMkNBQTJDO0FBRzNDOzs7Ozs7Ozs7OztHQVdHO0FBQ1UsUUFBQSxvQ0FBb0MsR0FBRztJQUNsRCxxQkFBcUI7SUFDckIsOENBQThDO0NBQ3RDLENBQUM7QUFFWDs7R0FFRztBQUNVLFFBQUEsbUNBQW1DLEdBQUc7SUFDakQscUJBQXFCO0lBQ3JCLDhDQUE4QztDQUN0QyxDQUFDO0FBRVg7O0dBRUc7QUFDVSxRQUFBLGtDQUFrQyxHQUFHO0lBQ2hELHFDQUFxQztJQUNyQyx1REFBdUQ7Q0FDL0MsQ0FBQztBQUVYOzs7Ozs7Ozs7R0FTRztBQUNVLFFBQUEsK0JBQStCLEdBQUc7SUFDN0MscUNBQXFDO0lBQ3JDLHlEQUF5RDtDQUNqRCxDQUFDO0FBRVg7Ozs7O0dBS0c7QUFDSCxTQUFnQix5QkFBeUIsQ0FDdkMsS0FBaUIsRUFDakIsV0FBbUIsRUFDbkIsZUFBa0M7SUFFbEMsTUFBTSxLQUFLLEdBQUcsbUJBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUNoRCxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQ2QsT0FBTyxFQUFFLG1CQUFtQjtRQUM1QixRQUFRO1FBQ1IsU0FBUyxFQUFFLHVCQUFTLENBQUMsZ0JBQWdCO0tBQ3RDLENBQUMsQ0FDSCxDQUFDO0lBQ0YsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLFVBQVUsQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQWdCLGlCQUFpQixDQUMvQixLQUFpQixFQUNqQixPQUF1QixFQUN2QixXQUFtQixFQUNuQixtQkFBNkIsRUFDN0IsV0FBcUIsRUFDckIsZUFBa0M7SUFFbEMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztRQUM5QixPQUFPO1FBQ1AsT0FBTyxFQUFFLENBQUMsR0FBRyxtQkFBbUIsRUFBRSxHQUFHLFdBQVcsQ0FBQztRQUNqRCxZQUFZLEVBQUUseUJBQXlCLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUM7UUFDNUUsS0FBSztLQUNOLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFnQixxQkFBcUIsQ0FDbkMsS0FBaUIsRUFDakIsT0FBdUIsRUFDdkIsU0FBNkIsRUFDN0IsYUFBdUI7SUFFdkIsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUMxQyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxrQkFBNEIsQ0FBQztJQUNqQyxJQUFJLG1CQUFLLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDbEMseUJBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxDQUNoQyw2REFBNkQsRUFDN0QsaUhBQWlIO1lBQ2pILHFHQUFxRyxDQUN0RyxDQUFDO1FBQ0Ysa0JBQWtCLEdBQUcsQ0FBQyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQzlDLE9BQU8sRUFBRSxnQkFBZ0I7Z0JBQ3pCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixZQUFZLEVBQUUsOEJBQThCO2dCQUM1QyxTQUFTLEVBQUUsdUJBQVMsQ0FBQyxtQkFBbUI7YUFDekMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO1NBQU0sQ0FBQztRQUNOLGtCQUFrQixHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUM7UUFDOUIsT0FBTztRQUNQLE9BQU8sRUFBRSxhQUFhO1FBQ3RCLFlBQVksRUFBRSxrQkFBa0I7UUFDaEMsS0FBSztLQUNOLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICBDb3B5cmlnaHQgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS4gWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZVxuICogIHdpdGggdGhlIExpY2Vuc2UuIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiAgb3IgaW4gdGhlICdsaWNlbnNlJyBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVNcbiAqICBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9uc1xuICogIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgeyBBbm5vdGF0aW9ucywgQXJuRm9ybWF0LCBTdGFjaywgVG9rZW4gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBQYXJlbnQvY29sbGVjdGlvbiByZXNvdXJjZSBBUk4gc2VnbWVudHMgZm9yIFRva2VuIFZhdWx0IGNyZWRlbnRpYWwgcHJvdmlkZXJzLlxuICpcbiAqIEJlZHJvY2sgQWdlbnRDb3JlIHVzZXMgYSBoaWVyYXJjaGljYWwgYXV0aG9yaXphdGlvbiBtb2RlbCB3aGVyZSBHZXQvTGlzdCBhY3Rpb25zXG4gKiByZXF1aXJlIElBTSBwZXJtaXNzaW9uIG9uIHRoZSBwYXJlbnQgYW5kIGNvbGxlY3Rpb24gcmVzb3VyY2VzIGluIGFkZGl0aW9uIHRvIHRoZVxuICogc3BlY2lmaWMgcmVzb3VyY2UgaW5zdGFuY2UuIEZvciBleGFtcGxlLCBHZXRBcGlLZXlDcmVkZW50aWFsUHJvdmlkZXIgbmVlZHM6XG4gKiAgIC0gdG9rZW4tdmF1bHQvZGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhdWx0KVxuICogICAtIHRva2VuLXZhdWx0L2RlZmF1bHQvYXBpa2V5Y3JlZGVudGlhbHByb3ZpZGVyICAgIChjb2xsZWN0aW9uKVxuICogICAtIHRva2VuLXZhdWx0L2RlZmF1bHQvYXBpa2V5Y3JlZGVudGlhbHByb3ZpZGVyLyogIChpbnN0YW5jZSlcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFRPS0VOX1ZBVUxUX0FQSV9LRVlfUEFSRU5UX1JFU09VUkNFUyA9IFtcbiAgJ3Rva2VuLXZhdWx0L2RlZmF1bHQnLFxuICAndG9rZW4tdmF1bHQvZGVmYXVsdC9hcGlrZXljcmVkZW50aWFscHJvdmlkZXInLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IFRPS0VOX1ZBVUxUX09BVVRIMl9QQVJFTlRfUkVTT1VSQ0VTID0gW1xuICAndG9rZW4tdmF1bHQvZGVmYXVsdCcsXG4gICd0b2tlbi12YXVsdC9kZWZhdWx0L29hdXRoMmNyZWRlbnRpYWxwcm92aWRlcicsXG5dIGFzIGNvbnN0O1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV09SS0xPQURfSURFTlRJVFlfUEFSRU5UX1JFU09VUkNFUyA9IFtcbiAgJ3dvcmtsb2FkLWlkZW50aXR5LWRpcmVjdG9yeS9kZWZhdWx0JyxcbiAgJ3dvcmtsb2FkLWlkZW50aXR5LWRpcmVjdG9yeS9kZWZhdWx0L3dvcmtsb2FkLWlkZW50aXR5Jyxcbl0gYXMgY29uc3Q7XG5cbi8qKlxuICogV29ya2xvYWQgaWRlbnRpdHkgcmVzb3VyY2UgQVJOIHNlZ21lbnRzIHJlcXVpcmVkIGJ5IGRhdGEtcGxhbmUgYWN0aW9uc1xuICogKEdldFJlc291cmNlQXBpS2V5LCBHZXRSZXNvdXJjZU9hdXRoMlRva2VuLCBDb21wbGV0ZVJlc291cmNlVG9rZW5BdXRoKS5cbiAqXG4gKiBUaGVzZSBhY3Rpb25zIHJlcXVpcmUgYm90aCB0aGUgd29ya2xvYWQgaWRlbnRpdHkgZGlyZWN0b3J5IGFuZCBhIHdpbGRjYXJkXG4gKiBvdmVyIHdvcmtsb2FkIGlkZW50aXRpZXMgYmVjYXVzZSB0aGUgc3BlY2lmaWMgaWRlbnRpdHkgaXMgY3JlYXRlZCBkeW5hbWljYWxseVxuICogYnkgdGhlIGdhdGV3YXkvc2VydmljZSBhdCBydW50aW1lLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY29uc3QgV09SS0xPQURfSURFTlRJVFlfVVNFX1JFU09VUkNFUyA9IFtcbiAgJ3dvcmtsb2FkLWlkZW50aXR5LWRpcmVjdG9yeS9kZWZhdWx0JyxcbiAgJ3dvcmtsb2FkLWlkZW50aXR5LWRpcmVjdG9yeS9kZWZhdWx0L3dvcmtsb2FkLWlkZW50aXR5LyonLFxuXSBhcyBjb25zdDtcblxuLyoqXG4gKiBCdWlsZCB0aGUgZnVsbCBzZXQgb2YgcmVzb3VyY2UgQVJOcyBmb3IgYW4gaWRlbnRpdHkgZ3JhbnQ6IHRoZSBpbnN0YW5jZSBBUk5cbiAqIHBsdXMgYWxsIHBhcmVudC9jb2xsZWN0aW9uIEFSTnMgdGhhdCB0aGUgc2VydmljZSdzIGF1dGhvcml6YXRpb24gbW9kZWwgcmVxdWlyZXMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZElkZW50aXR5UmVzb3VyY2VBcm5zKFxuICBzY29wZTogSUNvbnN0cnVjdCxcbiAgaW5zdGFuY2VBcm46IHN0cmluZyxcbiAgcGFyZW50UmVzb3VyY2VzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gIGNvbnN0IHBhcmVudEFybnMgPSBwYXJlbnRSZXNvdXJjZXMubWFwKHJlc291cmNlID0+XG4gICAgc3RhY2suZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdiZWRyb2NrLWFnZW50Y29yZScsXG4gICAgICByZXNvdXJjZSxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0Lk5PX1JFU09VUkNFX05BTUUsXG4gICAgfSksXG4gICk7XG4gIHJldHVybiBbaW5zdGFuY2VBcm4sIC4uLnBhcmVudEFybnNdO1xufVxuXG4vKipcbiAqIEdyYW50IHJlYWQgYW5kIGxpc3QgcGVybWlzc2lvbnMgb24gYSBzcGVjaWZpYyBpZGVudGl0eSByZXNvdXJjZSwgaW5jbHVkaW5nXG4gKiBwYXJlbnQvY29sbGVjdGlvbiBBUk5zIHJlcXVpcmVkIGJ5IHRoZSBCZWRyb2NrIEFnZW50Q29yZSBhdXRob3JpemF0aW9uIG1vZGVsLlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JhbnRSZWFkV2l0aExpc3QoXG4gIHNjb3BlOiBJQ29uc3RydWN0LFxuICBncmFudGVlOiBpYW0uSUdyYW50YWJsZSxcbiAgcmVzb3VyY2VBcm46IHN0cmluZyxcbiAgcmVzb3VyY2VSZWFkQWN0aW9uczogc3RyaW5nW10sXG4gIGxpc3RBY3Rpb25zOiBzdHJpbmdbXSxcbiAgcGFyZW50UmVzb3VyY2VzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IGlhbS5HcmFudCB7XG4gIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgIGdyYW50ZWUsXG4gICAgYWN0aW9uczogWy4uLnJlc291cmNlUmVhZEFjdGlvbnMsIC4uLmxpc3RBY3Rpb25zXSxcbiAgICByZXNvdXJjZUFybnM6IGJ1aWxkSWRlbnRpdHlSZXNvdXJjZUFybnMoc2NvcGUsIHJlc291cmNlQXJuLCBwYXJlbnRSZXNvdXJjZXMpLFxuICAgIHNjb3BlLFxuICB9KTtcbn1cblxuLyoqXG4gKiBHcmFudHMgU2VjcmV0cyBNYW5hZ2VyIGFjdGlvbnMgb24gdGhlIGNyZWRlbnRpYWwgc2VjcmV0IHdoZW4gYW4gQVJOIGlzIGF2YWlsYWJsZVxuICogKGUuZy4gbm90IG9taXR0ZWQgb24gaW1wb3J0KS4gVXNlZCBmb3IgYm90aCByZWFkIChHZXRTZWNyZXRWYWx1ZSkgYW5kIHdyaXRlXG4gKiAoUHV0U2VjcmV0VmFsdWUpIGdyYW50cy5cbiAqXG4gKiBUaGUgQ0ZOIGF0dHJpYnV0ZSBmb3IgdGhlIHNlY3JldCBBUk4gKGUuZy4gYGF0dHJBcGlLZXlTZWNyZXRBcm5gKSByZXNvbHZlcyB0byBhblxuICogb2JqZWN0IGB7IFNlY3JldEFybjogc3RyaW5nIH1gIGF0IGRlcGxveSB0aW1lLCBub3QgYSBwbGFpbiBzdHJpbmcsIHNvIHRoZSBUb2tlblxuICogY2Fubm90IGJlIHBsYWNlZCBkaXJlY3RseSBpbiBJQU0gUmVzb3VyY2UgZmllbGRzLiBXaGVuIHRoZSBzZWNyZXQgQVJOIGlzIHVucmVzb2x2ZWRcbiAqIChUb2tlbiksIHdlIGZhbGwgYmFjayB0byBhIHNlcnZpY2UtbWFuYWdlZCBwcmVmaXggd2lsZGNhcmQuIFdoZW4gYSBsaXRlcmFsIEFSTiBpc1xuICogc3VwcGxpZWQgKGUuZy4gdmlhIGBmcm9tQXBpS2V5Q3JlZGVudGlhbFByb3ZpZGVyQXR0cmlidXRlc2ApLCB3ZSBzY29wZSB0aWdodGx5LlxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JhbnRDcmVkZW50aWFsU2VjcmV0KFxuICBzY29wZTogSUNvbnN0cnVjdCxcbiAgZ3JhbnRlZTogaWFtLklHcmFudGFibGUsXG4gIHNlY3JldEFybjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzZWNyZXRBY3Rpb25zOiBzdHJpbmdbXSxcbik6IGlhbS5HcmFudCB8IHVuZGVmaW5lZCB7XG4gIGlmIChzZWNyZXRBcm4gPT0gbnVsbCB8fCBzZWNyZXRBcm4gPT09ICcnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgc2VjcmV0UmVzb3VyY2VBcm5zOiBzdHJpbmdbXTtcbiAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChzZWNyZXRBcm4pKSB7XG4gICAgQW5ub3RhdGlvbnMub2Yoc2NvcGUpLmFkZFdhcm5pbmdWMihcbiAgICAgICdAYXdzLWNkay9hd3MtYmVkcm9jay1hZ2VudGNvcmUtYWxwaGE6d2lsZGNhcmRTZWNyZXRBcm5HcmFudCcsXG4gICAgICAnVGhlIHNlY3JldCBBUk4gaXMgYW4gdW5yZXNvbHZlZCB0b2tlbi4gR3JhbnRpbmcgYWNjZXNzIHVzaW5nIGEgd2lsZGNhcmQgcHJlZml4IChiZWRyb2NrLWFnZW50Y29yZS1pZGVudGl0eSEqKS4gJyArXG4gICAgICAnVG8gc2NvcGUgdGhlIGdyYW50IHRvIGEgc3BlY2lmaWMgc2VjcmV0LCBpbXBvcnQgdGhlIGNyZWRlbnRpYWwgcHJvdmlkZXIgd2l0aCBhbiBleHBsaWNpdCBzZWNyZXRBcm4uJyxcbiAgICApO1xuICAgIHNlY3JldFJlc291cmNlQXJucyA9IFtTdGFjay5vZihzY29wZSkuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdzZWNyZXRzbWFuYWdlcicsXG4gICAgICByZXNvdXJjZTogJ3NlY3JldCcsXG4gICAgICByZXNvdXJjZU5hbWU6ICdiZWRyb2NrLWFnZW50Y29yZS1pZGVudGl0eSEqJyxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgfSldO1xuICB9IGVsc2Uge1xuICAgIHNlY3JldFJlc291cmNlQXJucyA9IFtzZWNyZXRBcm5dO1xuICB9XG4gIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgIGdyYW50ZWUsXG4gICAgYWN0aW9uczogc2VjcmV0QWN0aW9ucyxcbiAgICByZXNvdXJjZUFybnM6IHNlY3JldFJlc291cmNlQXJucyxcbiAgICBzY29wZSxcbiAgfSk7XG59XG4iXX0=
|