UNPKG

@aws-cdk/aws-amplify-alpha

Version:

The CDK Construct Library for AWS::Amplify

324 lines 47.8 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var _a, _b; Object.defineProperty(exports, "__esModule", { value: true }); 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 iam = require("aws-cdk-lib/aws-iam"); const core_1 = require("aws-cdk-lib/core"); const aws_amplify_1 = require("aws-cdk-lib/aws-amplify"); const branch_1 = require("./branch"); const domain_1 = require("./domain"); const utils_1 = require("./utils"); const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource"); const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable"); /** * An Amplify Console application */ let App = class App extends core_1.Resource { /** * Import an existing application */ static fromAppId(scope, id, appId) { class Import extends core_1.Resource { constructor() { super(...arguments); this.appId = appId; } } return new Import(scope, id); } 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 = 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('`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 }), // eslint-disable-line max-len 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: core_1.Lazy.any({ produce: () => this.customRules }, { omitEmptyArray: true }), 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 ? renderCustomResponseHeaders(props.customResponseHeaders, this) : undefined, platform: appPlatform, }); 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, }); } }; exports.App = App; _a = JSII_RTTI_SYMBOL_1; App[_a] = { fqn: "@aws-cdk/aws-amplify-alpha.App", version: "2.210.0-alpha.0" }; /** Uniquely identifies this class. */ App.PROPERTY_INJECTION_ID = '@aws-cdk.aws-amplify-alpha.App'; __decorate([ (0, metadata_resource_1.MethodMetadata)() ], App.prototype, "addCustomRule", null); __decorate([ (0, metadata_resource_1.MethodMetadata)() ], App.prototype, "addEnvironment", null); __decorate([ (0, metadata_resource_1.MethodMetadata)() ], App.prototype, "addAutoBranchEnvironment", null); __decorate([ (0, metadata_resource_1.MethodMetadata)() ], App.prototype, "addBranch", null); __decorate([ (0, metadata_resource_1.MethodMetadata)() ], App.prototype, "addDomain", null); exports.App = App = __decorate([ prop_injectable_1.propertyInjectable ], 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 { 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; _b = JSII_RTTI_SYMBOL_1; CustomRule[_b] = { fqn: "@aws-cdk/aws-amplify-alpha.CustomRule", version: "2.210.0-alpha.0" }; /** * Sets up a 200 rewrite for all paths to `index.html` except for path * containing a file extension. */ CustomRule.SINGLE_PAGE_APPLICATION_REDIRECT = new CustomRule({ source: '</^[^.]+$/>', target: '/index.html', status: RedirectStatus.REWRITE, }); function renderCustomResponseHeaders(customHeaders, 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('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 = {})); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUNBLDJDQUEyQztBQUMzQywyQ0FBMkY7QUFFM0YseURBQWlEO0FBRWpELHFDQUFpRDtBQUNqRCxxQ0FBaUQ7QUFDakQsbUNBQTJFO0FBQzNFLDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFrTDFFOztHQUVHO0FBRUksSUFBTSxHQUFHLEdBQVQsTUFBTSxHQUFJLFNBQVEsZUFBUTtJQUkvQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBYTtRQUNqRSxNQUFNLE1BQU8sU0FBUSxlQUFRO1lBQTdCOztnQkFDa0IsVUFBSyxHQUFHLEtBQUssQ0FBQztZQUNoQyxDQUFDO1NBQUE7UUFDRCxPQUFPLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQTRDRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWU7UUFDdkQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQzs7Ozs7OytDQXpEUixHQUFHOzs7O1FBMERaLG1DQUFtQztRQUNuQyxJQUFBLHdDQUFvQixFQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsb0JBQW9CLElBQUksRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyw4QkFBOEIsR0FBRyxLQUFLLENBQUMsa0JBQWtCLElBQUksS0FBSyxDQUFDLGtCQUFrQixDQUFDLG9CQUFvQixJQUFJLEVBQUUsQ0FBQztRQUV0SCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFB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SUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7QUFDaEMsQ0FBQztBQUVEOztHQUVHO0FBQ0gsSUFBWSxRQWdCWDtBQWhCRCxXQUFZLFFBQVE7SUFDbEI7O09BRUc7SUFDSCx1QkFBVyxDQUFBO0lBRVg7OztPQUdHO0lBQ0gsdUNBQTJCLENBQUE7SUFFM0I7O09BRUc7SUFDSCx1Q0FBMkIsQ0FBQTtBQUM3QixDQUFDLEVBaEJXLFFBQVEsd0JBQVIsUUFBUSxRQWdCbkI7QUFFRDs7R0FFRztBQUNILElBQVksZUFZWDtBQVpELFdBQVksZUFBZTtJQUN6Qjs7O09BR0c7SUFDSCxzREFBbUMsQ0FBQTtJQUVuQzs7O09BR0c7SUFDSCw0RUFBeUQsQ0FBQTtBQUMzRCxDQUFDLEVBWlcsZUFBZSwrQkFBZixlQUFlLFFBWTFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29kZWJ1aWxkIGZyb20gJ2F3cy1jZGstbGliL2F3cy1jb2RlYnVpbGQnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHsgSVJlc291cmNlLCBMYXp5LCBSZXNvdXJjZSwgU2VjcmV0VmFsdWUsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBDZm5BcHAgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYW1wbGlmeSc7XG5pbXBvcnQgeyBCYXNpY0F1dGggfSBmcm9tICcuL2Jhc2ljLWF1dGgnO1xuaW1wb3J0IHsgQnJhbmNoLCBCcmFuY2hPcHRpb25zIH0gZnJvbSAnLi9icmFuY2gnO1xuaW1wb3J0IHsgRG9tYWluLCBEb21haW5PcHRpb25zIH0gZnJvbSAnLi9kb21haW4nO1xuaW1wb3J0IHsgcmVuZGVyRW52aXJvbm1lbnRWYXJpYWJsZXMsIGlzU2VydmVyU2lkZVJlbmRlcmVkIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBhZGRDb25zdHJ1Y3RNZXRhZGF0YSwgTWV0aG9kTWV0YWRhdGEgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9tZXRhZGF0YS1yZXNvdXJjZSc7XG5pbXBvcnQgeyBwcm9wZXJ0eUluamVjdGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9wcm9wLWluamVjdGFibGUnO1xuXG4vKipcbiAqIEFuIEFtcGxpZnkgQ29uc29sZSBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElBcHAgZXh0ZW5kcyBJUmVzb3VyY2Uge1xuICAvKipcbiAgICogVGhlIGFwcGxpY2F0aW9uIGlkXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIHNvdXJjZSBjb2RlIHByb3ZpZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlQ29kZVByb3ZpZGVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSByZXBvc2l0b3J5IGZvciB0aGUgYXBwbGljYXRpb24uIE11c3QgdXNlIHRoZSBgSFRUUFNgIHByb3RvY29sLlxuICAgKlxuICAgKiBGb3IgZXhhbXBsZSwgYGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNka2AuXG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9BdXRoIHRva2VuIGZvciAzcmQgcGFydHkgc291cmNlIGNvbnRyb2wgc3lzdGVtIGZvciBhbiBBbXBsaWZ5IEFwcCwgdXNlZFxuICAgKiB0byBjcmVhdGUgd2ViaG9vayBhbmQgcmVhZC1vbmx5IGRlcGxveSBrZXkuIE9BdXRoIHRva2VuIGlzIG5vdCBzdG9yZWQuXG4gICAqXG4gICAqIEVpdGhlciBgYWNjZXNzVG9rZW5gIG9yIGBvYXV0aFRva2VuYCBtdXN0IGJlIHNwZWNpZmllZCBpZiBgcmVwb3NpdG9yeWBcbiAgICogaXMgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRvIG5vdCB1c2UgYSB0b2tlblxuICAgKi9cbiAgcmVhZG9ubHkgb2F1dGhUb2tlbj86IFNlY3JldFZhbHVlO1xuXG4gIC8qKlxuICAgKiBQZXJzb25hbCBBY2Nlc3MgdG9rZW4gZm9yIDNyZCBwYXJ0eSBzb3VyY2UgY29udHJvbCBzeXN0ZW0gZm9yIGFuIEFtcGxpZnlcbiAgICogQXBwLCB1c2VkIHRvIGNyZWF0ZSB3ZWJob29rIGFuZCByZWFkLW9ubHkgZGVwbG95IGtleS4gVG9rZW4gaXMgbm90IHN0b3JlZC5cbiAgICpcbiAgICogRWl0aGVyIGBhY2Nlc3NUb2tlbmAgb3IgYG9hdXRoVG9rZW5gIG11c3QgYmUgc3BlY2lmaWVkIGlmIGByZXBvc2l0b3J5YFxuICAgKiBpcyBzZXBjaWZpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZG8gbm90IHVzZSBhIHRva2VuXG4gICAqL1xuICByZWFkb25seSBhY2Nlc3NUb2tlbj86IFNlY3JldFZhbHVlO1xufVxuXG4vKipcbiAqIEEgc291cmNlIGNvZGUgcHJvdmlkZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJU291cmNlQ29kZVByb3ZpZGVyIHtcbiAgLyoqXG4gICAqIEJpbmRzIHRoZSBzb3VyY2UgY29kZSBwcm92aWRlciB0byBhbiBhcHBcbiAgICpcbiAgICogQHBhcmFtIGFwcCBUaGUgYXBwIFtkaXNhYmxlLWF3c2xpbnQ6cmVmLXZpYS1pbnRlcmZhY2VdXG4gICAqL1xuICBiaW5kKGFwcDogQXBwKTogU291cmNlQ29kZVByb3ZpZGVyQ29uZmlnO1xufVxuXG4vKipcbiAqIFByb3BlcnRpZXMgZm9yIGFuIEFwcFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIENESyBnZW5lcmF0ZWQgbmFtZVxuICAgKi9cbiAgcmVhZG9ubHkgYXBwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBjb2RlIHByb3ZpZGVyIGZvciB0aGlzIGFwcGxpY2F0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90IGNvbm5lY3RlZCB0byBhIHNvdXJjZSBjb2RlIHByb3ZpZGVyXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VDb2RlUHJvdmlkZXI/OiBJU291cmNlQ29kZVByb3ZpZGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYXV0byBicmFuY2ggY3JlYXRpb24gY29uZmlndXJhdGlvbi4gVXNlIHRoaXMgdG8gYXV0b21hdGljYWxseSBjcmVhdGVcbiAgICogYnJhbmNoZXMgdGhhdCBtYXRjaCBhIGNlcnRhaW4gcGF0dGVybi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBhdXRvIGJyYW5jaCBjcmVhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b0JyYW5jaENyZWF0aW9uPzogQXV0b0JyYW5jaENyZWF0aW9uO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGRpc2Nvbm5lY3QgYSBicmFuY2ggaW4gdGhlIEFtcGxpZnkgQ29uc29sZSB3aGVuIHlvdSBkZWxldGUgYVxuICAgKiBicmFuY2ggZnJvbSB5b3VyIEdpdCByZXBvc2l0b3J5LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b0JyYW5jaERlbGV0aW9uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIEJhc2ljIEF1dGggY29uZmlndXJhdGlvbi4gVXNlIHRoaXMgdG8gc2V0IHBhc3N3b3JkIHByb3RlY3Rpb24gYXQgYW5cbiAgICogYXBwIGxldmVsIHRvIGFsbCB5b3VyIGJyYW5jaGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHBhc3N3b3JkIHByb3RlY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGJhc2ljQXV0aD86IEJhc2ljQXV0aDtcblxuICAvKipcbiAgICogQnVpbGRTcGVjIGZvciB0aGUgYXBwbGljYXRpb24uIEFsdGVybmF0aXZlbHksIGFkZCBhIGBhbXBsaWZ5LnltbGBcbiAgICogZmlsZSB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL2J1aWxkLXNldHRpbmdzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBidWlsZCBzcGVjXG4gICAqL1xuICByZWFkb25seSBidWlsZFNwZWM/OiBjb2RlYnVpbGQuQnVpbGRTcGVjO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VzdG9tIEhUVFAgcmVzcG9uc2UgaGVhZGVycyBmb3IgYW4gQW1wbGlmeSBhcHAuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtcGxpZnkvbGF0ZXN0L3VzZXJndWlkZS9jdXN0b20taGVhZGVycy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY3VzdG9tIHJlc3BvbnNlIGhlYWRlcnNcbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVJlc3BvbnNlSGVhZGVycz86IEN1c3RvbVJlc3BvbnNlSGVhZGVyW107XG5cbiAgLyoqXG4gICAqIEN1c3RvbSByZXdyaXRlL3JlZGlyZWN0IHJ1bGVzIGZvciB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjdXN0b20gcmV3cml0ZS9yZWRpcmVjdCBydWxlc1xuICAgKi9cbiAgcmVhZG9ubHkgY3VzdG9tUnVsZXM/OiBDdXN0b21SdWxlW107XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB5b3UgYWRkIGFyZSBlbmNyeXB0ZWQgdG8gcHJldmVudCByb2d1ZVxuICAgKiBhY2Nlc3Mgc28geW91IGNhbiB1c2UgdGhlbSB0byBzdG9yZSBzZWNyZXQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudFZhcmlhYmxlcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgSUFNIHNlcnZpY2Ugcm9sZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgYXBwbGljYXRpb24uIFRoZSBBcHBcbiAgICogaW1wbGVtZW50cyBJR3JhbnRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGEgbmV3IHJvbGUgaXMgY3JlYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZT86IGlhbS5JUm9sZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHRoZSBob3N0aW5nIHBsYXRmb3JtIHRvIHVzZS4gU2V0IHRvIFdFQiBmb3Igc3RhdGljIHNpdGVcbiAgICogZ2VuZXJhdGVkIChTU0cpIGFwcHMgKGkuZS4gYSBDcmVhdGUgUmVhY3QgQXBwIG9yIEdhdHNieSkgYW5kIFdFQl9DT01QVVRFXG4gICAqIGZvciBzZXJ2ZXIgc2lkZSByZW5kZXJlZCAoU1NSKSBhcHBzIChpLmUuIE5leHRKUykuXG4gICAqXG4gICAqIEBkZWZhdWx0IFBsYXRmb3JtLldFQlxuICAgKi9cbiAgcmVhZG9ubHkgcGxhdGZvcm0/OiBQbGF0Zm9ybTtcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgY2FjaGUgY29uZmlndXJhdGlvbiB0byB1c2UgZm9yIGFuIEFtcGxpZnkgYXBwLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDYWNoZUNvbmZpZ1R5cGUuQU1QTElGWV9NQU5BR0VEXG4gICAqL1xuICByZWFkb25seSBjYWNoZUNvbmZpZ1R5cGU/OiBDYWNoZUNvbmZpZ1R5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSBJQU0gcm9sZSBmb3IgYW4gU1NSIGFwcC5cbiAgICogVGhlIENvbXB1dGUgcm9sZSBhbGxvd3MgdGhlIEFtcGxpZnkgSG9zdGluZyBjb21wdXRlIHNlcnZpY2UgdG8gc2VjdXJlbHkgYWNjZXNzIHNwZWNpZmljIEFXUyByZXNvdXJjZXMgYmFzZWQgb24gdGhlIHJvbGUncyBwZXJtaXNzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgdW5kZWZpbmVkIC0gYSBuZXcgcm9sZSBpcyBjcmVhdGVkIHdoZW4gYHBsYXRmb3JtYCBpcyBgUGxhdGZvcm0uV0VCX0NPTVBVVEVgIG9yIGBQbGF0Zm9ybS5XRUJfRFlOQU1JQ2AsIG90aGVyd2lzZSBubyBjb21wdXRlIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IGNvbXB1dGVSb2xlPzogaWFtLklSb2xlO1xufVxuXG4vKipcbiAqIEFuIEFtcGxpZnkgQ29uc29sZSBhcHBsaWNhdGlvblxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgQXBwIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJQXBwLCBpYW0uSUdyYW50YWJsZSB7XG4gIC8qKiBVbmlxdWVseSBpZGVudGlmaWVzIHRoaXMgY2xhc3MuICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPUEVSVFlfSU5KRUNUSU9OX0lEOiBzdHJpbmcgPSAnQGF3cy1jZGsuYXdzLWFtcGxpZnktYWxwaGEuQXBwJztcblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIGFwcGxpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21BcHBJZChzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBhcHBJZDogc3RyaW5nKTogSUFwcCB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJQXBwIHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBhcHBJZCA9IGFwcElkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEltcG9ydChzY29wZSwgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGFwcElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBwTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGRvbWFpbiBvZiB0aGUgYXBwbGljYXRpb25cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHREb21haW46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHByaW5jaXBhbCB0byBncmFudCBwZXJtaXNzaW9ucyB0b1xuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50UHJpbmNpcGFsOiBpYW0uSVByaW5jaXBhbDtcblxuICAvKipcbiAgICogVGhlIElBTSByb2xlIGZvciBhbiBTU1IgYXBwLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbXB1dGVSb2xlPzogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBUaGUgcGxhdGZvcm0gb2YgdGhlIGFwcFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsYXRmb3JtPzogUGxhdGZvcm07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21SdWxlczogQ3VzdG9tUnVsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGVudmlyb25tZW50VmFyaWFibGVzOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRvQnJhbmNoRW52aXJvbm1lbnRWYXJpYWJsZXM6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBBcHBQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgLy8gRW5oYW5jZWQgQ0RLIEFuYWx5dGljcyBUZWxlbWV0cnlcbiAgICBhZGRDb25zdHJ1Y3RNZXRhZGF0YSh0aGlzLCBwcm9wcyk7XG5cbiAgICB0aGlzLmN1c3RvbVJ1bGVzID0gcHJvcHMuY3VzdG9tUnVsZXMgfHwgW107XG4gICAgdGhpcy5lbnZpcm9ubWVudFZhcmlhYmxlcyA9IHByb3BzLmVudmlyb25tZW50VmFyaWFibGVzIHx8IHt9O1xuICAgIHRoaXMuYXV0b0JyYW5jaEVudmlyb25tZW50VmFyaWFibGVzID0gcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uICYmIHByb3BzLmF1dG9CcmFuY2hDcmVhdGlvbi5lbnZpcm9ubWVudFZhcmlhYmxlcyB8fCB7fTtcblxuICAgIGNvbnN0IHJvbGUgPSBwcm9wcy5yb2xlIHx8IG5ldyBpYW0uUm9sZSh0aGlzLCAnUm9sZScsIHtcbiAgICAgIGFzc3VtZWRCeTogbmV3IGlhbS5TZXJ2aWNlUHJpbmNpcGFsKCdhbXBsaWZ5LmFtYXpvbmF3cy5jb20nKSxcbiAgICB9KTtcbiAgICB0aGlzLmdyYW50UHJpbmNpcGFsID0gcm9sZTtcblxuICAgIGxldCBjb21wdXRlZFJvbGU6IGlhbS5JUm9sZSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBhcHBQbGF0Zm9ybSA9IHByb3BzLnBsYXRmb3JtIHx8IFBsYXRmb3JtLldFQjtcbiAgICBjb25zdCBpc1NTUiA9IGlzU2VydmVyU2lkZVJlbmRlcmVkKGFwcFBsYXRmb3JtKTtcblxuICAgIGlmIChwcm9wcy5jb21wdXRlUm9sZSkge1xuICAgICAgaWYgKCFpc1NTUikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdgY29tcHV0ZVJvbGVgIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3IgYFBsYXRmb3JtLldFQl9DT01QVVRFYCBvciBgUGxhdGZvcm0uV0VCX0RZTkFNSUNgLicsIHRoaXMpO1xuICAgICAgfVxuICAgICAgY29tcHV0ZWRSb2xlID0gcHJvcHMuY29tcHV0ZVJvbGU7XG4gICAgfSBlbHNlIGlmIChpc1NTUikge1xuICAgICAgY29tcHV0ZWRSb2xlID0gbmV3IGlhbS5Sb2xlKHRoaXMsICdDb21wdXRlUm9sZScsIHtcbiAgICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2FtcGxpZnkuYW1hem9uYXdzLmNvbScpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29tcHV0ZVJvbGUgPSBjb21wdXRlZFJvbGU7XG5cbiAgICBjb25zdCBzb3VyY2VDb2RlUHJvdmlkZXJPcHRpb25zID0gcHJvcHMuc291cmNlQ29kZVByb3ZpZGVyPy5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5wbGF0Zm9ybSA9IGFwcFBsYXRmb3JtO1xuXG4gICAgY29uc3QgYXBwID0gbmV3IENmbkFwcCh0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBhY2Nlc3NUb2tlbjogc291cmNlQ29kZVByb3ZpZGVyT3B0aW9ucz8uYWNjZXNzVG9rZW4/LnVuc2FmZVVud3JhcCgpLCAvLyBTYWZlIHVzYWdlXG4gICAgICBhdXRvQnJhbmNoQ3JlYXRpb25Db25maWc6IHByb3BzLmF1dG9CcmFuY2hDcmVhdGlvbiAmJiB7XG4gICAgICAgIGF1dG9CcmFuY2hDcmVhdGlvblBhdHRlcm5zOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24ucGF0dGVybnMsXG4gICAgICAgIGJhc2ljQXV0aENvbmZpZzogcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLmJhc2ljQXV0aFxuICAgICAgICAgID8gcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLmJhc2ljQXV0aC5iaW5kKHRoaXMsICdCcmFuY2hCYXNpY0F1dGgnKVxuICAgICAgICAgIDogeyBlbmFibGVCYXNpY0F1dGg6IGZhbHNlIH0sXG4gICAgICAgIGJ1aWxkU3BlYzogcHJvcHMuYXV0b0JyYW5jaENyZWF0aW9uLmJ1aWxkU3BlYyAmJiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24uYnVpbGRTcGVjLnRvQnVpbGRTcGVjKCksXG4gICAgICAgIGVuYWJsZUF1dG9CcmFuY2hDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQXV0b0J1aWxkOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24uYXV0b0J1aWxkID8/IHRydWUsXG4gICAgICAgIGVudmlyb25tZW50VmFyaWFibGVzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHJlbmRlckVudmlyb25tZW50VmFyaWFibGVzKHRoaXMuYXV0b0JyYW5jaEVudmlyb25tZW50VmFyaWFibGVzKSB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgICAgICAgZW5hYmxlUHVsbFJlcXVlc3RQcmV2aWV3OiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24ucHVsbFJlcXVlc3RQcmV2aWV3ID8/IHRydWUsXG4gICAgICAgIHB1bGxSZXF1ZXN0RW52aXJvbm1lbnROYW1lOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24ucHVsbFJlcXVlc3RFbnZpcm9ubWVudE5hbWUsXG4gICAgICAgIHN0YWdlOiBwcm9wcy5hdXRvQnJhbmNoQ3JlYXRpb24uc3RhZ2UsXG4gICAgICB9LFxuICAgICAgZW5hYmxlQnJhbmNoQXV0b0RlbGV0aW9uOiBwcm9wcy5hdXRvQnJhbmNoRGVsZXRpb24sXG4gICAgICBiYXNpY0F1dGhDb25maWc6IHByb3BzLmJhc2ljQXV0aFxuICAgICAgICA/IHByb3BzLmJhc2ljQXV0aC5iaW5kKHRoaXMsICdBcHBCYXNpY0F1dGgnKVxuICAgICAgICA6IHsgZW5hYmxlQmFzaWNBdXRoOiBmYWxzZSB9LFxuICAgICAgYnVpbGRTcGVjOiBwcm9wcy5idWlsZFNwZWMgJiYgcHJvcHMuYnVpbGRTcGVjLnRvQnVpbGRTcGVjKCksXG4gICAgICBjYWNoZUNvbmZpZzogcHJvcHMuY2FjaGVDb25maWdUeXBlID8geyB0eXBlOiBwcm9wcy5jYWNoZUNvbmZpZ1R5cGUgfSA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbXB1dGVSb2xlQXJuOiB0aGlzLmNvbXB1dGVSb2xlPy5yb2xlQXJuLFxuICAgICAgY3VzdG9tUnVsZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gdGhpcy5jdXN0b21SdWxlcyB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgZW52aXJvbm1lbnRWYXJpYWJsZXM6IExhenkuYW55KHsgcHJvZHVjZTogKCkgPT4gcmVuZGVyRW52aXJvbm1lbnRWYXJpYWJsZXModGhpcy5lbnZpcm9ubWVudFZhcmlhYmxlcykgfSwgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9KSxcbiAgICAgIGlhbVNlcnZpY2VSb2xlOiByb2xlLnJvbGVBcm4sXG4gICAgICBuYW1lOiBwcm9wcy5hcHBOYW1lIHx8IHRoaXMubm9kZS5pZCxcbiAgICAgIG9hdXRoVG9rZW46IHNvdXJjZUNvZGVQcm92aWRlck9wdGlvbnM/Lm9hdXRoVG9rZW4/LnVuc2FmZVVud3JhcCgpLCAvLyBTYWZlIHVzYWdlXG4gICAgICByZXBvc2l0b3J5OiBzb3VyY2VDb2RlUHJvdmlkZXJPcHRpb25zPy5yZXBvc2l0b3J5LFxuICAgICAgY3VzdG9tSGVhZGVyczogcHJvcHMuY3VzdG9tUmVzcG9uc2VIZWFkZXJzID8gcmVuZGVyQ3VzdG9tUmVzcG9uc2VIZWFkZXJzKHByb3BzLmN1c3RvbVJlc3BvbnNlSGVhZGVycywgdGhpcykgOiB1bmRlZmluZWQsXG4gICAgICBwbGF0Zm9ybTogYXBwUGxhdGZvcm0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmFwcElkID0gYXBwLmF0dHJBcHBJZDtcbiAgICB0aGlzLmFwcE5hbWUgPSBhcHAuYXR0ckFwcE5hbWU7XG4gICAgdGhpcy5hcm4gPSBhcHAuYXR0ckFybjtcbiAgICB0aGlzLmRlZmF1bHREb21haW4gPSBhcHAuYXR0ckRlZmF1bHREb21haW47XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGN1c3RvbSByZXdyaXRlL3JlZGlyZWN0IHJ1bGUgdG8gdGhpcyBhcHBsaWNhdGlvblxuICAgKi9cbiAgQE1ldGhvZE1ldGFkYXRhKClcbiAgcHVibGljIGFkZEN1c3RvbVJ1bGUocnVsZTogQ3VzdG9tUnVsZSkge1xuICAgIHRoaXMuY3VzdG9tUnVsZXMucHVzaChydWxlKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRoaXMgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB5b3UgYWRkIGFyZSBlbmNyeXB0ZWQgdG8gcHJldmVudCByb2d1ZVxuICAgKiBhY2Nlc3Mgc28geW91IGNhbiB1c2UgdGhlbSB0byBzdG9yZSBzZWNyZXQgaW5mb3JtYXRpb24uXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkRW52aXJvbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5lbnZpcm9ubWVudFZhcmlhYmxlc1tuYW1lXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB5b3UgYWRkIGFyZSBlbmNyeXB0ZWQgdG8gcHJldmVudCByb2d1ZVxuICAgKiBhY2Nlc3Mgc28geW91IGNhbiB1c2UgdGhlbSB0byBzdG9yZSBzZWNyZXQgaW5mb3JtYXRpb24uXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkQXV0b0JyYW5jaEVudmlyb25tZW50KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuYXV0b0JyYW5jaEVudmlyb25tZW50VmFyaWFibGVzW25hbWVdID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGJyYW5jaCB0byB0aGlzIGFwcGxpY2F0aW9uXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkQnJhbmNoKGlkOiBzdHJpbmcsIG9wdGlvbnM6IEJyYW5jaE9wdGlvbnMgPSB7fSk6IEJyYW5jaCB7XG4gICAgcmV0dXJuIG5ldyBCcmFuY2godGhpcywgaWQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBhcHA6IHRoaXMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGRvbWFpbiB0byB0aGlzIGFwcGxpY2F0aW9uXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkRG9tYWluKGlkOiBzdHJpbmcsIG9wdGlvbnM6IERvbWFpbk9wdGlvbnMgPSB7fSk6IERvbWFpbiB7XG4gICAgcmV0dXJuIG5ldyBEb21haW4odGhpcywgaWQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBhcHA6IHRoaXMsXG4gICAgICBhdXRvU3ViRG9tYWluSWFtUm9sZTogdGhpcy5ncmFudFByaW5jaXBhbCBhcyBpYW0uSVJvbGUsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBBdXRvIGJyYW5jaCBjcmVhdGlvbiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b0JyYW5jaENyZWF0aW9uIHtcbiAgLyoqXG4gICAqIEF1dG9tYXRlZCBicmFuY2ggY3JlYXRpb24gZ2xvYiBwYXR0ZXJuc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCByZXBvc2l0b3J5IGJyYW5jaGVzXG4gICAqL1xuICByZWFkb25seSBwYXR0ZXJucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgQmFzaWMgQXV0aCBjb25maWd1cmF0aW9uLiBVc2UgdGhpcyB0byBzZXQgcGFzc3dvcmQgcHJvdGVjdGlvbiBmb3JcbiAgICogdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGFzc3dvcmQgcHJvdGVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgYmFzaWNBdXRoPzogQmFzaWNBdXRoO1xuXG4gIC8qKlxuICAgKiBCdWlsZCBzcGVjIGZvciB0aGUgYXV0byBjcmVhdGVkIGJyYW5jaC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhcHBsaWNhdGlvbiBidWlsZCBzcGVjXG4gICAqL1xuICByZWFkb25seSBidWlsZFNwZWM/OiBjb2RlYnVpbGQuQnVpbGRTcGVjO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBhdXRvIGJ1aWxkaW5nIGZvciB0aGUgYXV0byBjcmVhdGVkIGJyYW5jaFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBhdXRvQnVpbGQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwdWxsIHJlcXVlc3QgcHJldmlldyBmb3IgdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHB1bGxSZXF1ZXN0UHJldmlldz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB5b3UgYWRkIGFyZSBlbmNyeXB0ZWQgdG8gcHJldmVudCByb2d1ZVxuICAgKiBhY2Nlc3Mgc28geW91IGNhbiB1c2UgdGhlbSB0byBzdG9yZSBzZWNyZXQgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXBwbGljYXRpb24gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudFZhcmlhYmxlcz86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBUaGUgZGVkaWNhdGVkIGJhY2tlbmQgZW52aXJvbm1lbnQgZm9yIHRoZSBwdWxsIHJlcXVlc3QgcHJldmlld3Mgb2ZcbiAgICogdGhlIGF1dG8gY3JlYXRlZCBicmFuY2guXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0b21hdGljYWxseSBwcm92aXNpb24gYSB0ZW1wb3JhcnkgYmFja2VuZFxuICAgKi9cbiAgcmVhZG9ubHkgcHVsbFJlcXVlc3RFbnZpcm9ubWVudE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFN0YWdlIGZvciB0aGUgYXV0byBjcmVhdGVkIGJyYW5jaFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHN0YWdlXG4gICAqL1xuICByZWFkb25seSBzdGFnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIGNvZGUgZm9yIGEgVVJMIHJld3JpdGUgb3IgcmVkaXJlY3QgcnVsZS5cbiAqL1xuZXhwb3J0IGVudW0gUmVkaXJlY3RTdGF0dXMge1xuICAvKipcbiAgICogUmV3cml0ZSAoMjAwKVxuICAgKi9cbiAgUkVXUklURSA9ICcyMDAnLFxuXG4gIC8qKlxuICAgKiBQZXJtYW5lbnQgcmVkaXJlY3QgKDMwMSlcbiAgICovXG4gIFBFUk1BTkVOVF9SRURJUkVDVCA9ICczMDEnLFxuXG4gIC8qKlxuICAgKiBUZW1wb3JhcnkgcmVkaXJlY3QgKDMwMilcbiAgICovXG4gIFRFTVBPUkFSWV9SRURJUkVDVCA9ICczMDInLFxuXG4gIC8qKlxuICAgKiBOb3QgZm91bmQgKDQwNClcbiAgICovXG4gIE5PVF9GT1VORCA9ICc0MDQnLFxuXG4gIC8qKlxuICAgKiBOb3QgZm91bmQgcmV3cml0ZSAoNDA0KVxuICAgKi9cbiAgTk9UX0ZPVU5EX1JFV1JJVEUgPSAnNDA0LTIwMCcsXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBjdXN0b20gcmV3cml0ZS9yZWRpcmVjdCBydWxlIGZvciBhbiBBbXBsaWZ5IEFwcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21SdWxlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHBhdHRlcm4gZm9yIGEgVVJMIHJld3JpdGUgb3IgcmVkaXJlY3QgcnVsZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL3JlZGlyZWN0cy5odG1sXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBwYXR0ZXJuIGZvciBhIFVSTCByZXdyaXRlIG9yIHJlZGlyZWN0IHJ1bGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtcGxpZnkvbGF0ZXN0L3VzZXJndWlkZS9yZWRpcmVjdHMuaHRtbFxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0dXMgY29kZSBmb3IgYSBVUkwgcmV3cml0ZSBvciByZWRpcmVjdCBydWxlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbXBsaWZ5L2xhdGVzdC91c2VyZ3VpZGUvcmVkaXJlY3RzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgUEVSTUFORU5UX1JFRElSRUNUXG4gICAqL1xuICByZWFkb25seSBzdGF0dXM/OiBSZWRpcmVjdFN0YXR1cztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbiBmb3IgYSBVUkwgcmV3cml0ZSBvciByZWRpcmVjdCBydWxlLCBlLmcuIGNvdW50cnkgY29kZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL3JlZGlyZWN0cy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29uZGl0aW9uXG4gICAqL1xuICByZWFkb25seSBjb25kaXRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ3VzdG9tIHJld3JpdGUvcmVkaXJlY3QgcnVsZSBmb3IgYW4gQW1wbGlmeSBBcHAuXG4gKlxuICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL3JlZGlyZWN0cy5odG1sXG4gKi9cbmV4cG9ydCBjbGFzcyBDdXN0b21SdWxlIHtcbiAgLyoqXG4gICAqIFNldHMgdXAgYSAyMDAgcmV3cml0ZSBmb3IgYWxsIHBhdGhzIHRvIGBpbmRleC5odG1sYCBleGNlcHQgZm9yIHBhdGhcbiAgICogY29udGFpbmluZyBhIGZpbGUgZXh0ZW5zaW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTSU5HTEVfUEFHRV9BUFBMSUNBVElPTl9SRURJUkVDVCA9IG5ldyBDdXN0b21SdWxlKHtcbiAgICBzb3VyY2U6ICc8L15bXi5dKyQvPicsXG4gICAgdGFyZ2V0OiAnL2luZGV4Lmh0bWwnLFxuICAgIHN0YXR1czogUmVkaXJlY3RTdGF0dXMuUkVXUklURSxcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgcGF0dGVybiBmb3IgYSBVUkwgcmV3cml0ZSBvciByZWRpcmVjdCBydWxlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbXBsaWZ5L2xhdGVzdC91c2VyZ3VpZGUvcmVkaXJlY3RzLmh0bWxcbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzb3VyY2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRhcmdldCBwYXR0ZXJuIGZvciBhIFVSTCByZXdyaXRlIG9yIHJlZGlyZWN0IHJ1bGUuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2FtcGxpZnkvbGF0ZXN0L3VzZXJndWlkZS9yZWRpcmVjdHMuaHRtbFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHRhcmdldDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdHVzIGNvZGUgZm9yIGEgVVJMIHJld3JpdGUgb3IgcmVkaXJlY3QgcnVsZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vYW1wbGlmeS9sYXRlc3QvdXNlcmd1aWRlL3JlZGlyZWN0cy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IFBFUk1BTkVOVF9SRURJUkVDVFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1cz86IFJlZGlyZWN0U3RhdHVzO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZGl0aW9uIGZvciBhIFVSTCByZXdyaXRlIG9yIHJlZGlyZWN0IHJ1bGUsIGUuZy4gY291bnRyeSBjb2RlLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hbXBsaWZ5L2xhdGVzdC91c2VyZ3VpZGUvcmVkaXJlY3RzLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBjb25kaXRpb25cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjb25kaXRpb24/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQ3VzdG9tUnVsZU9wdGlvbnMpIHtcbiAgICB0aGlzLnNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIHRoaXMudGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQ7XG4gICAgdGhpcy5zdGF0dXMgPSBvcHRpb25zLnN0YXR1cztcbiAgICB0aGlzLmNvbmRpdGlvbiA9IG9wdGlvbnMuY29uZGl0aW9uO1xuICB9XG59XG5cbi8qKlxuICogQ3VzdG9tIHJlc3BvbnNlIGhlYWRlciBvZiBhbiBBbXBsaWZ5IEFwcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDdXN0b21SZXNwb25zZUhlYWRlciB7XG4gIC8qKlxuICAgKiBJZiB0aGUgYXBwIHVzZXMgYSBtb25vcmVwbyBzdHJ1Y3R1cmUsIHRoZSBhcHBSb290IGZyb20gdGhlIGJ1aWxkIHNwZWMgdG8gYXBwbHkgdGhlIGN1c3RvbSBoZWFkZXJzIHRvLlxuICAgKiBAZGVmYXVsdCAtIFRoZSBhcHBSb290IGlzIG9taXR0ZWQgaW4gdGhlIGN1c3RvbSBoZWFkZXJzIG91dHB1dC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcFJvb3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZXNlIGN1c3RvbSBoZWFkZXJzIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgVVJMIGZpbGUgcGF0aHMgdGhhdCBtYXRjaCB0aGlzIHBhdHRlcm4uXG4gICAqL1xuICByZWFkb25seSBwYXR0ZXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtYXAgb2YgY3VzdG9tIGhlYWRlcnMgdG8gYmUgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbmZ1bmN0aW9uIHJlbmRlckN1c3RvbVJlc3BvbnNlSGVhZGVycyhjdXN0b21IZWFkZXJzOiBDdXN0b21SZXNwb25zZUhlYWRlcltdLCBzY29wZTogSUNvbnN0cnVjdCk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc0FwcFJvb3QgPSBjdXN0b21IZWFkZXJzWzBdLmFwcFJvb3QgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgeWFtbCA9IFtoYXNBcHBSb290ID8gJ2FwcGxpY2F0aW9uczonIDogJ2N1c3RvbUhlYWRlcnM6J107XG5cbiAgZm9yIChjb25zdCBjdXN0b21IZWFkZXIgb2YgY3VzdG9tSGVhZGVycykge1xuICAgIGlmICgoY3VzdG9tSGVhZGVyLmFwcFJvb3QgIT09IHVuZGVmaW5lZCkgIT09IGhhc0FwcFJvb3QpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ2FwcFJvb3QgbXVzdCBiZSBlaXRoZXIgYmUgcHJlc2VudCBvciBhYnNlbnQgYWNyb3NzIGFsbCBjdXN0b20gcmVzcG9uc2UgaGVhZGVycycsIHNjb3BlKTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlSW5kZW50YXRpb24gPSAnICcucmVwZWF0KGhhc0FwcFJvb3QgPyA2IDogMik7XG4gICAgaWYgKGhhc0FwcFJvb3QpIHtcbiAgICAgIHlhbWwucHVzaChgICAtIGFwcFJvb3Q6ICR7Y3VzdG9tSGVhZGVyLmFwcFJvb3R9YCk7XG4gICAgICB5YW1sLnB1c2goJyAgICBjdXN0b21IZWFkZXJzOicpO1xuICAgIH1cbiAgICB5YW1sLnB1c2goYCR7YmFzZUluZGVudGF0aW9ufS0gcGF0dGVybjogXCIke2N1c3RvbUhlYWRlci5wYXR0ZXJufVwiYCk7XG4gICAgeWFtbC5wdXNoKGAke2Jhc2VJbmRlbnRhdGlvbn0gIGhlYWRlcnM6YCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY3VzdG9tSGVhZGVyLmhlYWRlcnMpKSB7XG4gICAgICB5YW1sLnB1c2goYCR7YmFzZUluZGVudGF0aW9ufSAgICAtIGtleTogXCIke2tleX1cImApO1xuICAgICAgeWFtbC5wdXNoKGAke2Jhc2VJbmRlbnRhdGlvbn0gICAgICB2YWx1ZTogXCIke3ZhbHVlfVwiYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGAke3lhbWwuam9pbignXFxuJyl9XFxuYDtcbn1cblxuLyoqXG4gKiBBdmFpbGFibGUgaG9zdGluZyBwbGF0Zm9ybXMgdG8gdXNlIG9uIHRoZSBBcHAuXG4gKi9cbmV4cG9ydCBlbnVtIFBsYXRmb3JtIHtcbiAgLyoqXG4gICAqIFdFQiAtIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgYXBwIGlzIGhvc3RlZCB1c2luZyBvbmx5IHN0YXRpYyBhc3NldHMuXG4gICAqL1xuICBXRUIgPSAnV0VCJyxcblxuICAvKipcbiAgICogV0VCX0NPTVBVVEUgLSBVc2VkIHRvIGluZGljYXRlIHRoZSBhcHAgaXMgaG9zdGVkIHVzaW5nIGEgY29tYmluYXRpb24gb2ZcbiAgICogc2VydmVyIHNpZGUgcmVuZGVyZWQgYW5kIHN0YXRpYyBhc3NldHMuXG4gICAqL1xuICBXRUJfQ09NUFVURSA9ICdXRUJfQ09NUFVURScsXG5cbiAgLyoqXG4gICAqIFdFQl9EWU5BTUlDIC0gVXNlZCB0byBpbmRpY2F0ZSB0aGUgYXBwIGlzIGhvc3RlZCB1c2luZyBhIGZ1bGx5IGR5bmFtaWMgYXJjaGl0ZWN0dXJlLCB3aGVyZSByZXF1ZXN0cyBhcmUgcHJvY2Vzc2VkIGF0IHJ1bnRpbWUgYnkgYmFja2VuZCBjb21wdXRlIHNlcnZpY2VzLlxuICAgKi9cbiAgV0VCX0RZTkFNSUMgPSAnV0VCX0RZTkFNSUMnLFxufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIGNhY2hlIGNvbmZpZ3VyYXRpb24gdG8gdXNlIGZvciBhbiBBbXBsaWZ5IGFwcC5cbiAqL1xuZXhwb3J0IGVudW0gQ2FjaGVDb25maWdUeXBlIHtcbiAgLyoqXG4gICAqIEFNUExJRllfTUFOQUdFRCAtIEF1dG9tYXRpY2FsbHkgYXBwbGllcyBhbiBvcHRpbWl6ZWQgY2FjaGUgY29uZmlndXJhdGlvblxuICAgKiBmb3IgeW91ciBhcHAgYmFzZWQgb24gaXRzIHBsYXRmb3JtLCByb3V0aW5nIHJ1bGVzLCBhbmQgcmV3cml0ZSBydWxlcy5cbiAgICovXG4gIEFNUExJRllfTUFOQUdFRCA9ICdBTVBMSUZZX01BTkFHRUQnLFxuXG4gIC8qKlxuICAgKiBBTVBMSUZZX01BTkFHRURfTk9fQ09PS0lFUyAtIFRoZSBzYW1lIGFzIEFNUExJRllfTUFOQUdFRCxcbiAgICogZXhjZXB0IHRoYXQgaXQgZXhjbHVkZXMgYWxsIGNvb2tpZXMgZnJvbSB0aGUgY2FjaGUga2V5LlxuICAgKi9cbiAgQU1QTElGWV9NQU5BR0VEX05PX0NPT0tJRVMgPSAnQU1QTElGWV9NQU5BR0VEX05PX0NPT0tJRVMnLFxufVxuIl19