@aws-cdk/aws-amplify-alpha
Version:
The CDK Construct Library for AWS::Amplify
461 lines • 59 kB
JavaScript
"use strict";
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BuildComputeType = exports.CacheConfigType = exports.Platform = exports.CustomRule = exports.RedirectStatus = exports.App = void 0;
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_amplify_1 = require("aws-cdk-lib/aws-amplify");
const iam = require("aws-cdk-lib/aws-iam");
const core_1 = require("aws-cdk-lib/core");
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
const branch_1 = require("./branch");
const domain_1 = require("./domain");
const utils_1 = require("./utils");
/**
* An Amplify Console application
*/
let App = (() => {
let _classDecorators = [prop_injectable_1.propertyInjectable, helpers_internal_1.noBoxStackTraces];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = core_1.Resource;
let _instanceExtraInitializers = [];
let _addCustomRule_decorators;
let _addEnvironment_decorators;
let _addAutoBranchEnvironment_decorators;
let _addBranch_decorators;
let _addDomain_decorators;
var App = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
_addCustomRule_decorators = [(0, metadata_resource_1.MethodMetadata)()];
_addEnvironment_decorators = [(0, metadata_resource_1.MethodMetadata)()];
_addAutoBranchEnvironment_decorators = [(0, metadata_resource_1.MethodMetadata)()];
_addBranch_decorators = [(0, metadata_resource_1.MethodMetadata)()];
_addDomain_decorators = [(0, metadata_resource_1.MethodMetadata)()];
__esDecorate(this, null, _addCustomRule_decorators, { kind: "method", name: "addCustomRule", static: false, private: false, access: { has: obj => "addCustomRule" in obj, get: obj => obj.addCustomRule }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(this, null, _addEnvironment_decorators, { kind: "method", name: "addEnvironment", static: false, private: false, access: { has: obj => "addEnvironment" in obj, get: obj => obj.addEnvironment }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(this, null, _addAutoBranchEnvironment_decorators, { kind: "method", name: "addAutoBranchEnvironment", static: false, private: false, access: { has: obj => "addAutoBranchEnvironment" in obj, get: obj => obj.addAutoBranchEnvironment }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(this, null, _addBranch_decorators, { kind: "method", name: "addBranch", static: false, private: false, access: { has: obj => "addBranch" in obj, get: obj => obj.addBranch }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(this, null, _addDomain_decorators, { kind: "method", name: "addDomain", static: false, private: false, access: { has: obj => "addDomain" in obj, get: obj => obj.addDomain }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
App = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-amplify-alpha.App", version: "2.257.0-alpha.0" };
/** Uniquely identifies this class. */
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-amplify-alpha.App';
/**
* Import an existing application
*/
static fromAppId(scope, id, appId) {
class Import extends core_1.Resource {
appId = appId;
}
return new Import(scope, id);
}
appId = __runInitializers(this, _instanceExtraInitializers);
/**
* The name of the application
*
* @attribute
*/
appName;
/**
* The ARN of the application
*
* @attribute
*/
arn;
/**
* The default domain of the application
*
* @attribute
*/
defaultDomain;
/**
* The principal to grant permissions to
*/
grantPrincipal;
/**
* The IAM role for an SSR app.
*/
computeRole;
/**
* The platform of the app
*/
platform;
customRules;
environmentVariables;
autoBranchEnvironmentVariables;
constructor(scope, id, props) {
super(scope, id);
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_AppProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, App);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
this.customRules = helpers_internal_1.Box.fromArray(props.customRules || []);
this.environmentVariables = props.environmentVariables || {};
this.autoBranchEnvironmentVariables = props.autoBranchCreation && props.autoBranchCreation.environmentVariables || {};
const role = props.role || new iam.Role(this, 'Role', {
assumedBy: new iam.ServicePrincipal('amplify.amazonaws.com'),
});
this.grantPrincipal = role;
let computedRole;
const appPlatform = props.platform || Platform.WEB;
const isSSR = (0, utils_1.isServerSideRendered)(appPlatform);
if (props.computeRole) {
if (!isSSR) {
throw new core_1.ValidationError((0, helpers_internal_1.lit) `InvalidComputeRolePlatform`, '`computeRole` can only be specified for `Platform.WEB_COMPUTE` or `Platform.WEB_DYNAMIC`.', this);
}
computedRole = props.computeRole;
}
else if (isSSR) {
computedRole = new iam.Role(this, 'ComputeRole', {
assumedBy: new iam.ServicePrincipal('amplify.amazonaws.com'),
});
}
this.computeRole = computedRole;
const sourceCodeProviderOptions = props.sourceCodeProvider?.bind(this);
this.platform = appPlatform;
const app = new aws_amplify_1.CfnApp(this, 'Resource', {
accessToken: sourceCodeProviderOptions?.accessToken?.unsafeUnwrap(), // Safe usage
autoBranchCreationConfig: props.autoBranchCreation && {
autoBranchCreationPatterns: props.autoBranchCreation.patterns,
basicAuthConfig: props.autoBranchCreation.basicAuth
? props.autoBranchCreation.basicAuth.bind(this, 'BranchBasicAuth')
: { enableBasicAuth: false },
buildSpec: props.autoBranchCreation.buildSpec && props.autoBranchCreation.buildSpec.toBuildSpec(),
enableAutoBranchCreation: true,
enableAutoBuild: props.autoBranchCreation.autoBuild ?? true,
environmentVariables: core_1.Lazy.any({ produce: () => (0, utils_1.renderEnvironmentVariables)(this.autoBranchEnvironmentVariables) }, { omitEmptyArray: true }),
enablePullRequestPreview: props.autoBranchCreation.pullRequestPreview ?? true,
pullRequestEnvironmentName: props.autoBranchCreation.pullRequestEnvironmentName,
stage: props.autoBranchCreation.stage,
},
enableBranchAutoDeletion: props.autoBranchDeletion,
basicAuthConfig: props.basicAuth
? props.basicAuth.bind(this, 'AppBasicAuth')
: { enableBasicAuth: false },
buildSpec: props.buildSpec && props.buildSpec.toBuildSpec(),
cacheConfig: props.cacheConfigType ? { type: props.cacheConfigType } : undefined,
computeRoleArn: this.computeRole?.roleArn,
customRules: this.customRules,
description: props.description,
environmentVariables: core_1.Lazy.any({ produce: () => (0, utils_1.renderEnvironmentVariables)(this.environmentVariables) }, { omitEmptyArray: true }),
iamServiceRole: role.roleArn,
name: props.appName || this.node.id,
oauthToken: sourceCodeProviderOptions?.oauthToken?.unsafeUnwrap(), // Safe usage
repository: sourceCodeProviderOptions?.repository,
customHeaders: props.customResponseHeaders && props.customResponseHeaders.length > 0
? renderCustomResponseHeaders(props.customResponseHeaders, this)
: undefined,
platform: appPlatform,
jobConfig: props.buildComputeType ? { buildComputeType: props.buildComputeType } : undefined,
});
this.appId = app.attrAppId;
this.appName = app.attrAppName;
this.arn = app.attrArn;
this.defaultDomain = app.attrDefaultDomain;
}
/**
* Adds a custom rewrite/redirect rule to this application
*/
addCustomRule(rule) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_CustomRule(rule);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addCustomRule);
}
throw error;
}
this.customRules.push(rule);
return this;
}
/**
* Adds an environment variable to this application.
*
* All environment variables that you add are encrypted to prevent rogue
* access so you can use them to store secret information.
*/
addEnvironment(name, value) {
this.environmentVariables[name] = value;
return this;
}
/**
* Adds an environment variable to the auto created branch.
*
* All environment variables that you add are encrypted to prevent rogue
* access so you can use them to store secret information.
*/
addAutoBranchEnvironment(name, value) {
this.autoBranchEnvironmentVariables[name] = value;
return this;
}
/**
* Adds a branch to this application
*/
addBranch(id, options = {}) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_BranchOptions(options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addBranch);
}
throw error;
}
return new branch_1.Branch(this, id, {
...options,
app: this,
});
}
/**
* Adds a domain to this application
*/
addDomain(id, options = {}) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_DomainOptions(options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.addDomain);
}
throw error;
}
return new domain_1.Domain(this, id, {
...options,
app: this,
autoSubDomainIamRole: this.grantPrincipal,
});
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return App = _classThis;
})();
exports.App = App;
/**
* The status code for a URL rewrite or redirect rule.
*/
var RedirectStatus;
(function (RedirectStatus) {
/**
* Rewrite (200)
*/
RedirectStatus["REWRITE"] = "200";
/**
* Permanent redirect (301)
*/
RedirectStatus["PERMANENT_REDIRECT"] = "301";
/**
* Temporary redirect (302)
*/
RedirectStatus["TEMPORARY_REDIRECT"] = "302";
/**
* Not found (404)
*/
RedirectStatus["NOT_FOUND"] = "404";
/**
* Not found rewrite (404)
*/
RedirectStatus["NOT_FOUND_REWRITE"] = "404-200";
})(RedirectStatus || (exports.RedirectStatus = RedirectStatus = {}));
/**
* Custom rewrite/redirect rule for an Amplify App.
*
* @see https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html
*/
class CustomRule {
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-amplify-alpha.CustomRule", version: "2.257.0-alpha.0" };
/**
* Sets up a 200 rewrite for all paths to `index.html` except for path
* containing a file extension.
*/
static SINGLE_PAGE_APPLICATION_REDIRECT = new CustomRule({
source: '</^[^.]+$/>',
target: '/index.html',
status: RedirectStatus.REWRITE,
});
/**
* The source pattern for a URL rewrite or redirect rule.
*
* @see https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html
*/
source;
/**
* The target pattern for a URL rewrite or redirect rule.
*
* @see https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html
*/
target;
/**
* The status code for a URL rewrite or redirect rule.
*
* @see https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html
*
* @default PERMANENT_REDIRECT
*/
status;
/**
* The condition for a URL rewrite or redirect rule, e.g. country code.
*
* @see https://docs.aws.amazon.com/amplify/latest/userguide/redirects.html
*
* @default - no condition
*/
condition;
constructor(options) {
try {
jsiiDeprecationWarnings._aws_cdk_aws_amplify_alpha_CustomRuleOptions(options);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, CustomRule);
}
throw error;
}
this.source = options.source;
this.target = options.target;
this.status = options.status;
this.condition = options.condition;
}
}
exports.CustomRule = CustomRule;
/**
* Renders custom response headers to YAML format.
*
* @param customHeaders - Array of custom headers. Must not be empty.
* @param scope - Construct scope for error reporting
* @returns YAML string representation of custom headers
*
* @internal
*/
function renderCustomResponseHeaders(customHeaders, scope) {
// Defensive assertion - should never happen due to call site validation
if (customHeaders.length === 0) {
throw new core_1.ValidationError((0, helpers_internal_1.lit) `EmptyCustomResponseHeaders`, 'renderCustomResponseHeaders called with empty array', scope);
}
const hasAppRoot = customHeaders[0].appRoot !== undefined;
const yaml = [hasAppRoot ? 'applications:' : 'customHeaders:'];
for (const customHeader of customHeaders) {
if ((customHeader.appRoot !== undefined) !== hasAppRoot) {
throw new core_1.ValidationError((0, helpers_internal_1.lit) `InconsistentAppRoot`, 'appRoot must be either be present or absent across all custom response headers', scope);
}
const baseIndentation = ' '.repeat(hasAppRoot ? 6 : 2);
if (hasAppRoot) {
yaml.push(` - appRoot: ${customHeader.appRoot}`);
yaml.push(' customHeaders:');
}
yaml.push(`${baseIndentation}- pattern: "${customHeader.pattern}"`);
yaml.push(`${baseIndentation} headers:`);
for (const [key, value] of Object.entries(customHeader.headers)) {
yaml.push(`${baseIndentation} - key: "${key}"`);
yaml.push(`${baseIndentation} value: "${value}"`);
}
}
return `${yaml.join('\n')}\n`;
}
/**
* Available hosting platforms to use on the App.
*/
var Platform;
(function (Platform) {
/**
* WEB - Used to indicate that the app is hosted using only static assets.
*/
Platform["WEB"] = "WEB";
/**
* WEB_COMPUTE - Used to indicate the app is hosted using a combination of
* server side rendered and static assets.
*/
Platform["WEB_COMPUTE"] = "WEB_COMPUTE";
/**
* WEB_DYNAMIC - Used to indicate the app is hosted using a fully dynamic architecture, where requests are processed at runtime by backend compute services.
*/
Platform["WEB_DYNAMIC"] = "WEB_DYNAMIC";
})(Platform || (exports.Platform = Platform = {}));
/**
* The type of cache configuration to use for an Amplify app.
*/
var CacheConfigType;
(function (CacheConfigType) {
/**
* AMPLIFY_MANAGED - Automatically applies an optimized cache configuration
* for your app based on its platform, routing rules, and rewrite rules.
*/
CacheConfigType["AMPLIFY_MANAGED"] = "AMPLIFY_MANAGED";
/**
* AMPLIFY_MANAGED_NO_COOKIES - The same as AMPLIFY_MANAGED,
* except that it excludes all cookies from the cache key.
*/
CacheConfigType["AMPLIFY_MANAGED_NO_COOKIES"] = "AMPLIFY_MANAGED_NO_COOKIES";
})(CacheConfigType || (exports.CacheConfigType = CacheConfigType = {}));
/**
* Specifies the size of the build instance.
*
* @link https://docs.aws.amazon.com/amplify/latest/userguide/custom-build-instance.html
*/
var BuildComputeType;
(function (BuildComputeType) {
/**
* vCPUs: 4, Memory: 8 GiB, Disk space: 128 GB
*/
BuildComputeType["STANDARD_8GB"] = "STANDARD_8GB";
/**
* vCPUs: 8, Memory: 16 GiB, Disk space: 128 GB
*/
BuildComputeType["LARGE_16GB"] = "LARGE_16GB";
/**
* vCPUs: 36, Memory: 72 GiB, Disk space: 256 GB
*/
BuildComputeType["XLARGE_72GB"] = "XLARGE_72GB";
})(BuildComputeType || (exports.BuildComputeType = BuildComputeType = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHlEQUFpRDtBQUVqRCwyQ0FBMkM7QUFFM0MsMkNBQW1FO0FBRW5FLDRFQUFtRjtBQUNuRiw4RUFBOEY7QUFDOUYsMEVBQTBFO0FBSTFFLHFDQUFrQztBQUVsQyxxQ0FBa0M7QUFDbEMsbUNBQTJFO0FBeUwzRTs7R0FFRztJQUdVLEdBQUc7NEJBRmYsb0NBQWtCLEVBQ2xCLG1DQUFnQjs7OztzQkFDUSxlQUFROzs7Ozs7O21CQUFoQixTQUFRLFdBQVE7Ozs7eUNBdUk5QixJQUFBLGtDQUFjLEdBQUU7MENBWWhCLElBQUEsa0NBQWMsR0FBRTtvREFZaEIsSUFBQSxrQ0FBYyxHQUFFO3FDQVNoQixJQUFBLGtDQUFjLEdBQUU7cUNBV2hCLElBQUEsa0NBQWMsR0FBRTtZQTNDakIsMExBQU8sYUFBYSw2REFHbkI7WUFTRCw2TEFBTyxjQUFjLDZEQUdwQjtZQVNELDJOQUFPLHdCQUF3Qiw2REFHOUI7WUFNRCw4S0FBTyxTQUFTLDZEQUtmO1lBTUQsOEtBQU8sU0FBUyw2REFNZjtZQTFMSCw2S0EyTEM7Ozs7O1FBMUxDLHNDQUFzQztRQUMvQixNQUFNLENBQVUscUJBQXFCLEdBQVcsZ0NBQWdDLENBQUM7UUFFeEY7O1dBRUc7UUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWE7WUFDakUsTUFBTSxNQUFPLFNBQVEsZUFBUTtnQkFDWCxLQUFLLEdBQUcsS0FBSyxDQUFDO2FBQy9CO1lBQ0QsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDOUI7UUFFZSxLQUFLLEdBZFYsbURBQUcsQ0FjZ0I7UUFFOUI7Ozs7V0FJRztRQUNhLE9BQU8sQ0FBUztRQUVoQzs7OztXQUlHO1FBQ2EsR0FBRyxDQUFTO1FB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QkQsV0FBWSxRQUFRO0lBQ2xCOztPQUVHO0lBQ0gsdUJBQVcsQ0FBQTtJQUVYOzs7T0FHRztJQUNILHVDQUEyQixDQUFBO0lBRTNCOztPQUVHO0lBQ0gsdUNBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQWhCVyxRQUFRLHdCQUFSLFFBQVEsUUFnQm5CO0FBRUQ7O0dBRUc7QUFDSCxJQUFZLGVBWVg7QUFaRCxXQUFZLGVBQWU7SUFDekI7OztPQUdHO0lBQ0gsc0RBQW1DLENBQUE7SUFFbkM7OztPQUdHO0lBQ0gsNEVBQXlELENBQUE7QUFDM0QsQ0FBQyxFQVpXLGVBQWUsK0JBQWYsZUFBZSxRQVkxQjtBQUVEOzs7O0dBSUc7QUFDSCxJQUFZLGdCQWVYO0FBZkQsV0FBWSxnQkFBZ0I7SUFDMUI7O09BRUc7SUFDSCxpREFBNkIsQ0FBQTtJQUU3Qjs7T0FFRztJQUNILDZDQUF5QixDQUFBO0lBRXpCOztPQUVHO0lBQ0gsK0NBQTJCLENBQUE7QUFDN0IsQ0FBQyxFQWZXLGdCQUFnQixnQ0FBaEIsZ0JBQWdCLFFBZTNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2ZuQXBwIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWFtcGxpZnknO1xuaW1wb3J0IHR5cGUgKiBhcyBjb2RlYnVpbGQgZnJvbSAnYXdzLWNkay1saWIvYXdzLWNvZGVidWlsZCc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgdHlwZSB7IElSZXNvdXJjZSwgU2VjcmV0VmFsdWUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IExhenksIFJlc291cmNlLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB0eXBlIHsgSUFycmF5Qm94IH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvaGVscGVycy1pbnRlcm5hbCc7XG5pbXBvcnQgeyBCb3gsIGxpdCwgbm9Cb3hTdGFja1RyYWNlcyB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IEJhc2ljQXV0aCB9IGZyb20gJy4vYmFzaWMtYXV0aCc7XG5pbXBvcnQgdHlwZSB7IEJyYW5jaE9wdGlvbnMgfSBmcm9tICcuL2JyYW5jaCc7XG5pbXBvcnQgeyBCcmFuY2ggfSBmcm9tICcuL2JyYW5jaCc7XG5pbXBvcnQgdHlwZSB7IERvbWFpbk9wdGlvbnMgfSBmcm9tICcuL2RvbWFpbic7XG5pbXBvcnQgeyBEb21haW4gfSBmcm9tICcuL2RvbWFpbic7XG5pbXBvcnQgeyByZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcywgaXNTZXJ2ZXJTaWRlUmVuZGVyZWQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBBbiBBbXBsaWZ5IENvbnNvbGUgYXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQXBwIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIFRoZSBhcHBsaWNhdGlvbiBpZFxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBzb3VyY2UgY29kZSBwcm92aWRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZUNvZGVQcm92aWRlckNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgcmVwb3NpdG9yeSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBNdXN0IHVzZSB0aGUgYEhUVFBTYCBwcm90b2NvbC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGtgLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb3NpdG9yeTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPQXV0aCB0b2tlbiBmb3IgM3JkIHBhcnR5IHNvdXJjZSBjb250cm9sIHN5c3RlbSBmb3IgYW4gQW1wbGlmeSBBcHAsIHVzZWRcbiAgICogdG8gY3JlYXRlIHdlYmhvb2sgYW5kIHJlYWQtb25seSBkZXBsb3kga2V5LiBPQXV0aCB0b2tlbiBpcyBub3Qgc3RvcmVkLlxuICAgKlxuICAgKiBFaXRoZXIgYGFjY2Vzc1Rva2VuYCBvciBgb2F1dGhUb2tlbmAgbXVzdCBiZSBzcGVjaWZpZWQgaWYgYHJlcG9zaXRvcnlgXG4gICAqIGlzIHNwZWNpZmllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkbyBub3QgdXNlIGEgdG9rZW5cbiAgICovXG4gIHJlYWRvbmx5IG9hdXRoVG9rZW4/OiBTZWNyZXRWYWx1ZTtcblxuICAvKipcbiAgICogUGVyc29uYWwgQWNjZXNzIHRva2VuIGZvciAzcmQgcGFydHkgc291cmNlIGNvbnRyb2wgc3lzdGVtIGZvciBhbiBBbXBsaWZ5XG4gICAqIEFwcCwgdXNlZCB0byBjcmVhdGUgd2ViaG9vayBhbmQgcmVhZC1vbmx5IGRlcGxveSBrZXkuIFRva2VuIGlzIG5vdCBzdG9yZWQuXG4gICAqXG4gICAqIEVpdGhlciBgYWNjZXNzVG9rZW5gIG9yIGBvYXV0aFRva2VuYCBtdXN0IGJlIHNwZWNpZmllZCBpZiBgcmVwb3NpdG9yeWBcbiAgICogaXMgc2VwY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvIG5vdCB1c2UgYSB0b2tlblxuICAgKi9cbiAgcmVhZG9ubHkgYWNjZXNzVG9rZW4/OiBTZWNyZXRWYWx1ZTtcbn1cblxuLyoqXG4gKiBBIHNvdXJjZSBjb2RlIHByb3ZpZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVNvdXJjZUNvZGVQcm92aWRlciB7XG4gIC8qKlxuICAgKiBCaW5kcyB0aGUgc291cmNlIGNvZGUgcHJvdmlkZXIgdG8gYW4gYXBwXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgVGhlIGFwcCBbZGlzYWJsZS1hd3NsaW50OnJlZi12aWEtaW50ZXJmYWNlXVxuICAgKi9cbiAgYmluZChhcHA6IEFwcCk6IFNvdXJjZUNvZGVQcm92aWRlckNvbmZpZztcbn1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciBhbiBBcHBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBmb3IgdGhlIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYSBDREsgZ2VuZXJhdGVkIG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IGFwcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgY29kZSBwcm92aWRlciBmb3IgdGhpcyBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdCBjb25uZWN0ZWQgdG8gYSBzb3VyY2UgY29kZSBwcm92aWRlclxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQ29kZVByb3ZpZGVyPzogSVNvdXJjZUNvZGVQcm92aWRlcjtcblxuICAvKipcbiAgICogVGhlIGF1dG8gYnJhbmNoIGNyZWF0aW9uIGNvbmZpZ3VyYXRpb24uIFVzZSB0aGlzIHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlXG4gICAqIGJyYW5jaGVzIHRoYXQgbWF0Y2ggYSBjZXJ0YWluIHBhdHRlcm4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYXV0byBicmFuY2ggY3JlYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGF1dG9CcmFuY2hDcmVhdGlvbj86IEF1dG9CcmFuY2hDcmVhdGlvbjtcblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBkaXNjb25uZWN0IGEgYnJhbmNoIGluIHRoZSBBbXBsaWZ5IENvbnNvbGUgd2hlbiB5b3UgZGVsZXRlIGFcbiAgICogYnJhbmNoIGZyb20geW91ciBHaXQgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGF1dG9CcmFuY2hEZWxldGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBCYXNpYyBBdXRoIGNvbmZpZ3VyYXRpb24uIFVzZSB0aGlzIHRvIHNldCBwYXNzd29yZCBwcm90ZWN0aW9uIGF0IGFuXG4gICAqIGFwcCBsZXZlbCB0byBhbGwgeW91ciBicmFuY2hlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwYXNzd29yZCBwcm90ZWN0aW9uXG4gICAqL1xuICByZWFkb25seSBiYXNpY0F1dGg/OiBCYXNpY0F1dGg7XG5cbiAgLyoqXG4gICAqIEJ1aWxkU3BlYyBmb3IgdGhlIGFwcGxpY2F0aW9uLiBBbHRlcm5hdGl2ZWx5LCBhZGQgYSBgYW1wbGlmeS55bWxgXG4gICAqIGZpbGUgdG8gdGhlIHJlcG9zaXRvcnkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtcGxpZnkvbGF0ZXN0L3VzZXJndWlkZS9idWlsZC1zZXR0aW5ncy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gYnVpbGQgc3BlY1xuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRTcGVjPzogY29kZWJ1aWxkLkJ1aWxkU3BlYztcblxuICAvKipcbiAgICogVGhlIGN1c3RvbSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgZm9yIGFuIEFtcGxpZnkgYXBwLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbXBsaWZ5L2xhdGVzdC91c2VyZ3VpZGUvY3VzdG9tLWhlYWRlcnMuaHRtbFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGN1c3RvbSByZXNwb25zZSBoZWFkZXJzXG4gICAqL1xuICByZWFkb25seSBjdXN0b21SZXNwb25zZUhlYWRlcnM/OiBDdXN0b21SZXNwb25zZUhlYWRlcltdO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcmV3cml0ZS9yZWRpcmVjdCBydWxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY3VzdG9tIHJld3JpdGUvcmVkaXJlY3QgcnVsZXNcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVJ1bGVzPzogQ3VzdG9tUnVsZVtdO1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBBbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgeW91IGFkZCBhcmUgZW5jcnlwdGVkIHRvIHByZXZlbnQgcm9ndWVcbiAgICogYWNjZXNzIHNvIHlvdSBjYW4gdXNlIHRoZW0gdG8gc3RvcmUgc2VjcmV0IGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGhlIElBTSBzZXJ2aWNlIHJvbGUgdG8gYXNzb2NpYXRlIHdpdGggdGhlIGFwcGxpY2F0aW9uLiBUaGUgQXBwXG4gICAqIGltcGxlbWVudHMgSUdyYW50YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5ldyByb2xlIGlzIGNyZWF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IHJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgaG9zdGluZyBwbGF0Zm9ybSB0byB1c2UuIFNldCB0byBXRUIgZm9yIHN0YXRpYyBzaXRlXG4gICAqIGdlbmVyYXRlZCAoU1NHKSBhcHBzIChpLmUuIGEgQ3JlYXRlIFJlYWN0IEFwcCBvciBHYXRzYnkpIGFuZCBXRUJfQ09NUFVURVxuICAgKiBmb3Igc2VydmVyIHNpZGUgcmVuZGVyZWQgKFNTUikgYXBwcyAoaS5lLiBOZXh0SlMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBQbGF0Zm9ybS5XRUJcbiAgICovXG4gIHJlYWRvbmx5IHBsYXRmb3JtPzogUGxhdGZvcm07XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGNhY2hlIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciBhbiBBbXBsaWZ5IGFwcC5cbiAgICpcbiAgICogQGRlZmF1bHQgQ2FjaGVDb25maWdUeXBlLkFNUExJRllfTUFOQUdFRFxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVDb25maWdUeXBlPzogQ2FjaGVDb25maWdUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHJvbGUgZm9yIGFuIFNTUiBhcHAuXG4gICAqIFRoZSBDb21wdXRlIHJvbGUgYWxsb3dzIHRoZSBBbXBsaWZ5IEhvc3RpbmcgY29tcHV0ZSBzZXJ2aWNlIHRvIHNlY3VyZWx5IGFjY2VzcyBzcGVjaWZpYyBBV1MgcmVzb3VyY2VzIGJhc2VkIG9uIHRoZSByb2xlJ3MgcGVybWlzc2lvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IHVuZGVmaW5lZCAtIGEgbmV3IHJvbGUgaXMgY3JlYXRlZCB3aGVuIGBwbGF0Zm9ybWAgaXMgYFBsYXRmb3JtLldFQl9DT01QVVRFYCBvciBgUGxhdGZvcm0uV0VCX0RZTkFNSUNgLCBvdGhlcndpc2Ugbm8gY29tcHV0ZSByb2xlXG4gICAqL1xuICByZWFkb25seSBjb21wdXRlUm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWlsZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gQW1wbGlmeSBkZWZhdWx0IHNldHRpbmcgaXMgYEJ1aWxkQ29tcHV0ZVR5cGUuU1RBTkRBUkRfOEdCYC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tcHV0ZVR5cGU/OiBCdWlsZENvbXB1dGVUeXBlO1xufVxuXG4vKipcbiAqIEFuIEFtcGxpZnkgQ29uc29sZSBhcHBsaWNhdGlvblxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5Abm9Cb3hTdGFja1RyYWNlc1xuZXhwb3J0IGNsYXNzIEFwcCBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSUFwcCwgaWFtLklHcmFudGFibGUge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1hbXBsaWZ5LWFscGhhLkFwcCc7XG5cbiAgLyoqXG4gICAqIEltcG9ydCBhbiBleGlzdGluZyBhcHBsaWNhdGlvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tQXBwSWQoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXBwSWQ6IHN0cmluZyk6IElBcHAge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIFJlc291cmNlIGltcGxlbWVudHMgSUFwcCB7XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgYXBwSWQgPSBhcHBJZDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwcE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEFSTiBvZiB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBkb21haW4gb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBkZWZhdWx0RG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmluY2lwYWwgdG8gZ3JhbnQgcGVybWlzc2lvbnMgdG9cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBncmFudFByaW5jaXBhbDogaWFtLklQcmluY2lwYWw7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSBmb3IgYW4gU1NSIGFwcC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb21wdXRlUm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogVGhlIHBsYXRmb3JtIG9mIHRoZSBhcHBcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBwbGF0Zm9ybT86IFBsYXRmb3JtO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tUnVsZXM6IElBcnJheUJveDxDdXN0b21SdWxlPjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnZpcm9ubWVudFZhcmlhYmxlczogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b0JyYW5jaEVudmlyb25tZW50VmFyaWFibGVzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQXBwUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgdGhpcy5jdXN0b21SdWxlcyA9IEJveC5mcm9tQXJyYXkocHJvcHMuY3VzdG9tUnVsZXMgfHwgW10pO1xuICAgIHRoaXMuZW52aXJvbm1lbnRWYXJpYWJsZXMgPSBwcm9wcy5lbnZpcm9ubWVudFZhcmlhYmxlcyB8fCB7fTtcbiAgICB0aGlzLmF1dG9CcmFuY2hFbnZpcm9ubWVudFZhcmlhYmxlcyA9IHByb3BzLmF1dG9CcmFuY2hDcmVhdGlvbiAmJiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24uZW52aXJvbm1lbnRWYXJpYWJsZXMgfHwge307XG5cbiAgICBjb25zdCByb2xlID0gcHJvcHMucm9sZSB8fCBuZXcgaWFtLlJvbGUodGhpcywgJ1JvbGUnLCB7XG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uU2VydmljZVByaW5jaXBhbCgnYW1wbGlmeS5hbWF6b25hd3MuY29tJyksXG4gICAgfSk7XG4gICAgdGhpcy5ncmFudFByaW5jaXBhbCA9IHJvbGU7XG5cbiAgICBsZXQgY29tcHV0ZWRSb2xlOiBpYW0uSVJvbGUgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgYXBwUGxhdGZvcm0gPSBwcm9wcy5wbGF0Zm9ybSB8fCBQbGF0Zm9ybS5XRUI7XG4gICAgY29uc3QgaXNTU1IgPSBpc1NlcnZlclNpZGVSZW5kZXJlZChhcHBQbGF0Zm9ybSk7XG5cbiAgICBpZiAocHJvcHMuY29tcHV0ZVJvbGUpIHtcbiAgICAgIGlmICghaXNTU1IpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgSW52YWxpZENvbXB1dGVSb2xlUGxhdGZvcm1gLCAnYGNvbXB1dGVSb2xlYCBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIGBQbGF0Zm9ybS5XRUJfQ09NUFVURWAgb3IgYFBsYXRmb3JtLldFQl9EWU5BTUlDYC4nLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIGNvbXB1dGVkUm9sZSA9IHByb3BzLmNvbXB1dGVSb2xlO1xuICAgIH0gZWxzZSBpZiAoaXNTU1IpIHtcbiAgICAgIGNvbXB1dGVkUm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCAnQ29tcHV0ZVJvbGUnLCB7XG4gICAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdhbXBsaWZ5LmFtYXpvbmF3cy5jb20nKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmNvbXB1dGVSb2xlID0gY29tcHV0ZWRSb2xlO1xuXG4gICAgY29uc3Qgc291cmNlQ29kZVByb3ZpZGVyT3B0aW9ucyA9IHByb3BzLnNvdXJjZUNvZGVQcm92aWRlcj8uYmluZCh0aGlzKTtcblxuICAgIHRoaXMucGxhdGZvcm0gPSBhcHBQbGF0Zm9ybTtcblxuICAgIGNvbnN0IGFwcCA9IG5ldyBDZm5BcHAodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgYWNjZXNzVG9rZW46IHNvdXJjZUNvZGVQcm92aWRlck9wdGlvbnM/LmFjY2Vzc1Rva2VuPy51bnNhZmVVbndyYXAoKSwgLy8gU2FmZSB1c2FnZVxuICAgICAgYXV0b0JyYW5jaENyZWF0aW9uQ29uZmlnOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24gJiYge1xuICAgICAgICBhdXRvQnJhbmNoQ3JlYXRpb25QYXR0ZXJuczogcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLnBhdHRlcm5zLFxuICAgICAgICBiYXNpY0F1dGhDb25maWc6IHByb3BzLmF1dG9CcmFuY2hDcmVhdGlvbi5iYXNpY0F1dGhcbiAgICAgICAgICA/IHByb3BzLmF1dG9CcmFuY2hDcmVhdGlvbi5iYXNpY0F1dGguYmluZCh0aGlzLCAnQnJhbmNoQmFzaWNBdXRoJylcbiAgICAgICAgICA6IHsgZW5hYmxlQmFzaWNBdXRoOiBmYWxzZSB9LFxuICAgICAgICBidWlsZFNwZWM6IHByb3BzLmF1dG9CcmFuY2hDcmVhdGlvbi5idWlsZFNwZWMgJiYgcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLmJ1aWxkU3BlYy50b0J1aWxkU3BlYygpLFxuICAgICAgICBlbmFibGVBdXRvQnJhbmNoQ3JlYXRpb246IHRydWUsXG4gICAgICAgIGVuYWJsZUF1dG9CdWlsZDogcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLmF1dG9CdWlsZCA/PyB0cnVlLFxuICAgICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiByZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmF1dG9CcmFuY2hFbnZpcm9ubWVudFZhcmlhYmxlcykgfSwgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9KSxcbiAgICAgICAgZW5hYmxlUHVsbFJlcXVlc3RQcmV2aWV3OiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24ucHVsbFJlcXVlc3RQcmV2aWV3ID8/IHRydWUsXG4gICAgICAgIHB1bGxSZXF1ZXN0RW52aXJvbm1lbnROYW1lOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24ucHVsbFJlcXVlc3RFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIHN0YWdlOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24uc3RhZ2UsXG4gICAgICB9LFxuICAgICAgZW5hYmxlQnJhbmNoQXV0b0RlbGV0aW9uOiBwcm9wcy5hdXRvQnJhbmNoRGVsZXRpb24sXG4gICAgICBiYXNpY0F1dGhDb25maWc6IHByb3BzLmJhc2ljQXV0aFxuICAgICAgICA/IHByb3BzLmJhc2ljQXV0aC5iaW5kKHRoaXMsICdBcHBCYXNpY0F1dGgnKVxuICAgICAgICA6IHsgZW5hYmxlQmFzaWNBdXRoOiBmYWxzZSB9LFxuICAgICAgYnVpbGRTcGVjOiBwcm9wcy5idWlsZFNwZWMgJiYgcHJvcHMuYnVpbGRTcGVjLnRvQnVpbGRTcGVjKCksXG4gICAgICBjYWNoZUNvbmZpZzogcHJvcHMuY2FjaGVDb25maWdUeXBlID8geyB0eXBlOiBwcm9wcy5jYWNoZUNvbmZpZ1R5cGUgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbXB1dGVSb2xlQXJuOiB0aGlzLmNvbXB1dGVSb2xlPy5yb2xlQXJuLFxuICAgICAgY3VzdG9tUnVsZXM6IHRoaXMuY3VzdG9tUnVsZXMsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBlbnZpcm9ubWVudFZhcmlhYmxlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiByZW5kZXJFbnZpcm9ubWVudFZhcmlhYmxlcyh0aGlzLmVudmlyb25tZW50VmFyaWFibGVzKSB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgaWFtU2VydmljZVJvbGU6IHJvbGUucm9sZUFybixcbiAgICAgIG5hbWU6IHByb3BzLmFwcE5hbWUgfHwgdGhpcy5ub2RlLmlkLFxuICAgICAgb2F1dGhUb2tlbjogc291cmNlQ29kZVByb3ZpZGVyT3B0aW9ucz8ub2F1dGhUb2tlbj8udW5zYWZlVW53cmFwKCksIC8vIFNhZmUgdXNhZ2VcbiAgICAgIHJlcG9zaXRvcnk6IHNvdXJjZUNvZGVQcm92aWRlck9wdGlvbnM/LnJlcG9zaXRvcnksXG4gICAgICBjdXN0b21IZWFkZXJzOiBwcm9wcy5jdXN0b21SZXNwb25zZUhlYWRlcnMgJiYgcHJvcHMuY3VzdG9tUmVzcG9uc2VIZWFkZXJzLmxlbmd0aCA+IDBcbiAgICAgICAgPyByZW5kZXJDdXN0b21SZXNwb25zZUhlYWRlcnMocHJvcHMuY3VzdG9tUmVzcG9uc2VIZWFkZXJzLCB0aGlzKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIHBsYXRmb3JtOiBhcHBQbGF0Zm9ybSxcbiAgICAgIGpvYkNvbmZpZzogcHJvcHMuYnVpbGRDb21wdXRlVHlwZSA/IHsgYnVpbGRDb21wdXRlVHlwZTogcHJvcHMuYnVpbGRDb21wdXRlVHlwZSB9IDogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5hcHBJZCA9IGFwcC5hdHRyQXBwSWQ7XG4gICAgdGhpcy5hcHBOYW1lID0gYXBwLmF0dHJBcHBOYW1lO1xuICAgIHRoaXMuYXJuID0gYXBwLmF0dHJBcm47XG4gICAgdGhpcy5kZWZhdWx0RG9tYWluID0gYXBwLmF0dHJEZWZhdWx0RG9tYWluO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjdXN0b20gcmV3cml0ZS9yZWRpcmVjdCBydWxlIHRvIHRoaXMgYXBwbGljYXRpb25cbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBhZGRDdXN0b21SdWxlKHJ1bGU6IEN1c3RvbVJ1bGUpIHtcbiAgICB0aGlzLmN1c3RvbVJ1bGVzLnB1c2gocnVsZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGlzIGFwcGxpY2F0aW9uLlxuICAgKlxuICAgKiBBbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgeW91IGFkZCBhcmUgZW5jcnlwdGVkIHRvIHByZXZlbnQgcm9ndWVcbiAgICogYWNjZXNzIHNvIHlvdSBjYW4gdXNlIHRoZW0gdG8gc3RvcmUgc2VjcmV0IGluZm9ybWF0aW9uLlxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZEVudmlyb25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuZW52aXJvbm1lbnRWYXJpYWJsZXNbbmFtZV0gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoZSBhdXRvIGNyZWF0ZWQgYnJhbmNoLlxuICAgKlxuICAgKiBBbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgeW91IGFkZCBhcmUgZW5jcnlwdGVkIHRvIHByZXZlbnQgcm9ndWVcbiAgICogYWNjZXNzIHNvIHlvdSBjYW4gdXNlIHRoZW0gdG8gc3RvcmUgc2VjcmV0IGluZm9ybWF0aW9uLlxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZEF1dG9CcmFuY2hFbnZpcm9ubWVudChuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmF1dG9CcmFuY2hFbnZpcm9ubWVudFZhcmlhYmxlc1tuYW1lXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBicmFuY2ggdG8gdGhpcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZEJyYW5jaChpZDogc3RyaW5nLCBvcHRpb25zOiBCcmFuY2hPcHRpb25zID0ge30pOiBCcmFuY2gge1xuICAgIHJldHVybiBuZXcgQnJhbmNoKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgYXBwOiB0aGlzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBkb21haW4gdG8gdGhpcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZERvbWFpbihpZDogc3RyaW5nLCBvcHRpb25zOiBEb21haW5PcHRpb25zID0ge30pOiBEb21haW4ge1xuICAgIHJldHVybiBuZXcgRG9tYWluKHRoaXMsIGlkLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgYXBwOiB0aGlzLFxuICAgICAgYXV0b1N1YkRvbWFpbklhbVJvbGU6IHRoaXMuZ3JhbnRQcmluY2lwYWwgYXMgaWFtLklSb2xlLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogQXV0byBicmFuY2ggY3JlYXRpb24gY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9CcmFuY2hDcmVhdGlvbiB7XG4gIC8qKlxuICAgKiBBdXRvbWF0ZWQgYnJhbmNoIGNyZWF0aW9uIGdsb2IgcGF0dGVybnNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgcmVwb3NpdG9yeSBicmFuY2hlc1xuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIEJhc2ljIEF1dGggY29uZmlndXJhdGlvbi4gVXNlIHRoaXMgdG8gc2V0IHBhc3N3b3JkIHByb3RlY3Rpb24gZm9yXG4gICAqIHRoZSBhdXRvIGNyZWF0ZWQgYnJhbmNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHBhc3N3b3JkIHByb3RlY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGJhc2ljQXV0aD86IEJhc2ljQXV0aDtcblxuICAvKipcbiAgICogQnVpbGQgc3BlYyBmb3IgdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXBwbGljYXRpb24gYnVpbGQgc3BlY1xuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRTcGVjPzogY29kZWJ1aWxkLkJ1aWxkU3BlYztcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgYXV0byBidWlsZGluZyBmb3IgdGhlIGF1dG8gY3JlYXRlZCBicmFuY2hcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b0J1aWxkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBlbmFibGUgcHVsbCByZXF1ZXN0IHByZXZpZXcgZm9yIHRoZSBhdXRvIGNyZWF0ZWQgYnJhbmNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBwdWxsUmVxdWVzdFByZXZpZXc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBhdXRvIGNyZWF0ZWQgYnJhbmNoLlxuICAgKlxuICAgKiBBbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgeW91IGFkZCBhcmUgZW5jcnlwdGVkIHRvIHByZXZlbnQgcm9ndWVcbiAgICogYWNjZXNzIHNvIHlvdSBjYW4gdXNlIHRoZW0gdG8gc3RvcmUgc2VjcmV0IGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFwcGxpY2F0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRWYXJpYWJsZXM/OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAvKipcbiAgICogVGhlIGRlZGljYXRlZCBiYWNrZW5kIGVudmlyb25tZW50IGZvciB0aGUgcHVsbCByZXF1ZXN0IHByZXZpZXdzIG9mXG4gICAqIHRoZSBhdXRvIGNyZWF0ZWQgYnJhbmNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF1dG9tYXRpY2FsbHkgcHJvdmlzaW9uIGEgdGVtcG9yYXJ5IGJhY2tlbmRcbiAgICovXG4gIHJlYWRvbmx5IHB1bGxSZXF1ZXN0RW52aXJvbm1lbnROYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTdGFnZSBmb3IgdGhlIGF1dG8gY3JlYXRlZCBicmFuY2hcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBzdGFnZVxuICAgKi9cbiAgcmVhZG9ubHkgc3RhZ2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN0YXR1