@aws-cdk/aws-bedrock-agentcore-alpha 2.243.0-alpha.0 → 2.244.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 +70 -70
- package/.jsii.tabl.json.gz +0 -0
- package/lib/gateway/gateway-base.js +1 -1
- package/lib/gateway/gateway.js +9 -9
- package/lib/gateway/inbound-auth/authorizer.js +5 -5
- package/lib/gateway/inbound-auth/custom-claim.js +6 -6
- package/lib/gateway/interceptor.js +1 -1
- package/lib/gateway/outbound-auth/api-key.js +1 -1
- package/lib/gateway/outbound-auth/credential-provider.js +1 -1
- package/lib/gateway/protocol.js +2 -2
- package/lib/gateway/targets/schema/api-schema.js +6 -6
- package/lib/gateway/targets/schema/tool-schema.js +7 -7
- package/lib/gateway/targets/target-base.js +1 -1
- package/lib/gateway/targets/target-configuration.js +25 -25
- package/lib/gateway/targets/target.js +4 -4
- 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 +3 -3
- package/lib/network/network-configuration.js +4 -4
- package/lib/runtime/inbound-auth/custom-claim.js +6 -6
- package/lib/runtime/inbound-auth/runtime-authorizer-configuration.js +4 -4
- package/lib/runtime/runtime-artifact.js +5 -5
- package/lib/runtime/runtime-base.js +3 -3
- package/lib/runtime/runtime-endpoint-base.js +1 -1
- package/lib/runtime/runtime-endpoint.js +9 -9
- package/lib/runtime/runtime.js +20 -20
- package/lib/runtime/validation-helpers.js +2 -2
- package/lib/tools/browser.js +4 -4
- package/lib/tools/code-interpreter.js +4 -4
- package/lib/tools/validation-helpers.js +2 -2
- package/package.json +9 -9
|
@@ -18,7 +18,7 @@ const target_base_1 = require("./target-base");
|
|
|
18
18
|
* Provides common functionality for all MCP target types
|
|
19
19
|
*/
|
|
20
20
|
class McpTargetConfiguration {
|
|
21
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.McpTargetConfiguration", version: "2.
|
|
21
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.McpTargetConfiguration", version: "2.244.0-alpha.0" };
|
|
22
22
|
/**
|
|
23
23
|
* Renders the configuration as CloudFormation properties
|
|
24
24
|
* @internal
|
|
@@ -40,7 +40,7 @@ exports.McpTargetConfiguration = McpTargetConfiguration;
|
|
|
40
40
|
* allowing the gateway to invoke the function to provide tool capabilities.
|
|
41
41
|
*/
|
|
42
42
|
class LambdaTargetConfiguration extends McpTargetConfiguration {
|
|
43
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.LambdaTargetConfiguration", version: "2.
|
|
43
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.LambdaTargetConfiguration", version: "2.244.0-alpha.0" };
|
|
44
44
|
/**
|
|
45
45
|
* Create a Lambda target configuration
|
|
46
46
|
*
|
|
@@ -130,7 +130,7 @@ exports.LambdaTargetConfiguration = LambdaTargetConfiguration;
|
|
|
130
130
|
* allowing the gateway to transform API operations into tool calls.
|
|
131
131
|
*/
|
|
132
132
|
class OpenApiTargetConfiguration extends McpTargetConfiguration {
|
|
133
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.OpenApiTargetConfiguration", version: "2.
|
|
133
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.OpenApiTargetConfiguration", version: "2.244.0-alpha.0" };
|
|
134
134
|
/**
|
|
135
135
|
* Create an OpenAPI target configuration
|
|
136
136
|
*
|
|
@@ -198,7 +198,7 @@ class OpenApiTargetConfiguration extends McpTargetConfiguration {
|
|
|
198
198
|
schemaName: 'OpenAPI schema for target',
|
|
199
199
|
});
|
|
200
200
|
if (errors.length > 0) {
|
|
201
|
-
throw new errors_1.UnscopedValidationError(`OpenAPI schema validation failed:\n${errors.join('\n')}`);
|
|
201
|
+
throw new errors_1.UnscopedValidationError('OpenApiSchemaValidationFailed', `OpenAPI schema validation failed:\n${errors.join('\n')}`);
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
204
|
else if (this.apiSchema instanceof api_schema_1.AssetApiSchema) {
|
|
@@ -210,14 +210,14 @@ class OpenApiTargetConfiguration extends McpTargetConfiguration {
|
|
|
210
210
|
schemaName: `OpenAPI schema from file ${this.apiSchema._getFilePath()}`,
|
|
211
211
|
});
|
|
212
212
|
if (errors.length > 0) {
|
|
213
|
-
throw new errors_1.UnscopedValidationError(`OpenAPI schema validation failed:\n${errors.join('\n')}`);
|
|
213
|
+
throw new errors_1.UnscopedValidationError('OpenApiSchemaValidationFailed', `OpenAPI schema validation failed:\n${errors.join('\n')}`);
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
catch (e) {
|
|
217
217
|
if (e instanceof errors_1.ValidationError) {
|
|
218
218
|
throw e;
|
|
219
219
|
}
|
|
220
|
-
throw new errors_1.UnscopedValidationError(`Failed to read OpenAPI schema from ${this.apiSchema._getFilePath()}: ${e instanceof Error ? e.message : String(e)}`);
|
|
220
|
+
throw new errors_1.UnscopedValidationError('OpenApiSchemaFileReadFailed', `Failed to read OpenAPI schema from ${this.apiSchema._getFilePath()}: ${e instanceof Error ? e.message : String(e)}`);
|
|
221
221
|
}
|
|
222
222
|
}
|
|
223
223
|
// S3 schemas cannot be validated at synthesis time
|
|
@@ -248,7 +248,7 @@ exports.OpenApiTargetConfiguration = OpenApiTargetConfiguration;
|
|
|
248
248
|
* allowing the gateway to transform Smithy operations into tool calls.
|
|
249
249
|
*/
|
|
250
250
|
class SmithyTargetConfiguration extends McpTargetConfiguration {
|
|
251
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.SmithyTargetConfiguration", version: "2.
|
|
251
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.SmithyTargetConfiguration", version: "2.244.0-alpha.0" };
|
|
252
252
|
/**
|
|
253
253
|
* Create a Smithy target configuration
|
|
254
254
|
*
|
|
@@ -330,7 +330,7 @@ exports.SmithyTargetConfiguration = SmithyTargetConfiguration;
|
|
|
330
330
|
* synchronization.
|
|
331
331
|
*/
|
|
332
332
|
class McpServerTargetConfiguration extends McpTargetConfiguration {
|
|
333
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.McpServerTargetConfiguration", version: "2.
|
|
333
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.McpServerTargetConfiguration", version: "2.244.0-alpha.0" };
|
|
334
334
|
/**
|
|
335
335
|
* Create an MCP server target configuration
|
|
336
336
|
*
|
|
@@ -396,11 +396,11 @@ class McpServerTargetConfiguration extends McpTargetConfiguration {
|
|
|
396
396
|
}
|
|
397
397
|
const errors = (0, validation_helpers_1.validateFieldPattern)(endpoint, 'MCP server endpoint', /^https:\/\/.+/, 'MCP server endpoint must use HTTPS protocol (e.g., https://my-server.example.com). Ensure the URL is properly encoded.');
|
|
398
398
|
if (errors.length > 0) {
|
|
399
|
-
throw new errors_1.UnscopedValidationError(errors.join('\n'));
|
|
399
|
+
throw new errors_1.UnscopedValidationError('McpServerEndpointInvalid', errors.join('\n'));
|
|
400
400
|
}
|
|
401
401
|
// Additional helpful validation for common URL encoding issues
|
|
402
402
|
if (endpoint.includes(' ') || endpoint.includes('<') || endpoint.includes('>')) {
|
|
403
|
-
throw new errors_1.UnscopedValidationError('MCP server endpoint contains characters that should be URL-encoded. ' +
|
|
403
|
+
throw new errors_1.UnscopedValidationError('McpServerEndpointEncodingInvalid', 'MCP server endpoint contains characters that should be URL-encoded. ' +
|
|
404
404
|
'Please ensure the URL is properly encoded before passing to the construct.');
|
|
405
405
|
}
|
|
406
406
|
}
|
|
@@ -444,7 +444,7 @@ var ApiGatewayHttpMethod;
|
|
|
444
444
|
* - Proxy resources (e.g., `/pets/{proxy+}`) are not supported
|
|
445
445
|
*/
|
|
446
446
|
class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
447
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.ApiGatewayTargetConfiguration", version: "2.
|
|
447
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-bedrock-agentcore-alpha.ApiGatewayTargetConfiguration", version: "2.244.0-alpha.0" };
|
|
448
448
|
/**
|
|
449
449
|
* Create an API Gateway target configuration
|
|
450
450
|
*
|
|
@@ -583,7 +583,7 @@ class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
|
583
583
|
maxLength: 256,
|
|
584
584
|
});
|
|
585
585
|
if (restApiIdErrors.length > 0) {
|
|
586
|
-
throw new errors_1.UnscopedValidationError(restApiIdErrors.join('\n'));
|
|
586
|
+
throw new errors_1.UnscopedValidationError('RestApiIdInvalid', restApiIdErrors.join('\n'));
|
|
587
587
|
}
|
|
588
588
|
}
|
|
589
589
|
// Validate stage name (skip if token)
|
|
@@ -595,12 +595,12 @@ class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
|
595
595
|
maxLength: 128,
|
|
596
596
|
});
|
|
597
597
|
if (stageErrors.length > 0) {
|
|
598
|
-
throw new errors_1.UnscopedValidationError(stageErrors.join('\n'));
|
|
598
|
+
throw new errors_1.UnscopedValidationError('StageNameInvalid', stageErrors.join('\n'));
|
|
599
599
|
}
|
|
600
600
|
}
|
|
601
601
|
// Validate tool filters
|
|
602
602
|
if (!this.apiGatewayToolConfiguration.toolFilters || this.apiGatewayToolConfiguration.toolFilters.length === 0) {
|
|
603
|
-
throw new errors_1.UnscopedValidationError('At least one tool filter is required for API Gateway target configuration');
|
|
603
|
+
throw new errors_1.UnscopedValidationError('ToolFiltersRequired', 'At least one tool filter is required for API Gateway target configuration');
|
|
604
604
|
}
|
|
605
605
|
// Validate each tool filter
|
|
606
606
|
for (const filter of this.apiGatewayToolConfiguration.toolFilters) {
|
|
@@ -652,14 +652,14 @@ class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
|
652
652
|
}
|
|
653
653
|
// Check if array is empty
|
|
654
654
|
if (array.length === 0) {
|
|
655
|
-
throw new errors_1.UnscopedValidationError(`${fieldName} cannot be an empty array. It must contain at least ${minItems} item(s)`);
|
|
655
|
+
throw new errors_1.UnscopedValidationError('MetadataArrayEmpty', `${fieldName} cannot be an empty array. It must contain at least ${minItems} item(s)`);
|
|
656
656
|
}
|
|
657
657
|
// Check array size constraints
|
|
658
658
|
if (array.length < minItems) {
|
|
659
|
-
throw new errors_1.UnscopedValidationError(`${fieldName} must contain at least ${minItems} item(s). Found ${array.length} item(s)`);
|
|
659
|
+
throw new errors_1.UnscopedValidationError('MetadataArrayTooFew', `${fieldName} must contain at least ${minItems} item(s). Found ${array.length} item(s)`);
|
|
660
660
|
}
|
|
661
661
|
if (array.length > maxItems) {
|
|
662
|
-
throw new errors_1.UnscopedValidationError(`${fieldName} cannot exceed ${maxItems} items. Found ${array.length} items`);
|
|
662
|
+
throw new errors_1.UnscopedValidationError('MetadataArrayTooMany', `${fieldName} cannot exceed ${maxItems} items. Found ${array.length} items`);
|
|
663
663
|
}
|
|
664
664
|
// Validate each string in the array
|
|
665
665
|
array.forEach((item, index) => {
|
|
@@ -673,7 +673,7 @@ class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
|
673
673
|
maxLength: maxStringLength,
|
|
674
674
|
});
|
|
675
675
|
if (errors.length > 0) {
|
|
676
|
-
throw new errors_1.UnscopedValidationError(errors.join('\n'));
|
|
676
|
+
throw new errors_1.UnscopedValidationError('MetadataArrayItemInvalid', errors.join('\n'));
|
|
677
677
|
}
|
|
678
678
|
});
|
|
679
679
|
}
|
|
@@ -688,11 +688,11 @@ class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
|
688
688
|
// Validate filter path
|
|
689
689
|
const pathErrors = (0, validation_helpers_1.validateFieldPattern)(filter.filterPath, 'Filter path', /^\/[\w\-{}/*]*$/, 'Filter path must start with a forward slash and contain only alphanumeric characters, hyphens, underscores, curly braces, forward slashes, and asterisks');
|
|
690
690
|
if (pathErrors.length > 0) {
|
|
691
|
-
throw new errors_1.UnscopedValidationError(pathErrors.join('\n'));
|
|
691
|
+
throw new errors_1.UnscopedValidationError('ToolFilterPathInvalid', pathErrors.join('\n'));
|
|
692
692
|
}
|
|
693
693
|
// Validate methods
|
|
694
694
|
if (!filter.methods || filter.methods.length === 0) {
|
|
695
|
-
throw new errors_1.UnscopedValidationError(`At least one HTTP method is required for filter path: ${filter.filterPath}`);
|
|
695
|
+
throw new errors_1.UnscopedValidationError('ToolFilterMethodsRequired', `At least one HTTP method is required for filter path: ${filter.filterPath}`);
|
|
696
696
|
}
|
|
697
697
|
}
|
|
698
698
|
/**
|
|
@@ -705,13 +705,13 @@ class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
|
705
705
|
}
|
|
706
706
|
// Validate that override path is explicit (no wildcards)
|
|
707
707
|
if (override.path.includes('*')) {
|
|
708
|
-
throw new errors_1.UnscopedValidationError(`Tool override path cannot contain wildcards. Path: ${override.path}. ` +
|
|
708
|
+
throw new errors_1.UnscopedValidationError('ToolOverridePathWildcardNotAllowed', `Tool override path cannot contain wildcards. Path: ${override.path}. ` +
|
|
709
709
|
'Tool overrides must specify an explicit path that matches an existing operation in your API.');
|
|
710
710
|
}
|
|
711
711
|
// Validate override path format
|
|
712
712
|
const pathErrors = (0, validation_helpers_1.validateFieldPattern)(override.path, 'Override path', /^\/[\w\-{}/]*$/, 'Override path must start with a forward slash and contain only alphanumeric characters, hyphens, underscores, curly braces, and forward slashes');
|
|
713
713
|
if (pathErrors.length > 0) {
|
|
714
|
-
throw new errors_1.UnscopedValidationError(pathErrors.join('\n'));
|
|
714
|
+
throw new errors_1.UnscopedValidationError('ToolOverridePathInvalid', pathErrors.join('\n'));
|
|
715
715
|
}
|
|
716
716
|
// Validate override name
|
|
717
717
|
if (aws_cdk_lib_1.Token.isUnresolved(override.name)) {
|
|
@@ -724,7 +724,7 @@ class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
|
724
724
|
maxLength: 64,
|
|
725
725
|
});
|
|
726
726
|
if (nameErrors.length > 0) {
|
|
727
|
-
throw new errors_1.UnscopedValidationError(nameErrors.join('\n'));
|
|
727
|
+
throw new errors_1.UnscopedValidationError('ToolOverrideNameInvalid', nameErrors.join('\n'));
|
|
728
728
|
}
|
|
729
729
|
// Validate override description if provided
|
|
730
730
|
if (override.description && !aws_cdk_lib_1.Token.isUnresolved(override.description)) {
|
|
@@ -735,10 +735,10 @@ class ApiGatewayTargetConfiguration extends McpTargetConfiguration {
|
|
|
735
735
|
maxLength: 200,
|
|
736
736
|
});
|
|
737
737
|
if (descErrors.length > 0) {
|
|
738
|
-
throw new errors_1.UnscopedValidationError(descErrors.join('\n'));
|
|
738
|
+
throw new errors_1.UnscopedValidationError('ToolOverrideDescriptionInvalid', descErrors.join('\n'));
|
|
739
739
|
}
|
|
740
740
|
}
|
|
741
741
|
}
|
|
742
742
|
}
|
|
743
743
|
exports.ApiGatewayTargetConfiguration = ApiGatewayTargetConfiguration;
|
|
744
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YXJnZXQtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2Q0FBb0M7QUFFcEMsMkNBQTJDO0FBRTNDLHdEQUF1RjtBQUd2Riw4REFBeUc7QUFFekcsb0RBQXFEO0FBRXJELCtDQUE4QztBQXNDOUM7OytFQUUrRTtBQUUvRTs7O0dBR0c7QUFDSCxNQUFzQixzQkFBc0I7O0lBaUIxQzs7O09BR0c7SUFDSSxPQUFPO1FBQ1osT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7U0FDbkMsQ0FBQztLQUNIOztBQXpCSCx3REEwQkM7QUFFRDs7K0VBRStFO0FBRS9FOzs7OztHQUtHO0FBQ0gsTUFBYSx5QkFBMEIsU0FBUSxzQkFBc0I7O0lBQ25FOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQ2xCLGNBQXlCLEVBQ3pCLFVBQXNCOzs7Ozs7Ozs7O1FBRXRCLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FDbEU7SUFFZSxVQUFVLEdBQUcsMkJBQWEsQ0FBQyxNQUFNLENBQUM7SUFFbEQ7O09BRUc7SUFDYSxjQUFjLENBQVk7SUFFMUM7O09BRUc7SUFDYSxVQUFVLENBQWE7SUFFdkMsWUFBWSxjQUF5QixFQUFFLFVBQXNCO1FBQzNELEtBQUssRUFBRSxDQUFDOzs7Ozs7K0NBNUJDLHlCQUF5Qjs7OztRQTZCbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7S0FDOUI7SUFFRDs7Ozs7O09BTUc7SUFDSSxJQUFJLENBQUMsS0FBZ0IsRUFBRSxPQUFpQjs7Ozs7Ozs7OztRQUM3Qyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FB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QUUsUUFBUSxDQUFDLElBQUk7WUFDcEIsU0FBUyxFQUFFLG9CQUFvQjtZQUMvQixTQUFTLEVBQUUsQ0FBQztZQUNaLFNBQVMsRUFBRSxFQUFFO1NBQ2QsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxnQ0FBdUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUVELDRDQUE0QztRQUM1QyxJQUFJLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxtQkFBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN0RSxNQUFNLFVBQVUsR0FBRyxJQUFBLHdDQUFtQixFQUFDO2dCQUNyQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFdBQVc7Z0JBQzNCLFNBQVMsRUFBRSxzQkFBc0I7Z0JBQ2pDLFNBQVMsRUFBRSxDQUFDO2dCQUNaLFNBQVMsRUFBRSxHQUFHO2FBQ2YsQ0FBQyxDQUFDO1lBRUgsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUMxQixNQUFNLElBQUksZ0NBQXVCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO0tBQ0Y7O0FBdFdILHNFQXVXQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBJUmVzdEFwaSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgSUZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IsIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElHYXRld2F5IH0gZnJvbSAnLi4vZ2F0ZXdheS1iYXNlJztcbmltcG9ydCB7IHZhbGlkYXRlT3BlbkFwaVNjaGVtYSwgdmFsaWRhdGVGaWVsZFBhdHRlcm4sIHZhbGlkYXRlU3RyaW5nRmllbGQgfSBmcm9tICcuLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBBcGlTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS9hcGktc2NoZW1hJztcbmltcG9ydCB7IEFzc2V0QXBpU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEvYXBpLXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFRvb2xTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS90b29sLXNjaGVtYSc7XG5pbXBvcnQgeyBNY3BUYXJnZXRUeXBlIH0gZnJvbSAnLi90YXJnZXQtYmFzZSc7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHJldHVybmVkIGJ5IGJpbmRpbmcgYSB0YXJnZXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldENvbmZpZ3VyYXRpb25Db25maWcge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJvdW5kXG4gICAqL1xuICByZWFkb25seSBib3VuZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIHRhcmdldCB0eXBlXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRUeXBlOiBNY3BUYXJnZXRUeXBlO1xuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgY29uZmlndXJhdGlvbiB0byBhIGNvbnN0cnVjdCBzY29wZVxuICAgKiBTZXRzIHVwIHBlcm1pc3Npb25zIGFuZCBkZXBlbmRlbmNpZXNcbiAgICovXG4gIGJpbmQoc2NvcGU6IENvbnN0cnVjdCwgZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBjb25maWd1cmF0aW9uIGFzIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfcmVuZGVyKCk6IGFueTtcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBNQ1AgVGFyZ2V0IENvbmZpZ3VyYXRpb24gQmFzZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIE1DUCB0YXJnZXQgY29uZmlndXJhdGlvbnNcbiAqIFByb3ZpZGVzIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciBhbGwgTUNQIHRhcmdldCB0eXBlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWNwVGFyZ2V0Q29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgdHlwZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhcmdldFR5cGU6IE1jcFRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgcGVybWlzc2lvbnMgYW5kIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGJpbmQoc2NvcGU6IENvbnN0cnVjdCwgZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55O1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBjb25maWd1cmF0aW9uIGFzIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlcigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtY3A6IHRoaXMucmVuZGVyTWNwQ29uZmlndXJhdGlvbigpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBMYW1iZGEgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBMYW1iZGEtYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gd3JhcHMgYSBMYW1iZGEgZnVuY3Rpb24gYXMgTUNQIHRvb2xzLFxuICogYWxsb3dpbmcgdGhlIGdhdGV3YXkgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB0byBwcm92aWRlIHRvb2wgY2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhVGFyZ2V0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1jcFRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgTGFtYmRhIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFGdW5jdGlvbiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIGludm9rZVxuICAgKiBAcGFyYW0gdG9vbFNjaGVtYSBUaGUgc2NoZW1hIGRlZmluaW5nIHRoZSB0b29sc1xuICAgKiBAcmV0dXJucyBBIG5ldyBMYW1iZGFUYXJnZXRDb25maWd1cmF0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShcbiAgICBsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uLFxuICAgIHRvb2xTY2hlbWE6IFRvb2xTY2hlbWEsXG4gICk6IExhbWJkYVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgTGFtYmRhVGFyZ2V0Q29uZmlndXJhdGlvbihsYW1iZGFGdW5jdGlvbiwgdG9vbFNjaGVtYSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0VHlwZSA9IE1jcFRhcmdldFR5cGUuTEFNQkRBO1xuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUgTUNQIHNlcnZlciBsb2dpY1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIHNjaGVtYSB0aGF0IGRlZmluZXMgdGhlIGF2YWlsYWJsZSB0b29sc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRvb2xTY2hlbWE6IFRvb2xTY2hlbWE7XG5cbiAgY29uc3RydWN0b3IobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbiwgdG9vbFNjaGVtYTogVG9vbFNjaGVtYSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IGxhbWJkYUZ1bmN0aW9uO1xuICAgIHRoaXMudG9vbFNjaGVtYSA9IHRvb2xTY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhpcyBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheSB0byBpbnZva2UgdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gZ2F0ZXdheSBUaGUgZ2F0ZXdheSB0aGF0IHdpbGwgdXNlIHRoaXMgdGFyZ2V0XG4gICAqL1xuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWcge1xuICAgIC8vIEJpbmQgdGhlIHRvb2wgc2NoZW1hXG4gICAgdGhpcy50b29sU2NoZW1hLmJpbmQoc2NvcGUpO1xuICAgIC8vIEdyYW50IHBlcm1pc3Npb25zIHRvIGdhdGV3YXkgcm9sZVxuICAgIHRoaXMudG9vbFNjaGVtYS5ncmFudFBlcm1pc3Npb25zVG9Sb2xlKGdhdGV3YXkucm9sZSk7XG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbi5ncmFudEludm9rZShnYXRld2F5LnJvbGUpO1xuXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFtYmRhOiB7XG4gICAgICAgIGxhbWJkYUFybjogdGhpcy5sYW1iZGFGdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICAgICAgdG9vbFNjaGVtYTogdGhpcy50b29sU2NoZW1hLl9yZW5kZXIoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIE9wZW5BUEkgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBPcGVuQVBJLWJhc2VkIE1DUCB0YXJnZXRzXG4gKlxuICogVGhpcyBjb25maWd1cmF0aW9uIGV4cG9zZXMgYW4gT3BlbkFQSS9SRVNUIEFQSSBhcyBNQ1AgdG9vbHMsXG4gKiBhbGxvd2luZyB0aGUgZ2F0ZXdheSB0byB0cmFuc2Zvcm0gQVBJIG9wZXJhdGlvbnMgaW50byB0b29sIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgT3BlbkFwaVRhcmdldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBPcGVuQVBJIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBhcGlTY2hlbWEgVGhlIE9wZW5BUEkgc2NoZW1hXG4gICAqIEBwYXJhbSB2YWxpZGF0ZVNjaGVtYSBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBPcGVuQVBJIHNjaGVtYSAob25seSBhcHBsaWVzIHRvIGlubGluZSBzY2hlbWFzKVxuICAgKiBAcmV0dXJucyBBIG5ldyBPcGVuQXBpVGFyZ2V0Q29uZmlndXJhdGlvbiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoYXBpU2NoZW1hOiBBcGlTY2hlbWEsIHZhbGlkYXRlU2NoZW1hPzogYm9vbGVhbik6IE9wZW5BcGlUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE9wZW5BcGlUYXJnZXRDb25maWd1cmF0aW9uKGFwaVNjaGVtYSwgdmFsaWRhdGVTY2hlbWEpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFR5cGUgPSBNY3BUYXJnZXRUeXBlLk9QRU5BUElfU0NIRU1BO1xuXG4gIC8qKlxuICAgKiBUaGUgT3BlbkFQSSBzY2hlbWEgdGhhdCBkZWZpbmVzIHRoZSBBUElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGlTY2hlbWE6IEFwaVNjaGVtYTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB2YWxpZGF0ZSB0aGUgT3BlbkFQSSBzY2hlbWFcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkVmFsaWRhdGVTY2hlbWE6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYXBpU2NoZW1hOiBBcGlTY2hlbWEsIHZhbGlkYXRlU2NoZW1hPzogYm9vbGVhbikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcGlTY2hlbWEgPSBhcGlTY2hlbWE7XG4gICAgdGhpcy5zaG91bGRWYWxpZGF0ZVNjaGVtYSA9IHZhbGlkYXRlU2NoZW1hID8/IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhpcyBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheSB0byBhY2Nlc3MgdGhlIEFQSSBzY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGdhdGV3YXkgVGhlIGdhdGV3YXkgdGhhdCB3aWxsIHVzZSB0aGlzIHRhcmdldFxuICAgKi9cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCwgZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnIHtcbiAgICBpZiAodGhpcy5zaG91bGRWYWxpZGF0ZVNjaGVtYSkge1xuICAgICAgLy8gRm9yIGlubGluZSBzY2hlbWFzXG4gICAgICBpZiAodGhpcy5hcGlTY2hlbWEuaW5saW5lU2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlT3BlbkFwaVNjaGVtYSh7XG4gICAgICAgICAgc2NoZW1hOiB0aGlzLmFwaVNjaGVtYS5pbmxpbmVTY2hlbWEsXG4gICAgICAgICAgc2NoZW1hTmFtZTogJ09wZW5BUEkgc2NoZW1hIGZvciB0YXJnZXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGBPcGVuQVBJIHNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZDpcXG4ke2Vycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwaVNjaGVtYSBpbnN0YW5jZW9mIEFzc2V0QXBpU2NoZW1hKSB7XG4gICAgICAgIC8vIEZvciBhc3NldCBzY2hlbWFzIChsb2NhbCBmaWxlcylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzY2hlbWFDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9wZW5BcGlTY2hlbWEoe1xuICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFDb250ZW50LFxuICAgICAgICAgICAgc2NoZW1hTmFtZTogYE9wZW5BUEkgc2NoZW1hIGZyb20gZmlsZSAke3RoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoYE9wZW5BUEkgc2NoZW1hIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7ZXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgT3BlbkFQSSBzY2hlbWEgZnJvbSAke3RoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpfTogJHtlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTMyBzY2hlbWFzIGNhbm5vdCBiZSB2YWxpZGF0ZWQgYXQgc3ludGhlc2lzIHRpbWVcbiAgICB9XG5cbiAgICAvLyBCaW5kIHRoZSBBUEkgc2NoZW1hXG4gICAgdGhpcy5hcGlTY2hlbWEuYmluZChzY29wZSk7XG4gICAgLy8gR3JhbnQgcGVybWlzc2lvbnMgdG8gZ2F0ZXdheSByb2xlIGlmIHNjaGVtYSBpcyBpbiBTM1xuICAgIHRoaXMuYXBpU2NoZW1hLmdyYW50UGVybWlzc2lvbnNUb1JvbGUoZ2F0ZXdheS5yb2xlKTtcblxuICAgIHJldHVybiB7IGJvdW5kOiB0cnVlIH07XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgTUNQLXNwZWNpZmljIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXJNY3BDb25maWd1cmF0aW9uKCk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZW5BcGlTY2hlbWE6IHRoaXMuYXBpU2NoZW1hLl9yZW5kZXIoKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgU21pdGh5IFRhcmdldCBDb25maWd1cmF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgU21pdGh5LWJhc2VkIE1DUCB0YXJnZXRzXG4gKlxuICogVGhpcyBjb25maWd1cmF0aW9uIGV4cG9zZXMgYSBTbWl0aHktbW9kZWxlZCBBUEkgYXMgTUNQIHRvb2xzLFxuICogYWxsb3dpbmcgdGhlIGdhdGV3YXkgdG8gdHJhbnNmb3JtIFNtaXRoeSBvcGVyYXRpb25zIGludG8gdG9vbCBjYWxscy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNtaXRoeVRhcmdldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIFNtaXRoeSB0YXJnZXQgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gc21pdGh5TW9kZWwgVGhlIFNtaXRoeSBtb2RlbCBzY2hlbWFcbiAgICogQHJldHVybnMgQSBuZXcgU21pdGh5VGFyZ2V0Q29uZmlndXJhdGlvbiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoc21pdGh5TW9kZWw6IEFwaVNjaGVtYSk6IFNtaXRoeVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgU21pdGh5VGFyZ2V0Q29uZmlndXJhdGlvbihzbWl0aHlNb2RlbCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0VHlwZSA9IE1jcFRhcmdldFR5cGUuU01JVEhZX01PREVMO1xuXG4gIC8qKlxuICAgKiBUaGUgU21pdGh5IG1vZGVsIHRoYXQgZGVmaW5lcyB0aGUgQVBJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc21pdGh5TW9kZWw6IEFwaVNjaGVtYTtcblxuICBjb25zdHJ1Y3RvcihzbWl0aHlNb2RlbDogQXBpU2NoZW1hKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNtaXRoeU1vZGVsID0gc21pdGh5TW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhpcyBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheSB0byBhY2Nlc3MgdGhlIFNtaXRoeSBtb2RlbFxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gZ2F0ZXdheSBUaGUgZ2F0ZXdheSB0aGF0IHdpbGwgdXNlIHRoaXMgdGFyZ2V0XG4gICAqL1xuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWcge1xuICAgIC8vIEJpbmQgdGhlIFNtaXRoeSBtb2RlbFxuICAgIHRoaXMuc21pdGh5TW9kZWwuYmluZChzY29wZSk7XG4gICAgLy8gR3JhbnQgcGVybWlzc2lvbnMgdG8gZ2F0ZXdheSByb2xlIGlmIHNjaGVtYSBpcyBpbiBTM1xuICAgIHRoaXMuc21pdGh5TW9kZWwuZ3JhbnRQZXJtaXNzaW9uc1RvUm9sZShnYXRld2F5LnJvbGUpO1xuXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgc21pdGh5TW9kZWw6IHRoaXMuc21pdGh5TW9kZWwuX3JlbmRlcigpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBNQ1AgU2VydmVyIFRhcmdldCBDb25maWd1cmF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgTUNQIFNlcnZlci1iYXNlZCB0YXJnZXRzXG4gKlxuICogTUNQIChNb2RlbCBDb250ZXh0IFByb3RvY29sKSBzZXJ2ZXJzIHByb3ZpZGUgdG9vbHMsIGRhdGEgYWNjZXNzLCBhbmQgY3VzdG9tXG4gKiBmdW5jdGlvbnMgZm9yIEFJIGFnZW50cy4gV2hlbiB5b3UgY29uZmlndXJlIGFuIE1DUCBzZXJ2ZXIgYXMgYSBnYXRld2F5IHRhcmdldCxcbiAqIHRoZSBnYXRld2F5IGF1dG9tYXRpY2FsbHkgZGlzY292ZXJzIGFuZCBpbmRleGVzIGF2YWlsYWJsZSB0b29scyB0aHJvdWdoXG4gKiBzeW5jaHJvbml6YXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBNY3BTZXJ2ZXJUYXJnZXRDb25maWd1cmF0aW9uIGV4dGVuZHMgTWNwVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gTUNQIHNlcnZlciB0YXJnZXQgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gZW5kcG9pbnQgVGhlIEhUVFBTIGVuZHBvaW50IFVSTCBvZiB0aGUgTUNQIHNlcnZlclxuICAgKiBAcmV0dXJucyBBIG5ldyBNY3BTZXJ2ZXJUYXJnZXRDb25maWd1cmF0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShlbmRwb2ludDogc3RyaW5nKTogTWNwU2VydmVyVGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBNY3BTZXJ2ZXJUYXJnZXRDb25maWd1cmF0aW9uKGVuZHBvaW50KTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRUeXBlID0gTWNwVGFyZ2V0VHlwZS5NQ1BfU0VSVkVSO1xuXG4gIC8qKlxuICAgKiBUaGUgSFRUUFMgZW5kcG9pbnQgVVJMIG9mIHRoZSBNQ1Agc2VydmVyXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihlbmRwb2ludDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7XG4gICAgdGhpcy52YWxpZGF0ZUVuZHBvaW50KGVuZHBvaW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogTm8gYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBhcmUgbmVlZGVkIGZvciBNQ1Agc2VydmVyIHRhcmdldHNcbiAgICpcbiAgICogQHBhcmFtIF9zY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBfZ2F0ZXdheSBUaGUgZ2F0ZXdheSB0aGF0IHdpbGwgdXNlIHRoaXMgdGFyZ2V0XG4gICAqL1xuICBwdWJsaWMgYmluZChfc2NvcGU6IENvbnN0cnVjdCwgX2dhdGV3YXk6IElHYXRld2F5KTogVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gICAgLy8gTUNQIHNlcnZlciB0YXJnZXRzIGRvbid0IHJlcXVpcmUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBzZXR1cFxuICAgIC8vIEF1dGhlbnRpY2F0aW9uIGlzIGhhbmRsZWQgdGhyb3VnaCBjcmVkZW50aWFsIHByb3ZpZGVyIGNvbmZpZ3VyYXRpb25zXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWNwU2VydmVyOiB7XG4gICAgICAgIGVuZHBvaW50OiB0aGlzLmVuZHBvaW50LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyB0aGUgTUNQIHNlcnZlciBlbmRwb2ludFxuICAgKiAtIE11c3QgdXNlIEhUVFBTIHByb3RvY29sXG4gICAqIC0gU2hvdWxkIGJlIHByb3Blcmx5IFVSTCBlbmNvZGVkXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgZW5kcG9pbnQgVVJMIHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3MgVmFsaWRhdGlvbkVycm9yIGlmIHRoZSBlbmRwb2ludCBpcyBpbnZhbGlkXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUVuZHBvaW50KGVuZHBvaW50OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGVuZHBvaW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICAgICAgZW5kcG9pbnQsXG4gICAgICAnTUNQIHNlcnZlciBlbmRwb2ludCcsXG4gICAgICAvXmh0dHBzOlxcL1xcLy4rLyxcbiAgICAgICdNQ1Agc2VydmVyIGVuZHBvaW50IG11c3QgdXNlIEhUVFBTIHByb3RvY29sIChlLmcuLCBodHRwczovL215LXNlcnZlci5leGFtcGxlLmNvbSkuIEVuc3VyZSB0aGUgVVJMIGlzIHByb3Blcmx5IGVuY29kZWQuJyxcbiAgICApO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpdGlvbmFsIGhlbHBmdWwgdmFsaWRhdGlvbiBmb3IgY29tbW9uIFVSTCBlbmNvZGluZyBpc3N1ZXNcbiAgICBpZiAoZW5kcG9pbnQuaW5jbHVkZXMoJyAnKSB8fCBlbmRwb2ludC5pbmNsdWRlcygnPCcpIHx8IGVuZHBvaW50LmluY2x1ZGVzKCc+JykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgJ01DUCBzZXJ2ZXIgZW5kcG9pbnQgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZSBVUkwtZW5jb2RlZC4gJyArXG4gICAgICAgICdQbGVhc2UgZW5zdXJlIHRoZSBVUkwgaXMgcHJvcGVybHkgZW5jb2RlZCBiZWZvcmUgcGFzc2luZyB0byB0aGUgY29uc3RydWN0LicsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIEFQSSBHYXRld2F5IFRhcmdldCBDb25maWd1cmF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogSFRUUCBtZXRob2RzIHN1cHBvcnRlZCBieSBBUEkgR2F0ZXdheVxuICovXG5leHBvcnQgZW51bSBBcGlHYXRld2F5SHR0cE1ldGhvZCB7XG4gIC8qKiBHRVQgbWV0aG9kICovXG4gIEdFVCA9ICdHRVQnLFxuICAvKiogUE9TVCBtZXRob2QgKi9cbiAgUE9TVCA9ICdQT1NUJyxcbiAgLyoqIFBVVCBtZXRob2QgKi9cbiAgUFVUID0gJ1BVVCcsXG4gIC8qKiBERUxFVEUgbWV0aG9kICovXG4gIERFTEVURSA9ICdERUxFVEUnLFxuICAvKiogUEFUQ0ggbWV0aG9kICovXG4gIFBBVENIID0gJ1BBVENIJyxcbiAgLyoqIEhFQUQgbWV0aG9kICovXG4gIEhFQUQgPSAnSEVBRCcsXG4gIC8qKiBPUFRJT05TIG1ldGhvZCAqL1xuICBPUFRJT05TID0gJ09QVElPTlMnLFxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGZpbHRlcmluZyBBUEkgR2F0ZXdheSB0b29sc1xuICpcbiAqIFRvb2wgZmlsdGVycyBhbGxvdyB5b3UgdG8gc2VsZWN0IFJFU1QgQVBJIG9wZXJhdGlvbnMgdXNpbmcgcGF0aCBhbmQgbWV0aG9kIGNvbWJpbmF0aW9ucy5cbiAqIEVhY2ggZmlsdGVyIHN1cHBvcnRzIHR3byBwYXRoIG1hdGNoaW5nIHN0cmF0ZWdpZXM6XG4gKiAtICoqRXhwbGljaXQgcGF0aHMqKjogTWF0Y2hlcyBhIHNpbmdsZSBzcGVjaWZpYyBwYXRoLCBzdWNoIGFzIGAvcGV0cy97cGV0SWR9YFxuICogLSAqKldpbGRjYXJkIHBhdGhzKio6IE1hdGNoZXMgYWxsIHBhdGhzIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIHN1Y2ggYXMgYC9wZXRzLypgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpR2F0ZXdheVRvb2xGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBhdGggdG8gZmlsdGVyXG4gICAqIENhbiBiZSBhbiBleHBsaWNpdCBwYXRoIChlLmcuLCBgL3BldHMve3BldElkfWApIG9yIGEgd2lsZGNhcmQgcGF0aCAoZS5nLiwgYC9wZXRzLypgKVxuICAgKiBNdXN0IHN0YXJ0IHdpdGggYSBmb3J3YXJkIHNsYXNoXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgSFRUUCBtZXRob2RzIHRvIGluY2x1ZGUgZm9yIHRoaXMgcGF0aFxuICAgKiBFYWNoIGZpbHRlciBzcGVjaWZpZXMgYm90aCBhIHBhdGggYW5kIGEgbGlzdCBvZiBIVFRQIG1ldGhvZHNcbiAgICogTXVsdGlwbGUgZmlsdGVycyBjYW4gb3ZlcmxhcCBhbmQgZHVwbGljYXRlcyBhcmUgYXV0b21hdGljYWxseSBkZS1kdXBsaWNhdGVkXG4gICAqL1xuICByZWFkb25seSBtZXRob2RzOiBBcGlHYXRld2F5SHR0cE1ldGhvZFtdO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIG92ZXJyaWRpbmcgQVBJIEdhdGV3YXkgdG9vbCBtZXRhZGF0YVxuICpcbiAqIFRvb2wgb3ZlcnJpZGVzIGFsbG93IHlvdSB0byBjdXN0b21pemUgdGhlIHRvb2wgbmFtZSBvciBkZXNjcmlwdGlvbiBmb3Igc3BlY2lmaWMgb3BlcmF0aW9uc1xuICogYWZ0ZXIgZmlsdGVyaW5nLiBFYWNoIG92ZXJyaWRlIG11c3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBwYXRoIGFuZCBhIHNpbmdsZSBIVFRQIG1ldGhvZC5cbiAqIFRoZSBvdmVycmlkZSBtdXN0IG1hdGNoIGFuIG9wZXJhdGlvbiB0aGF0IGV4aXN0cyBpbiB5b3VyIEFQSSBhbmQgbXVzdCBjb3JyZXNwb25kIHRvIG9uZVxuICogb2YgdGhlIG9wZXJhdGlvbnMgcmVzb2x2ZWQgYnkgeW91ciBmaWx0ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUdhdGV3YXlUb29sT3ZlcnJpZGUge1xuICAvKipcbiAgICogVGhlIGV4cGxpY2l0IHJlc291cmNlIHBhdGggKG5vIHdpbGRjYXJkcylcbiAgICogTXVzdCBtYXRjaCBhbiBvcGVyYXRpb24gdGhhdCBleGlzdHMgaW4geW91ciBBUElcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kIGZvciB0aGlzIG92ZXJyaWRlXG4gICAqIE11c3QgYmUgYSBzaW5nbGUgbWV0aG9kIChubyB3aWxkY2FyZHMpXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IEFwaUdhdGV3YXlIdHRwTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHRvb2wgbmFtZVxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBvcGVyYXRpb25JZCBmcm9tIHRoZSBPcGVuQVBJIGRlZmluaXRpb24gd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGN1c3RvbSBkZXNjcmlwdGlvbiBmb3IgdGhlIHRvb2xcbiAgICogQGRlZmF1bHQgLSBObyBjdXN0b20gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBhc3NpbmcgbWV0YWRhdGEgKGhlYWRlcnMgYW5kIHF1ZXJ5IHBhcmFtZXRlcnMpIHRvIHRoZSBBUEkgR2F0ZXdheSB0YXJnZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTGlzdCBvZiBxdWVyeSBwYXJhbWV0ZXIgbmFtZXMgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSB0YXJnZXRcbiAgICpcbiAgICogQ29uc3RyYWludHM6XG4gICAqIC0gQXJyYXkgbXVzdCBjb250YWluIDEtMTAgaXRlbXNcbiAgICogLSBFYWNoIHBhcmFtZXRlciBuYW1lIG11c3QgYmUgMS00MCBjaGFyYWN0ZXJzXG4gICAqIC0gQ2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcXVlcnkgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRocm91Z2hcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRRdWVyeVBhcmFtZXRlcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiByZXF1ZXN0IGhlYWRlciBuYW1lcyB0byBwYXNzIHRocm91Z2ggdG8gdGhlIHRhcmdldFxuICAgKlxuICAgKiBDb25zdHJhaW50czpcbiAgICogLSBBcnJheSBtdXN0IGNvbnRhaW4gMS0xMCBpdGVtc1xuICAgKiAtIEVhY2ggaGVhZGVyIG5hbWUgbXVzdCBiZSAxLTEwMCBjaGFyYWN0ZXJzXG4gICAqIC0gQ2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVxdWVzdCBoZWFkZXJzIGFyZSBwYXNzZWQgdGhyb3VnaFxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFJlcXVlc3RIZWFkZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcmVzcG9uc2UgaGVhZGVyIG5hbWVzIHRvIHBhc3MgdGhyb3VnaCBmcm9tIHRoZSB0YXJnZXRcbiAgICpcbiAgICogQ29uc3RyYWludHM6XG4gICAqIC0gQXJyYXkgbXVzdCBjb250YWluIDEtMTAgaXRlbXNcbiAgICogLSBFYWNoIGhlYWRlciBuYW1lIG11c3QgYmUgMS0xMDAgY2hhcmFjdGVyc1xuICAgKiAtIENhbm5vdCBiZSBhbiBlbXB0eSBhcnJheVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHJlc3BvbnNlIGhlYWRlcnMgYXJlIHBhc3NlZCB0aHJvdWdoXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkUmVzcG9uc2VIZWFkZXJzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgQVBJIEdhdGV3YXkgdG9vbHNcbiAqXG4gKiBUaGUgQVBJIEdhdGV3YXkgdG9vbCBjb25maWd1cmF0aW9uIGRlZmluZXMgd2hpY2ggb3BlcmF0aW9ucyBmcm9tIHlvdXIgUkVTVCBBUElcbiAqIGFyZSBleHBvc2VkIGFzIHRvb2xzLiBJdCByZXF1aXJlcyBhIGxpc3Qgb2YgdG9vbCBmaWx0ZXJzIHRvIHNlbGVjdCBvcGVyYXRpb25zXG4gKiB0byBleHBvc2UsIGFuZCBvcHRpb25hbGx5IGFjY2VwdHMgdG9vbCBvdmVycmlkZXMgdG8gY3VzdG9taXplIHRvb2wgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgdG9vbCBmaWx0ZXJzIHRvIHNlbGVjdCBvcGVyYXRpb25zXG4gICAqIEF0IGxlYXN0IG9uZSBmaWx0ZXIgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xGaWx0ZXJzOiBBcGlHYXRld2F5VG9vbEZpbHRlcltdO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBsaXN0IG9mIHRvb2wgb3ZlcnJpZGVzIHRvIGN1c3RvbWl6ZSB0b29sIG1ldGFkYXRhXG4gICAqIEVhY2ggb3ZlcnJpZGUgbXVzdCBjb3JyZXNwb25kIHRvIGFuIG9wZXJhdGlvbiBzZWxlY3RlZCBieSB0aGUgZmlsdGVyc1xuICAgKiBAZGVmYXVsdCAtIE5vIHRvb2wgb3ZlcnJpZGVzXG4gICAqL1xuICByZWFkb25seSB0b29sT3ZlcnJpZGVzPzogQXBpR2F0ZXdheVRvb2xPdmVycmlkZVtdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGFuIEFQSSBHYXRld2F5IHRhcmdldCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpR2F0ZXdheVRhcmdldENvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgUkVTVCBBUEkgdG8gaW50ZWdyYXRlIHdpdGhcbiAgICogTXVzdCBiZSBpbiB0aGUgc2FtZSBhY2NvdW50IGFuZCByZWdpb24gYXMgdGhlIGdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IHJlc3RBcGk6IElSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhZ2UgbmFtZSBvZiB0aGUgUkVTVCBBUElcbiAgICogQGRlZmF1bHQgLSBVc2VzIHRoZSBkZXBsb3ltZW50IHN0YWdlIGZyb20gdGhlIFJlc3RBcGkgKHJlc3RBcGkuZGVwbG95bWVudFN0YWdlLnN0YWdlTmFtZSlcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUb29sIGNvbmZpZ3VyYXRpb24gZGVmaW5pbmcgd2hpY2ggb3BlcmF0aW9ucyB0byBleHBvc2VcbiAgICovXG4gIHJlYWRvbmx5IGFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbjogQXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBjb25maWd1cmF0aW9uIGZvciBwYXNzaW5nIGhlYWRlcnMgYW5kIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICogQWxsb3dzIHlvdSB0byBwYXNzIGFkZGl0aW9uYWwgY29udGV4dCB0aHJvdWdoIGhlYWRlcnMgYW5kIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICogQGRlZmF1bHQgLSBObyBtZXRhZGF0YSBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YUNvbmZpZ3VyYXRpb24/OiBNZXRhZGF0YUNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgQVBJIEdhdGV3YXktYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gY29ubmVjdHMgeW91ciBnYXRld2F5IHRvIGFuIEFtYXpvbiBBUEkgR2F0ZXdheSBSRVNUIEFQSSBzdGFnZS5cbiAqIFRoZSBnYXRld2F5IHRyYW5zbGF0ZXMgaW5jb21pbmcgTUNQIHJlcXVlc3RzIGludG8gSFRUUCByZXF1ZXN0cyB0byB5b3VyIFJFU1QgQVBJXG4gKiBhbmQgaGFuZGxlcyByZXNwb25zZSBmb3JtYXR0aW5nLlxuICpcbiAqIEtleSBjb25zaWRlcmF0aW9uczpcbiAqIC0gQVBJIG11c3QgYmUgaW4gdGhlIHNhbWUgYWNjb3VudCBhbmQgcmVnaW9uIGFzIHRoZSBnYXRld2F5XG4gKiAtIE9ubHkgUkVTVCBBUElzIGFyZSBzdXBwb3J0ZWQgKG5vIEhUVFAgb3IgV2ViU29ja2V0IEFQSXMpXG4gKiAtIEFQSSBtdXN0IHVzZSBhIHB1YmxpYyBlbmRwb2ludCB0eXBlXG4gKiAtIE1ldGhvZHMgd2l0aCBib3RoIEFXU19JQU0gYXV0aG9yaXphdGlvbiBhbmQgQVBJIGtleSByZXF1aXJlbWVudHMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAqIC0gUHJveHkgcmVzb3VyY2VzIChlLmcuLCBgL3BldHMve3Byb3h5K31gKSBhcmUgbm90IHN1cHBvcnRlZFxuICovXG5leHBvcnQgY2xhc3MgQXBpR2F0ZXdheVRhcmdldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBBUEkgR2F0ZXdheSB0YXJnZXQgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBBIG5ldyBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvbiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUocHJvcHM6IEFwaUdhdGV3YXlUYXJnZXRDb25maWd1cmF0aW9uUHJvcHMpOiBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvbihwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0VHlwZSA9IE1jcFRhcmdldFR5cGUuQVBJX0dBVEVXQVk7XG5cbiAgLyoqXG4gICAqIFRoZSBSRVNUIEFQSSByZWZlcmVuY2VcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc3RBcGk6IElSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFJFU1QgQVBJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFnZSBuYW1lIG9mIHRoZSBSRVNUIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvb2wgY29uZmlndXJhdGlvbiBmb3IgdGhlIEFQSSBHYXRld2F5IHRhcmdldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbjogQXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBjb25maWd1cmF0aW9uIGZvciB0aGUgQVBJIEdhdGV3YXkgdGFyZ2V0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGFDb25maWd1cmF0aW9uPzogTWV0YWRhdGFDb25maWd1cmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9yZXN0QXBpID0gcHJvcHMucmVzdEFwaTtcbiAgICB0aGlzLnJlc3RBcGlJZCA9IHByb3BzLnJlc3RBcGkucmVzdEFwaUlkO1xuICAgIHRoaXMuc3RhZ2UgPSBwcm9wcy5zdGFnZSA/PyBwcm9wcy5yZXN0QXBpLmRlcGxveW1lbnRTdGFnZS5zdGFnZU5hbWU7XG4gICAgdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24gPSBwcm9wcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24gPSBwcm9wcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb247XG5cbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoaXMgY29uZmlndXJhdGlvbiB0byBhIGNvbnN0cnVjdCBzY29wZVxuICAgKiBTZXRzIHVwIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyBmb3IgdGhlIGdhdGV3YXkgdG8gYWNjZXNzIHRoZSBBUEkgR2F0ZXdheVxuICAgKlxuICAgKiBAcGFyYW0gX3Njb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGdhdGV3YXkgVGhlIGdhdGV3YXkgdGhhdCB3aWxsIHVzZSB0aGlzIHRhcmdldFxuICAgKi9cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QsIGdhdGV3YXk6IElHYXRld2F5KTogVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gICAgLy8gR3JhbnQgcGVybWlzc2lvbiB0byBpbnZva2UgdGhlIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gICAgLy8gVGhlIGdhdGV3YXkgcm9sZSBuZWVkcyB0aGlzIHBlcm1pc3Npb24gdG8gbWFrZSBBUEkgY2FsbHMgdG8gdGhlIFJFU1QgQVBJIGVuZHBvaW50c1xuICAgIC8vIEZvciBtb3JlIGluZm8gb24gZ3JhbnRpbmcgcGVybWlzc2lvbjogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9nYXRld2F5LXRhcmdldC1hcGktZ2F0ZXdheS5odG1sI2dhdGV3YXktdGFyZ2V0LWFwaS1nYXRld2F5LW91dGJvdW5kXG5cbiAgICBnYXRld2F5LnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydleGVjdXRlLWFwaTpJbnZva2UnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgdGhpcy5fcmVzdEFwaS5hcm5Gb3JFeGVjdXRlQXBpKCcqJywgJy8qJywgdGhpcy5zdGFnZSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICByZXN0QXBpSWQ6IHRoaXMucmVzdEFwaUlkLFxuICAgICAgICBzdGFnZTogdGhpcy5zdGFnZSxcbiAgICAgICAgYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgdG9vbEZpbHRlcnM6IHRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uLnRvb2xGaWx0ZXJzLm1hcChmaWx0ZXIgPT4gKHtcbiAgICAgICAgICAgIGZpbHRlclBhdGg6IGZpbHRlci5maWx0ZXJQYXRoLFxuICAgICAgICAgICAgbWV0aG9kczogZmlsdGVyLm1ldGhvZHMsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLih0aGlzLmFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbi50b29sT3ZlcnJpZGVzICYmIHtcbiAgICAgICAgICAgIHRvb2xPdmVycmlkZXM6IHRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uLnRvb2xPdmVycmlkZXMubWFwKG92ZXJyaWRlID0+ICh7XG4gICAgICAgICAgICAgIHBhdGg6IG92ZXJyaWRlLnBhdGgsXG4gICAgICAgICAgICAgIG1ldGhvZDogb3ZlcnJpZGUubWV0aG9kLFxuICAgICAgICAgICAgICBuYW1lOiBvdmVycmlkZS5uYW1lLFxuICAgICAgICAgICAgICAuLi4ob3ZlcnJpZGUuZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbjogb3ZlcnJpZGUuZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLih0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbiAmJiB7XG4gICAgICAgICAgbWV0YWRhdGFDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAuLi4odGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24uYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyAmJiB7XG4gICAgICAgICAgICAgIGFsbG93ZWRRdWVyeVBhcmFtZXRlcnM6IHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLih0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbi5hbGxvd2VkUmVxdWVzdEhlYWRlcnMgJiYge1xuICAgICAgICAgICAgICBhbGxvd2VkUmVxdWVzdEhlYWRlcnM6IHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uLmFsbG93ZWRSZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4uKHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uLmFsbG93ZWRSZXNwb25zZUhlYWRlcnMgJiYge1xuICAgICAgICAgICAgICBhbGxvd2VkUmVzcG9uc2VIZWFkZXJzOiB0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbi5hbGxvd2VkUmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjb25maWd1cmF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgUkVTVCBBUEkgSUQgKHNraXAgaWYgdG9rZW4pXG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5yZXN0QXBpSWQpKSB7XG4gICAgICBjb25zdCByZXN0QXBpSWRFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmVzdEFwaUlkLFxuICAgICAgICBmaWVsZE5hbWU6ICdSRVNUIEFQSSBJRCcsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAyNTYsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3RBcGlJZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihyZXN0QXBpSWRFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHN0YWdlIG5hbWUgKHNraXAgaWYgdG9rZW4pXG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5zdGFnZSkpIHtcbiAgICAgIGNvbnN0IHN0YWdlRXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiB0aGlzLnN0YWdlLFxuICAgICAgICBmaWVsZE5hbWU6ICdTdGFnZSBuYW1lJyxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDEyOCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoc3RhZ2VFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3Ioc3RhZ2VFcnJvcnMuam9pbignXFxuJykpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRvb2wgZmlsdGVyc1xuICAgIGlmICghdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbEZpbHRlcnMgfHwgdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbEZpbHRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoJ0F0IGxlYXN0IG9uZSB0b29sIGZpbHRlciBpcyByZXF1aXJlZCBmb3IgQVBJIEdhdGV3YXkgdGFyZ2V0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHRvb2wgZmlsdGVyXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbEZpbHRlcnMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVUb29sRmlsdGVyKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdG9vbCBvdmVycmlkZXMgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbE92ZXJyaWRlcykge1xuICAgICAgZm9yIChjb25zdCBvdmVycmlkZSBvZiB0aGlzLmFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbi50b29sT3ZlcnJpZGVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUb29sT3ZlcnJpZGUob3ZlcnJpZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1ldGFkYXRhIGNvbmZpZ3VyYXRpb24gaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVNZXRhZGF0YUNvbmZpZ3VyYXRpb24odGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgbWV0YWRhdGEgY29uZmlndXJhdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVNZXRhZGF0YUNvbmZpZ3VyYXRpb24oY29uZmlnOiBNZXRhZGF0YUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzXG4gICAgaWYgKGNvbmZpZy5hbGxvd2VkUXVlcnlQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVNZXRhZGF0YUFycmF5KFxuICAgICAgICBjb25maWcuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgJ2FsbG93ZWRRdWVyeVBhcmFtZXRlcnMnLFxuICAgICAgICAxLFxuICAgICAgICAxMCxcbiAgICAgICAgMSxcbiAgICAgICAgNDAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFsbG93ZWRSZXF1ZXN0SGVhZGVyc1xuICAgIGlmIChjb25maWcuYWxsb3dlZFJlcXVlc3RIZWFkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVNZXRhZGF0YUFycmF5KFxuICAgICAgICBjb25maWcuYWxsb3dlZFJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAnYWxsb3dlZFJlcXVlc3RIZWFkZXJzJyxcbiAgICAgICAgMSxcbiAgICAgICAgMTAsXG4gICAgICAgIDEsXG4gICAgICAgIDEwMCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYWxsb3dlZFJlc3BvbnNlSGVhZGVyc1xuICAgIGlmIChjb25maWcuYWxsb3dlZFJlc3BvbnNlSGVhZGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTWV0YWRhdGFBcnJheShcbiAgICAgICAgY29uZmlnLmFsbG93ZWRSZXNwb25zZUhlYWRlcnMsXG4gICAgICAgICdhbGxvd2VkUmVzcG9uc2VIZWFkZXJzJyxcbiAgICAgICAgMSxcbiAgICAgICAgMTAsXG4gICAgICAgIDEsXG4gICAgICAgIDEwMCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIG1ldGFkYXRhIGNvbmZpZ3VyYXRpb24gYXJyYXkgKHF1ZXJ5IHBhcmFtZXRlcnMgb3IgaGVhZGVycylcbiAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICogQHBhcmFtIG1pbkl0ZW1zIE1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zIGFsbG93ZWQgaW4gdGhlIGFycmF5XG4gICAqIEBwYXJhbSBtYXhJdGVtcyBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyBhbGxvd2VkIGluIHRoZSBhcnJheVxuICAgKiBAcGFyYW0gbWluU3RyaW5nTGVuZ3RoIE1pbmltdW0gbGVuZ3RoIGZvciBlYWNoIHN0cmluZyBpbiB0aGUgYXJyYXlcbiAgICogQHBhcmFtIG1heFN0cmluZ0xlbmd0aCBNYXhpbXVtIGxlbmd0aCBmb3IgZWFjaCBzdHJpbmcgaW4gdGhlIGFycmF5XG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU1ldGFkYXRhQXJyYXkoXG4gICAgYXJyYXk6IHN0cmluZ1tdLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIG1pbkl0ZW1zOiBudW1iZXIsXG4gICAgbWF4SXRlbXM6IG51bWJlcixcbiAgICBtaW5TdHJpbmdMZW5ndGg6IG51bWJlcixcbiAgICBtYXhTdHJpbmdMZW5ndGg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIHRoZSBlbnRpcmUgYXJyYXkgaXMgYW4gdW5yZXNvbHZlZCB0b2tlblxuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoYXJyYXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYXJyYXkgaXMgZW1wdHlcbiAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGAke2ZpZWxkTmFtZX0gY2Fubm90IGJlIGFuIGVtcHR5IGFycmF5LiBJdCBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5JdGVtc30gaXRlbShzKWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGFycmF5IHNpemUgY29uc3RyYWludHNcbiAgICBpZiAoYXJyYXkubGVuZ3RoIDwgbWluSXRlbXMpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYCR7ZmllbGROYW1lfSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5JdGVtc30gaXRlbShzKS4gRm91bmQgJHthcnJheS5sZW5ndGh9IGl0ZW0ocylgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXkubGVuZ3RoID4gbWF4SXRlbXMpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYCR7ZmllbGROYW1lfSBjYW5ub3QgZXhjZWVkICR7bWF4SXRlbXN9IGl0ZW1zLiBGb3VuZCAke2FycmF5Lmxlbmd0aH0gaXRlbXNgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHN0cmluZyBpbiB0aGUgYXJyYXlcbiAgICBhcnJheS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChpdGVtKSkge1xuICAgICAgICByZXR1cm47IC8vIFNraXAgdmFsaWRhdGlvbiBmb3IgdW5yZXNvbHZlZCB0b2tlbnNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICBmaWVsZE5hbWU6IGAke2ZpZWxkTmFtZX1bJHtpbmRleH1dYCxcbiAgICAgICAgbWluTGVuZ3RoOiBtaW5TdHJpbmdMZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogbWF4U3RyaW5nTGVuZ3RoLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSB0b29sIGZpbHRlclxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUb29sRmlsdGVyKGZpbHRlcjogQXBpR2F0ZXdheVRvb2xGaWx0ZXIpOiB2b2lkIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGZpbHRlci5maWx0ZXJQYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGZpbHRlciBwYXRoXG4gICAgY29uc3QgcGF0aEVycm9ycyA9IHZhbGlkYXRlRmllbGRQYXR0ZXJuKFxuICAgICAgZmlsdGVyLmZpbHRlclBhdGgsXG4gICAgICAnRmlsdGVyIHBhdGgnLFxuICAgICAgL15cXC9bXFx3XFwte30vKl0qJC8sXG4gICAgICAnRmlsdGVyIHBhdGggbXVzdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaCBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgY3VybHkgYnJhY2VzLCBmb3J3YXJkIHNsYXNoZXMsIGFuZCBhc3Rlcmlza3MnLFxuICAgICk7XG5cbiAgICBpZiAocGF0aEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IocGF0aEVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgbWV0aG9kc1xuICAgIGlmICghZmlsdGVyLm1ldGhvZHMgfHwgZmlsdGVyLm1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoYEF0IGxlYXN0IG9uZSBIVFRQIG1ldGhvZCBpcyByZXF1aXJlZCBmb3IgZmlsdGVyIHBhdGg6ICR7ZmlsdGVyLmZpbHRlclBhdGh9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHRvb2wgb3ZlcnJpZGVcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVG9vbE92ZXJyaWRlKG92ZXJyaWRlOiBBcGlHYXRld2F5VG9vbE92ZXJyaWRlKTogdm9pZCB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChvdmVycmlkZS5wYXRoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgb3ZlcnJpZGUgcGF0aCBpcyBleHBsaWNpdCAobm8gd2lsZGNhcmRzKVxuICAgIGlmIChvdmVycmlkZS5wYXRoLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgYFRvb2wgb3ZlcnJpZGUgcGF0aCBjYW5ub3QgY29udGFpbiB3aWxkY2FyZHMuIFBhdGg6ICR7b3ZlcnJpZGUucGF0aH0uIGAgK1xuICAgICAgICAnVG9vbCBvdmVycmlkZXMgbXVzdCBzcGVjaWZ5IGFuIGV4cGxpY2l0IHBhdGggdGhhdCBtYXRjaGVzIGFuIGV4aXN0aW5nIG9wZXJhdGlvbiBpbiB5b3VyIEFQSS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBvdmVycmlkZSBwYXRoIGZvcm1hdFxuICAgIGNvbnN0IHBhdGhFcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgIG92ZXJyaWRlLnBhdGgsXG4gICAgICAnT3ZlcnJpZGUgcGF0aCcsXG4gICAgICAvXlxcL1tcXHdcXC17fS9dKiQvLFxuICAgICAgJ092ZXJyaWRlIHBhdGggbXVzdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaCBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgY3VybHkgYnJhY2VzLCBhbmQgZm9yd2FyZCBzbGFzaGVzJyxcbiAgICApO1xuXG4gICAgaWYgKHBhdGhFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKHBhdGhFcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG92ZXJyaWRlIG5hbWVcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKG92ZXJyaWRlLm5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZUVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgdmFsdWU6IG92ZXJyaWRlLm5hbWUsXG4gICAgICBmaWVsZE5hbWU6ICdPdmVycmlkZSB0b29sIG5hbWUnLFxuICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgbWF4TGVuZ3RoOiA2NCxcbiAgICB9KTtcblxuICAgIGlmIChuYW1lRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihuYW1lRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBvdmVycmlkZSBkZXNjcmlwdGlvbiBpZiBwcm92aWRlZFxuICAgIGlmIChvdmVycmlkZS5kZXNjcmlwdGlvbiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKG92ZXJyaWRlLmRlc2NyaXB0aW9uKSkge1xuICAgICAgY29uc3QgZGVzY0Vycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZTogb3ZlcnJpZGUuZGVzY3JpcHRpb24sXG4gICAgICAgIGZpZWxkTmFtZTogJ092ZXJyaWRlIGRlc2NyaXB0aW9uJyxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDIwMCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVzY0Vycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihkZXNjRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
744
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0LWNvbmZpZ3VyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YXJnZXQtY29uZmlndXJhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHlCQUF5QjtBQUN6Qiw2Q0FBb0M7QUFFcEMsMkNBQTJDO0FBRTNDLHdEQUF1RjtBQUd2Riw4REFBeUc7QUFFekcsb0RBQXFEO0FBRXJELCtDQUE4QztBQXNDOUM7OytFQUUrRTtBQUUvRTs7O0dBR0c7QUFDSCxNQUFzQixzQkFBc0I7O0lBaUIxQzs7O09BR0c7SUFDSSxPQUFPO1FBQ1osT0FBTztZQUNMLEdBQUcsRUFBRSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7U0FDbkMsQ0FBQztLQUNIOztBQXpCSCx3REEwQkM7QUFFRDs7K0VBRStFO0FBRS9FOzs7OztHQUtHO0FBQ0gsTUFBYSx5QkFBMEIsU0FBUSxzQkFBc0I7O0lBQ25FOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxNQUFNLENBQ2xCLGNBQXlCLEVBQ3pCLFVBQXNCOzs7Ozs7Ozs7O1FBRXRCLE9BQU8sSUFBSSx5QkFBeUIsQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FDbEU7SUFFZSxVQUFVLEdBQUcsMkJBQWEsQ0FBQyxNQUFNLENBQUM7SUFFbEQ7O09BRUc7SUFDYSxjQUFjLENBQVk7SUFFMUM7O09BRUc7SUFDYSxVQUFVLENBQWE7SUFFdkMsWUFBWSxjQUF5QixFQUFFLFVBQXNCO1FBQzNELEtBQUssRUFBRSxDQUFDOzs7Ozs7K0NBNUJDLHlCQUF5Qjs7OztRQTZCbEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7UUFDckMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7S0FDOUI7SUFFRDs7Ozs7O09BTUc7SUFDSSxJQUFJLENBQUMsS0FBZ0IsRUFBRSxPQUFpQjs7Ozs7Ozs7OztRQUM3Qyx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FB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dCB7IFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHR5cGUgeyBJUmVzdEFwaSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5JztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgSUZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IsIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvZXJyb3JzJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElHYXRld2F5IH0gZnJvbSAnLi4vZ2F0ZXdheS1iYXNlJztcbmltcG9ydCB7IHZhbGlkYXRlT3BlbkFwaVNjaGVtYSwgdmFsaWRhdGVGaWVsZFBhdHRlcm4sIHZhbGlkYXRlU3RyaW5nRmllbGQgfSBmcm9tICcuLi92YWxpZGF0aW9uLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBBcGlTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS9hcGktc2NoZW1hJztcbmltcG9ydCB7IEFzc2V0QXBpU2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEvYXBpLXNjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFRvb2xTY2hlbWEgfSBmcm9tICcuL3NjaGVtYS90b29sLXNjaGVtYSc7XG5pbXBvcnQgeyBNY3BUYXJnZXRUeXBlIH0gZnJvbSAnLi90YXJnZXQtYmFzZSc7XG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHJldHVybmVkIGJ5IGJpbmRpbmcgYSB0YXJnZXQgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldENvbmZpZ3VyYXRpb25Db25maWcge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJvdW5kXG4gICAqL1xuICByZWFkb25seSBib3VuZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBCYXNlIGludGVyZmFjZSBmb3IgdGFyZ2V0IGNvbmZpZ3VyYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIHRhcmdldCB0eXBlXG4gICAqL1xuICByZWFkb25seSB0YXJnZXRUeXBlOiBNY3BUYXJnZXRUeXBlO1xuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgY29uZmlndXJhdGlvbiB0byBhIGNvbnN0cnVjdCBzY29wZVxuICAgKiBTZXRzIHVwIHBlcm1pc3Npb25zIGFuZCBkZXBlbmRlbmNpZXNcbiAgICovXG4gIGJpbmQoc2NvcGU6IENvbnN0cnVjdCwgZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBjb25maWd1cmF0aW9uIGFzIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfcmVuZGVyKCk6IGFueTtcbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBNQ1AgVGFyZ2V0IENvbmZpZ3VyYXRpb24gQmFzZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIE1DUCB0YXJnZXQgY29uZmlndXJhdGlvbnNcbiAqIFByb3ZpZGVzIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciBhbGwgTUNQIHRhcmdldCB0eXBlc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWNwVGFyZ2V0Q29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIElUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIFRoZSB0YXJnZXQgdHlwZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhcmdldFR5cGU6IE1jcFRhcmdldFR5cGU7XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgcGVybWlzc2lvbnMgYW5kIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGJpbmQoc2NvcGU6IENvbnN0cnVjdCwgZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55O1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBjb25maWd1cmF0aW9uIGFzIENsb3VkRm9ybWF0aW9uIHByb3BlcnRpZXNcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX3JlbmRlcigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtY3A6IHRoaXMucmVuZGVyTWNwQ29uZmlndXJhdGlvbigpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBMYW1iZGEgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBMYW1iZGEtYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gd3JhcHMgYSBMYW1iZGEgZnVuY3Rpb24gYXMgTUNQIHRvb2xzLFxuICogYWxsb3dpbmcgdGhlIGdhdGV3YXkgdG8gaW52b2tlIHRoZSBmdW5jdGlvbiB0byBwcm92aWRlIHRvb2wgY2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhVGFyZ2V0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1jcFRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgTGFtYmRhIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBsYW1iZGFGdW5jdGlvbiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRvIGludm9rZVxuICAgKiBAcGFyYW0gdG9vbFNjaGVtYSBUaGUgc2NoZW1hIGRlZmluaW5nIHRoZSB0b29sc1xuICAgKiBAcmV0dXJucyBBIG5ldyBMYW1iZGFUYXJnZXRDb25maWd1cmF0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShcbiAgICBsYW1iZGFGdW5jdGlvbjogSUZ1bmN0aW9uLFxuICAgIHRvb2xTY2hlbWE6IFRvb2xTY2hlbWEsXG4gICk6IExhbWJkYVRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAgIHJldHVybiBuZXcgTGFtYmRhVGFyZ2V0Q29uZmlndXJhdGlvbihsYW1iZGFGdW5jdGlvbiwgdG9vbFNjaGVtYSk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0VHlwZSA9IE1jcFRhcmdldFR5cGUuTEFNQkRBO1xuXG4gIC8qKlxuICAgKiBUaGUgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUgTUNQIHNlcnZlciBsb2dpY1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhbWJkYUZ1bmN0aW9uOiBJRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0b29sIHNjaGVtYSB0aGF0IGRlZmluZXMgdGhlIGF2YWlsYWJsZSB0b29sc1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRvb2xTY2hlbWE6IFRvb2xTY2hlbWE7XG5cbiAgY29uc3RydWN0b3IobGFtYmRhRnVuY3Rpb246IElGdW5jdGlvbiwgdG9vbFNjaGVtYTogVG9vbFNjaGVtYSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbiA9IGxhbWJkYUZ1bmN0aW9uO1xuICAgIHRoaXMudG9vbFNjaGVtYSA9IHRvb2xTY2hlbWE7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhpcyBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheSB0byBpbnZva2UgdGhlIExhbWJkYSBmdW5jdGlvblxuICAgKlxuICAgKiBAcGFyYW0gc2NvcGUgVGhlIGNvbnN0cnVjdCBzY29wZVxuICAgKiBAcGFyYW0gZ2F0ZXdheSBUaGUgZ2F0ZXdheSB0aGF0IHdpbGwgdXNlIHRoaXMgdGFyZ2V0XG4gICAqL1xuICBwdWJsaWMgYmluZChzY29wZTogQ29uc3RydWN0LCBnYXRld2F5OiBJR2F0ZXdheSk6IFRhcmdldENvbmZpZ3VyYXRpb25Db25maWcge1xuICAgIC8vIEJpbmQgdGhlIHRvb2wgc2NoZW1hXG4gICAgdGhpcy50b29sU2NoZW1hLmJpbmQoc2NvcGUpO1xuICAgIC8vIEdyYW50IHBlcm1pc3Npb25zIHRvIGdhdGV3YXkgcm9sZVxuICAgIHRoaXMudG9vbFNjaGVtYS5ncmFudFBlcm1pc3Npb25zVG9Sb2xlKGdhdGV3YXkucm9sZSk7XG4gICAgdGhpcy5sYW1iZGFGdW5jdGlvbi5ncmFudEludm9rZShnYXRld2F5LnJvbGUpO1xuXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFtYmRhOiB7XG4gICAgICAgIGxhbWJkYUFybjogdGhpcy5sYW1iZGFGdW5jdGlvbi5mdW5jdGlvbkFybixcbiAgICAgICAgdG9vbFNjaGVtYTogdGhpcy50b29sU2NoZW1hLl9yZW5kZXIoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIE9wZW5BUEkgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBPcGVuQVBJLWJhc2VkIE1DUCB0YXJnZXRzXG4gKlxuICogVGhpcyBjb25maWd1cmF0aW9uIGV4cG9zZXMgYW4gT3BlbkFQSS9SRVNUIEFQSSBhcyBNQ1AgdG9vbHMsXG4gKiBhbGxvd2luZyB0aGUgZ2F0ZXdheSB0byB0cmFuc2Zvcm0gQVBJIG9wZXJhdGlvbnMgaW50byB0b29sIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgT3BlbkFwaVRhcmdldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBPcGVuQVBJIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBhcGlTY2hlbWEgVGhlIE9wZW5BUEkgc2NoZW1hXG4gICAqIEBwYXJhbSB2YWxpZGF0ZVNjaGVtYSBXaGV0aGVyIHRvIHZhbGlkYXRlIHRoZSBPcGVuQVBJIHNjaGVtYSAob25seSBhcHBsaWVzIHRvIGlubGluZSBzY2hlbWFzKVxuICAgKiBAcmV0dXJucyBBIG5ldyBPcGVuQXBpVGFyZ2V0Q29uZmlndXJhdGlvbiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUoYXBpU2NoZW1hOiBBcGlTY2hlbWEsIHZhbGlkYXRlU2NoZW1hPzogYm9vbGVhbik6IE9wZW5BcGlUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE9wZW5BcGlUYXJnZXRDb25maWd1cmF0aW9uKGFwaVNjaGVtYSwgdmFsaWRhdGVTY2hlbWEpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFR5cGUgPSBNY3BUYXJnZXRUeXBlLk9QRU5BUElfU0NIRU1BO1xuXG4gIC8qKlxuICAgKiBUaGUgT3BlbkFQSSBzY2hlbWEgdGhhdCBkZWZpbmVzIHRoZSBBUElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGlTY2hlbWE6IEFwaVNjaGVtYTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB2YWxpZGF0ZSB0aGUgT3BlbkFQSSBzY2hlbWFcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2hvdWxkVmFsaWRhdGVTY2hlbWE6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYXBpU2NoZW1hOiBBcGlTY2hlbWEsIHZhbGlkYXRlU2NoZW1hPzogYm9vbGVhbikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcGlTY2hlbWEgPSBhcGlTY2hlbWE7XG4gICAgdGhpcy5zaG91bGRWYWxpZGF0ZVNjaGVtYSA9IHZhbGlkYXRlU2NoZW1hID8/IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogQmluZHMgdGhpcyBjb25maWd1cmF0aW9uIHRvIGEgY29uc3RydWN0IHNjb3BlXG4gICAqIFNldHMgdXAgbmVjZXNzYXJ5IHBlcm1pc3Npb25zIGZvciB0aGUgZ2F0ZXdheSB0byBhY2Nlc3MgdGhlIEFQSSBzY2hlbWFcbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGdhdGV3YXkgVGhlIGdhdGV3YXkgdGhhdCB3aWxsIHVzZSB0aGlzIHRhcmdldFxuICAgKi9cbiAgcHVibGljIGJpbmQoc2NvcGU6IENvbnN0cnVjdCwgZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnIHtcbiAgICBpZiAodGhpcy5zaG91bGRWYWxpZGF0ZVNjaGVtYSkge1xuICAgICAgLy8gRm9yIGlubGluZSBzY2hlbWFzXG4gICAgICBpZiAodGhpcy5hcGlTY2hlbWEuaW5saW5lU2NoZW1hKSB7XG4gICAgICAgIGNvbnN0IGVycm9ycyA9IHZhbGlkYXRlT3BlbkFwaVNjaGVtYSh7XG4gICAgICAgICAgc2NoZW1hOiB0aGlzLmFwaVNjaGVtYS5pbmxpbmVTY2hlbWEsXG4gICAgICAgICAgc2NoZW1hTmFtZTogJ09wZW5BUEkgc2NoZW1hIGZvciB0YXJnZXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKCdPcGVuQXBpU2NoZW1hVmFsaWRhdGlvbkZhaWxlZCcsIGBPcGVuQVBJIHNjaGVtYSB2YWxpZGF0aW9uIGZhaWxlZDpcXG4ke2Vycm9ycy5qb2luKCdcXG4nKX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmFwaVNjaGVtYSBpbnN0YW5jZW9mIEFzc2V0QXBpU2NoZW1hKSB7XG4gICAgICAgIC8vIEZvciBhc3NldCBzY2hlbWFzIChsb2NhbCBmaWxlcylcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzY2hlbWFDb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHRoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpLCAndXRmLTgnKTtcbiAgICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZU9wZW5BcGlTY2hlbWEoe1xuICAgICAgICAgICAgc2NoZW1hOiBzY2hlbWFDb250ZW50LFxuICAgICAgICAgICAgc2NoZW1hTmFtZTogYE9wZW5BUEkgc2NoZW1hIGZyb20gZmlsZSAke3RoaXMuYXBpU2NoZW1hLl9nZXRGaWxlUGF0aCgpfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoJ09wZW5BcGlTY2hlbWFWYWxpZGF0aW9uRmFpbGVkJywgYE9wZW5BUEkgc2NoZW1hIHZhbGlkYXRpb24gZmFpbGVkOlxcbiR7ZXJyb3JzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgVmFsaWRhdGlvbkVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICAnT3BlbkFwaVNjaGVtYUZpbGVSZWFkRmFpbGVkJyxcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gcmVhZCBPcGVuQVBJIHNjaGVtYSBmcm9tICR7dGhpcy5hcGlTY2hlbWEuX2dldEZpbGVQYXRoKCl9OiAke2UgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFMzIHNjaGVtYXMgY2Fubm90IGJlIHZhbGlkYXRlZCBhdCBzeW50aGVzaXMgdGltZVxuICAgIH1cblxuICAgIC8vIEJpbmQgdGhlIEFQSSBzY2hlbWFcbiAgICB0aGlzLmFwaVNjaGVtYS5iaW5kKHNjb3BlKTtcbiAgICAvLyBHcmFudCBwZXJtaXNzaW9ucyB0byBnYXRld2F5IHJvbGUgaWYgc2NoZW1hIGlzIGluIFMzXG4gICAgdGhpcy5hcGlTY2hlbWEuZ3JhbnRQZXJtaXNzaW9uc1RvUm9sZShnYXRld2F5LnJvbGUpO1xuXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlbkFwaVNjaGVtYTogdGhpcy5hcGlTY2hlbWEuX3JlbmRlcigpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICogICAgICAgICAgICAgICAgICAgICBTbWl0aHkgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBTbWl0aHktYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gZXhwb3NlcyBhIFNtaXRoeS1tb2RlbGVkIEFQSSBhcyBNQ1AgdG9vbHMsXG4gKiBhbGxvd2luZyB0aGUgZ2F0ZXdheSB0byB0cmFuc2Zvcm0gU21pdGh5IG9wZXJhdGlvbnMgaW50byB0b29sIGNhbGxzLlxuICovXG5leHBvcnQgY2xhc3MgU21pdGh5VGFyZ2V0Q29uZmlndXJhdGlvbiBleHRlbmRzIE1jcFRhcmdldENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogQ3JlYXRlIGEgU21pdGh5IHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBzbWl0aHlNb2RlbCBUaGUgU21pdGh5IG1vZGVsIHNjaGVtYVxuICAgKiBAcmV0dXJucyBBIG5ldyBTbWl0aHlUYXJnZXRDb25maWd1cmF0aW9uIGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNyZWF0ZShzbWl0aHlNb2RlbDogQXBpU2NoZW1hKTogU21pdGh5VGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBTbWl0aHlUYXJnZXRDb25maWd1cmF0aW9uKHNtaXRoeU1vZGVsKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB0YXJnZXRUeXBlID0gTWNwVGFyZ2V0VHlwZS5TTUlUSFlfTU9ERUw7XG5cbiAgLyoqXG4gICAqIFRoZSBTbWl0aHkgbW9kZWwgdGhhdCBkZWZpbmVzIHRoZSBBUElcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzbWl0aHlNb2RlbDogQXBpU2NoZW1hO1xuXG4gIGNvbnN0cnVjdG9yKHNtaXRoeU1vZGVsOiBBcGlTY2hlbWEpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc21pdGh5TW9kZWwgPSBzbWl0aHlNb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gYSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogU2V0cyB1cCBuZWNlc3NhcnkgcGVybWlzc2lvbnMgZm9yIHRoZSBnYXRld2F5IHRvIGFjY2VzcyB0aGUgU21pdGh5IG1vZGVsXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSBUaGUgY29uc3RydWN0IHNjb3BlXG4gICAqIEBwYXJhbSBnYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKHNjb3BlOiBDb25zdHJ1Y3QsIGdhdGV3YXk6IElHYXRld2F5KTogVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gICAgLy8gQmluZCB0aGUgU21pdGh5IG1vZGVsXG4gICAgdGhpcy5zbWl0aHlNb2RlbC5iaW5kKHNjb3BlKTtcbiAgICAvLyBHcmFudCBwZXJtaXNzaW9ucyB0byBnYXRld2F5IHJvbGUgaWYgc2NoZW1hIGlzIGluIFMzXG4gICAgdGhpcy5zbWl0aHlNb2RlbC5ncmFudFBlcm1pc3Npb25zVG9Sb2xlKGdhdGV3YXkucm9sZSk7XG5cbiAgICByZXR1cm4geyBib3VuZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBzbWl0aHlNb2RlbDogdGhpcy5zbWl0aHlNb2RlbC5fcmVuZGVyKCksXG4gICAgfTtcbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIE1DUCBTZXJ2ZXIgVGFyZ2V0IENvbmZpZ3VyYXRpb25cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBNQ1AgU2VydmVyLWJhc2VkIHRhcmdldHNcbiAqXG4gKiBNQ1AgKE1vZGVsIENvbnRleHQgUHJvdG9jb2wpIHNlcnZlcnMgcHJvdmlkZSB0b29scywgZGF0YSBhY2Nlc3MsIGFuZCBjdXN0b21cbiAqIGZ1bmN0aW9ucyBmb3IgQUkgYWdlbnRzLiBXaGVuIHlvdSBjb25maWd1cmUgYW4gTUNQIHNlcnZlciBhcyBhIGdhdGV3YXkgdGFyZ2V0LFxuICogdGhlIGdhdGV3YXkgYXV0b21hdGljYWxseSBkaXNjb3ZlcnMgYW5kIGluZGV4ZXMgYXZhaWxhYmxlIHRvb2xzIHRocm91Z2hcbiAqIHN5bmNocm9uaXphdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBNQ1Agc2VydmVyIHRhcmdldCBjb25maWd1cmF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBlbmRwb2ludCBUaGUgSFRUUFMgZW5kcG9pbnQgVVJMIG9mIHRoZSBNQ1Agc2VydmVyXG4gICAqIEByZXR1cm5zIEEgbmV3IE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24gaW5zdGFuY2VcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlKGVuZHBvaW50OiBzdHJpbmcpOiBNY3BTZXJ2ZXJUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgICByZXR1cm4gbmV3IE1jcFNlcnZlclRhcmdldENvbmZpZ3VyYXRpb24oZW5kcG9pbnQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldFR5cGUgPSBNY3BUYXJnZXRUeXBlLk1DUF9TRVJWRVI7XG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQUyBlbmRwb2ludCBVUkwgb2YgdGhlIE1DUCBzZXJ2ZXJcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGVuZHBvaW50OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDtcbiAgICB0aGlzLnZhbGlkYXRlRW5kcG9pbnQoZW5kcG9pbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoaXMgY29uZmlndXJhdGlvbiB0byBhIGNvbnN0cnVjdCBzY29wZVxuICAgKiBObyBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFyZSBuZWVkZWQgZm9yIE1DUCBzZXJ2ZXIgdGFyZ2V0c1xuICAgKlxuICAgKiBAcGFyYW0gX3Njb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIF9nYXRld2F5IFRoZSBnYXRld2F5IHRoYXQgd2lsbCB1c2UgdGhpcyB0YXJnZXRcbiAgICovXG4gIHB1YmxpYyBiaW5kKF9zY29wZTogQ29uc3RydWN0LCBfZ2F0ZXdheTogSUdhdGV3YXkpOiBUYXJnZXRDb25maWd1cmF0aW9uQ29uZmlnIHtcbiAgICAvLyBNQ1Agc2VydmVyIHRhcmdldHMgZG9uJ3QgcmVxdWlyZSBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIHNldHVwXG4gICAgLy8gQXV0aGVudGljYXRpb24gaXMgaGFuZGxlZCB0aHJvdWdoIGNyZWRlbnRpYWwgcHJvdmlkZXIgY29uZmlndXJhdGlvbnNcbiAgICByZXR1cm4geyBib3VuZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIE1DUC1zcGVjaWZpYyBjb25maWd1cmF0aW9uXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVuZGVyTWNwQ29uZmlndXJhdGlvbigpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICBtY3BTZXJ2ZXI6IHtcbiAgICAgICAgZW5kcG9pbnQ6IHRoaXMuZW5kcG9pbnQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBNQ1Agc2VydmVyIGVuZHBvaW50XG4gICAqIC0gTXVzdCB1c2UgSFRUUFMgcHJvdG9jb2xcbiAgICogLSBTaG91bGQgYmUgcHJvcGVybHkgVVJMIGVuY29kZWRcbiAgICpcbiAgICogQHBhcmFtIGVuZHBvaW50IFRoZSBlbmRwb2ludCBVUkwgdG8gdmFsaWRhdGVcbiAgICogQHRocm93cyBWYWxpZGF0aW9uRXJyb3IgaWYgdGhlIGVuZHBvaW50IGlzIGludmFsaWRcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlRW5kcG9pbnQoZW5kcG9pbnQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoZW5kcG9pbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVGaWVsZFBhdHRlcm4oXG4gICAgICBlbmRwb2ludCxcbiAgICAgICdNQ1Agc2VydmVyIGVuZHBvaW50JyxcbiAgICAgIC9eaHR0cHM6XFwvXFwvLisvLFxuICAgICAgJ01DUCBzZXJ2ZXIgZW5kcG9pbnQgbXVzdCB1c2UgSFRUUFMgcHJvdG9jb2wgKGUuZy4sIGh0dHBzOi8vbXktc2VydmVyLmV4YW1wbGUuY29tKS4gRW5zdXJlIHRoZSBVUkwgaXMgcHJvcGVybHkgZW5jb2RlZC4nLFxuICAgICk7XG5cbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcignTWNwU2VydmVyRW5kcG9pbnRJbnZhbGlkJywgZXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICAvLyBBZGRpdGlvbmFsIGhlbHBmdWwgdmFsaWRhdGlvbiBmb3IgY29tbW9uIFVSTCBlbmNvZGluZyBpc3N1ZXNcbiAgICBpZiAoZW5kcG9pbnQuaW5jbHVkZXMoJyAnKSB8fCBlbmRwb2ludC5pbmNsdWRlcygnPCcpIHx8IGVuZHBvaW50LmluY2x1ZGVzKCc+JykpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgJ01jcFNlcnZlckVuZHBvaW50RW5jb2RpbmdJbnZhbGlkJyxcbiAgICAgICAgJ01DUCBzZXJ2ZXIgZW5kcG9pbnQgY29udGFpbnMgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZSBVUkwtZW5jb2RlZC4gJyArXG4gICAgICAgICdQbGVhc2UgZW5zdXJlIHRoZSBVUkwgaXMgcHJvcGVybHkgZW5jb2RlZCBiZWZvcmUgcGFzc2luZyB0byB0aGUgY29uc3RydWN0LicsXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKiAgICAgICAgICAgICAgICAgICAgIEFQSSBHYXRld2F5IFRhcmdldCBDb25maWd1cmF0aW9uXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qKlxuICogSFRUUCBtZXRob2RzIHN1cHBvcnRlZCBieSBBUEkgR2F0ZXdheVxuICovXG5leHBvcnQgZW51bSBBcGlHYXRld2F5SHR0cE1ldGhvZCB7XG4gIC8qKiBHRVQgbWV0aG9kICovXG4gIEdFVCA9ICdHRVQnLFxuICAvKiogUE9TVCBtZXRob2QgKi9cbiAgUE9TVCA9ICdQT1NUJyxcbiAgLyoqIFBVVCBtZXRob2QgKi9cbiAgUFVUID0gJ1BVVCcsXG4gIC8qKiBERUxFVEUgbWV0aG9kICovXG4gIERFTEVURSA9ICdERUxFVEUnLFxuICAvKiogUEFUQ0ggbWV0aG9kICovXG4gIFBBVENIID0gJ1BBVENIJyxcbiAgLyoqIEhFQUQgbWV0aG9kICovXG4gIEhFQUQgPSAnSEVBRCcsXG4gIC8qKiBPUFRJT05TIG1ldGhvZCAqL1xuICBPUFRJT05TID0gJ09QVElPTlMnLFxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGZpbHRlcmluZyBBUEkgR2F0ZXdheSB0b29sc1xuICpcbiAqIFRvb2wgZmlsdGVycyBhbGxvdyB5b3UgdG8gc2VsZWN0IFJFU1QgQVBJIG9wZXJhdGlvbnMgdXNpbmcgcGF0aCBhbmQgbWV0aG9kIGNvbWJpbmF0aW9ucy5cbiAqIEVhY2ggZmlsdGVyIHN1cHBvcnRzIHR3byBwYXRoIG1hdGNoaW5nIHN0cmF0ZWdpZXM6XG4gKiAtICoqRXhwbGljaXQgcGF0aHMqKjogTWF0Y2hlcyBhIHNpbmdsZSBzcGVjaWZpYyBwYXRoLCBzdWNoIGFzIGAvcGV0cy97cGV0SWR9YFxuICogLSAqKldpbGRjYXJkIHBhdGhzKio6IE1hdGNoZXMgYWxsIHBhdGhzIHN0YXJ0aW5nIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIHN1Y2ggYXMgYC9wZXRzLypgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpR2F0ZXdheVRvb2xGaWx0ZXIge1xuICAvKipcbiAgICogVGhlIHJlc291cmNlIHBhdGggdG8gZmlsdGVyXG4gICAqIENhbiBiZSBhbiBleHBsaWNpdCBwYXRoIChlLmcuLCBgL3BldHMve3BldElkfWApIG9yIGEgd2lsZGNhcmQgcGF0aCAoZS5nLiwgYC9wZXRzLypgKVxuICAgKiBNdXN0IHN0YXJ0IHdpdGggYSBmb3J3YXJkIHNsYXNoXG4gICAqL1xuICByZWFkb25seSBmaWx0ZXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgSFRUUCBtZXRob2RzIHRvIGluY2x1ZGUgZm9yIHRoaXMgcGF0aFxuICAgKiBFYWNoIGZpbHRlciBzcGVjaWZpZXMgYm90aCBhIHBhdGggYW5kIGEgbGlzdCBvZiBIVFRQIG1ldGhvZHNcbiAgICogTXVsdGlwbGUgZmlsdGVycyBjYW4gb3ZlcmxhcCBhbmQgZHVwbGljYXRlcyBhcmUgYXV0b21hdGljYWxseSBkZS1kdXBsaWNhdGVkXG4gICAqL1xuICByZWFkb25seSBtZXRob2RzOiBBcGlHYXRld2F5SHR0cE1ldGhvZFtdO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIG92ZXJyaWRpbmcgQVBJIEdhdGV3YXkgdG9vbCBtZXRhZGF0YVxuICpcbiAqIFRvb2wgb3ZlcnJpZGVzIGFsbG93IHlvdSB0byBjdXN0b21pemUgdGhlIHRvb2wgbmFtZSBvciBkZXNjcmlwdGlvbiBmb3Igc3BlY2lmaWMgb3BlcmF0aW9uc1xuICogYWZ0ZXIgZmlsdGVyaW5nLiBFYWNoIG92ZXJyaWRlIG11c3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBwYXRoIGFuZCBhIHNpbmdsZSBIVFRQIG1ldGhvZC5cbiAqIFRoZSBvdmVycmlkZSBtdXN0IG1hdGNoIGFuIG9wZXJhdGlvbiB0aGF0IGV4aXN0cyBpbiB5b3VyIEFQSSBhbmQgbXVzdCBjb3JyZXNwb25kIHRvIG9uZVxuICogb2YgdGhlIG9wZXJhdGlvbnMgcmVzb2x2ZWQgYnkgeW91ciBmaWx0ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaUdhdGV3YXlUb29sT3ZlcnJpZGUge1xuICAvKipcbiAgICogVGhlIGV4cGxpY2l0IHJlc291cmNlIHBhdGggKG5vIHdpbGRjYXJkcylcbiAgICogTXVzdCBtYXRjaCBhbiBvcGVyYXRpb24gdGhhdCBleGlzdHMgaW4geW91ciBBUElcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEhUVFAgbWV0aG9kIGZvciB0aGlzIG92ZXJyaWRlXG4gICAqIE11c3QgYmUgYSBzaW5nbGUgbWV0aG9kIChubyB3aWxkY2FyZHMpXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IEFwaUdhdGV3YXlIdHRwTWV0aG9kO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIHRvb2wgbmFtZVxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBvcGVyYXRpb25JZCBmcm9tIHRoZSBPcGVuQVBJIGRlZmluaXRpb24gd2lsbCBiZSB1c2VkXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGN1c3RvbSBkZXNjcmlwdGlvbiBmb3IgdGhlIHRvb2xcbiAgICogQGRlZmF1bHQgLSBObyBjdXN0b20gZGVzY3JpcHRpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBhc3NpbmcgbWV0YWRhdGEgKGhlYWRlcnMgYW5kIHF1ZXJ5IHBhcmFtZXRlcnMpIHRvIHRoZSBBUEkgR2F0ZXdheSB0YXJnZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXRhZGF0YUNvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogTGlzdCBvZiBxdWVyeSBwYXJhbWV0ZXIgbmFtZXMgdG8gcGFzcyB0aHJvdWdoIHRvIHRoZSB0YXJnZXRcbiAgICpcbiAgICogQ29uc3RyYWludHM6XG4gICAqIC0gQXJyYXkgbXVzdCBjb250YWluIDEtMTAgaXRlbXNcbiAgICogLSBFYWNoIHBhcmFtZXRlciBuYW1lIG11c3QgYmUgMS00MCBjaGFyYWN0ZXJzXG4gICAqIC0gQ2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcXVlcnkgcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRocm91Z2hcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93ZWRRdWVyeVBhcmFtZXRlcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGlzdCBvZiByZXF1ZXN0IGhlYWRlciBuYW1lcyB0byBwYXNzIHRocm91Z2ggdG8gdGhlIHRhcmdldFxuICAgKlxuICAgKiBDb25zdHJhaW50czpcbiAgICogLSBBcnJheSBtdXN0IGNvbnRhaW4gMS0xMCBpdGVtc1xuICAgKiAtIEVhY2ggaGVhZGVyIG5hbWUgbXVzdCBiZSAxLTEwMCBjaGFyYWN0ZXJzXG4gICAqIC0gQ2Fubm90IGJlIGFuIGVtcHR5IGFycmF5XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm8gcmVxdWVzdCBoZWFkZXJzIGFyZSBwYXNzZWQgdGhyb3VnaFxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFJlcXVlc3RIZWFkZXJzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgcmVzcG9uc2UgaGVhZGVyIG5hbWVzIHRvIHBhc3MgdGhyb3VnaCBmcm9tIHRoZSB0YXJnZXRcbiAgICpcbiAgICogQ29uc3RyYWludHM6XG4gICAqIC0gQXJyYXkgbXVzdCBjb250YWluIDEtMTAgaXRlbXNcbiAgICogLSBFYWNoIGhlYWRlciBuYW1lIG11c3QgYmUgMS0xMDAgY2hhcmFjdGVyc1xuICAgKiAtIENhbm5vdCBiZSBhbiBlbXB0eSBhcnJheVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vIHJlc3BvbnNlIGhlYWRlcnMgYXJlIHBhc3NlZCB0aHJvdWdoXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkUmVzcG9uc2VIZWFkZXJzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgQVBJIEdhdGV3YXkgdG9vbHNcbiAqXG4gKiBUaGUgQVBJIEdhdGV3YXkgdG9vbCBjb25maWd1cmF0aW9uIGRlZmluZXMgd2hpY2ggb3BlcmF0aW9ucyBmcm9tIHlvdXIgUkVTVCBBUElcbiAqIGFyZSBleHBvc2VkIGFzIHRvb2xzLiBJdCByZXF1aXJlcyBhIGxpc3Qgb2YgdG9vbCBmaWx0ZXJzIHRvIHNlbGVjdCBvcGVyYXRpb25zXG4gKiB0byBleHBvc2UsIGFuZCBvcHRpb25hbGx5IGFjY2VwdHMgdG9vbCBvdmVycmlkZXMgdG8gY3VzdG9taXplIHRvb2wgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIExpc3Qgb2YgdG9vbCBmaWx0ZXJzIHRvIHNlbGVjdCBvcGVyYXRpb25zXG4gICAqIEF0IGxlYXN0IG9uZSBmaWx0ZXIgaXMgcmVxdWlyZWRcbiAgICovXG4gIHJlYWRvbmx5IHRvb2xGaWx0ZXJzOiBBcGlHYXRld2F5VG9vbEZpbHRlcltdO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBsaXN0IG9mIHRvb2wgb3ZlcnJpZGVzIHRvIGN1c3RvbWl6ZSB0b29sIG1ldGFkYXRhXG4gICAqIEVhY2ggb3ZlcnJpZGUgbXVzdCBjb3JyZXNwb25kIHRvIGFuIG9wZXJhdGlvbiBzZWxlY3RlZCBieSB0aGUgZmlsdGVyc1xuICAgKiBAZGVmYXVsdCAtIE5vIHRvb2wgb3ZlcnJpZGVzXG4gICAqL1xuICByZWFkb25seSB0b29sT3ZlcnJpZGVzPzogQXBpR2F0ZXdheVRvb2xPdmVycmlkZVtdO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGNyZWF0aW5nIGFuIEFQSSBHYXRld2F5IHRhcmdldCBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBpR2F0ZXdheVRhcmdldENvbmZpZ3VyYXRpb25Qcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgUkVTVCBBUEkgdG8gaW50ZWdyYXRlIHdpdGhcbiAgICogTXVzdCBiZSBpbiB0aGUgc2FtZSBhY2NvdW50IGFuZCByZWdpb24gYXMgdGhlIGdhdGV3YXlcbiAgICovXG4gIHJlYWRvbmx5IHJlc3RBcGk6IElSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhZ2UgbmFtZSBvZiB0aGUgUkVTVCBBUElcbiAgICogQGRlZmF1bHQgLSBVc2VzIHRoZSBkZXBsb3ltZW50IHN0YWdlIGZyb20gdGhlIFJlc3RBcGkgKHJlc3RBcGkuZGVwbG95bWVudFN0YWdlLnN0YWdlTmFtZSlcbiAgICovXG4gIHJlYWRvbmx5IHN0YWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUb29sIGNvbmZpZ3VyYXRpb24gZGVmaW5pbmcgd2hpY2ggb3BlcmF0aW9ucyB0byBleHBvc2VcbiAgICovXG4gIHJlYWRvbmx5IGFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbjogQXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBjb25maWd1cmF0aW9uIGZvciBwYXNzaW5nIGhlYWRlcnMgYW5kIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICogQWxsb3dzIHlvdSB0byBwYXNzIGFkZGl0aW9uYWwgY29udGV4dCB0aHJvdWdoIGhlYWRlcnMgYW5kIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICogQGRlZmF1bHQgLSBObyBtZXRhZGF0YSBjb25maWd1cmF0aW9uXG4gICAqL1xuICByZWFkb25seSBtZXRhZGF0YUNvbmZpZ3VyYXRpb24/OiBNZXRhZGF0YUNvbmZpZ3VyYXRpb247XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgQVBJIEdhdGV3YXktYmFzZWQgTUNQIHRhcmdldHNcbiAqXG4gKiBUaGlzIGNvbmZpZ3VyYXRpb24gY29ubmVjdHMgeW91ciBnYXRld2F5IHRvIGFuIEFtYXpvbiBBUEkgR2F0ZXdheSBSRVNUIEFQSSBzdGFnZS5cbiAqIFRoZSBnYXRld2F5IHRyYW5zbGF0ZXMgaW5jb21pbmcgTUNQIHJlcXVlc3RzIGludG8gSFRUUCByZXF1ZXN0cyB0byB5b3VyIFJFU1QgQVBJXG4gKiBhbmQgaGFuZGxlcyByZXNwb25zZSBmb3JtYXR0aW5nLlxuICpcbiAqIEtleSBjb25zaWRlcmF0aW9uczpcbiAqIC0gQVBJIG11c3QgYmUgaW4gdGhlIHNhbWUgYWNjb3VudCBhbmQgcmVnaW9uIGFzIHRoZSBnYXRld2F5XG4gKiAtIE9ubHkgUkVTVCBBUElzIGFyZSBzdXBwb3J0ZWQgKG5vIEhUVFAgb3IgV2ViU29ja2V0IEFQSXMpXG4gKiAtIEFQSSBtdXN0IHVzZSBhIHB1YmxpYyBlbmRwb2ludCB0eXBlXG4gKiAtIE1ldGhvZHMgd2l0aCBib3RoIEFXU19JQU0gYXV0aG9yaXphdGlvbiBhbmQgQVBJIGtleSByZXF1aXJlbWVudHMgYXJlIG5vdCBzdXBwb3J0ZWRcbiAqIC0gUHJveHkgcmVzb3VyY2VzIChlLmcuLCBgL3BldHMve3Byb3h5K31gKSBhcmUgbm90IHN1cHBvcnRlZFxuICovXG5leHBvcnQgY2xhc3MgQXBpR2F0ZXdheVRhcmdldENvbmZpZ3VyYXRpb24gZXh0ZW5kcyBNY3BUYXJnZXRDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBBUEkgR2F0ZXdheSB0YXJnZXQgY29uZmlndXJhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gcHJvcHMgVGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBBIG5ldyBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvbiBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGUocHJvcHM6IEFwaUdhdGV3YXlUYXJnZXRDb25maWd1cmF0aW9uUHJvcHMpOiBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvbihwcm9wcyk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0VHlwZSA9IE1jcFRhcmdldFR5cGUuQVBJX0dBVEVXQVk7XG5cbiAgLyoqXG4gICAqIFRoZSBSRVNUIEFQSSByZWZlcmVuY2VcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Jlc3RBcGk6IElSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIFJFU1QgQVBJXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcmVzdEFwaUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFnZSBuYW1lIG9mIHRoZSBSRVNUIEFQSVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRvb2wgY29uZmlndXJhdGlvbiBmb3IgdGhlIEFQSSBHYXRld2F5IHRhcmdldFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbjogQXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNZXRhZGF0YSBjb25maWd1cmF0aW9uIGZvciB0aGUgQVBJIEdhdGV3YXkgdGFyZ2V0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbWV0YWRhdGFDb25maWd1cmF0aW9uPzogTWV0YWRhdGFDb25maWd1cmF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByb3BzOiBBcGlHYXRld2F5VGFyZ2V0Q29uZmlndXJhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl9yZXN0QXBpID0gcHJvcHMucmVzdEFwaTtcbiAgICB0aGlzLnJlc3RBcGlJZCA9IHByb3BzLnJlc3RBcGkucmVzdEFwaUlkO1xuICAgIHRoaXMuc3RhZ2UgPSBwcm9wcy5zdGFnZSA/PyBwcm9wcy5yZXN0QXBpLmRlcGxveW1lbnRTdGFnZS5zdGFnZU5hbWU7XG4gICAgdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24gPSBwcm9wcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb247XG4gICAgdGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24gPSBwcm9wcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb247XG5cbiAgICB0aGlzLnZhbGlkYXRlQ29uZmlndXJhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIHRoaXMgY29uZmlndXJhdGlvbiB0byBhIGNvbnN0cnVjdCBzY29wZVxuICAgKiBTZXRzIHVwIG5lY2Vzc2FyeSBwZXJtaXNzaW9ucyBmb3IgdGhlIGdhdGV3YXkgdG8gYWNjZXNzIHRoZSBBUEkgR2F0ZXdheVxuICAgKlxuICAgKiBAcGFyYW0gX3Njb3BlIFRoZSBjb25zdHJ1Y3Qgc2NvcGVcbiAgICogQHBhcmFtIGdhdGV3YXkgVGhlIGdhdGV3YXkgdGhhdCB3aWxsIHVzZSB0aGlzIHRhcmdldFxuICAgKi9cbiAgcHVibGljIGJpbmQoX3Njb3BlOiBDb25zdHJ1Y3QsIGdhdGV3YXk6IElHYXRld2F5KTogVGFyZ2V0Q29uZmlndXJhdGlvbkNvbmZpZyB7XG4gICAgLy8gR3JhbnQgcGVybWlzc2lvbiB0byBpbnZva2UgdGhlIEFQSSBHYXRld2F5IFJFU1QgQVBJXG4gICAgLy8gVGhlIGdhdGV3YXkgcm9sZSBuZWVkcyB0aGlzIHBlcm1pc3Npb24gdG8gbWFrZSBBUEkgY2FsbHMgdG8gdGhlIFJFU1QgQVBJIGVuZHBvaW50c1xuICAgIC8vIEZvciBtb3JlIGluZm8gb24gZ3JhbnRpbmcgcGVybWlzc2lvbjogaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2JlZHJvY2stYWdlbnRjb3JlL2xhdGVzdC9kZXZndWlkZS9nYXRld2F5LXRhcmdldC1hcGktZ2F0ZXdheS5odG1sI2dhdGV3YXktdGFyZ2V0LWFwaS1nYXRld2F5LW91dGJvdW5kXG5cbiAgICBnYXRld2F5LnJvbGUuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogWydleGVjdXRlLWFwaTpJbnZva2UnXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgdGhpcy5fcmVzdEFwaS5hcm5Gb3JFeGVjdXRlQXBpKCcqJywgJy8qJywgdGhpcy5zdGFnZSksXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgYm91bmQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBNQ1Atc3BlY2lmaWMgY29uZmlndXJhdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIHJlbmRlck1jcENvbmZpZ3VyYXRpb24oKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICByZXN0QXBpSWQ6IHRoaXMucmVzdEFwaUlkLFxuICAgICAgICBzdGFnZTogdGhpcy5zdGFnZSxcbiAgICAgICAgYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgdG9vbEZpbHRlcnM6IHRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uLnRvb2xGaWx0ZXJzLm1hcChmaWx0ZXIgPT4gKHtcbiAgICAgICAgICAgIGZpbHRlclBhdGg6IGZpbHRlci5maWx0ZXJQYXRoLFxuICAgICAgICAgICAgbWV0aG9kczogZmlsdGVyLm1ldGhvZHMsXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIC4uLih0aGlzLmFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbi50b29sT3ZlcnJpZGVzICYmIHtcbiAgICAgICAgICAgIHRvb2xPdmVycmlkZXM6IHRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uLnRvb2xPdmVycmlkZXMubWFwKG92ZXJyaWRlID0+ICh7XG4gICAgICAgICAgICAgIHBhdGg6IG92ZXJyaWRlLnBhdGgsXG4gICAgICAgICAgICAgIG1ldGhvZDogb3ZlcnJpZGUubWV0aG9kLFxuICAgICAgICAgICAgICBuYW1lOiBvdmVycmlkZS5uYW1lLFxuICAgICAgICAgICAgICAuLi4ob3ZlcnJpZGUuZGVzY3JpcHRpb24gJiYgeyBkZXNjcmlwdGlvbjogb3ZlcnJpZGUuZGVzY3JpcHRpb24gfSksXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLih0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbiAmJiB7XG4gICAgICAgICAgbWV0YWRhdGFDb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgICAuLi4odGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24uYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyAmJiB7XG4gICAgICAgICAgICAgIGFsbG93ZWRRdWVyeVBhcmFtZXRlcnM6IHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uLmFsbG93ZWRRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLih0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbi5hbGxvd2VkUmVxdWVzdEhlYWRlcnMgJiYge1xuICAgICAgICAgICAgICBhbGxvd2VkUmVxdWVzdEhlYWRlcnM6IHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uLmFsbG93ZWRSZXF1ZXN0SGVhZGVycyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4uKHRoaXMubWV0YWRhdGFDb25maWd1cmF0aW9uLmFsbG93ZWRSZXNwb25zZUhlYWRlcnMgJiYge1xuICAgICAgICAgICAgICBhbGxvd2VkUmVzcG9uc2VIZWFkZXJzOiB0aGlzLm1ldGFkYXRhQ29uZmlndXJhdGlvbi5hbGxvd2VkUmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBjb25maWd1cmF0aW9uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUNvbmZpZ3VyYXRpb24oKTogdm9pZCB7XG4gICAgLy8gVmFsaWRhdGUgUkVTVCBBUEkgSUQgKHNraXAgaWYgdG9rZW4pXG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQodGhpcy5yZXN0QXBpSWQpKSB7XG4gICAgICBjb25zdCByZXN0QXBpSWRFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHRoaXMucmVzdEFwaUlkLFxuICAgICAgICBmaWVsZE5hbWU6ICdSRVNUIEFQSSBJRCcsXG4gICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgbWF4TGVuZ3RoOiAyNTYsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3RBcGlJZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcignUmVzdEFwaUlkSW52YWxpZCcsIHJlc3RBcGlJZEVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgc3RhZ2UgbmFtZSAoc2tpcCBpZiB0b2tlbilcbiAgICBpZiAoIVRva2VuLmlzVW5yZXNvbHZlZCh0aGlzLnN0YWdlKSkge1xuICAgICAgY29uc3Qgc3RhZ2VFcnJvcnMgPSB2YWxpZGF0ZVN0cmluZ0ZpZWxkKHtcbiAgICAgICAgdmFsdWU6IHRoaXMuc3RhZ2UsXG4gICAgICAgIGZpZWxkTmFtZTogJ1N0YWdlIG5hbWUnLFxuICAgICAgICBtaW5MZW5ndGg6IDEsXG4gICAgICAgIG1heExlbmd0aDogMTI4LFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChzdGFnZUVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcignU3RhZ2VOYW1lSW52YWxpZCcsIHN0YWdlRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0b29sIGZpbHRlcnNcbiAgICBpZiAoIXRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uLnRvb2xGaWx0ZXJzIHx8IHRoaXMuYXBpR2F0ZXdheVRvb2xDb25maWd1cmF0aW9uLnRvb2xGaWx0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKCdUb29sRmlsdGVyc1JlcXVpcmVkJywgJ0F0IGxlYXN0IG9uZSB0b29sIGZpbHRlciBpcyByZXF1aXJlZCBmb3IgQVBJIEdhdGV3YXkgdGFyZ2V0IGNvbmZpZ3VyYXRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHRvb2wgZmlsdGVyXG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbEZpbHRlcnMpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVUb29sRmlsdGVyKGZpbHRlcik7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgdG9vbCBvdmVycmlkZXMgaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5hcGlHYXRld2F5VG9vbENvbmZpZ3VyYXRpb24udG9vbE92ZXJyaWRlcykge1xuICAgICAgZm9yIChjb25zdCBvdmVycmlkZSBvZiB0aGlzLmFwaUdhdGV3YXlUb29sQ29uZmlndXJhdGlvbi50b29sT3ZlcnJpZGVzKSB7XG4gICAgICAgIHRoaXMudmFsaWRhdGVUb29sT3ZlcnJpZGUob3ZlcnJpZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG1ldGFkYXRhIGNvbmZpZ3VyYXRpb24gaWYgcHJvdmlkZWRcbiAgICBpZiAodGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVNZXRhZGF0YUNvbmZpZ3VyYXRpb24odGhpcy5tZXRhZGF0YUNvbmZpZ3VyYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgbWV0YWRhdGEgY29uZmlndXJhdGlvblxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVNZXRhZGF0YUNvbmZpZ3VyYXRpb24oY29uZmlnOiBNZXRhZGF0YUNvbmZpZ3VyYXRpb24pOiB2b2lkIHtcbiAgICAvLyBWYWxpZGF0ZSBhbGxvd2VkUXVlcnlQYXJhbWV0ZXJzXG4gICAgaWYgKGNvbmZpZy5hbGxvd2VkUXVlcnlQYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVNZXRhZGF0YUFycmF5KFxuICAgICAgICBjb25maWcuYWxsb3dlZFF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgJ2FsbG93ZWRRdWVyeVBhcmFtZXRlcnMnLFxuICAgICAgICAxLFxuICAgICAgICAxMCxcbiAgICAgICAgMSxcbiAgICAgICAgNDAsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIGFsbG93ZWRSZXF1ZXN0SGVhZGVyc1xuICAgIGlmIChjb25maWcuYWxsb3dlZFJlcXVlc3RIZWFkZXJzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsaWRhdGVNZXRhZGF0YUFycmF5KFxuICAgICAgICBjb25maWcuYWxsb3dlZFJlcXVlc3RIZWFkZXJzLFxuICAgICAgICAnYWxsb3dlZFJlcXVlc3RIZWFkZXJzJyxcbiAgICAgICAgMSxcbiAgICAgICAgMTAsXG4gICAgICAgIDEsXG4gICAgICAgIDEwMCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYWxsb3dlZFJlc3BvbnNlSGVhZGVyc1xuICAgIGlmIChjb25maWcuYWxsb3dlZFJlc3BvbnNlSGVhZGVycyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnZhbGlkYXRlTWV0YWRhdGFBcnJheShcbiAgICAgICAgY29uZmlnLmFsbG93ZWRSZXNwb25zZUhlYWRlcnMsXG4gICAgICAgICdhbGxvd2VkUmVzcG9uc2VIZWFkZXJzJyxcbiAgICAgICAgMSxcbiAgICAgICAgMTAsXG4gICAgICAgIDEsXG4gICAgICAgIDEwMCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIG1ldGFkYXRhIGNvbmZpZ3VyYXRpb24gYXJyYXkgKHF1ZXJ5IHBhcmFtZXRlcnMgb3IgaGVhZGVycylcbiAgICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byB2YWxpZGF0ZVxuICAgKiBAcGFyYW0gZmllbGROYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBmb3IgZXJyb3IgbWVzc2FnZXNcbiAgICogQHBhcmFtIG1pbkl0ZW1zIE1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zIGFsbG93ZWQgaW4gdGhlIGFycmF5XG4gICAqIEBwYXJhbSBtYXhJdGVtcyBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyBhbGxvd2VkIGluIHRoZSBhcnJheVxuICAgKiBAcGFyYW0gbWluU3RyaW5nTGVuZ3RoIE1pbmltdW0gbGVuZ3RoIGZvciBlYWNoIHN0cmluZyBpbiB0aGUgYXJyYXlcbiAgICogQHBhcmFtIG1heFN0cmluZ0xlbmd0aCBNYXhpbXVtIGxlbmd0aCBmb3IgZWFjaCBzdHJpbmcgaW4gdGhlIGFycmF5XG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU1ldGFkYXRhQXJyYXkoXG4gICAgYXJyYXk6IHN0cmluZ1tdLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIG1pbkl0ZW1zOiBudW1iZXIsXG4gICAgbWF4SXRlbXM6IG51bWJlcixcbiAgICBtaW5TdHJpbmdMZW5ndGg6IG51bWJlcixcbiAgICBtYXhTdHJpbmdMZW5ndGg6IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgLy8gU2tpcCB2YWxpZGF0aW9uIGlmIHRoZSBlbnRpcmUgYXJyYXkgaXMgYW4gdW5yZXNvbHZlZCB0b2tlblxuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoYXJyYXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYXJyYXkgaXMgZW1wdHlcbiAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdNZXRhZGF0YUFycmF5RW1wdHknLFxuICAgICAgICBgJHtmaWVsZE5hbWV9IGNhbm5vdCBiZSBhbiBlbXB0eSBhcnJheS4gSXQgbXVzdCBjb250YWluIGF0IGxlYXN0ICR7bWluSXRlbXN9IGl0ZW0ocylgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhcnJheSBzaXplIGNvbnN0cmFpbnRzXG4gICAgaWYgKGFycmF5Lmxlbmd0aCA8IG1pbkl0ZW1zKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdNZXRhZGF0YUFycmF5VG9vRmV3JyxcbiAgICAgICAgYCR7ZmllbGROYW1lfSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgJHttaW5JdGVtc30gaXRlbShzKS4gRm91bmQgJHthcnJheS5sZW5ndGh9IGl0ZW0ocylgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoYXJyYXkubGVuZ3RoID4gbWF4SXRlbXMpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgJ01ldGFkYXRhQXJyYXlUb29NYW55JyxcbiAgICAgICAgYCR7ZmllbGROYW1lfSBjYW5ub3QgZXhjZWVkICR7bWF4SXRlbXN9IGl0ZW1zLiBGb3VuZCAke2FycmF5Lmxlbmd0aH0gaXRlbXNgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBlYWNoIHN0cmluZyBpbiB0aGUgYXJyYXlcbiAgICBhcnJheS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChpdGVtKSkge1xuICAgICAgICByZXR1cm47IC8vIFNraXAgdmFsaWRhdGlvbiBmb3IgdW5yZXNvbHZlZCB0b2tlbnNcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVTdHJpbmdGaWVsZCh7XG4gICAgICAgIHZhbHVlOiBpdGVtLFxuICAgICAgICBmaWVsZE5hbWU6IGAke2ZpZWxkTmFtZX1bJHtpbmRleH1dYCxcbiAgICAgICAgbWluTGVuZ3RoOiBtaW5TdHJpbmdMZW5ndGgsXG4gICAgICAgIG1heExlbmd0aDogbWF4U3RyaW5nTGVuZ3RoLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoJ01ldGFkYXRhQXJyYXlJdGVtSW52YWxpZCcsIGVycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGEgdG9vbCBmaWx0ZXJcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlVG9vbEZpbHRlcihmaWx0ZXI6IEFwaUdhdGV3YXlUb29sRmlsdGVyKTogdm9pZCB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChmaWx0ZXIuZmlsdGVyUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBmaWx0ZXIgcGF0aFxuICAgIGNvbnN0IHBhdGhFcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgIGZpbHRlci5maWx0ZXJQYXRoLFxuICAgICAgJ0ZpbHRlciBwYXRoJyxcbiAgICAgIC9eXFwvW1xcd1xcLXt9LypdKiQvLFxuICAgICAgJ0ZpbHRlciBwYXRoIG11c3Qgc3RhcnQgd2l0aCBhIGZvcndhcmQgc2xhc2ggYW5kIGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgdW5kZXJzY29yZXMsIGN1cmx5IGJyYWNlcywgZm9yd2FyZCBzbGFzaGVzLCBhbmQgYXN0ZXJpc2tzJyxcbiAgICApO1xuXG4gICAgaWYgKHBhdGhFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKCdUb29sRmlsdGVyUGF0aEludmFsaWQnLCBwYXRoRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZXRob2RzXG4gICAgaWYgKCFmaWx0ZXIubWV0aG9kcyB8fCBmaWx0ZXIubWV0aG9kcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcignVG9vbEZpbHRlck1ldGhvZHNSZXF1aXJlZCcsIGBBdCBsZWFzdCBvbmUgSFRUUCBtZXRob2QgaXMgcmVxdWlyZWQgZm9yIGZpbHRlciBwYXRoOiAke2ZpbHRlci5maWx0ZXJQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSB0b29sIG92ZXJyaWRlXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVRvb2xPdmVycmlkZShvdmVycmlkZTogQXBpR2F0ZXdheVRvb2xPdmVycmlkZSk6IHZvaWQge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQob3ZlcnJpZGUucGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSB0aGF0IG92ZXJyaWRlIHBhdGggaXMgZXhwbGljaXQgKG5vIHdpbGRjYXJkcylcbiAgICBpZiAob3ZlcnJpZGUucGF0aC5pbmNsdWRlcygnKicpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICdUb29sT3ZlcnJpZGVQYXRoV2lsZGNhcmROb3RBbGxvd2VkJyxcbiAgICAgICAgYFRvb2wgb3ZlcnJpZGUgcGF0aCBjYW5ub3QgY29udGFpbiB3aWxkY2FyZHMuIFBhdGg6ICR7b3ZlcnJpZGUucGF0aH0uIGAgK1xuICAgICAgICAnVG9vbCBvdmVycmlkZXMgbXVzdCBzcGVjaWZ5IGFuIGV4cGxpY2l0IHBhdGggdGhhdCBtYXRjaGVzIGFuIGV4aXN0aW5nIG9wZXJhdGlvbiBpbiB5b3VyIEFQSS4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBvdmVycmlkZSBwYXRoIGZvcm1hdFxuICAgIGNvbnN0IHBhdGhFcnJvcnMgPSB2YWxpZGF0ZUZpZWxkUGF0dGVybihcbiAgICAgIG92ZXJyaWRlLnBhdGgsXG4gICAgICAnT3ZlcnJpZGUgcGF0aCcsXG4gICAgICAvXlxcL1tcXHdcXC17fS9dKiQvLFxuICAgICAgJ092ZXJyaWRlIHBhdGggbXVzdCBzdGFydCB3aXRoIGEgZm9yd2FyZCBzbGFzaCBhbmQgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgY3VybHkgYnJhY2VzLCBhbmQgZm9yd2FyZCBzbGFzaGVzJyxcbiAgICApO1xuXG4gICAgaWYgKHBhdGhFcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKCdUb29sT3ZlcnJpZGVQYXRoSW52YWxpZCcsIHBhdGhFcnJvcnMuam9pbignXFxuJykpO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIG92ZXJyaWRlIG5hbWVcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKG92ZXJyaWRlLm5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZUVycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgdmFsdWU6IG92ZXJyaWRlLm5hbWUsXG4gICAgICBmaWVsZE5hbWU6ICdPdmVycmlkZSB0b29sIG5hbWUnLFxuICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgbWF4TGVuZ3RoOiA2NCxcbiAgICB9KTtcblxuICAgIGlmIChuYW1lRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcignVG9vbE92ZXJyaWRlTmFtZUludmFsaWQnLCBuYW1lRXJyb3JzLmpvaW4oJ1xcbicpKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBvdmVycmlkZSBkZXNjcmlwdGlvbiBpZiBwcm92aWRlZFxuICAgIGlmIChvdmVycmlkZS5kZXNjcmlwdGlvbiAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKG92ZXJyaWRlLmRlc2NyaXB0aW9uKSkge1xuICAgICAgY29uc3QgZGVzY0Vycm9ycyA9IHZhbGlkYXRlU3RyaW5nRmllbGQoe1xuICAgICAgICB2YWx1ZTogb3ZlcnJpZGUuZGVzY3JpcHRpb24sXG4gICAgICAgIGZpZWxkTmFtZTogJ092ZXJyaWRlIGRlc2NyaXB0aW9uJyxcbiAgICAgICAgbWluTGVuZ3RoOiAxLFxuICAgICAgICBtYXhMZW5ndGg6IDIwMCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGVzY0Vycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcignVG9vbE92ZXJyaWRlRGVzY3JpcHRpb25JbnZhbGlkJywgZGVzY0Vycm9ycy5qb2luKCdcXG4nKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|