projen-pipelines 0.0.1 → 0.0.3
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 +803 -29
- package/API.md +774 -11
- package/README.md +154 -1
- package/lib/engine/base.d.ts +22 -0
- package/lib/engine/base.js +16 -0
- package/lib/engine/github.d.ts +22 -0
- package/lib/engine/github.js +100 -0
- package/lib/engine/index.d.ts +2 -0
- package/lib/engine/index.js +19 -0
- package/lib/index.d.ts +1 -0
- package/lib/index.js +2 -1
- package/lib/pipeline.d.ts +129 -1
- package/lib/pipeline.js +138 -25
- package/package.json +1 -1
package/lib/pipeline.js
CHANGED
|
@@ -1,85 +1,179 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var _a;
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.CDKPipeline = void 0;
|
|
4
|
+
exports.CDKPipeline = exports.DeploymentType = exports.PipelineEngine = void 0;
|
|
5
5
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
6
|
const projen_1 = require("projen");
|
|
7
7
|
const common_1 = require("projen/lib/common");
|
|
8
|
+
const engine_1 = require("./engine");
|
|
9
|
+
/**
|
|
10
|
+
* The CI/CD tooling used to run your pipeline.
|
|
11
|
+
* The component will render workflows for the given system
|
|
12
|
+
*/
|
|
13
|
+
var PipelineEngine;
|
|
14
|
+
(function (PipelineEngine) {
|
|
15
|
+
/** Create GitHub actions */
|
|
16
|
+
PipelineEngine[PipelineEngine["GITHUB"] = 0] = "GITHUB";
|
|
17
|
+
/** Create a .gitlab-ci.yaml file */
|
|
18
|
+
PipelineEngine[PipelineEngine["GITLAB"] = 1] = "GITLAB";
|
|
19
|
+
// /** Create AWS CodeCatalyst workflows */
|
|
20
|
+
// CODE_CATALYST,
|
|
21
|
+
})(PipelineEngine = exports.PipelineEngine || (exports.PipelineEngine = {}));
|
|
22
|
+
/**
|
|
23
|
+
* Describes the type of pipeline that will be created
|
|
24
|
+
*/
|
|
25
|
+
var DeploymentType;
|
|
26
|
+
(function (DeploymentType) {
|
|
27
|
+
/** Deploy every commit as far as possible; hopefully into production */
|
|
28
|
+
DeploymentType[DeploymentType["CONTINUOUS_DEPLOYMENT"] = 0] = "CONTINUOUS_DEPLOYMENT";
|
|
29
|
+
/** Build every commit and prepare all assets for a later deployment */
|
|
30
|
+
DeploymentType[DeploymentType["CONTINUOUS_DELIVERY"] = 1] = "CONTINUOUS_DELIVERY";
|
|
31
|
+
})(DeploymentType = exports.DeploymentType || (exports.DeploymentType = {}));
|
|
32
|
+
/**
|
|
33
|
+
* The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages.
|
|
34
|
+
* It also manages tasks such as publishing CDK assets, bumping version based on git tags, and cleaning up conflicting tasks.
|
|
35
|
+
*/
|
|
8
36
|
class CDKPipeline extends projen_1.Component {
|
|
9
37
|
constructor(app, props) {
|
|
10
38
|
super(app);
|
|
11
39
|
this.app = app;
|
|
12
40
|
this.props = props;
|
|
41
|
+
// Add development dependencies
|
|
13
42
|
this.app.addDevDeps('@types/standard-version', 'standard-version', 'cdk-assets');
|
|
14
43
|
// this.app.addDeps(
|
|
15
44
|
// );
|
|
16
|
-
|
|
45
|
+
this.stackPrefix = props.stackPrefix ?? app.name;
|
|
46
|
+
// Create engine instance to use
|
|
47
|
+
switch (props.engine) {
|
|
48
|
+
case PipelineEngine.GITHUB:
|
|
49
|
+
this.engine = new engine_1.GitHubEngine(app, props, this);
|
|
50
|
+
break;
|
|
51
|
+
default:
|
|
52
|
+
throw new Error('Invalid engine');
|
|
53
|
+
}
|
|
54
|
+
// Removes the compiled cloud assembly before each synth
|
|
17
55
|
this.project.tasks.tryFind('synth')?.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
|
|
18
56
|
this.project.tasks.tryFind('synth:silent')?.prependExec(`rm -rf ${this.app.cdkConfig.cdkout}`);
|
|
19
|
-
// Remove
|
|
57
|
+
// Remove tasks that might conflict with the pipeline process
|
|
20
58
|
this.project.removeTask('deploy');
|
|
21
59
|
this.project.removeTask('diff');
|
|
22
60
|
this.project.removeTask('destroy');
|
|
23
61
|
this.project.removeTask('watch');
|
|
62
|
+
this.createSynthStage();
|
|
63
|
+
// Creates different deployment stages
|
|
24
64
|
this.createPersonalStage();
|
|
25
65
|
this.createFeatureStage();
|
|
26
66
|
this.createPipelineStage('dev');
|
|
27
67
|
this.createPipelineStage('prod');
|
|
68
|
+
// Creates tasks to handle the release process
|
|
28
69
|
this.createReleaseTasks();
|
|
70
|
+
// Creates a specialized CDK App class
|
|
29
71
|
this.createApplicationEntrypoint();
|
|
30
72
|
}
|
|
73
|
+
createSynthStage() {
|
|
74
|
+
this.engine.createSynth({
|
|
75
|
+
commands: [
|
|
76
|
+
...(this.props.preInstallCommands ?? []),
|
|
77
|
+
`npx projen ${this.app.package.installCiTask.name}`,
|
|
78
|
+
...(this.props.preSynthCommands ?? []),
|
|
79
|
+
'npx projen build',
|
|
80
|
+
...(this.props.postSynthCommands ?? []),
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
this.engine.createAssetUpload({
|
|
84
|
+
commands: [
|
|
85
|
+
...(this.props.preInstallCommands ?? []),
|
|
86
|
+
`npx projen ${this.app.package.installCiTask.name}`,
|
|
87
|
+
'npx projen publish:assets',
|
|
88
|
+
],
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* This method generates the entry point for the application, including interfaces and classes
|
|
93
|
+
* necessary to set up the pipeline and define the AWS CDK stacks for different environments.
|
|
94
|
+
*/
|
|
31
95
|
createApplicationEntrypoint() {
|
|
32
96
|
const appFile = new projen_1.TextFile(this.project, `${this.app.srcdir}/app.ts`);
|
|
33
97
|
appFile.addLine(`// ${common_1.PROJEN_MARKER}
|
|
34
|
-
/* eslint-disable
|
|
35
|
-
/* eslint-disable comma-spacing */
|
|
36
|
-
/* eslint-disable quotes */
|
|
37
|
-
/* eslint-disable key-spacing */
|
|
38
|
-
/* eslint-disable quote-props */
|
|
98
|
+
/* eslint-disable */
|
|
39
99
|
import { App, AppProps, Stack, StackProps } from 'aws-cdk-lib';
|
|
40
100
|
|
|
101
|
+
/**
|
|
102
|
+
* PipelineAppProps is an extension of AppProps, which is part of the AWS CDK core.
|
|
103
|
+
* It includes optional functions to provide AWS Stacks for different stages.
|
|
104
|
+
*
|
|
105
|
+
* Use these functions to instantiate your application stacks with the parameters for
|
|
106
|
+
* each stage
|
|
107
|
+
*/
|
|
41
108
|
export interface PipelineAppProps extends AppProps {
|
|
109
|
+
/** This optional function, if provided, will be used to generate a development stack. */
|
|
42
110
|
provideDevStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
|
|
111
|
+
|
|
112
|
+
/** This optional function, if provided, will be used to generate a production stack. */
|
|
43
113
|
provideProdStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
|
|
114
|
+
|
|
115
|
+
/** This optional function, if provided, will be used to generate a personal stack. */
|
|
44
116
|
providePersonalStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
|
|
117
|
+
|
|
118
|
+
/** This optional function, if provided, will be used to generate a feature stack. */
|
|
45
119
|
provideFeatureStack?: (app: App, stackId: string, props: PipelineAppStackProps) => Stack;
|
|
46
120
|
}
|
|
47
121
|
|
|
122
|
+
/**
|
|
123
|
+
* PipelineAppStackProps is an extension of StackProps, which is part of the AWS CDK core.
|
|
124
|
+
* It includes an additional property to specify the stage name.
|
|
125
|
+
*/
|
|
48
126
|
export interface PipelineAppStackProps extends StackProps {
|
|
49
127
|
stageName: string;
|
|
50
128
|
}
|
|
51
129
|
|
|
130
|
+
/**
|
|
131
|
+
* The PipelineApp class extends the App class from AWS CDK and overrides the constructor to support
|
|
132
|
+
* different stages of the application (development, production, personal, feature) by invoking the provided
|
|
133
|
+
* stack-providing functions from the props.
|
|
134
|
+
*/
|
|
52
135
|
export class PipelineApp extends App {
|
|
53
136
|
constructor(props: PipelineAppProps) {
|
|
54
137
|
super(props);
|
|
55
138
|
|
|
139
|
+
// If a function is provided for creating a development stack, it is called with necessary arguments.
|
|
56
140
|
if (props.provideDevStack) {
|
|
57
|
-
props.provideDevStack(this, '${this.
|
|
141
|
+
props.provideDevStack(this, '${this.stackPrefix}-dev', { env: ${JSON.stringify(this.props.environments.dev)}, stackName: '${this.stackPrefix}-dev', stageName: 'dev' });
|
|
58
142
|
}
|
|
143
|
+
|
|
144
|
+
// If a function is provided for creating a production stack, it is called with necessary arguments.
|
|
59
145
|
if (props.provideProdStack) {
|
|
60
|
-
props.provideProdStack(this, '${this.
|
|
146
|
+
props.provideProdStack(this, '${this.stackPrefix}-prod', { env: ${JSON.stringify(this.props.environments.prod)}, stackName: '${this.stackPrefix}-prod', stageName: 'prod' });
|
|
61
147
|
}
|
|
148
|
+
|
|
149
|
+
// If the environment variable USER is set and a function is provided for creating a personal stack, it is called with necessary arguments.
|
|
62
150
|
if (props.providePersonalStack && process.env.USER) {
|
|
63
151
|
const stageName = 'personal-' + process.env.USER.toLowerCase().replace(/\\\//g, '-');
|
|
64
|
-
props.providePersonalStack(this, '${this.
|
|
152
|
+
props.providePersonalStack(this, '${this.stackPrefix}-personal', { env: ${JSON.stringify(this.props.environments.personal)}, stackName: \`${this.stackPrefix}-\${stageName}\`, stageName });
|
|
65
153
|
}
|
|
154
|
+
|
|
155
|
+
// If the environment variable BRANCH is set and a function is provided for creating a feature stack, it is called with necessary arguments.
|
|
66
156
|
if (props.provideFeatureStack && process.env.BRANCH) {
|
|
67
157
|
const stageName = 'feature-' + process.env.BRANCH.toLowerCase().replace(/\\\//g, '-');
|
|
68
|
-
props.provideFeatureStack(this, '${this.
|
|
158
|
+
props.provideFeatureStack(this, '${this.stackPrefix}-feature', { env: ${JSON.stringify(this.props.environments.feature)}, stackName: \`${this.stackPrefix}-\${stageName}\`, stageName });
|
|
69
159
|
}
|
|
70
160
|
}
|
|
71
161
|
}
|
|
72
162
|
`);
|
|
73
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* This method sets up tasks to publish CDK assets to all accounts and handle versioning, including bumping the version
|
|
166
|
+
* based on the latest git tag and pushing the CDK assembly to the package repository.
|
|
167
|
+
*/
|
|
74
168
|
createReleaseTasks() {
|
|
75
169
|
// Task to publish the CDK assets to all accounts
|
|
76
170
|
this.project.addTask('publish:assets', {
|
|
77
171
|
steps: [
|
|
78
172
|
{
|
|
79
|
-
exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.
|
|
173
|
+
exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.stackPrefix}-dev.assets.json publish`,
|
|
80
174
|
},
|
|
81
175
|
{
|
|
82
|
-
exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.
|
|
176
|
+
exec: `npx cdk-assets -p ${this.app.cdkConfig.cdkout}/${this.stackPrefix}-prod.assets.json publish`,
|
|
83
177
|
},
|
|
84
178
|
],
|
|
85
179
|
});
|
|
@@ -110,41 +204,60 @@ export class PipelineApp extends App {
|
|
|
110
204
|
],
|
|
111
205
|
});
|
|
112
206
|
}
|
|
207
|
+
/**
|
|
208
|
+
* This method sets up tasks for the personal deployment stage, including deployment, watching for changes,
|
|
209
|
+
* comparing changes (diff), and destroying the stack when no longer needed.
|
|
210
|
+
*/
|
|
113
211
|
createPersonalStage() {
|
|
114
212
|
this.project.addTask('deploy:personal', {
|
|
115
|
-
exec: `cdk deploy ${this.
|
|
213
|
+
exec: `cdk deploy ${this.stackPrefix}-personal`,
|
|
116
214
|
});
|
|
117
215
|
this.project.addTask('watch:personal', {
|
|
118
|
-
exec: `cdk deploy --watch --hotswap ${this.
|
|
216
|
+
exec: `cdk deploy --watch --hotswap ${this.stackPrefix}-personal`,
|
|
119
217
|
});
|
|
120
218
|
this.project.addTask('diff:personal', {
|
|
121
|
-
exec: `cdk diff ${this.
|
|
219
|
+
exec: `cdk diff ${this.stackPrefix}-personal`,
|
|
122
220
|
});
|
|
123
221
|
this.project.addTask('destroy:personal', {
|
|
124
|
-
exec: `cdk destroy ${this.
|
|
222
|
+
exec: `cdk destroy ${this.stackPrefix}-personal`,
|
|
125
223
|
});
|
|
126
224
|
}
|
|
225
|
+
/**
|
|
226
|
+
* This method sets up tasks for the feature deployment stage, including deployment, comparing changes (diff),
|
|
227
|
+
* and destroying the stack when no longer needed.
|
|
228
|
+
*/
|
|
127
229
|
createFeatureStage() {
|
|
128
230
|
this.project.addTask('deploy:feature', {
|
|
129
|
-
exec: `cdk --progress events --require-approval never deploy ${this.
|
|
231
|
+
exec: `cdk --progress events --require-approval never deploy ${this.stackPrefix}-feature`,
|
|
130
232
|
});
|
|
131
233
|
this.project.addTask('diff:feature', {
|
|
132
|
-
exec: `cdk diff ${this.
|
|
234
|
+
exec: `cdk diff ${this.stackPrefix}-feature`,
|
|
133
235
|
});
|
|
134
236
|
this.project.addTask('destroy:feature', {
|
|
135
|
-
exec: `cdk destroy ${this.
|
|
237
|
+
exec: `cdk destroy ${this.stackPrefix}-feature`,
|
|
136
238
|
});
|
|
137
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* This method sets up tasks for the general pipeline stages (dev, prod), including deployment and comparing changes (diff).
|
|
242
|
+
* @param {string} stageName - The name of the stage (e.g., 'dev', 'prod')
|
|
243
|
+
*/
|
|
138
244
|
createPipelineStage(stageName) {
|
|
139
245
|
this.project.addTask(`deploy:${stageName}`, {
|
|
140
|
-
exec: `cdk --app ${this.app.cdkConfig.cdkout} --progress events --require-approval never deploy ${this.
|
|
246
|
+
exec: `cdk --app ${this.app.cdkConfig.cdkout} --progress events --require-approval never deploy ${this.stackPrefix}-${stageName}`,
|
|
141
247
|
});
|
|
142
248
|
this.project.addTask(`diff:${stageName}`, {
|
|
143
|
-
exec: `cdk --app ${this.app.cdkConfig.cdkout} diff ${this.
|
|
249
|
+
exec: `cdk --app ${this.app.cdkConfig.cdkout} diff ${this.stackPrefix}-${stageName}`,
|
|
250
|
+
});
|
|
251
|
+
this.engine.createDeployment({
|
|
252
|
+
stageName,
|
|
253
|
+
env: this.props.environments[stageName],
|
|
254
|
+
commands: [
|
|
255
|
+
`npx projen deploy:${stageName}`,
|
|
256
|
+
],
|
|
144
257
|
});
|
|
145
258
|
}
|
|
146
259
|
}
|
|
147
260
|
_a = JSII_RTTI_SYMBOL_1;
|
|
148
|
-
CDKPipeline[_a] = { fqn: "projen-pipelines.CDKPipeline", version: "0.0.
|
|
261
|
+
CDKPipeline[_a] = { fqn: "projen-pipelines.CDKPipeline", version: "0.0.3" };
|
|
149
262
|
exports.CDKPipeline = CDKPipeline;
|
|
150
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBcUQ7QUFDckQsOENBQWtEO0FBb0JsRCxNQUFhLFdBQVksU0FBUSxrQkFBUztJQUV4QyxZQUFvQixHQUErQixFQUFVLEtBQXlCO1FBQ3BGLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQURPLFFBQUcsR0FBSCxHQUFHLENBQTRCO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBb0I7UUFHcEYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2pCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsWUFBWSxDQUNiLENBQUM7UUFDRixvQkFBb0I7UUFDcEIsS0FBSztRQUVMLCtCQUErQjtRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsV0FBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN4RixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsV0FBVyxDQUFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUUvRiwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFakMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFFM0IsSUFB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QUFVLFNBQVMsRUFBRSxFQUFFO1lBQzFDLElBQUksRUFBRSxhQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sc0RBQXNELElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLFNBQVMsRUFBRTtTQUN4SSxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLFNBQVMsRUFBRSxFQUFFO1lBQ3hDLElBQUksRUFBRSxhQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sU0FBUyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxTQUFTLEVBQUU7U0FDM0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OztBQTFKVSxrQ0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVGV4dEZpbGUsIGF3c2NkayB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBQUk9KRU5fTUFSS0VSIH0gZnJvbSAncHJvamVuL2xpYi9jb21tb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVudmlyb25tZW50IHtcbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudE1hcCB7XG4gIHJlYWRvbmx5IHBlcnNvbmFsOiBFbnZpcm9ubWVudDtcbiAgcmVhZG9ubHkgZmVhdHVyZTogRW52aXJvbm1lbnQ7XG4gIHJlYWRvbmx5IGRldjogRW52aXJvbm1lbnQ7XG4gIHJlYWRvbmx5IHByb2Q6IEVudmlyb25tZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENES1BpcGVsaW5lT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHN0YWNrUHJlZml4OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBrZ05hbWVzcGFjZTogc3RyaW5nO1xuICByZWFkb25seSBlbnZpcm9ubWVudHM6IEVudmlyb25tZW50TWFwO1xufVxuXG5leHBvcnQgY2xhc3MgQ0RLUGlwZWxpbmUgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwOiBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCwgcHJpdmF0ZSBwcm9wczogQ0RLUGlwZWxpbmVPcHRpb25zKSB7XG4gICAgc3VwZXIoYXBwKTtcblxuICAgIHRoaXMuYXBwLmFkZERldkRlcHMoXG4gICAgICAnQHR5cGVzL3N0YW5kYXJkLXZlcnNpb24nLFxuICAgICAgJ3N0YW5kYXJkLXZlcnNpb24nLFxuICAgICAgJ2Nkay1hc3NldHMnLFxuICAgICk7XG4gICAgLy8gdGhpcy5hcHAuYWRkRGVwcyhcbiAgICAvLyApO1xuXG4gICAgLy8gUmVtb3ZlIGFzc2VtYmx5IGJlZm9yZSBzeW50aFxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKCdzeW50aCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH1gKTtcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZCgnc3ludGg6c2lsZW50Jyk/LnByZXBlbmRFeGVjKGBybSAtcmYgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fWApO1xuXG4gICAgLy8gUmVtb3ZlIGNvbmZsaWN0aW5nIHRhc2tzXG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ2RlcGxveScpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkaWZmJyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ2Rlc3Ryb3knKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnd2F0Y2gnKTtcblxuICAgIHRoaXMuY3JlYXRlUGVyc29uYWxTdGFnZSgpO1xuXG4gICAgdGhpcy5jcmVhdGVGZWF0dXJlU3RhZ2UoKTtcblxuICAgIHRoaXMuY3JlYXRlUGlwZWxpbmVTdGFnZSgnZGV2Jyk7XG4gICAgdGhpcy5jcmVhdGVQaXBlbGluZVN0YWdlKCdwcm9kJyk7XG5cbiAgICB0aGlzLmNyZWF0ZVJlbGVhc2VUYXNrcygpO1xuXG4gICAgdGhpcy5jcmVhdGVBcHBsaWNhdGlvbkVudHJ5cG9pbnQoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXBwbGljYXRpb25FbnRyeXBvaW50KCkge1xuICAgIGNvbnN0IGFwcEZpbGUgPSBuZXcgVGV4dEZpbGUodGhpcy5wcm9qZWN0LCBgJHt0aGlzLmFwcC5zcmNkaXJ9L2FwcC50c2ApO1xuICAgIGFwcEZpbGUuYWRkTGluZShgLy8gJHtQUk9KRU5fTUFSS0VSfVxuLyogZXNsaW50LWRpc2FibGUgb2JqZWN0LWN1cmx5LXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNvbW1hLXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlcyAqL1xuLyogZXNsaW50LWRpc2FibGUga2V5LXNwYWNpbmcgKi9cbi8qIGVzbGludC1kaXNhYmxlIHF1b3RlLXByb3BzICovXG5pbXBvcnQgeyBBcHAsIEFwcFByb3BzLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuZXhwb3J0IGludGVyZmFjZSBQaXBlbGluZUFwcFByb3BzIGV4dGVuZHMgQXBwUHJvcHMge1xuICBwcm92aWRlRGV2U3RhY2s/OiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG4gIHByb3ZpZGVQcm9kU3RhY2s/OiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG4gIHByb3ZpZGVQZXJzb25hbFN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xuICBwcm92aWRlRmVhdHVyZVN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVsaW5lQXBwU3RhY2tQcm9wcyBleHRlbmRzIFN0YWNrUHJvcHMge1xuICBzdGFnZU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFBpcGVsaW5lQXBwIGV4dGVuZHMgQXBwIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IFBpcGVsaW5lQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICBpZiAocHJvcHMucHJvdmlkZURldlN0YWNrKSB7XG4gICAgICBwcm9wcy5wcm92aWRlRGV2U3RhY2sodGhpcywgJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZGV2JywgeyBlbnY6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wcm9wcy5lbnZpcm9ubWVudHMuZGV2KX0sIHN0YWNrTmFtZTogJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZGV2Jywgc3RhZ2VOYW1lOiAnZGV2JyB9KTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnByb3ZpZGVQcm9kU3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGVQcm9kU3RhY2sodGhpcywgJyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcHJvZCcsIHsgZW52OiAke0pTT04uc3RyaW5naWZ5KHRoaXMucHJvcHMuZW52aXJvbm1lbnRzLnByb2QpfSwgc3RhY2tOYW1lOiAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wcm9kJywgc3RhZ2VOYW1lOiAncHJvZCcgfSk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5wcm92aWRlUGVyc29uYWxTdGFjayAmJiBwcm9jZXNzLmVudi5VU0VSKSB7XG4gICAgICBjb25zdCBzdGFnZU5hbWUgPSAncGVyc29uYWwtJyArIHByb2Nlc3MuZW52LlVTRVIudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlUGVyc29uYWxTdGFjayh0aGlzLCAnJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wZXJzb25hbCcsIHsgZW52OiAke0pTT04uc3RyaW5naWZ5KHRoaXMucHJvcHMuZW52aXJvbm1lbnRzLnBlcnNvbmFsKX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbiAgICBpZiAocHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayAmJiBwcm9jZXNzLmVudi5CUkFOQ0gpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdmZWF0dXJlLScgKyBwcm9jZXNzLmVudi5CUkFOQ0gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlRmVhdHVyZVN0YWNrKHRoaXMsICcke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWZlYXR1cmUnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmVudmlyb25tZW50cy5mZWF0dXJlKX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbiAgfVxufVxuYCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJlbGVhc2VUYXNrcygpIHtcbiAgICAvLyBUYXNrIHRvIHB1Ymxpc2ggdGhlIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3B1Ymxpc2g6YXNzZXRzJywge1xuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6IGBucHggY2RrLWFzc2V0cyAtcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9LyR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZGV2LmFzc2V0cy5qc29uIHB1Ymxpc2hgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgZXhlYzogYG5weCBjZGstYXNzZXRzIC1wICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0vJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1wcm9kLmFzc2V0cy5qc29uIHB1Ymxpc2hgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdidW1wJywge1xuICAgICAgZGVzY3JpcHRpb246ICdCdW1wcyB2ZXJzaW9uIGJhc2VkIG9uIGxhdGVzdCBnaXQgdGFnJyxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiAncGlwZWxpbmVzLXJlbGVhc2UgYnVtcCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiAnZ2l0IHB1c2ggLS10YWdzJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ3JlbGVhc2U6cHVzaC1hc3NlbWJseScsIHtcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiBgcGlwZWxpbmVzLXJlbGVhc2UgY3JlYXRlLW1hbmlmZXN0IFwiJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fVwiICBcIiR7dGhpcy5wcm9wcy5wa2dOYW1lc3BhY2V9XCJgLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgY3dkOiB0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0LFxuICAgICAgICAgIGV4ZWM6ICducG0gdmVyc2lvbiAtLW5vLWdpdC10YWctdmVyc2lvbiBmcm9tLWdpdCcsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjd2Q6IHRoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXQsXG4gICAgICAgICAgZXhlYzogJ25wbSBwdWJsaXNoJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVBlcnNvbmFsU3RhZ2UoKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95ICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCd3YXRjaDpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95IC0td2F0Y2ggLS1ob3Rzd2FwICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkaWZmOnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkZXN0cm95ICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGZWF0dXJlU3RhZ2UoKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayAtLXByb2dyZXNzIGV2ZW50cyAtLXJlcXVpcmUtYXBwcm92YWwgbmV2ZXIgZGVwbG95ICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tZmVhdHVyZWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RpZmY6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGlmZiAke3RoaXMucHJvcHMuc3RhY2tQcmVmaXh9LWZlYXR1cmVgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIGRlc3Ryb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS1mZWF0dXJlYCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkZXBsb3k6JHtzdGFnZU5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnByb3BzLnN0YWNrUHJlZml4fS0ke3N0YWdlTmFtZX1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkaWZmOiR7c3RhZ2VOYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fSBkaWZmICR7dGhpcy5wcm9wcy5zdGFja1ByZWZpeH0tJHtzdGFnZU5hbWV9YCxcbiAgICB9KTtcbiAgfVxufSJdfQ==
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGlwZWxpbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxtQ0FBcUQ7QUFDckQsOENBQWtEO0FBQ2xELHFDQUF3RTtBQTBEeEU7OztHQUdHO0FBQ0gsSUFBWSxjQU9YO0FBUEQsV0FBWSxjQUFjO0lBQ3hCLDRCQUE0QjtJQUM1Qix1REFBTSxDQUFBO0lBQ04sb0NBQW9DO0lBQ3BDLHVEQUFNLENBQUE7SUFDTiwyQ0FBMkM7SUFDM0MsaUJBQWlCO0FBQ25CLENBQUMsRUFQVyxjQUFjLEdBQWQsc0JBQWMsS0FBZCxzQkFBYyxRQU96QjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3hCLHdFQUF3RTtJQUN4RSxxRkFBcUIsQ0FBQTtJQUNyQix1RUFBdUU7SUFDdkUsaUZBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUxXLGNBQWMsR0FBZCxzQkFBYyxLQUFkLHNCQUFjLFFBS3pCO0FBeUREOzs7R0FHRztBQUNILE1BQWEsV0FBWSxTQUFRLGtCQUFTO0lBS3hDLFlBQW9CLEdBQStCLEVBQVUsS0FBeUI7UUFDcEYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRE8sUUFBRyxHQUFILEdBQUcsQ0FBNEI7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUdwRiwrQkFBK0I7UUFDL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2pCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsWUFBWSxDQUNiLENBQUM7UUFDRixvQkFBb0I7UUFDcEIsS0FBSztRQUVMLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDO1FBRWpELGdDQUFnQztRQUNoQyxRQUFRLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDcEIsS0FBSyxjQUFjLENBQUMsTUFBTTtnQkFDeEIsSUFBSSxDQUFDLE1BQU0s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UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7WUFDbkMsSUFBSSxFQUFFLFlBQVksSUFBSSxDQUFDLFdBQVcsVUFBVTtTQUM3QyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRTtZQUN0QyxJQUFJLEVBQUUsZUFBZSxJQUFJLENBQUMsV0FBVyxVQUFVO1NBQ2hELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSyxtQkFBbUIsQ0FBQyxTQUFpQjtRQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLFNBQVMsRUFBRSxFQUFFO1lBQzFDLElBQUksRUFBRSxhQUFhLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sc0RBQXNELElBQUksQ0FBQyxXQUFXLElBQUksU0FBUyxFQUFFO1NBQ2xJLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsU0FBUyxFQUFFLEVBQUU7WUFDeEMsSUFBSSxFQUFFLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxTQUFTLElBQUksQ0FBQyxXQUFXLElBQUksU0FBUyxFQUFFO1NBQ3JGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7WUFDM0IsU0FBUztZQUNULEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxTQUFpQyxDQUFDO1lBQy9ELFFBQVEsRUFBRTtnQkFDUixxQkFBcUIsU0FBUyxFQUFFO2FBQ2pDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OztBQXRQVSxrQ0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVGV4dEZpbGUsIGF3c2NkayB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBQUk9KRU5fTUFSS0VSIH0gZnJvbSAncHJvamVuL2xpYi9jb21tb24nO1xuaW1wb3J0IHsgQmFzZUVuZ2luZSwgR2l0SHViRW5naW5lLCBHaXRodWJFbmdpbmVDb25maWcgfSBmcm9tICcuL2VuZ2luZSc7XG5cbi8qKlxuICogVGhlIEVudmlyb25tZW50IGludGVyZmFjZSBpcyBkZXNpZ25lZCB0byBob2xkIEFXUyByZWxhdGVkIGluZm9ybWF0aW9uXG4gKiBmb3IgYSBzcGVjaWZpYyBkZXBsb3ltZW50IGVudmlyb25tZW50IHdpdGhpbiB5b3VyIGluZnJhc3RydWN0dXJlLlxuICogRWFjaCBlbnZpcm9ubWVudCByZXF1aXJlcyBhIHNwZWNpZmljIGFjY291bnQgYW5kIHJlZ2lvbiBmb3IgaXRzIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudCB7XG4gIC8qKlxuICAgKiBUaGUgQVdTIEFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnZpcm9ubWVudC4gSXQncyBpbXBvcnRhbnQgYmVjYXVzZVxuICAgKiBkaWZmZXJlbnQgc2VydmljZXMgb3IgZmVhdHVyZXMgY291bGQgaGF2ZSBkaXN0aW5jdCBwZXJtaXNzaW9ucyBhbmQgc2V0dGluZ3NcbiAgICogaW4gZGlmZmVyZW50IGFjY291bnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQVdTIFJlZ2lvbiBmb3IgdGhlIGVudmlyb25tZW50LiBUaGlzIGRldGVybWluZXMgd2hlcmUgeW91ciByZXNvdXJjZXNcbiAgICogYXJlIGNyZWF0ZWQgYW5kIHdoZXJlIHlvdXIgYXBwbGljYXRpb24gd2lsbCBydW4uIEl0IGNhbiBhZmZlY3QgbGF0ZW5jeSxcbiAgICogYXZhaWxhYmlsaXR5LCBhbmQgcHJpY2luZy5cbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBFbnZpcm9ubWVudE1hcCBpbnRlcmZhY2UgaXMgdXNlZCB0byBtYWludGFpbiBhIG1hcHBpbmcgb2YgZGlmZmVyZW50IHR5cGVzXG4gKiBvZiBlbnZpcm9ubWVudHMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24uIEVhY2ggdHlwZSBvZiBlbnZpcm9ubWVudCAtIHBlcnNvbmFsLFxuICogZmVhdHVyZSwgZGV2LCBhbmQgcHJvZCwgcmVwcmVzZW50cyBhIGRpZmZlcmVudCBzdGFnZSBvZiBkZXZlbG9wbWVudCBvciB1c2FnZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnZpcm9ubWVudE1hcCB7XG4gIC8qKlxuICAgKiBUaGUgcGVyc29uYWwgZW52aXJvbm1lbnQgaXMgdXN1YWxseSB1c2VkIGZvciBpbmRpdmlkdWFsIGRldmVsb3BtZW50IGFuZFxuICAgKiB0ZXN0aW5nLCBhbGxvd2luZyBkZXZlbG9wZXJzIHRvIGZyZWVseSB0ZXN0IGFuZCBleHBlcmltZW50IHdpdGhvdXRcbiAgICogYWZmZWN0aW5nIHRoZSBzaGFyZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBwZXJzb25hbDogRW52aXJvbm1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmZWF0dXJlIGVudmlyb25tZW50IGlzIHR5cGljYWxseSB1c2VkIGZvciBkZXZlbG9waW5nIHNwZWNpZmljIGZlYXR1cmVzXG4gICAqIGluIGlzb2xhdGlvbiBmcm9tIHRoZSBtYWluIGNvZGViYXNlLiBUaGlzIGFsbG93cyBkZXZlbG9wZXJzIHRvIHdvcmsgb25cbiAgICogaW5kaXZpZHVhbCBmZWF0dXJlcyB3aXRob3V0IGltcGFjdGluZyB0aGUgc3RhYmlsaXR5IG9mIHRoZSBkZXYgb3IgcHJvZFxuICAgKiBlbnZpcm9ubWVudHMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlOiBFbnZpcm9ubWVudDtcblxuICAvKipcbiAgICogVGhlIGRldiBlbnZpcm9ubWVudCBpcyBhIHNoYXJlZCBlbnZpcm9ubWVudCB3aGVyZSBkZXZlbG9wZXJzIGludGVncmF0ZVxuICAgKiB0aGVpciBmZWF0dXJlIGNoYW5nZXMuIEl0IHJlcHJlc2VudHMgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBhcHBsaWNhdGlvblxuICAgKiBidXQgbWF5IG5vdCBiZSBhcyBzdGFibGUgYXMgdGhlIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBkZXY6IEVudmlyb25tZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvZCBlbnZpcm9ubWVudCBpcyB3aGVyZSB0aGUgbGl2ZSwgdXNlci1mYWNpbmcgYXBwbGljYXRpb24gcnVucy5cbiAgICogSXQgc2hvdWxkIGJlIHN0YWJsZSBhbmQgb25seSByZWNlaXZlIHRob3JvdWdobHkgdGVzdGVkIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBwcm9kOiBFbnZpcm9ubWVudDtcbn1cblxuLyoqXG4gKiBUaGUgQ0kvQ0QgdG9vbGluZyB1c2VkIHRvIHJ1biB5b3VyIHBpcGVsaW5lLlxuICogVGhlIGNvbXBvbmVudCB3aWxsIHJlbmRlciB3b3JrZmxvd3MgZm9yIHRoZSBnaXZlbiBzeXN0ZW1cbiAqL1xuZXhwb3J0IGVudW0gUGlwZWxpbmVFbmdpbmUge1xuICAvKiogQ3JlYXRlIEdpdEh1YiBhY3Rpb25zICovXG4gIEdJVEhVQixcbiAgLyoqIENyZWF0ZSBhIC5naXRsYWItY2kueWFtbCBmaWxlICovXG4gIEdJVExBQixcbiAgLy8gLyoqIENyZWF0ZSBBV1MgQ29kZUNhdGFseXN0IHdvcmtmbG93cyAqL1xuICAvLyBDT0RFX0NBVEFMWVNULFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgdHlwZSBvZiBwaXBlbGluZSB0aGF0IHdpbGwgYmUgY3JlYXRlZFxuICovXG5leHBvcnQgZW51bSBEZXBsb3ltZW50VHlwZSB7XG4gIC8qKiBEZXBsb3kgZXZlcnkgY29tbWl0IGFzIGZhciBhcyBwb3NzaWJsZTsgaG9wZWZ1bGx5IGludG8gcHJvZHVjdGlvbiAqL1xuICBDT05USU5VT1VTX0RFUExPWU1FTlQsXG4gIC8qKiBCdWlsZCBldmVyeSBjb21taXQgYW5kIHByZXBhcmUgYWxsIGFzc2V0cyBmb3IgYSBsYXRlciBkZXBsb3ltZW50ICovXG4gIENPTlRJTlVPVVNfREVMSVZFUlksXG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lT3B0aW9ucyBpbnRlcmZhY2UgaXMgZGVzaWduZWQgdG8gcHJvdmlkZSBjb25maWd1cmF0aW9uXG4gKiBvcHRpb25zIGZvciBhIENESyAoQ2xvdWQgRGV2ZWxvcG1lbnQgS2l0KSBwaXBlbGluZS4gSXQgYWxsb3dzIHRoZSBkZWZpbml0aW9uXG4gKiBvZiBzZXR0aW5ncyBzdWNoIGFzIHRoZSBzdGFjayBwcmVmaXggYW5kIHBhY2thZ2UgbmFtZXNwYWNlIHRvIGJlIHVzZWQgaW4gdGhlXG4gKiBBV1Mgc3RhY2ssIGFsb25nIHdpdGggdGhlIGVudmlyb25tZW50cyBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ0RLUGlwZWxpbmVPcHRpb25zIHtcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGRlZmluZSBhIHByZWZpeCBmb3IgdGhlIEFXUyBTdGFjayByZXNvdXJjZXMgY3JlYXRlZFxuICAgKiBkdXJpbmcgdGhlIHBpcGVsaW5lJ3Mgb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBwcm9qZWN0IG5hbWVcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGlzIGZpZWxkIGRldGVybWluZXMgdGhlIE5QTSBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHBhY2thZ2luZyBDREsgY2xvdWRcbiAgICogYXNzZW1ibGllcy4gQSBuYW1lc3BhY2UgaGVscHMgZ3JvdXAgcmVsYXRlZCByZXNvdXJjZXMgdG9nZXRoZXIsIHByb3ZpZGluZ1xuICAgKiBiZXR0ZXIgb3JnYW5pemF0aW9uIGFuZCBlYXNlIG9mIG1hbmFnZW1lbnQuXG4gICAqL1xuICByZWFkb25seSBwa2dOYW1lc3BhY2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhpcyBpcyBhIG1hcCBvZiBlbnZpcm9ubWVudHMgdG8gYmUgdXNlZCBpbiB0aGUgcGlwZWxpbmUuIEl0IGFsbG93cyB0aGVcbiAgICogcGlwZWxpbmUgdG8gZGVwbG95IHRvIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgYmFzZWQgb24gdGhlIHN0YWdlIG9mIHRoZVxuICAgKiBkZXBsb3ltZW50IHByb2Nlc3MsIHdoZXRoZXIgdGhhdCdzIGEgcGVyc29uYWwsIGZlYXR1cmUsIGRldiwgb3IgcHJvZCBzdGFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50czogRW52aXJvbm1lbnRNYXA7XG5cbiAgLyoqXG4gICAqIFRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHBpcGVsaW5lIHRvIGNyZWF0ZS4gSWYgc2V0IHRvIENPTlRJTlVPVVNfREVQTE9ZTUVOVCxcbiAgICogZXZlcnkgY29tbWl0IGlzIGRlcGxveWVkIGFzIGZhciBhcyBwb3NzaWJsZSwgaG9wZWZ1bGx5IGludG8gcHJvZHVjdGlvbi4gSWYgc2V0IHRvXG4gICAqIENPTlRJTlVPVVNfREVMSVZFUlksIGV2ZXJ5IGNvbW1pdCBpcyBidWlsdCBhbmQgYWxsIGFzc2V0cyBhcmUgcHJlcGFyZWQgZm9yIGEgbGF0ZXIgZGVwbG95bWVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgQ09OVElOVU9VU19ERUxJVkVSWVxuICAgKi9cbiAgcmVhZG9ubHkgZGVwbG95bWVudFR5cGU/OiBEZXBsb3ltZW50VHlwZTtcblxuICAvKipcbiAgICogVGhpcyBmaWVsZCBkZXRlcm1pbmVzIHRoZSBDSS9DRCB0b29saW5nIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHJ1biB0aGUgcGlwZWxpbmUuIFRoZSBjb21wb25lbnRcbiAgICogd2lsbCByZW5kZXIgd29ya2Zsb3dzIGZvciB0aGUgZ2l2ZW4gc3lzdGVtLiBPcHRpb25zIGluY2x1ZGUgR2l0SHViIGFuZCBHaXRMYWIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdHJpZXMgdG8gZGVyaXZlIGl0IGZyb20gdGhlIHByb2plY3RzIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHJlYWRvbmx5IGVuZ2luZT86IFBpcGVsaW5lRW5naW5lO1xuXG4gIHJlYWRvbmx5IGdpdGh1YkNvbmZpZz86IEdpdGh1YkVuZ2luZUNvbmZpZztcblxuICByZWFkb25seSBwcmVJbnN0YWxsQ29tbWFuZHM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgcHJlU3ludGhDb21tYW5kcz86IHN0cmluZ1tdO1xuICByZWFkb25seSBwb3N0U3ludGhDb21tYW5kcz86IHN0cmluZ1tdO1xuXG59XG5cbi8qKlxuICogVGhlIENES1BpcGVsaW5lIGNsYXNzIGV4dGVuZHMgdGhlIENvbXBvbmVudCBjbGFzcyBhbmQgc2V0cyB1cCB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb24gZm9yIGRlcGxveWluZyBBV1MgQ0RLIChDbG91ZCBEZXZlbG9wbWVudCBLaXQpIGFwcGxpY2F0aW9ucyBhY3Jvc3MgbXVsdGlwbGUgc3RhZ2VzLlxuICogSXQgYWxzbyBtYW5hZ2VzIHRhc2tzIHN1Y2ggYXMgcHVibGlzaGluZyBDREsgYXNzZXRzLCBidW1waW5nIHZlcnNpb24gYmFzZWQgb24gZ2l0IHRhZ3MsIGFuZCBjbGVhbmluZyB1cCBjb25mbGljdGluZyB0YXNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENES1BpcGVsaW5lIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tQcmVmaXg6IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGVuZ2luZTogQmFzZUVuZ2luZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcDogYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHAsIHByaXZhdGUgcHJvcHM6IENES1BpcGVsaW5lT3B0aW9ucykge1xuICAgIHN1cGVyKGFwcCk7XG5cbiAgICAvLyBBZGQgZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVzXG4gICAgdGhpcy5hcHAuYWRkRGV2RGVwcyhcbiAgICAgICdAdHlwZXMvc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnc3RhbmRhcmQtdmVyc2lvbicsXG4gICAgICAnY2RrLWFzc2V0cycsXG4gICAgKTtcbiAgICAvLyB0aGlzLmFwcC5hZGREZXBzKFxuICAgIC8vICk7XG5cbiAgICB0aGlzLnN0YWNrUHJlZml4ID0gcHJvcHMuc3RhY2tQcmVmaXggPz8gYXBwLm5hbWU7XG5cbiAgICAvLyBDcmVhdGUgZW5naW5lIGluc3RhbmNlIHRvIHVzZVxuICAgIHN3aXRjaCAocHJvcHMuZW5naW5lKSB7XG4gICAgICBjYXNlIFBpcGVsaW5lRW5naW5lLkdJVEhVQjpcbiAgICAgICAgdGhpcy5lbmdpbmUgPSBuZXcgR2l0SHViRW5naW5lKGFwcCwgcHJvcHMsIHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmdpbmUnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmVzIHRoZSBjb21waWxlZCBjbG91ZCBhc3NlbWJseSBiZWZvcmUgZWFjaCBzeW50aFxuICAgIHRoaXMucHJvamVjdC50YXNrcy50cnlGaW5kKCdzeW50aCcpPy5wcmVwZW5kRXhlYyhgcm0gLXJmICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH1gKTtcbiAgICB0aGlzLnByb2plY3QudGFza3MudHJ5RmluZCgnc3ludGg6c2lsZW50Jyk/LnByZXBlbmRFeGVjKGBybSAtcmYgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fWApO1xuXG4gICAgLy8gUmVtb3ZlIHRhc2tzIHRoYXQgbWlnaHQgY29uZmxpY3Qgd2l0aCB0aGUgcGlwZWxpbmUgcHJvY2Vzc1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkZXBsb3knKTtcbiAgICB0aGlzLnByb2plY3QucmVtb3ZlVGFzaygnZGlmZicpO1xuICAgIHRoaXMucHJvamVjdC5yZW1vdmVUYXNrKCdkZXN0cm95Jyk7XG4gICAgdGhpcy5wcm9qZWN0LnJlbW92ZVRhc2soJ3dhdGNoJyk7XG5cbiAgICB0aGlzLmNyZWF0ZVN5bnRoU3RhZ2UoKTtcblxuICAgIC8vIENyZWF0ZXMgZGlmZmVyZW50IGRlcGxveW1lbnQgc3RhZ2VzXG4gICAgdGhpcy5jcmVhdGVQZXJzb25hbFN0YWdlKCk7XG4gICAgdGhpcy5jcmVhdGVGZWF0dXJlU3RhZ2UoKTtcbiAgICB0aGlzLmNyZWF0ZVBpcGVsaW5lU3RhZ2UoJ2RldicpO1xuICAgIHRoaXMuY3JlYXRlUGlwZWxpbmVTdGFnZSgncHJvZCcpO1xuXG4gICAgLy8gQ3JlYXRlcyB0YXNrcyB0byBoYW5kbGUgdGhlIHJlbGVhc2UgcHJvY2Vzc1xuICAgIHRoaXMuY3JlYXRlUmVsZWFzZVRhc2tzKCk7XG5cbiAgICAvLyBDcmVhdGVzIGEgc3BlY2lhbGl6ZWQgQ0RLIEFwcCBjbGFzc1xuICAgIHRoaXMuY3JlYXRlQXBwbGljYXRpb25FbnRyeXBvaW50KCk7XG5cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlU3ludGhTdGFnZSgpIHtcbiAgICB0aGlzLmVuZ2luZS5jcmVhdGVTeW50aCh7XG4gICAgICBjb21tYW5kczogW1xuICAgICAgICAuLi4odGhpcy5wcm9wcy5wcmVJbnN0YWxsQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICBgbnB4IHByb2plbiAke3RoaXMuYXBwLnBhY2thZ2UuaW5zdGFsbENpVGFzay5uYW1lfWAsXG4gICAgICAgIC4uLih0aGlzLnByb3BzLnByZVN5bnRoQ29tbWFuZHMgPz8gW10pLFxuICAgICAgICAnbnB4IHByb2plbiBidWlsZCcsXG4gICAgICAgIC4uLih0aGlzLnByb3BzLnBvc3RTeW50aENvbW1hbmRzID8/IFtdKSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgdGhpcy5lbmdpbmUuY3JlYXRlQXNzZXRVcGxvYWQoe1xuICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgLi4uKHRoaXMucHJvcHMucHJlSW5zdGFsbENvbW1hbmRzID8/IFtdKSxcbiAgICAgICAgYG5weCBwcm9qZW4gJHt0aGlzLmFwcC5wYWNrYWdlLmluc3RhbGxDaVRhc2submFtZX1gLFxuICAgICAgICAnbnB4IHByb2plbiBwdWJsaXNoOmFzc2V0cycsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRoZSBhcHBsaWNhdGlvbiwgaW5jbHVkaW5nIGludGVyZmFjZXMgYW5kIGNsYXNzZXNcbiAgICogbmVjZXNzYXJ5IHRvIHNldCB1cCB0aGUgcGlwZWxpbmUgYW5kIGRlZmluZSB0aGUgQVdTIENESyBzdGFja3MgZm9yIGRpZmZlcmVudCBlbnZpcm9ubWVudHMuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUFwcGxpY2F0aW9uRW50cnlwb2ludCgpIHtcbiAgICBjb25zdCBhcHBGaWxlID0gbmV3IFRleHRGaWxlKHRoaXMucHJvamVjdCwgYCR7dGhpcy5hcHAuc3JjZGlyfS9hcHAudHNgKTtcbiAgICBhcHBGaWxlLmFkZExpbmUoYC8vICR7UFJPSkVOX01BUktFUn1cbi8qIGVzbGludC1kaXNhYmxlICovXG5pbXBvcnQgeyBBcHAsIEFwcFByb3BzLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuLyoqXG4gKiBQaXBlbGluZUFwcFByb3BzIGlzIGFuIGV4dGVuc2lvbiBvZiBBcHBQcm9wcywgd2hpY2ggaXMgcGFydCBvZiB0aGUgQVdTIENESyBjb3JlLlxuICogSXQgaW5jbHVkZXMgb3B0aW9uYWwgZnVuY3Rpb25zIHRvIHByb3ZpZGUgQVdTIFN0YWNrcyBmb3IgZGlmZmVyZW50IHN0YWdlcy5cbiAqXG4gKiBVc2UgdGhlc2UgZnVuY3Rpb25zIHRvIGluc3RhbnRpYXRlIHlvdXIgYXBwbGljYXRpb24gc3RhY2tzIHdpdGggdGhlIHBhcmFtZXRlcnMgZm9yXG4gKiBlYWNoIHN0YWdlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVBcHBQcm9wcyBleHRlbmRzIEFwcFByb3BzIHtcbiAgLyoqIFRoaXMgb3B0aW9uYWwgZnVuY3Rpb24sIGlmIHByb3ZpZGVkLCB3aWxsIGJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBkZXZlbG9wbWVudCBzdGFjay4gKi9cbiAgcHJvdmlkZURldlN0YWNrPzogKGFwcDogQXBwLCBzdGFja0lkOiBzdHJpbmcsIHByb3BzOiBQaXBlbGluZUFwcFN0YWNrUHJvcHMpID0+IFN0YWNrO1xuXG4gIC8qKiBUaGlzIG9wdGlvbmFsIGZ1bmN0aW9uLCBpZiBwcm92aWRlZCwgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgcHJvZHVjdGlvbiBzdGFjay4gKi9cbiAgcHJvdmlkZVByb2RTdGFjaz86IChhcHA6IEFwcCwgc3RhY2tJZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVBcHBTdGFja1Byb3BzKSA9PiBTdGFjaztcblxuICAvKiogVGhpcyBvcHRpb25hbCBmdW5jdGlvbiwgaWYgcHJvdmlkZWQsIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHBlcnNvbmFsIHN0YWNrLiAqL1xuICBwcm92aWRlUGVyc29uYWxTdGFjaz86IChhcHA6IEFwcCwgc3RhY2tJZDogc3RyaW5nLCBwcm9wczogUGlwZWxpbmVBcHBTdGFja1Byb3BzKSA9PiBTdGFjaztcblxuICAvKiogVGhpcyBvcHRpb25hbCBmdW5jdGlvbiwgaWYgcHJvdmlkZWQsIHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIGZlYXR1cmUgc3RhY2suICovXG4gIHByb3ZpZGVGZWF0dXJlU3RhY2s/OiAoYXBwOiBBcHAsIHN0YWNrSWQ6IHN0cmluZywgcHJvcHM6IFBpcGVsaW5lQXBwU3RhY2tQcm9wcykgPT4gU3RhY2s7XG59XG5cbi8qKlxuICogUGlwZWxpbmVBcHBTdGFja1Byb3BzIGlzIGFuIGV4dGVuc2lvbiBvZiBTdGFja1Byb3BzLCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBBV1MgQ0RLIGNvcmUuXG4gKiBJdCBpbmNsdWRlcyBhbiBhZGRpdGlvbmFsIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIHN0YWdlIG5hbWUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZWxpbmVBcHBTdGFja1Byb3BzIGV4dGVuZHMgU3RhY2tQcm9wcyB7XG4gIHN0YWdlTmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBQaXBlbGluZUFwcCBjbGFzcyBleHRlbmRzIHRoZSBBcHAgY2xhc3MgZnJvbSBBV1MgQ0RLIGFuZCBvdmVycmlkZXMgdGhlIGNvbnN0cnVjdG9yIHRvIHN1cHBvcnRcbiAqIGRpZmZlcmVudCBzdGFnZXMgb2YgdGhlIGFwcGxpY2F0aW9uIChkZXZlbG9wbWVudCwgcHJvZHVjdGlvbiwgcGVyc29uYWwsIGZlYXR1cmUpIGJ5IGludm9raW5nIHRoZSBwcm92aWRlZFxuICogc3RhY2stcHJvdmlkaW5nIGZ1bmN0aW9ucyBmcm9tIHRoZSBwcm9wcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBpcGVsaW5lQXBwIGV4dGVuZHMgQXBwIHtcbiAgY29uc3RydWN0b3IocHJvcHM6IFBpcGVsaW5lQXBwUHJvcHMpIHtcbiAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAvLyBJZiBhIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIGZvciBjcmVhdGluZyBhIGRldmVsb3BtZW50IHN0YWNrLCBpdCBpcyBjYWxsZWQgd2l0aCBuZWNlc3NhcnkgYXJndW1lbnRzLlxuICAgIGlmIChwcm9wcy5wcm92aWRlRGV2U3RhY2spIHtcbiAgICAgIHByb3BzLnByb3ZpZGVEZXZTdGFjayh0aGlzLCAnJHt0aGlzLnN0YWNrUHJlZml4fS1kZXYnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmVudmlyb25tZW50cy5kZXYpfSwgc3RhY2tOYW1lOiAnJHt0aGlzLnN0YWNrUHJlZml4fS1kZXYnLCBzdGFnZU5hbWU6ICdkZXYnIH0pO1xuICAgIH1cblxuICAgIC8vIElmIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgcHJvZHVjdGlvbiBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZVByb2RTdGFjaykge1xuICAgICAgcHJvcHMucHJvdmlkZVByb2RTdGFjayh0aGlzLCAnJHt0aGlzLnN0YWNrUHJlZml4fS1wcm9kJywgeyBlbnY6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wcm9wcy5lbnZpcm9ubWVudHMucHJvZCl9LCBzdGFja05hbWU6ICcke3RoaXMuc3RhY2tQcmVmaXh9LXByb2QnLCBzdGFnZU5hbWU6ICdwcm9kJyB9KTtcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgVVNFUiBpcyBzZXQgYW5kIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgcGVyc29uYWwgc3RhY2ssIGl0IGlzIGNhbGxlZCB3aXRoIG5lY2Vzc2FyeSBhcmd1bWVudHMuXG4gICAgaWYgKHByb3BzLnByb3ZpZGVQZXJzb25hbFN0YWNrICYmIHByb2Nlc3MuZW52LlVTRVIpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdwZXJzb25hbC0nICsgcHJvY2Vzcy5lbnYuVVNFUi50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xcXFxcXC8vZywgJy0nKTtcbiAgICAgIHByb3BzLnByb3ZpZGVQZXJzb25hbFN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9LXBlcnNvbmFsJywgeyBlbnY6ICR7SlNPTi5zdHJpbmdpZnkodGhpcy5wcm9wcy5lbnZpcm9ubWVudHMucGVyc29uYWwpfSwgc3RhY2tOYW1lOiBcXGAke3RoaXMuc3RhY2tQcmVmaXh9LVxcJHtzdGFnZU5hbWV9XFxgLCBzdGFnZU5hbWUgfSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEJSQU5DSCBpcyBzZXQgYW5kIGEgZnVuY3Rpb24gaXMgcHJvdmlkZWQgZm9yIGNyZWF0aW5nIGEgZmVhdHVyZSBzdGFjaywgaXQgaXMgY2FsbGVkIHdpdGggbmVjZXNzYXJ5IGFyZ3VtZW50cy5cbiAgICBpZiAocHJvcHMucHJvdmlkZUZlYXR1cmVTdGFjayAmJiBwcm9jZXNzLmVudi5CUkFOQ0gpIHtcbiAgICAgIGNvbnN0IHN0YWdlTmFtZSA9ICdmZWF0dXJlLScgKyBwcm9jZXNzLmVudi5CUkFOQ0gudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXFxcXFwvL2csICctJyk7XG4gICAgICBwcm9wcy5wcm92aWRlRmVhdHVyZVN0YWNrKHRoaXMsICcke3RoaXMuc3RhY2tQcmVmaXh9LWZlYXR1cmUnLCB7IGVudjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLnByb3BzLmVudmlyb25tZW50cy5mZWF0dXJlKX0sIHN0YWNrTmFtZTogXFxgJHt0aGlzLnN0YWNrUHJlZml4fS1cXCR7c3RhZ2VOYW1lfVxcYCwgc3RhZ2VOYW1lIH0pO1xuICAgIH1cbiAgfVxufVxuYCk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0YXNrcyB0byBwdWJsaXNoIENESyBhc3NldHMgdG8gYWxsIGFjY291bnRzIGFuZCBoYW5kbGUgdmVyc2lvbmluZywgaW5jbHVkaW5nIGJ1bXBpbmcgdGhlIHZlcnNpb25cbiAgICogYmFzZWQgb24gdGhlIGxhdGVzdCBnaXQgdGFnIGFuZCBwdXNoaW5nIHRoZSBDREsgYXNzZW1ibHkgdG8gdGhlIHBhY2thZ2UgcmVwb3NpdG9yeS5cbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUmVsZWFzZVRhc2tzKCkge1xuICAgIC8vIFRhc2sgdG8gcHVibGlzaCB0aGUgQ0RLIGFzc2V0cyB0byBhbGwgYWNjb3VudHNcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncHVibGlzaDphc3NldHMnLCB7XG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgZXhlYzogYG5weCBjZGstYXNzZXRzIC1wICR7dGhpcy5hcHAuY2RrQ29uZmlnLmNka291dH0vJHt0aGlzLnN0YWNrUHJlZml4fS1kZXYuYXNzZXRzLmpzb24gcHVibGlzaGAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBleGVjOiBgbnB4IGNkay1hc3NldHMgLXAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fS8ke3RoaXMuc3RhY2tQcmVmaXh9LXByb2QuYXNzZXRzLmpzb24gcHVibGlzaGAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2J1bXAnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0J1bXBzIHZlcnNpb24gYmFzZWQgb24gbGF0ZXN0IGdpdCB0YWcnLFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6ICdwaXBlbGluZXMtcmVsZWFzZSBidW1wJyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6ICdnaXQgcHVzaCAtLXRhZ3MnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygncmVsZWFzZTpwdXNoLWFzc2VtYmx5Jywge1xuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGV4ZWM6IGBwaXBlbGluZXMtcmVsZWFzZSBjcmVhdGUtbWFuaWZlc3QgXCIke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9XCIgIFwiJHt0aGlzLnByb3BzLnBrZ05hbWVzcGFjZX1cImAsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBjd2Q6IHRoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXQsXG4gICAgICAgICAgZXhlYzogJ25wbSB2ZXJzaW9uIC0tbm8tZ2l0LXRhZy12ZXJzaW9uIGZyb20tZ2l0JyxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIGN3ZDogdGhpcy5hcHAuY2RrQ29uZmlnLmNka291dCxcbiAgICAgICAgICBleGVjOiAnbnBtIHB1Ymxpc2gnLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBzZXRzIHVwIHRhc2tzIGZvciB0aGUgcGVyc29uYWwgZGVwbG95bWVudCBzdGFnZSwgaW5jbHVkaW5nIGRlcGxveW1lbnQsIHdhdGNoaW5nIGZvciBjaGFuZ2VzLFxuICAgKiBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZiksIGFuZCBkZXN0cm95aW5nIHRoZSBzdGFjayB3aGVuIG5vIGxvbmdlciBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZVBlcnNvbmFsU3RhZ2UoKSB7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2RlcGxveTpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95ICR7dGhpcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCd3YXRjaDpwZXJzb25hbCcsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVwbG95IC0td2F0Y2ggLS1ob3Rzd2FwICR7dGhpcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkaWZmOnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmICR7dGhpcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKCdkZXN0cm95OnBlcnNvbmFsJywge1xuICAgICAgZXhlYzogYGNkayBkZXN0cm95ICR7dGhpcy5zdGFja1ByZWZpeH0tcGVyc29uYWxgLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGFza3MgZm9yIHRoZSBmZWF0dXJlIGRlcGxveW1lbnQgc3RhZ2UsIGluY2x1ZGluZyBkZXBsb3ltZW50LCBjb21wYXJpbmcgY2hhbmdlcyAoZGlmZiksXG4gICAqIGFuZCBkZXN0cm95aW5nIHRoZSBzdGFjayB3aGVuIG5vIGxvbmdlciBuZWVkZWQuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUZlYXR1cmVTdGFnZSgpIHtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGVwbG95OmZlYXR1cmUnLCB7XG4gICAgICBleGVjOiBgY2RrIC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnN0YWNrUHJlZml4fS1mZWF0dXJlYCxcbiAgICB9KTtcbiAgICB0aGlzLnByb2plY3QuYWRkVGFzaygnZGlmZjpmZWF0dXJlJywge1xuICAgICAgZXhlYzogYGNkayBkaWZmICR7dGhpcy5zdGFja1ByZWZpeH0tZmVhdHVyZWAsXG4gICAgfSk7XG4gICAgdGhpcy5wcm9qZWN0LmFkZFRhc2soJ2Rlc3Ryb3k6ZmVhdHVyZScsIHtcbiAgICAgIGV4ZWM6IGBjZGsgZGVzdHJveSAke3RoaXMuc3RhY2tQcmVmaXh9LWZlYXR1cmVgLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHNldHMgdXAgdGFza3MgZm9yIHRoZSBnZW5lcmFsIHBpcGVsaW5lIHN0YWdlcyAoZGV2LCBwcm9kKSwgaW5jbHVkaW5nIGRlcGxveW1lbnQgYW5kIGNvbXBhcmluZyBjaGFuZ2VzIChkaWZmKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0YWdlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBzdGFnZSAoZS5nLiwgJ2RldicsICdwcm9kJylcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlUGlwZWxpbmVTdGFnZShzdGFnZU5hbWU6IHN0cmluZykge1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkZXBsb3k6JHtzdGFnZU5hbWV9YCwge1xuICAgICAgZXhlYzogYGNkayAtLWFwcCAke3RoaXMuYXBwLmNka0NvbmZpZy5jZGtvdXR9IC0tcHJvZ3Jlc3MgZXZlbnRzIC0tcmVxdWlyZS1hcHByb3ZhbCBuZXZlciBkZXBsb3kgJHt0aGlzLnN0YWNrUHJlZml4fS0ke3N0YWdlTmFtZX1gLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRUYXNrKGBkaWZmOiR7c3RhZ2VOYW1lfWAsIHtcbiAgICAgIGV4ZWM6IGBjZGsgLS1hcHAgJHt0aGlzLmFwcC5jZGtDb25maWcuY2Rrb3V0fSBkaWZmICR7dGhpcy5zdGFja1ByZWZpeH0tJHtzdGFnZU5hbWV9YCxcbiAgICB9KTtcblxuICAgIHRoaXMuZW5naW5lLmNyZWF0ZURlcGxveW1lbnQoe1xuICAgICAgc3RhZ2VOYW1lLFxuICAgICAgZW52OiB0aGlzLnByb3BzLmVudmlyb25tZW50c1tzdGFnZU5hbWUgYXMga2V5b2YgRW52aXJvbm1lbnRNYXBdLFxuICAgICAgY29tbWFuZHM6IFtcbiAgICAgICAgYG5weCBwcm9qZW4gZGVwbG95OiR7c3RhZ2VOYW1lfWAsXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59Il19
|